]> git.openstreetmap.org Git - rails.git/blobdiff - vendor/assets/iD/iD.js
Merge remote-tracking branch 'upstream/pull/3419'
[rails.git] / vendor / assets / iD / iD.js
index e38326bb73d2f44b45e6e578a1a7515fed7be962..088e252a260e8bc791ff56df4edb2d3930f0ca78 100644 (file)
-(function(exports) {
-
-  var bootstrap = (typeof exports.bootstrap === "object") ?
-    exports.bootstrap :
-    (exports.bootstrap = {});
-
-  bootstrap.tooltip = function() {
-
-    var tooltip = function(selection) {
-        selection.each(setup);
-      },
-      animation = d3.functor(false),
-      html = d3.functor(false),
-      title = function() {
-        var title = this.getAttribute("data-original-title");
-        if (title) {
-          return title;
-        } else {
-          title = this.getAttribute("title");
-          this.removeAttribute("title");
-          this.setAttribute("data-original-title", title);
-        }
-        return title;
-      },
-      over = "mouseenter.tooltip",
-      out = "mouseleave.tooltip",
-      placements = "top left bottom right".split(" "),
-      placement = d3.functor("top");
-
-    tooltip.title = function(_) {
-      if (arguments.length) {
-        title = d3.functor(_);
-        return tooltip;
-      } else {
-        return title;
-      }
-    };
-
-    tooltip.html = function(_) {
-      if (arguments.length) {
-        html = d3.functor(_);
-        return tooltip;
-      } else {
-        return html;
-      }
-    };
-
-    tooltip.placement = function(_) {
-      if (arguments.length) {
-        placement = d3.functor(_);
-        return tooltip;
-      } else {
-        return placement;
-      }
-    };
-
-    tooltip.show = function(selection) {
-      selection.each(show);
-    };
-
-    tooltip.hide = function(selection) {
-      selection.each(hide);
-    };
-
-    tooltip.toggle = function(selection) {
-      selection.each(toggle);
-    };
-
-    tooltip.destroy = function(selection) {
-      selection
-        .on(over, null)
-        .on(out, null)
-        .attr("title", function() {
-          return this.getAttribute("data-original-title") || this.getAttribute("title");
-        })
-        .attr("data-original-title", null)
-        .select(".tooltip")
-        .remove();
-    };
-
-    function setup() {
-      var root = d3.select(this),
-          animate = animation.apply(this, arguments),
-          tip = root.append("div")
-            .attr("class", "tooltip");
-
-      if (animate) {
-        tip.classed("fade", true);
-      }
-
-      // TODO "inside" checks?
-
-      tip.append("div")
-        .attr("class", "tooltip-arrow");
-      tip.append("div")
-        .attr("class", "tooltip-inner");
-
-      var place = placement.apply(this, arguments);
-      tip.classed(place, true);
-
-      root.on(over, show);
-      root.on(out, hide);
-    }
-
-    function show() {
-      var root = d3.select(this),
-          content = title.apply(this, arguments),
-          tip = root.select(".tooltip")
-            .classed("in", true),
-          markup = html.apply(this, arguments),
-          innercontent = tip.select(".tooltip-inner")[markup ? "html" : "text"](content),
-          place = placement.apply(this, arguments),
-          outer = getPosition(root.node()),
-          inner = getPosition(tip.node()),
-          pos;
-
-      switch (place) {
-        case "top":
-          pos = {x: outer.x + (outer.w - inner.w) / 2, y: outer.y - inner.h};
-          break;
-        case "right":
-          pos = {x: outer.x + outer.w, y: outer.y + (outer.h - inner.h) / 2};
-          break;
-        case "left":
-          pos = {x: outer.x - inner.w, y: outer.y + (outer.h - inner.h) / 2};
-          break;
-        case "bottom":
-          pos = {x: Math.max(0, outer.x + (outer.w - inner.w) / 2), y: outer.y + outer.h};
-          break;
-      }
-
-      tip.style(pos ?
-        {left: ~~pos.x + "px", top: ~~pos.y + "px"} :
-        {left: null, top: null});
-
-      this.tooltipVisible = true;
-    }
-
-    function hide() {
-      d3.select(this).select(".tooltip")
-        .classed("in", false);
-
-      this.tooltipVisible = false;
-    }
-
-    function toggle() {
-      if (this.tooltipVisible) {
-        hide.apply(this, arguments);
-      } else {
-        show.apply(this, arguments);
-      }
-    }
-
-    return tooltip;
-  };
-
-  function getPosition(node) {
-    var mode = d3.select(node).style('position');
-    if (mode === 'absolute' || mode === 'static') {
-      return {
-        x: node.offsetLeft,
-        y: node.offsetTop,
-        w: node.offsetWidth,
-        h: node.offsetHeight
-      };
-    } else {
-      return {
-        x: 0,
-        y: 0,
-        w: node.offsetWidth,
-        h: node.offsetHeight
-      };
-    }
-  }
-
-})(this);
-!function(){
-  var d3 = {version: "3.4.6"}; // semver
-d3.ascending = d3_ascending;
-
-function d3_ascending(a, b) {
-  return a < b ? -1 : a > b ? 1 : a >= b ? 0 : NaN;
-}
-d3.descending = function(a, b) {
-  return b < a ? -1 : b > a ? 1 : b >= a ? 0 : NaN;
-};
-d3.min = function(array, f) {
-  var i = -1,
-      n = array.length,
-      a,
-      b;
-  if (arguments.length === 1) {
-    while (++i < n && !((a = array[i]) != null && a <= a)) a = undefined;
-    while (++i < n) if ((b = array[i]) != null && a > b) a = b;
-  } else {
-    while (++i < n && !((a = f.call(array, array[i], i)) != null && a <= a)) a = undefined;
-    while (++i < n) if ((b = f.call(array, array[i], i)) != null && a > b) a = b;
-  }
-  return a;
-};
-d3.max = function(array, f) {
-  var i = -1,
-      n = array.length,
-      a,
-      b;
-  if (arguments.length === 1) {
-    while (++i < n && !((a = array[i]) != null && a <= a)) a = undefined;
-    while (++i < n) if ((b = array[i]) != null && b > a) a = b;
-  } else {
-    while (++i < n && !((a = f.call(array, array[i], i)) != null && a <= a)) a = undefined;
-    while (++i < n) if ((b = f.call(array, array[i], i)) != null && b > a) a = b;
-  }
-  return a;
-};
-d3.extent = function(array, f) {
-  var i = -1,
-      n = array.length,
-      a,
-      b,
-      c;
-  if (arguments.length === 1) {
-    while (++i < n && !((a = c = array[i]) != null && a <= a)) a = c = undefined;
-    while (++i < n) if ((b = array[i]) != null) {
-      if (a > b) a = b;
-      if (c < b) c = b;
-    }
-  } else {
-    while (++i < n && !((a = c = f.call(array, array[i], i)) != null && a <= a)) a = undefined;
-    while (++i < n) if ((b = f.call(array, array[i], i)) != null) {
-      if (a > b) a = b;
-      if (c < b) c = b;
-    }
-  }
-  return [a, c];
-};
-d3.sum = function(array, f) {
-  var s = 0,
-      n = array.length,
-      a,
-      i = -1;
-
-  if (arguments.length === 1) {
-    while (++i < n) if (!isNaN(a = +array[i])) s += a;
-  } else {
-    while (++i < n) if (!isNaN(a = +f.call(array, array[i], i))) s += a;
-  }
-
-  return s;
-};
-function d3_number(x) {
-  return x != null && !isNaN(x);
-}
-
-d3.mean = function(array, f) {
-  var s = 0,
-      n = array.length,
-      a,
-      i = -1,
-      j = n;
-  if (arguments.length === 1) {
-    while (++i < n) if (d3_number(a = array[i])) s += a; else --j;
-  } else {
-    while (++i < n) if (d3_number(a = f.call(array, array[i], i))) s += a; else --j;
-  }
-  return j ? s / j : undefined;
-};
-// R-7 per <http://en.wikipedia.org/wiki/Quantile>
-d3.quantile = function(values, p) {
-  var H = (values.length - 1) * p + 1,
-      h = Math.floor(H),
-      v = +values[h - 1],
-      e = H - h;
-  return e ? v + e * (values[h] - v) : v;
-};
-
-d3.median = function(array, f) {
-  if (arguments.length > 1) array = array.map(f);
-  array = array.filter(d3_number);
-  return array.length ? d3.quantile(array.sort(d3_ascending), .5) : undefined;
-};
-
-function d3_bisector(compare) {
-  return {
-    left: function(a, x, lo, hi) {
-      if (arguments.length < 3) lo = 0;
-      if (arguments.length < 4) hi = a.length;
-      while (lo < hi) {
-        var mid = lo + hi >>> 1;
-        if (compare(a[mid], x) < 0) lo = mid + 1;
-        else hi = mid;
-      }
-      return lo;
-    },
-    right: function(a, x, lo, hi) {
-      if (arguments.length < 3) lo = 0;
-      if (arguments.length < 4) hi = a.length;
-      while (lo < hi) {
-        var mid = lo + hi >>> 1;
-        if (compare(a[mid], x) > 0) hi = mid;
-        else lo = mid + 1;
-      }
-      return lo;
-    }
-  };
-}
-
-var d3_bisect = d3_bisector(d3_ascending);
-d3.bisectLeft = d3_bisect.left;
-d3.bisect = d3.bisectRight = d3_bisect.right;
-
-d3.bisector = function(f) {
-  return d3_bisector(f.length === 1
-      ? function(d, x) { return d3_ascending(f(d), x); }
-      : f);
-};
-d3.shuffle = function(array) {
-  var m = array.length, t, i;
-  while (m) {
-    i = Math.random() * m-- | 0;
-    t = array[m], array[m] = array[i], array[i] = t;
-  }
-  return array;
-};
-d3.permute = function(array, indexes) {
-  var i = indexes.length, permutes = new Array(i);
-  while (i--) permutes[i] = array[indexes[i]];
-  return permutes;
-};
-d3.pairs = function(array) {
-  var i = 0, n = array.length - 1, p0, p1 = array[0], pairs = new Array(n < 0 ? 0 : n);
-  while (i < n) pairs[i] = [p0 = p1, p1 = array[++i]];
-  return pairs;
-};
-
-d3.zip = function() {
-  if (!(n = arguments.length)) return [];
-  for (var i = -1, m = d3.min(arguments, d3_zipLength), zips = new Array(m); ++i < m;) {
-    for (var j = -1, n, zip = zips[i] = new Array(n); ++j < n;) {
-      zip[j] = arguments[j][i];
-    }
-  }
-  return zips;
-};
-
-function d3_zipLength(d) {
-  return d.length;
-}
-
-d3.transpose = function(matrix) {
-  return d3.zip.apply(d3, matrix);
-};
-d3.keys = function(map) {
-  var keys = [];
-  for (var key in map) keys.push(key);
-  return keys;
-};
-d3.values = function(map) {
-  var values = [];
-  for (var key in map) values.push(map[key]);
-  return values;
-};
-d3.entries = function(map) {
-  var entries = [];
-  for (var key in map) entries.push({key: key, value: map[key]});
-  return entries;
-};
-d3.merge = function(arrays) {
-  var n = arrays.length,
-      m,
-      i = -1,
-      j = 0,
-      merged,
-      array;
-
-  while (++i < n) j += arrays[i].length;
-  merged = new Array(j);
-
-  while (--n >= 0) {
-    array = arrays[n];
-    m = array.length;
-    while (--m >= 0) {
-      merged[--j] = array[m];
-    }
-  }
-
-  return merged;
-};
-var abs = Math.abs;
-
-d3.range = function(start, stop, step) {
-  if (arguments.length < 3) {
-    step = 1;
-    if (arguments.length < 2) {
-      stop = start;
-      start = 0;
-    }
-  }
-  if ((stop - start) / step === Infinity) throw new Error("infinite range");
-  var range = [],
-       k = d3_range_integerScale(abs(step)),
-       i = -1,
-       j;
-  start *= k, stop *= k, step *= k;
-  if (step < 0) while ((j = start + step * ++i) > stop) range.push(j / k);
-  else while ((j = start + step * ++i) < stop) range.push(j / k);
-  return range;
-};
-
-function d3_range_integerScale(x) {
-  var k = 1;
-  while (x * k % 1) k *= 10;
-  return k;
-}
-function d3_class(ctor, properties) {
-  try {
-    for (var key in properties) {
-      Object.defineProperty(ctor.prototype, key, {
-        value: properties[key],
-        enumerable: false
-      });
-    }
-  } catch (e) {
-    ctor.prototype = properties;
-  }
-}
-
-d3.map = function(object) {
-  var map = new d3_Map;
-  if (object instanceof d3_Map) object.forEach(function(key, value) { map.set(key, value); });
-  else for (var key in object) map.set(key, object[key]);
-  return map;
-};
-
-function d3_Map() {}
-
-d3_class(d3_Map, {
-  has: d3_map_has,
-  get: function(key) {
-    return this[d3_map_prefix + key];
-  },
-  set: function(key, value) {
-    return this[d3_map_prefix + key] = value;
-  },
-  remove: d3_map_remove,
-  keys: d3_map_keys,
-  values: function() {
-    var values = [];
-    this.forEach(function(key, value) { values.push(value); });
-    return values;
-  },
-  entries: function() {
-    var entries = [];
-    this.forEach(function(key, value) { entries.push({key: key, value: value}); });
-    return entries;
-  },
-  size: d3_map_size,
-  empty: d3_map_empty,
-  forEach: function(f) {
-    for (var key in this) if (key.charCodeAt(0) === d3_map_prefixCode) f.call(this, key.substring(1), this[key]);
-  }
-});
-
-var d3_map_prefix = "\0", // prevent collision with built-ins
-    d3_map_prefixCode = d3_map_prefix.charCodeAt(0);
-
-function d3_map_has(key) {
-  return d3_map_prefix + key in this;
-}
-
-function d3_map_remove(key) {
-  key = d3_map_prefix + key;
-  return key in this && delete this[key];
-}
-
-function d3_map_keys() {
-  var keys = [];
-  this.forEach(function(key) { keys.push(key); });
-  return keys;
-}
-
-function d3_map_size() {
-  var size = 0;
-  for (var key in this) if (key.charCodeAt(0) === d3_map_prefixCode) ++size;
-  return size;
-}
-
-function d3_map_empty() {
-  for (var key in this) if (key.charCodeAt(0) === d3_map_prefixCode) return false;
-  return true;
-}
-
-d3.nest = function() {
-  var nest = {},
-      keys = [],
-      sortKeys = [],
-      sortValues,
-      rollup;
-
-  function map(mapType, array, depth) {
-    if (depth >= keys.length) return rollup
-        ? rollup.call(nest, array) : (sortValues
-        ? array.sort(sortValues)
-        : array);
-
-    var i = -1,
-        n = array.length,
-        key = keys[depth++],
-        keyValue,
-        object,
-        setter,
-        valuesByKey = new d3_Map,
-        values;
-
-    while (++i < n) {
-      if (values = valuesByKey.get(keyValue = key(object = array[i]))) {
-        values.push(object);
-      } else {
-        valuesByKey.set(keyValue, [object]);
-      }
-    }
-
-    if (mapType) {
-      object = mapType();
-      setter = function(keyValue, values) {
-        object.set(keyValue, map(mapType, values, depth));
-      };
-    } else {
-      object = {};
-      setter = function(keyValue, values) {
-        object[keyValue] = map(mapType, values, depth);
-      };
-    }
-
-    valuesByKey.forEach(setter);
-    return object;
-  }
-
-  function entries(map, depth) {
-    if (depth >= keys.length) return map;
-
-    var array = [],
-        sortKey = sortKeys[depth++];
-
-    map.forEach(function(key, keyMap) {
-      array.push({key: key, values: entries(keyMap, depth)});
-    });
-
-    return sortKey
-        ? array.sort(function(a, b) { return sortKey(a.key, b.key); })
-        : array;
-  }
-
-  nest.map = function(array, mapType) {
-    return map(mapType, array, 0);
-  };
-
-  nest.entries = function(array) {
-    return entries(map(d3.map, array, 0), 0);
-  };
-
-  nest.key = function(d) {
-    keys.push(d);
-    return nest;
-  };
-
-  // Specifies the order for the most-recently specified key.
-  // Note: only applies to entries. Map keys are unordered!
-  nest.sortKeys = function(order) {
-    sortKeys[keys.length - 1] = order;
-    return nest;
-  };
-
-  // Specifies the order for leaf values.
-  // Applies to both maps and entries array.
-  nest.sortValues = function(order) {
-    sortValues = order;
-    return nest;
-  };
-
-  nest.rollup = function(f) {
-    rollup = f;
-    return nest;
-  };
-
-  return nest;
-};
-
-d3.set = function(array) {
-  var set = new d3_Set;
-  if (array) for (var i = 0, n = array.length; i < n; ++i) set.add(array[i]);
-  return set;
-};
-
-function d3_Set() {}
-
-d3_class(d3_Set, {
-  has: d3_map_has,
-  add: function(value) {
-    this[d3_map_prefix + value] = true;
-    return value;
-  },
-  remove: function(value) {
-    value = d3_map_prefix + value;
-    return value in this && delete this[value];
-  },
-  values: d3_map_keys,
-  size: d3_map_size,
-  empty: d3_map_empty,
-  forEach: function(f) {
-    for (var value in this) if (value.charCodeAt(0) === d3_map_prefixCode) f.call(this, value.substring(1));
-  }
-});
-d3.behavior = {};
-var d3_arraySlice = [].slice,
-    d3_array = function(list) { return d3_arraySlice.call(list); }; // conversion for NodeLists
-
-var d3_document = document,
-    d3_documentElement = d3_document.documentElement,
-    d3_window = window;
-
-// Redefine d3_array if the browser doesn’t support slice-based conversion.
-try {
-  d3_array(d3_documentElement.childNodes)[0].nodeType;
-} catch(e) {
-  d3_array = function(list) {
-    var i = list.length, array = new Array(i);
-    while (i--) array[i] = list[i];
-    return array;
-  };
-}
-// Copies a variable number of methods from source to target.
-d3.rebind = function(target, source) {
-  var i = 1, n = arguments.length, method;
-  while (++i < n) target[method = arguments[i]] = d3_rebind(target, source, source[method]);
-  return target;
-};
-
-// Method is assumed to be a standard D3 getter-setter:
-// If passed with no arguments, gets the value.
-// If passed with arguments, sets the value and returns the target.
-function d3_rebind(target, source, method) {
-  return function() {
-    var value = method.apply(source, arguments);
-    return value === source ? target : value;
-  };
-}
-
-function d3_vendorSymbol(object, name) {
-  if (name in object) return name;
-  name = name.charAt(0).toUpperCase() + name.substring(1);
-  for (var i = 0, n = d3_vendorPrefixes.length; i < n; ++i) {
-    var prefixName = d3_vendorPrefixes[i] + name;
-    if (prefixName in object) return prefixName;
-  }
-}
-
-var d3_vendorPrefixes = ["webkit", "ms", "moz", "Moz", "o", "O"];
-function d3_noop() {}
-
-d3.dispatch = function() {
-  var dispatch = new d3_dispatch,
-      i = -1,
-      n = arguments.length;
-  while (++i < n) dispatch[arguments[i]] = d3_dispatch_event(dispatch);
-  return dispatch;
-};
-
-function d3_dispatch() {}
-
-d3_dispatch.prototype.on = function(type, listener) {
-  var i = type.indexOf("."),
-      name = "";
-
-  // Extract optional namespace, e.g., "click.foo"
-  if (i >= 0) {
-    name = type.substring(i + 1);
-    type = type.substring(0, i);
-  }
-
-  if (type) return arguments.length < 2
-      ? this[type].on(name)
-      : this[type].on(name, listener);
-
-  if (arguments.length === 2) {
-    if (listener == null) for (type in this) {
-      if (this.hasOwnProperty(type)) this[type].on(name, null);
-    }
-    return this;
-  }
-};
-
-function d3_dispatch_event(dispatch) {
-  var listeners = [],
-      listenerByName = new d3_Map;
-
-  function event() {
-    var z = listeners, // defensive reference
-        i = -1,
-        n = z.length,
-        l;
-    while (++i < n) if (l = z[i].on) l.apply(this, arguments);
-    return dispatch;
-  }
-
-  event.on = function(name, listener) {
-    var l = listenerByName.get(name),
-        i;
-
-    // return the current listener, if any
-    if (arguments.length < 2) return l && l.on;
-
-    // remove the old listener, if any (with copy-on-write)
-    if (l) {
-      l.on = null;
-      listeners = listeners.slice(0, i = listeners.indexOf(l)).concat(listeners.slice(i + 1));
-      listenerByName.remove(name);
-    }
-
-    // add the new listener, if any
-    if (listener) listeners.push(listenerByName.set(name, {on: listener}));
-
-    return dispatch;
-  };
-
-  return event;
-}
-
-d3.event = null;
-
-function d3_eventPreventDefault() {
-  d3.event.preventDefault();
-}
-
-function d3_eventCancel() {
-  d3.event.preventDefault();
-  d3.event.stopPropagation();
-}
-
-function d3_eventSource() {
-  var e = d3.event, s;
-  while (s = e.sourceEvent) e = s;
-  return e;
-}
-
-// Like d3.dispatch, but for custom events abstracting native UI events. These
-// events have a target component (such as a brush), a target element (such as
-// the svg:g element containing the brush) and the standard arguments `d` (the
-// target element's data) and `i` (the selection index of the target element).
-function d3_eventDispatch(target) {
-  var dispatch = new d3_dispatch,
-      i = 0,
-      n = arguments.length;
-
-  while (++i < n) dispatch[arguments[i]] = d3_dispatch_event(dispatch);
-
-  // Creates a dispatch context for the specified `thiz` (typically, the target
-  // DOM element that received the source event) and `argumentz` (typically, the
-  // data `d` and index `i` of the target element). The returned function can be
-  // used to dispatch an event to any registered listeners; the function takes a
-  // single argument as input, being the event to dispatch. The event must have
-  // a "type" attribute which corresponds to a type registered in the
-  // constructor. This context will automatically populate the "sourceEvent" and
-  // "target" attributes of the event, as well as setting the `d3.event` global
-  // for the duration of the notification.
-  dispatch.of = function(thiz, argumentz) {
-    return function(e1) {
-      try {
-        var e0 =
-        e1.sourceEvent = d3.event;
-        e1.target = target;
-        d3.event = e1;
-        dispatch[e1.type].apply(thiz, argumentz);
-      } finally {
-        d3.event = e0;
-      }
-    };
-  };
-
-  return dispatch;
-}
-d3.requote = function(s) {
-  return s.replace(d3_requote_re, "\\$&");
-};
-
-var d3_requote_re = /[\\\^\$\*\+\?\|\[\]\(\)\.\{\}]/g;
-var d3_subclass = {}.__proto__?
-
-// Until ECMAScript supports array subclassing, prototype injection works well.
-function(object, prototype) {
-  object.__proto__ = prototype;
-}:
-
-// And if your browser doesn't support __proto__, we'll use direct extension.
-function(object, prototype) {
-  for (var property in prototype) object[property] = prototype[property];
-};
-
-function d3_selection(groups) {
-  d3_subclass(groups, d3_selectionPrototype);
-  return groups;
-}
-
-var d3_select = function(s, n) { return n.querySelector(s); },
-    d3_selectAll = function(s, n) { return n.querySelectorAll(s); },
-    d3_selectMatcher = d3_documentElement[d3_vendorSymbol(d3_documentElement, "matchesSelector")],
-    d3_selectMatches = function(n, s) { return d3_selectMatcher.call(n, s); };
-
-// Prefer Sizzle, if available.
-if (typeof Sizzle === "function") {
-  d3_select = function(s, n) { return Sizzle(s, n)[0] || null; };
-  d3_selectAll = Sizzle;
-  d3_selectMatches = Sizzle.matchesSelector;
-}
-
-d3.selection = function() {
-  return d3_selectionRoot;
-};
-
-var d3_selectionPrototype = d3.selection.prototype = [];
-
-
-d3_selectionPrototype.select = function(selector) {
-  var subgroups = [],
-      subgroup,
-      subnode,
-      group,
-      node;
-
-  selector = d3_selection_selector(selector);
-
-  for (var j = -1, m = this.length; ++j < m;) {
-    subgroups.push(subgroup = []);
-    subgroup.parentNode = (group = this[j]).parentNode;
-    for (var i = -1, n = group.length; ++i < n;) {
-      if (node = group[i]) {
-        subgroup.push(subnode = selector.call(node, node.__data__, i, j));
-        if (subnode && "__data__" in node) subnode.__data__ = node.__data__;
-      } else {
-        subgroup.push(null);
-      }
-    }
-  }
-
-  return d3_selection(subgroups);
-};
-
-function d3_selection_selector(selector) {
-  return typeof selector === "function" ? selector : function() {
-    return d3_select(selector, this);
-  };
-}
-
-d3_selectionPrototype.selectAll = function(selector) {
-  var subgroups = [],
-      subgroup,
-      node;
-
-  selector = d3_selection_selectorAll(selector);
-
-  for (var j = -1, m = this.length; ++j < m;) {
-    for (var group = this[j], i = -1, n = group.length; ++i < n;) {
-      if (node = group[i]) {
-        subgroups.push(subgroup = d3_array(selector.call(node, node.__data__, i, j)));
-        subgroup.parentNode = node;
-      }
-    }
-  }
-
-  return d3_selection(subgroups);
-};
-
-function d3_selection_selectorAll(selector) {
-  return typeof selector === "function" ? selector : function() {
-    return d3_selectAll(selector, this);
-  };
-}
-var d3_nsPrefix = {
-  svg: "http://www.w3.org/2000/svg",
-  xhtml: "http://www.w3.org/1999/xhtml",
-  xlink: "http://www.w3.org/1999/xlink",
-  xml: "http://www.w3.org/XML/1998/namespace",
-  xmlns: "http://www.w3.org/2000/xmlns/"
-};
-
-d3.ns = {
-  prefix: d3_nsPrefix,
-  qualify: function(name) {
-    var i = name.indexOf(":"),
-        prefix = name;
-    if (i >= 0) {
-      prefix = name.substring(0, i);
-      name = name.substring(i + 1);
-    }
-    return d3_nsPrefix.hasOwnProperty(prefix)
-        ? {space: d3_nsPrefix[prefix], local: name}
-        : name;
-  }
-};
-
-d3_selectionPrototype.attr = function(name, value) {
-  if (arguments.length < 2) {
-
-    // For attr(string), return the attribute value for the first node.
-    if (typeof name === "string") {
-      var node = this.node();
-      name = d3.ns.qualify(name);
-      return name.local
-          ? node.getAttributeNS(name.space, name.local)
-          : node.getAttribute(name);
-    }
-
-    // For attr(object), the object specifies the names and values of the
-    // attributes to set or remove. The values may be functions that are
-    // evaluated for each element.
-    for (value in name) this.each(d3_selection_attr(value, name[value]));
-    return this;
-  }
-
-  return this.each(d3_selection_attr(name, value));
-};
-
-function d3_selection_attr(name, value) {
-  name = d3.ns.qualify(name);
-
-  // For attr(string, null), remove the attribute with the specified name.
-  function attrNull() {
-    this.removeAttribute(name);
-  }
-  function attrNullNS() {
-    this.removeAttributeNS(name.space, name.local);
-  }
-
-  // For attr(string, string), set the attribute with the specified name.
-  function attrConstant() {
-    this.setAttribute(name, value);
-  }
-  function attrConstantNS() {
-    this.setAttributeNS(name.space, name.local, value);
-  }
-
-  // For attr(string, function), evaluate the function for each element, and set
-  // or remove the attribute as appropriate.
-  function attrFunction() {
-    var x = value.apply(this, arguments);
-    if (x == null) this.removeAttribute(name);
-    else this.setAttribute(name, x);
-  }
-  function attrFunctionNS() {
-    var x = value.apply(this, arguments);
-    if (x == null) this.removeAttributeNS(name.space, name.local);
-    else this.setAttributeNS(name.space, name.local, x);
-  }
-
-  return value == null
-      ? (name.local ? attrNullNS : attrNull) : (typeof value === "function"
-      ? (name.local ? attrFunctionNS : attrFunction)
-      : (name.local ? attrConstantNS : attrConstant));
-}
-function d3_collapse(s) {
-  return s.trim().replace(/\s+/g, " ");
-}
-
-d3_selectionPrototype.classed = function(name, value) {
-  if (arguments.length < 2) {
-
-    // For classed(string), return true only if the first node has the specified
-    // class or classes. Note that even if the browser supports DOMTokenList, it
-    // probably doesn't support it on SVG elements (which can be animated).
-    if (typeof name === "string") {
-      var node = this.node(),
-          n = (name = d3_selection_classes(name)).length,
-          i = -1;
-      if (value = node.classList) {
-        while (++i < n) if (!value.contains(name[i])) return false;
-      } else {
-        value = node.getAttribute("class");
-        while (++i < n) if (!d3_selection_classedRe(name[i]).test(value)) return false;
-      }
-      return true;
-    }
-
-    // For classed(object), the object specifies the names of classes to add or
-    // remove. The values may be functions that are evaluated for each element.
-    for (value in name) this.each(d3_selection_classed(value, name[value]));
-    return this;
-  }
-
-  // Otherwise, both a name and a value are specified, and are handled as below.
-  return this.each(d3_selection_classed(name, value));
-};
-
-function d3_selection_classedRe(name) {
-  return new RegExp("(?:^|\\s+)" + d3.requote(name) + "(?:\\s+|$)", "g");
-}
-
-function d3_selection_classes(name) {
-  return name.trim().split(/^|\s+/);
-}
-
-// Multiple class names are allowed (e.g., "foo bar").
-function d3_selection_classed(name, value) {
-  name = d3_selection_classes(name).map(d3_selection_classedName);
-  var n = name.length;
-
-  function classedConstant() {
-    var i = -1;
-    while (++i < n) name[i](this, value);
-  }
-
-  // When the value is a function, the function is still evaluated only once per
-  // element even if there are multiple class names.
-  function classedFunction() {
-    var i = -1, x = value.apply(this, arguments);
-    while (++i < n) name[i](this, x);
-  }
-
-  return typeof value === "function"
-      ? classedFunction
-      : classedConstant;
-}
-
-function d3_selection_classedName(name) {
-  var re = d3_selection_classedRe(name);
-  return function(node, value) {
-    if (c = node.classList) return value ? c.add(name) : c.remove(name);
-    var c = node.getAttribute("class") || "";
-    if (value) {
-      re.lastIndex = 0;
-      if (!re.test(c)) node.setAttribute("class", d3_collapse(c + " " + name));
-    } else {
-      node.setAttribute("class", d3_collapse(c.replace(re, " ")));
-    }
-  };
-}
-
-d3_selectionPrototype.style = function(name, value, priority) {
-  var n = arguments.length;
-  if (n < 3) {
-
-    // For style(object) or style(object, string), the object specifies the
-    // names and values of the attributes to set or remove. The values may be
-    // functions that are evaluated for each element. The optional string
-    // specifies the priority.
-    if (typeof name !== "string") {
-      if (n < 2) value = "";
-      for (priority in name) this.each(d3_selection_style(priority, name[priority], value));
-      return this;
-    }
-
-    // For style(string), return the computed style value for the first node.
-    if (n < 2) return d3_window.getComputedStyle(this.node(), null).getPropertyValue(name);
-
-    // For style(string, string) or style(string, function), use the default
-    // priority. The priority is ignored for style(string, null).
-    priority = "";
-  }
-
-  // Otherwise, a name, value and priority are specified, and handled as below.
-  return this.each(d3_selection_style(name, value, priority));
-};
-
-function d3_selection_style(name, value, priority) {
-
-  // For style(name, null) or style(name, null, priority), remove the style
-  // property with the specified name. The priority is ignored.
-  function styleNull() {
-    this.style.removeProperty(name);
-  }
-
-  // For style(name, string) or style(name, string, priority), set the style
-  // property with the specified name, using the specified priority.
-  function styleConstant() {
-    this.style.setProperty(name, value, priority);
-  }
-
-  // For style(name, function) or style(name, function, priority), evaluate the
-  // function for each element, and set or remove the style property as
-  // appropriate. When setting, use the specified priority.
-  function styleFunction() {
-    var x = value.apply(this, arguments);
-    if (x == null) this.style.removeProperty(name);
-    else this.style.setProperty(name, x, priority);
-  }
-
-  return value == null
-      ? styleNull : (typeof value === "function"
-      ? styleFunction : styleConstant);
-}
-
-d3_selectionPrototype.property = function(name, value) {
-  if (arguments.length < 2) {
-
-    // For property(string), return the property value for the first node.
-    if (typeof name === "string") return this.node()[name];
-
-    // For property(object), the object specifies the names and values of the
-    // properties to set or remove. The values may be functions that are
-    // evaluated for each element.
-    for (value in name) this.each(d3_selection_property(value, name[value]));
-    return this;
-  }
-
-  // Otherwise, both a name and a value are specified, and are handled as below.
-  return this.each(d3_selection_property(name, value));
-};
-
-function d3_selection_property(name, value) {
-
-  // For property(name, null), remove the property with the specified name.
-  function propertyNull() {
-    delete this[name];
-  }
-
-  // For property(name, string), set the property with the specified name.
-  function propertyConstant() {
-    this[name] = value;
-  }
-
-  // For property(name, function), evaluate the function for each element, and
-  // set or remove the property as appropriate.
-  function propertyFunction() {
-    var x = value.apply(this, arguments);
-    if (x == null) delete this[name];
-    else this[name] = x;
-  }
-
-  return value == null
-      ? propertyNull : (typeof value === "function"
-      ? propertyFunction : propertyConstant);
-}
-
-d3_selectionPrototype.text = function(value) {
-  return arguments.length
-      ? this.each(typeof value === "function"
-      ? function() { var v = value.apply(this, arguments); this.textContent = v == null ? "" : v; } : value == null
-      ? function() { if (this.textContent !== "") this.textContent = ""; }
-      : function() { if (this.textContent !== value) this.textContent = value; })
-      : this.node().textContent;
-};
-
-d3_selectionPrototype.html = function(value) {
-  return arguments.length
-      ? this.each(typeof value === "function"
-      ? function() { var v = value.apply(this, arguments); this.innerHTML = v == null ? "" : v; } : value == null
-      ? function() { this.innerHTML = ""; }
-      : function() { this.innerHTML = value; })
-      : this.node().innerHTML;
-};
-
-d3_selectionPrototype.append = function(name) {
-  name = d3_selection_creator(name);
-  return this.select(function() {
-    return this.appendChild(name.apply(this, arguments));
-  });
-};
-
-function d3_selection_creator(name) {
-  return typeof name === "function" ? name
-      : (name = d3.ns.qualify(name)).local ? function() { return this.ownerDocument.createElementNS(name.space, name.local); }
-      : function() { return this.ownerDocument.createElementNS(this.namespaceURI, name); };
-}
-
-d3_selectionPrototype.insert = function(name, before) {
-  name = d3_selection_creator(name);
-  before = d3_selection_selector(before);
-  return this.select(function() {
-    return this.insertBefore(name.apply(this, arguments), before.apply(this, arguments) || null);
-  });
-};
-
-// TODO remove(selector)?
-// TODO remove(node)?
-// TODO remove(function)?
-d3_selectionPrototype.remove = function() {
-  return this.each(function() {
-    var parent = this.parentNode;
-    if (parent) parent.removeChild(this);
-  });
-};
-
-d3_selectionPrototype.data = function(value, key) {
-  var i = -1,
-      n = this.length,
-      group,
-      node;
-
-  // If no value is specified, return the first value.
-  if (!arguments.length) {
-    value = new Array(n = (group = this[0]).length);
-    while (++i < n) {
-      if (node = group[i]) {
-        value[i] = node.__data__;
-      }
-    }
-    return value;
-  }
-
-  function bind(group, groupData) {
-    var i,
-        n = group.length,
-        m = groupData.length,
-        n0 = Math.min(n, m),
-        updateNodes = new Array(m),
-        enterNodes = new Array(m),
-        exitNodes = new Array(n),
-        node,
-        nodeData;
-
-    if (key) {
-      var nodeByKeyValue = new d3_Map,
-          dataByKeyValue = new d3_Map,
-          keyValues = [],
-          keyValue;
-
-      for (i = -1; ++i < n;) {
-        keyValue = key.call(node = group[i], node.__data__, i);
-        if (nodeByKeyValue.has(keyValue)) {
-          exitNodes[i] = node; // duplicate selection key
-        } else {
-          nodeByKeyValue.set(keyValue, node);
-        }
-        keyValues.push(keyValue);
-      }
-
-      for (i = -1; ++i < m;) {
-        keyValue = key.call(groupData, nodeData = groupData[i], i);
-        if (node = nodeByKeyValue.get(keyValue)) {
-          updateNodes[i] = node;
-          node.__data__ = nodeData;
-        } else if (!dataByKeyValue.has(keyValue)) { // no duplicate data key
-          enterNodes[i] = d3_selection_dataNode(nodeData);
-        }
-        dataByKeyValue.set(keyValue, nodeData);
-        nodeByKeyValue.remove(keyValue);
-      }
-
-      for (i = -1; ++i < n;) {
-        if (nodeByKeyValue.has(keyValues[i])) {
-          exitNodes[i] = group[i];
-        }
-      }
-    } else {
-      for (i = -1; ++i < n0;) {
-        node = group[i];
-        nodeData = groupData[i];
-        if (node) {
-          node.__data__ = nodeData;
-          updateNodes[i] = node;
-        } else {
-          enterNodes[i] = d3_selection_dataNode(nodeData);
-        }
-      }
-      for (; i < m; ++i) {
-        enterNodes[i] = d3_selection_dataNode(groupData[i]);
-      }
-      for (; i < n; ++i) {
-        exitNodes[i] = group[i];
-      }
-    }
-
-    enterNodes.update
-        = updateNodes;
-
-    enterNodes.parentNode
-        = updateNodes.parentNode
-        = exitNodes.parentNode
-        = group.parentNode;
-
-    enter.push(enterNodes);
-    update.push(updateNodes);
-    exit.push(exitNodes);
-  }
-
-  var enter = d3_selection_enter([]),
-      update = d3_selection([]),
-      exit = d3_selection([]);
-
-  if (typeof value === "function") {
-    while (++i < n) {
-      bind(group = this[i], value.call(group, group.parentNode.__data__, i));
-    }
-  } else {
-    while (++i < n) {
-      bind(group = this[i], value);
-    }
-  }
-
-  update.enter = function() { return enter; };
-  update.exit = function() { return exit; };
-  return update;
-};
-
-function d3_selection_dataNode(data) {
-  return {__data__: data};
-}
-
-d3_selectionPrototype.datum = function(value) {
-  return arguments.length
-      ? this.property("__data__", value)
-      : this.property("__data__");
-};
-
-d3_selectionPrototype.filter = function(filter) {
-  var subgroups = [],
-      subgroup,
-      group,
-      node;
-
-  if (typeof filter !== "function") filter = d3_selection_filter(filter);
-
-  for (var j = 0, m = this.length; j < m; j++) {
-    subgroups.push(subgroup = []);
-    subgroup.parentNode = (group = this[j]).parentNode;
-    for (var i = 0, n = group.length; i < n; i++) {
-      if ((node = group[i]) && filter.call(node, node.__data__, i, j)) {
-        subgroup.push(node);
-      }
-    }
-  }
-
-  return d3_selection(subgroups);
-};
-
-function d3_selection_filter(selector) {
-  return function() {
-    return d3_selectMatches(this, selector);
-  };
-}
-
-d3_selectionPrototype.order = function() {
-  for (var j = -1, m = this.length; ++j < m;) {
-    for (var group = this[j], i = group.length - 1, next = group[i], node; --i >= 0;) {
-      if (node = group[i]) {
-        if (next && next !== node.nextSibling) next.parentNode.insertBefore(node, next);
-        next = node;
-      }
-    }
-  }
-  return this;
-};
-
-d3_selectionPrototype.sort = function(comparator) {
-  comparator = d3_selection_sortComparator.apply(this, arguments);
-  for (var j = -1, m = this.length; ++j < m;) this[j].sort(comparator);
-  return this.order();
-};
-
-function d3_selection_sortComparator(comparator) {
-  if (!arguments.length) comparator = d3_ascending;
-  return function(a, b) {
-    return a && b ? comparator(a.__data__, b.__data__) : !a - !b;
-  };
-}
-
-d3_selectionPrototype.each = function(callback) {
-  return d3_selection_each(this, function(node, i, j) {
-    callback.call(node, node.__data__, i, j);
-  });
-};
-
-function d3_selection_each(groups, callback) {
-  for (var j = 0, m = groups.length; j < m; j++) {
-    for (var group = groups[j], i = 0, n = group.length, node; i < n; i++) {
-      if (node = group[i]) callback(node, i, j);
-    }
-  }
-  return groups;
-}
-
-d3_selectionPrototype.call = function(callback) {
-  var args = d3_array(arguments);
-  callback.apply(args[0] = this, args);
-  return this;
-};
-
-d3_selectionPrototype.empty = function() {
-  return !this.node();
-};
-
-d3_selectionPrototype.node = function() {
-  for (var j = 0, m = this.length; j < m; j++) {
-    for (var group = this[j], i = 0, n = group.length; i < n; i++) {
-      var node = group[i];
-      if (node) return node;
-    }
-  }
-  return null;
-};
-
-d3_selectionPrototype.size = function() {
-  var n = 0;
-  this.each(function() { ++n; });
-  return n;
-};
-
-function d3_selection_enter(selection) {
-  d3_subclass(selection, d3_selection_enterPrototype);
-  return selection;
-}
-
-var d3_selection_enterPrototype = [];
-
-d3.selection.enter = d3_selection_enter;
-d3.selection.enter.prototype = d3_selection_enterPrototype;
-
-d3_selection_enterPrototype.append = d3_selectionPrototype.append;
-d3_selection_enterPrototype.empty = d3_selectionPrototype.empty;
-d3_selection_enterPrototype.node = d3_selectionPrototype.node;
-d3_selection_enterPrototype.call = d3_selectionPrototype.call;
-d3_selection_enterPrototype.size = d3_selectionPrototype.size;
-
-
-d3_selection_enterPrototype.select = function(selector) {
-  var subgroups = [],
-      subgroup,
-      subnode,
-      upgroup,
-      group,
-      node;
-
-  for (var j = -1, m = this.length; ++j < m;) {
-    upgroup = (group = this[j]).update;
-    subgroups.push(subgroup = []);
-    subgroup.parentNode = group.parentNode;
-    for (var i = -1, n = group.length; ++i < n;) {
-      if (node = group[i]) {
-        subgroup.push(upgroup[i] = subnode = selector.call(group.parentNode, node.__data__, i, j));
-        subnode.__data__ = node.__data__;
-      } else {
-        subgroup.push(null);
-      }
-    }
-  }
-
-  return d3_selection(subgroups);
-};
-
-d3_selection_enterPrototype.insert = function(name, before) {
-  if (arguments.length < 2) before = d3_selection_enterInsertBefore(this);
-  return d3_selectionPrototype.insert.call(this, name, before);
-};
-
-function d3_selection_enterInsertBefore(enter) {
-  var i0, j0;
-  return function(d, i, j) {
-    var group = enter[j].update,
-        n = group.length,
-        node;
-    if (j != j0) j0 = j, i0 = 0;
-    if (i >= i0) i0 = i + 1;
-    while (!(node = group[i0]) && ++i0 < n);
-    return node;
-  };
-}
-
-// import "../transition/transition";
-
-d3_selectionPrototype.transition = function() {
-  var id = d3_transitionInheritId || ++d3_transitionId,
-      subgroups = [],
-      subgroup,
-      node,
-      transition = d3_transitionInherit || {time: Date.now(), ease: d3_ease_cubicInOut, delay: 0, duration: 250};
-
-  for (var j = -1, m = this.length; ++j < m;) {
-    subgroups.push(subgroup = []);
-    for (var group = this[j], i = -1, n = group.length; ++i < n;) {
-      if (node = group[i]) d3_transitionNode(node, i, id, transition);
-      subgroup.push(node);
-    }
-  }
-
-  return d3_transition(subgroups, id);
-};
-// import "../transition/transition";
-
-d3_selectionPrototype.interrupt = function() {
-  return this.each(d3_selection_interrupt);
-};
-
-function d3_selection_interrupt() {
-  var lock = this.__transition__;
-  if (lock) ++lock.active;
-}
-
-// TODO fast singleton implementation?
-d3.select = function(node) {
-  var group = [typeof node === "string" ? d3_select(node, d3_document) : node];
-  group.parentNode = d3_documentElement;
-  return d3_selection([group]);
-};
-
-d3.selectAll = function(nodes) {
-  var group = d3_array(typeof nodes === "string" ? d3_selectAll(nodes, d3_document) : nodes);
-  group.parentNode = d3_documentElement;
-  return d3_selection([group]);
-};
-
-var d3_selectionRoot = d3.select(d3_documentElement);
-
-d3_selectionPrototype.on = function(type, listener, capture) {
-  var n = arguments.length;
-  if (n < 3) {
-
-    // For on(object) or on(object, boolean), the object specifies the event
-    // types and listeners to add or remove. The optional boolean specifies
-    // whether the listener captures events.
-    if (typeof type !== "string") {
-      if (n < 2) listener = false;
-      for (capture in type) this.each(d3_selection_on(capture, type[capture], listener));
-      return this;
-    }
-
-    // For on(string), return the listener for the first node.
-    if (n < 2) return (n = this.node()["__on" + type]) && n._;
-
-    // For on(string, function), use the default capture.
-    capture = false;
-  }
-
-  // Otherwise, a type, listener and capture are specified, and handled as below.
-  return this.each(d3_selection_on(type, listener, capture));
-};
-
-function d3_selection_on(type, listener, capture) {
-  var name = "__on" + type,
-      i = type.indexOf("."),
-      wrap = d3_selection_onListener;
-
-  if (i > 0) type = type.substring(0, i);
-  var filter = d3_selection_onFilters.get(type);
-  if (filter) type = filter, wrap = d3_selection_onFilter;
-
-  function onRemove() {
-    var l = this[name];
-    if (l) {
-      this.removeEventListener(type, l, l.$);
-      delete this[name];
-    }
-  }
-
-  function onAdd() {
-    var l = wrap(listener, d3_array(arguments));
-    if (typeof Raven !== 'undefined') l = Raven.wrap(l);
-    onRemove.call(this);
-    this.addEventListener(type, this[name] = l, l.$ = capture);
-    l._ = listener;
-  }
-
-  function removeAll() {
-    var re = new RegExp("^__on([^.]+)" + d3.requote(type) + "$"),
-        match;
-    for (var name in this) {
-      if (match = name.match(re)) {
-        var l = this[name];
-        this.removeEventListener(match[1], l, l.$);
-        delete this[name];
-      }
-    }
-  }
-
-  return i
-      ? listener ? onAdd : onRemove
-      : listener ? d3_noop : removeAll;
-}
-
-var d3_selection_onFilters = d3.map({
-  mouseenter: "mouseover",
-  mouseleave: "mouseout"
-});
-
-d3_selection_onFilters.forEach(function(k) {
-  if ("on" + k in d3_document) d3_selection_onFilters.remove(k);
-});
-
-function d3_selection_onListener(listener, argumentz) {
-  return function(e) {
-    var o = d3.event; // Events can be reentrant (e.g., focus).
-    d3.event = e;
-    argumentz[0] = this.__data__;
-    try {
-      listener.apply(this, argumentz);
-    } finally {
-      d3.event = o;
-    }
-  };
-}
-
-function d3_selection_onFilter(listener, argumentz) {
-  var l = d3_selection_onListener(listener, argumentz);
-  return function(e) {
-    var target = this, related = e.relatedTarget;
-    if (!related || (related !== target && !(related.compareDocumentPosition(target) & 8))) {
-      l.call(target, e);
-    }
-  };
-}
-
-var d3_event_dragSelect = "onselectstart" in d3_document ? null : d3_vendorSymbol(d3_documentElement.style, "userSelect"),
-    d3_event_dragId = 0;
-
-function d3_event_dragSuppress() {
-  var name = ".dragsuppress-" + ++d3_event_dragId,
-      click = "click" + name,
-      w = d3.select(d3_window)
-          .on("touchmove" + name, d3_eventPreventDefault)
-          .on("dragstart" + name, d3_eventPreventDefault)
-          .on("selectstart" + name, d3_eventPreventDefault);
-  if (d3_event_dragSelect) {
-    var style = d3_documentElement.style,
-        select = style[d3_event_dragSelect];
-    style[d3_event_dragSelect] = "none";
-  }
-  return function(suppressClick) {
-    w.on(name, null);
-    if (d3_event_dragSelect) style[d3_event_dragSelect] = select;
-    if (suppressClick) { // suppress the next click, but only if it’s immediate
-      function off() { w.on(click, null); }
-      w.on(click, function() { d3_eventCancel(); off(); }, true);
-      setTimeout(off, 0);
-    }
-  };
-}
-
-d3.mouse = function(container) {
-  return d3_mousePoint(container, d3_eventSource());
-};
-
-function d3_mousePoint(container, e) {
-  if (e.changedTouches) e = e.changedTouches[0];
-  var svg = container.ownerSVGElement || container;
-  if (svg.createSVGPoint) {
-    var point = svg.createSVGPoint();
-    point.x = e.clientX, point.y = e.clientY;
-    point = point.matrixTransform(container.getScreenCTM().inverse());
-    return [point.x, point.y];
-  }
-  var rect = container.getBoundingClientRect();
-  return [e.clientX - rect.left - container.clientLeft, e.clientY - rect.top - container.clientTop];
-};
-
-d3.touches = function(container, touches) {
-  if (arguments.length < 2) touches = d3_eventSource().touches;
-  return touches ? d3_array(touches).map(function(touch) {
-    var point = d3_mousePoint(container, touch);
-    point.identifier = touch.identifier;
-    return point;
-  }) : [];
-};
-var π = Math.PI,
-    τ = 2 * π,
-    halfπ = π / 2,
-    ε = 1e-6,
-    ε2 = ε * ε,
-    d3_radians = π / 180,
-    d3_degrees = 180 / π;
-
-function d3_sgn(x) {
-  return x > 0 ? 1 : x < 0 ? -1 : 0;
-}
-
-// Returns the 2D cross product of AB and AC vectors, i.e., the z-component of
-// the 3D cross product in a quadrant I Cartesian coordinate system (+x is
-// right, +y is up). Returns a positive value if ABC is counter-clockwise,
-// negative if clockwise, and zero if the points are collinear.
-function d3_cross2d(a, b, c) {
-  return (b[0] - a[0]) * (c[1] - a[1]) - (b[1] - a[1]) * (c[0] - a[0]);
-}
-
-function d3_acos(x) {
-  return x > 1 ? 0 : x < -1 ? π : Math.acos(x);
-}
-
-function d3_asin(x) {
-  return x > 1 ? halfπ : x < -1 ? -halfπ : Math.asin(x);
-}
-
-function d3_sinh(x) {
-  return ((x = Math.exp(x)) - 1 / x) / 2;
-}
-
-function d3_cosh(x) {
-  return ((x = Math.exp(x)) + 1 / x) / 2;
-}
-
-function d3_tanh(x) {
-  return ((x = Math.exp(2 * x)) - 1) / (x + 1);
-}
-
-function d3_haversin(x) {
-  return (x = Math.sin(x / 2)) * x;
-}
-
-var ρ = Math.SQRT2,
-    ρ2 = 2,
-    ρ4 = 4;
-
-// p0 = [ux0, uy0, w0]
-// p1 = [ux1, uy1, w1]
-d3.interpolateZoom = function(p0, p1) {
-  var ux0 = p0[0], uy0 = p0[1], w0 = p0[2],
-      ux1 = p1[0], uy1 = p1[1], w1 = p1[2];
-
-  var dx = ux1 - ux0,
-      dy = uy1 - uy0,
-      d2 = dx * dx + dy * dy,
-      d1 = Math.sqrt(d2),
-      b0 = (w1 * w1 - w0 * w0 + ρ4 * d2) / (2 * w0 * ρ2 * d1),
-      b1 = (w1 * w1 - w0 * w0 - ρ4 * d2) / (2 * w1 * ρ2 * d1),
-      r0 = Math.log(Math.sqrt(b0 * b0 + 1) - b0),
-      r1 = Math.log(Math.sqrt(b1 * b1 + 1) - b1),
-      dr = r1 - r0,
-      S = (dr || Math.log(w1 / w0)) / ρ;
-
-  function interpolate(t) {
-    var s = t * S;
-    if (dr) {
-      // General case.
-      var coshr0 = d3_cosh(r0),
-          u = w0 / (ρ2 * d1) * (coshr0 * d3_tanh(ρ * s + r0) - d3_sinh(r0));
-      return [
-        ux0 + u * dx,
-        uy0 + u * dy,
-        w0 * coshr0 / d3_cosh(ρ * s + r0)
-      ];
-    }
-    // Special case for u0 ~= u1.
-    return [
-      ux0 + t * dx,
-      uy0 + t * dy,
-      w0 * Math.exp(ρ * s)
-    ];
-  }
-
-  interpolate.duration = S * 1000;
-
-  return interpolate;
-};
-
-d3.behavior.zoom = function() {
-  var view = {x: 0, y: 0, k: 1},
-      translate0, // translate when we started zooming (to avoid drift)
-      center, // desired position of translate0 after zooming
-      size = [960, 500], // viewport size; required for zoom interpolation
-      scaleExtent = d3_behavior_zoomInfinity,
-      mousedown = "mousedown.zoom",
-      mousemove = "mousemove.zoom",
-      mouseup = "mouseup.zoom",
-      mousewheelTimer,
-      touchstart = "touchstart.zoom",
-      touchtime, // time of last touchstart (to detect double-tap)
-      event = d3_eventDispatch(zoom, "zoomstart", "zoom", "zoomend"),
-      x0,
-      x1,
-      y0,
-      y1;
-
-  function zoom(g) {
-    g   .on(mousedown, mousedowned)
-        .on(d3_behavior_zoomWheel + ".zoom", mousewheeled)
-        .on(mousemove, mousewheelreset)
-        .on("dblclick.zoom", dblclicked)
-        .on(touchstart, touchstarted);
-  }
-
-  zoom.event = function(g) {
-    g.each(function() {
-      var dispatch = event.of(this, arguments),
-          view1 = view;
-      if (d3_transitionInheritId) {
-        d3.select(this).transition()
-            .each("start.zoom", function() {
-              view = this.__chart__ || {x: 0, y: 0, k: 1}; // pre-transition state
-              zoomstarted(dispatch);
-            })
-            .tween("zoom:zoom", function() {
-              var dx = size[0],
-                  dy = size[1],
-                  cx = dx / 2,
-                  cy = dy / 2,
-                  i = d3.interpolateZoom(
-                    [(cx - view.x) / view.k, (cy - view.y) / view.k, dx / view.k],
-                    [(cx - view1.x) / view1.k, (cy - view1.y) / view1.k, dx / view1.k]
-                  );
-              return function(t) {
-                var l = i(t), k = dx / l[2];
-                this.__chart__ = view = {x: cx - l[0] * k, y: cy - l[1] * k, k: k};
-                zoomed(dispatch);
-              };
-            })
-            .each("end.zoom", function() {
-              zoomended(dispatch);
-            });
-      } else {
-        this.__chart__ = view;
-        zoomstarted(dispatch);
-        zoomed(dispatch);
-        zoomended(dispatch);
-      }
-    });
-  }
-
-  zoom.translate = function(_) {
-    if (!arguments.length) return [view.x, view.y];
-    view = {x: +_[0], y: +_[1], k: view.k}; // copy-on-write
-    rescale();
-    return zoom;
-  };
-
-  zoom.scale = function(_) {
-    if (!arguments.length) return view.k;
-    view = {x: view.x, y: view.y, k: +_}; // copy-on-write
-    rescale();
-    return zoom;
-  };
-
-  zoom.scaleExtent = function(_) {
-    if (!arguments.length) return scaleExtent;
-    scaleExtent = _ == null ? d3_behavior_zoomInfinity : [+_[0], +_[1]];
-    return zoom;
-  };
-
-  zoom.center = function(_) {
-    if (!arguments.length) return center;
-    center = _ && [+_[0], +_[1]];
-    return zoom;
-  };
-
-  zoom.size = function(_) {
-    if (!arguments.length) return size;
-    size = _ && [+_[0], +_[1]];
-    return zoom;
-  };
-
-  zoom.x = function(z) {
-    if (!arguments.length) return x1;
-    x1 = z;
-    x0 = z.copy();
-    view = {x: 0, y: 0, k: 1}; // copy-on-write
-    return zoom;
-  };
-
-  zoom.y = function(z) {
-    if (!arguments.length) return y1;
-    y1 = z;
-    y0 = z.copy();
-    view = {x: 0, y: 0, k: 1}; // copy-on-write
-    return zoom;
-  };
-
-  function location(p) {
-    return [(p[0] - view.x) / view.k, (p[1] - view.y) / view.k];
-  }
-
-  function point(l) {
-    return [l[0] * view.k + view.x, l[1] * view.k + view.y];
-  }
-
-  function scaleTo(s) {
-    view.k = Math.max(scaleExtent[0], Math.min(scaleExtent[1], s));
-  }
-
-  function translateTo(p, l) {
-    l = point(l);
-    view.x += p[0] - l[0];
-    view.y += p[1] - l[1];
-  }
-
-  function rescale() {
-    if (x1) x1.domain(x0.range().map(function(x) { return (x - view.x) / view.k; }).map(x0.invert));
-    if (y1) y1.domain(y0.range().map(function(y) { return (y - view.y) / view.k; }).map(y0.invert));
-  }
-
-  function zoomstarted(dispatch) {
-    dispatch({type: "zoomstart"});
-  }
-
-  function zoomed(dispatch) {
-    rescale();
-    dispatch({type: "zoom", scale: view.k, translate: [view.x, view.y]});
-  }
-
-  function zoomended(dispatch) {
-    dispatch({type: "zoomend"});
-  }
-
-  function mousedowned() {
-    var that = this,
-        target = d3.event.target,
-        dispatch = event.of(that, arguments),
-        dragged = 0,
-        subject = d3.select(d3_window).on(mousemove, moved).on(mouseup, ended),
-        location0 = location(d3.mouse(that)),
-        dragRestore = d3_event_dragSuppress();
-
-    d3_selection_interrupt.call(that);
-    zoomstarted(dispatch);
-
-    function moved() {
-      dragged = 1;
-      translateTo(d3.mouse(that), location0);
-      zoomed(dispatch);
-    }
-
-    function ended() {
-      subject.on(mousemove, d3_window === that ? mousewheelreset : null).on(mouseup, null);
-      dragRestore(dragged && d3.event.target === target);
-      zoomended(dispatch);
-    }
-  }
-
-  // These closures persist for as long as at least one touch is active.
-  function touchstarted() {
-    var that = this,
-        dispatch = event.of(that, arguments),
-        locations0 = {}, // touchstart locations
-        distance0 = 0, // distance² between initial touches
-        scale0, // scale when we started touching
-        zoomName = ".zoom-" + d3.event.changedTouches[0].identifier,
-        touchmove = "touchmove" + zoomName,
-        touchend = "touchend" + zoomName,
-        target = d3.select(d3.event.target).on(touchmove, moved).on(touchend, ended),
-        subject = d3.select(that).on(mousedown, null).on(touchstart, started), // prevent duplicate events
-        dragRestore = d3_event_dragSuppress();
-
-    d3_selection_interrupt.call(that);
-    started();
-    zoomstarted(dispatch);
-
-    // Updates locations of any touches in locations0.
-    function relocate() {
-      var touches = d3.touches(that);
-      scale0 = view.k;
-      touches.forEach(function(t) {
-        if (t.identifier in locations0) locations0[t.identifier] = location(t);
-      });
-      return touches;
-    }
-
-    // Temporarily override touchstart while gesture is active.
-    function started() {
-      // Only track touches started on the target element.
-      var changed = d3.event.changedTouches;
-      for (var i = 0, n = changed.length; i < n; ++i) {
-        locations0[changed[i].identifier] = null;
-      }
-
-      var touches = relocate(),
-          now = Date.now();
-
-      if (touches.length === 1) {
-        if (now - touchtime < 500) { // dbltap
-          var p = touches[0], l = locations0[p.identifier];
-          scaleTo(view.k * 2);
-          translateTo(p, l);
-          d3_eventPreventDefault();
-          zoomed(dispatch);
-        }
-        touchtime = now;
-      } else if (touches.length > 1) {
-        var p = touches[0], q = touches[1],
-            dx = p[0] - q[0], dy = p[1] - q[1];
-        distance0 = dx * dx + dy * dy;
-      }
-    }
-
-    function moved() {
-      var touches = d3.touches(that),
-          p0, l0,
-          p1, l1;
-      for (var i = 0, n = touches.length; i < n; ++i, l1 = null) {
-        p1 = touches[i];
-        if (l1 = locations0[p1.identifier]) {
-          if (l0) break;
-          p0 = p1, l0 = l1;
-        }
-      }
-
-      if (l1) {
-        var distance1 = (distance1 = p1[0] - p0[0]) * distance1 + (distance1 = p1[1] - p0[1]) * distance1,
-            scale1 = distance0 && Math.sqrt(distance1 / distance0);
-        p0 = [(p0[0] + p1[0]) / 2, (p0[1] + p1[1]) / 2];
-        l0 = [(l0[0] + l1[0]) / 2, (l0[1] + l1[1]) / 2];
-        scaleTo(scale1 * scale0);
-      }
-
-      touchtime = null;
-      translateTo(p0, l0);
-      zoomed(dispatch);
-    }
-
-    function ended() {
-      // If there are any globally-active touches remaining, remove the ended
-      // touches from locations0.
-      if (d3.event.touches.length) {
-        var changed = d3.event.changedTouches;
-        for (var i = 0, n = changed.length; i < n; ++i) {
-          delete locations0[changed[i].identifier];
-        }
-        // If locations0 is not empty, then relocate and continue listening for
-        // touchmove and touchend.
-        for (var identifier in locations0) {
-          return void relocate(); // locations may have detached due to rotation
-        }
-      }
-      // Otherwise, remove touchmove and touchend listeners.
-      target.on(zoomName, null);
-      subject.on(mousedown, mousedowned).on(touchstart, touchstarted);
-      dragRestore();
-      zoomended(dispatch);
-    }
-  }
-
-  function mousewheeled() {
-    var dispatch = event.of(this, arguments);
-    if (mousewheelTimer) clearTimeout(mousewheelTimer);
-    else d3_selection_interrupt.call(this), zoomstarted(dispatch);
-    mousewheelTimer = setTimeout(function() { mousewheelTimer = null; zoomended(dispatch); }, 50);
-    d3_eventPreventDefault();
-    var point = center || d3.mouse(this);
-    if (!translate0) translate0 = location(point);
-    scaleTo(Math.pow(2, d3_behavior_zoomDelta() * .002) * view.k);
-    translateTo(point, translate0);
-    zoomed(dispatch);
-  }
-
-  function mousewheelreset() {
-    translate0 = null;
-  }
-
-  function dblclicked() {
-    var dispatch = event.of(this, arguments),
-        p = d3.mouse(this),
-        l = location(p),
-        k = Math.log(view.k) / Math.LN2;
-    zoomstarted(dispatch);
-    scaleTo(Math.pow(2, d3.event.shiftKey ? Math.ceil(k) - 1 : Math.floor(k) + 1));
-    translateTo(p, l);
-    zoomed(dispatch);
-    zoomended(dispatch);
-  }
-
-  return d3.rebind(zoom, event, "on");
-};
-
-var d3_behavior_zoomInfinity = [0, Infinity]; // default scale extent
-
-// https://developer.mozilla.org/en-US/docs/Mozilla_event_reference/wheel
-var d3_behavior_zoomDelta, d3_behavior_zoomWheel
-    = "onwheel" in d3_document ? (d3_behavior_zoomDelta = function() { return -d3.event.deltaY * (d3.event.deltaMode ? 120 : 1); }, "wheel")
-    : "onmousewheel" in d3_document ? (d3_behavior_zoomDelta = function() { return d3.event.wheelDelta; }, "mousewheel")
-    : (d3_behavior_zoomDelta = function() { return -d3.event.detail; }, "MozMousePixelScroll");
-function d3_functor(v) {
-  return typeof v === "function" ? v : function() { return v; };
-}
-
-d3.functor = d3_functor;
-
-d3.touch = function(container, touches, identifier) {
-  if (arguments.length < 3) identifier = touches, touches = d3_eventSource().changedTouches;
-  if (touches) for (var i = 0, n = touches.length, touch; i < n; ++i) {
-    if ((touch = touches[i]).identifier === identifier) {
-      return d3_mousePoint(container, touch);
-    }
-  }
-};
-
-var d3_timer_queueHead,
-    d3_timer_queueTail,
-    d3_timer_interval, // is an interval (or frame) active?
-    d3_timer_timeout, // is a timeout active?
-    d3_timer_active, // active timer object
-    d3_timer_frame = d3_window[d3_vendorSymbol(d3_window, "requestAnimationFrame")] || function(callback) { setTimeout(callback, 17); };
-
-// The timer will continue to fire until callback returns true.
-d3.timer = function(callback, delay, then) {
-  var n = arguments.length;
-  if (n < 2) delay = 0;
-  if (n < 3) then = Date.now();
-
-  // Add the callback to the tail of the queue.
-  var time = then + delay, timer = {c: callback, t: time, f: false, n: null};
-  if (d3_timer_queueTail) d3_timer_queueTail.n = timer;
-  else d3_timer_queueHead = timer;
-  d3_timer_queueTail = timer;
-
-  // Start animatin'!
-  if (!d3_timer_interval) {
-    d3_timer_timeout = clearTimeout(d3_timer_timeout);
-    d3_timer_interval = 1;
-    d3_timer_frame(d3_timer_step);
-  }
-};
-
-function d3_timer_step() {
-  var now = d3_timer_mark(),
-      delay = d3_timer_sweep() - now;
-  if (delay > 24) {
-    if (isFinite(delay)) {
-      clearTimeout(d3_timer_timeout);
-      d3_timer_timeout = setTimeout(d3_timer_step, delay);
-    }
-    d3_timer_interval = 0;
-  } else {
-    d3_timer_interval = 1;
-    d3_timer_frame(d3_timer_step);
-  }
-}
-
-d3.timer.flush = function() {
-  d3_timer_mark();
-  d3_timer_sweep();
-};
-
-function d3_timer_mark() {
-  var now = Date.now();
-  d3_timer_active = d3_timer_queueHead;
-  while (d3_timer_active) {
-    if (now >= d3_timer_active.t) d3_timer_active.f = d3_timer_active.c(now - d3_timer_active.t);
-    d3_timer_active = d3_timer_active.n;
-  }
-  return now;
-}
-
-// Flush after callbacks to avoid concurrent queue modification.
-// Returns the time of the earliest active timer, post-sweep.
-function d3_timer_sweep() {
-  var t0,
-      t1 = d3_timer_queueHead,
-      time = Infinity;
-  while (t1) {
-    if (t1.f) {
-      t1 = t0 ? t0.n = t1.n : d3_timer_queueHead = t1.n;
-    } else {
-      if (t1.t < time) time = t1.t;
-      t1 = (t0 = t1).n;
-    }
-  }
-  d3_timer_queueTail = t0;
-  return time;
-}
-d3.geo = {};
-function d3_identity(d) {
-  return d;
-}
-function d3_true() {
-  return true;
-}
-
-function d3_geo_spherical(cartesian) {
-  return [
-    Math.atan2(cartesian[1], cartesian[0]),
-    d3_asin(cartesian[2])
-  ];
-}
-
-function d3_geo_sphericalEqual(a, b) {
-  return abs(a[0] - b[0]) < ε && abs(a[1] - b[1]) < ε;
-}
-
-// General spherical polygon clipping algorithm: takes a polygon, cuts it into
-// visible line segments and rejoins the segments by interpolating along the
-// clip edge.
-function d3_geo_clipPolygon(segments, compare, clipStartInside, interpolate, listener) {
-  var subject = [],
-      clip = [];
-
-  segments.forEach(function(segment) {
-    if ((n = segment.length - 1) <= 0) return;
-    var n, p0 = segment[0], p1 = segment[n];
-
-    // If the first and last points of a segment are coincident, then treat as
-    // a closed ring.
-    // TODO if all rings are closed, then the winding order of the exterior
-    // ring should be checked.
-    if (d3_geo_sphericalEqual(p0, p1)) {
-      listener.lineStart();
-      for (var i = 0; i < n; ++i) listener.point((p0 = segment[i])[0], p0[1]);
-      listener.lineEnd();
-      return;
-    }
-
-    var a = new d3_geo_clipPolygonIntersection(p0, segment, null, true),
-        b = new d3_geo_clipPolygonIntersection(p0, null, a, false);
-    a.o = b;
-    subject.push(a);
-    clip.push(b);
-    a = new d3_geo_clipPolygonIntersection(p1, segment, null, false);
-    b = new d3_geo_clipPolygonIntersection(p1, null, a, true);
-    a.o = b;
-    subject.push(a);
-    clip.push(b);
-  });
-  clip.sort(compare);
-  d3_geo_clipPolygonLinkCircular(subject);
-  d3_geo_clipPolygonLinkCircular(clip);
-  if (!subject.length) return;
-
-  for (var i = 0, entry = clipStartInside, n = clip.length; i < n; ++i) {
-    clip[i].e = entry = !entry;
-  }
-
-  var start = subject[0],
-      points,
-      point;
-  while (1) {
-    // Find first unvisited intersection.
-    var current = start,
-        isSubject = true;
-    while (current.v) if ((current = current.n) === start) return;
-    points = current.z;
-    listener.lineStart();
-    do {
-      current.v = current.o.v = true;
-      if (current.e) {
-        if (isSubject) {
-          for (var i = 0, n = points.length; i < n; ++i) listener.point((point = points[i])[0], point[1]);
-        } else {
-          interpolate(current.x, current.n.x, 1, listener);
-        }
-        current = current.n;
-      } else {
-        if (isSubject) {
-          points = current.p.z;
-          for (var i = points.length - 1; i >= 0; --i) listener.point((point = points[i])[0], point[1]);
-        } else {
-          interpolate(current.x, current.p.x, -1, listener);
-        }
-        current = current.p;
-      }
-      current = current.o;
-      points = current.z;
-      isSubject = !isSubject;
-    } while (!current.v);
-    listener.lineEnd();
-  }
-}
-
-function d3_geo_clipPolygonLinkCircular(array) {
-  if (!(n = array.length)) return;
-  var n,
-      i = 0,
-      a = array[0],
-      b;
-  while (++i < n) {
-    a.n = b = array[i];
-    b.p = a;
-    a = b;
-  }
-  a.n = b = array[0];
-  b.p = a;
-}
-
-function d3_geo_clipPolygonIntersection(point, points, other, entry) {
-  this.x = point;
-  this.z = points;
-  this.o = other; // another intersection
-  this.e = entry; // is an entry?
-  this.v = false; // visited
-  this.n = this.p = null; // next & previous
-}
-
-function d3_geo_clip(pointVisible, clipLine, interpolate, clipStart) {
-  return function(rotate, listener) {
-    var line = clipLine(listener),
-        rotatedClipStart = rotate.invert(clipStart[0], clipStart[1]);
-
-    var clip = {
-      point: point,
-      lineStart: lineStart,
-      lineEnd: lineEnd,
-      polygonStart: function() {
-        clip.point = pointRing;
-        clip.lineStart = ringStart;
-        clip.lineEnd = ringEnd;
-        segments = [];
-        polygon = [];
-      },
-      polygonEnd: function() {
-        clip.point = point;
-        clip.lineStart = lineStart;
-        clip.lineEnd = lineEnd;
-
-        segments = d3.merge(segments);
-        var clipStartInside = d3_geo_pointInPolygon(rotatedClipStart, polygon);
-        if (segments.length) {
-          if (!polygonStarted) listener.polygonStart(), polygonStarted = true;
-          d3_geo_clipPolygon(segments, d3_geo_clipSort, clipStartInside, interpolate, listener);
-        } else if (clipStartInside) {
-          if (!polygonStarted) listener.polygonStart(), polygonStarted = true;
-          listener.lineStart();
-          interpolate(null, null, 1, listener);
-          listener.lineEnd();
-        }
-        if (polygonStarted) listener.polygonEnd(), polygonStarted = false;
-        segments = polygon = null;
-      },
-      sphere: function() {
-        listener.polygonStart();
-        listener.lineStart();
-        interpolate(null, null, 1, listener);
-        listener.lineEnd();
-        listener.polygonEnd();
-      }
-    };
-
-    function point(λ, φ) {
-      var point = rotate(λ, φ);
-      if (pointVisible(λ = point[0], φ = point[1])) listener.point(λ, φ);
-    }
-    function pointLine(λ, φ) {
-      var point = rotate(λ, φ);
-      line.point(point[0], point[1]);
-    }
-    function lineStart() { clip.point = pointLine; line.lineStart(); }
-    function lineEnd() { clip.point = point; line.lineEnd(); }
-
-    var segments;
-
-    var buffer = d3_geo_clipBufferListener(),
-        ringListener = clipLine(buffer),
-        polygonStarted = false,
-        polygon,
-        ring;
-
-    function pointRing(λ, φ) {
-      ring.push([λ, φ]);
-      var point = rotate(λ, φ);
-      ringListener.point(point[0], point[1]);
-    }
-
-    function ringStart() {
-      ringListener.lineStart();
-      ring = [];
-    }
-
-    function ringEnd() {
-      pointRing(ring[0][0], ring[0][1]);
-      ringListener.lineEnd();
-
-      var clean = ringListener.clean(),
-          ringSegments = buffer.buffer(),
-          segment,
-          n = ringSegments.length;
-
-      ring.pop();
-      polygon.push(ring);
-      ring = null;
-
-      if (!n) return;
-
-      // No intersections.
-      if (clean & 1) {
-        segment = ringSegments[0];
-        var n = segment.length - 1,
-            i = -1,
-            point;
-        if (n > 0) {
-          if (!polygonStarted) listener.polygonStart(), polygonStarted = true;
-          listener.lineStart();
-          while (++i < n) listener.point((point = segment[i])[0], point[1]);
-          listener.lineEnd();
-        }
-        return;
-      }
-
-      // Rejoin connected segments.
-      // TODO reuse bufferListener.rejoin()?
-      if (n > 1 && clean & 2) ringSegments.push(ringSegments.pop().concat(ringSegments.shift()));
-
-      segments.push(ringSegments.filter(d3_geo_clipSegmentLength1));
-    }
-
-    return clip;
-  };
-}
-
-function d3_geo_clipSegmentLength1(segment) {
-  return segment.length > 1;
-}
-
-function d3_geo_clipBufferListener() {
-  var lines = [],
-      line;
-  return {
-    lineStart: function() { lines.push(line = []); },
-    point: function(λ, φ) { line.push([λ, φ]); },
-    lineEnd: d3_noop,
-    buffer: function() {
-      var buffer = lines;
-      lines = [];
-      line = null;
-      return buffer;
-    },
-    rejoin: function() {
-      if (lines.length > 1) lines.push(lines.pop().concat(lines.shift()));
-    }
-  };
-}
-
-// Intersection points are sorted along the clip edge. For both antimeridian
-// cutting and circle clipping, the same comparison is used.
-function d3_geo_clipSort(a, b) {
-  return ((a = a.x)[0] < 0 ? a[1] - halfπ - ε : halfπ - a[1])
-       - ((b = b.x)[0] < 0 ? b[1] - halfπ - ε : halfπ - b[1]);
-}
-// Adds floating point numbers with twice the normal precision.
-// Reference: J. R. Shewchuk, Adaptive Precision Floating-Point Arithmetic and
-// Fast Robust Geometric Predicates, Discrete & Computational Geometry 18(3)
-// 305–363 (1997).
-// Code adapted from GeographicLib by Charles F. F. Karney,
-// http://geographiclib.sourceforge.net/
-// See lib/geographiclib/LICENSE for details.
-
-function d3_adder() {}
-
-d3_adder.prototype = {
-  s: 0, // rounded value
-  t: 0, // exact error
-  add: function(y) {
-    d3_adderSum(y, this.t, d3_adderTemp);
-    d3_adderSum(d3_adderTemp.s, this.s, this);
-    if (this.s) this.t += d3_adderTemp.t;
-    else this.s = d3_adderTemp.t;
-  },
-  reset: function() {
-    this.s = this.t = 0;
-  },
-  valueOf: function() {
-    return this.s;
-  }
-};
-
-var d3_adderTemp = new d3_adder;
-
-function d3_adderSum(a, b, o) {
-  var x = o.s = a + b, // a + b
-      bv = x - a, av = x - bv; // b_virtual & a_virtual
-  o.t = (a - av) + (b - bv); // a_roundoff + b_roundoff
-}
-
-d3.geo.stream = function(object, listener) {
-  if (object && d3_geo_streamObjectType.hasOwnProperty(object.type)) {
-    d3_geo_streamObjectType[object.type](object, listener);
-  } else {
-    d3_geo_streamGeometry(object, listener);
-  }
-};
-
-function d3_geo_streamGeometry(geometry, listener) {
-  if (geometry && d3_geo_streamGeometryType.hasOwnProperty(geometry.type)) {
-    d3_geo_streamGeometryType[geometry.type](geometry, listener);
-  }
-}
-
-var d3_geo_streamObjectType = {
-  Feature: function(feature, listener) {
-    d3_geo_streamGeometry(feature.geometry, listener);
-  },
-  FeatureCollection: function(object, listener) {
-    var features = object.features, i = -1, n = features.length;
-    while (++i < n) d3_geo_streamGeometry(features[i].geometry, listener);
-  }
-};
-
-var d3_geo_streamGeometryType = {
-  Sphere: function(object, listener) {
-    listener.sphere();
-  },
-  Point: function(object, listener) {
-    object = object.coordinates;
-    listener.point(object[0], object[1], object[2]);
-  },
-  MultiPoint: function(object, listener) {
-    var coordinates = object.coordinates, i = -1, n = coordinates.length;
-    while (++i < n) object = coordinates[i], listener.point(object[0], object[1], object[2]);
-  },
-  LineString: function(object, listener) {
-    d3_geo_streamLine(object.coordinates, listener, 0);
-  },
-  MultiLineString: function(object, listener) {
-    var coordinates = object.coordinates, i = -1, n = coordinates.length;
-    while (++i < n) d3_geo_streamLine(coordinates[i], listener, 0);
-  },
-  Polygon: function(object, listener) {
-    d3_geo_streamPolygon(object.coordinates, listener);
-  },
-  MultiPolygon: function(object, listener) {
-    var coordinates = object.coordinates, i = -1, n = coordinates.length;
-    while (++i < n) d3_geo_streamPolygon(coordinates[i], listener);
-  },
-  GeometryCollection: function(object, listener) {
-    var geometries = object.geometries, i = -1, n = geometries.length;
-    while (++i < n) d3_geo_streamGeometry(geometries[i], listener);
-  }
-};
-
-function d3_geo_streamLine(coordinates, listener, closed) {
-  var i = -1, n = coordinates.length - closed, coordinate;
-  listener.lineStart();
-  while (++i < n) coordinate = coordinates[i], listener.point(coordinate[0], coordinate[1], coordinate[2]);
-  listener.lineEnd();
-}
-
-function d3_geo_streamPolygon(coordinates, listener) {
-  var i = -1, n = coordinates.length;
-  listener.polygonStart();
-  while (++i < n) d3_geo_streamLine(coordinates[i], listener, 1);
-  listener.polygonEnd();
-}
-
-d3.geo.area = function(object) {
-  d3_geo_areaSum = 0;
-  d3.geo.stream(object, d3_geo_area);
-  return d3_geo_areaSum;
-};
-
-var d3_geo_areaSum,
-    d3_geo_areaRingSum = new d3_adder;
-
-var d3_geo_area = {
-  sphere: function() { d3_geo_areaSum += 4 * π; },
-  point: d3_noop,
-  lineStart: d3_noop,
-  lineEnd: d3_noop,
-
-  // Only count area for polygon rings.
-  polygonStart: function() {
-    d3_geo_areaRingSum.reset();
-    d3_geo_area.lineStart = d3_geo_areaRingStart;
-  },
-  polygonEnd: function() {
-    var area = 2 * d3_geo_areaRingSum;
-    d3_geo_areaSum += area < 0 ? 4 * π + area : area;
-    d3_geo_area.lineStart = d3_geo_area.lineEnd = d3_geo_area.point = d3_noop;
-  }
-};
-
-function d3_geo_areaRingStart() {
-  var λ00, φ00, λ0, cosφ0, sinφ0; // start point and previous point
-
-  // For the first point, …
-  d3_geo_area.point = function(λ, φ) {
-    d3_geo_area.point = nextPoint;
-    λ0 = (λ00 = λ) * d3_radians, cosφ0 = Math.cos(φ = (φ00 = φ) * d3_radians / 2 + π / 4), sinφ0 = Math.sin(φ);
-  };
-
-  // For subsequent points, …
-  function nextPoint(λ, φ) {
-    λ *= d3_radians;
-    φ = φ * d3_radians / 2 + π / 4; // half the angular distance from south pole
-
-    // Spherical excess E for a spherical triangle with vertices: south pole,
-    // previous point, current point.  Uses a formula derived from Cagnoli’s
-    // theorem.  See Todhunter, Spherical Trig. (1871), Sec. 103, Eq. (2).
-    var dλ = λ - λ0,
-        sdλ = dλ >= 0 ? 1 : -1,
-        adλ = sdλ * dλ,
-        cosφ = Math.cos(φ),
-        sinφ = Math.sin(φ),
-        k = sinφ0 * sinφ,
-        u = cosφ0 * cosφ + k * Math.cos(adλ),
-        v = k * sdλ * Math.sin(adλ);
-    d3_geo_areaRingSum.add(Math.atan2(v, u));
-
-    // Advance the previous points.
-    λ0 = λ, cosφ0 = cosφ, sinφ0 = sinφ;
-  }
-
-  // For the last point, return to the start.
-  d3_geo_area.lineEnd = function() {
-    nextPoint(λ00, φ00);
-  };
-}
-// TODO
-// cross and scale return new vectors,
-// whereas add and normalize operate in-place
-
-function d3_geo_cartesian(spherical) {
-  var λ = spherical[0],
-      φ = spherical[1],
-      cosφ = Math.cos(φ);
-  return [
-    cosφ * Math.cos(λ),
-    cosφ * Math.sin(λ),
-    Math.sin(φ)
-  ];
-}
-
-function d3_geo_cartesianDot(a, b) {
-  return a[0] * b[0] + a[1] * b[1] + a[2] * b[2];
-}
-
-function d3_geo_cartesianCross(a, b) {
-  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]
-  ];
-}
-
-function d3_geo_cartesianAdd(a, b) {
-  a[0] += b[0];
-  a[1] += b[1];
-  a[2] += b[2];
-}
-
-function d3_geo_cartesianScale(vector, k) {
-  return [
-    vector[0] * k,
-    vector[1] * k,
-    vector[2] * k
-  ];
-}
-
-function d3_geo_cartesianNormalize(d) {
-  var l = Math.sqrt(d[0] * d[0] + d[1] * d[1] + d[2] * d[2]);
-  d[0] /= l;
-  d[1] /= l;
-  d[2] /= l;
-}
-
-function d3_geo_pointInPolygon(point, polygon) {
-  var meridian = point[0],
-      parallel = point[1],
-      meridianNormal = [Math.sin(meridian), -Math.cos(meridian), 0],
-      polarAngle = 0,
-      winding = 0;
-  d3_geo_areaRingSum.reset();
-
-  for (var i = 0, n = polygon.length; i < n; ++i) {
-    var ring = polygon[i],
-        m = ring.length;
-    if (!m) continue;
-    var point0 = ring[0],
-        λ0 = point0[0],
-        φ0 = point0[1] / 2 + π / 4,
-        sinφ0 = Math.sin(φ0),
-        cosφ0 = Math.cos(φ0),
-        j = 1;
-
-    while (true) {
-      if (j === m) j = 0;
-      point = ring[j];
-      var λ = point[0],
-          φ = point[1] / 2 + π / 4,
-          sinφ = Math.sin(φ),
-          cosφ = Math.cos(φ),
-          dλ = λ - λ0,
-          sdλ = dλ >= 0 ? 1 : -1,
-          adλ = sdλ * dλ,
-          antimeridian = adλ > π,
-          k = sinφ0 * sinφ;
-      d3_geo_areaRingSum.add(Math.atan2(k * sdλ * Math.sin(adλ), cosφ0 * cosφ + k * Math.cos(adλ)));
-
-      polarAngle += antimeridian ? dλ + sdλ * τ : dλ;
-
-      // Are the longitudes either side of the point's meridian, and are the
-      // latitudes smaller than the parallel?
-      if (antimeridian ^ λ0 >= meridian ^ λ >= meridian) {
-        var arc = d3_geo_cartesianCross(d3_geo_cartesian(point0), d3_geo_cartesian(point));
-        d3_geo_cartesianNormalize(arc);
-        var intersection = d3_geo_cartesianCross(meridianNormal, arc);
-        d3_geo_cartesianNormalize(intersection);
-        var φarc = (antimeridian ^ dλ >= 0 ? -1 : 1) * d3_asin(intersection[2]);
-        if (parallel > φarc || parallel === φarc && (arc[0] || arc[1])) {
-          winding += antimeridian ^ dλ >= 0 ? 1 : -1;
-        }
-      }
-      if (!j++) break;
-      λ0 = λ, sinφ0 = sinφ, cosφ0 = cosφ, point0 = point;
-    }
-  }
-
-  // First, determine whether the South pole is inside or outside:
-  //
-  // It is inside if:
-  // * the polygon winds around it in a clockwise direction.
-  // * the polygon does not (cumulatively) wind around it, but has a negative
-  //   (counter-clockwise) area.
-  //
-  // Second, count the (signed) number of times a segment crosses a meridian
-  // from the point to the South pole.  If it is zero, then the point is the
-  // same side as the South pole.
-
-  return (polarAngle < -ε || polarAngle < ε && d3_geo_areaRingSum < 0) ^ (winding & 1);
-}
-
-var d3_geo_clipAntimeridian = d3_geo_clip(
-    d3_true,
-    d3_geo_clipAntimeridianLine,
-    d3_geo_clipAntimeridianInterpolate,
-    [-π, -π / 2]);
-
-// Takes a line and cuts into visible segments. Return values:
-//   0: there were intersections or the line was empty.
-//   1: no intersections.
-//   2: there were intersections, and the first and last segments should be
-//      rejoined.
-function d3_geo_clipAntimeridianLine(listener) {
-  var λ0 = NaN,
-      φ0 = NaN,
-      sλ0 = NaN,
-      clean; // no intersections
-
-  return {
-    lineStart: function() {
-      listener.lineStart();
-      clean = 1;
-    },
-    point: function(λ1, φ1) {
-      var sλ1 = λ1 > 0 ? π : -π,
-          dλ = abs(λ1 - λ0);
-      if (abs(dλ - π) < ε) { // line crosses a pole
-        listener.point(λ0, φ0 = (φ0 + φ1) / 2 > 0 ? halfπ : -halfπ);
-        listener.point(sλ0, φ0);
-        listener.lineEnd();
-        listener.lineStart();
-        listener.point(sλ1, φ0);
-        listener.point(λ1, φ0);
-        clean = 0;
-      } else if (sλ0 !== sλ1 && dλ >= π) { // line crosses antimeridian
-        // handle degeneracies
-        if (abs(λ0 - sλ0) < ε) λ0 -= sλ0 * ε;
-        if (abs(λ1 - sλ1) < ε) λ1 -= sλ1 * ε;
-        φ0 = d3_geo_clipAntimeridianIntersect(λ0, φ0, λ1, φ1);
-        listener.point(sλ0, φ0);
-        listener.lineEnd();
-        listener.lineStart();
-        listener.point(sλ1, φ0);
-        clean = 0;
-      }
-      listener.point(λ0 = λ1, φ0 = φ1);
-      sλ0 = sλ1;
-    },
-    lineEnd: function() {
-      listener.lineEnd();
-      λ0 = φ0 = NaN;
-    },
-    // if there are intersections, we always rejoin the first and last segments.
-    clean: function() { return 2 - clean; }
-  };
-}
-
-function d3_geo_clipAntimeridianIntersect(λ0, φ0, λ1, φ1) {
-  var cosφ0,
-      cosφ1,
-      sinλ0_λ1 = Math.sin(λ0 - λ1);
-  return abs(sinλ0_λ1) > ε
-      ? Math.atan((Math.sin(φ0) * (cosφ1 = Math.cos(φ1)) * Math.sin(λ1)
-                 - Math.sin(φ1) * (cosφ0 = Math.cos(φ0)) * Math.sin(λ0))
-                 / (cosφ0 * cosφ1 * sinλ0_λ1))
-      : (φ0 + φ1) / 2;
-}
-
-function d3_geo_clipAntimeridianInterpolate(from, to, direction, listener) {
-  var φ;
-  if (from == null) {
-    φ = direction * halfπ;
-    listener.point(-π,  φ);
-    listener.point( 0,  φ);
-    listener.point( π,  φ);
-    listener.point( π,  0);
-    listener.point( π, -φ);
-    listener.point( 0, -φ);
-    listener.point(-π, -φ);
-    listener.point(-π,  0);
-    listener.point(-π,  φ);
-  } else if (abs(from[0] - to[0]) > ε) {
-    var s = from[0] < to[0] ? π : -π;
-    φ = direction * s / 2;
-    listener.point(-s, φ);
-    listener.point( 0, φ);
-    listener.point( s, φ);
-  } else {
-    listener.point(to[0], to[1]);
-  }
-}
-
-function d3_geo_equirectangular(λ, φ) {
-  return [λ, φ];
-}
-
-(d3.geo.equirectangular = function() {
-  return d3_geo_projection(d3_geo_equirectangular);
-}).raw = d3_geo_equirectangular.invert = d3_geo_equirectangular;
-
-d3.geo.rotation = function(rotate) {
-  rotate = d3_geo_rotation(rotate[0] % 360 * d3_radians, rotate[1] * d3_radians, rotate.length > 2 ? rotate[2] * d3_radians : 0);
-
-  function forward(coordinates) {
-    coordinates = rotate(coordinates[0] * d3_radians, coordinates[1] * d3_radians);
-    return coordinates[0] *= d3_degrees, coordinates[1] *= d3_degrees, coordinates;
-  }
-
-  forward.invert = function(coordinates) {
-    coordinates = rotate.invert(coordinates[0] * d3_radians, coordinates[1] * d3_radians);
-    return coordinates[0] *= d3_degrees, coordinates[1] *= d3_degrees, coordinates;
-  };
-
-  return forward;
-};
-
-function d3_geo_identityRotation(λ, φ) {
-  return [λ > π ? λ - τ : λ < -π ? λ + τ : λ, φ];
-}
-
-d3_geo_identityRotation.invert = d3_geo_equirectangular;
-
-// Note: |δλ| must be < 2π
-function d3_geo_rotation(δλ, δφ, δγ) {
-  return δλ ? (δφ || δγ ? d3_geo_compose(d3_geo_rotationλ(δλ), d3_geo_rotationφγ(δφ, δγ))
-    : d3_geo_rotationλ(δλ))
-    : (δφ || δγ ? d3_geo_rotationφγ(δφ, δγ)
-    : d3_geo_identityRotation);
-}
-
-function d3_geo_forwardRotationλ(δλ) {
-  return function(λ, φ) {
-    return λ += δλ, [λ > π ? λ - τ : λ < -π ? λ + τ : λ, φ];
-  };
-}
-
-function d3_geo_rotationλ(δλ) {
-  var rotation = d3_geo_forwardRotationλ(δλ);
-  rotation.invert = d3_geo_forwardRotationλ(-δλ);
-  return rotation;
-}
-
-function d3_geo_rotationφγ(δφ, δγ) {
-  var cosδφ = Math.cos(δφ),
-      sinδφ = Math.sin(δφ),
-      cosδγ = Math.cos(δγ),
-      sinδγ = Math.sin(δγ);
-
-  function rotation(λ, φ) {
-    var cosφ = Math.cos(φ),
-        x = Math.cos(λ) * cosφ,
-        y = Math.sin(λ) * cosφ,
-        z = Math.sin(φ),
-        k = z * cosδφ + x * sinδφ;
-    return [
-      Math.atan2(y * cosδγ - k * sinδγ, x * cosδφ - z * sinδφ),
-      d3_asin(k * cosδγ + y * sinδγ)
-    ];
-  }
-
-  rotation.invert = function(λ, φ) {
-    var cosφ = Math.cos(φ),
-        x = Math.cos(λ) * cosφ,
-        y = Math.sin(λ) * cosφ,
-        z = Math.sin(φ),
-        k = z * cosδγ - y * sinδγ;
-    return [
-      Math.atan2(y * cosδγ + z * sinδγ, x * cosδφ + k * sinδφ),
-      d3_asin(k * cosδφ - x * sinδφ)
-    ];
-  };
-
-  return rotation;
-}
-
-d3.geo.circle = function() {
-  var origin = [0, 0],
-      angle,
-      precision = 6,
-      interpolate;
-
-  function circle() {
-    var center = typeof origin === "function" ? origin.apply(this, arguments) : origin,
-        rotate = d3_geo_rotation(-center[0] * d3_radians, -center[1] * d3_radians, 0).invert,
-        ring = [];
-
-    interpolate(null, null, 1, {
-      point: function(x, y) {
-        ring.push(x = rotate(x, y));
-        x[0] *= d3_degrees, x[1] *= d3_degrees;
-      }
-    });
-
-    return {type: "Polygon", coordinates: [ring]};
-  }
-
-  circle.origin = function(x) {
-    if (!arguments.length) return origin;
-    origin = x;
-    return circle;
-  };
-
-  circle.angle = function(x) {
-    if (!arguments.length) return angle;
-    interpolate = d3_geo_circleInterpolate((angle = +x) * d3_radians, precision * d3_radians);
-    return circle;
-  };
-
-  circle.precision = function(_) {
-    if (!arguments.length) return precision;
-    interpolate = d3_geo_circleInterpolate(angle * d3_radians, (precision = +_) * d3_radians);
-    return circle;
-  };
-
-  return circle.angle(90);
-};
-
-// Interpolates along a circle centered at [0°, 0°], with a given radius and
-// precision.
-function d3_geo_circleInterpolate(radius, precision) {
-  var cr = Math.cos(radius),
-      sr = Math.sin(radius);
-  return function(from, to, direction, listener) {
-    var step = direction * precision;
-    if (from != null) {
-      from = d3_geo_circleAngle(cr, from);
-      to = d3_geo_circleAngle(cr, to);
-      if (direction > 0 ? from < to: from > to) from += direction * τ;
-    } else {
-      from = radius + direction * τ;
-      to = radius - .5 * step;
-    }
-    for (var point, t = from; direction > 0 ? t > to : t < to; t -= step) {
-      listener.point((point = d3_geo_spherical([
-        cr,
-        -sr * Math.cos(t),
-        -sr * Math.sin(t)
-      ]))[0], point[1]);
-    }
-  };
-}
-
-// Signed angle of a cartesian point relative to [cr, 0, 0].
-function d3_geo_circleAngle(cr, point) {
-  var a = d3_geo_cartesian(point);
-  a[0] -= cr;
-  d3_geo_cartesianNormalize(a);
-  var angle = d3_acos(-a[1]);
-  return ((-a[2] < 0 ? -angle : angle) + 2 * Math.PI - ε) % (2 * Math.PI);
-}
-
-// Clip features against a small circle centered at [0°, 0°].
-function d3_geo_clipCircle(radius) {
-  var cr = Math.cos(radius),
-      smallRadius = cr > 0,
-      notHemisphere = abs(cr) > ε, // TODO optimise for this common case
-      interpolate = d3_geo_circleInterpolate(radius, 6 * d3_radians);
-
-  return d3_geo_clip(visible, clipLine, interpolate, smallRadius ? [0, -radius] : [-π, radius - π]);
-
-  function visible(λ, φ) {
-    return Math.cos(λ) * Math.cos(φ) > cr;
-  }
-
-  // Takes a line and cuts into visible segments. Return values used for
-  // polygon clipping:
-  //   0: there were intersections or the line was empty.
-  //   1: no intersections.
-  //   2: there were intersections, and the first and last segments should be
-  //      rejoined.
-  function clipLine(listener) {
-    var point0, // previous point
-        c0, // code for previous point
-        v0, // visibility of previous point
-        v00, // visibility of first point
-        clean; // no intersections
-    return {
-      lineStart: function() {
-        v00 = v0 = false;
-        clean = 1;
-      },
-      point: function(λ, φ) {
-        var point1 = [λ, φ],
-            point2,
-            v = visible(λ, φ),
-            c = smallRadius
-              ? v ? 0 : code(λ, φ)
-              : v ? code(λ + (λ < 0 ? π : -π), φ) : 0;
-        if (!point0 && (v00 = v0 = v)) listener.lineStart();
-        // Handle degeneracies.
-        // TODO ignore if not clipping polygons.
-        if (v !== v0) {
-          point2 = intersect(point0, point1);
-          if (d3_geo_sphericalEqual(point0, point2) || d3_geo_sphericalEqual(point1, point2)) {
-            point1[0] += ε;
-            point1[1] += ε;
-            v = visible(point1[0], point1[1]);
-          }
-        }
-        if (v !== v0) {
-          clean = 0;
-          if (v) {
-            // outside going in
-            listener.lineStart();
-            point2 = intersect(point1, point0);
-            listener.point(point2[0], point2[1]);
-          } else {
-            // inside going out
-            point2 = intersect(point0, point1);
-            listener.point(point2[0], point2[1]);
-            listener.lineEnd();
-          }
-          point0 = point2;
-        } else if (notHemisphere && point0 && smallRadius ^ v) {
-          var t;
-          // If the codes for two points are different, or are both zero,
-          // and there this segment intersects with the small circle.
-          if (!(c & c0) && (t = intersect(point1, point0, true))) {
-            clean = 0;
-            if (smallRadius) {
-              listener.lineStart();
-              listener.point(t[0][0], t[0][1]);
-              listener.point(t[1][0], t[1][1]);
-              listener.lineEnd();
-            } else {
-              listener.point(t[1][0], t[1][1]);
-              listener.lineEnd();
-              listener.lineStart();
-              listener.point(t[0][0], t[0][1]);
-            }
-          }
-        }
-        if (v && (!point0 || !d3_geo_sphericalEqual(point0, point1))) {
-          listener.point(point1[0], point1[1]);
-        }
-        point0 = point1, v0 = v, c0 = c;
-      },
-      lineEnd: function() {
-        if (v0) listener.lineEnd();
-        point0 = null;
-      },
-      // Rejoin first and last segments if there were intersections and the first
-      // and last points were visible.
-      clean: function() { return clean | ((v00 && v0) << 1); }
-    };
-  }
-
-  // Intersects the great circle between a and b with the clip circle.
-  function intersect(a, b, two) {
-    var pa = d3_geo_cartesian(a),
-        pb = d3_geo_cartesian(b);
-
-    // We have two planes, n1.p = d1 and n2.p = d2.
-    // Find intersection line p(t) = c1 n1 + c2 n2 + t (n1 ⨯ n2).
-    var n1 = [1, 0, 0], // normal
-        n2 = d3_geo_cartesianCross(pa, pb),
-        n2n2 = d3_geo_cartesianDot(n2, n2),
-        n1n2 = n2[0], // d3_geo_cartesianDot(n1, n2),
-        determinant = n2n2 - n1n2 * n1n2;
-
-    // Two polar points.
-    if (!determinant) return !two && a;
-
-    var c1 =  cr * n2n2 / determinant,
-        c2 = -cr * n1n2 / determinant,
-        n1xn2 = d3_geo_cartesianCross(n1, n2),
-        A = d3_geo_cartesianScale(n1, c1),
-        B = d3_geo_cartesianScale(n2, c2);
-    d3_geo_cartesianAdd(A, B);
-
-    // Solve |p(t)|^2 = 1.
-    var u = n1xn2,
-        w = d3_geo_cartesianDot(A, u),
-        uu = d3_geo_cartesianDot(u, u),
-        t2 = w * w - uu * (d3_geo_cartesianDot(A, A) - 1);
-
-    if (t2 < 0) return;
-
-    var t = Math.sqrt(t2),
-        q = d3_geo_cartesianScale(u, (-w - t) / uu);
-    d3_geo_cartesianAdd(q, A);
-    q = d3_geo_spherical(q);
-    if (!two) return q;
-
-    // Two intersection points.
-    var λ0 = a[0],
-        λ1 = b[0],
-        φ0 = a[1],
-        φ1 = b[1],
-        z;
-    if (λ1 < λ0) z = λ0, λ0 = λ1, λ1 = z;
-    var δλ = λ1 - λ0,
-        polar = abs(δλ - π) < ε,
-        meridian = polar || δλ < ε;
-
-    if (!polar && φ1 < φ0) z = φ0, φ0 = φ1, φ1 = z;
-
-    // Check that the first point is between a and b.
-    if (meridian
-        ? polar
-          ? φ0 + φ1 > 0 ^ q[1] < (abs(q[0] - λ0) < ε ? φ0 : φ1)
-          : φ0 <= q[1] && q[1] <= φ1
-        : δλ > π ^ (λ0 <= q[0] && q[0] <= λ1)) {
-      var q1 = d3_geo_cartesianScale(u, (-w + t) / uu);
-      d3_geo_cartesianAdd(q1, A);
-      return [q, d3_geo_spherical(q1)];
-    }
-  }
-
-  // Generates a 4-bit vector representing the location of a point relative to
-  // the small circle's bounding box.
-  function code(λ, φ) {
-    var r = smallRadius ? radius : π - radius,
-        code = 0;
-    if (λ < -r) code |= 1; // left
-    else if (λ > r) code |= 2; // right
-    if (φ < -r) code |= 4; // below
-    else if (φ > r) code |= 8; // above
-    return code;
-  }
-}
-
-// Liang–Barsky line clipping.
-function d3_geom_clipLine(x0, y0, x1, y1) {
-  return function(line) {
-    var a = line.a,
-        b = line.b,
-        ax = a.x,
-        ay = a.y,
-        bx = b.x,
-        by = b.y,
-        t0 = 0,
-        t1 = 1,
-        dx = bx - ax,
-        dy = by - ay,
-        r;
-
-    r = x0 - ax;
-    if (!dx && r > 0) return;
-    r /= dx;
-    if (dx < 0) {
-      if (r < t0) return;
-      if (r < t1) t1 = r;
-    } else if (dx > 0) {
-      if (r > t1) return;
-      if (r > t0) t0 = r;
-    }
-
-    r = x1 - ax;
-    if (!dx && r < 0) return;
-    r /= dx;
-    if (dx < 0) {
-      if (r > t1) return;
-      if (r > t0) t0 = r;
-    } else if (dx > 0) {
-      if (r < t0) return;
-      if (r < t1) t1 = r;
-    }
-
-    r = y0 - ay;
-    if (!dy && r > 0) return;
-    r /= dy;
-    if (dy < 0) {
-      if (r < t0) return;
-      if (r < t1) t1 = r;
-    } else if (dy > 0) {
-      if (r > t1) return;
-      if (r > t0) t0 = r;
-    }
-
-    r = y1 - ay;
-    if (!dy && r < 0) return;
-    r /= dy;
-    if (dy < 0) {
-      if (r > t1) return;
-      if (r > t0) t0 = r;
-    } else if (dy > 0) {
-      if (r < t0) return;
-      if (r < t1) t1 = r;
-    }
-
-    if (t0 > 0) line.a = {x: ax + t0 * dx, y: ay + t0 * dy};
-    if (t1 < 1) line.b = {x: ax + t1 * dx, y: ay + t1 * dy};
-    return line;
-  };
-}
-
-var d3_geo_clipExtentMAX = 1e9;
-
-d3.geo.clipExtent = function() {
-  var x0, y0, x1, y1,
-      stream,
-      clip,
-      clipExtent = {
-        stream: function(output) {
-          if (stream) stream.valid = false;
-          stream = clip(output);
-          stream.valid = true; // allow caching by d3.geo.path
-          return stream;
-        },
-        extent: function(_) {
-          if (!arguments.length) return [[x0, y0], [x1, y1]];
-          clip = d3_geo_clipExtent(x0 = +_[0][0], y0 = +_[0][1], x1 = +_[1][0], y1 = +_[1][1]);
-          if (stream) stream.valid = false, stream = null;
-          return clipExtent;
-        }
-      };
-  return clipExtent.extent([[0, 0], [960, 500]]);
-};
-
-function d3_geo_clipExtent(x0, y0, x1, y1) {
-  return function(listener) {
-    var listener_ = listener,
-        bufferListener = d3_geo_clipBufferListener(),
-        clipLine = d3_geom_clipLine(x0, y0, x1, y1),
-        segments,
-        polygon,
-        ring;
-
-    var clip = {
-      point: point,
-      lineStart: lineStart,
-      lineEnd: lineEnd,
-      polygonStart: function() {
-        listener = bufferListener;
-        segments = [];
-        polygon = [];
-        clean = true;
-      },
-      polygonEnd: function() {
-        listener = listener_;
-        segments = d3.merge(segments);
-        var clipStartInside = insidePolygon([x0, y1]),
-            inside = clean && clipStartInside,
-            visible = segments.length;
-        if (inside || visible) {
-          listener.polygonStart();
-          if (inside) {
-            listener.lineStart();
-            interpolate(null, null, 1, listener);
-            listener.lineEnd();
-          }
-          if (visible) {
-            d3_geo_clipPolygon(segments, compare, clipStartInside, interpolate, listener);
-          }
-          listener.polygonEnd();
-        }
-        segments = polygon = ring = null;
-      }
-    };
-
-    function insidePolygon(p) {
-      var wn = 0, // the winding number counter
-          n = polygon.length,
-          y = p[1];
-
-      for (var i = 0; i < n; ++i) {
-        for (var j = 1, v = polygon[i], m = v.length, a = v[0], b; j < m; ++j) {
-          b = v[j];
-          if (a[1] <= y) {
-            if (b[1] >  y && d3_cross2d(a, b, p) > 0) ++wn;
-          } else {
-            if (b[1] <= y && d3_cross2d(a, b, p) < 0) --wn;
-          }
-          a = b;
-        }
-      }
-      return wn !== 0;
-    }
-
-    function interpolate(from, to, direction, listener) {
-      var a = 0, a1 = 0;
-      if (from == null ||
-          (a = corner(from, direction)) !== (a1 = corner(to, direction)) ||
-          comparePoints(from, to) < 0 ^ direction > 0) {
-        do {
-          listener.point(a === 0 || a === 3 ? x0 : x1, a > 1 ? y1 : y0);
-        } while ((a = (a + direction + 4) % 4) !== a1);
-      } else {
-        listener.point(to[0], to[1]);
-      }
-    }
-
-    function pointVisible(x, y) {
-      return x0 <= x && x <= x1 && y0 <= y && y <= y1;
-    }
-
-    function point(x, y) {
-      if (pointVisible(x, y)) listener.point(x, y);
-    }
-
-    var x__, y__, v__, // first point
-        x_, y_, v_, // previous point
-        first,
-        clean;
-
-    function lineStart() {
-      clip.point = linePoint;
-      if (polygon) polygon.push(ring = []);
-      first = true;
-      v_ = false;
-      x_ = y_ = NaN;
-    }
-
-    function lineEnd() {
-      // TODO rather than special-case polygons, simply handle them separately.
-      // Ideally, coincident intersection points should be jittered to avoid
-      // clipping issues.
-      if (segments) {
-        linePoint(x__, y__);
-        if (v__ && v_) bufferListener.rejoin();
-        segments.push(bufferListener.buffer());
-      }
-      clip.point = point;
-      if (v_) listener.lineEnd();
-    }
-
-    function linePoint(x, y) {
-      x = Math.max(-d3_geo_clipExtentMAX, Math.min(d3_geo_clipExtentMAX, x));
-      y = Math.max(-d3_geo_clipExtentMAX, Math.min(d3_geo_clipExtentMAX, y));
-      var v = pointVisible(x, y);
-      if (polygon) ring.push([x, y]);
-      if (first) {
-        x__ = x, y__ = y, v__ = v;
-        first = false;
-        if (v) {
-          listener.lineStart();
-          listener.point(x, y);
-        }
-      } else {
-        if (v && v_) listener.point(x, y);
-        else {
-          var l = {a: {x: x_, y: y_}, b: {x: x, y: y}};
-          if (clipLine(l)) {
-            if (!v_) {
-              listener.lineStart();
-              listener.point(l.a.x, l.a.y);
-            }
-            listener.point(l.b.x, l.b.y);
-            if (!v) listener.lineEnd();
-            clean = false;
-          } else if (v) {
-            listener.lineStart();
-            listener.point(x, y);
-            clean = false;
-          }
-        }
-      }
-      x_ = x, y_ = y, v_ = v;
-    }
-
-    return clip;
-  };
-
-  function corner(p, direction) {
-    return abs(p[0] - x0) < ε ? direction > 0 ? 0 : 3
-        : abs(p[0] - x1) < ε ? direction > 0 ? 2 : 1
-        : abs(p[1] - y0) < ε ? direction > 0 ? 1 : 0
-        : direction > 0 ? 3 : 2; // abs(p[1] - y1) < ε
-  }
-
-  function compare(a, b) {
-    return comparePoints(a.x, b.x);
-  }
-
-  function comparePoints(a, b) {
-    var ca = corner(a, 1),
-        cb = corner(b, 1);
-    return ca !== cb ? ca - cb
-        : ca === 0 ? b[1] - a[1]
-        : ca === 1 ? a[0] - b[0]
-        : ca === 2 ? a[1] - b[1]
-        : b[0] - a[0];
-  }
-}
-function d3_geo_compose(a, b) {
-
-  function compose(x, y) {
-    return x = a(x, y), b(x[0], x[1]);
-  }
-
-  if (a.invert && b.invert) compose.invert = function(x, y) {
-    return x = b.invert(x, y), x && a.invert(x[0], x[1]);
-  };
-
-  return compose;
-}
-
-function d3_geo_conic(projectAt) {
-  var φ0 = 0,
-      φ1 = π / 3,
-      m = d3_geo_projectionMutator(projectAt),
-      p = m(φ0, φ1);
-
-  p.parallels = function(_) {
-    if (!arguments.length) return [φ0 / π * 180, φ1 / π * 180];
-    return m(φ0 = _[0] * π / 180, φ1 = _[1] * π / 180);
-  };
-
-  return p;
-}
-
-function d3_geo_conicEqualArea(φ0, φ1) {
-  var sinφ0 = Math.sin(φ0),
-      n = (sinφ0 + Math.sin(φ1)) / 2,
-      C = 1 + sinφ0 * (2 * n - sinφ0),
-      ρ0 = Math.sqrt(C) / n;
-
-  function forward(λ, φ) {
-    var ρ = Math.sqrt(C - 2 * n * Math.sin(φ)) / n;
-    return [
-      ρ * Math.sin(λ *= n),
-      ρ0 - ρ * Math.cos(λ)
-    ];
-  }
-
-  forward.invert = function(x, y) {
-    var ρ0_y = ρ0 - y;
-    return [
-      Math.atan2(x, ρ0_y) / n,
-      d3_asin((C - (x * x + ρ0_y * ρ0_y) * n * n) / (2 * n))
-    ];
-  };
-
-  return forward;
-}
-
-(d3.geo.conicEqualArea = function() {
-  return d3_geo_conic(d3_geo_conicEqualArea);
-}).raw = d3_geo_conicEqualArea;
-
-// ESRI:102003
-d3.geo.albers = function() {
-  return d3.geo.conicEqualArea()
-      .rotate([96, 0])
-      .center([-.6, 38.7])
-      .parallels([29.5, 45.5])
-      .scale(1070);
-};
-
-// A composite projection for the United States, configured by default for
-// 960×500. Also works quite well at 960×600 with scale 1285. The set of
-// standard parallels for each region comes from USGS, which is published here:
-// http://egsc.usgs.gov/isb/pubs/MapProjections/projections.html#albers
-d3.geo.albersUsa = function() {
-  var lower48 = d3.geo.albers();
-
-  // EPSG:3338
-  var alaska = d3.geo.conicEqualArea()
-      .rotate([154, 0])
-      .center([-2, 58.5])
-      .parallels([55, 65]);
-
-  // ESRI:102007
-  var hawaii = d3.geo.conicEqualArea()
-      .rotate([157, 0])
-      .center([-3, 19.9])
-      .parallels([8, 18]);
-
-  var point,
-      pointStream = {point: function(x, y) { point = [x, y]; }},
-      lower48Point,
-      alaskaPoint,
-      hawaiiPoint;
-
-  function albersUsa(coordinates) {
-    var x = coordinates[0], y = coordinates[1];
-    point = null;
-    (lower48Point(x, y), point)
-        || (alaskaPoint(x, y), point)
-        || hawaiiPoint(x, y);
-    return point;
-  }
-
-  albersUsa.invert = function(coordinates) {
-    var k = lower48.scale(),
-        t = lower48.translate(),
-        x = (coordinates[0] - t[0]) / k,
-        y = (coordinates[1] - t[1]) / k;
-    return (y >= .120 && y < .234 && x >= -.425 && x < -.214 ? alaska
-        : y >= .166 && y < .234 && x >= -.214 && x < -.115 ? hawaii
-        : lower48).invert(coordinates);
-  };
-
-  // A naïve multi-projection stream.
-  // The projections must have mutually exclusive clip regions on the sphere,
-  // as this will avoid emitting interleaving lines and polygons.
-  albersUsa.stream = function(stream) {
-    var lower48Stream = lower48.stream(stream),
-        alaskaStream = alaska.stream(stream),
-        hawaiiStream = hawaii.stream(stream);
-    return {
-      point: function(x, y) {
-        lower48Stream.point(x, y);
-        alaskaStream.point(x, y);
-        hawaiiStream.point(x, y);
-      },
-      sphere: function() {
-        lower48Stream.sphere();
-        alaskaStream.sphere();
-        hawaiiStream.sphere();
-      },
-      lineStart: function() {
-        lower48Stream.lineStart();
-        alaskaStream.lineStart();
-        hawaiiStream.lineStart();
-      },
-      lineEnd: function() {
-        lower48Stream.lineEnd();
-        alaskaStream.lineEnd();
-        hawaiiStream.lineEnd();
-      },
-      polygonStart: function() {
-        lower48Stream.polygonStart();
-        alaskaStream.polygonStart();
-        hawaiiStream.polygonStart();
-      },
-      polygonEnd: function() {
-        lower48Stream.polygonEnd();
-        alaskaStream.polygonEnd();
-        hawaiiStream.polygonEnd();
-      }
-    };
-  };
-
-  albersUsa.precision = function(_) {
-    if (!arguments.length) return lower48.precision();
-    lower48.precision(_);
-    alaska.precision(_);
-    hawaii.precision(_);
-    return albersUsa;
-  };
-
-  albersUsa.scale = function(_) {
-    if (!arguments.length) return lower48.scale();
-    lower48.scale(_);
-    alaska.scale(_ * .35);
-    hawaii.scale(_);
-    return albersUsa.translate(lower48.translate());
-  };
-
-  albersUsa.translate = function(_) {
-    if (!arguments.length) return lower48.translate();
-    var k = lower48.scale(), x = +_[0], y = +_[1];
-
-    lower48Point = lower48
-        .translate(_)
-        .clipExtent([[x - .455 * k, y - .238 * k], [x + .455 * k, y + .238 * k]])
-        .stream(pointStream).point;
-
-    alaskaPoint = alaska
-        .translate([x - .307 * k, y + .201 * k])
-        .clipExtent([[x - .425 * k + ε, y + .120 * k + ε], [x - .214 * k - ε, y + .234 * k - ε]])
-        .stream(pointStream).point;
-
-    hawaiiPoint = hawaii
-        .translate([x - .205 * k, y + .212 * k])
-        .clipExtent([[x - .214 * k + ε, y + .166 * k + ε], [x - .115 * k - ε, y + .234 * k - ε]])
-        .stream(pointStream).point;
-
-    return albersUsa;
-  };
-
-  return albersUsa.scale(1070);
-};
-
-d3.geo.bounds = (function() {
-  var λ0, φ0, λ1, φ1, // bounds
-      λ_, // previous λ-coordinate
-      λ__, φ__, // first point
-      p0, // previous 3D point
-      dλSum,
-      ranges,
-      range;
-
-  var bound = {
-    point: point,
-    lineStart: lineStart,
-    lineEnd: lineEnd,
-
-    polygonStart: function() {
-      bound.point = ringPoint;
-      bound.lineStart = ringStart;
-      bound.lineEnd = ringEnd;
-      dλSum = 0;
-      d3_geo_area.polygonStart();
-    },
-    polygonEnd: function() {
-      d3_geo_area.polygonEnd();
-      bound.point = point;
-      bound.lineStart = lineStart;
-      bound.lineEnd = lineEnd;
-      if (d3_geo_areaRingSum < 0) λ0 = -(λ1 = 180), φ0 = -(φ1 = 90);
-      else if (dλSum > ε) φ1 = 90;
-      else if (dλSum < -ε) φ0 = -90;
-      range[0] = λ0, range[1] = λ1;
-    }
-  };
-
-  function point(λ, φ) {
-    ranges.push(range = [λ0 = λ, λ1 = λ]);
-    if (φ < φ0) φ0 = φ;
-    if (φ > φ1) φ1 = φ;
-  }
-
-  function linePoint(λ, φ) {
-    var p = d3_geo_cartesian([λ * d3_radians, φ * d3_radians]);
-    if (p0) {
-      var normal = d3_geo_cartesianCross(p0, p),
-          equatorial = [normal[1], -normal[0], 0],
-          inflection = d3_geo_cartesianCross(equatorial, normal);
-      d3_geo_cartesianNormalize(inflection);
-      inflection = d3_geo_spherical(inflection);
-      var dλ = λ - λ_,
-          s = dλ > 0 ? 1 : -1,
-          λi = inflection[0] * d3_degrees * s,
-          antimeridian = abs(dλ) > 180;
-      if (antimeridian ^ (s * λ_ < λi && λi < s * λ)) {
-        var φi = inflection[1] * d3_degrees;
-        if (φi > φ1) φ1 = φi;
-      } else if (λi = (λi + 360) % 360 - 180, antimeridian ^ (s * λ_ < λi && λi < s * λ)) {
-        var φi = -inflection[1] * d3_degrees;
-        if (φi < φ0) φ0 = φi;
-      } else {
-        if (φ < φ0) φ0 = φ;
-        if (φ > φ1) φ1 = φ;
-      }
-      if (antimeridian) {
-        if (λ < λ_) {
-          if (angle(λ0, λ) > angle(λ0, λ1)) λ1 = λ;
-        } else {
-          if (angle(λ, λ1) > angle(λ0, λ1)) λ0 = λ;
-        }
-      } else {
-        if (λ1 >= λ0) {
-          if (λ < λ0) λ0 = λ;
-          if (λ > λ1) λ1 = λ;
-        } else {
-          if (λ > λ_) {
-            if (angle(λ0, λ) > angle(λ0, λ1)) λ1 = λ;
-          } else {
-            if (angle(λ, λ1) > angle(λ0, λ1)) λ0 = λ;
-          }
-        }
-      }
-    } else {
-      point(λ, φ);
-    }
-    p0 = p, λ_ = λ;
-  }
-
-  function lineStart() { bound.point = linePoint; }
-  function lineEnd() {
-    range[0] = λ0, range[1] = λ1;
-    bound.point = point;
-    p0 = null;
-  }
-
-  function ringPoint(λ, φ) {
-    if (p0) {
-      var dλ = λ - λ_;
-      dλSum += abs(dλ) > 180 ? dλ + (dλ > 0 ? 360 : -360) : dλ;
-    } else λ__ = λ, φ__ = φ;
-    d3_geo_area.point(λ, φ);
-    linePoint(λ, φ);
-  }
-
-  function ringStart() {
-    d3_geo_area.lineStart();
-  }
-
-  function ringEnd() {
-    ringPoint(λ__, φ__);
-    d3_geo_area.lineEnd();
-    if (abs(dλSum) > ε) λ0 = -(λ1 = 180);
-    range[0] = λ0, range[1] = λ1;
-    p0 = null;
-  }
-
-  // Finds the left-right distance between two longitudes.
-  // This is almost the same as (λ1 - λ0 + 360°) % 360°, except that we want
-  // the distance between ±180° to be 360°.
-  function angle(λ0, λ1) { return (λ1 -= λ0) < 0 ? λ1 + 360 : λ1; }
-
-  function compareRanges(a, b) { return a[0] - b[0]; }
-
-  function withinRange(x, range) {
-    return range[0] <= range[1] ? range[0] <= x && x <= range[1] : x < range[0] || range[1] < x;
-  }
-
-  return function(feature) {
-    φ1 = λ1 = -(λ0 = φ0 = Infinity);
-    ranges = [];
-
-    d3.geo.stream(feature, bound);
-
-    var n = ranges.length;
-    if (n) {
-      // First, sort ranges by their minimum longitudes.
-      ranges.sort(compareRanges);
-
-      // Then, merge any ranges that overlap.
-      for (var i = 1, a = ranges[0], b, merged = [a]; i < n; ++i) {
-        b = ranges[i];
-        if (withinRange(b[0], a) || withinRange(b[1], a)) {
-          if (angle(a[0], b[1]) > angle(a[0], a[1])) a[1] = b[1];
-          if (angle(b[0], a[1]) > angle(a[0], a[1])) a[0] = b[0];
-        } else {
-          merged.push(a = b);
-        }
-      }
-
-      // Finally, find the largest gap between the merged ranges.
-      // The final bounding box will be the inverse of this gap.
-      var best = -Infinity, dλ;
-      for (var n = merged.length - 1, i = 0, a = merged[n], b; i <= n; a = b, ++i) {
-        b = merged[i];
-        if ((dλ = angle(a[1], b[0])) > best) best = dλ, λ0 = b[0], λ1 = a[1];
-      }
-    }
-    ranges = range = null;
-
-    return λ0 === Infinity || φ0 === Infinity
-        ? [[NaN, NaN], [NaN, NaN]]
-        : [[λ0, φ0], [λ1, φ1]];
-  };
-})();
-
-d3.geo.centroid = function(object) {
-  d3_geo_centroidW0 = d3_geo_centroidW1 =
-  d3_geo_centroidX0 = d3_geo_centroidY0 = d3_geo_centroidZ0 =
-  d3_geo_centroidX1 = d3_geo_centroidY1 = d3_geo_centroidZ1 =
-  d3_geo_centroidX2 = d3_geo_centroidY2 = d3_geo_centroidZ2 = 0;
-  d3.geo.stream(object, d3_geo_centroid);
-
-  var x = d3_geo_centroidX2,
-      y = d3_geo_centroidY2,
-      z = d3_geo_centroidZ2,
-      m = x * x + y * y + z * z;
-
-  // If the area-weighted centroid is undefined, fall back to length-weighted centroid.
-  if (m < ε2) {
-    x = d3_geo_centroidX1, y = d3_geo_centroidY1, z = d3_geo_centroidZ1;
-    // If the feature has zero length, fall back to arithmetic mean of point vectors.
-    if (d3_geo_centroidW1 < ε) x = d3_geo_centroidX0, y = d3_geo_centroidY0, z = d3_geo_centroidZ0;
-    m = x * x + y * y + z * z;
-    // If the feature still has an undefined centroid, then return.
-    if (m < ε2) return [NaN, NaN];
-  }
-
-  return [Math.atan2(y, x) * d3_degrees, d3_asin(z / Math.sqrt(m)) * d3_degrees];
-};
-
-var d3_geo_centroidW0,
-    d3_geo_centroidW1,
-    d3_geo_centroidX0,
-    d3_geo_centroidY0,
-    d3_geo_centroidZ0,
-    d3_geo_centroidX1,
-    d3_geo_centroidY1,
-    d3_geo_centroidZ1,
-    d3_geo_centroidX2,
-    d3_geo_centroidY2,
-    d3_geo_centroidZ2;
-
-var d3_geo_centroid = {
-  sphere: d3_noop,
-  point: d3_geo_centroidPoint,
-  lineStart: d3_geo_centroidLineStart,
-  lineEnd: d3_geo_centroidLineEnd,
-  polygonStart: function() {
-    d3_geo_centroid.lineStart = d3_geo_centroidRingStart;
-  },
-  polygonEnd: function() {
-    d3_geo_centroid.lineStart = d3_geo_centroidLineStart;
-  }
-};
-
-// Arithmetic mean of Cartesian vectors.
-function d3_geo_centroidPoint(λ, φ) {
-  λ *= d3_radians;
-  var cosφ = Math.cos(φ *= d3_radians);
-  d3_geo_centroidPointXYZ(cosφ * Math.cos(λ), cosφ * Math.sin(λ), Math.sin(φ));
-}
-
-function d3_geo_centroidPointXYZ(x, y, z) {
-  ++d3_geo_centroidW0;
-  d3_geo_centroidX0 += (x - d3_geo_centroidX0) / d3_geo_centroidW0;
-  d3_geo_centroidY0 += (y - d3_geo_centroidY0) / d3_geo_centroidW0;
-  d3_geo_centroidZ0 += (z - d3_geo_centroidZ0) / d3_geo_centroidW0;
-}
-
-function d3_geo_centroidLineStart() {
-  var x0, y0, z0; // previous point
-
-  d3_geo_centroid.point = function(λ, φ) {
-    λ *= d3_radians;
-    var cosφ = Math.cos(φ *= d3_radians);
-    x0 = cosφ * Math.cos(λ);
-    y0 = cosφ * Math.sin(λ);
-    z0 = Math.sin(φ);
-    d3_geo_centroid.point = nextPoint;
-    d3_geo_centroidPointXYZ(x0, y0, z0);
-  };
-
-  function nextPoint(λ, φ) {
-    λ *= d3_radians;
-    var cosφ = Math.cos(φ *= d3_radians),
-        x = cosφ * Math.cos(λ),
-        y = cosφ * Math.sin(λ),
-        z = Math.sin(φ),
-        w = Math.atan2(
-          Math.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);
-    d3_geo_centroidW1 += w;
-    d3_geo_centroidX1 += w * (x0 + (x0 = x));
-    d3_geo_centroidY1 += w * (y0 + (y0 = y));
-    d3_geo_centroidZ1 += w * (z0 + (z0 = z));
-    d3_geo_centroidPointXYZ(x0, y0, z0);
-  }
-}
-
-function d3_geo_centroidLineEnd() {
-  d3_geo_centroid.point = d3_geo_centroidPoint;
-}
-
-// See J. E. Brock, The Inertia Tensor for a Spherical Triangle,
-// J. Applied Mechanics 42, 239 (1975).
-function d3_geo_centroidRingStart() {
-  var λ00, φ00, // first point
-      x0, y0, z0; // previous point
-
-  d3_geo_centroid.point = function(λ, φ) {
-    λ00 = λ, φ00 = φ;
-    d3_geo_centroid.point = nextPoint;
-    λ *= d3_radians;
-    var cosφ = Math.cos(φ *= d3_radians);
-    x0 = cosφ * Math.cos(λ);
-    y0 = cosφ * Math.sin(λ);
-    z0 = Math.sin(φ);
-    d3_geo_centroidPointXYZ(x0, y0, z0);
-  };
-
-  d3_geo_centroid.lineEnd = function() {
-    nextPoint(λ00, φ00);
-    d3_geo_centroid.lineEnd = d3_geo_centroidLineEnd;
-    d3_geo_centroid.point = d3_geo_centroidPoint;
-  };
-
-  function nextPoint(λ, φ) {
-    λ *= d3_radians;
-    var cosφ = Math.cos(φ *= d3_radians),
-        x = cosφ * Math.cos(λ),
-        y = cosφ * Math.sin(λ),
-        z = Math.sin(φ),
-        cx = y0 * z - z0 * y,
-        cy = z0 * x - x0 * z,
-        cz = x0 * y - y0 * x,
-        m = Math.sqrt(cx * cx + cy * cy + cz * cz),
-        u = x0 * x + y0 * y + z0 * z,
-        v = m && -d3_acos(u) / m, // area weight
-        w = Math.atan2(m, u); // line weight
-    d3_geo_centroidX2 += v * cx;
-    d3_geo_centroidY2 += v * cy;
-    d3_geo_centroidZ2 += v * cz;
-    d3_geo_centroidW1 += w;
-    d3_geo_centroidX1 += w * (x0 + (x0 = x));
-    d3_geo_centroidY1 += w * (y0 + (y0 = y));
-    d3_geo_centroidZ1 += w * (z0 + (z0 = z));
-    d3_geo_centroidPointXYZ(x0, y0, z0);
-  }
-}
-
-// TODO Unify this code with d3.geom.polygon area?
-
-var d3_geo_pathAreaSum, d3_geo_pathAreaPolygon, d3_geo_pathArea = {
-  point: d3_noop,
-  lineStart: d3_noop,
-  lineEnd: d3_noop,
-
-  // Only count area for polygon rings.
-  polygonStart: function() {
-    d3_geo_pathAreaPolygon = 0;
-    d3_geo_pathArea.lineStart = d3_geo_pathAreaRingStart;
-  },
-  polygonEnd: function() {
-    d3_geo_pathArea.lineStart = d3_geo_pathArea.lineEnd = d3_geo_pathArea.point = d3_noop;
-    d3_geo_pathAreaSum += abs(d3_geo_pathAreaPolygon / 2);
-  }
-};
-
-function d3_geo_pathAreaRingStart() {
-  var x00, y00, x0, y0;
-
-  // For the first point, …
-  d3_geo_pathArea.point = function(x, y) {
-    d3_geo_pathArea.point = nextPoint;
-    x00 = x0 = x, y00 = y0 = y;
-  };
-
-  // For subsequent points, …
-  function nextPoint(x, y) {
-    d3_geo_pathAreaPolygon += y0 * x - x0 * y;
-    x0 = x, y0 = y;
-  }
-
-  // For the last point, return to the start.
-  d3_geo_pathArea.lineEnd = function() {
-    nextPoint(x00, y00);
-  };
-}
-
-var d3_geo_pathBoundsX0,
-    d3_geo_pathBoundsY0,
-    d3_geo_pathBoundsX1,
-    d3_geo_pathBoundsY1;
-
-var d3_geo_pathBounds = {
-  point: d3_geo_pathBoundsPoint,
-  lineStart: d3_noop,
-  lineEnd: d3_noop,
-  polygonStart: d3_noop,
-  polygonEnd: d3_noop
-};
-
-function d3_geo_pathBoundsPoint(x, y) {
-  if (x < d3_geo_pathBoundsX0) d3_geo_pathBoundsX0 = x;
-  if (x > d3_geo_pathBoundsX1) d3_geo_pathBoundsX1 = x;
-  if (y < d3_geo_pathBoundsY0) d3_geo_pathBoundsY0 = y;
-  if (y > d3_geo_pathBoundsY1) d3_geo_pathBoundsY1 = y;
-}
-function d3_geo_pathBuffer() {
-  var pointCircle = d3_geo_pathBufferCircle(4.5),
-      buffer = [];
-
-  var stream = {
-    point: point,
-
-    // While inside a line, override point to moveTo then lineTo.
-    lineStart: function() { stream.point = pointLineStart; },
-    lineEnd: lineEnd,
-
-    // While inside a polygon, override lineEnd to closePath.
-    polygonStart: function() { stream.lineEnd = lineEndPolygon; },
-    polygonEnd: function() { stream.lineEnd = lineEnd; stream.point = point; },
-
-    pointRadius: function(_) {
-      pointCircle = d3_geo_pathBufferCircle(_);
-      return stream;
-    },
-
-    result: function() {
-      if (buffer.length) {
-        var result = buffer.join("");
-        buffer = [];
-        return result;
-      }
-    }
-  };
-
-  function point(x, y) {
-    buffer.push("M", x, ",", y, pointCircle);
-  }
-
-  function pointLineStart(x, y) {
-    buffer.push("M", x, ",", y);
-    stream.point = pointLine;
-  }
-
-  function pointLine(x, y) {
-    buffer.push("L", x, ",", y);
-  }
-
-  function lineEnd() {
-    stream.point = point;
-  }
-
-  function lineEndPolygon() {
-    buffer.push("Z");
-  }
-
-  return stream;
-}
-
-function d3_geo_pathBufferCircle(radius) {
-  return "m0," + radius
-      + "a" + radius + "," + radius + " 0 1,1 0," + -2 * radius
-      + "a" + radius + "," + radius + " 0 1,1 0," + 2 * radius
-      + "z";
-}
-
-// TODO Unify this code with d3.geom.polygon centroid?
-// TODO Enforce positive area for exterior, negative area for interior?
-
-var d3_geo_pathCentroid = {
-  point: d3_geo_pathCentroidPoint,
-
-  // For lines, weight by length.
-  lineStart: d3_geo_pathCentroidLineStart,
-  lineEnd: d3_geo_pathCentroidLineEnd,
-
-  // For polygons, weight by area.
-  polygonStart: function() {
-    d3_geo_pathCentroid.lineStart = d3_geo_pathCentroidRingStart;
-  },
-  polygonEnd: function() {
-    d3_geo_pathCentroid.point = d3_geo_pathCentroidPoint;
-    d3_geo_pathCentroid.lineStart = d3_geo_pathCentroidLineStart;
-    d3_geo_pathCentroid.lineEnd = d3_geo_pathCentroidLineEnd;
-  }
-};
-
-function d3_geo_pathCentroidPoint(x, y) {
-  d3_geo_centroidX0 += x;
-  d3_geo_centroidY0 += y;
-  ++d3_geo_centroidZ0;
-}
-
-function d3_geo_pathCentroidLineStart() {
-  var x0, y0;
-
-  d3_geo_pathCentroid.point = function(x, y) {
-    d3_geo_pathCentroid.point = nextPoint;
-    d3_geo_pathCentroidPoint(x0 = x, y0 = y);
-  };
-
-  function nextPoint(x, y) {
-    var dx = x - x0, dy = y - y0, z = Math.sqrt(dx * dx + dy * dy);
-    d3_geo_centroidX1 += z * (x0 + x) / 2;
-    d3_geo_centroidY1 += z * (y0 + y) / 2;
-    d3_geo_centroidZ1 += z;
-    d3_geo_pathCentroidPoint(x0 = x, y0 = y);
-  }
-}
-
-function d3_geo_pathCentroidLineEnd() {
-  d3_geo_pathCentroid.point = d3_geo_pathCentroidPoint;
-}
-
-function d3_geo_pathCentroidRingStart() {
-  var x00, y00, x0, y0;
-
-  // For the first point, …
-  d3_geo_pathCentroid.point = function(x, y) {
-    d3_geo_pathCentroid.point = nextPoint;
-    d3_geo_pathCentroidPoint(x00 = x0 = x, y00 = y0 = y);
-  };
-
-  // For subsequent points, …
-  function nextPoint(x, y) {
-    var dx = x - x0, dy = y - y0, z = Math.sqrt(dx * dx + dy * dy);
-    d3_geo_centroidX1 += z * (x0 + x) / 2;
-    d3_geo_centroidY1 += z * (y0 + y) / 2;
-    d3_geo_centroidZ1 += z;
-
-    z = y0 * x - x0 * y;
-    d3_geo_centroidX2 += z * (x0 + x);
-    d3_geo_centroidY2 += z * (y0 + y);
-    d3_geo_centroidZ2 += z * 3;
-    d3_geo_pathCentroidPoint(x0 = x, y0 = y);
-  }
-
-  // For the last point, return to the start.
-  d3_geo_pathCentroid.lineEnd = function() {
-    nextPoint(x00, y00);
-  };
-}
-
-function d3_geo_pathContext(context) {
-  var pointRadius = 4.5;
-
-  var stream = {
-    point: point,
-
-    // While inside a line, override point to moveTo then lineTo.
-    lineStart: function() { stream.point = pointLineStart; },
-    lineEnd: lineEnd,
-
-    // While inside a polygon, override lineEnd to closePath.
-    polygonStart: function() { stream.lineEnd = lineEndPolygon; },
-    polygonEnd: function() { stream.lineEnd = lineEnd; stream.point = point; },
-
-    pointRadius: function(_) {
-      pointRadius = _;
-      return stream;
-    },
-
-    result: d3_noop
-  };
-
-  function point(x, y) {
-    context.moveTo(x, y);
-    context.arc(x, y, pointRadius, 0, τ);
-  }
-
-  function pointLineStart(x, y) {
-    context.moveTo(x, y);
-    stream.point = pointLine;
-  }
-
-  function pointLine(x, y) {
-    context.lineTo(x, y);
-  }
-
-  function lineEnd() {
-    stream.point = point;
-  }
-
-  function lineEndPolygon() {
-    context.closePath();
-  }
-
-  return stream;
-}
-
-function d3_geo_resample(project) {
-  var δ2 = .5, // precision, px²
-      cosMinDistance = Math.cos(30 * d3_radians), // cos(minimum angular distance)
-      maxDepth = 16;
-
-  function resample(stream) {
-    return (maxDepth ? resampleRecursive : resampleNone)(stream);
-  }
-
-  function resampleNone(stream) {
-    return d3_geo_transformPoint(stream, function(x, y) {
-      x = project(x, y);
-      stream.point(x[0], x[1]);
-    });
-  }
-
-  function resampleRecursive(stream) {
-    var λ00, φ00, x00, y00, a00, b00, c00, // first point
-        λ0, x0, y0, a0, b0, c0; // previous point
-
-    var resample = {
-      point: point,
-      lineStart: lineStart,
-      lineEnd: lineEnd,
-      polygonStart: function() { stream.polygonStart(); resample.lineStart = ringStart; },
-      polygonEnd: function() { stream.polygonEnd(); resample.lineStart = lineStart; }
-    };
-
-    function point(x, y) {
-      x = project(x, y);
-      stream.point(x[0], x[1]);
-    }
-
-    function lineStart() {
-      x0 = NaN;
-      resample.point = linePoint;
-      stream.lineStart();
-    }
-
-    function linePoint(λ, φ) {
-      var c = d3_geo_cartesian([λ, φ]), p = project(λ, φ);
-      resampleLineTo(x0, y0, λ0, a0, b0, c0, x0 = p[0], y0 = p[1], λ0 = λ, a0 = c[0], b0 = c[1], c0 = c[2], maxDepth, stream);
-      stream.point(x0, y0);
-    }
-
-    function lineEnd() {
-      resample.point = point;
-      stream.lineEnd();
-    }
-
-    function ringStart() {
-      lineStart();
-      resample.point = ringPoint;
-      resample.lineEnd = ringEnd;
-    }
-
-    function ringPoint(λ, φ) {
-      linePoint(λ00 = λ, φ00 = φ), x00 = x0, y00 = y0, a00 = a0, b00 = b0, c00 = c0;
-      resample.point = linePoint;
-    }
-
-    function ringEnd() {
-      resampleLineTo(x0, y0, λ0, a0, b0, c0, x00, y00, λ00, a00, b00, c00, maxDepth, stream);
-      resample.lineEnd = lineEnd;
-      lineEnd();
-    }
-
-    return resample;
-  }
-
-  function resampleLineTo(x0, y0, λ0, a0, b0, c0, x1, y1, λ1, a1, b1, c1, depth, stream) {
-    var dx = x1 - x0,
-        dy = y1 - y0,
-        d2 = dx * dx + dy * dy;
-    if (d2 > 4 * δ2 && depth--) {
-      var a = a0 + a1,
-          b = b0 + b1,
-          c = c0 + c1,
-          m = Math.sqrt(a * a + b * b + c * c),
-          φ2 = Math.asin(c /= m),
-          λ2 = abs(abs(c) - 1) < ε || abs(λ0 - λ1) < ε ? (λ0 + λ1) / 2 : Math.atan2(b, a),
-          p = project(λ2, φ2),
-          x2 = p[0],
-          y2 = p[1],
-          dx2 = x2 - x0,
-          dy2 = y2 - y0,
-          dz = dy * dx2 - dx * dy2;
-      if (dz * dz / d2 > δ2 // perpendicular projected distance
-          || abs((dx * dx2 + dy * dy2) / d2 - .5) > .3 // midpoint close to an end
-          || a0 * a1 + b0 * b1 + c0 * c1 < cosMinDistance) { // angular distance
-        resampleLineTo(x0, y0, λ0, a0, b0, c0, x2, y2, λ2, a /= m, b /= m, c, depth, stream);
-        stream.point(x2, y2);
-        resampleLineTo(x2, y2, λ2, a, b, c, x1, y1, λ1, a1, b1, c1, depth, stream);
-      }
-    }
-  }
-
-  resample.precision = function(_) {
-    if (!arguments.length) return Math.sqrt(δ2);
-    maxDepth = (δ2 = _ * _) > 0 && 16;
-    return resample;
-  };
-
-  return resample;
-}
-
-d3.geo.path = function() {
-  var pointRadius = 4.5,
-      projection,
-      context,
-      projectStream,
-      contextStream,
-      cacheStream;
-
-  function path(object) {
-    if (object) {
-      if (typeof pointRadius === "function") contextStream.pointRadius(+pointRadius.apply(this, arguments));
-      if (!cacheStream || !cacheStream.valid) cacheStream = projectStream(contextStream);
-      d3.geo.stream(object, cacheStream);
-    }
-    return contextStream.result();
-  }
-
-  path.area = function(object) {
-    d3_geo_pathAreaSum = 0;
-    d3.geo.stream(object, projectStream(d3_geo_pathArea));
-    return d3_geo_pathAreaSum;
-  };
-
-  path.centroid = function(object) {
-    d3_geo_centroidX0 = d3_geo_centroidY0 = d3_geo_centroidZ0 =
-    d3_geo_centroidX1 = d3_geo_centroidY1 = d3_geo_centroidZ1 =
-    d3_geo_centroidX2 = d3_geo_centroidY2 = d3_geo_centroidZ2 = 0;
-    d3.geo.stream(object, projectStream(d3_geo_pathCentroid));
-    return d3_geo_centroidZ2 ? [d3_geo_centroidX2 / d3_geo_centroidZ2, d3_geo_centroidY2 / d3_geo_centroidZ2]
-        : d3_geo_centroidZ1 ? [d3_geo_centroidX1 / d3_geo_centroidZ1, d3_geo_centroidY1 / d3_geo_centroidZ1]
-        : d3_geo_centroidZ0 ? [d3_geo_centroidX0 / d3_geo_centroidZ0, d3_geo_centroidY0 / d3_geo_centroidZ0]
-        : [NaN, NaN];
-  };
-
-  path.bounds = function(object) {
-    d3_geo_pathBoundsX1 = d3_geo_pathBoundsY1 = -(d3_geo_pathBoundsX0 = d3_geo_pathBoundsY0 = Infinity);
-    d3.geo.stream(object, projectStream(d3_geo_pathBounds));
-    return [[d3_geo_pathBoundsX0, d3_geo_pathBoundsY0], [d3_geo_pathBoundsX1, d3_geo_pathBoundsY1]];
-  };
-
-  path.projection = function(_) {
-    if (!arguments.length) return projection;
-    projectStream = (projection = _) ? _.stream || d3_geo_pathProjectStream(_) : d3_identity;
-    return reset();
-  };
-
-  path.context = function(_) {
-    if (!arguments.length) return context;
-    contextStream = (context = _) == null ? new d3_geo_pathBuffer : new d3_geo_pathContext(_);
-    if (typeof pointRadius !== "function") contextStream.pointRadius(pointRadius);
-    return reset();
-  };
-
-  path.pointRadius = function(_) {
-    if (!arguments.length) return pointRadius;
-    pointRadius = typeof _ === "function" ? _ : (contextStream.pointRadius(+_), +_);
-    return path;
-  };
-
-  function reset() {
-    cacheStream = null;
-    return path;
-  }
-
-  return path.projection(d3.geo.albersUsa()).context(null);
-};
-
-function d3_geo_pathProjectStream(project) {
-  var resample = d3_geo_resample(function(x, y) { return project([x * d3_degrees, y * d3_degrees]); });
-  return function(stream) { return d3_geo_projectionRadians(resample(stream)); };
-}
-
-d3.geo.transform = function(methods) {
-  return {
-    stream: function(stream) {
-      var transform = new d3_geo_transform(stream);
-      for (var k in methods) transform[k] = methods[k];
-      return transform;
-    }
-  };
-};
-
-function d3_geo_transform(stream) {
-  this.stream = stream;
-}
-
-d3_geo_transform.prototype = {
-  point: function(x, y) { this.stream.point(x, y); },
-  sphere: function() { this.stream.sphere(); },
-  lineStart: function() { this.stream.lineStart(); },
-  lineEnd: function() { this.stream.lineEnd(); },
-  polygonStart: function() { this.stream.polygonStart(); },
-  polygonEnd: function() { this.stream.polygonEnd(); }
-};
-
-function d3_geo_transformPoint(stream, point) {
-  return {
-    point: point,
-    sphere: function() { stream.sphere(); },
-    lineStart: function() { stream.lineStart(); },
-    lineEnd: function() { stream.lineEnd(); },
-    polygonStart: function() { stream.polygonStart(); },
-    polygonEnd: function() { stream.polygonEnd(); },
-  };
-}
-
-d3.geo.projection = d3_geo_projection;
-d3.geo.projectionMutator = d3_geo_projectionMutator;
-
-function d3_geo_projection(project) {
-  return d3_geo_projectionMutator(function() { return project; })();
-}
-
-function d3_geo_projectionMutator(projectAt) {
-  var project,
-      rotate,
-      projectRotate,
-      projectResample = d3_geo_resample(function(x, y) { x = project(x, y); return [x[0] * k + δx, δy - x[1] * k]; }),
-      k = 150, // scale
-      x = 480, y = 250, // translate
-      λ = 0, φ = 0, // center
-      δλ = 0, δφ = 0, δγ = 0, // rotate
-      δx, δy, // center
-      preclip = d3_geo_clipAntimeridian,
-      postclip = d3_identity,
-      clipAngle = null,
-      clipExtent = null,
-      stream;
-
-  function projection(point) {
-    point = projectRotate(point[0] * d3_radians, point[1] * d3_radians);
-    return [point[0] * k + δx, δy - point[1] * k];
-  }
-
-  function invert(point) {
-    point = projectRotate.invert((point[0] - δx) / k, (δy - point[1]) / k);
-    return point && [point[0] * d3_degrees, point[1] * d3_degrees];
-  }
-
-  projection.stream = function(output) {
-    if (stream) stream.valid = false;
-    stream = d3_geo_projectionRadians(preclip(rotate, projectResample(postclip(output))));
-    stream.valid = true; // allow caching by d3.geo.path
-    return stream;
-  };
-
-  projection.clipAngle = function(_) {
-    if (!arguments.length) return clipAngle;
-    preclip = _ == null ? (clipAngle = _, d3_geo_clipAntimeridian) : d3_geo_clipCircle((clipAngle = +_) * d3_radians);
-    return invalidate();
-  };
-
-  projection.clipExtent = function(_) {
-    if (!arguments.length) return clipExtent;
-    clipExtent = _;
-    postclip = _ ? d3_geo_clipExtent(_[0][0], _[0][1], _[1][0], _[1][1]) : d3_identity;
-    return invalidate();
-  };
-
-  projection.scale = function(_) {
-    if (!arguments.length) return k;
-    k = +_;
-    return reset();
-  };
-
-  projection.translate = function(_) {
-    if (!arguments.length) return [x, y];
-    x = +_[0];
-    y = +_[1];
-    return reset();
-  };
-
-  projection.center = function(_) {
-    if (!arguments.length) return [λ * d3_degrees, φ * d3_degrees];
-    λ = _[0] % 360 * d3_radians;
-    φ = _[1] % 360 * d3_radians;
-    return reset();
-  };
-
-  projection.rotate = function(_) {
-    if (!arguments.length) return [δλ * d3_degrees, δφ * d3_degrees, δγ * d3_degrees];
-    δλ = _[0] % 360 * d3_radians;
-    δφ = _[1] % 360 * d3_radians;
-    δγ = _.length > 2 ? _[2] % 360 * d3_radians : 0;
-    return reset();
-  };
-
-  d3.rebind(projection, projectResample, "precision");
-
-  function reset() {
-    projectRotate = d3_geo_compose(rotate = d3_geo_rotation(δλ, δφ, δγ), project);
-    var center = project(λ, φ);
-    δx = x - center[0] * k;
-    δy = y + center[1] * k;
-    return invalidate();
-  }
-
-  function invalidate() {
-    if (stream) stream.valid = false, stream = null;
-    return projection;
-  }
-
-  return function() {
-    project = projectAt.apply(this, arguments);
-    projection.invert = project.invert && invert;
-    return reset();
-  };
-}
-
-function d3_geo_projectionRadians(stream) {
-  return d3_geo_transformPoint(stream, function(x, y) {
-    stream.point(x * d3_radians, y * d3_radians);
-  });
-}
-
-function d3_geo_mercator(λ, φ) {
-  return [λ, Math.log(Math.tan(π / 4 + φ / 2))];
-}
-
-d3_geo_mercator.invert = function(x, y) {
-  return [x, 2 * Math.atan(Math.exp(y)) - halfπ];
-};
-
-function d3_geo_mercatorProjection(project) {
-  var m = d3_geo_projection(project),
-      scale = m.scale,
-      translate = m.translate,
-      clipExtent = m.clipExtent,
-      clipAuto;
-
-  m.scale = function() {
-    var v = scale.apply(m, arguments);
-    return v === m ? (clipAuto ? m.clipExtent(null) : m) : v;
-  };
-
-  m.translate = function() {
-    var v = translate.apply(m, arguments);
-    return v === m ? (clipAuto ? m.clipExtent(null) : m) : v;
-  };
-
-  m.clipExtent = function(_) {
-    var v = clipExtent.apply(m, arguments);
-    if (v === m) {
-      if (clipAuto = _ == null) {
-        var k = π * scale(), t = translate();
-        clipExtent([[t[0] - k, t[1] - k], [t[0] + k, t[1] + k]]);
-      }
-    } else if (clipAuto) {
-      v = null;
-    }
-    return v;
-  };
-
-  return m.clipExtent(null);
-}
-
-(d3.geo.mercator = function() {
-  return d3_geo_mercatorProjection(d3_geo_mercator);
-}).raw = d3_geo_mercator;
-d3.geom = {};
-
-d3.geom.polygon = function(coordinates) {
-  d3_subclass(coordinates, d3_geom_polygonPrototype);
-  return coordinates;
-};
-
-var d3_geom_polygonPrototype = d3.geom.polygon.prototype = [];
-
-d3_geom_polygonPrototype.area = function() {
-  var i = -1,
-      n = this.length,
-      a,
-      b = this[n - 1],
-      area = 0;
-
-  while (++i < n) {
-    a = b;
-    b = this[i];
-    area += a[1] * b[0] - a[0] * b[1];
-  }
-
-  return area * .5;
-};
-
-d3_geom_polygonPrototype.centroid = function(k) {
-  var i = -1,
-      n = this.length,
-      x = 0,
-      y = 0,
-      a,
-      b = this[n - 1],
-      c;
-
-  if (!arguments.length) k = -1 / (6 * this.area());
-
-  while (++i < n) {
-    a = b;
-    b = this[i];
-    c = a[0] * b[1] - b[0] * a[1];
-    x += (a[0] + b[0]) * c;
-    y += (a[1] + b[1]) * c;
-  }
-
-  return [x * k, y * k];
-};
-
-// The Sutherland-Hodgman clipping algorithm.
-// Note: requires the clip polygon to be counterclockwise and convex.
-d3_geom_polygonPrototype.clip = function(subject) {
-  var input,
-      closed = d3_geom_polygonClosed(subject),
-      i = -1,
-      n = this.length - d3_geom_polygonClosed(this),
-      j,
-      m,
-      a = this[n - 1],
-      b,
-      c,
-      d;
-
-  while (++i < n) {
-    input = subject.slice();
-    subject.length = 0;
-    b = this[i];
-    c = input[(m = input.length - closed) - 1];
-    j = -1;
-    while (++j < m) {
-      d = input[j];
-      if (d3_geom_polygonInside(d, a, b)) {
-        if (!d3_geom_polygonInside(c, a, b)) {
-          subject.push(d3_geom_polygonIntersect(c, d, a, b));
-        }
-        subject.push(d);
-      } else if (d3_geom_polygonInside(c, a, b)) {
-        subject.push(d3_geom_polygonIntersect(c, d, a, b));
-      }
-      c = d;
-    }
-    if (closed) subject.push(subject[0]);
-    a = b;
-  }
-
-  return subject;
-};
-
-function d3_geom_polygonInside(p, a, b) {
-  return (b[0] - a[0]) * (p[1] - a[1]) < (b[1] - a[1]) * (p[0] - a[0]);
-}
-
-// Intersect two infinite lines cd and ab.
-function d3_geom_polygonIntersect(c, d, a, b) {
-  var x1 = c[0], x3 = a[0], x21 = d[0] - x1, x43 = b[0] - x3,
-      y1 = c[1], y3 = a[1], y21 = d[1] - y1, y43 = b[1] - y3,
-      ua = (x43 * (y1 - y3) - y43 * (x1 - x3)) / (y43 * x21 - x43 * y21);
-  return [x1 + ua * x21, y1 + ua * y21];
-}
-
-// Returns true if the polygon is closed.
-function d3_geom_polygonClosed(coordinates) {
-  var a = coordinates[0],
-      b = coordinates[coordinates.length - 1];
-  return !(a[0] - b[0] || a[1] - b[1]);
-}
-function d3_geom_pointX(d) {
-  return d[0];
-}
-
-function d3_geom_pointY(d) {
-  return d[1];
-}
-
-/**
- * Computes the 2D convex hull of a set of points using Graham's scanning
- * algorithm. The algorithm has been implemented as described in Cormen,
- * Leiserson, and Rivest's Introduction to Algorithms. The running time of
- * this algorithm is O(n log n), where n is the number of input points.
- *
- * @param vertices [[x1, y1], [x2, y2], …]
- * @returns polygon [[x1, y1], [x2, y2], …]
- */
-d3.geom.hull = function(vertices) {
-  var x = d3_geom_pointX,
-      y = d3_geom_pointY;
-
-  if (arguments.length) return hull(vertices);
-
-  function hull(data) {
-    if (data.length < 3) return [];
-
-    var fx = d3_functor(x),
-        fy = d3_functor(y),
-        n = data.length,
-        vertices, // TODO use parallel arrays
-        plen = n - 1,
-        points = [],
-        stack = [],
-        d,
-        i, j, h = 0, x1, y1, x2, y2, u, v, a, sp;
-
-    if (fx === d3_geom_pointX && y === d3_geom_pointY) vertices = data;
-    else for (i = 0, vertices = []; i < n; ++i) {
-      vertices.push([+fx.call(this, d = data[i], i), +fy.call(this, d, i)]);
-    }
-
-    // find the starting ref point: leftmost point with the minimum y coord
-    for (i = 1; i < n; ++i) {
-      if (vertices[i][1] < vertices[h][1]
-          || vertices[i][1] == vertices[h][1]
-          && vertices[i][0] < vertices[h][0]) h = i;
-    }
-
-    // calculate polar angles from ref point and sort
-    for (i = 0; i < n; ++i) {
-      if (i === h) continue;
-      y1 = vertices[i][1] - vertices[h][1];
-      x1 = vertices[i][0] - vertices[h][0];
-      points.push({angle: Math.atan2(y1, x1), index: i});
-    }
-    points.sort(function(a, b) { return a.angle - b.angle; });
-
-    // toss out duplicate angles
-    a = points[0].angle;
-    v = points[0].index;
-    u = 0;
-    for (i = 1; i < plen; ++i) {
-      j = points[i].index;
-      if (a == points[i].angle) {
-        // keep angle for point most distant from the reference
-        x1 = vertices[v][0] - vertices[h][0];
-        y1 = vertices[v][1] - vertices[h][1];
-        x2 = vertices[j][0] - vertices[h][0];
-        y2 = vertices[j][1] - vertices[h][1];
-        if (x1 * x1 + y1 * y1 >= x2 * x2 + y2 * y2) {
-          points[i].index = -1;
-          continue;
-        } else {
-          points[u].index = -1;
-        }
-      }
-      a = points[i].angle;
-      u = i;
-      v = j;
-    }
-
-    // initialize the stack
-    stack.push(h);
-    for (i = 0, j = 0; i < 2; ++j) {
-      if (points[j].index > -1) {
-        stack.push(points[j].index);
-        i++;
-      }
-    }
-    sp = stack.length;
-
-    // do graham's scan
-    for (; j < plen; ++j) {
-      if (points[j].index < 0) continue; // skip tossed out points
-      while (!d3_geom_hullCCW(stack[sp - 2], stack[sp - 1], points[j].index, vertices)) {
-        --sp;
-      }
-      stack[sp++] = points[j].index;
-    }
-
-    // construct the hull
-    var poly = [];
-    for (i = sp - 1; i >= 0; --i) poly.push(data[stack[i]]);
-    return poly;
-  }
-
-  hull.x = function(_) {
-    return arguments.length ? (x = _, hull) : x;
-  };
-
-  hull.y = function(_) {
-    return arguments.length ? (y = _, hull) : y;
-  };
-
-  return hull;
-};
-
-// are three points in counter-clockwise order?
-function d3_geom_hullCCW(i1, i2, i3, v) {
-  var t, a, b, c, d, e, f;
-  t = v[i1]; a = t[0]; b = t[1];
-  t = v[i2]; c = t[0]; d = t[1];
-  t = v[i3]; e = t[0]; f = t[1];
-  return (f - b) * (c - a) - (d - b) * (e - a) > 0;
-}
-
-var d3_ease_default = function() { return d3_identity; };
-
-var d3_ease = d3.map({
-  linear: d3_ease_default,
-  poly: d3_ease_poly,
-  quad: function() { return d3_ease_quad; },
-  cubic: function() { return d3_ease_cubic; },
-  sin: function() { return d3_ease_sin; },
-  exp: function() { return d3_ease_exp; },
-  circle: function() { return d3_ease_circle; },
-  elastic: d3_ease_elastic,
-  back: d3_ease_back,
-  bounce: function() { return d3_ease_bounce; }
-});
-
-var d3_ease_mode = d3.map({
-  "in": d3_identity,
-  "out": d3_ease_reverse,
-  "in-out": d3_ease_reflect,
-  "out-in": function(f) { return d3_ease_reflect(d3_ease_reverse(f)); }
-});
-
-d3.ease = function(name) {
-  var i = name.indexOf("-"),
-      t = i >= 0 ? name.substring(0, i) : name,
-      m = i >= 0 ? name.substring(i + 1) : "in";
-  t = d3_ease.get(t) || d3_ease_default;
-  m = d3_ease_mode.get(m) || d3_identity;
-  return d3_ease_clamp(m(t.apply(null, d3_arraySlice.call(arguments, 1))));
-};
-
-function d3_ease_clamp(f) {
-  return function(t) {
-    return t <= 0 ? 0 : t >= 1 ? 1 : f(t);
-  };
-}
-
-function d3_ease_reverse(f) {
-  return function(t) {
-    return 1 - f(1 - t);
-  };
-}
-
-function d3_ease_reflect(f) {
-  return function(t) {
-    return .5 * (t < .5 ? f(2 * t) : (2 - f(2 - 2 * t)));
-  };
-}
-
-function d3_ease_quad(t) {
-  return t * t;
-}
-
-function d3_ease_cubic(t) {
-  return t * t * t;
-}
-
-// Optimized clamp(reflect(poly(3))).
-function d3_ease_cubicInOut(t) {
-  if (t <= 0) return 0;
-  if (t >= 1) return 1;
-  var t2 = t * t, t3 = t2 * t;
-  return 4 * (t < .5 ? t3 : 3 * (t - t2) + t3 - .75);
-}
-
-function d3_ease_poly(e) {
-  return function(t) {
-    return Math.pow(t, e);
-  };
-}
-
-function d3_ease_sin(t) {
-  return 1 - Math.cos(t * halfπ);
-}
-
-function d3_ease_exp(t) {
-  return Math.pow(2, 10 * (t - 1));
-}
-
-function d3_ease_circle(t) {
-  return 1 - Math.sqrt(1 - t * t);
-}
-
-function d3_ease_elastic(a, p) {
-  var s;
-  if (arguments.length < 2) p = 0.45;
-  if (arguments.length) s = p / τ * Math.asin(1 / a);
-  else a = 1, s = p / 4;
-  return function(t) {
-    return 1 + a * Math.pow(2, -10 * t) * Math.sin((t - s) * τ / p);
-  };
-}
-
-function d3_ease_back(s) {
-  if (!s) s = 1.70158;
-  return function(t) {
-    return t * t * ((s + 1) * t - s);
-  };
-}
-
-function d3_ease_bounce(t) {
-  return t < 1 / 2.75 ? 7.5625 * t * t
-      : t < 2 / 2.75 ? 7.5625 * (t -= 1.5 / 2.75) * t + .75
-      : t < 2.5 / 2.75 ? 7.5625 * (t -= 2.25 / 2.75) * t + .9375
-      : 7.5625 * (t -= 2.625 / 2.75) * t + .984375;
-}
-
-function d3_transition(groups, id) {
-  d3_subclass(groups, d3_transitionPrototype);
-
-  groups.id = id; // Note: read-only!
-
-  return groups;
-}
-
-var d3_transitionPrototype = [],
-    d3_transitionId = 0,
-    d3_transitionInheritId,
-    d3_transitionInherit;
-
-d3_transitionPrototype.call = d3_selectionPrototype.call;
-d3_transitionPrototype.empty = d3_selectionPrototype.empty;
-d3_transitionPrototype.node = d3_selectionPrototype.node;
-d3_transitionPrototype.size = d3_selectionPrototype.size;
-
-d3.transition = function(selection) {
-  return arguments.length
-      ? (d3_transitionInheritId ? selection.transition() : selection)
-      : d3_selectionRoot.transition();
-};
-
-d3.transition.prototype = d3_transitionPrototype;
-
-
-d3_transitionPrototype.select = function(selector) {
-  var id = this.id,
-      subgroups = [],
-      subgroup,
-      subnode,
-      node;
-
-  selector = d3_selection_selector(selector);
-
-  for (var j = -1, m = this.length; ++j < m;) {
-    subgroups.push(subgroup = []);
-    for (var group = this[j], i = -1, n = group.length; ++i < n;) {
-      if ((node = group[i]) && (subnode = selector.call(node, node.__data__, i, j))) {
-        if ("__data__" in node) subnode.__data__ = node.__data__;
-        d3_transitionNode(subnode, i, id, node.__transition__[id]);
-        subgroup.push(subnode);
-      } else {
-        subgroup.push(null);
-      }
-    }
-  }
-
-  return d3_transition(subgroups, id);
-};
-
-d3_transitionPrototype.selectAll = function(selector) {
-  var id = this.id,
-      subgroups = [],
-      subgroup,
-      subnodes,
-      node,
-      subnode,
-      transition;
-
-  selector = d3_selection_selectorAll(selector);
-
-  for (var j = -1, m = this.length; ++j < m;) {
-    for (var group = this[j], i = -1, n = group.length; ++i < n;) {
-      if (node = group[i]) {
-        transition = node.__transition__[id];
-        subnodes = selector.call(node, node.__data__, i, j);
-        subgroups.push(subgroup = []);
-        for (var k = -1, o = subnodes.length; ++k < o;) {
-          if (subnode = subnodes[k]) d3_transitionNode(subnode, k, id, transition);
-          subgroup.push(subnode);
-        }
-      }
-    }
-  }
-
-  return d3_transition(subgroups, id);
-};
-
-d3_transitionPrototype.filter = function(filter) {
-  var subgroups = [],
-      subgroup,
-      group,
-      node;
-
-  if (typeof filter !== "function") filter = d3_selection_filter(filter);
-
-  for (var j = 0, m = this.length; j < m; j++) {
-    subgroups.push(subgroup = []);
-    for (var group = this[j], i = 0, n = group.length; i < n; i++) {
-      if ((node = group[i]) && filter.call(node, node.__data__, i, j)) {
-        subgroup.push(node);
-      }
-    }
-  }
-
-  return d3_transition(subgroups, this.id);
-};
-function d3_Color() {}
-
-d3_Color.prototype.toString = function() {
-  return this.rgb() + "";
-};
-
-d3.hsl = function(h, s, l) {
-  return arguments.length === 1
-      ? (h instanceof d3_Hsl ? d3_hsl(h.h, h.s, h.l)
-      : d3_rgb_parse("" + h, d3_rgb_hsl, d3_hsl))
-      : d3_hsl(+h, +s, +l);
-};
-
-function d3_hsl(h, s, l) {
-  return new d3_Hsl(h, s, l);
-}
-
-function d3_Hsl(h, s, l) {
-  this.h = h;
-  this.s = s;
-  this.l = l;
-}
-
-var d3_hslPrototype = d3_Hsl.prototype = new d3_Color;
-
-d3_hslPrototype.brighter = function(k) {
-  k = Math.pow(0.7, arguments.length ? k : 1);
-  return d3_hsl(this.h, this.s, this.l / k);
-};
-
-d3_hslPrototype.darker = function(k) {
-  k = Math.pow(0.7, arguments.length ? k : 1);
-  return d3_hsl(this.h, this.s, k * this.l);
-};
-
-d3_hslPrototype.rgb = function() {
-  return d3_hsl_rgb(this.h, this.s, this.l);
-};
-
-function d3_hsl_rgb(h, s, l) {
-  var m1,
-      m2;
-
-  /* Some simple corrections for h, s and l. */
-  h = isNaN(h) ? 0 : (h %= 360) < 0 ? h + 360 : h;
-  s = isNaN(s) ? 0 : s < 0 ? 0 : s > 1 ? 1 : s;
-  l = l < 0 ? 0 : l > 1 ? 1 : l;
-
-  /* From FvD 13.37, CSS Color Module Level 3 */
-  m2 = l <= .5 ? l * (1 + s) : l + s - l * s;
-  m1 = 2 * l - m2;
-
-  function v(h) {
-    if (h > 360) h -= 360;
-    else if (h < 0) h += 360;
-    if (h < 60) return m1 + (m2 - m1) * h / 60;
-    if (h < 180) return m2;
-    if (h < 240) return m1 + (m2 - m1) * (240 - h) / 60;
-    return m1;
-  }
-
-  function vv(h) {
-    return Math.round(v(h) * 255);
-  }
-
-  return d3_rgb(vv(h + 120), vv(h), vv(h - 120));
-}
-
-d3.hcl = function(h, c, l) {
-  return arguments.length === 1
-      ? (h instanceof d3_Hcl ? d3_hcl(h.h, h.c, h.l)
-      : (h instanceof d3_Lab ? d3_lab_hcl(h.l, h.a, h.b)
-      : d3_lab_hcl((h = d3_rgb_lab((h = d3.rgb(h)).r, h.g, h.b)).l, h.a, h.b)))
-      : d3_hcl(+h, +c, +l);
-};
-
-function d3_hcl(h, c, l) {
-  return new d3_Hcl(h, c, l);
-}
-
-function d3_Hcl(h, c, l) {
-  this.h = h;
-  this.c = c;
-  this.l = l;
-}
-
-var d3_hclPrototype = d3_Hcl.prototype = new d3_Color;
-
-d3_hclPrototype.brighter = function(k) {
-  return d3_hcl(this.h, this.c, Math.min(100, this.l + d3_lab_K * (arguments.length ? k : 1)));
-};
-
-d3_hclPrototype.darker = function(k) {
-  return d3_hcl(this.h, this.c, Math.max(0, this.l - d3_lab_K * (arguments.length ? k : 1)));
-};
-
-d3_hclPrototype.rgb = function() {
-  return d3_hcl_lab(this.h, this.c, this.l).rgb();
-};
-
-function d3_hcl_lab(h, c, l) {
-  if (isNaN(h)) h = 0;
-  if (isNaN(c)) c = 0;
-  return d3_lab(l, Math.cos(h *= d3_radians) * c, Math.sin(h) * c);
-}
-
-d3.lab = function(l, a, b) {
-  return arguments.length === 1
-      ? (l instanceof d3_Lab ? d3_lab(l.l, l.a, l.b)
-      : (l instanceof d3_Hcl ? d3_hcl_lab(l.l, l.c, l.h)
-      : d3_rgb_lab((l = d3.rgb(l)).r, l.g, l.b)))
-      : d3_lab(+l, +a, +b);
-};
-
-function d3_lab(l, a, b) {
-  return new d3_Lab(l, a, b);
-}
-
-function d3_Lab(l, a, b) {
-  this.l = l;
-  this.a = a;
-  this.b = b;
-}
-
-// Corresponds roughly to RGB brighter/darker
-var d3_lab_K = 18;
-
-// D65 standard referent
-var d3_lab_X = 0.950470,
-    d3_lab_Y = 1,
-    d3_lab_Z = 1.088830;
-
-var d3_labPrototype = d3_Lab.prototype = new d3_Color;
-
-d3_labPrototype.brighter = function(k) {
-  return d3_lab(Math.min(100, this.l + d3_lab_K * (arguments.length ? k : 1)), this.a, this.b);
-};
-
-d3_labPrototype.darker = function(k) {
-  return d3_lab(Math.max(0, this.l - d3_lab_K * (arguments.length ? k : 1)), this.a, this.b);
-};
-
-d3_labPrototype.rgb = function() {
-  return d3_lab_rgb(this.l, this.a, this.b);
-};
-
-function d3_lab_rgb(l, a, b) {
-  var y = (l + 16) / 116,
-      x = y + a / 500,
-      z = y - b / 200;
-  x = d3_lab_xyz(x) * d3_lab_X;
-  y = d3_lab_xyz(y) * d3_lab_Y;
-  z = d3_lab_xyz(z) * d3_lab_Z;
-  return d3_rgb(
-    d3_xyz_rgb( 3.2404542 * x - 1.5371385 * y - 0.4985314 * z),
-    d3_xyz_rgb(-0.9692660 * x + 1.8760108 * y + 0.0415560 * z),
-    d3_xyz_rgb( 0.0556434 * x - 0.2040259 * y + 1.0572252 * z)
-  );
-}
-
-function d3_lab_hcl(l, a, b) {
-  return l > 0
-      ? d3_hcl(Math.atan2(b, a) * d3_degrees, Math.sqrt(a * a + b * b), l)
-      : d3_hcl(NaN, NaN, l);
-}
-
-function d3_lab_xyz(x) {
-  return x > 0.206893034 ? x * x * x : (x - 4 / 29) / 7.787037;
-}
-function d3_xyz_lab(x) {
-  return x > 0.008856 ? Math.pow(x, 1 / 3) : 7.787037 * x + 4 / 29;
-}
-
-function d3_xyz_rgb(r) {
-  return Math.round(255 * (r <= 0.00304 ? 12.92 * r : 1.055 * Math.pow(r, 1 / 2.4) - 0.055));
-}
-
-d3.rgb = function(r, g, b) {
-  return arguments.length === 1
-      ? (r instanceof d3_Rgb ? d3_rgb(r.r, r.g, r.b)
-      : d3_rgb_parse("" + r, d3_rgb, d3_hsl_rgb))
-      : d3_rgb(~~r, ~~g, ~~b);
-};
-
-function d3_rgbNumber(value) {
-  return d3_rgb(value >> 16, value >> 8 & 0xff, value & 0xff);
-}
-
-function d3_rgbString(value) {
-  return d3_rgbNumber(value) + "";
-}
-
-function d3_rgb(r, g, b) {
-  return new d3_Rgb(r, g, b);
-}
-
-function d3_Rgb(r, g, b) {
-  this.r = r;
-  this.g = g;
-  this.b = b;
-}
-
-var d3_rgbPrototype = d3_Rgb.prototype = new d3_Color;
-
-d3_rgbPrototype.brighter = function(k) {
-  k = Math.pow(0.7, arguments.length ? k : 1);
-  var r = this.r,
-      g = this.g,
-      b = this.b,
-      i = 30;
-  if (!r && !g && !b) return d3_rgb(i, i, i);
-  if (r && r < i) r = i;
-  if (g && g < i) g = i;
-  if (b && b < i) b = i;
-  return d3_rgb(Math.min(255, ~~(r / k)), Math.min(255, ~~(g / k)), Math.min(255, ~~(b / k)));
-};
-
-d3_rgbPrototype.darker = function(k) {
-  k = Math.pow(0.7, arguments.length ? k : 1);
-  return d3_rgb(~~(k * this.r), ~~(k * this.g), ~~(k * this.b));
-};
-
-d3_rgbPrototype.hsl = function() {
-  return d3_rgb_hsl(this.r, this.g, this.b);
-};
-
-d3_rgbPrototype.toString = function() {
-  return "#" + d3_rgb_hex(this.r) + d3_rgb_hex(this.g) + d3_rgb_hex(this.b);
-};
-
-function d3_rgb_hex(v) {
-  return v < 0x10
-      ? "0" + Math.max(0, v).toString(16)
-      : Math.min(255, v).toString(16);
-}
-
-function d3_rgb_parse(format, rgb, hsl) {
-  var r = 0, // red channel; int in [0, 255]
-      g = 0, // green channel; int in [0, 255]
-      b = 0, // blue channel; int in [0, 255]
-      m1, // CSS color specification match
-      m2, // CSS color specification type (e.g., rgb)
-      color;
-
-  /* Handle hsl, rgb. */
-  m1 = /([a-z]+)\((.*)\)/i.exec(format);
-  if (m1) {
-    m2 = m1[2].split(",");
-    switch (m1[1]) {
-      case "hsl": {
-        return hsl(
-          parseFloat(m2[0]), // degrees
-          parseFloat(m2[1]) / 100, // percentage
-          parseFloat(m2[2]) / 100 // percentage
-        );
-      }
-      case "rgb": {
-        return rgb(
-          d3_rgb_parseNumber(m2[0]),
-          d3_rgb_parseNumber(m2[1]),
-          d3_rgb_parseNumber(m2[2])
-        );
-      }
-    }
-  }
-
-  /* Named colors. */
-  if (color = d3_rgb_names.get(format)) return rgb(color.r, color.g, color.b);
-
-  /* Hexadecimal colors: #rgb and #rrggbb. */
-  if (format != null && format.charAt(0) === "#" && !isNaN(color = parseInt(format.substring(1), 16))) {
-    if (format.length === 4) {
-      r = (color & 0xf00) >> 4; r = (r >> 4) | r;
-      g = (color & 0xf0); g = (g >> 4) | g;
-      b = (color & 0xf); b = (b << 4) | b;
-    } else if (format.length === 7) {
-      r = (color & 0xff0000) >> 16;
-      g = (color & 0xff00) >> 8;
-      b = (color & 0xff);
-    }
-  }
-
-  return rgb(r, g, b);
-}
-
-function d3_rgb_hsl(r, g, b) {
-  var min = Math.min(r /= 255, g /= 255, b /= 255),
-      max = Math.max(r, g, b),
-      d = max - min,
-      h,
-      s,
-      l = (max + min) / 2;
-  if (d) {
-    s = l < .5 ? d / (max + min) : d / (2 - max - min);
-    if (r == max) h = (g - b) / d + (g < b ? 6 : 0);
-    else if (g == max) h = (b - r) / d + 2;
-    else h = (r - g) / d + 4;
-    h *= 60;
-  } else {
-    h = NaN;
-    s = l > 0 && l < 1 ? 0 : h;
-  }
-  return d3_hsl(h, s, l);
-}
-
-function d3_rgb_lab(r, g, b) {
-  r = d3_rgb_xyz(r);
-  g = d3_rgb_xyz(g);
-  b = d3_rgb_xyz(b);
-  var x = d3_xyz_lab((0.4124564 * r + 0.3575761 * g + 0.1804375 * b) / d3_lab_X),
-      y = d3_xyz_lab((0.2126729 * r + 0.7151522 * g + 0.0721750 * b) / d3_lab_Y),
-      z = d3_xyz_lab((0.0193339 * r + 0.1191920 * g + 0.9503041 * b) / d3_lab_Z);
-  return d3_lab(116 * y - 16, 500 * (x - y), 200 * (y - z));
-}
-
-function d3_rgb_xyz(r) {
-  return (r /= 255) <= 0.04045 ? r / 12.92 : Math.pow((r + 0.055) / 1.055, 2.4);
-}
-
-function d3_rgb_parseNumber(c) { // either integer or percentage
-  var f = parseFloat(c);
-  return c.charAt(c.length - 1) === "%" ? Math.round(f * 2.55) : f;
-}
-
-var d3_rgb_names = d3.map({
-  aliceblue: 0xf0f8ff,
-  antiquewhite: 0xfaebd7,
-  aqua: 0x00ffff,
-  aquamarine: 0x7fffd4,
-  azure: 0xf0ffff,
-  beige: 0xf5f5dc,
-  bisque: 0xffe4c4,
-  black: 0x000000,
-  blanchedalmond: 0xffebcd,
-  blue: 0x0000ff,
-  blueviolet: 0x8a2be2,
-  brown: 0xa52a2a,
-  burlywood: 0xdeb887,
-  cadetblue: 0x5f9ea0,
-  chartreuse: 0x7fff00,
-  chocolate: 0xd2691e,
-  coral: 0xff7f50,
-  cornflowerblue: 0x6495ed,
-  cornsilk: 0xfff8dc,
-  crimson: 0xdc143c,
-  cyan: 0x00ffff,
-  darkblue: 0x00008b,
-  darkcyan: 0x008b8b,
-  darkgoldenrod: 0xb8860b,
-  darkgray: 0xa9a9a9,
-  darkgreen: 0x006400,
-  darkgrey: 0xa9a9a9,
-  darkkhaki: 0xbdb76b,
-  darkmagenta: 0x8b008b,
-  darkolivegreen: 0x556b2f,
-  darkorange: 0xff8c00,
-  darkorchid: 0x9932cc,
-  darkred: 0x8b0000,
-  darksalmon: 0xe9967a,
-  darkseagreen: 0x8fbc8f,
-  darkslateblue: 0x483d8b,
-  darkslategray: 0x2f4f4f,
-  darkslategrey: 0x2f4f4f,
-  darkturquoise: 0x00ced1,
-  darkviolet: 0x9400d3,
-  deeppink: 0xff1493,
-  deepskyblue: 0x00bfff,
-  dimgray: 0x696969,
-  dimgrey: 0x696969,
-  dodgerblue: 0x1e90ff,
-  firebrick: 0xb22222,
-  floralwhite: 0xfffaf0,
-  forestgreen: 0x228b22,
-  fuchsia: 0xff00ff,
-  gainsboro: 0xdcdcdc,
-  ghostwhite: 0xf8f8ff,
-  gold: 0xffd700,
-  goldenrod: 0xdaa520,
-  gray: 0x808080,
-  green: 0x008000,
-  greenyellow: 0xadff2f,
-  grey: 0x808080,
-  honeydew: 0xf0fff0,
-  hotpink: 0xff69b4,
-  indianred: 0xcd5c5c,
-  indigo: 0x4b0082,
-  ivory: 0xfffff0,
-  khaki: 0xf0e68c,
-  lavender: 0xe6e6fa,
-  lavenderblush: 0xfff0f5,
-  lawngreen: 0x7cfc00,
-  lemonchiffon: 0xfffacd,
-  lightblue: 0xadd8e6,
-  lightcoral: 0xf08080,
-  lightcyan: 0xe0ffff,
-  lightgoldenrodyellow: 0xfafad2,
-  lightgray: 0xd3d3d3,
-  lightgreen: 0x90ee90,
-  lightgrey: 0xd3d3d3,
-  lightpink: 0xffb6c1,
-  lightsalmon: 0xffa07a,
-  lightseagreen: 0x20b2aa,
-  lightskyblue: 0x87cefa,
-  lightslategray: 0x778899,
-  lightslategrey: 0x778899,
-  lightsteelblue: 0xb0c4de,
-  lightyellow: 0xffffe0,
-  lime: 0x00ff00,
-  limegreen: 0x32cd32,
-  linen: 0xfaf0e6,
-  magenta: 0xff00ff,
-  maroon: 0x800000,
-  mediumaquamarine: 0x66cdaa,
-  mediumblue: 0x0000cd,
-  mediumorchid: 0xba55d3,
-  mediumpurple: 0x9370db,
-  mediumseagreen: 0x3cb371,
-  mediumslateblue: 0x7b68ee,
-  mediumspringgreen: 0x00fa9a,
-  mediumturquoise: 0x48d1cc,
-  mediumvioletred: 0xc71585,
-  midnightblue: 0x191970,
-  mintcream: 0xf5fffa,
-  mistyrose: 0xffe4e1,
-  moccasin: 0xffe4b5,
-  navajowhite: 0xffdead,
-  navy: 0x000080,
-  oldlace: 0xfdf5e6,
-  olive: 0x808000,
-  olivedrab: 0x6b8e23,
-  orange: 0xffa500,
-  orangered: 0xff4500,
-  orchid: 0xda70d6,
-  palegoldenrod: 0xeee8aa,
-  palegreen: 0x98fb98,
-  paleturquoise: 0xafeeee,
-  palevioletred: 0xdb7093,
-  papayawhip: 0xffefd5,
-  peachpuff: 0xffdab9,
-  peru: 0xcd853f,
-  pink: 0xffc0cb,
-  plum: 0xdda0dd,
-  powderblue: 0xb0e0e6,
-  purple: 0x800080,
-  red: 0xff0000,
-  rosybrown: 0xbc8f8f,
-  royalblue: 0x4169e1,
-  saddlebrown: 0x8b4513,
-  salmon: 0xfa8072,
-  sandybrown: 0xf4a460,
-  seagreen: 0x2e8b57,
-  seashell: 0xfff5ee,
-  sienna: 0xa0522d,
-  silver: 0xc0c0c0,
-  skyblue: 0x87ceeb,
-  slateblue: 0x6a5acd,
-  slategray: 0x708090,
-  slategrey: 0x708090,
-  snow: 0xfffafa,
-  springgreen: 0x00ff7f,
-  steelblue: 0x4682b4,
-  tan: 0xd2b48c,
-  teal: 0x008080,
-  thistle: 0xd8bfd8,
-  tomato: 0xff6347,
-  turquoise: 0x40e0d0,
-  violet: 0xee82ee,
-  wheat: 0xf5deb3,
-  white: 0xffffff,
-  whitesmoke: 0xf5f5f5,
-  yellow: 0xffff00,
-  yellowgreen: 0x9acd32
-});
-
-d3_rgb_names.forEach(function(key, value) {
-  d3_rgb_names.set(key, d3_rgbNumber(value));
-});
-
-d3.interpolateRgb = d3_interpolateRgb;
-
-function d3_interpolateRgb(a, b) {
-  a = d3.rgb(a);
-  b = d3.rgb(b);
-  var ar = a.r,
-      ag = a.g,
-      ab = a.b,
-      br = b.r - ar,
-      bg = b.g - ag,
-      bb = b.b - ab;
-  return function(t) {
-    return "#"
-        + d3_rgb_hex(Math.round(ar + br * t))
-        + d3_rgb_hex(Math.round(ag + bg * t))
-        + d3_rgb_hex(Math.round(ab + bb * t));
-  };
-}
-
-d3.interpolateObject = d3_interpolateObject;
-
-function d3_interpolateObject(a, b) {
-  var i = {},
-      c = {},
-      k;
-  for (k in a) {
-    if (k in b) {
-      i[k] = d3_interpolate(a[k], b[k]);
-    } else {
-      c[k] = a[k];
-    }
-  }
-  for (k in b) {
-    if (!(k in a)) {
-      c[k] = b[k];
-    }
-  }
-  return function(t) {
-    for (k in i) c[k] = i[k](t);
-    return c;
-  };
-}
-
-d3.interpolateArray = d3_interpolateArray;
-
-function d3_interpolateArray(a, b) {
-  var x = [],
-      c = [],
-      na = a.length,
-      nb = b.length,
-      n0 = Math.min(a.length, b.length),
-      i;
-  for (i = 0; i < n0; ++i) x.push(d3_interpolate(a[i], b[i]));
-  for (; i < na; ++i) c[i] = a[i];
-  for (; i < nb; ++i) c[i] = b[i];
-  return function(t) {
-    for (i = 0; i < n0; ++i) c[i] = x[i](t);
-    return c;
-  };
-}
-d3.interpolateNumber = d3_interpolateNumber;
-
-function d3_interpolateNumber(a, b) {
-  b -= a = +a;
-  return function(t) { return a + b * t; };
-}
-
-d3.interpolateString = d3_interpolateString;
-
-function d3_interpolateString(a, b) {
-  var bi = d3_interpolate_numberA.lastIndex = d3_interpolate_numberB.lastIndex = 0, // scan index for next number in b
-      am, // current match in a
-      bm, // current match in b
-      bs, // string preceding current number in b, if any
-      i = -1, // index in s
-      s = [], // string constants and placeholders
-      q = []; // number interpolators
-
-  // Coerce inputs to strings.
-  a = a + "", b = b + "";
-
-  // Interpolate pairs of numbers in a & b.
-  while ((am = d3_interpolate_numberA.exec(a))
-      && (bm = d3_interpolate_numberB.exec(b))) {
-    if ((bs = bm.index) > bi) { // a string precedes the next number in b
-      bs = b.substring(bi, bs);
-      if (s[i]) s[i] += bs; // coalesce with previous string
-      else s[++i] = bs;
-    }
-    if ((am = am[0]) === (bm = bm[0])) { // numbers in a & b match
-      if (s[i]) s[i] += bm; // coalesce with previous string
-      else s[++i] = bm;
-    } else { // interpolate non-matching numbers
-      s[++i] = null;
-      q.push({i: i, x: d3_interpolateNumber(am, bm)});
-    }
-    bi = d3_interpolate_numberB.lastIndex;
-  }
-
-  // Add remains of b.
-  if (bi < b.length) {
-    bs = b.substring(bi);
-    if (s[i]) s[i] += bs; // coalesce with previous string
-    else s[++i] = bs;
-  }
-
-  // Special optimization for only a single match.
-  // Otherwise, interpolate each of the numbers and rejoin the string.
-  return s.length < 2
-      ? (q[0] ? (b = q[0].x, function(t) { return b(t) + ""; })
-      : function() { return b; })
-      : (b = q.length, function(t) {
-          for (var i = 0, o; i < b; ++i) s[(o = q[i]).i] = o.x(t);
-          return s.join("");
-        });
-}
-
-var d3_interpolate_numberA = /[-+]?(?:\d+\.?\d*|\.?\d+)(?:[eE][-+]?\d+)?/g,
-    d3_interpolate_numberB = new RegExp(d3_interpolate_numberA.source, "g");
-
-d3.interpolate = d3_interpolate;
-
-function d3_interpolate(a, b) {
-  var i = d3.interpolators.length, f;
-  while (--i >= 0 && !(f = d3.interpolators[i](a, b)));
-  return f;
-}
-
-d3.interpolators = [
-  function(a, b) {
-    var t = typeof b;
-    return (t === "string" ? (d3_rgb_names.has(b) || /^(#|rgb\(|hsl\()/.test(b) ? d3_interpolateRgb : d3_interpolateString)
-        : b instanceof d3_Color ? d3_interpolateRgb
-        : Array.isArray(b) ? d3_interpolateArray
-        : t === "object" && isNaN(b) ? d3_interpolateObject
-        : d3_interpolateNumber)(a, b);
-  }
-];
-
-d3.transform = function(string) {
-  var g = d3_document.createElementNS(d3.ns.prefix.svg, "g");
-  return (d3.transform = function(string) {
-    if (string != null) {
-      g.setAttribute("transform", string);
-      var t = g.transform.baseVal.consolidate();
-    }
-    return new d3_transform(t ? t.matrix : d3_transformIdentity);
-  })(string);
-};
-
-// Compute x-scale and normalize the first row.
-// Compute shear and make second row orthogonal to first.
-// Compute y-scale and normalize the second row.
-// Finally, compute the rotation.
-function d3_transform(m) {
-  var r0 = [m.a, m.b],
-      r1 = [m.c, m.d],
-      kx = d3_transformNormalize(r0),
-      kz = d3_transformDot(r0, r1),
-      ky = d3_transformNormalize(d3_transformCombine(r1, r0, -kz)) || 0;
-  if (r0[0] * r1[1] < r1[0] * r0[1]) {
-    r0[0] *= -1;
-    r0[1] *= -1;
-    kx *= -1;
-    kz *= -1;
-  }
-  this.rotate = (kx ? Math.atan2(r0[1], r0[0]) : Math.atan2(-r1[0], r1[1])) * d3_degrees;
-  this.translate = [m.e, m.f];
-  this.scale = [kx, ky];
-  this.skew = ky ? Math.atan2(kz, ky) * d3_degrees : 0;
-};
-
-d3_transform.prototype.toString = function() {
-  return "translate(" + this.translate
-      + ")rotate(" + this.rotate
-      + ")skewX(" + this.skew
-      + ")scale(" + this.scale
-      + ")";
-};
-
-function d3_transformDot(a, b) {
-  return a[0] * b[0] + a[1] * b[1];
-}
-
-function d3_transformNormalize(a) {
-  var k = Math.sqrt(d3_transformDot(a, a));
-  if (k) {
-    a[0] /= k;
-    a[1] /= k;
-  }
-  return k;
-}
-
-function d3_transformCombine(a, b, k) {
-  a[0] += k * b[0];
-  a[1] += k * b[1];
-  return a;
-}
-
-var d3_transformIdentity = {a: 1, b: 0, c: 0, d: 1, e: 0, f: 0};
-
-d3.interpolateTransform = d3_interpolateTransform;
-
-function d3_interpolateTransform(a, b) {
-  var s = [], // string constants and placeholders
-      q = [], // number interpolators
-      n,
-      A = d3.transform(a),
-      B = d3.transform(b),
-      ta = A.translate,
-      tb = B.translate,
-      ra = A.rotate,
-      rb = B.rotate,
-      wa = A.skew,
-      wb = B.skew,
-      ka = A.scale,
-      kb = B.scale;
-
-  if (ta[0] != tb[0] || ta[1] != tb[1]) {
-    s.push("translate(", null, ",", null, ")");
-    q.push({i: 1, x: d3_interpolateNumber(ta[0], tb[0])}, {i: 3, x: d3_interpolateNumber(ta[1], tb[1])});
-  } else if (tb[0] || tb[1]) {
-    s.push("translate(" + tb + ")");
-  } else {
-    s.push("");
-  }
-
-  if (ra != rb) {
-    if (ra - rb > 180) rb += 360; else if (rb - ra > 180) ra += 360; // shortest path
-    q.push({i: s.push(s.pop() + "rotate(", null, ")") - 2, x: d3_interpolateNumber(ra, rb)});
-  } else if (rb) {
-    s.push(s.pop() + "rotate(" + rb + ")");
-  }
-
-  if (wa != wb) {
-    q.push({i: s.push(s.pop() + "skewX(", null, ")") - 2, x: d3_interpolateNumber(wa, wb)});
-  } else if (wb) {
-    s.push(s.pop() + "skewX(" + wb + ")");
-  }
-
-  if (ka[0] != kb[0] || ka[1] != kb[1]) {
-    n = s.push(s.pop() + "scale(", null, ",", null, ")");
-    q.push({i: n - 4, x: d3_interpolateNumber(ka[0], kb[0])}, {i: n - 2, x: d3_interpolateNumber(ka[1], kb[1])});
-  } else if (kb[0] != 1 || kb[1] != 1) {
-    s.push(s.pop() + "scale(" + kb + ")");
-  }
-
-  n = q.length;
-  return function(t) {
-    var i = -1, o;
-    while (++i < n) s[(o = q[i]).i] = o.x(t);
-    return s.join("");
-  };
-}
-
-d3_transitionPrototype.tween = function(name, tween) {
-  var id = this.id;
-  if (arguments.length < 2) return this.node().__transition__[id].tween.get(name);
-  return d3_selection_each(this, tween == null
-        ? function(node) { node.__transition__[id].tween.remove(name); }
-        : function(node) { node.__transition__[id].tween.set(name, tween); });
-};
-
-function d3_transition_tween(groups, name, value, tween) {
-  var id = groups.id;
-  return d3_selection_each(groups, typeof value === "function"
-      ? function(node, i, j) { node.__transition__[id].tween.set(name, tween(value.call(node, node.__data__, i, j))); }
-      : (value = tween(value), function(node) { node.__transition__[id].tween.set(name, value); }));
-}
-
-d3_transitionPrototype.attr = function(nameNS, value) {
-  if (arguments.length < 2) {
-
-    // For attr(object), the object specifies the names and values of the
-    // attributes to transition. The values may be functions that are
-    // evaluated for each element.
-    for (value in nameNS) this.attr(value, nameNS[value]);
-    return this;
-  }
-
-  var interpolate = nameNS == "transform" ? d3_interpolateTransform : d3_interpolate,
-      name = d3.ns.qualify(nameNS);
-
-  // For attr(string, null), remove the attribute with the specified name.
-  function attrNull() {
-    this.removeAttribute(name);
-  }
-  function attrNullNS() {
-    this.removeAttributeNS(name.space, name.local);
-  }
-
-  // For attr(string, string), set the attribute with the specified name.
-  function attrTween(b) {
-    return b == null ? attrNull : (b += "", function() {
-      var a = this.getAttribute(name), i;
-      return a !== b && (i = interpolate(a, b), function(t) { this.setAttribute(name, i(t)); });
-    });
-  }
-  function attrTweenNS(b) {
-    return b == null ? attrNullNS : (b += "", function() {
-      var a = this.getAttributeNS(name.space, name.local), i;
-      return a !== b && (i = interpolate(a, b), function(t) { this.setAttributeNS(name.space, name.local, i(t)); });
-    });
-  }
-
-  return d3_transition_tween(this, "attr." + nameNS, value, name.local ? attrTweenNS : attrTween);
-};
-
-d3_transitionPrototype.attrTween = function(nameNS, tween) {
-  var name = d3.ns.qualify(nameNS);
-
-  function attrTween(d, i) {
-    var f = tween.call(this, d, i, this.getAttribute(name));
-    return f && function(t) { this.setAttribute(name, f(t)); };
-  }
-  function attrTweenNS(d, i) {
-    var f = tween.call(this, d, i, this.getAttributeNS(name.space, name.local));
-    return f && function(t) { this.setAttributeNS(name.space, name.local, f(t)); };
-  }
-
-  return this.tween("attr." + nameNS, name.local ? attrTweenNS : attrTween);
-};
-
-d3_transitionPrototype.style = function(name, value, priority) {
-  var n = arguments.length;
-  if (n < 3) {
-
-    // For style(object) or style(object, string), the object specifies the
-    // names and values of the attributes to set or remove. The values may be
-    // functions that are evaluated for each element. The optional string
-    // specifies the priority.
-    if (typeof name !== "string") {
-      if (n < 2) value = "";
-      for (priority in name) this.style(priority, name[priority], value);
-      return this;
-    }
-
-    // For style(string, string) or style(string, function), use the default
-    // priority. The priority is ignored for style(string, null).
-    priority = "";
-  }
-
-  // For style(name, null) or style(name, null, priority), remove the style
-  // property with the specified name. The priority is ignored.
-  function styleNull() {
-    this.style.removeProperty(name);
-  }
-
-  // For style(name, string) or style(name, string, priority), set the style
-  // property with the specified name, using the specified priority.
-  // Otherwise, a name, value and priority are specified, and handled as below.
-  function styleString(b) {
-    return b == null ? styleNull : (b += "", function() {
-      var a = d3_window.getComputedStyle(this, null).getPropertyValue(name), i;
-      return a !== b && (i = d3_interpolate(a, b), function(t) { this.style.setProperty(name, i(t), priority); });
-    });
-  }
-
-  return d3_transition_tween(this, "style." + name, value, styleString);
-};
-
-d3_transitionPrototype.styleTween = function(name, tween, priority) {
-  if (arguments.length < 3) priority = "";
-
-  function styleTween(d, i) {
-    var f = tween.call(this, d, i, d3_window.getComputedStyle(this, null).getPropertyValue(name));
-    return f && function(t) { this.style.setProperty(name, f(t), priority); };
-  }
-
-  return this.tween("style." + name, styleTween);
-};
-
-d3_transitionPrototype.text = function(value) {
-  return d3_transition_tween(this, "text", value, d3_transition_text);
-};
-
-function d3_transition_text(b) {
-  if (b == null) b = "";
-  return function() { this.textContent = b; };
-}
-
-d3_transitionPrototype.remove = function() {
-  return this.each("end.transition", function() {
-    var p;
-    if (this.__transition__.count < 2 && (p = this.parentNode)) p.removeChild(this);
-  });
-};
-
-d3_transitionPrototype.ease = function(value) {
-  var id = this.id;
-  if (arguments.length < 1) return this.node().__transition__[id].ease;
-  if (typeof value !== "function") value = d3.ease.apply(d3, arguments);
-  return d3_selection_each(this, function(node) { node.__transition__[id].ease = value; });
-};
-
-d3_transitionPrototype.delay = function(value) {
-  var id = this.id;
-  if (arguments.length < 1) return this.node().__transition__[id].delay;
-  return d3_selection_each(this, typeof value === "function"
-      ? function(node, i, j) { node.__transition__[id].delay = +value.call(node, node.__data__, i, j); }
-      : (value = +value, function(node) { node.__transition__[id].delay = value; }));
-};
-
-d3_transitionPrototype.duration = function(value) {
-  var id = this.id;
-  if (arguments.length < 1) return this.node().__transition__[id].duration;
-  return d3_selection_each(this, typeof value === "function"
-      ? function(node, i, j) { node.__transition__[id].duration = Math.max(1, value.call(node, node.__data__, i, j)); }
-      : (value = Math.max(1, value), function(node) { node.__transition__[id].duration = value; }));
-};
-
-d3_transitionPrototype.each = function(type, listener) {
-  var id = this.id;
-  if (arguments.length < 2) {
-    var inherit = d3_transitionInherit,
-        inheritId = d3_transitionInheritId;
-    d3_transitionInheritId = id;
-    d3_selection_each(this, function(node, i, j) {
-      d3_transitionInherit = node.__transition__[id];
-      type.call(node, node.__data__, i, j);
-    });
-    d3_transitionInherit = inherit;
-    d3_transitionInheritId = inheritId;
-  } else {
-    d3_selection_each(this, function(node) {
-      var transition = node.__transition__[id];
-      (transition.event || (transition.event = d3.dispatch("start", "end"))).on(type, listener);
-    });
-  }
-  return this;
-};
-
-d3_transitionPrototype.transition = function() {
-  var id0 = this.id,
-      id1 = ++d3_transitionId,
-      subgroups = [],
-      subgroup,
-      group,
-      node,
-      transition;
-
-  for (var j = 0, m = this.length; j < m; j++) {
-    subgroups.push(subgroup = []);
-    for (var group = this[j], i = 0, n = group.length; i < n; i++) {
-      if (node = group[i]) {
-        transition = Object.create(node.__transition__[id0]);
-        transition.delay += transition.duration;
-        d3_transitionNode(node, i, id1, transition);
-      }
-      subgroup.push(node);
-    }
-  }
-
-  return d3_transition(subgroups, id1);
-};
-
-function d3_transitionNode(node, i, id, inherit) {
-  var lock = node.__transition__ || (node.__transition__ = {active: 0, count: 0}),
-      transition = lock[id];
-
-  if (!transition) {
-    var time = inherit.time;
-
-    transition = lock[id] = {
-      tween: new d3_Map,
-      time: time,
-      ease: inherit.ease,
-      delay: inherit.delay,
-      duration: inherit.duration
-    };
-
-    ++lock.count;
-
-    d3.timer(function(elapsed) {
-      var d = node.__data__,
-          ease = transition.ease,
-          delay = transition.delay,
-          duration = transition.duration,
-          timer = d3_timer_active,
-          tweened = [];
-
-      timer.t = delay + time;
-      if (delay <= elapsed) return start(elapsed - delay);
-      timer.c = start;
-
-      function start(elapsed) {
-        if (lock.active > id) return stop();
-        lock.active = id;
-        transition.event && transition.event.start.call(node, d, i);
-
-        transition.tween.forEach(function(key, value) {
-          if (value = value.call(node, d, i)) {
-            tweened.push(value);
-          }
-        });
-
-        d3.timer(function() { // defer to end of current frame
-          timer.c = tick(elapsed || 1) ? d3_true : tick;
-          return 1;
-        }, 0, time);
-      }
-
-      function tick(elapsed) {
-        if (lock.active !== id) return stop();
-
-        var t = elapsed / duration,
-            e = ease(t),
-            n = tweened.length;
-
-        while (n > 0) {
-          tweened[--n].call(node, e);
-        }
-
-        if (t >= 1) {
-          transition.event && transition.event.end.call(node, d, i);
-          return stop();
-        }
-      }
-
-      function stop() {
-        if (--lock.count) delete lock[id];
-        else delete node.__transition__;
-        return 1;
-      }
-    }, 0, time);
-  }
-}
-
-d3.xhr = d3_xhrType(d3_identity);
-
-function d3_xhrType(response) {
-  return function(url, mimeType, callback) {
-    if (arguments.length === 2 && typeof mimeType === "function") callback = mimeType, mimeType = null;
-    return d3_xhr(url, mimeType, response, callback);
-  };
-}
-
-function d3_xhr(url, mimeType, response, callback) {
-  var xhr = {},
-      dispatch = d3.dispatch("beforesend", "progress", "load", "error"),
-      headers = {},
-      request = new XMLHttpRequest,
-      responseType = null;
-
-  // If IE does not support CORS, use XDomainRequest.
-  if (d3_window.XDomainRequest
-      && !("withCredentials" in request)
-      && /^(http(s)?:)?\/\//.test(url)) request = new XDomainRequest;
-
-  "onload" in request
-      ? request.onload = request.onerror = respond
-      : request.onreadystatechange = function() { request.readyState > 3 && respond(); };
-
-  function respond() {
-    var status = request.status, result;
-    if (!status && request.responseText || status >= 200 && status < 300 || status === 304) {
-      try {
-        result = response.call(xhr, request);
-      } catch (e) {
-        dispatch.error.call(xhr, e);
-        return;
-      }
-      dispatch.load.call(xhr, result);
-    } else {
-      dispatch.error.call(xhr, request);
-    }
-  }
-
-  request.onprogress = function(event) {
-    var o = d3.event;
-    d3.event = event;
-    try { dispatch.progress.call(xhr, request); }
-    finally { d3.event = o; }
-  };
-
-  xhr.header = function(name, value) {
-    name = (name + "").toLowerCase();
-    if (arguments.length < 2) return headers[name];
-    if (value == null) delete headers[name];
-    else headers[name] = value + "";
-    return xhr;
-  };
-
-  // If mimeType is non-null and no Accept header is set, a default is used.
-  xhr.mimeType = function(value) {
-    if (!arguments.length) return mimeType;
-    mimeType = value == null ? null : value + "";
-    return xhr;
-  };
-
-  // Specifies what type the response value should take;
-  // for instance, arraybuffer, blob, document, or text.
-  xhr.responseType = function(value) {
-    if (!arguments.length) return responseType;
-    responseType = value;
-    return xhr;
-  };
-
-  // Specify how to convert the response content to a specific type;
-  // changes the callback value on "load" events.
-  xhr.response = function(value) {
-    response = value;
-    return xhr;
-  };
-
-  // Convenience methods.
-  ["get", "post"].forEach(function(method) {
-    xhr[method] = function() {
-      return xhr.send.apply(xhr, [method].concat(d3_array(arguments)));
-    };
-  });
-
-  // If callback is non-null, it will be used for error and load events.
-  xhr.send = function(method, data, callback) {
-    if (arguments.length === 2 && typeof data === "function") callback = data, data = null;
-    request.open(method, url, true);
-    if (mimeType != null && !("accept" in headers)) headers["accept"] = mimeType + ",*/*";
-    if (request.setRequestHeader) for (var name in headers) request.setRequestHeader(name, headers[name]);
-    if (mimeType != null && request.overrideMimeType) request.overrideMimeType(mimeType);
-    if (responseType != null) request.responseType = responseType;
-    if (callback != null) xhr.on("error", callback).on("load", function(request) { callback(null, request); });
-    dispatch.beforesend.call(xhr, request);
-    request.send(data == null ? null : data);
-    return xhr;
-  };
-
-  xhr.abort = function() {
-    request.abort();
-    return xhr;
-  };
-
-  d3.rebind(xhr, dispatch, "on");
-
-  return callback == null ? xhr : xhr.get(d3_xhr_fixCallback(callback));
-};
-
-function d3_xhr_fixCallback(callback) {
-  return callback.length === 1
-      ? function(error, request) { callback(error == null ? request : null); }
-      : callback;
-}
-
-d3.text = d3_xhrType(function(request) {
-  return request.responseText;
-});
-
-d3.json = function(url, callback) {
-  return d3_xhr(url, "application/json", d3_json, callback);
-};
-
-function d3_json(request) {
-  return JSON.parse(request.responseText);
-}
-
-d3.html = function(url, callback) {
-  return d3_xhr(url, "text/html", d3_html, callback);
-};
-
-function d3_html(request) {
-  var range = d3_document.createRange();
-  range.selectNode(d3_document.body);
-  return range.createContextualFragment(request.responseText);
-}
-
-d3.xml = d3_xhrType(function(request) {
-  return request.responseXML;
-});
-  if (typeof define === "function" && define.amd) {
-    define(d3);
-  } else if (typeof module === "object" && module.exports) {
-    module.exports = d3;
-  } else {
-    this.d3 = d3;
-  }
-}();
-d3.combobox = function() {
-    var event = d3.dispatch('accept'),
-        data = [],
-        suggestions = [],
-        minItems = 2;
-
-    var fetcher = function(val, cb) {
-        cb(data.filter(function(d) {
-            return d.value
-                .toString()
-                .toLowerCase()
-                .indexOf(val.toLowerCase()) !== -1;
-        }));
-    };
-
-    var combobox = function(input) {
-        var idx = -1,
-            container = d3.select(document.body)
-                .selectAll('div.combobox')
-                .filter(function(d) { return d === input.node(); }),
-            shown = !container.empty();
-
-        input
-            .classed('combobox-input', true)
-            .on('focus.typeahead', focus)
-            .on('blur.typeahead', blur)
-            .on('keydown.typeahead', keydown)
-            .on('keyup.typeahead', keyup)
-            .on('input.typeahead', change)
-            .each(function() {
-                var parent = this.parentNode,
-                    sibling = this.nextSibling;
-
-                var caret = d3.select(parent).selectAll('.combobox-caret')
-                    .filter(function(d) { return d === input.node(); })
-                    .data([input.node()]);
-
-                caret.enter().insert('div', function() { return sibling; })
-                    .attr('class', 'combobox-caret');
-
-                caret
-                    .on('mousedown', function () {
-                        // prevent the form element from blurring. it blurs
-                        // on mousedown
-                        d3.event.stopPropagation();
-                        d3.event.preventDefault();
-                        if (!shown) {
-                            input.node().focus();
-                            fetch('', render);
-                        } else {
-                            hide();
-                        }
-                    });
-            });
-
-        function focus() {
-            fetch(value(), render);
-        }
-
-        function blur() {
-            window.setTimeout(hide, 150);
-        }
-
-        function show() {
-            if (!shown) {
-                container = d3.select(document.body)
-                    .insert('div', ':first-child')
-                    .datum(input.node())
-                    .attr('class', 'combobox')
-                    .style({
-                        position: 'absolute',
-                        display: 'block',
-                        left: '0px'
-                    })
-                    .on('mousedown', function () {
-                        // prevent moving focus out of the text field
-                        d3.event.preventDefault();
-                    });
-
-                d3.select(document.body)
-                    .on('scroll.combobox', render, true);
-
-                shown = true;
-            }
-        }
-
-        function hide() {
-            if (shown) {
-                idx = -1;
-                container.remove();
-
-                d3.select(document.body)
-                    .on('scroll.combobox', null);
-
-                shown = false;
-            }
-        }
-
-        function keydown() {
-           switch (d3.event.keyCode) {
-               // backspace, delete
-               case 8:
-               case 46:
-                   input.on('input.typeahead', function() {
-                       idx = -1;
-                       render();
-                       var start = input.property('selectionStart');
-                       input.node().setSelectionRange(start, start);
-                       input.on('input.typeahead', change);
-                   });
-                   break;
-               // tab
-               case 9:
-                   container.selectAll('a.selected').each(event.accept);
-                   break;
-               // return
-               case 13:
-                   d3.event.preventDefault();
-                   break;
-               // up arrow
-               case 38:
-                   nav(-1);
-                   d3.event.preventDefault();
-                   break;
-               // down arrow
-               case 40:
-                   nav(+1);
-                   d3.event.preventDefault();
-                   break;
-           }
-           d3.event.stopPropagation();
-        }
-
-        function keyup() {
-            switch (d3.event.keyCode) {
-                // escape
-                case 27:
-                    hide();
-                    break;
-                // return
-                case 13:
-                    container.selectAll('a.selected').each(event.accept);
-                    hide();
-                    break;
-            }
-        }
-
-        function change() {
-            fetch(value(), function() {
-                autocomplete();
-                render();
-            });
-        }
-
-        function nav(dir) {
-            idx = Math.max(Math.min(idx + dir, suggestions.length - 1), 0);
-            input.property('value', suggestions[idx].value);
-            render();
-            ensureVisible();
-        }
-
-        function value() {
-            var value = input.property('value'),
-                start = input.property('selectionStart'),
-                end = input.property('selectionEnd');
-
-            if (start && end) {
-                value = value.substring(0, start);
-            }
-
-            return value;
-        }
-
-        function fetch(v, cb) {
-            fetcher.call(input, v, function(_) {
-                suggestions = _;
-                cb();
-            });
-        }
-
-        function autocomplete() {
-            var v = value();
-
-            idx = -1;
-
-            if (!v) return;
-
-            for (var i = 0; i < suggestions.length; i++) {
-                if (suggestions[i].value.toLowerCase().indexOf(v.toLowerCase()) === 0) {
-                    var completion = v + suggestions[i].value.substr(v.length);
-                    idx = i;
-                    input.property('value', completion);
-                    input.node().setSelectionRange(v.length, completion.length);
-                    return;
-                }
-            }
-        }
-
-        function render() {
-            if (suggestions.length >= minItems && document.activeElement === input.node()) {
-                show();
-            } else {
-                hide();
-                return;
-            }
-
-            var options = container
-                .selectAll('a.combobox-option')
-                .data(suggestions, function(d) { return d.value; });
-
-            options.enter().append('a')
-                .attr('class', 'combobox-option')
-                .text(function(d) { return d.value; });
-
-            options
-                .attr('title', function(d) { return d.title; })
-                .classed('selected', function(d, i) { return i == idx; })
-                .on('mouseover', select)
-                .on('click', accept)
-                .order();
-
-            options.exit()
-                .remove();
-
-            var rect = input.node().getBoundingClientRect();
-
-            container.style({
-                'left': rect.left + 'px',
-                'width': rect.width + 'px',
-                'top': rect.height + rect.top + 'px'
-            });
-        }
-
-        function select(d, i) {
-            idx = i;
-            render();
-        }
-
-        function ensureVisible() {
-            var node = container.selectAll('a.selected').node();
-            if (node) node.scrollIntoView();
-        }
-
-        function accept(d) {
-            if (!shown) return;
-            input
-                .property('value', d.value)
-                .trigger('change');
-            event.accept(d);
-            hide();
-        }
-    };
-
-    combobox.fetcher = function(_) {
-        if (!arguments.length) return fetcher;
-        fetcher = _;
-        return combobox;
-    };
-
-    combobox.data = function(_) {
-        if (!arguments.length) return data;
-        data = _;
-        return combobox;
-    };
-
-    combobox.minItems = function(_) {
-        if (!arguments.length) return minItems;
-        minItems = _;
-        return combobox;
-    };
-
-    return d3.rebind(combobox, event, 'on');
-};
-d3.geo.tile = function() {
-  var size = [960, 500],
-      scale = 256,
-      scaleExtent = [0, 20],
-      translate = [size[0] / 2, size[1] / 2],
-      zoomDelta = 0;
-
-  function bound(_) {
-      return Math.min(scaleExtent[1], Math.max(scaleExtent[0], _));
-  }
-
-  function tile() {
-    var z = Math.max(Math.log(scale) / Math.LN2 - 8, 0),
-        z0 = bound(Math.round(z + zoomDelta)),
-        k = Math.pow(2, z - z0 + 8),
-        origin = [(translate[0] - scale / 2) / k, (translate[1] - scale / 2) / k],
-        tiles = [],
-        cols = d3.range(Math.max(0, Math.floor(-origin[0])), Math.max(0, Math.ceil(size[0] / k - origin[0]))),
-        rows = d3.range(Math.max(0, Math.floor(-origin[1])), Math.max(0, Math.ceil(size[1] / k - origin[1])));
-
-    rows.forEach(function(y) {
-      cols.forEach(function(x) {
-        tiles.push([x, y, z0]);
-      });
-    });
-
-    tiles.translate = origin;
-    tiles.scale = k;
-
-    return tiles;
-  }
-
-  tile.scaleExtent = function(_) {
-    if (!arguments.length) return scaleExtent;
-    scaleExtent = _;
-    return tile;
-  };
-
-  tile.size = function(_) {
-    if (!arguments.length) return size;
-    size = _;
-    return tile;
-  };
-
-  tile.scale = function(_) {
-    if (!arguments.length) return scale;
-    scale = _;
-    return tile;
-  };
-
-  tile.translate = function(_) {
-    if (!arguments.length) return translate;
-    translate = _;
-    return tile;
-  };
-
-  tile.zoomDelta = function(_) {
-    if (!arguments.length) return zoomDelta;
-    zoomDelta = +_;
-    return tile;
-  };
-
-  return tile;
-};
-d3.jsonp = function (url, callback) {
-  function rand() {
-    var chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz',
-      c = '', i = -1;
-    while (++i < 15) c += chars.charAt(Math.floor(Math.random() * 52));
-    return c;
-  }
-
-  function create(url) {
-    var e = url.match(/callback=d3.jsonp.(\w+)/),
-      c = e ? e[1] : rand();
-    d3.jsonp[c] = function(data) {
-      callback(data);
-      delete d3.jsonp[c];
-      script.remove();
-    };
-    return 'd3.jsonp.' + c;
-  }
-
-  var cb = create(url),
-    script = d3.select('head')
-    .append('script')
-    .attr('type', 'text/javascript')
-    .attr('src', url.replace(/(\{|%7B)callback(\}|%7D)/, cb));
-};
-/*
- * This code is licensed under the MIT license.
- *
- * Copyright © 2013, iD authors.
- *
- * Portions copyright © 2011, Keith Cirkel
- * See https://github.com/keithamus/jwerty
- *
- */
-d3.keybinding = function(namespace) {
-    var bindings = [];
-
-    function matches(binding, event) {
-        for (var p in binding.event) {
-            if (event[p] != binding.event[p])
-                return false;
-        }
-
-        return (!binding.capture) === (event.eventPhase !== Event.CAPTURING_PHASE);
-    }
-
-    function capture() {
-        for (var i = 0; i < bindings.length; i++) {
-            var binding = bindings[i];
-            if (matches(binding, d3.event)) {
-                binding.callback();
-            }
-        }
-    }
-
-    function bubble() {
-        var tagName = d3.select(d3.event.target).node().tagName;
-        if (tagName == 'INPUT' || tagName == 'SELECT' || tagName == 'TEXTAREA') {
-            return;
-        }
-        capture();
-    }
-
-    function keybinding(selection) {
-        selection = selection || d3.select(document);
-        selection.on('keydown.capture' + namespace, capture, true);
-        selection.on('keydown.bubble' + namespace, bubble, false);
-        return keybinding;
-    }
-
-    keybinding.off = function(selection) {
-        selection = selection || d3.select(document);
-        selection.on('keydown.capture' + namespace, null);
-        selection.on('keydown.bubble' + namespace, null);
-        return keybinding;
-    };
-
-    keybinding.on = function(code, callback, capture) {
-        var binding = {
-            event: {
-                keyCode: 0,
-                shiftKey: false,
-                ctrlKey: false,
-                altKey: false,
-                metaKey: false
-            },
-            capture: capture,
-            callback: callback
-        };
-
-        code = code.toLowerCase().match(/(?:(?:[^+⇧⌃⌥⌘])+|[⇧⌃⌥⌘]|\+\+|^\+$)/g);
-
-        for (var i = 0; i < code.length; i++) {
-            // Normalise matching errors
-            if (code[i] === '++') code[i] = '+';
-
-            if (code[i] in d3.keybinding.modifierCodes) {
-                binding.event[d3.keybinding.modifierProperties[d3.keybinding.modifierCodes[code[i]]]] = true;
-            } else if (code[i] in d3.keybinding.keyCodes) {
-                binding.event.keyCode = d3.keybinding.keyCodes[code[i]];
-            }
-        }
-
-        bindings.push(binding);
-
-        return keybinding;
-    };
-
-    return keybinding;
-};
+(function () {
+
+       var commonjsGlobal = typeof globalThis !== 'undefined' ? globalThis : typeof window !== 'undefined' ? window : typeof global !== 'undefined' ? global : typeof self !== 'undefined' ? self : {};
+
+       var check = function (it) {
+         return it && it.Math == Math && it;
+       };
+
+       // https://github.com/zloirock/core-js/issues/86#issuecomment-115759028
+       var global$1o =
+         // eslint-disable-next-line es/no-global-this -- safe
+         check(typeof globalThis == 'object' && globalThis) ||
+         check(typeof window == 'object' && window) ||
+         // eslint-disable-next-line no-restricted-globals -- safe
+         check(typeof self == 'object' && self) ||
+         check(typeof commonjsGlobal == 'object' && commonjsGlobal) ||
+         // eslint-disable-next-line no-new-func -- fallback
+         (function () { return this; })() || Function('return this')();
+
+       var objectGetOwnPropertyDescriptor = {};
+
+       var fails$V = function (exec) {
+         try {
+           return !!exec();
+         } catch (error) {
+           return true;
+         }
+       };
+
+       var fails$U = fails$V;
+
+       // Detect IE8's incomplete defineProperty implementation
+       var descriptors = !fails$U(function () {
+         // eslint-disable-next-line es/no-object-defineproperty -- required for testing
+         return Object.defineProperty({}, 1, { get: function () { return 7; } })[1] != 7;
+       });
+
+       var fails$T = fails$V;
+
+       var functionBindNative = !fails$T(function () {
+         var test = (function () { /* empty */ }).bind();
+         // eslint-disable-next-line no-prototype-builtins -- safe
+         return typeof test != 'function' || test.hasOwnProperty('prototype');
+       });
+
+       var NATIVE_BIND$4 = functionBindNative;
+
+       var call$q = Function.prototype.call;
+
+       var functionCall = NATIVE_BIND$4 ? call$q.bind(call$q) : function () {
+         return call$q.apply(call$q, arguments);
+       };
+
+       var objectPropertyIsEnumerable = {};
+
+       var $propertyIsEnumerable$2 = {}.propertyIsEnumerable;
+       // eslint-disable-next-line es/no-object-getownpropertydescriptor -- safe
+       var getOwnPropertyDescriptor$5 = Object.getOwnPropertyDescriptor;
+
+       // Nashorn ~ JDK8 bug
+       var NASHORN_BUG = getOwnPropertyDescriptor$5 && !$propertyIsEnumerable$2.call({ 1: 2 }, 1);
+
+       // `Object.prototype.propertyIsEnumerable` method implementation
+       // https://tc39.es/ecma262/#sec-object.prototype.propertyisenumerable
+       objectPropertyIsEnumerable.f = NASHORN_BUG ? function propertyIsEnumerable(V) {
+         var descriptor = getOwnPropertyDescriptor$5(this, V);
+         return !!descriptor && descriptor.enumerable;
+       } : $propertyIsEnumerable$2;
+
+       var createPropertyDescriptor$7 = function (bitmap, value) {
+         return {
+           enumerable: !(bitmap & 1),
+           configurable: !(bitmap & 2),
+           writable: !(bitmap & 4),
+           value: value
+         };
+       };
+
+       var NATIVE_BIND$3 = functionBindNative;
+
+       var FunctionPrototype$3 = Function.prototype;
+       var bind$g = FunctionPrototype$3.bind;
+       var call$p = FunctionPrototype$3.call;
+       var uncurryThis$Y = NATIVE_BIND$3 && bind$g.bind(call$p, call$p);
+
+       var functionUncurryThis = NATIVE_BIND$3 ? function (fn) {
+         return fn && uncurryThis$Y(fn);
+       } : function (fn) {
+         return fn && function () {
+           return call$p.apply(fn, arguments);
+         };
+       };
+
+       var uncurryThis$X = functionUncurryThis;
+
+       var toString$n = uncurryThis$X({}.toString);
+       var stringSlice$c = uncurryThis$X(''.slice);
+
+       var classofRaw$1 = function (it) {
+         return stringSlice$c(toString$n(it), 8, -1);
+       };
+
+       var global$1n = global$1o;
+       var uncurryThis$W = functionUncurryThis;
+       var fails$S = fails$V;
+       var classof$e = classofRaw$1;
+
+       var Object$5 = global$1n.Object;
+       var split$4 = uncurryThis$W(''.split);
+
+       // fallback for non-array-like ES3 and non-enumerable old V8 strings
+       var indexedObject = fails$S(function () {
+         // throws an error in rhino, see https://github.com/mozilla/rhino/issues/346
+         // eslint-disable-next-line no-prototype-builtins -- safe
+         return !Object$5('z').propertyIsEnumerable(0);
+       }) ? function (it) {
+         return classof$e(it) == 'String' ? split$4(it, '') : Object$5(it);
+       } : Object$5;
+
+       var global$1m = global$1o;
+
+       var TypeError$p = global$1m.TypeError;
+
+       // `RequireObjectCoercible` abstract operation
+       // https://tc39.es/ecma262/#sec-requireobjectcoercible
+       var requireObjectCoercible$e = function (it) {
+         if (it == undefined) throw TypeError$p("Can't call method on " + it);
+         return it;
+       };
+
+       // toObject with fallback for non-array-like ES3 strings
+       var IndexedObject$4 = indexedObject;
+       var requireObjectCoercible$d = requireObjectCoercible$e;
+
+       var toIndexedObject$d = function (it) {
+         return IndexedObject$4(requireObjectCoercible$d(it));
+       };
+
+       // `IsCallable` abstract operation
+       // https://tc39.es/ecma262/#sec-iscallable
+       var isCallable$r = function (argument) {
+         return typeof argument == 'function';
+       };
+
+       var isCallable$q = isCallable$r;
+
+       var isObject$s = function (it) {
+         return typeof it == 'object' ? it !== null : isCallable$q(it);
+       };
+
+       var global$1l = global$1o;
+       var isCallable$p = isCallable$r;
+
+       var aFunction = function (argument) {
+         return isCallable$p(argument) ? argument : undefined;
+       };
+
+       var getBuiltIn$b = function (namespace, method) {
+         return arguments.length < 2 ? aFunction(global$1l[namespace]) : global$1l[namespace] && global$1l[namespace][method];
+       };
+
+       var uncurryThis$V = functionUncurryThis;
+
+       var objectIsPrototypeOf = uncurryThis$V({}.isPrototypeOf);
+
+       var getBuiltIn$a = getBuiltIn$b;
+
+       var engineUserAgent = getBuiltIn$a('navigator', 'userAgent') || '';
+
+       var global$1k = global$1o;
+       var userAgent$7 = engineUserAgent;
+
+       var process$4 = global$1k.process;
+       var Deno = global$1k.Deno;
+       var versions = process$4 && process$4.versions || Deno && Deno.version;
+       var v8 = versions && versions.v8;
+       var match, version$1;
+
+       if (v8) {
+         match = v8.split('.');
+         // in old Chrome, versions of V8 isn't V8 = Chrome / 10
+         // but their correct versions are not interesting for us
+         version$1 = match[0] > 0 && match[0] < 4 ? 1 : +(match[0] + match[1]);
+       }
+
+       // BrowserFS NodeJS `process` polyfill incorrectly set `.v8` to `0.0`
+       // so check `userAgent` even if `.v8` exists, but 0
+       if (!version$1 && userAgent$7) {
+         match = userAgent$7.match(/Edge\/(\d+)/);
+         if (!match || match[1] >= 74) {
+           match = userAgent$7.match(/Chrome\/(\d+)/);
+           if (match) version$1 = +match[1];
+         }
+       }
+
+       var engineV8Version = version$1;
+
+       /* eslint-disable es/no-symbol -- required for testing */
+
+       var V8_VERSION$3 = engineV8Version;
+       var fails$R = fails$V;
+
+       // eslint-disable-next-line es/no-object-getownpropertysymbols -- required for testing
+       var nativeSymbol = !!Object.getOwnPropertySymbols && !fails$R(function () {
+         var symbol = Symbol();
+         // Chrome 38 Symbol has incorrect toString conversion
+         // `get-own-property-symbols` polyfill symbols converted to object are not Symbol instances
+         return !String(symbol) || !(Object(symbol) instanceof Symbol) ||
+           // Chrome 38-40 symbols are not inherited from DOM collections prototypes to instances
+           !Symbol.sham && V8_VERSION$3 && V8_VERSION$3 < 41;
+       });
+
+       /* eslint-disable es/no-symbol -- required for testing */
+
+       var NATIVE_SYMBOL$3 = nativeSymbol;
+
+       var useSymbolAsUid = NATIVE_SYMBOL$3
+         && !Symbol.sham
+         && typeof Symbol.iterator == 'symbol';
+
+       var global$1j = global$1o;
+       var getBuiltIn$9 = getBuiltIn$b;
+       var isCallable$o = isCallable$r;
+       var isPrototypeOf$9 = objectIsPrototypeOf;
+       var USE_SYMBOL_AS_UID$1 = useSymbolAsUid;
+
+       var Object$4 = global$1j.Object;
+
+       var isSymbol$6 = USE_SYMBOL_AS_UID$1 ? function (it) {
+         return typeof it == 'symbol';
+       } : function (it) {
+         var $Symbol = getBuiltIn$9('Symbol');
+         return isCallable$o($Symbol) && isPrototypeOf$9($Symbol.prototype, Object$4(it));
+       };
+
+       var global$1i = global$1o;
+
+       var String$6 = global$1i.String;
+
+       var tryToString$5 = function (argument) {
+         try {
+           return String$6(argument);
+         } catch (error) {
+           return 'Object';
+         }
+       };
+
+       var global$1h = global$1o;
+       var isCallable$n = isCallable$r;
+       var tryToString$4 = tryToString$5;
+
+       var TypeError$o = global$1h.TypeError;
+
+       // `Assert: IsCallable(argument) is true`
+       var aCallable$a = function (argument) {
+         if (isCallable$n(argument)) return argument;
+         throw TypeError$o(tryToString$4(argument) + ' is not a function');
+       };
+
+       var aCallable$9 = aCallable$a;
+
+       // `GetMethod` abstract operation
+       // https://tc39.es/ecma262/#sec-getmethod
+       var getMethod$7 = function (V, P) {
+         var func = V[P];
+         return func == null ? undefined : aCallable$9(func);
+       };
+
+       var global$1g = global$1o;
+       var call$o = functionCall;
+       var isCallable$m = isCallable$r;
+       var isObject$r = isObject$s;
+
+       var TypeError$n = global$1g.TypeError;
+
+       // `OrdinaryToPrimitive` abstract operation
+       // https://tc39.es/ecma262/#sec-ordinarytoprimitive
+       var ordinaryToPrimitive$1 = function (input, pref) {
+         var fn, val;
+         if (pref === 'string' && isCallable$m(fn = input.toString) && !isObject$r(val = call$o(fn, input))) return val;
+         if (isCallable$m(fn = input.valueOf) && !isObject$r(val = call$o(fn, input))) return val;
+         if (pref !== 'string' && isCallable$m(fn = input.toString) && !isObject$r(val = call$o(fn, input))) return val;
+         throw TypeError$n("Can't convert object to primitive value");
+       };
+
+       var shared$5 = {exports: {}};
+
+       var isPure = false;
+
+       var global$1f = global$1o;
+
+       // eslint-disable-next-line es/no-object-defineproperty -- safe
+       var defineProperty$d = Object.defineProperty;
+
+       var setGlobal$3 = function (key, value) {
+         try {
+           defineProperty$d(global$1f, key, { value: value, configurable: true, writable: true });
+         } catch (error) {
+           global$1f[key] = value;
+         } return value;
+       };
+
+       var global$1e = global$1o;
+       var setGlobal$2 = setGlobal$3;
+
+       var SHARED = '__core-js_shared__';
+       var store$4 = global$1e[SHARED] || setGlobal$2(SHARED, {});
+
+       var sharedStore = store$4;
+
+       var store$3 = sharedStore;
+
+       (shared$5.exports = function (key, value) {
+         return store$3[key] || (store$3[key] = value !== undefined ? value : {});
+       })('versions', []).push({
+         version: '3.21.0',
+         mode: 'global',
+         copyright: '© 2014-2022 Denis Pushkarev (zloirock.ru)',
+         license: 'https://github.com/zloirock/core-js/blob/v3.21.0/LICENSE',
+         source: 'https://github.com/zloirock/core-js'
+       });
+
+       var global$1d = global$1o;
+       var requireObjectCoercible$c = requireObjectCoercible$e;
+
+       var Object$3 = global$1d.Object;
+
+       // `ToObject` abstract operation
+       // https://tc39.es/ecma262/#sec-toobject
+       var toObject$i = function (argument) {
+         return Object$3(requireObjectCoercible$c(argument));
+       };
+
+       var uncurryThis$U = functionUncurryThis;
+       var toObject$h = toObject$i;
+
+       var hasOwnProperty$3 = uncurryThis$U({}.hasOwnProperty);
+
+       // `HasOwnProperty` abstract operation
+       // https://tc39.es/ecma262/#sec-hasownproperty
+       var hasOwnProperty_1 = Object.hasOwn || function hasOwn(it, key) {
+         return hasOwnProperty$3(toObject$h(it), key);
+       };
+
+       var uncurryThis$T = functionUncurryThis;
+
+       var id$2 = 0;
+       var postfix = Math.random();
+       var toString$m = uncurryThis$T(1.0.toString);
+
+       var uid$5 = function (key) {
+         return 'Symbol(' + (key === undefined ? '' : key) + ')_' + toString$m(++id$2 + postfix, 36);
+       };
+
+       var global$1c = global$1o;
+       var shared$4 = shared$5.exports;
+       var hasOwn$l = hasOwnProperty_1;
+       var uid$4 = uid$5;
+       var NATIVE_SYMBOL$2 = nativeSymbol;
+       var USE_SYMBOL_AS_UID = useSymbolAsUid;
+
+       var WellKnownSymbolsStore$1 = shared$4('wks');
+       var Symbol$3 = global$1c.Symbol;
+       var symbolFor = Symbol$3 && Symbol$3['for'];
+       var createWellKnownSymbol = USE_SYMBOL_AS_UID ? Symbol$3 : Symbol$3 && Symbol$3.withoutSetter || uid$4;
+
+       var wellKnownSymbol$t = function (name) {
+         if (!hasOwn$l(WellKnownSymbolsStore$1, name) || !(NATIVE_SYMBOL$2 || typeof WellKnownSymbolsStore$1[name] == 'string')) {
+           var description = 'Symbol.' + name;
+           if (NATIVE_SYMBOL$2 && hasOwn$l(Symbol$3, name)) {
+             WellKnownSymbolsStore$1[name] = Symbol$3[name];
+           } else if (USE_SYMBOL_AS_UID && symbolFor) {
+             WellKnownSymbolsStore$1[name] = symbolFor(description);
+           } else {
+             WellKnownSymbolsStore$1[name] = createWellKnownSymbol(description);
+           }
+         } return WellKnownSymbolsStore$1[name];
+       };
+
+       var global$1b = global$1o;
+       var call$n = functionCall;
+       var isObject$q = isObject$s;
+       var isSymbol$5 = isSymbol$6;
+       var getMethod$6 = getMethod$7;
+       var ordinaryToPrimitive = ordinaryToPrimitive$1;
+       var wellKnownSymbol$s = wellKnownSymbol$t;
+
+       var TypeError$m = global$1b.TypeError;
+       var TO_PRIMITIVE$1 = wellKnownSymbol$s('toPrimitive');
+
+       // `ToPrimitive` abstract operation
+       // https://tc39.es/ecma262/#sec-toprimitive
+       var toPrimitive$3 = function (input, pref) {
+         if (!isObject$q(input) || isSymbol$5(input)) return input;
+         var exoticToPrim = getMethod$6(input, TO_PRIMITIVE$1);
+         var result;
+         if (exoticToPrim) {
+           if (pref === undefined) pref = 'default';
+           result = call$n(exoticToPrim, input, pref);
+           if (!isObject$q(result) || isSymbol$5(result)) return result;
+           throw TypeError$m("Can't convert object to primitive value");
+         }
+         if (pref === undefined) pref = 'number';
+         return ordinaryToPrimitive(input, pref);
+       };
+
+       var toPrimitive$2 = toPrimitive$3;
+       var isSymbol$4 = isSymbol$6;
+
+       // `ToPropertyKey` abstract operation
+       // https://tc39.es/ecma262/#sec-topropertykey
+       var toPropertyKey$5 = function (argument) {
+         var key = toPrimitive$2(argument, 'string');
+         return isSymbol$4(key) ? key : key + '';
+       };
+
+       var global$1a = global$1o;
+       var isObject$p = isObject$s;
+
+       var document$3 = global$1a.document;
+       // typeof document.createElement is 'object' in old IE
+       var EXISTS$1 = isObject$p(document$3) && isObject$p(document$3.createElement);
+
+       var documentCreateElement$2 = function (it) {
+         return EXISTS$1 ? document$3.createElement(it) : {};
+       };
+
+       var DESCRIPTORS$p = descriptors;
+       var fails$Q = fails$V;
+       var createElement$1 = documentCreateElement$2;
+
+       // Thanks to IE8 for its funny defineProperty
+       var ie8DomDefine = !DESCRIPTORS$p && !fails$Q(function () {
+         // eslint-disable-next-line es/no-object-defineproperty -- required for testing
+         return Object.defineProperty(createElement$1('div'), 'a', {
+           get: function () { return 7; }
+         }).a != 7;
+       });
+
+       var DESCRIPTORS$o = descriptors;
+       var call$m = functionCall;
+       var propertyIsEnumerableModule$2 = objectPropertyIsEnumerable;
+       var createPropertyDescriptor$6 = createPropertyDescriptor$7;
+       var toIndexedObject$c = toIndexedObject$d;
+       var toPropertyKey$4 = toPropertyKey$5;
+       var hasOwn$k = hasOwnProperty_1;
+       var IE8_DOM_DEFINE$1 = ie8DomDefine;
+
+       // eslint-disable-next-line es/no-object-getownpropertydescriptor -- safe
+       var $getOwnPropertyDescriptor$2 = Object.getOwnPropertyDescriptor;
+
+       // `Object.getOwnPropertyDescriptor` method
+       // https://tc39.es/ecma262/#sec-object.getownpropertydescriptor
+       objectGetOwnPropertyDescriptor.f = DESCRIPTORS$o ? $getOwnPropertyDescriptor$2 : function getOwnPropertyDescriptor(O, P) {
+         O = toIndexedObject$c(O);
+         P = toPropertyKey$4(P);
+         if (IE8_DOM_DEFINE$1) try {
+           return $getOwnPropertyDescriptor$2(O, P);
+         } catch (error) { /* empty */ }
+         if (hasOwn$k(O, P)) return createPropertyDescriptor$6(!call$m(propertyIsEnumerableModule$2.f, O, P), O[P]);
+       };
+
+       var objectDefineProperty = {};
+
+       var DESCRIPTORS$n = descriptors;
+       var fails$P = fails$V;
+
+       // V8 ~ Chrome 36-
+       // https://bugs.chromium.org/p/v8/issues/detail?id=3334
+       var v8PrototypeDefineBug = DESCRIPTORS$n && fails$P(function () {
+         // eslint-disable-next-line es/no-object-defineproperty -- required for testing
+         return Object.defineProperty(function () { /* empty */ }, 'prototype', {
+           value: 42,
+           writable: false
+         }).prototype != 42;
+       });
+
+       var global$19 = global$1o;
+       var isObject$o = isObject$s;
+
+       var String$5 = global$19.String;
+       var TypeError$l = global$19.TypeError;
+
+       // `Assert: Type(argument) is Object`
+       var anObject$n = function (argument) {
+         if (isObject$o(argument)) return argument;
+         throw TypeError$l(String$5(argument) + ' is not an object');
+       };
+
+       var global$18 = global$1o;
+       var DESCRIPTORS$m = descriptors;
+       var IE8_DOM_DEFINE = ie8DomDefine;
+       var V8_PROTOTYPE_DEFINE_BUG$1 = v8PrototypeDefineBug;
+       var anObject$m = anObject$n;
+       var toPropertyKey$3 = toPropertyKey$5;
+
+       var TypeError$k = global$18.TypeError;
+       // eslint-disable-next-line es/no-object-defineproperty -- safe
+       var $defineProperty$1 = Object.defineProperty;
+       // eslint-disable-next-line es/no-object-getownpropertydescriptor -- safe
+       var $getOwnPropertyDescriptor$1 = Object.getOwnPropertyDescriptor;
+       var ENUMERABLE = 'enumerable';
+       var CONFIGURABLE$1 = 'configurable';
+       var WRITABLE = 'writable';
+
+       // `Object.defineProperty` method
+       // https://tc39.es/ecma262/#sec-object.defineproperty
+       objectDefineProperty.f = DESCRIPTORS$m ? V8_PROTOTYPE_DEFINE_BUG$1 ? function defineProperty(O, P, Attributes) {
+         anObject$m(O);
+         P = toPropertyKey$3(P);
+         anObject$m(Attributes);
+         if (typeof O === 'function' && P === 'prototype' && 'value' in Attributes && WRITABLE in Attributes && !Attributes[WRITABLE]) {
+           var current = $getOwnPropertyDescriptor$1(O, P);
+           if (current && current[WRITABLE]) {
+             O[P] = Attributes.value;
+             Attributes = {
+               configurable: CONFIGURABLE$1 in Attributes ? Attributes[CONFIGURABLE$1] : current[CONFIGURABLE$1],
+               enumerable: ENUMERABLE in Attributes ? Attributes[ENUMERABLE] : current[ENUMERABLE],
+               writable: false
+             };
+           }
+         } return $defineProperty$1(O, P, Attributes);
+       } : $defineProperty$1 : function defineProperty(O, P, Attributes) {
+         anObject$m(O);
+         P = toPropertyKey$3(P);
+         anObject$m(Attributes);
+         if (IE8_DOM_DEFINE) try {
+           return $defineProperty$1(O, P, Attributes);
+         } catch (error) { /* empty */ }
+         if ('get' in Attributes || 'set' in Attributes) throw TypeError$k('Accessors not supported');
+         if ('value' in Attributes) O[P] = Attributes.value;
+         return O;
+       };
+
+       var DESCRIPTORS$l = descriptors;
+       var definePropertyModule$7 = objectDefineProperty;
+       var createPropertyDescriptor$5 = createPropertyDescriptor$7;
+
+       var createNonEnumerableProperty$b = DESCRIPTORS$l ? function (object, key, value) {
+         return definePropertyModule$7.f(object, key, createPropertyDescriptor$5(1, value));
+       } : function (object, key, value) {
+         object[key] = value;
+         return object;
+       };
+
+       var redefine$h = {exports: {}};
+
+       var uncurryThis$S = functionUncurryThis;
+       var isCallable$l = isCallable$r;
+       var store$2 = sharedStore;
+
+       var functionToString$1 = uncurryThis$S(Function.toString);
+
+       // this helper broken in `core-js@3.4.1-3.4.4`, so we can't use `shared` helper
+       if (!isCallable$l(store$2.inspectSource)) {
+         store$2.inspectSource = function (it) {
+           return functionToString$1(it);
+         };
+       }
+
+       var inspectSource$4 = store$2.inspectSource;
+
+       var global$17 = global$1o;
+       var isCallable$k = isCallable$r;
+       var inspectSource$3 = inspectSource$4;
+
+       var WeakMap$1 = global$17.WeakMap;
+
+       var nativeWeakMap = isCallable$k(WeakMap$1) && /native code/.test(inspectSource$3(WeakMap$1));
+
+       var shared$3 = shared$5.exports;
+       var uid$3 = uid$5;
+
+       var keys$3 = shared$3('keys');
+
+       var sharedKey$4 = function (key) {
+         return keys$3[key] || (keys$3[key] = uid$3(key));
+       };
+
+       var hiddenKeys$6 = {};
+
+       var NATIVE_WEAK_MAP = nativeWeakMap;
+       var global$16 = global$1o;
+       var uncurryThis$R = functionUncurryThis;
+       var isObject$n = isObject$s;
+       var createNonEnumerableProperty$a = createNonEnumerableProperty$b;
+       var hasOwn$j = hasOwnProperty_1;
+       var shared$2 = sharedStore;
+       var sharedKey$3 = sharedKey$4;
+       var hiddenKeys$5 = hiddenKeys$6;
+
+       var OBJECT_ALREADY_INITIALIZED = 'Object already initialized';
+       var TypeError$j = global$16.TypeError;
+       var WeakMap = global$16.WeakMap;
+       var set$4, get$5, has;
+
+       var enforce = function (it) {
+         return has(it) ? get$5(it) : set$4(it, {});
+       };
+
+       var getterFor = function (TYPE) {
+         return function (it) {
+           var state;
+           if (!isObject$n(it) || (state = get$5(it)).type !== TYPE) {
+             throw TypeError$j('Incompatible receiver, ' + TYPE + ' required');
+           } return state;
+         };
+       };
+
+       if (NATIVE_WEAK_MAP || shared$2.state) {
+         var store$1 = shared$2.state || (shared$2.state = new WeakMap());
+         var wmget = uncurryThis$R(store$1.get);
+         var wmhas = uncurryThis$R(store$1.has);
+         var wmset = uncurryThis$R(store$1.set);
+         set$4 = function (it, metadata) {
+           if (wmhas(store$1, it)) throw new TypeError$j(OBJECT_ALREADY_INITIALIZED);
+           metadata.facade = it;
+           wmset(store$1, it, metadata);
+           return metadata;
+         };
+         get$5 = function (it) {
+           return wmget(store$1, it) || {};
+         };
+         has = function (it) {
+           return wmhas(store$1, it);
+         };
+       } else {
+         var STATE = sharedKey$3('state');
+         hiddenKeys$5[STATE] = true;
+         set$4 = function (it, metadata) {
+           if (hasOwn$j(it, STATE)) throw new TypeError$j(OBJECT_ALREADY_INITIALIZED);
+           metadata.facade = it;
+           createNonEnumerableProperty$a(it, STATE, metadata);
+           return metadata;
+         };
+         get$5 = function (it) {
+           return hasOwn$j(it, STATE) ? it[STATE] : {};
+         };
+         has = function (it) {
+           return hasOwn$j(it, STATE);
+         };
+       }
+
+       var internalState = {
+         set: set$4,
+         get: get$5,
+         has: has,
+         enforce: enforce,
+         getterFor: getterFor
+       };
+
+       var DESCRIPTORS$k = descriptors;
+       var hasOwn$i = hasOwnProperty_1;
+
+       var FunctionPrototype$2 = Function.prototype;
+       // eslint-disable-next-line es/no-object-getownpropertydescriptor -- safe
+       var getDescriptor = DESCRIPTORS$k && Object.getOwnPropertyDescriptor;
+
+       var EXISTS = hasOwn$i(FunctionPrototype$2, 'name');
+       // additional protection from minified / mangled / dropped function names
+       var PROPER = EXISTS && (function something() { /* empty */ }).name === 'something';
+       var CONFIGURABLE = EXISTS && (!DESCRIPTORS$k || (DESCRIPTORS$k && getDescriptor(FunctionPrototype$2, 'name').configurable));
+
+       var functionName = {
+         EXISTS: EXISTS,
+         PROPER: PROPER,
+         CONFIGURABLE: CONFIGURABLE
+       };
+
+       var global$15 = global$1o;
+       var isCallable$j = isCallable$r;
+       var hasOwn$h = hasOwnProperty_1;
+       var createNonEnumerableProperty$9 = createNonEnumerableProperty$b;
+       var setGlobal$1 = setGlobal$3;
+       var inspectSource$2 = inspectSource$4;
+       var InternalStateModule$9 = internalState;
+       var CONFIGURABLE_FUNCTION_NAME$2 = functionName.CONFIGURABLE;
+
+       var getInternalState$7 = InternalStateModule$9.get;
+       var enforceInternalState$1 = InternalStateModule$9.enforce;
+       var TEMPLATE = String(String).split('String');
+
+       (redefine$h.exports = function (O, key, value, options) {
+         var unsafe = options ? !!options.unsafe : false;
+         var simple = options ? !!options.enumerable : false;
+         var noTargetGet = options ? !!options.noTargetGet : false;
+         var name = options && options.name !== undefined ? options.name : key;
+         var state;
+         if (isCallable$j(value)) {
+           if (String(name).slice(0, 7) === 'Symbol(') {
+             name = '[' + String(name).replace(/^Symbol\(([^)]*)\)/, '$1') + ']';
+           }
+           if (!hasOwn$h(value, 'name') || (CONFIGURABLE_FUNCTION_NAME$2 && value.name !== name)) {
+             createNonEnumerableProperty$9(value, 'name', name);
+           }
+           state = enforceInternalState$1(value);
+           if (!state.source) {
+             state.source = TEMPLATE.join(typeof name == 'string' ? name : '');
+           }
+         }
+         if (O === global$15) {
+           if (simple) O[key] = value;
+           else setGlobal$1(key, value);
+           return;
+         } else if (!unsafe) {
+           delete O[key];
+         } else if (!noTargetGet && O[key]) {
+           simple = true;
+         }
+         if (simple) O[key] = value;
+         else createNonEnumerableProperty$9(O, key, value);
+       // add fake Function#toString for correct work wrapped methods / constructors with methods like LoDash isNative
+       })(Function.prototype, 'toString', function toString() {
+         return isCallable$j(this) && getInternalState$7(this).source || inspectSource$2(this);
+       });
+
+       var objectGetOwnPropertyNames = {};
+
+       var ceil$1 = Math.ceil;
+       var floor$8 = Math.floor;
+
+       // `ToIntegerOrInfinity` abstract operation
+       // https://tc39.es/ecma262/#sec-tointegerorinfinity
+       var toIntegerOrInfinity$b = function (argument) {
+         var number = +argument;
+         // eslint-disable-next-line no-self-compare -- safe
+         return number !== number || number === 0 ? 0 : (number > 0 ? floor$8 : ceil$1)(number);
+       };
+
+       var toIntegerOrInfinity$a = toIntegerOrInfinity$b;
+
+       var max$5 = Math.max;
+       var min$9 = Math.min;
+
+       // Helper for a popular repeating case of the spec:
+       // Let integer be ? ToInteger(index).
+       // If integer < 0, let result be max((length + integer), 0); else let result be min(integer, length).
+       var toAbsoluteIndex$9 = function (index, length) {
+         var integer = toIntegerOrInfinity$a(index);
+         return integer < 0 ? max$5(integer + length, 0) : min$9(integer, length);
+       };
+
+       var toIntegerOrInfinity$9 = toIntegerOrInfinity$b;
+
+       var min$8 = Math.min;
+
+       // `ToLength` abstract operation
+       // https://tc39.es/ecma262/#sec-tolength
+       var toLength$c = function (argument) {
+         return argument > 0 ? min$8(toIntegerOrInfinity$9(argument), 0x1FFFFFFFFFFFFF) : 0; // 2 ** 53 - 1 == 9007199254740991
+       };
+
+       var toLength$b = toLength$c;
+
+       // `LengthOfArrayLike` abstract operation
+       // https://tc39.es/ecma262/#sec-lengthofarraylike
+       var lengthOfArrayLike$i = function (obj) {
+         return toLength$b(obj.length);
+       };
+
+       var toIndexedObject$b = toIndexedObject$d;
+       var toAbsoluteIndex$8 = toAbsoluteIndex$9;
+       var lengthOfArrayLike$h = lengthOfArrayLike$i;
+
+       // `Array.prototype.{ indexOf, includes }` methods implementation
+       var createMethod$6 = function (IS_INCLUDES) {
+         return function ($this, el, fromIndex) {
+           var O = toIndexedObject$b($this);
+           var length = lengthOfArrayLike$h(O);
+           var index = toAbsoluteIndex$8(fromIndex, length);
+           var value;
+           // Array#includes uses SameValueZero equality algorithm
+           // eslint-disable-next-line no-self-compare -- NaN check
+           if (IS_INCLUDES && el != el) while (length > index) {
+             value = O[index++];
+             // eslint-disable-next-line no-self-compare -- NaN check
+             if (value != value) return true;
+           // Array#indexOf ignores holes, Array#includes - not
+           } else for (;length > index; index++) {
+             if ((IS_INCLUDES || index in O) && O[index] === el) return IS_INCLUDES || index || 0;
+           } return !IS_INCLUDES && -1;
+         };
+       };
+
+       var arrayIncludes = {
+         // `Array.prototype.includes` method
+         // https://tc39.es/ecma262/#sec-array.prototype.includes
+         includes: createMethod$6(true),
+         // `Array.prototype.indexOf` method
+         // https://tc39.es/ecma262/#sec-array.prototype.indexof
+         indexOf: createMethod$6(false)
+       };
+
+       var uncurryThis$Q = functionUncurryThis;
+       var hasOwn$g = hasOwnProperty_1;
+       var toIndexedObject$a = toIndexedObject$d;
+       var indexOf$1 = arrayIncludes.indexOf;
+       var hiddenKeys$4 = hiddenKeys$6;
+
+       var push$a = uncurryThis$Q([].push);
+
+       var objectKeysInternal = function (object, names) {
+         var O = toIndexedObject$a(object);
+         var i = 0;
+         var result = [];
+         var key;
+         for (key in O) !hasOwn$g(hiddenKeys$4, key) && hasOwn$g(O, key) && push$a(result, key);
+         // Don't enum bug & hidden keys
+         while (names.length > i) if (hasOwn$g(O, key = names[i++])) {
+           ~indexOf$1(result, key) || push$a(result, key);
+         }
+         return result;
+       };
+
+       // IE8- don't enum bug keys
+       var enumBugKeys$3 = [
+         'constructor',
+         'hasOwnProperty',
+         'isPrototypeOf',
+         'propertyIsEnumerable',
+         'toLocaleString',
+         'toString',
+         'valueOf'
+       ];
+
+       var internalObjectKeys$1 = objectKeysInternal;
+       var enumBugKeys$2 = enumBugKeys$3;
+
+       var hiddenKeys$3 = enumBugKeys$2.concat('length', 'prototype');
+
+       // `Object.getOwnPropertyNames` method
+       // https://tc39.es/ecma262/#sec-object.getownpropertynames
+       // eslint-disable-next-line es/no-object-getownpropertynames -- safe
+       objectGetOwnPropertyNames.f = Object.getOwnPropertyNames || function getOwnPropertyNames(O) {
+         return internalObjectKeys$1(O, hiddenKeys$3);
+       };
+
+       var objectGetOwnPropertySymbols = {};
+
+       // eslint-disable-next-line es/no-object-getownpropertysymbols -- safe
+       objectGetOwnPropertySymbols.f = Object.getOwnPropertySymbols;
+
+       var getBuiltIn$8 = getBuiltIn$b;
+       var uncurryThis$P = functionUncurryThis;
+       var getOwnPropertyNamesModule$2 = objectGetOwnPropertyNames;
+       var getOwnPropertySymbolsModule$2 = objectGetOwnPropertySymbols;
+       var anObject$l = anObject$n;
+
+       var concat$3 = uncurryThis$P([].concat);
+
+       // all object keys, includes non-enumerable and symbols
+       var ownKeys$1 = getBuiltIn$8('Reflect', 'ownKeys') || function ownKeys(it) {
+         var keys = getOwnPropertyNamesModule$2.f(anObject$l(it));
+         var getOwnPropertySymbols = getOwnPropertySymbolsModule$2.f;
+         return getOwnPropertySymbols ? concat$3(keys, getOwnPropertySymbols(it)) : keys;
+       };
+
+       var hasOwn$f = hasOwnProperty_1;
+       var ownKeys = ownKeys$1;
+       var getOwnPropertyDescriptorModule$3 = objectGetOwnPropertyDescriptor;
+       var definePropertyModule$6 = objectDefineProperty;
+
+       var copyConstructorProperties$2 = function (target, source, exceptions) {
+         var keys = ownKeys(source);
+         var defineProperty = definePropertyModule$6.f;
+         var getOwnPropertyDescriptor = getOwnPropertyDescriptorModule$3.f;
+         for (var i = 0; i < keys.length; i++) {
+           var key = keys[i];
+           if (!hasOwn$f(target, key) && !(exceptions && hasOwn$f(exceptions, key))) {
+             defineProperty(target, key, getOwnPropertyDescriptor(source, key));
+           }
+         }
+       };
+
+       var fails$O = fails$V;
+       var isCallable$i = isCallable$r;
+
+       var replacement = /#|\.prototype\./;
+
+       var isForced$5 = function (feature, detection) {
+         var value = data[normalize$1(feature)];
+         return value == POLYFILL ? true
+           : value == NATIVE ? false
+           : isCallable$i(detection) ? fails$O(detection)
+           : !!detection;
+       };
+
+       var normalize$1 = isForced$5.normalize = function (string) {
+         return String(string).replace(replacement, '.').toLowerCase();
+       };
+
+       var data = isForced$5.data = {};
+       var NATIVE = isForced$5.NATIVE = 'N';
+       var POLYFILL = isForced$5.POLYFILL = 'P';
+
+       var isForced_1 = isForced$5;
+
+       var global$14 = global$1o;
+       var getOwnPropertyDescriptor$4 = objectGetOwnPropertyDescriptor.f;
+       var createNonEnumerableProperty$8 = createNonEnumerableProperty$b;
+       var redefine$g = redefine$h.exports;
+       var setGlobal = setGlobal$3;
+       var copyConstructorProperties$1 = copyConstructorProperties$2;
+       var isForced$4 = isForced_1;
+
+       /*
+         options.target      - name of the target object
+         options.global      - target is the global object
+         options.stat        - export as static methods of target
+         options.proto       - export as prototype methods of target
+         options.real        - real prototype method for the `pure` version
+         options.forced      - export even if the native feature is available
+         options.bind        - bind methods to the target, required for the `pure` version
+         options.wrap        - wrap constructors to preventing global pollution, required for the `pure` version
+         options.unsafe      - use the simple assignment of property instead of delete + defineProperty
+         options.sham        - add a flag to not completely full polyfills
+         options.enumerable  - export as enumerable property
+         options.noTargetGet - prevent calling a getter on target
+         options.name        - the .name of the function if it does not match the key
+       */
+       var _export = function (options, source) {
+         var TARGET = options.target;
+         var GLOBAL = options.global;
+         var STATIC = options.stat;
+         var FORCED, target, key, targetProperty, sourceProperty, descriptor;
+         if (GLOBAL) {
+           target = global$14;
+         } else if (STATIC) {
+           target = global$14[TARGET] || setGlobal(TARGET, {});
+         } else {
+           target = (global$14[TARGET] || {}).prototype;
+         }
+         if (target) for (key in source) {
+           sourceProperty = source[key];
+           if (options.noTargetGet) {
+             descriptor = getOwnPropertyDescriptor$4(target, key);
+             targetProperty = descriptor && descriptor.value;
+           } else targetProperty = target[key];
+           FORCED = isForced$4(GLOBAL ? key : TARGET + (STATIC ? '.' : '#') + key, options.forced);
+           // contained in target
+           if (!FORCED && targetProperty !== undefined) {
+             if (typeof sourceProperty == typeof targetProperty) continue;
+             copyConstructorProperties$1(sourceProperty, targetProperty);
+           }
+           // add a flag to not completely full polyfills
+           if (options.sham || (targetProperty && targetProperty.sham)) {
+             createNonEnumerableProperty$8(sourceProperty, 'sham', true);
+           }
+           // extend global
+           redefine$g(target, key, sourceProperty, options);
+         }
+       };
+
+       var $$1e = _export;
+       var global$13 = global$1o;
+       var uncurryThis$O = functionUncurryThis;
+
+       var Date$1 = global$13.Date;
+       var getTime$2 = uncurryThis$O(Date$1.prototype.getTime);
+
+       // `Date.now` method
+       // https://tc39.es/ecma262/#sec-date.now
+       $$1e({ target: 'Date', stat: true }, {
+         now: function now() {
+           return getTime$2(new Date$1());
+         }
+       });
+
+       var uncurryThis$N = functionUncurryThis;
+       var redefine$f = redefine$h.exports;
+
+       var DatePrototype$1 = Date.prototype;
+       var INVALID_DATE = 'Invalid Date';
+       var TO_STRING$1 = 'toString';
+       var un$DateToString = uncurryThis$N(DatePrototype$1[TO_STRING$1]);
+       var getTime$1 = uncurryThis$N(DatePrototype$1.getTime);
+
+       // `Date.prototype.toString` method
+       // https://tc39.es/ecma262/#sec-date.prototype.tostring
+       if (String(new Date(NaN)) != INVALID_DATE) {
+         redefine$f(DatePrototype$1, TO_STRING$1, function toString() {
+           var value = getTime$1(this);
+           // eslint-disable-next-line no-self-compare -- NaN check
+           return value === value ? un$DateToString(this) : INVALID_DATE;
+         });
+       }
+
+       function _typeof(obj) {
+         "@babel/helpers - typeof";
+
+         return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) {
+           return typeof obj;
+         } : function (obj) {
+           return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj;
+         }, _typeof(obj);
+       }
+
+       function _classCallCheck$1(instance, Constructor) {
+         if (!(instance instanceof Constructor)) {
+           throw new TypeError("Cannot call a class as a function");
+         }
+       }
+
+       function _defineProperties$1(target, props) {
+         for (var i = 0; i < props.length; i++) {
+           var descriptor = props[i];
+           descriptor.enumerable = descriptor.enumerable || false;
+           descriptor.configurable = true;
+           if ("value" in descriptor) descriptor.writable = true;
+           Object.defineProperty(target, descriptor.key, descriptor);
+         }
+       }
+
+       function _createClass$1(Constructor, protoProps, staticProps) {
+         if (protoProps) _defineProperties$1(Constructor.prototype, protoProps);
+         if (staticProps) _defineProperties$1(Constructor, staticProps);
+         Object.defineProperty(Constructor, "prototype", {
+           writable: false
+         });
+         return Constructor;
+       }
+
+       function _defineProperty(obj, key, value) {
+         if (key in obj) {
+           Object.defineProperty(obj, key, {
+             value: value,
+             enumerable: true,
+             configurable: true,
+             writable: true
+           });
+         } else {
+           obj[key] = value;
+         }
+
+         return obj;
+       }
+
+       function _slicedToArray(arr, i) {
+         return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest();
+       }
+
+       function _toConsumableArray(arr) {
+         return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread();
+       }
+
+       function _arrayWithoutHoles(arr) {
+         if (Array.isArray(arr)) return _arrayLikeToArray(arr);
+       }
+
+       function _arrayWithHoles(arr) {
+         if (Array.isArray(arr)) return arr;
+       }
+
+       function _iterableToArray(iter) {
+         if (typeof Symbol !== "undefined" && iter[Symbol.iterator] != null || iter["@@iterator"] != null) return Array.from(iter);
+       }
+
+       function _iterableToArrayLimit(arr, i) {
+         var _i = arr == null ? null : typeof Symbol !== "undefined" && arr[Symbol.iterator] || arr["@@iterator"];
+
+         if (_i == null) return;
+         var _arr = [];
+         var _n = true;
+         var _d = false;
+
+         var _s, _e;
+
+         try {
+           for (_i = _i.call(arr); !(_n = (_s = _i.next()).done); _n = true) {
+             _arr.push(_s.value);
+
+             if (i && _arr.length === i) break;
+           }
+         } catch (err) {
+           _d = true;
+           _e = err;
+         } finally {
+           try {
+             if (!_n && _i["return"] != null) _i["return"]();
+           } finally {
+             if (_d) throw _e;
+           }
+         }
+
+         return _arr;
+       }
+
+       function _unsupportedIterableToArray(o, minLen) {
+         if (!o) return;
+         if (typeof o === "string") return _arrayLikeToArray(o, minLen);
+         var n = Object.prototype.toString.call(o).slice(8, -1);
+         if (n === "Object" && o.constructor) n = o.constructor.name;
+         if (n === "Map" || n === "Set") return Array.from(o);
+         if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen);
+       }
+
+       function _arrayLikeToArray(arr, len) {
+         if (len == null || len > arr.length) len = arr.length;
+
+         for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i];
+
+         return arr2;
+       }
+
+       function _nonIterableSpread() {
+         throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");
+       }
+
+       function _nonIterableRest() {
+         throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");
+       }
+
+       function _createForOfIteratorHelper(o, allowArrayLike) {
+         var it = typeof Symbol !== "undefined" && o[Symbol.iterator] || o["@@iterator"];
+
+         if (!it) {
+           if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") {
+             if (it) o = it;
+             var i = 0;
+
+             var F = function () {};
+
+             return {
+               s: F,
+               n: function () {
+                 if (i >= o.length) return {
+                   done: true
+                 };
+                 return {
+                   done: false,
+                   value: o[i++]
+                 };
+               },
+               e: function (e) {
+                 throw e;
+               },
+               f: F
+             };
+           }
+
+           throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");
+         }
+
+         var normalCompletion = true,
+             didErr = false,
+             err;
+         return {
+           s: function () {
+             it = it.call(o);
+           },
+           n: function () {
+             var step = it.next();
+             normalCompletion = step.done;
+             return step;
+           },
+           e: function (e) {
+             didErr = true;
+             err = e;
+           },
+           f: function () {
+             try {
+               if (!normalCompletion && it.return != null) it.return();
+             } finally {
+               if (didErr) throw err;
+             }
+           }
+         };
+       }
+
+       var $$1d = _export;
+       var global$12 = global$1o;
+
+       // `globalThis` object
+       // https://tc39.es/ecma262/#sec-globalthis
+       $$1d({ global: true }, {
+         globalThis: global$12
+       });
+
+       var global$11 = global$1o;
+
+       var path$1 = global$11;
+
+       var wellKnownSymbolWrapped = {};
+
+       var wellKnownSymbol$r = wellKnownSymbol$t;
+
+       wellKnownSymbolWrapped.f = wellKnownSymbol$r;
+
+       var path = path$1;
+       var hasOwn$e = hasOwnProperty_1;
+       var wrappedWellKnownSymbolModule$1 = wellKnownSymbolWrapped;
+       var defineProperty$c = objectDefineProperty.f;
+
+       var defineWellKnownSymbol$4 = function (NAME) {
+         var Symbol = path.Symbol || (path.Symbol = {});
+         if (!hasOwn$e(Symbol, NAME)) defineProperty$c(Symbol, NAME, {
+           value: wrappedWellKnownSymbolModule$1.f(NAME)
+         });
+       };
+
+       var defineWellKnownSymbol$3 = defineWellKnownSymbol$4;
+
+       // `Symbol.iterator` well-known symbol
+       // https://tc39.es/ecma262/#sec-symbol.iterator
+       defineWellKnownSymbol$3('iterator');
+
+       var objectDefineProperties = {};
+
+       var internalObjectKeys = objectKeysInternal;
+       var enumBugKeys$1 = enumBugKeys$3;
+
+       // `Object.keys` method
+       // https://tc39.es/ecma262/#sec-object.keys
+       // eslint-disable-next-line es/no-object-keys -- safe
+       var objectKeys$4 = Object.keys || function keys(O) {
+         return internalObjectKeys(O, enumBugKeys$1);
+       };
+
+       var DESCRIPTORS$j = descriptors;
+       var V8_PROTOTYPE_DEFINE_BUG = v8PrototypeDefineBug;
+       var definePropertyModule$5 = objectDefineProperty;
+       var anObject$k = anObject$n;
+       var toIndexedObject$9 = toIndexedObject$d;
+       var objectKeys$3 = objectKeys$4;
+
+       // `Object.defineProperties` method
+       // https://tc39.es/ecma262/#sec-object.defineproperties
+       // eslint-disable-next-line es/no-object-defineproperties -- safe
+       objectDefineProperties.f = DESCRIPTORS$j && !V8_PROTOTYPE_DEFINE_BUG ? Object.defineProperties : function defineProperties(O, Properties) {
+         anObject$k(O);
+         var props = toIndexedObject$9(Properties);
+         var keys = objectKeys$3(Properties);
+         var length = keys.length;
+         var index = 0;
+         var key;
+         while (length > index) definePropertyModule$5.f(O, key = keys[index++], props[key]);
+         return O;
+       };
+
+       var getBuiltIn$7 = getBuiltIn$b;
+
+       var html$2 = getBuiltIn$7('document', 'documentElement');
+
+       /* global ActiveXObject -- old IE, WSH */
+
+       var anObject$j = anObject$n;
+       var definePropertiesModule$1 = objectDefineProperties;
+       var enumBugKeys = enumBugKeys$3;
+       var hiddenKeys$2 = hiddenKeys$6;
+       var html$1 = html$2;
+       var documentCreateElement$1 = documentCreateElement$2;
+       var sharedKey$2 = sharedKey$4;
+
+       var GT = '>';
+       var LT = '<';
+       var PROTOTYPE$2 = 'prototype';
+       var SCRIPT = 'script';
+       var IE_PROTO$1 = sharedKey$2('IE_PROTO');
+
+       var EmptyConstructor = function () { /* empty */ };
+
+       var scriptTag = function (content) {
+         return LT + SCRIPT + GT + content + LT + '/' + SCRIPT + GT;
+       };
+
+       // Create object with fake `null` prototype: use ActiveX Object with cleared prototype
+       var NullProtoObjectViaActiveX = function (activeXDocument) {
+         activeXDocument.write(scriptTag(''));
+         activeXDocument.close();
+         var temp = activeXDocument.parentWindow.Object;
+         activeXDocument = null; // avoid memory leak
+         return temp;
+       };
+
+       // Create object with fake `null` prototype: use iframe Object with cleared prototype
+       var NullProtoObjectViaIFrame = function () {
+         // Thrash, waste and sodomy: IE GC bug
+         var iframe = documentCreateElement$1('iframe');
+         var JS = 'java' + SCRIPT + ':';
+         var iframeDocument;
+         iframe.style.display = 'none';
+         html$1.appendChild(iframe);
+         // https://github.com/zloirock/core-js/issues/475
+         iframe.src = String(JS);
+         iframeDocument = iframe.contentWindow.document;
+         iframeDocument.open();
+         iframeDocument.write(scriptTag('document.F=Object'));
+         iframeDocument.close();
+         return iframeDocument.F;
+       };
+
+       // Check for document.domain and active x support
+       // No need to use active x approach when document.domain is not set
+       // see https://github.com/es-shims/es5-shim/issues/150
+       // variation of https://github.com/kitcambridge/es5-shim/commit/4f738ac066346
+       // avoid IE GC bug
+       var activeXDocument;
+       var NullProtoObject = function () {
+         try {
+           activeXDocument = new ActiveXObject('htmlfile');
+         } catch (error) { /* ignore */ }
+         NullProtoObject = typeof document != 'undefined'
+           ? document.domain && activeXDocument
+             ? NullProtoObjectViaActiveX(activeXDocument) // old IE
+             : NullProtoObjectViaIFrame()
+           : NullProtoObjectViaActiveX(activeXDocument); // WSH
+         var length = enumBugKeys.length;
+         while (length--) delete NullProtoObject[PROTOTYPE$2][enumBugKeys[length]];
+         return NullProtoObject();
+       };
+
+       hiddenKeys$2[IE_PROTO$1] = true;
+
+       // `Object.create` method
+       // https://tc39.es/ecma262/#sec-object.create
+       var objectCreate = Object.create || function create(O, Properties) {
+         var result;
+         if (O !== null) {
+           EmptyConstructor[PROTOTYPE$2] = anObject$j(O);
+           result = new EmptyConstructor();
+           EmptyConstructor[PROTOTYPE$2] = null;
+           // add "__proto__" for Object.getPrototypeOf polyfill
+           result[IE_PROTO$1] = O;
+         } else result = NullProtoObject();
+         return Properties === undefined ? result : definePropertiesModule$1.f(result, Properties);
+       };
+
+       var wellKnownSymbol$q = wellKnownSymbol$t;
+       var create$a = objectCreate;
+       var definePropertyModule$4 = objectDefineProperty;
+
+       var UNSCOPABLES = wellKnownSymbol$q('unscopables');
+       var ArrayPrototype$1 = Array.prototype;
+
+       // Array.prototype[@@unscopables]
+       // https://tc39.es/ecma262/#sec-array.prototype-@@unscopables
+       if (ArrayPrototype$1[UNSCOPABLES] == undefined) {
+         definePropertyModule$4.f(ArrayPrototype$1, UNSCOPABLES, {
+           configurable: true,
+           value: create$a(null)
+         });
+       }
+
+       // add a key to Array.prototype[@@unscopables]
+       var addToUnscopables$6 = function (key) {
+         ArrayPrototype$1[UNSCOPABLES][key] = true;
+       };
+
+       var iterators = {};
+
+       var fails$N = fails$V;
+
+       var correctPrototypeGetter = !fails$N(function () {
+         function F() { /* empty */ }
+         F.prototype.constructor = null;
+         // eslint-disable-next-line es/no-object-getprototypeof -- required for testing
+         return Object.getPrototypeOf(new F()) !== F.prototype;
+       });
+
+       var global$10 = global$1o;
+       var hasOwn$d = hasOwnProperty_1;
+       var isCallable$h = isCallable$r;
+       var toObject$g = toObject$i;
+       var sharedKey$1 = sharedKey$4;
+       var CORRECT_PROTOTYPE_GETTER$1 = correctPrototypeGetter;
+
+       var IE_PROTO = sharedKey$1('IE_PROTO');
+       var Object$2 = global$10.Object;
+       var ObjectPrototype$4 = Object$2.prototype;
+
+       // `Object.getPrototypeOf` method
+       // https://tc39.es/ecma262/#sec-object.getprototypeof
+       var objectGetPrototypeOf = CORRECT_PROTOTYPE_GETTER$1 ? Object$2.getPrototypeOf : function (O) {
+         var object = toObject$g(O);
+         if (hasOwn$d(object, IE_PROTO)) return object[IE_PROTO];
+         var constructor = object.constructor;
+         if (isCallable$h(constructor) && object instanceof constructor) {
+           return constructor.prototype;
+         } return object instanceof Object$2 ? ObjectPrototype$4 : null;
+       };
+
+       var fails$M = fails$V;
+       var isCallable$g = isCallable$r;
+       var getPrototypeOf$4 = objectGetPrototypeOf;
+       var redefine$e = redefine$h.exports;
+       var wellKnownSymbol$p = wellKnownSymbol$t;
+
+       var ITERATOR$a = wellKnownSymbol$p('iterator');
+       var BUGGY_SAFARI_ITERATORS$1 = false;
+
+       // `%IteratorPrototype%` object
+       // https://tc39.es/ecma262/#sec-%iteratorprototype%-object
+       var IteratorPrototype$2, PrototypeOfArrayIteratorPrototype, arrayIterator;
+
+       /* eslint-disable es/no-array-prototype-keys -- safe */
+       if ([].keys) {
+         arrayIterator = [].keys();
+         // Safari 8 has buggy iterators w/o `next`
+         if (!('next' in arrayIterator)) BUGGY_SAFARI_ITERATORS$1 = true;
+         else {
+           PrototypeOfArrayIteratorPrototype = getPrototypeOf$4(getPrototypeOf$4(arrayIterator));
+           if (PrototypeOfArrayIteratorPrototype !== Object.prototype) IteratorPrototype$2 = PrototypeOfArrayIteratorPrototype;
+         }
+       }
+
+       var NEW_ITERATOR_PROTOTYPE = IteratorPrototype$2 == undefined || fails$M(function () {
+         var test = {};
+         // FF44- legacy iterators case
+         return IteratorPrototype$2[ITERATOR$a].call(test) !== test;
+       });
+
+       if (NEW_ITERATOR_PROTOTYPE) IteratorPrototype$2 = {};
+
+       // `%IteratorPrototype%[@@iterator]()` method
+       // https://tc39.es/ecma262/#sec-%iteratorprototype%-@@iterator
+       if (!isCallable$g(IteratorPrototype$2[ITERATOR$a])) {
+         redefine$e(IteratorPrototype$2, ITERATOR$a, function () {
+           return this;
+         });
+       }
+
+       var iteratorsCore = {
+         IteratorPrototype: IteratorPrototype$2,
+         BUGGY_SAFARI_ITERATORS: BUGGY_SAFARI_ITERATORS$1
+       };
+
+       var defineProperty$b = objectDefineProperty.f;
+       var hasOwn$c = hasOwnProperty_1;
+       var wellKnownSymbol$o = wellKnownSymbol$t;
+
+       var TO_STRING_TAG$4 = wellKnownSymbol$o('toStringTag');
+
+       var setToStringTag$a = function (target, TAG, STATIC) {
+         if (target && !STATIC) target = target.prototype;
+         if (target && !hasOwn$c(target, TO_STRING_TAG$4)) {
+           defineProperty$b(target, TO_STRING_TAG$4, { configurable: true, value: TAG });
+         }
+       };
+
+       var IteratorPrototype$1 = iteratorsCore.IteratorPrototype;
+       var create$9 = objectCreate;
+       var createPropertyDescriptor$4 = createPropertyDescriptor$7;
+       var setToStringTag$9 = setToStringTag$a;
+       var Iterators$4 = iterators;
+
+       var returnThis$1 = function () { return this; };
+
+       var createIteratorConstructor$2 = function (IteratorConstructor, NAME, next, ENUMERABLE_NEXT) {
+         var TO_STRING_TAG = NAME + ' Iterator';
+         IteratorConstructor.prototype = create$9(IteratorPrototype$1, { next: createPropertyDescriptor$4(+!ENUMERABLE_NEXT, next) });
+         setToStringTag$9(IteratorConstructor, TO_STRING_TAG, false);
+         Iterators$4[TO_STRING_TAG] = returnThis$1;
+         return IteratorConstructor;
+       };
+
+       var global$$ = global$1o;
+       var isCallable$f = isCallable$r;
+
+       var String$4 = global$$.String;
+       var TypeError$i = global$$.TypeError;
+
+       var aPossiblePrototype$1 = function (argument) {
+         if (typeof argument == 'object' || isCallable$f(argument)) return argument;
+         throw TypeError$i("Can't set " + String$4(argument) + ' as a prototype');
+       };
+
+       /* eslint-disable no-proto -- safe */
+
+       var uncurryThis$M = functionUncurryThis;
+       var anObject$i = anObject$n;
+       var aPossiblePrototype = aPossiblePrototype$1;
+
+       // `Object.setPrototypeOf` method
+       // https://tc39.es/ecma262/#sec-object.setprototypeof
+       // Works with __proto__ only. Old v8 can't work with null proto objects.
+       // eslint-disable-next-line es/no-object-setprototypeof -- safe
+       var objectSetPrototypeOf = Object.setPrototypeOf || ('__proto__' in {} ? function () {
+         var CORRECT_SETTER = false;
+         var test = {};
+         var setter;
+         try {
+           // eslint-disable-next-line es/no-object-getownpropertydescriptor -- safe
+           setter = uncurryThis$M(Object.getOwnPropertyDescriptor(Object.prototype, '__proto__').set);
+           setter(test, []);
+           CORRECT_SETTER = test instanceof Array;
+         } catch (error) { /* empty */ }
+         return function setPrototypeOf(O, proto) {
+           anObject$i(O);
+           aPossiblePrototype(proto);
+           if (CORRECT_SETTER) setter(O, proto);
+           else O.__proto__ = proto;
+           return O;
+         };
+       }() : undefined);
+
+       var $$1c = _export;
+       var call$l = functionCall;
+       var FunctionName$1 = functionName;
+       var isCallable$e = isCallable$r;
+       var createIteratorConstructor$1 = createIteratorConstructor$2;
+       var getPrototypeOf$3 = objectGetPrototypeOf;
+       var setPrototypeOf$6 = objectSetPrototypeOf;
+       var setToStringTag$8 = setToStringTag$a;
+       var createNonEnumerableProperty$7 = createNonEnumerableProperty$b;
+       var redefine$d = redefine$h.exports;
+       var wellKnownSymbol$n = wellKnownSymbol$t;
+       var Iterators$3 = iterators;
+       var IteratorsCore = iteratorsCore;
+
+       var PROPER_FUNCTION_NAME$3 = FunctionName$1.PROPER;
+       var CONFIGURABLE_FUNCTION_NAME$1 = FunctionName$1.CONFIGURABLE;
+       var IteratorPrototype = IteratorsCore.IteratorPrototype;
+       var BUGGY_SAFARI_ITERATORS = IteratorsCore.BUGGY_SAFARI_ITERATORS;
+       var ITERATOR$9 = wellKnownSymbol$n('iterator');
+       var KEYS = 'keys';
+       var VALUES = 'values';
+       var ENTRIES = 'entries';
+
+       var returnThis = function () { return this; };
+
+       var defineIterator$3 = function (Iterable, NAME, IteratorConstructor, next, DEFAULT, IS_SET, FORCED) {
+         createIteratorConstructor$1(IteratorConstructor, NAME, next);
+
+         var getIterationMethod = function (KIND) {
+           if (KIND === DEFAULT && defaultIterator) return defaultIterator;
+           if (!BUGGY_SAFARI_ITERATORS && KIND in IterablePrototype) return IterablePrototype[KIND];
+           switch (KIND) {
+             case KEYS: return function keys() { return new IteratorConstructor(this, KIND); };
+             case VALUES: return function values() { return new IteratorConstructor(this, KIND); };
+             case ENTRIES: return function entries() { return new IteratorConstructor(this, KIND); };
+           } return function () { return new IteratorConstructor(this); };
+         };
+
+         var TO_STRING_TAG = NAME + ' Iterator';
+         var INCORRECT_VALUES_NAME = false;
+         var IterablePrototype = Iterable.prototype;
+         var nativeIterator = IterablePrototype[ITERATOR$9]
+           || IterablePrototype['@@iterator']
+           || DEFAULT && IterablePrototype[DEFAULT];
+         var defaultIterator = !BUGGY_SAFARI_ITERATORS && nativeIterator || getIterationMethod(DEFAULT);
+         var anyNativeIterator = NAME == 'Array' ? IterablePrototype.entries || nativeIterator : nativeIterator;
+         var CurrentIteratorPrototype, methods, KEY;
+
+         // fix native
+         if (anyNativeIterator) {
+           CurrentIteratorPrototype = getPrototypeOf$3(anyNativeIterator.call(new Iterable()));
+           if (CurrentIteratorPrototype !== Object.prototype && CurrentIteratorPrototype.next) {
+             if (getPrototypeOf$3(CurrentIteratorPrototype) !== IteratorPrototype) {
+               if (setPrototypeOf$6) {
+                 setPrototypeOf$6(CurrentIteratorPrototype, IteratorPrototype);
+               } else if (!isCallable$e(CurrentIteratorPrototype[ITERATOR$9])) {
+                 redefine$d(CurrentIteratorPrototype, ITERATOR$9, returnThis);
+               }
+             }
+             // Set @@toStringTag to native iterators
+             setToStringTag$8(CurrentIteratorPrototype, TO_STRING_TAG, true);
+           }
+         }
+
+         // fix Array.prototype.{ values, @@iterator }.name in V8 / FF
+         if (PROPER_FUNCTION_NAME$3 && DEFAULT == VALUES && nativeIterator && nativeIterator.name !== VALUES) {
+           if (CONFIGURABLE_FUNCTION_NAME$1) {
+             createNonEnumerableProperty$7(IterablePrototype, 'name', VALUES);
+           } else {
+             INCORRECT_VALUES_NAME = true;
+             defaultIterator = function values() { return call$l(nativeIterator, this); };
+           }
+         }
+
+         // export additional methods
+         if (DEFAULT) {
+           methods = {
+             values: getIterationMethod(VALUES),
+             keys: IS_SET ? defaultIterator : getIterationMethod(KEYS),
+             entries: getIterationMethod(ENTRIES)
+           };
+           if (FORCED) for (KEY in methods) {
+             if (BUGGY_SAFARI_ITERATORS || INCORRECT_VALUES_NAME || !(KEY in IterablePrototype)) {
+               redefine$d(IterablePrototype, KEY, methods[KEY]);
+             }
+           } else $$1c({ target: NAME, proto: true, forced: BUGGY_SAFARI_ITERATORS || INCORRECT_VALUES_NAME }, methods);
+         }
+
+         // define iterator
+         if (IterablePrototype[ITERATOR$9] !== defaultIterator) {
+           redefine$d(IterablePrototype, ITERATOR$9, defaultIterator, { name: DEFAULT });
+         }
+         Iterators$3[NAME] = defaultIterator;
+
+         return methods;
+       };
+
+       var toIndexedObject$8 = toIndexedObject$d;
+       var addToUnscopables$5 = addToUnscopables$6;
+       var Iterators$2 = iterators;
+       var InternalStateModule$8 = internalState;
+       var defineProperty$a = objectDefineProperty.f;
+       var defineIterator$2 = defineIterator$3;
+       var DESCRIPTORS$i = descriptors;
+
+       var ARRAY_ITERATOR = 'Array Iterator';
+       var setInternalState$8 = InternalStateModule$8.set;
+       var getInternalState$6 = InternalStateModule$8.getterFor(ARRAY_ITERATOR);
+
+       // `Array.prototype.entries` method
+       // https://tc39.es/ecma262/#sec-array.prototype.entries
+       // `Array.prototype.keys` method
+       // https://tc39.es/ecma262/#sec-array.prototype.keys
+       // `Array.prototype.values` method
+       // https://tc39.es/ecma262/#sec-array.prototype.values
+       // `Array.prototype[@@iterator]` method
+       // https://tc39.es/ecma262/#sec-array.prototype-@@iterator
+       // `CreateArrayIterator` internal method
+       // https://tc39.es/ecma262/#sec-createarrayiterator
+       var es_array_iterator = defineIterator$2(Array, 'Array', function (iterated, kind) {
+         setInternalState$8(this, {
+           type: ARRAY_ITERATOR,
+           target: toIndexedObject$8(iterated), // target
+           index: 0,                          // next index
+           kind: kind                         // kind
+         });
+       // `%ArrayIteratorPrototype%.next` method
+       // https://tc39.es/ecma262/#sec-%arrayiteratorprototype%.next
+       }, function () {
+         var state = getInternalState$6(this);
+         var target = state.target;
+         var kind = state.kind;
+         var index = state.index++;
+         if (!target || index >= target.length) {
+           state.target = undefined;
+           return { value: undefined, done: true };
+         }
+         if (kind == 'keys') return { value: index, done: false };
+         if (kind == 'values') return { value: target[index], done: false };
+         return { value: [index, target[index]], done: false };
+       }, 'values');
+
+       // argumentsList[@@iterator] is %ArrayProto_values%
+       // https://tc39.es/ecma262/#sec-createunmappedargumentsobject
+       // https://tc39.es/ecma262/#sec-createmappedargumentsobject
+       var values = Iterators$2.Arguments = Iterators$2.Array;
+
+       // https://tc39.es/ecma262/#sec-array.prototype-@@unscopables
+       addToUnscopables$5('keys');
+       addToUnscopables$5('values');
+       addToUnscopables$5('entries');
+
+       // V8 ~ Chrome 45- bug
+       if (DESCRIPTORS$i && values.name !== 'values') try {
+         defineProperty$a(values, 'name', { value: 'values' });
+       } catch (error) { /* empty */ }
+
+       var wellKnownSymbol$m = wellKnownSymbol$t;
+
+       var TO_STRING_TAG$3 = wellKnownSymbol$m('toStringTag');
+       var test$2 = {};
+
+       test$2[TO_STRING_TAG$3] = 'z';
+
+       var toStringTagSupport = String(test$2) === '[object z]';
+
+       var global$_ = global$1o;
+       var TO_STRING_TAG_SUPPORT$2 = toStringTagSupport;
+       var isCallable$d = isCallable$r;
+       var classofRaw = classofRaw$1;
+       var wellKnownSymbol$l = wellKnownSymbol$t;
+
+       var TO_STRING_TAG$2 = wellKnownSymbol$l('toStringTag');
+       var Object$1 = global$_.Object;
+
+       // ES3 wrong here
+       var CORRECT_ARGUMENTS = classofRaw(function () { return arguments; }()) == 'Arguments';
+
+       // fallback for IE11 Script Access Denied error
+       var tryGet = function (it, key) {
+         try {
+           return it[key];
+         } catch (error) { /* empty */ }
+       };
+
+       // getting tag from ES6+ `Object.prototype.toString`
+       var classof$d = TO_STRING_TAG_SUPPORT$2 ? classofRaw : function (it) {
+         var O, tag, result;
+         return it === undefined ? 'Undefined' : it === null ? 'Null'
+           // @@toStringTag case
+           : typeof (tag = tryGet(O = Object$1(it), TO_STRING_TAG$2)) == 'string' ? tag
+           // builtinTag case
+           : CORRECT_ARGUMENTS ? classofRaw(O)
+           // ES3 arguments fallback
+           : (result = classofRaw(O)) == 'Object' && isCallable$d(O.callee) ? 'Arguments' : result;
+       };
+
+       var TO_STRING_TAG_SUPPORT$1 = toStringTagSupport;
+       var classof$c = classof$d;
+
+       // `Object.prototype.toString` method implementation
+       // https://tc39.es/ecma262/#sec-object.prototype.tostring
+       var objectToString$1 = TO_STRING_TAG_SUPPORT$1 ? {}.toString : function toString() {
+         return '[object ' + classof$c(this) + ']';
+       };
+
+       var TO_STRING_TAG_SUPPORT = toStringTagSupport;
+       var redefine$c = redefine$h.exports;
+       var toString$l = objectToString$1;
+
+       // `Object.prototype.toString` method
+       // https://tc39.es/ecma262/#sec-object.prototype.tostring
+       if (!TO_STRING_TAG_SUPPORT) {
+         redefine$c(Object.prototype, 'toString', toString$l, { unsafe: true });
+       }
+
+       var global$Z = global$1o;
+       var classof$b = classof$d;
+
+       var String$3 = global$Z.String;
+
+       var toString$k = function (argument) {
+         if (classof$b(argument) === 'Symbol') throw TypeError('Cannot convert a Symbol value to a string');
+         return String$3(argument);
+       };
+
+       var uncurryThis$L = functionUncurryThis;
+       var toIntegerOrInfinity$8 = toIntegerOrInfinity$b;
+       var toString$j = toString$k;
+       var requireObjectCoercible$b = requireObjectCoercible$e;
+
+       var charAt$8 = uncurryThis$L(''.charAt);
+       var charCodeAt$2 = uncurryThis$L(''.charCodeAt);
+       var stringSlice$b = uncurryThis$L(''.slice);
+
+       var createMethod$5 = function (CONVERT_TO_STRING) {
+         return function ($this, pos) {
+           var S = toString$j(requireObjectCoercible$b($this));
+           var position = toIntegerOrInfinity$8(pos);
+           var size = S.length;
+           var first, second;
+           if (position < 0 || position >= size) return CONVERT_TO_STRING ? '' : undefined;
+           first = charCodeAt$2(S, position);
+           return first < 0xD800 || first > 0xDBFF || position + 1 === size
+             || (second = charCodeAt$2(S, position + 1)) < 0xDC00 || second > 0xDFFF
+               ? CONVERT_TO_STRING
+                 ? charAt$8(S, position)
+                 : first
+               : CONVERT_TO_STRING
+                 ? stringSlice$b(S, position, position + 2)
+                 : (first - 0xD800 << 10) + (second - 0xDC00) + 0x10000;
+         };
+       };
+
+       var stringMultibyte = {
+         // `String.prototype.codePointAt` method
+         // https://tc39.es/ecma262/#sec-string.prototype.codepointat
+         codeAt: createMethod$5(false),
+         // `String.prototype.at` method
+         // https://github.com/mathiasbynens/String.prototype.at
+         charAt: createMethod$5(true)
+       };
+
+       var charAt$7 = stringMultibyte.charAt;
+       var toString$i = toString$k;
+       var InternalStateModule$7 = internalState;
+       var defineIterator$1 = defineIterator$3;
+
+       var STRING_ITERATOR = 'String Iterator';
+       var setInternalState$7 = InternalStateModule$7.set;
+       var getInternalState$5 = InternalStateModule$7.getterFor(STRING_ITERATOR);
+
+       // `String.prototype[@@iterator]` method
+       // https://tc39.es/ecma262/#sec-string.prototype-@@iterator
+       defineIterator$1(String, 'String', function (iterated) {
+         setInternalState$7(this, {
+           type: STRING_ITERATOR,
+           string: toString$i(iterated),
+           index: 0
+         });
+       // `%StringIteratorPrototype%.next` method
+       // https://tc39.es/ecma262/#sec-%stringiteratorprototype%.next
+       }, function next() {
+         var state = getInternalState$5(this);
+         var string = state.string;
+         var index = state.index;
+         var point;
+         if (index >= string.length) return { value: undefined, done: true };
+         point = charAt$7(string, index);
+         state.index += point.length;
+         return { value: point, done: false };
+       });
+
+       // iterable DOM collections
+       // flag - `iterable` interface - 'entries', 'keys', 'values', 'forEach' methods
+       var domIterables = {
+         CSSRuleList: 0,
+         CSSStyleDeclaration: 0,
+         CSSValueList: 0,
+         ClientRectList: 0,
+         DOMRectList: 0,
+         DOMStringList: 0,
+         DOMTokenList: 1,
+         DataTransferItemList: 0,
+         FileList: 0,
+         HTMLAllCollection: 0,
+         HTMLCollection: 0,
+         HTMLFormElement: 0,
+         HTMLSelectElement: 0,
+         MediaList: 0,
+         MimeTypeArray: 0,
+         NamedNodeMap: 0,
+         NodeList: 1,
+         PaintRequestList: 0,
+         Plugin: 0,
+         PluginArray: 0,
+         SVGLengthList: 0,
+         SVGNumberList: 0,
+         SVGPathSegList: 0,
+         SVGPointList: 0,
+         SVGStringList: 0,
+         SVGTransformList: 0,
+         SourceBufferList: 0,
+         StyleSheetList: 0,
+         TextTrackCueList: 0,
+         TextTrackList: 0,
+         TouchList: 0
+       };
+
+       // in old WebKit versions, `element.classList` is not an instance of global `DOMTokenList`
+       var documentCreateElement = documentCreateElement$2;
+
+       var classList$1 = documentCreateElement('span').classList;
+       var DOMTokenListPrototype$2 = classList$1 && classList$1.constructor && classList$1.constructor.prototype;
+
+       var domTokenListPrototype = DOMTokenListPrototype$2 === Object.prototype ? undefined : DOMTokenListPrototype$2;
+
+       var global$Y = global$1o;
+       var DOMIterables$1 = domIterables;
+       var DOMTokenListPrototype$1 = domTokenListPrototype;
+       var ArrayIteratorMethods = es_array_iterator;
+       var createNonEnumerableProperty$6 = createNonEnumerableProperty$b;
+       var wellKnownSymbol$k = wellKnownSymbol$t;
+
+       var ITERATOR$8 = wellKnownSymbol$k('iterator');
+       var TO_STRING_TAG$1 = wellKnownSymbol$k('toStringTag');
+       var ArrayValues = ArrayIteratorMethods.values;
+
+       var handlePrototype$1 = function (CollectionPrototype, COLLECTION_NAME) {
+         if (CollectionPrototype) {
+           // some Chrome versions have non-configurable methods on DOMTokenList
+           if (CollectionPrototype[ITERATOR$8] !== ArrayValues) try {
+             createNonEnumerableProperty$6(CollectionPrototype, ITERATOR$8, ArrayValues);
+           } catch (error) {
+             CollectionPrototype[ITERATOR$8] = ArrayValues;
+           }
+           if (!CollectionPrototype[TO_STRING_TAG$1]) {
+             createNonEnumerableProperty$6(CollectionPrototype, TO_STRING_TAG$1, COLLECTION_NAME);
+           }
+           if (DOMIterables$1[COLLECTION_NAME]) for (var METHOD_NAME in ArrayIteratorMethods) {
+             // some Chrome versions have non-configurable methods on DOMTokenList
+             if (CollectionPrototype[METHOD_NAME] !== ArrayIteratorMethods[METHOD_NAME]) try {
+               createNonEnumerableProperty$6(CollectionPrototype, METHOD_NAME, ArrayIteratorMethods[METHOD_NAME]);
+             } catch (error) {
+               CollectionPrototype[METHOD_NAME] = ArrayIteratorMethods[METHOD_NAME];
+             }
+           }
+         }
+       };
+
+       for (var COLLECTION_NAME$1 in DOMIterables$1) {
+         handlePrototype$1(global$Y[COLLECTION_NAME$1] && global$Y[COLLECTION_NAME$1].prototype, COLLECTION_NAME$1);
+       }
+
+       handlePrototype$1(DOMTokenListPrototype$1, 'DOMTokenList');
+
+       var NATIVE_BIND$2 = functionBindNative;
+
+       var FunctionPrototype$1 = Function.prototype;
+       var apply$9 = FunctionPrototype$1.apply;
+       var call$k = FunctionPrototype$1.call;
+
+       // eslint-disable-next-line es/no-reflect -- safe
+       var functionApply = typeof Reflect == 'object' && Reflect.apply || (NATIVE_BIND$2 ? call$k.bind(apply$9) : function () {
+         return call$k.apply(apply$9, arguments);
+       });
+
+       var classof$a = classofRaw$1;
+
+       // `IsArray` abstract operation
+       // https://tc39.es/ecma262/#sec-isarray
+       // eslint-disable-next-line es/no-array-isarray -- safe
+       var isArray$8 = Array.isArray || function isArray(argument) {
+         return classof$a(argument) == 'Array';
+       };
+
+       var objectGetOwnPropertyNamesExternal = {};
+
+       var toPropertyKey$2 = toPropertyKey$5;
+       var definePropertyModule$3 = objectDefineProperty;
+       var createPropertyDescriptor$3 = createPropertyDescriptor$7;
+
+       var createProperty$5 = function (object, key, value) {
+         var propertyKey = toPropertyKey$2(key);
+         if (propertyKey in object) definePropertyModule$3.f(object, propertyKey, createPropertyDescriptor$3(0, value));
+         else object[propertyKey] = value;
+       };
+
+       var global$X = global$1o;
+       var toAbsoluteIndex$7 = toAbsoluteIndex$9;
+       var lengthOfArrayLike$g = lengthOfArrayLike$i;
+       var createProperty$4 = createProperty$5;
+
+       var Array$7 = global$X.Array;
+       var max$4 = Math.max;
+
+       var arraySliceSimple = function (O, start, end) {
+         var length = lengthOfArrayLike$g(O);
+         var k = toAbsoluteIndex$7(start, length);
+         var fin = toAbsoluteIndex$7(end === undefined ? length : end, length);
+         var result = Array$7(max$4(fin - k, 0));
+         for (var n = 0; k < fin; k++, n++) createProperty$4(result, n, O[k]);
+         result.length = n;
+         return result;
+       };
+
+       /* eslint-disable es/no-object-getownpropertynames -- safe */
+
+       var classof$9 = classofRaw$1;
+       var toIndexedObject$7 = toIndexedObject$d;
+       var $getOwnPropertyNames$1 = objectGetOwnPropertyNames.f;
+       var arraySlice$c = arraySliceSimple;
+
+       var windowNames = typeof window == 'object' && window && Object.getOwnPropertyNames
+         ? Object.getOwnPropertyNames(window) : [];
+
+       var getWindowNames = function (it) {
+         try {
+           return $getOwnPropertyNames$1(it);
+         } catch (error) {
+           return arraySlice$c(windowNames);
+         }
+       };
+
+       // fallback for IE11 buggy Object.getOwnPropertyNames with iframe and window
+       objectGetOwnPropertyNamesExternal.f = function getOwnPropertyNames(it) {
+         return windowNames && classof$9(it) == 'Window'
+           ? getWindowNames(it)
+           : $getOwnPropertyNames$1(toIndexedObject$7(it));
+       };
+
+       var uncurryThis$K = functionUncurryThis;
+
+       var arraySlice$b = uncurryThis$K([].slice);
+
+       var uncurryThis$J = functionUncurryThis;
+       var aCallable$8 = aCallable$a;
+       var NATIVE_BIND$1 = functionBindNative;
+
+       var bind$f = uncurryThis$J(uncurryThis$J.bind);
+
+       // optional / simple context binding
+       var functionBindContext = function (fn, that) {
+         aCallable$8(fn);
+         return that === undefined ? fn : NATIVE_BIND$1 ? bind$f(fn, that) : function (/* ...args */) {
+           return fn.apply(that, arguments);
+         };
+       };
+
+       var uncurryThis$I = functionUncurryThis;
+       var fails$L = fails$V;
+       var isCallable$c = isCallable$r;
+       var classof$8 = classof$d;
+       var getBuiltIn$6 = getBuiltIn$b;
+       var inspectSource$1 = inspectSource$4;
+
+       var noop$2 = function () { /* empty */ };
+       var empty$1 = [];
+       var construct$1 = getBuiltIn$6('Reflect', 'construct');
+       var constructorRegExp = /^\s*(?:class|function)\b/;
+       var exec$6 = uncurryThis$I(constructorRegExp.exec);
+       var INCORRECT_TO_STRING = !constructorRegExp.exec(noop$2);
+
+       var isConstructorModern = function isConstructor(argument) {
+         if (!isCallable$c(argument)) return false;
+         try {
+           construct$1(noop$2, empty$1, argument);
+           return true;
+         } catch (error) {
+           return false;
+         }
+       };
+
+       var isConstructorLegacy = function isConstructor(argument) {
+         if (!isCallable$c(argument)) return false;
+         switch (classof$8(argument)) {
+           case 'AsyncFunction':
+           case 'GeneratorFunction':
+           case 'AsyncGeneratorFunction': return false;
+         }
+         try {
+           // we can't check .prototype since constructors produced by .bind haven't it
+           // `Function#toString` throws on some built-it function in some legacy engines
+           // (for example, `DOMQuad` and similar in FF41-)
+           return INCORRECT_TO_STRING || !!exec$6(constructorRegExp, inspectSource$1(argument));
+         } catch (error) {
+           return true;
+         }
+       };
+
+       isConstructorLegacy.sham = true;
+
+       // `IsConstructor` abstract operation
+       // https://tc39.es/ecma262/#sec-isconstructor
+       var isConstructor$4 = !construct$1 || fails$L(function () {
+         var called;
+         return isConstructorModern(isConstructorModern.call)
+           || !isConstructorModern(Object)
+           || !isConstructorModern(function () { called = true; })
+           || called;
+       }) ? isConstructorLegacy : isConstructorModern;
+
+       var global$W = global$1o;
+       var isArray$7 = isArray$8;
+       var isConstructor$3 = isConstructor$4;
+       var isObject$m = isObject$s;
+       var wellKnownSymbol$j = wellKnownSymbol$t;
+
+       var SPECIES$6 = wellKnownSymbol$j('species');
+       var Array$6 = global$W.Array;
+
+       // a part of `ArraySpeciesCreate` abstract operation
+       // https://tc39.es/ecma262/#sec-arrayspeciescreate
+       var arraySpeciesConstructor$1 = function (originalArray) {
+         var C;
+         if (isArray$7(originalArray)) {
+           C = originalArray.constructor;
+           // cross-realm fallback
+           if (isConstructor$3(C) && (C === Array$6 || isArray$7(C.prototype))) C = undefined;
+           else if (isObject$m(C)) {
+             C = C[SPECIES$6];
+             if (C === null) C = undefined;
+           }
+         } return C === undefined ? Array$6 : C;
+       };
+
+       var arraySpeciesConstructor = arraySpeciesConstructor$1;
+
+       // `ArraySpeciesCreate` abstract operation
+       // https://tc39.es/ecma262/#sec-arrayspeciescreate
+       var arraySpeciesCreate$4 = function (originalArray, length) {
+         return new (arraySpeciesConstructor(originalArray))(length === 0 ? 0 : length);
+       };
+
+       var bind$e = functionBindContext;
+       var uncurryThis$H = functionUncurryThis;
+       var IndexedObject$3 = indexedObject;
+       var toObject$f = toObject$i;
+       var lengthOfArrayLike$f = lengthOfArrayLike$i;
+       var arraySpeciesCreate$3 = arraySpeciesCreate$4;
+
+       var push$9 = uncurryThis$H([].push);
+
+       // `Array.prototype.{ forEach, map, filter, some, every, find, findIndex, filterReject }` methods implementation
+       var createMethod$4 = function (TYPE) {
+         var IS_MAP = TYPE == 1;
+         var IS_FILTER = TYPE == 2;
+         var IS_SOME = TYPE == 3;
+         var IS_EVERY = TYPE == 4;
+         var IS_FIND_INDEX = TYPE == 6;
+         var IS_FILTER_REJECT = TYPE == 7;
+         var NO_HOLES = TYPE == 5 || IS_FIND_INDEX;
+         return function ($this, callbackfn, that, specificCreate) {
+           var O = toObject$f($this);
+           var self = IndexedObject$3(O);
+           var boundFunction = bind$e(callbackfn, that);
+           var length = lengthOfArrayLike$f(self);
+           var index = 0;
+           var create = specificCreate || arraySpeciesCreate$3;
+           var target = IS_MAP ? create($this, length) : IS_FILTER || IS_FILTER_REJECT ? create($this, 0) : undefined;
+           var value, result;
+           for (;length > index; index++) if (NO_HOLES || index in self) {
+             value = self[index];
+             result = boundFunction(value, index, O);
+             if (TYPE) {
+               if (IS_MAP) target[index] = result; // map
+               else if (result) switch (TYPE) {
+                 case 3: return true;              // some
+                 case 5: return value;             // find
+                 case 6: return index;             // findIndex
+                 case 2: push$9(target, value);      // filter
+               } else switch (TYPE) {
+                 case 4: return false;             // every
+                 case 7: push$9(target, value);      // filterReject
+               }
+             }
+           }
+           return IS_FIND_INDEX ? -1 : IS_SOME || IS_EVERY ? IS_EVERY : target;
+         };
+       };
+
+       var arrayIteration = {
+         // `Array.prototype.forEach` method
+         // https://tc39.es/ecma262/#sec-array.prototype.foreach
+         forEach: createMethod$4(0),
+         // `Array.prototype.map` method
+         // https://tc39.es/ecma262/#sec-array.prototype.map
+         map: createMethod$4(1),
+         // `Array.prototype.filter` method
+         // https://tc39.es/ecma262/#sec-array.prototype.filter
+         filter: createMethod$4(2),
+         // `Array.prototype.some` method
+         // https://tc39.es/ecma262/#sec-array.prototype.some
+         some: createMethod$4(3),
+         // `Array.prototype.every` method
+         // https://tc39.es/ecma262/#sec-array.prototype.every
+         every: createMethod$4(4),
+         // `Array.prototype.find` method
+         // https://tc39.es/ecma262/#sec-array.prototype.find
+         find: createMethod$4(5),
+         // `Array.prototype.findIndex` method
+         // https://tc39.es/ecma262/#sec-array.prototype.findIndex
+         findIndex: createMethod$4(6),
+         // `Array.prototype.filterReject` method
+         // https://github.com/tc39/proposal-array-filtering
+         filterReject: createMethod$4(7)
+       };
+
+       var $$1b = _export;
+       var global$V = global$1o;
+       var getBuiltIn$5 = getBuiltIn$b;
+       var apply$8 = functionApply;
+       var call$j = functionCall;
+       var uncurryThis$G = functionUncurryThis;
+       var DESCRIPTORS$h = descriptors;
+       var NATIVE_SYMBOL$1 = nativeSymbol;
+       var fails$K = fails$V;
+       var hasOwn$b = hasOwnProperty_1;
+       var isArray$6 = isArray$8;
+       var isCallable$b = isCallable$r;
+       var isObject$l = isObject$s;
+       var isPrototypeOf$8 = objectIsPrototypeOf;
+       var isSymbol$3 = isSymbol$6;
+       var anObject$h = anObject$n;
+       var toObject$e = toObject$i;
+       var toIndexedObject$6 = toIndexedObject$d;
+       var toPropertyKey$1 = toPropertyKey$5;
+       var $toString$3 = toString$k;
+       var createPropertyDescriptor$2 = createPropertyDescriptor$7;
+       var nativeObjectCreate = objectCreate;
+       var objectKeys$2 = objectKeys$4;
+       var getOwnPropertyNamesModule$1 = objectGetOwnPropertyNames;
+       var getOwnPropertyNamesExternal = objectGetOwnPropertyNamesExternal;
+       var getOwnPropertySymbolsModule$1 = objectGetOwnPropertySymbols;
+       var getOwnPropertyDescriptorModule$2 = objectGetOwnPropertyDescriptor;
+       var definePropertyModule$2 = objectDefineProperty;
+       var definePropertiesModule = objectDefineProperties;
+       var propertyIsEnumerableModule$1 = objectPropertyIsEnumerable;
+       var arraySlice$a = arraySlice$b;
+       var redefine$b = redefine$h.exports;
+       var shared$1 = shared$5.exports;
+       var sharedKey = sharedKey$4;
+       var hiddenKeys$1 = hiddenKeys$6;
+       var uid$2 = uid$5;
+       var wellKnownSymbol$i = wellKnownSymbol$t;
+       var wrappedWellKnownSymbolModule = wellKnownSymbolWrapped;
+       var defineWellKnownSymbol$2 = defineWellKnownSymbol$4;
+       var setToStringTag$7 = setToStringTag$a;
+       var InternalStateModule$6 = internalState;
+       var $forEach$2 = arrayIteration.forEach;
+
+       var HIDDEN = sharedKey('hidden');
+       var SYMBOL = 'Symbol';
+       var PROTOTYPE$1 = 'prototype';
+       var TO_PRIMITIVE = wellKnownSymbol$i('toPrimitive');
+
+       var setInternalState$6 = InternalStateModule$6.set;
+       var getInternalState$4 = InternalStateModule$6.getterFor(SYMBOL);
+
+       var ObjectPrototype$3 = Object[PROTOTYPE$1];
+       var $Symbol = global$V.Symbol;
+       var SymbolPrototype$1 = $Symbol && $Symbol[PROTOTYPE$1];
+       var TypeError$h = global$V.TypeError;
+       var QObject = global$V.QObject;
+       var $stringify = getBuiltIn$5('JSON', 'stringify');
+       var nativeGetOwnPropertyDescriptor$2 = getOwnPropertyDescriptorModule$2.f;
+       var nativeDefineProperty$1 = definePropertyModule$2.f;
+       var nativeGetOwnPropertyNames = getOwnPropertyNamesExternal.f;
+       var nativePropertyIsEnumerable = propertyIsEnumerableModule$1.f;
+       var push$8 = uncurryThis$G([].push);
+
+       var AllSymbols = shared$1('symbols');
+       var ObjectPrototypeSymbols = shared$1('op-symbols');
+       var StringToSymbolRegistry = shared$1('string-to-symbol-registry');
+       var SymbolToStringRegistry = shared$1('symbol-to-string-registry');
+       var WellKnownSymbolsStore = shared$1('wks');
+
+       // Don't use setters in Qt Script, https://github.com/zloirock/core-js/issues/173
+       var USE_SETTER = !QObject || !QObject[PROTOTYPE$1] || !QObject[PROTOTYPE$1].findChild;
+
+       // fallback for old Android, https://code.google.com/p/v8/issues/detail?id=687
+       var setSymbolDescriptor = DESCRIPTORS$h && fails$K(function () {
+         return nativeObjectCreate(nativeDefineProperty$1({}, 'a', {
+           get: function () { return nativeDefineProperty$1(this, 'a', { value: 7 }).a; }
+         })).a != 7;
+       }) ? function (O, P, Attributes) {
+         var ObjectPrototypeDescriptor = nativeGetOwnPropertyDescriptor$2(ObjectPrototype$3, P);
+         if (ObjectPrototypeDescriptor) delete ObjectPrototype$3[P];
+         nativeDefineProperty$1(O, P, Attributes);
+         if (ObjectPrototypeDescriptor && O !== ObjectPrototype$3) {
+           nativeDefineProperty$1(ObjectPrototype$3, P, ObjectPrototypeDescriptor);
+         }
+       } : nativeDefineProperty$1;
+
+       var wrap$2 = function (tag, description) {
+         var symbol = AllSymbols[tag] = nativeObjectCreate(SymbolPrototype$1);
+         setInternalState$6(symbol, {
+           type: SYMBOL,
+           tag: tag,
+           description: description
+         });
+         if (!DESCRIPTORS$h) symbol.description = description;
+         return symbol;
+       };
+
+       var $defineProperty = function defineProperty(O, P, Attributes) {
+         if (O === ObjectPrototype$3) $defineProperty(ObjectPrototypeSymbols, P, Attributes);
+         anObject$h(O);
+         var key = toPropertyKey$1(P);
+         anObject$h(Attributes);
+         if (hasOwn$b(AllSymbols, key)) {
+           if (!Attributes.enumerable) {
+             if (!hasOwn$b(O, HIDDEN)) nativeDefineProperty$1(O, HIDDEN, createPropertyDescriptor$2(1, {}));
+             O[HIDDEN][key] = true;
+           } else {
+             if (hasOwn$b(O, HIDDEN) && O[HIDDEN][key]) O[HIDDEN][key] = false;
+             Attributes = nativeObjectCreate(Attributes, { enumerable: createPropertyDescriptor$2(0, false) });
+           } return setSymbolDescriptor(O, key, Attributes);
+         } return nativeDefineProperty$1(O, key, Attributes);
+       };
+
+       var $defineProperties = function defineProperties(O, Properties) {
+         anObject$h(O);
+         var properties = toIndexedObject$6(Properties);
+         var keys = objectKeys$2(properties).concat($getOwnPropertySymbols(properties));
+         $forEach$2(keys, function (key) {
+           if (!DESCRIPTORS$h || call$j($propertyIsEnumerable$1, properties, key)) $defineProperty(O, key, properties[key]);
+         });
+         return O;
+       };
+
+       var $create = function create(O, Properties) {
+         return Properties === undefined ? nativeObjectCreate(O) : $defineProperties(nativeObjectCreate(O), Properties);
+       };
+
+       var $propertyIsEnumerable$1 = function propertyIsEnumerable(V) {
+         var P = toPropertyKey$1(V);
+         var enumerable = call$j(nativePropertyIsEnumerable, this, P);
+         if (this === ObjectPrototype$3 && hasOwn$b(AllSymbols, P) && !hasOwn$b(ObjectPrototypeSymbols, P)) return false;
+         return enumerable || !hasOwn$b(this, P) || !hasOwn$b(AllSymbols, P) || hasOwn$b(this, HIDDEN) && this[HIDDEN][P]
+           ? enumerable : true;
+       };
+
+       var $getOwnPropertyDescriptor = function getOwnPropertyDescriptor(O, P) {
+         var it = toIndexedObject$6(O);
+         var key = toPropertyKey$1(P);
+         if (it === ObjectPrototype$3 && hasOwn$b(AllSymbols, key) && !hasOwn$b(ObjectPrototypeSymbols, key)) return;
+         var descriptor = nativeGetOwnPropertyDescriptor$2(it, key);
+         if (descriptor && hasOwn$b(AllSymbols, key) && !(hasOwn$b(it, HIDDEN) && it[HIDDEN][key])) {
+           descriptor.enumerable = true;
+         }
+         return descriptor;
+       };
+
+       var $getOwnPropertyNames = function getOwnPropertyNames(O) {
+         var names = nativeGetOwnPropertyNames(toIndexedObject$6(O));
+         var result = [];
+         $forEach$2(names, function (key) {
+           if (!hasOwn$b(AllSymbols, key) && !hasOwn$b(hiddenKeys$1, key)) push$8(result, key);
+         });
+         return result;
+       };
+
+       var $getOwnPropertySymbols = function getOwnPropertySymbols(O) {
+         var IS_OBJECT_PROTOTYPE = O === ObjectPrototype$3;
+         var names = nativeGetOwnPropertyNames(IS_OBJECT_PROTOTYPE ? ObjectPrototypeSymbols : toIndexedObject$6(O));
+         var result = [];
+         $forEach$2(names, function (key) {
+           if (hasOwn$b(AllSymbols, key) && (!IS_OBJECT_PROTOTYPE || hasOwn$b(ObjectPrototype$3, key))) {
+             push$8(result, AllSymbols[key]);
+           }
+         });
+         return result;
+       };
+
+       // `Symbol` constructor
+       // https://tc39.es/ecma262/#sec-symbol-constructor
+       if (!NATIVE_SYMBOL$1) {
+         $Symbol = function Symbol() {
+           if (isPrototypeOf$8(SymbolPrototype$1, this)) throw TypeError$h('Symbol is not a constructor');
+           var description = !arguments.length || arguments[0] === undefined ? undefined : $toString$3(arguments[0]);
+           var tag = uid$2(description);
+           var setter = function (value) {
+             if (this === ObjectPrototype$3) call$j(setter, ObjectPrototypeSymbols, value);
+             if (hasOwn$b(this, HIDDEN) && hasOwn$b(this[HIDDEN], tag)) this[HIDDEN][tag] = false;
+             setSymbolDescriptor(this, tag, createPropertyDescriptor$2(1, value));
+           };
+           if (DESCRIPTORS$h && USE_SETTER) setSymbolDescriptor(ObjectPrototype$3, tag, { configurable: true, set: setter });
+           return wrap$2(tag, description);
+         };
+
+         SymbolPrototype$1 = $Symbol[PROTOTYPE$1];
+
+         redefine$b(SymbolPrototype$1, 'toString', function toString() {
+           return getInternalState$4(this).tag;
+         });
+
+         redefine$b($Symbol, 'withoutSetter', function (description) {
+           return wrap$2(uid$2(description), description);
+         });
+
+         propertyIsEnumerableModule$1.f = $propertyIsEnumerable$1;
+         definePropertyModule$2.f = $defineProperty;
+         definePropertiesModule.f = $defineProperties;
+         getOwnPropertyDescriptorModule$2.f = $getOwnPropertyDescriptor;
+         getOwnPropertyNamesModule$1.f = getOwnPropertyNamesExternal.f = $getOwnPropertyNames;
+         getOwnPropertySymbolsModule$1.f = $getOwnPropertySymbols;
+
+         wrappedWellKnownSymbolModule.f = function (name) {
+           return wrap$2(wellKnownSymbol$i(name), name);
+         };
+
+         if (DESCRIPTORS$h) {
+           // https://github.com/tc39/proposal-Symbol-description
+           nativeDefineProperty$1(SymbolPrototype$1, 'description', {
+             configurable: true,
+             get: function description() {
+               return getInternalState$4(this).description;
+             }
+           });
+           {
+             redefine$b(ObjectPrototype$3, 'propertyIsEnumerable', $propertyIsEnumerable$1, { unsafe: true });
+           }
+         }
+       }
+
+       $$1b({ global: true, wrap: true, forced: !NATIVE_SYMBOL$1, sham: !NATIVE_SYMBOL$1 }, {
+         Symbol: $Symbol
+       });
+
+       $forEach$2(objectKeys$2(WellKnownSymbolsStore), function (name) {
+         defineWellKnownSymbol$2(name);
+       });
+
+       $$1b({ target: SYMBOL, stat: true, forced: !NATIVE_SYMBOL$1 }, {
+         // `Symbol.for` method
+         // https://tc39.es/ecma262/#sec-symbol.for
+         'for': function (key) {
+           var string = $toString$3(key);
+           if (hasOwn$b(StringToSymbolRegistry, string)) return StringToSymbolRegistry[string];
+           var symbol = $Symbol(string);
+           StringToSymbolRegistry[string] = symbol;
+           SymbolToStringRegistry[symbol] = string;
+           return symbol;
+         },
+         // `Symbol.keyFor` method
+         // https://tc39.es/ecma262/#sec-symbol.keyfor
+         keyFor: function keyFor(sym) {
+           if (!isSymbol$3(sym)) throw TypeError$h(sym + ' is not a symbol');
+           if (hasOwn$b(SymbolToStringRegistry, sym)) return SymbolToStringRegistry[sym];
+         },
+         useSetter: function () { USE_SETTER = true; },
+         useSimple: function () { USE_SETTER = false; }
+       });
+
+       $$1b({ target: 'Object', stat: true, forced: !NATIVE_SYMBOL$1, sham: !DESCRIPTORS$h }, {
+         // `Object.create` method
+         // https://tc39.es/ecma262/#sec-object.create
+         create: $create,
+         // `Object.defineProperty` method
+         // https://tc39.es/ecma262/#sec-object.defineproperty
+         defineProperty: $defineProperty,
+         // `Object.defineProperties` method
+         // https://tc39.es/ecma262/#sec-object.defineproperties
+         defineProperties: $defineProperties,
+         // `Object.getOwnPropertyDescriptor` method
+         // https://tc39.es/ecma262/#sec-object.getownpropertydescriptors
+         getOwnPropertyDescriptor: $getOwnPropertyDescriptor
+       });
+
+       $$1b({ target: 'Object', stat: true, forced: !NATIVE_SYMBOL$1 }, {
+         // `Object.getOwnPropertyNames` method
+         // https://tc39.es/ecma262/#sec-object.getownpropertynames
+         getOwnPropertyNames: $getOwnPropertyNames,
+         // `Object.getOwnPropertySymbols` method
+         // https://tc39.es/ecma262/#sec-object.getownpropertysymbols
+         getOwnPropertySymbols: $getOwnPropertySymbols
+       });
+
+       // Chrome 38 and 39 `Object.getOwnPropertySymbols` fails on primitives
+       // https://bugs.chromium.org/p/v8/issues/detail?id=3443
+       $$1b({ target: 'Object', stat: true, forced: fails$K(function () { getOwnPropertySymbolsModule$1.f(1); }) }, {
+         getOwnPropertySymbols: function getOwnPropertySymbols(it) {
+           return getOwnPropertySymbolsModule$1.f(toObject$e(it));
+         }
+       });
+
+       // `JSON.stringify` method behavior with symbols
+       // https://tc39.es/ecma262/#sec-json.stringify
+       if ($stringify) {
+         var FORCED_JSON_STRINGIFY = !NATIVE_SYMBOL$1 || fails$K(function () {
+           var symbol = $Symbol();
+           // MS Edge converts symbol values to JSON as {}
+           return $stringify([symbol]) != '[null]'
+             // WebKit converts symbol values to JSON as null
+             || $stringify({ a: symbol }) != '{}'
+             // V8 throws on boxed symbols
+             || $stringify(Object(symbol)) != '{}';
+         });
+
+         $$1b({ target: 'JSON', stat: true, forced: FORCED_JSON_STRINGIFY }, {
+           // eslint-disable-next-line no-unused-vars -- required for `.length`
+           stringify: function stringify(it, replacer, space) {
+             var args = arraySlice$a(arguments);
+             var $replacer = replacer;
+             if (!isObject$l(replacer) && it === undefined || isSymbol$3(it)) return; // IE8 returns string on undefined
+             if (!isArray$6(replacer)) replacer = function (key, value) {
+               if (isCallable$b($replacer)) value = call$j($replacer, this, key, value);
+               if (!isSymbol$3(value)) return value;
+             };
+             args[1] = replacer;
+             return apply$8($stringify, null, args);
+           }
+         });
+       }
+
+       // `Symbol.prototype[@@toPrimitive]` method
+       // https://tc39.es/ecma262/#sec-symbol.prototype-@@toprimitive
+       if (!SymbolPrototype$1[TO_PRIMITIVE]) {
+         var valueOf = SymbolPrototype$1.valueOf;
+         // eslint-disable-next-line no-unused-vars -- required for .length
+         redefine$b(SymbolPrototype$1, TO_PRIMITIVE, function (hint) {
+           // TODO: improve hint logic
+           return call$j(valueOf, this);
+         });
+       }
+       // `Symbol.prototype[@@toStringTag]` property
+       // https://tc39.es/ecma262/#sec-symbol.prototype-@@tostringtag
+       setToStringTag$7($Symbol, SYMBOL);
+
+       hiddenKeys$1[HIDDEN] = true;
+
+       var $$1a = _export;
+       var DESCRIPTORS$g = descriptors;
+       var global$U = global$1o;
+       var uncurryThis$F = functionUncurryThis;
+       var hasOwn$a = hasOwnProperty_1;
+       var isCallable$a = isCallable$r;
+       var isPrototypeOf$7 = objectIsPrototypeOf;
+       var toString$h = toString$k;
+       var defineProperty$9 = objectDefineProperty.f;
+       var copyConstructorProperties = copyConstructorProperties$2;
+
+       var NativeSymbol = global$U.Symbol;
+       var SymbolPrototype = NativeSymbol && NativeSymbol.prototype;
+
+       if (DESCRIPTORS$g && isCallable$a(NativeSymbol) && (!('description' in SymbolPrototype) ||
+         // Safari 12 bug
+         NativeSymbol().description !== undefined
+       )) {
+         var EmptyStringDescriptionStore = {};
+         // wrap Symbol constructor for correct work with undefined description
+         var SymbolWrapper = function Symbol() {
+           var description = arguments.length < 1 || arguments[0] === undefined ? undefined : toString$h(arguments[0]);
+           var result = isPrototypeOf$7(SymbolPrototype, this)
+             ? new NativeSymbol(description)
+             // in Edge 13, String(Symbol(undefined)) === 'Symbol(undefined)'
+             : description === undefined ? NativeSymbol() : NativeSymbol(description);
+           if (description === '') EmptyStringDescriptionStore[result] = true;
+           return result;
+         };
+
+         copyConstructorProperties(SymbolWrapper, NativeSymbol);
+         SymbolWrapper.prototype = SymbolPrototype;
+         SymbolPrototype.constructor = SymbolWrapper;
+
+         var NATIVE_SYMBOL = String(NativeSymbol('test')) == 'Symbol(test)';
+         var symbolToString$1 = uncurryThis$F(SymbolPrototype.toString);
+         var symbolValueOf = uncurryThis$F(SymbolPrototype.valueOf);
+         var regexp = /^Symbol\((.*)\)[^)]+$/;
+         var replace$8 = uncurryThis$F(''.replace);
+         var stringSlice$a = uncurryThis$F(''.slice);
+
+         defineProperty$9(SymbolPrototype, 'description', {
+           configurable: true,
+           get: function description() {
+             var symbol = symbolValueOf(this);
+             var string = symbolToString$1(symbol);
+             if (hasOwn$a(EmptyStringDescriptionStore, symbol)) return '';
+             var desc = NATIVE_SYMBOL ? stringSlice$a(string, 7, -1) : replace$8(string, regexp, '$1');
+             return desc === '' ? undefined : desc;
+           }
+         });
+
+         $$1a({ global: true, forced: true }, {
+           Symbol: SymbolWrapper
+         });
+       }
+
+       // eslint-disable-next-line es/no-typed-arrays -- safe
+       var arrayBufferNative = typeof ArrayBuffer != 'undefined' && typeof DataView != 'undefined';
+
+       var redefine$a = redefine$h.exports;
+
+       var redefineAll$4 = function (target, src, options) {
+         for (var key in src) redefine$a(target, key, src[key], options);
+         return target;
+       };
+
+       var global$T = global$1o;
+       var isPrototypeOf$6 = objectIsPrototypeOf;
+
+       var TypeError$g = global$T.TypeError;
+
+       var anInstance$7 = function (it, Prototype) {
+         if (isPrototypeOf$6(Prototype, it)) return it;
+         throw TypeError$g('Incorrect invocation');
+       };
+
+       var global$S = global$1o;
+       var toIntegerOrInfinity$7 = toIntegerOrInfinity$b;
+       var toLength$a = toLength$c;
+
+       var RangeError$b = global$S.RangeError;
+
+       // `ToIndex` abstract operation
+       // https://tc39.es/ecma262/#sec-toindex
+       var toIndex$2 = function (it) {
+         if (it === undefined) return 0;
+         var number = toIntegerOrInfinity$7(it);
+         var length = toLength$a(number);
+         if (number !== length) throw RangeError$b('Wrong length or index');
+         return length;
+       };
+
+       // IEEE754 conversions based on https://github.com/feross/ieee754
+       var global$R = global$1o;
+
+       var Array$5 = global$R.Array;
+       var abs$4 = Math.abs;
+       var pow$2 = Math.pow;
+       var floor$7 = Math.floor;
+       var log$2 = Math.log;
+       var LN2 = Math.LN2;
+
+       var pack = function (number, mantissaLength, bytes) {
+         var buffer = Array$5(bytes);
+         var exponentLength = bytes * 8 - mantissaLength - 1;
+         var eMax = (1 << exponentLength) - 1;
+         var eBias = eMax >> 1;
+         var rt = mantissaLength === 23 ? pow$2(2, -24) - pow$2(2, -77) : 0;
+         var sign = number < 0 || number === 0 && 1 / number < 0 ? 1 : 0;
+         var index = 0;
+         var exponent, mantissa, c;
+         number = abs$4(number);
+         // eslint-disable-next-line no-self-compare -- NaN check
+         if (number != number || number === Infinity) {
+           // eslint-disable-next-line no-self-compare -- NaN check
+           mantissa = number != number ? 1 : 0;
+           exponent = eMax;
+         } else {
+           exponent = floor$7(log$2(number) / LN2);
+           c = pow$2(2, -exponent);
+           if (number * c < 1) {
+             exponent--;
+             c *= 2;
+           }
+           if (exponent + eBias >= 1) {
+             number += rt / c;
+           } else {
+             number += rt * pow$2(2, 1 - eBias);
+           }
+           if (number * c >= 2) {
+             exponent++;
+             c /= 2;
+           }
+           if (exponent + eBias >= eMax) {
+             mantissa = 0;
+             exponent = eMax;
+           } else if (exponent + eBias >= 1) {
+             mantissa = (number * c - 1) * pow$2(2, mantissaLength);
+             exponent = exponent + eBias;
+           } else {
+             mantissa = number * pow$2(2, eBias - 1) * pow$2(2, mantissaLength);
+             exponent = 0;
+           }
+         }
+         while (mantissaLength >= 8) {
+           buffer[index++] = mantissa & 255;
+           mantissa /= 256;
+           mantissaLength -= 8;
+         }
+         exponent = exponent << mantissaLength | mantissa;
+         exponentLength += mantissaLength;
+         while (exponentLength > 0) {
+           buffer[index++] = exponent & 255;
+           exponent /= 256;
+           exponentLength -= 8;
+         }
+         buffer[--index] |= sign * 128;
+         return buffer;
+       };
+
+       var unpack = function (buffer, mantissaLength) {
+         var bytes = buffer.length;
+         var exponentLength = bytes * 8 - mantissaLength - 1;
+         var eMax = (1 << exponentLength) - 1;
+         var eBias = eMax >> 1;
+         var nBits = exponentLength - 7;
+         var index = bytes - 1;
+         var sign = buffer[index--];
+         var exponent = sign & 127;
+         var mantissa;
+         sign >>= 7;
+         while (nBits > 0) {
+           exponent = exponent * 256 + buffer[index--];
+           nBits -= 8;
+         }
+         mantissa = exponent & (1 << -nBits) - 1;
+         exponent >>= -nBits;
+         nBits += mantissaLength;
+         while (nBits > 0) {
+           mantissa = mantissa * 256 + buffer[index--];
+           nBits -= 8;
+         }
+         if (exponent === 0) {
+           exponent = 1 - eBias;
+         } else if (exponent === eMax) {
+           return mantissa ? NaN : sign ? -Infinity : Infinity;
+         } else {
+           mantissa = mantissa + pow$2(2, mantissaLength);
+           exponent = exponent - eBias;
+         } return (sign ? -1 : 1) * mantissa * pow$2(2, exponent - mantissaLength);
+       };
+
+       var ieee754$2 = {
+         pack: pack,
+         unpack: unpack
+       };
+
+       var toObject$d = toObject$i;
+       var toAbsoluteIndex$6 = toAbsoluteIndex$9;
+       var lengthOfArrayLike$e = lengthOfArrayLike$i;
+
+       // `Array.prototype.fill` method implementation
+       // https://tc39.es/ecma262/#sec-array.prototype.fill
+       var arrayFill$1 = function fill(value /* , start = 0, end = @length */) {
+         var O = toObject$d(this);
+         var length = lengthOfArrayLike$e(O);
+         var argumentsLength = arguments.length;
+         var index = toAbsoluteIndex$6(argumentsLength > 1 ? arguments[1] : undefined, length);
+         var end = argumentsLength > 2 ? arguments[2] : undefined;
+         var endPos = end === undefined ? length : toAbsoluteIndex$6(end, length);
+         while (endPos > index) O[index++] = value;
+         return O;
+       };
+
+       var global$Q = global$1o;
+       var uncurryThis$E = functionUncurryThis;
+       var DESCRIPTORS$f = descriptors;
+       var NATIVE_ARRAY_BUFFER$2 = arrayBufferNative;
+       var FunctionName = functionName;
+       var createNonEnumerableProperty$5 = createNonEnumerableProperty$b;
+       var redefineAll$3 = redefineAll$4;
+       var fails$J = fails$V;
+       var anInstance$6 = anInstance$7;
+       var toIntegerOrInfinity$6 = toIntegerOrInfinity$b;
+       var toLength$9 = toLength$c;
+       var toIndex$1 = toIndex$2;
+       var IEEE754 = ieee754$2;
+       var getPrototypeOf$2 = objectGetPrototypeOf;
+       var setPrototypeOf$5 = objectSetPrototypeOf;
+       var getOwnPropertyNames$4 = objectGetOwnPropertyNames.f;
+       var defineProperty$8 = objectDefineProperty.f;
+       var arrayFill = arrayFill$1;
+       var arraySlice$9 = arraySliceSimple;
+       var setToStringTag$6 = setToStringTag$a;
+       var InternalStateModule$5 = internalState;
+
+       var PROPER_FUNCTION_NAME$2 = FunctionName.PROPER;
+       var CONFIGURABLE_FUNCTION_NAME = FunctionName.CONFIGURABLE;
+       var getInternalState$3 = InternalStateModule$5.get;
+       var setInternalState$5 = InternalStateModule$5.set;
+       var ARRAY_BUFFER$1 = 'ArrayBuffer';
+       var DATA_VIEW = 'DataView';
+       var PROTOTYPE = 'prototype';
+       var WRONG_LENGTH$1 = 'Wrong length';
+       var WRONG_INDEX = 'Wrong index';
+       var NativeArrayBuffer$1 = global$Q[ARRAY_BUFFER$1];
+       var $ArrayBuffer = NativeArrayBuffer$1;
+       var ArrayBufferPrototype$1 = $ArrayBuffer && $ArrayBuffer[PROTOTYPE];
+       var $DataView = global$Q[DATA_VIEW];
+       var DataViewPrototype$1 = $DataView && $DataView[PROTOTYPE];
+       var ObjectPrototype$2 = Object.prototype;
+       var Array$4 = global$Q.Array;
+       var RangeError$a = global$Q.RangeError;
+       var fill$1 = uncurryThis$E(arrayFill);
+       var reverse = uncurryThis$E([].reverse);
+
+       var packIEEE754 = IEEE754.pack;
+       var unpackIEEE754 = IEEE754.unpack;
+
+       var packInt8 = function (number) {
+         return [number & 0xFF];
+       };
+
+       var packInt16 = function (number) {
+         return [number & 0xFF, number >> 8 & 0xFF];
+       };
+
+       var packInt32 = function (number) {
+         return [number & 0xFF, number >> 8 & 0xFF, number >> 16 & 0xFF, number >> 24 & 0xFF];
+       };
+
+       var unpackInt32 = function (buffer) {
+         return buffer[3] << 24 | buffer[2] << 16 | buffer[1] << 8 | buffer[0];
+       };
+
+       var packFloat32 = function (number) {
+         return packIEEE754(number, 23, 4);
+       };
+
+       var packFloat64 = function (number) {
+         return packIEEE754(number, 52, 8);
+       };
+
+       var addGetter$1 = function (Constructor, key) {
+         defineProperty$8(Constructor[PROTOTYPE], key, { get: function () { return getInternalState$3(this)[key]; } });
+       };
+
+       var get$4 = function (view, count, index, isLittleEndian) {
+         var intIndex = toIndex$1(index);
+         var store = getInternalState$3(view);
+         if (intIndex + count > store.byteLength) throw RangeError$a(WRONG_INDEX);
+         var bytes = getInternalState$3(store.buffer).bytes;
+         var start = intIndex + store.byteOffset;
+         var pack = arraySlice$9(bytes, start, start + count);
+         return isLittleEndian ? pack : reverse(pack);
+       };
+
+       var set$3 = function (view, count, index, conversion, value, isLittleEndian) {
+         var intIndex = toIndex$1(index);
+         var store = getInternalState$3(view);
+         if (intIndex + count > store.byteLength) throw RangeError$a(WRONG_INDEX);
+         var bytes = getInternalState$3(store.buffer).bytes;
+         var start = intIndex + store.byteOffset;
+         var pack = conversion(+value);
+         for (var i = 0; i < count; i++) bytes[start + i] = pack[isLittleEndian ? i : count - i - 1];
+       };
+
+       if (!NATIVE_ARRAY_BUFFER$2) {
+         $ArrayBuffer = function ArrayBuffer(length) {
+           anInstance$6(this, ArrayBufferPrototype$1);
+           var byteLength = toIndex$1(length);
+           setInternalState$5(this, {
+             bytes: fill$1(Array$4(byteLength), 0),
+             byteLength: byteLength
+           });
+           if (!DESCRIPTORS$f) this.byteLength = byteLength;
+         };
+
+         ArrayBufferPrototype$1 = $ArrayBuffer[PROTOTYPE];
+
+         $DataView = function DataView(buffer, byteOffset, byteLength) {
+           anInstance$6(this, DataViewPrototype$1);
+           anInstance$6(buffer, ArrayBufferPrototype$1);
+           var bufferLength = getInternalState$3(buffer).byteLength;
+           var offset = toIntegerOrInfinity$6(byteOffset);
+           if (offset < 0 || offset > bufferLength) throw RangeError$a('Wrong offset');
+           byteLength = byteLength === undefined ? bufferLength - offset : toLength$9(byteLength);
+           if (offset + byteLength > bufferLength) throw RangeError$a(WRONG_LENGTH$1);
+           setInternalState$5(this, {
+             buffer: buffer,
+             byteLength: byteLength,
+             byteOffset: offset
+           });
+           if (!DESCRIPTORS$f) {
+             this.buffer = buffer;
+             this.byteLength = byteLength;
+             this.byteOffset = offset;
+           }
+         };
+
+         DataViewPrototype$1 = $DataView[PROTOTYPE];
+
+         if (DESCRIPTORS$f) {
+           addGetter$1($ArrayBuffer, 'byteLength');
+           addGetter$1($DataView, 'buffer');
+           addGetter$1($DataView, 'byteLength');
+           addGetter$1($DataView, 'byteOffset');
+         }
+
+         redefineAll$3(DataViewPrototype$1, {
+           getInt8: function getInt8(byteOffset) {
+             return get$4(this, 1, byteOffset)[0] << 24 >> 24;
+           },
+           getUint8: function getUint8(byteOffset) {
+             return get$4(this, 1, byteOffset)[0];
+           },
+           getInt16: function getInt16(byteOffset /* , littleEndian */) {
+             var bytes = get$4(this, 2, byteOffset, arguments.length > 1 ? arguments[1] : undefined);
+             return (bytes[1] << 8 | bytes[0]) << 16 >> 16;
+           },
+           getUint16: function getUint16(byteOffset /* , littleEndian */) {
+             var bytes = get$4(this, 2, byteOffset, arguments.length > 1 ? arguments[1] : undefined);
+             return bytes[1] << 8 | bytes[0];
+           },
+           getInt32: function getInt32(byteOffset /* , littleEndian */) {
+             return unpackInt32(get$4(this, 4, byteOffset, arguments.length > 1 ? arguments[1] : undefined));
+           },
+           getUint32: function getUint32(byteOffset /* , littleEndian */) {
+             return unpackInt32(get$4(this, 4, byteOffset, arguments.length > 1 ? arguments[1] : undefined)) >>> 0;
+           },
+           getFloat32: function getFloat32(byteOffset /* , littleEndian */) {
+             return unpackIEEE754(get$4(this, 4, byteOffset, arguments.length > 1 ? arguments[1] : undefined), 23);
+           },
+           getFloat64: function getFloat64(byteOffset /* , littleEndian */) {
+             return unpackIEEE754(get$4(this, 8, byteOffset, arguments.length > 1 ? arguments[1] : undefined), 52);
+           },
+           setInt8: function setInt8(byteOffset, value) {
+             set$3(this, 1, byteOffset, packInt8, value);
+           },
+           setUint8: function setUint8(byteOffset, value) {
+             set$3(this, 1, byteOffset, packInt8, value);
+           },
+           setInt16: function setInt16(byteOffset, value /* , littleEndian */) {
+             set$3(this, 2, byteOffset, packInt16, value, arguments.length > 2 ? arguments[2] : undefined);
+           },
+           setUint16: function setUint16(byteOffset, value /* , littleEndian */) {
+             set$3(this, 2, byteOffset, packInt16, value, arguments.length > 2 ? arguments[2] : undefined);
+           },
+           setInt32: function setInt32(byteOffset, value /* , littleEndian */) {
+             set$3(this, 4, byteOffset, packInt32, value, arguments.length > 2 ? arguments[2] : undefined);
+           },
+           setUint32: function setUint32(byteOffset, value /* , littleEndian */) {
+             set$3(this, 4, byteOffset, packInt32, value, arguments.length > 2 ? arguments[2] : undefined);
+           },
+           setFloat32: function setFloat32(byteOffset, value /* , littleEndian */) {
+             set$3(this, 4, byteOffset, packFloat32, value, arguments.length > 2 ? arguments[2] : undefined);
+           },
+           setFloat64: function setFloat64(byteOffset, value /* , littleEndian */) {
+             set$3(this, 8, byteOffset, packFloat64, value, arguments.length > 2 ? arguments[2] : undefined);
+           }
+         });
+       } else {
+         var INCORRECT_ARRAY_BUFFER_NAME = PROPER_FUNCTION_NAME$2 && NativeArrayBuffer$1.name !== ARRAY_BUFFER$1;
+         /* eslint-disable no-new -- required for testing */
+         if (!fails$J(function () {
+           NativeArrayBuffer$1(1);
+         }) || !fails$J(function () {
+           new NativeArrayBuffer$1(-1);
+         }) || fails$J(function () {
+           new NativeArrayBuffer$1();
+           new NativeArrayBuffer$1(1.5);
+           new NativeArrayBuffer$1(NaN);
+           return INCORRECT_ARRAY_BUFFER_NAME && !CONFIGURABLE_FUNCTION_NAME;
+         })) {
+         /* eslint-enable no-new -- required for testing */
+           $ArrayBuffer = function ArrayBuffer(length) {
+             anInstance$6(this, ArrayBufferPrototype$1);
+             return new NativeArrayBuffer$1(toIndex$1(length));
+           };
+
+           $ArrayBuffer[PROTOTYPE] = ArrayBufferPrototype$1;
+
+           for (var keys$2 = getOwnPropertyNames$4(NativeArrayBuffer$1), j$2 = 0, key$1; keys$2.length > j$2;) {
+             if (!((key$1 = keys$2[j$2++]) in $ArrayBuffer)) {
+               createNonEnumerableProperty$5($ArrayBuffer, key$1, NativeArrayBuffer$1[key$1]);
+             }
+           }
+
+           ArrayBufferPrototype$1.constructor = $ArrayBuffer;
+         } else if (INCORRECT_ARRAY_BUFFER_NAME && CONFIGURABLE_FUNCTION_NAME) {
+           createNonEnumerableProperty$5(NativeArrayBuffer$1, 'name', ARRAY_BUFFER$1);
+         }
+
+         // WebKit bug - the same parent prototype for typed arrays and data view
+         if (setPrototypeOf$5 && getPrototypeOf$2(DataViewPrototype$1) !== ObjectPrototype$2) {
+           setPrototypeOf$5(DataViewPrototype$1, ObjectPrototype$2);
+         }
+
+         // iOS Safari 7.x bug
+         var testView = new $DataView(new $ArrayBuffer(2));
+         var $setInt8 = uncurryThis$E(DataViewPrototype$1.setInt8);
+         testView.setInt8(0, 2147483648);
+         testView.setInt8(1, 2147483649);
+         if (testView.getInt8(0) || !testView.getInt8(1)) redefineAll$3(DataViewPrototype$1, {
+           setInt8: function setInt8(byteOffset, value) {
+             $setInt8(this, byteOffset, value << 24 >> 24);
+           },
+           setUint8: function setUint8(byteOffset, value) {
+             $setInt8(this, byteOffset, value << 24 >> 24);
+           }
+         }, { unsafe: true });
+       }
+
+       setToStringTag$6($ArrayBuffer, ARRAY_BUFFER$1);
+       setToStringTag$6($DataView, DATA_VIEW);
+
+       var arrayBuffer = {
+         ArrayBuffer: $ArrayBuffer,
+         DataView: $DataView
+       };
+
+       var global$P = global$1o;
+       var isConstructor$2 = isConstructor$4;
+       var tryToString$3 = tryToString$5;
+
+       var TypeError$f = global$P.TypeError;
+
+       // `Assert: IsConstructor(argument) is true`
+       var aConstructor$3 = function (argument) {
+         if (isConstructor$2(argument)) return argument;
+         throw TypeError$f(tryToString$3(argument) + ' is not a constructor');
+       };
+
+       var anObject$g = anObject$n;
+       var aConstructor$2 = aConstructor$3;
+       var wellKnownSymbol$h = wellKnownSymbol$t;
+
+       var SPECIES$5 = wellKnownSymbol$h('species');
+
+       // `SpeciesConstructor` abstract operation
+       // https://tc39.es/ecma262/#sec-speciesconstructor
+       var speciesConstructor$5 = function (O, defaultConstructor) {
+         var C = anObject$g(O).constructor;
+         var S;
+         return C === undefined || (S = anObject$g(C)[SPECIES$5]) == undefined ? defaultConstructor : aConstructor$2(S);
+       };
+
+       var $$19 = _export;
+       var uncurryThis$D = functionUncurryThis;
+       var fails$I = fails$V;
+       var ArrayBufferModule$2 = arrayBuffer;
+       var anObject$f = anObject$n;
+       var toAbsoluteIndex$5 = toAbsoluteIndex$9;
+       var toLength$8 = toLength$c;
+       var speciesConstructor$4 = speciesConstructor$5;
+
+       var ArrayBuffer$4 = ArrayBufferModule$2.ArrayBuffer;
+       var DataView$2 = ArrayBufferModule$2.DataView;
+       var DataViewPrototype = DataView$2.prototype;
+       var un$ArrayBufferSlice = uncurryThis$D(ArrayBuffer$4.prototype.slice);
+       var getUint8 = uncurryThis$D(DataViewPrototype.getUint8);
+       var setUint8 = uncurryThis$D(DataViewPrototype.setUint8);
+
+       var INCORRECT_SLICE = fails$I(function () {
+         return !new ArrayBuffer$4(2).slice(1, undefined).byteLength;
+       });
+
+       // `ArrayBuffer.prototype.slice` method
+       // https://tc39.es/ecma262/#sec-arraybuffer.prototype.slice
+       $$19({ target: 'ArrayBuffer', proto: true, unsafe: true, forced: INCORRECT_SLICE }, {
+         slice: function slice(start, end) {
+           if (un$ArrayBufferSlice && end === undefined) {
+             return un$ArrayBufferSlice(anObject$f(this), start); // FF fix
+           }
+           var length = anObject$f(this).byteLength;
+           var first = toAbsoluteIndex$5(start, length);
+           var fin = toAbsoluteIndex$5(end === undefined ? length : end, length);
+           var result = new (speciesConstructor$4(this, ArrayBuffer$4))(toLength$8(fin - first));
+           var viewSource = new DataView$2(this);
+           var viewTarget = new DataView$2(result);
+           var index = 0;
+           while (first < fin) {
+             setUint8(viewTarget, index++, getUint8(viewSource, first++));
+           } return result;
+         }
+       });
+
+       var $$18 = _export;
+       var ArrayBufferModule$1 = arrayBuffer;
+       var NATIVE_ARRAY_BUFFER$1 = arrayBufferNative;
+
+       // `DataView` constructor
+       // https://tc39.es/ecma262/#sec-dataview-constructor
+       $$18({ global: true, forced: !NATIVE_ARRAY_BUFFER$1 }, {
+         DataView: ArrayBufferModule$1.DataView
+       });
+
+       var NATIVE_ARRAY_BUFFER = arrayBufferNative;
+       var DESCRIPTORS$e = descriptors;
+       var global$O = global$1o;
+       var isCallable$9 = isCallable$r;
+       var isObject$k = isObject$s;
+       var hasOwn$9 = hasOwnProperty_1;
+       var classof$7 = classof$d;
+       var tryToString$2 = tryToString$5;
+       var createNonEnumerableProperty$4 = createNonEnumerableProperty$b;
+       var redefine$9 = redefine$h.exports;
+       var defineProperty$7 = objectDefineProperty.f;
+       var isPrototypeOf$5 = objectIsPrototypeOf;
+       var getPrototypeOf$1 = objectGetPrototypeOf;
+       var setPrototypeOf$4 = objectSetPrototypeOf;
+       var wellKnownSymbol$g = wellKnownSymbol$t;
+       var uid$1 = uid$5;
+
+       var Int8Array$4 = global$O.Int8Array;
+       var Int8ArrayPrototype$1 = Int8Array$4 && Int8Array$4.prototype;
+       var Uint8ClampedArray$1 = global$O.Uint8ClampedArray;
+       var Uint8ClampedArrayPrototype = Uint8ClampedArray$1 && Uint8ClampedArray$1.prototype;
+       var TypedArray$1 = Int8Array$4 && getPrototypeOf$1(Int8Array$4);
+       var TypedArrayPrototype$2 = Int8ArrayPrototype$1 && getPrototypeOf$1(Int8ArrayPrototype$1);
+       var ObjectPrototype$1 = Object.prototype;
+       var TypeError$e = global$O.TypeError;
+
+       var TO_STRING_TAG = wellKnownSymbol$g('toStringTag');
+       var TYPED_ARRAY_TAG$1 = uid$1('TYPED_ARRAY_TAG');
+       var TYPED_ARRAY_CONSTRUCTOR$2 = uid$1('TYPED_ARRAY_CONSTRUCTOR');
+       // Fixing native typed arrays in Opera Presto crashes the browser, see #595
+       var NATIVE_ARRAY_BUFFER_VIEWS$3 = NATIVE_ARRAY_BUFFER && !!setPrototypeOf$4 && classof$7(global$O.opera) !== 'Opera';
+       var TYPED_ARRAY_TAG_REQUIRED = false;
+       var NAME$1, Constructor, Prototype;
+
+       var TypedArrayConstructorsList = {
+         Int8Array: 1,
+         Uint8Array: 1,
+         Uint8ClampedArray: 1,
+         Int16Array: 2,
+         Uint16Array: 2,
+         Int32Array: 4,
+         Uint32Array: 4,
+         Float32Array: 4,
+         Float64Array: 8
+       };
+
+       var BigIntArrayConstructorsList = {
+         BigInt64Array: 8,
+         BigUint64Array: 8
+       };
+
+       var isView = function isView(it) {
+         if (!isObject$k(it)) return false;
+         var klass = classof$7(it);
+         return klass === 'DataView'
+           || hasOwn$9(TypedArrayConstructorsList, klass)
+           || hasOwn$9(BigIntArrayConstructorsList, klass);
+       };
+
+       var isTypedArray$1 = function (it) {
+         if (!isObject$k(it)) return false;
+         var klass = classof$7(it);
+         return hasOwn$9(TypedArrayConstructorsList, klass)
+           || hasOwn$9(BigIntArrayConstructorsList, klass);
+       };
+
+       var aTypedArray$m = function (it) {
+         if (isTypedArray$1(it)) return it;
+         throw TypeError$e('Target is not a typed array');
+       };
+
+       var aTypedArrayConstructor$3 = function (C) {
+         if (isCallable$9(C) && (!setPrototypeOf$4 || isPrototypeOf$5(TypedArray$1, C))) return C;
+         throw TypeError$e(tryToString$2(C) + ' is not a typed array constructor');
+       };
+
+       var exportTypedArrayMethod$n = function (KEY, property, forced, options) {
+         if (!DESCRIPTORS$e) return;
+         if (forced) for (var ARRAY in TypedArrayConstructorsList) {
+           var TypedArrayConstructor = global$O[ARRAY];
+           if (TypedArrayConstructor && hasOwn$9(TypedArrayConstructor.prototype, KEY)) try {
+             delete TypedArrayConstructor.prototype[KEY];
+           } catch (error) {
+             // old WebKit bug - some methods are non-configurable
+             try {
+               TypedArrayConstructor.prototype[KEY] = property;
+             } catch (error2) { /* empty */ }
+           }
+         }
+         if (!TypedArrayPrototype$2[KEY] || forced) {
+           redefine$9(TypedArrayPrototype$2, KEY, forced ? property
+             : NATIVE_ARRAY_BUFFER_VIEWS$3 && Int8ArrayPrototype$1[KEY] || property, options);
+         }
+       };
+
+       var exportTypedArrayStaticMethod$1 = function (KEY, property, forced) {
+         var ARRAY, TypedArrayConstructor;
+         if (!DESCRIPTORS$e) return;
+         if (setPrototypeOf$4) {
+           if (forced) for (ARRAY in TypedArrayConstructorsList) {
+             TypedArrayConstructor = global$O[ARRAY];
+             if (TypedArrayConstructor && hasOwn$9(TypedArrayConstructor, KEY)) try {
+               delete TypedArrayConstructor[KEY];
+             } catch (error) { /* empty */ }
+           }
+           if (!TypedArray$1[KEY] || forced) {
+             // V8 ~ Chrome 49-50 `%TypedArray%` methods are non-writable non-configurable
+             try {
+               return redefine$9(TypedArray$1, KEY, forced ? property : NATIVE_ARRAY_BUFFER_VIEWS$3 && TypedArray$1[KEY] || property);
+             } catch (error) { /* empty */ }
+           } else return;
+         }
+         for (ARRAY in TypedArrayConstructorsList) {
+           TypedArrayConstructor = global$O[ARRAY];
+           if (TypedArrayConstructor && (!TypedArrayConstructor[KEY] || forced)) {
+             redefine$9(TypedArrayConstructor, KEY, property);
+           }
+         }
+       };
+
+       for (NAME$1 in TypedArrayConstructorsList) {
+         Constructor = global$O[NAME$1];
+         Prototype = Constructor && Constructor.prototype;
+         if (Prototype) createNonEnumerableProperty$4(Prototype, TYPED_ARRAY_CONSTRUCTOR$2, Constructor);
+         else NATIVE_ARRAY_BUFFER_VIEWS$3 = false;
+       }
+
+       for (NAME$1 in BigIntArrayConstructorsList) {
+         Constructor = global$O[NAME$1];
+         Prototype = Constructor && Constructor.prototype;
+         if (Prototype) createNonEnumerableProperty$4(Prototype, TYPED_ARRAY_CONSTRUCTOR$2, Constructor);
+       }
+
+       // WebKit bug - typed arrays constructors prototype is Object.prototype
+       if (!NATIVE_ARRAY_BUFFER_VIEWS$3 || !isCallable$9(TypedArray$1) || TypedArray$1 === Function.prototype) {
+         // eslint-disable-next-line no-shadow -- safe
+         TypedArray$1 = function TypedArray() {
+           throw TypeError$e('Incorrect invocation');
+         };
+         if (NATIVE_ARRAY_BUFFER_VIEWS$3) for (NAME$1 in TypedArrayConstructorsList) {
+           if (global$O[NAME$1]) setPrototypeOf$4(global$O[NAME$1], TypedArray$1);
+         }
+       }
+
+       if (!NATIVE_ARRAY_BUFFER_VIEWS$3 || !TypedArrayPrototype$2 || TypedArrayPrototype$2 === ObjectPrototype$1) {
+         TypedArrayPrototype$2 = TypedArray$1.prototype;
+         if (NATIVE_ARRAY_BUFFER_VIEWS$3) for (NAME$1 in TypedArrayConstructorsList) {
+           if (global$O[NAME$1]) setPrototypeOf$4(global$O[NAME$1].prototype, TypedArrayPrototype$2);
+         }
+       }
+
+       // WebKit bug - one more object in Uint8ClampedArray prototype chain
+       if (NATIVE_ARRAY_BUFFER_VIEWS$3 && getPrototypeOf$1(Uint8ClampedArrayPrototype) !== TypedArrayPrototype$2) {
+         setPrototypeOf$4(Uint8ClampedArrayPrototype, TypedArrayPrototype$2);
+       }
+
+       if (DESCRIPTORS$e && !hasOwn$9(TypedArrayPrototype$2, TO_STRING_TAG)) {
+         TYPED_ARRAY_TAG_REQUIRED = true;
+         defineProperty$7(TypedArrayPrototype$2, TO_STRING_TAG, { get: function () {
+           return isObject$k(this) ? this[TYPED_ARRAY_TAG$1] : undefined;
+         } });
+         for (NAME$1 in TypedArrayConstructorsList) if (global$O[NAME$1]) {
+           createNonEnumerableProperty$4(global$O[NAME$1], TYPED_ARRAY_TAG$1, NAME$1);
+         }
+       }
+
+       var arrayBufferViewCore = {
+         NATIVE_ARRAY_BUFFER_VIEWS: NATIVE_ARRAY_BUFFER_VIEWS$3,
+         TYPED_ARRAY_CONSTRUCTOR: TYPED_ARRAY_CONSTRUCTOR$2,
+         TYPED_ARRAY_TAG: TYPED_ARRAY_TAG_REQUIRED && TYPED_ARRAY_TAG$1,
+         aTypedArray: aTypedArray$m,
+         aTypedArrayConstructor: aTypedArrayConstructor$3,
+         exportTypedArrayMethod: exportTypedArrayMethod$n,
+         exportTypedArrayStaticMethod: exportTypedArrayStaticMethod$1,
+         isView: isView,
+         isTypedArray: isTypedArray$1,
+         TypedArray: TypedArray$1,
+         TypedArrayPrototype: TypedArrayPrototype$2
+       };
+
+       var $$17 = _export;
+       var ArrayBufferViewCore$o = arrayBufferViewCore;
+
+       var NATIVE_ARRAY_BUFFER_VIEWS$2 = ArrayBufferViewCore$o.NATIVE_ARRAY_BUFFER_VIEWS;
+
+       // `ArrayBuffer.isView` method
+       // https://tc39.es/ecma262/#sec-arraybuffer.isview
+       $$17({ target: 'ArrayBuffer', stat: true, forced: !NATIVE_ARRAY_BUFFER_VIEWS$2 }, {
+         isView: ArrayBufferViewCore$o.isView
+       });
+
+       var getBuiltIn$4 = getBuiltIn$b;
+       var definePropertyModule$1 = objectDefineProperty;
+       var wellKnownSymbol$f = wellKnownSymbol$t;
+       var DESCRIPTORS$d = descriptors;
+
+       var SPECIES$4 = wellKnownSymbol$f('species');
+
+       var setSpecies$5 = function (CONSTRUCTOR_NAME) {
+         var Constructor = getBuiltIn$4(CONSTRUCTOR_NAME);
+         var defineProperty = definePropertyModule$1.f;
+
+         if (DESCRIPTORS$d && Constructor && !Constructor[SPECIES$4]) {
+           defineProperty(Constructor, SPECIES$4, {
+             configurable: true,
+             get: function () { return this; }
+           });
+         }
+       };
+
+       var $$16 = _export;
+       var global$N = global$1o;
+       var arrayBufferModule = arrayBuffer;
+       var setSpecies$4 = setSpecies$5;
+
+       var ARRAY_BUFFER = 'ArrayBuffer';
+       var ArrayBuffer$3 = arrayBufferModule[ARRAY_BUFFER];
+       var NativeArrayBuffer = global$N[ARRAY_BUFFER];
+
+       // `ArrayBuffer` constructor
+       // https://tc39.es/ecma262/#sec-arraybuffer-constructor
+       $$16({ global: true, forced: NativeArrayBuffer !== ArrayBuffer$3 }, {
+         ArrayBuffer: ArrayBuffer$3
+       });
+
+       setSpecies$4(ARRAY_BUFFER);
+
+       var fails$H = fails$V;
+
+       var arrayMethodIsStrict$9 = function (METHOD_NAME, argument) {
+         var method = [][METHOD_NAME];
+         return !!method && fails$H(function () {
+           // eslint-disable-next-line no-useless-call,no-throw-literal -- required for testing
+           method.call(null, argument || function () { throw 1; }, 1);
+         });
+       };
+
+       /* eslint-disable es/no-array-prototype-indexof -- required for testing */
+       var $$15 = _export;
+       var uncurryThis$C = functionUncurryThis;
+       var $IndexOf = arrayIncludes.indexOf;
+       var arrayMethodIsStrict$8 = arrayMethodIsStrict$9;
+
+       var un$IndexOf = uncurryThis$C([].indexOf);
+
+       var NEGATIVE_ZERO$1 = !!un$IndexOf && 1 / un$IndexOf([1], 1, -0) < 0;
+       var STRICT_METHOD$8 = arrayMethodIsStrict$8('indexOf');
+
+       // `Array.prototype.indexOf` method
+       // https://tc39.es/ecma262/#sec-array.prototype.indexof
+       $$15({ target: 'Array', proto: true, forced: NEGATIVE_ZERO$1 || !STRICT_METHOD$8 }, {
+         indexOf: function indexOf(searchElement /* , fromIndex = 0 */) {
+           var fromIndex = arguments.length > 1 ? arguments[1] : undefined;
+           return NEGATIVE_ZERO$1
+             // convert -0 to +0
+             ? un$IndexOf(this, searchElement, fromIndex) || 0
+             : $IndexOf(this, searchElement, fromIndex);
+         }
+       });
+
+       var anObject$e = anObject$n;
+
+       // `RegExp.prototype.flags` getter implementation
+       // https://tc39.es/ecma262/#sec-get-regexp.prototype.flags
+       var regexpFlags$1 = function () {
+         var that = anObject$e(this);
+         var result = '';
+         if (that.global) result += 'g';
+         if (that.ignoreCase) result += 'i';
+         if (that.multiline) result += 'm';
+         if (that.dotAll) result += 's';
+         if (that.unicode) result += 'u';
+         if (that.sticky) result += 'y';
+         return result;
+       };
+
+       var fails$G = fails$V;
+       var global$M = global$1o;
+
+       // babel-minify and Closure Compiler transpiles RegExp('a', 'y') -> /a/y and it causes SyntaxError
+       var $RegExp$2 = global$M.RegExp;
+
+       var UNSUPPORTED_Y$3 = fails$G(function () {
+         var re = $RegExp$2('a', 'y');
+         re.lastIndex = 2;
+         return re.exec('abcd') != null;
+       });
+
+       // UC Browser bug
+       // https://github.com/zloirock/core-js/issues/1008
+       var MISSED_STICKY$1 = UNSUPPORTED_Y$3 || fails$G(function () {
+         return !$RegExp$2('a', 'y').sticky;
+       });
+
+       var BROKEN_CARET = UNSUPPORTED_Y$3 || fails$G(function () {
+         // https://bugzilla.mozilla.org/show_bug.cgi?id=773687
+         var re = $RegExp$2('^r', 'gy');
+         re.lastIndex = 2;
+         return re.exec('str') != null;
+       });
+
+       var regexpStickyHelpers = {
+         BROKEN_CARET: BROKEN_CARET,
+         MISSED_STICKY: MISSED_STICKY$1,
+         UNSUPPORTED_Y: UNSUPPORTED_Y$3
+       };
+
+       var fails$F = fails$V;
+       var global$L = global$1o;
+
+       // babel-minify and Closure Compiler transpiles RegExp('.', 's') -> /./s and it causes SyntaxError
+       var $RegExp$1 = global$L.RegExp;
+
+       var regexpUnsupportedDotAll = fails$F(function () {
+         var re = $RegExp$1('.', 's');
+         return !(re.dotAll && re.exec('\n') && re.flags === 's');
+       });
+
+       var fails$E = fails$V;
+       var global$K = global$1o;
+
+       // babel-minify and Closure Compiler transpiles RegExp('(?<a>b)', 'g') -> /(?<a>b)/g and it causes SyntaxError
+       var $RegExp = global$K.RegExp;
+
+       var regexpUnsupportedNcg = fails$E(function () {
+         var re = $RegExp('(?<a>b)', 'g');
+         return re.exec('b').groups.a !== 'b' ||
+           'b'.replace(re, '$<a>c') !== 'bc';
+       });
+
+       /* eslint-disable regexp/no-empty-capturing-group, regexp/no-empty-group, regexp/no-lazy-ends -- testing */
+       /* eslint-disable regexp/no-useless-quantifier -- testing */
+       var call$i = functionCall;
+       var uncurryThis$B = functionUncurryThis;
+       var toString$g = toString$k;
+       var regexpFlags = regexpFlags$1;
+       var stickyHelpers$2 = regexpStickyHelpers;
+       var shared = shared$5.exports;
+       var create$8 = objectCreate;
+       var getInternalState$2 = internalState.get;
+       var UNSUPPORTED_DOT_ALL$1 = regexpUnsupportedDotAll;
+       var UNSUPPORTED_NCG$1 = regexpUnsupportedNcg;
+
+       var nativeReplace = shared('native-string-replace', String.prototype.replace);
+       var nativeExec = RegExp.prototype.exec;
+       var patchedExec = nativeExec;
+       var charAt$6 = uncurryThis$B(''.charAt);
+       var indexOf = uncurryThis$B(''.indexOf);
+       var replace$7 = uncurryThis$B(''.replace);
+       var stringSlice$9 = uncurryThis$B(''.slice);
+
+       var UPDATES_LAST_INDEX_WRONG = (function () {
+         var re1 = /a/;
+         var re2 = /b*/g;
+         call$i(nativeExec, re1, 'a');
+         call$i(nativeExec, re2, 'a');
+         return re1.lastIndex !== 0 || re2.lastIndex !== 0;
+       })();
+
+       var UNSUPPORTED_Y$2 = stickyHelpers$2.BROKEN_CARET;
+
+       // nonparticipating capturing group, copied from es5-shim's String#split patch.
+       var NPCG_INCLUDED = /()??/.exec('')[1] !== undefined;
+
+       var PATCH = UPDATES_LAST_INDEX_WRONG || NPCG_INCLUDED || UNSUPPORTED_Y$2 || UNSUPPORTED_DOT_ALL$1 || UNSUPPORTED_NCG$1;
+
+       if (PATCH) {
+         patchedExec = function exec(string) {
+           var re = this;
+           var state = getInternalState$2(re);
+           var str = toString$g(string);
+           var raw = state.raw;
+           var result, reCopy, lastIndex, match, i, object, group;
+
+           if (raw) {
+             raw.lastIndex = re.lastIndex;
+             result = call$i(patchedExec, raw, str);
+             re.lastIndex = raw.lastIndex;
+             return result;
+           }
+
+           var groups = state.groups;
+           var sticky = UNSUPPORTED_Y$2 && re.sticky;
+           var flags = call$i(regexpFlags, re);
+           var source = re.source;
+           var charsAdded = 0;
+           var strCopy = str;
+
+           if (sticky) {
+             flags = replace$7(flags, 'y', '');
+             if (indexOf(flags, 'g') === -1) {
+               flags += 'g';
+             }
+
+             strCopy = stringSlice$9(str, re.lastIndex);
+             // Support anchored sticky behavior.
+             if (re.lastIndex > 0 && (!re.multiline || re.multiline && charAt$6(str, re.lastIndex - 1) !== '\n')) {
+               source = '(?: ' + source + ')';
+               strCopy = ' ' + strCopy;
+               charsAdded++;
+             }
+             // ^(? + rx + ) is needed, in combination with some str slicing, to
+             // simulate the 'y' flag.
+             reCopy = new RegExp('^(?:' + source + ')', flags);
+           }
+
+           if (NPCG_INCLUDED) {
+             reCopy = new RegExp('^' + source + '$(?!\\s)', flags);
+           }
+           if (UPDATES_LAST_INDEX_WRONG) lastIndex = re.lastIndex;
+
+           match = call$i(nativeExec, sticky ? reCopy : re, strCopy);
+
+           if (sticky) {
+             if (match) {
+               match.input = stringSlice$9(match.input, charsAdded);
+               match[0] = stringSlice$9(match[0], charsAdded);
+               match.index = re.lastIndex;
+               re.lastIndex += match[0].length;
+             } else re.lastIndex = 0;
+           } else if (UPDATES_LAST_INDEX_WRONG && match) {
+             re.lastIndex = re.global ? match.index + match[0].length : lastIndex;
+           }
+           if (NPCG_INCLUDED && match && match.length > 1) {
+             // Fix browsers whose `exec` methods don't consistently return `undefined`
+             // for NPCG, like IE8. NOTE: This doesn' work for /(.?)?/
+             call$i(nativeReplace, match[0], reCopy, function () {
+               for (i = 1; i < arguments.length - 2; i++) {
+                 if (arguments[i] === undefined) match[i] = undefined;
+               }
+             });
+           }
+
+           if (match && groups) {
+             match.groups = object = create$8(null);
+             for (i = 0; i < groups.length; i++) {
+               group = groups[i];
+               object[group[0]] = match[group[1]];
+             }
+           }
+
+           return match;
+         };
+       }
+
+       var regexpExec$3 = patchedExec;
+
+       var $$14 = _export;
+       var exec$5 = regexpExec$3;
+
+       // `RegExp.prototype.exec` method
+       // https://tc39.es/ecma262/#sec-regexp.prototype.exec
+       $$14({ target: 'RegExp', proto: true, forced: /./.exec !== exec$5 }, {
+         exec: exec$5
+       });
+
+       var fails$D = fails$V;
+       var wellKnownSymbol$e = wellKnownSymbol$t;
+       var V8_VERSION$2 = engineV8Version;
+
+       var SPECIES$3 = wellKnownSymbol$e('species');
+
+       var arrayMethodHasSpeciesSupport$5 = function (METHOD_NAME) {
+         // We can't use this feature detection in V8 since it causes
+         // deoptimization and serious performance degradation
+         // https://github.com/zloirock/core-js/issues/677
+         return V8_VERSION$2 >= 51 || !fails$D(function () {
+           var array = [];
+           var constructor = array.constructor = {};
+           constructor[SPECIES$3] = function () {
+             return { foo: 1 };
+           };
+           return array[METHOD_NAME](Boolean).foo !== 1;
+         });
+       };
+
+       var $$13 = _export;
+       var $map$1 = arrayIteration.map;
+       var arrayMethodHasSpeciesSupport$4 = arrayMethodHasSpeciesSupport$5;
+
+       var HAS_SPECIES_SUPPORT$3 = arrayMethodHasSpeciesSupport$4('map');
+
+       // `Array.prototype.map` method
+       // https://tc39.es/ecma262/#sec-array.prototype.map
+       // with adding support of @@species
+       $$13({ target: 'Array', proto: true, forced: !HAS_SPECIES_SUPPORT$3 }, {
+         map: function map(callbackfn /* , thisArg */) {
+           return $map$1(this, callbackfn, arguments.length > 1 ? arguments[1] : undefined);
+         }
+       });
+
+       var $forEach$1 = arrayIteration.forEach;
+       var arrayMethodIsStrict$7 = arrayMethodIsStrict$9;
+
+       var STRICT_METHOD$7 = arrayMethodIsStrict$7('forEach');
+
+       // `Array.prototype.forEach` method implementation
+       // https://tc39.es/ecma262/#sec-array.prototype.foreach
+       var arrayForEach = !STRICT_METHOD$7 ? function forEach(callbackfn /* , thisArg */) {
+         return $forEach$1(this, callbackfn, arguments.length > 1 ? arguments[1] : undefined);
+       // eslint-disable-next-line es/no-array-prototype-foreach -- safe
+       } : [].forEach;
+
+       var $$12 = _export;
+       var forEach$3 = arrayForEach;
+
+       // `Array.prototype.forEach` method
+       // https://tc39.es/ecma262/#sec-array.prototype.foreach
+       // eslint-disable-next-line es/no-array-prototype-foreach -- safe
+       $$12({ target: 'Array', proto: true, forced: [].forEach != forEach$3 }, {
+         forEach: forEach$3
+       });
+
+       var global$J = global$1o;
+       var DOMIterables = domIterables;
+       var DOMTokenListPrototype = domTokenListPrototype;
+       var forEach$2 = arrayForEach;
+       var createNonEnumerableProperty$3 = createNonEnumerableProperty$b;
+
+       var handlePrototype = function (CollectionPrototype) {
+         // some Chrome versions have non-configurable methods on DOMTokenList
+         if (CollectionPrototype && CollectionPrototype.forEach !== forEach$2) try {
+           createNonEnumerableProperty$3(CollectionPrototype, 'forEach', forEach$2);
+         } catch (error) {
+           CollectionPrototype.forEach = forEach$2;
+         }
+       };
+
+       for (var COLLECTION_NAME in DOMIterables) {
+         if (DOMIterables[COLLECTION_NAME]) {
+           handlePrototype(global$J[COLLECTION_NAME] && global$J[COLLECTION_NAME].prototype);
+         }
+       }
+
+       handlePrototype(DOMTokenListPrototype);
+
+       var $$11 = _export;
+       var isArray$5 = isArray$8;
+
+       // `Array.isArray` method
+       // https://tc39.es/ecma262/#sec-array.isarray
+       $$11({ target: 'Array', stat: true }, {
+         isArray: isArray$5
+       });
+
+       var $$10 = _export;
+       var fails$C = fails$V;
+       var getOwnPropertyNames$3 = objectGetOwnPropertyNamesExternal.f;
+
+       // eslint-disable-next-line es/no-object-getownpropertynames -- required for testing
+       var FAILS_ON_PRIMITIVES$5 = fails$C(function () { return !Object.getOwnPropertyNames(1); });
+
+       // `Object.getOwnPropertyNames` method
+       // https://tc39.es/ecma262/#sec-object.getownpropertynames
+       $$10({ target: 'Object', stat: true, forced: FAILS_ON_PRIMITIVES$5 }, {
+         getOwnPropertyNames: getOwnPropertyNames$3
+       });
+
+       var global$I = global$1o;
+
+       var nativePromiseConstructor = global$I.Promise;
+
+       var wellKnownSymbol$d = wellKnownSymbol$t;
+       var Iterators$1 = iterators;
+
+       var ITERATOR$7 = wellKnownSymbol$d('iterator');
+       var ArrayPrototype = Array.prototype;
+
+       // check on default Array iterator
+       var isArrayIteratorMethod$3 = function (it) {
+         return it !== undefined && (Iterators$1.Array === it || ArrayPrototype[ITERATOR$7] === it);
+       };
+
+       var classof$6 = classof$d;
+       var getMethod$5 = getMethod$7;
+       var Iterators = iterators;
+       var wellKnownSymbol$c = wellKnownSymbol$t;
+
+       var ITERATOR$6 = wellKnownSymbol$c('iterator');
+
+       var getIteratorMethod$5 = function (it) {
+         if (it != undefined) return getMethod$5(it, ITERATOR$6)
+           || getMethod$5(it, '@@iterator')
+           || Iterators[classof$6(it)];
+       };
+
+       var global$H = global$1o;
+       var call$h = functionCall;
+       var aCallable$7 = aCallable$a;
+       var anObject$d = anObject$n;
+       var tryToString$1 = tryToString$5;
+       var getIteratorMethod$4 = getIteratorMethod$5;
+
+       var TypeError$d = global$H.TypeError;
+
+       var getIterator$4 = function (argument, usingIterator) {
+         var iteratorMethod = arguments.length < 2 ? getIteratorMethod$4(argument) : usingIterator;
+         if (aCallable$7(iteratorMethod)) return anObject$d(call$h(iteratorMethod, argument));
+         throw TypeError$d(tryToString$1(argument) + ' is not iterable');
+       };
+
+       var call$g = functionCall;
+       var anObject$c = anObject$n;
+       var getMethod$4 = getMethod$7;
+
+       var iteratorClose$2 = function (iterator, kind, value) {
+         var innerResult, innerError;
+         anObject$c(iterator);
+         try {
+           innerResult = getMethod$4(iterator, 'return');
+           if (!innerResult) {
+             if (kind === 'throw') throw value;
+             return value;
+           }
+           innerResult = call$g(innerResult, iterator);
+         } catch (error) {
+           innerError = true;
+           innerResult = error;
+         }
+         if (kind === 'throw') throw value;
+         if (innerError) throw innerResult;
+         anObject$c(innerResult);
+         return value;
+       };
+
+       var global$G = global$1o;
+       var bind$d = functionBindContext;
+       var call$f = functionCall;
+       var anObject$b = anObject$n;
+       var tryToString = tryToString$5;
+       var isArrayIteratorMethod$2 = isArrayIteratorMethod$3;
+       var lengthOfArrayLike$d = lengthOfArrayLike$i;
+       var isPrototypeOf$4 = objectIsPrototypeOf;
+       var getIterator$3 = getIterator$4;
+       var getIteratorMethod$3 = getIteratorMethod$5;
+       var iteratorClose$1 = iteratorClose$2;
+
+       var TypeError$c = global$G.TypeError;
+
+       var Result = function (stopped, result) {
+         this.stopped = stopped;
+         this.result = result;
+       };
+
+       var ResultPrototype = Result.prototype;
+
+       var iterate$3 = function (iterable, unboundFunction, options) {
+         var that = options && options.that;
+         var AS_ENTRIES = !!(options && options.AS_ENTRIES);
+         var IS_ITERATOR = !!(options && options.IS_ITERATOR);
+         var INTERRUPTED = !!(options && options.INTERRUPTED);
+         var fn = bind$d(unboundFunction, that);
+         var iterator, iterFn, index, length, result, next, step;
+
+         var stop = function (condition) {
+           if (iterator) iteratorClose$1(iterator, 'normal', condition);
+           return new Result(true, condition);
+         };
+
+         var callFn = function (value) {
+           if (AS_ENTRIES) {
+             anObject$b(value);
+             return INTERRUPTED ? fn(value[0], value[1], stop) : fn(value[0], value[1]);
+           } return INTERRUPTED ? fn(value, stop) : fn(value);
+         };
+
+         if (IS_ITERATOR) {
+           iterator = iterable;
+         } else {
+           iterFn = getIteratorMethod$3(iterable);
+           if (!iterFn) throw TypeError$c(tryToString(iterable) + ' is not iterable');
+           // optimisation for array iterators
+           if (isArrayIteratorMethod$2(iterFn)) {
+             for (index = 0, length = lengthOfArrayLike$d(iterable); length > index; index++) {
+               result = callFn(iterable[index]);
+               if (result && isPrototypeOf$4(ResultPrototype, result)) return result;
+             } return new Result(false);
+           }
+           iterator = getIterator$3(iterable, iterFn);
+         }
+
+         next = iterator.next;
+         while (!(step = call$f(next, iterator)).done) {
+           try {
+             result = callFn(step.value);
+           } catch (error) {
+             iteratorClose$1(iterator, 'throw', error);
+           }
+           if (typeof result == 'object' && result && isPrototypeOf$4(ResultPrototype, result)) return result;
+         } return new Result(false);
+       };
+
+       var wellKnownSymbol$b = wellKnownSymbol$t;
+
+       var ITERATOR$5 = wellKnownSymbol$b('iterator');
+       var SAFE_CLOSING = false;
+
+       try {
+         var called = 0;
+         var iteratorWithReturn = {
+           next: function () {
+             return { done: !!called++ };
+           },
+           'return': function () {
+             SAFE_CLOSING = true;
+           }
+         };
+         iteratorWithReturn[ITERATOR$5] = function () {
+           return this;
+         };
+         // eslint-disable-next-line es/no-array-from, no-throw-literal -- required for testing
+         Array.from(iteratorWithReturn, function () { throw 2; });
+       } catch (error) { /* empty */ }
+
+       var checkCorrectnessOfIteration$4 = function (exec, SKIP_CLOSING) {
+         if (!SKIP_CLOSING && !SAFE_CLOSING) return false;
+         var ITERATION_SUPPORT = false;
+         try {
+           var object = {};
+           object[ITERATOR$5] = function () {
+             return {
+               next: function () {
+                 return { done: ITERATION_SUPPORT = true };
+               }
+             };
+           };
+           exec(object);
+         } catch (error) { /* empty */ }
+         return ITERATION_SUPPORT;
+       };
+
+       var global$F = global$1o;
+
+       var TypeError$b = global$F.TypeError;
+
+       var validateArgumentsLength$4 = function (passed, required) {
+         if (passed < required) throw TypeError$b('Not enough arguments');
+         return passed;
+       };
+
+       var userAgent$6 = engineUserAgent;
+
+       var engineIsIos = /(?:ipad|iphone|ipod).*applewebkit/i.test(userAgent$6);
+
+       var classof$5 = classofRaw$1;
+       var global$E = global$1o;
+
+       var engineIsNode = classof$5(global$E.process) == 'process';
+
+       var global$D = global$1o;
+       var apply$7 = functionApply;
+       var bind$c = functionBindContext;
+       var isCallable$8 = isCallable$r;
+       var hasOwn$8 = hasOwnProperty_1;
+       var fails$B = fails$V;
+       var html = html$2;
+       var arraySlice$8 = arraySlice$b;
+       var createElement = documentCreateElement$2;
+       var validateArgumentsLength$3 = validateArgumentsLength$4;
+       var IS_IOS$1 = engineIsIos;
+       var IS_NODE$4 = engineIsNode;
+
+       var set$2 = global$D.setImmediate;
+       var clear = global$D.clearImmediate;
+       var process$3 = global$D.process;
+       var Dispatch$1 = global$D.Dispatch;
+       var Function$3 = global$D.Function;
+       var MessageChannel = global$D.MessageChannel;
+       var String$2 = global$D.String;
+       var counter = 0;
+       var queue$1 = {};
+       var ONREADYSTATECHANGE = 'onreadystatechange';
+       var location$1, defer, channel, port;
+
+       try {
+         // Deno throws a ReferenceError on `location` access without `--location` flag
+         location$1 = global$D.location;
+       } catch (error) { /* empty */ }
+
+       var run = function (id) {
+         if (hasOwn$8(queue$1, id)) {
+           var fn = queue$1[id];
+           delete queue$1[id];
+           fn();
+         }
+       };
+
+       var runner = function (id) {
+         return function () {
+           run(id);
+         };
+       };
+
+       var listener = function (event) {
+         run(event.data);
+       };
+
+       var post = function (id) {
+         // old engines have not location.origin
+         global$D.postMessage(String$2(id), location$1.protocol + '//' + location$1.host);
+       };
+
+       // Node.js 0.9+ & IE10+ has setImmediate, otherwise:
+       if (!set$2 || !clear) {
+         set$2 = function setImmediate(handler) {
+           validateArgumentsLength$3(arguments.length, 1);
+           var fn = isCallable$8(handler) ? handler : Function$3(handler);
+           var args = arraySlice$8(arguments, 1);
+           queue$1[++counter] = function () {
+             apply$7(fn, undefined, args);
+           };
+           defer(counter);
+           return counter;
+         };
+         clear = function clearImmediate(id) {
+           delete queue$1[id];
+         };
+         // Node.js 0.8-
+         if (IS_NODE$4) {
+           defer = function (id) {
+             process$3.nextTick(runner(id));
+           };
+         // Sphere (JS game engine) Dispatch API
+         } else if (Dispatch$1 && Dispatch$1.now) {
+           defer = function (id) {
+             Dispatch$1.now(runner(id));
+           };
+         // Browsers with MessageChannel, includes WebWorkers
+         // except iOS - https://github.com/zloirock/core-js/issues/624
+         } else if (MessageChannel && !IS_IOS$1) {
+           channel = new MessageChannel();
+           port = channel.port2;
+           channel.port1.onmessage = listener;
+           defer = bind$c(port.postMessage, port);
+         // Browsers with postMessage, skip WebWorkers
+         // IE8 has postMessage, but it's sync & typeof its postMessage is 'object'
+         } else if (
+           global$D.addEventListener &&
+           isCallable$8(global$D.postMessage) &&
+           !global$D.importScripts &&
+           location$1 && location$1.protocol !== 'file:' &&
+           !fails$B(post)
+         ) {
+           defer = post;
+           global$D.addEventListener('message', listener, false);
+         // IE8-
+         } else if (ONREADYSTATECHANGE in createElement('script')) {
+           defer = function (id) {
+             html.appendChild(createElement('script'))[ONREADYSTATECHANGE] = function () {
+               html.removeChild(this);
+               run(id);
+             };
+           };
+         // Rest old browsers
+         } else {
+           defer = function (id) {
+             setTimeout(runner(id), 0);
+           };
+         }
+       }
+
+       var task$1 = {
+         set: set$2,
+         clear: clear
+       };
+
+       var userAgent$5 = engineUserAgent;
+       var global$C = global$1o;
+
+       var engineIsIosPebble = /ipad|iphone|ipod/i.test(userAgent$5) && global$C.Pebble !== undefined;
+
+       var userAgent$4 = engineUserAgent;
+
+       var engineIsWebosWebkit = /web0s(?!.*chrome)/i.test(userAgent$4);
+
+       var global$B = global$1o;
+       var bind$b = functionBindContext;
+       var getOwnPropertyDescriptor$3 = objectGetOwnPropertyDescriptor.f;
+       var macrotask = task$1.set;
+       var IS_IOS = engineIsIos;
+       var IS_IOS_PEBBLE = engineIsIosPebble;
+       var IS_WEBOS_WEBKIT = engineIsWebosWebkit;
+       var IS_NODE$3 = engineIsNode;
+
+       var MutationObserver = global$B.MutationObserver || global$B.WebKitMutationObserver;
+       var document$2 = global$B.document;
+       var process$2 = global$B.process;
+       var Promise$1 = global$B.Promise;
+       // Node.js 11 shows ExperimentalWarning on getting `queueMicrotask`
+       var queueMicrotaskDescriptor = getOwnPropertyDescriptor$3(global$B, 'queueMicrotask');
+       var queueMicrotask = queueMicrotaskDescriptor && queueMicrotaskDescriptor.value;
+
+       var flush, head, last, notify$1, toggle, node, promise, then;
+
+       // modern engines have queueMicrotask method
+       if (!queueMicrotask) {
+         flush = function () {
+           var parent, fn;
+           if (IS_NODE$3 && (parent = process$2.domain)) parent.exit();
+           while (head) {
+             fn = head.fn;
+             head = head.next;
+             try {
+               fn();
+             } catch (error) {
+               if (head) notify$1();
+               else last = undefined;
+               throw error;
+             }
+           } last = undefined;
+           if (parent) parent.enter();
+         };
+
+         // browsers with MutationObserver, except iOS - https://github.com/zloirock/core-js/issues/339
+         // also except WebOS Webkit https://github.com/zloirock/core-js/issues/898
+         if (!IS_IOS && !IS_NODE$3 && !IS_WEBOS_WEBKIT && MutationObserver && document$2) {
+           toggle = true;
+           node = document$2.createTextNode('');
+           new MutationObserver(flush).observe(node, { characterData: true });
+           notify$1 = function () {
+             node.data = toggle = !toggle;
+           };
+         // environments with maybe non-completely correct, but existent Promise
+         } else if (!IS_IOS_PEBBLE && Promise$1 && Promise$1.resolve) {
+           // Promise.resolve without an argument throws an error in LG WebOS 2
+           promise = Promise$1.resolve(undefined);
+           // workaround of WebKit ~ iOS Safari 10.1 bug
+           promise.constructor = Promise$1;
+           then = bind$b(promise.then, promise);
+           notify$1 = function () {
+             then(flush);
+           };
+         // Node.js without promises
+         } else if (IS_NODE$3) {
+           notify$1 = function () {
+             process$2.nextTick(flush);
+           };
+         // for other environments - macrotask based on:
+         // - setImmediate
+         // - MessageChannel
+         // - window.postMessag
+         // - onreadystatechange
+         // - setTimeout
+         } else {
+           // strange IE + webpack dev server bug - use .bind(global)
+           macrotask = bind$b(macrotask, global$B);
+           notify$1 = function () {
+             macrotask(flush);
+           };
+         }
+       }
+
+       var microtask$1 = queueMicrotask || function (fn) {
+         var task = { fn: fn, next: undefined };
+         if (last) last.next = task;
+         if (!head) {
+           head = task;
+           notify$1();
+         } last = task;
+       };
+
+       var newPromiseCapability$2 = {};
+
+       var aCallable$6 = aCallable$a;
+
+       var PromiseCapability = function (C) {
+         var resolve, reject;
+         this.promise = new C(function ($$resolve, $$reject) {
+           if (resolve !== undefined || reject !== undefined) throw TypeError('Bad Promise constructor');
+           resolve = $$resolve;
+           reject = $$reject;
+         });
+         this.resolve = aCallable$6(resolve);
+         this.reject = aCallable$6(reject);
+       };
+
+       // `NewPromiseCapability` abstract operation
+       // https://tc39.es/ecma262/#sec-newpromisecapability
+       newPromiseCapability$2.f = function (C) {
+         return new PromiseCapability(C);
+       };
+
+       var anObject$a = anObject$n;
+       var isObject$j = isObject$s;
+       var newPromiseCapability$1 = newPromiseCapability$2;
+
+       var promiseResolve$2 = function (C, x) {
+         anObject$a(C);
+         if (isObject$j(x) && x.constructor === C) return x;
+         var promiseCapability = newPromiseCapability$1.f(C);
+         var resolve = promiseCapability.resolve;
+         resolve(x);
+         return promiseCapability.promise;
+       };
+
+       var global$A = global$1o;
+
+       var hostReportErrors$1 = function (a, b) {
+         var console = global$A.console;
+         if (console && console.error) {
+           arguments.length == 1 ? console.error(a) : console.error(a, b);
+         }
+       };
+
+       var perform$1 = function (exec) {
+         try {
+           return { error: false, value: exec() };
+         } catch (error) {
+           return { error: true, value: error };
+         }
+       };
+
+       var Queue$1 = function () {
+         this.head = null;
+         this.tail = null;
+       };
+
+       Queue$1.prototype = {
+         add: function (item) {
+           var entry = { item: item, next: null };
+           if (this.head) this.tail.next = entry;
+           else this.head = entry;
+           this.tail = entry;
+         },
+         get: function () {
+           var entry = this.head;
+           if (entry) {
+             this.head = entry.next;
+             if (this.tail === entry) this.tail = null;
+             return entry.item;
+           }
+         }
+       };
+
+       var queue = Queue$1;
+
+       var engineIsBrowser = typeof window == 'object';
+
+       var $$$ = _export;
+       var global$z = global$1o;
+       var getBuiltIn$3 = getBuiltIn$b;
+       var call$e = functionCall;
+       var NativePromise$1 = nativePromiseConstructor;
+       var redefine$8 = redefine$h.exports;
+       var redefineAll$2 = redefineAll$4;
+       var setPrototypeOf$3 = objectSetPrototypeOf;
+       var setToStringTag$5 = setToStringTag$a;
+       var setSpecies$3 = setSpecies$5;
+       var aCallable$5 = aCallable$a;
+       var isCallable$7 = isCallable$r;
+       var isObject$i = isObject$s;
+       var anInstance$5 = anInstance$7;
+       var inspectSource = inspectSource$4;
+       var iterate$2 = iterate$3;
+       var checkCorrectnessOfIteration$3 = checkCorrectnessOfIteration$4;
+       var speciesConstructor$3 = speciesConstructor$5;
+       var task = task$1.set;
+       var microtask = microtask$1;
+       var promiseResolve$1 = promiseResolve$2;
+       var hostReportErrors = hostReportErrors$1;
+       var newPromiseCapabilityModule = newPromiseCapability$2;
+       var perform = perform$1;
+       var Queue = queue;
+       var InternalStateModule$4 = internalState;
+       var isForced$3 = isForced_1;
+       var wellKnownSymbol$a = wellKnownSymbol$t;
+       var IS_BROWSER = engineIsBrowser;
+       var IS_NODE$2 = engineIsNode;
+       var V8_VERSION$1 = engineV8Version;
+
+       var SPECIES$2 = wellKnownSymbol$a('species');
+       var PROMISE = 'Promise';
+
+       var getInternalState$1 = InternalStateModule$4.getterFor(PROMISE);
+       var setInternalState$4 = InternalStateModule$4.set;
+       var getInternalPromiseState = InternalStateModule$4.getterFor(PROMISE);
+       var NativePromisePrototype = NativePromise$1 && NativePromise$1.prototype;
+       var PromiseConstructor = NativePromise$1;
+       var PromisePrototype = NativePromisePrototype;
+       var TypeError$a = global$z.TypeError;
+       var document$1 = global$z.document;
+       var process$1 = global$z.process;
+       var newPromiseCapability = newPromiseCapabilityModule.f;
+       var newGenericPromiseCapability = newPromiseCapability;
+
+       var DISPATCH_EVENT = !!(document$1 && document$1.createEvent && global$z.dispatchEvent);
+       var NATIVE_REJECTION_EVENT = isCallable$7(global$z.PromiseRejectionEvent);
+       var UNHANDLED_REJECTION = 'unhandledrejection';
+       var REJECTION_HANDLED = 'rejectionhandled';
+       var PENDING = 0;
+       var FULFILLED = 1;
+       var REJECTED = 2;
+       var HANDLED = 1;
+       var UNHANDLED = 2;
+       var SUBCLASSING = false;
+
+       var Internal, OwnPromiseCapability, PromiseWrapper, nativeThen;
+
+       var FORCED$g = isForced$3(PROMISE, function () {
+         var PROMISE_CONSTRUCTOR_SOURCE = inspectSource(PromiseConstructor);
+         var GLOBAL_CORE_JS_PROMISE = PROMISE_CONSTRUCTOR_SOURCE !== String(PromiseConstructor);
+         // V8 6.6 (Node 10 and Chrome 66) have a bug with resolving custom thenables
+         // https://bugs.chromium.org/p/chromium/issues/detail?id=830565
+         // We can't detect it synchronously, so just check versions
+         if (!GLOBAL_CORE_JS_PROMISE && V8_VERSION$1 === 66) return true;
+         // We can't use @@species feature detection in V8 since it causes
+         // deoptimization and performance degradation
+         // https://github.com/zloirock/core-js/issues/679
+         if (V8_VERSION$1 >= 51 && /native code/.test(PROMISE_CONSTRUCTOR_SOURCE)) return false;
+         // Detect correctness of subclassing with @@species support
+         var promise = new PromiseConstructor(function (resolve) { resolve(1); });
+         var FakePromise = function (exec) {
+           exec(function () { /* empty */ }, function () { /* empty */ });
+         };
+         var constructor = promise.constructor = {};
+         constructor[SPECIES$2] = FakePromise;
+         SUBCLASSING = promise.then(function () { /* empty */ }) instanceof FakePromise;
+         if (!SUBCLASSING) return true;
+         // Unhandled rejections tracking support, NodeJS Promise without it fails @@species test
+         return !GLOBAL_CORE_JS_PROMISE && IS_BROWSER && !NATIVE_REJECTION_EVENT;
+       });
+
+       var INCORRECT_ITERATION$1 = FORCED$g || !checkCorrectnessOfIteration$3(function (iterable) {
+         PromiseConstructor.all(iterable)['catch'](function () { /* empty */ });
+       });
+
+       // helpers
+       var isThenable = function (it) {
+         var then;
+         return isObject$i(it) && isCallable$7(then = it.then) ? then : false;
+       };
+
+       var callReaction = function (reaction, state) {
+         var value = state.value;
+         var ok = state.state == FULFILLED;
+         var handler = ok ? reaction.ok : reaction.fail;
+         var resolve = reaction.resolve;
+         var reject = reaction.reject;
+         var domain = reaction.domain;
+         var result, then, exited;
+         try {
+           if (handler) {
+             if (!ok) {
+               if (state.rejection === UNHANDLED) onHandleUnhandled(state);
+               state.rejection = HANDLED;
+             }
+             if (handler === true) result = value;
+             else {
+               if (domain) domain.enter();
+               result = handler(value); // can throw
+               if (domain) {
+                 domain.exit();
+                 exited = true;
+               }
+             }
+             if (result === reaction.promise) {
+               reject(TypeError$a('Promise-chain cycle'));
+             } else if (then = isThenable(result)) {
+               call$e(then, result, resolve, reject);
+             } else resolve(result);
+           } else reject(value);
+         } catch (error) {
+           if (domain && !exited) domain.exit();
+           reject(error);
+         }
+       };
+
+       var notify = function (state, isReject) {
+         if (state.notified) return;
+         state.notified = true;
+         microtask(function () {
+           var reactions = state.reactions;
+           var reaction;
+           while (reaction = reactions.get()) {
+             callReaction(reaction, state);
+           }
+           state.notified = false;
+           if (isReject && !state.rejection) onUnhandled(state);
+         });
+       };
+
+       var dispatchEvent$1 = function (name, promise, reason) {
+         var event, handler;
+         if (DISPATCH_EVENT) {
+           event = document$1.createEvent('Event');
+           event.promise = promise;
+           event.reason = reason;
+           event.initEvent(name, false, true);
+           global$z.dispatchEvent(event);
+         } else event = { promise: promise, reason: reason };
+         if (!NATIVE_REJECTION_EVENT && (handler = global$z['on' + name])) handler(event);
+         else if (name === UNHANDLED_REJECTION) hostReportErrors('Unhandled promise rejection', reason);
+       };
+
+       var onUnhandled = function (state) {
+         call$e(task, global$z, function () {
+           var promise = state.facade;
+           var value = state.value;
+           var IS_UNHANDLED = isUnhandled(state);
+           var result;
+           if (IS_UNHANDLED) {
+             result = perform(function () {
+               if (IS_NODE$2) {
+                 process$1.emit('unhandledRejection', value, promise);
+               } else dispatchEvent$1(UNHANDLED_REJECTION, promise, value);
+             });
+             // Browsers should not trigger `rejectionHandled` event if it was handled here, NodeJS - should
+             state.rejection = IS_NODE$2 || isUnhandled(state) ? UNHANDLED : HANDLED;
+             if (result.error) throw result.value;
+           }
+         });
+       };
+
+       var isUnhandled = function (state) {
+         return state.rejection !== HANDLED && !state.parent;
+       };
+
+       var onHandleUnhandled = function (state) {
+         call$e(task, global$z, function () {
+           var promise = state.facade;
+           if (IS_NODE$2) {
+             process$1.emit('rejectionHandled', promise);
+           } else dispatchEvent$1(REJECTION_HANDLED, promise, state.value);
+         });
+       };
+
+       var bind$a = function (fn, state, unwrap) {
+         return function (value) {
+           fn(state, value, unwrap);
+         };
+       };
+
+       var internalReject = function (state, value, unwrap) {
+         if (state.done) return;
+         state.done = true;
+         if (unwrap) state = unwrap;
+         state.value = value;
+         state.state = REJECTED;
+         notify(state, true);
+       };
+
+       var internalResolve = function (state, value, unwrap) {
+         if (state.done) return;
+         state.done = true;
+         if (unwrap) state = unwrap;
+         try {
+           if (state.facade === value) throw TypeError$a("Promise can't be resolved itself");
+           var then = isThenable(value);
+           if (then) {
+             microtask(function () {
+               var wrapper = { done: false };
+               try {
+                 call$e(then, value,
+                   bind$a(internalResolve, wrapper, state),
+                   bind$a(internalReject, wrapper, state)
+                 );
+               } catch (error) {
+                 internalReject(wrapper, error, state);
+               }
+             });
+           } else {
+             state.value = value;
+             state.state = FULFILLED;
+             notify(state, false);
+           }
+         } catch (error) {
+           internalReject({ done: false }, error, state);
+         }
+       };
+
+       // constructor polyfill
+       if (FORCED$g) {
+         // 25.4.3.1 Promise(executor)
+         PromiseConstructor = function Promise(executor) {
+           anInstance$5(this, PromisePrototype);
+           aCallable$5(executor);
+           call$e(Internal, this);
+           var state = getInternalState$1(this);
+           try {
+             executor(bind$a(internalResolve, state), bind$a(internalReject, state));
+           } catch (error) {
+             internalReject(state, error);
+           }
+         };
+         PromisePrototype = PromiseConstructor.prototype;
+         // eslint-disable-next-line no-unused-vars -- required for `.length`
+         Internal = function Promise(executor) {
+           setInternalState$4(this, {
+             type: PROMISE,
+             done: false,
+             notified: false,
+             parent: false,
+             reactions: new Queue(),
+             rejection: false,
+             state: PENDING,
+             value: undefined
+           });
+         };
+         Internal.prototype = redefineAll$2(PromisePrototype, {
+           // `Promise.prototype.then` method
+           // https://tc39.es/ecma262/#sec-promise.prototype.then
+           // eslint-disable-next-line unicorn/no-thenable -- safe
+           then: function then(onFulfilled, onRejected) {
+             var state = getInternalPromiseState(this);
+             var reaction = newPromiseCapability(speciesConstructor$3(this, PromiseConstructor));
+             state.parent = true;
+             reaction.ok = isCallable$7(onFulfilled) ? onFulfilled : true;
+             reaction.fail = isCallable$7(onRejected) && onRejected;
+             reaction.domain = IS_NODE$2 ? process$1.domain : undefined;
+             if (state.state == PENDING) state.reactions.add(reaction);
+             else microtask(function () {
+               callReaction(reaction, state);
+             });
+             return reaction.promise;
+           },
+           // `Promise.prototype.catch` method
+           // https://tc39.es/ecma262/#sec-promise.prototype.catch
+           'catch': function (onRejected) {
+             return this.then(undefined, onRejected);
+           }
+         });
+         OwnPromiseCapability = function () {
+           var promise = new Internal();
+           var state = getInternalState$1(promise);
+           this.promise = promise;
+           this.resolve = bind$a(internalResolve, state);
+           this.reject = bind$a(internalReject, state);
+         };
+         newPromiseCapabilityModule.f = newPromiseCapability = function (C) {
+           return C === PromiseConstructor || C === PromiseWrapper
+             ? new OwnPromiseCapability(C)
+             : newGenericPromiseCapability(C);
+         };
+
+         if (isCallable$7(NativePromise$1) && NativePromisePrototype !== Object.prototype) {
+           nativeThen = NativePromisePrototype.then;
+
+           if (!SUBCLASSING) {
+             // make `Promise#then` return a polyfilled `Promise` for native promise-based APIs
+             redefine$8(NativePromisePrototype, 'then', function then(onFulfilled, onRejected) {
+               var that = this;
+               return new PromiseConstructor(function (resolve, reject) {
+                 call$e(nativeThen, that, resolve, reject);
+               }).then(onFulfilled, onRejected);
+             // https://github.com/zloirock/core-js/issues/640
+             }, { unsafe: true });
+
+             // makes sure that native promise-based APIs `Promise#catch` properly works with patched `Promise#then`
+             redefine$8(NativePromisePrototype, 'catch', PromisePrototype['catch'], { unsafe: true });
+           }
+
+           // make `.constructor === Promise` work for native promise-based APIs
+           try {
+             delete NativePromisePrototype.constructor;
+           } catch (error) { /* empty */ }
+
+           // make `instanceof Promise` work for native promise-based APIs
+           if (setPrototypeOf$3) {
+             setPrototypeOf$3(NativePromisePrototype, PromisePrototype);
+           }
+         }
+       }
+
+       $$$({ global: true, wrap: true, forced: FORCED$g }, {
+         Promise: PromiseConstructor
+       });
+
+       setToStringTag$5(PromiseConstructor, PROMISE, false);
+       setSpecies$3(PROMISE);
+
+       PromiseWrapper = getBuiltIn$3(PROMISE);
+
+       // statics
+       $$$({ target: PROMISE, stat: true, forced: FORCED$g }, {
+         // `Promise.reject` method
+         // https://tc39.es/ecma262/#sec-promise.reject
+         reject: function reject(r) {
+           var capability = newPromiseCapability(this);
+           call$e(capability.reject, undefined, r);
+           return capability.promise;
+         }
+       });
+
+       $$$({ target: PROMISE, stat: true, forced: FORCED$g }, {
+         // `Promise.resolve` method
+         // https://tc39.es/ecma262/#sec-promise.resolve
+         resolve: function resolve(x) {
+           return promiseResolve$1(this, x);
+         }
+       });
+
+       $$$({ target: PROMISE, stat: true, forced: INCORRECT_ITERATION$1 }, {
+         // `Promise.all` method
+         // https://tc39.es/ecma262/#sec-promise.all
+         all: function all(iterable) {
+           var C = this;
+           var capability = newPromiseCapability(C);
+           var resolve = capability.resolve;
+           var reject = capability.reject;
+           var result = perform(function () {
+             var $promiseResolve = aCallable$5(C.resolve);
+             var values = [];
+             var counter = 0;
+             var remaining = 1;
+             iterate$2(iterable, function (promise) {
+               var index = counter++;
+               var alreadyCalled = false;
+               remaining++;
+               call$e($promiseResolve, C, promise).then(function (value) {
+                 if (alreadyCalled) return;
+                 alreadyCalled = true;
+                 values[index] = value;
+                 --remaining || resolve(values);
+               }, reject);
+             });
+             --remaining || resolve(values);
+           });
+           if (result.error) reject(result.value);
+           return capability.promise;
+         },
+         // `Promise.race` method
+         // https://tc39.es/ecma262/#sec-promise.race
+         race: function race(iterable) {
+           var C = this;
+           var capability = newPromiseCapability(C);
+           var reject = capability.reject;
+           var result = perform(function () {
+             var $promiseResolve = aCallable$5(C.resolve);
+             iterate$2(iterable, function (promise) {
+               call$e($promiseResolve, C, promise).then(capability.resolve, reject);
+             });
+           });
+           if (result.error) reject(result.value);
+           return capability.promise;
+         }
+       });
+
+       var typedArrayConstructor = {exports: {}};
+
+       /* eslint-disable no-new -- required for testing */
+
+       var global$y = global$1o;
+       var fails$A = fails$V;
+       var checkCorrectnessOfIteration$2 = checkCorrectnessOfIteration$4;
+       var NATIVE_ARRAY_BUFFER_VIEWS$1 = arrayBufferViewCore.NATIVE_ARRAY_BUFFER_VIEWS;
+
+       var ArrayBuffer$2 = global$y.ArrayBuffer;
+       var Int8Array$3 = global$y.Int8Array;
+
+       var typedArrayConstructorsRequireWrappers = !NATIVE_ARRAY_BUFFER_VIEWS$1 || !fails$A(function () {
+         Int8Array$3(1);
+       }) || !fails$A(function () {
+         new Int8Array$3(-1);
+       }) || !checkCorrectnessOfIteration$2(function (iterable) {
+         new Int8Array$3();
+         new Int8Array$3(null);
+         new Int8Array$3(1.5);
+         new Int8Array$3(iterable);
+       }, true) || fails$A(function () {
+         // Safari (11+) bug - a reason why even Safari 13 should load a typed array polyfill
+         return new Int8Array$3(new ArrayBuffer$2(2), 1, undefined).length !== 1;
+       });
+
+       var isObject$h = isObject$s;
+
+       var floor$6 = Math.floor;
+
+       // `IsIntegralNumber` abstract operation
+       // https://tc39.es/ecma262/#sec-isintegralnumber
+       // eslint-disable-next-line es/no-number-isinteger -- safe
+       var isIntegralNumber$1 = Number.isInteger || function isInteger(it) {
+         return !isObject$h(it) && isFinite(it) && floor$6(it) === it;
+       };
+
+       var global$x = global$1o;
+       var toIntegerOrInfinity$5 = toIntegerOrInfinity$b;
+
+       var RangeError$9 = global$x.RangeError;
+
+       var toPositiveInteger$1 = function (it) {
+         var result = toIntegerOrInfinity$5(it);
+         if (result < 0) throw RangeError$9("The argument can't be less than 0");
+         return result;
+       };
+
+       var global$w = global$1o;
+       var toPositiveInteger = toPositiveInteger$1;
+
+       var RangeError$8 = global$w.RangeError;
+
+       var toOffset$2 = function (it, BYTES) {
+         var offset = toPositiveInteger(it);
+         if (offset % BYTES) throw RangeError$8('Wrong offset');
+         return offset;
+       };
+
+       var bind$9 = functionBindContext;
+       var call$d = functionCall;
+       var aConstructor$1 = aConstructor$3;
+       var toObject$c = toObject$i;
+       var lengthOfArrayLike$c = lengthOfArrayLike$i;
+       var getIterator$2 = getIterator$4;
+       var getIteratorMethod$2 = getIteratorMethod$5;
+       var isArrayIteratorMethod$1 = isArrayIteratorMethod$3;
+       var aTypedArrayConstructor$2 = arrayBufferViewCore.aTypedArrayConstructor;
+
+       var typedArrayFrom$2 = function from(source /* , mapfn, thisArg */) {
+         var C = aConstructor$1(this);
+         var O = toObject$c(source);
+         var argumentsLength = arguments.length;
+         var mapfn = argumentsLength > 1 ? arguments[1] : undefined;
+         var mapping = mapfn !== undefined;
+         var iteratorMethod = getIteratorMethod$2(O);
+         var i, length, result, step, iterator, next;
+         if (iteratorMethod && !isArrayIteratorMethod$1(iteratorMethod)) {
+           iterator = getIterator$2(O, iteratorMethod);
+           next = iterator.next;
+           O = [];
+           while (!(step = call$d(next, iterator)).done) {
+             O.push(step.value);
+           }
+         }
+         if (mapping && argumentsLength > 2) {
+           mapfn = bind$9(mapfn, arguments[2]);
+         }
+         length = lengthOfArrayLike$c(O);
+         result = new (aTypedArrayConstructor$2(C))(length);
+         for (i = 0; length > i; i++) {
+           result[i] = mapping ? mapfn(O[i], i) : O[i];
+         }
+         return result;
+       };
+
+       var isCallable$6 = isCallable$r;
+       var isObject$g = isObject$s;
+       var setPrototypeOf$2 = objectSetPrototypeOf;
+
+       // makes subclassing work correct for wrapped built-ins
+       var inheritIfRequired$4 = function ($this, dummy, Wrapper) {
+         var NewTarget, NewTargetPrototype;
+         if (
+           // it can work only with native `setPrototypeOf`
+           setPrototypeOf$2 &&
+           // we haven't completely correct pre-ES6 way for getting `new.target`, so use this
+           isCallable$6(NewTarget = dummy.constructor) &&
+           NewTarget !== Wrapper &&
+           isObject$g(NewTargetPrototype = NewTarget.prototype) &&
+           NewTargetPrototype !== Wrapper.prototype
+         ) setPrototypeOf$2($this, NewTargetPrototype);
+         return $this;
+       };
+
+       var $$_ = _export;
+       var global$v = global$1o;
+       var call$c = functionCall;
+       var DESCRIPTORS$c = descriptors;
+       var TYPED_ARRAYS_CONSTRUCTORS_REQUIRES_WRAPPERS$1 = typedArrayConstructorsRequireWrappers;
+       var ArrayBufferViewCore$n = arrayBufferViewCore;
+       var ArrayBufferModule = arrayBuffer;
+       var anInstance$4 = anInstance$7;
+       var createPropertyDescriptor$1 = createPropertyDescriptor$7;
+       var createNonEnumerableProperty$2 = createNonEnumerableProperty$b;
+       var isIntegralNumber = isIntegralNumber$1;
+       var toLength$7 = toLength$c;
+       var toIndex = toIndex$2;
+       var toOffset$1 = toOffset$2;
+       var toPropertyKey = toPropertyKey$5;
+       var hasOwn$7 = hasOwnProperty_1;
+       var classof$4 = classof$d;
+       var isObject$f = isObject$s;
+       var isSymbol$2 = isSymbol$6;
+       var create$7 = objectCreate;
+       var isPrototypeOf$3 = objectIsPrototypeOf;
+       var setPrototypeOf$1 = objectSetPrototypeOf;
+       var getOwnPropertyNames$2 = objectGetOwnPropertyNames.f;
+       var typedArrayFrom$1 = typedArrayFrom$2;
+       var forEach$1 = arrayIteration.forEach;
+       var setSpecies$2 = setSpecies$5;
+       var definePropertyModule = objectDefineProperty;
+       var getOwnPropertyDescriptorModule$1 = objectGetOwnPropertyDescriptor;
+       var InternalStateModule$3 = internalState;
+       var inheritIfRequired$3 = inheritIfRequired$4;
+
+       var getInternalState = InternalStateModule$3.get;
+       var setInternalState$3 = InternalStateModule$3.set;
+       var nativeDefineProperty = definePropertyModule.f;
+       var nativeGetOwnPropertyDescriptor$1 = getOwnPropertyDescriptorModule$1.f;
+       var round = Math.round;
+       var RangeError$7 = global$v.RangeError;
+       var ArrayBuffer$1 = ArrayBufferModule.ArrayBuffer;
+       var ArrayBufferPrototype = ArrayBuffer$1.prototype;
+       var DataView$1 = ArrayBufferModule.DataView;
+       var NATIVE_ARRAY_BUFFER_VIEWS = ArrayBufferViewCore$n.NATIVE_ARRAY_BUFFER_VIEWS;
+       var TYPED_ARRAY_CONSTRUCTOR$1 = ArrayBufferViewCore$n.TYPED_ARRAY_CONSTRUCTOR;
+       var TYPED_ARRAY_TAG = ArrayBufferViewCore$n.TYPED_ARRAY_TAG;
+       var TypedArray = ArrayBufferViewCore$n.TypedArray;
+       var TypedArrayPrototype$1 = ArrayBufferViewCore$n.TypedArrayPrototype;
+       var aTypedArrayConstructor$1 = ArrayBufferViewCore$n.aTypedArrayConstructor;
+       var isTypedArray = ArrayBufferViewCore$n.isTypedArray;
+       var BYTES_PER_ELEMENT = 'BYTES_PER_ELEMENT';
+       var WRONG_LENGTH = 'Wrong length';
+
+       var fromList = function (C, list) {
+         aTypedArrayConstructor$1(C);
+         var index = 0;
+         var length = list.length;
+         var result = new C(length);
+         while (length > index) result[index] = list[index++];
+         return result;
+       };
+
+       var addGetter = function (it, key) {
+         nativeDefineProperty(it, key, { get: function () {
+           return getInternalState(this)[key];
+         } });
+       };
+
+       var isArrayBuffer = function (it) {
+         var klass;
+         return isPrototypeOf$3(ArrayBufferPrototype, it) || (klass = classof$4(it)) == 'ArrayBuffer' || klass == 'SharedArrayBuffer';
+       };
+
+       var isTypedArrayIndex = function (target, key) {
+         return isTypedArray(target)
+           && !isSymbol$2(key)
+           && key in target
+           && isIntegralNumber(+key)
+           && key >= 0;
+       };
+
+       var wrappedGetOwnPropertyDescriptor = function getOwnPropertyDescriptor(target, key) {
+         key = toPropertyKey(key);
+         return isTypedArrayIndex(target, key)
+           ? createPropertyDescriptor$1(2, target[key])
+           : nativeGetOwnPropertyDescriptor$1(target, key);
+       };
+
+       var wrappedDefineProperty = function defineProperty(target, key, descriptor) {
+         key = toPropertyKey(key);
+         if (isTypedArrayIndex(target, key)
+           && isObject$f(descriptor)
+           && hasOwn$7(descriptor, 'value')
+           && !hasOwn$7(descriptor, 'get')
+           && !hasOwn$7(descriptor, 'set')
+           // TODO: add validation descriptor w/o calling accessors
+           && !descriptor.configurable
+           && (!hasOwn$7(descriptor, 'writable') || descriptor.writable)
+           && (!hasOwn$7(descriptor, 'enumerable') || descriptor.enumerable)
+         ) {
+           target[key] = descriptor.value;
+           return target;
+         } return nativeDefineProperty(target, key, descriptor);
+       };
+
+       if (DESCRIPTORS$c) {
+         if (!NATIVE_ARRAY_BUFFER_VIEWS) {
+           getOwnPropertyDescriptorModule$1.f = wrappedGetOwnPropertyDescriptor;
+           definePropertyModule.f = wrappedDefineProperty;
+           addGetter(TypedArrayPrototype$1, 'buffer');
+           addGetter(TypedArrayPrototype$1, 'byteOffset');
+           addGetter(TypedArrayPrototype$1, 'byteLength');
+           addGetter(TypedArrayPrototype$1, 'length');
+         }
+
+         $$_({ target: 'Object', stat: true, forced: !NATIVE_ARRAY_BUFFER_VIEWS }, {
+           getOwnPropertyDescriptor: wrappedGetOwnPropertyDescriptor,
+           defineProperty: wrappedDefineProperty
+         });
+
+         typedArrayConstructor.exports = function (TYPE, wrapper, CLAMPED) {
+           var BYTES = TYPE.match(/\d+$/)[0] / 8;
+           var CONSTRUCTOR_NAME = TYPE + (CLAMPED ? 'Clamped' : '') + 'Array';
+           var GETTER = 'get' + TYPE;
+           var SETTER = 'set' + TYPE;
+           var NativeTypedArrayConstructor = global$v[CONSTRUCTOR_NAME];
+           var TypedArrayConstructor = NativeTypedArrayConstructor;
+           var TypedArrayConstructorPrototype = TypedArrayConstructor && TypedArrayConstructor.prototype;
+           var exported = {};
+
+           var getter = function (that, index) {
+             var data = getInternalState(that);
+             return data.view[GETTER](index * BYTES + data.byteOffset, true);
+           };
+
+           var setter = function (that, index, value) {
+             var data = getInternalState(that);
+             if (CLAMPED) value = (value = round(value)) < 0 ? 0 : value > 0xFF ? 0xFF : value & 0xFF;
+             data.view[SETTER](index * BYTES + data.byteOffset, value, true);
+           };
+
+           var addElement = function (that, index) {
+             nativeDefineProperty(that, index, {
+               get: function () {
+                 return getter(this, index);
+               },
+               set: function (value) {
+                 return setter(this, index, value);
+               },
+               enumerable: true
+             });
+           };
+
+           if (!NATIVE_ARRAY_BUFFER_VIEWS) {
+             TypedArrayConstructor = wrapper(function (that, data, offset, $length) {
+               anInstance$4(that, TypedArrayConstructorPrototype);
+               var index = 0;
+               var byteOffset = 0;
+               var buffer, byteLength, length;
+               if (!isObject$f(data)) {
+                 length = toIndex(data);
+                 byteLength = length * BYTES;
+                 buffer = new ArrayBuffer$1(byteLength);
+               } else if (isArrayBuffer(data)) {
+                 buffer = data;
+                 byteOffset = toOffset$1(offset, BYTES);
+                 var $len = data.byteLength;
+                 if ($length === undefined) {
+                   if ($len % BYTES) throw RangeError$7(WRONG_LENGTH);
+                   byteLength = $len - byteOffset;
+                   if (byteLength < 0) throw RangeError$7(WRONG_LENGTH);
+                 } else {
+                   byteLength = toLength$7($length) * BYTES;
+                   if (byteLength + byteOffset > $len) throw RangeError$7(WRONG_LENGTH);
+                 }
+                 length = byteLength / BYTES;
+               } else if (isTypedArray(data)) {
+                 return fromList(TypedArrayConstructor, data);
+               } else {
+                 return call$c(typedArrayFrom$1, TypedArrayConstructor, data);
+               }
+               setInternalState$3(that, {
+                 buffer: buffer,
+                 byteOffset: byteOffset,
+                 byteLength: byteLength,
+                 length: length,
+                 view: new DataView$1(buffer)
+               });
+               while (index < length) addElement(that, index++);
+             });
+
+             if (setPrototypeOf$1) setPrototypeOf$1(TypedArrayConstructor, TypedArray);
+             TypedArrayConstructorPrototype = TypedArrayConstructor.prototype = create$7(TypedArrayPrototype$1);
+           } else if (TYPED_ARRAYS_CONSTRUCTORS_REQUIRES_WRAPPERS$1) {
+             TypedArrayConstructor = wrapper(function (dummy, data, typedArrayOffset, $length) {
+               anInstance$4(dummy, TypedArrayConstructorPrototype);
+               return inheritIfRequired$3(function () {
+                 if (!isObject$f(data)) return new NativeTypedArrayConstructor(toIndex(data));
+                 if (isArrayBuffer(data)) return $length !== undefined
+                   ? new NativeTypedArrayConstructor(data, toOffset$1(typedArrayOffset, BYTES), $length)
+                   : typedArrayOffset !== undefined
+                     ? new NativeTypedArrayConstructor(data, toOffset$1(typedArrayOffset, BYTES))
+                     : new NativeTypedArrayConstructor(data);
+                 if (isTypedArray(data)) return fromList(TypedArrayConstructor, data);
+                 return call$c(typedArrayFrom$1, TypedArrayConstructor, data);
+               }(), dummy, TypedArrayConstructor);
+             });
+
+             if (setPrototypeOf$1) setPrototypeOf$1(TypedArrayConstructor, TypedArray);
+             forEach$1(getOwnPropertyNames$2(NativeTypedArrayConstructor), function (key) {
+               if (!(key in TypedArrayConstructor)) {
+                 createNonEnumerableProperty$2(TypedArrayConstructor, key, NativeTypedArrayConstructor[key]);
+               }
+             });
+             TypedArrayConstructor.prototype = TypedArrayConstructorPrototype;
+           }
+
+           if (TypedArrayConstructorPrototype.constructor !== TypedArrayConstructor) {
+             createNonEnumerableProperty$2(TypedArrayConstructorPrototype, 'constructor', TypedArrayConstructor);
+           }
+
+           createNonEnumerableProperty$2(TypedArrayConstructorPrototype, TYPED_ARRAY_CONSTRUCTOR$1, TypedArrayConstructor);
+
+           if (TYPED_ARRAY_TAG) {
+             createNonEnumerableProperty$2(TypedArrayConstructorPrototype, TYPED_ARRAY_TAG, CONSTRUCTOR_NAME);
+           }
+
+           exported[CONSTRUCTOR_NAME] = TypedArrayConstructor;
+
+           $$_({
+             global: true, forced: TypedArrayConstructor != NativeTypedArrayConstructor, sham: !NATIVE_ARRAY_BUFFER_VIEWS
+           }, exported);
+
+           if (!(BYTES_PER_ELEMENT in TypedArrayConstructor)) {
+             createNonEnumerableProperty$2(TypedArrayConstructor, BYTES_PER_ELEMENT, BYTES);
+           }
+
+           if (!(BYTES_PER_ELEMENT in TypedArrayConstructorPrototype)) {
+             createNonEnumerableProperty$2(TypedArrayConstructorPrototype, BYTES_PER_ELEMENT, BYTES);
+           }
+
+           setSpecies$2(CONSTRUCTOR_NAME);
+         };
+       } else typedArrayConstructor.exports = function () { /* empty */ };
+
+       var createTypedArrayConstructor$1 = typedArrayConstructor.exports;
+
+       // `Uint8Array` constructor
+       // https://tc39.es/ecma262/#sec-typedarray-objects
+       createTypedArrayConstructor$1('Uint8', function (init) {
+         return function Uint8Array(data, byteOffset, length) {
+           return init(this, data, byteOffset, length);
+         };
+       });
+
+       var toObject$b = toObject$i;
+       var toAbsoluteIndex$4 = toAbsoluteIndex$9;
+       var lengthOfArrayLike$b = lengthOfArrayLike$i;
+
+       var min$7 = Math.min;
+
+       // `Array.prototype.copyWithin` method implementation
+       // https://tc39.es/ecma262/#sec-array.prototype.copywithin
+       // eslint-disable-next-line es/no-array-prototype-copywithin -- safe
+       var arrayCopyWithin = [].copyWithin || function copyWithin(target /* = 0 */, start /* = 0, end = @length */) {
+         var O = toObject$b(this);
+         var len = lengthOfArrayLike$b(O);
+         var to = toAbsoluteIndex$4(target, len);
+         var from = toAbsoluteIndex$4(start, len);
+         var end = arguments.length > 2 ? arguments[2] : undefined;
+         var count = min$7((end === undefined ? len : toAbsoluteIndex$4(end, len)) - from, len - to);
+         var inc = 1;
+         if (from < to && to < from + count) {
+           inc = -1;
+           from += count - 1;
+           to += count - 1;
+         }
+         while (count-- > 0) {
+           if (from in O) O[to] = O[from];
+           else delete O[to];
+           to += inc;
+           from += inc;
+         } return O;
+       };
+
+       var uncurryThis$A = functionUncurryThis;
+       var ArrayBufferViewCore$m = arrayBufferViewCore;
+       var $ArrayCopyWithin = arrayCopyWithin;
+
+       var u$ArrayCopyWithin = uncurryThis$A($ArrayCopyWithin);
+       var aTypedArray$l = ArrayBufferViewCore$m.aTypedArray;
+       var exportTypedArrayMethod$m = ArrayBufferViewCore$m.exportTypedArrayMethod;
+
+       // `%TypedArray%.prototype.copyWithin` method
+       // https://tc39.es/ecma262/#sec-%typedarray%.prototype.copywithin
+       exportTypedArrayMethod$m('copyWithin', function copyWithin(target, start /* , end */) {
+         return u$ArrayCopyWithin(aTypedArray$l(this), target, start, arguments.length > 2 ? arguments[2] : undefined);
+       });
+
+       var ArrayBufferViewCore$l = arrayBufferViewCore;
+       var $every$1 = arrayIteration.every;
+
+       var aTypedArray$k = ArrayBufferViewCore$l.aTypedArray;
+       var exportTypedArrayMethod$l = ArrayBufferViewCore$l.exportTypedArrayMethod;
+
+       // `%TypedArray%.prototype.every` method
+       // https://tc39.es/ecma262/#sec-%typedarray%.prototype.every
+       exportTypedArrayMethod$l('every', function every(callbackfn /* , thisArg */) {
+         return $every$1(aTypedArray$k(this), callbackfn, arguments.length > 1 ? arguments[1] : undefined);
+       });
+
+       var ArrayBufferViewCore$k = arrayBufferViewCore;
+       var call$b = functionCall;
+       var $fill = arrayFill$1;
+
+       var aTypedArray$j = ArrayBufferViewCore$k.aTypedArray;
+       var exportTypedArrayMethod$k = ArrayBufferViewCore$k.exportTypedArrayMethod;
+
+       // `%TypedArray%.prototype.fill` method
+       // https://tc39.es/ecma262/#sec-%typedarray%.prototype.fill
+       exportTypedArrayMethod$k('fill', function fill(value /* , start, end */) {
+         var length = arguments.length;
+         return call$b(
+           $fill,
+           aTypedArray$j(this),
+           value,
+           length > 1 ? arguments[1] : undefined,
+           length > 2 ? arguments[2] : undefined
+         );
+       });
+
+       var lengthOfArrayLike$a = lengthOfArrayLike$i;
+
+       var arrayFromConstructorAndList$1 = function (Constructor, list) {
+         var index = 0;
+         var length = lengthOfArrayLike$a(list);
+         var result = new Constructor(length);
+         while (length > index) result[index] = list[index++];
+         return result;
+       };
+
+       var ArrayBufferViewCore$j = arrayBufferViewCore;
+       var speciesConstructor$2 = speciesConstructor$5;
+
+       var TYPED_ARRAY_CONSTRUCTOR = ArrayBufferViewCore$j.TYPED_ARRAY_CONSTRUCTOR;
+       var aTypedArrayConstructor = ArrayBufferViewCore$j.aTypedArrayConstructor;
+
+       // a part of `TypedArraySpeciesCreate` abstract operation
+       // https://tc39.es/ecma262/#typedarray-species-create
+       var typedArraySpeciesConstructor$4 = function (originalArray) {
+         return aTypedArrayConstructor(speciesConstructor$2(originalArray, originalArray[TYPED_ARRAY_CONSTRUCTOR]));
+       };
+
+       var arrayFromConstructorAndList = arrayFromConstructorAndList$1;
+       var typedArraySpeciesConstructor$3 = typedArraySpeciesConstructor$4;
+
+       var typedArrayFromSpeciesAndList = function (instance, list) {
+         return arrayFromConstructorAndList(typedArraySpeciesConstructor$3(instance), list);
+       };
+
+       var ArrayBufferViewCore$i = arrayBufferViewCore;
+       var $filter$1 = arrayIteration.filter;
+       var fromSpeciesAndList = typedArrayFromSpeciesAndList;
+
+       var aTypedArray$i = ArrayBufferViewCore$i.aTypedArray;
+       var exportTypedArrayMethod$j = ArrayBufferViewCore$i.exportTypedArrayMethod;
+
+       // `%TypedArray%.prototype.filter` method
+       // https://tc39.es/ecma262/#sec-%typedarray%.prototype.filter
+       exportTypedArrayMethod$j('filter', function filter(callbackfn /* , thisArg */) {
+         var list = $filter$1(aTypedArray$i(this), callbackfn, arguments.length > 1 ? arguments[1] : undefined);
+         return fromSpeciesAndList(this, list);
+       });
+
+       var ArrayBufferViewCore$h = arrayBufferViewCore;
+       var $find$1 = arrayIteration.find;
+
+       var aTypedArray$h = ArrayBufferViewCore$h.aTypedArray;
+       var exportTypedArrayMethod$i = ArrayBufferViewCore$h.exportTypedArrayMethod;
+
+       // `%TypedArray%.prototype.find` method
+       // https://tc39.es/ecma262/#sec-%typedarray%.prototype.find
+       exportTypedArrayMethod$i('find', function find(predicate /* , thisArg */) {
+         return $find$1(aTypedArray$h(this), predicate, arguments.length > 1 ? arguments[1] : undefined);
+       });
+
+       var ArrayBufferViewCore$g = arrayBufferViewCore;
+       var $findIndex$1 = arrayIteration.findIndex;
+
+       var aTypedArray$g = ArrayBufferViewCore$g.aTypedArray;
+       var exportTypedArrayMethod$h = ArrayBufferViewCore$g.exportTypedArrayMethod;
+
+       // `%TypedArray%.prototype.findIndex` method
+       // https://tc39.es/ecma262/#sec-%typedarray%.prototype.findindex
+       exportTypedArrayMethod$h('findIndex', function findIndex(predicate /* , thisArg */) {
+         return $findIndex$1(aTypedArray$g(this), predicate, arguments.length > 1 ? arguments[1] : undefined);
+       });
+
+       var ArrayBufferViewCore$f = arrayBufferViewCore;
+       var $forEach = arrayIteration.forEach;
+
+       var aTypedArray$f = ArrayBufferViewCore$f.aTypedArray;
+       var exportTypedArrayMethod$g = ArrayBufferViewCore$f.exportTypedArrayMethod;
+
+       // `%TypedArray%.prototype.forEach` method
+       // https://tc39.es/ecma262/#sec-%typedarray%.prototype.foreach
+       exportTypedArrayMethod$g('forEach', function forEach(callbackfn /* , thisArg */) {
+         $forEach(aTypedArray$f(this), callbackfn, arguments.length > 1 ? arguments[1] : undefined);
+       });
+
+       var ArrayBufferViewCore$e = arrayBufferViewCore;
+       var $includes$1 = arrayIncludes.includes;
+
+       var aTypedArray$e = ArrayBufferViewCore$e.aTypedArray;
+       var exportTypedArrayMethod$f = ArrayBufferViewCore$e.exportTypedArrayMethod;
+
+       // `%TypedArray%.prototype.includes` method
+       // https://tc39.es/ecma262/#sec-%typedarray%.prototype.includes
+       exportTypedArrayMethod$f('includes', function includes(searchElement /* , fromIndex */) {
+         return $includes$1(aTypedArray$e(this), searchElement, arguments.length > 1 ? arguments[1] : undefined);
+       });
+
+       var ArrayBufferViewCore$d = arrayBufferViewCore;
+       var $indexOf = arrayIncludes.indexOf;
+
+       var aTypedArray$d = ArrayBufferViewCore$d.aTypedArray;
+       var exportTypedArrayMethod$e = ArrayBufferViewCore$d.exportTypedArrayMethod;
+
+       // `%TypedArray%.prototype.indexOf` method
+       // https://tc39.es/ecma262/#sec-%typedarray%.prototype.indexof
+       exportTypedArrayMethod$e('indexOf', function indexOf(searchElement /* , fromIndex */) {
+         return $indexOf(aTypedArray$d(this), searchElement, arguments.length > 1 ? arguments[1] : undefined);
+       });
+
+       var global$u = global$1o;
+       var fails$z = fails$V;
+       var uncurryThis$z = functionUncurryThis;
+       var ArrayBufferViewCore$c = arrayBufferViewCore;
+       var ArrayIterators = es_array_iterator;
+       var wellKnownSymbol$9 = wellKnownSymbol$t;
+
+       var ITERATOR$4 = wellKnownSymbol$9('iterator');
+       var Uint8Array$2 = global$u.Uint8Array;
+       var arrayValues = uncurryThis$z(ArrayIterators.values);
+       var arrayKeys = uncurryThis$z(ArrayIterators.keys);
+       var arrayEntries = uncurryThis$z(ArrayIterators.entries);
+       var aTypedArray$c = ArrayBufferViewCore$c.aTypedArray;
+       var exportTypedArrayMethod$d = ArrayBufferViewCore$c.exportTypedArrayMethod;
+       var TypedArrayPrototype = Uint8Array$2 && Uint8Array$2.prototype;
+
+       var GENERIC = !fails$z(function () {
+         TypedArrayPrototype[ITERATOR$4].call([1]);
+       });
+
+       var ITERATOR_IS_VALUES = !!TypedArrayPrototype
+         && TypedArrayPrototype.values
+         && TypedArrayPrototype[ITERATOR$4] === TypedArrayPrototype.values
+         && TypedArrayPrototype.values.name === 'values';
+
+       var typedArrayValues = function values() {
+         return arrayValues(aTypedArray$c(this));
+       };
+
+       // `%TypedArray%.prototype.entries` method
+       // https://tc39.es/ecma262/#sec-%typedarray%.prototype.entries
+       exportTypedArrayMethod$d('entries', function entries() {
+         return arrayEntries(aTypedArray$c(this));
+       }, GENERIC);
+       // `%TypedArray%.prototype.keys` method
+       // https://tc39.es/ecma262/#sec-%typedarray%.prototype.keys
+       exportTypedArrayMethod$d('keys', function keys() {
+         return arrayKeys(aTypedArray$c(this));
+       }, GENERIC);
+       // `%TypedArray%.prototype.values` method
+       // https://tc39.es/ecma262/#sec-%typedarray%.prototype.values
+       exportTypedArrayMethod$d('values', typedArrayValues, GENERIC || !ITERATOR_IS_VALUES, { name: 'values' });
+       // `%TypedArray%.prototype[@@iterator]` method
+       // https://tc39.es/ecma262/#sec-%typedarray%.prototype-@@iterator
+       exportTypedArrayMethod$d(ITERATOR$4, typedArrayValues, GENERIC || !ITERATOR_IS_VALUES, { name: 'values' });
+
+       var ArrayBufferViewCore$b = arrayBufferViewCore;
+       var uncurryThis$y = functionUncurryThis;
+
+       var aTypedArray$b = ArrayBufferViewCore$b.aTypedArray;
+       var exportTypedArrayMethod$c = ArrayBufferViewCore$b.exportTypedArrayMethod;
+       var $join = uncurryThis$y([].join);
+
+       // `%TypedArray%.prototype.join` method
+       // https://tc39.es/ecma262/#sec-%typedarray%.prototype.join
+       exportTypedArrayMethod$c('join', function join(separator) {
+         return $join(aTypedArray$b(this), separator);
+       });
+
+       /* eslint-disable es/no-array-prototype-lastindexof -- safe */
+       var apply$6 = functionApply;
+       var toIndexedObject$5 = toIndexedObject$d;
+       var toIntegerOrInfinity$4 = toIntegerOrInfinity$b;
+       var lengthOfArrayLike$9 = lengthOfArrayLike$i;
+       var arrayMethodIsStrict$6 = arrayMethodIsStrict$9;
+
+       var min$6 = Math.min;
+       var $lastIndexOf$1 = [].lastIndexOf;
+       var NEGATIVE_ZERO = !!$lastIndexOf$1 && 1 / [1].lastIndexOf(1, -0) < 0;
+       var STRICT_METHOD$6 = arrayMethodIsStrict$6('lastIndexOf');
+       var FORCED$f = NEGATIVE_ZERO || !STRICT_METHOD$6;
+
+       // `Array.prototype.lastIndexOf` method implementation
+       // https://tc39.es/ecma262/#sec-array.prototype.lastindexof
+       var arrayLastIndexOf = FORCED$f ? function lastIndexOf(searchElement /* , fromIndex = @[*-1] */) {
+         // convert -0 to +0
+         if (NEGATIVE_ZERO) return apply$6($lastIndexOf$1, this, arguments) || 0;
+         var O = toIndexedObject$5(this);
+         var length = lengthOfArrayLike$9(O);
+         var index = length - 1;
+         if (arguments.length > 1) index = min$6(index, toIntegerOrInfinity$4(arguments[1]));
+         if (index < 0) index = length + index;
+         for (;index >= 0; index--) if (index in O && O[index] === searchElement) return index || 0;
+         return -1;
+       } : $lastIndexOf$1;
+
+       var ArrayBufferViewCore$a = arrayBufferViewCore;
+       var apply$5 = functionApply;
+       var $lastIndexOf = arrayLastIndexOf;
+
+       var aTypedArray$a = ArrayBufferViewCore$a.aTypedArray;
+       var exportTypedArrayMethod$b = ArrayBufferViewCore$a.exportTypedArrayMethod;
+
+       // `%TypedArray%.prototype.lastIndexOf` method
+       // https://tc39.es/ecma262/#sec-%typedarray%.prototype.lastindexof
+       exportTypedArrayMethod$b('lastIndexOf', function lastIndexOf(searchElement /* , fromIndex */) {
+         var length = arguments.length;
+         return apply$5($lastIndexOf, aTypedArray$a(this), length > 1 ? [searchElement, arguments[1]] : [searchElement]);
+       });
+
+       var ArrayBufferViewCore$9 = arrayBufferViewCore;
+       var $map = arrayIteration.map;
+       var typedArraySpeciesConstructor$2 = typedArraySpeciesConstructor$4;
+
+       var aTypedArray$9 = ArrayBufferViewCore$9.aTypedArray;
+       var exportTypedArrayMethod$a = ArrayBufferViewCore$9.exportTypedArrayMethod;
+
+       // `%TypedArray%.prototype.map` method
+       // https://tc39.es/ecma262/#sec-%typedarray%.prototype.map
+       exportTypedArrayMethod$a('map', function map(mapfn /* , thisArg */) {
+         return $map(aTypedArray$9(this), mapfn, arguments.length > 1 ? arguments[1] : undefined, function (O, length) {
+           return new (typedArraySpeciesConstructor$2(O))(length);
+         });
+       });
+
+       var global$t = global$1o;
+       var aCallable$4 = aCallable$a;
+       var toObject$a = toObject$i;
+       var IndexedObject$2 = indexedObject;
+       var lengthOfArrayLike$8 = lengthOfArrayLike$i;
+
+       var TypeError$9 = global$t.TypeError;
+
+       // `Array.prototype.{ reduce, reduceRight }` methods implementation
+       var createMethod$3 = function (IS_RIGHT) {
+         return function (that, callbackfn, argumentsLength, memo) {
+           aCallable$4(callbackfn);
+           var O = toObject$a(that);
+           var self = IndexedObject$2(O);
+           var length = lengthOfArrayLike$8(O);
+           var index = IS_RIGHT ? length - 1 : 0;
+           var i = IS_RIGHT ? -1 : 1;
+           if (argumentsLength < 2) while (true) {
+             if (index in self) {
+               memo = self[index];
+               index += i;
+               break;
+             }
+             index += i;
+             if (IS_RIGHT ? index < 0 : length <= index) {
+               throw TypeError$9('Reduce of empty array with no initial value');
+             }
+           }
+           for (;IS_RIGHT ? index >= 0 : length > index; index += i) if (index in self) {
+             memo = callbackfn(memo, self[index], index, O);
+           }
+           return memo;
+         };
+       };
+
+       var arrayReduce = {
+         // `Array.prototype.reduce` method
+         // https://tc39.es/ecma262/#sec-array.prototype.reduce
+         left: createMethod$3(false),
+         // `Array.prototype.reduceRight` method
+         // https://tc39.es/ecma262/#sec-array.prototype.reduceright
+         right: createMethod$3(true)
+       };
+
+       var ArrayBufferViewCore$8 = arrayBufferViewCore;
+       var $reduce$1 = arrayReduce.left;
+
+       var aTypedArray$8 = ArrayBufferViewCore$8.aTypedArray;
+       var exportTypedArrayMethod$9 = ArrayBufferViewCore$8.exportTypedArrayMethod;
+
+       // `%TypedArray%.prototype.reduce` method
+       // https://tc39.es/ecma262/#sec-%typedarray%.prototype.reduce
+       exportTypedArrayMethod$9('reduce', function reduce(callbackfn /* , initialValue */) {
+         var length = arguments.length;
+         return $reduce$1(aTypedArray$8(this), callbackfn, length, length > 1 ? arguments[1] : undefined);
+       });
+
+       var ArrayBufferViewCore$7 = arrayBufferViewCore;
+       var $reduceRight$1 = arrayReduce.right;
+
+       var aTypedArray$7 = ArrayBufferViewCore$7.aTypedArray;
+       var exportTypedArrayMethod$8 = ArrayBufferViewCore$7.exportTypedArrayMethod;
+
+       // `%TypedArray%.prototype.reduceRicht` method
+       // https://tc39.es/ecma262/#sec-%typedarray%.prototype.reduceright
+       exportTypedArrayMethod$8('reduceRight', function reduceRight(callbackfn /* , initialValue */) {
+         var length = arguments.length;
+         return $reduceRight$1(aTypedArray$7(this), callbackfn, length, length > 1 ? arguments[1] : undefined);
+       });
+
+       var ArrayBufferViewCore$6 = arrayBufferViewCore;
+
+       var aTypedArray$6 = ArrayBufferViewCore$6.aTypedArray;
+       var exportTypedArrayMethod$7 = ArrayBufferViewCore$6.exportTypedArrayMethod;
+       var floor$5 = Math.floor;
+
+       // `%TypedArray%.prototype.reverse` method
+       // https://tc39.es/ecma262/#sec-%typedarray%.prototype.reverse
+       exportTypedArrayMethod$7('reverse', function reverse() {
+         var that = this;
+         var length = aTypedArray$6(that).length;
+         var middle = floor$5(length / 2);
+         var index = 0;
+         var value;
+         while (index < middle) {
+           value = that[index];
+           that[index++] = that[--length];
+           that[length] = value;
+         } return that;
+       });
+
+       var global$s = global$1o;
+       var call$a = functionCall;
+       var ArrayBufferViewCore$5 = arrayBufferViewCore;
+       var lengthOfArrayLike$7 = lengthOfArrayLike$i;
+       var toOffset = toOffset$2;
+       var toIndexedObject$4 = toObject$i;
+       var fails$y = fails$V;
+
+       var RangeError$6 = global$s.RangeError;
+       var Int8Array$2 = global$s.Int8Array;
+       var Int8ArrayPrototype = Int8Array$2 && Int8Array$2.prototype;
+       var $set = Int8ArrayPrototype && Int8ArrayPrototype.set;
+       var aTypedArray$5 = ArrayBufferViewCore$5.aTypedArray;
+       var exportTypedArrayMethod$6 = ArrayBufferViewCore$5.exportTypedArrayMethod;
+
+       var WORKS_WITH_OBJECTS_AND_GEERIC_ON_TYPED_ARRAYS = !fails$y(function () {
+         // eslint-disable-next-line es/no-typed-arrays -- required for testing
+         var array = new Uint8ClampedArray(2);
+         call$a($set, array, { length: 1, 0: 3 }, 1);
+         return array[1] !== 3;
+       });
+
+       // https://bugs.chromium.org/p/v8/issues/detail?id=11294 and other
+       var TO_OBJECT_BUG = WORKS_WITH_OBJECTS_AND_GEERIC_ON_TYPED_ARRAYS && ArrayBufferViewCore$5.NATIVE_ARRAY_BUFFER_VIEWS && fails$y(function () {
+         var array = new Int8Array$2(2);
+         array.set(1);
+         array.set('2', 1);
+         return array[0] !== 0 || array[1] !== 2;
+       });
+
+       // `%TypedArray%.prototype.set` method
+       // https://tc39.es/ecma262/#sec-%typedarray%.prototype.set
+       exportTypedArrayMethod$6('set', function set(arrayLike /* , offset */) {
+         aTypedArray$5(this);
+         var offset = toOffset(arguments.length > 1 ? arguments[1] : undefined, 1);
+         var src = toIndexedObject$4(arrayLike);
+         if (WORKS_WITH_OBJECTS_AND_GEERIC_ON_TYPED_ARRAYS) return call$a($set, this, src, offset);
+         var length = this.length;
+         var len = lengthOfArrayLike$7(src);
+         var index = 0;
+         if (len + offset > length) throw RangeError$6('Wrong length');
+         while (index < len) this[offset + index] = src[index++];
+       }, !WORKS_WITH_OBJECTS_AND_GEERIC_ON_TYPED_ARRAYS || TO_OBJECT_BUG);
+
+       var ArrayBufferViewCore$4 = arrayBufferViewCore;
+       var typedArraySpeciesConstructor$1 = typedArraySpeciesConstructor$4;
+       var fails$x = fails$V;
+       var arraySlice$7 = arraySlice$b;
+
+       var aTypedArray$4 = ArrayBufferViewCore$4.aTypedArray;
+       var exportTypedArrayMethod$5 = ArrayBufferViewCore$4.exportTypedArrayMethod;
+
+       var FORCED$e = fails$x(function () {
+         // eslint-disable-next-line es/no-typed-arrays -- required for testing
+         new Int8Array(1).slice();
+       });
+
+       // `%TypedArray%.prototype.slice` method
+       // https://tc39.es/ecma262/#sec-%typedarray%.prototype.slice
+       exportTypedArrayMethod$5('slice', function slice(start, end) {
+         var list = arraySlice$7(aTypedArray$4(this), start, end);
+         var C = typedArraySpeciesConstructor$1(this);
+         var index = 0;
+         var length = list.length;
+         var result = new C(length);
+         while (length > index) result[index] = list[index++];
+         return result;
+       }, FORCED$e);
+
+       var ArrayBufferViewCore$3 = arrayBufferViewCore;
+       var $some$1 = arrayIteration.some;
+
+       var aTypedArray$3 = ArrayBufferViewCore$3.aTypedArray;
+       var exportTypedArrayMethod$4 = ArrayBufferViewCore$3.exportTypedArrayMethod;
+
+       // `%TypedArray%.prototype.some` method
+       // https://tc39.es/ecma262/#sec-%typedarray%.prototype.some
+       exportTypedArrayMethod$4('some', function some(callbackfn /* , thisArg */) {
+         return $some$1(aTypedArray$3(this), callbackfn, arguments.length > 1 ? arguments[1] : undefined);
+       });
+
+       var arraySlice$6 = arraySliceSimple;
+
+       var floor$4 = Math.floor;
+
+       var mergeSort = function (array, comparefn) {
+         var length = array.length;
+         var middle = floor$4(length / 2);
+         return length < 8 ? insertionSort(array, comparefn) : merge$5(
+           array,
+           mergeSort(arraySlice$6(array, 0, middle), comparefn),
+           mergeSort(arraySlice$6(array, middle), comparefn),
+           comparefn
+         );
+       };
+
+       var insertionSort = function (array, comparefn) {
+         var length = array.length;
+         var i = 1;
+         var element, j;
+
+         while (i < length) {
+           j = i;
+           element = array[i];
+           while (j && comparefn(array[j - 1], element) > 0) {
+             array[j] = array[--j];
+           }
+           if (j !== i++) array[j] = element;
+         } return array;
+       };
+
+       var merge$5 = function (array, left, right, comparefn) {
+         var llength = left.length;
+         var rlength = right.length;
+         var lindex = 0;
+         var rindex = 0;
+
+         while (lindex < llength || rindex < rlength) {
+           array[lindex + rindex] = (lindex < llength && rindex < rlength)
+             ? comparefn(left[lindex], right[rindex]) <= 0 ? left[lindex++] : right[rindex++]
+             : lindex < llength ? left[lindex++] : right[rindex++];
+         } return array;
+       };
+
+       var arraySort$1 = mergeSort;
+
+       var userAgent$3 = engineUserAgent;
+
+       var firefox = userAgent$3.match(/firefox\/(\d+)/i);
+
+       var engineFfVersion = !!firefox && +firefox[1];
+
+       var UA = engineUserAgent;
+
+       var engineIsIeOrEdge = /MSIE|Trident/.test(UA);
+
+       var userAgent$2 = engineUserAgent;
+
+       var webkit = userAgent$2.match(/AppleWebKit\/(\d+)\./);
+
+       var engineWebkitVersion = !!webkit && +webkit[1];
+
+       var global$r = global$1o;
+       var uncurryThis$x = functionUncurryThis;
+       var fails$w = fails$V;
+       var aCallable$3 = aCallable$a;
+       var internalSort$1 = arraySort$1;
+       var ArrayBufferViewCore$2 = arrayBufferViewCore;
+       var FF$1 = engineFfVersion;
+       var IE_OR_EDGE$1 = engineIsIeOrEdge;
+       var V8$1 = engineV8Version;
+       var WEBKIT$1 = engineWebkitVersion;
+
+       var Array$3 = global$r.Array;
+       var aTypedArray$2 = ArrayBufferViewCore$2.aTypedArray;
+       var exportTypedArrayMethod$3 = ArrayBufferViewCore$2.exportTypedArrayMethod;
+       var Uint16Array = global$r.Uint16Array;
+       var un$Sort$1 = Uint16Array && uncurryThis$x(Uint16Array.prototype.sort);
+
+       // WebKit
+       var ACCEPT_INCORRECT_ARGUMENTS = !!un$Sort$1 && !(fails$w(function () {
+         un$Sort$1(new Uint16Array(2), null);
+       }) && fails$w(function () {
+         un$Sort$1(new Uint16Array(2), {});
+       }));
+
+       var STABLE_SORT$1 = !!un$Sort$1 && !fails$w(function () {
+         // feature detection can be too slow, so check engines versions
+         if (V8$1) return V8$1 < 74;
+         if (FF$1) return FF$1 < 67;
+         if (IE_OR_EDGE$1) return true;
+         if (WEBKIT$1) return WEBKIT$1 < 602;
+
+         var array = new Uint16Array(516);
+         var expected = Array$3(516);
+         var index, mod;
+
+         for (index = 0; index < 516; index++) {
+           mod = index % 4;
+           array[index] = 515 - index;
+           expected[index] = index - 2 * mod + 3;
+         }
+
+         un$Sort$1(array, function (a, b) {
+           return (a / 4 | 0) - (b / 4 | 0);
+         });
+
+         for (index = 0; index < 516; index++) {
+           if (array[index] !== expected[index]) return true;
+         }
+       });
+
+       var getSortCompare$1 = function (comparefn) {
+         return function (x, y) {
+           if (comparefn !== undefined) return +comparefn(x, y) || 0;
+           // eslint-disable-next-line no-self-compare -- NaN check
+           if (y !== y) return -1;
+           // eslint-disable-next-line no-self-compare -- NaN check
+           if (x !== x) return 1;
+           if (x === 0 && y === 0) return 1 / x > 0 && 1 / y < 0 ? 1 : -1;
+           return x > y;
+         };
+       };
+
+       // `%TypedArray%.prototype.sort` method
+       // https://tc39.es/ecma262/#sec-%typedarray%.prototype.sort
+       exportTypedArrayMethod$3('sort', function sort(comparefn) {
+         if (comparefn !== undefined) aCallable$3(comparefn);
+         if (STABLE_SORT$1) return un$Sort$1(this, comparefn);
+
+         return internalSort$1(aTypedArray$2(this), getSortCompare$1(comparefn));
+       }, !STABLE_SORT$1 || ACCEPT_INCORRECT_ARGUMENTS);
+
+       var ArrayBufferViewCore$1 = arrayBufferViewCore;
+       var toLength$6 = toLength$c;
+       var toAbsoluteIndex$3 = toAbsoluteIndex$9;
+       var typedArraySpeciesConstructor = typedArraySpeciesConstructor$4;
+
+       var aTypedArray$1 = ArrayBufferViewCore$1.aTypedArray;
+       var exportTypedArrayMethod$2 = ArrayBufferViewCore$1.exportTypedArrayMethod;
+
+       // `%TypedArray%.prototype.subarray` method
+       // https://tc39.es/ecma262/#sec-%typedarray%.prototype.subarray
+       exportTypedArrayMethod$2('subarray', function subarray(begin, end) {
+         var O = aTypedArray$1(this);
+         var length = O.length;
+         var beginIndex = toAbsoluteIndex$3(begin, length);
+         var C = typedArraySpeciesConstructor(O);
+         return new C(
+           O.buffer,
+           O.byteOffset + beginIndex * O.BYTES_PER_ELEMENT,
+           toLength$6((end === undefined ? length : toAbsoluteIndex$3(end, length)) - beginIndex)
+         );
+       });
+
+       var global$q = global$1o;
+       var apply$4 = functionApply;
+       var ArrayBufferViewCore = arrayBufferViewCore;
+       var fails$v = fails$V;
+       var arraySlice$5 = arraySlice$b;
+
+       var Int8Array$1 = global$q.Int8Array;
+       var aTypedArray = ArrayBufferViewCore.aTypedArray;
+       var exportTypedArrayMethod$1 = ArrayBufferViewCore.exportTypedArrayMethod;
+       var $toLocaleString = [].toLocaleString;
+
+       // iOS Safari 6.x fails here
+       var TO_LOCALE_STRING_BUG = !!Int8Array$1 && fails$v(function () {
+         $toLocaleString.call(new Int8Array$1(1));
+       });
+
+       var FORCED$d = fails$v(function () {
+         return [1, 2].toLocaleString() != new Int8Array$1([1, 2]).toLocaleString();
+       }) || !fails$v(function () {
+         Int8Array$1.prototype.toLocaleString.call([1, 2]);
+       });
+
+       // `%TypedArray%.prototype.toLocaleString` method
+       // https://tc39.es/ecma262/#sec-%typedarray%.prototype.tolocalestring
+       exportTypedArrayMethod$1('toLocaleString', function toLocaleString() {
+         return apply$4(
+           $toLocaleString,
+           TO_LOCALE_STRING_BUG ? arraySlice$5(aTypedArray(this)) : aTypedArray(this),
+           arraySlice$5(arguments)
+         );
+       }, FORCED$d);
+
+       var exportTypedArrayMethod = arrayBufferViewCore.exportTypedArrayMethod;
+       var fails$u = fails$V;
+       var global$p = global$1o;
+       var uncurryThis$w = functionUncurryThis;
+
+       var Uint8Array$1 = global$p.Uint8Array;
+       var Uint8ArrayPrototype = Uint8Array$1 && Uint8Array$1.prototype || {};
+       var arrayToString = [].toString;
+       var join$5 = uncurryThis$w([].join);
+
+       if (fails$u(function () { arrayToString.call({}); })) {
+         arrayToString = function toString() {
+           return join$5(this);
+         };
+       }
+
+       var IS_NOT_ARRAY_METHOD = Uint8ArrayPrototype.toString != arrayToString;
+
+       // `%TypedArray%.prototype.toString` method
+       // https://tc39.es/ecma262/#sec-%typedarray%.prototype.tostring
+       exportTypedArrayMethod('toString', arrayToString, IS_NOT_ARRAY_METHOD);
+
+       var $$Z = _export;
+       var uncurryThis$v = functionUncurryThis;
+       var IndexedObject$1 = indexedObject;
+       var toIndexedObject$3 = toIndexedObject$d;
+       var arrayMethodIsStrict$5 = arrayMethodIsStrict$9;
+
+       var un$Join = uncurryThis$v([].join);
+
+       var ES3_STRINGS = IndexedObject$1 != Object;
+       var STRICT_METHOD$5 = arrayMethodIsStrict$5('join', ',');
+
+       // `Array.prototype.join` method
+       // https://tc39.es/ecma262/#sec-array.prototype.join
+       $$Z({ target: 'Array', proto: true, forced: ES3_STRINGS || !STRICT_METHOD$5 }, {
+         join: function join(separator) {
+           return un$Join(toIndexedObject$3(this), separator === undefined ? ',' : separator);
+         }
+       });
+
+       var $$Y = _export;
+       var global$o = global$1o;
+       var isArray$4 = isArray$8;
+       var isConstructor$1 = isConstructor$4;
+       var isObject$e = isObject$s;
+       var toAbsoluteIndex$2 = toAbsoluteIndex$9;
+       var lengthOfArrayLike$6 = lengthOfArrayLike$i;
+       var toIndexedObject$2 = toIndexedObject$d;
+       var createProperty$3 = createProperty$5;
+       var wellKnownSymbol$8 = wellKnownSymbol$t;
+       var arrayMethodHasSpeciesSupport$3 = arrayMethodHasSpeciesSupport$5;
+       var un$Slice = arraySlice$b;
+
+       var HAS_SPECIES_SUPPORT$2 = arrayMethodHasSpeciesSupport$3('slice');
+
+       var SPECIES$1 = wellKnownSymbol$8('species');
+       var Array$2 = global$o.Array;
+       var max$3 = Math.max;
+
+       // `Array.prototype.slice` method
+       // https://tc39.es/ecma262/#sec-array.prototype.slice
+       // fallback for not array-like ES3 strings and DOM objects
+       $$Y({ target: 'Array', proto: true, forced: !HAS_SPECIES_SUPPORT$2 }, {
+         slice: function slice(start, end) {
+           var O = toIndexedObject$2(this);
+           var length = lengthOfArrayLike$6(O);
+           var k = toAbsoluteIndex$2(start, length);
+           var fin = toAbsoluteIndex$2(end === undefined ? length : end, length);
+           // inline `ArraySpeciesCreate` for usage native `Array#slice` where it's possible
+           var Constructor, result, n;
+           if (isArray$4(O)) {
+             Constructor = O.constructor;
+             // cross-realm fallback
+             if (isConstructor$1(Constructor) && (Constructor === Array$2 || isArray$4(Constructor.prototype))) {
+               Constructor = undefined;
+             } else if (isObject$e(Constructor)) {
+               Constructor = Constructor[SPECIES$1];
+               if (Constructor === null) Constructor = undefined;
+             }
+             if (Constructor === Array$2 || Constructor === undefined) {
+               return un$Slice(O, k, fin);
+             }
+           }
+           result = new (Constructor === undefined ? Array$2 : Constructor)(max$3(fin - k, 0));
+           for (n = 0; k < fin; k++, n++) if (k in O) createProperty$3(result, n, O[k]);
+           result.length = n;
+           return result;
+         }
+       });
+
+       var fails$t = fails$V;
+       var wellKnownSymbol$7 = wellKnownSymbol$t;
+       var IS_PURE = isPure;
+
+       var ITERATOR$3 = wellKnownSymbol$7('iterator');
+
+       var nativeUrl = !fails$t(function () {
+         // eslint-disable-next-line unicorn/relative-url-style -- required for testing
+         var url = new URL('b?a=1&b=2&c=3', 'http://a');
+         var searchParams = url.searchParams;
+         var result = '';
+         url.pathname = 'c%20d';
+         searchParams.forEach(function (value, key) {
+           searchParams['delete']('b');
+           result += key + value;
+         });
+         return (IS_PURE && !url.toJSON)
+           || !searchParams.sort
+           || url.href !== 'http://a/c%20d?a=1&c=3'
+           || searchParams.get('c') !== '3'
+           || String(new URLSearchParams('?a=1')) !== 'a=1'
+           || !searchParams[ITERATOR$3]
+           // throws in Edge
+           || new URL('https://a@b').username !== 'a'
+           || new URLSearchParams(new URLSearchParams('a=b')).get('a') !== 'b'
+           // not punycoded in Edge
+           || new URL('http://тест').host !== 'xn--e1aybc'
+           // not escaped in Chrome 62-
+           || new URL('http://a#б').hash !== '#%D0%B1'
+           // fails in Chrome 66-
+           || result !== 'a1c3'
+           // throws in Safari
+           || new URL('http://x', undefined).host !== 'x';
+       });
+
+       // TODO: in core-js@4, move /modules/ dependencies to public entries for better optimization by tools like `preset-env`
+
+       var $$X = _export;
+       var global$n = global$1o;
+       var getBuiltIn$2 = getBuiltIn$b;
+       var call$9 = functionCall;
+       var uncurryThis$u = functionUncurryThis;
+       var USE_NATIVE_URL$1 = nativeUrl;
+       var redefine$7 = redefine$h.exports;
+       var redefineAll$1 = redefineAll$4;
+       var setToStringTag$4 = setToStringTag$a;
+       var createIteratorConstructor = createIteratorConstructor$2;
+       var InternalStateModule$2 = internalState;
+       var anInstance$3 = anInstance$7;
+       var isCallable$5 = isCallable$r;
+       var hasOwn$6 = hasOwnProperty_1;
+       var bind$8 = functionBindContext;
+       var classof$3 = classof$d;
+       var anObject$9 = anObject$n;
+       var isObject$d = isObject$s;
+       var $toString$2 = toString$k;
+       var create$6 = objectCreate;
+       var createPropertyDescriptor = createPropertyDescriptor$7;
+       var getIterator$1 = getIterator$4;
+       var getIteratorMethod$1 = getIteratorMethod$5;
+       var validateArgumentsLength$2 = validateArgumentsLength$4;
+       var wellKnownSymbol$6 = wellKnownSymbol$t;
+       var arraySort = arraySort$1;
+
+       var ITERATOR$2 = wellKnownSymbol$6('iterator');
+       var URL_SEARCH_PARAMS = 'URLSearchParams';
+       var URL_SEARCH_PARAMS_ITERATOR = URL_SEARCH_PARAMS + 'Iterator';
+       var setInternalState$2 = InternalStateModule$2.set;
+       var getInternalParamsState = InternalStateModule$2.getterFor(URL_SEARCH_PARAMS);
+       var getInternalIteratorState = InternalStateModule$2.getterFor(URL_SEARCH_PARAMS_ITERATOR);
+
+       var n$Fetch = getBuiltIn$2('fetch');
+       var N$Request = getBuiltIn$2('Request');
+       var Headers$1 = getBuiltIn$2('Headers');
+       var RequestPrototype = N$Request && N$Request.prototype;
+       var HeadersPrototype = Headers$1 && Headers$1.prototype;
+       var RegExp$1 = global$n.RegExp;
+       var TypeError$8 = global$n.TypeError;
+       var decodeURIComponent$1 = global$n.decodeURIComponent;
+       var encodeURIComponent$1 = global$n.encodeURIComponent;
+       var charAt$5 = uncurryThis$u(''.charAt);
+       var join$4 = uncurryThis$u([].join);
+       var push$7 = uncurryThis$u([].push);
+       var replace$6 = uncurryThis$u(''.replace);
+       var shift$1 = uncurryThis$u([].shift);
+       var splice = uncurryThis$u([].splice);
+       var split$3 = uncurryThis$u(''.split);
+       var stringSlice$8 = uncurryThis$u(''.slice);
+
+       var plus = /\+/g;
+       var sequences = Array(4);
+
+       var percentSequence = function (bytes) {
+         return sequences[bytes - 1] || (sequences[bytes - 1] = RegExp$1('((?:%[\\da-f]{2}){' + bytes + '})', 'gi'));
+       };
+
+       var percentDecode = function (sequence) {
+         try {
+           return decodeURIComponent$1(sequence);
+         } catch (error) {
+           return sequence;
+         }
+       };
+
+       var deserialize = function (it) {
+         var result = replace$6(it, plus, ' ');
+         var bytes = 4;
+         try {
+           return decodeURIComponent$1(result);
+         } catch (error) {
+           while (bytes) {
+             result = replace$6(result, percentSequence(bytes--), percentDecode);
+           }
+           return result;
+         }
+       };
+
+       var find$1 = /[!'()~]|%20/g;
+
+       var replacements = {
+         '!': '%21',
+         "'": '%27',
+         '(': '%28',
+         ')': '%29',
+         '~': '%7E',
+         '%20': '+'
+       };
+
+       var replacer = function (match) {
+         return replacements[match];
+       };
+
+       var serialize = function (it) {
+         return replace$6(encodeURIComponent$1(it), find$1, replacer);
+       };
+
+       var URLSearchParamsIterator = createIteratorConstructor(function Iterator(params, kind) {
+         setInternalState$2(this, {
+           type: URL_SEARCH_PARAMS_ITERATOR,
+           iterator: getIterator$1(getInternalParamsState(params).entries),
+           kind: kind
+         });
+       }, 'Iterator', function next() {
+         var state = getInternalIteratorState(this);
+         var kind = state.kind;
+         var step = state.iterator.next();
+         var entry = step.value;
+         if (!step.done) {
+           step.value = kind === 'keys' ? entry.key : kind === 'values' ? entry.value : [entry.key, entry.value];
+         } return step;
+       }, true);
+
+       var URLSearchParamsState = function (init) {
+         this.entries = [];
+         this.url = null;
+
+         if (init !== undefined) {
+           if (isObject$d(init)) this.parseObject(init);
+           else this.parseQuery(typeof init == 'string' ? charAt$5(init, 0) === '?' ? stringSlice$8(init, 1) : init : $toString$2(init));
+         }
+       };
+
+       URLSearchParamsState.prototype = {
+         type: URL_SEARCH_PARAMS,
+         bindURL: function (url) {
+           this.url = url;
+           this.update();
+         },
+         parseObject: function (object) {
+           var iteratorMethod = getIteratorMethod$1(object);
+           var iterator, next, step, entryIterator, entryNext, first, second;
+
+           if (iteratorMethod) {
+             iterator = getIterator$1(object, iteratorMethod);
+             next = iterator.next;
+             while (!(step = call$9(next, iterator)).done) {
+               entryIterator = getIterator$1(anObject$9(step.value));
+               entryNext = entryIterator.next;
+               if (
+                 (first = call$9(entryNext, entryIterator)).done ||
+                 (second = call$9(entryNext, entryIterator)).done ||
+                 !call$9(entryNext, entryIterator).done
+               ) throw TypeError$8('Expected sequence with length 2');
+               push$7(this.entries, { key: $toString$2(first.value), value: $toString$2(second.value) });
+             }
+           } else for (var key in object) if (hasOwn$6(object, key)) {
+             push$7(this.entries, { key: key, value: $toString$2(object[key]) });
+           }
+         },
+         parseQuery: function (query) {
+           if (query) {
+             var attributes = split$3(query, '&');
+             var index = 0;
+             var attribute, entry;
+             while (index < attributes.length) {
+               attribute = attributes[index++];
+               if (attribute.length) {
+                 entry = split$3(attribute, '=');
+                 push$7(this.entries, {
+                   key: deserialize(shift$1(entry)),
+                   value: deserialize(join$4(entry, '='))
+                 });
+               }
+             }
+           }
+         },
+         serialize: function () {
+           var entries = this.entries;
+           var result = [];
+           var index = 0;
+           var entry;
+           while (index < entries.length) {
+             entry = entries[index++];
+             push$7(result, serialize(entry.key) + '=' + serialize(entry.value));
+           } return join$4(result, '&');
+         },
+         update: function () {
+           this.entries.length = 0;
+           this.parseQuery(this.url.query);
+         },
+         updateURL: function () {
+           if (this.url) this.url.update();
+         }
+       };
+
+       // `URLSearchParams` constructor
+       // https://url.spec.whatwg.org/#interface-urlsearchparams
+       var URLSearchParamsConstructor = function URLSearchParams(/* init */) {
+         anInstance$3(this, URLSearchParamsPrototype);
+         var init = arguments.length > 0 ? arguments[0] : undefined;
+         setInternalState$2(this, new URLSearchParamsState(init));
+       };
+
+       var URLSearchParamsPrototype = URLSearchParamsConstructor.prototype;
+
+       redefineAll$1(URLSearchParamsPrototype, {
+         // `URLSearchParams.prototype.append` method
+         // https://url.spec.whatwg.org/#dom-urlsearchparams-append
+         append: function append(name, value) {
+           validateArgumentsLength$2(arguments.length, 2);
+           var state = getInternalParamsState(this);
+           push$7(state.entries, { key: $toString$2(name), value: $toString$2(value) });
+           state.updateURL();
+         },
+         // `URLSearchParams.prototype.delete` method
+         // https://url.spec.whatwg.org/#dom-urlsearchparams-delete
+         'delete': function (name) {
+           validateArgumentsLength$2(arguments.length, 1);
+           var state = getInternalParamsState(this);
+           var entries = state.entries;
+           var key = $toString$2(name);
+           var index = 0;
+           while (index < entries.length) {
+             if (entries[index].key === key) splice(entries, index, 1);
+             else index++;
+           }
+           state.updateURL();
+         },
+         // `URLSearchParams.prototype.get` method
+         // https://url.spec.whatwg.org/#dom-urlsearchparams-get
+         get: function get(name) {
+           validateArgumentsLength$2(arguments.length, 1);
+           var entries = getInternalParamsState(this).entries;
+           var key = $toString$2(name);
+           var index = 0;
+           for (; index < entries.length; index++) {
+             if (entries[index].key === key) return entries[index].value;
+           }
+           return null;
+         },
+         // `URLSearchParams.prototype.getAll` method
+         // https://url.spec.whatwg.org/#dom-urlsearchparams-getall
+         getAll: function getAll(name) {
+           validateArgumentsLength$2(arguments.length, 1);
+           var entries = getInternalParamsState(this).entries;
+           var key = $toString$2(name);
+           var result = [];
+           var index = 0;
+           for (; index < entries.length; index++) {
+             if (entries[index].key === key) push$7(result, entries[index].value);
+           }
+           return result;
+         },
+         // `URLSearchParams.prototype.has` method
+         // https://url.spec.whatwg.org/#dom-urlsearchparams-has
+         has: function has(name) {
+           validateArgumentsLength$2(arguments.length, 1);
+           var entries = getInternalParamsState(this).entries;
+           var key = $toString$2(name);
+           var index = 0;
+           while (index < entries.length) {
+             if (entries[index++].key === key) return true;
+           }
+           return false;
+         },
+         // `URLSearchParams.prototype.set` method
+         // https://url.spec.whatwg.org/#dom-urlsearchparams-set
+         set: function set(name, value) {
+           validateArgumentsLength$2(arguments.length, 1);
+           var state = getInternalParamsState(this);
+           var entries = state.entries;
+           var found = false;
+           var key = $toString$2(name);
+           var val = $toString$2(value);
+           var index = 0;
+           var entry;
+           for (; index < entries.length; index++) {
+             entry = entries[index];
+             if (entry.key === key) {
+               if (found) splice(entries, index--, 1);
+               else {
+                 found = true;
+                 entry.value = val;
+               }
+             }
+           }
+           if (!found) push$7(entries, { key: key, value: val });
+           state.updateURL();
+         },
+         // `URLSearchParams.prototype.sort` method
+         // https://url.spec.whatwg.org/#dom-urlsearchparams-sort
+         sort: function sort() {
+           var state = getInternalParamsState(this);
+           arraySort(state.entries, function (a, b) {
+             return a.key > b.key ? 1 : -1;
+           });
+           state.updateURL();
+         },
+         // `URLSearchParams.prototype.forEach` method
+         forEach: function forEach(callback /* , thisArg */) {
+           var entries = getInternalParamsState(this).entries;
+           var boundFunction = bind$8(callback, arguments.length > 1 ? arguments[1] : undefined);
+           var index = 0;
+           var entry;
+           while (index < entries.length) {
+             entry = entries[index++];
+             boundFunction(entry.value, entry.key, this);
+           }
+         },
+         // `URLSearchParams.prototype.keys` method
+         keys: function keys() {
+           return new URLSearchParamsIterator(this, 'keys');
+         },
+         // `URLSearchParams.prototype.values` method
+         values: function values() {
+           return new URLSearchParamsIterator(this, 'values');
+         },
+         // `URLSearchParams.prototype.entries` method
+         entries: function entries() {
+           return new URLSearchParamsIterator(this, 'entries');
+         }
+       }, { enumerable: true });
+
+       // `URLSearchParams.prototype[@@iterator]` method
+       redefine$7(URLSearchParamsPrototype, ITERATOR$2, URLSearchParamsPrototype.entries, { name: 'entries' });
+
+       // `URLSearchParams.prototype.toString` method
+       // https://url.spec.whatwg.org/#urlsearchparams-stringification-behavior
+       redefine$7(URLSearchParamsPrototype, 'toString', function toString() {
+         return getInternalParamsState(this).serialize();
+       }, { enumerable: true });
+
+       setToStringTag$4(URLSearchParamsConstructor, URL_SEARCH_PARAMS);
+
+       $$X({ global: true, forced: !USE_NATIVE_URL$1 }, {
+         URLSearchParams: URLSearchParamsConstructor
+       });
+
+       // Wrap `fetch` and `Request` for correct work with polyfilled `URLSearchParams`
+       if (!USE_NATIVE_URL$1 && isCallable$5(Headers$1)) {
+         var headersHas = uncurryThis$u(HeadersPrototype.has);
+         var headersSet = uncurryThis$u(HeadersPrototype.set);
+
+         var wrapRequestOptions = function (init) {
+           if (isObject$d(init)) {
+             var body = init.body;
+             var headers;
+             if (classof$3(body) === URL_SEARCH_PARAMS) {
+               headers = init.headers ? new Headers$1(init.headers) : new Headers$1();
+               if (!headersHas(headers, 'content-type')) {
+                 headersSet(headers, 'content-type', 'application/x-www-form-urlencoded;charset=UTF-8');
+               }
+               return create$6(init, {
+                 body: createPropertyDescriptor(0, $toString$2(body)),
+                 headers: createPropertyDescriptor(0, headers)
+               });
+             }
+           } return init;
+         };
+
+         if (isCallable$5(n$Fetch)) {
+           $$X({ global: true, enumerable: true, forced: true }, {
+             fetch: function fetch(input /* , init */) {
+               return n$Fetch(input, arguments.length > 1 ? wrapRequestOptions(arguments[1]) : {});
+             }
+           });
+         }
+
+         if (isCallable$5(N$Request)) {
+           var RequestConstructor = function Request(input /* , init */) {
+             anInstance$3(this, RequestPrototype);
+             return new N$Request(input, arguments.length > 1 ? wrapRequestOptions(arguments[1]) : {});
+           };
+
+           RequestPrototype.constructor = RequestConstructor;
+           RequestConstructor.prototype = RequestPrototype;
+
+           $$X({ global: true, forced: true }, {
+             Request: RequestConstructor
+           });
+         }
+       }
+
+       var web_urlSearchParams = {
+         URLSearchParams: URLSearchParamsConstructor,
+         getState: getInternalParamsState
+       };
+
+       var uncurryThis$t = functionUncurryThis;
+       var PROPER_FUNCTION_NAME$1 = functionName.PROPER;
+       var redefine$6 = redefine$h.exports;
+       var anObject$8 = anObject$n;
+       var isPrototypeOf$2 = objectIsPrototypeOf;
+       var $toString$1 = toString$k;
+       var fails$s = fails$V;
+       var regExpFlags$2 = regexpFlags$1;
+
+       var TO_STRING = 'toString';
+       var RegExpPrototype$3 = RegExp.prototype;
+       var n$ToString = RegExpPrototype$3[TO_STRING];
+       var getFlags$1 = uncurryThis$t(regExpFlags$2);
+
+       var NOT_GENERIC = fails$s(function () { return n$ToString.call({ source: 'a', flags: 'b' }) != '/a/b'; });
+       // FF44- RegExp#toString has a wrong name
+       var INCORRECT_NAME = PROPER_FUNCTION_NAME$1 && n$ToString.name != TO_STRING;
+
+       // `RegExp.prototype.toString` method
+       // https://tc39.es/ecma262/#sec-regexp.prototype.tostring
+       if (NOT_GENERIC || INCORRECT_NAME) {
+         redefine$6(RegExp.prototype, TO_STRING, function toString() {
+           var R = anObject$8(this);
+           var p = $toString$1(R.source);
+           var rf = R.flags;
+           var f = $toString$1(rf === undefined && isPrototypeOf$2(RegExpPrototype$3, R) && !('flags' in RegExpPrototype$3) ? getFlags$1(R) : rf);
+           return '/' + p + '/' + f;
+         }, { unsafe: true });
+       }
+
+       // TODO: Remove from `core-js@4` since it's moved to entry points
+
+       var uncurryThis$s = functionUncurryThis;
+       var redefine$5 = redefine$h.exports;
+       var regexpExec$2 = regexpExec$3;
+       var fails$r = fails$V;
+       var wellKnownSymbol$5 = wellKnownSymbol$t;
+       var createNonEnumerableProperty$1 = createNonEnumerableProperty$b;
+
+       var SPECIES = wellKnownSymbol$5('species');
+       var RegExpPrototype$2 = RegExp.prototype;
+
+       var fixRegexpWellKnownSymbolLogic = function (KEY, exec, FORCED, SHAM) {
+         var SYMBOL = wellKnownSymbol$5(KEY);
+
+         var DELEGATES_TO_SYMBOL = !fails$r(function () {
+           // String methods call symbol-named RegEp methods
+           var O = {};
+           O[SYMBOL] = function () { return 7; };
+           return ''[KEY](O) != 7;
+         });
+
+         var DELEGATES_TO_EXEC = DELEGATES_TO_SYMBOL && !fails$r(function () {
+           // Symbol-named RegExp methods call .exec
+           var execCalled = false;
+           var re = /a/;
+
+           if (KEY === 'split') {
+             // We can't use real regex here since it causes deoptimization
+             // and serious performance degradation in V8
+             // https://github.com/zloirock/core-js/issues/306
+             re = {};
+             // RegExp[@@split] doesn't call the regex's exec method, but first creates
+             // a new one. We need to return the patched regex when creating the new one.
+             re.constructor = {};
+             re.constructor[SPECIES] = function () { return re; };
+             re.flags = '';
+             re[SYMBOL] = /./[SYMBOL];
+           }
+
+           re.exec = function () { execCalled = true; return null; };
+
+           re[SYMBOL]('');
+           return !execCalled;
+         });
+
+         if (
+           !DELEGATES_TO_SYMBOL ||
+           !DELEGATES_TO_EXEC ||
+           FORCED
+         ) {
+           var uncurriedNativeRegExpMethod = uncurryThis$s(/./[SYMBOL]);
+           var methods = exec(SYMBOL, ''[KEY], function (nativeMethod, regexp, str, arg2, forceStringMethod) {
+             var uncurriedNativeMethod = uncurryThis$s(nativeMethod);
+             var $exec = regexp.exec;
+             if ($exec === regexpExec$2 || $exec === RegExpPrototype$2.exec) {
+               if (DELEGATES_TO_SYMBOL && !forceStringMethod) {
+                 // The native String method already delegates to @@method (this
+                 // polyfilled function), leasing to infinite recursion.
+                 // We avoid it by directly calling the native @@method method.
+                 return { done: true, value: uncurriedNativeRegExpMethod(regexp, str, arg2) };
+               }
+               return { done: true, value: uncurriedNativeMethod(str, regexp, arg2) };
+             }
+             return { done: false };
+           });
+
+           redefine$5(String.prototype, KEY, methods[0]);
+           redefine$5(RegExpPrototype$2, SYMBOL, methods[1]);
+         }
+
+         if (SHAM) createNonEnumerableProperty$1(RegExpPrototype$2[SYMBOL], 'sham', true);
+       };
+
+       var charAt$4 = stringMultibyte.charAt;
+
+       // `AdvanceStringIndex` abstract operation
+       // https://tc39.es/ecma262/#sec-advancestringindex
+       var advanceStringIndex$3 = function (S, index, unicode) {
+         return index + (unicode ? charAt$4(S, index).length : 1);
+       };
+
+       var uncurryThis$r = functionUncurryThis;
+       var toObject$9 = toObject$i;
+
+       var floor$3 = Math.floor;
+       var charAt$3 = uncurryThis$r(''.charAt);
+       var replace$5 = uncurryThis$r(''.replace);
+       var stringSlice$7 = uncurryThis$r(''.slice);
+       var SUBSTITUTION_SYMBOLS = /\$([$&'`]|\d{1,2}|<[^>]*>)/g;
+       var SUBSTITUTION_SYMBOLS_NO_NAMED = /\$([$&'`]|\d{1,2})/g;
+
+       // `GetSubstitution` abstract operation
+       // https://tc39.es/ecma262/#sec-getsubstitution
+       var getSubstitution$1 = function (matched, str, position, captures, namedCaptures, replacement) {
+         var tailPos = position + matched.length;
+         var m = captures.length;
+         var symbols = SUBSTITUTION_SYMBOLS_NO_NAMED;
+         if (namedCaptures !== undefined) {
+           namedCaptures = toObject$9(namedCaptures);
+           symbols = SUBSTITUTION_SYMBOLS;
+         }
+         return replace$5(replacement, symbols, function (match, ch) {
+           var capture;
+           switch (charAt$3(ch, 0)) {
+             case '$': return '$';
+             case '&': return matched;
+             case '`': return stringSlice$7(str, 0, position);
+             case "'": return stringSlice$7(str, tailPos);
+             case '<':
+               capture = namedCaptures[stringSlice$7(ch, 1, -1)];
+               break;
+             default: // \d\d?
+               var n = +ch;
+               if (n === 0) return match;
+               if (n > m) {
+                 var f = floor$3(n / 10);
+                 if (f === 0) return match;
+                 if (f <= m) return captures[f - 1] === undefined ? charAt$3(ch, 1) : captures[f - 1] + charAt$3(ch, 1);
+                 return match;
+               }
+               capture = captures[n - 1];
+           }
+           return capture === undefined ? '' : capture;
+         });
+       };
+
+       var global$m = global$1o;
+       var call$8 = functionCall;
+       var anObject$7 = anObject$n;
+       var isCallable$4 = isCallable$r;
+       var classof$2 = classofRaw$1;
+       var regexpExec$1 = regexpExec$3;
+
+       var TypeError$7 = global$m.TypeError;
+
+       // `RegExpExec` abstract operation
+       // https://tc39.es/ecma262/#sec-regexpexec
+       var regexpExecAbstract = function (R, S) {
+         var exec = R.exec;
+         if (isCallable$4(exec)) {
+           var result = call$8(exec, R, S);
+           if (result !== null) anObject$7(result);
+           return result;
+         }
+         if (classof$2(R) === 'RegExp') return call$8(regexpExec$1, R, S);
+         throw TypeError$7('RegExp#exec called on incompatible receiver');
+       };
+
+       var apply$3 = functionApply;
+       var call$7 = functionCall;
+       var uncurryThis$q = functionUncurryThis;
+       var fixRegExpWellKnownSymbolLogic$3 = fixRegexpWellKnownSymbolLogic;
+       var fails$q = fails$V;
+       var anObject$6 = anObject$n;
+       var isCallable$3 = isCallable$r;
+       var toIntegerOrInfinity$3 = toIntegerOrInfinity$b;
+       var toLength$5 = toLength$c;
+       var toString$f = toString$k;
+       var requireObjectCoercible$a = requireObjectCoercible$e;
+       var advanceStringIndex$2 = advanceStringIndex$3;
+       var getMethod$3 = getMethod$7;
+       var getSubstitution = getSubstitution$1;
+       var regExpExec$3 = regexpExecAbstract;
+       var wellKnownSymbol$4 = wellKnownSymbol$t;
+
+       var REPLACE = wellKnownSymbol$4('replace');
+       var max$2 = Math.max;
+       var min$5 = Math.min;
+       var concat$2 = uncurryThis$q([].concat);
+       var push$6 = uncurryThis$q([].push);
+       var stringIndexOf$2 = uncurryThis$q(''.indexOf);
+       var stringSlice$6 = uncurryThis$q(''.slice);
+
+       var maybeToString = function (it) {
+         return it === undefined ? it : String(it);
+       };
+
+       // IE <= 11 replaces $0 with the whole match, as if it was $&
+       // https://stackoverflow.com/questions/6024666/getting-ie-to-replace-a-regex-with-the-literal-string-0
+       var REPLACE_KEEPS_$0 = (function () {
+         // eslint-disable-next-line regexp/prefer-escape-replacement-dollar-char -- required for testing
+         return 'a'.replace(/./, '$0') === '$0';
+       })();
+
+       // Safari <= 13.0.3(?) substitutes nth capture where n>m with an empty string
+       var REGEXP_REPLACE_SUBSTITUTES_UNDEFINED_CAPTURE = (function () {
+         if (/./[REPLACE]) {
+           return /./[REPLACE]('a', '$0') === '';
+         }
+         return false;
+       })();
+
+       var REPLACE_SUPPORTS_NAMED_GROUPS = !fails$q(function () {
+         var re = /./;
+         re.exec = function () {
+           var result = [];
+           result.groups = { a: '7' };
+           return result;
+         };
+         // eslint-disable-next-line regexp/no-useless-dollar-replacements -- false positive
+         return ''.replace(re, '$<a>') !== '7';
+       });
+
+       // @@replace logic
+       fixRegExpWellKnownSymbolLogic$3('replace', function (_, nativeReplace, maybeCallNative) {
+         var UNSAFE_SUBSTITUTE = REGEXP_REPLACE_SUBSTITUTES_UNDEFINED_CAPTURE ? '$' : '$0';
+
+         return [
+           // `String.prototype.replace` method
+           // https://tc39.es/ecma262/#sec-string.prototype.replace
+           function replace(searchValue, replaceValue) {
+             var O = requireObjectCoercible$a(this);
+             var replacer = searchValue == undefined ? undefined : getMethod$3(searchValue, REPLACE);
+             return replacer
+               ? call$7(replacer, searchValue, O, replaceValue)
+               : call$7(nativeReplace, toString$f(O), searchValue, replaceValue);
+           },
+           // `RegExp.prototype[@@replace]` method
+           // https://tc39.es/ecma262/#sec-regexp.prototype-@@replace
+           function (string, replaceValue) {
+             var rx = anObject$6(this);
+             var S = toString$f(string);
+
+             if (
+               typeof replaceValue == 'string' &&
+               stringIndexOf$2(replaceValue, UNSAFE_SUBSTITUTE) === -1 &&
+               stringIndexOf$2(replaceValue, '$<') === -1
+             ) {
+               var res = maybeCallNative(nativeReplace, rx, S, replaceValue);
+               if (res.done) return res.value;
+             }
+
+             var functionalReplace = isCallable$3(replaceValue);
+             if (!functionalReplace) replaceValue = toString$f(replaceValue);
+
+             var global = rx.global;
+             if (global) {
+               var fullUnicode = rx.unicode;
+               rx.lastIndex = 0;
+             }
+             var results = [];
+             while (true) {
+               var result = regExpExec$3(rx, S);
+               if (result === null) break;
+
+               push$6(results, result);
+               if (!global) break;
+
+               var matchStr = toString$f(result[0]);
+               if (matchStr === '') rx.lastIndex = advanceStringIndex$2(S, toLength$5(rx.lastIndex), fullUnicode);
+             }
+
+             var accumulatedResult = '';
+             var nextSourcePosition = 0;
+             for (var i = 0; i < results.length; i++) {
+               result = results[i];
+
+               var matched = toString$f(result[0]);
+               var position = max$2(min$5(toIntegerOrInfinity$3(result.index), S.length), 0);
+               var captures = [];
+               // NOTE: This is equivalent to
+               //   captures = result.slice(1).map(maybeToString)
+               // but for some reason `nativeSlice.call(result, 1, result.length)` (called in
+               // the slice polyfill when slicing native arrays) "doesn't work" in safari 9 and
+               // causes a crash (https://pastebin.com/N21QzeQA) when trying to debug it.
+               for (var j = 1; j < result.length; j++) push$6(captures, maybeToString(result[j]));
+               var namedCaptures = result.groups;
+               if (functionalReplace) {
+                 var replacerArgs = concat$2([matched], captures, position, S);
+                 if (namedCaptures !== undefined) push$6(replacerArgs, namedCaptures);
+                 var replacement = toString$f(apply$3(replaceValue, undefined, replacerArgs));
+               } else {
+                 replacement = getSubstitution(matched, S, position, captures, namedCaptures, replaceValue);
+               }
+               if (position >= nextSourcePosition) {
+                 accumulatedResult += stringSlice$6(S, nextSourcePosition, position) + replacement;
+                 nextSourcePosition = position + matched.length;
+               }
+             }
+             return accumulatedResult + stringSlice$6(S, nextSourcePosition);
+           }
+         ];
+       }, !REPLACE_SUPPORTS_NAMED_GROUPS || !REPLACE_KEEPS_$0 || REGEXP_REPLACE_SUBSTITUTES_UNDEFINED_CAPTURE);
+
+       var isObject$c = isObject$s;
+       var classof$1 = classofRaw$1;
+       var wellKnownSymbol$3 = wellKnownSymbol$t;
+
+       var MATCH$2 = wellKnownSymbol$3('match');
+
+       // `IsRegExp` abstract operation
+       // https://tc39.es/ecma262/#sec-isregexp
+       var isRegexp = function (it) {
+         var isRegExp;
+         return isObject$c(it) && ((isRegExp = it[MATCH$2]) !== undefined ? !!isRegExp : classof$1(it) == 'RegExp');
+       };
+
+       var apply$2 = functionApply;
+       var call$6 = functionCall;
+       var uncurryThis$p = functionUncurryThis;
+       var fixRegExpWellKnownSymbolLogic$2 = fixRegexpWellKnownSymbolLogic;
+       var isRegExp$2 = isRegexp;
+       var anObject$5 = anObject$n;
+       var requireObjectCoercible$9 = requireObjectCoercible$e;
+       var speciesConstructor$1 = speciesConstructor$5;
+       var advanceStringIndex$1 = advanceStringIndex$3;
+       var toLength$4 = toLength$c;
+       var toString$e = toString$k;
+       var getMethod$2 = getMethod$7;
+       var arraySlice$4 = arraySliceSimple;
+       var callRegExpExec = regexpExecAbstract;
+       var regexpExec = regexpExec$3;
+       var stickyHelpers$1 = regexpStickyHelpers;
+       var fails$p = fails$V;
+
+       var UNSUPPORTED_Y$1 = stickyHelpers$1.UNSUPPORTED_Y;
+       var MAX_UINT32 = 0xFFFFFFFF;
+       var min$4 = Math.min;
+       var $push = [].push;
+       var exec$4 = uncurryThis$p(/./.exec);
+       var push$5 = uncurryThis$p($push);
+       var stringSlice$5 = uncurryThis$p(''.slice);
+
+       // Chrome 51 has a buggy "split" implementation when RegExp#exec !== nativeExec
+       // Weex JS has frozen built-in prototypes, so use try / catch wrapper
+       var SPLIT_WORKS_WITH_OVERWRITTEN_EXEC = !fails$p(function () {
+         // eslint-disable-next-line regexp/no-empty-group -- required for testing
+         var re = /(?:)/;
+         var originalExec = re.exec;
+         re.exec = function () { return originalExec.apply(this, arguments); };
+         var result = 'ab'.split(re);
+         return result.length !== 2 || result[0] !== 'a' || result[1] !== 'b';
+       });
+
+       // @@split logic
+       fixRegExpWellKnownSymbolLogic$2('split', function (SPLIT, nativeSplit, maybeCallNative) {
+         var internalSplit;
+         if (
+           'abbc'.split(/(b)*/)[1] == 'c' ||
+           // eslint-disable-next-line regexp/no-empty-group -- required for testing
+           'test'.split(/(?:)/, -1).length != 4 ||
+           'ab'.split(/(?:ab)*/).length != 2 ||
+           '.'.split(/(.?)(.?)/).length != 4 ||
+           // eslint-disable-next-line regexp/no-empty-capturing-group, regexp/no-empty-group -- required for testing
+           '.'.split(/()()/).length > 1 ||
+           ''.split(/.?/).length
+         ) {
+           // based on es5-shim implementation, need to rework it
+           internalSplit = function (separator, limit) {
+             var string = toString$e(requireObjectCoercible$9(this));
+             var lim = limit === undefined ? MAX_UINT32 : limit >>> 0;
+             if (lim === 0) return [];
+             if (separator === undefined) return [string];
+             // If `separator` is not a regex, use native split
+             if (!isRegExp$2(separator)) {
+               return call$6(nativeSplit, string, separator, lim);
+             }
+             var output = [];
+             var flags = (separator.ignoreCase ? 'i' : '') +
+                         (separator.multiline ? 'm' : '') +
+                         (separator.unicode ? 'u' : '') +
+                         (separator.sticky ? 'y' : '');
+             var lastLastIndex = 0;
+             // Make `global` and avoid `lastIndex` issues by working with a copy
+             var separatorCopy = new RegExp(separator.source, flags + 'g');
+             var match, lastIndex, lastLength;
+             while (match = call$6(regexpExec, separatorCopy, string)) {
+               lastIndex = separatorCopy.lastIndex;
+               if (lastIndex > lastLastIndex) {
+                 push$5(output, stringSlice$5(string, lastLastIndex, match.index));
+                 if (match.length > 1 && match.index < string.length) apply$2($push, output, arraySlice$4(match, 1));
+                 lastLength = match[0].length;
+                 lastLastIndex = lastIndex;
+                 if (output.length >= lim) break;
+               }
+               if (separatorCopy.lastIndex === match.index) separatorCopy.lastIndex++; // Avoid an infinite loop
+             }
+             if (lastLastIndex === string.length) {
+               if (lastLength || !exec$4(separatorCopy, '')) push$5(output, '');
+             } else push$5(output, stringSlice$5(string, lastLastIndex));
+             return output.length > lim ? arraySlice$4(output, 0, lim) : output;
+           };
+         // Chakra, V8
+         } else if ('0'.split(undefined, 0).length) {
+           internalSplit = function (separator, limit) {
+             return separator === undefined && limit === 0 ? [] : call$6(nativeSplit, this, separator, limit);
+           };
+         } else internalSplit = nativeSplit;
+
+         return [
+           // `String.prototype.split` method
+           // https://tc39.es/ecma262/#sec-string.prototype.split
+           function split(separator, limit) {
+             var O = requireObjectCoercible$9(this);
+             var splitter = separator == undefined ? undefined : getMethod$2(separator, SPLIT);
+             return splitter
+               ? call$6(splitter, separator, O, limit)
+               : call$6(internalSplit, toString$e(O), separator, limit);
+           },
+           // `RegExp.prototype[@@split]` method
+           // https://tc39.es/ecma262/#sec-regexp.prototype-@@split
+           //
+           // NOTE: This cannot be properly polyfilled in engines that don't support
+           // the 'y' flag.
+           function (string, limit) {
+             var rx = anObject$5(this);
+             var S = toString$e(string);
+             var res = maybeCallNative(internalSplit, rx, S, limit, internalSplit !== nativeSplit);
+
+             if (res.done) return res.value;
+
+             var C = speciesConstructor$1(rx, RegExp);
+
+             var unicodeMatching = rx.unicode;
+             var flags = (rx.ignoreCase ? 'i' : '') +
+                         (rx.multiline ? 'm' : '') +
+                         (rx.unicode ? 'u' : '') +
+                         (UNSUPPORTED_Y$1 ? 'g' : 'y');
+
+             // ^(? + rx + ) is needed, in combination with some S slicing, to
+             // simulate the 'y' flag.
+             var splitter = new C(UNSUPPORTED_Y$1 ? '^(?:' + rx.source + ')' : rx, flags);
+             var lim = limit === undefined ? MAX_UINT32 : limit >>> 0;
+             if (lim === 0) return [];
+             if (S.length === 0) return callRegExpExec(splitter, S) === null ? [S] : [];
+             var p = 0;
+             var q = 0;
+             var A = [];
+             while (q < S.length) {
+               splitter.lastIndex = UNSUPPORTED_Y$1 ? 0 : q;
+               var z = callRegExpExec(splitter, UNSUPPORTED_Y$1 ? stringSlice$5(S, q) : S);
+               var e;
+               if (
+                 z === null ||
+                 (e = min$4(toLength$4(splitter.lastIndex + (UNSUPPORTED_Y$1 ? q : 0)), S.length)) === p
+               ) {
+                 q = advanceStringIndex$1(S, q, unicodeMatching);
+               } else {
+                 push$5(A, stringSlice$5(S, p, q));
+                 if (A.length === lim) return A;
+                 for (var i = 1; i <= z.length - 1; i++) {
+                   push$5(A, z[i]);
+                   if (A.length === lim) return A;
+                 }
+                 q = p = e;
+               }
+             }
+             push$5(A, stringSlice$5(S, p));
+             return A;
+           }
+         ];
+       }, !SPLIT_WORKS_WITH_OVERWRITTEN_EXEC, UNSUPPORTED_Y$1);
+
+       // a string of all valid unicode whitespaces
+       var whitespaces$4 = '\u0009\u000A\u000B\u000C\u000D\u0020\u00A0\u1680\u2000\u2001\u2002' +
+         '\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200A\u202F\u205F\u3000\u2028\u2029\uFEFF';
+
+       var uncurryThis$o = functionUncurryThis;
+       var requireObjectCoercible$8 = requireObjectCoercible$e;
+       var toString$d = toString$k;
+       var whitespaces$3 = whitespaces$4;
+
+       var replace$4 = uncurryThis$o(''.replace);
+       var whitespace = '[' + whitespaces$3 + ']';
+       var ltrim = RegExp('^' + whitespace + whitespace + '*');
+       var rtrim$2 = RegExp(whitespace + whitespace + '*$');
+
+       // `String.prototype.{ trim, trimStart, trimEnd, trimLeft, trimRight }` methods implementation
+       var createMethod$2 = function (TYPE) {
+         return function ($this) {
+           var string = toString$d(requireObjectCoercible$8($this));
+           if (TYPE & 1) string = replace$4(string, ltrim, '');
+           if (TYPE & 2) string = replace$4(string, rtrim$2, '');
+           return string;
+         };
+       };
+
+       var stringTrim = {
+         // `String.prototype.{ trimLeft, trimStart }` methods
+         // https://tc39.es/ecma262/#sec-string.prototype.trimstart
+         start: createMethod$2(1),
+         // `String.prototype.{ trimRight, trimEnd }` methods
+         // https://tc39.es/ecma262/#sec-string.prototype.trimend
+         end: createMethod$2(2),
+         // `String.prototype.trim` method
+         // https://tc39.es/ecma262/#sec-string.prototype.trim
+         trim: createMethod$2(3)
+       };
+
+       var PROPER_FUNCTION_NAME = functionName.PROPER;
+       var fails$o = fails$V;
+       var whitespaces$2 = whitespaces$4;
+
+       var non = '\u200B\u0085\u180E';
+
+       // check that a method works with the correct list
+       // of whitespaces and has a correct name
+       var stringTrimForced = function (METHOD_NAME) {
+         return fails$o(function () {
+           return !!whitespaces$2[METHOD_NAME]()
+             || non[METHOD_NAME]() !== non
+             || (PROPER_FUNCTION_NAME && whitespaces$2[METHOD_NAME].name !== METHOD_NAME);
+         });
+       };
+
+       var $$W = _export;
+       var $trim = stringTrim.trim;
+       var forcedStringTrimMethod$2 = stringTrimForced;
+
+       // `String.prototype.trim` method
+       // https://tc39.es/ecma262/#sec-string.prototype.trim
+       $$W({ target: 'String', proto: true, forced: forcedStringTrimMethod$2('trim') }, {
+         trim: function trim() {
+           return $trim(this);
+         }
+       });
+
+       var DESCRIPTORS$b = descriptors;
+       var FUNCTION_NAME_EXISTS = functionName.EXISTS;
+       var uncurryThis$n = functionUncurryThis;
+       var defineProperty$6 = objectDefineProperty.f;
+
+       var FunctionPrototype = Function.prototype;
+       var functionToString = uncurryThis$n(FunctionPrototype.toString);
+       var nameRE = /function\b(?:\s|\/\*[\S\s]*?\*\/|\/\/[^\n\r]*[\n\r]+)*([^\s(/]*)/;
+       var regExpExec$2 = uncurryThis$n(nameRE.exec);
+       var NAME = 'name';
+
+       // Function instances `.name` property
+       // https://tc39.es/ecma262/#sec-function-instances-name
+       if (DESCRIPTORS$b && !FUNCTION_NAME_EXISTS) {
+         defineProperty$6(FunctionPrototype, NAME, {
+           configurable: true,
+           get: function () {
+             try {
+               return regExpExec$2(nameRE, functionToString(this))[1];
+             } catch (error) {
+               return '';
+             }
+           }
+         });
+       }
+
+       var $$V = _export;
+       var DESCRIPTORS$a = descriptors;
+       var create$5 = objectCreate;
+
+       // `Object.create` method
+       // https://tc39.es/ecma262/#sec-object.create
+       $$V({ target: 'Object', stat: true, sham: !DESCRIPTORS$a }, {
+         create: create$5
+       });
+
+       var $$U = _export;
+       var global$l = global$1o;
+       var apply$1 = functionApply;
+       var isCallable$2 = isCallable$r;
+       var userAgent$1 = engineUserAgent;
+       var arraySlice$3 = arraySlice$b;
+       var validateArgumentsLength$1 = validateArgumentsLength$4;
+
+       var MSIE = /MSIE .\./.test(userAgent$1); // <- dirty ie9- check
+       var Function$2 = global$l.Function;
+
+       var wrap$1 = function (scheduler) {
+         return function (handler, timeout /* , ...arguments */) {
+           var boundArgs = validateArgumentsLength$1(arguments.length, 1) > 2;
+           var fn = isCallable$2(handler) ? handler : Function$2(handler);
+           var args = boundArgs ? arraySlice$3(arguments, 2) : undefined;
+           return scheduler(boundArgs ? function () {
+             apply$1(fn, this, args);
+           } : fn, timeout);
+         };
+       };
+
+       // ie9- setTimeout & setInterval additional parameters fix
+       // https://html.spec.whatwg.org/multipage/timers-and-user-prompts.html#timers
+       $$U({ global: true, bind: true, forced: MSIE }, {
+         // `setTimeout` method
+         // https://html.spec.whatwg.org/multipage/timers-and-user-prompts.html#dom-settimeout
+         setTimeout: wrap$1(global$l.setTimeout),
+         // `setInterval` method
+         // https://html.spec.whatwg.org/multipage/timers-and-user-prompts.html#dom-setinterval
+         setInterval: wrap$1(global$l.setInterval)
+       });
+
+       var global$k = typeof globalThis !== 'undefined' && globalThis || typeof self !== 'undefined' && self || typeof global$k !== 'undefined' && global$k;
+       var support = {
+         searchParams: 'URLSearchParams' in global$k,
+         iterable: 'Symbol' in global$k && 'iterator' in Symbol,
+         blob: 'FileReader' in global$k && 'Blob' in global$k && function () {
+           try {
+             new Blob();
+             return true;
+           } catch (e) {
+             return false;
+           }
+         }(),
+         formData: 'FormData' in global$k,
+         arrayBuffer: 'ArrayBuffer' in global$k
+       };
+
+       function isDataView(obj) {
+         return obj && DataView.prototype.isPrototypeOf(obj);
+       }
+
+       if (support.arrayBuffer) {
+         var viewClasses = ['[object Int8Array]', '[object Uint8Array]', '[object Uint8ClampedArray]', '[object Int16Array]', '[object Uint16Array]', '[object Int32Array]', '[object Uint32Array]', '[object Float32Array]', '[object Float64Array]'];
+
+         var isArrayBufferView = ArrayBuffer.isView || function (obj) {
+           return obj && viewClasses.indexOf(Object.prototype.toString.call(obj)) > -1;
+         };
+       }
+
+       function normalizeName(name) {
+         if (typeof name !== 'string') {
+           name = String(name);
+         }
+
+         if (/[^a-z0-9\-#$%&'*+.^_`|~!]/i.test(name) || name === '') {
+           throw new TypeError('Invalid character in header field name: "' + name + '"');
+         }
+
+         return name.toLowerCase();
+       }
+
+       function normalizeValue(value) {
+         if (typeof value !== 'string') {
+           value = String(value);
+         }
+
+         return value;
+       } // Build a destructive iterator for the value list
+
+
+       function iteratorFor(items) {
+         var iterator = {
+           next: function next() {
+             var value = items.shift();
+             return {
+               done: value === undefined,
+               value: value
+             };
+           }
+         };
+
+         if (support.iterable) {
+           iterator[Symbol.iterator] = function () {
+             return iterator;
+           };
+         }
+
+         return iterator;
+       }
+
+       function Headers(headers) {
+         this.map = {};
+
+         if (headers instanceof Headers) {
+           headers.forEach(function (value, name) {
+             this.append(name, value);
+           }, this);
+         } else if (Array.isArray(headers)) {
+           headers.forEach(function (header) {
+             this.append(header[0], header[1]);
+           }, this);
+         } else if (headers) {
+           Object.getOwnPropertyNames(headers).forEach(function (name) {
+             this.append(name, headers[name]);
+           }, this);
+         }
+       }
+
+       Headers.prototype.append = function (name, value) {
+         name = normalizeName(name);
+         value = normalizeValue(value);
+         var oldValue = this.map[name];
+         this.map[name] = oldValue ? oldValue + ', ' + value : value;
+       };
+
+       Headers.prototype['delete'] = function (name) {
+         delete this.map[normalizeName(name)];
+       };
+
+       Headers.prototype.get = function (name) {
+         name = normalizeName(name);
+         return this.has(name) ? this.map[name] : null;
+       };
+
+       Headers.prototype.has = function (name) {
+         return this.map.hasOwnProperty(normalizeName(name));
+       };
+
+       Headers.prototype.set = function (name, value) {
+         this.map[normalizeName(name)] = normalizeValue(value);
+       };
+
+       Headers.prototype.forEach = function (callback, thisArg) {
+         for (var name in this.map) {
+           if (this.map.hasOwnProperty(name)) {
+             callback.call(thisArg, this.map[name], name, this);
+           }
+         }
+       };
+
+       Headers.prototype.keys = function () {
+         var items = [];
+         this.forEach(function (value, name) {
+           items.push(name);
+         });
+         return iteratorFor(items);
+       };
+
+       Headers.prototype.values = function () {
+         var items = [];
+         this.forEach(function (value) {
+           items.push(value);
+         });
+         return iteratorFor(items);
+       };
+
+       Headers.prototype.entries = function () {
+         var items = [];
+         this.forEach(function (value, name) {
+           items.push([name, value]);
+         });
+         return iteratorFor(items);
+       };
+
+       if (support.iterable) {
+         Headers.prototype[Symbol.iterator] = Headers.prototype.entries;
+       }
+
+       function consumed(body) {
+         if (body.bodyUsed) {
+           return Promise.reject(new TypeError('Already read'));
+         }
+
+         body.bodyUsed = true;
+       }
+
+       function fileReaderReady(reader) {
+         return new Promise(function (resolve, reject) {
+           reader.onload = function () {
+             resolve(reader.result);
+           };
+
+           reader.onerror = function () {
+             reject(reader.error);
+           };
+         });
+       }
+
+       function readBlobAsArrayBuffer(blob) {
+         var reader = new FileReader();
+         var promise = fileReaderReady(reader);
+         reader.readAsArrayBuffer(blob);
+         return promise;
+       }
+
+       function readBlobAsText(blob) {
+         var reader = new FileReader();
+         var promise = fileReaderReady(reader);
+         reader.readAsText(blob);
+         return promise;
+       }
+
+       function readArrayBufferAsText(buf) {
+         var view = new Uint8Array(buf);
+         var chars = new Array(view.length);
+
+         for (var i = 0; i < view.length; i++) {
+           chars[i] = String.fromCharCode(view[i]);
+         }
+
+         return chars.join('');
+       }
+
+       function bufferClone(buf) {
+         if (buf.slice) {
+           return buf.slice(0);
+         } else {
+           var view = new Uint8Array(buf.byteLength);
+           view.set(new Uint8Array(buf));
+           return view.buffer;
+         }
+       }
+
+       function Body() {
+         this.bodyUsed = false;
+
+         this._initBody = function (body) {
+           /*
+             fetch-mock wraps the Response object in an ES6 Proxy to
+             provide useful test harness features such as flush. However, on
+             ES5 browsers without fetch or Proxy support pollyfills must be used;
+             the proxy-pollyfill is unable to proxy an attribute unless it exists
+             on the object before the Proxy is created. This change ensures
+             Response.bodyUsed exists on the instance, while maintaining the
+             semantic of setting Request.bodyUsed in the constructor before
+             _initBody is called.
+           */
+           this.bodyUsed = this.bodyUsed;
+           this._bodyInit = body;
+
+           if (!body) {
+             this._bodyText = '';
+           } else if (typeof body === 'string') {
+             this._bodyText = body;
+           } else if (support.blob && Blob.prototype.isPrototypeOf(body)) {
+             this._bodyBlob = body;
+           } else if (support.formData && FormData.prototype.isPrototypeOf(body)) {
+             this._bodyFormData = body;
+           } else if (support.searchParams && URLSearchParams.prototype.isPrototypeOf(body)) {
+             this._bodyText = body.toString();
+           } else if (support.arrayBuffer && support.blob && isDataView(body)) {
+             this._bodyArrayBuffer = bufferClone(body.buffer); // IE 10-11 can't handle a DataView body.
+
+             this._bodyInit = new Blob([this._bodyArrayBuffer]);
+           } else if (support.arrayBuffer && (ArrayBuffer.prototype.isPrototypeOf(body) || isArrayBufferView(body))) {
+             this._bodyArrayBuffer = bufferClone(body);
+           } else {
+             this._bodyText = body = Object.prototype.toString.call(body);
+           }
+
+           if (!this.headers.get('content-type')) {
+             if (typeof body === 'string') {
+               this.headers.set('content-type', 'text/plain;charset=UTF-8');
+             } else if (this._bodyBlob && this._bodyBlob.type) {
+               this.headers.set('content-type', this._bodyBlob.type);
+             } else if (support.searchParams && URLSearchParams.prototype.isPrototypeOf(body)) {
+               this.headers.set('content-type', 'application/x-www-form-urlencoded;charset=UTF-8');
+             }
+           }
+         };
+
+         if (support.blob) {
+           this.blob = function () {
+             var rejected = consumed(this);
+
+             if (rejected) {
+               return rejected;
+             }
+
+             if (this._bodyBlob) {
+               return Promise.resolve(this._bodyBlob);
+             } else if (this._bodyArrayBuffer) {
+               return Promise.resolve(new Blob([this._bodyArrayBuffer]));
+             } else if (this._bodyFormData) {
+               throw new Error('could not read FormData body as blob');
+             } else {
+               return Promise.resolve(new Blob([this._bodyText]));
+             }
+           };
+
+           this.arrayBuffer = function () {
+             if (this._bodyArrayBuffer) {
+               var isConsumed = consumed(this);
+
+               if (isConsumed) {
+                 return isConsumed;
+               }
+
+               if (ArrayBuffer.isView(this._bodyArrayBuffer)) {
+                 return Promise.resolve(this._bodyArrayBuffer.buffer.slice(this._bodyArrayBuffer.byteOffset, this._bodyArrayBuffer.byteOffset + this._bodyArrayBuffer.byteLength));
+               } else {
+                 return Promise.resolve(this._bodyArrayBuffer);
+               }
+             } else {
+               return this.blob().then(readBlobAsArrayBuffer);
+             }
+           };
+         }
+
+         this.text = function () {
+           var rejected = consumed(this);
+
+           if (rejected) {
+             return rejected;
+           }
+
+           if (this._bodyBlob) {
+             return readBlobAsText(this._bodyBlob);
+           } else if (this._bodyArrayBuffer) {
+             return Promise.resolve(readArrayBufferAsText(this._bodyArrayBuffer));
+           } else if (this._bodyFormData) {
+             throw new Error('could not read FormData body as text');
+           } else {
+             return Promise.resolve(this._bodyText);
+           }
+         };
+
+         if (support.formData) {
+           this.formData = function () {
+             return this.text().then(decode);
+           };
+         }
+
+         this.json = function () {
+           return this.text().then(JSON.parse);
+         };
+
+         return this;
+       } // HTTP methods whose capitalization should be normalized
+
+
+       var methods = ['DELETE', 'GET', 'HEAD', 'OPTIONS', 'POST', 'PUT'];
+
+       function normalizeMethod(method) {
+         var upcased = method.toUpperCase();
+         return methods.indexOf(upcased) > -1 ? upcased : method;
+       }
+
+       function Request(input, options) {
+         if (!(this instanceof Request)) {
+           throw new TypeError('Please use the "new" operator, this DOM object constructor cannot be called as a function.');
+         }
+
+         options = options || {};
+         var body = options.body;
+
+         if (input instanceof Request) {
+           if (input.bodyUsed) {
+             throw new TypeError('Already read');
+           }
+
+           this.url = input.url;
+           this.credentials = input.credentials;
+
+           if (!options.headers) {
+             this.headers = new Headers(input.headers);
+           }
+
+           this.method = input.method;
+           this.mode = input.mode;
+           this.signal = input.signal;
+
+           if (!body && input._bodyInit != null) {
+             body = input._bodyInit;
+             input.bodyUsed = true;
+           }
+         } else {
+           this.url = String(input);
+         }
+
+         this.credentials = options.credentials || this.credentials || 'same-origin';
+
+         if (options.headers || !this.headers) {
+           this.headers = new Headers(options.headers);
+         }
+
+         this.method = normalizeMethod(options.method || this.method || 'GET');
+         this.mode = options.mode || this.mode || null;
+         this.signal = options.signal || this.signal;
+         this.referrer = null;
+
+         if ((this.method === 'GET' || this.method === 'HEAD') && body) {
+           throw new TypeError('Body not allowed for GET or HEAD requests');
+         }
+
+         this._initBody(body);
+
+         if (this.method === 'GET' || this.method === 'HEAD') {
+           if (options.cache === 'no-store' || options.cache === 'no-cache') {
+             // Search for a '_' parameter in the query string
+             var reParamSearch = /([?&])_=[^&]*/;
+
+             if (reParamSearch.test(this.url)) {
+               // If it already exists then set the value with the current time
+               this.url = this.url.replace(reParamSearch, '$1_=' + new Date().getTime());
+             } else {
+               // Otherwise add a new '_' parameter to the end with the current time
+               var reQueryString = /\?/;
+               this.url += (reQueryString.test(this.url) ? '&' : '?') + '_=' + new Date().getTime();
+             }
+           }
+         }
+       }
+
+       Request.prototype.clone = function () {
+         return new Request(this, {
+           body: this._bodyInit
+         });
+       };
+
+       function decode(body) {
+         var form = new FormData();
+         body.trim().split('&').forEach(function (bytes) {
+           if (bytes) {
+             var split = bytes.split('=');
+             var name = split.shift().replace(/\+/g, ' ');
+             var value = split.join('=').replace(/\+/g, ' ');
+             form.append(decodeURIComponent(name), decodeURIComponent(value));
+           }
+         });
+         return form;
+       }
+
+       function parseHeaders(rawHeaders) {
+         var headers = new Headers(); // Replace instances of \r\n and \n followed by at least one space or horizontal tab with a space
+         // https://tools.ietf.org/html/rfc7230#section-3.2
+
+         var preProcessedHeaders = rawHeaders.replace(/\r?\n[\t ]+/g, ' '); // Avoiding split via regex to work around a common IE11 bug with the core-js 3.6.0 regex polyfill
+         // https://github.com/github/fetch/issues/748
+         // https://github.com/zloirock/core-js/issues/751
+
+         preProcessedHeaders.split('\r').map(function (header) {
+           return header.indexOf('\n') === 0 ? header.substr(1, header.length) : header;
+         }).forEach(function (line) {
+           var parts = line.split(':');
+           var key = parts.shift().trim();
+
+           if (key) {
+             var value = parts.join(':').trim();
+             headers.append(key, value);
+           }
+         });
+         return headers;
+       }
+
+       Body.call(Request.prototype);
+       function Response(bodyInit, options) {
+         if (!(this instanceof Response)) {
+           throw new TypeError('Please use the "new" operator, this DOM object constructor cannot be called as a function.');
+         }
+
+         if (!options) {
+           options = {};
+         }
+
+         this.type = 'default';
+         this.status = options.status === undefined ? 200 : options.status;
+         this.ok = this.status >= 200 && this.status < 300;
+         this.statusText = options.statusText === undefined ? '' : '' + options.statusText;
+         this.headers = new Headers(options.headers);
+         this.url = options.url || '';
+
+         this._initBody(bodyInit);
+       }
+       Body.call(Response.prototype);
+
+       Response.prototype.clone = function () {
+         return new Response(this._bodyInit, {
+           status: this.status,
+           statusText: this.statusText,
+           headers: new Headers(this.headers),
+           url: this.url
+         });
+       };
+
+       Response.error = function () {
+         var response = new Response(null, {
+           status: 0,
+           statusText: ''
+         });
+         response.type = 'error';
+         return response;
+       };
+
+       var redirectStatuses = [301, 302, 303, 307, 308];
+
+       Response.redirect = function (url, status) {
+         if (redirectStatuses.indexOf(status) === -1) {
+           throw new RangeError('Invalid status code');
+         }
+
+         return new Response(null, {
+           status: status,
+           headers: {
+             location: url
+           }
+         });
+       };
+
+       var DOMException$1 = global$k.DOMException;
+
+       try {
+         new DOMException$1();
+       } catch (err) {
+         DOMException$1 = function DOMException(message, name) {
+           this.message = message;
+           this.name = name;
+           var error = Error(message);
+           this.stack = error.stack;
+         };
+
+         DOMException$1.prototype = Object.create(Error.prototype);
+         DOMException$1.prototype.constructor = DOMException$1;
+       }
+
+       function fetch$1(input, init) {
+         return new Promise(function (resolve, reject) {
+           var request = new Request(input, init);
+
+           if (request.signal && request.signal.aborted) {
+             return reject(new DOMException$1('Aborted', 'AbortError'));
+           }
+
+           var xhr = new XMLHttpRequest();
+
+           function abortXhr() {
+             xhr.abort();
+           }
+
+           xhr.onload = function () {
+             var options = {
+               status: xhr.status,
+               statusText: xhr.statusText,
+               headers: parseHeaders(xhr.getAllResponseHeaders() || '')
+             };
+             options.url = 'responseURL' in xhr ? xhr.responseURL : options.headers.get('X-Request-URL');
+             var body = 'response' in xhr ? xhr.response : xhr.responseText;
+             setTimeout(function () {
+               resolve(new Response(body, options));
+             }, 0);
+           };
+
+           xhr.onerror = function () {
+             setTimeout(function () {
+               reject(new TypeError('Network request failed'));
+             }, 0);
+           };
+
+           xhr.ontimeout = function () {
+             setTimeout(function () {
+               reject(new TypeError('Network request failed'));
+             }, 0);
+           };
+
+           xhr.onabort = function () {
+             setTimeout(function () {
+               reject(new DOMException$1('Aborted', 'AbortError'));
+             }, 0);
+           };
+
+           function fixUrl(url) {
+             try {
+               return url === '' && global$k.location.href ? global$k.location.href : url;
+             } catch (e) {
+               return url;
+             }
+           }
+
+           xhr.open(request.method, fixUrl(request.url), true);
+
+           if (request.credentials === 'include') {
+             xhr.withCredentials = true;
+           } else if (request.credentials === 'omit') {
+             xhr.withCredentials = false;
+           }
+
+           if ('responseType' in xhr) {
+             if (support.blob) {
+               xhr.responseType = 'blob';
+             } else if (support.arrayBuffer && request.headers.get('Content-Type') && request.headers.get('Content-Type').indexOf('application/octet-stream') !== -1) {
+               xhr.responseType = 'arraybuffer';
+             }
+           }
+
+           if (init && _typeof(init.headers) === 'object' && !(init.headers instanceof Headers)) {
+             Object.getOwnPropertyNames(init.headers).forEach(function (name) {
+               xhr.setRequestHeader(name, normalizeValue(init.headers[name]));
+             });
+           } else {
+             request.headers.forEach(function (value, name) {
+               xhr.setRequestHeader(name, value);
+             });
+           }
+
+           if (request.signal) {
+             request.signal.addEventListener('abort', abortXhr);
+
+             xhr.onreadystatechange = function () {
+               // DONE (success or failure)
+               if (xhr.readyState === 4) {
+                 request.signal.removeEventListener('abort', abortXhr);
+               }
+             };
+           }
+
+           xhr.send(typeof request._bodyInit === 'undefined' ? null : request._bodyInit);
+         });
+       }
+       fetch$1.polyfill = true;
+
+       if (!global$k.fetch) {
+         global$k.fetch = fetch$1;
+         global$k.Headers = Headers;
+         global$k.Request = Request;
+         global$k.Response = Response;
+       }
+
+       var $$T = _export;
+       var DESCRIPTORS$9 = descriptors;
+       var defineProperty$5 = objectDefineProperty.f;
+
+       // `Object.defineProperty` method
+       // https://tc39.es/ecma262/#sec-object.defineproperty
+       // eslint-disable-next-line es/no-object-defineproperty -- safe
+       $$T({ target: 'Object', stat: true, forced: Object.defineProperty !== defineProperty$5, sham: !DESCRIPTORS$9 }, {
+         defineProperty: defineProperty$5
+       });
+
+       var $$S = _export;
+       var setPrototypeOf = objectSetPrototypeOf;
+
+       // `Object.setPrototypeOf` method
+       // https://tc39.es/ecma262/#sec-object.setprototypeof
+       $$S({ target: 'Object', stat: true }, {
+         setPrototypeOf: setPrototypeOf
+       });
+
+       var $$R = _export;
+       var fails$n = fails$V;
+       var toObject$8 = toObject$i;
+       var nativeGetPrototypeOf = objectGetPrototypeOf;
+       var CORRECT_PROTOTYPE_GETTER = correctPrototypeGetter;
+
+       var FAILS_ON_PRIMITIVES$4 = fails$n(function () { nativeGetPrototypeOf(1); });
+
+       // `Object.getPrototypeOf` method
+       // https://tc39.es/ecma262/#sec-object.getprototypeof
+       $$R({ target: 'Object', stat: true, forced: FAILS_ON_PRIMITIVES$4, sham: !CORRECT_PROTOTYPE_GETTER }, {
+         getPrototypeOf: function getPrototypeOf(it) {
+           return nativeGetPrototypeOf(toObject$8(it));
+         }
+       });
+
+       var global$j = global$1o;
+       var uncurryThis$m = functionUncurryThis;
+       var aCallable$2 = aCallable$a;
+       var isObject$b = isObject$s;
+       var hasOwn$5 = hasOwnProperty_1;
+       var arraySlice$2 = arraySlice$b;
+       var NATIVE_BIND = functionBindNative;
+
+       var Function$1 = global$j.Function;
+       var concat$1 = uncurryThis$m([].concat);
+       var join$3 = uncurryThis$m([].join);
+       var factories = {};
+
+       var construct = function (C, argsLength, args) {
+         if (!hasOwn$5(factories, argsLength)) {
+           for (var list = [], i = 0; i < argsLength; i++) list[i] = 'a[' + i + ']';
+           factories[argsLength] = Function$1('C,a', 'return new C(' + join$3(list, ',') + ')');
+         } return factories[argsLength](C, args);
+       };
+
+       // `Function.prototype.bind` method implementation
+       // https://tc39.es/ecma262/#sec-function.prototype.bind
+       var functionBind = NATIVE_BIND ? Function$1.bind : function bind(that /* , ...args */) {
+         var F = aCallable$2(this);
+         var Prototype = F.prototype;
+         var partArgs = arraySlice$2(arguments, 1);
+         var boundFunction = function bound(/* args... */) {
+           var args = concat$1(partArgs, arraySlice$2(arguments));
+           return this instanceof boundFunction ? construct(F, args.length, args) : F.apply(that, args);
+         };
+         if (isObject$b(Prototype)) boundFunction.prototype = Prototype;
+         return boundFunction;
+       };
+
+       var $$Q = _export;
+       var getBuiltIn$1 = getBuiltIn$b;
+       var apply = functionApply;
+       var bind$7 = functionBind;
+       var aConstructor = aConstructor$3;
+       var anObject$4 = anObject$n;
+       var isObject$a = isObject$s;
+       var create$4 = objectCreate;
+       var fails$m = fails$V;
+
+       var nativeConstruct = getBuiltIn$1('Reflect', 'construct');
+       var ObjectPrototype = Object.prototype;
+       var push$4 = [].push;
+
+       // `Reflect.construct` method
+       // https://tc39.es/ecma262/#sec-reflect.construct
+       // MS Edge supports only 2 arguments and argumentsList argument is optional
+       // FF Nightly sets third argument as `new.target`, but does not create `this` from it
+       var NEW_TARGET_BUG = fails$m(function () {
+         function F() { /* empty */ }
+         return !(nativeConstruct(function () { /* empty */ }, [], F) instanceof F);
+       });
+
+       var ARGS_BUG = !fails$m(function () {
+         nativeConstruct(function () { /* empty */ });
+       });
+
+       var FORCED$c = NEW_TARGET_BUG || ARGS_BUG;
+
+       $$Q({ target: 'Reflect', stat: true, forced: FORCED$c, sham: FORCED$c }, {
+         construct: function construct(Target, args /* , newTarget */) {
+           aConstructor(Target);
+           anObject$4(args);
+           var newTarget = arguments.length < 3 ? Target : aConstructor(arguments[2]);
+           if (ARGS_BUG && !NEW_TARGET_BUG) return nativeConstruct(Target, args, newTarget);
+           if (Target == newTarget) {
+             // w/o altered newTarget, optimization for 0-4 arguments
+             switch (args.length) {
+               case 0: return new Target();
+               case 1: return new Target(args[0]);
+               case 2: return new Target(args[0], args[1]);
+               case 3: return new Target(args[0], args[1], args[2]);
+               case 4: return new Target(args[0], args[1], args[2], args[3]);
+             }
+             // w/o altered newTarget, lot of arguments case
+             var $args = [null];
+             apply(push$4, $args, args);
+             return new (apply(bind$7, Target, $args))();
+           }
+           // with altered newTarget, not support built-in constructors
+           var proto = newTarget.prototype;
+           var instance = create$4(isObject$a(proto) ? proto : ObjectPrototype);
+           var result = apply(Target, instance, args);
+           return isObject$a(result) ? result : instance;
+         }
+       });
+
+       var hasOwn$4 = hasOwnProperty_1;
+
+       var isDataDescriptor$1 = function (descriptor) {
+         return descriptor !== undefined && (hasOwn$4(descriptor, 'value') || hasOwn$4(descriptor, 'writable'));
+       };
+
+       var $$P = _export;
+       var call$5 = functionCall;
+       var isObject$9 = isObject$s;
+       var anObject$3 = anObject$n;
+       var isDataDescriptor = isDataDescriptor$1;
+       var getOwnPropertyDescriptorModule = objectGetOwnPropertyDescriptor;
+       var getPrototypeOf = objectGetPrototypeOf;
+
+       // `Reflect.get` method
+       // https://tc39.es/ecma262/#sec-reflect.get
+       function get$3(target, propertyKey /* , receiver */) {
+         var receiver = arguments.length < 3 ? target : arguments[2];
+         var descriptor, prototype;
+         if (anObject$3(target) === receiver) return target[propertyKey];
+         descriptor = getOwnPropertyDescriptorModule.f(target, propertyKey);
+         if (descriptor) return isDataDescriptor(descriptor)
+           ? descriptor.value
+           : descriptor.get === undefined ? undefined : call$5(descriptor.get, receiver);
+         if (isObject$9(prototype = getPrototypeOf(target))) return get$3(prototype, propertyKey, receiver);
+       }
+
+       $$P({ target: 'Reflect', stat: true }, {
+         get: get$3
+       });
+
+       var $$O = _export;
+       var fails$l = fails$V;
+       var toIndexedObject$1 = toIndexedObject$d;
+       var nativeGetOwnPropertyDescriptor = objectGetOwnPropertyDescriptor.f;
+       var DESCRIPTORS$8 = descriptors;
+
+       var FAILS_ON_PRIMITIVES$3 = fails$l(function () { nativeGetOwnPropertyDescriptor(1); });
+       var FORCED$b = !DESCRIPTORS$8 || FAILS_ON_PRIMITIVES$3;
+
+       // `Object.getOwnPropertyDescriptor` method
+       // https://tc39.es/ecma262/#sec-object.getownpropertydescriptor
+       $$O({ target: 'Object', stat: true, forced: FORCED$b, sham: !DESCRIPTORS$8 }, {
+         getOwnPropertyDescriptor: function getOwnPropertyDescriptor(it, key) {
+           return nativeGetOwnPropertyDescriptor(toIndexedObject$1(it), key);
+         }
+       });
+
+       var $$N = _export;
+       var global$i = global$1o;
+       var toAbsoluteIndex$1 = toAbsoluteIndex$9;
+       var toIntegerOrInfinity$2 = toIntegerOrInfinity$b;
+       var lengthOfArrayLike$5 = lengthOfArrayLike$i;
+       var toObject$7 = toObject$i;
+       var arraySpeciesCreate$2 = arraySpeciesCreate$4;
+       var createProperty$2 = createProperty$5;
+       var arrayMethodHasSpeciesSupport$2 = arrayMethodHasSpeciesSupport$5;
+
+       var HAS_SPECIES_SUPPORT$1 = arrayMethodHasSpeciesSupport$2('splice');
+
+       var TypeError$6 = global$i.TypeError;
+       var max$1 = Math.max;
+       var min$3 = Math.min;
+       var MAX_SAFE_INTEGER$1 = 0x1FFFFFFFFFFFFF;
+       var MAXIMUM_ALLOWED_LENGTH_EXCEEDED = 'Maximum allowed length exceeded';
+
+       // `Array.prototype.splice` method
+       // https://tc39.es/ecma262/#sec-array.prototype.splice
+       // with adding support of @@species
+       $$N({ target: 'Array', proto: true, forced: !HAS_SPECIES_SUPPORT$1 }, {
+         splice: function splice(start, deleteCount /* , ...items */) {
+           var O = toObject$7(this);
+           var len = lengthOfArrayLike$5(O);
+           var actualStart = toAbsoluteIndex$1(start, len);
+           var argumentsLength = arguments.length;
+           var insertCount, actualDeleteCount, A, k, from, to;
+           if (argumentsLength === 0) {
+             insertCount = actualDeleteCount = 0;
+           } else if (argumentsLength === 1) {
+             insertCount = 0;
+             actualDeleteCount = len - actualStart;
+           } else {
+             insertCount = argumentsLength - 2;
+             actualDeleteCount = min$3(max$1(toIntegerOrInfinity$2(deleteCount), 0), len - actualStart);
+           }
+           if (len + insertCount - actualDeleteCount > MAX_SAFE_INTEGER$1) {
+             throw TypeError$6(MAXIMUM_ALLOWED_LENGTH_EXCEEDED);
+           }
+           A = arraySpeciesCreate$2(O, actualDeleteCount);
+           for (k = 0; k < actualDeleteCount; k++) {
+             from = actualStart + k;
+             if (from in O) createProperty$2(A, k, O[from]);
+           }
+           A.length = actualDeleteCount;
+           if (insertCount < actualDeleteCount) {
+             for (k = actualStart; k < len - actualDeleteCount; k++) {
+               from = k + actualDeleteCount;
+               to = k + insertCount;
+               if (from in O) O[to] = O[from];
+               else delete O[to];
+             }
+             for (k = len; k > len - actualDeleteCount + insertCount; k--) delete O[k - 1];
+           } else if (insertCount > actualDeleteCount) {
+             for (k = len - actualDeleteCount; k > actualStart; k--) {
+               from = k + actualDeleteCount - 1;
+               to = k + insertCount - 1;
+               if (from in O) O[to] = O[from];
+               else delete O[to];
+             }
+           }
+           for (k = 0; k < insertCount; k++) {
+             O[k + actualStart] = arguments[k + 2];
+           }
+           O.length = len - actualDeleteCount + insertCount;
+           return A;
+         }
+       });
+
+       var defineWellKnownSymbol$1 = defineWellKnownSymbol$4;
+
+       // `Symbol.toStringTag` well-known symbol
+       // https://tc39.es/ecma262/#sec-symbol.tostringtag
+       defineWellKnownSymbol$1('toStringTag');
+
+       var global$h = global$1o;
+       var setToStringTag$3 = setToStringTag$a;
+
+       // JSON[@@toStringTag] property
+       // https://tc39.es/ecma262/#sec-json-@@tostringtag
+       setToStringTag$3(global$h.JSON, 'JSON', true);
+
+       var setToStringTag$2 = setToStringTag$a;
+
+       // Math[@@toStringTag] property
+       // https://tc39.es/ecma262/#sec-math-@@tostringtag
+       setToStringTag$2(Math, 'Math', true);
+
+       (function (factory) {
+         factory();
+       })(function () {
+
+         function _classCallCheck(instance, Constructor) {
+           if (!(instance instanceof Constructor)) {
+             throw new TypeError("Cannot call a class as a function");
+           }
+         }
+
+         function _defineProperties(target, props) {
+           for (var i = 0; i < props.length; i++) {
+             var descriptor = props[i];
+             descriptor.enumerable = descriptor.enumerable || false;
+             descriptor.configurable = true;
+             if ("value" in descriptor) descriptor.writable = true;
+             Object.defineProperty(target, descriptor.key, descriptor);
+           }
+         }
+
+         function _createClass(Constructor, protoProps, staticProps) {
+           if (protoProps) _defineProperties(Constructor.prototype, protoProps);
+           if (staticProps) _defineProperties(Constructor, staticProps);
+           return Constructor;
+         }
+
+         function _inherits(subClass, superClass) {
+           if (typeof superClass !== "function" && superClass !== null) {
+             throw new TypeError("Super expression must either be null or a function");
+           }
+
+           subClass.prototype = Object.create(superClass && superClass.prototype, {
+             constructor: {
+               value: subClass,
+               writable: true,
+               configurable: true
+             }
+           });
+           if (superClass) _setPrototypeOf(subClass, superClass);
+         }
+
+         function _getPrototypeOf(o) {
+           _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) {
+             return o.__proto__ || Object.getPrototypeOf(o);
+           };
+           return _getPrototypeOf(o);
+         }
+
+         function _setPrototypeOf(o, p) {
+           _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) {
+             o.__proto__ = p;
+             return o;
+           };
+
+           return _setPrototypeOf(o, p);
+         }
+
+         function _isNativeReflectConstruct() {
+           if (typeof Reflect === "undefined" || !Reflect.construct) return false;
+           if (Reflect.construct.sham) return false;
+           if (typeof Proxy === "function") return true;
+
+           try {
+             Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {}));
+             return true;
+           } catch (e) {
+             return false;
+           }
+         }
+
+         function _assertThisInitialized(self) {
+           if (self === void 0) {
+             throw new ReferenceError("this hasn't been initialised - super() hasn't been called");
+           }
+
+           return self;
+         }
+
+         function _possibleConstructorReturn(self, call) {
+           if (call && (_typeof(call) === "object" || typeof call === "function")) {
+             return call;
+           }
+
+           return _assertThisInitialized(self);
+         }
+
+         function _createSuper(Derived) {
+           var hasNativeReflectConstruct = _isNativeReflectConstruct();
+
+           return function _createSuperInternal() {
+             var Super = _getPrototypeOf(Derived),
+                 result;
+
+             if (hasNativeReflectConstruct) {
+               var NewTarget = _getPrototypeOf(this).constructor;
+
+               result = Reflect.construct(Super, arguments, NewTarget);
+             } else {
+               result = Super.apply(this, arguments);
+             }
+
+             return _possibleConstructorReturn(this, result);
+           };
+         }
+
+         function _superPropBase(object, property) {
+           while (!Object.prototype.hasOwnProperty.call(object, property)) {
+             object = _getPrototypeOf(object);
+             if (object === null) break;
+           }
+
+           return object;
+         }
+
+         function _get(target, property, receiver) {
+           if (typeof Reflect !== "undefined" && Reflect.get) {
+             _get = Reflect.get;
+           } else {
+             _get = function _get(target, property, receiver) {
+               var base = _superPropBase(target, property);
+
+               if (!base) return;
+               var desc = Object.getOwnPropertyDescriptor(base, property);
+
+               if (desc.get) {
+                 return desc.get.call(receiver);
+               }
+
+               return desc.value;
+             };
+           }
+
+           return _get(target, property, receiver || target);
+         }
+
+         var Emitter = /*#__PURE__*/function () {
+           function Emitter() {
+             _classCallCheck(this, Emitter);
+
+             Object.defineProperty(this, 'listeners', {
+               value: {},
+               writable: true,
+               configurable: true
+             });
+           }
+
+           _createClass(Emitter, [{
+             key: "addEventListener",
+             value: function addEventListener(type, callback, options) {
+               if (!(type in this.listeners)) {
+                 this.listeners[type] = [];
+               }
+
+               this.listeners[type].push({
+                 callback: callback,
+                 options: options
+               });
+             }
+           }, {
+             key: "removeEventListener",
+             value: function removeEventListener(type, callback) {
+               if (!(type in this.listeners)) {
+                 return;
+               }
+
+               var stack = this.listeners[type];
+
+               for (var i = 0, l = stack.length; i < l; i++) {
+                 if (stack[i].callback === callback) {
+                   stack.splice(i, 1);
+                   return;
+                 }
+               }
+             }
+           }, {
+             key: "dispatchEvent",
+             value: function dispatchEvent(event) {
+               if (!(event.type in this.listeners)) {
+                 return;
+               }
+
+               var stack = this.listeners[event.type];
+               var stackToCall = stack.slice();
+
+               for (var i = 0, l = stackToCall.length; i < l; i++) {
+                 var listener = stackToCall[i];
+
+                 try {
+                   listener.callback.call(this, event);
+                 } catch (e) {
+                   Promise.resolve().then(function () {
+                     throw e;
+                   });
+                 }
+
+                 if (listener.options && listener.options.once) {
+                   this.removeEventListener(event.type, listener.callback);
+                 }
+               }
+
+               return !event.defaultPrevented;
+             }
+           }]);
+
+           return Emitter;
+         }();
+
+         var AbortSignal = /*#__PURE__*/function (_Emitter) {
+           _inherits(AbortSignal, _Emitter);
+
+           var _super = _createSuper(AbortSignal);
+
+           function AbortSignal() {
+             var _this;
+
+             _classCallCheck(this, AbortSignal);
+
+             _this = _super.call(this); // Some versions of babel does not transpile super() correctly for IE <= 10, if the parent
+             // constructor has failed to run, then "this.listeners" will still be undefined and then we call
+             // the parent constructor directly instead as a workaround. For general details, see babel bug:
+             // https://github.com/babel/babel/issues/3041
+             // This hack was added as a fix for the issue described here:
+             // https://github.com/Financial-Times/polyfill-library/pull/59#issuecomment-477558042
+
+             if (!_this.listeners) {
+               Emitter.call(_assertThisInitialized(_this));
+             } // Compared to assignment, Object.defineProperty makes properties non-enumerable by default and
+             // we want Object.keys(new AbortController().signal) to be [] for compat with the native impl
+
+
+             Object.defineProperty(_assertThisInitialized(_this), 'aborted', {
+               value: false,
+               writable: true,
+               configurable: true
+             });
+             Object.defineProperty(_assertThisInitialized(_this), 'onabort', {
+               value: null,
+               writable: true,
+               configurable: true
+             });
+             return _this;
+           }
+
+           _createClass(AbortSignal, [{
+             key: "toString",
+             value: function toString() {
+               return '[object AbortSignal]';
+             }
+           }, {
+             key: "dispatchEvent",
+             value: function dispatchEvent(event) {
+               if (event.type === 'abort') {
+                 this.aborted = true;
+
+                 if (typeof this.onabort === 'function') {
+                   this.onabort.call(this, event);
+                 }
+               }
+
+               _get(_getPrototypeOf(AbortSignal.prototype), "dispatchEvent", this).call(this, event);
+             }
+           }]);
+
+           return AbortSignal;
+         }(Emitter);
+
+         var AbortController = /*#__PURE__*/function () {
+           function AbortController() {
+             _classCallCheck(this, AbortController); // Compared to assignment, Object.defineProperty makes properties non-enumerable by default and
+             // we want Object.keys(new AbortController()) to be [] for compat with the native impl
+
+
+             Object.defineProperty(this, 'signal', {
+               value: new AbortSignal(),
+               writable: true,
+               configurable: true
+             });
+           }
+
+           _createClass(AbortController, [{
+             key: "abort",
+             value: function abort() {
+               var event;
+
+               try {
+                 event = new Event('abort');
+               } catch (e) {
+                 if (typeof document !== 'undefined') {
+                   if (!document.createEvent) {
+                     // For Internet Explorer 8:
+                     event = document.createEventObject();
+                     event.type = 'abort';
+                   } else {
+                     // For Internet Explorer 11:
+                     event = document.createEvent('Event');
+                     event.initEvent('abort', false, false);
+                   }
+                 } else {
+                   // Fallback where document isn't available:
+                   event = {
+                     type: 'abort',
+                     bubbles: false,
+                     cancelable: false
+                   };
+                 }
+               }
+
+               this.signal.dispatchEvent(event);
+             }
+           }, {
+             key: "toString",
+             value: function toString() {
+               return '[object AbortController]';
+             }
+           }]);
+
+           return AbortController;
+         }();
+
+         if (typeof Symbol !== 'undefined' && Symbol.toStringTag) {
+           // These are necessary to make sure that we get correct output for:
+           // Object.prototype.toString.call(new AbortController())
+           AbortController.prototype[Symbol.toStringTag] = 'AbortController';
+           AbortSignal.prototype[Symbol.toStringTag] = 'AbortSignal';
+         }
+
+         function polyfillNeeded(self) {
+           if (self.__FORCE_INSTALL_ABORTCONTROLLER_POLYFILL) {
+             console.log('__FORCE_INSTALL_ABORTCONTROLLER_POLYFILL=true is set, will force install polyfill');
+             return true;
+           } // Note that the "unfetch" minimal fetch polyfill defines fetch() without
+           // defining window.Request, and this polyfill need to work on top of unfetch
+           // so the below feature detection needs the !self.AbortController part.
+           // The Request.prototype check is also needed because Safari versions 11.1.2
+           // up to and including 12.1.x has a window.AbortController present but still
+           // does NOT correctly implement abortable fetch:
+           // https://bugs.webkit.org/show_bug.cgi?id=174980#c2
+
+
+           return typeof self.Request === 'function' && !self.Request.prototype.hasOwnProperty('signal') || !self.AbortController;
+         }
+         /**
+          * Note: the "fetch.Request" default value is available for fetch imported from
+          * the "node-fetch" package and not in browsers. This is OK since browsers
+          * will be importing umd-polyfill.js from that path "self" is passed the
+          * decorator so the default value will not be used (because browsers that define
+          * fetch also has Request). One quirky setup where self.fetch exists but
+          * self.Request does not is when the "unfetch" minimal fetch polyfill is used
+          * on top of IE11; for this case the browser will try to use the fetch.Request
+          * default value which in turn will be undefined but then then "if (Request)"
+          * will ensure that you get a patched fetch but still no Request (as expected).
+          * @param {fetch, Request = fetch.Request}
+          * @returns {fetch: abortableFetch, Request: AbortableRequest}
+          */
+
+
+         function abortableFetchDecorator(patchTargets) {
+           if ('function' === typeof patchTargets) {
+             patchTargets = {
+               fetch: patchTargets
+             };
+           }
+
+           var _patchTargets = patchTargets,
+               fetch = _patchTargets.fetch,
+               _patchTargets$Request = _patchTargets.Request,
+               NativeRequest = _patchTargets$Request === void 0 ? fetch.Request : _patchTargets$Request,
+               NativeAbortController = _patchTargets.AbortController,
+               _patchTargets$__FORCE = _patchTargets.__FORCE_INSTALL_ABORTCONTROLLER_POLYFILL,
+               __FORCE_INSTALL_ABORTCONTROLLER_POLYFILL = _patchTargets$__FORCE === void 0 ? false : _patchTargets$__FORCE;
+
+           if (!polyfillNeeded({
+             fetch: fetch,
+             Request: NativeRequest,
+             AbortController: NativeAbortController,
+             __FORCE_INSTALL_ABORTCONTROLLER_POLYFILL: __FORCE_INSTALL_ABORTCONTROLLER_POLYFILL
+           })) {
+             return {
+               fetch: fetch,
+               Request: Request
+             };
+           }
+
+           var Request = NativeRequest; // Note that the "unfetch" minimal fetch polyfill defines fetch() without
+           // defining window.Request, and this polyfill need to work on top of unfetch
+           // hence we only patch it if it's available. Also we don't patch it if signal
+           // is already available on the Request prototype because in this case support
+           // is present and the patching below can cause a crash since it assigns to
+           // request.signal which is technically a read-only property. This latter error
+           // happens when you run the main5.js node-fetch example in the repo
+           // "abortcontroller-polyfill-examples". The exact error is:
+           //   request.signal = init.signal;
+           //   ^
+           // TypeError: Cannot set property signal of #<Request> which has only a getter
+
+           if (Request && !Request.prototype.hasOwnProperty('signal') || __FORCE_INSTALL_ABORTCONTROLLER_POLYFILL) {
+             Request = function Request(input, init) {
+               var signal;
+
+               if (init && init.signal) {
+                 signal = init.signal; // Never pass init.signal to the native Request implementation when the polyfill has
+                 // been installed because if we're running on top of a browser with a
+                 // working native AbortController (i.e. the polyfill was installed due to
+                 // __FORCE_INSTALL_ABORTCONTROLLER_POLYFILL being set), then passing our
+                 // fake AbortSignal to the native fetch will trigger:
+                 // TypeError: Failed to construct 'Request': member signal is not of type AbortSignal.
+
+                 delete init.signal;
+               }
+
+               var request = new NativeRequest(input, init);
+
+               if (signal) {
+                 Object.defineProperty(request, 'signal', {
+                   writable: false,
+                   enumerable: false,
+                   configurable: true,
+                   value: signal
+                 });
+               }
+
+               return request;
+             };
+
+             Request.prototype = NativeRequest.prototype;
+           }
+
+           var realFetch = fetch;
+
+           var abortableFetch = function abortableFetch(input, init) {
+             var signal = Request && Request.prototype.isPrototypeOf(input) ? input.signal : init ? init.signal : undefined;
+
+             if (signal) {
+               var abortError;
+
+               try {
+                 abortError = new DOMException('Aborted', 'AbortError');
+               } catch (err) {
+                 // IE 11 does not support calling the DOMException constructor, use a
+                 // regular error object on it instead.
+                 abortError = new Error('Aborted');
+                 abortError.name = 'AbortError';
+               } // Return early if already aborted, thus avoiding making an HTTP request
+
+
+               if (signal.aborted) {
+                 return Promise.reject(abortError);
+               } // Turn an event into a promise, reject it once `abort` is dispatched
+
+
+               var cancellation = new Promise(function (_, reject) {
+                 signal.addEventListener('abort', function () {
+                   return reject(abortError);
+                 }, {
+                   once: true
+                 });
+               });
+
+               if (init && init.signal) {
+                 // Never pass .signal to the native implementation when the polyfill has
+                 // been installed because if we're running on top of a browser with a
+                 // working native AbortController (i.e. the polyfill was installed due to
+                 // __FORCE_INSTALL_ABORTCONTROLLER_POLYFILL being set), then passing our
+                 // fake AbortSignal to the native fetch will trigger:
+                 // TypeError: Failed to execute 'fetch' on 'Window': member signal is not of type AbortSignal.
+                 delete init.signal;
+               } // Return the fastest promise (don't need to wait for request to finish)
+
+
+               return Promise.race([cancellation, realFetch(input, init)]);
+             }
+
+             return realFetch(input, init);
+           };
+
+           return {
+             fetch: abortableFetch,
+             Request: Request
+           };
+         }
+
+         (function (self) {
+           if (!polyfillNeeded(self)) {
+             return;
+           }
+
+           if (!self.fetch) {
+             console.warn('fetch() is not available, cannot install abortcontroller-polyfill');
+             return;
+           }
+
+           var _abortableFetch = abortableFetchDecorator(self),
+               fetch = _abortableFetch.fetch,
+               Request = _abortableFetch.Request;
+
+           self.fetch = fetch;
+           self.Request = Request;
+           Object.defineProperty(self, 'AbortController', {
+             writable: true,
+             enumerable: false,
+             configurable: true,
+             value: AbortController
+           });
+           Object.defineProperty(self, 'AbortSignal', {
+             writable: true,
+             enumerable: false,
+             configurable: true,
+             value: AbortSignal
+           });
+         })(typeof self !== 'undefined' ? self : commonjsGlobal);
+       });
+
+       function actionAddEntity(way) {
+         return function (graph) {
+           return graph.replace(way);
+         };
+       }
+
+       var $$M = _export;
+       var global$g = global$1o;
+       var fails$k = fails$V;
+       var isArray$3 = isArray$8;
+       var isObject$8 = isObject$s;
+       var toObject$6 = toObject$i;
+       var lengthOfArrayLike$4 = lengthOfArrayLike$i;
+       var createProperty$1 = createProperty$5;
+       var arraySpeciesCreate$1 = arraySpeciesCreate$4;
+       var arrayMethodHasSpeciesSupport$1 = arrayMethodHasSpeciesSupport$5;
+       var wellKnownSymbol$2 = wellKnownSymbol$t;
+       var V8_VERSION = engineV8Version;
+
+       var IS_CONCAT_SPREADABLE = wellKnownSymbol$2('isConcatSpreadable');
+       var MAX_SAFE_INTEGER = 0x1FFFFFFFFFFFFF;
+       var MAXIMUM_ALLOWED_INDEX_EXCEEDED = 'Maximum allowed index exceeded';
+       var TypeError$5 = global$g.TypeError;
+
+       // We can't use this feature detection in V8 since it causes
+       // deoptimization and serious performance degradation
+       // https://github.com/zloirock/core-js/issues/679
+       var IS_CONCAT_SPREADABLE_SUPPORT = V8_VERSION >= 51 || !fails$k(function () {
+         var array = [];
+         array[IS_CONCAT_SPREADABLE] = false;
+         return array.concat()[0] !== array;
+       });
+
+       var SPECIES_SUPPORT = arrayMethodHasSpeciesSupport$1('concat');
+
+       var isConcatSpreadable = function (O) {
+         if (!isObject$8(O)) return false;
+         var spreadable = O[IS_CONCAT_SPREADABLE];
+         return spreadable !== undefined ? !!spreadable : isArray$3(O);
+       };
+
+       var FORCED$a = !IS_CONCAT_SPREADABLE_SUPPORT || !SPECIES_SUPPORT;
+
+       // `Array.prototype.concat` method
+       // https://tc39.es/ecma262/#sec-array.prototype.concat
+       // with adding support of @@isConcatSpreadable and @@species
+       $$M({ target: 'Array', proto: true, forced: FORCED$a }, {
+         // eslint-disable-next-line no-unused-vars -- required for `.length`
+         concat: function concat(arg) {
+           var O = toObject$6(this);
+           var A = arraySpeciesCreate$1(O, 0);
+           var n = 0;
+           var i, k, length, len, E;
+           for (i = -1, length = arguments.length; i < length; i++) {
+             E = i === -1 ? O : arguments[i];
+             if (isConcatSpreadable(E)) {
+               len = lengthOfArrayLike$4(E);
+               if (n + len > MAX_SAFE_INTEGER) throw TypeError$5(MAXIMUM_ALLOWED_INDEX_EXCEEDED);
+               for (k = 0; k < len; k++, n++) if (k in E) createProperty$1(A, n, E[k]);
+             } else {
+               if (n >= MAX_SAFE_INTEGER) throw TypeError$5(MAXIMUM_ALLOWED_INDEX_EXCEEDED);
+               createProperty$1(A, n++, E);
+             }
+           }
+           A.length = n;
+           return A;
+         }
+       });
+
+       var DESCRIPTORS$7 = descriptors;
+       var uncurryThis$l = functionUncurryThis;
+       var call$4 = functionCall;
+       var fails$j = fails$V;
+       var objectKeys$1 = objectKeys$4;
+       var getOwnPropertySymbolsModule = objectGetOwnPropertySymbols;
+       var propertyIsEnumerableModule = objectPropertyIsEnumerable;
+       var toObject$5 = toObject$i;
+       var IndexedObject = indexedObject;
+
+       // eslint-disable-next-line es/no-object-assign -- safe
+       var $assign = Object.assign;
+       // eslint-disable-next-line es/no-object-defineproperty -- required for testing
+       var defineProperty$4 = Object.defineProperty;
+       var concat = uncurryThis$l([].concat);
+
+       // `Object.assign` method
+       // https://tc39.es/ecma262/#sec-object.assign
+       var objectAssign = !$assign || fails$j(function () {
+         // should have correct order of operations (Edge bug)
+         if (DESCRIPTORS$7 && $assign({ b: 1 }, $assign(defineProperty$4({}, 'a', {
+           enumerable: true,
+           get: function () {
+             defineProperty$4(this, 'b', {
+               value: 3,
+               enumerable: false
+             });
+           }
+         }), { b: 2 })).b !== 1) return true;
+         // should work with symbols and should have deterministic property order (V8 bug)
+         var A = {};
+         var B = {};
+         // eslint-disable-next-line es/no-symbol -- safe
+         var symbol = Symbol();
+         var alphabet = 'abcdefghijklmnopqrst';
+         A[symbol] = 7;
+         alphabet.split('').forEach(function (chr) { B[chr] = chr; });
+         return $assign({}, A)[symbol] != 7 || objectKeys$1($assign({}, B)).join('') != alphabet;
+       }) ? function assign(target, source) { // eslint-disable-line no-unused-vars -- required for `.length`
+         var T = toObject$5(target);
+         var argumentsLength = arguments.length;
+         var index = 1;
+         var getOwnPropertySymbols = getOwnPropertySymbolsModule.f;
+         var propertyIsEnumerable = propertyIsEnumerableModule.f;
+         while (argumentsLength > index) {
+           var S = IndexedObject(arguments[index++]);
+           var keys = getOwnPropertySymbols ? concat(objectKeys$1(S), getOwnPropertySymbols(S)) : objectKeys$1(S);
+           var length = keys.length;
+           var j = 0;
+           var key;
+           while (length > j) {
+             key = keys[j++];
+             if (!DESCRIPTORS$7 || call$4(propertyIsEnumerable, S, key)) T[key] = S[key];
+           }
+         } return T;
+       } : $assign;
+
+       var $$L = _export;
+       var assign$2 = objectAssign;
+
+       // `Object.assign` method
+       // https://tc39.es/ecma262/#sec-object.assign
+       // eslint-disable-next-line es/no-object-assign -- required for testing
+       $$L({ target: 'Object', stat: true, forced: Object.assign !== assign$2 }, {
+         assign: assign$2
+       });
+
+       var $$K = _export;
+       var $filter = arrayIteration.filter;
+       var arrayMethodHasSpeciesSupport = arrayMethodHasSpeciesSupport$5;
+
+       var HAS_SPECIES_SUPPORT = arrayMethodHasSpeciesSupport('filter');
+
+       // `Array.prototype.filter` method
+       // https://tc39.es/ecma262/#sec-array.prototype.filter
+       // with adding support of @@species
+       $$K({ target: 'Array', proto: true, forced: !HAS_SPECIES_SUPPORT }, {
+         filter: function filter(callbackfn /* , thisArg */) {
+           return $filter(this, callbackfn, arguments.length > 1 ? arguments[1] : undefined);
+         }
+       });
+
+       var $$J = _export;
+       var toObject$4 = toObject$i;
+       var nativeKeys = objectKeys$4;
+       var fails$i = fails$V;
+
+       var FAILS_ON_PRIMITIVES$2 = fails$i(function () { nativeKeys(1); });
+
+       // `Object.keys` method
+       // https://tc39.es/ecma262/#sec-object.keys
+       $$J({ target: 'Object', stat: true, forced: FAILS_ON_PRIMITIVES$2 }, {
+         keys: function keys(it) {
+           return nativeKeys(toObject$4(it));
+         }
+       });
+
+       var $$I = _export;
+       var uncurryThis$k = functionUncurryThis;
+       var isArray$2 = isArray$8;
+
+       var un$Reverse = uncurryThis$k([].reverse);
+       var test$1 = [1, 2];
+
+       // `Array.prototype.reverse` method
+       // https://tc39.es/ecma262/#sec-array.prototype.reverse
+       // fix for Safari 12.0 bug
+       // https://bugs.webkit.org/show_bug.cgi?id=188794
+       $$I({ target: 'Array', proto: true, forced: String(test$1) === String(test$1.reverse()) }, {
+         reverse: function reverse() {
+           // eslint-disable-next-line no-self-assign -- dirty hack
+           if (isArray$2(this)) this.length = this.length;
+           return un$Reverse(this);
+         }
+       });
+
+       var global$f = global$1o;
+       var fails$h = fails$V;
+       var uncurryThis$j = functionUncurryThis;
+       var toString$c = toString$k;
+       var trim$4 = stringTrim.trim;
+       var whitespaces$1 = whitespaces$4;
+
+       var charAt$2 = uncurryThis$j(''.charAt);
+       var n$ParseFloat = global$f.parseFloat;
+       var Symbol$2 = global$f.Symbol;
+       var ITERATOR$1 = Symbol$2 && Symbol$2.iterator;
+       var FORCED$9 = 1 / n$ParseFloat(whitespaces$1 + '-0') !== -Infinity
+         // MS Edge 18- broken with boxed symbols
+         || (ITERATOR$1 && !fails$h(function () { n$ParseFloat(Object(ITERATOR$1)); }));
+
+       // `parseFloat` method
+       // https://tc39.es/ecma262/#sec-parsefloat-string
+       var numberParseFloat = FORCED$9 ? function parseFloat(string) {
+         var trimmedString = trim$4(toString$c(string));
+         var result = n$ParseFloat(trimmedString);
+         return result === 0 && charAt$2(trimmedString, 0) == '-' ? -0 : result;
+       } : n$ParseFloat;
+
+       var $$H = _export;
+       var $parseFloat = numberParseFloat;
+
+       // `parseFloat` method
+       // https://tc39.es/ecma262/#sec-parsefloat-string
+       $$H({ global: true, forced: parseFloat != $parseFloat }, {
+         parseFloat: $parseFloat
+       });
+
+       /*
+       Order the nodes of a way in reverse order and reverse any direction dependent tags
+       other than `oneway`. (We assume that correcting a backwards oneway is the primary
+       reason for reversing a way.)
+
+       In addition, numeric-valued `incline` tags are negated.
+
+       The JOSM implementation was used as a guide, but transformations that were of unclear benefit
+       or adjusted tags that don't seem to be used in practice were omitted.
+
+       References:
+           http://wiki.openstreetmap.org/wiki/Forward_%26_backward,_left_%26_right
+           http://wiki.openstreetmap.org/wiki/Key:direction#Steps
+           http://wiki.openstreetmap.org/wiki/Key:incline
+           http://wiki.openstreetmap.org/wiki/Route#Members
+           http://josm.openstreetmap.de/browser/josm/trunk/src/org/openstreetmap/josm/corrector/ReverseWayTagCorrector.java
+           http://wiki.openstreetmap.org/wiki/Tag:highway%3Dstop
+           http://wiki.openstreetmap.org/wiki/Key:traffic_sign#On_a_way_or_area
+       */
+       function actionReverse(entityID, options) {
+         var ignoreKey = /^.*(_|:)?(description|name|note|website|ref|source|comment|watch|attribution)(_|:)?/;
+         var numeric = /^([+\-]?)(?=[\d.])/;
+         var directionKey = /direction$/;
+         var turn_lanes = /^turn:lanes:?/;
+         var keyReplacements = [[/:right$/, ':left'], [/:left$/, ':right'], [/:forward$/, ':backward'], [/:backward$/, ':forward'], [/:right:/, ':left:'], [/:left:/, ':right:'], [/:forward:/, ':backward:'], [/:backward:/, ':forward:']];
+         var valueReplacements = {
+           left: 'right',
+           right: 'left',
+           up: 'down',
+           down: 'up',
+           forward: 'backward',
+           backward: 'forward',
+           forwards: 'backward',
+           backwards: 'forward'
+         };
+         var roleReplacements = {
+           forward: 'backward',
+           backward: 'forward',
+           forwards: 'backward',
+           backwards: 'forward'
+         };
+         var onewayReplacements = {
+           yes: '-1',
+           '1': '-1',
+           '-1': 'yes'
+         };
+         var compassReplacements = {
+           N: 'S',
+           NNE: 'SSW',
+           NE: 'SW',
+           ENE: 'WSW',
+           E: 'W',
+           ESE: 'WNW',
+           SE: 'NW',
+           SSE: 'NNW',
+           S: 'N',
+           SSW: 'NNE',
+           SW: 'NE',
+           WSW: 'ENE',
+           W: 'E',
+           WNW: 'ESE',
+           NW: 'SE',
+           NNW: 'SSE'
+         };
+
+         function reverseKey(key) {
+           for (var i = 0; i < keyReplacements.length; ++i) {
+             var replacement = keyReplacements[i];
+
+             if (replacement[0].test(key)) {
+               return key.replace(replacement[0], replacement[1]);
+             }
+           }
+
+           return key;
+         }
+
+         function reverseValue(key, value, includeAbsolute) {
+           if (ignoreKey.test(key)) return value; // Turn lanes are left/right to key (not way) direction - #5674
+
+           if (turn_lanes.test(key)) {
+             return value;
+           } else if (key === 'incline' && numeric.test(value)) {
+             return value.replace(numeric, function (_, sign) {
+               return sign === '-' ? '' : '-';
+             });
+           } else if (options && options.reverseOneway && key === 'oneway') {
+             return onewayReplacements[value] || value;
+           } else if (includeAbsolute && directionKey.test(key)) {
+             if (compassReplacements[value]) return compassReplacements[value];
+             var degrees = parseFloat(value);
+
+             if (typeof degrees === 'number' && !isNaN(degrees)) {
+               if (degrees < 180) {
+                 degrees += 180;
+               } else {
+                 degrees -= 180;
+               }
+
+               return degrees.toString();
+             }
+           }
+
+           return valueReplacements[value] || value;
+         } // Reverse the direction of tags attached to the nodes - #3076
+
+
+         function reverseNodeTags(graph, nodeIDs) {
+           for (var i = 0; i < nodeIDs.length; i++) {
+             var node = graph.hasEntity(nodeIDs[i]);
+             if (!node || !Object.keys(node.tags).length) continue;
+             var tags = {};
+
+             for (var key in node.tags) {
+               tags[reverseKey(key)] = reverseValue(key, node.tags[key], node.id === entityID);
+             }
+
+             graph = graph.replace(node.update({
+               tags: tags
+             }));
+           }
+
+           return graph;
+         }
+
+         function reverseWay(graph, way) {
+           var nodes = way.nodes.slice().reverse();
+           var tags = {};
+           var role;
+
+           for (var key in way.tags) {
+             tags[reverseKey(key)] = reverseValue(key, way.tags[key]);
+           }
+
+           graph.parentRelations(way).forEach(function (relation) {
+             relation.members.forEach(function (member, index) {
+               if (member.id === way.id && (role = roleReplacements[member.role])) {
+                 relation = relation.updateMember({
+                   role: role
+                 }, index);
+                 graph = graph.replace(relation);
+               }
+             });
+           }); // Reverse any associated directions on nodes on the way and then replace
+           // the way itself with the reversed node ids and updated way tags
+
+           return reverseNodeTags(graph, nodes).replace(way.update({
+             nodes: nodes,
+             tags: tags
+           }));
+         }
+
+         var action = function action(graph) {
+           var entity = graph.entity(entityID);
+
+           if (entity.type === 'way') {
+             return reverseWay(graph, entity);
+           }
+
+           return reverseNodeTags(graph, [entityID]);
+         };
+
+         action.disabled = function (graph) {
+           var entity = graph.hasEntity(entityID);
+           if (!entity || entity.type === 'way') return false;
+
+           for (var key in entity.tags) {
+             var value = entity.tags[key];
+
+             if (reverseKey(key) !== key || reverseValue(key, value, true) !== value) {
+               return false;
+             }
+           }
+
+           return 'nondirectional_node';
+         };
+
+         action.entityID = function () {
+           return entityID;
+         };
+
+         return action;
+       }
+
+       function osmIsInterestingTag(key) {
+         return key !== 'attribution' && key !== 'created_by' && key !== 'source' && key !== 'odbl' && key.indexOf('source:') !== 0 && key.indexOf('source_ref') !== 0 && // purposely exclude colon
+         key.indexOf('tiger:') !== 0;
+       }
+       var osmAreaKeys = {};
+       function osmSetAreaKeys(value) {
+         osmAreaKeys = value;
+       } // returns an object with the tag from `tags` that implies an area geometry, if any
+
+       function osmTagSuggestingArea(tags) {
+         if (tags.area === 'yes') return {
+           area: 'yes'
+         };
+         if (tags.area === 'no') return null; // `highway` and `railway` are typically linear features, but there
+         // are a few exceptions that should be treated as areas, even in the
+         // absence of a proper `area=yes` or `areaKeys` tag.. see #4194
+
+         var lineKeys = {
+           highway: {
+             rest_area: true,
+             services: true
+           },
+           railway: {
+             roundhouse: true,
+             station: true,
+             traverser: true,
+             turntable: true,
+             wash: true
+           }
+         };
+         var returnTags = {};
+
+         for (var key in tags) {
+           if (key in osmAreaKeys && !(tags[key] in osmAreaKeys[key])) {
+             returnTags[key] = tags[key];
+             return returnTags;
+           }
+
+           if (key in lineKeys && tags[key] in lineKeys[key]) {
+             returnTags[key] = tags[key];
+             return returnTags;
+           }
+         }
+
+         return null;
+       } // Tags that indicate a node can be a standalone point
+       // e.g. { amenity: { bar: true, parking: true, ... } ... }
+
+       var osmPointTags = {};
+       function osmSetPointTags(value) {
+         osmPointTags = value;
+       } // Tags that indicate a node can be part of a way
+       // e.g. { amenity: { parking: true, ... }, highway: { stop: true ... } ... }
+
+       var osmVertexTags = {};
+       function osmSetVertexTags(value) {
+         osmVertexTags = value;
+       }
+       function osmNodeGeometriesForTags(nodeTags) {
+         var geometries = {};
+
+         for (var key in nodeTags) {
+           if (osmPointTags[key] && (osmPointTags[key]['*'] || osmPointTags[key][nodeTags[key]])) {
+             geometries.point = true;
+           }
+
+           if (osmVertexTags[key] && (osmVertexTags[key]['*'] || osmVertexTags[key][nodeTags[key]])) {
+             geometries.vertex = true;
+           } // break early if both are already supported
+
+
+           if (geometries.point && geometries.vertex) break;
+         }
+
+         return geometries;
+       }
+       var osmOneWayTags = {
+         'aerialway': {
+           'chair_lift': true,
+           'drag_lift': true,
+           'j-bar': true,
+           'magic_carpet': true,
+           'mixed_lift': true,
+           'platter': true,
+           'rope_tow': true,
+           't-bar': true,
+           'zip_line': true
+         },
+         'highway': {
+           'motorway': true
+         },
+         'junction': {
+           'circular': true,
+           'roundabout': true
+         },
+         'man_made': {
+           'goods_conveyor': true,
+           'piste:halfpipe': true
+         },
+         'piste:type': {
+           'downhill': true,
+           'sled': true,
+           'yes': true
+         },
+         'seamark:type': {
+           'separation_lane': true,
+           'separation_roundabout': true
+         },
+         'waterway': {
+           'canal': true,
+           'ditch': true,
+           'drain': true,
+           'fish_pass': true,
+           'river': true,
+           'stream': true,
+           'tidal_channel': true
+         }
+       }; // solid and smooth surfaces akin to the assumed default road surface in OSM
+
+       var osmPavedTags = {
+         'surface': {
+           'paved': true,
+           'asphalt': true,
+           'concrete': true,
+           'concrete:lanes': true,
+           'concrete:plates': true
+         },
+         'tracktype': {
+           'grade1': true
+         }
+       }; // solid, if somewhat uncommon surfaces with a high range of smoothness
+
+       var osmSemipavedTags = {
+         'surface': {
+           'cobblestone': true,
+           'cobblestone:flattened': true,
+           'unhewn_cobblestone': true,
+           'sett': true,
+           'paving_stones': true,
+           'metal': true,
+           'wood': true
+         }
+       };
+       var osmRightSideIsInsideTags = {
+         'natural': {
+           'cliff': true,
+           'coastline': 'coastline'
+         },
+         'barrier': {
+           'retaining_wall': true,
+           'kerb': true,
+           'guard_rail': true,
+           'city_wall': true
+         },
+         'man_made': {
+           'embankment': true
+         },
+         'waterway': {
+           'weir': true
+         }
+       }; // "highway" tag values for pedestrian or vehicle right-of-ways that make up the routable network
+       // (does not include `raceway`)
+
+       var osmRoutableHighwayTagValues = {
+         motorway: true,
+         trunk: true,
+         primary: true,
+         secondary: true,
+         tertiary: true,
+         residential: true,
+         motorway_link: true,
+         trunk_link: true,
+         primary_link: true,
+         secondary_link: true,
+         tertiary_link: true,
+         unclassified: true,
+         road: true,
+         service: true,
+         track: true,
+         living_street: true,
+         bus_guideway: true,
+         path: true,
+         footway: true,
+         cycleway: true,
+         bridleway: true,
+         pedestrian: true,
+         corridor: true,
+         steps: true
+       }; // "highway" tag values that generally do not allow motor vehicles
+
+       var osmPathHighwayTagValues = {
+         path: true,
+         footway: true,
+         cycleway: true,
+         bridleway: true,
+         pedestrian: true,
+         corridor: true,
+         steps: true
+       }; // "railway" tag values representing existing railroad tracks (purposely does not include 'abandoned')
+
+       var osmRailwayTrackTagValues = {
+         rail: true,
+         light_rail: true,
+         tram: true,
+         subway: true,
+         monorail: true,
+         funicular: true,
+         miniature: true,
+         narrow_gauge: true,
+         disused: true,
+         preserved: true
+       }; // "waterway" tag values for line features representing water flow
+
+       var osmFlowingWaterwayTagValues = {
+         canal: true,
+         ditch: true,
+         drain: true,
+         fish_pass: true,
+         river: true,
+         stream: true,
+         tidal_channel: true
+       };
+
+       var global$e = global$1o;
+       var fails$g = fails$V;
+       var uncurryThis$i = functionUncurryThis;
+       var toString$b = toString$k;
+       var trim$3 = stringTrim.trim;
+       var whitespaces = whitespaces$4;
+
+       var $parseInt$1 = global$e.parseInt;
+       var Symbol$1 = global$e.Symbol;
+       var ITERATOR = Symbol$1 && Symbol$1.iterator;
+       var hex$2 = /^[+-]?0x/i;
+       var exec$3 = uncurryThis$i(hex$2.exec);
+       var FORCED$8 = $parseInt$1(whitespaces + '08') !== 8 || $parseInt$1(whitespaces + '0x16') !== 22
+         // MS Edge 18- broken with boxed symbols
+         || (ITERATOR && !fails$g(function () { $parseInt$1(Object(ITERATOR)); }));
+
+       // `parseInt` method
+       // https://tc39.es/ecma262/#sec-parseint-string-radix
+       var numberParseInt = FORCED$8 ? function parseInt(string, radix) {
+         var S = trim$3(toString$b(string));
+         return $parseInt$1(S, (radix >>> 0) || (exec$3(hex$2, S) ? 16 : 10));
+       } : $parseInt$1;
+
+       var $$G = _export;
+       var $parseInt = numberParseInt;
+
+       // `parseInt` method
+       // https://tc39.es/ecma262/#sec-parseint-string-radix
+       $$G({ global: true, forced: parseInt != $parseInt }, {
+         parseInt: $parseInt
+       });
+
+       var internalMetadata = {exports: {}};
+
+       // FF26- bug: ArrayBuffers are non-extensible, but Object.isExtensible does not report it
+       var fails$f = fails$V;
+
+       var arrayBufferNonExtensible = fails$f(function () {
+         if (typeof ArrayBuffer == 'function') {
+           var buffer = new ArrayBuffer(8);
+           // eslint-disable-next-line es/no-object-isextensible, es/no-object-defineproperty -- safe
+           if (Object.isExtensible(buffer)) Object.defineProperty(buffer, 'a', { value: 8 });
+         }
+       });
+
+       var fails$e = fails$V;
+       var isObject$7 = isObject$s;
+       var classof = classofRaw$1;
+       var ARRAY_BUFFER_NON_EXTENSIBLE = arrayBufferNonExtensible;
+
+       // eslint-disable-next-line es/no-object-isextensible -- safe
+       var $isExtensible = Object.isExtensible;
+       var FAILS_ON_PRIMITIVES$1 = fails$e(function () { $isExtensible(1); });
+
+       // `Object.isExtensible` method
+       // https://tc39.es/ecma262/#sec-object.isextensible
+       var objectIsExtensible = (FAILS_ON_PRIMITIVES$1 || ARRAY_BUFFER_NON_EXTENSIBLE) ? function isExtensible(it) {
+         if (!isObject$7(it)) return false;
+         if (ARRAY_BUFFER_NON_EXTENSIBLE && classof(it) == 'ArrayBuffer') return false;
+         return $isExtensible ? $isExtensible(it) : true;
+       } : $isExtensible;
+
+       var fails$d = fails$V;
+
+       var freezing = !fails$d(function () {
+         // eslint-disable-next-line es/no-object-isextensible, es/no-object-preventextensions -- required for testing
+         return Object.isExtensible(Object.preventExtensions({}));
+       });
+
+       var $$F = _export;
+       var uncurryThis$h = functionUncurryThis;
+       var hiddenKeys = hiddenKeys$6;
+       var isObject$6 = isObject$s;
+       var hasOwn$3 = hasOwnProperty_1;
+       var defineProperty$3 = objectDefineProperty.f;
+       var getOwnPropertyNamesModule = objectGetOwnPropertyNames;
+       var getOwnPropertyNamesExternalModule = objectGetOwnPropertyNamesExternal;
+       var isExtensible = objectIsExtensible;
+       var uid = uid$5;
+       var FREEZING$1 = freezing;
+
+       var REQUIRED = false;
+       var METADATA = uid('meta');
+       var id$1 = 0;
+
+       var setMetadata = function (it) {
+         defineProperty$3(it, METADATA, { value: {
+           objectID: 'O' + id$1++, // object ID
+           weakData: {}          // weak collections IDs
+         } });
+       };
+
+       var fastKey$1 = function (it, create) {
+         // return a primitive with prefix
+         if (!isObject$6(it)) return typeof it == 'symbol' ? it : (typeof it == 'string' ? 'S' : 'P') + it;
+         if (!hasOwn$3(it, METADATA)) {
+           // can't set metadata to uncaught frozen object
+           if (!isExtensible(it)) return 'F';
+           // not necessary to add metadata
+           if (!create) return 'E';
+           // add missing metadata
+           setMetadata(it);
+         // return object ID
+         } return it[METADATA].objectID;
+       };
+
+       var getWeakData = function (it, create) {
+         if (!hasOwn$3(it, METADATA)) {
+           // can't set metadata to uncaught frozen object
+           if (!isExtensible(it)) return true;
+           // not necessary to add metadata
+           if (!create) return false;
+           // add missing metadata
+           setMetadata(it);
+         // return the store of weak collections IDs
+         } return it[METADATA].weakData;
+       };
+
+       // add metadata on freeze-family methods calling
+       var onFreeze$1 = function (it) {
+         if (FREEZING$1 && REQUIRED && isExtensible(it) && !hasOwn$3(it, METADATA)) setMetadata(it);
+         return it;
+       };
+
+       var enable = function () {
+         meta.enable = function () { /* empty */ };
+         REQUIRED = true;
+         var getOwnPropertyNames = getOwnPropertyNamesModule.f;
+         var splice = uncurryThis$h([].splice);
+         var test = {};
+         test[METADATA] = 1;
+
+         // prevent exposing of metadata key
+         if (getOwnPropertyNames(test).length) {
+           getOwnPropertyNamesModule.f = function (it) {
+             var result = getOwnPropertyNames(it);
+             for (var i = 0, length = result.length; i < length; i++) {
+               if (result[i] === METADATA) {
+                 splice(result, i, 1);
+                 break;
+               }
+             } return result;
+           };
+
+           $$F({ target: 'Object', stat: true, forced: true }, {
+             getOwnPropertyNames: getOwnPropertyNamesExternalModule.f
+           });
+         }
+       };
+
+       var meta = internalMetadata.exports = {
+         enable: enable,
+         fastKey: fastKey$1,
+         getWeakData: getWeakData,
+         onFreeze: onFreeze$1
+       };
+
+       hiddenKeys[METADATA] = true;
+
+       var $$E = _export;
+       var global$d = global$1o;
+       var uncurryThis$g = functionUncurryThis;
+       var isForced$2 = isForced_1;
+       var redefine$4 = redefine$h.exports;
+       var InternalMetadataModule = internalMetadata.exports;
+       var iterate$1 = iterate$3;
+       var anInstance$2 = anInstance$7;
+       var isCallable$1 = isCallable$r;
+       var isObject$5 = isObject$s;
+       var fails$c = fails$V;
+       var checkCorrectnessOfIteration$1 = checkCorrectnessOfIteration$4;
+       var setToStringTag$1 = setToStringTag$a;
+       var inheritIfRequired$2 = inheritIfRequired$4;
+
+       var collection$2 = function (CONSTRUCTOR_NAME, wrapper, common) {
+         var IS_MAP = CONSTRUCTOR_NAME.indexOf('Map') !== -1;
+         var IS_WEAK = CONSTRUCTOR_NAME.indexOf('Weak') !== -1;
+         var ADDER = IS_MAP ? 'set' : 'add';
+         var NativeConstructor = global$d[CONSTRUCTOR_NAME];
+         var NativePrototype = NativeConstructor && NativeConstructor.prototype;
+         var Constructor = NativeConstructor;
+         var exported = {};
+
+         var fixMethod = function (KEY) {
+           var uncurriedNativeMethod = uncurryThis$g(NativePrototype[KEY]);
+           redefine$4(NativePrototype, KEY,
+             KEY == 'add' ? function add(value) {
+               uncurriedNativeMethod(this, value === 0 ? 0 : value);
+               return this;
+             } : KEY == 'delete' ? function (key) {
+               return IS_WEAK && !isObject$5(key) ? false : uncurriedNativeMethod(this, key === 0 ? 0 : key);
+             } : KEY == 'get' ? function get(key) {
+               return IS_WEAK && !isObject$5(key) ? undefined : uncurriedNativeMethod(this, key === 0 ? 0 : key);
+             } : KEY == 'has' ? function has(key) {
+               return IS_WEAK && !isObject$5(key) ? false : uncurriedNativeMethod(this, key === 0 ? 0 : key);
+             } : function set(key, value) {
+               uncurriedNativeMethod(this, key === 0 ? 0 : key, value);
+               return this;
+             }
+           );
+         };
+
+         var REPLACE = isForced$2(
+           CONSTRUCTOR_NAME,
+           !isCallable$1(NativeConstructor) || !(IS_WEAK || NativePrototype.forEach && !fails$c(function () {
+             new NativeConstructor().entries().next();
+           }))
+         );
+
+         if (REPLACE) {
+           // create collection constructor
+           Constructor = common.getConstructor(wrapper, CONSTRUCTOR_NAME, IS_MAP, ADDER);
+           InternalMetadataModule.enable();
+         } else if (isForced$2(CONSTRUCTOR_NAME, true)) {
+           var instance = new Constructor();
+           // early implementations not supports chaining
+           var HASNT_CHAINING = instance[ADDER](IS_WEAK ? {} : -0, 1) != instance;
+           // V8 ~ Chromium 40- weak-collections throws on primitives, but should return false
+           var THROWS_ON_PRIMITIVES = fails$c(function () { instance.has(1); });
+           // most early implementations doesn't supports iterables, most modern - not close it correctly
+           // eslint-disable-next-line no-new -- required for testing
+           var ACCEPT_ITERABLES = checkCorrectnessOfIteration$1(function (iterable) { new NativeConstructor(iterable); });
+           // for early implementations -0 and +0 not the same
+           var BUGGY_ZERO = !IS_WEAK && fails$c(function () {
+             // V8 ~ Chromium 42- fails only with 5+ elements
+             var $instance = new NativeConstructor();
+             var index = 5;
+             while (index--) $instance[ADDER](index, index);
+             return !$instance.has(-0);
+           });
+
+           if (!ACCEPT_ITERABLES) {
+             Constructor = wrapper(function (dummy, iterable) {
+               anInstance$2(dummy, NativePrototype);
+               var that = inheritIfRequired$2(new NativeConstructor(), dummy, Constructor);
+               if (iterable != undefined) iterate$1(iterable, that[ADDER], { that: that, AS_ENTRIES: IS_MAP });
+               return that;
+             });
+             Constructor.prototype = NativePrototype;
+             NativePrototype.constructor = Constructor;
+           }
+
+           if (THROWS_ON_PRIMITIVES || BUGGY_ZERO) {
+             fixMethod('delete');
+             fixMethod('has');
+             IS_MAP && fixMethod('get');
+           }
+
+           if (BUGGY_ZERO || HASNT_CHAINING) fixMethod(ADDER);
+
+           // weak collections should not contains .clear method
+           if (IS_WEAK && NativePrototype.clear) delete NativePrototype.clear;
+         }
+
+         exported[CONSTRUCTOR_NAME] = Constructor;
+         $$E({ global: true, forced: Constructor != NativeConstructor }, exported);
+
+         setToStringTag$1(Constructor, CONSTRUCTOR_NAME);
+
+         if (!IS_WEAK) common.setStrong(Constructor, CONSTRUCTOR_NAME, IS_MAP);
+
+         return Constructor;
+       };
+
+       var defineProperty$2 = objectDefineProperty.f;
+       var create$3 = objectCreate;
+       var redefineAll = redefineAll$4;
+       var bind$6 = functionBindContext;
+       var anInstance$1 = anInstance$7;
+       var iterate = iterate$3;
+       var defineIterator = defineIterator$3;
+       var setSpecies$1 = setSpecies$5;
+       var DESCRIPTORS$6 = descriptors;
+       var fastKey = internalMetadata.exports.fastKey;
+       var InternalStateModule$1 = internalState;
+
+       var setInternalState$1 = InternalStateModule$1.set;
+       var internalStateGetterFor = InternalStateModule$1.getterFor;
+
+       var collectionStrong$2 = {
+         getConstructor: function (wrapper, CONSTRUCTOR_NAME, IS_MAP, ADDER) {
+           var Constructor = wrapper(function (that, iterable) {
+             anInstance$1(that, Prototype);
+             setInternalState$1(that, {
+               type: CONSTRUCTOR_NAME,
+               index: create$3(null),
+               first: undefined,
+               last: undefined,
+               size: 0
+             });
+             if (!DESCRIPTORS$6) that.size = 0;
+             if (iterable != undefined) iterate(iterable, that[ADDER], { that: that, AS_ENTRIES: IS_MAP });
+           });
+
+           var Prototype = Constructor.prototype;
+
+           var getInternalState = internalStateGetterFor(CONSTRUCTOR_NAME);
+
+           var define = function (that, key, value) {
+             var state = getInternalState(that);
+             var entry = getEntry(that, key);
+             var previous, index;
+             // change existing entry
+             if (entry) {
+               entry.value = value;
+             // create new entry
+             } else {
+               state.last = entry = {
+                 index: index = fastKey(key, true),
+                 key: key,
+                 value: value,
+                 previous: previous = state.last,
+                 next: undefined,
+                 removed: false
+               };
+               if (!state.first) state.first = entry;
+               if (previous) previous.next = entry;
+               if (DESCRIPTORS$6) state.size++;
+               else that.size++;
+               // add to index
+               if (index !== 'F') state.index[index] = entry;
+             } return that;
+           };
+
+           var getEntry = function (that, key) {
+             var state = getInternalState(that);
+             // fast case
+             var index = fastKey(key);
+             var entry;
+             if (index !== 'F') return state.index[index];
+             // frozen object case
+             for (entry = state.first; entry; entry = entry.next) {
+               if (entry.key == key) return entry;
+             }
+           };
+
+           redefineAll(Prototype, {
+             // `{ Map, Set }.prototype.clear()` methods
+             // https://tc39.es/ecma262/#sec-map.prototype.clear
+             // https://tc39.es/ecma262/#sec-set.prototype.clear
+             clear: function clear() {
+               var that = this;
+               var state = getInternalState(that);
+               var data = state.index;
+               var entry = state.first;
+               while (entry) {
+                 entry.removed = true;
+                 if (entry.previous) entry.previous = entry.previous.next = undefined;
+                 delete data[entry.index];
+                 entry = entry.next;
+               }
+               state.first = state.last = undefined;
+               if (DESCRIPTORS$6) state.size = 0;
+               else that.size = 0;
+             },
+             // `{ Map, Set }.prototype.delete(key)` methods
+             // https://tc39.es/ecma262/#sec-map.prototype.delete
+             // https://tc39.es/ecma262/#sec-set.prototype.delete
+             'delete': function (key) {
+               var that = this;
+               var state = getInternalState(that);
+               var entry = getEntry(that, key);
+               if (entry) {
+                 var next = entry.next;
+                 var prev = entry.previous;
+                 delete state.index[entry.index];
+                 entry.removed = true;
+                 if (prev) prev.next = next;
+                 if (next) next.previous = prev;
+                 if (state.first == entry) state.first = next;
+                 if (state.last == entry) state.last = prev;
+                 if (DESCRIPTORS$6) state.size--;
+                 else that.size--;
+               } return !!entry;
+             },
+             // `{ Map, Set }.prototype.forEach(callbackfn, thisArg = undefined)` methods
+             // https://tc39.es/ecma262/#sec-map.prototype.foreach
+             // https://tc39.es/ecma262/#sec-set.prototype.foreach
+             forEach: function forEach(callbackfn /* , that = undefined */) {
+               var state = getInternalState(this);
+               var boundFunction = bind$6(callbackfn, arguments.length > 1 ? arguments[1] : undefined);
+               var entry;
+               while (entry = entry ? entry.next : state.first) {
+                 boundFunction(entry.value, entry.key, this);
+                 // revert to the last existing entry
+                 while (entry && entry.removed) entry = entry.previous;
+               }
+             },
+             // `{ Map, Set}.prototype.has(key)` methods
+             // https://tc39.es/ecma262/#sec-map.prototype.has
+             // https://tc39.es/ecma262/#sec-set.prototype.has
+             has: function has(key) {
+               return !!getEntry(this, key);
+             }
+           });
+
+           redefineAll(Prototype, IS_MAP ? {
+             // `Map.prototype.get(key)` method
+             // https://tc39.es/ecma262/#sec-map.prototype.get
+             get: function get(key) {
+               var entry = getEntry(this, key);
+               return entry && entry.value;
+             },
+             // `Map.prototype.set(key, value)` method
+             // https://tc39.es/ecma262/#sec-map.prototype.set
+             set: function set(key, value) {
+               return define(this, key === 0 ? 0 : key, value);
+             }
+           } : {
+             // `Set.prototype.add(value)` method
+             // https://tc39.es/ecma262/#sec-set.prototype.add
+             add: function add(value) {
+               return define(this, value = value === 0 ? 0 : value, value);
+             }
+           });
+           if (DESCRIPTORS$6) defineProperty$2(Prototype, 'size', {
+             get: function () {
+               return getInternalState(this).size;
+             }
+           });
+           return Constructor;
+         },
+         setStrong: function (Constructor, CONSTRUCTOR_NAME, IS_MAP) {
+           var ITERATOR_NAME = CONSTRUCTOR_NAME + ' Iterator';
+           var getInternalCollectionState = internalStateGetterFor(CONSTRUCTOR_NAME);
+           var getInternalIteratorState = internalStateGetterFor(ITERATOR_NAME);
+           // `{ Map, Set }.prototype.{ keys, values, entries, @@iterator }()` methods
+           // https://tc39.es/ecma262/#sec-map.prototype.entries
+           // https://tc39.es/ecma262/#sec-map.prototype.keys
+           // https://tc39.es/ecma262/#sec-map.prototype.values
+           // https://tc39.es/ecma262/#sec-map.prototype-@@iterator
+           // https://tc39.es/ecma262/#sec-set.prototype.entries
+           // https://tc39.es/ecma262/#sec-set.prototype.keys
+           // https://tc39.es/ecma262/#sec-set.prototype.values
+           // https://tc39.es/ecma262/#sec-set.prototype-@@iterator
+           defineIterator(Constructor, CONSTRUCTOR_NAME, function (iterated, kind) {
+             setInternalState$1(this, {
+               type: ITERATOR_NAME,
+               target: iterated,
+               state: getInternalCollectionState(iterated),
+               kind: kind,
+               last: undefined
+             });
+           }, function () {
+             var state = getInternalIteratorState(this);
+             var kind = state.kind;
+             var entry = state.last;
+             // revert to the last existing entry
+             while (entry && entry.removed) entry = entry.previous;
+             // get next entry
+             if (!state.target || !(state.last = entry = entry ? entry.next : state.state.first)) {
+               // or finish the iteration
+               state.target = undefined;
+               return { value: undefined, done: true };
+             }
+             // return step by kind
+             if (kind == 'keys') return { value: entry.key, done: false };
+             if (kind == 'values') return { value: entry.value, done: false };
+             return { value: [entry.key, entry.value], done: false };
+           }, IS_MAP ? 'entries' : 'values', !IS_MAP, true);
+
+           // `{ Map, Set }.prototype[@@species]` accessors
+           // https://tc39.es/ecma262/#sec-get-map-@@species
+           // https://tc39.es/ecma262/#sec-get-set-@@species
+           setSpecies$1(CONSTRUCTOR_NAME);
+         }
+       };
+
+       var collection$1 = collection$2;
+       var collectionStrong$1 = collectionStrong$2;
+
+       // `Set` constructor
+       // https://tc39.es/ecma262/#sec-set-objects
+       collection$1('Set', function (init) {
+         return function Set() { return init(this, arguments.length ? arguments[0] : undefined); };
+       }, collectionStrong$1);
+
+       function d3_ascending (a, b) {
+         return a < b ? -1 : a > b ? 1 : a >= b ? 0 : NaN;
+       }
+
+       function d3_bisector (f) {
+         var delta = f;
+         var compare = f;
+
+         if (f.length === 1) {
+           delta = function delta(d, x) {
+             return f(d) - x;
+           };
+
+           compare = ascendingComparator(f);
+         }
+
+         function left(a, x, lo, hi) {
+           if (lo == null) lo = 0;
+           if (hi == null) hi = a.length;
+
+           while (lo < hi) {
+             var mid = lo + hi >>> 1;
+             if (compare(a[mid], x) < 0) lo = mid + 1;else hi = mid;
+           }
+
+           return lo;
+         }
+
+         function right(a, x, lo, hi) {
+           if (lo == null) lo = 0;
+           if (hi == null) hi = a.length;
+
+           while (lo < hi) {
+             var mid = lo + hi >>> 1;
+             if (compare(a[mid], x) > 0) hi = mid;else lo = mid + 1;
+           }
+
+           return lo;
+         }
+
+         function center(a, x, lo, hi) {
+           if (lo == null) lo = 0;
+           if (hi == null) hi = a.length;
+           var i = left(a, x, lo, hi - 1);
+           return i > lo && delta(a[i - 1], x) > -delta(a[i], x) ? i - 1 : i;
+         }
+
+         return {
+           left: left,
+           center: center,
+           right: right
+         };
+       }
+
+       function ascendingComparator(f) {
+         return function (d, x) {
+           return d3_ascending(f(d), x);
+         };
+       }
+
+       var defineWellKnownSymbol = defineWellKnownSymbol$4;
+
+       // `Symbol.asyncIterator` well-known symbol
+       // https://tc39.es/ecma262/#sec-symbol.asynciterator
+       defineWellKnownSymbol('asyncIterator');
+
+       var runtime = {exports: {}};
+
+       (function (module) {
+         var runtime = function (exports) {
+
+           var Op = Object.prototype;
+           var hasOwn = Op.hasOwnProperty;
+           var undefined$1; // More compressible than void 0.
+
+           var $Symbol = typeof Symbol === "function" ? Symbol : {};
+           var iteratorSymbol = $Symbol.iterator || "@@iterator";
+           var asyncIteratorSymbol = $Symbol.asyncIterator || "@@asyncIterator";
+           var toStringTagSymbol = $Symbol.toStringTag || "@@toStringTag";
+
+           function define(obj, key, value) {
+             Object.defineProperty(obj, key, {
+               value: value,
+               enumerable: true,
+               configurable: true,
+               writable: true
+             });
+             return obj[key];
+           }
+
+           try {
+             // IE 8 has a broken Object.defineProperty that only works on DOM objects.
+             define({}, "");
+           } catch (err) {
+             define = function define(obj, key, value) {
+               return obj[key] = value;
+             };
+           }
+
+           function wrap(innerFn, outerFn, self, tryLocsList) {
+             // If outerFn provided and outerFn.prototype is a Generator, then outerFn.prototype instanceof Generator.
+             var protoGenerator = outerFn && outerFn.prototype instanceof Generator ? outerFn : Generator;
+             var generator = Object.create(protoGenerator.prototype);
+             var context = new Context(tryLocsList || []); // The ._invoke method unifies the implementations of the .next,
+             // .throw, and .return methods.
+
+             generator._invoke = makeInvokeMethod(innerFn, self, context);
+             return generator;
+           }
+
+           exports.wrap = wrap; // Try/catch helper to minimize deoptimizations. Returns a completion
+           // record like context.tryEntries[i].completion. This interface could
+           // have been (and was previously) designed to take a closure to be
+           // invoked without arguments, but in all the cases we care about we
+           // already have an existing method we want to call, so there's no need
+           // to create a new function object. We can even get away with assuming
+           // the method takes exactly one argument, since that happens to be true
+           // in every case, so we don't have to touch the arguments object. The
+           // only additional allocation required is the completion record, which
+           // has a stable shape and so hopefully should be cheap to allocate.
+
+           function tryCatch(fn, obj, arg) {
+             try {
+               return {
+                 type: "normal",
+                 arg: fn.call(obj, arg)
+               };
+             } catch (err) {
+               return {
+                 type: "throw",
+                 arg: err
+               };
+             }
+           }
+
+           var GenStateSuspendedStart = "suspendedStart";
+           var GenStateSuspendedYield = "suspendedYield";
+           var GenStateExecuting = "executing";
+           var GenStateCompleted = "completed"; // Returning this object from the innerFn has the same effect as
+           // breaking out of the dispatch switch statement.
+
+           var ContinueSentinel = {}; // Dummy constructor functions that we use as the .constructor and
+           // .constructor.prototype properties for functions that return Generator
+           // objects. For full spec compliance, you may wish to configure your
+           // minifier not to mangle the names of these two functions.
+
+           function Generator() {}
+
+           function GeneratorFunction() {}
+
+           function GeneratorFunctionPrototype() {} // This is a polyfill for %IteratorPrototype% for environments that
+           // don't natively support it.
+
+
+           var IteratorPrototype = {};
+           define(IteratorPrototype, iteratorSymbol, function () {
+             return this;
+           });
+           var getProto = Object.getPrototypeOf;
+           var NativeIteratorPrototype = getProto && getProto(getProto(values([])));
+
+           if (NativeIteratorPrototype && NativeIteratorPrototype !== Op && hasOwn.call(NativeIteratorPrototype, iteratorSymbol)) {
+             // This environment has a native %IteratorPrototype%; use it instead
+             // of the polyfill.
+             IteratorPrototype = NativeIteratorPrototype;
+           }
+
+           var Gp = GeneratorFunctionPrototype.prototype = Generator.prototype = Object.create(IteratorPrototype);
+           GeneratorFunction.prototype = GeneratorFunctionPrototype;
+           define(Gp, "constructor", GeneratorFunctionPrototype);
+           define(GeneratorFunctionPrototype, "constructor", GeneratorFunction);
+           GeneratorFunction.displayName = define(GeneratorFunctionPrototype, toStringTagSymbol, "GeneratorFunction"); // Helper for defining the .next, .throw, and .return methods of the
+           // Iterator interface in terms of a single ._invoke method.
+
+           function defineIteratorMethods(prototype) {
+             ["next", "throw", "return"].forEach(function (method) {
+               define(prototype, method, function (arg) {
+                 return this._invoke(method, arg);
+               });
+             });
+           }
+
+           exports.isGeneratorFunction = function (genFun) {
+             var ctor = typeof genFun === "function" && genFun.constructor;
+             return ctor ? ctor === GeneratorFunction || // For the native GeneratorFunction constructor, the best we can
+             // do is to check its .name property.
+             (ctor.displayName || ctor.name) === "GeneratorFunction" : false;
+           };
+
+           exports.mark = function (genFun) {
+             if (Object.setPrototypeOf) {
+               Object.setPrototypeOf(genFun, GeneratorFunctionPrototype);
+             } else {
+               genFun.__proto__ = GeneratorFunctionPrototype;
+               define(genFun, toStringTagSymbol, "GeneratorFunction");
+             }
+
+             genFun.prototype = Object.create(Gp);
+             return genFun;
+           }; // Within the body of any async function, `await x` is transformed to
+           // `yield regeneratorRuntime.awrap(x)`, so that the runtime can test
+           // `hasOwn.call(value, "__await")` to determine if the yielded value is
+           // meant to be awaited.
+
+
+           exports.awrap = function (arg) {
+             return {
+               __await: arg
+             };
+           };
+
+           function AsyncIterator(generator, PromiseImpl) {
+             function invoke(method, arg, resolve, reject) {
+               var record = tryCatch(generator[method], generator, arg);
+
+               if (record.type === "throw") {
+                 reject(record.arg);
+               } else {
+                 var result = record.arg;
+                 var value = result.value;
+
+                 if (value && _typeof(value) === "object" && hasOwn.call(value, "__await")) {
+                   return PromiseImpl.resolve(value.__await).then(function (value) {
+                     invoke("next", value, resolve, reject);
+                   }, function (err) {
+                     invoke("throw", err, resolve, reject);
+                   });
+                 }
+
+                 return PromiseImpl.resolve(value).then(function (unwrapped) {
+                   // When a yielded Promise is resolved, its final value becomes
+                   // the .value of the Promise<{value,done}> result for the
+                   // current iteration.
+                   result.value = unwrapped;
+                   resolve(result);
+                 }, function (error) {
+                   // If a rejected Promise was yielded, throw the rejection back
+                   // into the async generator function so it can be handled there.
+                   return invoke("throw", error, resolve, reject);
+                 });
+               }
+             }
+
+             var previousPromise;
+
+             function enqueue(method, arg) {
+               function callInvokeWithMethodAndArg() {
+                 return new PromiseImpl(function (resolve, reject) {
+                   invoke(method, arg, resolve, reject);
+                 });
+               }
+
+               return previousPromise = // If enqueue has been called before, then we want to wait until
+               // all previous Promises have been resolved before calling invoke,
+               // so that results are always delivered in the correct order. If
+               // enqueue has not been called before, then it is important to
+               // call invoke immediately, without waiting on a callback to fire,
+               // so that the async generator function has the opportunity to do
+               // any necessary setup in a predictable way. This predictability
+               // is why the Promise constructor synchronously invokes its
+               // executor callback, and why async functions synchronously
+               // execute code before the first await. Since we implement simple
+               // async functions in terms of async generators, it is especially
+               // important to get this right, even though it requires care.
+               previousPromise ? previousPromise.then(callInvokeWithMethodAndArg, // Avoid propagating failures to Promises returned by later
+               // invocations of the iterator.
+               callInvokeWithMethodAndArg) : callInvokeWithMethodAndArg();
+             } // Define the unified helper method that is used to implement .next,
+             // .throw, and .return (see defineIteratorMethods).
+
+
+             this._invoke = enqueue;
+           }
+
+           defineIteratorMethods(AsyncIterator.prototype);
+           define(AsyncIterator.prototype, asyncIteratorSymbol, function () {
+             return this;
+           });
+           exports.AsyncIterator = AsyncIterator; // Note that simple async functions are implemented on top of
+           // AsyncIterator objects; they just return a Promise for the value of
+           // the final result produced by the iterator.
+
+           exports.async = function (innerFn, outerFn, self, tryLocsList, PromiseImpl) {
+             if (PromiseImpl === void 0) PromiseImpl = Promise;
+             var iter = new AsyncIterator(wrap(innerFn, outerFn, self, tryLocsList), PromiseImpl);
+             return exports.isGeneratorFunction(outerFn) ? iter // If outerFn is a generator, return the full iterator.
+             : iter.next().then(function (result) {
+               return result.done ? result.value : iter.next();
+             });
+           };
+
+           function makeInvokeMethod(innerFn, self, context) {
+             var state = GenStateSuspendedStart;
+             return function invoke(method, arg) {
+               if (state === GenStateExecuting) {
+                 throw new Error("Generator is already running");
+               }
+
+               if (state === GenStateCompleted) {
+                 if (method === "throw") {
+                   throw arg;
+                 } // Be forgiving, per 25.3.3.3.3 of the spec:
+                 // https://people.mozilla.org/~jorendorff/es6-draft.html#sec-generatorresume
+
+
+                 return doneResult();
+               }
+
+               context.method = method;
+               context.arg = arg;
+
+               while (true) {
+                 var delegate = context.delegate;
+
+                 if (delegate) {
+                   var delegateResult = maybeInvokeDelegate(delegate, context);
+
+                   if (delegateResult) {
+                     if (delegateResult === ContinueSentinel) continue;
+                     return delegateResult;
+                   }
+                 }
+
+                 if (context.method === "next") {
+                   // Setting context._sent for legacy support of Babel's
+                   // function.sent implementation.
+                   context.sent = context._sent = context.arg;
+                 } else if (context.method === "throw") {
+                   if (state === GenStateSuspendedStart) {
+                     state = GenStateCompleted;
+                     throw context.arg;
+                   }
+
+                   context.dispatchException(context.arg);
+                 } else if (context.method === "return") {
+                   context.abrupt("return", context.arg);
+                 }
+
+                 state = GenStateExecuting;
+                 var record = tryCatch(innerFn, self, context);
+
+                 if (record.type === "normal") {
+                   // If an exception is thrown from innerFn, we leave state ===
+                   // GenStateExecuting and loop back for another invocation.
+                   state = context.done ? GenStateCompleted : GenStateSuspendedYield;
+
+                   if (record.arg === ContinueSentinel) {
+                     continue;
+                   }
+
+                   return {
+                     value: record.arg,
+                     done: context.done
+                   };
+                 } else if (record.type === "throw") {
+                   state = GenStateCompleted; // Dispatch the exception by looping back around to the
+                   // context.dispatchException(context.arg) call above.
+
+                   context.method = "throw";
+                   context.arg = record.arg;
+                 }
+               }
+             };
+           } // Call delegate.iterator[context.method](context.arg) and handle the
+           // result, either by returning a { value, done } result from the
+           // delegate iterator, or by modifying context.method and context.arg,
+           // setting context.delegate to null, and returning the ContinueSentinel.
+
+
+           function maybeInvokeDelegate(delegate, context) {
+             var method = delegate.iterator[context.method];
+
+             if (method === undefined$1) {
+               // A .throw or .return when the delegate iterator has no .throw
+               // method always terminates the yield* loop.
+               context.delegate = null;
+
+               if (context.method === "throw") {
+                 // Note: ["return"] must be used for ES3 parsing compatibility.
+                 if (delegate.iterator["return"]) {
+                   // If the delegate iterator has a return method, give it a
+                   // chance to clean up.
+                   context.method = "return";
+                   context.arg = undefined$1;
+                   maybeInvokeDelegate(delegate, context);
+
+                   if (context.method === "throw") {
+                     // If maybeInvokeDelegate(context) changed context.method from
+                     // "return" to "throw", let that override the TypeError below.
+                     return ContinueSentinel;
+                   }
+                 }
+
+                 context.method = "throw";
+                 context.arg = new TypeError("The iterator does not provide a 'throw' method");
+               }
+
+               return ContinueSentinel;
+             }
+
+             var record = tryCatch(method, delegate.iterator, context.arg);
+
+             if (record.type === "throw") {
+               context.method = "throw";
+               context.arg = record.arg;
+               context.delegate = null;
+               return ContinueSentinel;
+             }
+
+             var info = record.arg;
+
+             if (!info) {
+               context.method = "throw";
+               context.arg = new TypeError("iterator result is not an object");
+               context.delegate = null;
+               return ContinueSentinel;
+             }
+
+             if (info.done) {
+               // Assign the result of the finished delegate to the temporary
+               // variable specified by delegate.resultName (see delegateYield).
+               context[delegate.resultName] = info.value; // Resume execution at the desired location (see delegateYield).
+
+               context.next = delegate.nextLoc; // If context.method was "throw" but the delegate handled the
+               // exception, let the outer generator proceed normally. If
+               // context.method was "next", forget context.arg since it has been
+               // "consumed" by the delegate iterator. If context.method was
+               // "return", allow the original .return call to continue in the
+               // outer generator.
+
+               if (context.method !== "return") {
+                 context.method = "next";
+                 context.arg = undefined$1;
+               }
+             } else {
+               // Re-yield the result returned by the delegate method.
+               return info;
+             } // The delegate iterator is finished, so forget it and continue with
+             // the outer generator.
+
+
+             context.delegate = null;
+             return ContinueSentinel;
+           } // Define Generator.prototype.{next,throw,return} in terms of the
+           // unified ._invoke helper method.
+
+
+           defineIteratorMethods(Gp);
+           define(Gp, toStringTagSymbol, "Generator"); // A Generator should always return itself as the iterator object when the
+           // @@iterator function is called on it. Some browsers' implementations of the
+           // iterator prototype chain incorrectly implement this, causing the Generator
+           // object to not be returned from this call. This ensures that doesn't happen.
+           // See https://github.com/facebook/regenerator/issues/274 for more details.
+
+           define(Gp, iteratorSymbol, function () {
+             return this;
+           });
+           define(Gp, "toString", function () {
+             return "[object Generator]";
+           });
+
+           function pushTryEntry(locs) {
+             var entry = {
+               tryLoc: locs[0]
+             };
+
+             if (1 in locs) {
+               entry.catchLoc = locs[1];
+             }
+
+             if (2 in locs) {
+               entry.finallyLoc = locs[2];
+               entry.afterLoc = locs[3];
+             }
+
+             this.tryEntries.push(entry);
+           }
+
+           function resetTryEntry(entry) {
+             var record = entry.completion || {};
+             record.type = "normal";
+             delete record.arg;
+             entry.completion = record;
+           }
+
+           function Context(tryLocsList) {
+             // The root entry object (effectively a try statement without a catch
+             // or a finally block) gives us a place to store values thrown from
+             // locations where there is no enclosing try statement.
+             this.tryEntries = [{
+               tryLoc: "root"
+             }];
+             tryLocsList.forEach(pushTryEntry, this);
+             this.reset(true);
+           }
+
+           exports.keys = function (object) {
+             var keys = [];
+
+             for (var key in object) {
+               keys.push(key);
+             }
+
+             keys.reverse(); // Rather than returning an object with a next method, we keep
+             // things simple and return the next function itself.
+
+             return function next() {
+               while (keys.length) {
+                 var key = keys.pop();
+
+                 if (key in object) {
+                   next.value = key;
+                   next.done = false;
+                   return next;
+                 }
+               } // To avoid creating an additional object, we just hang the .value
+               // and .done properties off the next function object itself. This
+               // also ensures that the minifier will not anonymize the function.
+
+
+               next.done = true;
+               return next;
+             };
+           };
+
+           function values(iterable) {
+             if (iterable) {
+               var iteratorMethod = iterable[iteratorSymbol];
+
+               if (iteratorMethod) {
+                 return iteratorMethod.call(iterable);
+               }
+
+               if (typeof iterable.next === "function") {
+                 return iterable;
+               }
+
+               if (!isNaN(iterable.length)) {
+                 var i = -1,
+                     next = function next() {
+                   while (++i < iterable.length) {
+                     if (hasOwn.call(iterable, i)) {
+                       next.value = iterable[i];
+                       next.done = false;
+                       return next;
+                     }
+                   }
+
+                   next.value = undefined$1;
+                   next.done = true;
+                   return next;
+                 };
+
+                 return next.next = next;
+               }
+             } // Return an iterator with no values.
+
+
+             return {
+               next: doneResult
+             };
+           }
+
+           exports.values = values;
+
+           function doneResult() {
+             return {
+               value: undefined$1,
+               done: true
+             };
+           }
+
+           Context.prototype = {
+             constructor: Context,
+             reset: function reset(skipTempReset) {
+               this.prev = 0;
+               this.next = 0; // Resetting context._sent for legacy support of Babel's
+               // function.sent implementation.
+
+               this.sent = this._sent = undefined$1;
+               this.done = false;
+               this.delegate = null;
+               this.method = "next";
+               this.arg = undefined$1;
+               this.tryEntries.forEach(resetTryEntry);
+
+               if (!skipTempReset) {
+                 for (var name in this) {
+                   // Not sure about the optimal order of these conditions:
+                   if (name.charAt(0) === "t" && hasOwn.call(this, name) && !isNaN(+name.slice(1))) {
+                     this[name] = undefined$1;
+                   }
+                 }
+               }
+             },
+             stop: function stop() {
+               this.done = true;
+               var rootEntry = this.tryEntries[0];
+               var rootRecord = rootEntry.completion;
+
+               if (rootRecord.type === "throw") {
+                 throw rootRecord.arg;
+               }
+
+               return this.rval;
+             },
+             dispatchException: function dispatchException(exception) {
+               if (this.done) {
+                 throw exception;
+               }
+
+               var context = this;
+
+               function handle(loc, caught) {
+                 record.type = "throw";
+                 record.arg = exception;
+                 context.next = loc;
+
+                 if (caught) {
+                   // If the dispatched exception was caught by a catch block,
+                   // then let that catch block handle the exception normally.
+                   context.method = "next";
+                   context.arg = undefined$1;
+                 }
+
+                 return !!caught;
+               }
+
+               for (var i = this.tryEntries.length - 1; i >= 0; --i) {
+                 var entry = this.tryEntries[i];
+                 var record = entry.completion;
+
+                 if (entry.tryLoc === "root") {
+                   // Exception thrown outside of any try block that could handle
+                   // it, so set the completion value of the entire function to
+                   // throw the exception.
+                   return handle("end");
+                 }
+
+                 if (entry.tryLoc <= this.prev) {
+                   var hasCatch = hasOwn.call(entry, "catchLoc");
+                   var hasFinally = hasOwn.call(entry, "finallyLoc");
+
+                   if (hasCatch && hasFinally) {
+                     if (this.prev < entry.catchLoc) {
+                       return handle(entry.catchLoc, true);
+                     } else if (this.prev < entry.finallyLoc) {
+                       return handle(entry.finallyLoc);
+                     }
+                   } else if (hasCatch) {
+                     if (this.prev < entry.catchLoc) {
+                       return handle(entry.catchLoc, true);
+                     }
+                   } else if (hasFinally) {
+                     if (this.prev < entry.finallyLoc) {
+                       return handle(entry.finallyLoc);
+                     }
+                   } else {
+                     throw new Error("try statement without catch or finally");
+                   }
+                 }
+               }
+             },
+             abrupt: function abrupt(type, arg) {
+               for (var i = this.tryEntries.length - 1; i >= 0; --i) {
+                 var entry = this.tryEntries[i];
+
+                 if (entry.tryLoc <= this.prev && hasOwn.call(entry, "finallyLoc") && this.prev < entry.finallyLoc) {
+                   var finallyEntry = entry;
+                   break;
+                 }
+               }
+
+               if (finallyEntry && (type === "break" || type === "continue") && finallyEntry.tryLoc <= arg && arg <= finallyEntry.finallyLoc) {
+                 // Ignore the finally entry if control is not jumping to a
+                 // location outside the try/catch block.
+                 finallyEntry = null;
+               }
+
+               var record = finallyEntry ? finallyEntry.completion : {};
+               record.type = type;
+               record.arg = arg;
+
+               if (finallyEntry) {
+                 this.method = "next";
+                 this.next = finallyEntry.finallyLoc;
+                 return ContinueSentinel;
+               }
+
+               return this.complete(record);
+             },
+             complete: function complete(record, afterLoc) {
+               if (record.type === "throw") {
+                 throw record.arg;
+               }
+
+               if (record.type === "break" || record.type === "continue") {
+                 this.next = record.arg;
+               } else if (record.type === "return") {
+                 this.rval = this.arg = record.arg;
+                 this.method = "return";
+                 this.next = "end";
+               } else if (record.type === "normal" && afterLoc) {
+                 this.next = afterLoc;
+               }
+
+               return ContinueSentinel;
+             },
+             finish: function finish(finallyLoc) {
+               for (var i = this.tryEntries.length - 1; i >= 0; --i) {
+                 var entry = this.tryEntries[i];
+
+                 if (entry.finallyLoc === finallyLoc) {
+                   this.complete(entry.completion, entry.afterLoc);
+                   resetTryEntry(entry);
+                   return ContinueSentinel;
+                 }
+               }
+             },
+             "catch": function _catch(tryLoc) {
+               for (var i = this.tryEntries.length - 1; i >= 0; --i) {
+                 var entry = this.tryEntries[i];
+
+                 if (entry.tryLoc === tryLoc) {
+                   var record = entry.completion;
+
+                   if (record.type === "throw") {
+                     var thrown = record.arg;
+                     resetTryEntry(entry);
+                   }
+
+                   return thrown;
+                 }
+               } // The context.catch method must only be called with a location
+               // argument that corresponds to a known catch block.
+
+
+               throw new Error("illegal catch attempt");
+             },
+             delegateYield: function delegateYield(iterable, resultName, nextLoc) {
+               this.delegate = {
+                 iterator: values(iterable),
+                 resultName: resultName,
+                 nextLoc: nextLoc
+               };
+
+               if (this.method === "next") {
+                 // Deliberately forget the last sent value so that we don't
+                 // accidentally pass it on to the delegate.
+                 this.arg = undefined$1;
+               }
+
+               return ContinueSentinel;
+             }
+           }; // Regardless of whether this script is executing as a CommonJS module
+           // or not, return the runtime object so that we can declare the variable
+           // regeneratorRuntime in the outer scope, which allows this module to be
+           // injected easily by `bin/regenerator --include-runtime script.js`.
+
+           return exports;
+         }( // If this script is executing as a CommonJS module, use module.exports
+         // as the regeneratorRuntime namespace. Otherwise create a new empty
+         // object. Either way, the resulting object will be used to initialize
+         // the regeneratorRuntime variable at the top of this file.
+         module.exports );
+
+         try {
+           regeneratorRuntime = runtime;
+         } catch (accidentalStrictMode) {
+           // This module should not be running in strict mode, so the above
+           // assignment should always work unless something is misconfigured. Just
+           // in case runtime.js accidentally runs in strict mode, in modern engines
+           // we can explicitly access globalThis. In older engines we can escape
+           // strict mode using a global Function call. This could conceivably fail
+           // if a Content Security Policy forbids using Function, but in that case
+           // the proper solution is to fix the accidental strict mode problem. If
+           // you've misconfigured your bundler to force strict mode and applied a
+           // CSP to forbid Function, and you're not willing to fix either of those
+           // problems, please detail your unique predicament in a GitHub issue.
+           if ((typeof globalThis === "undefined" ? "undefined" : _typeof(globalThis)) === "object") {
+             globalThis.regeneratorRuntime = runtime;
+           } else {
+             Function("r", "regeneratorRuntime = r")(runtime);
+           }
+         }
+       })(runtime);
+
+       var _marked$3 = /*#__PURE__*/regeneratorRuntime.mark(numbers);
+
+       function number$1 (x) {
+         return x === null ? NaN : +x;
+       }
+       function numbers(values, valueof) {
+         var _iterator, _step, value, index, _iterator2, _step2, _value;
+
+         return regeneratorRuntime.wrap(function numbers$(_context) {
+           while (1) {
+             switch (_context.prev = _context.next) {
+               case 0:
+                 if (!(valueof === undefined)) {
+                   _context.next = 21;
+                   break;
+                 }
+
+                 _iterator = _createForOfIteratorHelper(values);
+                 _context.prev = 2;
+
+                 _iterator.s();
+
+               case 4:
+                 if ((_step = _iterator.n()).done) {
+                   _context.next = 11;
+                   break;
+                 }
+
+                 value = _step.value;
+
+                 if (!(value != null && (value = +value) >= value)) {
+                   _context.next = 9;
+                   break;
+                 }
+
+                 _context.next = 9;
+                 return value;
+
+               case 9:
+                 _context.next = 4;
+                 break;
+
+               case 11:
+                 _context.next = 16;
+                 break;
+
+               case 13:
+                 _context.prev = 13;
+                 _context.t0 = _context["catch"](2);
+
+                 _iterator.e(_context.t0);
+
+               case 16:
+                 _context.prev = 16;
+
+                 _iterator.f();
+
+                 return _context.finish(16);
+
+               case 19:
+                 _context.next = 40;
+                 break;
+
+               case 21:
+                 index = -1;
+                 _iterator2 = _createForOfIteratorHelper(values);
+                 _context.prev = 23;
+
+                 _iterator2.s();
+
+               case 25:
+                 if ((_step2 = _iterator2.n()).done) {
+                   _context.next = 32;
+                   break;
+                 }
+
+                 _value = _step2.value;
+
+                 if (!((_value = valueof(_value, ++index, values)) != null && (_value = +_value) >= _value)) {
+                   _context.next = 30;
+                   break;
+                 }
+
+                 _context.next = 30;
+                 return _value;
+
+               case 30:
+                 _context.next = 25;
+                 break;
+
+               case 32:
+                 _context.next = 37;
+                 break;
+
+               case 34:
+                 _context.prev = 34;
+                 _context.t1 = _context["catch"](23);
+
+                 _iterator2.e(_context.t1);
+
+               case 37:
+                 _context.prev = 37;
+
+                 _iterator2.f();
+
+                 return _context.finish(37);
+
+               case 40:
+               case "end":
+                 return _context.stop();
+             }
+           }
+         }, _marked$3, null, [[2, 13, 16, 19], [23, 34, 37, 40]]);
+       }
+
+       var ascendingBisect = d3_bisector(d3_ascending);
+       var bisectRight = ascendingBisect.right;
+       d3_bisector(number$1).center;
+
+       var anObject$2 = anObject$n;
+       var iteratorClose = iteratorClose$2;
+
+       // call something on iterator step with safe closing on error
+       var callWithSafeIterationClosing$1 = function (iterator, fn, value, ENTRIES) {
+         try {
+           return ENTRIES ? fn(anObject$2(value)[0], value[1]) : fn(value);
+         } catch (error) {
+           iteratorClose(iterator, 'throw', error);
+         }
+       };
+
+       var global$c = global$1o;
+       var bind$5 = functionBindContext;
+       var call$3 = functionCall;
+       var toObject$3 = toObject$i;
+       var callWithSafeIterationClosing = callWithSafeIterationClosing$1;
+       var isArrayIteratorMethod = isArrayIteratorMethod$3;
+       var isConstructor = isConstructor$4;
+       var lengthOfArrayLike$3 = lengthOfArrayLike$i;
+       var createProperty = createProperty$5;
+       var getIterator = getIterator$4;
+       var getIteratorMethod = getIteratorMethod$5;
+
+       var Array$1 = global$c.Array;
+
+       // `Array.from` method implementation
+       // https://tc39.es/ecma262/#sec-array.from
+       var arrayFrom$1 = function from(arrayLike /* , mapfn = undefined, thisArg = undefined */) {
+         var O = toObject$3(arrayLike);
+         var IS_CONSTRUCTOR = isConstructor(this);
+         var argumentsLength = arguments.length;
+         var mapfn = argumentsLength > 1 ? arguments[1] : undefined;
+         var mapping = mapfn !== undefined;
+         if (mapping) mapfn = bind$5(mapfn, argumentsLength > 2 ? arguments[2] : undefined);
+         var iteratorMethod = getIteratorMethod(O);
+         var index = 0;
+         var length, result, step, iterator, next, value;
+         // if the target is not iterable or it's an array with the default iterator - use a simple case
+         if (iteratorMethod && !(this == Array$1 && isArrayIteratorMethod(iteratorMethod))) {
+           iterator = getIterator(O, iteratorMethod);
+           next = iterator.next;
+           result = IS_CONSTRUCTOR ? new this() : [];
+           for (;!(step = call$3(next, iterator)).done; index++) {
+             value = mapping ? callWithSafeIterationClosing(iterator, mapfn, [step.value, index], true) : step.value;
+             createProperty(result, index, value);
+           }
+         } else {
+           length = lengthOfArrayLike$3(O);
+           result = IS_CONSTRUCTOR ? new this(length) : Array$1(length);
+           for (;length > index; index++) {
+             value = mapping ? mapfn(O[index], index) : O[index];
+             createProperty(result, index, value);
+           }
+         }
+         result.length = index;
+         return result;
+       };
+
+       var $$D = _export;
+       var from = arrayFrom$1;
+       var checkCorrectnessOfIteration = checkCorrectnessOfIteration$4;
+
+       var INCORRECT_ITERATION = !checkCorrectnessOfIteration(function (iterable) {
+         // eslint-disable-next-line es/no-array-from -- required for testing
+         Array.from(iterable);
+       });
+
+       // `Array.from` method
+       // https://tc39.es/ecma262/#sec-array.from
+       $$D({ target: 'Array', stat: true, forced: INCORRECT_ITERATION }, {
+         from: from
+       });
+
+       var $$C = _export;
+       var fill = arrayFill$1;
+       var addToUnscopables$4 = addToUnscopables$6;
+
+       // `Array.prototype.fill` method
+       // https://tc39.es/ecma262/#sec-array.prototype.fill
+       $$C({ target: 'Array', proto: true }, {
+         fill: fill
+       });
+
+       // https://tc39.es/ecma262/#sec-array.prototype-@@unscopables
+       addToUnscopables$4('fill');
+
+       var $$B = _export;
+       var $some = arrayIteration.some;
+       var arrayMethodIsStrict$4 = arrayMethodIsStrict$9;
+
+       var STRICT_METHOD$4 = arrayMethodIsStrict$4('some');
+
+       // `Array.prototype.some` method
+       // https://tc39.es/ecma262/#sec-array.prototype.some
+       $$B({ target: 'Array', proto: true, forced: !STRICT_METHOD$4 }, {
+         some: function some(callbackfn /* , thisArg */) {
+           return $some(this, callbackfn, arguments.length > 1 ? arguments[1] : undefined);
+         }
+       });
+
+       var TYPED_ARRAYS_CONSTRUCTORS_REQUIRES_WRAPPERS = typedArrayConstructorsRequireWrappers;
+       var exportTypedArrayStaticMethod = arrayBufferViewCore.exportTypedArrayStaticMethod;
+       var typedArrayFrom = typedArrayFrom$2;
+
+       // `%TypedArray%.from` method
+       // https://tc39.es/ecma262/#sec-%typedarray%.from
+       exportTypedArrayStaticMethod('from', typedArrayFrom, TYPED_ARRAYS_CONSTRUCTORS_REQUIRES_WRAPPERS);
+
+       var createTypedArrayConstructor = typedArrayConstructor.exports;
+
+       // `Float64Array` constructor
+       // https://tc39.es/ecma262/#sec-typedarray-objects
+       createTypedArrayConstructor('Float64', function (init) {
+         return function Float64Array(data, byteOffset, length) {
+           return init(this, data, byteOffset, length);
+         };
+       });
+
+       function d3_descending (a, b) {
+         return b < a ? -1 : b > a ? 1 : b >= a ? 0 : NaN;
+       }
+
+       // https://github.com/python/cpython/blob/a74eea238f5baba15797e2e8b570d153bc8690a7/Modules/mathmodule.c#L1423
+       var Adder = /*#__PURE__*/function () {
+         function Adder() {
+           _classCallCheck$1(this, Adder);
+
+           this._partials = new Float64Array(32);
+           this._n = 0;
+         }
+
+         _createClass$1(Adder, [{
+           key: "add",
+           value: function add(x) {
+             var p = this._partials;
+             var i = 0;
+
+             for (var j = 0; j < this._n && j < 32; j++) {
+               var y = p[j],
+                   hi = x + y,
+                   lo = Math.abs(x) < Math.abs(y) ? x - (hi - y) : y - (hi - x);
+               if (lo) p[i++] = lo;
+               x = hi;
+             }
+
+             p[i] = x;
+             this._n = i + 1;
+             return this;
+           }
+         }, {
+           key: "valueOf",
+           value: function valueOf() {
+             var p = this._partials;
+             var n = this._n,
+                 x,
+                 y,
+                 lo,
+                 hi = 0;
+
+             if (n > 0) {
+               hi = p[--n];
+
+               while (n > 0) {
+                 x = hi;
+                 y = p[--n];
+                 hi = x + y;
+                 lo = y - (hi - x);
+                 if (lo) break;
+               }
+
+               if (n > 0 && (lo < 0 && p[n - 1] < 0 || lo > 0 && p[n - 1] > 0)) {
+                 y = lo * 2;
+                 x = hi + y;
+                 if (y == x - hi) hi = x;
+               }
+             }
+
+             return hi;
+           }
+         }]);
+
+         return Adder;
+       }();
+
+       var $$A = _export;
+       var DESCRIPTORS$5 = descriptors;
+       var defineProperties$1 = objectDefineProperties.f;
+
+       // `Object.defineProperties` method
+       // https://tc39.es/ecma262/#sec-object.defineproperties
+       // eslint-disable-next-line es/no-object-defineproperties -- safe
+       $$A({ target: 'Object', stat: true, forced: Object.defineProperties !== defineProperties$1, sham: !DESCRIPTORS$5 }, {
+         defineProperties: defineProperties$1
+       });
+
+       var collection = collection$2;
+       var collectionStrong = collectionStrong$2;
+
+       // `Map` constructor
+       // https://tc39.es/ecma262/#sec-map-objects
+       collection('Map', function (init) {
+         return function Map() { return init(this, arguments.length ? arguments[0] : undefined); };
+       }, collectionStrong);
+
+       var $$z = _export;
+       var uncurryThis$f = functionUncurryThis;
+       var aCallable$1 = aCallable$a;
+       var toObject$2 = toObject$i;
+       var lengthOfArrayLike$2 = lengthOfArrayLike$i;
+       var toString$a = toString$k;
+       var fails$b = fails$V;
+       var internalSort = arraySort$1;
+       var arrayMethodIsStrict$3 = arrayMethodIsStrict$9;
+       var FF = engineFfVersion;
+       var IE_OR_EDGE = engineIsIeOrEdge;
+       var V8 = engineV8Version;
+       var WEBKIT = engineWebkitVersion;
+
+       var test = [];
+       var un$Sort = uncurryThis$f(test.sort);
+       var push$3 = uncurryThis$f(test.push);
+
+       // IE8-
+       var FAILS_ON_UNDEFINED = fails$b(function () {
+         test.sort(undefined);
+       });
+       // V8 bug
+       var FAILS_ON_NULL = fails$b(function () {
+         test.sort(null);
+       });
+       // Old WebKit
+       var STRICT_METHOD$3 = arrayMethodIsStrict$3('sort');
+
+       var STABLE_SORT = !fails$b(function () {
+         // feature detection can be too slow, so check engines versions
+         if (V8) return V8 < 70;
+         if (FF && FF > 3) return;
+         if (IE_OR_EDGE) return true;
+         if (WEBKIT) return WEBKIT < 603;
+
+         var result = '';
+         var code, chr, value, index;
+
+         // generate an array with more 512 elements (Chakra and old V8 fails only in this case)
+         for (code = 65; code < 76; code++) {
+           chr = String.fromCharCode(code);
+
+           switch (code) {
+             case 66: case 69: case 70: case 72: value = 3; break;
+             case 68: case 71: value = 4; break;
+             default: value = 2;
+           }
+
+           for (index = 0; index < 47; index++) {
+             test.push({ k: chr + index, v: value });
+           }
+         }
+
+         test.sort(function (a, b) { return b.v - a.v; });
+
+         for (index = 0; index < test.length; index++) {
+           chr = test[index].k.charAt(0);
+           if (result.charAt(result.length - 1) !== chr) result += chr;
+         }
+
+         return result !== 'DGBEFHACIJK';
+       });
+
+       var FORCED$7 = FAILS_ON_UNDEFINED || !FAILS_ON_NULL || !STRICT_METHOD$3 || !STABLE_SORT;
+
+       var getSortCompare = function (comparefn) {
+         return function (x, y) {
+           if (y === undefined) return -1;
+           if (x === undefined) return 1;
+           if (comparefn !== undefined) return +comparefn(x, y) || 0;
+           return toString$a(x) > toString$a(y) ? 1 : -1;
+         };
+       };
+
+       // `Array.prototype.sort` method
+       // https://tc39.es/ecma262/#sec-array.prototype.sort
+       $$z({ target: 'Array', proto: true, forced: FORCED$7 }, {
+         sort: function sort(comparefn) {
+           if (comparefn !== undefined) aCallable$1(comparefn);
+
+           var array = toObject$2(this);
+
+           if (STABLE_SORT) return comparefn === undefined ? un$Sort(array) : un$Sort(array, comparefn);
+
+           var items = [];
+           var arrayLength = lengthOfArrayLike$2(array);
+           var itemsLength, index;
+
+           for (index = 0; index < arrayLength; index++) {
+             if (index in array) push$3(items, array[index]);
+           }
+
+           internalSort(items, getSortCompare(comparefn));
+
+           itemsLength = items.length;
+           index = 0;
+
+           while (index < itemsLength) array[index] = items[index++];
+           while (index < arrayLength) delete array[index++];
+
+           return array;
+         }
+       });
+
+       var e10 = Math.sqrt(50),
+           e5 = Math.sqrt(10),
+           e2 = Math.sqrt(2);
+       function ticks (start, stop, count) {
+         var reverse,
+             i = -1,
+             n,
+             ticks,
+             step;
+         stop = +stop, start = +start, count = +count;
+         if (start === stop && count > 0) return [start];
+         if (reverse = stop < start) n = start, start = stop, stop = n;
+         if ((step = tickIncrement(start, stop, count)) === 0 || !isFinite(step)) return [];
+
+         if (step > 0) {
+           var r0 = Math.round(start / step),
+               r1 = Math.round(stop / step);
+           if (r0 * step < start) ++r0;
+           if (r1 * step > stop) --r1;
+           ticks = new Array(n = r1 - r0 + 1);
+
+           while (++i < n) {
+             ticks[i] = (r0 + i) * step;
+           }
+         } else {
+           step = -step;
+
+           var _r = Math.round(start * step),
+               _r2 = Math.round(stop * step);
+
+           if (_r / step < start) ++_r;
+           if (_r2 / step > stop) --_r2;
+           ticks = new Array(n = _r2 - _r + 1);
+
+           while (++i < n) {
+             ticks[i] = (_r + i) / step;
+           }
+         }
+
+         if (reverse) ticks.reverse();
+         return ticks;
+       }
+       function tickIncrement(start, stop, count) {
+         var step = (stop - start) / Math.max(0, count),
+             power = Math.floor(Math.log(step) / Math.LN10),
+             error = step / Math.pow(10, power);
+         return power >= 0 ? (error >= e10 ? 10 : error >= e5 ? 5 : error >= e2 ? 2 : 1) * Math.pow(10, power) : -Math.pow(10, -power) / (error >= e10 ? 10 : error >= e5 ? 5 : error >= e2 ? 2 : 1);
+       }
+       function tickStep(start, stop, count) {
+         var step0 = Math.abs(stop - start) / Math.max(0, count),
+             step1 = Math.pow(10, Math.floor(Math.log(step0) / Math.LN10)),
+             error = step0 / step1;
+         if (error >= e10) step1 *= 10;else if (error >= e5) step1 *= 5;else if (error >= e2) step1 *= 2;
+         return stop < start ? -step1 : step1;
+       }
+
+       function max(values, valueof) {
+         var max;
+
+         if (valueof === undefined) {
+           var _iterator = _createForOfIteratorHelper(values),
+               _step;
+
+           try {
+             for (_iterator.s(); !(_step = _iterator.n()).done;) {
+               var value = _step.value;
+
+               if (value != null && (max < value || max === undefined && value >= value)) {
+                 max = value;
+               }
+             }
+           } catch (err) {
+             _iterator.e(err);
+           } finally {
+             _iterator.f();
+           }
+         } else {
+           var index = -1;
+
+           var _iterator2 = _createForOfIteratorHelper(values),
+               _step2;
+
+           try {
+             for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) {
+               var _value = _step2.value;
+
+               if ((_value = valueof(_value, ++index, values)) != null && (max < _value || max === undefined && _value >= _value)) {
+                 max = _value;
+               }
+             }
+           } catch (err) {
+             _iterator2.e(err);
+           } finally {
+             _iterator2.f();
+           }
+         }
+
+         return max;
+       }
+
+       function min$2(values, valueof) {
+         var min;
+
+         if (valueof === undefined) {
+           var _iterator = _createForOfIteratorHelper(values),
+               _step;
+
+           try {
+             for (_iterator.s(); !(_step = _iterator.n()).done;) {
+               var value = _step.value;
+
+               if (value != null && (min > value || min === undefined && value >= value)) {
+                 min = value;
+               }
+             }
+           } catch (err) {
+             _iterator.e(err);
+           } finally {
+             _iterator.f();
+           }
+         } else {
+           var index = -1;
+
+           var _iterator2 = _createForOfIteratorHelper(values),
+               _step2;
+
+           try {
+             for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) {
+               var _value = _step2.value;
+
+               if ((_value = valueof(_value, ++index, values)) != null && (min > _value || min === undefined && _value >= _value)) {
+                 min = _value;
+               }
+             }
+           } catch (err) {
+             _iterator2.e(err);
+           } finally {
+             _iterator2.f();
+           }
+         }
+
+         return min;
+       }
+
+       // ISC license, Copyright 2018 Vladimir Agafonkin.
+
+       function quickselect$3(array, k) {
+         var left = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 0;
+         var right = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : array.length - 1;
+         var compare = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : d3_ascending;
+
+         while (right > left) {
+           if (right - left > 600) {
+             var n = right - left + 1;
+             var m = k - left + 1;
+             var z = Math.log(n);
+             var s = 0.5 * Math.exp(2 * z / 3);
+             var sd = 0.5 * Math.sqrt(z * s * (n - s) / n) * (m - n / 2 < 0 ? -1 : 1);
+             var newLeft = Math.max(left, Math.floor(k - m * s / n + sd));
+             var newRight = Math.min(right, Math.floor(k + (n - m) * s / n + sd));
+             quickselect$3(array, k, newLeft, newRight, compare);
+           }
+
+           var t = array[k];
+           var i = left;
+           var j = right;
+           swap$1(array, left, k);
+           if (compare(array[right], t) > 0) swap$1(array, left, right);
+
+           while (i < j) {
+             swap$1(array, i, j), ++i, --j;
+
+             while (compare(array[i], t) < 0) {
+               ++i;
+             }
+
+             while (compare(array[j], t) > 0) {
+               --j;
+             }
+           }
+
+           if (compare(array[left], t) === 0) swap$1(array, left, j);else ++j, swap$1(array, j, right);
+           if (j <= k) left = j + 1;
+           if (k <= j) right = j - 1;
+         }
+
+         return array;
+       }
+
+       function swap$1(array, i, j) {
+         var t = array[i];
+         array[i] = array[j];
+         array[j] = t;
+       }
+
+       function quantile(values, p, valueof) {
+         values = Float64Array.from(numbers(values, valueof));
+         if (!(n = values.length)) return;
+         if ((p = +p) <= 0 || n < 2) return min$2(values);
+         if (p >= 1) return max(values);
+         var n,
+             i = (n - 1) * p,
+             i0 = Math.floor(i),
+             value0 = max(quickselect$3(values, i0).subarray(0, i0 + 1)),
+             value1 = min$2(values.subarray(i0 + 1));
+         return value0 + (value1 - value0) * (i - i0);
+       }
+
+       function d3_median (values, valueof) {
+         return quantile(values, 0.5, valueof);
+       }
+
+       var _marked$2 = /*#__PURE__*/regeneratorRuntime.mark(flatten);
+
+       function flatten(arrays) {
+         var _iterator, _step, array;
+
+         return regeneratorRuntime.wrap(function flatten$(_context) {
+           while (1) {
+             switch (_context.prev = _context.next) {
+               case 0:
+                 _iterator = _createForOfIteratorHelper(arrays);
+                 _context.prev = 1;
+
+                 _iterator.s();
+
+               case 3:
+                 if ((_step = _iterator.n()).done) {
+                   _context.next = 8;
+                   break;
+                 }
+
+                 array = _step.value;
+                 return _context.delegateYield(array, "t0", 6);
+
+               case 6:
+                 _context.next = 3;
+                 break;
+
+               case 8:
+                 _context.next = 13;
+                 break;
+
+               case 10:
+                 _context.prev = 10;
+                 _context.t1 = _context["catch"](1);
+
+                 _iterator.e(_context.t1);
+
+               case 13:
+                 _context.prev = 13;
+
+                 _iterator.f();
+
+                 return _context.finish(13);
+
+               case 16:
+               case "end":
+                 return _context.stop();
+             }
+           }
+         }, _marked$2, null, [[1, 10, 13, 16]]);
+       }
+
+       function merge$4(arrays) {
+         return Array.from(flatten(arrays));
+       }
+
+       function range$1 (start, stop, step) {
+         start = +start, stop = +stop, step = (n = arguments.length) < 2 ? (stop = start, start = 0, 1) : n < 3 ? 1 : +step;
+         var i = -1,
+             n = Math.max(0, Math.ceil((stop - start) / step)) | 0,
+             range = new Array(n);
+
+         while (++i < n) {
+           range[i] = start + i * step;
+         }
+
+         return range;
+       }
+
+       // `SameValue` abstract operation
+       // https://tc39.es/ecma262/#sec-samevalue
+       // eslint-disable-next-line es/no-object-is -- safe
+       var sameValue$1 = Object.is || function is(x, y) {
+         // eslint-disable-next-line no-self-compare -- NaN check
+         return x === y ? x !== 0 || 1 / x === 1 / y : x != x && y != y;
+       };
+
+       var $$y = _export;
+
+       // eslint-disable-next-line es/no-math-hypot -- required for testing
+       var $hypot = Math.hypot;
+       var abs$3 = Math.abs;
+       var sqrt$1 = Math.sqrt;
+
+       // Chrome 77 bug
+       // https://bugs.chromium.org/p/v8/issues/detail?id=9546
+       var BUGGY = !!$hypot && $hypot(Infinity, NaN) !== Infinity;
+
+       // `Math.hypot` method
+       // https://tc39.es/ecma262/#sec-math.hypot
+       $$y({ target: 'Math', stat: true, forced: BUGGY }, {
+         // eslint-disable-next-line no-unused-vars -- required for `.length`
+         hypot: function hypot(value1, value2) {
+           var sum = 0;
+           var i = 0;
+           var aLen = arguments.length;
+           var larg = 0;
+           var arg, div;
+           while (i < aLen) {
+             arg = abs$3(arguments[i++]);
+             if (larg < arg) {
+               div = larg / arg;
+               sum = sum * div * div + 1;
+               larg = arg;
+             } else if (arg > 0) {
+               div = arg / larg;
+               sum += div * div;
+             } else sum += arg;
+           }
+           return larg === Infinity ? Infinity : larg * sqrt$1(sum);
+         }
+       });
+
+       // `Math.sign` method implementation
+       // https://tc39.es/ecma262/#sec-math.sign
+       // eslint-disable-next-line es/no-math-sign -- safe
+       var mathSign = Math.sign || function sign(x) {
+         // eslint-disable-next-line no-self-compare -- NaN check
+         return (x = +x) == 0 || x != x ? x : x < 0 ? -1 : 1;
+       };
+
+       var $$x = _export;
+       var sign$1 = mathSign;
+
+       // `Math.sign` method
+       // https://tc39.es/ecma262/#sec-math.sign
+       $$x({ target: 'Math', stat: true }, {
+         sign: sign$1
+       });
+
+       var epsilon$1 = 1e-6;
+       var epsilon2$1 = 1e-12;
+       var pi = Math.PI;
+       var halfPi = pi / 2;
+       var quarterPi = pi / 4;
+       var tau = pi * 2;
+       var degrees$1 = 180 / pi;
+       var radians = pi / 180;
+       var abs$2 = Math.abs;
+       var atan = Math.atan;
+       var atan2 = Math.atan2;
+       var cos = Math.cos;
+       var exp$2 = Math.exp;
+       var log$1 = Math.log;
+       var sin = Math.sin;
+       var sign = Math.sign || function (x) {
+         return x > 0 ? 1 : x < 0 ? -1 : 0;
+       };
+       var sqrt = Math.sqrt;
+       var tan = Math.tan;
+       function acos(x) {
+         return x > 1 ? 0 : x < -1 ? pi : Math.acos(x);
+       }
+       function asin(x) {
+         return x > 1 ? halfPi : x < -1 ? -halfPi : Math.asin(x);
+       }
+
+       function noop$1() {}
+
+       function streamGeometry(geometry, stream) {
+         if (geometry && streamGeometryType.hasOwnProperty(geometry.type)) {
+           streamGeometryType[geometry.type](geometry, stream);
+         }
+       }
+
+       var streamObjectType = {
+         Feature: function Feature(object, stream) {
+           streamGeometry(object.geometry, stream);
+         },
+         FeatureCollection: function FeatureCollection(object, stream) {
+           var features = object.features,
+               i = -1,
+               n = features.length;
+
+           while (++i < n) {
+             streamGeometry(features[i].geometry, stream);
+           }
+         }
+       };
+       var streamGeometryType = {
+         Sphere: function Sphere(object, stream) {
+           stream.sphere();
+         },
+         Point: function Point(object, stream) {
+           object = object.coordinates;
+           stream.point(object[0], object[1], object[2]);
+         },
+         MultiPoint: function MultiPoint(object, stream) {
+           var coordinates = object.coordinates,
+               i = -1,
+               n = coordinates.length;
+
+           while (++i < n) {
+             object = coordinates[i], stream.point(object[0], object[1], object[2]);
+           }
+         },
+         LineString: function LineString(object, stream) {
+           streamLine(object.coordinates, stream, 0);
+         },
+         MultiLineString: function MultiLineString(object, stream) {
+           var coordinates = object.coordinates,
+               i = -1,
+               n = coordinates.length;
+
+           while (++i < n) {
+             streamLine(coordinates[i], stream, 0);
+           }
+         },
+         Polygon: function Polygon(object, stream) {
+           streamPolygon(object.coordinates, stream);
+         },
+         MultiPolygon: function MultiPolygon(object, stream) {
+           var coordinates = object.coordinates,
+               i = -1,
+               n = coordinates.length;
+
+           while (++i < n) {
+             streamPolygon(coordinates[i], stream);
+           }
+         },
+         GeometryCollection: function GeometryCollection(object, stream) {
+           var geometries = object.geometries,
+               i = -1,
+               n = geometries.length;
+
+           while (++i < n) {
+             streamGeometry(geometries[i], stream);
+           }
+         }
+       };
+
+       function streamLine(coordinates, stream, closed) {
+         var i = -1,
+             n = coordinates.length - closed,
+             coordinate;
+         stream.lineStart();
+
+         while (++i < n) {
+           coordinate = coordinates[i], stream.point(coordinate[0], coordinate[1], coordinate[2]);
+         }
+
+         stream.lineEnd();
+       }
+
+       function streamPolygon(coordinates, stream) {
+         var i = -1,
+             n = coordinates.length;
+         stream.polygonStart();
+
+         while (++i < n) {
+           streamLine(coordinates[i], stream, 1);
+         }
+
+         stream.polygonEnd();
+       }
+
+       function d3_geoStream (object, stream) {
+         if (object && streamObjectType.hasOwnProperty(object.type)) {
+           streamObjectType[object.type](object, stream);
+         } else {
+           streamGeometry(object, stream);
+         }
+       }
+
+       var areaRingSum$1 = new Adder(); // hello?
+
+       var areaSum$1 = new Adder(),
+           lambda00$1,
+           phi00$1,
+           lambda0$2,
+           cosPhi0$1,
+           sinPhi0$1;
+       var areaStream$1 = {
+         point: noop$1,
+         lineStart: noop$1,
+         lineEnd: noop$1,
+         polygonStart: function polygonStart() {
+           areaRingSum$1 = new Adder();
+           areaStream$1.lineStart = areaRingStart$1;
+           areaStream$1.lineEnd = areaRingEnd$1;
+         },
+         polygonEnd: function polygonEnd() {
+           var areaRing = +areaRingSum$1;
+           areaSum$1.add(areaRing < 0 ? tau + areaRing : areaRing);
+           this.lineStart = this.lineEnd = this.point = noop$1;
+         },
+         sphere: function sphere() {
+           areaSum$1.add(tau);
+         }
+       };
+
+       function areaRingStart$1() {
+         areaStream$1.point = areaPointFirst$1;
+       }
+
+       function areaRingEnd$1() {
+         areaPoint$1(lambda00$1, phi00$1);
+       }
+
+       function areaPointFirst$1(lambda, phi) {
+         areaStream$1.point = areaPoint$1;
+         lambda00$1 = lambda, phi00$1 = phi;
+         lambda *= radians, phi *= radians;
+         lambda0$2 = lambda, cosPhi0$1 = cos(phi = phi / 2 + quarterPi), sinPhi0$1 = sin(phi);
+       }
+
+       function areaPoint$1(lambda, phi) {
+         lambda *= radians, phi *= radians;
+         phi = phi / 2 + quarterPi; // half the angular distance from south pole
+         // Spherical excess E for a spherical triangle with vertices: south pole,
+         // previous point, current point.  Uses a formula derived from Cagnoli’s
+         // theorem.  See Todhunter, Spherical Trig. (1871), Sec. 103, Eq. (2).
+
+         var dLambda = lambda - lambda0$2,
+             sdLambda = dLambda >= 0 ? 1 : -1,
+             adLambda = sdLambda * dLambda,
+             cosPhi = cos(phi),
+             sinPhi = sin(phi),
+             k = sinPhi0$1 * sinPhi,
+             u = cosPhi0$1 * cosPhi + k * cos(adLambda),
+             v = k * sdLambda * sin(adLambda);
+         areaRingSum$1.add(atan2(v, u)); // Advance the previous points.
+
+         lambda0$2 = lambda, cosPhi0$1 = cosPhi, sinPhi0$1 = sinPhi;
+       }
+
+       function d3_geoArea (object) {
+         areaSum$1 = new Adder();
+         d3_geoStream(object, areaStream$1);
+         return areaSum$1 * 2;
+       }
+
+       function spherical(cartesian) {
+         return [atan2(cartesian[1], cartesian[0]), asin(cartesian[2])];
+       }
+       function cartesian(spherical) {
+         var lambda = spherical[0],
+             phi = spherical[1],
+             cosPhi = cos(phi);
+         return [cosPhi * cos(lambda), cosPhi * sin(lambda), sin(phi)];
+       }
+       function cartesianDot(a, b) {
+         return a[0] * b[0] + a[1] * b[1] + a[2] * b[2];
+       }
+       function cartesianCross(a, b) {
+         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]];
+       } // TODO return a
+
+       function cartesianAddInPlace(a, b) {
+         a[0] += b[0], a[1] += b[1], a[2] += b[2];
+       }
+       function cartesianScale(vector, k) {
+         return [vector[0] * k, vector[1] * k, vector[2] * k];
+       } // TODO return d
+
+       function cartesianNormalizeInPlace(d) {
+         var l = sqrt(d[0] * d[0] + d[1] * d[1] + d[2] * d[2]);
+         d[0] /= l, d[1] /= l, d[2] /= l;
+       }
+
+       var lambda0$1, phi0, lambda1, phi1, // bounds
+       lambda2, // previous lambda-coordinate
+       lambda00, phi00, // first point
+       p0, // previous 3D point
+       deltaSum, ranges, range;
+       var boundsStream$1 = {
+         point: boundsPoint$1,
+         lineStart: boundsLineStart,
+         lineEnd: boundsLineEnd,
+         polygonStart: function polygonStart() {
+           boundsStream$1.point = boundsRingPoint;
+           boundsStream$1.lineStart = boundsRingStart;
+           boundsStream$1.lineEnd = boundsRingEnd;
+           deltaSum = new Adder();
+           areaStream$1.polygonStart();
+         },
+         polygonEnd: function polygonEnd() {
+           areaStream$1.polygonEnd();
+           boundsStream$1.point = boundsPoint$1;
+           boundsStream$1.lineStart = boundsLineStart;
+           boundsStream$1.lineEnd = boundsLineEnd;
+           if (areaRingSum$1 < 0) lambda0$1 = -(lambda1 = 180), phi0 = -(phi1 = 90);else if (deltaSum > epsilon$1) phi1 = 90;else if (deltaSum < -epsilon$1) phi0 = -90;
+           range[0] = lambda0$1, range[1] = lambda1;
+         },
+         sphere: function sphere() {
+           lambda0$1 = -(lambda1 = 180), phi0 = -(phi1 = 90);
+         }
+       };
+
+       function boundsPoint$1(lambda, phi) {
+         ranges.push(range = [lambda0$1 = lambda, lambda1 = lambda]);
+         if (phi < phi0) phi0 = phi;
+         if (phi > phi1) phi1 = phi;
+       }
+
+       function linePoint(lambda, phi) {
+         var p = cartesian([lambda * radians, phi * radians]);
+
+         if (p0) {
+           var normal = cartesianCross(p0, p),
+               equatorial = [normal[1], -normal[0], 0],
+               inflection = cartesianCross(equatorial, normal);
+           cartesianNormalizeInPlace(inflection);
+           inflection = spherical(inflection);
+           var delta = lambda - lambda2,
+               sign = delta > 0 ? 1 : -1,
+               lambdai = inflection[0] * degrees$1 * sign,
+               phii,
+               antimeridian = abs$2(delta) > 180;
+
+           if (antimeridian ^ (sign * lambda2 < lambdai && lambdai < sign * lambda)) {
+             phii = inflection[1] * degrees$1;
+             if (phii > phi1) phi1 = phii;
+           } else if (lambdai = (lambdai + 360) % 360 - 180, antimeridian ^ (sign * lambda2 < lambdai && lambdai < sign * lambda)) {
+             phii = -inflection[1] * degrees$1;
+             if (phii < phi0) phi0 = phii;
+           } else {
+             if (phi < phi0) phi0 = phi;
+             if (phi > phi1) phi1 = phi;
+           }
+
+           if (antimeridian) {
+             if (lambda < lambda2) {
+               if (angle(lambda0$1, lambda) > angle(lambda0$1, lambda1)) lambda1 = lambda;
+             } else {
+               if (angle(lambda, lambda1) > angle(lambda0$1, lambda1)) lambda0$1 = lambda;
+             }
+           } else {
+             if (lambda1 >= lambda0$1) {
+               if (lambda < lambda0$1) lambda0$1 = lambda;
+               if (lambda > lambda1) lambda1 = lambda;
+             } else {
+               if (lambda > lambda2) {
+                 if (angle(lambda0$1, lambda) > angle(lambda0$1, lambda1)) lambda1 = lambda;
+               } else {
+                 if (angle(lambda, lambda1) > angle(lambda0$1, lambda1)) lambda0$1 = lambda;
+               }
+             }
+           }
+         } else {
+           ranges.push(range = [lambda0$1 = lambda, lambda1 = lambda]);
+         }
+
+         if (phi < phi0) phi0 = phi;
+         if (phi > phi1) phi1 = phi;
+         p0 = p, lambda2 = lambda;
+       }
+
+       function boundsLineStart() {
+         boundsStream$1.point = linePoint;
+       }
+
+       function boundsLineEnd() {
+         range[0] = lambda0$1, range[1] = lambda1;
+         boundsStream$1.point = boundsPoint$1;
+         p0 = null;
+       }
+
+       function boundsRingPoint(lambda, phi) {
+         if (p0) {
+           var delta = lambda - lambda2;
+           deltaSum.add(abs$2(delta) > 180 ? delta + (delta > 0 ? 360 : -360) : delta);
+         } else {
+           lambda00 = lambda, phi00 = phi;
+         }
+
+         areaStream$1.point(lambda, phi);
+         linePoint(lambda, phi);
+       }
+
+       function boundsRingStart() {
+         areaStream$1.lineStart();
+       }
+
+       function boundsRingEnd() {
+         boundsRingPoint(lambda00, phi00);
+         areaStream$1.lineEnd();
+         if (abs$2(deltaSum) > epsilon$1) lambda0$1 = -(lambda1 = 180);
+         range[0] = lambda0$1, range[1] = lambda1;
+         p0 = null;
+       } // Finds the left-right distance between two longitudes.
+       // This is almost the same as (lambda1 - lambda0 + 360°) % 360°, except that we want
+       // the distance between ±180° to be 360°.
+
+
+       function angle(lambda0, lambda1) {
+         return (lambda1 -= lambda0) < 0 ? lambda1 + 360 : lambda1;
+       }
+
+       function rangeCompare(a, b) {
+         return a[0] - b[0];
+       }
+
+       function rangeContains(range, x) {
+         return range[0] <= range[1] ? range[0] <= x && x <= range[1] : x < range[0] || range[1] < x;
+       }
+
+       function d3_geoBounds (feature) {
+         var i, n, a, b, merged, deltaMax, delta;
+         phi1 = lambda1 = -(lambda0$1 = phi0 = Infinity);
+         ranges = [];
+         d3_geoStream(feature, boundsStream$1); // First, sort ranges by their minimum longitudes.
+
+         if (n = ranges.length) {
+           ranges.sort(rangeCompare); // Then, merge any ranges that overlap.
+
+           for (i = 1, a = ranges[0], merged = [a]; i < n; ++i) {
+             b = ranges[i];
+
+             if (rangeContains(a, b[0]) || rangeContains(a, b[1])) {
+               if (angle(a[0], b[1]) > angle(a[0], a[1])) a[1] = b[1];
+               if (angle(b[0], a[1]) > angle(a[0], a[1])) a[0] = b[0];
+             } else {
+               merged.push(a = b);
+             }
+           } // Finally, find the largest gap between the merged ranges.
+           // The final bounding box will be the inverse of this gap.
+
+
+           for (deltaMax = -Infinity, n = merged.length - 1, i = 0, a = merged[n]; i <= n; a = b, ++i) {
+             b = merged[i];
+             if ((delta = angle(a[1], b[0])) > deltaMax) deltaMax = delta, lambda0$1 = b[0], lambda1 = a[1];
+           }
+         }
+
+         ranges = range = null;
+         return lambda0$1 === Infinity || phi0 === Infinity ? [[NaN, NaN], [NaN, NaN]] : [[lambda0$1, phi0], [lambda1, phi1]];
+       }
+
+       function compose (a, b) {
+         function compose(x, y) {
+           return x = a(x, y), b(x[0], x[1]);
+         }
+
+         if (a.invert && b.invert) compose.invert = function (x, y) {
+           return x = b.invert(x, y), x && a.invert(x[0], x[1]);
+         };
+         return compose;
+       }
+
+       function rotationIdentity(lambda, phi) {
+         return [abs$2(lambda) > pi ? lambda + Math.round(-lambda / tau) * tau : lambda, phi];
+       }
+
+       rotationIdentity.invert = rotationIdentity;
+       function rotateRadians(deltaLambda, deltaPhi, deltaGamma) {
+         return (deltaLambda %= tau) ? deltaPhi || deltaGamma ? compose(rotationLambda(deltaLambda), rotationPhiGamma(deltaPhi, deltaGamma)) : rotationLambda(deltaLambda) : deltaPhi || deltaGamma ? rotationPhiGamma(deltaPhi, deltaGamma) : rotationIdentity;
+       }
+
+       function forwardRotationLambda(deltaLambda) {
+         return function (lambda, phi) {
+           return lambda += deltaLambda, [lambda > pi ? lambda - tau : lambda < -pi ? lambda + tau : lambda, phi];
+         };
+       }
+
+       function rotationLambda(deltaLambda) {
+         var rotation = forwardRotationLambda(deltaLambda);
+         rotation.invert = forwardRotationLambda(-deltaLambda);
+         return rotation;
+       }
+
+       function rotationPhiGamma(deltaPhi, deltaGamma) {
+         var cosDeltaPhi = cos(deltaPhi),
+             sinDeltaPhi = sin(deltaPhi),
+             cosDeltaGamma = cos(deltaGamma),
+             sinDeltaGamma = sin(deltaGamma);
+
+         function rotation(lambda, phi) {
+           var cosPhi = cos(phi),
+               x = cos(lambda) * cosPhi,
+               y = sin(lambda) * cosPhi,
+               z = sin(phi),
+               k = z * cosDeltaPhi + x * sinDeltaPhi;
+           return [atan2(y * cosDeltaGamma - k * sinDeltaGamma, x * cosDeltaPhi - z * sinDeltaPhi), asin(k * cosDeltaGamma + y * sinDeltaGamma)];
+         }
+
+         rotation.invert = function (lambda, phi) {
+           var cosPhi = cos(phi),
+               x = cos(lambda) * cosPhi,
+               y = sin(lambda) * cosPhi,
+               z = sin(phi),
+               k = z * cosDeltaGamma - y * sinDeltaGamma;
+           return [atan2(y * cosDeltaGamma + z * sinDeltaGamma, x * cosDeltaPhi + k * sinDeltaPhi), asin(k * cosDeltaPhi - x * sinDeltaPhi)];
+         };
+
+         return rotation;
+       }
+
+       function rotation (rotate) {
+         rotate = rotateRadians(rotate[0] * radians, rotate[1] * radians, rotate.length > 2 ? rotate[2] * radians : 0);
+
+         function forward(coordinates) {
+           coordinates = rotate(coordinates[0] * radians, coordinates[1] * radians);
+           return coordinates[0] *= degrees$1, coordinates[1] *= degrees$1, coordinates;
+         }
+
+         forward.invert = function (coordinates) {
+           coordinates = rotate.invert(coordinates[0] * radians, coordinates[1] * radians);
+           return coordinates[0] *= degrees$1, coordinates[1] *= degrees$1, coordinates;
+         };
+
+         return forward;
+       }
+
+       function circleStream(stream, radius, delta, direction, t0, t1) {
+         if (!delta) return;
+         var cosRadius = cos(radius),
+             sinRadius = sin(radius),
+             step = direction * delta;
+
+         if (t0 == null) {
+           t0 = radius + direction * tau;
+           t1 = radius - step / 2;
+         } else {
+           t0 = circleRadius(cosRadius, t0);
+           t1 = circleRadius(cosRadius, t1);
+           if (direction > 0 ? t0 < t1 : t0 > t1) t0 += direction * tau;
+         }
+
+         for (var point, t = t0; direction > 0 ? t > t1 : t < t1; t -= step) {
+           point = spherical([cosRadius, -sinRadius * cos(t), -sinRadius * sin(t)]);
+           stream.point(point[0], point[1]);
+         }
+       } // Returns the signed angle of a cartesian point relative to [cosRadius, 0, 0].
+
+       function circleRadius(cosRadius, point) {
+         point = cartesian(point), point[0] -= cosRadius;
+         cartesianNormalizeInPlace(point);
+         var radius = acos(-point[1]);
+         return ((-point[2] < 0 ? -radius : radius) + tau - epsilon$1) % tau;
+       }
+
+       function clipBuffer () {
+         var lines = [],
+             line;
+         return {
+           point: function point(x, y, m) {
+             line.push([x, y, m]);
+           },
+           lineStart: function lineStart() {
+             lines.push(line = []);
+           },
+           lineEnd: noop$1,
+           rejoin: function rejoin() {
+             if (lines.length > 1) lines.push(lines.pop().concat(lines.shift()));
+           },
+           result: function result() {
+             var result = lines;
+             lines = [];
+             line = null;
+             return result;
+           }
+         };
+       }
+
+       function pointEqual (a, b) {
+         return abs$2(a[0] - b[0]) < epsilon$1 && abs$2(a[1] - b[1]) < epsilon$1;
+       }
+
+       function Intersection(point, points, other, entry) {
+         this.x = point;
+         this.z = points;
+         this.o = other; // another intersection
+
+         this.e = entry; // is an entry?
+
+         this.v = false; // visited
+
+         this.n = this.p = null; // next & previous
+       } // A generalized polygon clipping algorithm: given a polygon that has been cut
+       // into its visible line segments, and rejoins the segments by interpolating
+       // along the clip edge.
+
+
+       function clipRejoin (segments, compareIntersection, startInside, interpolate, stream) {
+         var subject = [],
+             clip = [],
+             i,
+             n;
+         segments.forEach(function (segment) {
+           if ((n = segment.length - 1) <= 0) return;
+           var n,
+               p0 = segment[0],
+               p1 = segment[n],
+               x;
+
+           if (pointEqual(p0, p1)) {
+             if (!p0[2] && !p1[2]) {
+               stream.lineStart();
+
+               for (i = 0; i < n; ++i) {
+                 stream.point((p0 = segment[i])[0], p0[1]);
+               }
+
+               stream.lineEnd();
+               return;
+             } // handle degenerate cases by moving the point
+
+
+             p1[0] += 2 * epsilon$1;
+           }
+
+           subject.push(x = new Intersection(p0, segment, null, true));
+           clip.push(x.o = new Intersection(p0, null, x, false));
+           subject.push(x = new Intersection(p1, segment, null, false));
+           clip.push(x.o = new Intersection(p1, null, x, true));
+         });
+         if (!subject.length) return;
+         clip.sort(compareIntersection);
+         link(subject);
+         link(clip);
+
+         for (i = 0, n = clip.length; i < n; ++i) {
+           clip[i].e = startInside = !startInside;
+         }
+
+         var start = subject[0],
+             points,
+             point;
+
+         while (1) {
+           // Find first unvisited intersection.
+           var current = start,
+               isSubject = true;
+
+           while (current.v) {
+             if ((current = current.n) === start) return;
+           }
+
+           points = current.z;
+           stream.lineStart();
+
+           do {
+             current.v = current.o.v = true;
+
+             if (current.e) {
+               if (isSubject) {
+                 for (i = 0, n = points.length; i < n; ++i) {
+                   stream.point((point = points[i])[0], point[1]);
+                 }
+               } else {
+                 interpolate(current.x, current.n.x, 1, stream);
+               }
+
+               current = current.n;
+             } else {
+               if (isSubject) {
+                 points = current.p.z;
+
+                 for (i = points.length - 1; i >= 0; --i) {
+                   stream.point((point = points[i])[0], point[1]);
+                 }
+               } else {
+                 interpolate(current.x, current.p.x, -1, stream);
+               }
+
+               current = current.p;
+             }
+
+             current = current.o;
+             points = current.z;
+             isSubject = !isSubject;
+           } while (!current.v);
+
+           stream.lineEnd();
+         }
+       }
+
+       function link(array) {
+         if (!(n = array.length)) return;
+         var n,
+             i = 0,
+             a = array[0],
+             b;
+
+         while (++i < n) {
+           a.n = b = array[i];
+           b.p = a;
+           a = b;
+         }
+
+         a.n = b = array[0];
+         b.p = a;
+       }
+
+       function longitude(point) {
+         if (abs$2(point[0]) <= pi) return point[0];else return sign(point[0]) * ((abs$2(point[0]) + pi) % tau - pi);
+       }
+
+       function polygonContains (polygon, point) {
+         var lambda = longitude(point),
+             phi = point[1],
+             sinPhi = sin(phi),
+             normal = [sin(lambda), -cos(lambda), 0],
+             angle = 0,
+             winding = 0;
+         var sum = new Adder();
+         if (sinPhi === 1) phi = halfPi + epsilon$1;else if (sinPhi === -1) phi = -halfPi - epsilon$1;
+
+         for (var i = 0, n = polygon.length; i < n; ++i) {
+           if (!(m = (ring = polygon[i]).length)) continue;
+           var ring,
+               m,
+               point0 = ring[m - 1],
+               lambda0 = longitude(point0),
+               phi0 = point0[1] / 2 + quarterPi,
+               sinPhi0 = sin(phi0),
+               cosPhi0 = cos(phi0);
+
+           for (var j = 0; j < m; ++j, lambda0 = lambda1, sinPhi0 = sinPhi1, cosPhi0 = cosPhi1, point0 = point1) {
+             var point1 = ring[j],
+                 lambda1 = longitude(point1),
+                 phi1 = point1[1] / 2 + quarterPi,
+                 sinPhi1 = sin(phi1),
+                 cosPhi1 = cos(phi1),
+                 delta = lambda1 - lambda0,
+                 sign = delta >= 0 ? 1 : -1,
+                 absDelta = sign * delta,
+                 antimeridian = absDelta > pi,
+                 k = sinPhi0 * sinPhi1;
+             sum.add(atan2(k * sign * sin(absDelta), cosPhi0 * cosPhi1 + k * cos(absDelta)));
+             angle += antimeridian ? delta + sign * tau : delta; // Are the longitudes either side of the point’s meridian (lambda),
+             // and are the latitudes smaller than the parallel (phi)?
+
+             if (antimeridian ^ lambda0 >= lambda ^ lambda1 >= lambda) {
+               var arc = cartesianCross(cartesian(point0), cartesian(point1));
+               cartesianNormalizeInPlace(arc);
+               var intersection = cartesianCross(normal, arc);
+               cartesianNormalizeInPlace(intersection);
+               var phiArc = (antimeridian ^ delta >= 0 ? -1 : 1) * asin(intersection[2]);
+
+               if (phi > phiArc || phi === phiArc && (arc[0] || arc[1])) {
+                 winding += antimeridian ^ delta >= 0 ? 1 : -1;
+               }
+             }
+           }
+         } // First, determine whether the South pole is inside or outside:
+         //
+         // It is inside if:
+         // * the polygon winds around it in a clockwise direction.
+         // * the polygon does not (cumulatively) wind around it, but has a negative
+         //   (counter-clockwise) area.
+         //
+         // Second, count the (signed) number of times a segment crosses a lambda
+         // from the point to the South pole.  If it is zero, then the point is the
+         // same side as the South pole.
+
+
+         return (angle < -epsilon$1 || angle < epsilon$1 && sum < -epsilon2$1) ^ winding & 1;
+       }
+
+       function clip (pointVisible, clipLine, interpolate, start) {
+         return function (sink) {
+           var line = clipLine(sink),
+               ringBuffer = clipBuffer(),
+               ringSink = clipLine(ringBuffer),
+               polygonStarted = false,
+               polygon,
+               segments,
+               ring;
+           var clip = {
+             point: point,
+             lineStart: lineStart,
+             lineEnd: lineEnd,
+             polygonStart: function polygonStart() {
+               clip.point = pointRing;
+               clip.lineStart = ringStart;
+               clip.lineEnd = ringEnd;
+               segments = [];
+               polygon = [];
+             },
+             polygonEnd: function polygonEnd() {
+               clip.point = point;
+               clip.lineStart = lineStart;
+               clip.lineEnd = lineEnd;
+               segments = merge$4(segments);
+               var startInside = polygonContains(polygon, start);
+
+               if (segments.length) {
+                 if (!polygonStarted) sink.polygonStart(), polygonStarted = true;
+                 clipRejoin(segments, compareIntersection, startInside, interpolate, sink);
+               } else if (startInside) {
+                 if (!polygonStarted) sink.polygonStart(), polygonStarted = true;
+                 sink.lineStart();
+                 interpolate(null, null, 1, sink);
+                 sink.lineEnd();
+               }
+
+               if (polygonStarted) sink.polygonEnd(), polygonStarted = false;
+               segments = polygon = null;
+             },
+             sphere: function sphere() {
+               sink.polygonStart();
+               sink.lineStart();
+               interpolate(null, null, 1, sink);
+               sink.lineEnd();
+               sink.polygonEnd();
+             }
+           };
+
+           function point(lambda, phi) {
+             if (pointVisible(lambda, phi)) sink.point(lambda, phi);
+           }
+
+           function pointLine(lambda, phi) {
+             line.point(lambda, phi);
+           }
+
+           function lineStart() {
+             clip.point = pointLine;
+             line.lineStart();
+           }
+
+           function lineEnd() {
+             clip.point = point;
+             line.lineEnd();
+           }
+
+           function pointRing(lambda, phi) {
+             ring.push([lambda, phi]);
+             ringSink.point(lambda, phi);
+           }
+
+           function ringStart() {
+             ringSink.lineStart();
+             ring = [];
+           }
+
+           function ringEnd() {
+             pointRing(ring[0][0], ring[0][1]);
+             ringSink.lineEnd();
+             var clean = ringSink.clean(),
+                 ringSegments = ringBuffer.result(),
+                 i,
+                 n = ringSegments.length,
+                 m,
+                 segment,
+                 point;
+             ring.pop();
+             polygon.push(ring);
+             ring = null;
+             if (!n) return; // No intersections.
+
+             if (clean & 1) {
+               segment = ringSegments[0];
+
+               if ((m = segment.length - 1) > 0) {
+                 if (!polygonStarted) sink.polygonStart(), polygonStarted = true;
+                 sink.lineStart();
+
+                 for (i = 0; i < m; ++i) {
+                   sink.point((point = segment[i])[0], point[1]);
+                 }
+
+                 sink.lineEnd();
+               }
+
+               return;
+             } // Rejoin connected segments.
+             // TODO reuse ringBuffer.rejoin()?
+
+
+             if (n > 1 && clean & 2) ringSegments.push(ringSegments.pop().concat(ringSegments.shift()));
+             segments.push(ringSegments.filter(validSegment));
+           }
+
+           return clip;
+         };
+       }
+
+       function validSegment(segment) {
+         return segment.length > 1;
+       } // Intersections are sorted along the clip edge. For both antimeridian cutting
+       // and circle clipping, the same comparison is used.
+
+
+       function compareIntersection(a, b) {
+         return ((a = a.x)[0] < 0 ? a[1] - halfPi - epsilon$1 : halfPi - a[1]) - ((b = b.x)[0] < 0 ? b[1] - halfPi - epsilon$1 : halfPi - b[1]);
+       }
+
+       var clipAntimeridian = clip(function () {
+         return true;
+       }, clipAntimeridianLine, clipAntimeridianInterpolate, [-pi, -halfPi]); // Takes a line and cuts into visible segments. Return values: 0 - there were
+       // intersections or the line was empty; 1 - no intersections; 2 - there were
+       // intersections, and the first and last segments should be rejoined.
+
+       function clipAntimeridianLine(stream) {
+         var lambda0 = NaN,
+             phi0 = NaN,
+             sign0 = NaN,
+             _clean; // no intersections
+
+
+         return {
+           lineStart: function lineStart() {
+             stream.lineStart();
+             _clean = 1;
+           },
+           point: function point(lambda1, phi1) {
+             var sign1 = lambda1 > 0 ? pi : -pi,
+                 delta = abs$2(lambda1 - lambda0);
+
+             if (abs$2(delta - pi) < epsilon$1) {
+               // line crosses a pole
+               stream.point(lambda0, phi0 = (phi0 + phi1) / 2 > 0 ? halfPi : -halfPi);
+               stream.point(sign0, phi0);
+               stream.lineEnd();
+               stream.lineStart();
+               stream.point(sign1, phi0);
+               stream.point(lambda1, phi0);
+               _clean = 0;
+             } else if (sign0 !== sign1 && delta >= pi) {
+               // line crosses antimeridian
+               if (abs$2(lambda0 - sign0) < epsilon$1) lambda0 -= sign0 * epsilon$1; // handle degeneracies
+
+               if (abs$2(lambda1 - sign1) < epsilon$1) lambda1 -= sign1 * epsilon$1;
+               phi0 = clipAntimeridianIntersect(lambda0, phi0, lambda1, phi1);
+               stream.point(sign0, phi0);
+               stream.lineEnd();
+               stream.lineStart();
+               stream.point(sign1, phi0);
+               _clean = 0;
+             }
+
+             stream.point(lambda0 = lambda1, phi0 = phi1);
+             sign0 = sign1;
+           },
+           lineEnd: function lineEnd() {
+             stream.lineEnd();
+             lambda0 = phi0 = NaN;
+           },
+           clean: function clean() {
+             return 2 - _clean; // if intersections, rejoin first and last segments
+           }
+         };
+       }
+
+       function clipAntimeridianIntersect(lambda0, phi0, lambda1, phi1) {
+         var cosPhi0,
+             cosPhi1,
+             sinLambda0Lambda1 = sin(lambda0 - lambda1);
+         return abs$2(sinLambda0Lambda1) > epsilon$1 ? atan((sin(phi0) * (cosPhi1 = cos(phi1)) * sin(lambda1) - sin(phi1) * (cosPhi0 = cos(phi0)) * sin(lambda0)) / (cosPhi0 * cosPhi1 * sinLambda0Lambda1)) : (phi0 + phi1) / 2;
+       }
+
+       function clipAntimeridianInterpolate(from, to, direction, stream) {
+         var phi;
+
+         if (from == null) {
+           phi = direction * halfPi;
+           stream.point(-pi, phi);
+           stream.point(0, phi);
+           stream.point(pi, phi);
+           stream.point(pi, 0);
+           stream.point(pi, -phi);
+           stream.point(0, -phi);
+           stream.point(-pi, -phi);
+           stream.point(-pi, 0);
+           stream.point(-pi, phi);
+         } else if (abs$2(from[0] - to[0]) > epsilon$1) {
+           var lambda = from[0] < to[0] ? pi : -pi;
+           phi = direction * lambda / 2;
+           stream.point(-lambda, phi);
+           stream.point(0, phi);
+           stream.point(lambda, phi);
+         } else {
+           stream.point(to[0], to[1]);
+         }
+       }
+
+       function clipCircle (radius) {
+         var cr = cos(radius),
+             delta = 6 * radians,
+             smallRadius = cr > 0,
+             notHemisphere = abs$2(cr) > epsilon$1; // TODO optimise for this common case
+
+         function interpolate(from, to, direction, stream) {
+           circleStream(stream, radius, delta, direction, from, to);
+         }
+
+         function visible(lambda, phi) {
+           return cos(lambda) * cos(phi) > cr;
+         } // Takes a line and cuts into visible segments. Return values used for polygon
+         // clipping: 0 - there were intersections or the line was empty; 1 - no
+         // intersections 2 - there were intersections, and the first and last segments
+         // should be rejoined.
+
+
+         function clipLine(stream) {
+           var point0, // previous point
+           c0, // code for previous point
+           v0, // visibility of previous point
+           v00, // visibility of first point
+           _clean; // no intersections
+
+
+           return {
+             lineStart: function lineStart() {
+               v00 = v0 = false;
+               _clean = 1;
+             },
+             point: function point(lambda, phi) {
+               var point1 = [lambda, phi],
+                   point2,
+                   v = visible(lambda, phi),
+                   c = smallRadius ? v ? 0 : code(lambda, phi) : v ? code(lambda + (lambda < 0 ? pi : -pi), phi) : 0;
+               if (!point0 && (v00 = v0 = v)) stream.lineStart();
+
+               if (v !== v0) {
+                 point2 = intersect(point0, point1);
+                 if (!point2 || pointEqual(point0, point2) || pointEqual(point1, point2)) point1[2] = 1;
+               }
+
+               if (v !== v0) {
+                 _clean = 0;
+
+                 if (v) {
+                   // outside going in
+                   stream.lineStart();
+                   point2 = intersect(point1, point0);
+                   stream.point(point2[0], point2[1]);
+                 } else {
+                   // inside going out
+                   point2 = intersect(point0, point1);
+                   stream.point(point2[0], point2[1], 2);
+                   stream.lineEnd();
+                 }
+
+                 point0 = point2;
+               } else if (notHemisphere && point0 && smallRadius ^ v) {
+                 var t; // If the codes for two points are different, or are both zero,
+                 // and there this segment intersects with the small circle.
+
+                 if (!(c & c0) && (t = intersect(point1, point0, true))) {
+                   _clean = 0;
+
+                   if (smallRadius) {
+                     stream.lineStart();
+                     stream.point(t[0][0], t[0][1]);
+                     stream.point(t[1][0], t[1][1]);
+                     stream.lineEnd();
+                   } else {
+                     stream.point(t[1][0], t[1][1]);
+                     stream.lineEnd();
+                     stream.lineStart();
+                     stream.point(t[0][0], t[0][1], 3);
+                   }
+                 }
+               }
+
+               if (v && (!point0 || !pointEqual(point0, point1))) {
+                 stream.point(point1[0], point1[1]);
+               }
+
+               point0 = point1, v0 = v, c0 = c;
+             },
+             lineEnd: function lineEnd() {
+               if (v0) stream.lineEnd();
+               point0 = null;
+             },
+             // Rejoin first and last segments if there were intersections and the first
+             // and last points were visible.
+             clean: function clean() {
+               return _clean | (v00 && v0) << 1;
+             }
+           };
+         } // Intersects the great circle between a and b with the clip circle.
+
+
+         function intersect(a, b, two) {
+           var pa = cartesian(a),
+               pb = cartesian(b); // We have two planes, n1.p = d1 and n2.p = d2.
+           // Find intersection line p(t) = c1 n1 + c2 n2 + t (n1 ⨯ n2).
+
+           var n1 = [1, 0, 0],
+               // normal
+           n2 = cartesianCross(pa, pb),
+               n2n2 = cartesianDot(n2, n2),
+               n1n2 = n2[0],
+               // cartesianDot(n1, n2),
+           determinant = n2n2 - n1n2 * n1n2; // Two polar points.
+
+           if (!determinant) return !two && a;
+           var c1 = cr * n2n2 / determinant,
+               c2 = -cr * n1n2 / determinant,
+               n1xn2 = cartesianCross(n1, n2),
+               A = cartesianScale(n1, c1),
+               B = cartesianScale(n2, c2);
+           cartesianAddInPlace(A, B); // Solve |p(t)|^2 = 1.
+
+           var u = n1xn2,
+               w = cartesianDot(A, u),
+               uu = cartesianDot(u, u),
+               t2 = w * w - uu * (cartesianDot(A, A) - 1);
+           if (t2 < 0) return;
+           var t = sqrt(t2),
+               q = cartesianScale(u, (-w - t) / uu);
+           cartesianAddInPlace(q, A);
+           q = spherical(q);
+           if (!two) return q; // Two intersection points.
+
+           var lambda0 = a[0],
+               lambda1 = b[0],
+               phi0 = a[1],
+               phi1 = b[1],
+               z;
+           if (lambda1 < lambda0) z = lambda0, lambda0 = lambda1, lambda1 = z;
+           var delta = lambda1 - lambda0,
+               polar = abs$2(delta - pi) < epsilon$1,
+               meridian = polar || delta < epsilon$1;
+           if (!polar && phi1 < phi0) z = phi0, phi0 = phi1, phi1 = z; // Check that the first point is between a and b.
+
+           if (meridian ? polar ? phi0 + phi1 > 0 ^ q[1] < (abs$2(q[0] - lambda0) < epsilon$1 ? phi0 : phi1) : phi0 <= q[1] && q[1] <= phi1 : delta > pi ^ (lambda0 <= q[0] && q[0] <= lambda1)) {
+             var q1 = cartesianScale(u, (-w + t) / uu);
+             cartesianAddInPlace(q1, A);
+             return [q, spherical(q1)];
+           }
+         } // Generates a 4-bit vector representing the location of a point relative to
+         // the small circle's bounding box.
+
+
+         function code(lambda, phi) {
+           var r = smallRadius ? radius : pi - radius,
+               code = 0;
+           if (lambda < -r) code |= 1; // left
+           else if (lambda > r) code |= 2; // right
+
+           if (phi < -r) code |= 4; // below
+           else if (phi > r) code |= 8; // above
+
+           return code;
+         }
+
+         return clip(visible, clipLine, interpolate, smallRadius ? [0, -radius] : [-pi, radius - pi]);
+       }
+
+       function clipLine (a, b, x0, y0, x1, y1) {
+         var ax = a[0],
+             ay = a[1],
+             bx = b[0],
+             by = b[1],
+             t0 = 0,
+             t1 = 1,
+             dx = bx - ax,
+             dy = by - ay,
+             r;
+         r = x0 - ax;
+         if (!dx && r > 0) return;
+         r /= dx;
+
+         if (dx < 0) {
+           if (r < t0) return;
+           if (r < t1) t1 = r;
+         } else if (dx > 0) {
+           if (r > t1) return;
+           if (r > t0) t0 = r;
+         }
+
+         r = x1 - ax;
+         if (!dx && r < 0) return;
+         r /= dx;
+
+         if (dx < 0) {
+           if (r > t1) return;
+           if (r > t0) t0 = r;
+         } else if (dx > 0) {
+           if (r < t0) return;
+           if (r < t1) t1 = r;
+         }
+
+         r = y0 - ay;
+         if (!dy && r > 0) return;
+         r /= dy;
+
+         if (dy < 0) {
+           if (r < t0) return;
+           if (r < t1) t1 = r;
+         } else if (dy > 0) {
+           if (r > t1) return;
+           if (r > t0) t0 = r;
+         }
+
+         r = y1 - ay;
+         if (!dy && r < 0) return;
+         r /= dy;
+
+         if (dy < 0) {
+           if (r > t1) return;
+           if (r > t0) t0 = r;
+         } else if (dy > 0) {
+           if (r < t0) return;
+           if (r < t1) t1 = r;
+         }
+
+         if (t0 > 0) a[0] = ax + t0 * dx, a[1] = ay + t0 * dy;
+         if (t1 < 1) b[0] = ax + t1 * dx, b[1] = ay + t1 * dy;
+         return true;
+       }
+
+       var clipMax = 1e9,
+           clipMin = -clipMax; // TODO Use d3-polygon’s polygonContains here for the ring check?
+       // TODO Eliminate duplicate buffering in clipBuffer and polygon.push?
+
+       function clipRectangle(x0, y0, x1, y1) {
+         function visible(x, y) {
+           return x0 <= x && x <= x1 && y0 <= y && y <= y1;
+         }
+
+         function interpolate(from, to, direction, stream) {
+           var a = 0,
+               a1 = 0;
+
+           if (from == null || (a = corner(from, direction)) !== (a1 = corner(to, direction)) || comparePoint(from, to) < 0 ^ direction > 0) {
+             do {
+               stream.point(a === 0 || a === 3 ? x0 : x1, a > 1 ? y1 : y0);
+             } while ((a = (a + direction + 4) % 4) !== a1);
+           } else {
+             stream.point(to[0], to[1]);
+           }
+         }
+
+         function corner(p, direction) {
+           return abs$2(p[0] - x0) < epsilon$1 ? direction > 0 ? 0 : 3 : abs$2(p[0] - x1) < epsilon$1 ? direction > 0 ? 2 : 1 : abs$2(p[1] - y0) < epsilon$1 ? direction > 0 ? 1 : 0 : direction > 0 ? 3 : 2; // abs(p[1] - y1) < epsilon
+         }
+
+         function compareIntersection(a, b) {
+           return comparePoint(a.x, b.x);
+         }
+
+         function comparePoint(a, b) {
+           var ca = corner(a, 1),
+               cb = corner(b, 1);
+           return ca !== cb ? ca - cb : ca === 0 ? b[1] - a[1] : ca === 1 ? a[0] - b[0] : ca === 2 ? a[1] - b[1] : b[0] - a[0];
+         }
+
+         return function (stream) {
+           var activeStream = stream,
+               bufferStream = clipBuffer(),
+               segments,
+               polygon,
+               ring,
+               x__,
+               y__,
+               v__,
+               // first point
+           x_,
+               y_,
+               v_,
+               // previous point
+           first,
+               clean;
+           var clipStream = {
+             point: point,
+             lineStart: lineStart,
+             lineEnd: lineEnd,
+             polygonStart: polygonStart,
+             polygonEnd: polygonEnd
+           };
+
+           function point(x, y) {
+             if (visible(x, y)) activeStream.point(x, y);
+           }
+
+           function polygonInside() {
+             var winding = 0;
+
+             for (var i = 0, n = polygon.length; i < n; ++i) {
+               for (var ring = polygon[i], j = 1, m = ring.length, point = ring[0], a0, a1, b0 = point[0], b1 = point[1]; j < m; ++j) {
+                 a0 = b0, a1 = b1, point = ring[j], b0 = point[0], b1 = point[1];
+
+                 if (a1 <= y1) {
+                   if (b1 > y1 && (b0 - a0) * (y1 - a1) > (b1 - a1) * (x0 - a0)) ++winding;
+                 } else {
+                   if (b1 <= y1 && (b0 - a0) * (y1 - a1) < (b1 - a1) * (x0 - a0)) --winding;
+                 }
+               }
+             }
+
+             return winding;
+           } // Buffer geometry within a polygon and then clip it en masse.
+
+
+           function polygonStart() {
+             activeStream = bufferStream, segments = [], polygon = [], clean = true;
+           }
+
+           function polygonEnd() {
+             var startInside = polygonInside(),
+                 cleanInside = clean && startInside,
+                 visible = (segments = merge$4(segments)).length;
+
+             if (cleanInside || visible) {
+               stream.polygonStart();
+
+               if (cleanInside) {
+                 stream.lineStart();
+                 interpolate(null, null, 1, stream);
+                 stream.lineEnd();
+               }
+
+               if (visible) {
+                 clipRejoin(segments, compareIntersection, startInside, interpolate, stream);
+               }
+
+               stream.polygonEnd();
+             }
+
+             activeStream = stream, segments = polygon = ring = null;
+           }
+
+           function lineStart() {
+             clipStream.point = linePoint;
+             if (polygon) polygon.push(ring = []);
+             first = true;
+             v_ = false;
+             x_ = y_ = NaN;
+           } // TODO rather than special-case polygons, simply handle them separately.
+           // Ideally, coincident intersection points should be jittered to avoid
+           // clipping issues.
+
+
+           function lineEnd() {
+             if (segments) {
+               linePoint(x__, y__);
+               if (v__ && v_) bufferStream.rejoin();
+               segments.push(bufferStream.result());
+             }
+
+             clipStream.point = point;
+             if (v_) activeStream.lineEnd();
+           }
+
+           function linePoint(x, y) {
+             var v = visible(x, y);
+             if (polygon) ring.push([x, y]);
+
+             if (first) {
+               x__ = x, y__ = y, v__ = v;
+               first = false;
+
+               if (v) {
+                 activeStream.lineStart();
+                 activeStream.point(x, y);
+               }
+             } else {
+               if (v && v_) activeStream.point(x, y);else {
+                 var a = [x_ = Math.max(clipMin, Math.min(clipMax, x_)), y_ = Math.max(clipMin, Math.min(clipMax, y_))],
+                     b = [x = Math.max(clipMin, Math.min(clipMax, x)), y = Math.max(clipMin, Math.min(clipMax, y))];
+
+                 if (clipLine(a, b, x0, y0, x1, y1)) {
+                   if (!v_) {
+                     activeStream.lineStart();
+                     activeStream.point(a[0], a[1]);
+                   }
+
+                   activeStream.point(b[0], b[1]);
+                   if (!v) activeStream.lineEnd();
+                   clean = false;
+                 } else if (v) {
+                   activeStream.lineStart();
+                   activeStream.point(x, y);
+                   clean = false;
+                 }
+               }
+             }
+
+             x_ = x, y_ = y, v_ = v;
+           }
+
+           return clipStream;
+         };
+       }
+
+       var lengthSum$1, lambda0, sinPhi0, cosPhi0;
+       var lengthStream$1 = {
+         sphere: noop$1,
+         point: noop$1,
+         lineStart: lengthLineStart,
+         lineEnd: noop$1,
+         polygonStart: noop$1,
+         polygonEnd: noop$1
+       };
+
+       function lengthLineStart() {
+         lengthStream$1.point = lengthPointFirst$1;
+         lengthStream$1.lineEnd = lengthLineEnd;
+       }
+
+       function lengthLineEnd() {
+         lengthStream$1.point = lengthStream$1.lineEnd = noop$1;
+       }
+
+       function lengthPointFirst$1(lambda, phi) {
+         lambda *= radians, phi *= radians;
+         lambda0 = lambda, sinPhi0 = sin(phi), cosPhi0 = cos(phi);
+         lengthStream$1.point = lengthPoint$1;
+       }
+
+       function lengthPoint$1(lambda, phi) {
+         lambda *= radians, phi *= radians;
+         var sinPhi = sin(phi),
+             cosPhi = cos(phi),
+             delta = abs$2(lambda - lambda0),
+             cosDelta = cos(delta),
+             sinDelta = sin(delta),
+             x = cosPhi * sinDelta,
+             y = cosPhi0 * sinPhi - sinPhi0 * cosPhi * cosDelta,
+             z = sinPhi0 * sinPhi + cosPhi0 * cosPhi * cosDelta;
+         lengthSum$1.add(atan2(sqrt(x * x + y * y), z));
+         lambda0 = lambda, sinPhi0 = sinPhi, cosPhi0 = cosPhi;
+       }
+
+       function d3_geoLength (object) {
+         lengthSum$1 = new Adder();
+         d3_geoStream(object, lengthStream$1);
+         return +lengthSum$1;
+       }
+
+       var identity$4 = (function (x) {
+         return x;
+       });
+
+       var areaSum = new Adder(),
+           areaRingSum = new Adder(),
+           x00$2,
+           y00$2,
+           x0$3,
+           y0$3;
+       var areaStream = {
+         point: noop$1,
+         lineStart: noop$1,
+         lineEnd: noop$1,
+         polygonStart: function polygonStart() {
+           areaStream.lineStart = areaRingStart;
+           areaStream.lineEnd = areaRingEnd;
+         },
+         polygonEnd: function polygonEnd() {
+           areaStream.lineStart = areaStream.lineEnd = areaStream.point = noop$1;
+           areaSum.add(abs$2(areaRingSum));
+           areaRingSum = new Adder();
+         },
+         result: function result() {
+           var area = areaSum / 2;
+           areaSum = new Adder();
+           return area;
+         }
+       };
+
+       function areaRingStart() {
+         areaStream.point = areaPointFirst;
+       }
+
+       function areaPointFirst(x, y) {
+         areaStream.point = areaPoint;
+         x00$2 = x0$3 = x, y00$2 = y0$3 = y;
+       }
+
+       function areaPoint(x, y) {
+         areaRingSum.add(y0$3 * x - x0$3 * y);
+         x0$3 = x, y0$3 = y;
+       }
+
+       function areaRingEnd() {
+         areaPoint(x00$2, y00$2);
+       }
+
+       var x0$2 = Infinity,
+           y0$2 = x0$2,
+           x1 = -x0$2,
+           y1 = x1;
+       var boundsStream = {
+         point: boundsPoint,
+         lineStart: noop$1,
+         lineEnd: noop$1,
+         polygonStart: noop$1,
+         polygonEnd: noop$1,
+         result: function result() {
+           var bounds = [[x0$2, y0$2], [x1, y1]];
+           x1 = y1 = -(y0$2 = x0$2 = Infinity);
+           return bounds;
+         }
+       };
+
+       function boundsPoint(x, y) {
+         if (x < x0$2) x0$2 = x;
+         if (x > x1) x1 = x;
+         if (y < y0$2) y0$2 = y;
+         if (y > y1) y1 = y;
+       }
+
+       var X0 = 0,
+           Y0 = 0,
+           Z0 = 0,
+           X1 = 0,
+           Y1 = 0,
+           Z1 = 0,
+           X2 = 0,
+           Y2 = 0,
+           Z2 = 0,
+           x00$1,
+           y00$1,
+           x0$1,
+           y0$1;
+       var centroidStream = {
+         point: centroidPoint,
+         lineStart: centroidLineStart,
+         lineEnd: centroidLineEnd,
+         polygonStart: function polygonStart() {
+           centroidStream.lineStart = centroidRingStart;
+           centroidStream.lineEnd = centroidRingEnd;
+         },
+         polygonEnd: function polygonEnd() {
+           centroidStream.point = centroidPoint;
+           centroidStream.lineStart = centroidLineStart;
+           centroidStream.lineEnd = centroidLineEnd;
+         },
+         result: function result() {
+           var centroid = Z2 ? [X2 / Z2, Y2 / Z2] : Z1 ? [X1 / Z1, Y1 / Z1] : Z0 ? [X0 / Z0, Y0 / Z0] : [NaN, NaN];
+           X0 = Y0 = Z0 = X1 = Y1 = Z1 = X2 = Y2 = Z2 = 0;
+           return centroid;
+         }
+       };
+
+       function centroidPoint(x, y) {
+         X0 += x;
+         Y0 += y;
+         ++Z0;
+       }
+
+       function centroidLineStart() {
+         centroidStream.point = centroidPointFirstLine;
+       }
+
+       function centroidPointFirstLine(x, y) {
+         centroidStream.point = centroidPointLine;
+         centroidPoint(x0$1 = x, y0$1 = y);
+       }
+
+       function centroidPointLine(x, y) {
+         var dx = x - x0$1,
+             dy = y - y0$1,
+             z = sqrt(dx * dx + dy * dy);
+         X1 += z * (x0$1 + x) / 2;
+         Y1 += z * (y0$1 + y) / 2;
+         Z1 += z;
+         centroidPoint(x0$1 = x, y0$1 = y);
+       }
+
+       function centroidLineEnd() {
+         centroidStream.point = centroidPoint;
+       }
+
+       function centroidRingStart() {
+         centroidStream.point = centroidPointFirstRing;
+       }
+
+       function centroidRingEnd() {
+         centroidPointRing(x00$1, y00$1);
+       }
+
+       function centroidPointFirstRing(x, y) {
+         centroidStream.point = centroidPointRing;
+         centroidPoint(x00$1 = x0$1 = x, y00$1 = y0$1 = y);
+       }
+
+       function centroidPointRing(x, y) {
+         var dx = x - x0$1,
+             dy = y - y0$1,
+             z = sqrt(dx * dx + dy * dy);
+         X1 += z * (x0$1 + x) / 2;
+         Y1 += z * (y0$1 + y) / 2;
+         Z1 += z;
+         z = y0$1 * x - x0$1 * y;
+         X2 += z * (x0$1 + x);
+         Y2 += z * (y0$1 + y);
+         Z2 += z * 3;
+         centroidPoint(x0$1 = x, y0$1 = y);
+       }
+
+       function PathContext(context) {
+         this._context = context;
+       }
+       PathContext.prototype = {
+         _radius: 4.5,
+         pointRadius: function pointRadius(_) {
+           return this._radius = _, this;
+         },
+         polygonStart: function polygonStart() {
+           this._line = 0;
+         },
+         polygonEnd: function polygonEnd() {
+           this._line = NaN;
+         },
+         lineStart: function lineStart() {
+           this._point = 0;
+         },
+         lineEnd: function lineEnd() {
+           if (this._line === 0) this._context.closePath();
+           this._point = NaN;
+         },
+         point: function point(x, y) {
+           switch (this._point) {
+             case 0:
+               {
+                 this._context.moveTo(x, y);
+
+                 this._point = 1;
+                 break;
+               }
+
+             case 1:
+               {
+                 this._context.lineTo(x, y);
+
+                 break;
+               }
+
+             default:
+               {
+                 this._context.moveTo(x + this._radius, y);
+
+                 this._context.arc(x, y, this._radius, 0, tau);
+
+                 break;
+               }
+           }
+         },
+         result: noop$1
+       };
+
+       var lengthSum = new Adder(),
+           lengthRing,
+           x00,
+           y00,
+           x0,
+           y0;
+       var lengthStream = {
+         point: noop$1,
+         lineStart: function lineStart() {
+           lengthStream.point = lengthPointFirst;
+         },
+         lineEnd: function lineEnd() {
+           if (lengthRing) lengthPoint(x00, y00);
+           lengthStream.point = noop$1;
+         },
+         polygonStart: function polygonStart() {
+           lengthRing = true;
+         },
+         polygonEnd: function polygonEnd() {
+           lengthRing = null;
+         },
+         result: function result() {
+           var length = +lengthSum;
+           lengthSum = new Adder();
+           return length;
+         }
+       };
+
+       function lengthPointFirst(x, y) {
+         lengthStream.point = lengthPoint;
+         x00 = x0 = x, y00 = y0 = y;
+       }
+
+       function lengthPoint(x, y) {
+         x0 -= x, y0 -= y;
+         lengthSum.add(sqrt(x0 * x0 + y0 * y0));
+         x0 = x, y0 = y;
+       }
+
+       function PathString() {
+         this._string = [];
+       }
+       PathString.prototype = {
+         _radius: 4.5,
+         _circle: circle(4.5),
+         pointRadius: function pointRadius(_) {
+           if ((_ = +_) !== this._radius) this._radius = _, this._circle = null;
+           return this;
+         },
+         polygonStart: function polygonStart() {
+           this._line = 0;
+         },
+         polygonEnd: function polygonEnd() {
+           this._line = NaN;
+         },
+         lineStart: function lineStart() {
+           this._point = 0;
+         },
+         lineEnd: function lineEnd() {
+           if (this._line === 0) this._string.push("Z");
+           this._point = NaN;
+         },
+         point: function point(x, y) {
+           switch (this._point) {
+             case 0:
+               {
+                 this._string.push("M", x, ",", y);
+
+                 this._point = 1;
+                 break;
+               }
+
+             case 1:
+               {
+                 this._string.push("L", x, ",", y);
+
+                 break;
+               }
+
+             default:
+               {
+                 if (this._circle == null) this._circle = circle(this._radius);
+
+                 this._string.push("M", x, ",", y, this._circle);
+
+                 break;
+               }
+           }
+         },
+         result: function result() {
+           if (this._string.length) {
+             var result = this._string.join("");
+
+             this._string = [];
+             return result;
+           } else {
+             return null;
+           }
+         }
+       };
+
+       function circle(radius) {
+         return "m0," + radius + "a" + radius + "," + radius + " 0 1,1 0," + -2 * radius + "a" + radius + "," + radius + " 0 1,1 0," + 2 * radius + "z";
+       }
+
+       function d3_geoPath (projection, context) {
+         var pointRadius = 4.5,
+             projectionStream,
+             contextStream;
+
+         function path(object) {
+           if (object) {
+             if (typeof pointRadius === "function") contextStream.pointRadius(+pointRadius.apply(this, arguments));
+             d3_geoStream(object, projectionStream(contextStream));
+           }
+
+           return contextStream.result();
+         }
+
+         path.area = function (object) {
+           d3_geoStream(object, projectionStream(areaStream));
+           return areaStream.result();
+         };
+
+         path.measure = function (object) {
+           d3_geoStream(object, projectionStream(lengthStream));
+           return lengthStream.result();
+         };
+
+         path.bounds = function (object) {
+           d3_geoStream(object, projectionStream(boundsStream));
+           return boundsStream.result();
+         };
+
+         path.centroid = function (object) {
+           d3_geoStream(object, projectionStream(centroidStream));
+           return centroidStream.result();
+         };
+
+         path.projection = function (_) {
+           return arguments.length ? (projectionStream = _ == null ? (projection = null, identity$4) : (projection = _).stream, path) : projection;
+         };
+
+         path.context = function (_) {
+           if (!arguments.length) return context;
+           contextStream = _ == null ? (context = null, new PathString()) : new PathContext(context = _);
+           if (typeof pointRadius !== "function") contextStream.pointRadius(pointRadius);
+           return path;
+         };
+
+         path.pointRadius = function (_) {
+           if (!arguments.length) return pointRadius;
+           pointRadius = typeof _ === "function" ? _ : (contextStream.pointRadius(+_), +_);
+           return path;
+         };
+
+         return path.projection(projection).context(context);
+       }
+
+       function d3_geoTransform (methods) {
+         return {
+           stream: transformer$1(methods)
+         };
+       }
+       function transformer$1(methods) {
+         return function (stream) {
+           var s = new TransformStream();
+
+           for (var key in methods) {
+             s[key] = methods[key];
+           }
+
+           s.stream = stream;
+           return s;
+         };
+       }
+
+       function TransformStream() {}
+
+       TransformStream.prototype = {
+         constructor: TransformStream,
+         point: function point(x, y) {
+           this.stream.point(x, y);
+         },
+         sphere: function sphere() {
+           this.stream.sphere();
+         },
+         lineStart: function lineStart() {
+           this.stream.lineStart();
+         },
+         lineEnd: function lineEnd() {
+           this.stream.lineEnd();
+         },
+         polygonStart: function polygonStart() {
+           this.stream.polygonStart();
+         },
+         polygonEnd: function polygonEnd() {
+           this.stream.polygonEnd();
+         }
+       };
+
+       function fit(projection, fitBounds, object) {
+         var clip = projection.clipExtent && projection.clipExtent();
+         projection.scale(150).translate([0, 0]);
+         if (clip != null) projection.clipExtent(null);
+         d3_geoStream(object, projection.stream(boundsStream));
+         fitBounds(boundsStream.result());
+         if (clip != null) projection.clipExtent(clip);
+         return projection;
+       }
+
+       function fitExtent(projection, extent, object) {
+         return fit(projection, function (b) {
+           var w = extent[1][0] - extent[0][0],
+               h = extent[1][1] - extent[0][1],
+               k = Math.min(w / (b[1][0] - b[0][0]), h / (b[1][1] - b[0][1])),
+               x = +extent[0][0] + (w - k * (b[1][0] + b[0][0])) / 2,
+               y = +extent[0][1] + (h - k * (b[1][1] + b[0][1])) / 2;
+           projection.scale(150 * k).translate([x, y]);
+         }, object);
+       }
+       function fitSize(projection, size, object) {
+         return fitExtent(projection, [[0, 0], size], object);
+       }
+       function fitWidth(projection, width, object) {
+         return fit(projection, function (b) {
+           var w = +width,
+               k = w / (b[1][0] - b[0][0]),
+               x = (w - k * (b[1][0] + b[0][0])) / 2,
+               y = -k * b[0][1];
+           projection.scale(150 * k).translate([x, y]);
+         }, object);
+       }
+       function fitHeight(projection, height, object) {
+         return fit(projection, function (b) {
+           var h = +height,
+               k = h / (b[1][1] - b[0][1]),
+               x = -k * b[0][0],
+               y = (h - k * (b[1][1] + b[0][1])) / 2;
+           projection.scale(150 * k).translate([x, y]);
+         }, object);
+       }
+
+       var maxDepth = 16,
+           // maximum depth of subdivision
+       cosMinDistance = cos(30 * radians); // cos(minimum angular distance)
+
+       function resample (project, delta2) {
+         return +delta2 ? resample$1(project, delta2) : resampleNone(project);
+       }
+
+       function resampleNone(project) {
+         return transformer$1({
+           point: function point(x, y) {
+             x = project(x, y);
+             this.stream.point(x[0], x[1]);
+           }
+         });
+       }
+
+       function resample$1(project, delta2) {
+         function resampleLineTo(x0, y0, lambda0, a0, b0, c0, x1, y1, lambda1, a1, b1, c1, depth, stream) {
+           var dx = x1 - x0,
+               dy = y1 - y0,
+               d2 = dx * dx + dy * dy;
+
+           if (d2 > 4 * delta2 && depth--) {
+             var a = a0 + a1,
+                 b = b0 + b1,
+                 c = c0 + c1,
+                 m = sqrt(a * a + b * b + c * c),
+                 phi2 = asin(c /= m),
+                 lambda2 = abs$2(abs$2(c) - 1) < epsilon$1 || abs$2(lambda0 - lambda1) < epsilon$1 ? (lambda0 + lambda1) / 2 : atan2(b, a),
+                 p = project(lambda2, phi2),
+                 x2 = p[0],
+                 y2 = p[1],
+                 dx2 = x2 - x0,
+                 dy2 = y2 - y0,
+                 dz = dy * dx2 - dx * dy2;
+
+             if (dz * dz / d2 > delta2 // perpendicular projected distance
+             || abs$2((dx * dx2 + dy * dy2) / d2 - 0.5) > 0.3 // midpoint close to an end
+             || a0 * a1 + b0 * b1 + c0 * c1 < cosMinDistance) {
+               // angular distance
+               resampleLineTo(x0, y0, lambda0, a0, b0, c0, x2, y2, lambda2, a /= m, b /= m, c, depth, stream);
+               stream.point(x2, y2);
+               resampleLineTo(x2, y2, lambda2, a, b, c, x1, y1, lambda1, a1, b1, c1, depth, stream);
+             }
+           }
+         }
+
+         return function (stream) {
+           var lambda00, x00, y00, a00, b00, c00, // first point
+           lambda0, x0, y0, a0, b0, c0; // previous point
+
+           var resampleStream = {
+             point: point,
+             lineStart: lineStart,
+             lineEnd: lineEnd,
+             polygonStart: function polygonStart() {
+               stream.polygonStart();
+               resampleStream.lineStart = ringStart;
+             },
+             polygonEnd: function polygonEnd() {
+               stream.polygonEnd();
+               resampleStream.lineStart = lineStart;
+             }
+           };
+
+           function point(x, y) {
+             x = project(x, y);
+             stream.point(x[0], x[1]);
+           }
+
+           function lineStart() {
+             x0 = NaN;
+             resampleStream.point = linePoint;
+             stream.lineStart();
+           }
+
+           function linePoint(lambda, phi) {
+             var c = cartesian([lambda, phi]),
+                 p = project(lambda, phi);
+             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);
+             stream.point(x0, y0);
+           }
+
+           function lineEnd() {
+             resampleStream.point = point;
+             stream.lineEnd();
+           }
+
+           function ringStart() {
+             lineStart();
+             resampleStream.point = ringPoint;
+             resampleStream.lineEnd = ringEnd;
+           }
+
+           function ringPoint(lambda, phi) {
+             linePoint(lambda00 = lambda, phi), x00 = x0, y00 = y0, a00 = a0, b00 = b0, c00 = c0;
+             resampleStream.point = linePoint;
+           }
+
+           function ringEnd() {
+             resampleLineTo(x0, y0, lambda0, a0, b0, c0, x00, y00, lambda00, a00, b00, c00, maxDepth, stream);
+             resampleStream.lineEnd = lineEnd;
+             lineEnd();
+           }
+
+           return resampleStream;
+         };
+       }
+
+       var transformRadians = transformer$1({
+         point: function point(x, y) {
+           this.stream.point(x * radians, y * radians);
+         }
+       });
+
+       function transformRotate(rotate) {
+         return transformer$1({
+           point: function point(x, y) {
+             var r = rotate(x, y);
+             return this.stream.point(r[0], r[1]);
+           }
+         });
+       }
+
+       function scaleTranslate(k, dx, dy, sx, sy) {
+         function transform(x, y) {
+           x *= sx;
+           y *= sy;
+           return [dx + k * x, dy - k * y];
+         }
+
+         transform.invert = function (x, y) {
+           return [(x - dx) / k * sx, (dy - y) / k * sy];
+         };
+
+         return transform;
+       }
+
+       function scaleTranslateRotate(k, dx, dy, sx, sy, alpha) {
+         if (!alpha) return scaleTranslate(k, dx, dy, sx, sy);
+         var cosAlpha = cos(alpha),
+             sinAlpha = sin(alpha),
+             a = cosAlpha * k,
+             b = sinAlpha * k,
+             ai = cosAlpha / k,
+             bi = sinAlpha / k,
+             ci = (sinAlpha * dy - cosAlpha * dx) / k,
+             fi = (sinAlpha * dx + cosAlpha * dy) / k;
+
+         function transform(x, y) {
+           x *= sx;
+           y *= sy;
+           return [a * x - b * y + dx, dy - b * x - a * y];
+         }
+
+         transform.invert = function (x, y) {
+           return [sx * (ai * x - bi * y + ci), sy * (fi - bi * x - ai * y)];
+         };
+
+         return transform;
+       }
+
+       function projection(project) {
+         return projectionMutator(function () {
+           return project;
+         })();
+       }
+       function projectionMutator(projectAt) {
+         var project,
+             k = 150,
+             // scale
+         x = 480,
+             y = 250,
+             // translate
+         lambda = 0,
+             phi = 0,
+             // center
+         deltaLambda = 0,
+             deltaPhi = 0,
+             deltaGamma = 0,
+             rotate,
+             // pre-rotate
+         alpha = 0,
+             // post-rotate angle
+         sx = 1,
+             // reflectX
+         sy = 1,
+             // reflectX
+         theta = null,
+             preclip = clipAntimeridian,
+             // pre-clip angle
+         x0 = null,
+             y0,
+             x1,
+             y1,
+             postclip = identity$4,
+             // post-clip extent
+         delta2 = 0.5,
+             // precision
+         projectResample,
+             projectTransform,
+             projectRotateTransform,
+             cache,
+             cacheStream;
+
+         function projection(point) {
+           return projectRotateTransform(point[0] * radians, point[1] * radians);
+         }
+
+         function invert(point) {
+           point = projectRotateTransform.invert(point[0], point[1]);
+           return point && [point[0] * degrees$1, point[1] * degrees$1];
+         }
+
+         projection.stream = function (stream) {
+           return cache && cacheStream === stream ? cache : cache = transformRadians(transformRotate(rotate)(preclip(projectResample(postclip(cacheStream = stream)))));
+         };
+
+         projection.preclip = function (_) {
+           return arguments.length ? (preclip = _, theta = undefined, reset()) : preclip;
+         };
+
+         projection.postclip = function (_) {
+           return arguments.length ? (postclip = _, x0 = y0 = x1 = y1 = null, reset()) : postclip;
+         };
+
+         projection.clipAngle = function (_) {
+           return arguments.length ? (preclip = +_ ? clipCircle(theta = _ * radians) : (theta = null, clipAntimeridian), reset()) : theta * degrees$1;
+         };
+
+         projection.clipExtent = function (_) {
+           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]];
+         };
+
+         projection.scale = function (_) {
+           return arguments.length ? (k = +_, recenter()) : k;
+         };
+
+         projection.translate = function (_) {
+           return arguments.length ? (x = +_[0], y = +_[1], recenter()) : [x, y];
+         };
+
+         projection.center = function (_) {
+           return arguments.length ? (lambda = _[0] % 360 * radians, phi = _[1] % 360 * radians, recenter()) : [lambda * degrees$1, phi * degrees$1];
+         };
+
+         projection.rotate = function (_) {
+           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];
+         };
+
+         projection.angle = function (_) {
+           return arguments.length ? (alpha = _ % 360 * radians, recenter()) : alpha * degrees$1;
+         };
+
+         projection.reflectX = function (_) {
+           return arguments.length ? (sx = _ ? -1 : 1, recenter()) : sx < 0;
+         };
+
+         projection.reflectY = function (_) {
+           return arguments.length ? (sy = _ ? -1 : 1, recenter()) : sy < 0;
+         };
+
+         projection.precision = function (_) {
+           return arguments.length ? (projectResample = resample(projectTransform, delta2 = _ * _), reset()) : sqrt(delta2);
+         };
+
+         projection.fitExtent = function (extent, object) {
+           return fitExtent(projection, extent, object);
+         };
+
+         projection.fitSize = function (size, object) {
+           return fitSize(projection, size, object);
+         };
+
+         projection.fitWidth = function (width, object) {
+           return fitWidth(projection, width, object);
+         };
+
+         projection.fitHeight = function (height, object) {
+           return fitHeight(projection, height, object);
+         };
+
+         function recenter() {
+           var center = scaleTranslateRotate(k, 0, 0, sx, sy, alpha).apply(null, project(lambda, phi)),
+               transform = scaleTranslateRotate(k, x - center[0], y - center[1], sx, sy, alpha);
+           rotate = rotateRadians(deltaLambda, deltaPhi, deltaGamma);
+           projectTransform = compose(project, transform);
+           projectRotateTransform = compose(rotate, projectTransform);
+           projectResample = resample(projectTransform, delta2);
+           return reset();
+         }
+
+         function reset() {
+           cache = cacheStream = null;
+           return projection;
+         }
+
+         return function () {
+           project = projectAt.apply(this, arguments);
+           projection.invert = project.invert && invert;
+           return recenter();
+         };
+       }
+
+       function mercatorRaw(lambda, phi) {
+         return [lambda, log$1(tan((halfPi + phi) / 2))];
+       }
+
+       mercatorRaw.invert = function (x, y) {
+         return [x, 2 * atan(exp$2(y)) - halfPi];
+       };
+
+       function mercator () {
+         return mercatorProjection(mercatorRaw).scale(961 / tau);
+       }
+       function mercatorProjection(project) {
+         var m = projection(project),
+             center = m.center,
+             scale = m.scale,
+             translate = m.translate,
+             clipExtent = m.clipExtent,
+             x0 = null,
+             y0,
+             x1,
+             y1; // clip extent
+
+         m.scale = function (_) {
+           return arguments.length ? (scale(_), reclip()) : scale();
+         };
+
+         m.translate = function (_) {
+           return arguments.length ? (translate(_), reclip()) : translate();
+         };
+
+         m.center = function (_) {
+           return arguments.length ? (center(_), reclip()) : center();
+         };
+
+         m.clipExtent = function (_) {
+           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]];
+         };
+
+         function reclip() {
+           var k = pi * scale(),
+               t = m(rotation(m.rotate()).invert([0, 0]));
+           return clipExtent(x0 == null ? [[t[0] - k, t[1] - k], [t[0] + k, t[1] + k]] : project === mercatorRaw ? [[Math.max(t[0] - k, x0), y0], [Math.min(t[0] + k, x1), y1]] : [[x0, Math.max(t[1] - k, y0)], [x1, Math.min(t[1] + k, y1)]]);
+         }
+
+         return reclip();
+       }
+
+       function d3_geoIdentity () {
+         var k = 1,
+             tx = 0,
+             ty = 0,
+             sx = 1,
+             sy = 1,
+             // scale, translate and reflect
+         alpha = 0,
+             ca,
+             sa,
+             // angle
+         x0 = null,
+             y0,
+             x1,
+             y1,
+             // clip extent
+         kx = 1,
+             ky = 1,
+             transform = transformer$1({
+           point: function point(x, y) {
+             var p = projection([x, y]);
+             this.stream.point(p[0], p[1]);
+           }
+         }),
+             postclip = identity$4,
+             cache,
+             cacheStream;
+
+         function reset() {
+           kx = k * sx;
+           ky = k * sy;
+           cache = cacheStream = null;
+           return projection;
+         }
+
+         function projection(p) {
+           var x = p[0] * kx,
+               y = p[1] * ky;
+
+           if (alpha) {
+             var t = y * ca - x * sa;
+             x = x * ca + y * sa;
+             y = t;
+           }
+
+           return [x + tx, y + ty];
+         }
+
+         projection.invert = function (p) {
+           var x = p[0] - tx,
+               y = p[1] - ty;
+
+           if (alpha) {
+             var t = y * ca + x * sa;
+             x = x * ca - y * sa;
+             y = t;
+           }
+
+           return [x / kx, y / ky];
+         };
+
+         projection.stream = function (stream) {
+           return cache && cacheStream === stream ? cache : cache = transform(postclip(cacheStream = stream));
+         };
+
+         projection.postclip = function (_) {
+           return arguments.length ? (postclip = _, x0 = y0 = x1 = y1 = null, reset()) : postclip;
+         };
+
+         projection.clipExtent = function (_) {
+           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]];
+         };
+
+         projection.scale = function (_) {
+           return arguments.length ? (k = +_, reset()) : k;
+         };
+
+         projection.translate = function (_) {
+           return arguments.length ? (tx = +_[0], ty = +_[1], reset()) : [tx, ty];
+         };
+
+         projection.angle = function (_) {
+           return arguments.length ? (alpha = _ % 360 * radians, sa = sin(alpha), ca = cos(alpha), reset()) : alpha * degrees$1;
+         };
+
+         projection.reflectX = function (_) {
+           return arguments.length ? (sx = _ ? -1 : 1, reset()) : sx < 0;
+         };
+
+         projection.reflectY = function (_) {
+           return arguments.length ? (sy = _ ? -1 : 1, reset()) : sy < 0;
+         };
+
+         projection.fitExtent = function (extent, object) {
+           return fitExtent(projection, extent, object);
+         };
+
+         projection.fitSize = function (size, object) {
+           return fitSize(projection, size, object);
+         };
+
+         projection.fitWidth = function (width, object) {
+           return fitWidth(projection, width, object);
+         };
+
+         projection.fitHeight = function (height, object) {
+           return fitHeight(projection, height, object);
+         };
+
+         return projection;
+       }
+
+       // constants
+       var TAU = 2 * Math.PI;
+       var EQUATORIAL_RADIUS = 6356752.314245179;
+       var POLAR_RADIUS = 6378137.0;
+       function geoLatToMeters(dLat) {
+         return dLat * (TAU * POLAR_RADIUS / 360);
+       }
+       function geoLonToMeters(dLon, atLat) {
+         return Math.abs(atLat) >= 90 ? 0 : dLon * (TAU * EQUATORIAL_RADIUS / 360) * Math.abs(Math.cos(atLat * (Math.PI / 180)));
+       }
+       function geoMetersToLat(m) {
+         return m / (TAU * POLAR_RADIUS / 360);
+       }
+       function geoMetersToLon(m, atLat) {
+         return Math.abs(atLat) >= 90 ? 0 : m / (TAU * EQUATORIAL_RADIUS / 360) / Math.abs(Math.cos(atLat * (Math.PI / 180)));
+       }
+       function geoMetersToOffset(meters, tileSize) {
+         tileSize = tileSize || 256;
+         return [meters[0] * tileSize / (TAU * EQUATORIAL_RADIUS), -meters[1] * tileSize / (TAU * POLAR_RADIUS)];
+       }
+       function geoOffsetToMeters(offset, tileSize) {
+         tileSize = tileSize || 256;
+         return [offset[0] * TAU * EQUATORIAL_RADIUS / tileSize, -offset[1] * TAU * POLAR_RADIUS / tileSize];
+       } // Equirectangular approximation of spherical distances on Earth
+
+       function geoSphericalDistance(a, b) {
+         var x = geoLonToMeters(a[0] - b[0], (a[1] + b[1]) / 2);
+         var y = geoLatToMeters(a[1] - b[1]);
+         return Math.sqrt(x * x + y * y);
+       } // scale to zoom
+
+       function geoScaleToZoom(k, tileSize) {
+         tileSize = tileSize || 256;
+         var log2ts = Math.log(tileSize) * Math.LOG2E;
+         return Math.log(k * TAU) / Math.LN2 - log2ts;
+       } // zoom to scale
+
+       function geoZoomToScale(z, tileSize) {
+         tileSize = tileSize || 256;
+         return tileSize * Math.pow(2, z) / TAU;
+       } // returns info about the node from `nodes` closest to the given `point`
+
+       function geoSphericalClosestNode(nodes, point) {
+         var minDistance = Infinity,
+             distance;
+         var indexOfMin;
+
+         for (var i in nodes) {
+           distance = geoSphericalDistance(nodes[i].loc, point);
+
+           if (distance < minDistance) {
+             minDistance = distance;
+             indexOfMin = i;
+           }
+         }
+
+         if (indexOfMin !== undefined) {
+           return {
+             index: indexOfMin,
+             distance: minDistance,
+             node: nodes[indexOfMin]
+           };
+         } else {
+           return null;
+         }
+       }
+
+       function geoExtent(min, max) {
+         if (!(this instanceof geoExtent)) {
+           return new geoExtent(min, max);
+         } else if (min instanceof geoExtent) {
+           return min;
+         } else if (min && min.length === 2 && min[0].length === 2 && min[1].length === 2) {
+           this[0] = min[0];
+           this[1] = min[1];
+         } else {
+           this[0] = min || [Infinity, Infinity];
+           this[1] = max || min || [-Infinity, -Infinity];
+         }
+       }
+       geoExtent.prototype = new Array(2);
+       Object.assign(geoExtent.prototype, {
+         equals: function equals(obj) {
+           return this[0][0] === obj[0][0] && this[0][1] === obj[0][1] && this[1][0] === obj[1][0] && this[1][1] === obj[1][1];
+         },
+         extend: function extend(obj) {
+           if (!(obj instanceof geoExtent)) obj = new geoExtent(obj);
+           return geoExtent([Math.min(obj[0][0], this[0][0]), Math.min(obj[0][1], this[0][1])], [Math.max(obj[1][0], this[1][0]), Math.max(obj[1][1], this[1][1])]);
+         },
+         _extend: function _extend(extent) {
+           this[0][0] = Math.min(extent[0][0], this[0][0]);
+           this[0][1] = Math.min(extent[0][1], this[0][1]);
+           this[1][0] = Math.max(extent[1][0], this[1][0]);
+           this[1][1] = Math.max(extent[1][1], this[1][1]);
+         },
+         area: function area() {
+           return Math.abs((this[1][0] - this[0][0]) * (this[1][1] - this[0][1]));
+         },
+         center: function center() {
+           return [(this[0][0] + this[1][0]) / 2, (this[0][1] + this[1][1]) / 2];
+         },
+         rectangle: function rectangle() {
+           return [this[0][0], this[0][1], this[1][0], this[1][1]];
+         },
+         bbox: function bbox() {
+           return {
+             minX: this[0][0],
+             minY: this[0][1],
+             maxX: this[1][0],
+             maxY: this[1][1]
+           };
+         },
+         polygon: function polygon() {
+           return [[this[0][0], this[0][1]], [this[0][0], this[1][1]], [this[1][0], this[1][1]], [this[1][0], this[0][1]], [this[0][0], this[0][1]]];
+         },
+         contains: function contains(obj) {
+           if (!(obj instanceof geoExtent)) obj = new geoExtent(obj);
+           return obj[0][0] >= this[0][0] && obj[0][1] >= this[0][1] && obj[1][0] <= this[1][0] && obj[1][1] <= this[1][1];
+         },
+         intersects: function intersects(obj) {
+           if (!(obj instanceof geoExtent)) obj = new geoExtent(obj);
+           return obj[0][0] <= this[1][0] && obj[0][1] <= this[1][1] && obj[1][0] >= this[0][0] && obj[1][1] >= this[0][1];
+         },
+         intersection: function intersection(obj) {
+           if (!this.intersects(obj)) return new geoExtent();
+           return new geoExtent([Math.max(obj[0][0], this[0][0]), Math.max(obj[0][1], this[0][1])], [Math.min(obj[1][0], this[1][0]), Math.min(obj[1][1], this[1][1])]);
+         },
+         percentContainedIn: function percentContainedIn(obj) {
+           if (!(obj instanceof geoExtent)) obj = new geoExtent(obj);
+           var a1 = this.intersection(obj).area();
+           var a2 = this.area();
+
+           if (a1 === Infinity || a2 === Infinity) {
+             return 0;
+           } else if (a1 === 0 || a2 === 0) {
+             if (obj.contains(this)) {
+               return 1;
+             }
+
+             return 0;
+           } else {
+             return a1 / a2;
+           }
+         },
+         padByMeters: function padByMeters(meters) {
+           var dLat = geoMetersToLat(meters);
+           var dLon = geoMetersToLon(meters, this.center()[1]);
+           return geoExtent([this[0][0] - dLon, this[0][1] - dLat], [this[1][0] + dLon, this[1][1] + dLat]);
+         },
+         toParam: function toParam() {
+           return this.rectangle().join(',');
+         }
+       });
+
+       var $$w = _export;
+       var $every = arrayIteration.every;
+       var arrayMethodIsStrict$2 = arrayMethodIsStrict$9;
+
+       var STRICT_METHOD$2 = arrayMethodIsStrict$2('every');
+
+       // `Array.prototype.every` method
+       // https://tc39.es/ecma262/#sec-array.prototype.every
+       $$w({ target: 'Array', proto: true, forced: !STRICT_METHOD$2 }, {
+         every: function every(callbackfn /* , thisArg */) {
+           return $every(this, callbackfn, arguments.length > 1 ? arguments[1] : undefined);
+         }
+       });
+
+       var $$v = _export;
+       var $reduce = arrayReduce.left;
+       var arrayMethodIsStrict$1 = arrayMethodIsStrict$9;
+       var CHROME_VERSION$1 = engineV8Version;
+       var IS_NODE$1 = engineIsNode;
+
+       var STRICT_METHOD$1 = arrayMethodIsStrict$1('reduce');
+       // Chrome 80-82 has a critical bug
+       // https://bugs.chromium.org/p/chromium/issues/detail?id=1049982
+       var CHROME_BUG$1 = !IS_NODE$1 && CHROME_VERSION$1 > 79 && CHROME_VERSION$1 < 83;
+
+       // `Array.prototype.reduce` method
+       // https://tc39.es/ecma262/#sec-array.prototype.reduce
+       $$v({ target: 'Array', proto: true, forced: !STRICT_METHOD$1 || CHROME_BUG$1 }, {
+         reduce: function reduce(callbackfn /* , initialValue */) {
+           var length = arguments.length;
+           return $reduce(this, callbackfn, length, length > 1 ? arguments[1] : undefined);
+         }
+       });
+
+       function d3_polygonArea (polygon) {
+         var i = -1,
+             n = polygon.length,
+             a,
+             b = polygon[n - 1],
+             area = 0;
+
+         while (++i < n) {
+           a = b;
+           b = polygon[i];
+           area += a[1] * b[0] - a[0] * b[1];
+         }
+
+         return area / 2;
+       }
+
+       function d3_polygonCentroid (polygon) {
+         var i = -1,
+             n = polygon.length,
+             x = 0,
+             y = 0,
+             a,
+             b = polygon[n - 1],
+             c,
+             k = 0;
+
+         while (++i < n) {
+           a = b;
+           b = polygon[i];
+           k += c = a[0] * b[1] - b[0] * a[1];
+           x += (a[0] + b[0]) * c;
+           y += (a[1] + b[1]) * c;
+         }
+
+         return k *= 3, [x / k, y / k];
+       }
+
+       // Returns the 2D cross product of AB and AC vectors, i.e., the z-component of
+       // the 3D cross product in a quadrant I Cartesian coordinate system (+x is
+       // right, +y is up). Returns a positive value if ABC is counter-clockwise,
+       // negative if clockwise, and zero if the points are collinear.
+       function cross (a, b, c) {
+         return (b[0] - a[0]) * (c[1] - a[1]) - (b[1] - a[1]) * (c[0] - a[0]);
+       }
+
+       function lexicographicOrder(a, b) {
+         return a[0] - b[0] || a[1] - b[1];
+       } // Computes the upper convex hull per the monotone chain algorithm.
+       // Assumes points.length >= 3, is sorted by x, unique in y.
+       // Returns an array of indices into points in left-to-right order.
+
+
+       function computeUpperHullIndexes(points) {
+         var n = points.length,
+             indexes = [0, 1];
+         var size = 2,
+             i;
+
+         for (i = 2; i < n; ++i) {
+           while (size > 1 && cross(points[indexes[size - 2]], points[indexes[size - 1]], points[i]) <= 0) {
+             --size;
+           }
+
+           indexes[size++] = i;
+         }
+
+         return indexes.slice(0, size); // remove popped points
+       }
+
+       function d3_polygonHull (points) {
+         if ((n = points.length) < 3) return null;
+         var i,
+             n,
+             sortedPoints = new Array(n),
+             flippedPoints = new Array(n);
+
+         for (i = 0; i < n; ++i) {
+           sortedPoints[i] = [+points[i][0], +points[i][1], i];
+         }
+
+         sortedPoints.sort(lexicographicOrder);
+
+         for (i = 0; i < n; ++i) {
+           flippedPoints[i] = [sortedPoints[i][0], -sortedPoints[i][1]];
+         }
+
+         var upperIndexes = computeUpperHullIndexes(sortedPoints),
+             lowerIndexes = computeUpperHullIndexes(flippedPoints); // Construct the hull polygon, removing possible duplicate endpoints.
+
+         var skipLeft = lowerIndexes[0] === upperIndexes[0],
+             skipRight = lowerIndexes[lowerIndexes.length - 1] === upperIndexes[upperIndexes.length - 1],
+             hull = []; // Add upper hull in right-to-l order.
+         // Then add lower hull in left-to-right order.
+
+         for (i = upperIndexes.length - 1; i >= 0; --i) {
+           hull.push(points[sortedPoints[upperIndexes[i]][2]]);
+         }
+
+         for (i = +skipLeft; i < lowerIndexes.length - skipRight; ++i) {
+           hull.push(points[sortedPoints[lowerIndexes[i]][2]]);
+         }
+
+         return hull;
+       }
+
+       // vector equals
+       function geoVecEqual(a, b, epsilon) {
+         if (epsilon) {
+           return Math.abs(a[0] - b[0]) <= epsilon && Math.abs(a[1] - b[1]) <= epsilon;
+         } else {
+           return a[0] === b[0] && a[1] === b[1];
+         }
+       } // vector addition
+
+       function geoVecAdd(a, b) {
+         return [a[0] + b[0], a[1] + b[1]];
+       } // vector subtraction
+
+       function geoVecSubtract(a, b) {
+         return [a[0] - b[0], a[1] - b[1]];
+       } // vector scaling
+
+       function geoVecScale(a, mag) {
+         return [a[0] * mag, a[1] * mag];
+       } // vector rounding (was: geoRoundCoordinates)
+
+       function geoVecFloor(a) {
+         return [Math.floor(a[0]), Math.floor(a[1])];
+       } // linear interpolation
+
+       function geoVecInterp(a, b, t) {
+         return [a[0] + (b[0] - a[0]) * t, a[1] + (b[1] - a[1]) * t];
+       } // http://jsperf.com/id-dist-optimization
+
+       function geoVecLength(a, b) {
+         return Math.sqrt(geoVecLengthSquare(a, b));
+       } // length of vector raised to the power two
+
+       function geoVecLengthSquare(a, b) {
+         b = b || [0, 0];
+         var x = a[0] - b[0];
+         var y = a[1] - b[1];
+         return x * x + y * y;
+       } // get a unit vector
+
+       function geoVecNormalize(a) {
+         var length = Math.sqrt(a[0] * a[0] + a[1] * a[1]);
+
+         if (length !== 0) {
+           return geoVecScale(a, 1 / length);
+         }
+
+         return [0, 0];
+       } // Return the counterclockwise angle in the range (-pi, pi)
+       // between the positive X axis and the line intersecting a and b.
+
+       function geoVecAngle(a, b) {
+         return Math.atan2(b[1] - a[1], b[0] - a[0]);
+       } // dot product
+
+       function geoVecDot(a, b, origin) {
+         origin = origin || [0, 0];
+         var p = geoVecSubtract(a, origin);
+         var q = geoVecSubtract(b, origin);
+         return p[0] * q[0] + p[1] * q[1];
+       } // normalized dot product
+
+       function geoVecNormalizedDot(a, b, origin) {
+         origin = origin || [0, 0];
+         var p = geoVecNormalize(geoVecSubtract(a, origin));
+         var q = geoVecNormalize(geoVecSubtract(b, origin));
+         return geoVecDot(p, q);
+       } // 2D cross product of OA and OB vectors, returns magnitude of Z vector
+       // Returns a positive value, if OAB makes a counter-clockwise turn,
+       // negative for clockwise turn, and zero if the points are collinear.
+
+       function geoVecCross(a, b, origin) {
+         origin = origin || [0, 0];
+         var p = geoVecSubtract(a, origin);
+         var q = geoVecSubtract(b, origin);
+         return p[0] * q[1] - p[1] * q[0];
+       } // find closest orthogonal projection of point onto points array
+
+       function geoVecProject(a, points) {
+         var min = Infinity;
+         var idx;
+         var target;
+
+         for (var i = 0; i < points.length - 1; i++) {
+           var o = points[i];
+           var s = geoVecSubtract(points[i + 1], o);
+           var v = geoVecSubtract(a, o);
+           var proj = geoVecDot(v, s) / geoVecDot(s, s);
+           var p;
+
+           if (proj < 0) {
+             p = o;
+           } else if (proj > 1) {
+             p = points[i + 1];
+           } else {
+             p = [o[0] + proj * s[0], o[1] + proj * s[1]];
+           }
+
+           var dist = geoVecLength(p, a);
+
+           if (dist < min) {
+             min = dist;
+             idx = i + 1;
+             target = p;
+           }
+         }
+
+         if (idx !== undefined) {
+           return {
+             index: idx,
+             distance: min,
+             target: target
+           };
+         } else {
+           return null;
+         }
+       }
+
+       // between the positive X axis and the line intersecting a and b.
+
+       function geoAngle(a, b, projection) {
+         return geoVecAngle(projection(a.loc), projection(b.loc));
+       }
+       function geoEdgeEqual(a, b) {
+         return a[0] === b[0] && a[1] === b[1] || a[0] === b[1] && a[1] === b[0];
+       } // Rotate all points counterclockwise around a pivot point by given angle
+
+       function geoRotate(points, angle, around) {
+         return points.map(function (point) {
+           var radial = geoVecSubtract(point, around);
+           return [radial[0] * Math.cos(angle) - radial[1] * Math.sin(angle) + around[0], radial[0] * Math.sin(angle) + radial[1] * Math.cos(angle) + around[1]];
+         });
+       } // Choose the edge with the minimal distance from `point` to its orthogonal
+       // projection onto that edge, if such a projection exists, or the distance to
+       // the closest vertex on that edge. Returns an object with the `index` of the
+       // chosen edge, the chosen `loc` on that edge, and the `distance` to to it.
+
+       function geoChooseEdge(nodes, point, projection, activeID) {
+         var dist = geoVecLength;
+         var points = nodes.map(function (n) {
+           return projection(n.loc);
+         });
+         var ids = nodes.map(function (n) {
+           return n.id;
+         });
+         var min = Infinity;
+         var idx;
+         var loc;
+
+         for (var i = 0; i < points.length - 1; i++) {
+           if (ids[i] === activeID || ids[i + 1] === activeID) continue;
+           var o = points[i];
+           var s = geoVecSubtract(points[i + 1], o);
+           var v = geoVecSubtract(point, o);
+           var proj = geoVecDot(v, s) / geoVecDot(s, s);
+           var p;
+
+           if (proj < 0) {
+             p = o;
+           } else if (proj > 1) {
+             p = points[i + 1];
+           } else {
+             p = [o[0] + proj * s[0], o[1] + proj * s[1]];
+           }
+
+           var d = dist(p, point);
+
+           if (d < min) {
+             min = d;
+             idx = i + 1;
+             loc = projection.invert(p);
+           }
+         }
+
+         if (idx !== undefined) {
+           return {
+             index: idx,
+             distance: min,
+             loc: loc
+           };
+         } else {
+           return null;
+         }
+       } // Test active (dragged or drawing) segments against inactive segments
+       // This is used to test e.g. multipolygon rings that cross
+       // `activeNodes` is the ring containing the activeID being dragged.
+       // `inactiveNodes` is the other ring to test against
+
+       function geoHasLineIntersections(activeNodes, inactiveNodes, activeID) {
+         var actives = [];
+         var inactives = [];
+         var j, k, n1, n2, segment; // gather active segments (only segments in activeNodes that contain the activeID)
+
+         for (j = 0; j < activeNodes.length - 1; j++) {
+           n1 = activeNodes[j];
+           n2 = activeNodes[j + 1];
+           segment = [n1.loc, n2.loc];
+
+           if (n1.id === activeID || n2.id === activeID) {
+             actives.push(segment);
+           }
+         } // gather inactive segments
+
+
+         for (j = 0; j < inactiveNodes.length - 1; j++) {
+           n1 = inactiveNodes[j];
+           n2 = inactiveNodes[j + 1];
+           segment = [n1.loc, n2.loc];
+           inactives.push(segment);
+         } // test
+
+
+         for (j = 0; j < actives.length; j++) {
+           for (k = 0; k < inactives.length; k++) {
+             var p = actives[j];
+             var q = inactives[k];
+             var hit = geoLineIntersection(p, q);
+
+             if (hit) {
+               return true;
+             }
+           }
+         }
+
+         return false;
+       } // Test active (dragged or drawing) segments against inactive segments
+       // This is used to test whether a way intersects with itself.
+
+       function geoHasSelfIntersections(nodes, activeID) {
+         var actives = [];
+         var inactives = [];
+         var j, k; // group active and passive segments along the nodes
+
+         for (j = 0; j < nodes.length - 1; j++) {
+           var n1 = nodes[j];
+           var n2 = nodes[j + 1];
+           var segment = [n1.loc, n2.loc];
+
+           if (n1.id === activeID || n2.id === activeID) {
+             actives.push(segment);
+           } else {
+             inactives.push(segment);
+           }
+         } // test
+
+
+         for (j = 0; j < actives.length; j++) {
+           for (k = 0; k < inactives.length; k++) {
+             var p = actives[j];
+             var q = inactives[k]; // skip if segments share an endpoint
+
+             if (geoVecEqual(p[1], q[0]) || geoVecEqual(p[0], q[1]) || geoVecEqual(p[0], q[0]) || geoVecEqual(p[1], q[1])) {
+               continue;
+             }
+
+             var hit = geoLineIntersection(p, q);
+
+             if (hit) {
+               var epsilon = 1e-8; // skip if the hit is at the segment's endpoint
+
+               if (geoVecEqual(p[1], hit, epsilon) || geoVecEqual(p[0], hit, epsilon) || geoVecEqual(q[1], hit, epsilon) || geoVecEqual(q[0], hit, epsilon)) {
+                 continue;
+               } else {
+                 return true;
+               }
+             }
+           }
+         }
+
+         return false;
+       } // Return the intersection point of 2 line segments.
+       // From https://github.com/pgkelley4/line-segments-intersect
+       // This uses the vector cross product approach described below:
+       //  http://stackoverflow.com/a/565282/786339
+
+       function geoLineIntersection(a, b) {
+         var p = [a[0][0], a[0][1]];
+         var p2 = [a[1][0], a[1][1]];
+         var q = [b[0][0], b[0][1]];
+         var q2 = [b[1][0], b[1][1]];
+         var r = geoVecSubtract(p2, p);
+         var s = geoVecSubtract(q2, q);
+         var uNumerator = geoVecCross(geoVecSubtract(q, p), r);
+         var denominator = geoVecCross(r, s);
+
+         if (uNumerator && denominator) {
+           var u = uNumerator / denominator;
+           var t = geoVecCross(geoVecSubtract(q, p), s) / denominator;
+
+           if (t >= 0 && t <= 1 && u >= 0 && u <= 1) {
+             return geoVecInterp(p, p2, t);
+           }
+         }
+
+         return null;
+       }
+       function geoPathIntersections(path1, path2) {
+         var intersections = [];
+
+         for (var i = 0; i < path1.length - 1; i++) {
+           for (var j = 0; j < path2.length - 1; j++) {
+             var a = [path1[i], path1[i + 1]];
+             var b = [path2[j], path2[j + 1]];
+             var hit = geoLineIntersection(a, b);
+
+             if (hit) {
+               intersections.push(hit);
+             }
+           }
+         }
+
+         return intersections;
+       }
+       function geoPathHasIntersections(path1, path2) {
+         for (var i = 0; i < path1.length - 1; i++) {
+           for (var j = 0; j < path2.length - 1; j++) {
+             var a = [path1[i], path1[i + 1]];
+             var b = [path2[j], path2[j + 1]];
+             var hit = geoLineIntersection(a, b);
+
+             if (hit) {
+               return true;
+             }
+           }
+         }
+
+         return false;
+       } // Return whether point is contained in polygon.
+       //
+       // `point` should be a 2-item array of coordinates.
+       // `polygon` should be an array of 2-item arrays of coordinates.
+       //
+       // From https://github.com/substack/point-in-polygon.
+       // ray-casting algorithm based on
+       // http://www.ecse.rpi.edu/Homepages/wrf/Research/Short_Notes/pnpoly.html
+       //
+
+       function geoPointInPolygon(point, polygon) {
+         var x = point[0];
+         var y = point[1];
+         var inside = false;
+
+         for (var i = 0, j = polygon.length - 1; i < polygon.length; j = i++) {
+           var xi = polygon[i][0];
+           var yi = polygon[i][1];
+           var xj = polygon[j][0];
+           var yj = polygon[j][1];
+           var intersect = yi > y !== yj > y && x < (xj - xi) * (y - yi) / (yj - yi) + xi;
+           if (intersect) inside = !inside;
+         }
+
+         return inside;
+       }
+       function geoPolygonContainsPolygon(outer, inner) {
+         return inner.every(function (point) {
+           return geoPointInPolygon(point, outer);
+         });
+       }
+       function geoPolygonIntersectsPolygon(outer, inner, checkSegments) {
+         function testPoints(outer, inner) {
+           return inner.some(function (point) {
+             return geoPointInPolygon(point, outer);
+           });
+         }
+
+         return testPoints(outer, inner) || !!checkSegments && geoPathHasIntersections(outer, inner);
+       } // http://gis.stackexchange.com/questions/22895/finding-minimum-area-rectangle-for-given-points
+       // http://gis.stackexchange.com/questions/3739/generalisation-strategies-for-building-outlines/3756#3756
+
+       function geoGetSmallestSurroundingRectangle(points) {
+         var hull = d3_polygonHull(points);
+         var centroid = d3_polygonCentroid(hull);
+         var minArea = Infinity;
+         var ssrExtent = [];
+         var ssrAngle = 0;
+         var c1 = hull[0];
+
+         for (var i = 0; i <= hull.length - 1; i++) {
+           var c2 = i === hull.length - 1 ? hull[0] : hull[i + 1];
+           var angle = Math.atan2(c2[1] - c1[1], c2[0] - c1[0]);
+           var poly = geoRotate(hull, -angle, centroid);
+           var extent = poly.reduce(function (extent, point) {
+             return extent.extend(geoExtent(point));
+           }, geoExtent());
+           var area = extent.area();
+
+           if (area < minArea) {
+             minArea = area;
+             ssrExtent = extent;
+             ssrAngle = angle;
+           }
+
+           c1 = c2;
+         }
+
+         return {
+           poly: geoRotate(ssrExtent.polygon(), ssrAngle, centroid),
+           angle: ssrAngle
+         };
+       }
+       function geoPathLength(path) {
+         var length = 0;
+
+         for (var i = 0; i < path.length - 1; i++) {
+           length += geoVecLength(path[i], path[i + 1]);
+         }
+
+         return length;
+       } // If the given point is at the edge of the padded viewport,
+       // return a vector that will nudge the viewport in that direction
+
+       function geoViewportEdge(point, dimensions) {
+         var pad = [80, 20, 50, 20]; // top, right, bottom, left
+
+         var x = 0;
+         var y = 0;
+
+         if (point[0] > dimensions[0] - pad[1]) {
+           x = -10;
+         }
+
+         if (point[0] < pad[3]) {
+           x = 10;
+         }
+
+         if (point[1] > dimensions[1] - pad[2]) {
+           y = -10;
+         }
+
+         if (point[1] < pad[0]) {
+           y = 10;
+         }
+
+         if (x || y) {
+           return [x, y];
+         } else {
+           return null;
+         }
+       }
+
+       var noop = {
+         value: function value() {}
+       };
+
+       function dispatch$8() {
+         for (var i = 0, n = arguments.length, _ = {}, t; i < n; ++i) {
+           if (!(t = arguments[i] + "") || t in _ || /[\s.]/.test(t)) throw new Error("illegal type: " + t);
+           _[t] = [];
+         }
+
+         return new Dispatch(_);
+       }
+
+       function Dispatch(_) {
+         this._ = _;
+       }
+
+       function parseTypenames$1(typenames, types) {
+         return typenames.trim().split(/^|\s+/).map(function (t) {
+           var name = "",
+               i = t.indexOf(".");
+           if (i >= 0) name = t.slice(i + 1), t = t.slice(0, i);
+           if (t && !types.hasOwnProperty(t)) throw new Error("unknown type: " + t);
+           return {
+             type: t,
+             name: name
+           };
+         });
+       }
+
+       Dispatch.prototype = dispatch$8.prototype = {
+         constructor: Dispatch,
+         on: function on(typename, callback) {
+           var _ = this._,
+               T = parseTypenames$1(typename + "", _),
+               t,
+               i = -1,
+               n = T.length; // If no callback was specified, return the callback of the given type and name.
+
+           if (arguments.length < 2) {
+             while (++i < n) {
+               if ((t = (typename = T[i]).type) && (t = get$2(_[t], typename.name))) return t;
+             }
+
+             return;
+           } // If a type was specified, set the callback for the given type and name.
+           // Otherwise, if a null callback was specified, remove callbacks of the given name.
+
+
+           if (callback != null && typeof callback !== "function") throw new Error("invalid callback: " + callback);
+
+           while (++i < n) {
+             if (t = (typename = T[i]).type) _[t] = set$1(_[t], typename.name, callback);else if (callback == null) for (t in _) {
+               _[t] = set$1(_[t], typename.name, null);
+             }
+           }
+
+           return this;
+         },
+         copy: function copy() {
+           var copy = {},
+               _ = this._;
+
+           for (var t in _) {
+             copy[t] = _[t].slice();
+           }
+
+           return new Dispatch(copy);
+         },
+         call: function call(type, that) {
+           if ((n = arguments.length - 2) > 0) for (var args = new Array(n), i = 0, n, t; i < n; ++i) {
+             args[i] = arguments[i + 2];
+           }
+           if (!this._.hasOwnProperty(type)) throw new Error("unknown type: " + type);
+
+           for (t = this._[type], i = 0, n = t.length; i < n; ++i) {
+             t[i].value.apply(that, args);
+           }
+         },
+         apply: function apply(type, that, args) {
+           if (!this._.hasOwnProperty(type)) throw new Error("unknown type: " + type);
+
+           for (var t = this._[type], i = 0, n = t.length; i < n; ++i) {
+             t[i].value.apply(that, args);
+           }
+         }
+       };
+
+       function get$2(type, name) {
+         for (var i = 0, n = type.length, c; i < n; ++i) {
+           if ((c = type[i]).name === name) {
+             return c.value;
+           }
+         }
+       }
+
+       function set$1(type, name, callback) {
+         for (var i = 0, n = type.length; i < n; ++i) {
+           if (type[i].name === name) {
+             type[i] = noop, type = type.slice(0, i).concat(type.slice(i + 1));
+             break;
+           }
+         }
+
+         if (callback != null) type.push({
+           name: name,
+           value: callback
+         });
+         return type;
+       }
+
+       var xhtml = "http://www.w3.org/1999/xhtml";
+       var namespaces = {
+         svg: "http://www.w3.org/2000/svg",
+         xhtml: xhtml,
+         xlink: "http://www.w3.org/1999/xlink",
+         xml: "http://www.w3.org/XML/1998/namespace",
+         xmlns: "http://www.w3.org/2000/xmlns/"
+       };
+
+       function namespace (name) {
+         var prefix = name += "",
+             i = prefix.indexOf(":");
+         if (i >= 0 && (prefix = name.slice(0, i)) !== "xmlns") name = name.slice(i + 1);
+         return namespaces.hasOwnProperty(prefix) ? {
+           space: namespaces[prefix],
+           local: name
+         } : name; // eslint-disable-line no-prototype-builtins
+       }
+
+       function creatorInherit(name) {
+         return function () {
+           var document = this.ownerDocument,
+               uri = this.namespaceURI;
+           return uri === xhtml && document.documentElement.namespaceURI === xhtml ? document.createElement(name) : document.createElementNS(uri, name);
+         };
+       }
+
+       function creatorFixed(fullname) {
+         return function () {
+           return this.ownerDocument.createElementNS(fullname.space, fullname.local);
+         };
+       }
+
+       function creator (name) {
+         var fullname = namespace(name);
+         return (fullname.local ? creatorFixed : creatorInherit)(fullname);
+       }
+
+       function none() {}
+
+       function selector (selector) {
+         return selector == null ? none : function () {
+           return this.querySelector(selector);
+         };
+       }
+
+       function selection_select (select) {
+         if (typeof select !== "function") select = selector(select);
+
+         for (var groups = this._groups, m = groups.length, subgroups = new Array(m), j = 0; j < m; ++j) {
+           for (var group = groups[j], n = group.length, subgroup = subgroups[j] = new Array(n), node, subnode, i = 0; i < n; ++i) {
+             if ((node = group[i]) && (subnode = select.call(node, node.__data__, i, group))) {
+               if ("__data__" in node) subnode.__data__ = node.__data__;
+               subgroup[i] = subnode;
+             }
+           }
+         }
+
+         return new Selection$1(subgroups, this._parents);
+       }
+
+       function array (x) {
+         return _typeof(x) === "object" && "length" in x ? x // Array, TypedArray, NodeList, array-like
+         : Array.from(x); // Map, Set, iterable, string, or anything else
+       }
+
+       function empty() {
+         return [];
+       }
+
+       function selectorAll (selector) {
+         return selector == null ? empty : function () {
+           return this.querySelectorAll(selector);
+         };
+       }
+
+       function arrayAll(select) {
+         return function () {
+           var group = select.apply(this, arguments);
+           return group == null ? [] : array(group);
+         };
+       }
+
+       function selection_selectAll (select) {
+         if (typeof select === "function") select = arrayAll(select);else select = selectorAll(select);
+
+         for (var groups = this._groups, m = groups.length, subgroups = [], parents = [], j = 0; j < m; ++j) {
+           for (var group = groups[j], n = group.length, node, i = 0; i < n; ++i) {
+             if (node = group[i]) {
+               subgroups.push(select.call(node, node.__data__, i, group));
+               parents.push(node);
+             }
+           }
+         }
+
+         return new Selection$1(subgroups, parents);
+       }
+
+       var $$u = _export;
+       var $find = arrayIteration.find;
+       var addToUnscopables$3 = addToUnscopables$6;
+
+       var FIND = 'find';
+       var SKIPS_HOLES$1 = true;
+
+       // Shouldn't skip holes
+       if (FIND in []) Array(1)[FIND](function () { SKIPS_HOLES$1 = false; });
+
+       // `Array.prototype.find` method
+       // https://tc39.es/ecma262/#sec-array.prototype.find
+       $$u({ target: 'Array', proto: true, forced: SKIPS_HOLES$1 }, {
+         find: function find(callbackfn /* , that = undefined */) {
+           return $find(this, callbackfn, arguments.length > 1 ? arguments[1] : undefined);
+         }
+       });
+
+       // https://tc39.es/ecma262/#sec-array.prototype-@@unscopables
+       addToUnscopables$3(FIND);
+
+       function matcher (selector) {
+         return function () {
+           return this.matches(selector);
+         };
+       }
+       function childMatcher(selector) {
+         return function (node) {
+           return node.matches(selector);
+         };
+       }
+
+       var find = Array.prototype.find;
+
+       function childFind(match) {
+         return function () {
+           return find.call(this.children, match);
+         };
+       }
+
+       function childFirst() {
+         return this.firstElementChild;
+       }
+
+       function selection_selectChild (match) {
+         return this.select(match == null ? childFirst : childFind(typeof match === "function" ? match : childMatcher(match)));
+       }
+
+       var filter = Array.prototype.filter;
+
+       function children() {
+         return this.children;
+       }
+
+       function childrenFilter(match) {
+         return function () {
+           return filter.call(this.children, match);
+         };
+       }
+
+       function selection_selectChildren (match) {
+         return this.selectAll(match == null ? children : childrenFilter(typeof match === "function" ? match : childMatcher(match)));
+       }
+
+       function selection_filter (match) {
+         if (typeof match !== "function") match = matcher(match);
+
+         for (var groups = this._groups, m = groups.length, subgroups = new Array(m), j = 0; j < m; ++j) {
+           for (var group = groups[j], n = group.length, subgroup = subgroups[j] = [], node, i = 0; i < n; ++i) {
+             if ((node = group[i]) && match.call(node, node.__data__, i, group)) {
+               subgroup.push(node);
+             }
+           }
+         }
+
+         return new Selection$1(subgroups, this._parents);
+       }
+
+       function sparse (update) {
+         return new Array(update.length);
+       }
+
+       function selection_enter () {
+         return new Selection$1(this._enter || this._groups.map(sparse), this._parents);
+       }
+       function EnterNode(parent, datum) {
+         this.ownerDocument = parent.ownerDocument;
+         this.namespaceURI = parent.namespaceURI;
+         this._next = null;
+         this._parent = parent;
+         this.__data__ = datum;
+       }
+       EnterNode.prototype = {
+         constructor: EnterNode,
+         appendChild: function appendChild(child) {
+           return this._parent.insertBefore(child, this._next);
+         },
+         insertBefore: function insertBefore(child, next) {
+           return this._parent.insertBefore(child, next);
+         },
+         querySelector: function querySelector(selector) {
+           return this._parent.querySelector(selector);
+         },
+         querySelectorAll: function querySelectorAll(selector) {
+           return this._parent.querySelectorAll(selector);
+         }
+       };
+
+       function constant$3 (x) {
+         return function () {
+           return x;
+         };
+       }
+
+       function bindIndex(parent, group, enter, update, exit, data) {
+         var i = 0,
+             node,
+             groupLength = group.length,
+             dataLength = data.length; // Put any non-null nodes that fit into update.
+         // Put any null nodes into enter.
+         // Put any remaining data into enter.
+
+         for (; i < dataLength; ++i) {
+           if (node = group[i]) {
+             node.__data__ = data[i];
+             update[i] = node;
+           } else {
+             enter[i] = new EnterNode(parent, data[i]);
+           }
+         } // Put any non-null nodes that don’t fit into exit.
+
+
+         for (; i < groupLength; ++i) {
+           if (node = group[i]) {
+             exit[i] = node;
+           }
+         }
+       }
+
+       function bindKey(parent, group, enter, update, exit, data, key) {
+         var i,
+             node,
+             nodeByKeyValue = new Map(),
+             groupLength = group.length,
+             dataLength = data.length,
+             keyValues = new Array(groupLength),
+             keyValue; // Compute the key for each node.
+         // If multiple nodes have the same key, the duplicates are added to exit.
+
+         for (i = 0; i < groupLength; ++i) {
+           if (node = group[i]) {
+             keyValues[i] = keyValue = key.call(node, node.__data__, i, group) + "";
+
+             if (nodeByKeyValue.has(keyValue)) {
+               exit[i] = node;
+             } else {
+               nodeByKeyValue.set(keyValue, node);
+             }
+           }
+         } // Compute the key for each datum.
+         // If there a node associated with this key, join and add it to update.
+         // If there is not (or the key is a duplicate), add it to enter.
+
+
+         for (i = 0; i < dataLength; ++i) {
+           keyValue = key.call(parent, data[i], i, data) + "";
+
+           if (node = nodeByKeyValue.get(keyValue)) {
+             update[i] = node;
+             node.__data__ = data[i];
+             nodeByKeyValue["delete"](keyValue);
+           } else {
+             enter[i] = new EnterNode(parent, data[i]);
+           }
+         } // Add any remaining nodes that were not bound to data to exit.
+
+
+         for (i = 0; i < groupLength; ++i) {
+           if ((node = group[i]) && nodeByKeyValue.get(keyValues[i]) === node) {
+             exit[i] = node;
+           }
+         }
+       }
+
+       function datum(node) {
+         return node.__data__;
+       }
+
+       function selection_data (value, key) {
+         if (!arguments.length) return Array.from(this, datum);
+         var bind = key ? bindKey : bindIndex,
+             parents = this._parents,
+             groups = this._groups;
+         if (typeof value !== "function") value = constant$3(value);
+
+         for (var m = groups.length, update = new Array(m), enter = new Array(m), exit = new Array(m), j = 0; j < m; ++j) {
+           var parent = parents[j],
+               group = groups[j],
+               groupLength = group.length,
+               data = array(value.call(parent, parent && parent.__data__, j, parents)),
+               dataLength = data.length,
+               enterGroup = enter[j] = new Array(dataLength),
+               updateGroup = update[j] = new Array(dataLength),
+               exitGroup = exit[j] = new Array(groupLength);
+           bind(parent, group, enterGroup, updateGroup, exitGroup, data, key); // Now connect the enter nodes to their following update node, such that
+           // appendChild can insert the materialized enter node before this node,
+           // rather than at the end of the parent node.
+
+           for (var i0 = 0, i1 = 0, previous, next; i0 < dataLength; ++i0) {
+             if (previous = enterGroup[i0]) {
+               if (i0 >= i1) i1 = i0 + 1;
+
+               while (!(next = updateGroup[i1]) && ++i1 < dataLength) {
+               }
+
+               previous._next = next || null;
+             }
+           }
+         }
+
+         update = new Selection$1(update, parents);
+         update._enter = enter;
+         update._exit = exit;
+         return update;
+       }
+
+       function selection_exit () {
+         return new Selection$1(this._exit || this._groups.map(sparse), this._parents);
+       }
+
+       function selection_join (onenter, onupdate, onexit) {
+         var enter = this.enter(),
+             update = this,
+             exit = this.exit();
+         enter = typeof onenter === "function" ? onenter(enter) : enter.append(onenter + "");
+         if (onupdate != null) update = onupdate(update);
+         if (onexit == null) exit.remove();else onexit(exit);
+         return enter && update ? enter.merge(update).order() : update;
+       }
+
+       function selection_merge (selection) {
+         if (!(selection instanceof Selection$1)) throw new Error("invalid merge");
+
+         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) {
+           for (var group0 = groups0[j], group1 = groups1[j], n = group0.length, merge = merges[j] = new Array(n), node, i = 0; i < n; ++i) {
+             if (node = group0[i] || group1[i]) {
+               merge[i] = node;
+             }
+           }
+         }
+
+         for (; j < m0; ++j) {
+           merges[j] = groups0[j];
+         }
+
+         return new Selection$1(merges, this._parents);
+       }
+
+       function selection_order () {
+         for (var groups = this._groups, j = -1, m = groups.length; ++j < m;) {
+           for (var group = groups[j], i = group.length - 1, next = group[i], node; --i >= 0;) {
+             if (node = group[i]) {
+               if (next && node.compareDocumentPosition(next) ^ 4) next.parentNode.insertBefore(node, next);
+               next = node;
+             }
+           }
+         }
+
+         return this;
+       }
+
+       function selection_sort (compare) {
+         if (!compare) compare = ascending;
+
+         function compareNode(a, b) {
+           return a && b ? compare(a.__data__, b.__data__) : !a - !b;
+         }
+
+         for (var groups = this._groups, m = groups.length, sortgroups = new Array(m), j = 0; j < m; ++j) {
+           for (var group = groups[j], n = group.length, sortgroup = sortgroups[j] = new Array(n), node, i = 0; i < n; ++i) {
+             if (node = group[i]) {
+               sortgroup[i] = node;
+             }
+           }
+
+           sortgroup.sort(compareNode);
+         }
+
+         return new Selection$1(sortgroups, this._parents).order();
+       }
+
+       function ascending(a, b) {
+         return a < b ? -1 : a > b ? 1 : a >= b ? 0 : NaN;
+       }
+
+       function selection_call () {
+         var callback = arguments[0];
+         arguments[0] = this;
+         callback.apply(null, arguments);
+         return this;
+       }
+
+       function selection_nodes () {
+         return Array.from(this);
+       }
+
+       function selection_node () {
+         for (var groups = this._groups, j = 0, m = groups.length; j < m; ++j) {
+           for (var group = groups[j], i = 0, n = group.length; i < n; ++i) {
+             var node = group[i];
+             if (node) return node;
+           }
+         }
+
+         return null;
+       }
+
+       function selection_size () {
+         var size = 0;
+
+         var _iterator = _createForOfIteratorHelper(this),
+             _step;
+
+         try {
+           for (_iterator.s(); !(_step = _iterator.n()).done;) {
+             var node = _step.value;
+             ++size;
+           } // eslint-disable-line no-unused-vars
+
+         } catch (err) {
+           _iterator.e(err);
+         } finally {
+           _iterator.f();
+         }
+
+         return size;
+       }
+
+       function selection_empty () {
+         return !this.node();
+       }
+
+       function selection_each (callback) {
+         for (var groups = this._groups, j = 0, m = groups.length; j < m; ++j) {
+           for (var group = groups[j], i = 0, n = group.length, node; i < n; ++i) {
+             if (node = group[i]) callback.call(node, node.__data__, i, group);
+           }
+         }
+
+         return this;
+       }
+
+       function attrRemove$1(name) {
+         return function () {
+           this.removeAttribute(name);
+         };
+       }
+
+       function attrRemoveNS$1(fullname) {
+         return function () {
+           this.removeAttributeNS(fullname.space, fullname.local);
+         };
+       }
+
+       function attrConstant$1(name, value) {
+         return function () {
+           this.setAttribute(name, value);
+         };
+       }
+
+       function attrConstantNS$1(fullname, value) {
+         return function () {
+           this.setAttributeNS(fullname.space, fullname.local, value);
+         };
+       }
+
+       function attrFunction$1(name, value) {
+         return function () {
+           var v = value.apply(this, arguments);
+           if (v == null) this.removeAttribute(name);else this.setAttribute(name, v);
+         };
+       }
+
+       function attrFunctionNS$1(fullname, value) {
+         return function () {
+           var v = value.apply(this, arguments);
+           if (v == null) this.removeAttributeNS(fullname.space, fullname.local);else this.setAttributeNS(fullname.space, fullname.local, v);
+         };
+       }
+
+       function selection_attr (name, value) {
+         var fullname = namespace(name);
+
+         if (arguments.length < 2) {
+           var node = this.node();
+           return fullname.local ? node.getAttributeNS(fullname.space, fullname.local) : node.getAttribute(fullname);
+         }
+
+         return this.each((value == null ? fullname.local ? attrRemoveNS$1 : attrRemove$1 : typeof value === "function" ? fullname.local ? attrFunctionNS$1 : attrFunction$1 : fullname.local ? attrConstantNS$1 : attrConstant$1)(fullname, value));
+       }
+
+       function defaultView (node) {
+         return node.ownerDocument && node.ownerDocument.defaultView // node is a Node
+         || node.document && node // node is a Window
+         || node.defaultView; // node is a Document
+       }
+
+       function styleRemove$1(name) {
+         return function () {
+           this.style.removeProperty(name);
+         };
+       }
+
+       function styleConstant$1(name, value, priority) {
+         return function () {
+           this.style.setProperty(name, value, priority);
+         };
+       }
+
+       function styleFunction$1(name, value, priority) {
+         return function () {
+           var v = value.apply(this, arguments);
+           if (v == null) this.style.removeProperty(name);else this.style.setProperty(name, v, priority);
+         };
+       }
+
+       function selection_style (name, value, priority) {
+         return arguments.length > 1 ? this.each((value == null ? styleRemove$1 : typeof value === "function" ? styleFunction$1 : styleConstant$1)(name, value, priority == null ? "" : priority)) : styleValue(this.node(), name);
+       }
+       function styleValue(node, name) {
+         return node.style.getPropertyValue(name) || defaultView(node).getComputedStyle(node, null).getPropertyValue(name);
+       }
+
+       function propertyRemove(name) {
+         return function () {
+           delete this[name];
+         };
+       }
+
+       function propertyConstant(name, value) {
+         return function () {
+           this[name] = value;
+         };
+       }
+
+       function propertyFunction(name, value) {
+         return function () {
+           var v = value.apply(this, arguments);
+           if (v == null) delete this[name];else this[name] = v;
+         };
+       }
+
+       function selection_property (name, value) {
+         return arguments.length > 1 ? this.each((value == null ? propertyRemove : typeof value === "function" ? propertyFunction : propertyConstant)(name, value)) : this.node()[name];
+       }
+
+       function classArray(string) {
+         return string.trim().split(/^|\s+/);
+       }
+
+       function classList(node) {
+         return node.classList || new ClassList(node);
+       }
+
+       function ClassList(node) {
+         this._node = node;
+         this._names = classArray(node.getAttribute("class") || "");
+       }
+
+       ClassList.prototype = {
+         add: function add(name) {
+           var i = this._names.indexOf(name);
+
+           if (i < 0) {
+             this._names.push(name);
+
+             this._node.setAttribute("class", this._names.join(" "));
+           }
+         },
+         remove: function remove(name) {
+           var i = this._names.indexOf(name);
+
+           if (i >= 0) {
+             this._names.splice(i, 1);
+
+             this._node.setAttribute("class", this._names.join(" "));
+           }
+         },
+         contains: function contains(name) {
+           return this._names.indexOf(name) >= 0;
+         }
+       };
+
+       function classedAdd(node, names) {
+         var list = classList(node),
+             i = -1,
+             n = names.length;
+
+         while (++i < n) {
+           list.add(names[i]);
+         }
+       }
+
+       function classedRemove(node, names) {
+         var list = classList(node),
+             i = -1,
+             n = names.length;
+
+         while (++i < n) {
+           list.remove(names[i]);
+         }
+       }
+
+       function classedTrue(names) {
+         return function () {
+           classedAdd(this, names);
+         };
+       }
+
+       function classedFalse(names) {
+         return function () {
+           classedRemove(this, names);
+         };
+       }
+
+       function classedFunction(names, value) {
+         return function () {
+           (value.apply(this, arguments) ? classedAdd : classedRemove)(this, names);
+         };
+       }
+
+       function selection_classed (name, value) {
+         var names = classArray(name + "");
+
+         if (arguments.length < 2) {
+           var list = classList(this.node()),
+               i = -1,
+               n = names.length;
+
+           while (++i < n) {
+             if (!list.contains(names[i])) return false;
+           }
+
+           return true;
+         }
+
+         return this.each((typeof value === "function" ? classedFunction : value ? classedTrue : classedFalse)(names, value));
+       }
+
+       function textRemove() {
+         this.textContent = "";
+       }
+
+       function textConstant$1(value) {
+         return function () {
+           this.textContent = value;
+         };
+       }
+
+       function textFunction$1(value) {
+         return function () {
+           var v = value.apply(this, arguments);
+           this.textContent = v == null ? "" : v;
+         };
+       }
+
+       function selection_text (value) {
+         return arguments.length ? this.each(value == null ? textRemove : (typeof value === "function" ? textFunction$1 : textConstant$1)(value)) : this.node().textContent;
+       }
+
+       function htmlRemove() {
+         this.innerHTML = "";
+       }
+
+       function htmlConstant(value) {
+         return function () {
+           this.innerHTML = value;
+         };
+       }
+
+       function htmlFunction(value) {
+         return function () {
+           var v = value.apply(this, arguments);
+           this.innerHTML = v == null ? "" : v;
+         };
+       }
+
+       function selection_html (value) {
+         return arguments.length ? this.each(value == null ? htmlRemove : (typeof value === "function" ? htmlFunction : htmlConstant)(value)) : this.node().innerHTML;
+       }
+
+       function raise() {
+         if (this.nextSibling) this.parentNode.appendChild(this);
+       }
+
+       function selection_raise () {
+         return this.each(raise);
+       }
+
+       function lower() {
+         if (this.previousSibling) this.parentNode.insertBefore(this, this.parentNode.firstChild);
+       }
+
+       function selection_lower () {
+         return this.each(lower);
+       }
+
+       function selection_append (name) {
+         var create = typeof name === "function" ? name : creator(name);
+         return this.select(function () {
+           return this.appendChild(create.apply(this, arguments));
+         });
+       }
+
+       function constantNull() {
+         return null;
+       }
+
+       function selection_insert (name, before) {
+         var create = typeof name === "function" ? name : creator(name),
+             select = before == null ? constantNull : typeof before === "function" ? before : selector(before);
+         return this.select(function () {
+           return this.insertBefore(create.apply(this, arguments), select.apply(this, arguments) || null);
+         });
+       }
+
+       function remove$7() {
+         var parent = this.parentNode;
+         if (parent) parent.removeChild(this);
+       }
+
+       function selection_remove () {
+         return this.each(remove$7);
+       }
+
+       function selection_cloneShallow() {
+         var clone = this.cloneNode(false),
+             parent = this.parentNode;
+         return parent ? parent.insertBefore(clone, this.nextSibling) : clone;
+       }
+
+       function selection_cloneDeep() {
+         var clone = this.cloneNode(true),
+             parent = this.parentNode;
+         return parent ? parent.insertBefore(clone, this.nextSibling) : clone;
+       }
+
+       function selection_clone (deep) {
+         return this.select(deep ? selection_cloneDeep : selection_cloneShallow);
+       }
+
+       function selection_datum (value) {
+         return arguments.length ? this.property("__data__", value) : this.node().__data__;
+       }
+
+       function contextListener(listener) {
+         return function (event) {
+           listener.call(this, event, this.__data__);
+         };
+       }
+
+       function parseTypenames(typenames) {
+         return typenames.trim().split(/^|\s+/).map(function (t) {
+           var name = "",
+               i = t.indexOf(".");
+           if (i >= 0) name = t.slice(i + 1), t = t.slice(0, i);
+           return {
+             type: t,
+             name: name
+           };
+         });
+       }
+
+       function onRemove(typename) {
+         return function () {
+           var on = this.__on;
+           if (!on) return;
+
+           for (var j = 0, i = -1, m = on.length, o; j < m; ++j) {
+             if (o = on[j], (!typename.type || o.type === typename.type) && o.name === typename.name) {
+               this.removeEventListener(o.type, o.listener, o.options);
+             } else {
+               on[++i] = o;
+             }
+           }
+
+           if (++i) on.length = i;else delete this.__on;
+         };
+       }
+
+       function onAdd(typename, value, options) {
+         return function () {
+           var on = this.__on,
+               o,
+               listener = contextListener(value);
+           if (on) for (var j = 0, m = on.length; j < m; ++j) {
+             if ((o = on[j]).type === typename.type && o.name === typename.name) {
+               this.removeEventListener(o.type, o.listener, o.options);
+               this.addEventListener(o.type, o.listener = listener, o.options = options);
+               o.value = value;
+               return;
+             }
+           }
+           this.addEventListener(typename.type, listener, options);
+           o = {
+             type: typename.type,
+             name: typename.name,
+             value: value,
+             listener: listener,
+             options: options
+           };
+           if (!on) this.__on = [o];else on.push(o);
+         };
+       }
+
+       function selection_on (typename, value, options) {
+         var typenames = parseTypenames(typename + ""),
+             i,
+             n = typenames.length,
+             t;
+
+         if (arguments.length < 2) {
+           var on = this.node().__on;
+
+           if (on) for (var j = 0, m = on.length, o; j < m; ++j) {
+             for (i = 0, o = on[j]; i < n; ++i) {
+               if ((t = typenames[i]).type === o.type && t.name === o.name) {
+                 return o.value;
+               }
+             }
+           }
+           return;
+         }
+
+         on = value ? onAdd : onRemove;
+
+         for (i = 0; i < n; ++i) {
+           this.each(on(typenames[i], value, options));
+         }
+
+         return this;
+       }
+
+       function dispatchEvent(node, type, params) {
+         var window = defaultView(node),
+             event = window.CustomEvent;
+
+         if (typeof event === "function") {
+           event = new event(type, params);
+         } else {
+           event = window.document.createEvent("Event");
+           if (params) event.initEvent(type, params.bubbles, params.cancelable), event.detail = params.detail;else event.initEvent(type, false, false);
+         }
+
+         node.dispatchEvent(event);
+       }
+
+       function dispatchConstant(type, params) {
+         return function () {
+           return dispatchEvent(this, type, params);
+         };
+       }
+
+       function dispatchFunction(type, params) {
+         return function () {
+           return dispatchEvent(this, type, params.apply(this, arguments));
+         };
+       }
+
+       function selection_dispatch (type, params) {
+         return this.each((typeof params === "function" ? dispatchFunction : dispatchConstant)(type, params));
+       }
+
+       var _marked$1 = /*#__PURE__*/regeneratorRuntime.mark(_callee);
+
+       function _callee() {
+         var groups, j, m, group, i, n, node;
+         return regeneratorRuntime.wrap(function _callee$(_context) {
+           while (1) {
+             switch (_context.prev = _context.next) {
+               case 0:
+                 groups = this._groups, j = 0, m = groups.length;
+
+               case 1:
+                 if (!(j < m)) {
+                   _context.next = 13;
+                   break;
+                 }
+
+                 group = groups[j], i = 0, n = group.length;
+
+               case 3:
+                 if (!(i < n)) {
+                   _context.next = 10;
+                   break;
+                 }
+
+                 if (!(node = group[i])) {
+                   _context.next = 7;
+                   break;
+                 }
+
+                 _context.next = 7;
+                 return node;
+
+               case 7:
+                 ++i;
+                 _context.next = 3;
+                 break;
+
+               case 10:
+                 ++j;
+                 _context.next = 1;
+                 break;
+
+               case 13:
+               case "end":
+                 return _context.stop();
+             }
+           }
+         }, _marked$1, this);
+       }
+
+       var root$1 = [null];
+       function Selection$1(groups, parents) {
+         this._groups = groups;
+         this._parents = parents;
+       }
+
+       function selection() {
+         return new Selection$1([[document.documentElement]], root$1);
+       }
+
+       function selection_selection() {
+         return this;
+       }
+
+       Selection$1.prototype = selection.prototype = _defineProperty({
+         constructor: Selection$1,
+         select: selection_select,
+         selectAll: selection_selectAll,
+         selectChild: selection_selectChild,
+         selectChildren: selection_selectChildren,
+         filter: selection_filter,
+         data: selection_data,
+         enter: selection_enter,
+         exit: selection_exit,
+         join: selection_join,
+         merge: selection_merge,
+         selection: selection_selection,
+         order: selection_order,
+         sort: selection_sort,
+         call: selection_call,
+         nodes: selection_nodes,
+         node: selection_node,
+         size: selection_size,
+         empty: selection_empty,
+         each: selection_each,
+         attr: selection_attr,
+         style: selection_style,
+         property: selection_property,
+         classed: selection_classed,
+         text: selection_text,
+         html: selection_html,
+         raise: selection_raise,
+         lower: selection_lower,
+         append: selection_append,
+         insert: selection_insert,
+         remove: selection_remove,
+         clone: selection_clone,
+         datum: selection_datum,
+         on: selection_on,
+         dispatch: selection_dispatch
+       }, Symbol.iterator, _callee);
+
+       function select (selector) {
+         return typeof selector === "string" ? new Selection$1([[document.querySelector(selector)]], [document.documentElement]) : new Selection$1([[selector]], root$1);
+       }
+
+       function sourceEvent (event) {
+         var sourceEvent;
+
+         while (sourceEvent = event.sourceEvent) {
+           event = sourceEvent;
+         }
+
+         return event;
+       }
+
+       function pointer (event, node) {
+         event = sourceEvent(event);
+         if (node === undefined) node = event.currentTarget;
+
+         if (node) {
+           var svg = node.ownerSVGElement || node;
+
+           if (svg.createSVGPoint) {
+             var point = svg.createSVGPoint();
+             point.x = event.clientX, point.y = event.clientY;
+             point = point.matrixTransform(node.getScreenCTM().inverse());
+             return [point.x, point.y];
+           }
+
+           if (node.getBoundingClientRect) {
+             var rect = node.getBoundingClientRect();
+             return [event.clientX - rect.left - node.clientLeft, event.clientY - rect.top - node.clientTop];
+           }
+         }
+
+         return [event.pageX, event.pageY];
+       }
+
+       function selectAll (selector) {
+         return typeof selector === "string" ? new Selection$1([document.querySelectorAll(selector)], [document.documentElement]) : new Selection$1([selector == null ? [] : array(selector)], root$1);
+       }
+
+       function nopropagation$1(event) {
+         event.stopImmediatePropagation();
+       }
+       function noevent$1 (event) {
+         event.preventDefault();
+         event.stopImmediatePropagation();
+       }
+
+       function dragDisable (view) {
+         var root = view.document.documentElement,
+             selection = select(view).on("dragstart.drag", noevent$1, true);
+
+         if ("onselectstart" in root) {
+           selection.on("selectstart.drag", noevent$1, true);
+         } else {
+           root.__noselect = root.style.MozUserSelect;
+           root.style.MozUserSelect = "none";
+         }
+       }
+       function yesdrag(view, noclick) {
+         var root = view.document.documentElement,
+             selection = select(view).on("dragstart.drag", null);
+
+         if (noclick) {
+           selection.on("click.drag", noevent$1, true);
+           setTimeout(function () {
+             selection.on("click.drag", null);
+           }, 0);
+         }
+
+         if ("onselectstart" in root) {
+           selection.on("selectstart.drag", null);
+         } else {
+           root.style.MozUserSelect = root.__noselect;
+           delete root.__noselect;
+         }
+       }
+
+       var constant$2 = (function (x) {
+         return function () {
+           return x;
+         };
+       });
+
+       function DragEvent(type, _ref) {
+         var sourceEvent = _ref.sourceEvent,
+             subject = _ref.subject,
+             target = _ref.target,
+             identifier = _ref.identifier,
+             active = _ref.active,
+             x = _ref.x,
+             y = _ref.y,
+             dx = _ref.dx,
+             dy = _ref.dy,
+             dispatch = _ref.dispatch;
+         Object.defineProperties(this, {
+           type: {
+             value: type,
+             enumerable: true,
+             configurable: true
+           },
+           sourceEvent: {
+             value: sourceEvent,
+             enumerable: true,
+             configurable: true
+           },
+           subject: {
+             value: subject,
+             enumerable: true,
+             configurable: true
+           },
+           target: {
+             value: target,
+             enumerable: true,
+             configurable: true
+           },
+           identifier: {
+             value: identifier,
+             enumerable: true,
+             configurable: true
+           },
+           active: {
+             value: active,
+             enumerable: true,
+             configurable: true
+           },
+           x: {
+             value: x,
+             enumerable: true,
+             configurable: true
+           },
+           y: {
+             value: y,
+             enumerable: true,
+             configurable: true
+           },
+           dx: {
+             value: dx,
+             enumerable: true,
+             configurable: true
+           },
+           dy: {
+             value: dy,
+             enumerable: true,
+             configurable: true
+           },
+           _: {
+             value: dispatch
+           }
+         });
+       }
+
+       DragEvent.prototype.on = function () {
+         var value = this._.on.apply(this._, arguments);
+
+         return value === this._ ? this : value;
+       };
+
+       function defaultFilter$2(event) {
+         return !event.ctrlKey && !event.button;
+       }
+
+       function defaultContainer() {
+         return this.parentNode;
+       }
+
+       function defaultSubject(event, d) {
+         return d == null ? {
+           x: event.x,
+           y: event.y
+         } : d;
+       }
+
+       function defaultTouchable$1() {
+         return navigator.maxTouchPoints || "ontouchstart" in this;
+       }
+
+       function d3_drag () {
+         var filter = defaultFilter$2,
+             container = defaultContainer,
+             subject = defaultSubject,
+             touchable = defaultTouchable$1,
+             gestures = {},
+             listeners = dispatch$8("start", "drag", "end"),
+             active = 0,
+             mousedownx,
+             mousedowny,
+             mousemoving,
+             touchending,
+             clickDistance2 = 0;
+
+         function drag(selection) {
+           selection.on("mousedown.drag", mousedowned).filter(touchable).on("touchstart.drag", touchstarted).on("touchmove.drag", touchmoved).on("touchend.drag touchcancel.drag", touchended).style("touch-action", "none").style("-webkit-tap-highlight-color", "rgba(0,0,0,0)");
+         }
+
+         function mousedowned(event, d) {
+           if (touchending || !filter.call(this, event, d)) return;
+           var gesture = beforestart(this, container.call(this, event, d), event, d, "mouse");
+           if (!gesture) return;
+           select(event.view).on("mousemove.drag", mousemoved, true).on("mouseup.drag", mouseupped, true);
+           dragDisable(event.view);
+           nopropagation$1(event);
+           mousemoving = false;
+           mousedownx = event.clientX;
+           mousedowny = event.clientY;
+           gesture("start", event);
+         }
+
+         function mousemoved(event) {
+           noevent$1(event);
+
+           if (!mousemoving) {
+             var dx = event.clientX - mousedownx,
+                 dy = event.clientY - mousedowny;
+             mousemoving = dx * dx + dy * dy > clickDistance2;
+           }
+
+           gestures.mouse("drag", event);
+         }
+
+         function mouseupped(event) {
+           select(event.view).on("mousemove.drag mouseup.drag", null);
+           yesdrag(event.view, mousemoving);
+           noevent$1(event);
+           gestures.mouse("end", event);
+         }
+
+         function touchstarted(event, d) {
+           if (!filter.call(this, event, d)) return;
+           var touches = event.changedTouches,
+               c = container.call(this, event, d),
+               n = touches.length,
+               i,
+               gesture;
+
+           for (i = 0; i < n; ++i) {
+             if (gesture = beforestart(this, c, event, d, touches[i].identifier, touches[i])) {
+               nopropagation$1(event);
+               gesture("start", event, touches[i]);
+             }
+           }
+         }
+
+         function touchmoved(event) {
+           var touches = event.changedTouches,
+               n = touches.length,
+               i,
+               gesture;
+
+           for (i = 0; i < n; ++i) {
+             if (gesture = gestures[touches[i].identifier]) {
+               noevent$1(event);
+               gesture("drag", event, touches[i]);
+             }
+           }
+         }
+
+         function touchended(event) {
+           var touches = event.changedTouches,
+               n = touches.length,
+               i,
+               gesture;
+           if (touchending) clearTimeout(touchending);
+           touchending = setTimeout(function () {
+             touchending = null;
+           }, 500); // Ghost clicks are delayed!
+
+           for (i = 0; i < n; ++i) {
+             if (gesture = gestures[touches[i].identifier]) {
+               nopropagation$1(event);
+               gesture("end", event, touches[i]);
+             }
+           }
+         }
+
+         function beforestart(that, container, event, d, identifier, touch) {
+           var dispatch = listeners.copy(),
+               p = pointer(touch || event, container),
+               dx,
+               dy,
+               s;
+           if ((s = subject.call(that, new DragEvent("beforestart", {
+             sourceEvent: event,
+             target: drag,
+             identifier: identifier,
+             active: active,
+             x: p[0],
+             y: p[1],
+             dx: 0,
+             dy: 0,
+             dispatch: dispatch
+           }), d)) == null) return;
+           dx = s.x - p[0] || 0;
+           dy = s.y - p[1] || 0;
+           return function gesture(type, event, touch) {
+             var p0 = p,
+                 n;
+
+             switch (type) {
+               case "start":
+                 gestures[identifier] = gesture, n = active++;
+                 break;
+
+               case "end":
+                 delete gestures[identifier], --active;
+               // nobreak
+
+               case "drag":
+                 p = pointer(touch || event, container), n = active;
+                 break;
+             }
+
+             dispatch.call(type, that, new DragEvent(type, {
+               sourceEvent: event,
+               subject: s,
+               target: drag,
+               identifier: identifier,
+               active: n,
+               x: p[0] + dx,
+               y: p[1] + dy,
+               dx: p[0] - p0[0],
+               dy: p[1] - p0[1],
+               dispatch: dispatch
+             }), d);
+           };
+         }
+
+         drag.filter = function (_) {
+           return arguments.length ? (filter = typeof _ === "function" ? _ : constant$2(!!_), drag) : filter;
+         };
+
+         drag.container = function (_) {
+           return arguments.length ? (container = typeof _ === "function" ? _ : constant$2(_), drag) : container;
+         };
+
+         drag.subject = function (_) {
+           return arguments.length ? (subject = typeof _ === "function" ? _ : constant$2(_), drag) : subject;
+         };
+
+         drag.touchable = function (_) {
+           return arguments.length ? (touchable = typeof _ === "function" ? _ : constant$2(!!_), drag) : touchable;
+         };
+
+         drag.on = function () {
+           var value = listeners.on.apply(listeners, arguments);
+           return value === listeners ? drag : value;
+         };
+
+         drag.clickDistance = function (_) {
+           return arguments.length ? (clickDistance2 = (_ = +_) * _, drag) : Math.sqrt(clickDistance2);
+         };
+
+         return drag;
+       }
+
+       var DESCRIPTORS$4 = descriptors;
+       var global$b = global$1o;
+       var uncurryThis$e = functionUncurryThis;
+       var isForced$1 = isForced_1;
+       var inheritIfRequired$1 = inheritIfRequired$4;
+       var createNonEnumerableProperty = createNonEnumerableProperty$b;
+       var defineProperty$1 = objectDefineProperty.f;
+       var getOwnPropertyNames$1 = objectGetOwnPropertyNames.f;
+       var isPrototypeOf$1 = objectIsPrototypeOf;
+       var isRegExp$1 = isRegexp;
+       var toString$9 = toString$k;
+       var regExpFlags$1 = regexpFlags$1;
+       var stickyHelpers = regexpStickyHelpers;
+       var redefine$3 = redefine$h.exports;
+       var fails$a = fails$V;
+       var hasOwn$2 = hasOwnProperty_1;
+       var enforceInternalState = internalState.enforce;
+       var setSpecies = setSpecies$5;
+       var wellKnownSymbol$1 = wellKnownSymbol$t;
+       var UNSUPPORTED_DOT_ALL = regexpUnsupportedDotAll;
+       var UNSUPPORTED_NCG = regexpUnsupportedNcg;
+
+       var MATCH$1 = wellKnownSymbol$1('match');
+       var NativeRegExp = global$b.RegExp;
+       var RegExpPrototype$1 = NativeRegExp.prototype;
+       var SyntaxError$1 = global$b.SyntaxError;
+       var getFlags = uncurryThis$e(regExpFlags$1);
+       var exec$2 = uncurryThis$e(RegExpPrototype$1.exec);
+       var charAt$1 = uncurryThis$e(''.charAt);
+       var replace$3 = uncurryThis$e(''.replace);
+       var stringIndexOf$1 = uncurryThis$e(''.indexOf);
+       var stringSlice$4 = uncurryThis$e(''.slice);
+       // TODO: Use only propper RegExpIdentifierName
+       var IS_NCG = /^\?<[^\s\d!#%&*+<=>@^][^\s!#%&*+<=>@^]*>/;
+       var re1 = /a/g;
+       var re2 = /a/g;
+
+       // "new" should create a new object, old webkit bug
+       var CORRECT_NEW = new NativeRegExp(re1) !== re1;
+
+       var MISSED_STICKY = stickyHelpers.MISSED_STICKY;
+       var UNSUPPORTED_Y = stickyHelpers.UNSUPPORTED_Y;
+
+       var BASE_FORCED = DESCRIPTORS$4 &&
+         (!CORRECT_NEW || MISSED_STICKY || UNSUPPORTED_DOT_ALL || UNSUPPORTED_NCG || fails$a(function () {
+           re2[MATCH$1] = false;
+           // RegExp constructor can alter flags and IsRegExp works correct with @@match
+           return NativeRegExp(re1) != re1 || NativeRegExp(re2) == re2 || NativeRegExp(re1, 'i') != '/a/i';
+         }));
+
+       var handleDotAll = function (string) {
+         var length = string.length;
+         var index = 0;
+         var result = '';
+         var brackets = false;
+         var chr;
+         for (; index <= length; index++) {
+           chr = charAt$1(string, index);
+           if (chr === '\\') {
+             result += chr + charAt$1(string, ++index);
+             continue;
+           }
+           if (!brackets && chr === '.') {
+             result += '[\\s\\S]';
+           } else {
+             if (chr === '[') {
+               brackets = true;
+             } else if (chr === ']') {
+               brackets = false;
+             } result += chr;
+           }
+         } return result;
+       };
+
+       var handleNCG = function (string) {
+         var length = string.length;
+         var index = 0;
+         var result = '';
+         var named = [];
+         var names = {};
+         var brackets = false;
+         var ncg = false;
+         var groupid = 0;
+         var groupname = '';
+         var chr;
+         for (; index <= length; index++) {
+           chr = charAt$1(string, index);
+           if (chr === '\\') {
+             chr = chr + charAt$1(string, ++index);
+           } else if (chr === ']') {
+             brackets = false;
+           } else if (!brackets) switch (true) {
+             case chr === '[':
+               brackets = true;
+               break;
+             case chr === '(':
+               if (exec$2(IS_NCG, stringSlice$4(string, index + 1))) {
+                 index += 2;
+                 ncg = true;
+               }
+               result += chr;
+               groupid++;
+               continue;
+             case chr === '>' && ncg:
+               if (groupname === '' || hasOwn$2(names, groupname)) {
+                 throw new SyntaxError$1('Invalid capture group name');
+               }
+               names[groupname] = true;
+               named[named.length] = [groupname, groupid];
+               ncg = false;
+               groupname = '';
+               continue;
+           }
+           if (ncg) groupname += chr;
+           else result += chr;
+         } return [result, named];
+       };
+
+       // `RegExp` constructor
+       // https://tc39.es/ecma262/#sec-regexp-constructor
+       if (isForced$1('RegExp', BASE_FORCED)) {
+         var RegExpWrapper = function RegExp(pattern, flags) {
+           var thisIsRegExp = isPrototypeOf$1(RegExpPrototype$1, this);
+           var patternIsRegExp = isRegExp$1(pattern);
+           var flagsAreUndefined = flags === undefined;
+           var groups = [];
+           var rawPattern = pattern;
+           var rawFlags, dotAll, sticky, handled, result, state;
+
+           if (!thisIsRegExp && patternIsRegExp && flagsAreUndefined && pattern.constructor === RegExpWrapper) {
+             return pattern;
+           }
+
+           if (patternIsRegExp || isPrototypeOf$1(RegExpPrototype$1, pattern)) {
+             pattern = pattern.source;
+             if (flagsAreUndefined) flags = 'flags' in rawPattern ? rawPattern.flags : getFlags(rawPattern);
+           }
+
+           pattern = pattern === undefined ? '' : toString$9(pattern);
+           flags = flags === undefined ? '' : toString$9(flags);
+           rawPattern = pattern;
+
+           if (UNSUPPORTED_DOT_ALL && 'dotAll' in re1) {
+             dotAll = !!flags && stringIndexOf$1(flags, 's') > -1;
+             if (dotAll) flags = replace$3(flags, /s/g, '');
+           }
+
+           rawFlags = flags;
+
+           if (MISSED_STICKY && 'sticky' in re1) {
+             sticky = !!flags && stringIndexOf$1(flags, 'y') > -1;
+             if (sticky && UNSUPPORTED_Y) flags = replace$3(flags, /y/g, '');
+           }
+
+           if (UNSUPPORTED_NCG) {
+             handled = handleNCG(pattern);
+             pattern = handled[0];
+             groups = handled[1];
+           }
+
+           result = inheritIfRequired$1(NativeRegExp(pattern, flags), thisIsRegExp ? this : RegExpPrototype$1, RegExpWrapper);
+
+           if (dotAll || sticky || groups.length) {
+             state = enforceInternalState(result);
+             if (dotAll) {
+               state.dotAll = true;
+               state.raw = RegExpWrapper(handleDotAll(pattern), rawFlags);
+             }
+             if (sticky) state.sticky = true;
+             if (groups.length) state.groups = groups;
+           }
+
+           if (pattern !== rawPattern) try {
+             // fails in old engines, but we have no alternatives for unsupported regex syntax
+             createNonEnumerableProperty(result, 'source', rawPattern === '' ? '(?:)' : rawPattern);
+           } catch (error) { /* empty */ }
+
+           return result;
+         };
+
+         var proxy = function (key) {
+           key in RegExpWrapper || defineProperty$1(RegExpWrapper, key, {
+             configurable: true,
+             get: function () { return NativeRegExp[key]; },
+             set: function (it) { NativeRegExp[key] = it; }
+           });
+         };
+
+         for (var keys$1 = getOwnPropertyNames$1(NativeRegExp), index$1 = 0; keys$1.length > index$1;) {
+           proxy(keys$1[index$1++]);
+         }
+
+         RegExpPrototype$1.constructor = RegExpWrapper;
+         RegExpWrapper.prototype = RegExpPrototype$1;
+         redefine$3(global$b, 'RegExp', RegExpWrapper);
+       }
+
+       // https://tc39.es/ecma262/#sec-get-regexp-@@species
+       setSpecies('RegExp');
+
+       function define (constructor, factory, prototype) {
+         constructor.prototype = factory.prototype = prototype;
+         prototype.constructor = constructor;
+       }
+       function extend$3(parent, definition) {
+         var prototype = Object.create(parent.prototype);
+
+         for (var key in definition) {
+           prototype[key] = definition[key];
+         }
+
+         return prototype;
+       }
+
+       function Color() {}
+       var _darker = 0.7;
+
+       var _brighter = 1 / _darker;
+       var reI = "\\s*([+-]?\\d+)\\s*",
+           reN = "\\s*([+-]?\\d*\\.?\\d+(?:[eE][+-]?\\d+)?)\\s*",
+           reP = "\\s*([+-]?\\d*\\.?\\d+(?:[eE][+-]?\\d+)?)%\\s*",
+           reHex = /^#([0-9a-f]{3,8})$/,
+           reRgbInteger = new RegExp("^rgb\\(" + [reI, reI, reI] + "\\)$"),
+           reRgbPercent = new RegExp("^rgb\\(" + [reP, reP, reP] + "\\)$"),
+           reRgbaInteger = new RegExp("^rgba\\(" + [reI, reI, reI, reN] + "\\)$"),
+           reRgbaPercent = new RegExp("^rgba\\(" + [reP, reP, reP, reN] + "\\)$"),
+           reHslPercent = new RegExp("^hsl\\(" + [reN, reP, reP] + "\\)$"),
+           reHslaPercent = new RegExp("^hsla\\(" + [reN, reP, reP, reN] + "\\)$");
+       var named = {
+         aliceblue: 0xf0f8ff,
+         antiquewhite: 0xfaebd7,
+         aqua: 0x00ffff,
+         aquamarine: 0x7fffd4,
+         azure: 0xf0ffff,
+         beige: 0xf5f5dc,
+         bisque: 0xffe4c4,
+         black: 0x000000,
+         blanchedalmond: 0xffebcd,
+         blue: 0x0000ff,
+         blueviolet: 0x8a2be2,
+         brown: 0xa52a2a,
+         burlywood: 0xdeb887,
+         cadetblue: 0x5f9ea0,
+         chartreuse: 0x7fff00,
+         chocolate: 0xd2691e,
+         coral: 0xff7f50,
+         cornflowerblue: 0x6495ed,
+         cornsilk: 0xfff8dc,
+         crimson: 0xdc143c,
+         cyan: 0x00ffff,
+         darkblue: 0x00008b,
+         darkcyan: 0x008b8b,
+         darkgoldenrod: 0xb8860b,
+         darkgray: 0xa9a9a9,
+         darkgreen: 0x006400,
+         darkgrey: 0xa9a9a9,
+         darkkhaki: 0xbdb76b,
+         darkmagenta: 0x8b008b,
+         darkolivegreen: 0x556b2f,
+         darkorange: 0xff8c00,
+         darkorchid: 0x9932cc,
+         darkred: 0x8b0000,
+         darksalmon: 0xe9967a,
+         darkseagreen: 0x8fbc8f,
+         darkslateblue: 0x483d8b,
+         darkslategray: 0x2f4f4f,
+         darkslategrey: 0x2f4f4f,
+         darkturquoise: 0x00ced1,
+         darkviolet: 0x9400d3,
+         deeppink: 0xff1493,
+         deepskyblue: 0x00bfff,
+         dimgray: 0x696969,
+         dimgrey: 0x696969,
+         dodgerblue: 0x1e90ff,
+         firebrick: 0xb22222,
+         floralwhite: 0xfffaf0,
+         forestgreen: 0x228b22,
+         fuchsia: 0xff00ff,
+         gainsboro: 0xdcdcdc,
+         ghostwhite: 0xf8f8ff,
+         gold: 0xffd700,
+         goldenrod: 0xdaa520,
+         gray: 0x808080,
+         green: 0x008000,
+         greenyellow: 0xadff2f,
+         grey: 0x808080,
+         honeydew: 0xf0fff0,
+         hotpink: 0xff69b4,
+         indianred: 0xcd5c5c,
+         indigo: 0x4b0082,
+         ivory: 0xfffff0,
+         khaki: 0xf0e68c,
+         lavender: 0xe6e6fa,
+         lavenderblush: 0xfff0f5,
+         lawngreen: 0x7cfc00,
+         lemonchiffon: 0xfffacd,
+         lightblue: 0xadd8e6,
+         lightcoral: 0xf08080,
+         lightcyan: 0xe0ffff,
+         lightgoldenrodyellow: 0xfafad2,
+         lightgray: 0xd3d3d3,
+         lightgreen: 0x90ee90,
+         lightgrey: 0xd3d3d3,
+         lightpink: 0xffb6c1,
+         lightsalmon: 0xffa07a,
+         lightseagreen: 0x20b2aa,
+         lightskyblue: 0x87cefa,
+         lightslategray: 0x778899,
+         lightslategrey: 0x778899,
+         lightsteelblue: 0xb0c4de,
+         lightyellow: 0xffffe0,
+         lime: 0x00ff00,
+         limegreen: 0x32cd32,
+         linen: 0xfaf0e6,
+         magenta: 0xff00ff,
+         maroon: 0x800000,
+         mediumaquamarine: 0x66cdaa,
+         mediumblue: 0x0000cd,
+         mediumorchid: 0xba55d3,
+         mediumpurple: 0x9370db,
+         mediumseagreen: 0x3cb371,
+         mediumslateblue: 0x7b68ee,
+         mediumspringgreen: 0x00fa9a,
+         mediumturquoise: 0x48d1cc,
+         mediumvioletred: 0xc71585,
+         midnightblue: 0x191970,
+         mintcream: 0xf5fffa,
+         mistyrose: 0xffe4e1,
+         moccasin: 0xffe4b5,
+         navajowhite: 0xffdead,
+         navy: 0x000080,
+         oldlace: 0xfdf5e6,
+         olive: 0x808000,
+         olivedrab: 0x6b8e23,
+         orange: 0xffa500,
+         orangered: 0xff4500,
+         orchid: 0xda70d6,
+         palegoldenrod: 0xeee8aa,
+         palegreen: 0x98fb98,
+         paleturquoise: 0xafeeee,
+         palevioletred: 0xdb7093,
+         papayawhip: 0xffefd5,
+         peachpuff: 0xffdab9,
+         peru: 0xcd853f,
+         pink: 0xffc0cb,
+         plum: 0xdda0dd,
+         powderblue: 0xb0e0e6,
+         purple: 0x800080,
+         rebeccapurple: 0x663399,
+         red: 0xff0000,
+         rosybrown: 0xbc8f8f,
+         royalblue: 0x4169e1,
+         saddlebrown: 0x8b4513,
+         salmon: 0xfa8072,
+         sandybrown: 0xf4a460,
+         seagreen: 0x2e8b57,
+         seashell: 0xfff5ee,
+         sienna: 0xa0522d,
+         silver: 0xc0c0c0,
+         skyblue: 0x87ceeb,
+         slateblue: 0x6a5acd,
+         slategray: 0x708090,
+         slategrey: 0x708090,
+         snow: 0xfffafa,
+         springgreen: 0x00ff7f,
+         steelblue: 0x4682b4,
+         tan: 0xd2b48c,
+         teal: 0x008080,
+         thistle: 0xd8bfd8,
+         tomato: 0xff6347,
+         turquoise: 0x40e0d0,
+         violet: 0xee82ee,
+         wheat: 0xf5deb3,
+         white: 0xffffff,
+         whitesmoke: 0xf5f5f5,
+         yellow: 0xffff00,
+         yellowgreen: 0x9acd32
+       };
+       define(Color, color, {
+         copy: function copy(channels) {
+           return Object.assign(new this.constructor(), this, channels);
+         },
+         displayable: function displayable() {
+           return this.rgb().displayable();
+         },
+         hex: color_formatHex,
+         // Deprecated! Use color.formatHex.
+         formatHex: color_formatHex,
+         formatHsl: color_formatHsl,
+         formatRgb: color_formatRgb,
+         toString: color_formatRgb
+       });
+
+       function color_formatHex() {
+         return this.rgb().formatHex();
+       }
+
+       function color_formatHsl() {
+         return hslConvert(this).formatHsl();
+       }
+
+       function color_formatRgb() {
+         return this.rgb().formatRgb();
+       }
+
+       function color(format) {
+         var m, l;
+         format = (format + "").trim().toLowerCase();
+         return (m = reHex.exec(format)) ? (l = m[1].length, m = parseInt(m[1], 16), l === 6 ? rgbn(m) // #ff0000
+         : l === 3 ? new Rgb(m >> 8 & 0xf | m >> 4 & 0xf0, m >> 4 & 0xf | m & 0xf0, (m & 0xf) << 4 | m & 0xf, 1) // #f00
+         : l === 8 ? rgba(m >> 24 & 0xff, m >> 16 & 0xff, m >> 8 & 0xff, (m & 0xff) / 0xff) // #ff000000
+         : l === 4 ? rgba(m >> 12 & 0xf | m >> 8 & 0xf0, m >> 8 & 0xf | m >> 4 & 0xf0, m >> 4 & 0xf | m & 0xf0, ((m & 0xf) << 4 | m & 0xf) / 0xff) // #f000
+         : null // invalid hex
+         ) : (m = reRgbInteger.exec(format)) ? new Rgb(m[1], m[2], m[3], 1) // rgb(255, 0, 0)
+         : (m = reRgbPercent.exec(format)) ? new Rgb(m[1] * 255 / 100, m[2] * 255 / 100, m[3] * 255 / 100, 1) // rgb(100%, 0%, 0%)
+         : (m = reRgbaInteger.exec(format)) ? rgba(m[1], m[2], m[3], m[4]) // rgba(255, 0, 0, 1)
+         : (m = reRgbaPercent.exec(format)) ? rgba(m[1] * 255 / 100, m[2] * 255 / 100, m[3] * 255 / 100, m[4]) // rgb(100%, 0%, 0%, 1)
+         : (m = reHslPercent.exec(format)) ? hsla(m[1], m[2] / 100, m[3] / 100, 1) // hsl(120, 50%, 50%)
+         : (m = reHslaPercent.exec(format)) ? hsla(m[1], m[2] / 100, m[3] / 100, m[4]) // hsla(120, 50%, 50%, 1)
+         : named.hasOwnProperty(format) ? rgbn(named[format]) // eslint-disable-line no-prototype-builtins
+         : format === "transparent" ? new Rgb(NaN, NaN, NaN, 0) : null;
+       }
+
+       function rgbn(n) {
+         return new Rgb(n >> 16 & 0xff, n >> 8 & 0xff, n & 0xff, 1);
+       }
+
+       function rgba(r, g, b, a) {
+         if (a <= 0) r = g = b = NaN;
+         return new Rgb(r, g, b, a);
+       }
+
+       function rgbConvert(o) {
+         if (!(o instanceof Color)) o = color(o);
+         if (!o) return new Rgb();
+         o = o.rgb();
+         return new Rgb(o.r, o.g, o.b, o.opacity);
+       }
+       function rgb(r, g, b, opacity) {
+         return arguments.length === 1 ? rgbConvert(r) : new Rgb(r, g, b, opacity == null ? 1 : opacity);
+       }
+       function Rgb(r, g, b, opacity) {
+         this.r = +r;
+         this.g = +g;
+         this.b = +b;
+         this.opacity = +opacity;
+       }
+       define(Rgb, rgb, extend$3(Color, {
+         brighter: function brighter(k) {
+           k = k == null ? _brighter : Math.pow(_brighter, k);
+           return new Rgb(this.r * k, this.g * k, this.b * k, this.opacity);
+         },
+         darker: function darker(k) {
+           k = k == null ? _darker : Math.pow(_darker, k);
+           return new Rgb(this.r * k, this.g * k, this.b * k, this.opacity);
+         },
+         rgb: function rgb() {
+           return this;
+         },
+         displayable: function displayable() {
+           return -0.5 <= this.r && this.r < 255.5 && -0.5 <= this.g && this.g < 255.5 && -0.5 <= this.b && this.b < 255.5 && 0 <= this.opacity && this.opacity <= 1;
+         },
+         hex: rgb_formatHex,
+         // Deprecated! Use color.formatHex.
+         formatHex: rgb_formatHex,
+         formatRgb: rgb_formatRgb,
+         toString: rgb_formatRgb
+       }));
+
+       function rgb_formatHex() {
+         return "#" + hex$1(this.r) + hex$1(this.g) + hex$1(this.b);
+       }
+
+       function rgb_formatRgb() {
+         var a = this.opacity;
+         a = isNaN(a) ? 1 : Math.max(0, Math.min(1, a));
+         return (a === 1 ? "rgb(" : "rgba(") + Math.max(0, Math.min(255, Math.round(this.r) || 0)) + ", " + Math.max(0, Math.min(255, Math.round(this.g) || 0)) + ", " + Math.max(0, Math.min(255, Math.round(this.b) || 0)) + (a === 1 ? ")" : ", " + a + ")");
+       }
+
+       function hex$1(value) {
+         value = Math.max(0, Math.min(255, Math.round(value) || 0));
+         return (value < 16 ? "0" : "") + value.toString(16);
+       }
+
+       function hsla(h, s, l, a) {
+         if (a <= 0) h = s = l = NaN;else if (l <= 0 || l >= 1) h = s = NaN;else if (s <= 0) h = NaN;
+         return new Hsl(h, s, l, a);
+       }
+
+       function hslConvert(o) {
+         if (o instanceof Hsl) return new Hsl(o.h, o.s, o.l, o.opacity);
+         if (!(o instanceof Color)) o = color(o);
+         if (!o) return new Hsl();
+         if (o instanceof Hsl) return o;
+         o = o.rgb();
+         var r = o.r / 255,
+             g = o.g / 255,
+             b = o.b / 255,
+             min = Math.min(r, g, b),
+             max = Math.max(r, g, b),
+             h = NaN,
+             s = max - min,
+             l = (max + min) / 2;
+
+         if (s) {
+           if (r === max) h = (g - b) / s + (g < b) * 6;else if (g === max) h = (b - r) / s + 2;else h = (r - g) / s + 4;
+           s /= l < 0.5 ? max + min : 2 - max - min;
+           h *= 60;
+         } else {
+           s = l > 0 && l < 1 ? 0 : h;
+         }
+
+         return new Hsl(h, s, l, o.opacity);
+       }
+       function hsl(h, s, l, opacity) {
+         return arguments.length === 1 ? hslConvert(h) : new Hsl(h, s, l, opacity == null ? 1 : opacity);
+       }
+
+       function Hsl(h, s, l, opacity) {
+         this.h = +h;
+         this.s = +s;
+         this.l = +l;
+         this.opacity = +opacity;
+       }
+
+       define(Hsl, hsl, extend$3(Color, {
+         brighter: function brighter(k) {
+           k = k == null ? _brighter : Math.pow(_brighter, k);
+           return new Hsl(this.h, this.s, this.l * k, this.opacity);
+         },
+         darker: function darker(k) {
+           k = k == null ? _darker : Math.pow(_darker, k);
+           return new Hsl(this.h, this.s, this.l * k, this.opacity);
+         },
+         rgb: function rgb() {
+           var h = this.h % 360 + (this.h < 0) * 360,
+               s = isNaN(h) || isNaN(this.s) ? 0 : this.s,
+               l = this.l,
+               m2 = l + (l < 0.5 ? l : 1 - l) * s,
+               m1 = 2 * l - m2;
+           return new Rgb(hsl2rgb(h >= 240 ? h - 240 : h + 120, m1, m2), hsl2rgb(h, m1, m2), hsl2rgb(h < 120 ? h + 240 : h - 120, m1, m2), this.opacity);
+         },
+         displayable: function displayable() {
+           return (0 <= this.s && this.s <= 1 || isNaN(this.s)) && 0 <= this.l && this.l <= 1 && 0 <= this.opacity && this.opacity <= 1;
+         },
+         formatHsl: function formatHsl() {
+           var a = this.opacity;
+           a = isNaN(a) ? 1 : Math.max(0, Math.min(1, a));
+           return (a === 1 ? "hsl(" : "hsla(") + (this.h || 0) + ", " + (this.s || 0) * 100 + "%, " + (this.l || 0) * 100 + "%" + (a === 1 ? ")" : ", " + a + ")");
+         }
+       }));
+       /* From FvD 13.37, CSS Color Module Level 3 */
+
+       function hsl2rgb(h, m1, m2) {
+         return (h < 60 ? m1 + (m2 - m1) * h / 60 : h < 180 ? m2 : h < 240 ? m1 + (m2 - m1) * (240 - h) / 60 : m1) * 255;
+       }
+
+       var constant$1 = (function (x) {
+         return function () {
+           return x;
+         };
+       });
+
+       function linear$2(a, d) {
+         return function (t) {
+           return a + t * d;
+         };
+       }
+
+       function exponential(a, b, y) {
+         return a = Math.pow(a, y), b = Math.pow(b, y) - a, y = 1 / y, function (t) {
+           return Math.pow(a + t * b, y);
+         };
+       }
+       function gamma(y) {
+         return (y = +y) === 1 ? nogamma : function (a, b) {
+           return b - a ? exponential(a, b, y) : constant$1(isNaN(a) ? b : a);
+         };
+       }
+       function nogamma(a, b) {
+         var d = b - a;
+         return d ? linear$2(a, d) : constant$1(isNaN(a) ? b : a);
+       }
+
+       var d3_interpolateRgb = (function rgbGamma(y) {
+         var color = gamma(y);
+
+         function rgb$1(start, end) {
+           var r = color((start = rgb(start)).r, (end = rgb(end)).r),
+               g = color(start.g, end.g),
+               b = color(start.b, end.b),
+               opacity = nogamma(start.opacity, end.opacity);
+           return function (t) {
+             start.r = r(t);
+             start.g = g(t);
+             start.b = b(t);
+             start.opacity = opacity(t);
+             return start + "";
+           };
+         }
+
+         rgb$1.gamma = rgbGamma;
+         return rgb$1;
+       })(1);
+
+       function numberArray (a, b) {
+         if (!b) b = [];
+         var n = a ? Math.min(b.length, a.length) : 0,
+             c = b.slice(),
+             i;
+         return function (t) {
+           for (i = 0; i < n; ++i) {
+             c[i] = a[i] * (1 - t) + b[i] * t;
+           }
+
+           return c;
+         };
+       }
+       function isNumberArray(x) {
+         return ArrayBuffer.isView(x) && !(x instanceof DataView);
+       }
+
+       function genericArray(a, b) {
+         var nb = b ? b.length : 0,
+             na = a ? Math.min(nb, a.length) : 0,
+             x = new Array(na),
+             c = new Array(nb),
+             i;
+
+         for (i = 0; i < na; ++i) {
+           x[i] = interpolate$1(a[i], b[i]);
+         }
+
+         for (; i < nb; ++i) {
+           c[i] = b[i];
+         }
+
+         return function (t) {
+           for (i = 0; i < na; ++i) {
+             c[i] = x[i](t);
+           }
+
+           return c;
+         };
+       }
+
+       function date (a, b) {
+         var d = new Date();
+         return a = +a, b = +b, function (t) {
+           return d.setTime(a * (1 - t) + b * t), d;
+         };
+       }
+
+       function d3_interpolateNumber (a, b) {
+         return a = +a, b = +b, function (t) {
+           return a * (1 - t) + b * t;
+         };
+       }
+
+       function object (a, b) {
+         var i = {},
+             c = {},
+             k;
+         if (a === null || _typeof(a) !== "object") a = {};
+         if (b === null || _typeof(b) !== "object") b = {};
+
+         for (k in b) {
+           if (k in a) {
+             i[k] = interpolate$1(a[k], b[k]);
+           } else {
+             c[k] = b[k];
+           }
+         }
+
+         return function (t) {
+           for (k in i) {
+             c[k] = i[k](t);
+           }
+
+           return c;
+         };
+       }
+
+       var reA = /[-+]?(?:\d+\.?\d*|\.?\d+)(?:[eE][-+]?\d+)?/g,
+           reB = new RegExp(reA.source, "g");
+
+       function zero(b) {
+         return function () {
+           return b;
+         };
+       }
+
+       function one(b) {
+         return function (t) {
+           return b(t) + "";
+         };
+       }
+
+       function interpolateString (a, b) {
+         var bi = reA.lastIndex = reB.lastIndex = 0,
+             // scan index for next number in b
+         am,
+             // current match in a
+         bm,
+             // current match in b
+         bs,
+             // string preceding current number in b, if any
+         i = -1,
+             // index in s
+         s = [],
+             // string constants and placeholders
+         q = []; // number interpolators
+         // Coerce inputs to strings.
+
+         a = a + "", b = b + ""; // Interpolate pairs of numbers in a & b.
+
+         while ((am = reA.exec(a)) && (bm = reB.exec(b))) {
+           if ((bs = bm.index) > bi) {
+             // a string precedes the next number in b
+             bs = b.slice(bi, bs);
+             if (s[i]) s[i] += bs; // coalesce with previous string
+             else s[++i] = bs;
+           }
+
+           if ((am = am[0]) === (bm = bm[0])) {
+             // numbers in a & b match
+             if (s[i]) s[i] += bm; // coalesce with previous string
+             else s[++i] = bm;
+           } else {
+             // interpolate non-matching numbers
+             s[++i] = null;
+             q.push({
+               i: i,
+               x: d3_interpolateNumber(am, bm)
+             });
+           }
+
+           bi = reB.lastIndex;
+         } // Add remains of b.
+
+
+         if (bi < b.length) {
+           bs = b.slice(bi);
+           if (s[i]) s[i] += bs; // coalesce with previous string
+           else s[++i] = bs;
+         } // Special optimization for only a single match.
+         // Otherwise, interpolate each of the numbers and rejoin the string.
+
+
+         return s.length < 2 ? q[0] ? one(q[0].x) : zero(b) : (b = q.length, function (t) {
+           for (var i = 0, o; i < b; ++i) {
+             s[(o = q[i]).i] = o.x(t);
+           }
+
+           return s.join("");
+         });
+       }
+
+       function interpolate$1 (a, b) {
+         var t = _typeof(b),
+             c;
+
+         return b == null || t === "boolean" ? constant$1(b) : (t === "number" ? d3_interpolateNumber : t === "string" ? (c = color(b)) ? (b = c, d3_interpolateRgb) : interpolateString : b instanceof color ? d3_interpolateRgb : b instanceof Date ? date : isNumberArray(b) ? numberArray : Array.isArray(b) ? genericArray : typeof b.valueOf !== "function" && typeof b.toString !== "function" || isNaN(b) ? object : d3_interpolateNumber)(a, b);
+       }
+
+       function interpolateRound (a, b) {
+         return a = +a, b = +b, function (t) {
+           return Math.round(a * (1 - t) + b * t);
+         };
+       }
+
+       var degrees = 180 / Math.PI;
+       var identity$3 = {
+         translateX: 0,
+         translateY: 0,
+         rotate: 0,
+         skewX: 0,
+         scaleX: 1,
+         scaleY: 1
+       };
+       function decompose (a, b, c, d, e, f) {
+         var scaleX, scaleY, skewX;
+         if (scaleX = Math.sqrt(a * a + b * b)) a /= scaleX, b /= scaleX;
+         if (skewX = a * c + b * d) c -= a * skewX, d -= b * skewX;
+         if (scaleY = Math.sqrt(c * c + d * d)) c /= scaleY, d /= scaleY, skewX /= scaleY;
+         if (a * d < b * c) a = -a, b = -b, skewX = -skewX, scaleX = -scaleX;
+         return {
+           translateX: e,
+           translateY: f,
+           rotate: Math.atan2(b, a) * degrees,
+           skewX: Math.atan(skewX) * degrees,
+           scaleX: scaleX,
+           scaleY: scaleY
+         };
+       }
+
+       var svgNode;
+       /* eslint-disable no-undef */
+
+       function parseCss(value) {
+         var m = new (typeof DOMMatrix === "function" ? DOMMatrix : WebKitCSSMatrix)(value + "");
+         return m.isIdentity ? identity$3 : decompose(m.a, m.b, m.c, m.d, m.e, m.f);
+       }
+       function parseSvg(value) {
+         if (value == null) return identity$3;
+         if (!svgNode) svgNode = document.createElementNS("http://www.w3.org/2000/svg", "g");
+         svgNode.setAttribute("transform", value);
+         if (!(value = svgNode.transform.baseVal.consolidate())) return identity$3;
+         value = value.matrix;
+         return decompose(value.a, value.b, value.c, value.d, value.e, value.f);
+       }
+
+       function interpolateTransform(parse, pxComma, pxParen, degParen) {
+         function pop(s) {
+           return s.length ? s.pop() + " " : "";
+         }
+
+         function translate(xa, ya, xb, yb, s, q) {
+           if (xa !== xb || ya !== yb) {
+             var i = s.push("translate(", null, pxComma, null, pxParen);
+             q.push({
+               i: i - 4,
+               x: d3_interpolateNumber(xa, xb)
+             }, {
+               i: i - 2,
+               x: d3_interpolateNumber(ya, yb)
+             });
+           } else if (xb || yb) {
+             s.push("translate(" + xb + pxComma + yb + pxParen);
+           }
+         }
+
+         function rotate(a, b, s, q) {
+           if (a !== b) {
+             if (a - b > 180) b += 360;else if (b - a > 180) a += 360; // shortest path
+
+             q.push({
+               i: s.push(pop(s) + "rotate(", null, degParen) - 2,
+               x: d3_interpolateNumber(a, b)
+             });
+           } else if (b) {
+             s.push(pop(s) + "rotate(" + b + degParen);
+           }
+         }
+
+         function skewX(a, b, s, q) {
+           if (a !== b) {
+             q.push({
+               i: s.push(pop(s) + "skewX(", null, degParen) - 2,
+               x: d3_interpolateNumber(a, b)
+             });
+           } else if (b) {
+             s.push(pop(s) + "skewX(" + b + degParen);
+           }
+         }
+
+         function scale(xa, ya, xb, yb, s, q) {
+           if (xa !== xb || ya !== yb) {
+             var i = s.push(pop(s) + "scale(", null, ",", null, ")");
+             q.push({
+               i: i - 4,
+               x: d3_interpolateNumber(xa, xb)
+             }, {
+               i: i - 2,
+               x: d3_interpolateNumber(ya, yb)
+             });
+           } else if (xb !== 1 || yb !== 1) {
+             s.push(pop(s) + "scale(" + xb + "," + yb + ")");
+           }
+         }
+
+         return function (a, b) {
+           var s = [],
+               // string constants and placeholders
+           q = []; // number interpolators
+
+           a = parse(a), b = parse(b);
+           translate(a.translateX, a.translateY, b.translateX, b.translateY, s, q);
+           rotate(a.rotate, b.rotate, s, q);
+           skewX(a.skewX, b.skewX, s, q);
+           scale(a.scaleX, a.scaleY, b.scaleX, b.scaleY, s, q);
+           a = b = null; // gc
+
+           return function (t) {
+             var i = -1,
+                 n = q.length,
+                 o;
+
+             while (++i < n) {
+               s[(o = q[i]).i] = o.x(t);
+             }
+
+             return s.join("");
+           };
+         };
+       }
+
+       var interpolateTransformCss = interpolateTransform(parseCss, "px, ", "px)", "deg)");
+       var interpolateTransformSvg = interpolateTransform(parseSvg, ", ", ")", ")");
+
+       var epsilon2 = 1e-12;
+
+       function cosh(x) {
+         return ((x = Math.exp(x)) + 1 / x) / 2;
+       }
+
+       function sinh(x) {
+         return ((x = Math.exp(x)) - 1 / x) / 2;
+       }
+
+       function tanh(x) {
+         return ((x = Math.exp(2 * x)) - 1) / (x + 1);
+       }
+
+       var interpolateZoom = (function zoomRho(rho, rho2, rho4) {
+         // p0 = [ux0, uy0, w0]
+         // p1 = [ux1, uy1, w1]
+         function zoom(p0, p1) {
+           var ux0 = p0[0],
+               uy0 = p0[1],
+               w0 = p0[2],
+               ux1 = p1[0],
+               uy1 = p1[1],
+               w1 = p1[2],
+               dx = ux1 - ux0,
+               dy = uy1 - uy0,
+               d2 = dx * dx + dy * dy,
+               i,
+               S; // Special case for u0 ≅ u1.
+
+           if (d2 < epsilon2) {
+             S = Math.log(w1 / w0) / rho;
+
+             i = function i(t) {
+               return [ux0 + t * dx, uy0 + t * dy, w0 * Math.exp(rho * t * S)];
+             };
+           } // General case.
+           else {
+             var d1 = Math.sqrt(d2),
+                 b0 = (w1 * w1 - w0 * w0 + rho4 * d2) / (2 * w0 * rho2 * d1),
+                 b1 = (w1 * w1 - w0 * w0 - rho4 * d2) / (2 * w1 * rho2 * d1),
+                 r0 = Math.log(Math.sqrt(b0 * b0 + 1) - b0),
+                 r1 = Math.log(Math.sqrt(b1 * b1 + 1) - b1);
+             S = (r1 - r0) / rho;
+
+             i = function i(t) {
+               var s = t * S,
+                   coshr0 = cosh(r0),
+                   u = w0 / (rho2 * d1) * (coshr0 * tanh(rho * s + r0) - sinh(r0));
+               return [ux0 + u * dx, uy0 + u * dy, w0 * coshr0 / cosh(rho * s + r0)];
+             };
+           }
+
+           i.duration = S * 1000 * rho / Math.SQRT2;
+           return i;
+         }
+
+         zoom.rho = function (_) {
+           var _1 = Math.max(1e-3, +_),
+               _2 = _1 * _1,
+               _4 = _2 * _2;
+
+           return zoomRho(_1, _2, _4);
+         };
+
+         return zoom;
+       })(Math.SQRT2, 2, 4);
+
+       function d3_quantize (interpolator, n) {
+         var samples = new Array(n);
+
+         for (var i = 0; i < n; ++i) {
+           samples[i] = interpolator(i / (n - 1));
+         }
+
+         return samples;
+       }
+
+       var $$t = _export;
+       var bind$4 = functionBind;
+
+       // `Function.prototype.bind` method
+       // https://tc39.es/ecma262/#sec-function.prototype.bind
+       $$t({ target: 'Function', proto: true, forced: Function.bind !== bind$4 }, {
+         bind: bind$4
+       });
+
+       var frame = 0,
+           // is an animation frame pending?
+       timeout = 0,
+           // is a timeout pending?
+       interval = 0,
+           // are any timers active?
+       pokeDelay = 1000,
+           // how frequently we check for clock skew
+       taskHead,
+           taskTail,
+           clockLast = 0,
+           clockNow = 0,
+           clockSkew = 0,
+           clock = (typeof performance === "undefined" ? "undefined" : _typeof(performance)) === "object" && performance.now ? performance : Date,
+           setFrame = (typeof window === "undefined" ? "undefined" : _typeof(window)) === "object" && window.requestAnimationFrame ? window.requestAnimationFrame.bind(window) : function (f) {
+         setTimeout(f, 17);
+       };
+       function now$1() {
+         return clockNow || (setFrame(clearNow), clockNow = clock.now() + clockSkew);
+       }
+
+       function clearNow() {
+         clockNow = 0;
+       }
+
+       function Timer() {
+         this._call = this._time = this._next = null;
+       }
+       Timer.prototype = timer.prototype = {
+         constructor: Timer,
+         restart: function restart(callback, delay, time) {
+           if (typeof callback !== "function") throw new TypeError("callback is not a function");
+           time = (time == null ? now$1() : +time) + (delay == null ? 0 : +delay);
+
+           if (!this._next && taskTail !== this) {
+             if (taskTail) taskTail._next = this;else taskHead = this;
+             taskTail = this;
+           }
+
+           this._call = callback;
+           this._time = time;
+           sleep();
+         },
+         stop: function stop() {
+           if (this._call) {
+             this._call = null;
+             this._time = Infinity;
+             sleep();
+           }
+         }
+       };
+       function timer(callback, delay, time) {
+         var t = new Timer();
+         t.restart(callback, delay, time);
+         return t;
+       }
+       function timerFlush() {
+         now$1(); // Get the current time, if not already set.
+
+         ++frame; // Pretend we’ve set an alarm, if we haven’t already.
+
+         var t = taskHead,
+             e;
+
+         while (t) {
+           if ((e = clockNow - t._time) >= 0) t._call.call(null, e);
+           t = t._next;
+         }
+
+         --frame;
+       }
+
+       function wake() {
+         clockNow = (clockLast = clock.now()) + clockSkew;
+         frame = timeout = 0;
+
+         try {
+           timerFlush();
+         } finally {
+           frame = 0;
+           nap();
+           clockNow = 0;
+         }
+       }
+
+       function poke() {
+         var now = clock.now(),
+             delay = now - clockLast;
+         if (delay > pokeDelay) clockSkew -= delay, clockLast = now;
+       }
+
+       function nap() {
+         var t0,
+             t1 = taskHead,
+             t2,
+             time = Infinity;
+
+         while (t1) {
+           if (t1._call) {
+             if (time > t1._time) time = t1._time;
+             t0 = t1, t1 = t1._next;
+           } else {
+             t2 = t1._next, t1._next = null;
+             t1 = t0 ? t0._next = t2 : taskHead = t2;
+           }
+         }
+
+         taskTail = t0;
+         sleep(time);
+       }
+
+       function sleep(time) {
+         if (frame) return; // Soonest alarm already set, or will be.
+
+         if (timeout) timeout = clearTimeout(timeout);
+         var delay = time - clockNow; // Strictly less than if we recomputed clockNow.
+
+         if (delay > 24) {
+           if (time < Infinity) timeout = setTimeout(wake, time - clock.now() - clockSkew);
+           if (interval) interval = clearInterval(interval);
+         } else {
+           if (!interval) clockLast = clock.now(), interval = setInterval(poke, pokeDelay);
+           frame = 1, setFrame(wake);
+         }
+       }
+
+       function d3_timeout (callback, delay, time) {
+         var t = new Timer();
+         delay = delay == null ? 0 : +delay;
+         t.restart(function (elapsed) {
+           t.stop();
+           callback(elapsed + delay);
+         }, delay, time);
+         return t;
+       }
+
+       var emptyOn = dispatch$8("start", "end", "cancel", "interrupt");
+       var emptyTween = [];
+       var CREATED = 0;
+       var SCHEDULED = 1;
+       var STARTING = 2;
+       var STARTED = 3;
+       var RUNNING = 4;
+       var ENDING = 5;
+       var ENDED = 6;
+       function schedule (node, name, id, index, group, timing) {
+         var schedules = node.__transition;
+         if (!schedules) node.__transition = {};else if (id in schedules) return;
+         create$2(node, id, {
+           name: name,
+           index: index,
+           // For context during callback.
+           group: group,
+           // For context during callback.
+           on: emptyOn,
+           tween: emptyTween,
+           time: timing.time,
+           delay: timing.delay,
+           duration: timing.duration,
+           ease: timing.ease,
+           timer: null,
+           state: CREATED
+         });
+       }
+       function init(node, id) {
+         var schedule = get$1(node, id);
+         if (schedule.state > CREATED) throw new Error("too late; already scheduled");
+         return schedule;
+       }
+       function set(node, id) {
+         var schedule = get$1(node, id);
+         if (schedule.state > STARTED) throw new Error("too late; already running");
+         return schedule;
+       }
+       function get$1(node, id) {
+         var schedule = node.__transition;
+         if (!schedule || !(schedule = schedule[id])) throw new Error("transition not found");
+         return schedule;
+       }
+
+       function create$2(node, id, self) {
+         var schedules = node.__transition,
+             tween; // Initialize the self timer when the transition is created.
+         // Note the actual delay is not known until the first callback!
+
+         schedules[id] = self;
+         self.timer = timer(schedule, 0, self.time);
+
+         function schedule(elapsed) {
+           self.state = SCHEDULED;
+           self.timer.restart(start, self.delay, self.time); // If the elapsed delay is less than our first sleep, start immediately.
+
+           if (self.delay <= elapsed) start(elapsed - self.delay);
+         }
+
+         function start(elapsed) {
+           var i, j, n, o; // If the state is not SCHEDULED, then we previously errored on start.
+
+           if (self.state !== SCHEDULED) return stop();
+
+           for (i in schedules) {
+             o = schedules[i];
+             if (o.name !== self.name) continue; // While this element already has a starting transition during this frame,
+             // defer starting an interrupting transition until that transition has a
+             // chance to tick (and possibly end); see d3/d3-transition#54!
+
+             if (o.state === STARTED) return d3_timeout(start); // Interrupt the active transition, if any.
+
+             if (o.state === RUNNING) {
+               o.state = ENDED;
+               o.timer.stop();
+               o.on.call("interrupt", node, node.__data__, o.index, o.group);
+               delete schedules[i];
+             } // Cancel any pre-empted transitions.
+             else if (+i < id) {
+               o.state = ENDED;
+               o.timer.stop();
+               o.on.call("cancel", node, node.__data__, o.index, o.group);
+               delete schedules[i];
+             }
+           } // Defer the first tick to end of the current frame; see d3/d3#1576.
+           // Note the transition may be canceled after start and before the first tick!
+           // Note this must be scheduled before the start event; see d3/d3-transition#16!
+           // Assuming this is successful, subsequent callbacks go straight to tick.
+
+
+           d3_timeout(function () {
+             if (self.state === STARTED) {
+               self.state = RUNNING;
+               self.timer.restart(tick, self.delay, self.time);
+               tick(elapsed);
+             }
+           }); // Dispatch the start event.
+           // Note this must be done before the tween are initialized.
+
+           self.state = STARTING;
+           self.on.call("start", node, node.__data__, self.index, self.group);
+           if (self.state !== STARTING) return; // interrupted
+
+           self.state = STARTED; // Initialize the tween, deleting null tween.
+
+           tween = new Array(n = self.tween.length);
+
+           for (i = 0, j = -1; i < n; ++i) {
+             if (o = self.tween[i].value.call(node, node.__data__, self.index, self.group)) {
+               tween[++j] = o;
+             }
+           }
+
+           tween.length = j + 1;
+         }
+
+         function tick(elapsed) {
+           var t = elapsed < self.duration ? self.ease.call(null, elapsed / self.duration) : (self.timer.restart(stop), self.state = ENDING, 1),
+               i = -1,
+               n = tween.length;
+
+           while (++i < n) {
+             tween[i].call(node, t);
+           } // Dispatch the end event.
+
+
+           if (self.state === ENDING) {
+             self.on.call("end", node, node.__data__, self.index, self.group);
+             stop();
+           }
+         }
+
+         function stop() {
+           self.state = ENDED;
+           self.timer.stop();
+           delete schedules[id];
+
+           for (var i in schedules) {
+             return;
+           } // eslint-disable-line no-unused-vars
+
+
+           delete node.__transition;
+         }
+       }
+
+       function interrupt (node, name) {
+         var schedules = node.__transition,
+             schedule,
+             active,
+             empty = true,
+             i;
+         if (!schedules) return;
+         name = name == null ? null : name + "";
+
+         for (i in schedules) {
+           if ((schedule = schedules[i]).name !== name) {
+             empty = false;
+             continue;
+           }
+
+           active = schedule.state > STARTING && schedule.state < ENDING;
+           schedule.state = ENDED;
+           schedule.timer.stop();
+           schedule.on.call(active ? "interrupt" : "cancel", node, node.__data__, schedule.index, schedule.group);
+           delete schedules[i];
+         }
+
+         if (empty) delete node.__transition;
+       }
+
+       function selection_interrupt (name) {
+         return this.each(function () {
+           interrupt(this, name);
+         });
+       }
+
+       function tweenRemove(id, name) {
+         var tween0, tween1;
+         return function () {
+           var schedule = set(this, id),
+               tween = schedule.tween; // If this node shared tween with the previous node,
+           // just assign the updated shared tween and we’re done!
+           // Otherwise, copy-on-write.
+
+           if (tween !== tween0) {
+             tween1 = tween0 = tween;
+
+             for (var i = 0, n = tween1.length; i < n; ++i) {
+               if (tween1[i].name === name) {
+                 tween1 = tween1.slice();
+                 tween1.splice(i, 1);
+                 break;
+               }
+             }
+           }
+
+           schedule.tween = tween1;
+         };
+       }
+
+       function tweenFunction(id, name, value) {
+         var tween0, tween1;
+         if (typeof value !== "function") throw new Error();
+         return function () {
+           var schedule = set(this, id),
+               tween = schedule.tween; // If this node shared tween with the previous node,
+           // just assign the updated shared tween and we’re done!
+           // Otherwise, copy-on-write.
+
+           if (tween !== tween0) {
+             tween1 = (tween0 = tween).slice();
+
+             for (var t = {
+               name: name,
+               value: value
+             }, i = 0, n = tween1.length; i < n; ++i) {
+               if (tween1[i].name === name) {
+                 tween1[i] = t;
+                 break;
+               }
+             }
+
+             if (i === n) tween1.push(t);
+           }
+
+           schedule.tween = tween1;
+         };
+       }
+
+       function transition_tween (name, value) {
+         var id = this._id;
+         name += "";
+
+         if (arguments.length < 2) {
+           var tween = get$1(this.node(), id).tween;
+
+           for (var i = 0, n = tween.length, t; i < n; ++i) {
+             if ((t = tween[i]).name === name) {
+               return t.value;
+             }
+           }
+
+           return null;
+         }
+
+         return this.each((value == null ? tweenRemove : tweenFunction)(id, name, value));
+       }
+       function tweenValue(transition, name, value) {
+         var id = transition._id;
+         transition.each(function () {
+           var schedule = set(this, id);
+           (schedule.value || (schedule.value = {}))[name] = value.apply(this, arguments);
+         });
+         return function (node) {
+           return get$1(node, id).value[name];
+         };
+       }
+
+       function interpolate (a, b) {
+         var c;
+         return (typeof b === "number" ? d3_interpolateNumber : b instanceof color ? d3_interpolateRgb : (c = color(b)) ? (b = c, d3_interpolateRgb) : interpolateString)(a, b);
+       }
+
+       function attrRemove(name) {
+         return function () {
+           this.removeAttribute(name);
+         };
+       }
+
+       function attrRemoveNS(fullname) {
+         return function () {
+           this.removeAttributeNS(fullname.space, fullname.local);
+         };
+       }
+
+       function attrConstant(name, interpolate, value1) {
+         var string00,
+             string1 = value1 + "",
+             interpolate0;
+         return function () {
+           var string0 = this.getAttribute(name);
+           return string0 === string1 ? null : string0 === string00 ? interpolate0 : interpolate0 = interpolate(string00 = string0, value1);
+         };
+       }
+
+       function attrConstantNS(fullname, interpolate, value1) {
+         var string00,
+             string1 = value1 + "",
+             interpolate0;
+         return function () {
+           var string0 = this.getAttributeNS(fullname.space, fullname.local);
+           return string0 === string1 ? null : string0 === string00 ? interpolate0 : interpolate0 = interpolate(string00 = string0, value1);
+         };
+       }
+
+       function attrFunction(name, interpolate, value) {
+         var string00, string10, interpolate0;
+         return function () {
+           var string0,
+               value1 = value(this),
+               string1;
+           if (value1 == null) return void this.removeAttribute(name);
+           string0 = this.getAttribute(name);
+           string1 = value1 + "";
+           return string0 === string1 ? null : string0 === string00 && string1 === string10 ? interpolate0 : (string10 = string1, interpolate0 = interpolate(string00 = string0, value1));
+         };
+       }
+
+       function attrFunctionNS(fullname, interpolate, value) {
+         var string00, string10, interpolate0;
+         return function () {
+           var string0,
+               value1 = value(this),
+               string1;
+           if (value1 == null) return void this.removeAttributeNS(fullname.space, fullname.local);
+           string0 = this.getAttributeNS(fullname.space, fullname.local);
+           string1 = value1 + "";
+           return string0 === string1 ? null : string0 === string00 && string1 === string10 ? interpolate0 : (string10 = string1, interpolate0 = interpolate(string00 = string0, value1));
+         };
+       }
+
+       function transition_attr (name, value) {
+         var fullname = namespace(name),
+             i = fullname === "transform" ? interpolateTransformSvg : interpolate;
+         return this.attrTween(name, typeof value === "function" ? (fullname.local ? attrFunctionNS : attrFunction)(fullname, i, tweenValue(this, "attr." + name, value)) : value == null ? (fullname.local ? attrRemoveNS : attrRemove)(fullname) : (fullname.local ? attrConstantNS : attrConstant)(fullname, i, value));
+       }
+
+       function attrInterpolate(name, i) {
+         return function (t) {
+           this.setAttribute(name, i.call(this, t));
+         };
+       }
+
+       function attrInterpolateNS(fullname, i) {
+         return function (t) {
+           this.setAttributeNS(fullname.space, fullname.local, i.call(this, t));
+         };
+       }
+
+       function attrTweenNS(fullname, value) {
+         var t0, i0;
+
+         function tween() {
+           var i = value.apply(this, arguments);
+           if (i !== i0) t0 = (i0 = i) && attrInterpolateNS(fullname, i);
+           return t0;
+         }
+
+         tween._value = value;
+         return tween;
+       }
+
+       function attrTween(name, value) {
+         var t0, i0;
+
+         function tween() {
+           var i = value.apply(this, arguments);
+           if (i !== i0) t0 = (i0 = i) && attrInterpolate(name, i);
+           return t0;
+         }
+
+         tween._value = value;
+         return tween;
+       }
+
+       function transition_attrTween (name, value) {
+         var key = "attr." + name;
+         if (arguments.length < 2) return (key = this.tween(key)) && key._value;
+         if (value == null) return this.tween(key, null);
+         if (typeof value !== "function") throw new Error();
+         var fullname = namespace(name);
+         return this.tween(key, (fullname.local ? attrTweenNS : attrTween)(fullname, value));
+       }
+
+       function delayFunction(id, value) {
+         return function () {
+           init(this, id).delay = +value.apply(this, arguments);
+         };
+       }
+
+       function delayConstant(id, value) {
+         return value = +value, function () {
+           init(this, id).delay = value;
+         };
+       }
+
+       function transition_delay (value) {
+         var id = this._id;
+         return arguments.length ? this.each((typeof value === "function" ? delayFunction : delayConstant)(id, value)) : get$1(this.node(), id).delay;
+       }
+
+       function durationFunction(id, value) {
+         return function () {
+           set(this, id).duration = +value.apply(this, arguments);
+         };
+       }
+
+       function durationConstant(id, value) {
+         return value = +value, function () {
+           set(this, id).duration = value;
+         };
+       }
+
+       function transition_duration (value) {
+         var id = this._id;
+         return arguments.length ? this.each((typeof value === "function" ? durationFunction : durationConstant)(id, value)) : get$1(this.node(), id).duration;
+       }
+
+       function easeConstant(id, value) {
+         if (typeof value !== "function") throw new Error();
+         return function () {
+           set(this, id).ease = value;
+         };
+       }
+
+       function transition_ease (value) {
+         var id = this._id;
+         return arguments.length ? this.each(easeConstant(id, value)) : get$1(this.node(), id).ease;
+       }
+
+       function easeVarying(id, value) {
+         return function () {
+           var v = value.apply(this, arguments);
+           if (typeof v !== "function") throw new Error();
+           set(this, id).ease = v;
+         };
+       }
+
+       function transition_easeVarying (value) {
+         if (typeof value !== "function") throw new Error();
+         return this.each(easeVarying(this._id, value));
+       }
+
+       function transition_filter (match) {
+         if (typeof match !== "function") match = matcher(match);
+
+         for (var groups = this._groups, m = groups.length, subgroups = new Array(m), j = 0; j < m; ++j) {
+           for (var group = groups[j], n = group.length, subgroup = subgroups[j] = [], node, i = 0; i < n; ++i) {
+             if ((node = group[i]) && match.call(node, node.__data__, i, group)) {
+               subgroup.push(node);
+             }
+           }
+         }
+
+         return new Transition(subgroups, this._parents, this._name, this._id);
+       }
+
+       function transition_merge (transition) {
+         if (transition._id !== this._id) throw new Error();
+
+         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) {
+           for (var group0 = groups0[j], group1 = groups1[j], n = group0.length, merge = merges[j] = new Array(n), node, i = 0; i < n; ++i) {
+             if (node = group0[i] || group1[i]) {
+               merge[i] = node;
+             }
+           }
+         }
+
+         for (; j < m0; ++j) {
+           merges[j] = groups0[j];
+         }
+
+         return new Transition(merges, this._parents, this._name, this._id);
+       }
+
+       function start(name) {
+         return (name + "").trim().split(/^|\s+/).every(function (t) {
+           var i = t.indexOf(".");
+           if (i >= 0) t = t.slice(0, i);
+           return !t || t === "start";
+         });
+       }
+
+       function onFunction(id, name, listener) {
+         var on0,
+             on1,
+             sit = start(name) ? init : set;
+         return function () {
+           var schedule = sit(this, id),
+               on = schedule.on; // If this node shared a dispatch with the previous node,
+           // just assign the updated shared dispatch and we’re done!
+           // Otherwise, copy-on-write.
+
+           if (on !== on0) (on1 = (on0 = on).copy()).on(name, listener);
+           schedule.on = on1;
+         };
+       }
+
+       function transition_on (name, listener) {
+         var id = this._id;
+         return arguments.length < 2 ? get$1(this.node(), id).on.on(name) : this.each(onFunction(id, name, listener));
+       }
+
+       function removeFunction(id) {
+         return function () {
+           var parent = this.parentNode;
+
+           for (var i in this.__transition) {
+             if (+i !== id) return;
+           }
+
+           if (parent) parent.removeChild(this);
+         };
+       }
+
+       function transition_remove () {
+         return this.on("end.remove", removeFunction(this._id));
+       }
+
+       function transition_select (select) {
+         var name = this._name,
+             id = this._id;
+         if (typeof select !== "function") select = selector(select);
+
+         for (var groups = this._groups, m = groups.length, subgroups = new Array(m), j = 0; j < m; ++j) {
+           for (var group = groups[j], n = group.length, subgroup = subgroups[j] = new Array(n), node, subnode, i = 0; i < n; ++i) {
+             if ((node = group[i]) && (subnode = select.call(node, node.__data__, i, group))) {
+               if ("__data__" in node) subnode.__data__ = node.__data__;
+               subgroup[i] = subnode;
+               schedule(subgroup[i], name, id, i, subgroup, get$1(node, id));
+             }
+           }
+         }
+
+         return new Transition(subgroups, this._parents, name, id);
+       }
+
+       function transition_selectAll (select) {
+         var name = this._name,
+             id = this._id;
+         if (typeof select !== "function") select = selectorAll(select);
+
+         for (var groups = this._groups, m = groups.length, subgroups = [], parents = [], j = 0; j < m; ++j) {
+           for (var group = groups[j], n = group.length, node, i = 0; i < n; ++i) {
+             if (node = group[i]) {
+               for (var children = select.call(node, node.__data__, i, group), child, inherit = get$1(node, id), k = 0, l = children.length; k < l; ++k) {
+                 if (child = children[k]) {
+                   schedule(child, name, id, k, children, inherit);
+                 }
+               }
+
+               subgroups.push(children);
+               parents.push(node);
+             }
+           }
+         }
+
+         return new Transition(subgroups, parents, name, id);
+       }
+
+       var Selection = selection.prototype.constructor;
+       function transition_selection () {
+         return new Selection(this._groups, this._parents);
+       }
+
+       function styleNull(name, interpolate) {
+         var string00, string10, interpolate0;
+         return function () {
+           var string0 = styleValue(this, name),
+               string1 = (this.style.removeProperty(name), styleValue(this, name));
+           return string0 === string1 ? null : string0 === string00 && string1 === string10 ? interpolate0 : interpolate0 = interpolate(string00 = string0, string10 = string1);
+         };
+       }
+
+       function styleRemove(name) {
+         return function () {
+           this.style.removeProperty(name);
+         };
+       }
+
+       function styleConstant(name, interpolate, value1) {
+         var string00,
+             string1 = value1 + "",
+             interpolate0;
+         return function () {
+           var string0 = styleValue(this, name);
+           return string0 === string1 ? null : string0 === string00 ? interpolate0 : interpolate0 = interpolate(string00 = string0, value1);
+         };
+       }
+
+       function styleFunction(name, interpolate, value) {
+         var string00, string10, interpolate0;
+         return function () {
+           var string0 = styleValue(this, name),
+               value1 = value(this),
+               string1 = value1 + "";
+           if (value1 == null) string1 = value1 = (this.style.removeProperty(name), styleValue(this, name));
+           return string0 === string1 ? null : string0 === string00 && string1 === string10 ? interpolate0 : (string10 = string1, interpolate0 = interpolate(string00 = string0, value1));
+         };
+       }
+
+       function styleMaybeRemove(id, name) {
+         var on0,
+             on1,
+             listener0,
+             key = "style." + name,
+             event = "end." + key,
+             remove;
+         return function () {
+           var schedule = set(this, id),
+               on = schedule.on,
+               listener = schedule.value[key] == null ? remove || (remove = styleRemove(name)) : undefined; // If this node shared a dispatch with the previous node,
+           // just assign the updated shared dispatch and we’re done!
+           // Otherwise, copy-on-write.
+
+           if (on !== on0 || listener0 !== listener) (on1 = (on0 = on).copy()).on(event, listener0 = listener);
+           schedule.on = on1;
+         };
+       }
+
+       function transition_style (name, value, priority) {
+         var i = (name += "") === "transform" ? interpolateTransformCss : interpolate;
+         return value == null ? this.styleTween(name, styleNull(name, i)).on("end.style." + name, styleRemove(name)) : typeof value === "function" ? this.styleTween(name, styleFunction(name, i, tweenValue(this, "style." + name, value))).each(styleMaybeRemove(this._id, name)) : this.styleTween(name, styleConstant(name, i, value), priority).on("end.style." + name, null);
+       }
+
+       function styleInterpolate(name, i, priority) {
+         return function (t) {
+           this.style.setProperty(name, i.call(this, t), priority);
+         };
+       }
+
+       function styleTween(name, value, priority) {
+         var t, i0;
+
+         function tween() {
+           var i = value.apply(this, arguments);
+           if (i !== i0) t = (i0 = i) && styleInterpolate(name, i, priority);
+           return t;
+         }
+
+         tween._value = value;
+         return tween;
+       }
+
+       function transition_styleTween (name, value, priority) {
+         var key = "style." + (name += "");
+         if (arguments.length < 2) return (key = this.tween(key)) && key._value;
+         if (value == null) return this.tween(key, null);
+         if (typeof value !== "function") throw new Error();
+         return this.tween(key, styleTween(name, value, priority == null ? "" : priority));
+       }
+
+       function textConstant(value) {
+         return function () {
+           this.textContent = value;
+         };
+       }
+
+       function textFunction(value) {
+         return function () {
+           var value1 = value(this);
+           this.textContent = value1 == null ? "" : value1;
+         };
+       }
+
+       function transition_text (value) {
+         return this.tween("text", typeof value === "function" ? textFunction(tweenValue(this, "text", value)) : textConstant(value == null ? "" : value + ""));
+       }
+
+       function textInterpolate(i) {
+         return function (t) {
+           this.textContent = i.call(this, t);
+         };
+       }
+
+       function textTween(value) {
+         var t0, i0;
+
+         function tween() {
+           var i = value.apply(this, arguments);
+           if (i !== i0) t0 = (i0 = i) && textInterpolate(i);
+           return t0;
+         }
+
+         tween._value = value;
+         return tween;
+       }
+
+       function transition_textTween (value) {
+         var key = "text";
+         if (arguments.length < 1) return (key = this.tween(key)) && key._value;
+         if (value == null) return this.tween(key, null);
+         if (typeof value !== "function") throw new Error();
+         return this.tween(key, textTween(value));
+       }
+
+       function transition_transition () {
+         var name = this._name,
+             id0 = this._id,
+             id1 = newId();
+
+         for (var groups = this._groups, m = groups.length, j = 0; j < m; ++j) {
+           for (var group = groups[j], n = group.length, node, i = 0; i < n; ++i) {
+             if (node = group[i]) {
+               var inherit = get$1(node, id0);
+               schedule(node, name, id1, i, group, {
+                 time: inherit.time + inherit.delay + inherit.duration,
+                 delay: 0,
+                 duration: inherit.duration,
+                 ease: inherit.ease
+               });
+             }
+           }
+         }
+
+         return new Transition(groups, this._parents, name, id1);
+       }
+
+       function transition_end () {
+         var on0,
+             on1,
+             that = this,
+             id = that._id,
+             size = that.size();
+         return new Promise(function (resolve, reject) {
+           var cancel = {
+             value: reject
+           },
+               end = {
+             value: function value() {
+               if (--size === 0) resolve();
+             }
+           };
+           that.each(function () {
+             var schedule = set(this, id),
+                 on = schedule.on; // If this node shared a dispatch with the previous node,
+             // just assign the updated shared dispatch and we’re done!
+             // Otherwise, copy-on-write.
+
+             if (on !== on0) {
+               on1 = (on0 = on).copy();
+
+               on1._.cancel.push(cancel);
+
+               on1._.interrupt.push(cancel);
+
+               on1._.end.push(end);
+             }
+
+             schedule.on = on1;
+           }); // The selection was empty, resolve end immediately
+
+           if (size === 0) resolve();
+         });
+       }
+
+       var id = 0;
+       function Transition(groups, parents, name, id) {
+         this._groups = groups;
+         this._parents = parents;
+         this._name = name;
+         this._id = id;
+       }
+       function newId() {
+         return ++id;
+       }
+       var selection_prototype = selection.prototype;
+       Transition.prototype = _defineProperty({
+         constructor: Transition,
+         select: transition_select,
+         selectAll: transition_selectAll,
+         filter: transition_filter,
+         merge: transition_merge,
+         selection: transition_selection,
+         transition: transition_transition,
+         call: selection_prototype.call,
+         nodes: selection_prototype.nodes,
+         node: selection_prototype.node,
+         size: selection_prototype.size,
+         empty: selection_prototype.empty,
+         each: selection_prototype.each,
+         on: transition_on,
+         attr: transition_attr,
+         attrTween: transition_attrTween,
+         style: transition_style,
+         styleTween: transition_styleTween,
+         text: transition_text,
+         textTween: transition_textTween,
+         remove: transition_remove,
+         tween: transition_tween,
+         delay: transition_delay,
+         duration: transition_duration,
+         ease: transition_ease,
+         easeVarying: transition_easeVarying,
+         end: transition_end
+       }, Symbol.iterator, selection_prototype[Symbol.iterator]);
+
+       var linear$1 = function linear(t) {
+         return +t;
+       };
+
+       function cubicInOut(t) {
+         return ((t *= 2) <= 1 ? t * t * t : (t -= 2) * t * t + 2) / 2;
+       }
+
+       var defaultTiming = {
+         time: null,
+         // Set on use.
+         delay: 0,
+         duration: 250,
+         ease: cubicInOut
+       };
+
+       function inherit(node, id) {
+         var timing;
+
+         while (!(timing = node.__transition) || !(timing = timing[id])) {
+           if (!(node = node.parentNode)) {
+             throw new Error("transition ".concat(id, " not found"));
+           }
+         }
+
+         return timing;
+       }
+
+       function selection_transition (name) {
+         var id, timing;
+
+         if (name instanceof Transition) {
+           id = name._id, name = name._name;
+         } else {
+           id = newId(), (timing = defaultTiming).time = now$1(), name = name == null ? null : name + "";
+         }
+
+         for (var groups = this._groups, m = groups.length, j = 0; j < m; ++j) {
+           for (var group = groups[j], n = group.length, node, i = 0; i < n; ++i) {
+             if (node = group[i]) {
+               schedule(node, name, id, i, group, timing || inherit(node, id));
+             }
+           }
+         }
+
+         return new Transition(groups, this._parents, name, id);
+       }
+
+       selection.prototype.interrupt = selection_interrupt;
+       selection.prototype.transition = selection_transition;
+
+       var constant = (function (x) {
+         return function () {
+           return x;
+         };
+       });
+
+       function ZoomEvent(type, _ref) {
+         var sourceEvent = _ref.sourceEvent,
+             target = _ref.target,
+             transform = _ref.transform,
+             dispatch = _ref.dispatch;
+         Object.defineProperties(this, {
+           type: {
+             value: type,
+             enumerable: true,
+             configurable: true
+           },
+           sourceEvent: {
+             value: sourceEvent,
+             enumerable: true,
+             configurable: true
+           },
+           target: {
+             value: target,
+             enumerable: true,
+             configurable: true
+           },
+           transform: {
+             value: transform,
+             enumerable: true,
+             configurable: true
+           },
+           _: {
+             value: dispatch
+           }
+         });
+       }
+
+       function Transform(k, x, y) {
+         this.k = k;
+         this.x = x;
+         this.y = y;
+       }
+       Transform.prototype = {
+         constructor: Transform,
+         scale: function scale(k) {
+           return k === 1 ? this : new Transform(this.k * k, this.x, this.y);
+         },
+         translate: function translate(x, y) {
+           return x === 0 & y === 0 ? this : new Transform(this.k, this.x + this.k * x, this.y + this.k * y);
+         },
+         apply: function apply(point) {
+           return [point[0] * this.k + this.x, point[1] * this.k + this.y];
+         },
+         applyX: function applyX(x) {
+           return x * this.k + this.x;
+         },
+         applyY: function applyY(y) {
+           return y * this.k + this.y;
+         },
+         invert: function invert(location) {
+           return [(location[0] - this.x) / this.k, (location[1] - this.y) / this.k];
+         },
+         invertX: function invertX(x) {
+           return (x - this.x) / this.k;
+         },
+         invertY: function invertY(y) {
+           return (y - this.y) / this.k;
+         },
+         rescaleX: function rescaleX(x) {
+           return x.copy().domain(x.range().map(this.invertX, this).map(x.invert, x));
+         },
+         rescaleY: function rescaleY(y) {
+           return y.copy().domain(y.range().map(this.invertY, this).map(y.invert, y));
+         },
+         toString: function toString() {
+           return "translate(" + this.x + "," + this.y + ") scale(" + this.k + ")";
+         }
+       };
+       var identity$2 = new Transform(1, 0, 0);
+
+       function nopropagation(event) {
+         event.stopImmediatePropagation();
+       }
+       function noevent (event) {
+         event.preventDefault();
+         event.stopImmediatePropagation();
+       }
+
+       // except for pinch-to-zoom, which is sent as a wheel+ctrlKey event
+
+       function defaultFilter$1(event) {
+         return (!event.ctrlKey || event.type === 'wheel') && !event.button;
+       }
+
+       function defaultExtent$1() {
+         var e = this;
+
+         if (e instanceof SVGElement) {
+           e = e.ownerSVGElement || e;
+
+           if (e.hasAttribute("viewBox")) {
+             e = e.viewBox.baseVal;
+             return [[e.x, e.y], [e.x + e.width, e.y + e.height]];
+           }
+
+           return [[0, 0], [e.width.baseVal.value, e.height.baseVal.value]];
+         }
+
+         return [[0, 0], [e.clientWidth, e.clientHeight]];
+       }
+
+       function defaultTransform() {
+         return this.__zoom || identity$2;
+       }
+
+       function defaultWheelDelta$1(event) {
+         return -event.deltaY * (event.deltaMode === 1 ? 0.05 : event.deltaMode ? 1 : 0.002) * (event.ctrlKey ? 10 : 1);
+       }
+
+       function defaultTouchable() {
+         return navigator.maxTouchPoints || "ontouchstart" in this;
+       }
+
+       function defaultConstrain$1(transform, extent, translateExtent) {
+         var dx0 = transform.invertX(extent[0][0]) - translateExtent[0][0],
+             dx1 = transform.invertX(extent[1][0]) - translateExtent[1][0],
+             dy0 = transform.invertY(extent[0][1]) - translateExtent[0][1],
+             dy1 = transform.invertY(extent[1][1]) - translateExtent[1][1];
+         return transform.translate(dx1 > dx0 ? (dx0 + dx1) / 2 : Math.min(0, dx0) || Math.max(0, dx1), dy1 > dy0 ? (dy0 + dy1) / 2 : Math.min(0, dy0) || Math.max(0, dy1));
+       }
+
+       function d3_zoom () {
+         var filter = defaultFilter$1,
+             extent = defaultExtent$1,
+             constrain = defaultConstrain$1,
+             wheelDelta = defaultWheelDelta$1,
+             touchable = defaultTouchable,
+             scaleExtent = [0, Infinity],
+             translateExtent = [[-Infinity, -Infinity], [Infinity, Infinity]],
+             duration = 250,
+             interpolate = interpolateZoom,
+             listeners = dispatch$8("start", "zoom", "end"),
+             touchstarting,
+             touchfirst,
+             touchending,
+             touchDelay = 500,
+             wheelDelay = 150,
+             clickDistance2 = 0,
+             tapDistance = 10;
+
+         function zoom(selection) {
+           selection.property("__zoom", defaultTransform).on("wheel.zoom", wheeled).on("mousedown.zoom", mousedowned).on("dblclick.zoom", dblclicked).filter(touchable).on("touchstart.zoom", touchstarted).on("touchmove.zoom", touchmoved).on("touchend.zoom touchcancel.zoom", touchended).style("-webkit-tap-highlight-color", "rgba(0,0,0,0)");
+         }
+
+         zoom.transform = function (collection, transform, point, event) {
+           var selection = collection.selection ? collection.selection() : collection;
+           selection.property("__zoom", defaultTransform);
+
+           if (collection !== selection) {
+             schedule(collection, transform, point, event);
+           } else {
+             selection.interrupt().each(function () {
+               gesture(this, arguments).event(event).start().zoom(null, typeof transform === "function" ? transform.apply(this, arguments) : transform).end();
+             });
+           }
+         };
+
+         zoom.scaleBy = function (selection, k, p, event) {
+           zoom.scaleTo(selection, function () {
+             var k0 = this.__zoom.k,
+                 k1 = typeof k === "function" ? k.apply(this, arguments) : k;
+             return k0 * k1;
+           }, p, event);
+         };
+
+         zoom.scaleTo = function (selection, k, p, event) {
+           zoom.transform(selection, function () {
+             var e = extent.apply(this, arguments),
+                 t0 = this.__zoom,
+                 p0 = p == null ? centroid(e) : typeof p === "function" ? p.apply(this, arguments) : p,
+                 p1 = t0.invert(p0),
+                 k1 = typeof k === "function" ? k.apply(this, arguments) : k;
+             return constrain(translate(scale(t0, k1), p0, p1), e, translateExtent);
+           }, p, event);
+         };
+
+         zoom.translateBy = function (selection, x, y, event) {
+           zoom.transform(selection, function () {
+             return constrain(this.__zoom.translate(typeof x === "function" ? x.apply(this, arguments) : x, typeof y === "function" ? y.apply(this, arguments) : y), extent.apply(this, arguments), translateExtent);
+           }, null, event);
+         };
+
+         zoom.translateTo = function (selection, x, y, p, event) {
+           zoom.transform(selection, function () {
+             var e = extent.apply(this, arguments),
+                 t = this.__zoom,
+                 p0 = p == null ? centroid(e) : typeof p === "function" ? p.apply(this, arguments) : p;
+             return constrain(identity$2.translate(p0[0], p0[1]).scale(t.k).translate(typeof x === "function" ? -x.apply(this, arguments) : -x, typeof y === "function" ? -y.apply(this, arguments) : -y), e, translateExtent);
+           }, p, event);
+         };
+
+         function scale(transform, k) {
+           k = Math.max(scaleExtent[0], Math.min(scaleExtent[1], k));
+           return k === transform.k ? transform : new Transform(k, transform.x, transform.y);
+         }
+
+         function translate(transform, p0, p1) {
+           var x = p0[0] - p1[0] * transform.k,
+               y = p0[1] - p1[1] * transform.k;
+           return x === transform.x && y === transform.y ? transform : new Transform(transform.k, x, y);
+         }
+
+         function centroid(extent) {
+           return [(+extent[0][0] + +extent[1][0]) / 2, (+extent[0][1] + +extent[1][1]) / 2];
+         }
+
+         function schedule(transition, transform, point, event) {
+           transition.on("start.zoom", function () {
+             gesture(this, arguments).event(event).start();
+           }).on("interrupt.zoom end.zoom", function () {
+             gesture(this, arguments).event(event).end();
+           }).tween("zoom", function () {
+             var that = this,
+                 args = arguments,
+                 g = gesture(that, args).event(event),
+                 e = extent.apply(that, args),
+                 p = point == null ? centroid(e) : typeof point === "function" ? point.apply(that, args) : point,
+                 w = Math.max(e[1][0] - e[0][0], e[1][1] - e[0][1]),
+                 a = that.__zoom,
+                 b = typeof transform === "function" ? transform.apply(that, args) : transform,
+                 i = interpolate(a.invert(p).concat(w / a.k), b.invert(p).concat(w / b.k));
+             return function (t) {
+               if (t === 1) t = b; // Avoid rounding error on end.
+               else {
+                 var l = i(t),
+                     k = w / l[2];
+                 t = new Transform(k, p[0] - l[0] * k, p[1] - l[1] * k);
+               }
+               g.zoom(null, t);
+             };
+           });
+         }
+
+         function gesture(that, args, clean) {
+           return !clean && that.__zooming || new Gesture(that, args);
+         }
+
+         function Gesture(that, args) {
+           this.that = that;
+           this.args = args;
+           this.active = 0;
+           this.sourceEvent = null;
+           this.extent = extent.apply(that, args);
+           this.taps = 0;
+         }
+
+         Gesture.prototype = {
+           event: function event(_event) {
+             if (_event) this.sourceEvent = _event;
+             return this;
+           },
+           start: function start() {
+             if (++this.active === 1) {
+               this.that.__zooming = this;
+               this.emit("start");
+             }
+
+             return this;
+           },
+           zoom: function zoom(key, transform) {
+             if (this.mouse && key !== "mouse") this.mouse[1] = transform.invert(this.mouse[0]);
+             if (this.touch0 && key !== "touch") this.touch0[1] = transform.invert(this.touch0[0]);
+             if (this.touch1 && key !== "touch") this.touch1[1] = transform.invert(this.touch1[0]);
+             this.that.__zoom = transform;
+             this.emit("zoom");
+             return this;
+           },
+           end: function end() {
+             if (--this.active === 0) {
+               delete this.that.__zooming;
+               this.emit("end");
+             }
+
+             return this;
+           },
+           emit: function emit(type) {
+             var d = select(this.that).datum();
+             listeners.call(type, this.that, new ZoomEvent(type, {
+               sourceEvent: this.sourceEvent,
+               target: zoom,
+               type: type,
+               transform: this.that.__zoom,
+               dispatch: listeners
+             }), d);
+           }
+         };
+
+         function wheeled(event) {
+           for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {
+             args[_key - 1] = arguments[_key];
+           }
+
+           if (!filter.apply(this, arguments)) return;
+           var g = gesture(this, args).event(event),
+               t = this.__zoom,
+               k = Math.max(scaleExtent[0], Math.min(scaleExtent[1], t.k * Math.pow(2, wheelDelta.apply(this, arguments)))),
+               p = pointer(event); // If the mouse is in the same location as before, reuse it.
+           // If there were recent wheel events, reset the wheel idle timeout.
+
+           if (g.wheel) {
+             if (g.mouse[0][0] !== p[0] || g.mouse[0][1] !== p[1]) {
+               g.mouse[1] = t.invert(g.mouse[0] = p);
+             }
+
+             clearTimeout(g.wheel);
+           } // If this wheel event won’t trigger a transform change, ignore it.
+           else if (t.k === k) return; // Otherwise, capture the mouse point and location at the start.
+           else {
+             g.mouse = [p, t.invert(p)];
+             interrupt(this);
+             g.start();
+           }
+
+           noevent(event);
+           g.wheel = setTimeout(wheelidled, wheelDelay);
+           g.zoom("mouse", constrain(translate(scale(t, k), g.mouse[0], g.mouse[1]), g.extent, translateExtent));
+
+           function wheelidled() {
+             g.wheel = null;
+             g.end();
+           }
+         }
+
+         function mousedowned(event) {
+           for (var _len2 = arguments.length, args = new Array(_len2 > 1 ? _len2 - 1 : 0), _key2 = 1; _key2 < _len2; _key2++) {
+             args[_key2 - 1] = arguments[_key2];
+           }
+
+           if (touchending || !filter.apply(this, arguments)) return;
+           var g = gesture(this, args, true).event(event),
+               v = select(event.view).on("mousemove.zoom", mousemoved, true).on("mouseup.zoom", mouseupped, true),
+               p = pointer(event, currentTarget),
+               currentTarget = event.currentTarget,
+               x0 = event.clientX,
+               y0 = event.clientY;
+           dragDisable(event.view);
+           nopropagation(event);
+           g.mouse = [p, this.__zoom.invert(p)];
+           interrupt(this);
+           g.start();
+
+           function mousemoved(event) {
+             noevent(event);
+
+             if (!g.moved) {
+               var dx = event.clientX - x0,
+                   dy = event.clientY - y0;
+               g.moved = dx * dx + dy * dy > clickDistance2;
+             }
+
+             g.event(event).zoom("mouse", constrain(translate(g.that.__zoom, g.mouse[0] = pointer(event, currentTarget), g.mouse[1]), g.extent, translateExtent));
+           }
+
+           function mouseupped(event) {
+             v.on("mousemove.zoom mouseup.zoom", null);
+             yesdrag(event.view, g.moved);
+             noevent(event);
+             g.event(event).end();
+           }
+         }
+
+         function dblclicked(event) {
+           for (var _len3 = arguments.length, args = new Array(_len3 > 1 ? _len3 - 1 : 0), _key3 = 1; _key3 < _len3; _key3++) {
+             args[_key3 - 1] = arguments[_key3];
+           }
+
+           if (!filter.apply(this, arguments)) return;
+           var t0 = this.__zoom,
+               p0 = pointer(event.changedTouches ? event.changedTouches[0] : event, this),
+               p1 = t0.invert(p0),
+               k1 = t0.k * (event.shiftKey ? 0.5 : 2),
+               t1 = constrain(translate(scale(t0, k1), p0, p1), extent.apply(this, args), translateExtent);
+           noevent(event);
+           if (duration > 0) select(this).transition().duration(duration).call(schedule, t1, p0, event);else select(this).call(zoom.transform, t1, p0, event);
+         }
+
+         function touchstarted(event) {
+           for (var _len4 = arguments.length, args = new Array(_len4 > 1 ? _len4 - 1 : 0), _key4 = 1; _key4 < _len4; _key4++) {
+             args[_key4 - 1] = arguments[_key4];
+           }
+
+           if (!filter.apply(this, arguments)) return;
+           var touches = event.touches,
+               n = touches.length,
+               g = gesture(this, args, event.changedTouches.length === n).event(event),
+               started,
+               i,
+               t,
+               p;
+           nopropagation(event);
+
+           for (i = 0; i < n; ++i) {
+             t = touches[i], p = pointer(t, this);
+             p = [p, this.__zoom.invert(p), t.identifier];
+             if (!g.touch0) g.touch0 = p, started = true, g.taps = 1 + !!touchstarting;else if (!g.touch1 && g.touch0[2] !== p[2]) g.touch1 = p, g.taps = 0;
+           }
+
+           if (touchstarting) touchstarting = clearTimeout(touchstarting);
+
+           if (started) {
+             if (g.taps < 2) touchfirst = p[0], touchstarting = setTimeout(function () {
+               touchstarting = null;
+             }, touchDelay);
+             interrupt(this);
+             g.start();
+           }
+         }
+
+         function touchmoved(event) {
+           if (!this.__zooming) return;
+
+           for (var _len5 = arguments.length, args = new Array(_len5 > 1 ? _len5 - 1 : 0), _key5 = 1; _key5 < _len5; _key5++) {
+             args[_key5 - 1] = arguments[_key5];
+           }
+
+           var g = gesture(this, args).event(event),
+               touches = event.changedTouches,
+               n = touches.length,
+               i,
+               t,
+               p,
+               l;
+           noevent(event);
+
+           for (i = 0; i < n; ++i) {
+             t = touches[i], p = pointer(t, this);
+             if (g.touch0 && g.touch0[2] === t.identifier) g.touch0[0] = p;else if (g.touch1 && g.touch1[2] === t.identifier) g.touch1[0] = p;
+           }
+
+           t = g.that.__zoom;
+
+           if (g.touch1) {
+             var p0 = g.touch0[0],
+                 l0 = g.touch0[1],
+                 p1 = g.touch1[0],
+                 l1 = g.touch1[1],
+                 dp = (dp = p1[0] - p0[0]) * dp + (dp = p1[1] - p0[1]) * dp,
+                 dl = (dl = l1[0] - l0[0]) * dl + (dl = l1[1] - l0[1]) * dl;
+             t = scale(t, Math.sqrt(dp / dl));
+             p = [(p0[0] + p1[0]) / 2, (p0[1] + p1[1]) / 2];
+             l = [(l0[0] + l1[0]) / 2, (l0[1] + l1[1]) / 2];
+           } else if (g.touch0) p = g.touch0[0], l = g.touch0[1];else return;
+
+           g.zoom("touch", constrain(translate(t, p, l), g.extent, translateExtent));
+         }
+
+         function touchended(event) {
+           for (var _len6 = arguments.length, args = new Array(_len6 > 1 ? _len6 - 1 : 0), _key6 = 1; _key6 < _len6; _key6++) {
+             args[_key6 - 1] = arguments[_key6];
+           }
+
+           if (!this.__zooming) return;
+           var g = gesture(this, args).event(event),
+               touches = event.changedTouches,
+               n = touches.length,
+               i,
+               t;
+           nopropagation(event);
+           if (touchending) clearTimeout(touchending);
+           touchending = setTimeout(function () {
+             touchending = null;
+           }, touchDelay);
+
+           for (i = 0; i < n; ++i) {
+             t = touches[i];
+             if (g.touch0 && g.touch0[2] === t.identifier) delete g.touch0;else if (g.touch1 && g.touch1[2] === t.identifier) delete g.touch1;
+           }
+
+           if (g.touch1 && !g.touch0) g.touch0 = g.touch1, delete g.touch1;
+           if (g.touch0) g.touch0[1] = this.__zoom.invert(g.touch0[0]);else {
+             g.end(); // If this was a dbltap, reroute to the (optional) dblclick.zoom handler.
+
+             if (g.taps === 2) {
+               t = pointer(t, this);
+
+               if (Math.hypot(touchfirst[0] - t[0], touchfirst[1] - t[1]) < tapDistance) {
+                 var p = select(this).on("dblclick.zoom");
+                 if (p) p.apply(this, arguments);
+               }
+             }
+           }
+         }
+
+         zoom.wheelDelta = function (_) {
+           return arguments.length ? (wheelDelta = typeof _ === "function" ? _ : constant(+_), zoom) : wheelDelta;
+         };
+
+         zoom.filter = function (_) {
+           return arguments.length ? (filter = typeof _ === "function" ? _ : constant(!!_), zoom) : filter;
+         };
+
+         zoom.touchable = function (_) {
+           return arguments.length ? (touchable = typeof _ === "function" ? _ : constant(!!_), zoom) : touchable;
+         };
+
+         zoom.extent = function (_) {
+           return arguments.length ? (extent = typeof _ === "function" ? _ : constant([[+_[0][0], +_[0][1]], [+_[1][0], +_[1][1]]]), zoom) : extent;
+         };
+
+         zoom.scaleExtent = function (_) {
+           return arguments.length ? (scaleExtent[0] = +_[0], scaleExtent[1] = +_[1], zoom) : [scaleExtent[0], scaleExtent[1]];
+         };
+
+         zoom.translateExtent = function (_) {
+           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]]];
+         };
+
+         zoom.constrain = function (_) {
+           return arguments.length ? (constrain = _, zoom) : constrain;
+         };
+
+         zoom.duration = function (_) {
+           return arguments.length ? (duration = +_, zoom) : duration;
+         };
+
+         zoom.interpolate = function (_) {
+           return arguments.length ? (interpolate = _, zoom) : interpolate;
+         };
+
+         zoom.on = function () {
+           var value = listeners.on.apply(listeners, arguments);
+           return value === listeners ? zoom : value;
+         };
+
+         zoom.clickDistance = function (_) {
+           return arguments.length ? (clickDistance2 = (_ = +_) * _, zoom) : Math.sqrt(clickDistance2);
+         };
+
+         zoom.tapDistance = function (_) {
+           return arguments.length ? (tapDistance = +_, zoom) : tapDistance;
+         };
+
+         return zoom;
+       }
+
+       /*
+           Bypasses features of D3's default projection stream pipeline that are unnecessary:
+           * Antimeridian clipping
+           * Spherical rotation
+           * Resampling
+       */
+
+       function geoRawMercator() {
+         var project = mercatorRaw;
+         var k = 512 / Math.PI; // scale
+
+         var x = 0;
+         var y = 0; // translate
+
+         var clipExtent = [[0, 0], [0, 0]];
+
+         function projection(point) {
+           point = project(point[0] * Math.PI / 180, point[1] * Math.PI / 180);
+           return [point[0] * k + x, y - point[1] * k];
+         }
+
+         projection.invert = function (point) {
+           point = project.invert((point[0] - x) / k, (y - point[1]) / k);
+           return point && [point[0] * 180 / Math.PI, point[1] * 180 / Math.PI];
+         };
+
+         projection.scale = function (_) {
+           if (!arguments.length) return k;
+           k = +_;
+           return projection;
+         };
+
+         projection.translate = function (_) {
+           if (!arguments.length) return [x, y];
+           x = +_[0];
+           y = +_[1];
+           return projection;
+         };
+
+         projection.clipExtent = function (_) {
+           if (!arguments.length) return clipExtent;
+           clipExtent = _;
+           return projection;
+         };
+
+         projection.transform = function (obj) {
+           if (!arguments.length) return identity$2.translate(x, y).scale(k);
+           x = +obj.x;
+           y = +obj.y;
+           k = +obj.k;
+           return projection;
+         };
+
+         projection.stream = d3_geoTransform({
+           point: function point(x, y) {
+             var vec = projection([x, y]);
+             this.stream.point(vec[0], vec[1]);
+           }
+         }).stream;
+         return projection;
+       }
+
+       function geoOrthoNormalizedDotProduct(a, b, origin) {
+         if (geoVecEqual(origin, a) || geoVecEqual(origin, b)) {
+           return 1; // coincident points, treat as straight and try to remove
+         }
+
+         return geoVecNormalizedDot(a, b, origin);
+       }
+
+       function geoOrthoFilterDotProduct(dotp, epsilon, lowerThreshold, upperThreshold, allowStraightAngles) {
+         var val = Math.abs(dotp);
+
+         if (val < epsilon) {
+           return 0; // already orthogonal
+         } else if (allowStraightAngles && Math.abs(val - 1) < epsilon) {
+           return 0; // straight angle, which is okay in this case
+         } else if (val < lowerThreshold || val > upperThreshold) {
+           return dotp; // can be adjusted
+         } else {
+           return null; // ignore vertex
+         }
+       }
+
+       function geoOrthoCalcScore(points, isClosed, epsilon, threshold) {
+         var score = 0;
+         var first = isClosed ? 0 : 1;
+         var last = isClosed ? points.length : points.length - 1;
+         var coords = points.map(function (p) {
+           return p.coord;
+         });
+         var lowerThreshold = Math.cos((90 - threshold) * Math.PI / 180);
+         var upperThreshold = Math.cos(threshold * Math.PI / 180);
+
+         for (var i = first; i < last; i++) {
+           var a = coords[(i - 1 + coords.length) % coords.length];
+           var origin = coords[i];
+           var b = coords[(i + 1) % coords.length];
+           var dotp = geoOrthoFilterDotProduct(geoOrthoNormalizedDotProduct(a, b, origin), epsilon, lowerThreshold, upperThreshold);
+           if (dotp === null) continue; // ignore vertex
+
+           score = score + 2.0 * Math.min(Math.abs(dotp - 1.0), Math.min(Math.abs(dotp), Math.abs(dotp + 1)));
+         }
+
+         return score;
+       } // returns the maximum angle less than `lessThan` between the actual corner and a 0° or 90° corner
+
+       function geoOrthoMaxOffsetAngle(coords, isClosed, lessThan) {
+         var max = -Infinity;
+         var first = isClosed ? 0 : 1;
+         var last = isClosed ? coords.length : coords.length - 1;
+
+         for (var i = first; i < last; i++) {
+           var a = coords[(i - 1 + coords.length) % coords.length];
+           var origin = coords[i];
+           var b = coords[(i + 1) % coords.length];
+           var normalizedDotP = geoOrthoNormalizedDotProduct(a, b, origin);
+           var angle = Math.acos(Math.abs(normalizedDotP)) * 180 / Math.PI;
+           if (angle > 45) angle = 90 - angle;
+           if (angle >= lessThan) continue;
+           if (angle > max) max = angle;
+         }
+
+         if (max === -Infinity) return null;
+         return max;
+       } // similar to geoOrthoCalcScore, but returns quickly if there is something to do
+
+       function geoOrthoCanOrthogonalize(coords, isClosed, epsilon, threshold, allowStraightAngles) {
+         var score = null;
+         var first = isClosed ? 0 : 1;
+         var last = isClosed ? coords.length : coords.length - 1;
+         var lowerThreshold = Math.cos((90 - threshold) * Math.PI / 180);
+         var upperThreshold = Math.cos(threshold * Math.PI / 180);
+
+         for (var i = first; i < last; i++) {
+           var a = coords[(i - 1 + coords.length) % coords.length];
+           var origin = coords[i];
+           var b = coords[(i + 1) % coords.length];
+           var dotp = geoOrthoFilterDotProduct(geoOrthoNormalizedDotProduct(a, b, origin), epsilon, lowerThreshold, upperThreshold, allowStraightAngles);
+           if (dotp === null) continue; // ignore vertex
+
+           if (Math.abs(dotp) > 0) return 1; // something to do
+
+           score = 0; // already square
+         }
+
+         return score;
+       }
+
+       var call$2 = functionCall;
+       var fixRegExpWellKnownSymbolLogic$1 = fixRegexpWellKnownSymbolLogic;
+       var anObject$1 = anObject$n;
+       var toLength$3 = toLength$c;
+       var toString$8 = toString$k;
+       var requireObjectCoercible$7 = requireObjectCoercible$e;
+       var getMethod$1 = getMethod$7;
+       var advanceStringIndex = advanceStringIndex$3;
+       var regExpExec$1 = regexpExecAbstract;
+
+       // @@match logic
+       fixRegExpWellKnownSymbolLogic$1('match', function (MATCH, nativeMatch, maybeCallNative) {
+         return [
+           // `String.prototype.match` method
+           // https://tc39.es/ecma262/#sec-string.prototype.match
+           function match(regexp) {
+             var O = requireObjectCoercible$7(this);
+             var matcher = regexp == undefined ? undefined : getMethod$1(regexp, MATCH);
+             return matcher ? call$2(matcher, regexp, O) : new RegExp(regexp)[MATCH](toString$8(O));
+           },
+           // `RegExp.prototype[@@match]` method
+           // https://tc39.es/ecma262/#sec-regexp.prototype-@@match
+           function (string) {
+             var rx = anObject$1(this);
+             var S = toString$8(string);
+             var res = maybeCallNative(nativeMatch, rx, S);
+
+             if (res.done) return res.value;
+
+             if (!rx.global) return regExpExec$1(rx, S);
+
+             var fullUnicode = rx.unicode;
+             rx.lastIndex = 0;
+             var A = [];
+             var n = 0;
+             var result;
+             while ((result = regExpExec$1(rx, S)) !== null) {
+               var matchStr = toString$8(result[0]);
+               A[n] = matchStr;
+               if (matchStr === '') rx.lastIndex = advanceStringIndex(S, toLength$3(rx.lastIndex), fullUnicode);
+               n++;
+             }
+             return n === 0 ? null : A;
+           }
+         ];
+       });
+
+       var $$s = _export;
+       var FREEZING = freezing;
+       var fails$9 = fails$V;
+       var isObject$4 = isObject$s;
+       var onFreeze = internalMetadata.exports.onFreeze;
+
+       // eslint-disable-next-line es/no-object-freeze -- safe
+       var $freeze = Object.freeze;
+       var FAILS_ON_PRIMITIVES = fails$9(function () { $freeze(1); });
+
+       // `Object.freeze` method
+       // https://tc39.es/ecma262/#sec-object.freeze
+       $$s({ target: 'Object', stat: true, forced: FAILS_ON_PRIMITIVES, sham: !FREEZING }, {
+         freeze: function freeze(it) {
+           return $freeze && isObject$4(it) ? $freeze(onFreeze(it)) : it;
+         }
+       });
+
+       // Returns true if a and b have the same elements at the same indices.
+       function utilArrayIdentical(a, b) {
+         // an array is always identical to itself
+         if (a === b) return true;
+         var i = a.length;
+         if (i !== b.length) return false;
+
+         while (i--) {
+           if (a[i] !== b[i]) return false;
+         }
+
+         return true;
+       } // http://2ality.com/2015/01/es6-set-operations.html
+       // Difference (a \ b): create a set that contains those elements of set a that are not in set b.
+       // This operation is also sometimes called minus (-).
+       // var a = [1,2,3];
+       // var b = [4,3,2];
+       // utilArrayDifference(a, b)
+       //   [1]
+       // utilArrayDifference(b, a)
+       //   [4]
+
+       function utilArrayDifference(a, b) {
+         var other = new Set(b);
+         return Array.from(new Set(a)).filter(function (v) {
+           return !other.has(v);
+         });
+       } // Intersection (a ∩ b): create a set that contains those elements of set a that are also in set b.
+       // var a = [1,2,3];
+       // var b = [4,3,2];
+       // utilArrayIntersection(a, b)
+       //   [2,3]
+
+       function utilArrayIntersection(a, b) {
+         var other = new Set(b);
+         return Array.from(new Set(a)).filter(function (v) {
+           return other.has(v);
+         });
+       } // Union (a ∪ b): create a set that contains the elements of both set a and set b.
+       // var a = [1,2,3];
+       // var b = [4,3,2];
+       // utilArrayUnion(a, b)
+       //   [1,2,3,4]
+
+       function utilArrayUnion(a, b) {
+         var result = new Set(a);
+         b.forEach(function (v) {
+           result.add(v);
+         });
+         return Array.from(result);
+       } // Returns an Array with all the duplicates removed
+       // var a = [1,1,2,3,3];
+       // utilArrayUniq(a)
+       //   [1,2,3]
+
+       function utilArrayUniq(a) {
+         return Array.from(new Set(a));
+       } // Splits array into chunks of given chunk size
+       // var a = [1,2,3,4,5,6,7];
+       // utilArrayChunk(a, 3);
+       //   [[1,2,3],[4,5,6],[7]];
+
+       function utilArrayChunk(a, chunkSize) {
+         if (!chunkSize || chunkSize < 0) return [a.slice()];
+         var result = new Array(Math.ceil(a.length / chunkSize));
+         return Array.from(result, function (item, i) {
+           return a.slice(i * chunkSize, i * chunkSize + chunkSize);
+         });
+       } // Flattens two level array into a single level
+       // var a = [[1,2,3],[4,5,6],[7]];
+       // utilArrayFlatten(a);
+       //   [1,2,3,4,5,6,7];
+
+       function utilArrayFlatten(a) {
+         return a.reduce(function (acc, val) {
+           return acc.concat(val);
+         }, []);
+       } // Groups the items of the Array according to the given key
+       // `key` can be passed as a property or as a key function
+       //
+       // var pets = [
+       //     { type: 'Dog', name: 'Spot' },
+       //     { type: 'Cat', name: 'Tiger' },
+       //     { type: 'Dog', name: 'Rover' },
+       //     { type: 'Cat', name: 'Leo' }
+       // ];
+       //
+       // utilArrayGroupBy(pets, 'type')
+       //   {
+       //     'Dog': [{type: 'Dog', name: 'Spot'}, {type: 'Dog', name: 'Rover'}],
+       //     'Cat': [{type: 'Cat', name: 'Tiger'}, {type: 'Cat', name: 'Leo'}]
+       //   }
+       //
+       // utilArrayGroupBy(pets, function(item) { return item.name.length; })
+       //   {
+       //     3: [{type: 'Cat', name: 'Leo'}],
+       //     4: [{type: 'Dog', name: 'Spot'}],
+       //     5: [{type: 'Cat', name: 'Tiger'}, {type: 'Dog', name: 'Rover'}]
+       //   }
+
+       function utilArrayGroupBy(a, key) {
+         return a.reduce(function (acc, item) {
+           var group = typeof key === 'function' ? key(item) : item[key];
+           (acc[group] = acc[group] || []).push(item);
+           return acc;
+         }, {});
+       } // Returns an Array with all the duplicates removed
+       // where uniqueness determined by the given key
+       // `key` can be passed as a property or as a key function
+       //
+       // var pets = [
+       //     { type: 'Dog', name: 'Spot' },
+       //     { type: 'Cat', name: 'Tiger' },
+       //     { type: 'Dog', name: 'Rover' },
+       //     { type: 'Cat', name: 'Leo' }
+       // ];
+       //
+       // utilArrayUniqBy(pets, 'type')
+       //   [
+       //     { type: 'Dog', name: 'Spot' },
+       //     { type: 'Cat', name: 'Tiger' }
+       //   ]
+       //
+       // utilArrayUniqBy(pets, function(item) { return item.name.length; })
+       //   [
+       //     { type: 'Dog', name: 'Spot' },
+       //     { type: 'Cat', name: 'Tiger' },
+       //     { type: 'Cat', name: 'Leo' }
+       //   }
+
+       function utilArrayUniqBy(a, key) {
+         var seen = new Set();
+         return a.reduce(function (acc, item) {
+           var val = typeof key === 'function' ? key(item) : item[key];
+
+           if (val && !seen.has(val)) {
+             seen.add(val);
+             acc.push(item);
+           }
+
+           return acc;
+         }, []);
+       }
+
+       var uncurryThis$d = functionUncurryThis;
+
+       // `thisNumberValue` abstract operation
+       // https://tc39.es/ecma262/#sec-thisnumbervalue
+       var thisNumberValue$3 = uncurryThis$d(1.0.valueOf);
+
+       var DESCRIPTORS$3 = descriptors;
+       var global$a = global$1o;
+       var uncurryThis$c = functionUncurryThis;
+       var isForced = isForced_1;
+       var redefine$2 = redefine$h.exports;
+       var hasOwn$1 = hasOwnProperty_1;
+       var inheritIfRequired = inheritIfRequired$4;
+       var isPrototypeOf = objectIsPrototypeOf;
+       var isSymbol$1 = isSymbol$6;
+       var toPrimitive$1 = toPrimitive$3;
+       var fails$8 = fails$V;
+       var getOwnPropertyNames = objectGetOwnPropertyNames.f;
+       var getOwnPropertyDescriptor$2 = objectGetOwnPropertyDescriptor.f;
+       var defineProperty = objectDefineProperty.f;
+       var thisNumberValue$2 = thisNumberValue$3;
+       var trim$2 = stringTrim.trim;
+
+       var NUMBER = 'Number';
+       var NativeNumber = global$a[NUMBER];
+       var NumberPrototype = NativeNumber.prototype;
+       var TypeError$4 = global$a.TypeError;
+       var arraySlice$1 = uncurryThis$c(''.slice);
+       var charCodeAt$1 = uncurryThis$c(''.charCodeAt);
+
+       // `ToNumeric` abstract operation
+       // https://tc39.es/ecma262/#sec-tonumeric
+       var toNumeric = function (value) {
+         var primValue = toPrimitive$1(value, 'number');
+         return typeof primValue == 'bigint' ? primValue : toNumber$1(primValue);
+       };
+
+       // `ToNumber` abstract operation
+       // https://tc39.es/ecma262/#sec-tonumber
+       var toNumber$1 = function (argument) {
+         var it = toPrimitive$1(argument, 'number');
+         var first, third, radix, maxCode, digits, length, index, code;
+         if (isSymbol$1(it)) throw TypeError$4('Cannot convert a Symbol value to a number');
+         if (typeof it == 'string' && it.length > 2) {
+           it = trim$2(it);
+           first = charCodeAt$1(it, 0);
+           if (first === 43 || first === 45) {
+             third = charCodeAt$1(it, 2);
+             if (third === 88 || third === 120) return NaN; // Number('+0x1') should be NaN, old V8 fix
+           } else if (first === 48) {
+             switch (charCodeAt$1(it, 1)) {
+               case 66: case 98: radix = 2; maxCode = 49; break; // fast equal of /^0b[01]+$/i
+               case 79: case 111: radix = 8; maxCode = 55; break; // fast equal of /^0o[0-7]+$/i
+               default: return +it;
+             }
+             digits = arraySlice$1(it, 2);
+             length = digits.length;
+             for (index = 0; index < length; index++) {
+               code = charCodeAt$1(digits, index);
+               // parseInt parses a string to a first unavailable symbol
+               // but ToNumber should return NaN if a string contains unavailable symbols
+               if (code < 48 || code > maxCode) return NaN;
+             } return parseInt(digits, radix);
+           }
+         } return +it;
+       };
+
+       // `Number` constructor
+       // https://tc39.es/ecma262/#sec-number-constructor
+       if (isForced(NUMBER, !NativeNumber(' 0o1') || !NativeNumber('0b1') || NativeNumber('+0x1'))) {
+         var NumberWrapper = function Number(value) {
+           var n = arguments.length < 1 ? 0 : NativeNumber(toNumeric(value));
+           var dummy = this;
+           // check on 1..constructor(foo) case
+           return isPrototypeOf(NumberPrototype, dummy) && fails$8(function () { thisNumberValue$2(dummy); })
+             ? inheritIfRequired(Object(n), dummy, NumberWrapper) : n;
+         };
+         for (var keys = DESCRIPTORS$3 ? getOwnPropertyNames(NativeNumber) : (
+           // ES3:
+           'MAX_VALUE,MIN_VALUE,NaN,NEGATIVE_INFINITY,POSITIVE_INFINITY,' +
+           // ES2015 (in case, if modules with ES2015 Number statics required before):
+           'EPSILON,MAX_SAFE_INTEGER,MIN_SAFE_INTEGER,isFinite,isInteger,isNaN,isSafeInteger,parseFloat,parseInt,' +
+           // ESNext
+           'fromString,range'
+         ).split(','), j$1 = 0, key; keys.length > j$1; j$1++) {
+           if (hasOwn$1(NativeNumber, key = keys[j$1]) && !hasOwn$1(NumberWrapper, key)) {
+             defineProperty(NumberWrapper, key, getOwnPropertyDescriptor$2(NativeNumber, key));
+           }
+         }
+         NumberWrapper.prototype = NumberPrototype;
+         NumberPrototype.constructor = NumberWrapper;
+         redefine$2(global$a, NUMBER, NumberWrapper);
+       }
+
+       var diacritics = {};
+
+       var remove$6 = diacritics.remove = removeDiacritics;
+       var replacementList = [{
+         base: ' ',
+         chars: "\xA0"
+       }, {
+         base: '0',
+         chars: "\u07C0"
+       }, {
+         base: 'A',
+         chars: "\u24B6\uFF21\xC0\xC1\xC2\u1EA6\u1EA4\u1EAA\u1EA8\xC3\u0100\u0102\u1EB0\u1EAE\u1EB4\u1EB2\u0226\u01E0\xC4\u01DE\u1EA2\xC5\u01FA\u01CD\u0200\u0202\u1EA0\u1EAC\u1EB6\u1E00\u0104\u023A\u2C6F"
+       }, {
+         base: 'AA',
+         chars: "\uA732"
+       }, {
+         base: 'AE',
+         chars: "\xC6\u01FC\u01E2"
+       }, {
+         base: 'AO',
+         chars: "\uA734"
+       }, {
+         base: 'AU',
+         chars: "\uA736"
+       }, {
+         base: 'AV',
+         chars: "\uA738\uA73A"
+       }, {
+         base: 'AY',
+         chars: "\uA73C"
+       }, {
+         base: 'B',
+         chars: "\u24B7\uFF22\u1E02\u1E04\u1E06\u0243\u0181"
+       }, {
+         base: 'C',
+         chars: "\u24B8\uFF23\uA73E\u1E08\u0106C\u0108\u010A\u010C\xC7\u0187\u023B"
+       }, {
+         base: 'D',
+         chars: "\u24B9\uFF24\u1E0A\u010E\u1E0C\u1E10\u1E12\u1E0E\u0110\u018A\u0189\u1D05\uA779"
+       }, {
+         base: 'Dh',
+         chars: "\xD0"
+       }, {
+         base: 'DZ',
+         chars: "\u01F1\u01C4"
+       }, {
+         base: 'Dz',
+         chars: "\u01F2\u01C5"
+       }, {
+         base: 'E',
+         chars: "\u025B\u24BA\uFF25\xC8\xC9\xCA\u1EC0\u1EBE\u1EC4\u1EC2\u1EBC\u0112\u1E14\u1E16\u0114\u0116\xCB\u1EBA\u011A\u0204\u0206\u1EB8\u1EC6\u0228\u1E1C\u0118\u1E18\u1E1A\u0190\u018E\u1D07"
+       }, {
+         base: 'F',
+         chars: "\uA77C\u24BB\uFF26\u1E1E\u0191\uA77B"
+       }, {
+         base: 'G',
+         chars: "\u24BC\uFF27\u01F4\u011C\u1E20\u011E\u0120\u01E6\u0122\u01E4\u0193\uA7A0\uA77D\uA77E\u0262"
+       }, {
+         base: 'H',
+         chars: "\u24BD\uFF28\u0124\u1E22\u1E26\u021E\u1E24\u1E28\u1E2A\u0126\u2C67\u2C75\uA78D"
+       }, {
+         base: 'I',
+         chars: "\u24BE\uFF29\xCC\xCD\xCE\u0128\u012A\u012C\u0130\xCF\u1E2E\u1EC8\u01CF\u0208\u020A\u1ECA\u012E\u1E2C\u0197"
+       }, {
+         base: 'J',
+         chars: "\u24BF\uFF2A\u0134\u0248\u0237"
+       }, {
+         base: 'K',
+         chars: "\u24C0\uFF2B\u1E30\u01E8\u1E32\u0136\u1E34\u0198\u2C69\uA740\uA742\uA744\uA7A2"
+       }, {
+         base: 'L',
+         chars: "\u24C1\uFF2C\u013F\u0139\u013D\u1E36\u1E38\u013B\u1E3C\u1E3A\u0141\u023D\u2C62\u2C60\uA748\uA746\uA780"
+       }, {
+         base: 'LJ',
+         chars: "\u01C7"
+       }, {
+         base: 'Lj',
+         chars: "\u01C8"
+       }, {
+         base: 'M',
+         chars: "\u24C2\uFF2D\u1E3E\u1E40\u1E42\u2C6E\u019C\u03FB"
+       }, {
+         base: 'N',
+         chars: "\uA7A4\u0220\u24C3\uFF2E\u01F8\u0143\xD1\u1E44\u0147\u1E46\u0145\u1E4A\u1E48\u019D\uA790\u1D0E"
+       }, {
+         base: 'NJ',
+         chars: "\u01CA"
+       }, {
+         base: 'Nj',
+         chars: "\u01CB"
+       }, {
+         base: 'O',
+         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"
+       }, {
+         base: 'OE',
+         chars: "\u0152"
+       }, {
+         base: 'OI',
+         chars: "\u01A2"
+       }, {
+         base: 'OO',
+         chars: "\uA74E"
+       }, {
+         base: 'OU',
+         chars: "\u0222"
+       }, {
+         base: 'P',
+         chars: "\u24C5\uFF30\u1E54\u1E56\u01A4\u2C63\uA750\uA752\uA754"
+       }, {
+         base: 'Q',
+         chars: "\u24C6\uFF31\uA756\uA758\u024A"
+       }, {
+         base: 'R',
+         chars: "\u24C7\uFF32\u0154\u1E58\u0158\u0210\u0212\u1E5A\u1E5C\u0156\u1E5E\u024C\u2C64\uA75A\uA7A6\uA782"
+       }, {
+         base: 'S',
+         chars: "\u24C8\uFF33\u1E9E\u015A\u1E64\u015C\u1E60\u0160\u1E66\u1E62\u1E68\u0218\u015E\u2C7E\uA7A8\uA784"
+       }, {
+         base: 'T',
+         chars: "\u24C9\uFF34\u1E6A\u0164\u1E6C\u021A\u0162\u1E70\u1E6E\u0166\u01AC\u01AE\u023E\uA786"
+       }, {
+         base: 'Th',
+         chars: "\xDE"
+       }, {
+         base: 'TZ',
+         chars: "\uA728"
+       }, {
+         base: 'U',
+         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"
+       }, {
+         base: 'V',
+         chars: "\u24CB\uFF36\u1E7C\u1E7E\u01B2\uA75E\u0245"
+       }, {
+         base: 'VY',
+         chars: "\uA760"
+       }, {
+         base: 'W',
+         chars: "\u24CC\uFF37\u1E80\u1E82\u0174\u1E86\u1E84\u1E88\u2C72"
+       }, {
+         base: 'X',
+         chars: "\u24CD\uFF38\u1E8A\u1E8C"
+       }, {
+         base: 'Y',
+         chars: "\u24CE\uFF39\u1EF2\xDD\u0176\u1EF8\u0232\u1E8E\u0178\u1EF6\u1EF4\u01B3\u024E\u1EFE"
+       }, {
+         base: 'Z',
+         chars: "\u24CF\uFF3A\u0179\u1E90\u017B\u017D\u1E92\u1E94\u01B5\u0224\u2C7F\u2C6B\uA762"
+       }, {
+         base: 'a',
+         chars: "\u24D0\uFF41\u1E9A\xE0\xE1\xE2\u1EA7\u1EA5\u1EAB\u1EA9\xE3\u0101\u0103\u1EB1\u1EAF\u1EB5\u1EB3\u0227\u01E1\xE4\u01DF\u1EA3\xE5\u01FB\u01CE\u0201\u0203\u1EA1\u1EAD\u1EB7\u1E01\u0105\u2C65\u0250\u0251"
+       }, {
+         base: 'aa',
+         chars: "\uA733"
+       }, {
+         base: 'ae',
+         chars: "\xE6\u01FD\u01E3"
+       }, {
+         base: 'ao',
+         chars: "\uA735"
+       }, {
+         base: 'au',
+         chars: "\uA737"
+       }, {
+         base: 'av',
+         chars: "\uA739\uA73B"
+       }, {
+         base: 'ay',
+         chars: "\uA73D"
+       }, {
+         base: 'b',
+         chars: "\u24D1\uFF42\u1E03\u1E05\u1E07\u0180\u0183\u0253\u0182"
+       }, {
+         base: 'c',
+         chars: "\uFF43\u24D2\u0107\u0109\u010B\u010D\xE7\u1E09\u0188\u023C\uA73F\u2184"
+       }, {
+         base: 'd',
+         chars: "\u24D3\uFF44\u1E0B\u010F\u1E0D\u1E11\u1E13\u1E0F\u0111\u018C\u0256\u0257\u018B\u13E7\u0501\uA7AA"
+       }, {
+         base: 'dh',
+         chars: "\xF0"
+       }, {
+         base: 'dz',
+         chars: "\u01F3\u01C6"
+       }, {
+         base: 'e',
+         chars: "\u24D4\uFF45\xE8\xE9\xEA\u1EC1\u1EBF\u1EC5\u1EC3\u1EBD\u0113\u1E15\u1E17\u0115\u0117\xEB\u1EBB\u011B\u0205\u0207\u1EB9\u1EC7\u0229\u1E1D\u0119\u1E19\u1E1B\u0247\u01DD"
+       }, {
+         base: 'f',
+         chars: "\u24D5\uFF46\u1E1F\u0192"
+       }, {
+         base: 'ff',
+         chars: "\uFB00"
+       }, {
+         base: 'fi',
+         chars: "\uFB01"
+       }, {
+         base: 'fl',
+         chars: "\uFB02"
+       }, {
+         base: 'ffi',
+         chars: "\uFB03"
+       }, {
+         base: 'ffl',
+         chars: "\uFB04"
+       }, {
+         base: 'g',
+         chars: "\u24D6\uFF47\u01F5\u011D\u1E21\u011F\u0121\u01E7\u0123\u01E5\u0260\uA7A1\uA77F\u1D79"
+       }, {
+         base: 'h',
+         chars: "\u24D7\uFF48\u0125\u1E23\u1E27\u021F\u1E25\u1E29\u1E2B\u1E96\u0127\u2C68\u2C76\u0265"
+       }, {
+         base: 'hv',
+         chars: "\u0195"
+       }, {
+         base: 'i',
+         chars: "\u24D8\uFF49\xEC\xED\xEE\u0129\u012B\u012D\xEF\u1E2F\u1EC9\u01D0\u0209\u020B\u1ECB\u012F\u1E2D\u0268\u0131"
+       }, {
+         base: 'j',
+         chars: "\u24D9\uFF4A\u0135\u01F0\u0249"
+       }, {
+         base: 'k',
+         chars: "\u24DA\uFF4B\u1E31\u01E9\u1E33\u0137\u1E35\u0199\u2C6A\uA741\uA743\uA745\uA7A3"
+       }, {
+         base: 'l',
+         chars: "\u24DB\uFF4C\u0140\u013A\u013E\u1E37\u1E39\u013C\u1E3D\u1E3B\u017F\u0142\u019A\u026B\u2C61\uA749\uA781\uA747\u026D"
+       }, {
+         base: 'lj',
+         chars: "\u01C9"
+       }, {
+         base: 'm',
+         chars: "\u24DC\uFF4D\u1E3F\u1E41\u1E43\u0271\u026F"
+       }, {
+         base: 'n',
+         chars: "\u24DD\uFF4E\u01F9\u0144\xF1\u1E45\u0148\u1E47\u0146\u1E4B\u1E49\u019E\u0272\u0149\uA791\uA7A5\u043B\u0509"
+       }, {
+         base: 'nj',
+         chars: "\u01CC"
+       }, {
+         base: 'o',
+         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"
+       }, {
+         base: 'oe',
+         chars: "\u0153"
+       }, {
+         base: 'oi',
+         chars: "\u01A3"
+       }, {
+         base: 'oo',
+         chars: "\uA74F"
+       }, {
+         base: 'ou',
+         chars: "\u0223"
+       }, {
+         base: 'p',
+         chars: "\u24DF\uFF50\u1E55\u1E57\u01A5\u1D7D\uA751\uA753\uA755\u03C1"
+       }, {
+         base: 'q',
+         chars: "\u24E0\uFF51\u024B\uA757\uA759"
+       }, {
+         base: 'r',
+         chars: "\u24E1\uFF52\u0155\u1E59\u0159\u0211\u0213\u1E5B\u1E5D\u0157\u1E5F\u024D\u027D\uA75B\uA7A7\uA783"
+       }, {
+         base: 's',
+         chars: "\u24E2\uFF53\u015B\u1E65\u015D\u1E61\u0161\u1E67\u1E63\u1E69\u0219\u015F\u023F\uA7A9\uA785\u1E9B\u0282"
+       }, {
+         base: 'ss',
+         chars: "\xDF"
+       }, {
+         base: 't',
+         chars: "\u24E3\uFF54\u1E6B\u1E97\u0165\u1E6D\u021B\u0163\u1E71\u1E6F\u0167\u01AD\u0288\u2C66\uA787"
+       }, {
+         base: 'th',
+         chars: "\xFE"
+       }, {
+         base: 'tz',
+         chars: "\uA729"
+       }, {
+         base: 'u',
+         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"
+       }, {
+         base: 'v',
+         chars: "\u24E5\uFF56\u1E7D\u1E7F\u028B\uA75F\u028C"
+       }, {
+         base: 'vy',
+         chars: "\uA761"
+       }, {
+         base: 'w',
+         chars: "\u24E6\uFF57\u1E81\u1E83\u0175\u1E87\u1E85\u1E98\u1E89\u2C73"
+       }, {
+         base: 'x',
+         chars: "\u24E7\uFF58\u1E8B\u1E8D"
+       }, {
+         base: 'y',
+         chars: "\u24E8\uFF59\u1EF3\xFD\u0177\u1EF9\u0233\u1E8F\xFF\u1EF7\u1E99\u1EF5\u01B4\u024F\u1EFF"
+       }, {
+         base: 'z',
+         chars: "\u24E9\uFF5A\u017A\u1E91\u017C\u017E\u1E93\u1E95\u01B6\u0225\u0240\u2C6C\uA763"
+       }];
+       var diacriticsMap = {};
+
+       for (var i$1 = 0; i$1 < replacementList.length; i$1 += 1) {
+         var chars = replacementList[i$1].chars;
+
+         for (var j = 0; j < chars.length; j += 1) {
+           diacriticsMap[chars[j]] = replacementList[i$1].base;
+         }
+       }
+
+       function removeDiacritics(str) {
+         return str.replace(/[^\u0000-\u007e]/g, function (c) {
+           return diacriticsMap[c] || c;
+         });
+       }
+
+       diacritics.replacementList = replacementList;
+       diacritics.diacriticsMap = diacriticsMap;
+
+       var lib = {};
+
+       var isArabic$1 = {};
+
+       Object.defineProperty(isArabic$1, "__esModule", {
+         value: true
+       });
+       var arabicBlocks = [[0x0600, 0x06FF], [0x0750, 0x077F], [0x08A0, 0x08FF], [0xFB50, 0xFDFF], [0xFE70, 0xFEFF], [0x10E60, 0x10E7F], [0x1EC70, 0x1ECBF], [0x1EE00, 0x1EEFF] // Mathematical Alphabetic symbols https://www.unicode.org/charts/PDF/U1EE00.pdf
+       ];
+
+       function isArabic(_char) {
+         if (_char.length > 1) {
+           // allow the newer chars?
+           throw new Error('isArabic works on only one-character strings');
+         }
+
+         var code = _char.charCodeAt(0);
+
+         for (var i = 0; i < arabicBlocks.length; i++) {
+           var block = arabicBlocks[i];
+
+           if (code >= block[0] && code <= block[1]) {
+             return true;
+           }
+         }
+
+         return false;
+       }
+
+       isArabic$1.isArabic = isArabic;
+
+       function isMath(_char2) {
+         if (_char2.length > 2) {
+           // allow the newer chars?
+           throw new Error('isMath works on only one-character strings');
+         }
+
+         var code = _char2.charCodeAt(0);
+
+         return code >= 0x660 && code <= 0x66C || code >= 0x6F0 && code <= 0x6F9;
+       }
+
+       isArabic$1.isMath = isMath;
+
+       var GlyphSplitter$1 = {};
+
+       var reference = {};
+
+       var unicodeArabic = {};
+
+       Object.defineProperty(unicodeArabic, "__esModule", {
+         value: true
+       });
+       var arabicReference = {
+         "alef": {
+           "normal": ["\u0627"],
+           "madda_above": {
+             "normal": ["\u0627\u0653", "\u0622"],
+             "isolated": "\uFE81",
+             "final": "\uFE82"
+           },
+           "hamza_above": {
+             "normal": ["\u0627\u0654", "\u0623"],
+             "isolated": "\uFE83",
+             "final": "\uFE84"
+           },
+           "hamza_below": {
+             "normal": ["\u0627\u0655", "\u0625"],
+             "isolated": "\uFE87",
+             "final": "\uFE88"
+           },
+           "wasla": {
+             "normal": "\u0671",
+             "isolated": "\uFB50",
+             "final": "\uFB51"
+           },
+           "wavy_hamza_above": ["\u0672"],
+           "wavy_hamza_below": ["\u0627\u065F", "\u0673"],
+           "high_hamza": ["\u0675", "\u0627\u0674"],
+           "indic_two_above": ["\u0773"],
+           "indic_three_above": ["\u0774"],
+           "fathatan": {
+             "normal": ["\u0627\u064B"],
+             "final": "\uFD3C",
+             "isolated": "\uFD3D"
+           },
+           "isolated": "\uFE8D",
+           "final": "\uFE8E"
+         },
+         "beh": {
+           "normal": ["\u0628"],
+           "dotless": ["\u066E"],
+           "three_dots_horizontally_below": ["\u0750"],
+           "dot_below_three_dots_above": ["\u0751"],
+           "three_dots_pointing_upwards_below": ["\u0752"],
+           "three_dots_pointing_upwards_below_two_dots_above": ["\u0753"],
+           "two_dots_below_dot_above": ["\u0754"],
+           "inverted_small_v_below": ["\u0755"],
+           "small_v": ["\u0756"],
+           "small_v_below": ["\u08A0"],
+           "hamza_above": ["\u08A1"],
+           "small_meem_above": ["\u08B6"],
+           "isolated": "\uFE8F",
+           "final": "\uFE90",
+           "initial": "\uFE91",
+           "medial": "\uFE92"
+         },
+         "teh marbuta": {
+           "normal": ["\u0629"],
+           "isolated": "\uFE93",
+           "final": "\uFE94"
+         },
+         "teh": {
+           "normal": ["\u062A"],
+           "ring": ["\u067C"],
+           "three_dots_above_downwards": ["\u067D"],
+           "small_teh_above": ["\u08B8"],
+           "isolated": "\uFE95",
+           "final": "\uFE96",
+           "initial": "\uFE97",
+           "medial": "\uFE98"
+         },
+         "theh": {
+           "normal": ["\u062B"],
+           "isolated": "\uFE99",
+           "final": "\uFE9A",
+           "initial": "\uFE9B",
+           "medial": "\uFE9C"
+         },
+         "jeem": {
+           "normal": ["\u062C"],
+           "two_dots_above": ["\u08A2"],
+           "isolated": "\uFE9D",
+           "final": "\uFE9E",
+           "initial": "\uFE9F",
+           "medial": "\uFEA0"
+         },
+         "hah": {
+           "normal": ["\u062D"],
+           "hamza_above": ["\u0681"],
+           "two_dots_vertical_above": ["\u0682"],
+           "three_dots_above": ["\u0685"],
+           "two_dots_above": ["\u0757"],
+           "three_dots_pointing_upwards_below": ["\u0758"],
+           "small_tah_below": ["\u076E"],
+           "small_tah_two_dots": ["\u076F"],
+           "small_tah_above": ["\u0772"],
+           "indic_four_below": ["\u077C"],
+           "isolated": "\uFEA1",
+           "final": "\uFEA2",
+           "initial": "\uFEA3",
+           "medial": "\uFEA4"
+         },
+         "khah": {
+           "normal": ["\u062E"],
+           "isolated": "\uFEA5",
+           "final": "\uFEA6",
+           "initial": "\uFEA7",
+           "medial": "\uFEA8"
+         },
+         "dal": {
+           "normal": ["\u062F"],
+           "ring": ["\u0689"],
+           "dot_below": ["\u068A"],
+           "dot_below_small_tah": ["\u068B"],
+           "three_dots_above_downwards": ["\u068F"],
+           "four_dots_above": ["\u0690"],
+           "inverted_v": ["\u06EE"],
+           "two_dots_vertically_below_small_tah": ["\u0759"],
+           "inverted_small_v_below": ["\u075A"],
+           "three_dots_below": ["\u08AE"],
+           "isolated": "\uFEA9",
+           "final": "\uFEAA"
+         },
+         "thal": {
+           "normal": ["\u0630"],
+           "isolated": "\uFEAB",
+           "final": "\uFEAC"
+         },
+         "reh": {
+           "normal": ["\u0631"],
+           "small_v": ["\u0692"],
+           "ring": ["\u0693"],
+           "dot_below": ["\u0694"],
+           "small_v_below": ["\u0695"],
+           "dot_below_dot_above": ["\u0696"],
+           "two_dots_above": ["\u0697"],
+           "four_dots_above": ["\u0699"],
+           "inverted_v": ["\u06EF"],
+           "stroke": ["\u075B"],
+           "two_dots_vertically_above": ["\u076B"],
+           "hamza_above": ["\u076C"],
+           "small_tah_two_dots": ["\u0771"],
+           "loop": ["\u08AA"],
+           "small_noon_above": ["\u08B9"],
+           "isolated": "\uFEAD",
+           "final": "\uFEAE"
+         },
+         "zain": {
+           "normal": ["\u0632"],
+           "inverted_v_above": ["\u08B2"],
+           "isolated": "\uFEAF",
+           "final": "\uFEB0"
+         },
+         "seen": {
+           "normal": ["\u0633"],
+           "dot_below_dot_above": ["\u069A"],
+           "three_dots_below": ["\u069B"],
+           "three_dots_below_three_dots_above": ["\u069C"],
+           "four_dots_above": ["\u075C"],
+           "two_dots_vertically_above": ["\u076D"],
+           "small_tah_two_dots": ["\u0770"],
+           "indic_four_above": ["\u077D"],
+           "inverted_v": ["\u077E"],
+           "isolated": "\uFEB1",
+           "final": "\uFEB2",
+           "initial": "\uFEB3",
+           "medial": "\uFEB4"
+         },
+         "sheen": {
+           "normal": ["\u0634"],
+           "dot_below": ["\u06FA"],
+           "isolated": "\uFEB5",
+           "final": "\uFEB6",
+           "initial": "\uFEB7",
+           "medial": "\uFEB8"
+         },
+         "sad": {
+           "normal": ["\u0635"],
+           "two_dots_below": ["\u069D"],
+           "three_dots_above": ["\u069E"],
+           "three_dots_below": ["\u08AF"],
+           "isolated": "\uFEB9",
+           "final": "\uFEBA",
+           "initial": "\uFEBB",
+           "medial": "\uFEBC"
+         },
+         "dad": {
+           "normal": ["\u0636"],
+           "dot_below": ["\u06FB"],
+           "isolated": "\uFEBD",
+           "final": "\uFEBE",
+           "initial": "\uFEBF",
+           "medial": "\uFEC0"
+         },
+         "tah": {
+           "normal": ["\u0637"],
+           "three_dots_above": ["\u069F"],
+           "two_dots_above": ["\u08A3"],
+           "isolated": "\uFEC1",
+           "final": "\uFEC2",
+           "initial": "\uFEC3",
+           "medial": "\uFEC4"
+         },
+         "zah": {
+           "normal": ["\u0638"],
+           "isolated": "\uFEC5",
+           "final": "\uFEC6",
+           "initial": "\uFEC7",
+           "medial": "\uFEC8"
+         },
+         "ain": {
+           "normal": ["\u0639"],
+           "three_dots_above": ["\u06A0"],
+           "two_dots_above": ["\u075D"],
+           "three_dots_pointing_downwards_above": ["\u075E"],
+           "two_dots_vertically_above": ["\u075F"],
+           "three_dots_below": ["\u08B3"],
+           "isolated": "\uFEC9",
+           "final": "\uFECA",
+           "initial": "\uFECB",
+           "medial": "\uFECC"
+         },
+         "ghain": {
+           "normal": ["\u063A"],
+           "dot_below": ["\u06FC"],
+           "isolated": "\uFECD",
+           "final": "\uFECE",
+           "initial": "\uFECF",
+           "medial": "\uFED0"
+         },
+         "feh": {
+           "normal": ["\u0641"],
+           "dotless": ["\u06A1"],
+           "dot_moved_below": ["\u06A2"],
+           "dot_below": ["\u06A3"],
+           "three_dots_below": ["\u06A5"],
+           "two_dots_below": ["\u0760"],
+           "three_dots_pointing_upwards_below": ["\u0761"],
+           "dot_below_three_dots_above": ["\u08A4"],
+           "isolated": "\uFED1",
+           "final": "\uFED2",
+           "initial": "\uFED3",
+           "medial": "\uFED4"
+         },
+         "qaf": {
+           "normal": ["\u0642"],
+           "dotless": ["\u066F"],
+           "dot_above": ["\u06A7"],
+           "three_dots_above": ["\u06A8"],
+           "dot_below": ["\u08A5"],
+           "isolated": "\uFED5",
+           "final": "\uFED6",
+           "initial": "\uFED7",
+           "medial": "\uFED8"
+         },
+         "kaf": {
+           "normal": ["\u0643"],
+           "swash": ["\u06AA"],
+           "ring": ["\u06AB"],
+           "dot_above": ["\u06AC"],
+           "three_dots_below": ["\u06AE"],
+           "two_dots_above": ["\u077F"],
+           "dot_below": ["\u08B4"],
+           "isolated": "\uFED9",
+           "final": "\uFEDA",
+           "initial": "\uFEDB",
+           "medial": "\uFEDC"
+         },
+         "lam": {
+           "normal": ["\u0644"],
+           "small_v": ["\u06B5"],
+           "dot_above": ["\u06B6"],
+           "three_dots_above": ["\u06B7"],
+           "three_dots_below": ["\u06B8"],
+           "bar": ["\u076A"],
+           "double_bar": ["\u08A6"],
+           "isolated": "\uFEDD",
+           "final": "\uFEDE",
+           "initial": "\uFEDF",
+           "medial": "\uFEE0"
+         },
+         "meem": {
+           "normal": ["\u0645"],
+           "dot_above": ["\u0765"],
+           "dot_below": ["\u0766"],
+           "three_dots_above": ["\u08A7"],
+           "isolated": "\uFEE1",
+           "final": "\uFEE2",
+           "initial": "\uFEE3",
+           "medial": "\uFEE4"
+         },
+         "noon": {
+           "normal": ["\u0646"],
+           "dot_below": ["\u06B9"],
+           "ring": ["\u06BC"],
+           "three_dots_above": ["\u06BD"],
+           "two_dots_below": ["\u0767"],
+           "small_tah": ["\u0768"],
+           "small_v": ["\u0769"],
+           "isolated": "\uFEE5",
+           "final": "\uFEE6",
+           "initial": "\uFEE7",
+           "medial": "\uFEE8"
+         },
+         "heh": {
+           "normal": ["\u0647"],
+           "isolated": "\uFEE9",
+           "final": "\uFEEA",
+           "initial": "\uFEEB",
+           "medial": "\uFEEC"
+         },
+         "waw": {
+           "normal": ["\u0648"],
+           "hamza_above": {
+             "normal": ["\u0624", "\u0648\u0654"],
+             "isolated": "\uFE85",
+             "final": "\uFE86"
+           },
+           "high_hamza": ["\u0676", "\u0648\u0674"],
+           "ring": ["\u06C4"],
+           "two_dots_above": ["\u06CA"],
+           "dot_above": ["\u06CF"],
+           "indic_two_above": ["\u0778"],
+           "indic_three_above": ["\u0779"],
+           "dot_within": ["\u08AB"],
+           "isolated": "\uFEED",
+           "final": "\uFEEE"
+         },
+         "alef_maksura": {
+           "normal": ["\u0649"],
+           "hamza_above": ["\u0626", "\u064A\u0654"],
+           "initial": "\uFBE8",
+           "medial": "\uFBE9",
+           "isolated": "\uFEEF",
+           "final": "\uFEF0"
+         },
+         "yeh": {
+           "normal": ["\u064A"],
+           "hamza_above": {
+             "normal": ["\u0626", "\u0649\u0654"],
+             "isolated": "\uFE89",
+             "final": "\uFE8A",
+             "initial": "\uFE8B",
+             "medial": "\uFE8C"
+           },
+           "two_dots_below_hamza_above": ["\u08A8"],
+           "high_hamza": ["\u0678", "\u064A\u0674"],
+           "tail": ["\u06CD"],
+           "small_v": ["\u06CE"],
+           "three_dots_below": ["\u06D1"],
+           "two_dots_below_dot_above": ["\u08A9"],
+           "two_dots_below_small_noon_above": ["\u08BA"],
+           "isolated": "\uFEF1",
+           "final": "\uFEF2",
+           "initial": "\uFEF3",
+           "medial": "\uFEF4"
+         },
+         "tteh": {
+           "normal": ["\u0679"],
+           "isolated": "\uFB66",
+           "final": "\uFB67",
+           "initial": "\uFB68",
+           "medial": "\uFB69"
+         },
+         "tteheh": {
+           "normal": ["\u067A"],
+           "isolated": "\uFB5E",
+           "final": "\uFB5F",
+           "initial": "\uFB60",
+           "medial": "\uFB61"
+         },
+         "beeh": {
+           "normal": ["\u067B"],
+           "isolated": "\uFB52",
+           "final": "\uFB53",
+           "initial": "\uFB54",
+           "medial": "\uFB55"
+         },
+         "peh": {
+           "normal": ["\u067E"],
+           "small_meem_above": ["\u08B7"],
+           "isolated": "\uFB56",
+           "final": "\uFB57",
+           "initial": "\uFB58",
+           "medial": "\uFB59"
+         },
+         "teheh": {
+           "normal": ["\u067F"],
+           "isolated": "\uFB62",
+           "final": "\uFB63",
+           "initial": "\uFB64",
+           "medial": "\uFB65"
+         },
+         "beheh": {
+           "normal": ["\u0680"],
+           "isolated": "\uFB5A",
+           "final": "\uFB5B",
+           "initial": "\uFB5C",
+           "medial": "\uFB5D"
+         },
+         "nyeh": {
+           "normal": ["\u0683"],
+           "isolated": "\uFB76",
+           "final": "\uFB77",
+           "initial": "\uFB78",
+           "medial": "\uFB79"
+         },
+         "dyeh": {
+           "normal": ["\u0684"],
+           "isolated": "\uFB72",
+           "final": "\uFB73",
+           "initial": "\uFB74",
+           "medial": "\uFB75"
+         },
+         "tcheh": {
+           "normal": ["\u0686"],
+           "dot_above": ["\u06BF"],
+           "isolated": "\uFB7A",
+           "final": "\uFB7B",
+           "initial": "\uFB7C",
+           "medial": "\uFB7D"
+         },
+         "tcheheh": {
+           "normal": ["\u0687"],
+           "isolated": "\uFB7E",
+           "final": "\uFB7F",
+           "initial": "\uFB80",
+           "medial": "\uFB81"
+         },
+         "ddal": {
+           "normal": ["\u0688"],
+           "isolated": "\uFB88",
+           "final": "\uFB89"
+         },
+         "dahal": {
+           "normal": ["\u068C"],
+           "isolated": "\uFB84",
+           "final": "\uFB85"
+         },
+         "ddahal": {
+           "normal": ["\u068D"],
+           "isolated": "\uFB82",
+           "final": "\uFB83"
+         },
+         "dul": {
+           "normal": ["\u068F", "\u068E"],
+           "isolated": "\uFB86",
+           "final": "\uFB87"
+         },
+         "rreh": {
+           "normal": ["\u0691"],
+           "isolated": "\uFB8C",
+           "final": "\uFB8D"
+         },
+         "jeh": {
+           "normal": ["\u0698"],
+           "isolated": "\uFB8A",
+           "final": "\uFB8B"
+         },
+         "veh": {
+           "normal": ["\u06A4"],
+           "isolated": "\uFB6A",
+           "final": "\uFB6B",
+           "initial": "\uFB6C",
+           "medial": "\uFB6D"
+         },
+         "peheh": {
+           "normal": ["\u06A6"],
+           "isolated": "\uFB6E",
+           "final": "\uFB6F",
+           "initial": "\uFB70",
+           "medial": "\uFB71"
+         },
+         "keheh": {
+           "normal": ["\u06A9"],
+           "dot_above": ["\u0762"],
+           "three_dots_above": ["\u0763"],
+           "three_dots_pointing_upwards_below": ["\u0764"],
+           "isolated": "\uFB8E",
+           "final": "\uFB8F",
+           "initial": "\uFB90",
+           "medial": "\uFB91"
+         },
+         "ng": {
+           "normal": ["\u06AD"],
+           "isolated": "\uFBD3",
+           "final": "\uFBD4",
+           "initial": "\uFBD5",
+           "medial": "\uFBD6"
+         },
+         "gaf": {
+           "normal": ["\u06AF"],
+           "ring": ["\u06B0"],
+           "two_dots_below": ["\u06B2"],
+           "three_dots_above": ["\u06B4"],
+           "inverted_stroke": ["\u08B0"],
+           "isolated": "\uFB92",
+           "final": "\uFB93",
+           "initial": "\uFB94",
+           "medial": "\uFB95"
+         },
+         "ngoeh": {
+           "normal": ["\u06B1"],
+           "isolated": "\uFB9A",
+           "final": "\uFB9B",
+           "initial": "\uFB9C",
+           "medial": "\uFB9D"
+         },
+         "gueh": {
+           "normal": ["\u06B3"],
+           "isolated": "\uFB96",
+           "final": "\uFB97",
+           "initial": "\uFB98",
+           "medial": "\uFB99"
+         },
+         "noon ghunna": {
+           "normal": ["\u06BA"],
+           "isolated": "\uFB9E",
+           "final": "\uFB9F"
+         },
+         "rnoon": {
+           "normal": ["\u06BB"],
+           "isolated": "\uFBA0",
+           "final": "\uFBA1",
+           "initial": "\uFBA2",
+           "medial": "\uFBA3"
+         },
+         "heh doachashmee": {
+           "normal": ["\u06BE"],
+           "isolated": "\uFBAA",
+           "final": "\uFBAB",
+           "initial": "\uFBAC",
+           "medial": "\uFBAD"
+         },
+         "heh goal": {
+           "normal": ["\u06C1"],
+           "hamza_above": ["\u06C1\u0654", "\u06C2"],
+           "isolated": "\uFBA6",
+           "final": "\uFBA7",
+           "initial": "\uFBA8",
+           "medial": "\uFBA9"
+         },
+         "teh marbuta goal": {
+           "normal": ["\u06C3"]
+         },
+         "kirghiz oe": {
+           "normal": ["\u06C5"],
+           "isolated": "\uFBE0",
+           "final": "\uFBE1"
+         },
+         "oe": {
+           "normal": ["\u06C6"],
+           "isolated": "\uFBD9",
+           "final": "\uFBDA"
+         },
+         "u": {
+           "normal": ["\u06C7"],
+           "hamza_above": {
+             "normal": ["\u0677", "\u06C7\u0674"],
+             "isolated": "\uFBDD"
+           },
+           "isolated": "\uFBD7",
+           "final": "\uFBD8"
+         },
+         "yu": {
+           "normal": ["\u06C8"],
+           "isolated": "\uFBDB",
+           "final": "\uFBDC"
+         },
+         "kirghiz yu": {
+           "normal": ["\u06C9"],
+           "isolated": "\uFBE2",
+           "final": "\uFBE3"
+         },
+         "ve": {
+           "normal": ["\u06CB"],
+           "isolated": "\uFBDE",
+           "final": "\uFBDF"
+         },
+         "farsi yeh": {
+           "normal": ["\u06CC"],
+           "indic_two_above": ["\u0775"],
+           "indic_three_above": ["\u0776"],
+           "indic_four_above": ["\u0777"],
+           "isolated": "\uFBFC",
+           "final": "\uFBFD",
+           "initial": "\uFBFE",
+           "medial": "\uFBFF"
+         },
+         "e": {
+           "normal": ["\u06D0"],
+           "isolated": "\uFBE4",
+           "final": "\uFBE5",
+           "initial": "\uFBE6",
+           "medial": "\uFBE7"
+         },
+         "yeh barree": {
+           "normal": ["\u06D2"],
+           "hamza_above": {
+             "normal": ["\u06D2\u0654", "\u06D3"],
+             "isolated": "\uFBB0",
+             "final": "\uFBB1"
+           },
+           "indic_two_above": ["\u077A"],
+           "indic_three_above": ["\u077B"],
+           "isolated": "\uFBAE",
+           "final": "\uFBAF"
+         },
+         "ae": {
+           "normal": ["\u06D5"],
+           "isolated": "\u06D5",
+           "final": "\uFEEA",
+           "yeh_above": {
+             "normal": ["\u06C0", "\u06D5\u0654"],
+             "isolated": "\uFBA4",
+             "final": "\uFBA5"
+           }
+         },
+         "rohingya yeh": {
+           "normal": ["\u08AC"]
+         },
+         "low alef": {
+           "normal": ["\u08AD"]
+         },
+         "straight waw": {
+           "normal": ["\u08B1"]
+         },
+         "african feh": {
+           "normal": ["\u08BB"]
+         },
+         "african qaf": {
+           "normal": ["\u08BC"]
+         },
+         "african noon": {
+           "normal": ["\u08BD"]
+         }
+       };
+
+       unicodeArabic["default"] = arabicReference;
+
+       var unicodeLigatures = {};
+
+       Object.defineProperty(unicodeLigatures, "__esModule", {
+         value: true
+       });
+       var ligatureReference = {
+         "\u0626\u0627": {
+           "isolated": "\uFBEA",
+           "final": "\uFBEB"
+         },
+         "\u0626\u06D5": {
+           "isolated": "\uFBEC",
+           "final": "\uFBED"
+         },
+         "\u0626\u0648": {
+           "isolated": "\uFBEE",
+           "final": "\uFBEF"
+         },
+         "\u0626\u06C7": {
+           "isolated": "\uFBF0",
+           "final": "\uFBF1"
+         },
+         "\u0626\u06C6": {
+           "isolated": "\uFBF2",
+           "final": "\uFBF3"
+         },
+         "\u0626\u06C8": {
+           "isolated": "\uFBF4",
+           "final": "\uFBF5"
+         },
+         "\u0626\u06D0": {
+           "isolated": "\uFBF6",
+           "final": "\uFBF7",
+           "initial": "\uFBF8"
+         },
+         "\u0626\u0649": {
+           "uighur_kirghiz": {
+             "isolated": "\uFBF9",
+             "final": "\uFBFA",
+             "initial": "\uFBFB"
+           },
+           "isolated": "\uFC03",
+           "final": "\uFC68"
+         },
+         "\u0626\u062C": {
+           "isolated": "\uFC00",
+           "initial": "\uFC97"
+         },
+         "\u0626\u062D": {
+           "isolated": "\uFC01",
+           "initial": "\uFC98"
+         },
+         "\u0626\u0645": {
+           "isolated": "\uFC02",
+           "final": "\uFC66",
+           "initial": "\uFC9A",
+           "medial": "\uFCDF"
+         },
+         "\u0626\u064A": {
+           "isolated": "\uFC04",
+           "final": "\uFC69"
+         },
+         "\u0628\u062C": {
+           "isolated": "\uFC05",
+           "initial": "\uFC9C"
+         },
+         "\u0628\u062D": {
+           "isolated": "\uFC06",
+           "initial": "\uFC9D"
+         },
+         "\u0628\u062E": {
+           "isolated": "\uFC07",
+           "initial": "\uFC9E"
+         },
+         "\u0628\u0645": {
+           "isolated": "\uFC08",
+           "final": "\uFC6C",
+           "initial": "\uFC9F",
+           "medial": "\uFCE1"
+         },
+         "\u0628\u0649": {
+           "isolated": "\uFC09",
+           "final": "\uFC6E"
+         },
+         "\u0628\u064A": {
+           "isolated": "\uFC0A",
+           "final": "\uFC6F"
+         },
+         "\u062A\u062C": {
+           "isolated": "\uFC0B",
+           "initial": "\uFCA1"
+         },
+         "\u062A\u062D": {
+           "isolated": "\uFC0C",
+           "initial": "\uFCA2"
+         },
+         "\u062A\u062E": {
+           "isolated": "\uFC0D",
+           "initial": "\uFCA3"
+         },
+         "\u062A\u0645": {
+           "isolated": "\uFC0E",
+           "final": "\uFC72",
+           "initial": "\uFCA4",
+           "medial": "\uFCE3"
+         },
+         "\u062A\u0649": {
+           "isolated": "\uFC0F",
+           "final": "\uFC74"
+         },
+         "\u062A\u064A": {
+           "isolated": "\uFC10",
+           "final": "\uFC75"
+         },
+         "\u062B\u062C": {
+           "isolated": "\uFC11"
+         },
+         "\u062B\u0645": {
+           "isolated": "\uFC12",
+           "final": "\uFC78",
+           "initial": "\uFCA6",
+           "medial": "\uFCE5"
+         },
+         "\u062B\u0649": {
+           "isolated": "\uFC13",
+           "final": "\uFC7A"
+         },
+         "\u062B\u0648": {
+           "isolated": "\uFC14"
+         },
+         "\u062C\u062D": {
+           "isolated": "\uFC15",
+           "initial": "\uFCA7"
+         },
+         "\u062C\u0645": {
+           "isolated": "\uFC16",
+           "initial": "\uFCA8"
+         },
+         "\u062D\u062C": {
+           "isolated": "\uFC17",
+           "initial": "\uFCA9"
+         },
+         "\u062D\u0645": {
+           "isolated": "\uFC18",
+           "initial": "\uFCAA"
+         },
+         "\u062E\u062C": {
+           "isolated": "\uFC19",
+           "initial": "\uFCAB"
+         },
+         "\u062E\u062D": {
+           "isolated": "\uFC1A"
+         },
+         "\u062E\u0645": {
+           "isolated": "\uFC1B",
+           "initial": "\uFCAC"
+         },
+         "\u0633\u062C": {
+           "isolated": "\uFC1C",
+           "initial": "\uFCAD",
+           "medial": "\uFD34"
+         },
+         "\u0633\u062D": {
+           "isolated": "\uFC1D",
+           "initial": "\uFCAE",
+           "medial": "\uFD35"
+         },
+         "\u0633\u062E": {
+           "isolated": "\uFC1E",
+           "initial": "\uFCAF",
+           "medial": "\uFD36"
+         },
+         "\u0633\u0645": {
+           "isolated": "\uFC1F",
+           "initial": "\uFCB0",
+           "medial": "\uFCE7"
+         },
+         "\u0635\u062D": {
+           "isolated": "\uFC20",
+           "initial": "\uFCB1"
+         },
+         "\u0635\u0645": {
+           "isolated": "\uFC21",
+           "initial": "\uFCB3"
+         },
+         "\u0636\u062C": {
+           "isolated": "\uFC22",
+           "initial": "\uFCB4"
+         },
+         "\u0636\u062D": {
+           "isolated": "\uFC23",
+           "initial": "\uFCB5"
+         },
+         "\u0636\u062E": {
+           "isolated": "\uFC24",
+           "initial": "\uFCB6"
+         },
+         "\u0636\u0645": {
+           "isolated": "\uFC25",
+           "initial": "\uFCB7"
+         },
+         "\u0637\u062D": {
+           "isolated": "\uFC26",
+           "initial": "\uFCB8"
+         },
+         "\u0637\u0645": {
+           "isolated": "\uFC27",
+           "initial": "\uFD33",
+           "medial": "\uFD3A"
+         },
+         "\u0638\u0645": {
+           "isolated": "\uFC28",
+           "initial": "\uFCB9",
+           "medial": "\uFD3B"
+         },
+         "\u0639\u062C": {
+           "isolated": "\uFC29",
+           "initial": "\uFCBA"
+         },
+         "\u0639\u0645": {
+           "isolated": "\uFC2A",
+           "initial": "\uFCBB"
+         },
+         "\u063A\u062C": {
+           "isolated": "\uFC2B",
+           "initial": "\uFCBC"
+         },
+         "\u063A\u0645": {
+           "isolated": "\uFC2C",
+           "initial": "\uFCBD"
+         },
+         "\u0641\u062C": {
+           "isolated": "\uFC2D",
+           "initial": "\uFCBE"
+         },
+         "\u0641\u062D": {
+           "isolated": "\uFC2E",
+           "initial": "\uFCBF"
+         },
+         "\u0641\u062E": {
+           "isolated": "\uFC2F",
+           "initial": "\uFCC0"
+         },
+         "\u0641\u0645": {
+           "isolated": "\uFC30",
+           "initial": "\uFCC1"
+         },
+         "\u0641\u0649": {
+           "isolated": "\uFC31",
+           "final": "\uFC7C"
+         },
+         "\u0641\u064A": {
+           "isolated": "\uFC32",
+           "final": "\uFC7D"
+         },
+         "\u0642\u062D": {
+           "isolated": "\uFC33",
+           "initial": "\uFCC2"
+         },
+         "\u0642\u0645": {
+           "isolated": "\uFC34",
+           "initial": "\uFCC3"
+         },
+         "\u0642\u0649": {
+           "isolated": "\uFC35",
+           "final": "\uFC7E"
+         },
+         "\u0642\u064A": {
+           "isolated": "\uFC36",
+           "final": "\uFC7F"
+         },
+         "\u0643\u0627": {
+           "isolated": "\uFC37",
+           "final": "\uFC80"
+         },
+         "\u0643\u062C": {
+           "isolated": "\uFC38",
+           "initial": "\uFCC4"
+         },
+         "\u0643\u062D": {
+           "isolated": "\uFC39",
+           "initial": "\uFCC5"
+         },
+         "\u0643\u062E": {
+           "isolated": "\uFC3A",
+           "initial": "\uFCC6"
+         },
+         "\u0643\u0644": {
+           "isolated": "\uFC3B",
+           "final": "\uFC81",
+           "initial": "\uFCC7",
+           "medial": "\uFCEB"
+         },
+         "\u0643\u0645": {
+           "isolated": "\uFC3C",
+           "final": "\uFC82",
+           "initial": "\uFCC8",
+           "medial": "\uFCEC"
+         },
+         "\u0643\u0649": {
+           "isolated": "\uFC3D",
+           "final": "\uFC83"
+         },
+         "\u0643\u064A": {
+           "isolated": "\uFC3E",
+           "final": "\uFC84"
+         },
+         "\u0644\u062C": {
+           "isolated": "\uFC3F",
+           "initial": "\uFCC9"
+         },
+         "\u0644\u062D": {
+           "isolated": "\uFC40",
+           "initial": "\uFCCA"
+         },
+         "\u0644\u062E": {
+           "isolated": "\uFC41",
+           "initial": "\uFCCB"
+         },
+         "\u0644\u0645": {
+           "isolated": "\uFC42",
+           "final": "\uFC85",
+           "initial": "\uFCCC",
+           "medial": "\uFCED"
+         },
+         "\u0644\u0649": {
+           "isolated": "\uFC43",
+           "final": "\uFC86"
+         },
+         "\u0644\u064A": {
+           "isolated": "\uFC44",
+           "final": "\uFC87"
+         },
+         "\u0645\u062C": {
+           "isolated": "\uFC45",
+           "initial": "\uFCCE"
+         },
+         "\u0645\u062D": {
+           "isolated": "\uFC46",
+           "initial": "\uFCCF"
+         },
+         "\u0645\u062E": {
+           "isolated": "\uFC47",
+           "initial": "\uFCD0"
+         },
+         "\u0645\u0645": {
+           "isolated": "\uFC48",
+           "final": "\uFC89",
+           "initial": "\uFCD1"
+         },
+         "\u0645\u0649": {
+           "isolated": "\uFC49"
+         },
+         "\u0645\u064A": {
+           "isolated": "\uFC4A"
+         },
+         "\u0646\u062C": {
+           "isolated": "\uFC4B",
+           "initial": "\uFCD2"
+         },
+         "\u0646\u062D": {
+           "isolated": "\uFC4C",
+           "initial": "\uFCD3"
+         },
+         "\u0646\u062E": {
+           "isolated": "\uFC4D",
+           "initial": "\uFCD4"
+         },
+         "\u0646\u0645": {
+           "isolated": "\uFC4E",
+           "final": "\uFC8C",
+           "initial": "\uFCD5",
+           "medial": "\uFCEE"
+         },
+         "\u0646\u0649": {
+           "isolated": "\uFC4F",
+           "final": "\uFC8E"
+         },
+         "\u0646\u064A": {
+           "isolated": "\uFC50",
+           "final": "\uFC8F"
+         },
+         "\u0647\u062C": {
+           "isolated": "\uFC51",
+           "initial": "\uFCD7"
+         },
+         "\u0647\u0645": {
+           "isolated": "\uFC52",
+           "initial": "\uFCD8"
+         },
+         "\u0647\u0649": {
+           "isolated": "\uFC53"
+         },
+         "\u0647\u064A": {
+           "isolated": "\uFC54"
+         },
+         "\u064A\u062C": {
+           "isolated": "\uFC55",
+           "initial": "\uFCDA"
+         },
+         "\u064A\u062D": {
+           "isolated": "\uFC56",
+           "initial": "\uFCDB"
+         },
+         "\u064A\u062E": {
+           "isolated": "\uFC57",
+           "initial": "\uFCDC"
+         },
+         "\u064A\u0645": {
+           "isolated": "\uFC58",
+           "final": "\uFC93",
+           "initial": "\uFCDD",
+           "medial": "\uFCF0"
+         },
+         "\u064A\u0649": {
+           "isolated": "\uFC59",
+           "final": "\uFC95"
+         },
+         "\u064A\u064A": {
+           "isolated": "\uFC5A",
+           "final": "\uFC96"
+         },
+         "\u0630\u0670": {
+           "isolated": "\uFC5B"
+         },
+         "\u0631\u0670": {
+           "isolated": "\uFC5C"
+         },
+         "\u0649\u0670": {
+           "isolated": "\uFC5D",
+           "final": "\uFC90"
+         },
+         "\u064C\u0651": {
+           "isolated": "\uFC5E"
+         },
+         "\u064D\u0651": {
+           "isolated": "\uFC5F"
+         },
+         "\u064E\u0651": {
+           "isolated": "\uFC60"
+         },
+         "\u064F\u0651": {
+           "isolated": "\uFC61"
+         },
+         "\u0650\u0651": {
+           "isolated": "\uFC62"
+         },
+         "\u0651\u0670": {
+           "isolated": "\uFC63"
+         },
+         "\u0626\u0631": {
+           "final": "\uFC64"
+         },
+         "\u0626\u0632": {
+           "final": "\uFC65"
+         },
+         "\u0626\u0646": {
+           "final": "\uFC67"
+         },
+         "\u0628\u0631": {
+           "final": "\uFC6A"
+         },
+         "\u0628\u0632": {
+           "final": "\uFC6B"
+         },
+         "\u0628\u0646": {
+           "final": "\uFC6D"
+         },
+         "\u062A\u0631": {
+           "final": "\uFC70"
+         },
+         "\u062A\u0632": {
+           "final": "\uFC71"
+         },
+         "\u062A\u0646": {
+           "final": "\uFC73"
+         },
+         "\u062B\u0631": {
+           "final": "\uFC76"
+         },
+         "\u062B\u0632": {
+           "final": "\uFC77"
+         },
+         "\u062B\u0646": {
+           "final": "\uFC79"
+         },
+         "\u062B\u064A": {
+           "final": "\uFC7B"
+         },
+         "\u0645\u0627": {
+           "final": "\uFC88"
+         },
+         "\u0646\u0631": {
+           "final": "\uFC8A"
+         },
+         "\u0646\u0632": {
+           "final": "\uFC8B"
+         },
+         "\u0646\u0646": {
+           "final": "\uFC8D"
+         },
+         "\u064A\u0631": {
+           "final": "\uFC91"
+         },
+         "\u064A\u0632": {
+           "final": "\uFC92"
+         },
+         "\u064A\u0646": {
+           "final": "\uFC94"
+         },
+         "\u0626\u062E": {
+           "initial": "\uFC99"
+         },
+         "\u0626\u0647": {
+           "initial": "\uFC9B",
+           "medial": "\uFCE0"
+         },
+         "\u0628\u0647": {
+           "initial": "\uFCA0",
+           "medial": "\uFCE2"
+         },
+         "\u062A\u0647": {
+           "initial": "\uFCA5",
+           "medial": "\uFCE4"
+         },
+         "\u0635\u062E": {
+           "initial": "\uFCB2"
+         },
+         "\u0644\u0647": {
+           "initial": "\uFCCD"
+         },
+         "\u0646\u0647": {
+           "initial": "\uFCD6",
+           "medial": "\uFCEF"
+         },
+         "\u0647\u0670": {
+           "initial": "\uFCD9"
+         },
+         "\u064A\u0647": {
+           "initial": "\uFCDE",
+           "medial": "\uFCF1"
+         },
+         "\u062B\u0647": {
+           "medial": "\uFCE6"
+         },
+         "\u0633\u0647": {
+           "medial": "\uFCE8",
+           "initial": "\uFD31"
+         },
+         "\u0634\u0645": {
+           "medial": "\uFCE9",
+           "isolated": "\uFD0C",
+           "final": "\uFD28",
+           "initial": "\uFD30"
+         },
+         "\u0634\u0647": {
+           "medial": "\uFCEA",
+           "initial": "\uFD32"
+         },
+         "\u0640\u064E\u0651": {
+           "medial": "\uFCF2"
+         },
+         "\u0640\u064F\u0651": {
+           "medial": "\uFCF3"
+         },
+         "\u0640\u0650\u0651": {
+           "medial": "\uFCF4"
+         },
+         "\u0637\u0649": {
+           "isolated": "\uFCF5",
+           "final": "\uFD11"
+         },
+         "\u0637\u064A": {
+           "isolated": "\uFCF6",
+           "final": "\uFD12"
+         },
+         "\u0639\u0649": {
+           "isolated": "\uFCF7",
+           "final": "\uFD13"
+         },
+         "\u0639\u064A": {
+           "isolated": "\uFCF8",
+           "final": "\uFD14"
+         },
+         "\u063A\u0649": {
+           "isolated": "\uFCF9",
+           "final": "\uFD15"
+         },
+         "\u063A\u064A": {
+           "isolated": "\uFCFA",
+           "final": "\uFD16"
+         },
+         "\u0633\u0649": {
+           "isolated": "\uFCFB"
+         },
+         "\u0633\u064A": {
+           "isolated": "\uFCFC",
+           "final": "\uFD18"
+         },
+         "\u0634\u0649": {
+           "isolated": "\uFCFD",
+           "final": "\uFD19"
+         },
+         "\u0634\u064A": {
+           "isolated": "\uFCFE",
+           "final": "\uFD1A"
+         },
+         "\u062D\u0649": {
+           "isolated": "\uFCFF",
+           "final": "\uFD1B"
+         },
+         "\u062D\u064A": {
+           "isolated": "\uFD00",
+           "final": "\uFD1C"
+         },
+         "\u062C\u0649": {
+           "isolated": "\uFD01",
+           "final": "\uFD1D"
+         },
+         "\u062C\u064A": {
+           "isolated": "\uFD02",
+           "final": "\uFD1E"
+         },
+         "\u062E\u0649": {
+           "isolated": "\uFD03",
+           "final": "\uFD1F"
+         },
+         "\u062E\u064A": {
+           "isolated": "\uFD04",
+           "final": "\uFD20"
+         },
+         "\u0635\u0649": {
+           "isolated": "\uFD05",
+           "final": "\uFD21"
+         },
+         "\u0635\u064A": {
+           "isolated": "\uFD06",
+           "final": "\uFD22"
+         },
+         "\u0636\u0649": {
+           "isolated": "\uFD07",
+           "final": "\uFD23"
+         },
+         "\u0636\u064A": {
+           "isolated": "\uFD08",
+           "final": "\uFD24"
+         },
+         "\u0634\u062C": {
+           "isolated": "\uFD09",
+           "final": "\uFD25",
+           "initial": "\uFD2D",
+           "medial": "\uFD37"
+         },
+         "\u0634\u062D": {
+           "isolated": "\uFD0A",
+           "final": "\uFD26",
+           "initial": "\uFD2E",
+           "medial": "\uFD38"
+         },
+         "\u0634\u062E": {
+           "isolated": "\uFD0B",
+           "final": "\uFD27",
+           "initial": "\uFD2F",
+           "medial": "\uFD39"
+         },
+         "\u0634\u0631": {
+           "isolated": "\uFD0D",
+           "final": "\uFD29"
+         },
+         "\u0633\u0631": {
+           "isolated": "\uFD0E",
+           "final": "\uFD2A"
+         },
+         "\u0635\u0631": {
+           "isolated": "\uFD0F",
+           "final": "\uFD2B"
+         },
+         "\u0636\u0631": {
+           "isolated": "\uFD10",
+           "final": "\uFD2C"
+         },
+         "\u0633\u0639": {
+           "final": "\uFD17"
+         },
+         "\u062A\u062C\u0645": {
+           "initial": "\uFD50"
+         },
+         "\u062A\u062D\u062C": {
+           "final": "\uFD51",
+           "initial": "\uFD52"
+         },
+         "\u062A\u062D\u0645": {
+           "initial": "\uFD53"
+         },
+         "\u062A\u062E\u0645": {
+           "initial": "\uFD54"
+         },
+         "\u062A\u0645\u062C": {
+           "initial": "\uFD55"
+         },
+         "\u062A\u0645\u062D": {
+           "initial": "\uFD56"
+         },
+         "\u062A\u0645\u062E": {
+           "initial": "\uFD57"
+         },
+         "\u062C\u0645\u062D": {
+           "final": "\uFD58",
+           "initial": "\uFD59"
+         },
+         "\u062D\u0645\u064A": {
+           "final": "\uFD5A"
+         },
+         "\u062D\u0645\u0649": {
+           "final": "\uFD5B"
+         },
+         "\u0633\u062D\u062C": {
+           "initial": "\uFD5C"
+         },
+         "\u0633\u062C\u062D": {
+           "initial": "\uFD5D"
+         },
+         "\u0633\u062C\u0649": {
+           "final": "\uFD5E"
+         },
+         "\u0633\u0645\u062D": {
+           "final": "\uFD5F",
+           "initial": "\uFD60"
+         },
+         "\u0633\u0645\u062C": {
+           "initial": "\uFD61"
+         },
+         "\u0633\u0645\u0645": {
+           "final": "\uFD62",
+           "initial": "\uFD63"
+         },
+         "\u0635\u062D\u062D": {
+           "final": "\uFD64",
+           "initial": "\uFD65"
+         },
+         "\u0635\u0645\u0645": {
+           "final": "\uFD66",
+           "initial": "\uFDC5"
+         },
+         "\u0634\u062D\u0645": {
+           "final": "\uFD67",
+           "initial": "\uFD68"
+         },
+         "\u0634\u062C\u064A": {
+           "final": "\uFD69"
+         },
+         "\u0634\u0645\u062E": {
+           "final": "\uFD6A",
+           "initial": "\uFD6B"
+         },
+         "\u0634\u0645\u0645": {
+           "final": "\uFD6C",
+           "initial": "\uFD6D"
+         },
+         "\u0636\u062D\u0649": {
+           "final": "\uFD6E"
+         },
+         "\u0636\u062E\u0645": {
+           "final": "\uFD6F",
+           "initial": "\uFD70"
+         },
+         "\u0636\u0645\u062D": {
+           "final": "\uFD71"
+         },
+         "\u0637\u0645\u062D": {
+           "initial": "\uFD72"
+         },
+         "\u0637\u0645\u0645": {
+           "initial": "\uFD73"
+         },
+         "\u0637\u0645\u064A": {
+           "final": "\uFD74"
+         },
+         "\u0639\u062C\u0645": {
+           "final": "\uFD75",
+           "initial": "\uFDC4"
+         },
+         "\u0639\u0645\u0645": {
+           "final": "\uFD76",
+           "initial": "\uFD77"
+         },
+         "\u0639\u0645\u0649": {
+           "final": "\uFD78"
+         },
+         "\u063A\u0645\u0645": {
+           "final": "\uFD79"
+         },
+         "\u063A\u0645\u064A": {
+           "final": "\uFD7A"
+         },
+         "\u063A\u0645\u0649": {
+           "final": "\uFD7B"
+         },
+         "\u0641\u062E\u0645": {
+           "final": "\uFD7C",
+           "initial": "\uFD7D"
+         },
+         "\u0642\u0645\u062D": {
+           "final": "\uFD7E",
+           "initial": "\uFDB4"
+         },
+         "\u0642\u0645\u0645": {
+           "final": "\uFD7F"
+         },
+         "\u0644\u062D\u0645": {
+           "final": "\uFD80",
+           "initial": "\uFDB5"
+         },
+         "\u0644\u062D\u064A": {
+           "final": "\uFD81"
+         },
+         "\u0644\u062D\u0649": {
+           "final": "\uFD82"
+         },
+         "\u0644\u062C\u062C": {
+           "initial": "\uFD83",
+           "final": "\uFD84"
+         },
+         "\u0644\u062E\u0645": {
+           "final": "\uFD85",
+           "initial": "\uFD86"
+         },
+         "\u0644\u0645\u062D": {
+           "final": "\uFD87",
+           "initial": "\uFD88"
+         },
+         "\u0645\u062D\u062C": {
+           "initial": "\uFD89"
+         },
+         "\u0645\u062D\u0645": {
+           "initial": "\uFD8A"
+         },
+         "\u0645\u062D\u064A": {
+           "final": "\uFD8B"
+         },
+         "\u0645\u062C\u062D": {
+           "initial": "\uFD8C"
+         },
+         "\u0645\u062C\u0645": {
+           "initial": "\uFD8D"
+         },
+         "\u0645\u062E\u062C": {
+           "initial": "\uFD8E"
+         },
+         "\u0645\u062E\u0645": {
+           "initial": "\uFD8F"
+         },
+         "\u0645\u062C\u062E": {
+           "initial": "\uFD92"
+         },
+         "\u0647\u0645\u062C": {
+           "initial": "\uFD93"
+         },
+         "\u0647\u0645\u0645": {
+           "initial": "\uFD94"
+         },
+         "\u0646\u062D\u0645": {
+           "initial": "\uFD95"
+         },
+         "\u0646\u062D\u0649": {
+           "final": "\uFD96"
+         },
+         "\u0646\u062C\u0645": {
+           "final": "\uFD97",
+           "initial": "\uFD98"
+         },
+         "\u0646\u062C\u0649": {
+           "final": "\uFD99"
+         },
+         "\u0646\u0645\u064A": {
+           "final": "\uFD9A"
+         },
+         "\u0646\u0645\u0649": {
+           "final": "\uFD9B"
+         },
+         "\u064A\u0645\u0645": {
+           "final": "\uFD9C",
+           "initial": "\uFD9D"
+         },
+         "\u0628\u062E\u064A": {
+           "final": "\uFD9E"
+         },
+         "\u062A\u062C\u064A": {
+           "final": "\uFD9F"
+         },
+         "\u062A\u062C\u0649": {
+           "final": "\uFDA0"
+         },
+         "\u062A\u062E\u064A": {
+           "final": "\uFDA1"
+         },
+         "\u062A\u062E\u0649": {
+           "final": "\uFDA2"
+         },
+         "\u062A\u0645\u064A": {
+           "final": "\uFDA3"
+         },
+         "\u062A\u0645\u0649": {
+           "final": "\uFDA4"
+         },
+         "\u062C\u0645\u064A": {
+           "final": "\uFDA5"
+         },
+         "\u062C\u062D\u0649": {
+           "final": "\uFDA6"
+         },
+         "\u062C\u0645\u0649": {
+           "final": "\uFDA7"
+         },
+         "\u0633\u062E\u0649": {
+           "final": "\uFDA8"
+         },
+         "\u0635\u062D\u064A": {
+           "final": "\uFDA9"
+         },
+         "\u0634\u062D\u064A": {
+           "final": "\uFDAA"
+         },
+         "\u0636\u062D\u064A": {
+           "final": "\uFDAB"
+         },
+         "\u0644\u062C\u064A": {
+           "final": "\uFDAC"
+         },
+         "\u0644\u0645\u064A": {
+           "final": "\uFDAD"
+         },
+         "\u064A\u062D\u064A": {
+           "final": "\uFDAE"
+         },
+         "\u064A\u062C\u064A": {
+           "final": "\uFDAF"
+         },
+         "\u064A\u0645\u064A": {
+           "final": "\uFDB0"
+         },
+         "\u0645\u0645\u064A": {
+           "final": "\uFDB1"
+         },
+         "\u0642\u0645\u064A": {
+           "final": "\uFDB2"
+         },
+         "\u0646\u062D\u064A": {
+           "final": "\uFDB3"
+         },
+         "\u0639\u0645\u064A": {
+           "final": "\uFDB6"
+         },
+         "\u0643\u0645\u064A": {
+           "final": "\uFDB7"
+         },
+         "\u0646\u062C\u062D": {
+           "initial": "\uFDB8",
+           "final": "\uFDBD"
+         },
+         "\u0645\u062E\u064A": {
+           "final": "\uFDB9"
+         },
+         "\u0644\u062C\u0645": {
+           "initial": "\uFDBA",
+           "final": "\uFDBC"
+         },
+         "\u0643\u0645\u0645": {
+           "final": "\uFDBB",
+           "initial": "\uFDC3"
+         },
+         "\u062C\u062D\u064A": {
+           "final": "\uFDBE"
+         },
+         "\u062D\u062C\u064A": {
+           "final": "\uFDBF"
+         },
+         "\u0645\u062C\u064A": {
+           "final": "\uFDC0"
+         },
+         "\u0641\u0645\u064A": {
+           "final": "\uFDC1"
+         },
+         "\u0628\u062D\u064A": {
+           "final": "\uFDC2"
+         },
+         "\u0633\u062E\u064A": {
+           "final": "\uFDC6"
+         },
+         "\u0646\u062C\u064A": {
+           "final": "\uFDC7"
+         },
+         "\u0644\u0622": {
+           "isolated": "\uFEF5",
+           "final": "\uFEF6"
+         },
+         "\u0644\u0623": {
+           "isolated": "\uFEF7",
+           "final": "\uFEF8"
+         },
+         "\u0644\u0625": {
+           "isolated": "\uFEF9",
+           "final": "\uFEFA"
+         },
+         "\u0644\u0627": {
+           "isolated": "\uFEFB",
+           "final": "\uFEFC"
+         },
+         "words": {
+           "\u0635\u0644\u06D2": "\uFDF0",
+           "\u0642\u0644\u06D2": "\uFDF1",
+           "\u0627\u0644\u0644\u0647": "\uFDF2",
+           "\u0627\u0643\u0628\u0631": "\uFDF3",
+           "\u0645\u062D\u0645\u062F": "\uFDF4",
+           "\u0635\u0644\u0639\u0645": "\uFDF5",
+           "\u0631\u0633\u0648\u0644": "\uFDF6",
+           "\u0639\u0644\u064A\u0647": "\uFDF7",
+           "\u0648\u0633\u0644\u0645": "\uFDF8",
+           "\u0635\u0644\u0649": "\uFDF9",
+           "\u0635\u0644\u0649\u0627\u0644\u0644\u0647\u0639\u0644\u064A\u0647\u0648\u0633\u0644\u0645": "\uFDFA",
+           "\u062C\u0644\u062C\u0644\u0627\u0644\u0647": "\uFDFB",
+           "\u0631\u06CC\u0627\u0644": "\uFDFC"
+         }
+       };
+
+       unicodeLigatures["default"] = ligatureReference;
+
+       Object.defineProperty(reference, "__esModule", {
+         value: true
+       });
+       var unicode_arabic_1$3 = unicodeArabic;
+       var unicode_ligatures_1$2 = unicodeLigatures;
+       var letterList = Object.keys(unicode_arabic_1$3["default"]);
+       reference.letterList = letterList;
+       var ligatureList = Object.keys(unicode_ligatures_1$2["default"]);
+       reference.ligatureList = ligatureList;
+       var ligatureWordList = Object.keys(unicode_ligatures_1$2["default"].words);
+       reference.ligatureWordList = ligatureWordList;
+       var lams = "\u0644\u06B5\u06B6\u06B7\u06B8";
+       reference.lams = lams;
+       var alefs = "\u0627\u0622\u0623\u0625\u0671\u0672\u0673\u0675\u0773\u0774";
+       reference.alefs = alefs; // for (var l = 1; l < lams.length; l++) {
+       //   console.log('-');
+       //   for (var a = 0; a < alefs.length; a++) {
+       //     console.log(a + ': ' + lams[l] + alefs[a]);
+       //   }
+       // }
+
+       var tashkeel = "\u0605\u0640\u0670\u0674\u06DF\u06E7\u06E8";
+       reference.tashkeel = tashkeel;
+
+       function addToTashkeel(start, finish) {
+         for (var i = start; i <= finish; i++) {
+           reference.tashkeel = tashkeel += String.fromCharCode(i);
+         }
+       }
+
+       addToTashkeel(0x0610, 0x061A);
+       addToTashkeel(0x064B, 0x065F);
+       addToTashkeel(0x06D6, 0x06DC);
+       addToTashkeel(0x06E0, 0x06E4);
+       addToTashkeel(0x06EA, 0x06ED);
+       addToTashkeel(0x08D3, 0x08E1);
+       addToTashkeel(0x08E3, 0x08FF);
+       addToTashkeel(0xFE70, 0xFE7F);
+       var lineBreakers = "\u0627\u0629\u0648\u06C0\u06CF\u06FD\u06FE\u076B\u076C\u0771\u0773\u0774\u0778\u0779\u08E2\u08B1\u08B2\u08B9";
+       reference.lineBreakers = lineBreakers;
+
+       function addToLineBreakers(start, finish) {
+         for (var i = start; i <= finish; i++) {
+           reference.lineBreakers = lineBreakers += String.fromCharCode(i);
+         }
+       }
+
+       addToLineBreakers(0x0600, 0x061F); // it's OK to include tashkeel in this range as it is ignored
+
+       addToLineBreakers(0x0621, 0x0625);
+       addToLineBreakers(0x062F, 0x0632);
+       addToLineBreakers(0x0660, 0x066D); // numerals, math
+
+       addToLineBreakers(0x0671, 0x0677);
+       addToLineBreakers(0x0688, 0x0699);
+       addToLineBreakers(0x06C3, 0x06CB);
+       addToLineBreakers(0x06D2, 0x06F9);
+       addToLineBreakers(0x0759, 0x075B);
+       addToLineBreakers(0x08AA, 0x08AE);
+       addToLineBreakers(0xFB50, 0xFDFD); // presentation forms look like they could connect, but never do
+       // Presentation Forms A includes diacritics but they are meant to stand alone
+
+       addToLineBreakers(0xFE80, 0xFEFC); // presentation forms look like they could connect, but never do
+       // numerals, math
+
+       addToLineBreakers(0x10E60, 0x10E7F);
+       addToLineBreakers(0x1EC70, 0x1ECBF);
+       addToLineBreakers(0x1EE00, 0x1EEFF);
+
+       Object.defineProperty(GlyphSplitter$1, "__esModule", {
+         value: true
+       });
+       var isArabic_1$6 = isArabic$1;
+       var reference_1$5 = reference;
+
+       function GlyphSplitter(word) {
+         var letters = [];
+         var lastLetter = '';
+         word.split('').forEach(function (letter) {
+           if (isArabic_1$6.isArabic(letter)) {
+             if (reference_1$5.tashkeel.indexOf(letter) > -1) {
+               letters[letters.length - 1] += letter;
+             } else if (lastLetter.length && (reference_1$5.lams.indexOf(lastLetter) === 0 && reference_1$5.alefs.indexOf(letter) > -1 || reference_1$5.lams.indexOf(lastLetter) > 0 && reference_1$5.alefs.indexOf(letter) === 0)) {
+               // valid LA forms
+               letters[letters.length - 1] += letter;
+             } else {
+               letters.push(letter);
+             }
+           } else {
+             letters.push(letter);
+           }
+
+           if (reference_1$5.tashkeel.indexOf(letter) === -1) {
+             lastLetter = letter;
+           }
+         });
+         return letters;
+       }
+
+       GlyphSplitter$1.GlyphSplitter = GlyphSplitter;
+
+       var BaselineSplitter$1 = {};
+
+       Object.defineProperty(BaselineSplitter$1, "__esModule", {
+         value: true
+       });
+       var isArabic_1$5 = isArabic$1;
+       var reference_1$4 = reference;
+
+       function BaselineSplitter(word) {
+         var letters = [];
+         var lastLetter = '';
+         word.split('').forEach(function (letter) {
+           if (isArabic_1$5.isArabic(letter) && isArabic_1$5.isArabic(lastLetter)) {
+             if (lastLetter.length && reference_1$4.tashkeel.indexOf(letter) > -1) {
+               letters[letters.length - 1] += letter;
+             } else if (reference_1$4.lineBreakers.indexOf(lastLetter) > -1) {
+               letters.push(letter);
+             } else {
+               letters[letters.length - 1] += letter;
+             }
+           } else {
+             letters.push(letter);
+           }
+
+           if (reference_1$4.tashkeel.indexOf(letter) === -1) {
+             // don't allow tashkeel to hide line break
+             lastLetter = letter;
+           }
+         });
+         return letters;
+       }
+
+       BaselineSplitter$1.BaselineSplitter = BaselineSplitter;
+
+       var Normalization = {};
+
+       Object.defineProperty(Normalization, "__esModule", {
+         value: true
+       });
+       var unicode_arabic_1$2 = unicodeArabic;
+       var unicode_ligatures_1$1 = unicodeLigatures;
+       var isArabic_1$4 = isArabic$1;
+       var reference_1$3 = reference;
+
+       function Normal(word, breakPresentationForm) {
+         // default is to turn initial/isolated/medial/final presentation form to generic
+         if (typeof breakPresentationForm === 'undefined') {
+           breakPresentationForm = true;
+         }
+
+         var returnable = '';
+         word.split('').forEach(function (letter) {
+           if (!isArabic_1$4.isArabic(letter)) {
+             returnable += letter;
+             return;
+           }
+
+           for (var w = 0; w < reference_1$3.letterList.length; w++) {
+             // ok so we are checking this potential lettertron
+             var letterForms = unicode_arabic_1$2["default"][reference_1$3.letterList[w]];
+             var versions = Object.keys(letterForms);
+
+             for (var v = 0; v < versions.length; v++) {
+               var localVersion = letterForms[versions[v]];
+
+               if (_typeof(localVersion) === 'object' && typeof localVersion.indexOf === 'undefined') {
+                 // look at this embedded object
+                 var embeddedForms = Object.keys(localVersion);
+
+                 for (var ef = 0; ef < embeddedForms.length; ef++) {
+                   var form = localVersion[embeddedForms[ef]];
+
+                   if (form === letter || _typeof(form) === 'object' && form.indexOf && form.indexOf(letter) > -1) {
+                     // match
+                     // console.log('embedded match');
+                     if (form === letter) {
+                       // match exact
+                       if (breakPresentationForm && localVersion['normal'] && ['isolated', 'initial', 'medial', 'final'].indexOf(embeddedForms[ef]) > -1) {
+                         // replace presentation form
+                         // console.log('keeping normal form of the letter');
+                         if (_typeof(localVersion['normal']) === 'object') {
+                           returnable += localVersion['normal'][0];
+                         } else {
+                           returnable += localVersion['normal'];
+                         }
+
+                         return;
+                       } // console.log('keeping this letter');
+
+
+                       returnable += letter;
+                       return;
+                     } else if (_typeof(form) === 'object' && form.indexOf && form.indexOf(letter) > -1) {
+                       // match
+                       returnable += form[0]; // console.log('added the first letter from the same array');
+
+                       return;
+                     }
+                   }
+                 }
+               } else if (localVersion === letter) {
+                 // match exact
+                 if (breakPresentationForm && letterForms['normal'] && ['isolated', 'initial', 'medial', 'final'].indexOf(versions[v]) > -1) {
+                   // replace presentation form
+                   // console.log('keeping normal form of the letter');
+                   if (_typeof(letterForms['normal']) === 'object') {
+                     returnable += letterForms['normal'][0];
+                   } else {
+                     returnable += letterForms['normal'];
+                   }
+
+                   return;
+                 } // console.log('keeping this letter');
+
+
+                 returnable += letter;
+                 return;
+               } else if (_typeof(localVersion) === 'object' && localVersion.indexOf && localVersion.indexOf(letter) > -1) {
+                 // match
+                 returnable += localVersion[0]; // console.log('added the first letter from the same array');
+
+                 return;
+               }
+             }
+           } // try ligatures
+
+
+           for (var v2 = 0; v2 < reference_1$3.ligatureList.length; v2++) {
+             var normalForm = reference_1$3.ligatureList[v2];
+
+             if (normalForm !== 'words') {
+               var ligForms = Object.keys(unicode_ligatures_1$1["default"][normalForm]);
+
+               for (var f = 0; f < ligForms.length; f++) {
+                 if (unicode_ligatures_1$1["default"][normalForm][ligForms[f]] === letter) {
+                   returnable += normalForm;
+                   return;
+                 }
+               }
+             }
+           } // try words ligatures
+
+
+           for (var v3 = 0; v3 < reference_1$3.ligatureWordList.length; v3++) {
+             var _normalForm = reference_1$3.ligatureWordList[v3];
+
+             if (unicode_ligatures_1$1["default"].words[_normalForm] === letter) {
+               returnable += _normalForm;
+               return;
+             }
+           }
+
+           returnable += letter; // console.log('kept the letter')
+         });
+         return returnable;
+       }
+
+       Normalization.Normal = Normal;
+
+       var CharShaper$1 = {};
+
+       Object.defineProperty(CharShaper$1, "__esModule", {
+         value: true
+       });
+       var unicode_arabic_1$1 = unicodeArabic;
+       var isArabic_1$3 = isArabic$1;
+       var reference_1$2 = reference;
+
+       function CharShaper(letter, form) {
+         if (!isArabic_1$3.isArabic(letter)) {
+           // fail not Arabic
+           throw new Error('Not Arabic');
+         }
+
+         if (letter === "\u0621") {
+           // hamza alone
+           return "\u0621";
+         }
+
+         for (var w = 0; w < reference_1$2.letterList.length; w++) {
+           // ok so we are checking this potential lettertron
+           var letterForms = unicode_arabic_1$1["default"][reference_1$2.letterList[w]];
+           var versions = Object.keys(letterForms);
+
+           for (var v = 0; v < versions.length; v++) {
+             var localVersion = letterForms[versions[v]];
+
+             if (localVersion === letter || _typeof(localVersion) === 'object' && localVersion.indexOf && localVersion.indexOf(letter) > -1) {
+               if (versions.indexOf(form) > -1) {
+                 return letterForms[form];
+               }
+             } else if (_typeof(localVersion) === 'object' && typeof localVersion.indexOf === 'undefined') {
+               // check embedded
+               var embeddedVersions = Object.keys(localVersion);
+
+               for (var ev = 0; ev < embeddedVersions.length; ev++) {
+                 if (localVersion[embeddedVersions[ev]] === letter || _typeof(localVersion[embeddedVersions[ev]]) === 'object' && localVersion[embeddedVersions[ev]].indexOf && localVersion[embeddedVersions[ev]].indexOf(letter) > -1) {
+                   if (embeddedVersions.indexOf(form) > -1) {
+                     return localVersion[form];
+                   }
+                 }
+               }
+             }
+           }
+         }
+       }
+
+       CharShaper$1.CharShaper = CharShaper;
+
+       var WordShaper$2 = {};
+
+       Object.defineProperty(WordShaper$2, "__esModule", {
+         value: true
+       });
+       var isArabic_1$2 = isArabic$1;
+       var reference_1$1 = reference;
+       var CharShaper_1$1 = CharShaper$1;
+       var unicode_ligatures_1 = unicodeLigatures;
+
+       function WordShaper$1(word) {
+         var state = 'initial';
+         var output = '';
+
+         for (var w = 0; w < word.length; w++) {
+           var nextLetter = ' ';
+
+           for (var nxw = w + 1; nxw < word.length; nxw++) {
+             if (!isArabic_1$2.isArabic(word[nxw])) {
+               break;
+             }
+
+             if (reference_1$1.tashkeel.indexOf(word[nxw]) === -1) {
+               nextLetter = word[nxw];
+               break;
+             }
+           }
+
+           if (!isArabic_1$2.isArabic(word[w]) || isArabic_1$2.isMath(word[w])) {
+             // space or other non-Arabic
+             output += word[w];
+             state = 'initial';
+           } else if (reference_1$1.tashkeel.indexOf(word[w]) > -1) {
+             // tashkeel - add without changing state
+             output += word[w];
+           } else if (nextLetter === ' ' // last Arabic letter in this word
+           || reference_1$1.lineBreakers.indexOf(word[w]) > -1) {
+             // the current letter is known to break lines
+             output += CharShaper_1$1.CharShaper(word[w], state === 'initial' ? 'isolated' : 'final');
+             state = 'initial';
+           } else if (reference_1$1.lams.indexOf(word[w]) > -1 && reference_1$1.alefs.indexOf(nextLetter) > -1) {
+             // LA letters - advance an additional letter after this
+             output += unicode_ligatures_1["default"][word[w] + nextLetter][state === 'initial' ? 'isolated' : 'final'];
+
+             while (word[w] !== nextLetter) {
+               w++;
+             }
+
+             state = 'initial';
+           } else {
+             output += CharShaper_1$1.CharShaper(word[w], state);
+             state = 'medial';
+           }
+         }
+
+         return output;
+       }
+
+       WordShaper$2.WordShaper = WordShaper$1;
+
+       var ParentLetter$1 = {};
+
+       Object.defineProperty(ParentLetter$1, "__esModule", {
+         value: true
+       });
+       var unicode_arabic_1 = unicodeArabic;
+       var isArabic_1$1 = isArabic$1;
+       var reference_1 = reference;
+
+       function ParentLetter(letter) {
+         if (!isArabic_1$1.isArabic(letter)) {
+           throw new Error('Not an Arabic letter');
+         }
+
+         for (var w = 0; w < reference_1.letterList.length; w++) {
+           // ok so we are checking this potential lettertron
+           var letterForms = unicode_arabic_1["default"][reference_1.letterList[w]];
+           var versions = Object.keys(letterForms);
+
+           for (var v = 0; v < versions.length; v++) {
+             var localVersion = letterForms[versions[v]];
+
+             if (_typeof(localVersion) === 'object' && typeof localVersion.indexOf === 'undefined') {
+               // look at this embedded object
+               var embeddedForms = Object.keys(localVersion);
+
+               for (var ef = 0; ef < embeddedForms.length; ef++) {
+                 var form = localVersion[embeddedForms[ef]];
+
+                 if (form === letter || _typeof(form) === 'object' && form.indexOf && form.indexOf(letter) > -1) {
+                   // match
+                   return localVersion;
+                 }
+               }
+             } else if (localVersion === letter || _typeof(localVersion) === 'object' && localVersion.indexOf && localVersion.indexOf(letter) > -1) {
+               // match
+               return letterForms;
+             }
+           }
+
+           return null;
+         }
+       }
+
+       ParentLetter$1.ParentLetter = ParentLetter;
+
+       function GrandparentLetter(letter) {
+         if (!isArabic_1$1.isArabic(letter)) {
+           throw new Error('Not an Arabic letter');
+         }
+
+         for (var w = 0; w < reference_1.letterList.length; w++) {
+           // ok so we are checking this potential lettertron
+           var letterForms = unicode_arabic_1["default"][reference_1.letterList[w]];
+           var versions = Object.keys(letterForms);
+
+           for (var v = 0; v < versions.length; v++) {
+             var localVersion = letterForms[versions[v]];
+
+             if (_typeof(localVersion) === 'object' && typeof localVersion.indexOf === 'undefined') {
+               // look at this embedded object
+               var embeddedForms = Object.keys(localVersion);
+
+               for (var ef = 0; ef < embeddedForms.length; ef++) {
+                 var form = localVersion[embeddedForms[ef]];
+
+                 if (form === letter || _typeof(form) === 'object' && form.indexOf && form.indexOf(letter) > -1) {
+                   // match
+                   return letterForms;
+                 }
+               }
+             } else if (localVersion === letter || _typeof(localVersion) === 'object' && localVersion.indexOf && localVersion.indexOf(letter) > -1) {
+               // match
+               return letterForms;
+             }
+           }
+
+           return null;
+         }
+       }
+
+       ParentLetter$1.GrandparentLetter = GrandparentLetter;
+
+       Object.defineProperty(lib, "__esModule", {
+         value: true
+       });
+       var isArabic_1 = isArabic$1;
+       lib.isArabic = isArabic_1.isArabic;
+       var GlyphSplitter_1 = GlyphSplitter$1;
+       lib.GlyphSplitter = GlyphSplitter_1.GlyphSplitter;
+       var BaselineSplitter_1 = BaselineSplitter$1;
+       lib.BaselineSplitter = BaselineSplitter_1.BaselineSplitter;
+       var Normalization_1 = Normalization;
+       lib.Normal = Normalization_1.Normal;
+       var CharShaper_1 = CharShaper$1;
+       lib.CharShaper = CharShaper_1.CharShaper;
+       var WordShaper_1 = WordShaper$2;
+       var WordShaper = lib.WordShaper = WordShaper_1.WordShaper;
+       var ParentLetter_1 = ParentLetter$1;
+       lib.ParentLetter = ParentLetter_1.ParentLetter;
+       lib.GrandparentLetter = ParentLetter_1.GrandparentLetter;
+
+       var rtlRegex = /[\u0590-\u05FF\u0600-\u06FF\u0750-\u07BF\u08A0–\u08BF]/;
+       function fixRTLTextForSvg(inputText) {
+         var ret = '',
+             rtlBuffer = [];
+         var arabicRegex = /[\u0600-\u06FF]/g;
+         var arabicDiacritics = /[\u0610-\u061A\u064B-\u065F\u0670\u06D6-\u06ED]/g;
+         var arabicMath = /[\u0660-\u066C\u06F0-\u06F9]+/g;
+         var thaanaVowel = /[\u07A6-\u07B0]/;
+         var hebrewSign = /[\u0591-\u05bd\u05bf\u05c1-\u05c5\u05c7]/; // Arabic word shaping
+
+         if (arabicRegex.test(inputText)) {
+           inputText = WordShaper(inputText);
+         }
+
+         for (var n = 0; n < inputText.length; n++) {
+           var c = inputText[n];
+
+           if (arabicMath.test(c)) {
+             // Arabic numbers go LTR
+             ret += rtlBuffer.reverse().join('');
+             rtlBuffer = [c];
+           } else {
+             if (rtlBuffer.length && arabicMath.test(rtlBuffer[rtlBuffer.length - 1])) {
+               ret += rtlBuffer.reverse().join('');
+               rtlBuffer = [];
+             }
+
+             if ((thaanaVowel.test(c) || hebrewSign.test(c) || arabicDiacritics.test(c)) && rtlBuffer.length) {
+               rtlBuffer[rtlBuffer.length - 1] += c;
+             } else if (rtlRegex.test(c) // include Arabic presentation forms
+             || c.charCodeAt(0) >= 64336 && c.charCodeAt(0) <= 65023 || c.charCodeAt(0) >= 65136 && c.charCodeAt(0) <= 65279) {
+               rtlBuffer.push(c);
+             } else if (c === ' ' && rtlBuffer.length) {
+               // whitespace within RTL text
+               rtlBuffer = [rtlBuffer.reverse().join('') + ' '];
+             } else {
+               // non-RTL character
+               ret += rtlBuffer.reverse().join('') + c;
+               rtlBuffer = [];
+             }
+           }
+         }
+
+         ret += rtlBuffer.reverse().join('');
+         return ret;
+       }
+
+       var DESCRIPTORS$2 = descriptors;
+       var uncurryThis$b = functionUncurryThis;
+       var objectKeys = objectKeys$4;
+       var toIndexedObject = toIndexedObject$d;
+       var $propertyIsEnumerable = objectPropertyIsEnumerable.f;
+
+       var propertyIsEnumerable = uncurryThis$b($propertyIsEnumerable);
+       var push$2 = uncurryThis$b([].push);
+
+       // `Object.{ entries, values }` methods implementation
+       var createMethod$1 = function (TO_ENTRIES) {
+         return function (it) {
+           var O = toIndexedObject(it);
+           var keys = objectKeys(O);
+           var length = keys.length;
+           var i = 0;
+           var result = [];
+           var key;
+           while (length > i) {
+             key = keys[i++];
+             if (!DESCRIPTORS$2 || propertyIsEnumerable(O, key)) {
+               push$2(result, TO_ENTRIES ? [key, O[key]] : O[key]);
+             }
+           }
+           return result;
+         };
+       };
+
+       var objectToArray = {
+         // `Object.entries` method
+         // https://tc39.es/ecma262/#sec-object.entries
+         entries: createMethod$1(true),
+         // `Object.values` method
+         // https://tc39.es/ecma262/#sec-object.values
+         values: createMethod$1(false)
+       };
+
+       var $$r = _export;
+       var $values = objectToArray.values;
+
+       // `Object.values` method
+       // https://tc39.es/ecma262/#sec-object.values
+       $$r({ target: 'Object', stat: true }, {
+         values: function values(O) {
+           return $values(O);
+         }
+       });
+
+       // https://github.com/openstreetmap/iD/issues/772
+       // http://mathiasbynens.be/notes/localstorage-pattern#comment-9
+       var _storage;
+
+       try {
+         _storage = localStorage;
+       } catch (e) {} // eslint-disable-line no-empty
+
+
+       _storage = _storage || function () {
+         var s = {};
+         return {
+           getItem: function getItem(k) {
+             return s[k];
+           },
+           setItem: function setItem(k, v) {
+             return s[k] = v;
+           },
+           removeItem: function removeItem(k) {
+             return delete s[k];
+           }
+         };
+       }();
+
+       var _listeners = {}; //
+       // corePreferences is an interface for persisting basic key-value strings
+       // within and between iD sessions on the same site.
+       //
+
+       /**
+        * @param {string} k
+        * @param {string?} v
+        * @returns {boolean} true if the action succeeded
+        */
+
+       function corePreferences(k, v) {
+         try {
+           if (v === undefined) return _storage.getItem(k);else if (v === null) _storage.removeItem(k);else _storage.setItem(k, v);
+
+           if (_listeners[k]) {
+             _listeners[k].forEach(function (handler) {
+               return handler(v);
+             });
+           }
+
+           return true;
+         } catch (e) {
+           /* eslint-disable no-console */
+           if (typeof console !== 'undefined') {
+             console.error('localStorage quota exceeded');
+           }
+           /* eslint-enable no-console */
+
+
+           return false;
+         }
+       } // adds an event listener which is triggered whenever
+
+
+       corePreferences.onChange = function (k, handler) {
+         _listeners[k] = _listeners[k] || [];
+
+         _listeners[k].push(handler);
+       };
+
+       var vparse = {exports: {}};
+
+       (function (module) {
+         (function (window) {
+
+           function parseVersion(v) {
+             var m = v.replace(/[^0-9.]/g, '').match(/[0-9]*\.|[0-9]+/g) || [];
+             v = {
+               major: +m[0] || 0,
+               minor: +m[1] || 0,
+               patch: +m[2] || 0,
+               build: +m[3] || 0
+             };
+             v.isEmpty = !v.major && !v.minor && !v.patch && !v.build;
+             v.parsed = [v.major, v.minor, v.patch, v.build];
+             v.text = v.parsed.join('.');
+             v.compare = compare;
+             return v;
+           }
+
+           function compare(v) {
+             if (typeof v === 'string') {
+               v = parseVersion(v);
+             }
+
+             for (var i = 0; i < 4; i++) {
+               if (this.parsed[i] !== v.parsed[i]) {
+                 return this.parsed[i] > v.parsed[i] ? 1 : -1;
+               }
+             }
+
+             return 0;
+           }
+           /* istanbul ignore next */
+
+
+           if (module && 'object' === 'object') {
+             module.exports = parseVersion;
+           } else {
+             window.parseVersion = parseVersion;
+           }
+         })(commonjsGlobal);
+       })(vparse);
+
+       var parseVersion = vparse.exports;
+
+       var name = "iD";
+       var version = "2.20.4";
+       var description = "A friendly editor for OpenStreetMap";
+       var main = "dist/iD.min.js";
+       var repository = "github:openstreetmap/iD";
+       var homepage = "https://github.com/openstreetmap/iD";
+       var bugs = "https://github.com/openstreetmap/iD/issues";
+       var keywords = ["editor","openstreetmap"];
+       var license = "ISC";
+       var scripts = {all:"npm-run-all -s clean build build:legacy dist",build:"npm-run-all -s build:css build:data build:dev","build:css":"node scripts/build_css.js","build:data":"shx mkdir -p dist/data && node scripts/build_data.js","build:dev":"rollup --config config/rollup.config.dev.js","build:legacy":"rollup --config config/rollup.config.legacy.js","build:stats":"rollup --config config/rollup.config.stats.js",clean:"shx rm -f dist/*.js dist/*.map dist/*.css dist/img/*.svg",dist:"npm-run-all -p dist:**","dist:mapillary":"shx mkdir -p dist/mapillary-js && shx cp -R node_modules/mapillary-js/dist/* dist/mapillary-js/","dist:pannellum":"shx mkdir -p dist/pannellum-streetside && shx cp -R node_modules/pannellum/build/* dist/pannellum-streetside/","dist:min:iD":"uglifyjs dist/iD.legacy.js --compress --mangle --output dist/iD.min.js","dist:svg:iD":"svg-sprite --symbol --symbol-dest . --shape-id-generator \"iD-%s\" --symbol-sprite dist/img/iD-sprite.svg \"svg/iD-sprite/**/*.svg\"","dist:svg:community":"svg-sprite --symbol --symbol-dest . --shape-id-generator \"community-%s\" --symbol-sprite dist/img/community-sprite.svg node_modules/osm-community-index/dist/img/*.svg","dist:svg:fa":"svg-sprite --symbol --symbol-dest . --symbol-sprite dist/img/fa-sprite.svg svg/fontawesome/*.svg","dist:svg:maki":"svg-sprite --symbol --symbol-dest . --shape-id-generator \"maki-%s\" --symbol-sprite dist/img/maki-sprite.svg node_modules/@mapbox/maki/icons/*.svg","dist:svg:mapillary:signs":"svg-sprite --symbol --symbol-dest . --symbol-sprite dist/img/mapillary-sprite.svg node_modules/mapillary_sprite_source/package_signs/*.svg","dist:svg:mapillary:objects":"svg-sprite --symbol --symbol-dest . --symbol-sprite dist/img/mapillary-object-sprite.svg node_modules/mapillary_sprite_source/package_objects/*.svg","dist:svg:temaki":"svg-sprite --symbol --symbol-dest . --shape-id-generator \"temaki-%s\" --symbol-sprite dist/img/temaki-sprite.svg node_modules/@ideditor/temaki/icons/*.svg",imagery:"node scripts/update_imagery.js",lint:"eslint scripts test/spec modules","lint:fix":"eslint scripts test/spec modules --fix",start:"npm-run-all -s build start:server",quickstart:"npm-run-all -s build:dev start:server","start:server":"node scripts/server.js",test:"npm-run-all -s lint build test:spec","test:spec":"karma start karma.conf.js",translations:"node scripts/update_locales.js"};
+       var dependencies = {"@ideditor/country-coder":"~5.0.3","@ideditor/location-conflation":"~1.0.2","@mapbox/geojson-area":"^0.2.2","@mapbox/sexagesimal":"1.2.0","@mapbox/vector-tile":"^1.3.1","@tmcw/togeojson":"^4.5.0","@turf/bbox-clip":"^6.0.0","abortcontroller-polyfill":"^1.4.0","aes-js":"^3.1.2","alif-toolkit":"^1.2.9","core-js":"^3.6.5",diacritics:"1.3.0","fast-deep-equal":"~3.1.1","fast-json-stable-stringify":"2.1.0","lodash-es":"~4.17.15",marked:"~2.0.0","node-diff3":"2.1.0","osm-auth":"1.1.0",pannellum:"2.5.6",pbf:"^3.2.1","polygon-clipping":"~0.15.1",rbush:"3.0.1","whatwg-fetch":"^3.4.1","which-polygon":"2.2.0"};
+       var devDependencies = {"@babel/core":"^7.11.6","@babel/preset-env":"^7.11.5","@fortawesome/fontawesome-svg-core":"^1.2.32","@fortawesome/free-brands-svg-icons":"~5.15.1","@fortawesome/free-regular-svg-icons":"~5.15.1","@fortawesome/free-solid-svg-icons":"~5.15.1","@ideditor/temaki":"~5.0.0","@mapbox/maki":"^6.0.0","@rollup/plugin-babel":"^5.2.1","@rollup/plugin-commonjs":"^21.0.0","@rollup/plugin-json":"^4.0.1","@rollup/plugin-node-resolve":"~13.0.5",autoprefixer:"^10.0.1",btoa:"^1.2.1",chai:"^4.3.4","cldr-core":"37.0.0","cldr-localenames-full":"37.0.0",chalk:"^4.1.2","concat-files":"^0.1.1",d3:"~6.6.0","editor-layer-index":"github:osmlab/editor-layer-index#gh-pages",eslint:"^7.1.0","fetch-mock":"^9.11.0",gaze:"^1.1.3",glob:"^7.1.0",happen:"^0.3.2","js-yaml":"^4.0.0","json-stringify-pretty-compact":"^3.0.0",karma:"^6.3.5","karma-chrome-launcher":"^3.1.0","karma-coverage":"^2.0.3","karma-mocha":"^2.0.1","karma-remap-istanbul":"^0.6.0",mapillary_sprite_source:"^1.8.0","mapillary-js":"4.0.0",minimist:"^1.2.3",mocha:"^8.4.0","name-suggestion-index":"~6.0","node-fetch":"^2.6.1","npm-run-all":"^4.0.0","object-inspect":"1.10.3","osm-community-index":"~5.1.0",postcss:"^8.1.1","postcss-selector-prepend":"^0.5.0",rollup:"~2.52.8","rollup-plugin-includepaths":"~0.2.3","rollup-plugin-progress":"^1.1.1","rollup-plugin-visualizer":"~4.2.0",shelljs:"^0.8.0",shx:"^0.3.0",sinon:"^11.1.2","sinon-chai":"^3.7.0",smash:"0.0","static-server":"^2.2.1","svg-sprite":"1.5.1","uglify-js":"~3.13.0",vparse:"~1.1.0"};
+       var engines = {node:">=10"};
+       var browserslist = ["> 0.2%, last 6 major versions, Firefox ESR, IE 11, maintained node versions"];
+       var packageJSON = {
+       name: name,
+       version: version,
+       description: description,
+       main: main,
+       repository: repository,
+       homepage: homepage,
+       bugs: bugs,
+       keywords: keywords,
+       license: license,
+       scripts: scripts,
+       dependencies: dependencies,
+       devDependencies: devDependencies,
+       engines: engines,
+       browserslist: browserslist
+       };
+
+       var _mainFileFetcher = coreFileFetcher(); // singleton
+       // coreFileFetcher asynchronously fetches data from JSON files
+       //
+
+       function coreFileFetcher() {
+         var ociVersion = packageJSON.devDependencies['osm-community-index'];
+         var v = parseVersion(ociVersion);
+         var vMinor = "".concat(v.major, ".").concat(v.minor);
+         var _this = {};
+         var _inflight = {};
+         var _fileMap = {
+           'address_formats': 'data/address_formats.min.json',
+           'deprecated': 'https://cdn.jsdelivr.net/npm/@openstreetmap/id-tagging-schema@3/dist/deprecated.min.json',
+           'discarded': 'https://cdn.jsdelivr.net/npm/@openstreetmap/id-tagging-schema@3/dist/discarded.min.json',
+           'imagery': 'data/imagery.min.json',
+           'intro_graph': 'data/intro_graph.min.json',
+           'keepRight': 'data/keepRight.min.json',
+           'languages': 'data/languages.min.json',
+           'locales': 'locales/index.min.json',
+           'oci_defaults': "https://cdn.jsdelivr.net/npm/osm-community-index@".concat(vMinor, "/dist/defaults.min.json"),
+           'oci_features': "https://cdn.jsdelivr.net/npm/osm-community-index@".concat(vMinor, "/dist/featureCollection.min.json"),
+           'oci_resources': "https://cdn.jsdelivr.net/npm/osm-community-index@".concat(vMinor, "/dist/resources.min.json"),
+           'preset_categories': 'https://cdn.jsdelivr.net/npm/@openstreetmap/id-tagging-schema@3/dist/preset_categories.min.json',
+           'preset_defaults': 'https://cdn.jsdelivr.net/npm/@openstreetmap/id-tagging-schema@3/dist/preset_defaults.min.json',
+           'preset_fields': 'https://cdn.jsdelivr.net/npm/@openstreetmap/id-tagging-schema@3/dist/fields.min.json',
+           'preset_presets': 'https://cdn.jsdelivr.net/npm/@openstreetmap/id-tagging-schema@3/dist/presets.min.json',
+           'phone_formats': 'data/phone_formats.min.json',
+           'qa_data': 'data/qa_data.min.json',
+           'shortcuts': 'data/shortcuts.min.json',
+           'territory_languages': 'data/territory_languages.min.json',
+           'wmf_sitematrix': 'https://cdn.jsdelivr.net/npm/wmf-sitematrix@0.1/wikipedia.min.json'
+         };
+         var _cachedData = {}; // expose the cache; useful for tests
+
+         _this.cache = function () {
+           return _cachedData;
+         }; // Returns a Promise to fetch data
+         // (resolved with the data if we have it already)
+
+
+         _this.get = function (which) {
+           if (_cachedData[which]) {
+             return Promise.resolve(_cachedData[which]);
+           }
+
+           var file = _fileMap[which];
+
+           var url = file && _this.asset(file);
+
+           if (!url) {
+             return Promise.reject("Unknown data file for \"".concat(which, "\""));
+           }
+
+           var prom = _inflight[url];
+
+           if (!prom) {
+             _inflight[url] = prom = fetch(url).then(function (response) {
+               // fetch in PhantomJS tests may return ok=false and status=0 even if it's okay
+               if (!response.ok && response.status !== 0 || !response.json) {
+                 throw new Error(response.status + ' ' + response.statusText);
+               }
+
+               if (response.status === 204 || response.status === 205) return; // No Content, Reset Content
+
+               return response.json();
+             }).then(function (result) {
+               delete _inflight[url];
+
+               if (!result) {
+                 throw new Error("No data loaded for \"".concat(which, "\""));
+               }
+
+               _cachedData[which] = result;
+               return result;
+             })["catch"](function (err) {
+               delete _inflight[url];
+               throw err;
+             });
+           }
+
+           return prom;
+         }; // Accessor for the file map
+
+
+         _this.fileMap = function (val) {
+           if (!arguments.length) return _fileMap;
+           _fileMap = val;
+           return _this;
+         };
+
+         var _assetPath = '';
+
+         _this.assetPath = function (val) {
+           if (!arguments.length) return _assetPath;
+           _assetPath = val;
+           return _this;
+         };
+
+         var _assetMap = {};
+
+         _this.assetMap = function (val) {
+           if (!arguments.length) return _assetMap;
+           _assetMap = val;
+           return _this;
+         };
+
+         _this.asset = function (val) {
+           if (/^http(s)?:\/\//i.test(val)) return val;
+           var filename = _assetPath + val;
+           return _assetMap[filename] || filename;
+         };
+
+         return _this;
+       }
+
+       var global$9 = global$1o;
+       var toIntegerOrInfinity$1 = toIntegerOrInfinity$b;
+       var toString$7 = toString$k;
+       var requireObjectCoercible$6 = requireObjectCoercible$e;
+
+       var RangeError$5 = global$9.RangeError;
+
+       // `String.prototype.repeat` method implementation
+       // https://tc39.es/ecma262/#sec-string.prototype.repeat
+       var stringRepeat = function repeat(count) {
+         var str = toString$7(requireObjectCoercible$6(this));
+         var result = '';
+         var n = toIntegerOrInfinity$1(count);
+         if (n < 0 || n == Infinity) throw RangeError$5('Wrong number of repetitions');
+         for (;n > 0; (n >>>= 1) && (str += str)) if (n & 1) result += str;
+         return result;
+       };
+
+       var $$q = _export;
+       var global$8 = global$1o;
+       var uncurryThis$a = functionUncurryThis;
+       var toIntegerOrInfinity = toIntegerOrInfinity$b;
+       var thisNumberValue$1 = thisNumberValue$3;
+       var $repeat$1 = stringRepeat;
+       var fails$7 = fails$V;
+
+       var RangeError$4 = global$8.RangeError;
+       var String$1 = global$8.String;
+       var floor$2 = Math.floor;
+       var repeat$2 = uncurryThis$a($repeat$1);
+       var stringSlice$3 = uncurryThis$a(''.slice);
+       var un$ToFixed = uncurryThis$a(1.0.toFixed);
+
+       var pow$1 = function (x, n, acc) {
+         return n === 0 ? acc : n % 2 === 1 ? pow$1(x, n - 1, acc * x) : pow$1(x * x, n / 2, acc);
+       };
+
+       var log = function (x) {
+         var n = 0;
+         var x2 = x;
+         while (x2 >= 4096) {
+           n += 12;
+           x2 /= 4096;
+         }
+         while (x2 >= 2) {
+           n += 1;
+           x2 /= 2;
+         } return n;
+       };
+
+       var multiply = function (data, n, c) {
+         var index = -1;
+         var c2 = c;
+         while (++index < 6) {
+           c2 += n * data[index];
+           data[index] = c2 % 1e7;
+           c2 = floor$2(c2 / 1e7);
+         }
+       };
+
+       var divide = function (data, n) {
+         var index = 6;
+         var c = 0;
+         while (--index >= 0) {
+           c += data[index];
+           data[index] = floor$2(c / n);
+           c = (c % n) * 1e7;
+         }
+       };
+
+       var dataToString = function (data) {
+         var index = 6;
+         var s = '';
+         while (--index >= 0) {
+           if (s !== '' || index === 0 || data[index] !== 0) {
+             var t = String$1(data[index]);
+             s = s === '' ? t : s + repeat$2('0', 7 - t.length) + t;
+           }
+         } return s;
+       };
+
+       var FORCED$6 = fails$7(function () {
+         return un$ToFixed(0.00008, 3) !== '0.000' ||
+           un$ToFixed(0.9, 0) !== '1' ||
+           un$ToFixed(1.255, 2) !== '1.25' ||
+           un$ToFixed(1000000000000000128.0, 0) !== '1000000000000000128';
+       }) || !fails$7(function () {
+         // V8 ~ Android 4.3-
+         un$ToFixed({});
+       });
+
+       // `Number.prototype.toFixed` method
+       // https://tc39.es/ecma262/#sec-number.prototype.tofixed
+       $$q({ target: 'Number', proto: true, forced: FORCED$6 }, {
+         toFixed: function toFixed(fractionDigits) {
+           var number = thisNumberValue$1(this);
+           var fractDigits = toIntegerOrInfinity(fractionDigits);
+           var data = [0, 0, 0, 0, 0, 0];
+           var sign = '';
+           var result = '0';
+           var e, z, j, k;
+
+           // TODO: ES2018 increased the maximum number of fraction digits to 100, need to improve the implementation
+           if (fractDigits < 0 || fractDigits > 20) throw RangeError$4('Incorrect fraction digits');
+           // eslint-disable-next-line no-self-compare -- NaN check
+           if (number != number) return 'NaN';
+           if (number <= -1e21 || number >= 1e21) return String$1(number);
+           if (number < 0) {
+             sign = '-';
+             number = -number;
+           }
+           if (number > 1e-21) {
+             e = log(number * pow$1(2, 69, 1)) - 69;
+             z = e < 0 ? number * pow$1(2, -e, 1) : number / pow$1(2, e, 1);
+             z *= 0x10000000000000;
+             e = 52 - e;
+             if (e > 0) {
+               multiply(data, 0, z);
+               j = fractDigits;
+               while (j >= 7) {
+                 multiply(data, 1e7, 0);
+                 j -= 7;
+               }
+               multiply(data, pow$1(10, j, 1), 0);
+               j = e - 1;
+               while (j >= 23) {
+                 divide(data, 1 << 23);
+                 j -= 23;
+               }
+               divide(data, 1 << j);
+               multiply(data, 1, 1);
+               divide(data, 2);
+               result = dataToString(data);
+             } else {
+               multiply(data, 0, z);
+               multiply(data, 1 << -e, 0);
+               result = dataToString(data) + repeat$2('0', fractDigits);
+             }
+           }
+           if (fractDigits > 0) {
+             k = result.length;
+             result = sign + (k <= fractDigits
+               ? '0.' + repeat$2('0', fractDigits - k) + result
+               : stringSlice$3(result, 0, k - fractDigits) + '.' + stringSlice$3(result, k - fractDigits));
+           } else {
+             result = sign + result;
+           } return result;
+         }
+       });
+
+       var global$7 = global$1o;
+
+       var globalIsFinite = global$7.isFinite;
+
+       // `Number.isFinite` method
+       // https://tc39.es/ecma262/#sec-number.isfinite
+       // eslint-disable-next-line es/no-number-isfinite -- safe
+       var numberIsFinite$1 = Number.isFinite || function isFinite(it) {
+         return typeof it == 'number' && globalIsFinite(it);
+       };
+
+       var $$p = _export;
+       var numberIsFinite = numberIsFinite$1;
+
+       // `Number.isFinite` method
+       // https://tc39.es/ecma262/#sec-number.isfinite
+       $$p({ target: 'Number', stat: true }, { isFinite: numberIsFinite });
+
+       var $$o = _export;
+       var global$6 = global$1o;
+       var uncurryThis$9 = functionUncurryThis;
+       var toAbsoluteIndex = toAbsoluteIndex$9;
+
+       var RangeError$3 = global$6.RangeError;
+       var fromCharCode$1 = String.fromCharCode;
+       // eslint-disable-next-line es/no-string-fromcodepoint -- required for testing
+       var $fromCodePoint = String.fromCodePoint;
+       var join$2 = uncurryThis$9([].join);
+
+       // length should be 1, old FF problem
+       var INCORRECT_LENGTH = !!$fromCodePoint && $fromCodePoint.length != 1;
+
+       // `String.fromCodePoint` method
+       // https://tc39.es/ecma262/#sec-string.fromcodepoint
+       $$o({ target: 'String', stat: true, forced: INCORRECT_LENGTH }, {
+         // eslint-disable-next-line no-unused-vars -- required for `.length`
+         fromCodePoint: function fromCodePoint(x) {
+           var elements = [];
+           var length = arguments.length;
+           var i = 0;
+           var code;
+           while (length > i) {
+             code = +arguments[i++];
+             if (toAbsoluteIndex(code, 0x10FFFF) !== code) throw RangeError$3(code + ' is not a valid code point');
+             elements[i] = code < 0x10000
+               ? fromCharCode$1(code)
+               : fromCharCode$1(((code -= 0x10000) >> 10) + 0xD800, code % 0x400 + 0xDC00);
+           } return join$2(elements, '');
+         }
+       });
+
+       var call$1 = functionCall;
+       var fixRegExpWellKnownSymbolLogic = fixRegexpWellKnownSymbolLogic;
+       var anObject = anObject$n;
+       var requireObjectCoercible$5 = requireObjectCoercible$e;
+       var sameValue = sameValue$1;
+       var toString$6 = toString$k;
+       var getMethod = getMethod$7;
+       var regExpExec = regexpExecAbstract;
+
+       // @@search logic
+       fixRegExpWellKnownSymbolLogic('search', function (SEARCH, nativeSearch, maybeCallNative) {
+         return [
+           // `String.prototype.search` method
+           // https://tc39.es/ecma262/#sec-string.prototype.search
+           function search(regexp) {
+             var O = requireObjectCoercible$5(this);
+             var searcher = regexp == undefined ? undefined : getMethod(regexp, SEARCH);
+             return searcher ? call$1(searcher, regexp, O) : new RegExp(regexp)[SEARCH](toString$6(O));
+           },
+           // `RegExp.prototype[@@search]` method
+           // https://tc39.es/ecma262/#sec-regexp.prototype-@@search
+           function (string) {
+             var rx = anObject(this);
+             var S = toString$6(string);
+             var res = maybeCallNative(nativeSearch, rx, S);
+
+             if (res.done) return res.value;
+
+             var previousLastIndex = rx.lastIndex;
+             if (!sameValue(previousLastIndex, 0)) rx.lastIndex = 0;
+             var result = regExpExec(rx, S);
+             if (!sameValue(rx.lastIndex, previousLastIndex)) rx.lastIndex = previousLastIndex;
+             return result === null ? -1 : result.index;
+           }
+         ];
+       });
+
+       var rbush$2 = {exports: {}};
+
+       var quickselect$2 = {exports: {}};
+
+       (function (module, exports) {
+         (function (global, factory) {
+           module.exports = factory() ;
+         })(commonjsGlobal, function () {
+
+           function quickselect(arr, k, left, right, compare) {
+             quickselectStep(arr, k, left || 0, right || arr.length - 1, compare || defaultCompare);
+           }
+
+           function quickselectStep(arr, k, left, right, compare) {
+             while (right > left) {
+               if (right - left > 600) {
+                 var n = right - left + 1;
+                 var m = k - left + 1;
+                 var z = Math.log(n);
+                 var s = 0.5 * Math.exp(2 * z / 3);
+                 var sd = 0.5 * Math.sqrt(z * s * (n - s) / n) * (m - n / 2 < 0 ? -1 : 1);
+                 var newLeft = Math.max(left, Math.floor(k - m * s / n + sd));
+                 var newRight = Math.min(right, Math.floor(k + (n - m) * s / n + sd));
+                 quickselectStep(arr, k, newLeft, newRight, compare);
+               }
+
+               var t = arr[k];
+               var i = left;
+               var j = right;
+               swap(arr, left, k);
+               if (compare(arr[right], t) > 0) swap(arr, left, right);
+
+               while (i < j) {
+                 swap(arr, i, j);
+                 i++;
+                 j--;
+
+                 while (compare(arr[i], t) < 0) {
+                   i++;
+                 }
+
+                 while (compare(arr[j], t) > 0) {
+                   j--;
+                 }
+               }
+
+               if (compare(arr[left], t) === 0) swap(arr, left, j);else {
+                 j++;
+                 swap(arr, j, right);
+               }
+               if (j <= k) left = j + 1;
+               if (k <= j) right = j - 1;
+             }
+           }
+
+           function swap(arr, i, j) {
+             var tmp = arr[i];
+             arr[i] = arr[j];
+             arr[j] = tmp;
+           }
+
+           function defaultCompare(a, b) {
+             return a < b ? -1 : a > b ? 1 : 0;
+           }
+
+           return quickselect;
+         });
+       })(quickselect$2);
+
+       rbush$2.exports = rbush$1;
+
+       rbush$2.exports["default"] = rbush$1;
+
+       var quickselect$1 = quickselect$2.exports;
+
+       function rbush$1(maxEntries, format) {
+         if (!(this instanceof rbush$1)) return new rbush$1(maxEntries, format); // max entries in a node is 9 by default; min node fill is 40% for best performance
+
+         this._maxEntries = Math.max(4, maxEntries || 9);
+         this._minEntries = Math.max(2, Math.ceil(this._maxEntries * 0.4));
+
+         if (format) {
+           this._initFormat(format);
+         }
+
+         this.clear();
+       }
+
+       rbush$1.prototype = {
+         all: function all() {
+           return this._all(this.data, []);
+         },
+         search: function search(bbox) {
+           var node = this.data,
+               result = [],
+               toBBox = this.toBBox;
+           if (!intersects$1(bbox, node)) return result;
+           var nodesToSearch = [],
+               i,
+               len,
+               child,
+               childBBox;
+
+           while (node) {
+             for (i = 0, len = node.children.length; i < len; i++) {
+               child = node.children[i];
+               childBBox = node.leaf ? toBBox(child) : child;
+
+               if (intersects$1(bbox, childBBox)) {
+                 if (node.leaf) result.push(child);else if (contains$1(bbox, childBBox)) this._all(child, result);else nodesToSearch.push(child);
+               }
+             }
+
+             node = nodesToSearch.pop();
+           }
+
+           return result;
+         },
+         collides: function collides(bbox) {
+           var node = this.data,
+               toBBox = this.toBBox;
+           if (!intersects$1(bbox, node)) return false;
+           var nodesToSearch = [],
+               i,
+               len,
+               child,
+               childBBox;
+
+           while (node) {
+             for (i = 0, len = node.children.length; i < len; i++) {
+               child = node.children[i];
+               childBBox = node.leaf ? toBBox(child) : child;
+
+               if (intersects$1(bbox, childBBox)) {
+                 if (node.leaf || contains$1(bbox, childBBox)) return true;
+                 nodesToSearch.push(child);
+               }
+             }
+
+             node = nodesToSearch.pop();
+           }
+
+           return false;
+         },
+         load: function load(data) {
+           if (!(data && data.length)) return this;
+
+           if (data.length < this._minEntries) {
+             for (var i = 0, len = data.length; i < len; i++) {
+               this.insert(data[i]);
+             }
+
+             return this;
+           } // recursively build the tree with the given data from scratch using OMT algorithm
+
+
+           var node = this._build(data.slice(), 0, data.length - 1, 0);
+
+           if (!this.data.children.length) {
+             // save as is if tree is empty
+             this.data = node;
+           } else if (this.data.height === node.height) {
+             // split root if trees have the same height
+             this._splitRoot(this.data, node);
+           } else {
+             if (this.data.height < node.height) {
+               // swap trees if inserted one is bigger
+               var tmpNode = this.data;
+               this.data = node;
+               node = tmpNode;
+             } // insert the small tree into the large tree at appropriate level
+
+
+             this._insert(node, this.data.height - node.height - 1, true);
+           }
+
+           return this;
+         },
+         insert: function insert(item) {
+           if (item) this._insert(item, this.data.height - 1);
+           return this;
+         },
+         clear: function clear() {
+           this.data = createNode$1([]);
+           return this;
+         },
+         remove: function remove(item, equalsFn) {
+           if (!item) return this;
+           var node = this.data,
+               bbox = this.toBBox(item),
+               path = [],
+               indexes = [],
+               i,
+               parent,
+               index,
+               goingUp; // depth-first iterative tree traversal
+
+           while (node || path.length) {
+             if (!node) {
+               // go up
+               node = path.pop();
+               parent = path[path.length - 1];
+               i = indexes.pop();
+               goingUp = true;
+             }
+
+             if (node.leaf) {
+               // check current node
+               index = findItem$1(item, node.children, equalsFn);
+
+               if (index !== -1) {
+                 // item found, remove the item and condense tree upwards
+                 node.children.splice(index, 1);
+                 path.push(node);
+
+                 this._condense(path);
+
+                 return this;
+               }
+             }
+
+             if (!goingUp && !node.leaf && contains$1(node, bbox)) {
+               // go down
+               path.push(node);
+               indexes.push(i);
+               i = 0;
+               parent = node;
+               node = node.children[0];
+             } else if (parent) {
+               // go right
+               i++;
+               node = parent.children[i];
+               goingUp = false;
+             } else node = null; // nothing found
+
+           }
+
+           return this;
+         },
+         toBBox: function toBBox(item) {
+           return item;
+         },
+         compareMinX: compareNodeMinX$1,
+         compareMinY: compareNodeMinY$1,
+         toJSON: function toJSON() {
+           return this.data;
+         },
+         fromJSON: function fromJSON(data) {
+           this.data = data;
+           return this;
+         },
+         _all: function _all(node, result) {
+           var nodesToSearch = [];
+
+           while (node) {
+             if (node.leaf) result.push.apply(result, node.children);else nodesToSearch.push.apply(nodesToSearch, node.children);
+             node = nodesToSearch.pop();
+           }
+
+           return result;
+         },
+         _build: function _build(items, left, right, height) {
+           var N = right - left + 1,
+               M = this._maxEntries,
+               node;
+
+           if (N <= M) {
+             // reached leaf level; return leaf
+             node = createNode$1(items.slice(left, right + 1));
+             calcBBox$1(node, this.toBBox);
+             return node;
+           }
+
+           if (!height) {
+             // target height of the bulk-loaded tree
+             height = Math.ceil(Math.log(N) / Math.log(M)); // target number of root entries to maximize storage utilization
+
+             M = Math.ceil(N / Math.pow(M, height - 1));
+           }
+
+           node = createNode$1([]);
+           node.leaf = false;
+           node.height = height; // split the items into M mostly square tiles
+
+           var N2 = Math.ceil(N / M),
+               N1 = N2 * Math.ceil(Math.sqrt(M)),
+               i,
+               j,
+               right2,
+               right3;
+           multiSelect$1(items, left, right, N1, this.compareMinX);
+
+           for (i = left; i <= right; i += N1) {
+             right2 = Math.min(i + N1 - 1, right);
+             multiSelect$1(items, i, right2, N2, this.compareMinY);
+
+             for (j = i; j <= right2; j += N2) {
+               right3 = Math.min(j + N2 - 1, right2); // pack each entry recursively
+
+               node.children.push(this._build(items, j, right3, height - 1));
+             }
+           }
+
+           calcBBox$1(node, this.toBBox);
+           return node;
+         },
+         _chooseSubtree: function _chooseSubtree(bbox, node, level, path) {
+           var i, len, child, targetNode, area, enlargement, minArea, minEnlargement;
+
+           while (true) {
+             path.push(node);
+             if (node.leaf || path.length - 1 === level) break;
+             minArea = minEnlargement = Infinity;
+
+             for (i = 0, len = node.children.length; i < len; i++) {
+               child = node.children[i];
+               area = bboxArea$1(child);
+               enlargement = enlargedArea$1(bbox, child) - area; // choose entry with the least area enlargement
+
+               if (enlargement < minEnlargement) {
+                 minEnlargement = enlargement;
+                 minArea = area < minArea ? area : minArea;
+                 targetNode = child;
+               } else if (enlargement === minEnlargement) {
+                 // otherwise choose one with the smallest area
+                 if (area < minArea) {
+                   minArea = area;
+                   targetNode = child;
+                 }
+               }
+             }
+
+             node = targetNode || node.children[0];
+           }
+
+           return node;
+         },
+         _insert: function _insert(item, level, isNode) {
+           var toBBox = this.toBBox,
+               bbox = isNode ? item : toBBox(item),
+               insertPath = []; // find the best node for accommodating the item, saving all nodes along the path too
+
+           var node = this._chooseSubtree(bbox, this.data, level, insertPath); // put the item into the node
+
+
+           node.children.push(item);
+           extend$2(node, bbox); // split on node overflow; propagate upwards if necessary
+
+           while (level >= 0) {
+             if (insertPath[level].children.length > this._maxEntries) {
+               this._split(insertPath, level);
+
+               level--;
+             } else break;
+           } // adjust bboxes along the insertion path
+
+
+           this._adjustParentBBoxes(bbox, insertPath, level);
+         },
+         // split overflowed node into two
+         _split: function _split(insertPath, level) {
+           var node = insertPath[level],
+               M = node.children.length,
+               m = this._minEntries;
+
+           this._chooseSplitAxis(node, m, M);
+
+           var splitIndex = this._chooseSplitIndex(node, m, M);
+
+           var newNode = createNode$1(node.children.splice(splitIndex, node.children.length - splitIndex));
+           newNode.height = node.height;
+           newNode.leaf = node.leaf;
+           calcBBox$1(node, this.toBBox);
+           calcBBox$1(newNode, this.toBBox);
+           if (level) insertPath[level - 1].children.push(newNode);else this._splitRoot(node, newNode);
+         },
+         _splitRoot: function _splitRoot(node, newNode) {
+           // split root node
+           this.data = createNode$1([node, newNode]);
+           this.data.height = node.height + 1;
+           this.data.leaf = false;
+           calcBBox$1(this.data, this.toBBox);
+         },
+         _chooseSplitIndex: function _chooseSplitIndex(node, m, M) {
+           var i, bbox1, bbox2, overlap, area, minOverlap, minArea, index;
+           minOverlap = minArea = Infinity;
+
+           for (i = m; i <= M - m; i++) {
+             bbox1 = distBBox$1(node, 0, i, this.toBBox);
+             bbox2 = distBBox$1(node, i, M, this.toBBox);
+             overlap = intersectionArea$1(bbox1, bbox2);
+             area = bboxArea$1(bbox1) + bboxArea$1(bbox2); // choose distribution with minimum overlap
+
+             if (overlap < minOverlap) {
+               minOverlap = overlap;
+               index = i;
+               minArea = area < minArea ? area : minArea;
+             } else if (overlap === minOverlap) {
+               // otherwise choose distribution with minimum area
+               if (area < minArea) {
+                 minArea = area;
+                 index = i;
+               }
+             }
+           }
+
+           return index;
+         },
+         // sorts node children by the best axis for split
+         _chooseSplitAxis: function _chooseSplitAxis(node, m, M) {
+           var compareMinX = node.leaf ? this.compareMinX : compareNodeMinX$1,
+               compareMinY = node.leaf ? this.compareMinY : compareNodeMinY$1,
+               xMargin = this._allDistMargin(node, m, M, compareMinX),
+               yMargin = this._allDistMargin(node, m, M, compareMinY); // if total distributions margin value is minimal for x, sort by minX,
+           // otherwise it's already sorted by minY
+
+
+           if (xMargin < yMargin) node.children.sort(compareMinX);
+         },
+         // total margin of all possible split distributions where each node is at least m full
+         _allDistMargin: function _allDistMargin(node, m, M, compare) {
+           node.children.sort(compare);
+           var toBBox = this.toBBox,
+               leftBBox = distBBox$1(node, 0, m, toBBox),
+               rightBBox = distBBox$1(node, M - m, M, toBBox),
+               margin = bboxMargin$1(leftBBox) + bboxMargin$1(rightBBox),
+               i,
+               child;
+
+           for (i = m; i < M - m; i++) {
+             child = node.children[i];
+             extend$2(leftBBox, node.leaf ? toBBox(child) : child);
+             margin += bboxMargin$1(leftBBox);
+           }
+
+           for (i = M - m - 1; i >= m; i--) {
+             child = node.children[i];
+             extend$2(rightBBox, node.leaf ? toBBox(child) : child);
+             margin += bboxMargin$1(rightBBox);
+           }
+
+           return margin;
+         },
+         _adjustParentBBoxes: function _adjustParentBBoxes(bbox, path, level) {
+           // adjust bboxes along the given tree path
+           for (var i = level; i >= 0; i--) {
+             extend$2(path[i], bbox);
+           }
+         },
+         _condense: function _condense(path) {
+           // go through the path, removing empty nodes and updating bboxes
+           for (var i = path.length - 1, siblings; i >= 0; i--) {
+             if (path[i].children.length === 0) {
+               if (i > 0) {
+                 siblings = path[i - 1].children;
+                 siblings.splice(siblings.indexOf(path[i]), 1);
+               } else this.clear();
+             } else calcBBox$1(path[i], this.toBBox);
+           }
+         },
+         _initFormat: function _initFormat(format) {
+           // data format (minX, minY, maxX, maxY accessors)
+           // uses eval-type function compilation instead of just accepting a toBBox function
+           // because the algorithms are very sensitive to sorting functions performance,
+           // so they should be dead simple and without inner calls
+           var compareArr = ['return a', ' - b', ';'];
+           this.compareMinX = new Function('a', 'b', compareArr.join(format[0]));
+           this.compareMinY = new Function('a', 'b', compareArr.join(format[1]));
+           this.toBBox = new Function('a', 'return {minX: a' + format[0] + ', minY: a' + format[1] + ', maxX: a' + format[2] + ', maxY: a' + format[3] + '};');
+         }
+       };
+
+       function findItem$1(item, items, equalsFn) {
+         if (!equalsFn) return items.indexOf(item);
+
+         for (var i = 0; i < items.length; i++) {
+           if (equalsFn(item, items[i])) return i;
+         }
+
+         return -1;
+       } // calculate node's bbox from bboxes of its children
+
+
+       function calcBBox$1(node, toBBox) {
+         distBBox$1(node, 0, node.children.length, toBBox, node);
+       } // min bounding rectangle of node children from k to p-1
+
+
+       function distBBox$1(node, k, p, toBBox, destNode) {
+         if (!destNode) destNode = createNode$1(null);
+         destNode.minX = Infinity;
+         destNode.minY = Infinity;
+         destNode.maxX = -Infinity;
+         destNode.maxY = -Infinity;
+
+         for (var i = k, child; i < p; i++) {
+           child = node.children[i];
+           extend$2(destNode, node.leaf ? toBBox(child) : child);
+         }
+
+         return destNode;
+       }
+
+       function extend$2(a, b) {
+         a.minX = Math.min(a.minX, b.minX);
+         a.minY = Math.min(a.minY, b.minY);
+         a.maxX = Math.max(a.maxX, b.maxX);
+         a.maxY = Math.max(a.maxY, b.maxY);
+         return a;
+       }
+
+       function compareNodeMinX$1(a, b) {
+         return a.minX - b.minX;
+       }
+
+       function compareNodeMinY$1(a, b) {
+         return a.minY - b.minY;
+       }
+
+       function bboxArea$1(a) {
+         return (a.maxX - a.minX) * (a.maxY - a.minY);
+       }
+
+       function bboxMargin$1(a) {
+         return a.maxX - a.minX + (a.maxY - a.minY);
+       }
+
+       function enlargedArea$1(a, b) {
+         return (Math.max(b.maxX, a.maxX) - Math.min(b.minX, a.minX)) * (Math.max(b.maxY, a.maxY) - Math.min(b.minY, a.minY));
+       }
+
+       function intersectionArea$1(a, b) {
+         var minX = Math.max(a.minX, b.minX),
+             minY = Math.max(a.minY, b.minY),
+             maxX = Math.min(a.maxX, b.maxX),
+             maxY = Math.min(a.maxY, b.maxY);
+         return Math.max(0, maxX - minX) * Math.max(0, maxY - minY);
+       }
+
+       function contains$1(a, b) {
+         return a.minX <= b.minX && a.minY <= b.minY && b.maxX <= a.maxX && b.maxY <= a.maxY;
+       }
+
+       function intersects$1(a, b) {
+         return b.minX <= a.maxX && b.minY <= a.maxY && b.maxX >= a.minX && b.maxY >= a.minY;
+       }
+
+       function createNode$1(children) {
+         return {
+           children: children,
+           height: 1,
+           leaf: true,
+           minX: Infinity,
+           minY: Infinity,
+           maxX: -Infinity,
+           maxY: -Infinity
+         };
+       } // sort an array so that items come in groups of n unsorted items, with groups sorted between each other;
+       // combines selection algorithm with binary divide & conquer approach
+
+
+       function multiSelect$1(arr, left, right, n, compare) {
+         var stack = [left, right],
+             mid;
+
+         while (stack.length) {
+           right = stack.pop();
+           left = stack.pop();
+           if (right - left <= n) continue;
+           mid = left + Math.ceil((right - left) / n / 2) * n;
+           quickselect$1(arr, mid, left, right, compare);
+           stack.push(left, mid, mid, right);
+         }
+       }
+
+       var lineclip_1 = lineclip$2;
+       lineclip$2.polyline = lineclip$2;
+       lineclip$2.polygon = polygonclip$1; // Cohen-Sutherland line clippign algorithm, adapted to efficiently
+       // handle polylines rather than just segments
+
+       function lineclip$2(points, bbox, result) {
+         var len = points.length,
+             codeA = bitCode$1(points[0], bbox),
+             part = [],
+             i,
+             a,
+             b,
+             codeB,
+             lastCode;
+         if (!result) result = [];
+
+         for (i = 1; i < len; i++) {
+           a = points[i - 1];
+           b = points[i];
+           codeB = lastCode = bitCode$1(b, bbox);
+
+           while (true) {
+             if (!(codeA | codeB)) {
+               // accept
+               part.push(a);
+
+               if (codeB !== lastCode) {
+                 // segment went outside
+                 part.push(b);
+
+                 if (i < len - 1) {
+                   // start a new line
+                   result.push(part);
+                   part = [];
+                 }
+               } else if (i === len - 1) {
+                 part.push(b);
+               }
+
+               break;
+             } else if (codeA & codeB) {
+               // trivial reject
+               break;
+             } else if (codeA) {
+               // a outside, intersect with clip edge
+               a = intersect$1(a, b, codeA, bbox);
+               codeA = bitCode$1(a, bbox);
+             } else {
+               // b outside
+               b = intersect$1(a, b, codeB, bbox);
+               codeB = bitCode$1(b, bbox);
+             }
+           }
+
+           codeA = lastCode;
+         }
+
+         if (part.length) result.push(part);
+         return result;
+       } // Sutherland-Hodgeman polygon clipping algorithm
+
+
+       function polygonclip$1(points, bbox) {
+         var result, edge, prev, prevInside, i, p, inside; // clip against each side of the clip rectangle
+
+         for (edge = 1; edge <= 8; edge *= 2) {
+           result = [];
+           prev = points[points.length - 1];
+           prevInside = !(bitCode$1(prev, bbox) & edge);
+
+           for (i = 0; i < points.length; i++) {
+             p = points[i];
+             inside = !(bitCode$1(p, bbox) & edge); // if segment goes through the clip window, add an intersection
+
+             if (inside !== prevInside) result.push(intersect$1(prev, p, edge, bbox));
+             if (inside) result.push(p); // add a point if it's inside
+
+             prev = p;
+             prevInside = inside;
+           }
+
+           points = result;
+           if (!points.length) break;
+         }
+
+         return result;
+       } // intersect a segment against one of the 4 lines that make up the bbox
+
+
+       function intersect$1(a, b, edge, bbox) {
+         return edge & 8 ? [a[0] + (b[0] - a[0]) * (bbox[3] - a[1]) / (b[1] - a[1]), bbox[3]] : // top
+         edge & 4 ? [a[0] + (b[0] - a[0]) * (bbox[1] - a[1]) / (b[1] - a[1]), bbox[1]] : // bottom
+         edge & 2 ? [bbox[2], a[1] + (b[1] - a[1]) * (bbox[2] - a[0]) / (b[0] - a[0])] : // right
+         edge & 1 ? [bbox[0], a[1] + (b[1] - a[1]) * (bbox[0] - a[0]) / (b[0] - a[0])] : // left
+         null;
+       } // bit code reflects the point position relative to the bbox:
+       //         left  mid  right
+       //    top  1001  1000  1010
+       //    mid  0001  0000  0010
+       // bottom  0101  0100  0110
+
+
+       function bitCode$1(p, bbox) {
+         var code = 0;
+         if (p[0] < bbox[0]) code |= 1; // left
+         else if (p[0] > bbox[2]) code |= 2; // right
+
+         if (p[1] < bbox[1]) code |= 4; // bottom
+         else if (p[1] > bbox[3]) code |= 8; // top
+
+         return code;
+       }
+
+       var rbush = rbush$2.exports;
+       var lineclip$1 = lineclip_1;
+       var whichPolygon_1 = whichPolygon;
+
+       function whichPolygon(data) {
+         var bboxes = [];
+
+         for (var i = 0; i < data.features.length; i++) {
+           var feature = data.features[i];
+           var coords = feature.geometry.coordinates;
+
+           if (feature.geometry.type === 'Polygon') {
+             bboxes.push(treeItem(coords, feature.properties));
+           } else if (feature.geometry.type === 'MultiPolygon') {
+             for (var j = 0; j < coords.length; j++) {
+               bboxes.push(treeItem(coords[j], feature.properties));
+             }
+           }
+         }
+
+         var tree = rbush().load(bboxes);
+
+         function query(p, multi) {
+           var output = [],
+               result = tree.search({
+             minX: p[0],
+             minY: p[1],
+             maxX: p[0],
+             maxY: p[1]
+           });
+
+           for (var i = 0; i < result.length; i++) {
+             if (insidePolygon(result[i].coords, p)) {
+               if (multi) output.push(result[i].props);else return result[i].props;
+             }
+           }
+
+           return multi && output.length ? output : null;
+         }
+
+         query.tree = tree;
+
+         query.bbox = function queryBBox(bbox) {
+           var output = [];
+           var result = tree.search({
+             minX: bbox[0],
+             minY: bbox[1],
+             maxX: bbox[2],
+             maxY: bbox[3]
+           });
+
+           for (var i = 0; i < result.length; i++) {
+             if (polygonIntersectsBBox(result[i].coords, bbox)) {
+               output.push(result[i].props);
+             }
+           }
+
+           return output;
+         };
+
+         return query;
+       }
+
+       function polygonIntersectsBBox(polygon, bbox) {
+         var bboxCenter = [(bbox[0] + bbox[2]) / 2, (bbox[1] + bbox[3]) / 2];
+         if (insidePolygon(polygon, bboxCenter)) return true;
+
+         for (var i = 0; i < polygon.length; i++) {
+           if (lineclip$1(polygon[i], bbox).length > 0) return true;
+         }
+
+         return false;
+       } // ray casting algorithm for detecting if point is in polygon
+
+
+       function insidePolygon(rings, p) {
+         var inside = false;
+
+         for (var i = 0, len = rings.length; i < len; i++) {
+           var ring = rings[i];
+
+           for (var j = 0, len2 = ring.length, k = len2 - 1; j < len2; k = j++) {
+             if (rayIntersect(p, ring[j], ring[k])) inside = !inside;
+           }
+         }
+
+         return inside;
+       }
+
+       function rayIntersect(p, p1, p2) {
+         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];
+       }
+
+       function treeItem(coords, props) {
+         var item = {
+           minX: Infinity,
+           minY: Infinity,
+           maxX: -Infinity,
+           maxY: -Infinity,
+           coords: coords,
+           props: props
+         };
+
+         for (var i = 0; i < coords[0].length; i++) {
+           var p = coords[0][i];
+           item.minX = Math.min(item.minX, p[0]);
+           item.minY = Math.min(item.minY, p[1]);
+           item.maxX = Math.max(item.maxX, p[0]);
+           item.maxY = Math.max(item.maxY, p[1]);
+         }
+
+         return item;
+       }
+
+       var type = "FeatureCollection";
+       var features = [{
+         type: "Feature",
+         properties: {
+           wikidata: "Q21",
+           nameEn: "England",
+           aliases: ["GB-ENG"],
+           country: "GB",
+           groups: ["Q23666", "Q3336843", "154", "150", "UN"],
+           driveSide: "left",
+           roadSpeedUnit: "mph",
+           roadHeightUnit: "ft",
+           callingCodes: ["44"]
+         },
+         geometry: {
+           type: "MultiPolygon",
+           coordinates: [[[[-6.03913, 51.13217], [-7.74976, 48.64773], [1.17405, 50.74239], [2.18458, 51.52087], [2.56575, 51.85301], [0.792, 57.56437], [-2.30613, 55.62698], [-2.17058, 55.45916], [-2.6095, 55.28488], [-2.63532, 55.19452], [-3.02906, 55.04606], [-3.09361, 54.94924], [-3.38407, 54.94278], [-4.1819, 54.57861], [-3.5082, 53.54318], [-3.08228, 53.25526], [-3.03675, 53.25092], [-2.92329, 53.19383], [-2.92022, 53.17685], [-2.98598, 53.15589], [-2.90649, 53.10964], [-2.87469, 53.12337], [-2.89131, 53.09374], [-2.83133, 52.99184], [-2.7251, 52.98389], [-2.72221, 52.92969], [-2.80549, 52.89428], [-2.85897, 52.94487], [-2.92401, 52.93836], [-2.97243, 52.9651], [-3.13576, 52.895], [-3.15744, 52.84947], [-3.16105, 52.79599], [-3.08734, 52.77504], [-3.01001, 52.76636], [-2.95581, 52.71794], [-3.01724, 52.72083], [-3.04398, 52.65435], [-3.13648, 52.58208], [-3.12926, 52.5286], [-3.09746, 52.53077], [-3.08662, 52.54811], [-3.00929, 52.57774], [-2.99701, 52.551], [-3.03603, 52.49969], [-3.13359, 52.49174], [-3.22971, 52.45344], [-3.22754, 52.42526], [-3.04687, 52.34504], [-2.95364, 52.3501], [-2.99701, 52.323], [-3.00785, 52.2753], [-3.09289, 52.20546], [-3.12638, 52.08114], [-2.97111, 51.90456], [-2.8818, 51.93196], [-2.78742, 51.88833], [-2.74277, 51.84367], [-2.66234, 51.83555], [-2.66336, 51.59504], [-3.20563, 51.31615], [-6.03913, 51.13217]]]]
+         }
+       }, {
+         type: "Feature",
+         properties: {
+           wikidata: "Q22",
+           nameEn: "Scotland",
+           aliases: ["GB-SCT"],
+           country: "GB",
+           groups: ["Q23666", "Q3336843", "154", "150", "UN"],
+           driveSide: "left",
+           roadSpeedUnit: "mph",
+           roadHeightUnit: "ft",
+           callingCodes: ["44"]
+         },
+         geometry: {
+           type: "MultiPolygon",
+           coordinates: [[[[0.792, 57.56437], [-0.3751, 61.32236], [-14.78497, 57.60709], [-6.82333, 55.83103], [-4.69044, 54.3629], [-3.38407, 54.94278], [-3.09361, 54.94924], [-3.02906, 55.04606], [-2.63532, 55.19452], [-2.6095, 55.28488], [-2.17058, 55.45916], [-2.30613, 55.62698], [0.792, 57.56437]]]]
+         }
+       }, {
+         type: "Feature",
+         properties: {
+           wikidata: "Q25",
+           nameEn: "Wales",
+           aliases: ["GB-WLS"],
+           country: "GB",
+           groups: ["Q23666", "Q3336843", "154", "150", "UN"],
+           driveSide: "left",
+           roadSpeedUnit: "mph",
+           roadHeightUnit: "ft",
+           callingCodes: ["44"]
+         },
+         geometry: {
+           type: "MultiPolygon",
+           coordinates: [[[[-3.5082, 53.54318], [-5.37267, 53.63269], [-6.03913, 51.13217], [-3.20563, 51.31615], [-2.66336, 51.59504], [-2.66234, 51.83555], [-2.74277, 51.84367], [-2.78742, 51.88833], [-2.8818, 51.93196], [-2.97111, 51.90456], [-3.12638, 52.08114], [-3.09289, 52.20546], [-3.00785, 52.2753], [-2.99701, 52.323], [-2.95364, 52.3501], [-3.04687, 52.34504], [-3.22754, 52.42526], [-3.22971, 52.45344], [-3.13359, 52.49174], [-3.03603, 52.49969], [-2.99701, 52.551], [-3.00929, 52.57774], [-3.08662, 52.54811], [-3.09746, 52.53077], [-3.12926, 52.5286], [-3.13648, 52.58208], [-3.04398, 52.65435], [-3.01724, 52.72083], [-2.95581, 52.71794], [-3.01001, 52.76636], [-3.08734, 52.77504], [-3.16105, 52.79599], [-3.15744, 52.84947], [-3.13576, 52.895], [-2.97243, 52.9651], [-2.92401, 52.93836], [-2.85897, 52.94487], [-2.80549, 52.89428], [-2.72221, 52.92969], [-2.7251, 52.98389], [-2.83133, 52.99184], [-2.89131, 53.09374], [-2.87469, 53.12337], [-2.90649, 53.10964], [-2.98598, 53.15589], [-2.92022, 53.17685], [-2.92329, 53.19383], [-3.03675, 53.25092], [-3.08228, 53.25526], [-3.5082, 53.54318]]]]
+         }
+       }, {
+         type: "Feature",
+         properties: {
+           wikidata: "Q26",
+           nameEn: "Northern Ireland",
+           aliases: ["GB-NIR"],
+           country: "GB",
+           groups: ["Q22890", "Q3336843", "154", "150", "UN"],
+           driveSide: "left",
+           roadSpeedUnit: "mph",
+           roadHeightUnit: "ft",
+           callingCodes: ["44"]
+         },
+         geometry: {
+           type: "MultiPolygon",
+           coordinates: [[[[-6.34755, 55.49206], [-7.2471, 55.06933], [-7.34464, 55.04688], [-7.4033, 55.00391], [-7.40004, 54.94498], [-7.44404, 54.9403], [-7.4473, 54.87003], [-7.47626, 54.83084], [-7.54508, 54.79401], [-7.54671, 54.74606], [-7.64449, 54.75265], [-7.75041, 54.7103], [-7.83352, 54.73854], [-7.93293, 54.66603], [-7.70315, 54.62077], [-7.8596, 54.53671], [-7.99812, 54.54427], [-8.04538, 54.48941], [-8.179, 54.46763], [-8.04555, 54.36292], [-7.87101, 54.29299], [-7.8596, 54.21779], [-7.81397, 54.20159], [-7.69501, 54.20731], [-7.55812, 54.12239], [-7.4799, 54.12239], [-7.44567, 54.1539], [-7.32834, 54.11475], [-7.30553, 54.11869], [-7.34005, 54.14698], [-7.29157, 54.17191], [-7.28017, 54.16714], [-7.29687, 54.1354], [-7.29493, 54.12013], [-7.26316, 54.13863], [-7.25012, 54.20063], [-7.14908, 54.22732], [-7.19145, 54.31296], [-7.02034, 54.4212], [-6.87775, 54.34682], [-6.85179, 54.29176], [-6.81583, 54.22791], [-6.74575, 54.18788], [-6.70175, 54.20218], [-6.6382, 54.17071], [-6.66264, 54.0666], [-6.62842, 54.03503], [-6.47849, 54.06947], [-6.36605, 54.07234], [-6.36279, 54.11248], [-6.32694, 54.09337], [-6.29003, 54.11278], [-6.26218, 54.09785], [-5.83481, 53.87749], [-4.69044, 54.3629], [-6.34755, 55.49206]]]]
+         }
+       }, {
+         type: "Feature",
+         properties: {
+           wikidata: "Q35",
+           nameEn: "Denmark",
+           country: "DK",
+           groups: ["EU", "154", "150", "UN"],
+           callingCodes: ["45"]
+         },
+         geometry: {
+           type: "MultiPolygon",
+           coordinates: [[[[12.16597, 56.60205], [10.40861, 58.38489], [7.28637, 57.35913], [8.02459, 55.09613], [8.45719, 55.06747], [8.55769, 54.91837], [8.63979, 54.91069], [8.76387, 54.8948], [8.81178, 54.90518], [8.92795, 54.90452], [9.04629, 54.87249], [9.14275, 54.87421], [9.20571, 54.85841], [9.24631, 54.84726], [9.23445, 54.83432], [9.2474, 54.8112], [9.32771, 54.80602], [9.33849, 54.80233], [9.36496, 54.81749], [9.38532, 54.83968], [9.41213, 54.84254], [9.43155, 54.82586], [9.4659, 54.83131], [9.58937, 54.88785], [9.62734, 54.88057], [9.61187, 54.85548], [9.73563, 54.8247], [9.89314, 54.84171], [10.16755, 54.73883], [10.31111, 54.65968], [11.00303, 54.63689], [11.90309, 54.38543], [12.85844, 54.82438], [13.93395, 54.84044], [15.36991, 54.73263], [15.79951, 55.54655], [14.89259, 55.5623], [14.28399, 55.1553], [12.84405, 55.13257], [12.60345, 55.42675], [12.88472, 55.63369], [12.6372, 55.91371], [12.65312, 56.04345], [12.07466, 56.29488], [12.16597, 56.60205]]]]
+         }
+       }, {
+         type: "Feature",
+         properties: {
+           wikidata: "Q55",
+           nameEn: "Netherlands",
+           country: "NL",
+           groups: ["EU", "155", "150", "UN"],
+           callingCodes: ["31"]
+         },
+         geometry: {
+           type: "MultiPolygon",
+           coordinates: [[[[5.45168, 54.20039], [2.56575, 51.85301], [3.36263, 51.37112], [3.38696, 51.33436], [3.35847, 51.31572], [3.38289, 51.27331], [3.41704, 51.25933], [3.43488, 51.24135], [3.52698, 51.2458], [3.51502, 51.28697], [3.58939, 51.30064], [3.78999, 51.25766], [3.78783, 51.2151], [3.90125, 51.20371], [3.97889, 51.22537], [4.01957, 51.24504], [4.05165, 51.24171], [4.16721, 51.29348], [4.24024, 51.35371], [4.21923, 51.37443], [4.33265, 51.37687], [4.34086, 51.35738], [4.39292, 51.35547], [4.43777, 51.36989], [4.38064, 51.41965], [4.39747, 51.43316], [4.38122, 51.44905], [4.47736, 51.4778], [4.5388, 51.48184], [4.54675, 51.47265], [4.52846, 51.45002], [4.53521, 51.4243], [4.57489, 51.4324], [4.65442, 51.42352], [4.72935, 51.48424], [4.74578, 51.48937], [4.77321, 51.50529], [4.78803, 51.50284], [4.84139, 51.4799], [4.82409, 51.44736], [4.82946, 51.4213], [4.78314, 51.43319], [4.76577, 51.43046], [4.77229, 51.41337], [4.78941, 51.41102], [4.84988, 51.41502], [4.90016, 51.41404], [4.92152, 51.39487], [5.00393, 51.44406], [5.0106, 51.47167], [5.03281, 51.48679], [5.04774, 51.47022], [5.07891, 51.4715], [5.10456, 51.43163], [5.07102, 51.39469], [5.13105, 51.34791], [5.13377, 51.31592], [5.16222, 51.31035], [5.2002, 51.32243], [5.24244, 51.30495], [5.22542, 51.26888], [5.23814, 51.26064], [5.26461, 51.26693], [5.29716, 51.26104], [5.33886, 51.26314], [5.347, 51.27502], [5.41672, 51.26248], [5.4407, 51.28169], [5.46519, 51.2849], [5.48476, 51.30053], [5.515, 51.29462], [5.5569, 51.26544], [5.5603, 51.22249], [5.65145, 51.19788], [5.65528, 51.18736], [5.70344, 51.1829], [5.74617, 51.18928], [5.77735, 51.17845], [5.77697, 51.1522], [5.82564, 51.16753], [5.85508, 51.14445], [5.80798, 51.11661], [5.8109, 51.10861], [5.83226, 51.10585], [5.82921, 51.09328], [5.79903, 51.09371], [5.79835, 51.05834], [5.77258, 51.06196], [5.75961, 51.03113], [5.77688, 51.02483], [5.76242, 50.99703], [5.71864, 50.96092], [5.72875, 50.95428], [5.74752, 50.96202], [5.75927, 50.95601], [5.74644, 50.94723], [5.72545, 50.92312], [5.72644, 50.91167], [5.71626, 50.90796], [5.69858, 50.91046], [5.67886, 50.88142], [5.64504, 50.87107], [5.64009, 50.84742], [5.65259, 50.82309], [5.70118, 50.80764], [5.68995, 50.79641], [5.70107, 50.7827], [5.68091, 50.75804], [5.69469, 50.75529], [5.72216, 50.76398], [5.73904, 50.75674], [5.74356, 50.7691], [5.76533, 50.78159], [5.77513, 50.78308], [5.80673, 50.7558], [5.84548, 50.76542], [5.84888, 50.75448], [5.88734, 50.77092], [5.89129, 50.75125], [5.89132, 50.75124], [5.95942, 50.7622], [5.97545, 50.75441], [6.01976, 50.75398], [6.02624, 50.77453], [5.97497, 50.79992], [5.98404, 50.80988], [6.00462, 50.80065], [6.02328, 50.81694], [6.01921, 50.84435], [6.05623, 50.8572], [6.05702, 50.85179], [6.07431, 50.84674], [6.07693, 50.86025], [6.08805, 50.87223], [6.07486, 50.89307], [6.09297, 50.92066], [6.01615, 50.93367], [6.02697, 50.98303], [5.95282, 50.98728], [5.90296, 50.97356], [5.90493, 51.00198], [5.87849, 51.01969], [5.86735, 51.05182], [5.9134, 51.06736], [5.9541, 51.03496], [5.98292, 51.07469], [6.16706, 51.15677], [6.17384, 51.19589], [6.07889, 51.17038], [6.07889, 51.24432], [6.16977, 51.33169], [6.22674, 51.36135], [6.22641, 51.39948], [6.20654, 51.40049], [6.21724, 51.48568], [6.18017, 51.54096], [6.09055, 51.60564], [6.11759, 51.65609], [6.02767, 51.6742], [6.04091, 51.71821], [5.95003, 51.7493], [5.98665, 51.76944], [5.94568, 51.82786], [5.99848, 51.83195], [6.06705, 51.86136], [6.10337, 51.84829], [6.16902, 51.84094], [6.11551, 51.89769], [6.15349, 51.90439], [6.21443, 51.86801], [6.29872, 51.86801], [6.30593, 51.84998], [6.40704, 51.82771], [6.38815, 51.87257], [6.47179, 51.85395], [6.50231, 51.86313], [6.58556, 51.89386], [6.68386, 51.91861], [6.72319, 51.89518], [6.82357, 51.96711], [6.83035, 51.9905], [6.68128, 52.05052], [6.76117, 52.11895], [6.83984, 52.11728], [6.97189, 52.20329], [6.9897, 52.2271], [7.03729, 52.22695], [7.06365, 52.23789], [7.02703, 52.27941], [7.07044, 52.37805], [7.03417, 52.40237], [6.99041, 52.47235], [6.94293, 52.43597], [6.69507, 52.488], [6.71641, 52.62905], [6.77307, 52.65375], [7.04557, 52.63318], [7.07253, 52.81083], [7.21694, 53.00742], [7.17898, 53.13817], [7.22681, 53.18165], [7.21679, 53.20058], [7.19052, 53.31866], [7.00198, 53.32672], [6.91025, 53.44221], [5.45168, 54.20039]], [[4.93295, 51.44945], [4.95244, 51.45207], [4.9524, 51.45014], [4.93909, 51.44632], [4.93295, 51.44945]], [[4.91493, 51.4353], [4.91935, 51.43634], [4.92227, 51.44252], [4.91811, 51.44621], [4.92287, 51.44741], [4.92811, 51.4437], [4.92566, 51.44273], [4.92815, 51.43856], [4.92879, 51.44161], [4.93544, 51.44634], [4.94025, 51.44193], [4.93416, 51.44185], [4.93471, 51.43861], [4.94265, 51.44003], [4.93986, 51.43064], [4.92952, 51.42984], [4.92652, 51.43329], [4.91493, 51.4353]]]]
+         }
+       }, {
+         type: "Feature",
+         properties: {
+           wikidata: "Q782",
+           nameEn: "Hawaii",
+           aliases: ["US-HI"],
+           country: "US",
+           groups: ["Q35657", "061", "009", "UN"],
+           roadSpeedUnit: "mph",
+           roadHeightUnit: "ft",
+           callingCodes: ["1"]
+         },
+         geometry: {
+           type: "MultiPolygon",
+           coordinates: [[[[-177.8563, 29.18961], [-179.49839, 27.86265], [-151.6784, 9.55515], [-154.05867, 45.51124], [-177.5224, 27.7635], [-177.8563, 29.18961]]]]
+         }
+       }, {
+         type: "Feature",
+         properties: {
+           wikidata: "Q797",
+           nameEn: "Alaska",
+           aliases: ["US-AK"],
+           country: "US",
+           groups: ["Q35657", "021", "003", "019", "UN"],
+           roadSpeedUnit: "mph",
+           roadHeightUnit: "ft",
+           callingCodes: ["1"]
+         },
+         geometry: {
+           type: "MultiPolygon",
+           coordinates: [[[[169.34848, 52.47228], [180, 51.0171], [179.84401, 55.10087], [169.34848, 52.47228]]], [[[-168.95635, 65.98512], [-169.03888, 65.48473], [-172.76104, 63.77445], [-179.55295, 57.62081], [-179.55295, 50.81807], [-133.92876, 54.62289], [-130.61931, 54.70835], [-130.64499, 54.76912], [-130.44184, 54.85377], [-130.27203, 54.97174], [-130.18765, 55.07744], [-130.08035, 55.21556], [-129.97513, 55.28029], [-130.15373, 55.74895], [-130.00857, 55.91344], [-130.00093, 56.00325], [-130.10173, 56.12178], [-130.33965, 56.10849], [-130.77769, 56.36185], [-131.8271, 56.62247], [-133.38523, 58.42773], [-133.84645, 58.73543], [-134.27175, 58.8634], [-134.48059, 59.13231], [-134.55699, 59.1297], [-134.7047, 59.2458], [-135.00267, 59.28745], [-135.03069, 59.56208], [-135.48007, 59.79937], [-136.31566, 59.59083], [-136.22381, 59.55526], [-136.33727, 59.44466], [-136.47323, 59.46617], [-136.52365, 59.16752], [-136.82619, 59.16198], [-137.4925, 58.89415], [-137.60623, 59.24465], [-138.62145, 59.76431], [-138.71149, 59.90728], [-139.05365, 59.99655], [-139.20603, 60.08896], [-139.05831, 60.35205], [-139.68991, 60.33693], [-139.98024, 60.18027], [-140.45648, 60.30919], [-140.5227, 60.22077], [-141.00116, 60.30648], [-140.97446, 84.39275], [-168.25765, 71.99091], [-168.95635, 65.98512]]]]
+         }
+       }, {
+         type: "Feature",
+         properties: {
+           wikidata: "Q3492",
+           nameEn: "Sumatra",
+           aliases: ["ID-SM"],
+           country: "ID",
+           groups: ["035", "142", "UN"],
+           driveSide: "left",
+           callingCodes: ["62"]
+         },
+         geometry: {
+           type: "MultiPolygon",
+           coordinates: [[[[109.82788, 2.86812], [110.90339, 7.52694], [105.01437, 3.24936], [104.56723, 1.44271], [104.34728, 1.33529], [104.12282, 1.27714], [104.03085, 1.26954], [103.74084, 1.12902], [103.66049, 1.18825], [103.56591, 1.19719], [103.03657, 1.30383], [96.11174, 6.69841], [74.28481, -3.17525], [102.92489, -8.17146], [106.32259, -5.50116], [106.38511, -5.16715], [109.17017, -4.07401], [109.3962, -2.07276], [108.50935, -2.01066], [107.94791, 1.06924], [109.82788, 2.86812]]]]
+         }
+       }, {
+         type: "Feature",
+         properties: {
+           wikidata: "Q3757",
+           nameEn: "Java",
+           aliases: ["ID-JW"],
+           country: "ID",
+           groups: ["035", "142", "UN"],
+           driveSide: "left",
+           callingCodes: ["62"]
+         },
+         geometry: {
+           type: "MultiPolygon",
+           coordinates: [[[[109.17017, -4.07401], [106.38511, -5.16715], [106.32259, -5.50116], [102.92489, -8.17146], [116.22542, -10.49172], [114.39575, -8.2889], [114.42235, -8.09762], [114.92859, -7.49253], [116.33992, -7.56171], [116.58433, -5.30385], [109.17017, -4.07401]]]]
+         }
+       }, {
+         type: "Feature",
+         properties: {
+           wikidata: "Q3795",
+           nameEn: "Kalimantan",
+           aliases: ["ID-KA"],
+           country: "ID",
+           groups: ["Q36117", "035", "142", "UN"],
+           driveSide: "left",
+           callingCodes: ["62"]
+         },
+         geometry: {
+           type: "MultiPolygon",
+           coordinates: [[[[120.02464, 2.83703], [118.06469, 4.16638], [117.67641, 4.16535], [117.47313, 4.18857], [117.25801, 4.35108], [115.90217, 4.37708], [115.58276, 3.93499], [115.53713, 3.14776], [115.11343, 2.82879], [115.1721, 2.49671], [114.80706, 2.21665], [114.80706, 1.92351], [114.57892, 1.5], [114.03788, 1.44787], [113.64677, 1.23933], [113.01448, 1.42832], [113.021, 1.57819], [112.48648, 1.56516], [112.2127, 1.44135], [112.15679, 1.17004], [111.94553, 1.12016], [111.82846, 0.99349], [111.55434, 0.97864], [111.22979, 1.08326], [110.62374, 0.873], [110.49182, 0.88088], [110.35354, 0.98869], [109.66397, 1.60425], [109.66397, 1.79972], [109.57923, 1.80624], [109.53794, 1.91771], [109.62558, 1.99182], [109.82788, 2.86812], [107.94791, 1.06924], [108.50935, -2.01066], [109.3962, -2.07276], [109.17017, -4.07401], [116.58433, -5.30385], [120.02464, 2.83703]]]]
+         }
+       }, {
+         type: "Feature",
+         properties: {
+           wikidata: "Q3803",
+           nameEn: "Lesser Sunda Islands",
+           aliases: ["ID-NU"],
+           country: "ID",
+           groups: ["035", "142", "UN"],
+           driveSide: "left",
+           callingCodes: ["62"]
+         },
+         geometry: {
+           type: "MultiPolygon",
+           coordinates: [[[[116.96967, -8.01483], [114.92859, -7.49253], [114.42235, -8.09762], [114.39575, -8.2889], [116.22542, -10.49172], [122.14954, -11.52517], [125.68138, -9.85176], [125.09025, -9.46406], [124.97892, -9.19281], [125.04044, -9.17093], [125.09434, -9.19669], [125.18907, -9.16434], [125.18632, -9.03142], [125.11764, -8.96359], [124.97742, -9.08128], [124.94011, -8.85617], [124.46701, -9.13002], [124.45971, -9.30263], [124.38554, -9.3582], [124.35258, -9.43002], [124.3535, -9.48493], [124.28115, -9.50453], [124.28115, -9.42189], [124.21247, -9.36904], [124.14517, -9.42324], [124.10539, -9.41206], [124.04286, -9.34243], [124.04628, -9.22671], [124.33472, -9.11416], [124.92337, -8.75859], [125.87688, -7.49892], [116.96967, -8.01483]]]]
+         }
+       }, {
+         type: "Feature",
+         properties: {
+           wikidata: "Q3812",
+           nameEn: "Sulawesi",
+           aliases: ["ID-SL"],
+           country: "ID",
+           groups: ["035", "142", "UN"],
+           driveSide: "left",
+           callingCodes: ["62"]
+         },
+         geometry: {
+           type: "MultiPolygon",
+           coordinates: [[[[128.34321, 3.90322], [126.69413, 6.02692], [119.56457, 0.90759], [116.58433, -5.30385], [116.33992, -7.56171], [116.96967, -8.01483], [125.87688, -7.49892], [123.78965, -0.86805], [128.34321, 3.90322]]]]
+         }
+       }, {
+         type: "Feature",
+         properties: {
+           wikidata: "Q3827",
+           nameEn: "Maluku Islands",
+           aliases: ["ID-ML"],
+           country: "ID",
+           groups: ["035", "142", "UN"],
+           driveSide: "left",
+           callingCodes: ["62"]
+         },
+         geometry: {
+           type: "MultiPolygon",
+           coordinates: [[[[129.63187, 2.21409], [128.34321, 3.90322], [123.78965, -0.86805], [125.87688, -7.49892], [125.58506, -7.95311], [125.87691, -8.31789], [127.42116, -8.22471], [127.55165, -9.05052], [135.49042, -9.2276], [135.35517, -5.01442], [132.8312, -4.70282], [130.8468, -2.61103], [128.40647, -2.30349], [129.71519, -0.24692], [129.63187, 2.21409]]]]
+         }
+       }, {
+         type: "Feature",
+         properties: {
+           wikidata: "Q3845",
+           nameEn: "Western New Guinea",
+           aliases: ["ID-PP"],
+           country: "ID",
+           groups: ["035", "142", "UN"],
+           driveSide: "left",
+           callingCodes: ["62"]
+         },
+         geometry: {
+           type: "MultiPolygon",
+           coordinates: [[[[135.49042, -9.2276], [141.01842, -9.35091], [141.01763, -6.90181], [140.90448, -6.85033], [140.85295, -6.72996], [140.99813, -6.3233], [141.02352, 0.08993], [129.63187, 2.21409], [129.71519, -0.24692], [128.40647, -2.30349], [130.8468, -2.61103], [132.8312, -4.70282], [135.35517, -5.01442], [135.49042, -9.2276]]]]
+         }
+       }, {
+         type: "Feature",
+         properties: {
+           wikidata: "Q5765",
+           nameEn: "Balearic Islands",
+           aliases: ["ES-IB"],
+           country: "ES",
+           groups: ["EU", "039", "150", "UN"],
+           callingCodes: ["34 971"]
+         },
+         geometry: {
+           type: "MultiPolygon",
+           coordinates: [[[[-2.27707, 35.35051], [5.10072, 39.89531], [3.75438, 42.33445], [-2.27707, 35.35051]]]]
+         }
+       }, {
+         type: "Feature",
+         properties: {
+           wikidata: "Q5823",
+           nameEn: "Ceuta",
+           aliases: ["ES-CE"],
+           country: "ES",
+           groups: ["EA", "EU", "015", "002", "UN"],
+           level: "subterritory",
+           callingCodes: ["34"]
+         },
+         geometry: {
+           type: "MultiPolygon",
+           coordinates: [[[[-5.38491, 35.92591], [-5.37338, 35.88417], [-5.35844, 35.87375], [-5.34379, 35.8711], [-5.21179, 35.90091], [-5.38491, 35.92591]]]]
+         }
+       }, {
+         type: "Feature",
+         properties: {
+           wikidata: "Q5831",
+           nameEn: "Melilla",
+           aliases: ["ES-ML"],
+           country: "ES",
+           groups: ["EA", "EU", "015", "002", "UN"],
+           level: "subterritory",
+           callingCodes: ["34"]
+         },
+         geometry: {
+           type: "MultiPolygon",
+           coordinates: [[[[-2.91909, 35.33927], [-2.96038, 35.31609], [-2.96648, 35.30475], [-2.96978, 35.29459], [-2.97035, 35.28852], [-2.96507, 35.28801], [-2.96826, 35.28296], [-2.96516, 35.27967], [-2.95431, 35.2728], [-2.95065, 35.26576], [-2.93893, 35.26737], [-2.92272, 35.27509], [-2.91909, 35.33927]]]]
+         }
+       }, {
+         type: "Feature",
+         properties: {
+           wikidata: "Q7835",
+           nameEn: "Crimea",
+           country: "RU",
+           groups: ["151", "150", "UN"],
+           level: "subterritory",
+           callingCodes: ["7"]
+         },
+         geometry: {
+           type: "MultiPolygon",
+           coordinates: [[[[33.5, 44], [36.4883, 45.0488], [36.475, 45.2411], [36.5049, 45.3136], [36.6545, 45.3417], [36.6645, 45.4514], [35.0498, 45.7683], [34.9601, 45.7563], [34.7991, 45.8101], [34.8015, 45.9005], [34.7548, 45.907], [34.6668, 45.9714], [34.6086, 45.9935], [34.5589, 45.9935], [34.5201, 45.951], [34.4873, 45.9427], [34.4415, 45.9599], [34.4122, 46.0025], [34.3391, 46.0611], [34.2511, 46.0532], [34.181, 46.068], [34.1293, 46.1049], [34.0731, 46.1177], [34.0527, 46.1084], [33.9155, 46.1594], [33.8523, 46.1986], [33.7972, 46.2048], [33.7405, 46.1855], [33.646, 46.2303], [33.6152, 46.2261], [33.6385, 46.1415], [33.6147, 46.1356], [33.5732, 46.1032], [33.5909, 46.0601], [33.5597, 46.0307], [31.5, 45.5], [33.5, 44]]]]
+         }
+       }, {
+         type: "Feature",
+         properties: {
+           wikidata: "Q12837",
+           nameEn: "Iberia",
+           level: "sharedLandform"
+         },
+         geometry: null
+       }, {
+         type: "Feature",
+         properties: {
+           wikidata: "Q14056",
+           nameEn: "Jan Mayen",
+           aliases: ["NO-22"],
+           country: "NO",
+           groups: ["SJ", "154", "150", "UN"],
+           level: "subterritory"
+         },
+         geometry: {
+           type: "MultiPolygon",
+           coordinates: [[[[-9.18243, 72.23144], [-10.71459, 70.09565], [-5.93364, 70.76368], [-9.18243, 72.23144]]]]
+         }
+       }, {
+         type: "Feature",
+         properties: {
+           wikidata: "Q19188",
+           nameEn: "Mainland China",
+           country: "CN",
+           groups: ["030", "142", "UN"],
+           callingCodes: ["86"]
+         },
+         geometry: {
+           type: "MultiPolygon",
+           coordinates: [[[[125.6131, 53.07229], [125.17522, 53.20225], [124.46078, 53.21881], [123.86158, 53.49391], [123.26989, 53.54843], [122.85966, 53.47395], [122.35063, 53.49565], [121.39213, 53.31888], [120.85633, 53.28499], [120.0451, 52.7359], [120.04049, 52.58773], [120.46454, 52.63811], [120.71673, 52.54099], [120.61346, 52.32447], [120.77337, 52.20805], [120.65907, 51.93544], [120.10963, 51.671], [119.13553, 50.37412], [119.38598, 50.35162], [119.27996, 50.13348], [119.11003, 50.00276], [118.61623, 49.93809], [117.82343, 49.52696], [117.48208, 49.62324], [117.27597, 49.62544], [116.71193, 49.83813], [116.03781, 48.87014], [116.06565, 48.81716], [115.78876, 48.51781], [115.811, 48.25699], [115.52082, 48.15367], [115.57128, 47.91988], [115.94296, 47.67741], [116.21879, 47.88505], [116.4465, 47.83662], [116.67405, 47.89039], [116.9723, 47.87285], [117.37875, 47.63627], [117.50181, 47.77216], [117.80196, 48.01661], [118.03676, 48.00982], [118.11009, 48.04], [118.22677, 48.03853], [118.29654, 48.00246], [118.55766, 47.99277], [118.7564, 47.76947], [119.12343, 47.66458], [119.13995, 47.53997], [119.35892, 47.48104], [119.31964, 47.42617], [119.54918, 47.29505], [119.56019, 47.24874], [119.62403, 47.24575], [119.71209, 47.19192], [119.85518, 46.92196], [119.91242, 46.90091], [119.89261, 46.66423], [119.80455, 46.67631], [119.77373, 46.62947], [119.68127, 46.59015], [119.65265, 46.62342], [119.42827, 46.63783], [119.32827, 46.61433], [119.24978, 46.64761], [119.10448, 46.65516], [119.00541, 46.74273], [118.92616, 46.72765], [118.89974, 46.77139], [118.8337, 46.77742], [118.78747, 46.68689], [118.30534, 46.73519], [117.69554, 46.50991], [117.60748, 46.59771], [117.41782, 46.57862], [117.36609, 46.36335], [116.83166, 46.38637], [116.75551, 46.33083], [116.58612, 46.30211], [116.26678, 45.96479], [116.24012, 45.8778], [116.27366, 45.78637], [116.16989, 45.68603], [115.60329, 45.44717], [114.94546, 45.37377], [114.74612, 45.43585], [114.54801, 45.38337], [114.5166, 45.27189], [113.70918, 44.72891], [112.74662, 44.86297], [112.4164, 45.06858], [111.98695, 45.09074], [111.76275, 44.98032], [111.40498, 44.3461], [111.96289, 43.81596], [111.93776, 43.68709], [111.79758, 43.6637], [111.59087, 43.51207], [111.0149, 43.3289], [110.4327, 42.78293], [110.08401, 42.6411], [109.89402, 42.63111], [109.452, 42.44842], [109.00679, 42.45302], [108.84489, 42.40246], [107.57258, 42.40898], [107.49681, 42.46221], [107.29755, 42.41395], [107.24774, 42.36107], [106.76517, 42.28741], [105.0123, 41.63188], [104.51667, 41.66113], [104.52258, 41.8706], [103.92804, 41.78246], [102.72403, 42.14675], [102.07645, 42.22519], [101.80515, 42.50074], [100.84979, 42.67087], [100.33297, 42.68231], [99.50671, 42.56535], [97.1777, 42.7964], [96.37926, 42.72055], [96.35658, 42.90363], [95.89543, 43.2528], [95.52594, 43.99353], [95.32891, 44.02407], [95.39772, 44.2805], [95.01191, 44.25274], [94.71959, 44.35284], [94.10003, 44.71016], [93.51161, 44.95964], [91.64048, 45.07408], [90.89169, 45.19667], [90.65114, 45.49314], [90.70907, 45.73437], [91.03026, 46.04194], [90.99672, 46.14207], [90.89639, 46.30711], [91.07696, 46.57315], [91.0147, 46.58171], [91.03649, 46.72916], [90.84035, 46.99525], [90.76108, 46.99399], [90.48542, 47.30438], [90.48854, 47.41826], [90.33598, 47.68303], [90.10871, 47.7375], [90.06512, 47.88177], [89.76624, 47.82745], [89.55453, 48.0423], [89.0711, 47.98528], [88.93186, 48.10263], [88.8011, 48.11302], [88.58316, 48.21893], [88.58939, 48.34531], [87.96361, 48.58478], [88.0788, 48.71436], [87.73822, 48.89582], [87.88171, 48.95853], [87.81333, 49.17354], [87.48983, 49.13794], [87.478, 49.07403], [87.28386, 49.11626], [86.87238, 49.12432], [86.73568, 48.99918], [86.75343, 48.70331], [86.38069, 48.46064], [85.73581, 48.3939], [85.5169, 48.05493], [85.61067, 47.49753], [85.69696, 47.2898], [85.54294, 47.06171], [85.22443, 47.04816], [84.93995, 46.87399], [84.73077, 47.01394], [83.92184, 46.98912], [83.04622, 47.19053], [82.21792, 45.56619], [82.58474, 45.40027], [82.51374, 45.1755], [81.73278, 45.3504], [80.11169, 45.03352], [79.8987, 44.89957], [80.38384, 44.63073], [80.40229, 44.23319], [80.40031, 44.10986], [80.75156, 43.44948], [80.69718, 43.32589], [80.77771, 43.30065], [80.78817, 43.14235], [80.62913, 43.141], [80.3735, 43.01557], [80.58999, 42.9011], [80.38169, 42.83142], [80.26886, 42.8366], [80.16892, 42.61137], [80.26841, 42.23797], [80.17807, 42.21166], [80.17842, 42.03211], [79.92977, 42.04113], [78.3732, 41.39603], [78.15757, 41.38565], [78.12873, 41.23091], [77.81287, 41.14307], [77.76206, 41.01574], [77.52723, 41.00227], [77.3693, 41.0375], [77.28004, 41.0033], [76.99302, 41.0696], [76.75681, 40.95354], [76.5261, 40.46114], [76.33659, 40.3482], [75.96168, 40.38064], [75.91361, 40.2948], [75.69663, 40.28642], [75.5854, 40.66874], [75.22834, 40.45382], [75.08243, 40.43945], [74.82013, 40.52197], [74.78168, 40.44886], [74.85996, 40.32857], [74.69875, 40.34668], [74.35063, 40.09742], [74.25533, 40.13191], [73.97049, 40.04378], [73.83006, 39.76136], [73.9051, 39.75073], [73.92354, 39.69565], [73.94683, 39.60733], [73.87018, 39.47879], [73.59831, 39.46425], [73.59241, 39.40843], [73.5004, 39.38402], [73.55396, 39.3543], [73.54572, 39.27567], [73.60638, 39.24534], [73.75823, 39.023], [73.81728, 39.04007], [73.82964, 38.91517], [73.7445, 38.93867], [73.7033, 38.84782], [73.80656, 38.66449], [73.79806, 38.61106], [73.97933, 38.52945], [74.17022, 38.65504], [74.51217, 38.47034], [74.69619, 38.42947], [74.69894, 38.22155], [74.80331, 38.19889], [74.82665, 38.07359], [74.9063, 38.03033], [74.92416, 37.83428], [75.00935, 37.77486], [74.8912, 37.67576], [74.94338, 37.55501], [75.06011, 37.52779], [75.15899, 37.41443], [75.09719, 37.37297], [75.12328, 37.31839], [74.88887, 37.23275], [74.80605, 37.21565], [74.49981, 37.24518], [74.56453, 37.03023], [75.13839, 37.02622], [75.40481, 36.95382], [75.45562, 36.71971], [75.72737, 36.7529], [75.92391, 36.56986], [76.0324, 36.41198], [76.00906, 36.17511], [75.93028, 36.13136], [76.15325, 35.9264], [76.14913, 35.82848], [76.33453, 35.84296], [76.50961, 35.8908], [76.77323, 35.66062], [76.84539, 35.67356], [76.96624, 35.5932], [77.44277, 35.46132], [77.70232, 35.46244], [77.80532, 35.52058], [78.11664, 35.48022], [78.03466, 35.3785], [78.00033, 35.23954], [78.22692, 34.88771], [78.18435, 34.7998], [78.27781, 34.61484], [78.54964, 34.57283], [78.56475, 34.50835], [78.74465, 34.45174], [79.05364, 34.32482], [78.99802, 34.3027], [78.91769, 34.15452], [78.66225, 34.08858], [78.65657, 34.03195], [78.73367, 34.01121], [78.77349, 33.73871], [78.67599, 33.66445], [78.73636, 33.56521], [79.15252, 33.17156], [79.14016, 33.02545], [79.46562, 32.69668], [79.26768, 32.53277], [79.13174, 32.47766], [79.0979, 32.38051], [78.99322, 32.37948], [78.96713, 32.33655], [78.7831, 32.46873], [78.73916, 32.69438], [78.38897, 32.53938], [78.4645, 32.45367], [78.49609, 32.2762], [78.68754, 32.10256], [78.74404, 32.00384], [78.78036, 31.99478], [78.69933, 31.78723], [78.84516, 31.60631], [78.71032, 31.50197], [78.77898, 31.31209], [78.89344, 31.30481], [79.01931, 31.42817], [79.14016, 31.43403], [79.30694, 31.17357], [79.59884, 30.93943], [79.93255, 30.88288], [80.20721, 30.58541], [80.54504, 30.44936], [80.83343, 30.32023], [81.03953, 30.20059], [81.12842, 30.01395], [81.24362, 30.0126], [81.29032, 30.08806], [81.2623, 30.14596], [81.33355, 30.15303], [81.39928, 30.21862], [81.41018, 30.42153], [81.5459, 30.37688], [81.62033, 30.44703], [81.99082, 30.33423], [82.10135, 30.35439], [82.10757, 30.23745], [82.19475, 30.16884], [82.16984, 30.0692], [82.38622, 30.02608], [82.5341, 29.9735], [82.73024, 29.81695], [83.07116, 29.61957], [83.28131, 29.56813], [83.44787, 29.30513], [83.63156, 29.16249], [83.82303, 29.30513], [83.97559, 29.33091], [84.18107, 29.23451], [84.24801, 29.02783], [84.2231, 28.89571], [84.47528, 28.74023], [84.62317, 28.73887], [84.85511, 28.58041], [85.06059, 28.68562], [85.19135, 28.62825], [85.18668, 28.54076], [85.10729, 28.34092], [85.38127, 28.28336], [85.4233, 28.32996], [85.59765, 28.30529], [85.60854, 28.25045], [85.69105, 28.38475], [85.71907, 28.38064], [85.74864, 28.23126], [85.84672, 28.18187], [85.90743, 28.05144], [85.97813, 27.99023], [85.94946, 27.9401], [86.06309, 27.90021], [86.12069, 27.93047], [86.08333, 28.02121], [86.088, 28.09264], [86.18607, 28.17364], [86.22966, 27.9786], [86.42736, 27.91122], [86.51609, 27.96623], [86.56265, 28.09569], [86.74181, 28.10638], [86.75582, 28.04182], [87.03757, 27.94835], [87.11696, 27.84104], [87.56996, 27.84517], [87.72718, 27.80938], [87.82681, 27.95248], [88.13378, 27.88015], [88.1278, 27.95417], [88.25332, 27.9478], [88.54858, 28.06057], [88.63235, 28.12356], [88.83559, 28.01936], [88.88091, 27.85192], [88.77517, 27.45415], [88.82981, 27.38814], [88.91901, 27.32483], [88.93678, 27.33777], [88.96947, 27.30319], [89.00216, 27.32532], [88.95355, 27.4106], [88.97213, 27.51671], [89.0582, 27.60985], [89.12825, 27.62502], [89.59525, 28.16433], [89.79762, 28.23979], [90.13387, 28.19178], [90.58842, 28.02838], [90.69894, 28.07784], [91.20019, 27.98715], [91.25779, 28.07509], [91.46327, 28.0064], [91.48973, 27.93903], [91.5629, 27.84823], [91.6469, 27.76358], [91.84722, 27.76325], [91.87057, 27.7195], [92.27432, 27.89077], [92.32101, 27.79363], [92.42538, 27.80092], [92.7275, 27.98662], [92.73025, 28.05814], [92.65472, 28.07632], [92.67486, 28.15018], [92.93075, 28.25671], [93.14635, 28.37035], [93.18069, 28.50319], [93.44621, 28.67189], [93.72797, 28.68821], [94.35897, 29.01965], [94.2752, 29.11687], [94.69318, 29.31739], [94.81353, 29.17804], [95.0978, 29.14446], [95.11291, 29.09527], [95.2214, 29.10727], [95.26122, 29.07727], [95.3038, 29.13847], [95.41091, 29.13007], [95.50842, 29.13487], [95.72086, 29.20797], [95.75149, 29.32063], [95.84899, 29.31464], [96.05361, 29.38167], [96.31316, 29.18643], [96.18682, 29.11087], [96.20467, 29.02325], [96.3626, 29.10607], [96.61391, 28.72742], [96.40929, 28.51526], [96.48895, 28.42955], [96.6455, 28.61657], [96.85561, 28.4875], [96.88445, 28.39452], [96.98882, 28.32564], [97.1289, 28.3619], [97.34547, 28.21385], [97.41729, 28.29783], [97.47085, 28.2688], [97.50518, 28.49716], [97.56835, 28.55628], [97.70705, 28.5056], [97.79632, 28.33168], [97.90069, 28.3776], [98.15337, 28.12114], [98.13964, 27.9478], [98.32641, 27.51385], [98.42529, 27.55404], [98.43353, 27.67086], [98.69582, 27.56499], [98.7333, 26.85615], [98.77547, 26.61994], [98.72741, 26.36183], [98.67797, 26.24487], [98.7329, 26.17218], [98.66884, 26.09165], [98.63128, 26.15492], [98.57085, 26.11547], [98.60763, 26.01512], [98.70818, 25.86241], [98.63128, 25.79937], [98.54064, 25.85129], [98.40606, 25.61129], [98.31268, 25.55307], [98.25774, 25.6051], [98.16848, 25.62739], [98.18084, 25.56298], [98.12591, 25.50722], [98.14925, 25.41547], [97.92541, 25.20815], [97.83614, 25.2715], [97.77023, 25.11492], [97.72216, 25.08508], [97.72903, 24.91332], [97.79949, 24.85655], [97.76481, 24.8289], [97.73127, 24.83015], [97.70181, 24.84557], [97.64354, 24.79171], [97.56648, 24.76475], [97.56383, 24.75535], [97.5542, 24.74943], [97.54675, 24.74202], [97.56525, 24.72838], [97.56286, 24.54535], [97.52757, 24.43748], [97.60029, 24.4401], [97.66998, 24.45288], [97.7098, 24.35658], [97.65624, 24.33781], [97.66723, 24.30027], [97.71941, 24.29652], [97.76799, 24.26365], [97.72998, 24.2302], [97.72799, 24.18883], [97.75305, 24.16902], [97.72903, 24.12606], [97.62363, 24.00506], [97.5247, 23.94032], [97.64667, 23.84574], [97.72302, 23.89288], [97.79456, 23.94836], [97.79416, 23.95663], [97.84328, 23.97603], [97.86545, 23.97723], [97.88811, 23.97446], [97.8955, 23.97758], [97.89676, 23.97931], [97.89683, 23.98389], [97.88814, 23.98605], [97.88414, 23.99405], [97.88616, 24.00463], [97.90998, 24.02094], [97.93951, 24.01953], [97.98691, 24.03897], [97.99583, 24.04932], [98.04709, 24.07616], [98.05302, 24.07408], [98.05671, 24.07961], [98.0607, 24.07812], [98.06703, 24.08028], [98.07806, 24.07988], [98.20666, 24.11406], [98.54476, 24.13119], [98.59256, 24.08371], [98.85319, 24.13042], [98.87998, 24.15624], [98.89632, 24.10612], [98.67797, 23.9644], [98.68209, 23.80492], [98.79607, 23.77947], [98.82933, 23.72921], [98.81775, 23.694], [98.88396, 23.59555], [98.80294, 23.5345], [98.82877, 23.47908], [98.87683, 23.48995], [98.92104, 23.36946], [98.87573, 23.33038], [98.93958, 23.31414], [98.92515, 23.29535], [98.88597, 23.18656], [99.05975, 23.16382], [99.04601, 23.12215], [99.25741, 23.09025], [99.34127, 23.13099], [99.52214, 23.08218], [99.54218, 22.90014], [99.43537, 22.94086], [99.45654, 22.85726], [99.31243, 22.73893], [99.38247, 22.57544], [99.37972, 22.50188], [99.28771, 22.4105], [99.17318, 22.18025], [99.19176, 22.16983], [99.1552, 22.15874], [99.33166, 22.09656], [99.47585, 22.13345], [99.85351, 22.04183], [99.96612, 22.05965], [99.99084, 21.97053], [99.94003, 21.82782], [99.98654, 21.71064], [100.04956, 21.66843], [100.12679, 21.70539], [100.17486, 21.65306], [100.10757, 21.59945], [100.12542, 21.50365], [100.1625, 21.48704], [100.18447, 21.51898], [100.25863, 21.47043], [100.35201, 21.53176], [100.42892, 21.54325], [100.4811, 21.46148], [100.57861, 21.45637], [100.72143, 21.51898], [100.87265, 21.67396], [101.11744, 21.77659], [101.15156, 21.56129], [101.2124, 21.56422], [101.19349, 21.41959], [101.26912, 21.36482], [101.2229, 21.23271], [101.29326, 21.17254], [101.54563, 21.25668], [101.6068, 21.23329], [101.59491, 21.18621], [101.60886, 21.17947], [101.66977, 21.20004], [101.70548, 21.14911], [101.7622, 21.14813], [101.79266, 21.19025], [101.76745, 21.21571], [101.83887, 21.20983], [101.84412, 21.25291], [101.74014, 21.30967], [101.74224, 21.48276], [101.7727, 21.51794], [101.7475, 21.5873], [101.80001, 21.57461], [101.83257, 21.61562], [101.74555, 21.72852], [101.7791, 21.83019], [101.62566, 21.96574], [101.57525, 22.13026], [101.60675, 22.13513], [101.53638, 22.24794], [101.56789, 22.28876], [101.61306, 22.27515], [101.68973, 22.46843], [101.7685, 22.50337], [101.86828, 22.38397], [101.90714, 22.38688], [101.91344, 22.44417], [101.98487, 22.42766], [102.03633, 22.46164], [102.1245, 22.43372], [102.14099, 22.40092], [102.16621, 22.43336], [102.26428, 22.41321], [102.25339, 22.4607], [102.41061, 22.64184], [102.38415, 22.67919], [102.42618, 22.69212], [102.46665, 22.77108], [102.51802, 22.77969], [102.57095, 22.7036], [102.60675, 22.73376], [102.8636, 22.60735], [102.9321, 22.48659], [103.0722, 22.44775], [103.07843, 22.50097], [103.17961, 22.55705], [103.15782, 22.59873], [103.18895, 22.64471], [103.28079, 22.68063], [103.32282, 22.8127], [103.43179, 22.75816], [103.43646, 22.70648], [103.52675, 22.59155], [103.57812, 22.65764], [103.56255, 22.69499], [103.64506, 22.79979], [103.87904, 22.56683], [103.93286, 22.52703], [103.94513, 22.52553], [103.95191, 22.5134], [103.96352, 22.50584], [103.96783, 22.51173], [103.97384, 22.50634], [103.99247, 22.51958], [104.01088, 22.51823], [104.03734, 22.72945], [104.11384, 22.80363], [104.27084, 22.8457], [104.25683, 22.76534], [104.35593, 22.69353], [104.47225, 22.75813], [104.58122, 22.85571], [104.60457, 22.81841], [104.65283, 22.83419], [104.72755, 22.81984], [104.77114, 22.90017], [104.84942, 22.93631], [104.86765, 22.95178], [104.8334, 23.01484], [104.79478, 23.12934], [104.87382, 23.12854], [104.87992, 23.17141], [104.91435, 23.18666], [104.9486, 23.17235], [104.96532, 23.20463], [104.98712, 23.19176], [105.07002, 23.26248], [105.11672, 23.25247], [105.17276, 23.28679], [105.22569, 23.27249], [105.32376, 23.39684], [105.40782, 23.28107], [105.42805, 23.30824], [105.49966, 23.20669], [105.56037, 23.16806], [105.57594, 23.075], [105.72382, 23.06641], [105.8726, 22.92756], [105.90119, 22.94168], [105.99568, 22.94178], [106.00179, 22.99049], [106.19705, 22.98475], [106.27022, 22.87722], [106.34961, 22.86718], [106.49749, 22.91164], [106.51306, 22.94891], [106.55976, 22.92311], [106.60179, 22.92884], [106.6516, 22.86862], [106.6734, 22.89587], [106.71387, 22.88296], [106.71128, 22.85982], [106.78422, 22.81532], [106.81271, 22.8226], [106.83685, 22.8098], [106.82404, 22.7881], [106.76293, 22.73491], [106.72321, 22.63606], [106.71698, 22.58432], [106.65316, 22.5757], [106.61269, 22.60301], [106.58395, 22.474], [106.55665, 22.46498], [106.57221, 22.37], [106.55976, 22.34841], [106.6516, 22.33977], [106.69986, 22.22309], [106.67495, 22.1885], [106.6983, 22.15102], [106.70142, 22.02409], [106.68274, 21.99811], [106.69276, 21.96013], [106.72551, 21.97923], [106.74345, 22.00965], [106.81038, 21.97934], [106.9178, 21.97357], [106.92714, 21.93459], [106.97228, 21.92592], [106.99252, 21.95191], [107.05634, 21.92303], [107.06101, 21.88982], [107.00964, 21.85948], [107.02615, 21.81981], [107.10771, 21.79879], [107.20734, 21.71493], [107.24625, 21.7077], [107.29296, 21.74674], [107.35834, 21.6672], [107.35989, 21.60063], [107.38636, 21.59774], [107.41593, 21.64839], [107.47197, 21.6672], [107.49532, 21.62958], [107.49065, 21.59774], [107.54047, 21.5934], [107.56537, 21.61945], [107.66967, 21.60787], [107.80355, 21.66141], [107.86114, 21.65128], [107.90006, 21.5905], [107.92652, 21.58906], [107.95232, 21.5388], [107.96774, 21.53601], [107.97074, 21.54072], [107.97383, 21.53961], [107.97932, 21.54503], [108.02926, 21.54997], [108.0569, 21.53604], [108.10003, 21.47338], [108.00365, 17.98159], [111.60491, 13.57105], [118.41371, 24.06775], [118.11703, 24.39734], [118.28244, 24.51231], [118.35291, 24.51645], [118.42453, 24.54644], [118.56434, 24.49266], [120.49232, 25.22863], [121.03532, 26.8787], [123.5458, 31.01942], [122.29378, 31.76513], [122.80525, 33.30571], [123.85601, 37.49093], [123.90497, 38.79949], [124.17532, 39.8232], [124.23201, 39.9248], [124.35029, 39.95639], [124.37089, 40.03004], [124.3322, 40.05573], [124.38556, 40.11047], [124.40719, 40.13655], [124.86913, 40.45387], [125.71172, 40.85223], [125.76869, 40.87908], [126.00335, 40.92835], [126.242, 41.15454], [126.53189, 41.35206], [126.60631, 41.65565], [126.90729, 41.79955], [127.17841, 41.59714], [127.29712, 41.49473], [127.92943, 41.44291], [128.02633, 41.42103], [128.03311, 41.39232], [128.12967, 41.37931], [128.18546, 41.41279], [128.20061, 41.40895], [128.30716, 41.60322], [128.15119, 41.74568], [128.04487, 42.01769], [128.94007, 42.03537], [128.96068, 42.06657], [129.15178, 42.17224], [129.22285, 42.26491], [129.22423, 42.3553], [129.28541, 42.41574], [129.42882, 42.44702], [129.54701, 42.37254], [129.60482, 42.44461], [129.72541, 42.43739], [129.75294, 42.59409], [129.77183, 42.69435], [129.7835, 42.76521], [129.80719, 42.79218], [129.83277, 42.86746], [129.85261, 42.96494], [129.8865, 43.00395], [129.95082, 43.01051], [129.96409, 42.97306], [130.12957, 42.98361], [130.09764, 42.91425], [130.26095, 42.9027], [130.23068, 42.80125], [130.2385, 42.71127], [130.41826, 42.6011], [130.44361, 42.54849], [130.50123, 42.61636], [130.55143, 42.52158], [130.62107, 42.58413], [130.56576, 42.68925], [130.40213, 42.70788], [130.44361, 42.76205], [130.66524, 42.84753], [131.02438, 42.86518], [131.02668, 42.91246], [131.135, 42.94114], [131.10274, 43.04734], [131.20414, 43.13654], [131.19031, 43.21385], [131.30324, 43.39498], [131.29402, 43.46695], [131.19492, 43.53047], [131.21105, 43.82383], [131.26176, 43.94011], [131.23583, 43.96085], [131.25484, 44.03131], [131.30365, 44.04262], [131.1108, 44.70266], [130.95639, 44.85154], [131.48415, 44.99513], [131.68466, 45.12374], [131.66852, 45.2196], [131.76532, 45.22609], [131.86903, 45.33636], [131.99417, 45.2567], [132.83978, 45.05916], [132.96373, 45.0212], [133.12293, 45.1332], [133.09279, 45.25693], [133.19419, 45.51913], [133.41083, 45.57723], [133.48457, 45.86203], [133.60442, 45.90053], [133.67569, 45.9759], [133.72695, 46.05576], [133.68047, 46.14697], [133.88097, 46.25066], [133.91496, 46.4274], [133.84104, 46.46681], [134.03538, 46.75668], [134.20016, 47.33458], [134.50898, 47.4812], [134.7671, 47.72051], [134.55508, 47.98651], [134.67098, 48.1564], [134.75328, 48.36763], [134.49516, 48.42884], [132.66989, 47.96491], [132.57309, 47.71741], [131.90448, 47.68011], [131.2635, 47.73325], [131.09871, 47.6852], [130.95985, 47.6957], [130.90915, 47.90623], [130.65103, 48.10052], [130.84462, 48.30942], [130.52147, 48.61745], [130.66946, 48.88251], [130.43232, 48.90844], [130.2355, 48.86741], [129.85416, 49.11067], [129.67598, 49.29596], [129.50685, 49.42398], [129.40398, 49.44194], [129.35317, 49.3481], [129.23232, 49.40353], [129.11153, 49.36813], [128.72896, 49.58676], [127.83476, 49.5748], [127.53516, 49.84306], [127.49299, 50.01251], [127.60515, 50.23503], [127.37384, 50.28393], [127.36009, 50.43787], [127.28765, 50.46585], [127.36335, 50.58306], [127.28165, 50.72075], [127.14586, 50.91152], [126.93135, 51.0841], [126.90369, 51.3238], [126.68349, 51.70607], [126.44606, 51.98254], [126.558, 52.13738], [125.6131, 53.07229]], [[113.56865, 22.20973], [113.57123, 22.20416], [113.60504, 22.20464], [113.63011, 22.10782], [113.57191, 22.07696], [113.54839, 22.10909], [113.54942, 22.14519], [113.54093, 22.15497], [113.52659, 22.18271], [113.53552, 22.20607], [113.53301, 22.21235], [113.53591, 22.21369], [113.54093, 22.21314], [113.54333, 22.21688], [113.5508, 22.21672], [113.56865, 22.20973]], [[114.50148, 22.15017], [113.92195, 22.13873], [113.83338, 22.1826], [113.81621, 22.2163], [113.86771, 22.42972], [114.03113, 22.5065], [114.05438, 22.5026], [114.05729, 22.51104], [114.06272, 22.51617], [114.07267, 22.51855], [114.07817, 22.52997], [114.08606, 22.53276], [114.09048, 22.53716], [114.09692, 22.53435], [114.1034, 22.5352], [114.11181, 22.52878], [114.11656, 22.53415], [114.12665, 22.54003], [114.13823, 22.54319], [114.1482, 22.54091], [114.15123, 22.55163], [114.1597, 22.56041], [114.17247, 22.55944], [114.18338, 22.55444], [114.20655, 22.55706], [114.22185, 22.55343], [114.22888, 22.5436], [114.25154, 22.55977], [114.44998, 22.55977], [114.50148, 22.15017]]]]
+         }
+       }, {
+         type: "Feature",
+         properties: {
+           wikidata: "Q22890",
+           nameEn: "Ireland",
+           level: "sharedLandform"
+         },
+         geometry: null
+       }, {
+         type: "Feature",
+         properties: {
+           wikidata: "Q23666",
+           nameEn: "Great Britain",
+           country: "GB",
+           level: "sharedLandform"
+         },
+         geometry: null
+       }, {
+         type: "Feature",
+         properties: {
+           wikidata: "Q23681",
+           nameEn: "Northern Cyprus",
+           groups: ["Q644636", "145", "142"],
+           driveSide: "left",
+           callingCodes: ["90 392"]
+         },
+         geometry: {
+           type: "MultiPolygon",
+           coordinates: [[[[33.67678, 35.03866], [33.67742, 35.05963], [33.68474, 35.06602], [33.69095, 35.06237], [33.70861, 35.07644], [33.7161, 35.07279], [33.70209, 35.04882], [33.71482, 35.03722], [33.73824, 35.05321], [33.76106, 35.04253], [33.78581, 35.05104], [33.82067, 35.07826], [33.84168, 35.06823], [33.8541, 35.07201], [33.87479, 35.08881], [33.87097, 35.09389], [33.87622, 35.10457], [33.87224, 35.12293], [33.88561, 35.12449], [33.88943, 35.12007], [33.88737, 35.11408], [33.89853, 35.11377], [33.91789, 35.08688], [33.91299, 35.07579], [33.90247, 35.07686], [33.89485, 35.06873], [33.88367, 35.07877], [33.85261, 35.0574], [33.8355, 35.05777], [33.82051, 35.0667], [33.8012, 35.04786], [33.81524, 35.04192], [33.83055, 35.02865], [33.82875, 35.01685], [33.84045, 35.00616], [33.85216, 35.00579], [33.85891, 35.001], [33.85621, 34.98956], [33.83505, 34.98108], [33.84811, 34.97075], [33.86432, 34.97592], [33.90075, 34.96623], [33.98684, 34.76642], [35.48515, 34.70851], [35.51152, 36.10954], [32.82353, 35.70297], [32.46489, 35.48584], [32.60361, 35.16647], [32.64864, 35.19967], [32.70947, 35.18328], [32.70779, 35.14127], [32.85733, 35.07742], [32.86406, 35.1043], [32.94471, 35.09422], [33.01192, 35.15639], [33.08249, 35.17319], [33.11105, 35.15639], [33.15138, 35.19504], [33.27068, 35.16815], [33.3072, 35.16816], [33.31955, 35.18096], [33.35056, 35.18328], [33.34964, 35.17803], [33.35596, 35.17942], [33.35612, 35.17402], [33.36569, 35.17479], [33.3717, 35.1788], [33.37248, 35.18698], [33.38575, 35.2018], [33.4076, 35.20062], [33.41675, 35.16325], [33.46813, 35.10564], [33.48136, 35.0636], [33.47825, 35.04103], [33.45178, 35.02078], [33.45256, 35.00288], [33.47666, 35.00701], [33.48915, 35.06594], [33.53975, 35.08151], [33.57478, 35.06049], [33.567, 35.04803], [33.59658, 35.03635], [33.61215, 35.0527], [33.63765, 35.03869], [33.67678, 35.03866]]]]
+         }
+       }, {
+         type: "Feature",
+         properties: {
+           wikidata: "Q25231",
+           nameEn: "Svalbard",
+           aliases: ["NO-21"],
+           country: "NO",
+           groups: ["SJ", "154", "150", "UN"],
+           level: "subterritory",
+           callingCodes: ["47 79"]
+         },
+         geometry: {
+           type: "MultiPolygon",
+           coordinates: [[[[-7.49892, 77.24208], [32.07813, 72.01005], [36.85549, 84.09565], [-7.49892, 77.24208]]]]
+         }
+       }, {
+         type: "Feature",
+         properties: {
+           wikidata: "Q25263",
+           nameEn: "Azores",
+           aliases: ["PT-20"],
+           country: "PT",
+           groups: ["Q3320166", "Q2914565", "Q105472", "EU", "039", "150", "UN"],
+           callingCodes: ["351"]
+         },
+         geometry: {
+           type: "MultiPolygon",
+           coordinates: [[[[-23.12984, 40.26428], [-36.43765, 41.39418], [-22.54767, 33.34416], [-23.12984, 40.26428]]]]
+         }
+       }, {
+         type: "Feature",
+         properties: {
+           wikidata: "Q25359",
+           nameEn: "Navassa Island",
+           aliases: ["UM-76"],
+           country: "US",
+           groups: ["UM", "Q1352230", "029", "003", "419", "019", "UN"],
+           level: "subterritory",
+           roadSpeedUnit: "mph",
+           roadHeightUnit: "ft"
+         },
+         geometry: {
+           type: "MultiPolygon",
+           coordinates: [[[[-74.7289, 18.71009], [-75.71816, 18.46438], [-74.76465, 18.06252], [-74.7289, 18.71009]]]]
+         }
+       }, {
+         type: "Feature",
+         properties: {
+           wikidata: "Q25396",
+           nameEn: "Bonaire",
+           aliases: ["BQ-BO", "NL-BQ1"],
+           country: "NL",
+           groups: ["Q1451600", "BQ", "029", "003", "419", "019", "UN"],
+           level: "subterritory",
+           callingCodes: ["599 7"]
+         },
+         geometry: {
+           type: "MultiPolygon",
+           coordinates: [[[[-67.89186, 12.4116], [-68.90012, 12.62309], [-68.33524, 11.78151], [-68.01417, 11.77722], [-67.89186, 12.4116]]]]
+         }
+       }, {
+         type: "Feature",
+         properties: {
+           wikidata: "Q25528",
+           nameEn: "Saba",
+           aliases: ["BQ-SA", "NL-BQ2"],
+           country: "NL",
+           groups: ["Q1451600", "BQ", "029", "003", "419", "019", "UN"],
+           level: "subterritory",
+           callingCodes: ["599 4"]
+         },
+         geometry: {
+           type: "MultiPolygon",
+           coordinates: [[[[-63.07669, 17.79659], [-63.81314, 17.95045], [-63.22932, 17.32592], [-63.07669, 17.79659]]]]
+         }
+       }, {
+         type: "Feature",
+         properties: {
+           wikidata: "Q26180",
+           nameEn: "Sint Eustatius",
+           aliases: ["BQ-SE", "NL-BQ3"],
+           country: "NL",
+           groups: ["Q1451600", "BQ", "029", "003", "419", "019", "UN"],
+           level: "subterritory",
+           callingCodes: ["599 3"]
+         },
+         geometry: {
+           type: "MultiPolygon",
+           coordinates: [[[[-63.07669, 17.79659], [-63.34999, 16.94218], [-62.76692, 17.64353], [-63.07669, 17.79659]]]]
+         }
+       }, {
+         type: "Feature",
+         properties: {
+           wikidata: "Q26253",
+           nameEn: "Madeira",
+           aliases: ["PT-30"],
+           country: "PT",
+           groups: ["Q3320166", "Q2914565", "Q105472", "EU", "039", "150", "UN"],
+           callingCodes: ["351"]
+         },
+         geometry: {
+           type: "MultiPolygon",
+           coordinates: [[[[-19.30302, 33.65304], [-16.04789, 29.65076], [-11.68307, 33.12333], [-19.30302, 33.65304]]]]
+         }
+       }, {
+         type: "Feature",
+         properties: {
+           wikidata: "Q26927",
+           nameEn: "Lakshadweep",
+           aliases: ["IN-LD"],
+           country: "IN",
+           groups: ["034", "142", "UN"],
+           driveSide: "left",
+           callingCodes: ["91"]
+         },
+         geometry: {
+           type: "MultiPolygon",
+           coordinates: [[[[67.64074, 11.57295], [76.59015, 5.591], [72.67494, 13.58102], [67.64074, 11.57295]]]]
+         }
+       }, {
+         type: "Feature",
+         properties: {
+           wikidata: "Q27329",
+           nameEn: "Asian Russia",
+           country: "RU",
+           groups: ["142", "UN"],
+           callingCodes: ["7"]
+         },
+         geometry: {
+           type: "MultiPolygon",
+           coordinates: [[[[-179.99933, 64.74703], [-172.76104, 63.77445], [-169.03888, 65.48473], [-168.95635, 65.98512], [-168.25765, 71.99091], [-179.9843, 71.90735], [-179.99933, 64.74703]]], [[[59.99809, 51.98263], [60.19925, 51.99173], [60.48915, 52.15175], [60.72581, 52.15538], [60.78201, 52.22067], [61.05417, 52.35096], [60.98021, 52.50068], [60.84709, 52.52228], [60.84118, 52.63912], [60.71693, 52.66245], [60.71989, 52.75923], [61.05842, 52.92217], [61.23462, 53.03227], [62.0422, 52.96105], [62.12799, 52.99133], [62.14574, 53.09626], [61.19024, 53.30536], [61.14291, 53.41481], [61.29082, 53.50992], [61.37957, 53.45887], [61.57185, 53.50112], [61.55706, 53.57144], [60.90626, 53.62937], [61.22574, 53.80268], [61.14283, 53.90063], [60.99796, 53.93699], [61.26863, 53.92797], [61.3706, 54.08464], [61.47603, 54.08048], [61.56941, 53.95703], [61.65318, 54.02445], [62.03913, 53.94768], [62.00966, 54.04134], [62.38535, 54.03961], [62.45931, 53.90737], [62.56876, 53.94047], [62.58651, 54.05871], [63.80604, 54.27079], [63.91224, 54.20013], [64.02715, 54.22679], [63.97686, 54.29763], [64.97216, 54.4212], [65.11033, 54.33028], [65.24663, 54.35721], [65.20174, 54.55216], [68.21308, 54.98645], [68.26661, 55.09226], [68.19206, 55.18823], [68.90865, 55.38148], [69.34224, 55.36344], [69.74917, 55.35545], [70.19179, 55.1476], [70.76493, 55.3027], [70.96009, 55.10558], [71.08288, 54.71253], [71.24185, 54.64965], [71.08706, 54.33376], [71.10379, 54.13326], [71.96141, 54.17736], [72.17477, 54.36303], [72.43415, 53.92685], [72.71026, 54.1161], [73.37963, 53.96132], [73.74778, 54.07194], [73.68921, 53.86522], [73.25412, 53.61532], [73.39218, 53.44623], [75.07405, 53.80831], [75.43398, 53.98652], [75.3668, 54.07439], [76.91052, 54.4677], [76.82266, 54.1798], [76.44076, 54.16017], [76.54243, 53.99329], [77.90383, 53.29807], [79.11255, 52.01171], [80.08138, 50.77658], [80.4127, 50.95581], [80.44819, 51.20855], [80.80318, 51.28262], [81.16999, 51.15662], [81.06091, 50.94833], [81.41248, 50.97524], [81.46581, 50.77658], [81.94999, 50.79307], [82.55443, 50.75412], [83.14607, 51.00796], [83.8442, 50.87375], [84.29385, 50.27257], [84.99198, 50.06793], [85.24047, 49.60239], [86.18709, 49.50259], [86.63674, 49.80136], [86.79056, 49.74787], [86.61307, 49.60239], [86.82606, 49.51796], [87.03071, 49.25142], [87.31465, 49.23603], [87.28386, 49.11626], [87.478, 49.07403], [87.48983, 49.13794], [87.81333, 49.17354], [87.98977, 49.18147], [88.15543, 49.30314], [88.17223, 49.46934], [88.42449, 49.48821], [88.82499, 49.44808], [89.70687, 49.72535], [89.59711, 49.90851], [91.86048, 50.73734], [92.07173, 50.69585], [92.44714, 50.78762], [93.01109, 50.79001], [92.99595, 50.63183], [94.30823, 50.57498], [94.39258, 50.22193], [94.49477, 50.17832], [94.6121, 50.04239], [94.97166, 50.04725], [95.02465, 49.96941], [95.74757, 49.97915], [95.80056, 50.04239], [96.97388, 49.88413], [97.24639, 49.74737], [97.56811, 49.84265], [97.56432, 49.92801], [97.76871, 49.99861], [97.85197, 49.91339], [98.29481, 50.33561], [98.31373, 50.4996], [98.06393, 50.61262], [97.9693, 50.78044], [98.01472, 50.86652], [97.83305, 51.00248], [98.05257, 51.46696], [98.22053, 51.46579], [98.33222, 51.71832], [98.74142, 51.8637], [98.87768, 52.14563], [99.27888, 51.96876], [99.75578, 51.90108], [99.89203, 51.74903], [100.61116, 51.73028], [101.39085, 51.45753], [101.5044, 51.50467], [102.14032, 51.35566], [102.32194, 50.67982], [102.71178, 50.38873], [103.70343, 50.13952], [105.32528, 50.4648], [106.05562, 50.40582], [106.07865, 50.33474], [106.47156, 50.31909], [106.49628, 50.32436], [106.51122, 50.34408], [106.58373, 50.34044], [106.80326, 50.30177], [107.00007, 50.1977], [107.1174, 50.04239], [107.36407, 49.97612], [107.96116, 49.93191], [107.95387, 49.66659], [108.27937, 49.53167], [108.53969, 49.32325], [109.18017, 49.34709], [109.51325, 49.22859], [110.24373, 49.16676], [110.39891, 49.25083], [110.64493, 49.1816], [113.02647, 49.60772], [113.20216, 49.83356], [114.325, 50.28098], [114.9703, 50.19254], [115.26068, 49.97367], [115.73602, 49.87688], [116.22402, 50.04477], [116.62502, 49.92919], [116.71193, 49.83813], [117.27597, 49.62544], [117.48208, 49.62324], [117.82343, 49.52696], [118.61623, 49.93809], [119.11003, 50.00276], [119.27996, 50.13348], [119.38598, 50.35162], [119.13553, 50.37412], [120.10963, 51.671], [120.65907, 51.93544], [120.77337, 52.20805], [120.61346, 52.32447], [120.71673, 52.54099], [120.46454, 52.63811], [120.04049, 52.58773], [120.0451, 52.7359], [120.85633, 53.28499], [121.39213, 53.31888], [122.35063, 53.49565], [122.85966, 53.47395], [123.26989, 53.54843], [123.86158, 53.49391], [124.46078, 53.21881], [125.17522, 53.20225], [125.6131, 53.07229], [126.558, 52.13738], [126.44606, 51.98254], [126.68349, 51.70607], [126.90369, 51.3238], [126.93135, 51.0841], [127.14586, 50.91152], [127.28165, 50.72075], [127.36335, 50.58306], [127.28765, 50.46585], [127.36009, 50.43787], [127.37384, 50.28393], [127.60515, 50.23503], [127.49299, 50.01251], [127.53516, 49.84306], [127.83476, 49.5748], [128.72896, 49.58676], [129.11153, 49.36813], [129.23232, 49.40353], [129.35317, 49.3481], [129.40398, 49.44194], [129.50685, 49.42398], [129.67598, 49.29596], [129.85416, 49.11067], [130.2355, 48.86741], [130.43232, 48.90844], [130.66946, 48.88251], [130.52147, 48.61745], [130.84462, 48.30942], [130.65103, 48.10052], [130.90915, 47.90623], [130.95985, 47.6957], [131.09871, 47.6852], [131.2635, 47.73325], [131.90448, 47.68011], [132.57309, 47.71741], [132.66989, 47.96491], [134.49516, 48.42884], [134.75328, 48.36763], [134.67098, 48.1564], [134.55508, 47.98651], [134.7671, 47.72051], [134.50898, 47.4812], [134.20016, 47.33458], [134.03538, 46.75668], [133.84104, 46.46681], [133.91496, 46.4274], [133.88097, 46.25066], [133.68047, 46.14697], [133.72695, 46.05576], [133.67569, 45.9759], [133.60442, 45.90053], [133.48457, 45.86203], [133.41083, 45.57723], [133.19419, 45.51913], [133.09279, 45.25693], [133.12293, 45.1332], [132.96373, 45.0212], [132.83978, 45.05916], [131.99417, 45.2567], [131.86903, 45.33636], [131.76532, 45.22609], [131.66852, 45.2196], [131.68466, 45.12374], [131.48415, 44.99513], [130.95639, 44.85154], [131.1108, 44.70266], [131.30365, 44.04262], [131.25484, 44.03131], [131.23583, 43.96085], [131.26176, 43.94011], [131.21105, 43.82383], [131.19492, 43.53047], [131.29402, 43.46695], [131.30324, 43.39498], [131.19031, 43.21385], [131.20414, 43.13654], [131.10274, 43.04734], [131.135, 42.94114], [131.02668, 42.91246], [131.02438, 42.86518], [130.66524, 42.84753], [130.44361, 42.76205], [130.40213, 42.70788], [130.56576, 42.68925], [130.62107, 42.58413], [130.55143, 42.52158], [130.56835, 42.43281], [130.60805, 42.4317], [130.64181, 42.41422], [130.66367, 42.38024], [130.65022, 42.32281], [131.95041, 41.5445], [140.9182, 45.92937], [145.82343, 44.571], [145.23667, 43.76813], [153.94307, 38.42848], [180, 62.52334], [180, 71.53642], [155.31937, 81.93282], [76.13964, 83.37843], [64.18965, 69.94255], [66.1708, 67.61252], [61.98014, 65.72191], [60.74386, 64.95767], [59.63945, 64.78384], [59.80579, 64.13948], [59.24834, 63.01859], [59.61398, 62.44915], [59.36223, 61.3882], [59.50685, 60.91162], [58.3853, 59.487], [59.15636, 59.14682], [59.40376, 58.45822], [58.71104, 58.07475], [58.81412, 57.71602], [58.13789, 57.68097], [58.07604, 57.08308], [57.28024, 56.87898], [57.51527, 56.08729], [59.28419, 56.15739], [59.49035, 55.60486], [58.81825, 55.03378], [57.25137, 55.26262], [57.14829, 54.84204], [57.95234, 54.39672], [59.95217, 54.85853], [59.70487, 54.14846], [58.94336, 53.953], [58.79644, 52.43392], [59.22409, 52.28437], [59.25033, 52.46803], [60.17516, 52.39457], [60.17253, 52.25814], [59.91279, 52.06924], [59.99809, 51.98263]]]]
+         }
+       }, {
+         type: "Feature",
+         properties: {
+           wikidata: "Q34366",
+           nameEn: "Tasmania",
+           aliases: ["AU-TAS"],
+           country: "AU",
+           groups: ["053", "009", "UN"],
+           driveSide: "left",
+           callingCodes: ["61"]
+         },
+         geometry: {
+           type: "MultiPolygon",
+           coordinates: [[[[123.64533, -39.13605], [159.69067, -56.28945], [159.74028, -39.1978], [123.64533, -39.13605]]]]
+         }
+       }, {
+         type: "Feature",
+         properties: {
+           wikidata: "Q34497",
+           nameEn: "Saint Helena",
+           aliases: ["SH-HL"],
+           country: "GB",
+           groups: ["SH", "BOTS", "011", "202", "002", "UN"],
+           level: "subterritory",
+           driveSide: "left",
+           roadSpeedUnit: "mph",
+           roadHeightUnit: "ft",
+           callingCodes: ["290"]
+         },
+         geometry: {
+           type: "MultiPolygon",
+           coordinates: [[[[-8.3824, -13.9131], [-6.17428, -19.07236], [-3.29308, -15.22647], [-8.3824, -13.9131]]]]
+         }
+       }, {
+         type: "Feature",
+         properties: {
+           wikidata: "Q35657",
+           nameEn: "US States",
+           country: "US",
+           level: "subcountryGroup"
+         },
+         geometry: null
+       }, {
+         type: "Feature",
+         properties: {
+           wikidata: "Q36117",
+           nameEn: "Borneo",
+           level: "sharedLandform"
+         },
+         geometry: null
+       }, {
+         type: "Feature",
+         properties: {
+           wikidata: "Q36678",
+           nameEn: "West Bank",
+           country: "PS",
+           groups: ["145", "142"],
+           callingCodes: ["970"]
+         },
+         geometry: {
+           type: "MultiPolygon",
+           coordinates: [[[[35.47672, 31.49578], [35.55941, 31.76535], [35.52758, 31.9131], [35.54375, 31.96587], [35.52012, 32.04076], [35.57111, 32.21877], [35.55807, 32.38674], [35.42078, 32.41562], [35.41048, 32.43706], [35.41598, 32.45593], [35.42034, 32.46009], [35.40224, 32.50136], [35.35212, 32.52047], [35.30685, 32.51024], [35.29306, 32.50947], [35.25049, 32.52453], [35.2244, 32.55289], [35.15937, 32.50466], [35.10882, 32.4757], [35.10024, 32.47856], [35.09236, 32.47614], [35.08564, 32.46948], [35.07059, 32.4585], [35.05423, 32.41754], [35.05311, 32.4024], [35.0421, 32.38242], [35.05142, 32.3667], [35.04243, 32.35008], [35.01772, 32.33863], [35.01119, 32.28684], [35.02939, 32.2671], [35.01841, 32.23981], [34.98885, 32.20758], [34.95703, 32.19522], [34.96009, 32.17503], [34.99039, 32.14626], [34.98507, 32.12606], [34.99437, 32.10962], [34.9863, 32.09551], [35.00261, 32.027], [34.98682, 31.96935], [35.00124, 31.93264], [35.03489, 31.92448], [35.03978, 31.89276], [35.03489, 31.85919], [34.99712, 31.85569], [34.9724, 31.83352], [35.01978, 31.82944], [35.05617, 31.85685], [35.07677, 31.85627], [35.14174, 31.81325], [35.18603, 31.80901], [35.18169, 31.82542], [35.19461, 31.82687], [35.21469, 31.81835], [35.216, 31.83894], [35.21128, 31.863], [35.20381, 31.86716], [35.20673, 31.88151], [35.20791, 31.8821], [35.20945, 31.8815], [35.21016, 31.88237], [35.21276, 31.88153], [35.2136, 31.88241], [35.22014, 31.88264], [35.22294, 31.87889], [35.22567, 31.86745], [35.22817, 31.8638], [35.2249, 31.85433], [35.2304, 31.84222], [35.24816, 31.8458], [35.25753, 31.8387], [35.251, 31.83085], [35.26404, 31.82567], [35.25573, 31.81362], [35.26058, 31.79064], [35.25225, 31.7678], [35.26319, 31.74846], [35.25182, 31.73945], [35.24981, 31.72543], [35.2438, 31.7201], [35.24315, 31.71244], [35.23972, 31.70896], [35.22392, 31.71899], [35.21937, 31.71578], [35.20538, 31.72388], [35.18023, 31.72067], [35.16478, 31.73242], [35.15474, 31.73352], [35.15119, 31.73634], [35.13931, 31.73012], [35.12933, 31.7325], [35.11895, 31.71454], [35.10782, 31.71594], [35.08226, 31.69107], [35.00879, 31.65426], [34.95249, 31.59813], [34.9415, 31.55601], [34.94356, 31.50743], [34.93258, 31.47816], [34.89756, 31.43891], [34.87833, 31.39321], [34.88932, 31.37093], [34.92571, 31.34337], [35.02459, 31.35979], [35.13033, 31.3551], [35.22921, 31.37445], [35.39675, 31.49572], [35.47672, 31.49578]]]]
+         }
+       }, {
+         type: "Feature",
+         properties: {
+           wikidata: "Q37362",
+           nameEn: "Akrotiri and Dhekelia",
+           aliases: ["SBA"],
+           country: "GB"
+         },
+         geometry: null
+       }, {
+         type: "Feature",
+         properties: {
+           wikidata: "Q38095",
+           nameEn: "Gal\xE1pagos Islands",
+           aliases: ["EC-W"],
+           country: "EC",
+           groups: ["005", "419", "019", "UN"],
+           callingCodes: ["593"]
+         },
+         geometry: {
+           type: "MultiPolygon",
+           coordinates: [[[[-93.12365, 2.64343], [-92.46744, -2.52874], [-87.07749, -0.8849], [-93.12365, 2.64343]]]]
+         }
+       }, {
+         type: "Feature",
+         properties: {
+           wikidata: "Q39760",
+           nameEn: "Gaza Strip",
+           country: "PS",
+           groups: ["145", "142"],
+           callingCodes: ["970"]
+         },
+         geometry: {
+           type: "MultiPolygon",
+           coordinates: [[[[34.052, 31.46619], [34.21853, 31.32363], [34.23572, 31.2966], [34.24012, 31.29591], [34.26742, 31.21998], [34.29417, 31.24194], [34.36523, 31.28963], [34.37381, 31.30598], [34.36505, 31.36404], [34.40077, 31.40926], [34.48892, 31.48365], [34.56797, 31.54197], [34.48681, 31.59711], [34.29262, 31.70393], [34.052, 31.46619]]]]
+         }
+       }, {
+         type: "Feature",
+         properties: {
+           wikidata: "Q40888",
+           nameEn: "Andaman and Nicobar Islands",
+           aliases: ["IN-AN"],
+           country: "IN",
+           groups: ["034", "142", "UN"],
+           driveSide: "left",
+           callingCodes: ["91"]
+         },
+         geometry: {
+           type: "MultiPolygon",
+           coordinates: [[[[94.42132, 5.96581], [94.6371, 13.81803], [86.7822, 13.41052], [94.42132, 5.96581]]]]
+         }
+       }, {
+         type: "Feature",
+         properties: {
+           wikidata: "Q41684",
+           nameEn: "Stewart Island",
+           country: "NZ",
+           groups: ["053", "009", "UN"],
+           driveSide: "left",
+           callingCodes: ["64"]
+         },
+         geometry: {
+           type: "MultiPolygon",
+           coordinates: [[[[166.59185, -47.61313], [169.70504, -47.56021], [167.52103, -46.41337], [166.59185, -47.61313]]]]
+         }
+       }, {
+         type: "Feature",
+         properties: {
+           wikidata: "Q43296",
+           nameEn: "Wake Island",
+           aliases: ["WK", "WAK", "WKUM", "872", "UM-79"],
+           country: "US",
+           groups: ["UM", "Q1352230", "057", "009", "UN"],
+           level: "subterritory",
+           roadSpeedUnit: "mph",
+           roadHeightUnit: "ft",
+           callingCodes: ["1"]
+         },
+         geometry: {
+           type: "MultiPolygon",
+           coordinates: [[[[167.34779, 18.97692], [166.67967, 20.14834], [165.82549, 18.97692], [167.34779, 18.97692]]]]
+         }
+       }, {
+         type: "Feature",
+         properties: {
+           wikidata: "Q46275",
+           nameEn: "New Zealand Subantarctic Islands",
+           country: "NZ",
+           groups: ["Q851132", "053", "009", "UN"],
+           driveSide: "left"
+         },
+         geometry: {
+           type: "MultiPolygon",
+           coordinates: [[[[164.30551, -47.88072], [161.96603, -56.07661], [179.49541, -50.04657], [179.49541, -47.2902], [169.91032, -47.66283], [164.30551, -47.88072]]]]
+         }
+       }, {
+         type: "Feature",
+         properties: {
+           wikidata: "Q46395",
+           nameEn: "British Overseas Territories",
+           aliases: ["BOTS", "UKOTS"],
+           country: "GB",
+           level: "subcountryGroup"
+         },
+         geometry: null
+       }, {
+         type: "Feature",
+         properties: {
+           wikidata: "Q46772",
+           nameEn: "Kerguelen Islands",
+           country: "FR",
+           groups: ["TF", "Q1451600", "014", "202", "002", "UN"],
+           level: "subterritory"
+         },
+         geometry: {
+           type: "MultiPolygon",
+           coordinates: [[[[61.9216, -49.39746], [70.67507, -51.14192], [74.25129, -45.45074], [61.9216, -49.39746]]]]
+         }
+       }, {
+         type: "Feature",
+         properties: {
+           wikidata: "Q46879",
+           nameEn: "Baker Island",
+           aliases: ["UM-81"],
+           country: "US",
+           groups: ["UM", "Q1352230", "061", "009", "UN"],
+           level: "subterritory",
+           roadSpeedUnit: "mph",
+           roadHeightUnit: "ft"
+         },
+         geometry: {
+           type: "MultiPolygon",
+           coordinates: [[[[-175.33482, -1.40631], [-175.31323, 0.5442], [-177.91421, 0.39582], [-175.33482, -1.40631]]]]
+         }
+       }, {
+         type: "Feature",
+         properties: {
+           wikidata: "Q47863",
+           nameEn: "Midway Atoll",
+           aliases: ["MI", "MID", "MIUM", "488", "UM-71"],
+           country: "US",
+           groups: ["UM", "Q1352230", "061", "009", "UN"],
+           level: "subterritory",
+           roadSpeedUnit: "mph",
+           roadHeightUnit: "ft",
+           callingCodes: ["1"]
+         },
+         geometry: {
+           type: "MultiPolygon",
+           coordinates: [[[[-176.29741, 29.09786], [-177.77531, 29.29793], [-177.5224, 27.7635], [-176.29741, 29.09786]]]]
+         }
+       }, {
+         type: "Feature",
+         properties: {
+           wikidata: "Q62218",
+           nameEn: "Jarvis Island",
+           aliases: ["UM-86"],
+           country: "US",
+           groups: ["UM", "Q1352230", "061", "009", "UN"],
+           level: "subterritory",
+           roadSpeedUnit: "mph",
+           roadHeightUnit: "ft"
+         },
+         geometry: {
+           type: "MultiPolygon",
+           coordinates: [[[[-160.42921, -1.4364], [-159.12443, 0.19975], [-160.38779, 0.30331], [-160.42921, -1.4364]]]]
+         }
+       }, {
+         type: "Feature",
+         properties: {
+           wikidata: "Q105472",
+           nameEn: "Macaronesia",
+           level: "sharedLandform"
+         },
+         geometry: null
+       }, {
+         type: "Feature",
+         properties: {
+           wikidata: "Q114935",
+           nameEn: "Kermadec Islands",
+           country: "NZ",
+           groups: ["Q851132", "053", "009", "UN"],
+           driveSide: "left",
+           callingCodes: ["64"]
+         },
+         geometry: {
+           type: "MultiPolygon",
+           coordinates: [[[[-174.40891, -29.09438], [-180, -24.21376], [-179.96512, -35.00791], [-174.40891, -29.09438]]]]
+         }
+       }, {
+         type: "Feature",
+         properties: {
+           wikidata: "Q115459",
+           nameEn: "Chatham Islands",
+           aliases: ["NZ-CIT"],
+           country: "NZ",
+           groups: ["Q851132", "053", "009", "UN"],
+           driveSide: "left",
+           callingCodes: ["64"]
+         },
+         geometry: {
+           type: "MultiPolygon",
+           coordinates: [[[[-179.93224, -45.18423], [-172.47015, -45.17912], [-176.30998, -41.38382], [-179.93224, -45.18423]]]]
+         }
+       }, {
+         type: "Feature",
+         properties: {
+           wikidata: "Q118863",
+           nameEn: "North Island",
+           country: "NZ",
+           groups: ["053", "009", "UN"],
+           driveSide: "left",
+           callingCodes: ["64"]
+         },
+         geometry: {
+           type: "MultiPolygon",
+           coordinates: [[[[179.49541, -47.2902], [179.49541, -36.79303], [174.17679, -32.62487], [170.27492, -36.38133], [174.58663, -40.80446], [174.46634, -41.55028], [179.49541, -47.2902]]]]
+         }
+       }, {
+         type: "Feature",
+         properties: {
+           wikidata: "Q120755",
+           nameEn: "South Island",
+           country: "NZ",
+           groups: ["053", "009", "UN"],
+           driveSide: "left",
+           callingCodes: ["64"]
+         },
+         geometry: {
+           type: "MultiPolygon",
+           coordinates: [[[[169.70504, -47.56021], [179.49541, -47.2902], [174.46634, -41.55028], [174.58663, -40.80446], [170.27492, -36.38133], [166.56976, -39.94841], [164.8365, -46.0205], [167.52103, -46.41337], [169.70504, -47.56021]]]]
+         }
+       }, {
+         type: "Feature",
+         properties: {
+           wikidata: "Q123076",
+           nameEn: "Palmyra Atoll",
+           aliases: ["UM-95"],
+           country: "US",
+           groups: ["UM", "Q1352230", "061", "009", "UN"],
+           level: "subterritory",
+           roadSpeedUnit: "mph",
+           roadHeightUnit: "ft",
+           callingCodes: ["1"]
+         },
+         geometry: {
+           type: "MultiPolygon",
+           coordinates: [[[[-161.06795, 5.2462], [-161.0731, 7.1291], [-163.24478, 5.24198], [-161.06795, 5.2462]]]]
+         }
+       }, {
+         type: "Feature",
+         properties: {
+           wikidata: "Q130574",
+           nameEn: "Chafarinas Islands",
+           country: "ES",
+           groups: ["EU", "Q191011", "015", "002", "UN"],
+           level: "subterritory"
+         },
+         geometry: {
+           type: "MultiPolygon",
+           coordinates: [[[[-2.40316, 35.16893], [-2.43262, 35.20652], [-2.45965, 35.16527], [-2.40316, 35.16893]]]]
+         }
+       }, {
+         type: "Feature",
+         properties: {
+           wikidata: "Q130895",
+           nameEn: "Kingman Reef",
+           aliases: ["UM-89"],
+           country: "US",
+           groups: ["UM", "Q1352230", "061", "009", "UN"],
+           level: "subterritory",
+           roadSpeedUnit: "mph",
+           roadHeightUnit: "ft"
+         },
+         geometry: {
+           type: "MultiPolygon",
+           coordinates: [[[[-161.0731, 7.1291], [-163.16627, 7.15036], [-163.24478, 5.24198], [-161.0731, 7.1291]]]]
+         }
+       }, {
+         type: "Feature",
+         properties: {
+           wikidata: "Q131008",
+           nameEn: "Johnston Atoll",
+           aliases: ["JT", "JTN", "JTUM", "396", "UM-67"],
+           country: "US",
+           groups: ["UM", "Q1352230", "061", "009", "UN"],
+           level: "subterritory",
+           roadSpeedUnit: "mph",
+           roadHeightUnit: "ft",
+           callingCodes: ["1"]
+         },
+         geometry: {
+           type: "MultiPolygon",
+           coordinates: [[[[-170.65691, 16.57199], [-168.87689, 16.01159], [-169.2329, 17.4933], [-170.65691, 16.57199]]]]
+         }
+       }, {
+         type: "Feature",
+         properties: {
+           wikidata: "Q131305",
+           nameEn: "Howland Island",
+           aliases: ["UM-84"],
+           country: "US",
+           groups: ["UM", "Q1352230", "061", "009", "UN"],
+           level: "subterritory",
+           roadSpeedUnit: "mph",
+           roadHeightUnit: "ft"
+         },
+         geometry: {
+           type: "MultiPolygon",
+           coordinates: [[[[-177.91421, 0.39582], [-175.31323, 0.5442], [-176.74464, 2.28109], [-177.91421, 0.39582]]]]
+         }
+       }, {
+         type: "Feature",
+         properties: {
+           wikidata: "Q133888",
+           nameEn: "Ashmore and Cartier Islands",
+           country: "AU",
+           groups: ["053", "009", "UN"],
+           driveSide: "left",
+           callingCodes: ["61"]
+         },
+         geometry: {
+           type: "MultiPolygon",
+           coordinates: [[[[123.7463, -11.1783], [120.6877, -13.59408], [125.29076, -12.33139], [123.7463, -11.1783]]]]
+         }
+       }, {
+         type: "Feature",
+         properties: {
+           wikidata: "Q153732",
+           nameEn: "Mariana Islands",
+           level: "sharedLandform"
+         },
+         geometry: null
+       }, {
+         type: "Feature",
+         properties: {
+           wikidata: "Q172216",
+           nameEn: "Coral Sea Islands",
+           country: "AU",
+           groups: ["053", "009", "UN"],
+           driveSide: "left",
+           callingCodes: ["61"]
+         },
+         geometry: {
+           type: "MultiPolygon",
+           coordinates: [[[[159.77159, -28.41151], [156.73836, -14.50464], [145.2855, -9.62524], [147.69992, -17.5933], [152.93188, -20.92631], [154.02855, -24.43238], [159.77159, -28.41151]]]]
+         }
+       }, {
+         type: "Feature",
+         properties: {
+           wikidata: "Q179313",
+           nameEn: "Alderney",
+           country: "GB",
+           groups: ["GG", "830", "Q185086", "154", "150", "UN"],
+           level: "subterritory",
+           driveSide: "left",
+           roadSpeedUnit: "mph",
+           roadHeightUnit: "ft",
+           callingCodes: ["44 01481"]
+         },
+         geometry: {
+           type: "MultiPolygon",
+           coordinates: [[[[-2.36485, 49.48223], [-2.09454, 49.46288], [-2.02963, 49.91866], [-2.49556, 49.79012], [-2.36485, 49.48223]]]]
+         }
+       }, {
+         type: "Feature",
+         properties: {
+           wikidata: "Q185086",
+           nameEn: "Crown Dependencies",
+           country: "GB",
+           level: "subcountryGroup"
+         },
+         geometry: null
+       }, {
+         type: "Feature",
+         properties: {
+           wikidata: "Q190571",
+           nameEn: "Scattered Islands",
+           country: "FR",
+           groups: ["TF", "Q1451600", "014", "202", "002", "UN"],
+           level: "subterritory"
+         },
+         geometry: {
+           type: "MultiPolygon",
+           coordinates: [[[[53.53458, -16.36909], [54.96649, -16.28353], [54.61476, -15.02273], [53.53458, -16.36909]]], [[[38.55969, -20.75596], [40.68027, -23.38889], [43.52893, -15.62903], [38.55969, -20.75596]]], [[[47.03092, -11.05648], [47.11593, -12.08552], [47.96702, -11.46447], [47.03092, -11.05648]]]]
+         }
+       }, {
+         type: "Feature",
+         properties: {
+           wikidata: "Q191011",
+           nameEn: "Plazas de soberan\xEDa",
+           country: "ES"
+         },
+         geometry: null
+       }, {
+         type: "Feature",
+         properties: {
+           wikidata: "Q191146",
+           nameEn: "Pe\xF1\xF3n de V\xE9lez de la Gomera",
+           country: "ES",
+           groups: ["EU", "Q191011", "015", "002", "UN"],
+           level: "subterritory"
+         },
+         geometry: {
+           type: "MultiPolygon",
+           coordinates: [[[[-4.30191, 35.17419], [-4.30112, 35.17058], [-4.29436, 35.17149], [-4.30191, 35.17419]]]]
+         }
+       }, {
+         type: "Feature",
+         properties: {
+           wikidata: "Q201698",
+           nameEn: "Crozet Islands",
+           country: "FR",
+           groups: ["TF", "Q1451600", "014", "202", "002", "UN"],
+           level: "subterritory"
+         },
+         geometry: {
+           type: "MultiPolygon",
+           coordinates: [[[[55.03425, -43.65017], [46.31615, -46.28749], [54.5587, -47.93013], [55.03425, -43.65017]]]]
+         }
+       }, {
+         type: "Feature",
+         properties: {
+           wikidata: "Q578170",
+           nameEn: "Contiguous United States",
+           aliases: ["CONUS"],
+           country: "US",
+           groups: ["Q35657", "021", "003", "019", "UN"],
+           roadSpeedUnit: "mph",
+           roadHeightUnit: "ft",
+           callingCodes: ["1"]
+         },
+         geometry: {
+           type: "MultiPolygon",
+           coordinates: [[[[-97.13927, 25.96583], [-96.92418, 25.97377], [-80.57035, 24.0565], [-78.91214, 27.76553], [-61.98255, 37.34815], [-67.16117, 44.20069], [-66.93432, 44.82597], [-66.96824, 44.83078], [-66.98249, 44.87071], [-66.96824, 44.90965], [-67.0216, 44.95333], [-67.11316, 45.11176], [-67.15965, 45.16179], [-67.19603, 45.16771], [-67.20349, 45.1722], [-67.22751, 45.16344], [-67.27039, 45.1934], [-67.29748, 45.18173], [-67.29754, 45.14865], [-67.34927, 45.122], [-67.48201, 45.27351], [-67.42394, 45.37969], [-67.50578, 45.48971], [-67.42144, 45.50584], [-67.43815, 45.59162], [-67.6049, 45.60725], [-67.80705, 45.69528], [-67.80653, 45.80022], [-67.75654, 45.82324], [-67.80961, 45.87531], [-67.75196, 45.91814], [-67.78111, 45.9392], [-67.78578, 47.06473], [-67.87993, 47.10377], [-67.94843, 47.1925], [-68.23244, 47.35712], [-68.37458, 47.35851], [-68.38332, 47.28723], [-68.57914, 47.28431], [-68.60575, 47.24659], [-68.70125, 47.24399], [-68.89222, 47.1807], [-69.05039, 47.2456], [-69.05073, 47.30076], [-69.05148, 47.42012], [-69.22119, 47.46461], [-69.99966, 46.69543], [-70.05812, 46.41768], [-70.18547, 46.35357], [-70.29078, 46.18832], [-70.23855, 46.1453], [-70.31025, 45.96424], [-70.24694, 45.95138], [-70.25976, 45.89675], [-70.41523, 45.79497], [-70.38934, 45.73215], [-70.54019, 45.67291], [-70.68516, 45.56964], [-70.72651, 45.49771], [-70.62518, 45.42286], [-70.65383, 45.37592], [-70.78372, 45.43269], [-70.82638, 45.39828], [-70.80236, 45.37444], [-70.84816, 45.22698], [-70.89864, 45.2398], [-70.91169, 45.29849], [-70.95193, 45.33895], [-71.0107, 45.34819], [-71.01866, 45.31573], [-71.08364, 45.30623], [-71.14568, 45.24128], [-71.19723, 45.25438], [-71.22338, 45.25184], [-71.29371, 45.29996], [-71.37133, 45.24624], [-71.44252, 45.2361], [-71.40364, 45.21382], [-71.42778, 45.12624], [-71.48735, 45.07784], [-71.50067, 45.01357], [-73.35025, 45.00942], [-74.32699, 44.99029], [-74.66689, 45.00646], [-74.8447, 45.00606], [-74.99101, 44.98051], [-75.01363, 44.95608], [-75.2193, 44.87821], [-75.41441, 44.76614], [-75.76813, 44.51537], [-75.8217, 44.43176], [-75.95947, 44.34463], [-76.00018, 44.34896], [-76.16285, 44.28262], [-76.1664, 44.23051], [-76.244, 44.19643], [-76.31222, 44.19894], [-76.35324, 44.13493], [-76.43859, 44.09393], [-76.79706, 43.63099], [-79.25796, 43.54052], [-79.06921, 43.26183], [-79.05512, 43.25375], [-79.05544, 43.21224], [-79.05002, 43.20133], [-79.05384, 43.17418], [-79.04652, 43.16396], [-79.0427, 43.13934], [-79.06881, 43.12029], [-79.05671, 43.10937], [-79.07486, 43.07845], [-79.01055, 43.06659], [-78.99941, 43.05612], [-79.02424, 43.01983], [-79.02074, 42.98444], [-78.98126, 42.97], [-78.96312, 42.95509], [-78.93224, 42.95229], [-78.90905, 42.93022], [-78.90712, 42.89733], [-78.93684, 42.82887], [-82.67862, 41.67615], [-83.11184, 41.95671], [-83.14962, 42.04089], [-83.12724, 42.2376], [-83.09837, 42.28877], [-83.07837, 42.30978], [-83.02253, 42.33045], [-82.82964, 42.37355], [-82.64242, 42.55594], [-82.58873, 42.54984], [-82.57583, 42.5718], [-82.51858, 42.611], [-82.51063, 42.66025], [-82.46613, 42.76615], [-82.4826, 42.8068], [-82.45331, 42.93139], [-82.4253, 42.95423], [-82.4146, 42.97626], [-82.42469, 42.992], [-82.48419, 45.30225], [-83.59589, 45.82131], [-83.43746, 45.99749], [-83.57017, 46.105], [-83.83329, 46.12169], [-83.90453, 46.05922], [-83.95399, 46.05634], [-84.1096, 46.23987], [-84.09756, 46.25512], [-84.11615, 46.2681], [-84.11254, 46.32329], [-84.13451, 46.39218], [-84.11196, 46.50248], [-84.12885, 46.53068], [-84.17723, 46.52753], [-84.1945, 46.54061], [-84.2264, 46.53337], [-84.26351, 46.49508], [-84.29893, 46.49127], [-84.34174, 46.50683], [-84.42101, 46.49853], [-84.4481, 46.48972], [-84.47607, 46.45225], [-84.55635, 46.45974], [-84.85871, 46.88881], [-88.37033, 48.30586], [-89.48837, 48.01412], [-89.57972, 48.00023], [-89.77248, 48.02607], [-89.89974, 47.98109], [-90.07418, 48.11043], [-90.56312, 48.09488], [-90.56444, 48.12184], [-90.75045, 48.09143], [-90.87588, 48.2484], [-91.08016, 48.18096], [-91.25025, 48.08522], [-91.43248, 48.04912], [-91.45829, 48.07454], [-91.58025, 48.04339], [-91.55649, 48.10611], [-91.70451, 48.11805], [-91.71231, 48.19875], [-91.86125, 48.21278], [-91.98929, 48.25409], [-92.05339, 48.35958], [-92.14732, 48.36578], [-92.202, 48.35252], [-92.26662, 48.35651], [-92.30939, 48.31251], [-92.27167, 48.25046], [-92.37185, 48.22259], [-92.48147, 48.36609], [-92.45588, 48.40624], [-92.50712, 48.44921], [-92.65606, 48.43471], [-92.71323, 48.46081], [-92.69927, 48.49573], [-92.62747, 48.50278], [-92.6342, 48.54133], [-92.7287, 48.54005], [-92.94973, 48.60866], [-93.25391, 48.64266], [-93.33946, 48.62787], [-93.3712, 48.60599], [-93.39758, 48.60364], [-93.40693, 48.60948], [-93.44472, 48.59147], [-93.47022, 48.54357], [-93.66382, 48.51845], [-93.79267, 48.51631], [-93.80939, 48.52439], [-93.80676, 48.58232], [-93.83288, 48.62745], [-93.85769, 48.63284], [-94.23215, 48.65202], [-94.25104, 48.65729], [-94.25172, 48.68404], [-94.27153, 48.70232], [-94.4174, 48.71049], [-94.44258, 48.69223], [-94.53826, 48.70216], [-94.54885, 48.71543], [-94.58903, 48.71803], [-94.69335, 48.77883], [-94.69669, 48.80918], [-94.70486, 48.82365], [-94.70087, 48.8339], [-94.687, 48.84077], [-94.75017, 49.09931], [-94.77355, 49.11998], [-94.82487, 49.29483], [-94.8159, 49.32299], [-94.85381, 49.32492], [-94.95681, 49.37035], [-94.99532, 49.36579], [-95.01419, 49.35647], [-95.05825, 49.35311], [-95.12903, 49.37056], [-95.15357, 49.384], [-95.15355, 48.9996], [-123.32163, 49.00419], [-123.0093, 48.83186], [-123.0093, 48.76586], [-123.26565, 48.6959], [-123.15614, 48.35395], [-123.50039, 48.21223], [-125.03842, 48.53282], [-133.98258, 38.06389], [-118.48109, 32.5991], [-117.1243, 32.53427], [-115.88053, 32.63624], [-114.71871, 32.71894], [-114.76736, 32.64094], [-114.80584, 32.62028], [-114.81141, 32.55543], [-114.79524, 32.55731], [-114.82011, 32.49609], [-111.07523, 31.33232], [-108.20979, 31.33316], [-108.20899, 31.78534], [-106.529, 31.784], [-106.52266, 31.77509], [-106.51251, 31.76922], [-106.50962, 31.76155], [-106.50111, 31.75714], [-106.48815, 31.74769], [-106.47298, 31.75054], [-106.46726, 31.75998], [-106.45244, 31.76523], [-106.43419, 31.75478], [-106.41773, 31.75196], [-106.38003, 31.73151], [-106.3718, 31.71165], [-106.34864, 31.69663], [-106.33419, 31.66303], [-106.30305, 31.62154], [-106.28084, 31.56173], [-106.24612, 31.54193], [-106.23711, 31.51262], [-106.20346, 31.46305], [-106.09025, 31.40569], [-106.00363, 31.39181], [-104.77674, 30.4236], [-104.5171, 29.64671], [-104.3969, 29.57105], [-104.39363, 29.55396], [-104.37752, 29.54255], [-103.15787, 28.93865], [-102.60596, 29.8192], [-101.47277, 29.7744], [-101.05686, 29.44738], [-101.01128, 29.36947], [-100.96725, 29.3477], [-100.94579, 29.34523], [-100.94056, 29.33371], [-100.87982, 29.296], [-100.79696, 29.24688], [-100.67294, 29.09744], [-100.63689, 28.90812], [-100.59809, 28.88197], [-100.52313, 28.75598], [-100.5075, 28.74066], [-100.51222, 28.70679], [-100.50029, 28.66117], [-99.55409, 27.61314], [-99.51478, 27.55836], [-99.52955, 27.49747], [-99.50208, 27.50021], [-99.48045, 27.49016], [-99.482, 27.47128], [-99.49744, 27.43746], [-99.53573, 27.30926], [-99.08477, 26.39849], [-99.03053, 26.41249], [-99.00546, 26.3925], [-98.35126, 26.15129], [-98.30491, 26.10475], [-98.27075, 26.09457], [-98.24603, 26.07191], [-97.97017, 26.05232], [-97.95155, 26.0625], [-97.66511, 26.01708], [-97.52025, 25.88518], [-97.49828, 25.89877], [-97.45669, 25.86874], [-97.42511, 25.83969], [-97.37332, 25.83854], [-97.35946, 25.92189], [-97.13927, 25.96583]]]]
+         }
+       }, {
+         type: "Feature",
+         properties: {
+           wikidata: "Q620634",
+           nameEn: "Bir Tawil",
+           groups: ["015", "002"],
+           level: "territory"
+         },
+         geometry: {
+           type: "MultiPolygon",
+           coordinates: [[[[33.17563, 22.00405], [33.57251, 21.72406], [33.99686, 21.76784], [34.0765, 22.00501], [33.17563, 22.00405]]]]
+         }
+       }, {
+         type: "Feature",
+         properties: {
+           wikidata: "Q639185",
+           nameEn: "Peros Banhos",
+           country: "GB",
+           groups: ["IO", "BOTS", "014", "202", "002", "UN"],
+           level: "subterritory"
+         },
+         geometry: {
+           type: "MultiPolygon",
+           coordinates: [[[[72.12587, -4.02588], [70.1848, -6.37445], [72.09518, -5.61768], [72.12587, -4.02588]]]]
+         }
+       }, {
+         type: "Feature",
+         properties: {
+           wikidata: "Q644636",
+           nameEn: "Cyprus",
+           level: "sharedLandform"
+         },
+         geometry: null
+       }, {
+         type: "Feature",
+         properties: {
+           wikidata: "Q851132",
+           nameEn: "New Zealand Outlying Islands",
+           country: "NZ",
+           level: "subcountryGroup"
+         },
+         geometry: null
+       }, {
+         type: "Feature",
+         properties: {
+           wikidata: "Q875134",
+           nameEn: "European Russia",
+           country: "RU",
+           groups: ["151", "150", "UN"],
+           callingCodes: ["7"]
+         },
+         geometry: {
+           type: "MultiPolygon",
+           coordinates: [[[[18.57853, 55.25302], [19.64312, 54.45423], [19.8038, 54.44203], [20.63871, 54.3706], [21.41123, 54.32395], [22.79705, 54.36264], [22.7253, 54.41732], [22.70208, 54.45312], [22.67788, 54.532], [22.71293, 54.56454], [22.68021, 54.58486], [22.7522, 54.63525], [22.74225, 54.64339], [22.75467, 54.6483], [22.73397, 54.66604], [22.73631, 54.72952], [22.87317, 54.79492], [22.85083, 54.88711], [22.76422, 54.92521], [22.68723, 54.9811], [22.65451, 54.97037], [22.60075, 55.01863], [22.58907, 55.07085], [22.47688, 55.04408], [22.31562, 55.0655], [22.14267, 55.05345], [22.11697, 55.02131], [22.06087, 55.02935], [22.02582, 55.05078], [22.03984, 55.07888], [21.99543, 55.08691], [21.96505, 55.07353], [21.85521, 55.09493], [21.64954, 55.1791], [21.55605, 55.20311], [21.51095, 55.18507], [21.46766, 55.21115], [21.38446, 55.29348], [21.35465, 55.28427], [21.26425, 55.24456], [20.95181, 55.27994], [20.60454, 55.40986], [18.57853, 55.25302]]], [[[26.32936, 60.00121], [26.90044, 59.63819], [27.85643, 59.58538], [28.04187, 59.47017], [28.19061, 59.39962], [28.21137, 59.38058], [28.20537, 59.36491], [28.19284, 59.35791], [28.14215, 59.28934], [28.00689, 59.28351], [27.90911, 59.24353], [27.87978, 59.18097], [27.80482, 59.1116], [27.74429, 58.98351], [27.36366, 58.78381], [27.55489, 58.39525], [27.48541, 58.22615], [27.62393, 58.09462], [27.67282, 57.92627], [27.81841, 57.89244], [27.78526, 57.83963], [27.56689, 57.83356], [27.50171, 57.78842], [27.52615, 57.72843], [27.3746, 57.66834], [27.40393, 57.62125], [27.31919, 57.57672], [27.34698, 57.52242], [27.56832, 57.53728], [27.52453, 57.42826], [27.86101, 57.29402], [27.66511, 56.83921], [27.86101, 56.88204], [28.04768, 56.59004], [28.13526, 56.57989], [28.10069, 56.524], [28.19057, 56.44637], [28.16599, 56.37806], [28.23716, 56.27588], [28.15217, 56.16964], [28.30571, 56.06035], [28.36888, 56.05805], [28.37987, 56.11399], [28.43068, 56.09407], [28.5529, 56.11705], [28.68337, 56.10173], [28.63668, 56.07262], [28.73418, 55.97131], [29.08299, 56.03427], [29.21717, 55.98971], [29.44692, 55.95978], [29.3604, 55.75862], [29.51283, 55.70294], [29.61446, 55.77716], [29.80672, 55.79569], [29.97975, 55.87281], [30.12136, 55.8358], [30.27776, 55.86819], [30.30987, 55.83592], [30.48257, 55.81066], [30.51346, 55.78982], [30.51037, 55.76568], [30.63344, 55.73079], [30.67464, 55.64176], [30.72957, 55.66268], [30.7845, 55.58514], [30.86003, 55.63169], [30.93419, 55.6185], [30.95204, 55.50667], [30.90123, 55.46621], [30.93144, 55.3914], [30.8257, 55.3313], [30.81946, 55.27931], [30.87944, 55.28223], [30.97369, 55.17134], [31.02071, 55.06167], [31.00972, 55.02783], [30.94243, 55.03964], [30.9081, 55.02232], [30.95754, 54.98609], [30.93144, 54.9585], [30.81759, 54.94064], [30.8264, 54.90062], [30.75165, 54.80699], [30.95479, 54.74346], [30.97127, 54.71967], [31.0262, 54.70698], [30.98226, 54.68872], [30.99187, 54.67046], [31.19339, 54.66947], [31.21399, 54.63113], [31.08543, 54.50361], [31.22945, 54.46585], [31.3177, 54.34067], [31.30791, 54.25315], [31.57002, 54.14535], [31.89599, 54.0837], [31.88744, 54.03653], [31.85019, 53.91801], [31.77028, 53.80015], [31.89137, 53.78099], [32.12621, 53.81586], [32.36663, 53.7166], [32.45717, 53.74039], [32.50112, 53.68594], [32.40499, 53.6656], [32.47777, 53.5548], [32.74968, 53.45597], [32.73257, 53.33494], [32.51725, 53.28431], [32.40773, 53.18856], [32.15368, 53.07594], [31.82373, 53.10042], [31.787, 53.18033], [31.62496, 53.22886], [31.56316, 53.19432], [31.40523, 53.21406], [31.36403, 53.13504], [31.3915, 53.09712], [31.33519, 53.08805], [31.32283, 53.04101], [31.24147, 53.031], [31.35667, 52.97854], [31.592, 52.79011], [31.57277, 52.71613], [31.50406, 52.69707], [31.63869, 52.55361], [31.56316, 52.51518], [31.61397, 52.48843], [31.62084, 52.33849], [31.57971, 52.32146], [31.70735, 52.26711], [31.6895, 52.1973], [31.77877, 52.18636], [31.7822, 52.11406], [31.81722, 52.09955], [31.85018, 52.11305], [31.96141, 52.08015], [31.92159, 52.05144], [32.08813, 52.03319], [32.23331, 52.08085], [32.2777, 52.10266], [32.34044, 52.1434], [32.33083, 52.23685], [32.38988, 52.24946], [32.3528, 52.32842], [32.54781, 52.32423], [32.69475, 52.25535], [32.85405, 52.27888], [32.89937, 52.2461], [33.18913, 52.3754], [33.51323, 52.35779], [33.48027, 52.31499], [33.55718, 52.30324], [33.78789, 52.37204], [34.05239, 52.20132], [34.11199, 52.14087], [34.09413, 52.00835], [34.41136, 51.82793], [34.42922, 51.72852], [34.07765, 51.67065], [34.17599, 51.63253], [34.30562, 51.5205], [34.22048, 51.4187], [34.33446, 51.363], [34.23009, 51.26429], [34.31661, 51.23936], [34.38802, 51.2746], [34.6613, 51.25053], [34.6874, 51.18], [34.82472, 51.17483], [34.97304, 51.2342], [35.14058, 51.23162], [35.12685, 51.16191], [35.20375, 51.04723], [35.31774, 51.08434], [35.40837, 51.04119], [35.32598, 50.94524], [35.39307, 50.92145], [35.41367, 50.80227], [35.47704, 50.77274], [35.48116, 50.66405], [35.39464, 50.64751], [35.47463, 50.49247], [35.58003, 50.45117], [35.61711, 50.35707], [35.73659, 50.35489], [35.80388, 50.41356], [35.8926, 50.43829], [36.06893, 50.45205], [36.20763, 50.3943], [36.30101, 50.29088], [36.47817, 50.31457], [36.58371, 50.28563], [36.56655, 50.2413], [36.64571, 50.218], [36.69377, 50.26982], [36.91762, 50.34963], [37.08468, 50.34935], [37.48204, 50.46079], [37.47243, 50.36277], [37.62486, 50.29966], [37.62879, 50.24481], [37.61113, 50.21976], [37.75807, 50.07896], [37.79515, 50.08425], [37.90776, 50.04194], [38.02999, 49.94482], [38.02999, 49.90592], [38.21675, 49.98104], [38.18517, 50.08161], [38.32524, 50.08866], [38.35408, 50.00664], [38.65688, 49.97176], [38.68677, 50.00904], [38.73311, 49.90238], [38.90477, 49.86787], [38.9391, 49.79524], [39.1808, 49.88911], [39.27968, 49.75976], [39.44496, 49.76067], [39.59142, 49.73758], [39.65047, 49.61761], [39.84548, 49.56064], [40.13249, 49.61672], [40.16683, 49.56865], [40.03636, 49.52321], [40.03087, 49.45452], [40.1141, 49.38798], [40.14912, 49.37681], [40.18331, 49.34996], [40.22176, 49.25683], [40.01988, 49.1761], [39.93437, 49.05709], [39.6836, 49.05121], [39.6683, 48.99454], [39.71353, 48.98959], [39.72649, 48.9754], [39.74874, 48.98675], [39.78368, 48.91596], [39.98967, 48.86901], [40.03636, 48.91957], [40.08168, 48.87443], [39.97182, 48.79398], [39.79466, 48.83739], [39.73104, 48.7325], [39.71765, 48.68673], [39.67226, 48.59368], [39.79764, 48.58668], [39.84548, 48.57821], [39.86196, 48.46633], [39.88794, 48.44226], [39.94847, 48.35055], [39.84136, 48.33321], [39.84273, 48.30947], [39.90041, 48.3049], [39.91465, 48.26743], [39.95248, 48.29972], [39.9693, 48.29904], [39.97325, 48.31399], [39.99241, 48.31768], [40.00752, 48.22445], [39.94847, 48.22811], [39.83724, 48.06501], [39.88256, 48.04482], [39.77544, 48.04206], [39.82213, 47.96396], [39.73935, 47.82876], [38.87979, 47.87719], [38.79628, 47.81109], [38.76379, 47.69346], [38.35062, 47.61631], [38.28679, 47.53552], [38.28954, 47.39255], [38.22225, 47.30788], [38.33074, 47.30508], [38.32112, 47.2585], [38.23049, 47.2324], [38.22955, 47.12069], [38.3384, 46.98085], [38.12112, 46.86078], [37.62608, 46.82615], [35.23066, 45.79231], [35.04991, 45.76827], [36.6645, 45.4514], [36.6545, 45.3417], [36.5049, 45.3136], [36.475, 45.2411], [36.4883, 45.0488], [33.5943, 44.03313], [39.81147, 43.06294], [40.0078, 43.38551], [40.00853, 43.40578], [40.01552, 43.42025], [40.01007, 43.42411], [40.03312, 43.44262], [40.04445, 43.47776], [40.10657, 43.57344], [40.65957, 43.56212], [41.64935, 43.22331], [42.40563, 43.23226], [42.66667, 43.13917], [42.75889, 43.19651], [43.03322, 43.08883], [43.0419, 43.02413], [43.81453, 42.74297], [43.73119, 42.62043], [43.95517, 42.55396], [44.54202, 42.75699], [44.70002, 42.74679], [44.80941, 42.61277], [44.88754, 42.74934], [45.15318, 42.70598], [45.36501, 42.55268], [45.78692, 42.48358], [45.61676, 42.20768], [46.42738, 41.91323], [46.5332, 41.87389], [46.58924, 41.80547], [46.75269, 41.8623], [46.8134, 41.76252], [47.00955, 41.63583], [46.99554, 41.59743], [47.03757, 41.55434], [47.10762, 41.59044], [47.34579, 41.27884], [47.49004, 41.26366], [47.54504, 41.20275], [47.62288, 41.22969], [47.75831, 41.19455], [47.87973, 41.21798], [48.07587, 41.49957], [48.22064, 41.51472], [48.2878, 41.56221], [48.40277, 41.60441], [48.42301, 41.65444], [48.55078, 41.77917], [48.5867, 41.84306], [48.80971, 41.95365], [49.2134, 44.84989], [49.88945, 46.04554], [49.32259, 46.26944], [49.16518, 46.38542], [48.54988, 46.56267], [48.51142, 46.69268], [49.01136, 46.72716], [48.52326, 47.4102], [48.45173, 47.40818], [48.15348, 47.74545], [47.64973, 47.76559], [47.41689, 47.83687], [47.38731, 47.68176], [47.12107, 47.83687], [47.11516, 48.27188], [46.49011, 48.43019], [46.78392, 48.95352], [47.00857, 49.04921], [47.04658, 49.19834], [46.78398, 49.34026], [46.9078, 49.86707], [47.18319, 49.93721], [47.34589, 50.09308], [47.30448, 50.30894], [47.58551, 50.47867], [48.10044, 50.09242], [48.24519, 49.86099], [48.42564, 49.82283], [48.68352, 49.89546], [48.90782, 50.02281], [48.57946, 50.63278], [48.86936, 50.61589], [49.12673, 50.78639], [49.41959, 50.85927], [49.39001, 51.09396], [49.76866, 51.11067], [49.97277, 51.2405], [50.26859, 51.28677], [50.59695, 51.61859], [51.26254, 51.68466], [51.301, 51.48799], [51.77431, 51.49536], [51.8246, 51.67916], [52.36119, 51.74161], [52.54329, 51.48444], [53.46165, 51.49445], [53.69299, 51.23466], [54.12248, 51.11542], [54.46331, 50.85554], [54.41894, 50.61214], [54.55797, 50.52006], [54.71476, 50.61214], [54.56685, 51.01958], [54.72067, 51.03261], [55.67774, 50.54508], [56.11398, 50.7471], [56.17906, 50.93204], [57.17302, 51.11253], [57.44221, 50.88354], [57.74986, 50.93017], [57.75578, 51.13852], [58.3208, 51.15151], [58.87974, 50.70852], [59.48928, 50.64216], [59.51886, 50.49937], [59.81172, 50.54451], [60.01288, 50.8163], [60.17262, 50.83312], [60.31914, 50.67705], [60.81833, 50.6629], [61.4431, 50.80679], [61.56889, 51.23679], [61.6813, 51.25716], [61.55114, 51.32746], [61.50677, 51.40687], [60.95655, 51.48615], [60.92401, 51.61124], [60.5424, 51.61675], [60.36787, 51.66815], [60.50986, 51.7964], [60.09867, 51.87135], [59.99809, 51.98263], [59.91279, 52.06924], [60.17253, 52.25814], [60.17516, 52.39457], [59.25033, 52.46803], [59.22409, 52.28437], [58.79644, 52.43392], [58.94336, 53.953], [59.70487, 54.14846], [59.95217, 54.85853], [57.95234, 54.39672], [57.14829, 54.84204], [57.25137, 55.26262], [58.81825, 55.03378], [59.49035, 55.60486], [59.28419, 56.15739], [57.51527, 56.08729], [57.28024, 56.87898], [58.07604, 57.08308], [58.13789, 57.68097], [58.81412, 57.71602], [58.71104, 58.07475], [59.40376, 58.45822], [59.15636, 59.14682], [58.3853, 59.487], [59.50685, 60.91162], [59.36223, 61.3882], [59.61398, 62.44915], [59.24834, 63.01859], [59.80579, 64.13948], [59.63945, 64.78384], [60.74386, 64.95767], [61.98014, 65.72191], [66.1708, 67.61252], [64.18965, 69.94255], [76.13964, 83.37843], [36.85549, 84.09565], [32.07813, 72.01005], [31.59909, 70.16571], [30.84095, 69.80584], [30.95011, 69.54699], [30.52662, 69.54699], [30.16363, 69.65244], [29.97205, 69.41623], [29.27631, 69.2811], [29.26623, 69.13794], [29.0444, 69.0119], [28.91738, 69.04774], [28.45957, 68.91417], [28.78224, 68.86696], [28.43941, 68.53366], [28.62982, 68.19816], [29.34179, 68.06655], [29.66955, 67.79872], [30.02041, 67.67523], [29.91155, 67.51507], [28.9839, 66.94139], [29.91155, 66.13863], [30.16363, 65.66935], [29.97205, 65.70256], [29.74013, 65.64025], [29.84096, 65.56945], [29.68972, 65.31803], [29.61914, 65.23791], [29.8813, 65.22101], [29.84096, 65.1109], [29.61914, 65.05993], [29.68972, 64.80789], [30.05271, 64.79072], [30.12329, 64.64862], [30.01238, 64.57513], [30.06279, 64.35782], [30.4762, 64.25728], [30.55687, 64.09036], [30.25437, 63.83364], [29.98213, 63.75795], [30.49637, 63.46666], [31.23244, 63.22239], [31.29294, 63.09035], [31.58535, 62.91642], [31.38369, 62.66284], [31.10136, 62.43042], [29.01829, 61.17448], [28.82816, 61.1233], [28.47974, 60.93365], [27.77352, 60.52722], [27.71177, 60.3893], [27.44953, 60.22766], [26.32936, 60.00121]]]]
+         }
+       }, {
+         type: "Feature",
+         properties: {
+           wikidata: "Q1083368",
+           nameEn: "Mainland Finland",
+           country: "FI",
+           groups: ["EU", "154", "150", "UN"],
+           callingCodes: ["358"]
+         },
+         geometry: {
+           type: "MultiPolygon",
+           coordinates: [[[[29.12697, 69.69193], [28.36883, 69.81658], [28.32849, 69.88605], [27.97558, 69.99671], [27.95542, 70.0965], [27.57226, 70.06215], [27.05802, 69.92069], [26.64461, 69.96565], [26.40261, 69.91377], [25.96904, 69.68397], [25.69679, 69.27039], [25.75729, 68.99383], [25.61613, 68.89602], [25.42455, 68.90328], [25.12206, 68.78684], [25.10189, 68.63307], [24.93048, 68.61102], [24.90023, 68.55579], [24.74898, 68.65143], [24.18432, 68.73936], [24.02299, 68.81601], [23.781, 68.84514], [23.68017, 68.70276], [23.13064, 68.64684], [22.53321, 68.74393], [22.38367, 68.71561], [22.27276, 68.89514], [21.63833, 69.27485], [21.27827, 69.31281], [21.00732, 69.22755], [20.98641, 69.18809], [21.11099, 69.10291], [21.05775, 69.0356], [20.72171, 69.11874], [20.55258, 69.06069], [20.78802, 69.03087], [20.91658, 68.96764], [20.85104, 68.93142], [20.90649, 68.89696], [21.03001, 68.88969], [22.00429, 68.50692], [22.73028, 68.40881], [23.10336, 68.26551], [23.15377, 68.14759], [23.26469, 68.15134], [23.40081, 68.05545], [23.65793, 67.9497], [23.45627, 67.85297], [23.54701, 67.59306], [23.39577, 67.46974], [23.75372, 67.43688], [23.75372, 67.29914], [23.54701, 67.25435], [23.58735, 67.20752], [23.56214, 67.17038], [23.98563, 66.84149], [23.98059, 66.79585], [23.89488, 66.772], [23.85959, 66.56434], [23.63776, 66.43568], [23.67591, 66.3862], [23.64982, 66.30603], [23.71339, 66.21299], [23.90497, 66.15802], [24.15791, 65.85385], [24.14798, 65.83466], [24.15107, 65.81427], [24.14112, 65.39731], [20.15877, 63.06556], [19.23413, 60.61414], [20.96741, 60.71528], [21.15143, 60.54555], [21.08159, 60.20167], [21.02509, 60.12142], [21.35468, 59.67511], [20.5104, 59.15546], [26.32936, 60.00121], [27.44953, 60.22766], [27.71177, 60.3893], [27.77352, 60.52722], [28.47974, 60.93365], [28.82816, 61.1233], [29.01829, 61.17448], [31.10136, 62.43042], [31.38369, 62.66284], [31.58535, 62.91642], [31.29294, 63.09035], [31.23244, 63.22239], [30.49637, 63.46666], [29.98213, 63.75795], [30.25437, 63.83364], [30.55687, 64.09036], [30.4762, 64.25728], [30.06279, 64.35782], [30.01238, 64.57513], [30.12329, 64.64862], [30.05271, 64.79072], [29.68972, 64.80789], [29.61914, 65.05993], [29.84096, 65.1109], [29.8813, 65.22101], [29.61914, 65.23791], [29.68972, 65.31803], [29.84096, 65.56945], [29.74013, 65.64025], [29.97205, 65.70256], [30.16363, 65.66935], [29.91155, 66.13863], [28.9839, 66.94139], [29.91155, 67.51507], [30.02041, 67.67523], [29.66955, 67.79872], [29.34179, 68.06655], [28.62982, 68.19816], [28.43941, 68.53366], [28.78224, 68.86696], [28.45957, 68.91417], [28.91738, 69.04774], [28.81248, 69.11997], [28.8629, 69.22395], [29.31664, 69.47994], [29.12697, 69.69193]]]]
+         }
+       }, {
+         type: "Feature",
+         properties: {
+           wikidata: "Q1184963",
+           nameEn: "Alhucemas Islands",
+           country: "ES",
+           groups: ["EU", "Q191011", "015", "002", "UN"],
+           level: "subterritory"
+         },
+         geometry: {
+           type: "MultiPolygon",
+           coordinates: [[[[-3.90602, 35.21494], [-3.88372, 35.20767], [-3.89343, 35.22728], [-3.90602, 35.21494]]]]
+         }
+       }, {
+         type: "Feature",
+         properties: {
+           wikidata: "Q1298289",
+           nameEn: "Egmont Islands",
+           country: "GB",
+           groups: ["IO", "BOTS", "014", "202", "002", "UN"],
+           level: "subterritory"
+         },
+         geometry: {
+           type: "MultiPolygon",
+           coordinates: [[[[70.1848, -6.37445], [70.67958, -8.2663], [72.17991, -6.68509], [70.1848, -6.37445]]]]
+         }
+       }, {
+         type: "Feature",
+         properties: {
+           wikidata: "Q1352230",
+           nameEn: "US Territories",
+           country: "US",
+           level: "subcountryGroup"
+         },
+         geometry: null
+       }, {
+         type: "Feature",
+         properties: {
+           wikidata: "Q1451600",
+           nameEn: "Overseas Countries and Territories of the EU",
+           aliases: ["OCT"],
+           level: "subunion"
+         },
+         geometry: null
+       }, {
+         type: "Feature",
+         properties: {
+           wikidata: "Q1544253",
+           nameEn: "Great Chagos Bank",
+           country: "GB",
+           groups: ["IO", "BOTS", "014", "202", "002", "UN"],
+           level: "subterritory"
+         },
+         geometry: {
+           type: "MultiPolygon",
+           coordinates: [[[[70.1848, -6.37445], [72.17991, -6.68509], [73.20573, -5.20727], [70.1848, -6.37445]]]]
+         }
+       }, {
+         type: "Feature",
+         properties: {
+           wikidata: "Q1585511",
+           nameEn: "Salomon Atoll",
+           country: "GB",
+           groups: ["IO", "BOTS", "014", "202", "002", "UN"],
+           level: "subterritory"
+         },
+         geometry: {
+           type: "MultiPolygon",
+           coordinates: [[[[72.09518, -5.61768], [73.20573, -5.20727], [72.12587, -4.02588], [72.09518, -5.61768]]]]
+         }
+       }, {
+         type: "Feature",
+         properties: {
+           wikidata: "Q1681727",
+           nameEn: "Saint-Paul and Amsterdam",
+           country: "FR",
+           groups: ["TF", "Q1451600", "014", "202", "002", "UN"],
+           level: "subterritory"
+         },
+         geometry: {
+           type: "MultiPolygon",
+           coordinates: [[[[76.31747, -42.16264], [80.15867, -36.04977], [71.22311, -38.75287], [76.31747, -42.16264]]]]
+         }
+       }, {
+         type: "Feature",
+         properties: {
+           wikidata: "Q1901211",
+           nameEn: "East Malaysia",
+           country: "MY",
+           groups: ["Q36117", "035", "142", "UN"],
+           driveSide: "left",
+           callingCodes: ["60"]
+         },
+         geometry: {
+           type: "MultiPolygon",
+           coordinates: [[[[110.90339, 7.52694], [109.82788, 2.86812], [109.62558, 1.99182], [109.53794, 1.91771], [109.57923, 1.80624], [109.66397, 1.79972], [109.66397, 1.60425], [110.35354, 0.98869], [110.49182, 0.88088], [110.62374, 0.873], [111.22979, 1.08326], [111.55434, 0.97864], [111.82846, 0.99349], [111.94553, 1.12016], [112.15679, 1.17004], [112.2127, 1.44135], [112.48648, 1.56516], [113.021, 1.57819], [113.01448, 1.42832], [113.64677, 1.23933], [114.03788, 1.44787], [114.57892, 1.5], [114.80706, 1.92351], [114.80706, 2.21665], [115.1721, 2.49671], [115.11343, 2.82879], [115.53713, 3.14776], [115.58276, 3.93499], [115.90217, 4.37708], [117.25801, 4.35108], [117.47313, 4.18857], [117.67641, 4.16535], [118.06469, 4.16638], [118.93936, 4.09009], [119.52945, 5.35672], [117.98544, 6.27477], [117.93857, 6.89845], [117.17735, 7.52841], [116.79524, 7.43869], [115.02521, 5.35005], [115.16236, 5.01011], [115.15092, 4.87604], [115.20737, 4.8256], [115.27819, 4.63661], [115.2851, 4.42295], [115.36346, 4.33563], [115.31275, 4.30806], [115.09978, 4.39123], [115.07737, 4.53418], [115.04064, 4.63706], [115.02278, 4.74137], [115.02955, 4.82087], [115.05038, 4.90275], [114.99417, 4.88201], [114.96982, 4.81146], [114.88841, 4.81905], [114.8266, 4.75062], [114.77303, 4.72871], [114.83189, 4.42387], [114.88039, 4.4257], [114.78539, 4.12205], [114.64211, 4.00694], [114.49922, 4.13108], [114.4416, 4.27588], [114.32176, 4.2552], [114.32176, 4.34942], [114.26876, 4.49878], [114.15813, 4.57], [114.07448, 4.58441], [114.10166, 4.76112], [110.90339, 7.52694]]]]
+         }
+       }, {
+         type: "Feature",
+         properties: {
+           wikidata: "Q1973345",
+           nameEn: "Peninsular Malaysia",
+           country: "MY",
+           groups: ["035", "142", "UN"],
+           driveSide: "left",
+           callingCodes: ["60"]
+         },
+         geometry: {
+           type: "MultiPolygon",
+           coordinates: [[[[102.46318, 7.22462], [102.09086, 6.23546], [102.08127, 6.22679], [102.07732, 6.193], [102.09182, 6.14161], [102.01835, 6.05407], [101.99209, 6.04075], [101.97114, 6.01992], [101.9714, 6.00575], [101.94712, 5.98421], [101.92819, 5.85511], [101.91776, 5.84269], [101.89188, 5.8386], [101.80144, 5.74505], [101.75074, 5.79091], [101.69773, 5.75881], [101.58019, 5.93534], [101.25524, 5.78633], [101.25755, 5.71065], [101.14062, 5.61613], [100.98815, 5.79464], [101.02708, 5.91013], [101.087, 5.9193], [101.12388, 6.11411], [101.06165, 6.14161], [101.12618, 6.19431], [101.10313, 6.25617], [100.85884, 6.24929], [100.81045, 6.45086], [100.74822, 6.46231], [100.74361, 6.50811], [100.66986, 6.45086], [100.43027, 6.52389], [100.42351, 6.51762], [100.41791, 6.5189], [100.41152, 6.52299], [100.35413, 6.54932], [100.31929, 6.65413], [100.32607, 6.65933], [100.32671, 6.66526], [100.31884, 6.66423], [100.31618, 6.66781], [100.30828, 6.66462], [100.29651, 6.68439], [100.19511, 6.72559], [100.12, 6.42105], [100.0756, 6.4045], [99.91873, 6.50233], [99.50117, 6.44501], [99.31854, 5.99868], [99.75778, 3.86466], [103.03657, 1.30383], [103.56591, 1.19719], [103.62738, 1.35255], [103.67468, 1.43166], [103.7219, 1.46108], [103.74161, 1.4502], [103.76395, 1.45183], [103.81181, 1.47953], [103.86383, 1.46288], [103.89565, 1.42841], [103.93384, 1.42926], [104.00131, 1.42405], [104.02277, 1.4438], [104.04622, 1.44691], [104.07348, 1.43322], [104.08871, 1.42015], [104.09162, 1.39694], [104.08072, 1.35998], [104.12282, 1.27714], [104.34728, 1.33529], [104.56723, 1.44271], [105.01437, 3.24936], [102.46318, 7.22462]]]]
+         }
+       }, {
+         type: "Feature",
+         properties: {
+           wikidata: "Q2093907",
+           nameEn: "Three Kings Islands",
+           country: "NZ",
+           groups: ["Q851132", "053", "009", "UN"],
+           driveSide: "left"
+         },
+         geometry: {
+           type: "MultiPolygon",
+           coordinates: [[[[174.17679, -32.62487], [170.93268, -32.97889], [171.97383, -34.64644], [174.17679, -32.62487]]]]
+         }
+       }, {
+         type: "Feature",
+         properties: {
+           wikidata: "Q2298216",
+           nameEn: "Solander Islands",
+           country: "NZ",
+           groups: ["Q851132", "053", "009", "UN"],
+           driveSide: "left"
+         },
+         geometry: {
+           type: "MultiPolygon",
+           coordinates: [[[[167.39068, -46.49187], [166.5534, -46.39484], [166.84561, -46.84889], [167.39068, -46.49187]]]]
+         }
+       }, {
+         type: "Feature",
+         properties: {
+           wikidata: "Q2872203",
+           nameEn: "Mainland Australia",
+           country: "AU",
+           groups: ["053", "009", "UN"],
+           level: "subcountryGroup",
+           driveSide: "left",
+           callingCodes: ["61"]
+         },
+         geometry: {
+           type: "MultiPolygon",
+           coordinates: [[[[88.16419, -23.49578], [123.64533, -39.13605], [159.74028, -39.1978], [159.76765, -29.76946], [154.02855, -24.43238], [152.93188, -20.92631], [147.69992, -17.5933], [145.2855, -9.62524], [143.87386, -9.02382], [143.29772, -9.33993], [142.48658, -9.36754], [142.19246, -9.15378], [141.88934, -9.36111], [141.01842, -9.35091], [135.49042, -9.2276], [127.55165, -9.05052], [125.29076, -12.33139], [88.16419, -23.49578]]]]
+         }
+       }, {
+         type: "Feature",
+         properties: {
+           wikidata: "Q2914565",
+           nameEn: "Autonomous Regions of Portugal",
+           country: "PT",
+           level: "subcountryGroup"
+         },
+         geometry: null
+       }, {
+         type: "Feature",
+         properties: {
+           wikidata: "Q2915956",
+           nameEn: "Mainland Portugal",
+           country: "PT",
+           groups: ["Q12837", "EU", "039", "150", "UN"],
+           level: "subcountryGroup",
+           callingCodes: ["351"]
+         },
+         geometry: {
+           type: "MultiPolygon",
+           coordinates: [[[[-10.39881, 36.12218], [-7.37282, 36.96896], [-7.39769, 37.16868], [-7.41133, 37.20314], [-7.41854, 37.23813], [-7.43227, 37.25152], [-7.43974, 37.38913], [-7.46878, 37.47127], [-7.51759, 37.56119], [-7.41981, 37.75729], [-7.33441, 37.81193], [-7.27314, 37.90145], [-7.24544, 37.98884], [-7.12648, 38.00296], [-7.10366, 38.04404], [-7.05966, 38.01966], [-7.00375, 38.01914], [-6.93418, 38.21454], [-7.09389, 38.17227], [-7.15581, 38.27597], [-7.32529, 38.44336], [-7.265, 38.61674], [-7.26174, 38.72107], [-7.03848, 38.87221], [-7.051, 38.907], [-6.95211, 39.0243], [-6.97004, 39.07619], [-7.04011, 39.11919], [-7.10692, 39.10275], [-7.14929, 39.11287], [-7.12811, 39.17101], [-7.23566, 39.20132], [-7.23403, 39.27579], [-7.3149, 39.34857], [-7.2927, 39.45847], [-7.49477, 39.58794], [-7.54121, 39.66717], [-7.33507, 39.64569], [-7.24707, 39.66576], [-7.01613, 39.66877], [-6.97492, 39.81488], [-6.91463, 39.86618], [-6.86737, 40.01986], [-6.94233, 40.10716], [-7.00589, 40.12087], [-7.02544, 40.18564], [-7.00426, 40.23169], [-6.86085, 40.26776], [-6.86085, 40.2976], [-6.80218, 40.33239], [-6.78426, 40.36468], [-6.84618, 40.42177], [-6.84944, 40.46394], [-6.7973, 40.51723], [-6.80218, 40.55067], [-6.84292, 40.56801], [-6.79567, 40.65955], [-6.82826, 40.74603], [-6.82337, 40.84472], [-6.79892, 40.84842], [-6.80707, 40.88047], [-6.84292, 40.89771], [-6.8527, 40.93958], [-6.9357, 41.02888], [-6.913, 41.03922], [-6.88843, 41.03027], [-6.84781, 41.02692], [-6.80942, 41.03629], [-6.79241, 41.05397], [-6.75655, 41.10187], [-6.77319, 41.13049], [-6.69711, 41.1858], [-6.68286, 41.21641], [-6.65046, 41.24725], [-6.55937, 41.24417], [-6.38551, 41.35274], [-6.38553, 41.38655], [-6.3306, 41.37677], [-6.26777, 41.48796], [-6.19128, 41.57638], [-6.29863, 41.66432], [-6.44204, 41.68258], [-6.49907, 41.65823], [-6.54633, 41.68623], [-6.56426, 41.74219], [-6.51374, 41.8758], [-6.56752, 41.88429], [-6.5447, 41.94371], [-6.58544, 41.96674], [-6.61967, 41.94008], [-6.75004, 41.94129], [-6.76959, 41.98734], [-6.81196, 41.99097], [-6.82174, 41.94493], [-6.94396, 41.94403], [-6.95537, 41.96553], [-6.98144, 41.9728], [-7.01078, 41.94977], [-7.07596, 41.94977], [-7.08574, 41.97401], [-7.14115, 41.98855], [-7.18549, 41.97515], [-7.18677, 41.88793], [-7.32366, 41.8406], [-7.37092, 41.85031], [-7.42864, 41.80589], [-7.42854, 41.83262], [-7.44759, 41.84451], [-7.45566, 41.86488], [-7.49803, 41.87095], [-7.52737, 41.83939], [-7.62188, 41.83089], [-7.58603, 41.87944], [-7.65774, 41.88308], [-7.69848, 41.90977], [-7.84188, 41.88065], [-7.88055, 41.84571], [-7.88751, 41.92553], [-7.90707, 41.92432], [-7.92336, 41.8758], [-7.9804, 41.87337], [-8.01136, 41.83453], [-8.0961, 41.81024], [-8.16455, 41.81753], [-8.16944, 41.87944], [-8.19551, 41.87459], [-8.2185, 41.91237], [-8.16232, 41.9828], [-8.08796, 42.01398], [-8.08847, 42.05767], [-8.11729, 42.08537], [-8.18178, 42.06436], [-8.19406, 42.12141], [-8.18947, 42.13853], [-8.1986, 42.15402], [-8.22406, 42.1328], [-8.24681, 42.13993], [-8.2732, 42.12396], [-8.29809, 42.106], [-8.32161, 42.10218], [-8.33912, 42.08358], [-8.36353, 42.09065], [-8.38323, 42.07683], [-8.40143, 42.08052], [-8.42512, 42.07199], [-8.44123, 42.08218], [-8.48185, 42.0811], [-8.52837, 42.07658], [-8.5252, 42.06264], [-8.54563, 42.0537], [-8.58086, 42.05147], [-8.59493, 42.05708], [-8.63791, 42.04691], [-8.64626, 42.03668], [-8.65832, 42.02972], [-8.6681, 41.99703], [-8.69071, 41.98862], [-8.7478, 41.96282], [-8.74606, 41.9469], [-8.75712, 41.92833], [-8.81794, 41.90375], [-8.87157, 41.86488], [-11.19304, 41.83075], [-10.39881, 36.12218]]]]
+         }
+       }, {
+         type: "Feature",
+         properties: {
+           wikidata: "Q3311985",
+           nameEn: "Guernsey",
+           country: "GB",
+           groups: ["GG", "830", "Q185086", "154", "150", "UN"],
+           level: "subterritory",
+           driveSide: "left",
+           roadSpeedUnit: "mph",
+           roadHeightUnit: "ft",
+           callingCodes: ["44 01481"]
+         },
+         geometry: {
+           type: "MultiPolygon",
+           coordinates: [[[[-2.49556, 49.79012], [-3.28154, 49.57329], [-2.65349, 49.15373], [-2.36485, 49.48223], [-2.49556, 49.79012]]]]
+         }
+       }, {
+         type: "Feature",
+         properties: {
+           wikidata: "Q3320166",
+           nameEn: "Outermost Regions of the EU",
+           aliases: ["OMR"],
+           level: "subunion"
+         },
+         geometry: null
+       }, {
+         type: "Feature",
+         properties: {
+           wikidata: "Q3336843",
+           nameEn: "Countries of the United Kingdom",
+           country: "GB",
+           level: "subcountryGroup"
+         },
+         geometry: null
+       }, {
+         type: "Feature",
+         properties: {
+           wikidata: "Q6736667",
+           nameEn: "Mainland India",
+           country: "IN",
+           groups: ["034", "142", "UN"],
+           driveSide: "left",
+           callingCodes: ["91"]
+         },
+         geometry: {
+           type: "MultiPolygon",
+           coordinates: [[[[89.08044, 21.41871], [89.07114, 22.15335], [88.9367, 22.58527], [88.94614, 22.66941], [88.9151, 22.75228], [88.96713, 22.83346], [88.87063, 22.95235], [88.88327, 23.03885], [88.86377, 23.08759], [88.99148, 23.21134], [88.71133, 23.2492], [88.79254, 23.46028], [88.79351, 23.50535], [88.74841, 23.47361], [88.56507, 23.64044], [88.58087, 23.87105], [88.66189, 23.87607], [88.73743, 23.91751], [88.6976, 24.14703], [88.74841, 24.1959], [88.68801, 24.31464], [88.50934, 24.32474], [88.12296, 24.51301], [88.08786, 24.63232], [88.00683, 24.66477], [88.15515, 24.85806], [88.14004, 24.93529], [88.21832, 24.96642], [88.27325, 24.88796], [88.33917, 24.86803], [88.46277, 25.07468], [88.44766, 25.20149], [88.94067, 25.18534], [89.00463, 25.26583], [89.01105, 25.30303], [88.85278, 25.34679], [88.81296, 25.51546], [88.677, 25.46959], [88.4559, 25.59227], [88.45103, 25.66245], [88.242, 25.80811], [88.13138, 25.78773], [88.08804, 25.91334], [88.16581, 26.0238], [88.1844, 26.14417], [88.34757, 26.22216], [88.35153, 26.29123], [88.51649, 26.35923], [88.48749, 26.45855], [88.36938, 26.48683], [88.35153, 26.45241], [88.33093, 26.48929], [88.41196, 26.63837], [88.4298, 26.54489], [88.62144, 26.46783], [88.69485, 26.38353], [88.67837, 26.26291], [88.78961, 26.31093], [88.85004, 26.23211], [89.05328, 26.2469], [88.91321, 26.37984], [88.92357, 26.40711], [88.95612, 26.4564], [89.08899, 26.38845], [89.15869, 26.13708], [89.35953, 26.0077], [89.53515, 26.00382], [89.57101, 25.9682], [89.63968, 26.22595], [89.70201, 26.15138], [89.73581, 26.15818], [89.77865, 26.08387], [89.77728, 26.04254], [89.86592, 25.93115], [89.80585, 25.82489], [89.84388, 25.70042], [89.86129, 25.61714], [89.81208, 25.37244], [89.84086, 25.31854], [89.83371, 25.29548], [89.87629, 25.28337], [89.90478, 25.31038], [90.1155, 25.22686], [90.40034, 25.1534], [90.65042, 25.17788], [90.87427, 25.15799], [91.25517, 25.20677], [91.63648, 25.12846], [92.0316, 25.1834], [92.33957, 25.07593], [92.39147, 25.01471], [92.49887, 24.88796], [92.38626, 24.86055], [92.25854, 24.9191], [92.15796, 24.54435], [92.11662, 24.38997], [91.96603, 24.3799], [91.89258, 24.14674], [91.82596, 24.22345], [91.76004, 24.23848], [91.73257, 24.14703], [91.65292, 24.22095], [91.63782, 24.1132], [91.55542, 24.08687], [91.37414, 24.10693], [91.35741, 23.99072], [91.29587, 24.0041], [91.22308, 23.89616], [91.25192, 23.83463], [91.15579, 23.6599], [91.28293, 23.37538], [91.36453, 23.06612], [91.40848, 23.07117], [91.4035, 23.27522], [91.46615, 23.2328], [91.54993, 23.01051], [91.61571, 22.93929], [91.7324, 23.00043], [91.81634, 23.08001], [91.76417, 23.26619], [91.84789, 23.42235], [91.95642, 23.47361], [91.95093, 23.73284], [92.04706, 23.64229], [92.15417, 23.73409], [92.26541, 23.70392], [92.38214, 23.28705], [92.37665, 22.9435], [92.5181, 22.71441], [92.60029, 22.1522], [92.56616, 22.13554], [92.60949, 21.97638], [92.67532, 22.03547], [92.70416, 22.16017], [92.86208, 22.05456], [92.89504, 21.95143], [92.93899, 22.02656], [92.99804, 21.98964], [92.99255, 22.05965], [93.04885, 22.20595], [93.15734, 22.18687], [93.14224, 22.24535], [93.19991, 22.25425], [93.18206, 22.43716], [93.13537, 22.45873], [93.11477, 22.54374], [93.134, 22.59573], [93.09417, 22.69459], [93.134, 22.92498], [93.12988, 23.05772], [93.2878, 23.00464], [93.38478, 23.13698], [93.36862, 23.35426], [93.38781, 23.36139], [93.39981, 23.38828], [93.38805, 23.4728], [93.43475, 23.68299], [93.3908, 23.7622], [93.3908, 23.92925], [93.36059, 23.93176], [93.32351, 24.04468], [93.34735, 24.10151], [93.41415, 24.07854], [93.46633, 23.97067], [93.50616, 23.94432], [93.62871, 24.00922], [93.75952, 24.0003], [93.80279, 23.92549], [93.92089, 23.95812], [94.14081, 23.83333], [94.30215, 24.23752], [94.32362, 24.27692], [94.45279, 24.56656], [94.50729, 24.59281], [94.5526, 24.70764], [94.60204, 24.70889], [94.73937, 25.00545], [94.74212, 25.13606], [94.57458, 25.20318], [94.68032, 25.47003], [94.80117, 25.49359], [95.18556, 26.07338], [95.11428, 26.1019], [95.12801, 26.38397], [95.05798, 26.45408], [95.23513, 26.68499], [95.30339, 26.65372], [95.437, 26.7083], [95.81603, 27.01335], [95.93002, 27.04149], [96.04949, 27.19428], [96.15591, 27.24572], [96.40779, 27.29818], [96.55761, 27.29928], [96.73888, 27.36638], [96.88445, 27.25046], [96.85287, 27.2065], [96.89132, 27.17474], [97.14675, 27.09041], [97.17422, 27.14052], [96.91431, 27.45752], [96.90112, 27.62149], [97.29919, 27.92233], [97.35824, 27.87256], [97.38845, 28.01329], [97.35412, 28.06663], [97.31292, 28.06784], [97.34547, 28.21385], [97.1289, 28.3619], [96.98882, 28.32564], [96.88445, 28.39452], [96.85561, 28.4875], [96.6455, 28.61657], [96.48895, 28.42955], [96.40929, 28.51526], [96.61391, 28.72742], [96.3626, 29.10607], [96.20467, 29.02325], [96.18682, 29.11087], [96.31316, 29.18643], [96.05361, 29.38167], [95.84899, 29.31464], [95.75149, 29.32063], [95.72086, 29.20797], [95.50842, 29.13487], [95.41091, 29.13007], [95.3038, 29.13847], [95.26122, 29.07727], [95.2214, 29.10727], [95.11291, 29.09527], [95.0978, 29.14446], [94.81353, 29.17804], [94.69318, 29.31739], [94.2752, 29.11687], [94.35897, 29.01965], [93.72797, 28.68821], [93.44621, 28.67189], [93.18069, 28.50319], [93.14635, 28.37035], [92.93075, 28.25671], [92.67486, 28.15018], [92.65472, 28.07632], [92.73025, 28.05814], [92.7275, 27.98662], [92.42538, 27.80092], [92.32101, 27.79363], [92.27432, 27.89077], [91.87057, 27.7195], [91.84722, 27.76325], [91.6469, 27.76358], [91.55819, 27.6144], [91.65007, 27.48287], [92.01132, 27.47352], [92.12019, 27.27829], [92.04702, 27.26861], [92.03457, 27.07334], [92.11863, 26.893], [92.05523, 26.8692], [91.83181, 26.87318], [91.50067, 26.79223], [90.67715, 26.77215], [90.48504, 26.8594], [90.39271, 26.90704], [90.30402, 26.85098], [90.04535, 26.72422], [89.86124, 26.73307], [89.63369, 26.74402], [89.42349, 26.83727], [89.3901, 26.84225], [89.38319, 26.85963], [89.37913, 26.86224], [89.1926, 26.81329], [89.12825, 26.81661], [89.09554, 26.89089], [88.95807, 26.92668], [88.92301, 26.99286], [88.8714, 26.97488], [88.86984, 27.10937], [88.74219, 27.144], [88.91901, 27.32483], [88.82981, 27.38814], [88.77517, 27.45415], [88.88091, 27.85192], [88.83559, 28.01936], [88.63235, 28.12356], [88.54858, 28.06057], [88.25332, 27.9478], [88.1278, 27.95417], [88.13378, 27.88015], [88.1973, 27.85067], [88.19107, 27.79285], [88.04008, 27.49223], [88.07277, 27.43007], [88.01646, 27.21612], [88.01587, 27.21388], [87.9887, 27.11045], [88.11719, 26.98758], [88.13422, 26.98705], [88.12302, 26.95324], [88.19107, 26.75516], [88.1659, 26.68177], [88.16452, 26.64111], [88.09963, 26.54195], [88.09414, 26.43732], [88.00895, 26.36029], [87.90115, 26.44923], [87.89085, 26.48565], [87.84193, 26.43663], [87.7918, 26.46737], [87.76004, 26.40711], [87.67893, 26.43501], [87.66803, 26.40294], [87.59175, 26.38342], [87.55274, 26.40596], [87.51571, 26.43106], [87.46566, 26.44058], [87.37314, 26.40815], [87.34568, 26.34787], [87.26568, 26.37294], [87.26587, 26.40592], [87.24682, 26.4143], [87.18863, 26.40558], [87.14751, 26.40542], [87.09147, 26.45039], [87.0707, 26.58571], [87.04691, 26.58685], [87.01559, 26.53228], [86.95912, 26.52076], [86.94543, 26.52076], [86.82898, 26.43919], [86.76797, 26.45892], [86.74025, 26.42386], [86.69124, 26.45169], [86.62686, 26.46891], [86.61313, 26.48658], [86.57073, 26.49825], [86.54258, 26.53819], [86.49726, 26.54218], [86.31564, 26.61925], [86.26235, 26.61886], [86.22513, 26.58863], [86.13596, 26.60651], [86.02729, 26.66756], [85.8492, 26.56667], [85.85126, 26.60866], [85.83126, 26.61134], [85.76907, 26.63076], [85.72315, 26.67471], [85.73483, 26.79613], [85.66239, 26.84822], [85.61621, 26.86721], [85.59461, 26.85161], [85.5757, 26.85955], [85.56471, 26.84133], [85.47752, 26.79292], [85.34302, 26.74954], [85.21159, 26.75933], [85.18046, 26.80519], [85.19291, 26.86909], [85.15883, 26.86966], [85.02635, 26.85381], [85.05592, 26.88991], [85.00536, 26.89523], [84.97186, 26.9149], [84.96687, 26.95599], [84.85754, 26.98984], [84.82913, 27.01989], [84.793, 26.9968], [84.64496, 27.04669], [84.69166, 27.21294], [84.62161, 27.33885], [84.29315, 27.39], [84.25735, 27.44941], [84.21376, 27.45218], [84.10791, 27.52399], [84.02229, 27.43836], [83.93306, 27.44939], [83.86182, 27.4241], [83.85595, 27.35797], [83.61288, 27.47013], [83.39495, 27.4798], [83.38872, 27.39276], [83.35136, 27.33885], [83.29999, 27.32778], [83.2673, 27.36235], [83.27197, 27.38309], [83.19413, 27.45632], [82.94938, 27.46036], [82.93261, 27.50328], [82.74119, 27.49838], [82.70378, 27.72122], [82.46405, 27.6716], [82.06554, 27.92222], [81.97214, 27.93322], [81.91223, 27.84995], [81.47867, 28.08303], [81.48179, 28.12148], [81.38683, 28.17638], [81.32923, 28.13521], [81.19847, 28.36284], [81.03471, 28.40054], [80.55142, 28.69182], [80.50575, 28.6706], [80.52443, 28.54897], [80.44504, 28.63098], [80.37188, 28.63371], [80.12125, 28.82346], [80.06957, 28.82763], [80.05743, 28.91479], [80.18085, 29.13649], [80.23178, 29.11626], [80.26602, 29.13938], [80.24112, 29.21414], [80.28626, 29.20327], [80.31428, 29.30784], [80.24322, 29.44299], [80.37939, 29.57098], [80.41858, 29.63581], [80.38428, 29.68513], [80.36803, 29.73865], [80.41554, 29.79451], [80.43458, 29.80466], [80.48997, 29.79566], [80.56247, 29.86661], [80.57179, 29.91422], [80.60226, 29.95732], [80.67076, 29.95732], [80.8778, 30.13384], [80.86673, 30.17321], [80.91143, 30.22173], [80.92547, 30.17193], [81.03953, 30.20059], [80.83343, 30.32023], [80.54504, 30.44936], [80.20721, 30.58541], [79.93255, 30.88288], [79.59884, 30.93943], [79.30694, 31.17357], [79.14016, 31.43403], [79.01931, 31.42817], [78.89344, 31.30481], [78.77898, 31.31209], [78.71032, 31.50197], [78.84516, 31.60631], [78.69933, 31.78723], [78.78036, 31.99478], [78.74404, 32.00384], [78.68754, 32.10256], [78.49609, 32.2762], [78.4645, 32.45367], [78.38897, 32.53938], [78.73916, 32.69438], [78.7831, 32.46873], [78.96713, 32.33655], [78.99322, 32.37948], [79.0979, 32.38051], [79.13174, 32.47766], [79.26768, 32.53277], [79.46562, 32.69668], [79.14016, 33.02545], [79.15252, 33.17156], [78.73636, 33.56521], [78.67599, 33.66445], [78.77349, 33.73871], [78.73367, 34.01121], [78.65657, 34.03195], [78.66225, 34.08858], [78.91769, 34.15452], [78.99802, 34.3027], [79.05364, 34.32482], [78.74465, 34.45174], [78.56475, 34.50835], [78.54964, 34.57283], [78.27781, 34.61484], [78.18435, 34.7998], [78.22692, 34.88771], [78.00033, 35.23954], [78.03466, 35.3785], [78.11664, 35.48022], [77.80532, 35.52058], [77.70232, 35.46244], [77.44277, 35.46132], [76.96624, 35.5932], [76.84539, 35.67356], [76.77323, 35.66062], [76.75475, 35.52617], [76.85088, 35.39754], [76.93465, 35.39866], [77.11796, 35.05419], [76.99251, 34.93349], [76.87193, 34.96906], [76.74514, 34.92488], [76.74377, 34.84039], [76.67648, 34.76371], [76.47186, 34.78965], [76.15463, 34.6429], [76.04614, 34.67566], [75.75438, 34.51827], [75.38009, 34.55021], [75.01479, 34.64629], [74.6663, 34.703], [74.58083, 34.77386], [74.31239, 34.79626], [74.12897, 34.70073], [73.96423, 34.68244], [73.93401, 34.63386], [73.93951, 34.57169], [73.89419, 34.54568], [73.88732, 34.48911], [73.74999, 34.3781], [73.74862, 34.34183], [73.8475, 34.32935], [73.90517, 34.35317], [73.98208, 34.2522], [73.90677, 34.10504], [73.88732, 34.05105], [73.91341, 34.01235], [74.21554, 34.03853], [74.25262, 34.01577], [74.26086, 33.92237], [74.14001, 33.83002], [74.05898, 33.82089], [74.00891, 33.75437], [73.96423, 33.73071], [73.98968, 33.66155], [73.97367, 33.64061], [74.03576, 33.56718], [74.10115, 33.56392], [74.18121, 33.4745], [74.17983, 33.3679], [74.08782, 33.26232], [74.01366, 33.25199], [74.02144, 33.18908], [74.15374, 33.13477], [74.17571, 33.07495], [74.31854, 33.02891], [74.34875, 32.97823], [74.31227, 32.92795], [74.41467, 32.90563], [74.45312, 32.77755], [74.6289, 32.75561], [74.64675, 32.82604], [74.7113, 32.84219], [74.65345, 32.71225], [74.69542, 32.66792], [74.64424, 32.60985], [74.65251, 32.56416], [74.67431, 32.56676], [74.68362, 32.49298], [74.84725, 32.49075], [74.97634, 32.45367], [75.03265, 32.49538], [75.28259, 32.36556], [75.38046, 32.26836], [75.25649, 32.10187], [75.00793, 32.03786], [74.9269, 32.0658], [74.86236, 32.04485], [74.79919, 31.95983], [74.58907, 31.87824], [74.47771, 31.72227], [74.57498, 31.60382], [74.61517, 31.55698], [74.59319, 31.50197], [74.64713, 31.45605], [74.59773, 31.4136], [74.53223, 31.30321], [74.51629, 31.13829], [74.56023, 31.08303], [74.60281, 31.10419], [74.60006, 31.13711], [74.6852, 31.12771], [74.67971, 31.05479], [74.5616, 31.04153], [73.88993, 30.36305], [73.95736, 30.28466], [73.97225, 30.19829], [73.80299, 30.06969], [73.58665, 30.01848], [73.3962, 29.94707], [73.28094, 29.56646], [73.05886, 29.1878], [73.01337, 29.16422], [72.94272, 29.02487], [72.40402, 28.78283], [72.29495, 28.66367], [72.20329, 28.3869], [71.9244, 28.11555], [71.89921, 27.96035], [70.79054, 27.68423], [70.60927, 28.02178], [70.37307, 28.01208], [70.12502, 27.8057], [70.03136, 27.56627], [69.58519, 27.18109], [69.50904, 26.74892], [69.88555, 26.56836], [70.05584, 26.60398], [70.17532, 26.55362], [70.17532, 26.24118], [70.08193, 26.08094], [70.0985, 25.93238], [70.2687, 25.71156], [70.37444, 25.67443], [70.53649, 25.68928], [70.60378, 25.71898], [70.67382, 25.68186], [70.66695, 25.39314], [70.89148, 25.15064], [70.94002, 24.92843], [71.09405, 24.69017], [70.97594, 24.60904], [71.00341, 24.46038], [71.12838, 24.42662], [71.04461, 24.34657], [70.94985, 24.3791], [70.85784, 24.30903], [70.88393, 24.27398], [70.71502, 24.23517], [70.57906, 24.27774], [70.5667, 24.43787], [70.11712, 24.30915], [70.03428, 24.172], [69.73335, 24.17007], [69.59579, 24.29777], [69.29778, 24.28712], [69.19341, 24.25646], [69.07806, 24.29777], [68.97781, 24.26021], [68.90914, 24.33156], [68.7416, 24.31904], [68.74643, 23.97027], [68.39339, 23.96838], [68.20763, 23.85849], [68.11329, 23.53945], [76.59015, 5.591], [79.50447, 8.91876], [79.42124, 9.80115], [80.48418, 10.20786], [89.08044, 21.41871]]]]
+         }
+       }, {
+         type: "Feature",
+         properties: {
+           wikidata: "Q9143535",
+           nameEn: "Akrotiri",
+           country: "GB",
+           groups: ["Q644636", "Q37362", "BOTS", "145", "142", "UN"],
+           level: "subterritory",
+           driveSide: "left",
+           callingCodes: ["357"]
+         },
+         geometry: {
+           type: "MultiPolygon",
+           coordinates: [[[[32.86014, 34.70585], [32.82717, 34.70622], [32.79433, 34.67883], [32.76136, 34.68318], [32.75515, 34.64985], [32.74412, 34.43926], [33.26744, 34.49942], [33.0138, 34.64424], [32.96968, 34.64046], [32.96718, 34.63446], [32.95891, 34.62919], [32.95323, 34.64075], [32.95471, 34.64528], [32.94976, 34.65204], [32.94796, 34.6587], [32.95325, 34.66462], [32.97079, 34.66112], [32.97736, 34.65277], [32.99014, 34.65518], [32.98668, 34.67268], [32.99135, 34.68061], [32.95539, 34.68471], [32.94683, 34.67907], [32.94379, 34.67111], [32.93693, 34.67027], [32.93449, 34.66241], [32.92807, 34.66736], [32.93043, 34.67091], [32.91398, 34.67343], [32.9068, 34.66102], [32.86167, 34.68734], [32.86014, 34.70585]]]]
+         }
+       }, {
+         type: "Feature",
+         properties: {
+           wikidata: "Q9206745",
+           nameEn: "Dhekelia",
+           country: "GB",
+           groups: ["Q644636", "Q37362", "BOTS", "145", "142", "UN"],
+           level: "subterritory",
+           driveSide: "left",
+           callingCodes: ["357"]
+         },
+         geometry: {
+           type: "MultiPolygon",
+           coordinates: [[[[33.70575, 34.97947], [33.83531, 34.73974], [33.98684, 34.76642], [33.90075, 34.96623], [33.86432, 34.97592], [33.84811, 34.97075], [33.83505, 34.98108], [33.85621, 34.98956], [33.85891, 35.001], [33.85216, 35.00579], [33.84045, 35.00616], [33.82875, 35.01685], [33.83055, 35.02865], [33.81524, 35.04192], [33.8012, 35.04786], [33.82051, 35.0667], [33.8355, 35.05777], [33.85261, 35.0574], [33.88367, 35.07877], [33.89485, 35.06873], [33.90247, 35.07686], [33.91299, 35.07579], [33.91789, 35.08688], [33.89853, 35.11377], [33.88737, 35.11408], [33.88943, 35.12007], [33.88561, 35.12449], [33.87224, 35.12293], [33.87622, 35.10457], [33.87097, 35.09389], [33.87479, 35.08881], [33.8541, 35.07201], [33.84168, 35.06823], [33.82067, 35.07826], [33.78581, 35.05104], [33.76106, 35.04253], [33.73824, 35.05321], [33.71482, 35.03722], [33.70209, 35.04882], [33.7161, 35.07279], [33.70861, 35.07644], [33.69095, 35.06237], [33.68474, 35.06602], [33.67742, 35.05963], [33.67678, 35.03866], [33.69938, 35.03123], [33.69731, 35.01754], [33.71514, 35.00294], [33.70639, 34.99303], [33.70575, 34.97947]], [[33.77312, 34.9976], [33.77553, 34.99518], [33.78516, 34.99582], [33.79191, 34.98914], [33.78917, 34.98854], [33.78571, 34.98951], [33.78318, 34.98699], [33.78149, 34.98854], [33.77843, 34.988], [33.7778, 34.98981], [33.76738, 34.99188], [33.76605, 34.99543], [33.75682, 34.99916], [33.75994, 35.00113], [33.77312, 34.9976]], [[33.74144, 35.01053], [33.7343, 35.01178], [33.73781, 35.02181], [33.74265, 35.02329], [33.74983, 35.02274], [33.7492, 35.01319], [33.74144, 35.01053]]]]
+         }
+       }, {
+         type: "Feature",
+         properties: {
+           wikidata: "Q16390686",
+           nameEn: "Peninsular Spain",
+           country: "ES",
+           groups: ["Q12837", "EU", "039", "150", "UN"],
+           callingCodes: ["34"]
+         },
+         geometry: {
+           type: "MultiPolygon",
+           coordinates: [[[[3.75438, 42.33445], [3.17156, 42.43545], [3.11379, 42.43646], [3.10027, 42.42621], [3.08167, 42.42748], [3.03734, 42.47363], [2.96518, 42.46692], [2.94283, 42.48174], [2.92107, 42.4573], [2.88413, 42.45938], [2.86983, 42.46843], [2.85675, 42.45444], [2.84335, 42.45724], [2.77464, 42.41046], [2.75497, 42.42578], [2.72056, 42.42298], [2.65311, 42.38771], [2.6747, 42.33974], [2.57934, 42.35808], [2.55516, 42.35351], [2.54382, 42.33406], [2.48457, 42.33933], [2.43508, 42.37568], [2.43299, 42.39423], [2.38504, 42.39977], [2.25551, 42.43757], [2.20578, 42.41633], [2.16599, 42.42314], [2.12789, 42.41291], [2.11621, 42.38393], [2.06241, 42.35906], [2.00488, 42.35399], [1.96482, 42.37787], [1.9574, 42.42401], [1.94084, 42.43039], [1.94061, 42.43333], [1.94292, 42.44316], [1.93663, 42.45439], [1.88853, 42.4501], [1.83037, 42.48395], [1.76335, 42.48863], [1.72515, 42.50338], [1.70571, 42.48867], [1.66826, 42.50779], [1.65674, 42.47125], [1.58933, 42.46275], [1.57953, 42.44957], [1.55937, 42.45808], [1.55073, 42.43299], [1.5127, 42.42959], [1.44529, 42.43724], [1.43838, 42.47848], [1.41648, 42.48315], [1.46661, 42.50949], [1.44759, 42.54431], [1.41245, 42.53539], [1.4234, 42.55959], [1.44529, 42.56722], [1.42512, 42.58292], [1.44197, 42.60217], [1.35562, 42.71944], [1.15928, 42.71407], [1.0804, 42.78569], [0.98292, 42.78754], [0.96166, 42.80629], [0.93089, 42.79154], [0.711, 42.86372], [0.66121, 42.84021], [0.65421, 42.75872], [0.67873, 42.69458], [0.40214, 42.69779], [0.36251, 42.72282], [0.29407, 42.67431], [0.25336, 42.7174], [0.17569, 42.73424], [-0.02468, 42.68513], [-0.10519, 42.72761], [-0.16141, 42.79535], [-0.17939, 42.78974], [-0.3122, 42.84788], [-0.38833, 42.80132], [-0.41319, 42.80776], [-0.44334, 42.79939], [-0.50863, 42.82713], [-0.55497, 42.77846], [-0.67637, 42.88303], [-0.69837, 42.87945], [-0.72608, 42.89318], [-0.73422, 42.91228], [-0.72037, 42.92541], [-0.75478, 42.96916], [-0.81652, 42.95166], [-0.97133, 42.96239], [-1.00963, 42.99279], [-1.10333, 43.0059], [-1.22881, 43.05534], [-1.25244, 43.04164], [-1.30531, 43.06859], [-1.30052, 43.09581], [-1.27118, 43.11961], [-1.32209, 43.1127], [-1.34419, 43.09665], [-1.35272, 43.02658], [-1.44067, 43.047], [-1.47555, 43.08372], [-1.41562, 43.12815], [-1.3758, 43.24511], [-1.40942, 43.27272], [-1.45289, 43.27049], [-1.50992, 43.29481], [-1.55963, 43.28828], [-1.57674, 43.25269], [-1.61341, 43.25269], [-1.63052, 43.28591], [-1.62481, 43.30726], [-1.69407, 43.31378], [-1.73074, 43.29481], [-1.7397, 43.32979], [-1.75079, 43.3317], [-1.75334, 43.34107], [-1.77068, 43.34396], [-1.78714, 43.35476], [-1.78332, 43.36399], [-1.79319, 43.37497], [-1.77289, 43.38957], [-1.81005, 43.59738], [-10.14298, 44.17365], [-11.19304, 41.83075], [-8.87157, 41.86488], [-8.81794, 41.90375], [-8.75712, 41.92833], [-8.74606, 41.9469], [-8.7478, 41.96282], [-8.69071, 41.98862], [-8.6681, 41.99703], [-8.65832, 42.02972], [-8.64626, 42.03668], [-8.63791, 42.04691], [-8.59493, 42.05708], [-8.58086, 42.05147], [-8.54563, 42.0537], [-8.5252, 42.06264], [-8.52837, 42.07658], [-8.48185, 42.0811], [-8.44123, 42.08218], [-8.42512, 42.07199], [-8.40143, 42.08052], [-8.38323, 42.07683], [-8.36353, 42.09065], [-8.33912, 42.08358], [-8.32161, 42.10218], [-8.29809, 42.106], [-8.2732, 42.12396], [-8.24681, 42.13993], [-8.22406, 42.1328], [-8.1986, 42.15402], [-8.18947, 42.13853], [-8.19406, 42.12141], [-8.18178, 42.06436], [-8.11729, 42.08537], [-8.08847, 42.05767], [-8.08796, 42.01398], [-8.16232, 41.9828], [-8.2185, 41.91237], [-8.19551, 41.87459], [-8.16944, 41.87944], [-8.16455, 41.81753], [-8.0961, 41.81024], [-8.01136, 41.83453], [-7.9804, 41.87337], [-7.92336, 41.8758], [-7.90707, 41.92432], [-7.88751, 41.92553], [-7.88055, 41.84571], [-7.84188, 41.88065], [-7.69848, 41.90977], [-7.65774, 41.88308], [-7.58603, 41.87944], [-7.62188, 41.83089], [-7.52737, 41.83939], [-7.49803, 41.87095], [-7.45566, 41.86488], [-7.44759, 41.84451], [-7.42854, 41.83262], [-7.42864, 41.80589], [-7.37092, 41.85031], [-7.32366, 41.8406], [-7.18677, 41.88793], [-7.18549, 41.97515], [-7.14115, 41.98855], [-7.08574, 41.97401], [-7.07596, 41.94977], [-7.01078, 41.94977], [-6.98144, 41.9728], [-6.95537, 41.96553], [-6.94396, 41.94403], [-6.82174, 41.94493], [-6.81196, 41.99097], [-6.76959, 41.98734], [-6.75004, 41.94129], [-6.61967, 41.94008], [-6.58544, 41.96674], [-6.5447, 41.94371], [-6.56752, 41.88429], [-6.51374, 41.8758], [-6.56426, 41.74219], [-6.54633, 41.68623], [-6.49907, 41.65823], [-6.44204, 41.68258], [-6.29863, 41.66432], [-6.19128, 41.57638], [-6.26777, 41.48796], [-6.3306, 41.37677], [-6.38553, 41.38655], [-6.38551, 41.35274], [-6.55937, 41.24417], [-6.65046, 41.24725], [-6.68286, 41.21641], [-6.69711, 41.1858], [-6.77319, 41.13049], [-6.75655, 41.10187], [-6.79241, 41.05397], [-6.80942, 41.03629], [-6.84781, 41.02692], [-6.88843, 41.03027], [-6.913, 41.03922], [-6.9357, 41.02888], [-6.8527, 40.93958], [-6.84292, 40.89771], [-6.80707, 40.88047], [-6.79892, 40.84842], [-6.82337, 40.84472], [-6.82826, 40.74603], [-6.79567, 40.65955], [-6.84292, 40.56801], [-6.80218, 40.55067], [-6.7973, 40.51723], [-6.84944, 40.46394], [-6.84618, 40.42177], [-6.78426, 40.36468], [-6.80218, 40.33239], [-6.86085, 40.2976], [-6.86085, 40.26776], [-7.00426, 40.23169], [-7.02544, 40.18564], [-7.00589, 40.12087], [-6.94233, 40.10716], [-6.86737, 40.01986], [-6.91463, 39.86618], [-6.97492, 39.81488], [-7.01613, 39.66877], [-7.24707, 39.66576], [-7.33507, 39.64569], [-7.54121, 39.66717], [-7.49477, 39.58794], [-7.2927, 39.45847], [-7.3149, 39.34857], [-7.23403, 39.27579], [-7.23566, 39.20132], [-7.12811, 39.17101], [-7.14929, 39.11287], [-7.10692, 39.10275], [-7.04011, 39.11919], [-6.97004, 39.07619], [-6.95211, 39.0243], [-7.051, 38.907], [-7.03848, 38.87221], [-7.26174, 38.72107], [-7.265, 38.61674], [-7.32529, 38.44336], [-7.15581, 38.27597], [-7.09389, 38.17227], [-6.93418, 38.21454], [-7.00375, 38.01914], [-7.05966, 38.01966], [-7.10366, 38.04404], [-7.12648, 38.00296], [-7.24544, 37.98884], [-7.27314, 37.90145], [-7.33441, 37.81193], [-7.41981, 37.75729], [-7.51759, 37.56119], [-7.46878, 37.47127], [-7.43974, 37.38913], [-7.43227, 37.25152], [-7.41854, 37.23813], [-7.41133, 37.20314], [-7.39769, 37.16868], [-7.37282, 36.96896], [-7.2725, 35.73269], [-5.10878, 36.05227], [-2.27707, 35.35051], [3.75438, 42.33445]], [[-5.27801, 36.14942], [-5.34064, 36.03744], [-5.40526, 36.15488], [-5.34536, 36.15501], [-5.33822, 36.15272], [-5.27801, 36.14942]]], [[[1.99838, 42.44682], [2.01564, 42.45171], [1.99216, 42.46208], [1.98579, 42.47486], [1.99766, 42.4858], [1.98916, 42.49351], [1.98022, 42.49569], [1.97697, 42.48568], [1.97227, 42.48487], [1.97003, 42.48081], [1.96215, 42.47854], [1.95606, 42.45785], [1.96125, 42.45364], [1.98378, 42.44697], [1.99838, 42.44682]]]]
+         }
+       }, {
+         type: "Feature",
+         properties: {
+           wikidata: "Q98059339",
+           nameEn: "Mainland Norway",
+           country: "NO",
+           groups: ["154", "150", "UN"],
+           callingCodes: ["47"]
+         },
+         geometry: {
+           type: "MultiPolygon",
+           coordinates: [[[[10.40861, 58.38489], [10.64958, 58.89391], [11.08911, 58.98745], [11.15367, 59.07862], [11.34459, 59.11672], [11.4601, 58.99022], [11.45199, 58.89604], [11.65732, 58.90177], [11.8213, 59.24985], [11.69297, 59.59442], [11.92112, 59.69531], [11.87121, 59.86039], [12.15641, 59.8926], [12.36317, 59.99259], [12.52003, 60.13846], [12.59133, 60.50559], [12.2277, 61.02442], [12.69115, 61.06584], [12.86939, 61.35427], [12.57707, 61.56547], [12.40595, 61.57226], [12.14746, 61.7147], [12.29187, 62.25699], [12.07085, 62.6297], [12.19919, 63.00104], [11.98529, 63.27487], [12.19919, 63.47935], [12.14928, 63.59373], [12.74105, 64.02171], [13.23411, 64.09087], [13.98222, 64.00953], [14.16051, 64.18725], [14.11117, 64.46674], [13.64276, 64.58402], [14.50926, 65.31786], [14.53778, 66.12399], [15.05113, 66.15572], [15.49318, 66.28509], [15.37197, 66.48217], [16.35589, 67.06419], [16.39154, 67.21653], [16.09922, 67.4364], [16.12774, 67.52106], [16.38441, 67.52923], [16.7409, 67.91037], [17.30416, 68.11591], [17.90787, 67.96537], [18.13836, 68.20874], [18.1241, 68.53721], [18.39503, 68.58672], [18.63032, 68.50849], [18.97255, 68.52416], [19.93508, 68.35911], [20.22027, 68.48759], [19.95647, 68.55546], [20.22027, 68.67246], [20.33435, 68.80174], [20.28444, 68.93283], [20.0695, 69.04469], [20.55258, 69.06069], [20.72171, 69.11874], [21.05775, 69.0356], [21.11099, 69.10291], [20.98641, 69.18809], [21.00732, 69.22755], [21.27827, 69.31281], [21.63833, 69.27485], [22.27276, 68.89514], [22.38367, 68.71561], [22.53321, 68.74393], [23.13064, 68.64684], [23.68017, 68.70276], [23.781, 68.84514], [24.02299, 68.81601], [24.18432, 68.73936], [24.74898, 68.65143], [24.90023, 68.55579], [24.93048, 68.61102], [25.10189, 68.63307], [25.12206, 68.78684], [25.42455, 68.90328], [25.61613, 68.89602], [25.75729, 68.99383], [25.69679, 69.27039], [25.96904, 69.68397], [26.40261, 69.91377], [26.64461, 69.96565], [27.05802, 69.92069], [27.57226, 70.06215], [27.95542, 70.0965], [27.97558, 69.99671], [28.32849, 69.88605], [28.36883, 69.81658], [29.12697, 69.69193], [29.31664, 69.47994], [28.8629, 69.22395], [28.81248, 69.11997], [28.91738, 69.04774], [29.0444, 69.0119], [29.26623, 69.13794], [29.27631, 69.2811], [29.97205, 69.41623], [30.16363, 69.65244], [30.52662, 69.54699], [30.95011, 69.54699], [30.84095, 69.80584], [31.59909, 70.16571], [32.07813, 72.01005], [-11.60274, 67.73467], [7.28637, 57.35913], [10.40861, 58.38489]]]]
+         }
+       }, {
+         type: "Feature",
+         properties: {
+           wikidata: "Q98543636",
+           nameEn: "Mainland Ecuador",
+           country: "EC",
+           groups: ["005", "419", "019", "UN"],
+           callingCodes: ["593"]
+         },
+         geometry: {
+           type: "MultiPolygon",
+           coordinates: [[[[-84.52388, -3.36941], [-80.30602, -3.39149], [-80.20647, -3.431], [-80.24123, -3.46124], [-80.24586, -3.48677], [-80.23651, -3.48652], [-80.22629, -3.501], [-80.20535, -3.51667], [-80.21642, -3.5888], [-80.19848, -3.59249], [-80.18741, -3.63994], [-80.19926, -3.68894], [-80.13232, -3.90317], [-80.46386, -4.01342], [-80.4822, -4.05477], [-80.45023, -4.20938], [-80.32114, -4.21323], [-80.46386, -4.41516], [-80.39256, -4.48269], [-80.13945, -4.29786], [-79.79722, -4.47558], [-79.59402, -4.46848], [-79.26248, -4.95167], [-79.1162, -4.97774], [-79.01659, -5.01481], [-78.85149, -4.66795], [-78.68394, -4.60754], [-78.34362, -3.38633], [-78.24589, -3.39907], [-78.22642, -3.51113], [-78.14324, -3.47653], [-78.19369, -3.36431], [-77.94147, -3.05454], [-76.6324, -2.58397], [-76.05203, -2.12179], [-75.57429, -1.55961], [-75.3872, -0.9374], [-75.22862, -0.95588], [-75.22862, -0.60048], [-75.53615, -0.19213], [-75.60169, -0.18708], [-75.61997, -0.10012], [-75.40192, -0.17196], [-75.25764, -0.11943], [-75.82927, 0.09578], [-76.23441, 0.42294], [-76.41215, 0.38228], [-76.4094, 0.24015], [-76.89177, 0.24736], [-77.52001, 0.40782], [-77.49984, 0.64476], [-77.67815, 0.73863], [-77.66416, 0.81604], [-77.68613, 0.83029], [-77.7148, 0.85003], [-77.85677, 0.80197], [-78.42749, 1.15389], [-78.87137, 1.47457], [-82.12561, 4.00341], [-84.52388, -3.36941]]]]
+         }
+       }, {
+         type: "Feature",
+         properties: {
+           m49: "001",
+           wikidata: "Q2",
+           nameEn: "World",
+           aliases: ["Earth", "Planet"],
+           level: "world"
+         },
+         geometry: null
+       }, {
+         type: "Feature",
+         properties: {
+           m49: "002",
+           wikidata: "Q15",
+           nameEn: "Africa",
+           level: "region"
+         },
+         geometry: null
+       }, {
+         type: "Feature",
+         properties: {
+           m49: "003",
+           wikidata: "Q49",
+           nameEn: "North America",
+           level: "subregion"
+         },
+         geometry: null
+       }, {
+         type: "Feature",
+         properties: {
+           m49: "005",
+           wikidata: "Q18",
+           nameEn: "South America",
+           level: "intermediateRegion"
+         },
+         geometry: null
+       }, {
+         type: "Feature",
+         properties: {
+           m49: "009",
+           wikidata: "Q538",
+           nameEn: "Oceania",
+           level: "region"
+         },
+         geometry: null
+       }, {
+         type: "Feature",
+         properties: {
+           m49: "011",
+           wikidata: "Q4412",
+           nameEn: "Western Africa",
+           level: "intermediateRegion"
+         },
+         geometry: null
+       }, {
+         type: "Feature",
+         properties: {
+           m49: "013",
+           wikidata: "Q27611",
+           nameEn: "Central America",
+           level: "intermediateRegion"
+         },
+         geometry: null
+       }, {
+         type: "Feature",
+         properties: {
+           m49: "014",
+           wikidata: "Q27407",
+           nameEn: "Eastern Africa",
+           level: "intermediateRegion"
+         },
+         geometry: null
+       }, {
+         type: "Feature",
+         properties: {
+           m49: "015",
+           wikidata: "Q27381",
+           nameEn: "Northern Africa",
+           level: "subregion"
+         },
+         geometry: null
+       }, {
+         type: "Feature",
+         properties: {
+           m49: "017",
+           wikidata: "Q27433",
+           nameEn: "Middle Africa",
+           level: "intermediateRegion"
+         },
+         geometry: null
+       }, {
+         type: "Feature",
+         properties: {
+           m49: "018",
+           wikidata: "Q27394",
+           nameEn: "Southern Africa",
+           level: "intermediateRegion"
+         },
+         geometry: null
+       }, {
+         type: "Feature",
+         properties: {
+           m49: "019",
+           wikidata: "Q828",
+           nameEn: "Americas",
+           level: "region"
+         },
+         geometry: null
+       }, {
+         type: "Feature",
+         properties: {
+           m49: "021",
+           wikidata: "Q2017699",
+           nameEn: "Northern America",
+           level: "subregion"
+         },
+         geometry: null
+       }, {
+         type: "Feature",
+         properties: {
+           m49: "029",
+           wikidata: "Q664609",
+           nameEn: "Caribbean",
+           level: "intermediateRegion"
+         },
+         geometry: null
+       }, {
+         type: "Feature",
+         properties: {
+           m49: "030",
+           wikidata: "Q27231",
+           nameEn: "Eastern Asia",
+           level: "subregion"
+         },
+         geometry: null
+       }, {
+         type: "Feature",
+         properties: {
+           m49: "034",
+           wikidata: "Q771405",
+           nameEn: "Southern Asia",
+           level: "subregion"
+         },
+         geometry: null
+       }, {
+         type: "Feature",
+         properties: {
+           m49: "035",
+           wikidata: "Q11708",
+           nameEn: "South-eastern Asia",
+           level: "subregion"
+         },
+         geometry: null
+       }, {
+         type: "Feature",
+         properties: {
+           m49: "039",
+           wikidata: "Q27449",
+           nameEn: "Southern Europe",
+           level: "subregion"
+         },
+         geometry: null
+       }, {
+         type: "Feature",
+         properties: {
+           m49: "053",
+           wikidata: "Q45256",
+           nameEn: "Australia and New Zealand",
+           aliases: ["Australasia"],
+           level: "subregion"
+         },
+         geometry: null
+       }, {
+         type: "Feature",
+         properties: {
+           m49: "054",
+           wikidata: "Q37394",
+           nameEn: "Melanesia",
+           level: "subregion"
+         },
+         geometry: null
+       }, {
+         type: "Feature",
+         properties: {
+           m49: "057",
+           wikidata: "Q3359409",
+           nameEn: "Micronesia",
+           level: "subregion"
+         },
+         geometry: null
+       }, {
+         type: "Feature",
+         properties: {
+           m49: "061",
+           wikidata: "Q35942",
+           nameEn: "Polynesia",
+           level: "subregion"
+         },
+         geometry: null
+       }, {
+         type: "Feature",
+         properties: {
+           m49: "142",
+           wikidata: "Q48",
+           nameEn: "Asia",
+           level: "region"
+         },
+         geometry: null
+       }, {
+         type: "Feature",
+         properties: {
+           m49: "143",
+           wikidata: "Q27275",
+           nameEn: "Central Asia",
+           level: "subregion"
+         },
+         geometry: null
+       }, {
+         type: "Feature",
+         properties: {
+           m49: "145",
+           wikidata: "Q27293",
+           nameEn: "Western Asia",
+           level: "subregion"
+         },
+         geometry: null
+       }, {
+         type: "Feature",
+         properties: {
+           m49: "150",
+           wikidata: "Q46",
+           nameEn: "Europe",
+           level: "region"
+         },
+         geometry: null
+       }, {
+         type: "Feature",
+         properties: {
+           m49: "151",
+           wikidata: "Q27468",
+           nameEn: "Eastern Europe",
+           level: "subregion"
+         },
+         geometry: null
+       }, {
+         type: "Feature",
+         properties: {
+           m49: "154",
+           wikidata: "Q27479",
+           nameEn: "Northern Europe",
+           level: "subregion"
+         },
+         geometry: null
+       }, {
+         type: "Feature",
+         properties: {
+           m49: "155",
+           wikidata: "Q27496",
+           nameEn: "Western Europe",
+           level: "subregion"
+         },
+         geometry: null
+       }, {
+         type: "Feature",
+         properties: {
+           m49: "202",
+           wikidata: "Q132959",
+           nameEn: "Sub-Saharan Africa",
+           level: "subregion"
+         },
+         geometry: null
+       }, {
+         type: "Feature",
+         properties: {
+           m49: "419",
+           wikidata: "Q72829598",
+           nameEn: "Latin America and the Caribbean",
+           level: "subregion"
+         },
+         geometry: null
+       }, {
+         type: "Feature",
+         properties: {
+           m49: "680",
+           wikidata: "Q3405693",
+           nameEn: "Sark",
+           country: "GB",
+           groups: ["GG", "830", "Q185086", "154", "150", "UN"],
+           level: "subterritory",
+           driveSide: "left",
+           roadSpeedUnit: "mph",
+           roadHeightUnit: "ft",
+           callingCodes: ["44 01481"]
+         },
+         geometry: {
+           type: "MultiPolygon",
+           coordinates: [[[[-2.36485, 49.48223], [-2.65349, 49.15373], [-2.09454, 49.46288], [-2.36485, 49.48223]]]]
+         }
+       }, {
+         type: "Feature",
+         properties: {
+           m49: "830",
+           wikidata: "Q42314",
+           nameEn: "Channel Islands",
+           level: "intermediateRegion"
+         },
+         geometry: null
+       }, {
+         type: "Feature",
+         properties: {
+           iso1A2: "AC",
+           iso1A3: "ASC",
+           wikidata: "Q46197",
+           nameEn: "Ascension Island",
+           aliases: ["SH-AC"],
+           country: "GB",
+           groups: ["SH", "BOTS", "011", "202", "002", "UN"],
+           isoStatus: "excRes",
+           driveSide: "left",
+           roadSpeedUnit: "mph",
+           roadHeightUnit: "ft",
+           callingCodes: ["247"]
+         },
+         geometry: {
+           type: "MultiPolygon",
+           coordinates: [[[[-14.82771, -8.70814], [-13.33271, -8.07391], [-14.91926, -6.63386], [-14.82771, -8.70814]]]]
+         }
+       }, {
+         type: "Feature",
+         properties: {
+           iso1A2: "AD",
+           iso1A3: "AND",
+           iso1N3: "020",
+           wikidata: "Q228",
+           nameEn: "Andorra",
+           groups: ["Q12837", "039", "150", "UN"],
+           callingCodes: ["376"]
+         },
+         geometry: {
+           type: "MultiPolygon",
+           coordinates: [[[[1.72515, 42.50338], [1.73683, 42.55492], [1.7858, 42.57698], [1.72588, 42.59098], [1.73452, 42.61515], [1.68267, 42.62533], [1.6625, 42.61982], [1.63485, 42.62957], [1.60085, 42.62703], [1.55418, 42.65669], [1.50867, 42.64483], [1.48043, 42.65203], [1.46718, 42.63296], [1.47986, 42.61346], [1.44197, 42.60217], [1.42512, 42.58292], [1.44529, 42.56722], [1.4234, 42.55959], [1.41245, 42.53539], [1.44759, 42.54431], [1.46661, 42.50949], [1.41648, 42.48315], [1.43838, 42.47848], [1.44529, 42.43724], [1.5127, 42.42959], [1.55073, 42.43299], [1.55937, 42.45808], [1.57953, 42.44957], [1.58933, 42.46275], [1.65674, 42.47125], [1.66826, 42.50779], [1.70571, 42.48867], [1.72515, 42.50338]]]]
+         }
+       }, {
+         type: "Feature",
+         properties: {
+           iso1A2: "AE",
+           iso1A3: "ARE",
+           iso1N3: "784",
+           wikidata: "Q878",
+           nameEn: "United Arab Emirates",
+           groups: ["145", "142", "UN"],
+           callingCodes: ["971"]
+         },
+         geometry: {
+           type: "MultiPolygon",
+           coordinates: [[[[56.26534, 25.62825], [56.25341, 25.61443], [56.26636, 25.60643], [56.25365, 25.60211], [56.20473, 25.61119], [56.18363, 25.65508], [56.14826, 25.66351], [56.13579, 25.73524], [56.17416, 25.77239], [56.13963, 25.82765], [56.19334, 25.9795], [56.15498, 26.06828], [56.08666, 26.05038], [55.81777, 26.18798], [55.14145, 25.62624], [53.97892, 24.64436], [52.82259, 25.51697], [52.35509, 25.00368], [52.02277, 24.75635], [51.83108, 24.71675], [51.58834, 24.66608], [51.41644, 24.39615], [51.58871, 24.27256], [51.59617, 24.12041], [52.56622, 22.94341], [55.13599, 22.63334], [55.2137, 22.71065], [55.22634, 23.10378], [55.57358, 23.669], [55.48677, 23.94946], [55.73301, 24.05994], [55.8308, 24.01633], [56.01799, 24.07426], [55.95472, 24.2172], [55.83367, 24.20193], [55.77658, 24.23476], [55.76558, 24.23227], [55.75257, 24.23466], [55.75382, 24.2466], [55.75939, 24.26114], [55.76781, 24.26209], [55.79145, 24.27914], [55.80747, 24.31069], [55.83395, 24.32776], [55.83271, 24.41521], [55.76461, 24.5287], [55.83271, 24.68567], [55.83408, 24.77858], [55.81348, 24.80102], [55.81116, 24.9116], [55.85094, 24.96858], [55.90849, 24.96771], [55.96316, 25.00857], [56.05715, 24.95727], [56.05106, 24.87461], [55.97467, 24.89639], [55.97836, 24.87673], [56.03535, 24.81161], [56.06128, 24.74457], [56.13684, 24.73699], [56.20062, 24.78565], [56.20568, 24.85063], [56.30269, 24.88334], [56.34873, 24.93205], [56.3227, 24.97284], [56.86325, 25.03856], [56.82555, 25.7713], [56.26534, 25.62825]], [[56.26062, 25.33108], [56.3005, 25.31815], [56.3111, 25.30107], [56.35172, 25.30681], [56.34438, 25.26653], [56.27628, 25.23404], [56.24341, 25.22867], [56.20872, 25.24104], [56.20838, 25.25668], [56.24465, 25.27505], [56.25008, 25.28843], [56.23362, 25.31253], [56.26062, 25.33108]]], [[[56.28423, 25.26344], [56.29379, 25.2754], [56.28102, 25.28486], [56.2716, 25.27916], [56.27086, 25.26128], [56.28423, 25.26344]]]]
+         }
+       }, {
+         type: "Feature",
+         properties: {
+           iso1A2: "AF",
+           iso1A3: "AFG",
+           iso1N3: "004",
+           wikidata: "Q889",
+           nameEn: "Afghanistan",
+           groups: ["034", "142", "UN"],
+           callingCodes: ["93"]
+         },
+         geometry: {
+           type: "MultiPolygon",
+           coordinates: [[[[70.61526, 38.34774], [70.60407, 38.28046], [70.54673, 38.24541], [70.4898, 38.12546], [70.17206, 37.93276], [70.1863, 37.84296], [70.27694, 37.81258], [70.28243, 37.66706], [70.15015, 37.52519], [69.95971, 37.5659], [69.93362, 37.61378], [69.84435, 37.60616], [69.80041, 37.5746], [69.51888, 37.5844], [69.44954, 37.4869], [69.36645, 37.40462], [69.45022, 37.23315], [69.39529, 37.16752], [69.25152, 37.09426], [69.03274, 37.25174], [68.96407, 37.32603], [68.88168, 37.33368], [68.91189, 37.26704], [68.80889, 37.32494], [68.81438, 37.23862], [68.6798, 37.27906], [68.61851, 37.19815], [68.41888, 37.13906], [68.41201, 37.10402], [68.29253, 37.10621], [68.27605, 37.00977], [68.18542, 37.02074], [68.02194, 36.91923], [67.87917, 37.0591], [67.7803, 37.08978], [67.78329, 37.1834], [67.51868, 37.26102], [67.2581, 37.17216], [67.2224, 37.24545], [67.13039, 37.27168], [67.08232, 37.35469], [66.95598, 37.40162], [66.64699, 37.32958], [66.55743, 37.35409], [66.30993, 37.32409], [65.72274, 37.55438], [65.64137, 37.45061], [65.64263, 37.34388], [65.51778, 37.23881], [64.97945, 37.21913], [64.61141, 36.6351], [64.62514, 36.44311], [64.57295, 36.34362], [64.43288, 36.24401], [64.05385, 36.10433], [63.98519, 36.03773], [63.56496, 35.95106], [63.53475, 35.90881], [63.29579, 35.85985], [63.12276, 35.86208], [63.10318, 35.81782], [63.23262, 35.67487], [63.10079, 35.63024], [63.12276, 35.53196], [63.0898, 35.43131], [62.90853, 35.37086], [62.74098, 35.25432], [62.62288, 35.22067], [62.48006, 35.28796], [62.29878, 35.13312], [62.29191, 35.25964], [62.15871, 35.33278], [62.05709, 35.43803], [61.97743, 35.4604], [61.77693, 35.41341], [61.58742, 35.43803], [61.27371, 35.61482], [61.18187, 35.30249], [61.0991, 35.27845], [61.12831, 35.09938], [61.06926, 34.82139], [61.00197, 34.70631], [60.99922, 34.63064], [60.72316, 34.52857], [60.91321, 34.30411], [60.66502, 34.31539], [60.50209, 34.13992], [60.5838, 33.80793], [60.5485, 33.73422], [60.57762, 33.59772], [60.69573, 33.56054], [60.91133, 33.55596], [60.88908, 33.50219], [60.56485, 33.12944], [60.86191, 32.22565], [60.84541, 31.49561], [61.70929, 31.37391], [61.80569, 31.16167], [61.80957, 31.12576], [61.83257, 31.0452], [61.8335, 30.97669], [61.78268, 30.92724], [61.80829, 30.84224], [60.87231, 29.86514], [62.47751, 29.40782], [63.5876, 29.50456], [64.12966, 29.39157], [64.19796, 29.50407], [64.62116, 29.58903], [65.04005, 29.53957], [66.24175, 29.85181], [66.36042, 29.9583], [66.23609, 30.06321], [66.34869, 30.404], [66.28413, 30.57001], [66.39194, 30.9408], [66.42645, 30.95309], [66.58175, 30.97532], [66.68166, 31.07597], [66.72561, 31.20526], [66.83273, 31.26867], [67.04147, 31.31561], [67.03323, 31.24519], [67.29964, 31.19586], [67.78854, 31.33203], [67.7748, 31.4188], [67.62374, 31.40473], [67.58323, 31.52772], [67.72056, 31.52304], [67.86887, 31.63536], [68.00071, 31.6564], [68.1655, 31.82691], [68.25614, 31.80357], [68.27605, 31.75863], [68.44222, 31.76446], [68.57475, 31.83158], [68.6956, 31.75687], [68.79997, 31.61665], [68.91078, 31.59687], [68.95995, 31.64822], [69.00939, 31.62249], [69.11514, 31.70782], [69.20577, 31.85957], [69.3225, 31.93186], [69.27032, 32.14141], [69.27932, 32.29119], [69.23599, 32.45946], [69.2868, 32.53938], [69.38155, 32.56601], [69.44747, 32.6678], [69.43649, 32.7302], [69.38018, 32.76601], [69.47082, 32.85834], [69.5436, 32.8768], [69.49854, 32.88843], [69.49004, 33.01509], [69.57656, 33.09911], [69.71526, 33.09911], [69.79766, 33.13247], [69.85259, 33.09451], [70.02563, 33.14282], [70.07369, 33.22557], [70.13686, 33.21064], [70.32775, 33.34496], [70.17062, 33.53535], [70.20141, 33.64387], [70.14785, 33.6553], [70.14236, 33.71701], [70.00503, 33.73528], [69.85671, 33.93719], [69.87307, 33.9689], [69.90203, 34.04194], [70.54336, 33.9463], [70.88119, 33.97933], [71.07345, 34.06242], [71.06933, 34.10564], [71.09307, 34.11961], [71.09453, 34.13524], [71.13078, 34.16503], [71.12815, 34.26619], [71.17662, 34.36769], [71.02401, 34.44835], [71.0089, 34.54568], [71.11602, 34.63047], [71.08718, 34.69034], [71.28356, 34.80882], [71.29472, 34.87728], [71.50329, 34.97328], [71.49917, 35.00478], [71.55273, 35.02615], [71.52938, 35.09023], [71.67495, 35.21262], [71.5541, 35.28776], [71.54294, 35.31037], [71.65435, 35.4479], [71.49917, 35.6267], [71.55273, 35.71483], [71.37969, 35.95865], [71.19505, 36.04134], [71.60491, 36.39429], [71.80267, 36.49924], [72.18135, 36.71838], [72.6323, 36.84601], [73.82685, 36.91421], [74.04856, 36.82648], [74.43389, 37.00977], [74.53739, 36.96224], [74.56453, 37.03023], [74.49981, 37.24518], [74.80605, 37.21565], [74.88887, 37.23275], [74.8294, 37.3435], [74.68383, 37.3948], [74.56161, 37.37734], [74.41055, 37.3948], [74.23339, 37.41116], [74.20308, 37.34208], [73.8564, 37.26158], [73.82552, 37.22659], [73.64974, 37.23643], [73.61129, 37.27469], [73.76647, 37.33913], [73.77197, 37.4417], [73.29633, 37.46495], [73.06884, 37.31729], [72.79693, 37.22222], [72.66381, 37.02014], [72.54095, 37.00007], [72.31676, 36.98115], [71.83229, 36.68084], [71.67083, 36.67346], [71.57195, 36.74943], [71.51502, 36.89128], [71.48481, 36.93218], [71.46923, 36.99925], [71.45578, 37.03094], [71.43097, 37.05855], [71.44127, 37.11856], [71.4494, 37.18137], [71.4555, 37.21418], [71.47386, 37.2269], [71.48339, 37.23937], [71.4824, 37.24921], [71.48536, 37.26017], [71.50674, 37.31502], [71.49821, 37.31975], [71.4862, 37.33405], [71.47685, 37.40281], [71.49612, 37.4279], [71.5256, 37.47971], [71.50616, 37.50733], [71.49693, 37.53527], [71.5065, 37.60912], [71.51972, 37.61945], [71.54186, 37.69691], [71.55234, 37.73209], [71.53053, 37.76534], [71.54324, 37.77104], [71.55752, 37.78677], [71.59255, 37.79956], [71.58843, 37.92425], [71.51565, 37.95349], [71.32871, 37.88564], [71.296, 37.93403], [71.2809, 37.91995], [71.24969, 37.93031], [71.27278, 37.96496], [71.27622, 37.99946], [71.28922, 38.01272], [71.29878, 38.04429], [71.36444, 38.15358], [71.37803, 38.25641], [71.33869, 38.27335], [71.33114, 38.30339], [71.21291, 38.32797], [71.1451, 38.40106], [71.10957, 38.40671], [71.10592, 38.42077], [71.09542, 38.42517], [71.0556, 38.40176], [71.03545, 38.44779], [70.98693, 38.48862], [70.92728, 38.43021], [70.88719, 38.46826], [70.84376, 38.44688], [70.82538, 38.45394], [70.81697, 38.44507], [70.80521, 38.44447], [70.79766, 38.44944], [70.78702, 38.45031], [70.78581, 38.45502], [70.77132, 38.45548], [70.75455, 38.4252], [70.72485, 38.4131], [70.69807, 38.41861], [70.67438, 38.40597], [70.6761, 38.39144], [70.69189, 38.37031], [70.64966, 38.34999], [70.61526, 38.34774]]]]
+         }
+       }, {
+         type: "Feature",
+         properties: {
+           iso1A2: "AG",
+           iso1A3: "ATG",
+           iso1N3: "028",
+           wikidata: "Q781",
+           nameEn: "Antigua and Barbuda",
+           groups: ["029", "003", "419", "019", "UN"],
+           driveSide: "left",
+           roadSpeedUnit: "mph",
+           callingCodes: ["1 268"]
+         },
+         geometry: {
+           type: "MultiPolygon",
+           coordinates: [[[[-61.66959, 18.6782], [-62.58307, 16.68909], [-62.1023, 16.97277], [-61.23098, 16.62484], [-61.66959, 18.6782]]]]
+         }
+       }, {
+         type: "Feature",
+         properties: {
+           iso1A2: "AI",
+           iso1A3: "AIA",
+           iso1N3: "660",
+           wikidata: "Q25228",
+           nameEn: "Anguilla",
+           country: "GB",
+           groups: ["BOTS", "029", "003", "419", "019", "UN"],
+           driveSide: "left",
+           roadSpeedUnit: "mph",
+           callingCodes: ["1 264"]
+         },
+         geometry: {
+           type: "MultiPolygon",
+           coordinates: [[[[-63.79029, 19.11219], [-63.35989, 18.06012], [-62.62718, 18.26185], [-63.79029, 19.11219]]]]
+         }
+       }, {
+         type: "Feature",
+         properties: {
+           iso1A2: "AL",
+           iso1A3: "ALB",
+           iso1N3: "008",
+           wikidata: "Q222",
+           nameEn: "Albania",
+           groups: ["039", "150", "UN"],
+           callingCodes: ["355"]
+         },
+         geometry: {
+           type: "MultiPolygon",
+           coordinates: [[[[20.07761, 42.55582], [20.01834, 42.54622], [20.00842, 42.5109], [19.9324, 42.51699], [19.82333, 42.46581], [19.76549, 42.50237], [19.74731, 42.57422], [19.77375, 42.58517], [19.73244, 42.66299], [19.65972, 42.62774], [19.4836, 42.40831], [19.42352, 42.36546], [19.42, 42.33019], [19.28623, 42.17745], [19.40687, 42.10024], [19.37548, 42.06835], [19.36867, 42.02564], [19.37691, 41.96977], [19.34601, 41.95675], [19.33812, 41.90669], [19.37451, 41.8842], [19.37597, 41.84849], [19.26406, 41.74971], [19.0384, 40.35325], [19.95905, 39.82857], [19.97622, 39.78684], [19.92466, 39.69533], [19.98042, 39.6504], [20.00957, 39.69227], [20.05189, 39.69112], [20.12956, 39.65805], [20.15988, 39.652], [20.22376, 39.64532], [20.22707, 39.67459], [20.27412, 39.69884], [20.31961, 39.72799], [20.29152, 39.80421], [20.30804, 39.81563], [20.38572, 39.78516], [20.41475, 39.81437], [20.41546, 39.82832], [20.31135, 39.99438], [20.37911, 39.99058], [20.42373, 40.06777], [20.48487, 40.06271], [20.51297, 40.08168], [20.55593, 40.06524], [20.61081, 40.07866], [20.62566, 40.0897], [20.67162, 40.09433], [20.71789, 40.27739], [20.78234, 40.35803], [20.7906, 40.42726], [20.83688, 40.47882], [20.94925, 40.46625], [20.96908, 40.51526], [21.03932, 40.56299], [21.05833, 40.66586], [20.98134, 40.76046], [20.95752, 40.76982], [20.98396, 40.79109], [20.97887, 40.85475], [20.97693, 40.90103], [20.94305, 40.92399], [20.83671, 40.92752], [20.81567, 40.89662], [20.73504, 40.9081], [20.71634, 40.91781], [20.65558, 41.08009], [20.63454, 41.0889], [20.59832, 41.09066], [20.58546, 41.11179], [20.59715, 41.13644], [20.51068, 41.2323], [20.49432, 41.33679], [20.52119, 41.34381], [20.55976, 41.4087], [20.51301, 41.442], [20.49039, 41.49277], [20.45331, 41.51436], [20.45809, 41.5549], [20.52103, 41.56473], [20.55508, 41.58113], [20.51769, 41.65975], [20.52937, 41.69292], [20.51301, 41.72433], [20.53405, 41.78099], [20.57144, 41.7897], [20.55976, 41.87068], [20.59524, 41.8818], [20.57946, 41.91593], [20.63069, 41.94913], [20.59434, 42.03879], [20.55633, 42.08173], [20.56955, 42.12097], [20.48857, 42.25444], [20.3819, 42.3029], [20.34479, 42.32656], [20.24399, 42.32168], [20.21797, 42.41237], [20.17127, 42.50469], [20.07761, 42.55582]]]]
+         }
+       }, {
+         type: "Feature",
+         properties: {
+           iso1A2: "AM",
+           iso1A3: "ARM",
+           iso1N3: "051",
+           wikidata: "Q399",
+           nameEn: "Armenia",
+           groups: ["145", "142", "UN"],
+           callingCodes: ["374"]
+         },
+         geometry: {
+           type: "MultiPolygon",
+           coordinates: [[[[45.0133, 41.29747], [44.93493, 41.25685], [44.81437, 41.30371], [44.80053, 41.25949], [44.81749, 41.23488], [44.84358, 41.23088], [44.89911, 41.21366], [44.87887, 41.20195], [44.82084, 41.21513], [44.72814, 41.20338], [44.61462, 41.24018], [44.59322, 41.1933], [44.46791, 41.18204], [44.34417, 41.2382], [44.34337, 41.20312], [44.32139, 41.2079], [44.18148, 41.24644], [44.16591, 41.19141], [43.84835, 41.16329], [43.74717, 41.1117], [43.67712, 41.13398], [43.4717, 41.12611], [43.44984, 41.0988], [43.47319, 41.02251], [43.58683, 40.98961], [43.67712, 40.93084], [43.67712, 40.84846], [43.74872, 40.7365], [43.7425, 40.66805], [43.63664, 40.54159], [43.54791, 40.47413], [43.60862, 40.43267], [43.59928, 40.34019], [43.71136, 40.16673], [43.65221, 40.14889], [43.65688, 40.11199], [43.92307, 40.01787], [44.1057, 40.03555], [44.1778, 40.02845], [44.26973, 40.04866], [44.46635, 39.97733], [44.61845, 39.8281], [44.75779, 39.7148], [44.88354, 39.74432], [44.92869, 39.72157], [45.06604, 39.79277], [45.18554, 39.67846], [45.17464, 39.58614], [45.21784, 39.58074], [45.23535, 39.61373], [45.30385, 39.61373], [45.29606, 39.57654], [45.46992, 39.49888], [45.70547, 39.60174], [45.80804, 39.56716], [45.83, 39.46487], [45.79225, 39.3695], [45.99774, 39.28931], [46.02303, 39.09978], [46.06973, 39.0744], [46.14785, 38.84206], [46.20601, 38.85262], [46.34059, 38.92076], [46.53497, 38.86548], [46.51805, 38.94982], [46.54296, 39.07078], [46.44022, 39.19636], [46.52584, 39.18912], [46.54141, 39.15895], [46.58032, 39.21204], [46.63481, 39.23013], [46.56476, 39.24942], [46.50093, 39.33736], [46.43244, 39.35181], [46.37795, 39.42039], [46.4013, 39.45405], [46.53051, 39.47809], [46.51027, 39.52373], [46.57721, 39.54414], [46.57098, 39.56694], [46.52117, 39.58734], [46.42465, 39.57534], [46.40286, 39.63651], [46.18493, 39.60533], [45.96543, 39.78859], [45.82533, 39.82925], [45.7833, 39.9475], [45.60895, 39.97733], [45.59806, 40.0131], [45.78642, 40.03218], [45.83779, 39.98925], [45.97944, 40.181], [45.95609, 40.27846], [45.65098, 40.37696], [45.42994, 40.53804], [45.45484, 40.57707], [45.35366, 40.65979], [45.4206, 40.7424], [45.55914, 40.78366], [45.60584, 40.87436], [45.40814, 40.97904], [45.44083, 41.01663], [45.39725, 41.02603], [45.35677, 40.99784], [45.28859, 41.03757], [45.26162, 41.0228], [45.25897, 41.0027], [45.1994, 41.04518], [45.16493, 41.05068], [45.1634, 41.08082], [45.1313, 41.09369], [45.12923, 41.06059], [45.06784, 41.05379], [45.08028, 41.10917], [45.19942, 41.13299], [45.1969, 41.168], [45.11811, 41.19967], [45.05201, 41.19211], [45.02932, 41.2101], [45.05497, 41.2464], [45.0133, 41.29747]], [[45.21324, 40.9817], [45.21219, 40.99001], [45.20518, 40.99348], [45.19312, 40.98998], [45.18382, 41.0066], [45.20625, 41.01484], [45.23487, 41.00226], [45.23095, 40.97828], [45.21324, 40.9817]], [[45.00864, 41.03411], [44.9903, 41.05657], [44.96031, 41.06345], [44.95383, 41.07553], [44.97169, 41.09176], [45.00864, 41.09407], [45.03406, 41.07931], [45.04517, 41.06653], [45.03792, 41.03938], [45.00864, 41.03411]]], [[[45.50279, 40.58424], [45.56071, 40.64765], [45.51825, 40.67382], [45.47927, 40.65023], [45.50279, 40.58424]]]]
+         }
+       }, {
+         type: "Feature",
+         properties: {
+           iso1A2: "AO",
+           iso1A3: "AGO",
+           iso1N3: "024",
+           wikidata: "Q916",
+           nameEn: "Angola",
+           groups: ["017", "202", "002", "UN"],
+           callingCodes: ["244"]
+         },
+         geometry: {
+           type: "MultiPolygon",
+           coordinates: [[[[16.55507, -5.85631], [13.04371, -5.87078], [12.42245, -6.07585], [11.95767, -5.94705], [12.20376, -5.76338], [12.26557, -5.74031], [12.52318, -5.74353], [12.52301, -5.17481], [12.53599, -5.1618], [12.53586, -5.14658], [12.51589, -5.1332], [12.49815, -5.14058], [12.46297, -5.09408], [12.60251, -5.01715], [12.63465, -4.94632], [12.70868, -4.95505], [12.8733, -4.74346], [13.11195, -4.67745], [13.09648, -4.63739], [12.91489, -4.47907], [12.87096, -4.40315], [12.76844, -4.38709], [12.64835, -4.55937], [12.40964, -4.60609], [12.32324, -4.78415], [12.25587, -4.79437], [12.20901, -4.75642], [12.16068, -4.90089], [12.00924, -5.02627], [11.50888, -5.33417], [10.5065, -17.25284], [11.75063, -17.25013], [12.07076, -17.15165], [12.52111, -17.24495], [12.97145, -16.98567], [13.36212, -16.98048], [13.95896, -17.43141], [14.28743, -17.38814], [18.39229, -17.38927], [18.84226, -17.80375], [21.14283, -17.94318], [21.42741, -18.02787], [23.47474, -17.62877], [23.20038, -17.47563], [22.17217, -16.50269], [22.00323, -16.18028], [21.97988, -13.00148], [24.03339, -12.99091], [23.90937, -12.844], [24.06672, -12.29058], [23.98804, -12.13149], [24.02603, -11.15368], [24.00027, -10.89356], [23.86868, -11.02856], [23.45631, -10.946], [23.16602, -11.10577], [22.54205, -11.05784], [22.25951, -11.24911], [22.17954, -10.85884], [22.32604, -10.76291], [22.19039, -9.94628], [21.84856, -9.59871], [21.79824, -7.29628], [20.56263, -7.28566], [20.61689, -6.90876], [20.31846, -6.91953], [20.30218, -6.98955], [19.5469, -7.00195], [19.33698, -7.99743], [18.33635, -8.00126], [17.5828, -8.13784], [16.96282, -7.21787], [16.55507, -5.85631]]]]
+         }
+       }, {
+         type: "Feature",
+         properties: {
+           iso1A2: "AQ",
+           iso1A3: "ATA",
+           iso1N3: "010",
+           wikidata: "Q51",
+           nameEn: "Antarctica",
+           level: "region",
+           callingCodes: ["672"]
+         },
+         geometry: {
+           type: "MultiPolygon",
+           coordinates: [[[[180, -60], [-180, -60], [-180, -90], [180, -90], [180, -60]]]]
+         }
+       }, {
+         type: "Feature",
+         properties: {
+           iso1A2: "AR",
+           iso1A3: "ARG",
+           iso1N3: "032",
+           wikidata: "Q414",
+           nameEn: "Argentina",
+           aliases: ["RA"],
+           groups: ["005", "419", "019", "UN"],
+           callingCodes: ["54"]
+         },
+         geometry: {
+           type: "MultiPolygon",
+           coordinates: [[[[-72.31343, -50.58411], [-72.33873, -51.59954], [-71.99889, -51.98018], [-69.97824, -52.00845], [-68.41683, -52.33516], [-68.60702, -52.65781], [-68.60733, -54.9125], [-68.01394, -54.8753], [-67.46182, -54.92205], [-67.11046, -54.94199], [-66.07313, -55.19618], [-63.67376, -55.11859], [-54.78916, -36.21945], [-57.83001, -34.69099], [-58.34425, -34.15035], [-58.44442, -33.84033], [-58.40475, -33.11777], [-58.1224, -32.98842], [-58.22362, -32.52416], [-58.10036, -32.25338], [-58.20252, -31.86966], [-58.00076, -31.65016], [-58.0023, -31.53084], [-58.07569, -31.44916], [-57.98127, -31.3872], [-57.9908, -31.34924], [-57.86729, -31.06352], [-57.89476, -30.95994], [-57.8024, -30.77193], [-57.89115, -30.49572], [-57.64859, -30.35095], [-57.61478, -30.25165], [-57.65132, -30.19229], [-57.09386, -29.74211], [-56.81251, -29.48154], [-56.62789, -29.18073], [-56.57295, -29.11357], [-56.54171, -29.11447], [-56.05265, -28.62651], [-56.00458, -28.60421], [-56.01729, -28.51223], [-55.65418, -28.18304], [-55.6262, -28.17124], [-55.33303, -27.94661], [-55.16872, -27.86224], [-55.1349, -27.89759], [-54.90805, -27.73149], [-54.90159, -27.63132], [-54.67657, -27.57214], [-54.50416, -27.48232], [-54.41888, -27.40882], [-54.19268, -27.30751], [-54.19062, -27.27639], [-54.15978, -27.2889], [-53.80144, -27.09844], [-53.73372, -26.6131], [-53.68269, -26.33359], [-53.64505, -26.28089], [-53.64186, -26.25976], [-53.64632, -26.24798], [-53.63881, -26.25075], [-53.63739, -26.2496], [-53.65237, -26.23289], [-53.65018, -26.19501], [-53.73968, -26.10012], [-53.73391, -26.07006], [-53.7264, -26.0664], [-53.73086, -26.05842], [-53.73511, -26.04211], [-53.83691, -25.94849], [-53.90831, -25.55513], [-54.52926, -25.62846], [-54.5502, -25.58915], [-54.59398, -25.59224], [-54.62063, -25.91213], [-54.60664, -25.9691], [-54.67359, -25.98607], [-54.69333, -26.37705], [-54.70732, -26.45099], [-54.80868, -26.55669], [-55.00584, -26.78754], [-55.06351, -26.80195], [-55.16948, -26.96068], [-55.25243, -26.93808], [-55.39611, -26.97679], [-55.62322, -27.1941], [-55.59094, -27.32444], [-55.74475, -27.44485], [-55.89195, -27.3467], [-56.18313, -27.29851], [-56.85337, -27.5165], [-58.04205, -27.2387], [-58.59549, -27.29973], [-58.65321, -27.14028], [-58.3198, -26.83443], [-58.1188, -26.16704], [-57.87176, -25.93604], [-57.57431, -25.47269], [-57.80821, -25.13863], [-58.25492, -24.92528], [-58.33055, -24.97099], [-59.33886, -24.49935], [-59.45482, -24.34787], [-60.03367, -24.00701], [-60.28163, -24.04436], [-60.99754, -23.80934], [-61.0782, -23.62932], [-61.9756, -23.0507], [-62.22768, -22.55807], [-62.51761, -22.37684], [-62.64455, -22.25091], [-62.8078, -22.12534], [-62.81124, -21.9987], [-63.66482, -21.99918], [-63.68113, -22.0544], [-63.70963, -21.99934], [-63.93287, -21.99934], [-64.22918, -22.55807], [-64.31489, -22.88824], [-64.35108, -22.73282], [-64.4176, -22.67692], [-64.58888, -22.25035], [-64.67174, -22.18957], [-64.90014, -22.12136], [-64.99524, -22.08255], [-65.47435, -22.08908], [-65.57743, -22.07675], [-65.58694, -22.09794], [-65.61166, -22.09504], [-65.7467, -22.10105], [-65.9261, -21.93335], [-66.04832, -21.9187], [-66.03836, -21.84829], [-66.24077, -21.77837], [-66.29714, -22.08741], [-66.7298, -22.23644], [-67.18382, -22.81525], [-66.99632, -22.99839], [-67.33563, -24.04237], [-68.24825, -24.42596], [-68.56909, -24.69831], [-68.38372, -25.08636], [-68.57622, -25.32505], [-68.38372, -26.15353], [-68.56909, -26.28146], [-68.59048, -26.49861], [-68.27677, -26.90626], [-68.43363, -27.08414], [-68.77586, -27.16029], [-69.22504, -27.95042], [-69.66709, -28.44055], [-69.80969, -29.07185], [-69.99507, -29.28351], [-69.8596, -30.26131], [-70.14479, -30.36595], [-70.55832, -31.51559], [-69.88099, -33.34489], [-69.87386, -34.13344], [-70.49416, -35.24145], [-70.38008, -36.02375], [-70.95047, -36.4321], [-71.24279, -37.20264], [-70.89532, -38.6923], [-71.37826, -38.91474], [-71.92726, -40.72714], [-71.74901, -42.11711], [-72.15541, -42.15941], [-72.14828, -42.85321], [-71.64206, -43.64774], [-71.81318, -44.38097], [-71.16436, -44.46244], [-71.26418, -44.75684], [-72.06985, -44.81756], [-71.35687, -45.22075], [-71.75614, -45.61611], [-71.68577, -46.55385], [-71.94152, -47.13595], [-72.50478, -47.80586], [-72.27662, -48.28727], [-72.54042, -48.52392], [-72.56894, -48.81116], [-73.09655, -49.14342], [-73.45156, -49.79461], [-73.55259, -49.92488], [-73.15765, -50.78337], [-72.31343, -50.58411]]]]
+         }
+       }, {
+         type: "Feature",
+         properties: {
+           iso1A2: "AS",
+           iso1A3: "ASM",
+           iso1N3: "016",
+           wikidata: "Q16641",
+           nameEn: "American Samoa",
+           aliases: ["US-AS"],
+           country: "US",
+           groups: ["Q1352230", "061", "009", "UN"],
+           roadSpeedUnit: "mph",
+           roadHeightUnit: "ft",
+           callingCodes: ["1 684"]
+         },
+         geometry: {
+           type: "MultiPolygon",
+           coordinates: [[[[-171.39864, -10.21587], [-170.99605, -15.1275], [-166.32598, -15.26169], [-171.39864, -10.21587]]]]
+         }
+       }, {
+         type: "Feature",
+         properties: {
+           iso1A2: "AT",
+           iso1A3: "AUT",
+           iso1N3: "040",
+           wikidata: "Q40",
+           nameEn: "Austria",
+           groups: ["EU", "155", "150", "UN"],
+           callingCodes: ["43"]
+         },
+         geometry: {
+           type: "MultiPolygon",
+           coordinates: [[[[15.34823, 48.98444], [15.28305, 48.98831], [15.26177, 48.95766], [15.16358, 48.94278], [15.15534, 48.99056], [14.99878, 49.01444], [14.97612, 48.96983], [14.98917, 48.90082], [14.95072, 48.79101], [14.98032, 48.77959], [14.9782, 48.7766], [14.98112, 48.77524], [14.9758, 48.76857], [14.95641, 48.75915], [14.94773, 48.76268], [14.81545, 48.7874], [14.80821, 48.77711], [14.80584, 48.73489], [14.72756, 48.69502], [14.71794, 48.59794], [14.66762, 48.58215], [14.60808, 48.62881], [14.56139, 48.60429], [14.4587, 48.64695], [14.43076, 48.58855], [14.33909, 48.55852], [14.20691, 48.5898], [14.09104, 48.5943], [14.01482, 48.63788], [14.06151, 48.66873], [13.84023, 48.76988], [13.82266, 48.75544], [13.81863, 48.73257], [13.79337, 48.71375], [13.81791, 48.69832], [13.81283, 48.68426], [13.81901, 48.6761], [13.82609, 48.62345], [13.80038, 48.59487], [13.80519, 48.58026], [13.76921, 48.55324], [13.7513, 48.5624], [13.74816, 48.53058], [13.72802, 48.51208], [13.66113, 48.53558], [13.65186, 48.55092], [13.62508, 48.55501], [13.59705, 48.57013], [13.57535, 48.55912], [13.51291, 48.59023], [13.50131, 48.58091], [13.50663, 48.57506], [13.46967, 48.55157], [13.45214, 48.56472], [13.43695, 48.55776], [13.45727, 48.51092], [13.42527, 48.45711], [13.43929, 48.43386], [13.40709, 48.37292], [13.30897, 48.31575], [13.26039, 48.29422], [13.18093, 48.29577], [13.126, 48.27867], [13.0851, 48.27711], [13.02083, 48.25689], [12.95306, 48.20629], [12.87126, 48.20318], [12.84475, 48.16556], [12.836, 48.1647], [12.8362, 48.15876], [12.82673, 48.15245], [12.80676, 48.14979], [12.78595, 48.12445], [12.7617, 48.12796], [12.74973, 48.10885], [12.76141, 48.07373], [12.8549, 48.01122], [12.87476, 47.96195], [12.91683, 47.95647], [12.9211, 47.95135], [12.91985, 47.94069], [12.92668, 47.93879], [12.93419, 47.94063], [12.93642, 47.94436], [12.93886, 47.94046], [12.94163, 47.92927], [13.00588, 47.84374], [12.98543, 47.82896], [12.96311, 47.79957], [12.93202, 47.77302], [12.94371, 47.76281], [12.9353, 47.74788], [12.91711, 47.74026], [12.90274, 47.72513], [12.91333, 47.7178], [12.92969, 47.71094], [12.98578, 47.7078], [13.01382, 47.72116], [13.07692, 47.68814], [13.09562, 47.63304], [13.06407, 47.60075], [13.06641, 47.58577], [13.04537, 47.58183], [13.05355, 47.56291], [13.03252, 47.53373], [13.04537, 47.49426], [12.9998, 47.46267], [12.98344, 47.48716], [12.9624, 47.47452], [12.85256, 47.52741], [12.84672, 47.54556], [12.80699, 47.54477], [12.77427, 47.58025], [12.82101, 47.61493], [12.76492, 47.64485], [12.77777, 47.66689], [12.7357, 47.6787], [12.6071, 47.6741], [12.57438, 47.63238], [12.53816, 47.63553], [12.50076, 47.62293], [12.44117, 47.6741], [12.43883, 47.6977], [12.37222, 47.68433], [12.336, 47.69534], [12.27991, 47.68827], [12.26004, 47.67725], [12.24017, 47.69534], [12.26238, 47.73544], [12.2542, 47.7433], [12.22571, 47.71776], [12.18303, 47.70065], [12.16217, 47.70105], [12.16769, 47.68167], [12.18347, 47.66663], [12.18507, 47.65984], [12.19895, 47.64085], [12.20801, 47.61082], [12.20398, 47.60667], [12.18568, 47.6049], [12.17737, 47.60121], [12.18145, 47.61019], [12.17824, 47.61506], [12.13734, 47.60639], [12.05788, 47.61742], [12.02282, 47.61033], [12.0088, 47.62451], [11.85572, 47.60166], [11.84052, 47.58354], [11.63934, 47.59202], [11.60681, 47.57881], [11.58811, 47.55515], [11.58578, 47.52281], [11.52618, 47.50939], [11.4362, 47.51413], [11.38128, 47.47465], [11.4175, 47.44621], [11.33804, 47.44937], [11.29597, 47.42566], [11.27844, 47.39956], [11.22002, 47.3964], [11.25157, 47.43277], [11.20482, 47.43198], [11.12536, 47.41222], [11.11835, 47.39719], [10.97111, 47.39561], [10.97111, 47.41617], [10.98513, 47.42882], [10.92437, 47.46991], [10.93839, 47.48018], [10.90918, 47.48571], [10.87061, 47.4786], [10.86945, 47.5015], [10.91268, 47.51334], [10.88814, 47.53701], [10.77596, 47.51729], [10.7596, 47.53228], [10.6965, 47.54253], [10.68832, 47.55752], [10.63456, 47.5591], [10.60337, 47.56755], [10.56912, 47.53584], [10.48849, 47.54057], [10.47329, 47.58552], [10.43473, 47.58394], [10.44992, 47.5524], [10.4324, 47.50111], [10.44291, 47.48453], [10.46278, 47.47901], [10.47446, 47.43318], [10.4359, 47.41183], [10.4324, 47.38494], [10.39851, 47.37623], [10.33424, 47.30813], [10.23257, 47.27088], [10.17531, 47.27167], [10.17648, 47.29149], [10.2147, 47.31014], [10.19998, 47.32832], [10.23757, 47.37609], [10.22774, 47.38904], [10.2127, 47.38019], [10.17648, 47.38889], [10.16362, 47.36674], [10.11805, 47.37228], [10.09819, 47.35724], [10.06897, 47.40709], [10.1052, 47.4316], [10.09001, 47.46005], [10.07131, 47.45531], [10.03859, 47.48927], [10.00003, 47.48216], [9.96029, 47.53899], [9.92407, 47.53111], [9.87733, 47.54688], [9.87499, 47.52953], [9.8189, 47.54688], [9.82591, 47.58158], [9.80254, 47.59419], [9.76748, 47.5934], [9.72736, 47.53457], [9.55125, 47.53629], [9.56312, 47.49495], [9.58208, 47.48344], [9.59482, 47.46305], [9.60205, 47.46165], [9.60484, 47.46358], [9.60841, 47.47178], [9.62158, 47.45858], [9.62475, 47.45685], [9.6423, 47.45599], [9.65728, 47.45383], [9.65863, 47.44847], [9.64483, 47.43842], [9.6446, 47.43233], [9.65043, 47.41937], [9.65136, 47.40504], [9.6629, 47.39591], [9.67334, 47.39191], [9.67445, 47.38429], [9.6711, 47.37824], [9.66243, 47.37136], [9.65427, 47.36824], [9.62476, 47.36639], [9.59978, 47.34671], [9.58513, 47.31334], [9.55857, 47.29919], [9.54773, 47.2809], [9.53116, 47.27029], [9.56766, 47.24281], [9.55176, 47.22585], [9.56981, 47.21926], [9.58264, 47.20673], [9.56539, 47.17124], [9.62623, 47.14685], [9.63395, 47.08443], [9.61216, 47.07732], [9.60717, 47.06091], [9.87935, 47.01337], [9.88266, 46.93343], [9.98058, 46.91434], [10.10715, 46.84296], [10.22675, 46.86942], [10.24128, 46.93147], [10.30031, 46.92093], [10.36933, 47.00212], [10.48376, 46.93891], [10.47197, 46.85698], [10.54783, 46.84505], [10.66405, 46.87614], [10.75753, 46.82258], [10.72974, 46.78972], [11.00764, 46.76896], [11.10618, 46.92966], [11.33355, 46.99862], [11.50739, 47.00644], [11.74789, 46.98484], [12.19254, 47.09331], [12.21781, 47.03996], [12.11675, 47.01241], [12.2006, 46.88854], [12.27591, 46.88651], [12.38708, 46.71529], [12.59992, 46.6595], [12.94445, 46.60401], [13.27627, 46.56059], [13.64088, 46.53438], [13.7148, 46.5222], [13.89837, 46.52331], [14.00422, 46.48474], [14.04002, 46.49117], [14.12097, 46.47724], [14.15989, 46.43327], [14.28326, 46.44315], [14.314, 46.43327], [14.42608, 46.44614], [14.45877, 46.41717], [14.52176, 46.42617], [14.56463, 46.37208], [14.5942, 46.43434], [14.66892, 46.44936], [14.72185, 46.49974], [14.81836, 46.51046], [14.83549, 46.56614], [14.86419, 46.59411], [14.87129, 46.61], [14.92283, 46.60848], [14.96002, 46.63459], [14.98024, 46.6009], [15.01451, 46.641], [15.14215, 46.66131], [15.23711, 46.63994], [15.41235, 46.65556], [15.45514, 46.63697], [15.46906, 46.61321], [15.54431, 46.6312], [15.55333, 46.64988], [15.54533, 46.66985], [15.59826, 46.68908], [15.62317, 46.67947], [15.63255, 46.68069], [15.6365, 46.6894], [15.6543, 46.69228], [15.6543, 46.70616], [15.67411, 46.70735], [15.69523, 46.69823], [15.72279, 46.69548], [15.73823, 46.70011], [15.76771, 46.69863], [15.78518, 46.70712], [15.8162, 46.71897], [15.87691, 46.7211], [15.94864, 46.68769], [15.98512, 46.68463], [15.99988, 46.67947], [16.04036, 46.6549], [16.04347, 46.68694], [16.02808, 46.71094], [15.99769, 46.7266], [15.98432, 46.74991], [15.99126, 46.78199], [15.99054, 46.82772], [16.05786, 46.83927], [16.10983, 46.867], [16.19904, 46.94134], [16.22403, 46.939], [16.27594, 46.9643], [16.28202, 47.00159], [16.51369, 47.00084], [16.43936, 47.03548], [16.52176, 47.05747], [16.46134, 47.09395], [16.52863, 47.13974], [16.44932, 47.14418], [16.46442, 47.16845], [16.4523, 47.18812], [16.42801, 47.18422], [16.41739, 47.20649], [16.43663, 47.21127], [16.44142, 47.25079], [16.47782, 47.25918], [16.45104, 47.41181], [16.49908, 47.39416], [16.52414, 47.41007], [16.57152, 47.40868], [16.6718, 47.46139], [16.64821, 47.50155], [16.71059, 47.52692], [16.64193, 47.63114], [16.58699, 47.61772], [16.4222, 47.66537], [16.55129, 47.72268], [16.53514, 47.73837], [16.54779, 47.75074], [16.61183, 47.76171], [16.65679, 47.74197], [16.72089, 47.73469], [16.7511, 47.67878], [16.82938, 47.68432], [16.86509, 47.72268], [16.87538, 47.68895], [17.08893, 47.70928], [17.05048, 47.79377], [17.07039, 47.81129], [17.00997, 47.86245], [17.08275, 47.87719], [17.11022, 47.92461], [17.09786, 47.97336], [17.16001, 48.00636], [17.07039, 48.0317], [17.09168, 48.09366], [17.05735, 48.14179], [17.02919, 48.13996], [16.97701, 48.17385], [16.89461, 48.31332], [16.90903, 48.32519], [16.84243, 48.35258], [16.83317, 48.38138], [16.83588, 48.3844], [16.8497, 48.38321], [16.85204, 48.44968], [16.94611, 48.53614], [16.93955, 48.60371], [16.90354, 48.71541], [16.79779, 48.70998], [16.71883, 48.73806], [16.68518, 48.7281], [16.67008, 48.77699], [16.46134, 48.80865], [16.40915, 48.74576], [16.37345, 48.729], [16.06034, 48.75436], [15.84404, 48.86921], [15.78087, 48.87644], [15.75341, 48.8516], [15.6921, 48.85973], [15.61622, 48.89541], [15.51357, 48.91549], [15.48027, 48.94481], [15.34823, 48.98444]]]]
+         }
+       }, {
+         type: "Feature",
+         properties: {
+           iso1A2: "AU",
+           iso1A3: "AUS",
+           iso1N3: "036",
+           wikidata: "Q408",
+           nameEn: "Australia"
+         },
+         geometry: null
+       }, {
+         type: "Feature",
+         properties: {
+           iso1A2: "AW",
+           iso1A3: "ABW",
+           iso1N3: "533",
+           wikidata: "Q21203",
+           nameEn: "Aruba",
+           aliases: ["NL-AW"],
+           country: "NL",
+           groups: ["Q1451600", "029", "003", "419", "019", "UN"],
+           callingCodes: ["297"]
+         },
+         geometry: {
+           type: "MultiPolygon",
+           coordinates: [[[[-70.00823, 12.98375], [-70.35625, 12.58277], [-69.60231, 12.17], [-70.00823, 12.98375]]]]
+         }
+       }, {
+         type: "Feature",
+         properties: {
+           iso1A2: "AX",
+           iso1A3: "ALA",
+           iso1N3: "248",
+           wikidata: "Q5689",
+           nameEn: "\xC5land Islands",
+           country: "FI",
+           groups: ["EU", "154", "150", "UN"],
+           callingCodes: ["358 18", "358 457"]
+         },
+         geometry: {
+           type: "MultiPolygon",
+           coordinates: [[[[19.08191, 60.19152], [20.5104, 59.15546], [21.35468, 59.67511], [21.02509, 60.12142], [21.08159, 60.20167], [21.15143, 60.54555], [20.96741, 60.71528], [19.23413, 60.61414], [19.08191, 60.19152]]]]
+         }
+       }, {
+         type: "Feature",
+         properties: {
+           iso1A2: "AZ",
+           iso1A3: "AZE",
+           iso1N3: "031",
+           wikidata: "Q227",
+           nameEn: "Azerbaijan",
+           groups: ["145", "142", "UN"],
+           callingCodes: ["994"]
+         },
+         geometry: {
+           type: "MultiPolygon",
+           coordinates: [[[[46.42738, 41.91323], [46.3984, 41.84399], [46.30863, 41.79133], [46.23962, 41.75811], [46.20538, 41.77205], [46.17891, 41.72094], [46.19759, 41.62327], [46.24429, 41.59883], [46.26531, 41.63339], [46.28182, 41.60089], [46.3253, 41.60912], [46.34039, 41.5947], [46.34126, 41.57454], [46.29794, 41.5724], [46.33925, 41.4963], [46.40307, 41.48464], [46.4669, 41.43331], [46.63658, 41.37727], [46.72375, 41.28609], [46.66148, 41.20533], [46.63969, 41.09515], [46.55096, 41.1104], [46.48558, 41.0576], [46.456, 41.09984], [46.37661, 41.10805], [46.27698, 41.19011], [46.13221, 41.19479], [45.95786, 41.17956], [45.80842, 41.2229], [45.69946, 41.29545], [45.75705, 41.35157], [45.71035, 41.36208], [45.68389, 41.3539], [45.45973, 41.45898], [45.4006, 41.42402], [45.31352, 41.47168], [45.26285, 41.46433], [45.1797, 41.42231], [45.09867, 41.34065], [45.0133, 41.29747], [45.05497, 41.2464], [45.02932, 41.2101], [45.05201, 41.19211], [45.11811, 41.19967], [45.1969, 41.168], [45.19942, 41.13299], [45.08028, 41.10917], [45.06784, 41.05379], [45.12923, 41.06059], [45.1313, 41.09369], [45.1634, 41.08082], [45.16493, 41.05068], [45.1994, 41.04518], [45.25897, 41.0027], [45.26162, 41.0228], [45.28859, 41.03757], [45.35677, 40.99784], [45.39725, 41.02603], [45.44083, 41.01663], [45.40814, 40.97904], [45.60584, 40.87436], [45.55914, 40.78366], [45.4206, 40.7424], [45.35366, 40.65979], [45.45484, 40.57707], [45.42994, 40.53804], [45.65098, 40.37696], [45.95609, 40.27846], [45.97944, 40.181], [45.83779, 39.98925], [45.78642, 40.03218], [45.59806, 40.0131], [45.60895, 39.97733], [45.7833, 39.9475], [45.82533, 39.82925], [45.96543, 39.78859], [46.18493, 39.60533], [46.40286, 39.63651], [46.42465, 39.57534], [46.52117, 39.58734], [46.57098, 39.56694], [46.57721, 39.54414], [46.51027, 39.52373], [46.53051, 39.47809], [46.4013, 39.45405], [46.37795, 39.42039], [46.43244, 39.35181], [46.50093, 39.33736], [46.56476, 39.24942], [46.63481, 39.23013], [46.58032, 39.21204], [46.54141, 39.15895], [46.52584, 39.18912], [46.44022, 39.19636], [46.54296, 39.07078], [46.51805, 38.94982], [46.53497, 38.86548], [46.75752, 39.03231], [46.83822, 39.13143], [46.92539, 39.16644], [46.95341, 39.13505], [47.05771, 39.20143], [47.05927, 39.24846], [47.31301, 39.37492], [47.38978, 39.45999], [47.50099, 39.49615], [47.84774, 39.66285], [47.98977, 39.70999], [48.34264, 39.42935], [48.37385, 39.37584], [48.15984, 39.30028], [48.12404, 39.25208], [48.15361, 39.19419], [48.31239, 39.09278], [48.33884, 39.03022], [48.28437, 38.97186], [48.08627, 38.94434], [48.07734, 38.91616], [48.01409, 38.90333], [48.02581, 38.82705], [48.24773, 38.71883], [48.3146, 38.59958], [48.45084, 38.61013], [48.58793, 38.45076], [48.62217, 38.40198], [48.70001, 38.40564], [48.78979, 38.45026], [48.81072, 38.44853], [48.84969, 38.45015], [48.88288, 38.43975], [52.39847, 39.43556], [48.80971, 41.95365], [48.5867, 41.84306], [48.55078, 41.77917], [48.42301, 41.65444], [48.40277, 41.60441], [48.2878, 41.56221], [48.22064, 41.51472], [48.07587, 41.49957], [47.87973, 41.21798], [47.75831, 41.19455], [47.62288, 41.22969], [47.54504, 41.20275], [47.49004, 41.26366], [47.34579, 41.27884], [47.10762, 41.59044], [47.03757, 41.55434], [46.99554, 41.59743], [47.00955, 41.63583], [46.8134, 41.76252], [46.75269, 41.8623], [46.58924, 41.80547], [46.5332, 41.87389], [46.42738, 41.91323]], [[45.50279, 40.58424], [45.47927, 40.65023], [45.51825, 40.67382], [45.56071, 40.64765], [45.50279, 40.58424]]], [[[45.00864, 41.03411], [45.03792, 41.03938], [45.04517, 41.06653], [45.03406, 41.07931], [45.00864, 41.09407], [44.97169, 41.09176], [44.95383, 41.07553], [44.96031, 41.06345], [44.9903, 41.05657], [45.00864, 41.03411]]], [[[45.21324, 40.9817], [45.23095, 40.97828], [45.23487, 41.00226], [45.20625, 41.01484], [45.18382, 41.0066], [45.19312, 40.98998], [45.20518, 40.99348], [45.21219, 40.99001], [45.21324, 40.9817]]], [[[45.46992, 39.49888], [45.29606, 39.57654], [45.30385, 39.61373], [45.23535, 39.61373], [45.21784, 39.58074], [45.17464, 39.58614], [45.18554, 39.67846], [45.06604, 39.79277], [44.92869, 39.72157], [44.88354, 39.74432], [44.75779, 39.7148], [44.80977, 39.65768], [44.81043, 39.62677], [44.88916, 39.59653], [44.96746, 39.42998], [45.05932, 39.36435], [45.08751, 39.35052], [45.16168, 39.21952], [45.30489, 39.18333], [45.40148, 39.09007], [45.40452, 39.07224], [45.44811, 39.04927], [45.44966, 38.99243], [45.6131, 38.964], [45.6155, 38.94304], [45.65172, 38.95199], [45.83883, 38.90768], [45.90266, 38.87739], [45.94624, 38.89072], [46.00228, 38.87376], [46.06766, 38.87861], [46.14785, 38.84206], [46.06973, 39.0744], [46.02303, 39.09978], [45.99774, 39.28931], [45.79225, 39.3695], [45.83, 39.46487], [45.80804, 39.56716], [45.70547, 39.60174], [45.46992, 39.49888]]]]
+         }
+       }, {
+         type: "Feature",
+         properties: {
+           iso1A2: "BA",
+           iso1A3: "BIH",
+           iso1N3: "070",
+           wikidata: "Q225",
+           nameEn: "Bosnia and Herzegovina",
+           groups: ["039", "150", "UN"],
+           callingCodes: ["387"]
+         },
+         geometry: {
+           type: "MultiPolygon",
+           coordinates: [[[[17.84826, 45.04489], [17.66571, 45.13408], [17.59104, 45.10816], [17.51469, 45.10791], [17.47589, 45.12656], [17.45615, 45.12523], [17.4498, 45.16119], [17.41229, 45.13335], [17.33573, 45.14521], [17.32092, 45.16246], [17.26815, 45.18444], [17.25131, 45.14957], [17.24325, 45.146], [17.18438, 45.14764], [17.0415, 45.20759], [16.9385, 45.22742], [16.92405, 45.27607], [16.83804, 45.18951], [16.81137, 45.18434], [16.78219, 45.19002], [16.74845, 45.20393], [16.64962, 45.20714], [16.60194, 45.23042], [16.56559, 45.22307], [16.5501, 45.2212], [16.52982, 45.22713], [16.49155, 45.21153], [16.4634, 45.14522], [16.40023, 45.1147], [16.38309, 45.05955], [16.38219, 45.05139], [16.3749, 45.05206], [16.35863, 45.03529], [16.35404, 45.00241], [16.29036, 44.99732], [16.12153, 45.09616], [15.98412, 45.23088], [15.83512, 45.22459], [15.76371, 45.16508], [15.78842, 45.11519], [15.74585, 45.0638], [15.78568, 44.97401], [15.74723, 44.96818], [15.76096, 44.87045], [15.79472, 44.8455], [15.72584, 44.82334], [15.8255, 44.71501], [15.89348, 44.74964], [16.05828, 44.61538], [16.00884, 44.58605], [16.03012, 44.55572], [16.10566, 44.52586], [16.16814, 44.40679], [16.12969, 44.38275], [16.21346, 44.35231], [16.18688, 44.27012], [16.36864, 44.08263], [16.43662, 44.07523], [16.43629, 44.02826], [16.50528, 44.0244], [16.55472, 43.95326], [16.70922, 43.84887], [16.75316, 43.77157], [16.80736, 43.76011], [17.00585, 43.58037], [17.15828, 43.49376], [17.24411, 43.49376], [17.29699, 43.44542], [17.25579, 43.40353], [17.286, 43.33065], [17.46986, 43.16559], [17.64268, 43.08595], [17.70879, 42.97223], [17.5392, 42.92787], [17.6444, 42.88641], [17.68151, 42.92725], [17.7948, 42.89556], [17.80854, 42.9182], [17.88201, 42.83668], [18.24318, 42.6112], [18.36197, 42.61423], [18.43735, 42.55921], [18.49778, 42.58409], [18.53751, 42.57376], [18.55504, 42.58409], [18.52232, 42.62279], [18.57373, 42.64429], [18.54841, 42.68328], [18.54603, 42.69171], [18.55221, 42.69045], [18.56789, 42.72074], [18.47324, 42.74992], [18.45921, 42.81682], [18.47633, 42.85829], [18.4935, 42.86433], [18.49661, 42.89306], [18.49076, 42.95553], [18.52232, 43.01451], [18.66254, 43.03928], [18.64735, 43.14766], [18.66605, 43.2056], [18.71747, 43.2286], [18.6976, 43.25243], [18.76538, 43.29838], [18.85342, 43.32426], [18.84794, 43.33735], [18.83912, 43.34795], [18.90911, 43.36383], [18.95819, 43.32899], [18.95001, 43.29327], [19.00844, 43.24988], [19.04233, 43.30008], [19.08206, 43.29668], [19.08673, 43.31453], [19.04071, 43.397], [19.01078, 43.43854], [18.96053, 43.45042], [18.95469, 43.49367], [18.91379, 43.50299], [19.01078, 43.55806], [19.04934, 43.50384], [19.13933, 43.5282], [19.15685, 43.53943], [19.22807, 43.5264], [19.24774, 43.53061], [19.2553, 43.5938], [19.33426, 43.58833], [19.36653, 43.60921], [19.41941, 43.54056], [19.42696, 43.57987], [19.50455, 43.58385], [19.5176, 43.71403], [19.3986, 43.79668], [19.23465, 43.98764], [19.24363, 44.01502], [19.38439, 43.96611], [19.52515, 43.95573], [19.56498, 43.99922], [19.61836, 44.01464], [19.61991, 44.05254], [19.57467, 44.04716], [19.55999, 44.06894], [19.51167, 44.08158], [19.47321, 44.1193], [19.48386, 44.14332], [19.47338, 44.15034], [19.43905, 44.13088], [19.40927, 44.16722], [19.3588, 44.18353], [19.34773, 44.23244], [19.32464, 44.27185], [19.26945, 44.26957], [19.23306, 44.26097], [19.20508, 44.2917], [19.18328, 44.28383], [19.16741, 44.28648], [19.13332, 44.31492], [19.13556, 44.338], [19.11547, 44.34218], [19.1083, 44.3558], [19.11865, 44.36712], [19.10298, 44.36924], [19.10365, 44.37795], [19.10704, 44.38249], [19.10749, 44.39421], [19.11785, 44.40313], [19.14681, 44.41463], [19.14837, 44.45253], [19.12278, 44.50132], [19.13369, 44.52521], [19.16699, 44.52197], [19.26388, 44.65412], [19.32543, 44.74058], [19.36722, 44.88164], [19.18183, 44.92055], [19.01994, 44.85493], [18.8704, 44.85097], [18.76347, 44.90669], [18.76369, 44.93707], [18.80661, 44.93561], [18.78357, 44.97741], [18.65723, 45.07544], [18.47939, 45.05871], [18.41896, 45.11083], [18.32077, 45.1021], [18.24387, 45.13699], [18.1624, 45.07654], [18.03121, 45.12632], [18.01594, 45.15163], [17.99479, 45.14958], [17.97834, 45.13831], [17.97336, 45.12245], [17.93706, 45.08016], [17.87148, 45.04645], [17.84826, 45.04489]]]]
+         }
+       }, {
+         type: "Feature",
+         properties: {
+           iso1A2: "BB",
+           iso1A3: "BRB",
+           iso1N3: "052",
+           wikidata: "Q244",
+           nameEn: "Barbados",
+           groups: ["029", "003", "419", "019", "UN"],
+           driveSide: "left",
+           callingCodes: ["1 246"]
+         },
+         geometry: {
+           type: "MultiPolygon",
+           coordinates: [[[[-58.56442, 13.24471], [-59.80731, 13.87556], [-59.82929, 12.70644], [-58.56442, 13.24471]]]]
+         }
+       }, {
+         type: "Feature",
+         properties: {
+           iso1A2: "BD",
+           iso1A3: "BGD",
+           iso1N3: "050",
+           wikidata: "Q902",
+           nameEn: "Bangladesh",
+           groups: ["034", "142", "UN"],
+           driveSide: "left",
+           callingCodes: ["880"]
+         },
+         geometry: {
+           type: "MultiPolygon",
+           coordinates: [[[[89.15869, 26.13708], [89.08899, 26.38845], [88.95612, 26.4564], [88.92357, 26.40711], [88.91321, 26.37984], [89.05328, 26.2469], [88.85004, 26.23211], [88.78961, 26.31093], [88.67837, 26.26291], [88.69485, 26.38353], [88.62144, 26.46783], [88.4298, 26.54489], [88.41196, 26.63837], [88.33093, 26.48929], [88.35153, 26.45241], [88.36938, 26.48683], [88.48749, 26.45855], [88.51649, 26.35923], [88.35153, 26.29123], [88.34757, 26.22216], [88.1844, 26.14417], [88.16581, 26.0238], [88.08804, 25.91334], [88.13138, 25.78773], [88.242, 25.80811], [88.45103, 25.66245], [88.4559, 25.59227], [88.677, 25.46959], [88.81296, 25.51546], [88.85278, 25.34679], [89.01105, 25.30303], [89.00463, 25.26583], [88.94067, 25.18534], [88.44766, 25.20149], [88.46277, 25.07468], [88.33917, 24.86803], [88.27325, 24.88796], [88.21832, 24.96642], [88.14004, 24.93529], [88.15515, 24.85806], [88.00683, 24.66477], [88.08786, 24.63232], [88.12296, 24.51301], [88.50934, 24.32474], [88.68801, 24.31464], [88.74841, 24.1959], [88.6976, 24.14703], [88.73743, 23.91751], [88.66189, 23.87607], [88.58087, 23.87105], [88.56507, 23.64044], [88.74841, 23.47361], [88.79351, 23.50535], [88.79254, 23.46028], [88.71133, 23.2492], [88.99148, 23.21134], [88.86377, 23.08759], [88.88327, 23.03885], [88.87063, 22.95235], [88.96713, 22.83346], [88.9151, 22.75228], [88.94614, 22.66941], [88.9367, 22.58527], [89.07114, 22.15335], [89.08044, 21.41871], [92.47409, 20.38654], [92.26071, 21.05697], [92.17752, 21.17445], [92.20087, 21.337], [92.37939, 21.47764], [92.43158, 21.37025], [92.55105, 21.3856], [92.60187, 21.24615], [92.68152, 21.28454], [92.59775, 21.6092], [92.62187, 21.87037], [92.60949, 21.97638], [92.56616, 22.13554], [92.60029, 22.1522], [92.5181, 22.71441], [92.37665, 22.9435], [92.38214, 23.28705], [92.26541, 23.70392], [92.15417, 23.73409], [92.04706, 23.64229], [91.95093, 23.73284], [91.95642, 23.47361], [91.84789, 23.42235], [91.76417, 23.26619], [91.81634, 23.08001], [91.7324, 23.00043], [91.61571, 22.93929], [91.54993, 23.01051], [91.46615, 23.2328], [91.4035, 23.27522], [91.40848, 23.07117], [91.36453, 23.06612], [91.28293, 23.37538], [91.15579, 23.6599], [91.25192, 23.83463], [91.22308, 23.89616], [91.29587, 24.0041], [91.35741, 23.99072], [91.37414, 24.10693], [91.55542, 24.08687], [91.63782, 24.1132], [91.65292, 24.22095], [91.73257, 24.14703], [91.76004, 24.23848], [91.82596, 24.22345], [91.89258, 24.14674], [91.96603, 24.3799], [92.11662, 24.38997], [92.15796, 24.54435], [92.25854, 24.9191], [92.38626, 24.86055], [92.49887, 24.88796], [92.39147, 25.01471], [92.33957, 25.07593], [92.0316, 25.1834], [91.63648, 25.12846], [91.25517, 25.20677], [90.87427, 25.15799], [90.65042, 25.17788], [90.40034, 25.1534], [90.1155, 25.22686], [89.90478, 25.31038], [89.87629, 25.28337], [89.83371, 25.29548], [89.84086, 25.31854], [89.81208, 25.37244], [89.86129, 25.61714], [89.84388, 25.70042], [89.80585, 25.82489], [89.86592, 25.93115], [89.77728, 26.04254], [89.77865, 26.08387], [89.73581, 26.15818], [89.70201, 26.15138], [89.63968, 26.22595], [89.57101, 25.9682], [89.53515, 26.00382], [89.35953, 26.0077], [89.15869, 26.13708]]]]
+         }
+       }, {
+         type: "Feature",
+         properties: {
+           iso1A2: "BE",
+           iso1A3: "BEL",
+           iso1N3: "056",
+           wikidata: "Q31",
+           nameEn: "Belgium",
+           groups: ["EU", "155", "150", "UN"],
+           callingCodes: ["32"]
+         },
+         geometry: {
+           type: "MultiPolygon",
+           coordinates: [[[[4.93295, 51.44945], [4.93909, 51.44632], [4.9524, 51.45014], [4.95244, 51.45207], [4.93295, 51.44945]]], [[[4.91493, 51.4353], [4.92652, 51.43329], [4.92952, 51.42984], [4.93986, 51.43064], [4.94265, 51.44003], [4.93471, 51.43861], [4.93416, 51.44185], [4.94025, 51.44193], [4.93544, 51.44634], [4.92879, 51.44161], [4.92815, 51.43856], [4.92566, 51.44273], [4.92811, 51.4437], [4.92287, 51.44741], [4.91811, 51.44621], [4.92227, 51.44252], [4.91935, 51.43634], [4.91493, 51.4353]]], [[[4.82946, 51.4213], [4.82409, 51.44736], [4.84139, 51.4799], [4.78803, 51.50284], [4.77321, 51.50529], [4.74578, 51.48937], [4.72935, 51.48424], [4.65442, 51.42352], [4.57489, 51.4324], [4.53521, 51.4243], [4.52846, 51.45002], [4.54675, 51.47265], [4.5388, 51.48184], [4.47736, 51.4778], [4.38122, 51.44905], [4.39747, 51.43316], [4.38064, 51.41965], [4.43777, 51.36989], [4.39292, 51.35547], [4.34086, 51.35738], [4.33265, 51.37687], [4.21923, 51.37443], [4.24024, 51.35371], [4.16721, 51.29348], [4.05165, 51.24171], [4.01957, 51.24504], [3.97889, 51.22537], [3.90125, 51.20371], [3.78783, 51.2151], [3.78999, 51.25766], [3.58939, 51.30064], [3.51502, 51.28697], [3.52698, 51.2458], [3.43488, 51.24135], [3.41704, 51.25933], [3.38289, 51.27331], [3.35847, 51.31572], [3.38696, 51.33436], [3.36263, 51.37112], [2.56575, 51.85301], [2.18458, 51.52087], [2.55904, 51.07014], [2.57551, 51.00326], [2.63074, 50.94746], [2.59093, 50.91751], [2.63331, 50.81457], [2.71165, 50.81295], [2.81056, 50.71773], [2.8483, 50.72276], [2.86985, 50.7033], [2.87937, 50.70298], [2.88504, 50.70656], [2.90069, 50.69263], [2.91036, 50.6939], [2.90873, 50.702], [2.95019, 50.75138], [2.96778, 50.75242], [3.00537, 50.76588], [3.04314, 50.77674], [3.09163, 50.77717], [3.10614, 50.78303], [3.11206, 50.79416], [3.11987, 50.79188], [3.1257, 50.78603], [3.15017, 50.79031], [3.16476, 50.76843], [3.18339, 50.74981], [3.18811, 50.74025], [3.20064, 50.73547], [3.19017, 50.72569], [3.20845, 50.71662], [3.22042, 50.71019], [3.24593, 50.71389], [3.26063, 50.70086], [3.26141, 50.69151], [3.2536, 50.68977], [3.264, 50.67668], [3.23951, 50.6585], [3.2729, 50.60718], [3.28575, 50.52724], [3.37693, 50.49538], [3.44629, 50.51009], [3.47385, 50.53397], [3.51564, 50.5256], [3.49509, 50.48885], [3.5683, 50.50192], [3.58361, 50.49049], [3.61014, 50.49568], [3.64426, 50.46275], [3.66153, 50.45165], [3.67494, 50.40239], [3.67262, 50.38663], [3.65709, 50.36873], [3.66976, 50.34563], [3.71009, 50.30305], [3.70987, 50.3191], [3.73911, 50.34809], [3.84314, 50.35219], [3.90781, 50.32814], [3.96771, 50.34989], [4.0268, 50.35793], [4.0689, 50.3254], [4.10237, 50.31247], [4.10957, 50.30234], [4.11954, 50.30425], [4.13665, 50.25609], [4.16808, 50.25786], [4.15524, 50.2833], [4.17347, 50.28838], [4.17861, 50.27443], [4.20651, 50.27333], [4.21945, 50.25539], [4.15524, 50.21103], [4.16014, 50.19239], [4.13561, 50.13078], [4.20147, 50.13535], [4.23101, 50.06945], [4.16294, 50.04719], [4.13508, 50.01976], [4.14239, 49.98034], [4.20532, 49.95803], [4.31963, 49.97043], [4.35051, 49.95315], [4.43488, 49.94122], [4.51098, 49.94659], [4.5414, 49.96911], [4.68695, 49.99685], [4.70064, 50.09384], [4.75237, 50.11314], [4.82438, 50.16878], [4.83279, 50.15331], [4.88602, 50.15182], [4.8382, 50.06738], [4.78827, 49.95609], [4.88529, 49.9236], [4.85134, 49.86457], [4.86965, 49.82271], [4.85464, 49.78995], [4.96714, 49.79872], [5.09249, 49.76193], [5.14545, 49.70287], [5.26232, 49.69456], [5.31465, 49.66846], [5.33039, 49.6555], [5.30214, 49.63055], [5.3137, 49.61225], [5.33851, 49.61599], [5.34837, 49.62889], [5.3974, 49.61596], [5.43713, 49.5707], [5.46734, 49.52648], [5.46541, 49.49825], [5.55001, 49.52729], [5.60909, 49.51228], [5.64505, 49.55146], [5.75649, 49.54321], [5.7577, 49.55915], [5.77435, 49.56298], [5.79195, 49.55228], [5.81838, 49.54777], [5.84143, 49.5533], [5.84692, 49.55663], [5.8424, 49.56082], [5.87256, 49.57539], [5.86986, 49.58756], [5.84971, 49.58674], [5.84826, 49.5969], [5.8762, 49.60898], [5.87609, 49.62047], [5.88393, 49.62802], [5.88552, 49.63507], [5.90599, 49.63853], [5.90164, 49.6511], [5.9069, 49.66377], [5.86175, 49.67862], [5.86527, 49.69291], [5.88677, 49.70951], [5.86503, 49.72739], [5.84193, 49.72161], [5.82562, 49.72395], [5.83149, 49.74729], [5.82245, 49.75048], [5.78871, 49.7962], [5.75409, 49.79239], [5.74953, 49.81428], [5.74364, 49.82058], [5.74844, 49.82435], [5.7404, 49.83452], [5.74076, 49.83823], [5.74975, 49.83933], [5.74953, 49.84709], [5.75884, 49.84811], [5.74567, 49.85368], [5.75861, 49.85631], [5.75269, 49.8711], [5.78415, 49.87922], [5.73621, 49.89796], [5.77314, 49.93646], [5.77291, 49.96056], [5.80833, 49.96451], [5.81163, 49.97142], [5.83467, 49.97823], [5.83968, 49.9892], [5.82331, 49.99662], [5.81866, 50.01286], [5.8551, 50.02683], [5.86904, 50.04614], [5.85474, 50.06342], [5.8857, 50.07824], [5.89488, 50.11476], [5.95929, 50.13295], [5.96453, 50.17259], [6.02488, 50.18283], [6.03093, 50.16362], [6.06406, 50.15344], [6.08577, 50.17246], [6.12028, 50.16374], [6.1137, 50.13668], [6.1379, 50.12964], [6.15298, 50.14126], [6.14132, 50.14971], [6.14588, 50.17106], [6.18739, 50.1822], [6.18364, 50.20815], [6.16853, 50.2234], [6.208, 50.25179], [6.28797, 50.27458], [6.29949, 50.30887], [6.32488, 50.32333], [6.35701, 50.31139], [6.40641, 50.32425], [6.40785, 50.33557], [6.3688, 50.35898], [6.34406, 50.37994], [6.36852, 50.40776], [6.37219, 50.45397], [6.34005, 50.46083], [6.3465, 50.48833], [6.30809, 50.50058], [6.26637, 50.50272], [6.22335, 50.49578], [6.20599, 50.52089], [6.19193, 50.5212], [6.18716, 50.52653], [6.19579, 50.5313], [6.19735, 50.53576], [6.17802, 50.54179], [6.17739, 50.55875], [6.20281, 50.56952], [6.22581, 50.5907], [6.24005, 50.58732], [6.24888, 50.59869], [6.2476, 50.60392], [6.26957, 50.62444], [6.17852, 50.6245], [6.11707, 50.72231], [6.04428, 50.72861], [6.0406, 50.71848], [6.0326, 50.72647], [6.03889, 50.74618], [6.01976, 50.75398], [5.97545, 50.75441], [5.95942, 50.7622], [5.89132, 50.75124], [5.89129, 50.75125], [5.88734, 50.77092], [5.84888, 50.75448], [5.84548, 50.76542], [5.80673, 50.7558], [5.77513, 50.78308], [5.76533, 50.78159], [5.74356, 50.7691], [5.73904, 50.75674], [5.72216, 50.76398], [5.69469, 50.75529], [5.68091, 50.75804], [5.70107, 50.7827], [5.68995, 50.79641], [5.70118, 50.80764], [5.65259, 50.82309], [5.64009, 50.84742], [5.64504, 50.87107], [5.67886, 50.88142], [5.69858, 50.91046], [5.71626, 50.90796], [5.72644, 50.91167], [5.72545, 50.92312], [5.74644, 50.94723], [5.75927, 50.95601], [5.74752, 50.96202], [5.72875, 50.95428], [5.71864, 50.96092], [5.76242, 50.99703], [5.77688, 51.02483], [5.75961, 51.03113], [5.77258, 51.06196], [5.79835, 51.05834], [5.79903, 51.09371], [5.82921, 51.09328], [5.83226, 51.10585], [5.8109, 51.10861], [5.80798, 51.11661], [5.85508, 51.14445], [5.82564, 51.16753], [5.77697, 51.1522], [5.77735, 51.17845], [5.74617, 51.18928], [5.70344, 51.1829], [5.65528, 51.18736], [5.65145, 51.19788], [5.5603, 51.22249], [5.5569, 51.26544], [5.515, 51.29462], [5.48476, 51.30053], [5.46519, 51.2849], [5.4407, 51.28169], [5.41672, 51.26248], [5.347, 51.27502], [5.33886, 51.26314], [5.29716, 51.26104], [5.26461, 51.26693], [5.23814, 51.26064], [5.22542, 51.26888], [5.24244, 51.30495], [5.2002, 51.32243], [5.16222, 51.31035], [5.13377, 51.31592], [5.13105, 51.34791], [5.07102, 51.39469], [5.10456, 51.43163], [5.07891, 51.4715], [5.04774, 51.47022], [5.03281, 51.48679], [5.0106, 51.47167], [5.00393, 51.44406], [4.92152, 51.39487], [4.90016, 51.41404], [4.84988, 51.41502], [4.78941, 51.41102], [4.77229, 51.41337], [4.76577, 51.43046], [4.78314, 51.43319], [4.82946, 51.4213]]]]
+         }
+       }, {
+         type: "Feature",
+         properties: {
+           iso1A2: "BF",
+           iso1A3: "BFA",
+           iso1N3: "854",
+           wikidata: "Q965",
+           nameEn: "Burkina Faso",
+           groups: ["011", "202", "002", "UN"],
+           callingCodes: ["226"]
+         },
+         geometry: {
+           type: "MultiPolygon",
+           coordinates: [[[[0.23859, 15.00135], [0.06588, 14.96961], [-0.24673, 15.07805], [-0.72004, 15.08655], [-1.05875, 14.7921], [-1.32166, 14.72774], [-1.68083, 14.50023], [-1.97945, 14.47709], [-1.9992, 14.19011], [-2.10223, 14.14878], [-2.47587, 14.29671], [-2.66175, 14.14713], [-2.84667, 14.05532], [-2.90831, 13.81174], [-2.88189, 13.64921], [-3.26407, 13.70699], [-3.28396, 13.5422], [-3.23599, 13.29035], [-3.43507, 13.27272], [-3.4313, 13.1588], [-3.54454, 13.1781], [-3.7911, 13.36665], [-3.96282, 13.38164], [-3.90558, 13.44375], [-3.96501, 13.49778], [-4.34477, 13.12927], [-4.21819, 12.95722], [-4.238, 12.71467], [-4.47356, 12.71252], [-4.41412, 12.31922], [-4.57703, 12.19875], [-4.54841, 12.1385], [-4.62546, 12.13204], [-4.62987, 12.06531], [-4.70692, 12.06746], [-4.72893, 12.01579], [-5.07897, 11.97918], [-5.26389, 11.84778], [-5.40258, 11.8327], [-5.26389, 11.75728], [-5.29251, 11.61715], [-5.22867, 11.60421], [-5.20665, 11.43811], [-5.25509, 11.36905], [-5.25949, 11.24816], [-5.32553, 11.21578], [-5.32994, 11.13371], [-5.49284, 11.07538], [-5.41579, 10.84628], [-5.47083, 10.75329], [-5.46643, 10.56074], [-5.51058, 10.43177], [-5.39602, 10.2929], [-5.12465, 10.29788], [-4.96453, 9.99923], [-4.96621, 9.89132], [-4.6426, 9.70696], [-4.31392, 9.60062], [-4.25999, 9.76012], [-3.69703, 9.94279], [-3.31779, 9.91125], [-3.27228, 9.84981], [-3.19306, 9.93781], [-3.16609, 9.85147], [-3.00765, 9.74019], [-2.93012, 9.57403], [-2.76494, 9.40778], [-2.68802, 9.49343], [-2.76534, 9.56589], [-2.74174, 9.83172], [-2.83108, 10.40252], [-2.94232, 10.64281], [-2.83373, 11.0067], [-0.67143, 10.99811], [-0.61937, 10.91305], [-0.44298, 11.04292], [-0.42391, 11.11661], [-0.38219, 11.12596], [-0.35955, 11.07801], [-0.28566, 11.12713], [-0.27374, 11.17157], [-0.13493, 11.14075], [0.50388, 11.01011], [0.48852, 10.98561], [0.50521, 10.98035], [0.4958, 10.93269], [0.66104, 10.99964], [0.91245, 10.99597], [0.9813, 11.08876], [1.03409, 11.04719], [1.42823, 11.46822], [2.00988, 11.42227], [2.29983, 11.68254], [2.39723, 11.89473], [2.05785, 12.35539], [2.26349, 12.41915], [0.99167, 13.10727], [0.99253, 13.37515], [1.18873, 13.31771], [1.21217, 13.37853], [1.24516, 13.33968], [1.28509, 13.35488], [1.24429, 13.39373], [1.20088, 13.38951], [1.02813, 13.46635], [0.99514, 13.5668], [0.77637, 13.64442], [0.77377, 13.6866], [0.61924, 13.68491], [0.38051, 14.05575], [0.16936, 14.51654], [0.23859, 15.00135]]]]
+         }
+       }, {
+         type: "Feature",
+         properties: {
+           iso1A2: "BG",
+           iso1A3: "BGR",
+           iso1N3: "100",
+           wikidata: "Q219",
+           nameEn: "Bulgaria",
+           groups: ["EU", "151", "150", "UN"],
+           callingCodes: ["359"]
+         },
+         geometry: {
+           type: "MultiPolygon",
+           coordinates: [[[[23.05288, 43.79494], [22.85314, 43.84452], [22.83753, 43.88055], [22.87873, 43.9844], [23.01674, 44.01946], [23.04988, 44.07694], [22.67173, 44.21564], [22.61711, 44.16938], [22.61688, 44.06534], [22.41449, 44.00514], [22.35558, 43.81281], [22.41043, 43.69566], [22.47582, 43.6558], [22.53397, 43.47225], [22.82036, 43.33665], [22.89727, 43.22417], [23.00806, 43.19279], [22.98104, 43.11199], [22.89521, 43.03625], [22.78397, 42.98253], [22.74826, 42.88701], [22.54302, 42.87774], [22.43309, 42.82057], [22.4997, 42.74144], [22.43983, 42.56851], [22.55669, 42.50144], [22.51961, 42.3991], [22.47498, 42.3915], [22.45919, 42.33822], [22.34773, 42.31725], [22.38136, 42.30339], [22.47251, 42.20393], [22.50289, 42.19527], [22.51224, 42.15457], [22.67701, 42.06614], [22.86749, 42.02275], [22.90254, 41.87587], [22.96682, 41.77137], [23.01239, 41.76527], [23.03342, 41.71034], [22.95513, 41.63265], [22.96331, 41.35782], [22.93334, 41.34104], [23.1833, 41.31755], [23.21953, 41.33773], [23.22771, 41.37106], [23.31301, 41.40525], [23.33639, 41.36317], [23.40416, 41.39999], [23.52453, 41.40262], [23.63203, 41.37632], [23.67644, 41.41139], [23.76525, 41.40175], [23.80148, 41.43943], [23.89613, 41.45257], [23.91483, 41.47971], [23.96975, 41.44118], [24.06908, 41.46132], [24.06323, 41.53222], [24.10063, 41.54796], [24.18126, 41.51735], [24.27124, 41.57682], [24.30513, 41.51297], [24.52599, 41.56808], [24.61129, 41.42278], [24.71529, 41.41928], [24.8041, 41.34913], [24.82514, 41.4035], [24.86136, 41.39298], [24.90928, 41.40876], [24.942, 41.38685], [25.11611, 41.34212], [25.28322, 41.23411], [25.48187, 41.28506], [25.52394, 41.2798], [25.55082, 41.31667], [25.61042, 41.30614], [25.66183, 41.31316], [25.70507, 41.29209], [25.8266, 41.34563], [25.87919, 41.30526], [26.12926, 41.35878], [26.16548, 41.42278], [26.20288, 41.43943], [26.14796, 41.47533], [26.176, 41.50072], [26.17951, 41.55409], [26.14328, 41.55496], [26.15146, 41.60828], [26.07083, 41.64584], [26.06148, 41.70345], [26.16841, 41.74858], [26.21325, 41.73223], [26.22888, 41.74139], [26.2654, 41.71544], [26.30255, 41.70925], [26.35957, 41.71149], [26.32952, 41.73637], [26.33589, 41.76802], [26.36952, 41.82265], [26.53968, 41.82653], [26.57961, 41.90024], [26.56051, 41.92995], [26.62996, 41.97644], [26.79143, 41.97386], [26.95638, 42.00741], [27.03277, 42.0809], [27.08486, 42.08735], [27.19251, 42.06028], [27.22376, 42.10152], [27.27411, 42.10409], [27.45478, 41.96591], [27.52379, 41.93756], [27.55191, 41.90928], [27.69949, 41.97515], [27.81235, 41.94803], [27.83492, 41.99709], [27.91479, 41.97902], [28.02971, 41.98066], [28.32297, 41.98371], [29.24336, 43.70874], [28.23293, 43.76], [27.99558, 43.84193], [27.92008, 44.00761], [27.73468, 43.95326], [27.64542, 44.04958], [27.60834, 44.01206], [27.39757, 44.0141], [27.26845, 44.12602], [26.95141, 44.13555], [26.62712, 44.05698], [26.38764, 44.04356], [26.10115, 43.96908], [26.05584, 43.90925], [25.94911, 43.85745], [25.72792, 43.69263], [25.39528, 43.61866], [25.17144, 43.70261], [25.10718, 43.6831], [24.96682, 43.72693], [24.73542, 43.68523], [24.62281, 43.74082], [24.50264, 43.76314], [24.35364, 43.70211], [24.18149, 43.68218], [23.73978, 43.80627], [23.61687, 43.79289], [23.4507, 43.84936], [23.26772, 43.84843], [23.05288, 43.79494]]]]
+         }
+       }, {
+         type: "Feature",
+         properties: {
+           iso1A2: "BH",
+           iso1A3: "BHR",
+           iso1N3: "048",
+           wikidata: "Q398",
+           nameEn: "Bahrain",
+           groups: ["145", "142", "UN"],
+           callingCodes: ["973"]
+         },
+         geometry: {
+           type: "MultiPolygon",
+           coordinates: [[[[50.93865, 26.30758], [50.71771, 26.73086], [50.38162, 26.53976], [50.26923, 26.08243], [50.302, 25.87592], [50.57069, 25.57887], [50.80824, 25.54641], [50.7801, 25.595], [50.86149, 25.6965], [50.81266, 25.88946], [50.93865, 26.30758]]]]
+         }
+       }, {
+         type: "Feature",
+         properties: {
+           iso1A2: "BI",
+           iso1A3: "BDI",
+           iso1N3: "108",
+           wikidata: "Q967",
+           nameEn: "Burundi",
+           groups: ["014", "202", "002", "UN"],
+           callingCodes: ["257"]
+         },
+         geometry: {
+           type: "MultiPolygon",
+           coordinates: [[[[30.54501, -2.41404], [30.42933, -2.31064], [30.14034, -2.43626], [29.95911, -2.33348], [29.88237, -2.75105], [29.36805, -2.82933], [29.32234, -2.6483], [29.0562, -2.58632], [29.04081, -2.7416], [29.00167, -2.78523], [29.00404, -2.81978], [29.0505, -2.81774], [29.09119, -2.87871], [29.09797, -2.91935], [29.16037, -2.95457], [29.17258, -2.99385], [29.25633, -3.05471], [29.21463, -3.3514], [29.23708, -3.75856], [29.43673, -4.44845], [29.63827, -4.44681], [29.75109, -4.45836], [29.77289, -4.41733], [29.82885, -4.36153], [29.88172, -4.35743], [30.03323, -4.26631], [30.22042, -4.01738], [30.45915, -3.56532], [30.84165, -3.25152], [30.83823, -2.97837], [30.6675, -2.98987], [30.57926, -2.89791], [30.4987, -2.9573], [30.40662, -2.86151], [30.52747, -2.65841], [30.41789, -2.66266], [30.54501, -2.41404]]]]
+         }
+       }, {
+         type: "Feature",
+         properties: {
+           iso1A2: "BJ",
+           iso1A3: "BEN",
+           iso1N3: "204",
+           wikidata: "Q962",
+           nameEn: "Benin",
+           aliases: ["DY"],
+           groups: ["011", "202", "002", "UN"],
+           callingCodes: ["229"]
+         },
+         geometry: {
+           type: "MultiPolygon",
+           coordinates: [[[[3.59375, 11.70269], [3.48187, 11.86092], [3.31613, 11.88495], [3.25352, 12.01467], [2.83978, 12.40585], [2.6593, 12.30631], [2.37783, 12.24804], [2.39657, 12.10952], [2.45824, 11.98672], [2.39723, 11.89473], [2.29983, 11.68254], [2.00988, 11.42227], [1.42823, 11.46822], [1.03409, 11.04719], [0.9813, 11.08876], [0.91245, 10.99597], [0.8804, 10.803], [0.80358, 10.71459], [0.77666, 10.37665], [1.35507, 9.99525], [1.36624, 9.5951], [1.33675, 9.54765], [1.41746, 9.3226], [1.5649, 9.16941], [1.61838, 9.0527], [1.64249, 6.99562], [1.55877, 6.99737], [1.61812, 6.74843], [1.58105, 6.68619], [1.76906, 6.43189], [1.79826, 6.28221], [1.62913, 6.24075], [1.67336, 6.02702], [2.74181, 6.13349], [2.70566, 6.38038], [2.70464, 6.50831], [2.74334, 6.57291], [2.7325, 6.64057], [2.78204, 6.70514], [2.78823, 6.76356], [2.73405, 6.78508], [2.74024, 6.92802], [2.71702, 6.95722], [2.76965, 7.13543], [2.74489, 7.42565], [2.79442, 7.43486], [2.78668, 7.5116], [2.73405, 7.5423], [2.73095, 7.7755], [2.67523, 7.87825], [2.77907, 9.06924], [3.08017, 9.10006], [3.14147, 9.28375], [3.13928, 9.47167], [3.25093, 9.61632], [3.34726, 9.70696], [3.32099, 9.78032], [3.35383, 9.83641], [3.54429, 9.87739], [3.66908, 10.18136], [3.57275, 10.27185], [3.6844, 10.46351], [3.78292, 10.40538], [3.84243, 10.59316], [3.71505, 11.13015], [3.49175, 11.29765], [3.59375, 11.70269]]]]
+         }
+       }, {
+         type: "Feature",
+         properties: {
+           iso1A2: "BL",
+           iso1A3: "BLM",
+           iso1N3: "652",
+           wikidata: "Q25362",
+           nameEn: "Saint-Barth\xE9lemy",
+           country: "FR",
+           groups: ["Q1451600", "029", "003", "419", "019", "UN"],
+           callingCodes: ["590"]
+         },
+         geometry: {
+           type: "MultiPolygon",
+           coordinates: [[[[-62.62718, 18.26185], [-63.1055, 17.86651], [-62.34423, 17.49165], [-62.62718, 18.26185]]]]
+         }
+       }, {
+         type: "Feature",
+         properties: {
+           iso1A2: "BM",
+           iso1A3: "BMU",
+           iso1N3: "060",
+           wikidata: "Q23635",
+           nameEn: "Bermuda",
+           country: "GB",
+           groups: ["BOTS", "021", "003", "019", "UN"],
+           driveSide: "left",
+           callingCodes: ["1 441"]
+         },
+         geometry: {
+           type: "MultiPolygon",
+           coordinates: [[[[-63.20987, 32.6953], [-65.31453, 32.68437], [-65.63955, 31.43417], [-63.20987, 32.6953]]]]
+         }
+       }, {
+         type: "Feature",
+         properties: {
+           iso1A2: "BN",
+           iso1A3: "BRN",
+           iso1N3: "096",
+           wikidata: "Q921",
+           nameEn: "Brunei",
+           groups: ["Q36117", "035", "142", "UN"],
+           driveSide: "left",
+           callingCodes: ["673"]
+         },
+         geometry: {
+           type: "MultiPolygon",
+           coordinates: [[[[115.16236, 5.01011], [115.02521, 5.35005], [114.10166, 4.76112], [114.07448, 4.58441], [114.15813, 4.57], [114.26876, 4.49878], [114.32176, 4.34942], [114.32176, 4.2552], [114.4416, 4.27588], [114.49922, 4.13108], [114.64211, 4.00694], [114.78539, 4.12205], [114.88039, 4.4257], [114.83189, 4.42387], [114.77303, 4.72871], [114.8266, 4.75062], [114.88841, 4.81905], [114.96982, 4.81146], [114.99417, 4.88201], [115.05038, 4.90275], [115.02955, 4.82087], [115.02278, 4.74137], [115.04064, 4.63706], [115.07737, 4.53418], [115.09978, 4.39123], [115.31275, 4.30806], [115.36346, 4.33563], [115.2851, 4.42295], [115.27819, 4.63661], [115.20737, 4.8256], [115.15092, 4.87604], [115.16236, 5.01011]]]]
+         }
+       }, {
+         type: "Feature",
+         properties: {
+           iso1A2: "BO",
+           iso1A3: "BOL",
+           iso1N3: "068",
+           wikidata: "Q750",
+           nameEn: "Bolivia",
+           groups: ["005", "419", "019", "UN"],
+           callingCodes: ["591"]
+         },
+         geometry: {
+           type: "MultiPolygon",
+           coordinates: [[[[-63.90248, -12.52544], [-64.22539, -12.45267], [-64.30708, -12.46398], [-64.99778, -11.98604], [-65.30027, -11.48749], [-65.28141, -10.86289], [-65.35402, -10.78685], [-65.37923, -10.35141], [-65.29019, -9.86253], [-65.40615, -9.63894], [-65.56244, -9.84266], [-65.68343, -9.75323], [-67.17784, -10.34016], [-68.71533, -11.14749], [-68.7651, -11.0496], [-68.75179, -11.03688], [-68.75265, -11.02383], [-68.74802, -11.00891], [-69.42792, -10.93451], [-69.47839, -10.95254], [-69.57156, -10.94555], [-68.98115, -11.8979], [-68.65044, -12.50689], [-68.85615, -12.87769], [-68.8864, -13.40792], [-69.05265, -13.68546], [-68.88135, -14.18639], [-69.36254, -14.94634], [-69.14856, -15.23478], [-69.40336, -15.61358], [-69.20291, -16.16668], [-69.09986, -16.22693], [-68.96238, -16.194], [-68.79464, -16.33272], [-68.98358, -16.42165], [-69.04027, -16.57214], [-69.00853, -16.66769], [-69.16896, -16.72233], [-69.62883, -17.28142], [-69.46863, -17.37466], [-69.46897, -17.4988], [-69.46623, -17.60518], [-69.34126, -17.72753], [-69.28671, -17.94844], [-69.07496, -18.03715], [-69.14807, -18.16893], [-69.07432, -18.28259], [-68.94987, -18.93302], [-68.87082, -19.06003], [-68.80602, -19.08355], [-68.61989, -19.27584], [-68.41218, -19.40499], [-68.66761, -19.72118], [-68.54611, -19.84651], [-68.57132, -20.03134], [-68.74273, -20.08817], [-68.7276, -20.46178], [-68.44023, -20.62701], [-68.55383, -20.7355], [-68.53957, -20.91542], [-68.40403, -20.94562], [-68.18816, -21.28614], [-67.85114, -22.87076], [-67.54284, -22.89771], [-67.18382, -22.81525], [-66.7298, -22.23644], [-66.29714, -22.08741], [-66.24077, -21.77837], [-66.03836, -21.84829], [-66.04832, -21.9187], [-65.9261, -21.93335], [-65.7467, -22.10105], [-65.61166, -22.09504], [-65.58694, -22.09794], [-65.57743, -22.07675], [-65.47435, -22.08908], [-64.99524, -22.08255], [-64.90014, -22.12136], [-64.67174, -22.18957], [-64.58888, -22.25035], [-64.4176, -22.67692], [-64.35108, -22.73282], [-64.31489, -22.88824], [-64.22918, -22.55807], [-63.93287, -21.99934], [-63.70963, -21.99934], [-63.68113, -22.0544], [-63.66482, -21.99918], [-62.81124, -21.9987], [-62.8078, -22.12534], [-62.64455, -22.25091], [-62.2757, -21.06657], [-62.26883, -20.55311], [-61.93912, -20.10053], [-61.73723, -19.63958], [-60.00638, -19.2981], [-59.06965, -19.29148], [-58.23216, -19.80058], [-58.16225, -20.16193], [-57.8496, -19.98346], [-58.14215, -19.76276], [-57.78463, -19.03259], [-57.71113, -19.03161], [-57.69134, -19.00544], [-57.71995, -18.97546], [-57.71995, -18.89573], [-57.76764, -18.90087], [-57.56807, -18.25655], [-57.48237, -18.24219], [-57.69877, -17.8431], [-57.73949, -17.56095], [-57.90082, -17.44555], [-57.99661, -17.5273], [-58.32935, -17.28195], [-58.5058, -16.80958], [-58.30918, -16.3699], [-58.32431, -16.25861], [-58.41506, -16.32636], [-60.16069, -16.26479], [-60.23797, -15.50267], [-60.58224, -15.09887], [-60.23968, -15.09515], [-60.27887, -14.63021], [-60.46037, -14.22496], [-60.48053, -13.77981], [-61.05527, -13.50054], [-61.81151, -13.49564], [-63.76259, -12.42952], [-63.90248, -12.52544]]]]
+         }
+       }, {
+         type: "Feature",
+         properties: {
+           iso1A2: "BQ",
+           iso1A3: "BES",
+           iso1N3: "535",
+           wikidata: "Q27561",
+           nameEn: "Caribbean Netherlands",
+           country: "NL"
+         },
+         geometry: null
+       }, {
+         type: "Feature",
+         properties: {
+           iso1A2: "BR",
+           iso1A3: "BRA",
+           iso1N3: "076",
+           wikidata: "Q155",
+           nameEn: "Brazil",
+           groups: ["005", "419", "019", "UN"],
+           callingCodes: ["55"]
+         },
+         geometry: {
+           type: "MultiPolygon",
+           coordinates: [[[[-59.69361, 4.34069], [-59.78878, 4.45637], [-60.15953, 4.53456], [-60.04189, 4.69801], [-59.98129, 5.07097], [-60.20944, 5.28754], [-60.32352, 5.21299], [-60.73204, 5.20931], [-60.5802, 4.94312], [-60.86539, 4.70512], [-60.98303, 4.54167], [-61.15703, 4.49839], [-61.31457, 4.54167], [-61.29675, 4.44216], [-61.48569, 4.43149], [-61.54629, 4.2822], [-62.13094, 4.08309], [-62.44822, 4.18621], [-62.57656, 4.04754], [-62.74411, 4.03331], [-62.7655, 3.73099], [-62.98296, 3.59935], [-63.21111, 3.96219], [-63.4464, 3.9693], [-63.42233, 3.89995], [-63.50611, 3.83592], [-63.67099, 4.01731], [-63.70218, 3.91417], [-63.86082, 3.94796], [-63.99183, 3.90172], [-64.14512, 4.12932], [-64.57648, 4.12576], [-64.72977, 4.28931], [-64.84028, 4.24665], [-64.48379, 3.7879], [-64.02908, 2.79797], [-64.0257, 2.48156], [-63.39114, 2.4317], [-63.39827, 2.16098], [-64.06135, 1.94722], [-64.08274, 1.64792], [-64.34654, 1.35569], [-64.38932, 1.5125], [-65.11657, 1.12046], [-65.57288, 0.62856], [-65.50158, 0.92086], [-65.6727, 1.01353], [-66.28507, 0.74585], [-66.85795, 1.22998], [-67.08222, 1.17441], [-67.15784, 1.80439], [-67.299, 1.87494], [-67.40488, 2.22258], [-67.9292, 1.82455], [-68.18632, 2.00091], [-68.26699, 1.83463], [-68.18128, 1.72881], [-69.38621, 1.70865], [-69.53746, 1.76408], [-69.83491, 1.69353], [-69.82987, 1.07864], [-69.26017, 1.06856], [-69.14422, 0.84172], [-69.20976, 0.57958], [-69.47696, 0.71065], [-70.04162, 0.55437], [-70.03658, -0.19681], [-69.603, -0.51947], [-69.59796, -0.75136], [-69.4215, -1.01853], [-69.43395, -1.42219], [-69.94708, -4.2431], [-70.00888, -4.37833], [-70.11305, -4.27281], [-70.19582, -4.3607], [-70.33236, -4.15214], [-70.77601, -4.15717], [-70.96814, -4.36915], [-71.87003, -4.51661], [-72.64391, -5.0391], [-72.83973, -5.14765], [-73.24579, -6.05764], [-73.12983, -6.43852], [-73.73986, -6.87919], [-73.77011, -7.28944], [-73.96938, -7.58465], [-73.65485, -7.77897], [-73.76576, -7.89884], [-72.92886, -9.04074], [-73.21498, -9.40904], [-72.72216, -9.41397], [-72.31883, -9.5184], [-72.14742, -9.98049], [-71.23394, -9.9668], [-70.53373, -9.42628], [-70.58453, -9.58303], [-70.55429, -9.76692], [-70.62487, -9.80666], [-70.64134, -11.0108], [-70.51395, -10.92249], [-70.38791, -11.07096], [-69.90896, -10.92744], [-69.57835, -10.94051], [-69.57156, -10.94555], [-69.47839, -10.95254], [-69.42792, -10.93451], [-68.74802, -11.00891], [-68.75265, -11.02383], [-68.75179, -11.03688], [-68.7651, -11.0496], [-68.71533, -11.14749], [-67.17784, -10.34016], [-65.68343, -9.75323], [-65.56244, -9.84266], [-65.40615, -9.63894], [-65.29019, -9.86253], [-65.37923, -10.35141], [-65.35402, -10.78685], [-65.28141, -10.86289], [-65.30027, -11.48749], [-64.99778, -11.98604], [-64.30708, -12.46398], [-64.22539, -12.45267], [-63.90248, -12.52544], [-63.76259, -12.42952], [-61.81151, -13.49564], [-61.05527, -13.50054], [-60.48053, -13.77981], [-60.46037, -14.22496], [-60.27887, -14.63021], [-60.23968, -15.09515], [-60.58224, -15.09887], [-60.23797, -15.50267], [-60.16069, -16.26479], [-58.41506, -16.32636], [-58.32431, -16.25861], [-58.30918, -16.3699], [-58.5058, -16.80958], [-58.32935, -17.28195], [-57.99661, -17.5273], [-57.90082, -17.44555], [-57.73949, -17.56095], [-57.69877, -17.8431], [-57.48237, -18.24219], [-57.56807, -18.25655], [-57.76764, -18.90087], [-57.71995, -18.89573], [-57.71995, -18.97546], [-57.69134, -19.00544], [-57.71113, -19.03161], [-57.78463, -19.03259], [-58.14215, -19.76276], [-57.8496, -19.98346], [-58.16225, -20.16193], [-57.84536, -20.93155], [-57.93492, -21.65505], [-57.88239, -21.6868], [-57.94642, -21.73799], [-57.98625, -22.09157], [-56.6508, -22.28387], [-56.5212, -22.11556], [-56.45893, -22.08072], [-56.23206, -22.25347], [-55.8331, -22.29008], [-55.74941, -22.46436], [-55.741, -22.52018], [-55.72366, -22.5519], [-55.6986, -22.56268], [-55.68742, -22.58407], [-55.62493, -22.62765], [-55.63849, -22.95122], [-55.5446, -23.22811], [-55.52288, -23.2595], [-55.5555, -23.28237], [-55.43585, -23.87157], [-55.44117, -23.9185], [-55.41784, -23.9657], [-55.12292, -23.99669], [-55.0518, -23.98666], [-55.02691, -23.97317], [-54.6238, -23.83078], [-54.32807, -24.01865], [-54.28207, -24.07305], [-54.4423, -25.13381], [-54.62033, -25.46026], [-54.60196, -25.48397], [-54.59509, -25.53696], [-54.59398, -25.59224], [-54.5502, -25.58915], [-54.52926, -25.62846], [-53.90831, -25.55513], [-53.83691, -25.94849], [-53.73511, -26.04211], [-53.73086, -26.05842], [-53.7264, -26.0664], [-53.73391, -26.07006], [-53.73968, -26.10012], [-53.65018, -26.19501], [-53.65237, -26.23289], [-53.63739, -26.2496], [-53.63881, -26.25075], [-53.64632, -26.24798], [-53.64186, -26.25976], [-53.64505, -26.28089], [-53.68269, -26.33359], [-53.73372, -26.6131], [-53.80144, -27.09844], [-54.15978, -27.2889], [-54.19062, -27.27639], [-54.19268, -27.30751], [-54.41888, -27.40882], [-54.50416, -27.48232], [-54.67657, -27.57214], [-54.90159, -27.63132], [-54.90805, -27.73149], [-55.1349, -27.89759], [-55.16872, -27.86224], [-55.33303, -27.94661], [-55.6262, -28.17124], [-55.65418, -28.18304], [-56.01729, -28.51223], [-56.00458, -28.60421], [-56.05265, -28.62651], [-56.54171, -29.11447], [-56.57295, -29.11357], [-56.62789, -29.18073], [-56.81251, -29.48154], [-57.09386, -29.74211], [-57.65132, -30.19229], [-57.22502, -30.26121], [-56.90236, -30.02578], [-56.49267, -30.39471], [-56.4795, -30.3899], [-56.4619, -30.38457], [-55.87388, -31.05053], [-55.58866, -30.84117], [-55.5634, -30.8686], [-55.55373, -30.8732], [-55.55218, -30.88193], [-55.54572, -30.89051], [-55.53431, -30.89714], [-55.53276, -30.90218], [-55.52712, -30.89997], [-55.51862, -30.89828], [-55.50841, -30.9027], [-55.50821, -30.91349], [-54.17384, -31.86168], [-53.76024, -32.0751], [-53.39572, -32.58596], [-53.37671, -32.57005], [-53.1111, -32.71147], [-53.53459, -33.16843], [-53.52794, -33.68908], [-53.44031, -33.69344], [-53.39593, -33.75169], [-53.37138, -33.74313], [-52.83257, -34.01481], [-28.34015, -20.99094], [-28.99601, 1.86593], [-51.35485, 4.8383], [-51.63798, 4.51394], [-51.61983, 4.14596], [-51.79599, 3.89336], [-51.82312, 3.85825], [-51.85573, 3.83427], [-52.31787, 3.17896], [-52.6906, 2.37298], [-52.96539, 2.1881], [-53.78743, 2.34412], [-54.16286, 2.10779], [-54.6084, 2.32856], [-55.01919, 2.564], [-55.71493, 2.40342], [-55.96292, 2.53188], [-56.13054, 2.27723], [-55.92159, 2.05236], [-55.89863, 1.89861], [-55.99278, 1.83137], [-56.47045, 1.95135], [-56.7659, 1.89509], [-57.07092, 1.95304], [-57.09109, 2.01854], [-57.23981, 1.95808], [-57.35073, 1.98327], [-57.55743, 1.69605], [-57.77281, 1.73344], [-57.97336, 1.64566], [-58.01873, 1.51966], [-58.33887, 1.58014], [-58.4858, 1.48399], [-58.53571, 1.29154], [-58.84229, 1.17749], [-58.92072, 1.31293], [-59.25583, 1.40559], [-59.74066, 1.87596], [-59.7264, 2.27497], [-59.91177, 2.36759], [-59.99733, 2.92312], [-59.79769, 3.37162], [-59.86899, 3.57089], [-59.51963, 3.91951], [-59.73353, 4.20399], [-59.69361, 4.34069]]]]
+         }
+       }, {
+         type: "Feature",
+         properties: {
+           iso1A2: "BS",
+           iso1A3: "BHS",
+           iso1N3: "044",
+           wikidata: "Q778",
+           nameEn: "The Bahamas",
+           groups: ["029", "003", "419", "019", "UN"],
+           driveSide: "left",
+           roadSpeedUnit: "mph",
+           callingCodes: ["1 242"]
+         },
+         geometry: {
+           type: "MultiPolygon",
+           coordinates: [[[[-72.98446, 20.4801], [-71.70065, 25.7637], [-78.91214, 27.76553], [-80.65727, 23.71953], [-72.98446, 20.4801]]]]
+         }
+       }, {
+         type: "Feature",
+         properties: {
+           iso1A2: "BT",
+           iso1A3: "BTN",
+           iso1N3: "064",
+           wikidata: "Q917",
+           nameEn: "Bhutan",
+           groups: ["034", "142", "UN"],
+           driveSide: "left",
+           callingCodes: ["975"]
+         },
+         geometry: {
+           type: "MultiPolygon",
+           coordinates: [[[[91.6469, 27.76358], [91.5629, 27.84823], [91.48973, 27.93903], [91.46327, 28.0064], [91.25779, 28.07509], [91.20019, 27.98715], [90.69894, 28.07784], [90.58842, 28.02838], [90.13387, 28.19178], [89.79762, 28.23979], [89.59525, 28.16433], [89.12825, 27.62502], [89.0582, 27.60985], [88.97213, 27.51671], [88.95355, 27.4106], [89.00216, 27.32532], [88.96947, 27.30319], [88.93678, 27.33777], [88.91901, 27.32483], [88.74219, 27.144], [88.86984, 27.10937], [88.8714, 26.97488], [88.92301, 26.99286], [88.95807, 26.92668], [89.09554, 26.89089], [89.12825, 26.81661], [89.1926, 26.81329], [89.37913, 26.86224], [89.38319, 26.85963], [89.3901, 26.84225], [89.42349, 26.83727], [89.63369, 26.74402], [89.86124, 26.73307], [90.04535, 26.72422], [90.30402, 26.85098], [90.39271, 26.90704], [90.48504, 26.8594], [90.67715, 26.77215], [91.50067, 26.79223], [91.83181, 26.87318], [92.05523, 26.8692], [92.11863, 26.893], [92.03457, 27.07334], [92.04702, 27.26861], [92.12019, 27.27829], [92.01132, 27.47352], [91.65007, 27.48287], [91.55819, 27.6144], [91.6469, 27.76358]]]]
+         }
+       }, {
+         type: "Feature",
+         properties: {
+           iso1A2: "BV",
+           iso1A3: "BVT",
+           iso1N3: "074",
+           wikidata: "Q23408",
+           nameEn: "Bouvet Island",
+           country: "NO",
+           groups: ["005", "419", "019", "UN"]
+         },
+         geometry: {
+           type: "MultiPolygon",
+           coordinates: [[[[4.54042, -54.0949], [2.28941, -54.13089], [3.35353, -55.17558], [4.54042, -54.0949]]]]
+         }
+       }, {
+         type: "Feature",
+         properties: {
+           iso1A2: "BW",
+           iso1A3: "BWA",
+           iso1N3: "072",
+           wikidata: "Q963",
+           nameEn: "Botswana",
+           groups: ["018", "202", "002", "UN"],
+           driveSide: "left",
+           callingCodes: ["267"]
+         },
+         geometry: {
+           type: "MultiPolygon",
+           coordinates: [[[[25.26433, -17.79571], [25.16882, -17.78253], [25.05895, -17.84452], [24.95586, -17.79674], [24.73364, -17.89338], [24.71887, -17.9218], [24.6303, -17.9863], [24.57485, -18.07151], [24.40577, -17.95726], [24.19416, -18.01919], [23.61088, -18.4881], [23.29618, -17.99855], [23.0996, -18.00075], [21.45556, -18.31795], [20.99904, -18.31743], [20.99751, -22.00026], [19.99912, -21.99991], [19.99817, -24.76768], [20.02809, -24.78725], [20.03678, -24.81004], [20.29826, -24.94869], [20.64795, -25.47827], [20.86081, -26.14892], [20.61754, -26.4692], [20.63275, -26.78181], [20.68596, -26.9039], [20.87031, -26.80047], [21.13353, -26.86661], [21.37869, -26.82083], [21.69322, -26.86152], [21.7854, -26.79199], [21.77114, -26.69015], [21.83291, -26.65959], [21.90703, -26.66808], [22.06192, -26.61882], [22.21206, -26.3773], [22.41921, -26.23078], [22.56365, -26.19668], [22.70808, -25.99186], [22.86012, -25.50572], [23.03497, -25.29971], [23.47588, -25.29971], [23.9244, -25.64286], [24.18287, -25.62916], [24.36531, -25.773], [24.44703, -25.73021], [24.67319, -25.81749], [24.8946, -25.80723], [25.01718, -25.72507], [25.12266, -25.75931], [25.33076, -25.76616], [25.58543, -25.6343], [25.6643, -25.4491], [25.69661, -25.29284], [25.72702, -25.25503], [25.88571, -24.87802], [25.84295, -24.78661], [25.8515, -24.75727], [26.39409, -24.63468], [26.46346, -24.60358], [26.51667, -24.47219], [26.84165, -24.24885], [26.99749, -23.65486], [27.33768, -23.40917], [27.52393, -23.37952], [27.6066, -23.21894], [27.74154, -23.2137], [27.93539, -23.04941], [27.93729, -22.96194], [28.04752, -22.90243], [28.04562, -22.8394], [28.34874, -22.5694], [28.63287, -22.55887], [28.91889, -22.44299], [29.0151, -22.22907], [29.10881, -22.21202], [29.15268, -22.21399], [29.18974, -22.18599], [29.21955, -22.17771], [29.37703, -22.19581], [29.3533, -22.18363], [29.24648, -22.05967], [29.1974, -22.07472], [29.14501, -22.07275], [29.08495, -22.04867], [29.04108, -22.00563], [29.02191, -21.95665], [29.02191, -21.90647], [29.04023, -21.85864], [29.07763, -21.81877], [28.58114, -21.63455], [28.49942, -21.66634], [28.29416, -21.59037], [28.01669, -21.57624], [27.91407, -21.31621], [27.69171, -21.08409], [27.72972, -20.51735], [27.69361, -20.48531], [27.28865, -20.49873], [27.29831, -20.28935], [27.21278, -20.08244], [26.72246, -19.92707], [26.17227, -19.53709], [25.96226, -19.08152], [25.99837, -19.02943], [25.94326, -18.90362], [25.82353, -18.82808], [25.79217, -18.6355], [25.68859, -18.56165], [25.53465, -18.39041], [25.39972, -18.12691], [25.31799, -18.07091], [25.23909, -17.90832], [25.26433, -17.79571]]]]
+         }
+       }, {
+         type: "Feature",
+         properties: {
+           iso1A2: "BY",
+           iso1A3: "BLR",
+           iso1N3: "112",
+           wikidata: "Q184",
+           nameEn: "Belarus",
+           groups: ["151", "150", "UN"],
+           callingCodes: ["375"]
+         },
+         geometry: {
+           type: "MultiPolygon",
+           coordinates: [[[[28.15217, 56.16964], [27.97865, 56.11849], [27.63065, 55.89687], [27.61683, 55.78558], [27.3541, 55.8089], [27.27804, 55.78299], [27.1559, 55.85032], [26.97153, 55.8102], [26.87448, 55.7172], [26.76872, 55.67658], [26.71802, 55.70645], [26.64888, 55.70515], [26.63231, 55.67968], [26.63167, 55.57887], [26.55094, 55.5093], [26.5522, 55.40277], [26.44937, 55.34832], [26.5709, 55.32572], [26.6714, 55.33902], [26.80929, 55.31642], [26.83266, 55.30444], [26.835, 55.28182], [26.73017, 55.24226], [26.72983, 55.21788], [26.68075, 55.19787], [26.69243, 55.16718], [26.54753, 55.14181], [26.51481, 55.16051], [26.46249, 55.12814], [26.35121, 55.1525], [26.30628, 55.12536], [26.23202, 55.10439], [26.26941, 55.08032], [26.20397, 54.99729], [26.13386, 54.98924], [26.05907, 54.94631], [25.99129, 54.95705], [25.89462, 54.93438], [25.74122, 54.80108], [25.75977, 54.57252], [25.68045, 54.5321], [25.64813, 54.48704], [25.62203, 54.4656], [25.63371, 54.42075], [25.5376, 54.33158], [25.55425, 54.31591], [25.68513, 54.31727], [25.78553, 54.23327], [25.78563, 54.15747], [25.71084, 54.16704], [25.64875, 54.1259], [25.54724, 54.14925], [25.51452, 54.17799], [25.56823, 54.25212], [25.509, 54.30267], [25.35559, 54.26544], [25.22705, 54.26271], [25.19199, 54.219], [25.0728, 54.13419], [24.991, 54.14241], [24.96894, 54.17589], [24.77131, 54.11091], [24.85311, 54.02862], [24.74279, 53.96663], [24.69185, 53.96543], [24.69652, 54.01901], [24.62275, 54.00217], [24.44411, 53.90076], [24.34128, 53.90076], [24.19638, 53.96405], [23.98837, 53.92554], [23.95098, 53.9613], [23.81309, 53.94205], [23.80543, 53.89558], [23.71726, 53.93379], [23.61677, 53.92691], [23.51284, 53.95052], [23.62004, 53.60942], [23.81995, 53.24131], [23.85657, 53.22923], [23.91393, 53.16469], [23.87548, 53.0831], [23.92184, 53.02079], [23.94689, 52.95919], [23.91805, 52.94016], [23.93763, 52.71332], [23.73615, 52.6149], [23.58296, 52.59868], [23.45112, 52.53774], [23.34141, 52.44845], [23.18196, 52.28812], [23.20071, 52.22848], [23.47859, 52.18215], [23.54314, 52.12148], [23.61, 52.11264], [23.64066, 52.07626], [23.68733, 51.9906], [23.61523, 51.92066], [23.62691, 51.78208], [23.53198, 51.74298], [23.57053, 51.55938], [23.56236, 51.53673], [23.62751, 51.50512], [23.6736, 51.50255], [23.60906, 51.62122], [23.7766, 51.66809], [23.91118, 51.63316], [23.8741, 51.59734], [23.99907, 51.58369], [24.13075, 51.66979], [24.3163, 51.75063], [24.29021, 51.80841], [24.37123, 51.88222], [24.98784, 51.91273], [25.20228, 51.97143], [25.46163, 51.92205], [25.73673, 51.91973], [25.80574, 51.94556], [25.83217, 51.92587], [26.00408, 51.92967], [26.19084, 51.86781], [26.39367, 51.87315], [26.46962, 51.80501], [26.69759, 51.82284], [26.80043, 51.75777], [26.9489, 51.73788], [26.99422, 51.76933], [27.20602, 51.77291], [27.20948, 51.66713], [27.26613, 51.65957], [27.24828, 51.60161], [27.47212, 51.61184], [27.51058, 51.5854], [27.55727, 51.63486], [27.71932, 51.60672], [27.67125, 51.50854], [27.76052, 51.47604], [27.85253, 51.62293], [27.91844, 51.61952], [27.95827, 51.56065], [28.10658, 51.57857], [28.23452, 51.66988], [28.37592, 51.54505], [28.47051, 51.59734], [28.64429, 51.5664], [28.69161, 51.44695], [28.73143, 51.46236], [28.75615, 51.41442], [28.78224, 51.45294], [28.76027, 51.48802], [28.81795, 51.55552], [28.95528, 51.59222], [28.99098, 51.56833], [29.1187, 51.65872], [29.16402, 51.64679], [29.20659, 51.56918], [29.25603, 51.57089], [29.25191, 51.49828], [29.32881, 51.37843], [29.42357, 51.4187], [29.49773, 51.39814], [29.54372, 51.48372], [29.7408, 51.53417], [29.77376, 51.4461], [30.17888, 51.51025], [30.34642, 51.42555], [30.36153, 51.33984], [30.56203, 51.25655], [30.64992, 51.35014], [30.51946, 51.59649], [30.68804, 51.82806], [30.76443, 51.89739], [30.90897, 52.00699], [30.95589, 52.07775], [31.13332, 52.1004], [31.25142, 52.04131], [31.38326, 52.12991], [31.7822, 52.11406], [31.77877, 52.18636], [31.6895, 52.1973], [31.70735, 52.26711], [31.57971, 52.32146], [31.62084, 52.33849], [31.61397, 52.48843], [31.56316, 52.51518], [31.63869, 52.55361], [31.50406, 52.69707], [31.57277, 52.71613], [31.592, 52.79011], [31.35667, 52.97854], [31.24147, 53.031], [31.32283, 53.04101], [31.33519, 53.08805], [31.3915, 53.09712], [31.36403, 53.13504], [31.40523, 53.21406], [31.56316, 53.19432], [31.62496, 53.22886], [31.787, 53.18033], [31.82373, 53.10042], [32.15368, 53.07594], [32.40773, 53.18856], [32.51725, 53.28431], [32.73257, 53.33494], [32.74968, 53.45597], [32.47777, 53.5548], [32.40499, 53.6656], [32.50112, 53.68594], [32.45717, 53.74039], [32.36663, 53.7166], [32.12621, 53.81586], [31.89137, 53.78099], [31.77028, 53.80015], [31.85019, 53.91801], [31.88744, 54.03653], [31.89599, 54.0837], [31.57002, 54.14535], [31.30791, 54.25315], [31.3177, 54.34067], [31.22945, 54.46585], [31.08543, 54.50361], [31.21399, 54.63113], [31.19339, 54.66947], [30.99187, 54.67046], [30.98226, 54.68872], [31.0262, 54.70698], [30.97127, 54.71967], [30.95479, 54.74346], [30.75165, 54.80699], [30.8264, 54.90062], [30.81759, 54.94064], [30.93144, 54.9585], [30.95754, 54.98609], [30.9081, 55.02232], [30.94243, 55.03964], [31.00972, 55.02783], [31.02071, 55.06167], [30.97369, 55.17134], [30.87944, 55.28223], [30.81946, 55.27931], [30.8257, 55.3313], [30.93144, 55.3914], [30.90123, 55.46621], [30.95204, 55.50667], [30.93419, 55.6185], [30.86003, 55.63169], [30.7845, 55.58514], [30.72957, 55.66268], [30.67464, 55.64176], [30.63344, 55.73079], [30.51037, 55.76568], [30.51346, 55.78982], [30.48257, 55.81066], [30.30987, 55.83592], [30.27776, 55.86819], [30.12136, 55.8358], [29.97975, 55.87281], [29.80672, 55.79569], [29.61446, 55.77716], [29.51283, 55.70294], [29.3604, 55.75862], [29.44692, 55.95978], [29.21717, 55.98971], [29.08299, 56.03427], [28.73418, 55.97131], [28.63668, 56.07262], [28.68337, 56.10173], [28.5529, 56.11705], [28.43068, 56.09407], [28.37987, 56.11399], [28.36888, 56.05805], [28.30571, 56.06035], [28.15217, 56.16964]]]]
+         }
+       }, {
+         type: "Feature",
+         properties: {
+           iso1A2: "BZ",
+           iso1A3: "BLZ",
+           iso1N3: "084",
+           wikidata: "Q242",
+           nameEn: "Belize",
+           groups: ["013", "003", "419", "019", "UN"],
+           roadSpeedUnit: "mph",
+           callingCodes: ["501"]
+         },
+         geometry: {
+           type: "MultiPolygon",
+           coordinates: [[[[-88.3268, 18.49048], [-88.48242, 18.49164], [-88.71505, 18.0707], [-88.8716, 17.89535], [-89.03839, 18.0067], [-89.15105, 17.95104], [-89.14985, 17.81563], [-89.15025, 17.04813], [-89.22683, 15.88619], [-89.17418, 15.90898], [-89.02415, 15.9063], [-88.95358, 15.88698], [-88.40779, 16.09624], [-86.92368, 17.61462], [-87.84815, 18.18511], [-87.85693, 18.18266], [-87.86657, 18.19971], [-87.87604, 18.18313], [-87.90671, 18.15213], [-88.03165, 18.16657], [-88.03238, 18.41778], [-88.26593, 18.47617], [-88.29909, 18.47591], [-88.3268, 18.49048]]]]
+         }
+       }, {
+         type: "Feature",
+         properties: {
+           iso1A2: "CA",
+           iso1A3: "CAN",
+           iso1N3: "124",
+           wikidata: "Q16",
+           nameEn: "Canada",
+           groups: ["021", "003", "019", "UN"],
+           callingCodes: ["1"]
+         },
+         geometry: {
+           type: "MultiPolygon",
+           coordinates: [[[[-67.20349, 45.1722], [-67.19603, 45.16771], [-67.15965, 45.16179], [-67.11316, 45.11176], [-67.0216, 44.95333], [-66.96824, 44.90965], [-66.98249, 44.87071], [-66.96824, 44.83078], [-66.93432, 44.82597], [-67.16117, 44.20069], [-61.98255, 37.34815], [-56.27503, 47.39728], [-53.12387, 41.40385], [-46.37635, 57.3249], [-77.52957, 77.23408], [-68.21821, 80.48551], [-49.33696, 84.57952], [-140.97446, 84.39275], [-141.00116, 60.30648], [-140.5227, 60.22077], [-140.45648, 60.30919], [-139.98024, 60.18027], [-139.68991, 60.33693], [-139.05831, 60.35205], [-139.20603, 60.08896], [-139.05365, 59.99655], [-138.71149, 59.90728], [-138.62145, 59.76431], [-137.60623, 59.24465], [-137.4925, 58.89415], [-136.82619, 59.16198], [-136.52365, 59.16752], [-136.47323, 59.46617], [-136.33727, 59.44466], [-136.22381, 59.55526], [-136.31566, 59.59083], [-135.48007, 59.79937], [-135.03069, 59.56208], [-135.00267, 59.28745], [-134.7047, 59.2458], [-134.55699, 59.1297], [-134.48059, 59.13231], [-134.27175, 58.8634], [-133.84645, 58.73543], [-133.38523, 58.42773], [-131.8271, 56.62247], [-130.77769, 56.36185], [-130.33965, 56.10849], [-130.10173, 56.12178], [-130.00093, 56.00325], [-130.00857, 55.91344], [-130.15373, 55.74895], [-129.97513, 55.28029], [-130.08035, 55.21556], [-130.18765, 55.07744], [-130.27203, 54.97174], [-130.44184, 54.85377], [-130.64499, 54.76912], [-130.61931, 54.70835], [-133.92876, 54.62289], [-133.36909, 48.51151], [-125.03842, 48.53282], [-123.50039, 48.21223], [-123.15614, 48.35395], [-123.26565, 48.6959], [-123.0093, 48.76586], [-123.0093, 48.83186], [-123.32163, 49.00419], [-95.15355, 48.9996], [-95.15357, 49.384], [-95.12903, 49.37056], [-95.05825, 49.35311], [-95.01419, 49.35647], [-94.99532, 49.36579], [-94.95681, 49.37035], [-94.85381, 49.32492], [-94.8159, 49.32299], [-94.82487, 49.29483], [-94.77355, 49.11998], [-94.75017, 49.09931], [-94.687, 48.84077], [-94.70087, 48.8339], [-94.70486, 48.82365], [-94.69669, 48.80918], [-94.69335, 48.77883], [-94.58903, 48.71803], [-94.54885, 48.71543], [-94.53826, 48.70216], [-94.44258, 48.69223], [-94.4174, 48.71049], [-94.27153, 48.70232], [-94.25172, 48.68404], [-94.25104, 48.65729], [-94.23215, 48.65202], [-93.85769, 48.63284], [-93.83288, 48.62745], [-93.80676, 48.58232], [-93.80939, 48.52439], [-93.79267, 48.51631], [-93.66382, 48.51845], [-93.47022, 48.54357], [-93.44472, 48.59147], [-93.40693, 48.60948], [-93.39758, 48.60364], [-93.3712, 48.60599], [-93.33946, 48.62787], [-93.25391, 48.64266], [-92.94973, 48.60866], [-92.7287, 48.54005], [-92.6342, 48.54133], [-92.62747, 48.50278], [-92.69927, 48.49573], [-92.71323, 48.46081], [-92.65606, 48.43471], [-92.50712, 48.44921], [-92.45588, 48.40624], [-92.48147, 48.36609], [-92.37185, 48.22259], [-92.27167, 48.25046], [-92.30939, 48.31251], [-92.26662, 48.35651], [-92.202, 48.35252], [-92.14732, 48.36578], [-92.05339, 48.35958], [-91.98929, 48.25409], [-91.86125, 48.21278], [-91.71231, 48.19875], [-91.70451, 48.11805], [-91.55649, 48.10611], [-91.58025, 48.04339], [-91.45829, 48.07454], [-91.43248, 48.04912], [-91.25025, 48.08522], [-91.08016, 48.18096], [-90.87588, 48.2484], [-90.75045, 48.09143], [-90.56444, 48.12184], [-90.56312, 48.09488], [-90.07418, 48.11043], [-89.89974, 47.98109], [-89.77248, 48.02607], [-89.57972, 48.00023], [-89.48837, 48.01412], [-88.37033, 48.30586], [-84.85871, 46.88881], [-84.55635, 46.45974], [-84.47607, 46.45225], [-84.4481, 46.48972], [-84.42101, 46.49853], [-84.34174, 46.50683], [-84.29893, 46.49127], [-84.26351, 46.49508], [-84.2264, 46.53337], [-84.1945, 46.54061], [-84.17723, 46.52753], [-84.12885, 46.53068], [-84.11196, 46.50248], [-84.13451, 46.39218], [-84.11254, 46.32329], [-84.11615, 46.2681], [-84.09756, 46.25512], [-84.1096, 46.23987], [-83.95399, 46.05634], [-83.90453, 46.05922], [-83.83329, 46.12169], [-83.57017, 46.105], [-83.43746, 45.99749], [-83.59589, 45.82131], [-82.48419, 45.30225], [-82.42469, 42.992], [-82.4146, 42.97626], [-82.4253, 42.95423], [-82.45331, 42.93139], [-82.4826, 42.8068], [-82.46613, 42.76615], [-82.51063, 42.66025], [-82.51858, 42.611], [-82.57583, 42.5718], [-82.58873, 42.54984], [-82.64242, 42.55594], [-82.82964, 42.37355], [-83.02253, 42.33045], [-83.07837, 42.30978], [-83.09837, 42.28877], [-83.12724, 42.2376], [-83.14962, 42.04089], [-83.11184, 41.95671], [-82.67862, 41.67615], [-78.93684, 42.82887], [-78.90712, 42.89733], [-78.90905, 42.93022], [-78.93224, 42.95229], [-78.96312, 42.95509], [-78.98126, 42.97], [-79.02074, 42.98444], [-79.02424, 43.01983], [-78.99941, 43.05612], [-79.01055, 43.06659], [-79.07486, 43.07845], [-79.05671, 43.10937], [-79.06881, 43.12029], [-79.0427, 43.13934], [-79.04652, 43.16396], [-79.05384, 43.17418], [-79.05002, 43.20133], [-79.05544, 43.21224], [-79.05512, 43.25375], [-79.06921, 43.26183], [-79.25796, 43.54052], [-76.79706, 43.63099], [-76.43859, 44.09393], [-76.35324, 44.13493], [-76.31222, 44.19894], [-76.244, 44.19643], [-76.1664, 44.23051], [-76.16285, 44.28262], [-76.00018, 44.34896], [-75.95947, 44.34463], [-75.8217, 44.43176], [-75.76813, 44.51537], [-75.41441, 44.76614], [-75.2193, 44.87821], [-75.01363, 44.95608], [-74.99101, 44.98051], [-74.8447, 45.00606], [-74.66689, 45.00646], [-74.32699, 44.99029], [-73.35025, 45.00942], [-71.50067, 45.01357], [-71.48735, 45.07784], [-71.42778, 45.12624], [-71.40364, 45.21382], [-71.44252, 45.2361], [-71.37133, 45.24624], [-71.29371, 45.29996], [-71.22338, 45.25184], [-71.19723, 45.25438], [-71.14568, 45.24128], [-71.08364, 45.30623], [-71.01866, 45.31573], [-71.0107, 45.34819], [-70.95193, 45.33895], [-70.91169, 45.29849], [-70.89864, 45.2398], [-70.84816, 45.22698], [-70.80236, 45.37444], [-70.82638, 45.39828], [-70.78372, 45.43269], [-70.65383, 45.37592], [-70.62518, 45.42286], [-70.72651, 45.49771], [-70.68516, 45.56964], [-70.54019, 45.67291], [-70.38934, 45.73215], [-70.41523, 45.79497], [-70.25976, 45.89675], [-70.24694, 45.95138], [-70.31025, 45.96424], [-70.23855, 46.1453], [-70.29078, 46.18832], [-70.18547, 46.35357], [-70.05812, 46.41768], [-69.99966, 46.69543], [-69.22119, 47.46461], [-69.05148, 47.42012], [-69.05073, 47.30076], [-69.05039, 47.2456], [-68.89222, 47.1807], [-68.70125, 47.24399], [-68.60575, 47.24659], [-68.57914, 47.28431], [-68.38332, 47.28723], [-68.37458, 47.35851], [-68.23244, 47.35712], [-67.94843, 47.1925], [-67.87993, 47.10377], [-67.78578, 47.06473], [-67.78111, 45.9392], [-67.75196, 45.91814], [-67.80961, 45.87531], [-67.75654, 45.82324], [-67.80653, 45.80022], [-67.80705, 45.69528], [-67.6049, 45.60725], [-67.43815, 45.59162], [-67.42144, 45.50584], [-67.50578, 45.48971], [-67.42394, 45.37969], [-67.48201, 45.27351], [-67.34927, 45.122], [-67.29754, 45.14865], [-67.29748, 45.18173], [-67.27039, 45.1934], [-67.22751, 45.16344], [-67.20349, 45.1722]]]]
+         }
+       }, {
+         type: "Feature",
+         properties: {
+           iso1A2: "CC",
+           iso1A3: "CCK",
+           iso1N3: "166",
+           wikidata: "Q36004",
+           nameEn: "Cocos (Keeling) Islands",
+           country: "AU",
+           groups: ["053", "009", "UN"],
+           driveSide: "left",
+           callingCodes: ["61"]
+         },
+         geometry: {
+           type: "MultiPolygon",
+           coordinates: [[[[96.61846, -10.82438], [96.02343, -12.68334], [97.93979, -12.33309], [96.61846, -10.82438]]]]
+         }
+       }, {
+         type: "Feature",
+         properties: {
+           iso1A2: "CD",
+           iso1A3: "COD",
+           iso1N3: "180",
+           wikidata: "Q974",
+           nameEn: "Democratic Republic of the Congo",
+           aliases: ["ZR"],
+           groups: ["017", "202", "002", "UN"],
+           callingCodes: ["243"]
+         },
+         geometry: {
+           type: "MultiPolygon",
+           coordinates: [[[[27.44012, 5.07349], [27.09575, 5.22305], [26.93064, 5.13535], [26.85579, 5.03887], [26.74572, 5.10685], [26.48595, 5.04984], [26.13371, 5.25594], [25.86073, 5.19455], [25.53271, 5.37431], [25.34558, 5.29101], [25.31256, 5.03668], [24.71816, 4.90509], [24.46719, 5.0915], [23.38847, 4.60013], [22.94817, 4.82392], [22.89094, 4.79321], [22.84691, 4.69887], [22.78526, 4.71423], [22.6928, 4.47285], [22.60915, 4.48821], [22.5431, 4.22041], [22.45504, 4.13039], [22.27682, 4.11347], [22.10721, 4.20723], [21.6405, 4.317], [21.55904, 4.25553], [21.25744, 4.33676], [21.21341, 4.29285], [21.11214, 4.33895], [21.08793, 4.39603], [20.90383, 4.44877], [20.60184, 4.42394], [18.62755, 3.47564], [18.63857, 3.19342], [18.10683, 2.26876], [18.08034, 1.58553], [17.85887, 1.04327], [17.86989, 0.58873], [17.95255, 0.48128], [17.93877, 0.32424], [17.81204, 0.23884], [17.66051, -0.26535], [17.72112, -0.52707], [17.32438, -0.99265], [16.97999, -1.12762], [16.70724, -1.45815], [16.50336, -1.8795], [16.16173, -2.16586], [16.22785, -2.59528], [16.1755, -3.25014], [16.21407, -3.2969], [15.89448, -3.9513], [15.53081, -4.042], [15.48121, -4.22062], [15.41785, -4.28381], [15.32693, -4.27282], [15.25411, -4.31121], [15.1978, -4.32388], [14.83101, -4.80838], [14.67948, -4.92093], [14.5059, -4.84956], [14.41499, -4.8825], [14.37366, -4.56125], [14.47284, -4.42941], [14.3957, -4.36623], [14.40672, -4.28381], [13.9108, -4.50906], [13.81162, -4.41842], [13.71794, -4.44864], [13.70417, -4.72601], [13.50305, -4.77818], [13.41764, -4.89897], [13.11182, -4.5942], [13.09648, -4.63739], [13.11195, -4.67745], [12.8733, -4.74346], [12.70868, -4.95505], [12.63465, -4.94632], [12.60251, -5.01715], [12.46297, -5.09408], [12.49815, -5.14058], [12.51589, -5.1332], [12.53586, -5.14658], [12.53599, -5.1618], [12.52301, -5.17481], [12.52318, -5.74353], [12.26557, -5.74031], [12.20376, -5.76338], [11.95767, -5.94705], [12.42245, -6.07585], [13.04371, -5.87078], [16.55507, -5.85631], [16.96282, -7.21787], [17.5828, -8.13784], [18.33635, -8.00126], [19.33698, -7.99743], [19.5469, -7.00195], [20.30218, -6.98955], [20.31846, -6.91953], [20.61689, -6.90876], [20.56263, -7.28566], [21.79824, -7.29628], [21.84856, -9.59871], [22.19039, -9.94628], [22.32604, -10.76291], [22.17954, -10.85884], [22.25951, -11.24911], [22.54205, -11.05784], [23.16602, -11.10577], [23.45631, -10.946], [23.86868, -11.02856], [24.00027, -10.89356], [24.34528, -11.06816], [24.42612, -11.44975], [25.34069, -11.19707], [25.33058, -11.65767], [26.01777, -11.91488], [26.88687, -12.01868], [27.04351, -11.61312], [27.22541, -11.60323], [27.21025, -11.76157], [27.59932, -12.22123], [28.33199, -12.41375], [29.01918, -13.41353], [29.60531, -13.21685], [29.65078, -13.41844], [29.81551, -13.44683], [29.8139, -12.14898], [29.48404, -12.23604], [29.4992, -12.43843], [29.18592, -12.37921], [28.48357, -11.87532], [28.37241, -11.57848], [28.65032, -10.65133], [28.62795, -9.92942], [28.68532, -9.78], [28.56208, -9.49122], [28.51627, -9.44726], [28.52636, -9.35379], [28.36562, -9.30091], [28.38526, -9.23393], [28.9711, -8.66935], [28.88917, -8.4831], [30.79243, -8.27382], [30.2567, -7.14121], [29.52552, -6.2731], [29.43673, -4.44845], [29.23708, -3.75856], [29.21463, -3.3514], [29.25633, -3.05471], [29.17258, -2.99385], [29.16037, -2.95457], [29.09797, -2.91935], [29.09119, -2.87871], [29.0505, -2.81774], [29.00404, -2.81978], [29.00167, -2.78523], [29.04081, -2.7416], [29.00357, -2.70596], [28.94346, -2.69124], [28.89793, -2.66111], [28.90226, -2.62385], [28.89288, -2.55848], [28.87943, -2.55165], [28.86193, -2.53185], [28.86209, -2.5231], [28.87497, -2.50887], [28.88846, -2.50493], [28.89342, -2.49017], [28.89132, -2.47557], [28.86846, -2.44866], [28.86826, -2.41888], [28.89601, -2.37321], [28.95642, -2.37321], [29.00051, -2.29001], [29.105, -2.27043], [29.17562, -2.12278], [29.11847, -1.90576], [29.24458, -1.69663], [29.24323, -1.66826], [29.36322, -1.50887], [29.45038, -1.5054], [29.53062, -1.40499], [29.59061, -1.39016], [29.58388, -0.89821], [29.63006, -0.8997], [29.62708, -0.71055], [29.67176, -0.55714], [29.67474, -0.47969], [29.65091, -0.46777], [29.72687, -0.08051], [29.7224, 0.07291], [29.77454, 0.16675], [29.81922, 0.16824], [29.87284, 0.39166], [29.97413, 0.52124], [29.95477, 0.64486], [29.98307, 0.84295], [30.1484, 0.89805], [30.22139, 0.99635], [30.24671, 1.14974], [30.48503, 1.21675], [31.30127, 2.11006], [31.28042, 2.17853], [31.20148, 2.2217], [31.1985, 2.29462], [31.12104, 2.27676], [31.07934, 2.30207], [31.06593, 2.35862], [30.96911, 2.41071], [30.91102, 2.33332], [30.83059, 2.42559], [30.74271, 2.43601], [30.75612, 2.5863], [30.8857, 2.83923], [30.8574, 2.9508], [30.77101, 3.04897], [30.84251, 3.26908], [30.93486, 3.40737], [30.94081, 3.50847], [30.85153, 3.48867], [30.85997, 3.5743], [30.80713, 3.60506], [30.78512, 3.67097], [30.56277, 3.62703], [30.57378, 3.74567], [30.55396, 3.84451], [30.47691, 3.83353], [30.27658, 3.95653], [30.22374, 3.93896], [30.1621, 4.10586], [30.06964, 4.13221], [29.79666, 4.37809], [29.82087, 4.56246], [29.49726, 4.7007], [29.43341, 4.50101], [29.22207, 4.34297], [29.03054, 4.48784], [28.8126, 4.48784], [28.6651, 4.42638], [28.20719, 4.35614], [27.79551, 4.59976], [27.76469, 4.79284], [27.65462, 4.89375], [27.56656, 4.89375], [27.44012, 5.07349]]]]
+         }
+       }, {
+         type: "Feature",
+         properties: {
+           iso1A2: "CF",
+           iso1A3: "CAF",
+           iso1N3: "140",
+           wikidata: "Q929",
+           nameEn: "Central African Republic",
+           groups: ["017", "202", "002", "UN"],
+           callingCodes: ["236"]
+         },
+         geometry: {
+           type: "MultiPolygon",
+           coordinates: [[[[22.87758, 10.91915], [22.45889, 11.00246], [21.72139, 10.64136], [21.71479, 10.29932], [21.63553, 10.217], [21.52766, 10.2105], [21.34934, 9.95907], [21.26348, 9.97642], [20.82979, 9.44696], [20.36748, 9.11019], [19.06421, 9.00367], [18.86388, 8.87971], [19.11044, 8.68172], [18.79783, 8.25929], [18.67455, 8.22226], [18.62612, 8.14163], [18.64153, 8.08714], [18.6085, 8.05009], [18.02731, 8.01085], [17.93926, 7.95853], [17.67288, 7.98905], [16.8143, 7.53971], [16.6668, 7.67281], [16.658, 7.75353], [16.59415, 7.76444], [16.58315, 7.88657], [16.41583, 7.77971], [16.40703, 7.68809], [15.79942, 7.44149], [15.73118, 7.52006], [15.49743, 7.52179], [15.23397, 7.25135], [15.04717, 6.77085], [14.96311, 6.75693], [14.79966, 6.39043], [14.80122, 6.34866], [14.74206, 6.26356], [14.56149, 6.18928], [14.43073, 6.08867], [14.42917, 6.00508], [14.49455, 5.91683], [14.60974, 5.91838], [14.62375, 5.70466], [14.58951, 5.59777], [14.62531, 5.51411], [14.52724, 5.28319], [14.57083, 5.23979], [14.65489, 5.21343], [14.73383, 4.6135], [15.00825, 4.41458], [15.08609, 4.30282], [15.10644, 4.1362], [15.17482, 4.05131], [15.07686, 4.01805], [15.73522, 3.24348], [15.77725, 3.26835], [16.05449, 3.02306], [16.08252, 2.45708], [16.19357, 2.21537], [16.50126, 2.84739], [16.46701, 2.92512], [16.57598, 3.47999], [16.68283, 3.54257], [17.01746, 3.55136], [17.35649, 3.63045], [17.46876, 3.70515], [17.60966, 3.63705], [17.83421, 3.61068], [17.85842, 3.53378], [18.05656, 3.56893], [18.14902, 3.54476], [18.17323, 3.47665], [18.24148, 3.50302], [18.2723, 3.57992], [18.39558, 3.58212], [18.49245, 3.63924], [18.58711, 3.49423], [18.62755, 3.47564], [20.60184, 4.42394], [20.90383, 4.44877], [21.08793, 4.39603], [21.11214, 4.33895], [21.21341, 4.29285], [21.25744, 4.33676], [21.55904, 4.25553], [21.6405, 4.317], [22.10721, 4.20723], [22.27682, 4.11347], [22.45504, 4.13039], [22.5431, 4.22041], [22.60915, 4.48821], [22.6928, 4.47285], [22.78526, 4.71423], [22.84691, 4.69887], [22.89094, 4.79321], [22.94817, 4.82392], [23.38847, 4.60013], [24.46719, 5.0915], [24.71816, 4.90509], [25.31256, 5.03668], [25.34558, 5.29101], [25.53271, 5.37431], [25.86073, 5.19455], [26.13371, 5.25594], [26.48595, 5.04984], [26.74572, 5.10685], [26.85579, 5.03887], [26.93064, 5.13535], [27.09575, 5.22305], [27.44012, 5.07349], [27.26886, 5.25876], [27.23017, 5.37167], [27.28621, 5.56382], [27.22705, 5.62889], [27.22705, 5.71254], [26.51721, 6.09655], [26.58259, 6.1987], [26.32729, 6.36272], [26.38022, 6.63493], [25.90076, 7.09549], [25.37461, 7.33024], [25.35281, 7.42595], [25.20337, 7.50312], [25.20649, 7.61115], [25.29214, 7.66675], [25.25319, 7.8487], [24.98855, 7.96588], [24.85156, 8.16933], [24.35965, 8.26177], [24.13238, 8.36959], [24.25691, 8.69288], [23.51905, 8.71749], [23.59065, 8.99743], [23.44744, 8.99128], [23.4848, 9.16959], [23.56263, 9.19418], [23.64358, 9.28637], [23.64981, 9.44303], [23.62179, 9.53823], [23.69155, 9.67566], [23.67164, 9.86923], [23.3128, 10.45214], [23.02221, 10.69235], [22.87758, 10.91915]]]]
+         }
+       }, {
+         type: "Feature",
+         properties: {
+           iso1A2: "CG",
+           iso1A3: "COG",
+           iso1N3: "178",
+           wikidata: "Q971",
+           nameEn: "Republic of the Congo",
+           groups: ["017", "202", "002", "UN"],
+           callingCodes: ["242"]
+         },
+         geometry: {
+           type: "MultiPolygon",
+           coordinates: [[[[18.62755, 3.47564], [18.58711, 3.49423], [18.49245, 3.63924], [18.39558, 3.58212], [18.2723, 3.57992], [18.24148, 3.50302], [18.17323, 3.47665], [18.14902, 3.54476], [18.05656, 3.56893], [17.85842, 3.53378], [17.83421, 3.61068], [17.60966, 3.63705], [17.46876, 3.70515], [17.35649, 3.63045], [17.01746, 3.55136], [16.68283, 3.54257], [16.57598, 3.47999], [16.46701, 2.92512], [16.50126, 2.84739], [16.19357, 2.21537], [16.15568, 2.18955], [16.08563, 2.19733], [16.05294, 1.9811], [16.14634, 1.70259], [16.02647, 1.65591], [16.02959, 1.76483], [15.48942, 1.98265], [15.34776, 1.91264], [15.22634, 2.03243], [15.00996, 1.98887], [14.61145, 2.17866], [13.29457, 2.16106], [13.13461, 1.57238], [13.25447, 1.32339], [13.15519, 1.23368], [13.89582, 1.4261], [14.25186, 1.39842], [14.48179, 0.9152], [14.26066, 0.57255], [14.10909, 0.58563], [13.88648, 0.26652], [13.90632, -0.2287], [14.06862, -0.20826], [14.2165, -0.38261], [14.41887, -0.44799], [14.52569, -0.57818], [14.41838, -1.89412], [14.25932, -1.97624], [14.23518, -2.15671], [14.16202, -2.23916], [14.23829, -2.33715], [14.10442, -2.49268], [13.85846, -2.46935], [13.92073, -2.35581], [13.75884, -2.09293], [13.47977, -2.43224], [13.02759, -2.33098], [12.82172, -1.91091], [12.61312, -1.8129], [12.44656, -1.92025], [12.47925, -2.32626], [12.04895, -2.41704], [11.96866, -2.33559], [11.74605, -2.39936], [11.57637, -2.33379], [11.64487, -2.61865], [11.5359, -2.85654], [11.64798, -2.81146], [11.80365, -3.00424], [11.70558, -3.0773], [11.70227, -3.17465], [11.96554, -3.30267], [11.8318, -3.5812], [11.92719, -3.62768], [11.87083, -3.71571], [11.68608, -3.68942], [11.57949, -3.52798], [11.48764, -3.51089], [11.22301, -3.69888], [11.12647, -3.94169], [10.75913, -4.39519], [11.50888, -5.33417], [12.00924, -5.02627], [12.16068, -4.90089], [12.20901, -4.75642], [12.25587, -4.79437], [12.32324, -4.78415], [12.40964, -4.60609], [12.64835, -4.55937], [12.76844, -4.38709], [12.87096, -4.40315], [12.91489, -4.47907], [13.09648, -4.63739], [13.11182, -4.5942], [13.41764, -4.89897], [13.50305, -4.77818], [13.70417, -4.72601], [13.71794, -4.44864], [13.81162, -4.41842], [13.9108, -4.50906], [14.40672, -4.28381], [14.3957, -4.36623], [14.47284, -4.42941], [14.37366, -4.56125], [14.41499, -4.8825], [14.5059, -4.84956], [14.67948, -4.92093], [14.83101, -4.80838], [15.1978, -4.32388], [15.25411, -4.31121], [15.32693, -4.27282], [15.41785, -4.28381], [15.48121, -4.22062], [15.53081, -4.042], [15.89448, -3.9513], [16.21407, -3.2969], [16.1755, -3.25014], [16.22785, -2.59528], [16.16173, -2.16586], [16.50336, -1.8795], [16.70724, -1.45815], [16.97999, -1.12762], [17.32438, -0.99265], [17.72112, -0.52707], [17.66051, -0.26535], [17.81204, 0.23884], [17.93877, 0.32424], [17.95255, 0.48128], [17.86989, 0.58873], [17.85887, 1.04327], [18.08034, 1.58553], [18.10683, 2.26876], [18.63857, 3.19342], [18.62755, 3.47564]]]]
+         }
+       }, {
+         type: "Feature",
+         properties: {
+           iso1A2: "CH",
+           iso1A3: "CHE",
+           iso1N3: "756",
+           wikidata: "Q39",
+           nameEn: "Switzerland",
+           groups: ["155", "150", "UN"],
+           callingCodes: ["41"]
+         },
+         geometry: {
+           type: "MultiPolygon",
+           coordinates: [[[[8.72809, 47.69282], [8.72617, 47.69651], [8.73671, 47.7169], [8.70543, 47.73121], [8.74251, 47.75168], [8.71778, 47.76571], [8.68985, 47.75686], [8.68022, 47.78599], [8.65292, 47.80066], [8.64425, 47.76398], [8.62408, 47.7626], [8.61657, 47.79998], [8.56415, 47.80633], [8.56814, 47.78001], [8.48868, 47.77215], [8.45771, 47.7493], [8.44807, 47.72426], [8.40569, 47.69855], [8.4211, 47.68407], [8.40473, 47.67499], [8.41346, 47.66676], [8.42264, 47.66667], [8.44711, 47.65379], [8.4667, 47.65747], [8.46605, 47.64103], [8.49656, 47.64709], [8.5322, 47.64687], [8.52801, 47.66059], [8.56141, 47.67088], [8.57683, 47.66158], [8.6052, 47.67258], [8.61113, 47.66332], [8.62884, 47.65098], [8.62049, 47.63757], [8.60412, 47.63735], [8.61471, 47.64514], [8.60701, 47.65271], [8.59545, 47.64298], [8.60348, 47.61204], [8.57586, 47.59537], [8.55756, 47.62394], [8.51686, 47.63476], [8.50747, 47.61897], [8.45578, 47.60121], [8.46637, 47.58389], [8.48949, 47.588], [8.49431, 47.58107], [8.43235, 47.56617], [8.39477, 47.57826], [8.38273, 47.56608], [8.32735, 47.57133], [8.30277, 47.58607], [8.29524, 47.5919], [8.29722, 47.60603], [8.2824, 47.61225], [8.26313, 47.6103], [8.25863, 47.61571], [8.23809, 47.61204], [8.22577, 47.60385], [8.22011, 47.6181], [8.20617, 47.62141], [8.19378, 47.61636], [8.1652, 47.5945], [8.14947, 47.59558], [8.13823, 47.59147], [8.13662, 47.58432], [8.11543, 47.5841], [8.10395, 47.57918], [8.10002, 47.56504], [8.08557, 47.55768], [8.06663, 47.56374], [8.04383, 47.55443], [8.02136, 47.55096], [8.00113, 47.55616], [7.97581, 47.55493], [7.95682, 47.55789], [7.94494, 47.54511], [7.91251, 47.55031], [7.90673, 47.57674], [7.88664, 47.58854], [7.84412, 47.5841], [7.81901, 47.58798], [7.79486, 47.55691], [7.75261, 47.54599], [7.71961, 47.54219], [7.69642, 47.53297], [7.68101, 47.53232], [7.6656, 47.53752], [7.66174, 47.54554], [7.65083, 47.54662], [7.63338, 47.56256], [7.67655, 47.56435], [7.68904, 47.57133], [7.67115, 47.5871], [7.68486, 47.59601], [7.69385, 47.60099], [7.68229, 47.59905], [7.67395, 47.59212], [7.64599, 47.59695], [7.64213, 47.5944], [7.64309, 47.59151], [7.61929, 47.57683], [7.60459, 47.57869], [7.60523, 47.58519], [7.58945, 47.59017], [7.58386, 47.57536], [7.56684, 47.57785], [7.56548, 47.57617], [7.55689, 47.57232], [7.55652, 47.56779], [7.53634, 47.55553], [7.52831, 47.55347], [7.51723, 47.54578], [7.50873, 47.54546], [7.49691, 47.53821], [7.50588, 47.52856], [7.51904, 47.53515], [7.53199, 47.5284], [7.5229, 47.51644], [7.49804, 47.51798], [7.51076, 47.49651], [7.47534, 47.47932], [7.43356, 47.49712], [7.42923, 47.48628], [7.4583, 47.47216], [7.4462, 47.46264], [7.43088, 47.45846], [7.40308, 47.43638], [7.35603, 47.43432], [7.33526, 47.44186], [7.24669, 47.4205], [7.17026, 47.44312], [7.19583, 47.49455], [7.16249, 47.49025], [7.12781, 47.50371], [7.07425, 47.48863], [7.0231, 47.50522], [6.98425, 47.49432], [7.0024, 47.45264], [6.93953, 47.43388], [6.93744, 47.40714], [6.88542, 47.37262], [6.87959, 47.35335], [7.03125, 47.36996], [7.0564, 47.35134], [7.05305, 47.33304], [6.94316, 47.28747], [6.95108, 47.26428], [6.9508, 47.24338], [6.8489, 47.15933], [6.76788, 47.1208], [6.68823, 47.06616], [6.71531, 47.0494], [6.43341, 46.92703], [6.46456, 46.88865], [6.43216, 46.80336], [6.45209, 46.77502], [6.38351, 46.73171], [6.27135, 46.68251], [6.11084, 46.57649], [6.1567, 46.54402], [6.07269, 46.46244], [6.08427, 46.44305], [6.06407, 46.41676], [6.09926, 46.40768], [6.15016, 46.3778], [6.15985, 46.37721], [6.16987, 46.36759], [6.15738, 46.3491], [6.13876, 46.33844], [6.1198, 46.31157], [6.11697, 46.29547], [6.1013, 46.28512], [6.11926, 46.2634], [6.12446, 46.25059], [6.10071, 46.23772], [6.08563, 46.24651], [6.07072, 46.24085], [6.0633, 46.24583], [6.05029, 46.23518], [6.04602, 46.23127], [6.03342, 46.2383], [6.02461, 46.23313], [5.97542, 46.21525], [5.96515, 46.19638], [5.99573, 46.18587], [5.98846, 46.17046], [5.98188, 46.17392], [5.97508, 46.15863], [5.9641, 46.14412], [5.95781, 46.12925], [5.97893, 46.13303], [5.9871, 46.14499], [6.01791, 46.14228], [6.03614, 46.13712], [6.04564, 46.14031], [6.05203, 46.15191], [6.07491, 46.14879], [6.09199, 46.15191], [6.09926, 46.14373], [6.13397, 46.1406], [6.15305, 46.15194], [6.18116, 46.16187], [6.18871, 46.16644], [6.18707, 46.17999], [6.19552, 46.18401], [6.19807, 46.18369], [6.20539, 46.19163], [6.21114, 46.1927], [6.21273, 46.19409], [6.21603, 46.19507], [6.21844, 46.19837], [6.22222, 46.19888], [6.22175, 46.20045], [6.23544, 46.20714], [6.23913, 46.20511], [6.24821, 46.20531], [6.26007, 46.21165], [6.27694, 46.21566], [6.29663, 46.22688], [6.31041, 46.24417], [6.29474, 46.26221], [6.26749, 46.24745], [6.24952, 46.26255], [6.23775, 46.27822], [6.25137, 46.29014], [6.24826, 46.30175], [6.21981, 46.31304], [6.25432, 46.3632], [6.53358, 46.45431], [6.82312, 46.42661], [6.8024, 46.39171], [6.77152, 46.34784], [6.86052, 46.28512], [6.78968, 46.14058], [6.89321, 46.12548], [6.87868, 46.03855], [6.93862, 46.06502], [7.00946, 45.9944], [7.04151, 45.92435], [7.10685, 45.85653], [7.56343, 45.97421], [7.85949, 45.91485], [7.9049, 45.99945], [7.98881, 45.99867], [8.02906, 46.10331], [8.11383, 46.11577], [8.16866, 46.17817], [8.08814, 46.26692], [8.31162, 46.38044], [8.30648, 46.41587], [8.42464, 46.46367], [8.46317, 46.43712], [8.45032, 46.26869], [8.62242, 46.12112], [8.75697, 46.10395], [8.80778, 46.10085], [8.85617, 46.0748], [8.79414, 46.00913], [8.78585, 45.98973], [8.79362, 45.99207], [8.8319, 45.9879], [8.85121, 45.97239], [8.86688, 45.96135], [8.88904, 45.95465], [8.93649, 45.86775], [8.94372, 45.86587], [8.93504, 45.86245], [8.91129, 45.8388], [8.94737, 45.84285], [8.9621, 45.83707], [8.99663, 45.83466], [9.00324, 45.82055], [9.0298, 45.82127], [9.03279, 45.82865], [9.03793, 45.83548], [9.03505, 45.83976], [9.04059, 45.8464], [9.04546, 45.84968], [9.06642, 45.8761], [9.09065, 45.89906], [8.99257, 45.9698], [9.01618, 46.04928], [9.24503, 46.23616], [9.29226, 46.32717], [9.25502, 46.43743], [9.28136, 46.49685], [9.36128, 46.5081], [9.40487, 46.46621], [9.45936, 46.50873], [9.46117, 46.37481], [9.57015, 46.2958], [9.71273, 46.29266], [9.73086, 46.35071], [9.95249, 46.38045], [10.07055, 46.21668], [10.14439, 46.22992], [10.17862, 46.25626], [10.10506, 46.3372], [10.165, 46.41051], [10.03715, 46.44479], [10.10307, 46.61003], [10.23674, 46.63484], [10.25309, 46.57432], [10.46136, 46.53164], [10.49375, 46.62049], [10.44686, 46.64162], [10.40475, 46.63671], [10.38659, 46.67847], [10.47197, 46.85698], [10.48376, 46.93891], [10.36933, 47.00212], [10.30031, 46.92093], [10.24128, 46.93147], [10.22675, 46.86942], [10.10715, 46.84296], [9.98058, 46.91434], [9.88266, 46.93343], [9.87935, 47.01337], [9.60717, 47.06091], [9.55721, 47.04762], [9.54041, 47.06495], [9.47548, 47.05257], [9.47139, 47.06402], [9.51362, 47.08505], [9.52089, 47.10019], [9.51044, 47.13727], [9.48774, 47.17402], [9.4891, 47.19346], [9.50318, 47.22153], [9.52406, 47.24959], [9.53116, 47.27029], [9.54773, 47.2809], [9.55857, 47.29919], [9.58513, 47.31334], [9.59978, 47.34671], [9.62476, 47.36639], [9.65427, 47.36824], [9.66243, 47.37136], [9.6711, 47.37824], [9.67445, 47.38429], [9.67334, 47.39191], [9.6629, 47.39591], [9.65136, 47.40504], [9.65043, 47.41937], [9.6446, 47.43233], [9.64483, 47.43842], [9.65863, 47.44847], [9.65728, 47.45383], [9.6423, 47.45599], [9.62475, 47.45685], [9.62158, 47.45858], [9.60841, 47.47178], [9.60484, 47.46358], [9.60205, 47.46165], [9.59482, 47.46305], [9.58208, 47.48344], [9.56312, 47.49495], [9.55125, 47.53629], [9.25619, 47.65939], [9.18203, 47.65598], [9.17593, 47.65399], [9.1755, 47.65584], [9.1705, 47.65513], [9.15181, 47.66904], [9.13845, 47.66389], [9.09891, 47.67801], [9.02093, 47.6868], [8.94093, 47.65596], [8.89946, 47.64769], [8.87625, 47.65441], [8.87383, 47.67045], [8.85065, 47.68209], [8.86989, 47.70504], [8.82002, 47.71458], [8.80663, 47.73821], [8.77309, 47.72059], [8.76965, 47.7075], [8.79966, 47.70222], [8.79511, 47.67462], [8.75856, 47.68969], [8.72809, 47.69282]], [[8.95861, 45.96485], [8.96668, 45.98436], [8.97741, 45.98317], [8.97604, 45.96151], [8.95861, 45.96485]], [[8.70847, 47.68904], [8.68985, 47.69552], [8.66837, 47.68437], [8.65769, 47.68928], [8.67508, 47.6979], [8.66416, 47.71367], [8.70237, 47.71453], [8.71773, 47.69088], [8.70847, 47.68904]]]]
+         }
+       }, {
+         type: "Feature",
+         properties: {
+           iso1A2: "CI",
+           iso1A3: "CIV",
+           iso1N3: "384",
+           wikidata: "Q1008",
+           nameEn: "C\xF4te d'Ivoire",
+           groups: ["011", "202", "002", "UN"],
+           callingCodes: ["225"]
+         },
+         geometry: {
+           type: "MultiPolygon",
+           coordinates: [[[[-7.52774, 3.7105], [-3.34019, 4.17519], [-3.10675, 5.08515], [-3.11073, 5.12675], [-3.063, 5.13665], [-2.96554, 5.10397], [-2.95261, 5.12477], [-2.75502, 5.10657], [-2.73074, 5.1364], [-2.77625, 5.34621], [-2.72737, 5.34789], [-2.76614, 5.60963], [-2.85378, 5.65156], [-2.93132, 5.62137], [-2.96671, 5.6415], [-2.95323, 5.71865], [-3.01896, 5.71697], [-3.25999, 6.62521], [-3.21954, 6.74407], [-3.23327, 6.81744], [-2.95438, 7.23737], [-2.97822, 7.27165], [-2.92339, 7.60847], [-2.79467, 7.86002], [-2.78395, 7.94974], [-2.74819, 7.92613], [-2.67787, 8.02055], [-2.61232, 8.02645], [-2.62901, 8.11495], [-2.49037, 8.20872], [-2.58243, 8.7789], [-2.66357, 9.01771], [-2.77799, 9.04949], [-2.69814, 9.22717], [-2.68802, 9.49343], [-2.76494, 9.40778], [-2.93012, 9.57403], [-3.00765, 9.74019], [-3.16609, 9.85147], [-3.19306, 9.93781], [-3.27228, 9.84981], [-3.31779, 9.91125], [-3.69703, 9.94279], [-4.25999, 9.76012], [-4.31392, 9.60062], [-4.6426, 9.70696], [-4.96621, 9.89132], [-4.96453, 9.99923], [-5.12465, 10.29788], [-5.39602, 10.2929], [-5.51058, 10.43177], [-5.65135, 10.46767], [-5.78124, 10.43952], [-5.99478, 10.19694], [-6.18851, 10.24244], [-6.1731, 10.46983], [-6.24795, 10.74248], [-6.325, 10.68624], [-6.40646, 10.69922], [-6.42847, 10.5694], [-6.52974, 10.59104], [-6.63541, 10.66893], [-6.68164, 10.35074], [-6.93921, 10.35291], [-7.01186, 10.25111], [-6.97444, 10.21644], [-7.00966, 10.15794], [-7.0603, 10.14711], [-7.13331, 10.24877], [-7.3707, 10.24677], [-7.44555, 10.44602], [-7.52261, 10.4655], [-7.54462, 10.40921], [-7.63048, 10.46334], [-7.92107, 10.15577], [-7.97971, 10.17117], [-8.01225, 10.1021], [-8.11921, 10.04577], [-8.15652, 9.94288], [-8.09434, 9.86936], [-8.14657, 9.55062], [-8.03463, 9.39604], [-7.85056, 9.41812], [-7.90777, 9.20456], [-7.73862, 9.08422], [-7.92518, 8.99332], [-7.95503, 8.81146], [-7.69882, 8.66148], [-7.65653, 8.36873], [-7.92518, 8.50652], [-8.22991, 8.48438], [-8.2411, 8.24196], [-8.062, 8.16071], [-7.98675, 8.20134], [-7.99919, 8.11023], [-7.94695, 8.00925], [-8.06449, 8.04989], [-8.13414, 7.87991], [-8.09931, 7.78626], [-8.21374, 7.54466], [-8.4003, 7.6285], [-8.47114, 7.55676], [-8.41935, 7.51203], [-8.37458, 7.25794], [-8.29249, 7.1691], [-8.31736, 6.82837], [-8.59456, 6.50612], [-8.48652, 6.43797], [-8.45666, 6.49977], [-8.38453, 6.35887], [-8.3298, 6.36381], [-8.17557, 6.28222], [-8.00642, 6.31684], [-7.90692, 6.27728], [-7.83478, 6.20309], [-7.8497, 6.08932], [-7.79747, 6.07696], [-7.78254, 5.99037], [-7.70294, 5.90625], [-7.67309, 5.94337], [-7.48155, 5.80974], [-7.46165, 5.84934], [-7.43677, 5.84687], [-7.43926, 5.74787], [-7.37209, 5.61173], [-7.43428, 5.42355], [-7.36463, 5.32944], [-7.46165, 5.26256], [-7.48901, 5.14118], [-7.55369, 5.08667], [-7.53876, 4.94294], [-7.59349, 4.8909], [-7.53259, 4.35145], [-7.52774, 3.7105]]]]
+         }
+       }, {
+         type: "Feature",
+         properties: {
+           iso1A2: "CK",
+           iso1A3: "COK",
+           iso1N3: "184",
+           wikidata: "Q26988",
+           nameEn: "Cook Islands",
+           country: "NZ",
+           groups: ["061", "009", "UN"],
+           driveSide: "left",
+           callingCodes: ["682"]
+         },
+         geometry: {
+           type: "MultiPolygon",
+           coordinates: [[[[-168.15106, -10.26955], [-156.45576, -31.75456], [-156.48634, -15.52824], [-156.50903, -7.4975], [-168.15106, -10.26955]]]]
+         }
+       }, {
+         type: "Feature",
+         properties: {
+           iso1A2: "CL",
+           iso1A3: "CHL",
+           iso1N3: "152",
+           wikidata: "Q298",
+           nameEn: "Chile",
+           groups: ["005", "419", "019", "UN"],
+           callingCodes: ["56"]
+         },
+         geometry: {
+           type: "MultiPolygon",
+           coordinates: [[[[-68.60702, -52.65781], [-68.41683, -52.33516], [-69.97824, -52.00845], [-71.99889, -51.98018], [-72.33873, -51.59954], [-72.31343, -50.58411], [-73.15765, -50.78337], [-73.55259, -49.92488], [-73.45156, -49.79461], [-73.09655, -49.14342], [-72.56894, -48.81116], [-72.54042, -48.52392], [-72.27662, -48.28727], [-72.50478, -47.80586], [-71.94152, -47.13595], [-71.68577, -46.55385], [-71.75614, -45.61611], [-71.35687, -45.22075], [-72.06985, -44.81756], [-71.26418, -44.75684], [-71.16436, -44.46244], [-71.81318, -44.38097], [-71.64206, -43.64774], [-72.14828, -42.85321], [-72.15541, -42.15941], [-71.74901, -42.11711], [-71.92726, -40.72714], [-71.37826, -38.91474], [-70.89532, -38.6923], [-71.24279, -37.20264], [-70.95047, -36.4321], [-70.38008, -36.02375], [-70.49416, -35.24145], [-69.87386, -34.13344], [-69.88099, -33.34489], [-70.55832, -31.51559], [-70.14479, -30.36595], [-69.8596, -30.26131], [-69.99507, -29.28351], [-69.80969, -29.07185], [-69.66709, -28.44055], [-69.22504, -27.95042], [-68.77586, -27.16029], [-68.43363, -27.08414], [-68.27677, -26.90626], [-68.59048, -26.49861], [-68.56909, -26.28146], [-68.38372, -26.15353], [-68.57622, -25.32505], [-68.38372, -25.08636], [-68.56909, -24.69831], [-68.24825, -24.42596], [-67.33563, -24.04237], [-66.99632, -22.99839], [-67.18382, -22.81525], [-67.54284, -22.89771], [-67.85114, -22.87076], [-68.18816, -21.28614], [-68.40403, -20.94562], [-68.53957, -20.91542], [-68.55383, -20.7355], [-68.44023, -20.62701], [-68.7276, -20.46178], [-68.74273, -20.08817], [-68.57132, -20.03134], [-68.54611, -19.84651], [-68.66761, -19.72118], [-68.41218, -19.40499], [-68.61989, -19.27584], [-68.80602, -19.08355], [-68.87082, -19.06003], [-68.94987, -18.93302], [-69.07432, -18.28259], [-69.14807, -18.16893], [-69.07496, -18.03715], [-69.28671, -17.94844], [-69.34126, -17.72753], [-69.46623, -17.60518], [-69.46897, -17.4988], [-69.66483, -17.65083], [-69.79087, -17.65563], [-69.82868, -17.72048], [-69.75305, -17.94605], [-69.81607, -18.12582], [-69.96732, -18.25992], [-70.16394, -18.31737], [-70.31267, -18.31258], [-70.378, -18.3495], [-70.59118, -18.35072], [-113.52687, -26.52828], [-68.11646, -58.14883], [-66.07313, -55.19618], [-67.11046, -54.94199], [-67.46182, -54.92205], [-68.01394, -54.8753], [-68.60733, -54.9125], [-68.60702, -52.65781]]]]
+         }
+       }, {
+         type: "Feature",
+         properties: {
+           iso1A2: "CM",
+           iso1A3: "CMR",
+           iso1N3: "120",
+           wikidata: "Q1009",
+           nameEn: "Cameroon",
+           groups: ["017", "202", "002", "UN"],
+           callingCodes: ["237"]
+         },
+         geometry: {
+           type: "MultiPolygon",
+           coordinates: [[[[14.83314, 12.62963], [14.55058, 12.78256], [14.56101, 12.91036], [14.46881, 13.08259], [14.08251, 13.0797], [14.20204, 12.53405], [14.17523, 12.41916], [14.22215, 12.36533], [14.4843, 12.35223], [14.6474, 12.17466], [14.61612, 11.7798], [14.55207, 11.72001], [14.64591, 11.66166], [14.6124, 11.51283], [14.17821, 11.23831], [13.97489, 11.30258], [13.78945, 11.00154], [13.7403, 11.00593], [13.70753, 10.94451], [13.73434, 10.9255], [13.54964, 10.61236], [13.5705, 10.53183], [13.43644, 10.13326], [13.34111, 10.12299], [13.25025, 10.03647], [13.25323, 10.00127], [13.286, 9.9822], [13.27409, 9.93232], [13.24132, 9.91031], [13.25025, 9.86042], [13.29941, 9.8296], [13.25472, 9.76795], [13.22642, 9.57266], [13.02385, 9.49334], [12.85628, 9.36698], [12.91958, 9.33905], [12.90022, 9.11411], [12.81085, 8.91992], [12.79, 8.75361], [12.71701, 8.7595], [12.68722, 8.65938], [12.44146, 8.6152], [12.4489, 8.52536], [12.26123, 8.43696], [12.24782, 8.17904], [12.19271, 8.10826], [12.20909, 7.97553], [11.99908, 7.67302], [12.01844, 7.52981], [11.93205, 7.47812], [11.84864, 7.26098], [11.87396, 7.09398], [11.63117, 6.9905], [11.55818, 6.86186], [11.57755, 6.74059], [11.51499, 6.60892], [11.42264, 6.5882], [11.42041, 6.53789], [11.09495, 6.51717], [11.09644, 6.68437], [10.94302, 6.69325], [10.8179, 6.83377], [10.83727, 6.9358], [10.60789, 7.06885], [10.59746, 7.14719], [10.57214, 7.16345], [10.53639, 6.93432], [10.21466, 6.88996], [10.15135, 7.03781], [9.86314, 6.77756], [9.77824, 6.79088], [9.70674, 6.51717], [9.51757, 6.43874], [8.84209, 5.82562], [8.88156, 5.78857], [8.83687, 5.68483], [8.92029, 5.58403], [8.78027, 5.1243], [8.60302, 4.87353], [8.34397, 4.30689], [9.22018, 3.72052], [9.81162, 2.33797], [9.82123, 2.35097], [9.83754, 2.32428], [9.83238, 2.29079], [9.84716, 2.24676], [9.89012, 2.20457], [9.90749, 2.20049], [9.991, 2.16561], [11.3561, 2.17217], [11.37116, 2.29975], [13.28534, 2.25716], [13.29457, 2.16106], [14.61145, 2.17866], [15.00996, 1.98887], [15.22634, 2.03243], [15.34776, 1.91264], [15.48942, 1.98265], [16.02959, 1.76483], [16.02647, 1.65591], [16.14634, 1.70259], [16.05294, 1.9811], [16.08563, 2.19733], [16.15568, 2.18955], [16.19357, 2.21537], [16.08252, 2.45708], [16.05449, 3.02306], [15.77725, 3.26835], [15.73522, 3.24348], [15.07686, 4.01805], [15.17482, 4.05131], [15.10644, 4.1362], [15.08609, 4.30282], [15.00825, 4.41458], [14.73383, 4.6135], [14.65489, 5.21343], [14.57083, 5.23979], [14.52724, 5.28319], [14.62531, 5.51411], [14.58951, 5.59777], [14.62375, 5.70466], [14.60974, 5.91838], [14.49455, 5.91683], [14.42917, 6.00508], [14.43073, 6.08867], [14.56149, 6.18928], [14.74206, 6.26356], [14.80122, 6.34866], [14.79966, 6.39043], [14.96311, 6.75693], [15.04717, 6.77085], [15.23397, 7.25135], [15.49743, 7.52179], [15.56964, 7.58936], [15.59272, 7.7696], [15.50743, 7.79302], [15.20426, 8.50892], [15.09484, 8.65982], [14.83566, 8.80557], [14.35707, 9.19611], [14.37094, 9.2954], [13.97544, 9.6365], [14.01793, 9.73169], [14.1317, 9.82413], [14.20411, 10.00055], [14.4673, 10.00264], [14.80082, 9.93818], [14.95722, 9.97926], [15.05999, 9.94845], [15.14043, 9.99246], [15.24618, 9.99246], [15.41408, 9.92876], [15.68761, 9.99344], [15.50535, 10.1098], [15.30874, 10.31063], [15.23724, 10.47764], [15.14936, 10.53915], [15.15532, 10.62846], [15.06737, 10.80921], [15.09127, 10.87431], [15.04957, 11.02347], [15.10021, 11.04101], [15.0585, 11.40481], [15.13149, 11.5537], [15.06595, 11.71126], [15.11579, 11.79313], [15.04808, 11.8731], [15.05786, 12.0608], [15.0349, 12.10698], [15.00146, 12.1223], [14.96952, 12.0925], [14.89019, 12.16593], [14.90827, 12.3269], [14.83314, 12.62963]]]]
+         }
+       }, {
+         type: "Feature",
+         properties: {
+           iso1A2: "CN",
+           iso1A3: "CHN",
+           iso1N3: "156",
+           wikidata: "Q148",
+           nameEn: "People's Republic of China"
+         },
+         geometry: null
+       }, {
+         type: "Feature",
+         properties: {
+           iso1A2: "CO",
+           iso1A3: "COL",
+           iso1N3: "170",
+           wikidata: "Q739",
+           nameEn: "Colombia",
+           groups: ["005", "419", "019", "UN"],
+           callingCodes: ["57"]
+         },
+         geometry: {
+           type: "MultiPolygon",
+           coordinates: [[[[-71.19849, 12.65801], [-81.58685, 18.0025], [-82.06974, 14.49418], [-82.56142, 11.91792], [-78.79327, 9.93766], [-77.58292, 9.22278], [-77.32389, 8.81247], [-77.45064, 8.49991], [-77.17257, 7.97422], [-77.57185, 7.51147], [-77.72514, 7.72348], [-77.72157, 7.47612], [-77.81426, 7.48319], [-77.89178, 7.22681], [-78.06168, 7.07793], [-82.12561, 4.00341], [-78.87137, 1.47457], [-78.42749, 1.15389], [-77.85677, 0.80197], [-77.7148, 0.85003], [-77.68613, 0.83029], [-77.66416, 0.81604], [-77.67815, 0.73863], [-77.49984, 0.64476], [-77.52001, 0.40782], [-76.89177, 0.24736], [-76.4094, 0.24015], [-76.41215, 0.38228], [-76.23441, 0.42294], [-75.82927, 0.09578], [-75.25764, -0.11943], [-75.18513, -0.0308], [-74.42701, -0.50218], [-74.26675, -0.97229], [-73.65312, -1.26222], [-72.92587, -2.44514], [-71.75223, -2.15058], [-70.94377, -2.23142], [-70.04609, -2.73906], [-70.71396, -3.7921], [-70.52393, -3.87553], [-70.3374, -3.79505], [-69.94708, -4.2431], [-69.43395, -1.42219], [-69.4215, -1.01853], [-69.59796, -0.75136], [-69.603, -0.51947], [-70.03658, -0.19681], [-70.04162, 0.55437], [-69.47696, 0.71065], [-69.20976, 0.57958], [-69.14422, 0.84172], [-69.26017, 1.06856], [-69.82987, 1.07864], [-69.83491, 1.69353], [-69.53746, 1.76408], [-69.38621, 1.70865], [-68.18128, 1.72881], [-68.26699, 1.83463], [-68.18632, 2.00091], [-67.9292, 1.82455], [-67.40488, 2.22258], [-67.299, 1.87494], [-67.15784, 1.80439], [-67.08222, 1.17441], [-66.85795, 1.22998], [-67.21967, 2.35778], [-67.65696, 2.81691], [-67.85862, 2.79173], [-67.85862, 2.86727], [-67.30945, 3.38393], [-67.50067, 3.75812], [-67.62671, 3.74303], [-67.85358, 4.53249], [-67.83341, 5.31104], [-67.59141, 5.5369], [-67.63914, 5.64963], [-67.58558, 5.84537], [-67.43513, 5.98835], [-67.4625, 6.20625], [-67.60654, 6.2891], [-69.41843, 6.1072], [-70.10716, 6.96516], [-70.7596, 7.09799], [-71.03941, 6.98163], [-71.37234, 7.01588], [-71.42212, 7.03854], [-71.44118, 7.02116], [-71.82441, 7.04314], [-72.04895, 7.03837], [-72.19437, 7.37034], [-72.43132, 7.40034], [-72.47415, 7.48928], [-72.45321, 7.57232], [-72.47827, 7.65604], [-72.46763, 7.79518], [-72.44454, 7.86031], [-72.46183, 7.90682], [-72.45806, 7.91141], [-72.47042, 7.92306], [-72.48183, 7.92909], [-72.48801, 7.94329], [-72.47213, 7.96106], [-72.39137, 8.03534], [-72.35163, 8.01163], [-72.36987, 8.19976], [-72.4042, 8.36513], [-72.65474, 8.61428], [-72.77415, 9.10165], [-72.94052, 9.10663], [-73.02119, 9.27584], [-73.36905, 9.16636], [-72.98085, 9.85253], [-72.88002, 10.44309], [-72.4767, 11.1117], [-72.24983, 11.14138], [-71.9675, 11.65536], [-71.3275, 11.85], [-70.92579, 11.96275], [-71.19849, 12.65801]]]]
+         }
+       }, {
+         type: "Feature",
+         properties: {
+           iso1A2: "CP",
+           iso1A3: "CPT",
+           wikidata: "Q161258",
+           nameEn: "Clipperton Island",
+           country: "FR",
+           groups: ["013", "003", "019", "UN"],
+           isoStatus: "excRes"
+         },
+         geometry: {
+           type: "MultiPolygon",
+           coordinates: [[[[-110.36279, 9.79626], [-108.755, 9.84085], [-109.04145, 11.13245], [-110.36279, 9.79626]]]]
+         }
+       }, {
+         type: "Feature",
+         properties: {
+           iso1A2: "CR",
+           iso1A3: "CRI",
+           iso1N3: "188",
+           wikidata: "Q800",
+           nameEn: "Costa Rica",
+           groups: ["013", "003", "419", "019", "UN"],
+           callingCodes: ["506"]
+         },
+         geometry: {
+           type: "MultiPolygon",
+           coordinates: [[[[-83.68276, 11.01562], [-83.66597, 10.79916], [-83.90838, 10.71161], [-84.68197, 11.07568], [-84.92439, 10.9497], [-85.60529, 11.22607], [-85.71223, 11.06868], [-86.14524, 11.09059], [-87.41779, 5.02401], [-82.94503, 7.93865], [-82.89978, 8.04083], [-82.89137, 8.05755], [-82.88641, 8.10219], [-82.9388, 8.26634], [-83.05209, 8.33394], [-82.93056, 8.43465], [-82.8679, 8.44042], [-82.8382, 8.48117], [-82.83322, 8.52464], [-82.83975, 8.54755], [-82.82739, 8.60153], [-82.8794, 8.6981], [-82.92068, 8.74832], [-82.91377, 8.774], [-82.88253, 8.83331], [-82.72126, 8.97125], [-82.93516, 9.07687], [-82.93516, 9.46741], [-82.84871, 9.4973], [-82.87919, 9.62645], [-82.77206, 9.59573], [-82.66667, 9.49746], [-82.61345, 9.49881], [-82.56507, 9.57279], [-82.51044, 9.65379], [-83.54024, 10.96805], [-83.68276, 11.01562]]]]
+         }
+       }, {
+         type: "Feature",
+         properties: {
+           iso1A2: "CU",
+           iso1A3: "CUB",
+           iso1N3: "192",
+           wikidata: "Q241",
+           nameEn: "Cuba",
+           groups: ["029", "003", "419", "019", "UN"],
+           callingCodes: ["53"]
+         },
+         geometry: {
+           type: "MultiPolygon",
+           coordinates: [[[[-73.62304, 20.6935], [-82.02215, 24.23074], [-85.77883, 21.92705], [-74.81171, 18.82201], [-73.62304, 20.6935]]]]
+         }
+       }, {
+         type: "Feature",
+         properties: {
+           iso1A2: "CV",
+           iso1A3: "CPV",
+           iso1N3: "132",
+           wikidata: "Q1011",
+           nameEn: "Cape Verde",
+           groups: ["Q105472", "011", "202", "002", "UN"],
+           callingCodes: ["238"]
+         },
+         geometry: {
+           type: "MultiPolygon",
+           coordinates: [[[[-28.81604, 14.57305], [-20.39702, 14.12816], [-23.37101, 19.134], [-28.81604, 14.57305]]]]
+         }
+       }, {
+         type: "Feature",
+         properties: {
+           iso1A2: "CW",
+           iso1A3: "CUW",
+           iso1N3: "531",
+           wikidata: "Q25279",
+           nameEn: "Cura\xE7ao",
+           aliases: ["NL-CW"],
+           country: "NL",
+           groups: ["Q1451600", "029", "003", "419", "019", "UN"],
+           callingCodes: ["599"]
+         },
+         geometry: {
+           type: "MultiPolygon",
+           coordinates: [[[[-68.90012, 12.62309], [-69.59009, 12.46019], [-68.99639, 11.79035], [-68.33524, 11.78151], [-68.90012, 12.62309]]]]
+         }
+       }, {
+         type: "Feature",
+         properties: {
+           iso1A2: "CX",
+           iso1A3: "CXR",
+           iso1N3: "162",
+           wikidata: "Q31063",
+           nameEn: "Christmas Island",
+           country: "AU",
+           groups: ["053", "009", "UN"],
+           driveSide: "left",
+           callingCodes: ["61"]
+         },
+         geometry: {
+           type: "MultiPolygon",
+           coordinates: [[[[105.66835, -9.31927], [104.67494, -11.2566], [106.66176, -11.14349], [105.66835, -9.31927]]]]
+         }
+       }, {
+         type: "Feature",
+         properties: {
+           iso1A2: "CY",
+           iso1A3: "CYP",
+           iso1N3: "196",
+           wikidata: "Q229",
+           nameEn: "Republic of Cyprus",
+           groups: ["Q644636", "EU", "145", "142", "UN"],
+           driveSide: "left",
+           callingCodes: ["357"]
+         },
+         geometry: {
+           type: "MultiPolygon",
+           coordinates: [[[[32.46489, 35.48584], [30.15137, 34.08517], [32.74412, 34.43926], [32.75515, 34.64985], [32.76136, 34.68318], [32.79433, 34.67883], [32.82717, 34.70622], [32.86014, 34.70585], [32.86167, 34.68734], [32.9068, 34.66102], [32.91398, 34.67343], [32.93043, 34.67091], [32.92807, 34.66736], [32.93449, 34.66241], [32.93693, 34.67027], [32.94379, 34.67111], [32.94683, 34.67907], [32.95539, 34.68471], [32.99135, 34.68061], [32.98668, 34.67268], [32.99014, 34.65518], [32.97736, 34.65277], [32.97079, 34.66112], [32.95325, 34.66462], [32.94796, 34.6587], [32.94976, 34.65204], [32.95471, 34.64528], [32.95323, 34.64075], [32.95891, 34.62919], [32.96718, 34.63446], [32.96968, 34.64046], [33.0138, 34.64424], [33.26744, 34.49942], [33.83531, 34.73974], [33.70575, 34.97947], [33.70639, 34.99303], [33.71514, 35.00294], [33.69731, 35.01754], [33.69938, 35.03123], [33.67678, 35.03866], [33.63765, 35.03869], [33.61215, 35.0527], [33.59658, 35.03635], [33.567, 35.04803], [33.57478, 35.06049], [33.53975, 35.08151], [33.48915, 35.06594], [33.47666, 35.00701], [33.45256, 35.00288], [33.45178, 35.02078], [33.47825, 35.04103], [33.48136, 35.0636], [33.46813, 35.10564], [33.41675, 35.16325], [33.4076, 35.20062], [33.38575, 35.2018], [33.37248, 35.18698], [33.3717, 35.1788], [33.36569, 35.17479], [33.35612, 35.17402], [33.35596, 35.17942], [33.34964, 35.17803], [33.35056, 35.18328], [33.31955, 35.18096], [33.3072, 35.16816], [33.27068, 35.16815], [33.15138, 35.19504], [33.11105, 35.15639], [33.08249, 35.17319], [33.01192, 35.15639], [32.94471, 35.09422], [32.86406, 35.1043], [32.85733, 35.07742], [32.70779, 35.14127], [32.70947, 35.18328], [32.64864, 35.19967], [32.60361, 35.16647], [32.46489, 35.48584]]], [[[33.74144, 35.01053], [33.7492, 35.01319], [33.74983, 35.02274], [33.74265, 35.02329], [33.73781, 35.02181], [33.7343, 35.01178], [33.74144, 35.01053]]], [[[33.77312, 34.9976], [33.75994, 35.00113], [33.75682, 34.99916], [33.76605, 34.99543], [33.76738, 34.99188], [33.7778, 34.98981], [33.77843, 34.988], [33.78149, 34.98854], [33.78318, 34.98699], [33.78571, 34.98951], [33.78917, 34.98854], [33.79191, 34.98914], [33.78516, 34.99582], [33.77553, 34.99518], [33.77312, 34.9976]]]]
+         }
+       }, {
+         type: "Feature",
+         properties: {
+           iso1A2: "CZ",
+           iso1A3: "CZE",
+           iso1N3: "203",
+           wikidata: "Q213",
+           nameEn: "Czechia",
+           groups: ["EU", "151", "150", "UN"],
+           callingCodes: ["420"]
+         },
+         geometry: {
+           type: "MultiPolygon",
+           coordinates: [[[[14.82803, 50.86966], [14.79139, 50.81438], [14.70661, 50.84096], [14.61993, 50.86049], [14.63434, 50.8883], [14.65259, 50.90513], [14.64802, 50.93241], [14.58024, 50.91443], [14.56374, 50.922], [14.59702, 50.96148], [14.59908, 50.98685], [14.58215, 50.99306], [14.56432, 51.01008], [14.53438, 51.00374], [14.53321, 51.01679], [14.49873, 51.02242], [14.50809, 51.0427], [14.49991, 51.04692], [14.49154, 51.04382], [14.49202, 51.02286], [14.45827, 51.03712], [14.41335, 51.02086], [14.30098, 51.05515], [14.25665, 50.98935], [14.28776, 50.97718], [14.32353, 50.98556], [14.32793, 50.97379], [14.30251, 50.96606], [14.31422, 50.95243], [14.39848, 50.93866], [14.38691, 50.89907], [14.30098, 50.88448], [14.27123, 50.89386], [14.24314, 50.88761], [14.22331, 50.86049], [14.02982, 50.80662], [13.98864, 50.8177], [13.89113, 50.78533], [13.89444, 50.74142], [13.82942, 50.7251], [13.76316, 50.73487], [13.70204, 50.71771], [13.65977, 50.73096], [13.52474, 50.70394], [13.53748, 50.67654], [13.5226, 50.64721], [13.49742, 50.63133], [13.46413, 50.60102], [13.42189, 50.61243], [13.37485, 50.64931], [13.37805, 50.627], [13.32264, 50.60317], [13.32594, 50.58009], [13.29454, 50.57904], [13.25158, 50.59268], [13.19043, 50.50237], [13.13424, 50.51709], [13.08301, 50.50132], [13.0312, 50.50944], [13.02038, 50.4734], [13.02147, 50.44763], [12.98433, 50.42016], [12.94058, 50.40944], [12.82465, 50.45738], [12.73476, 50.43237], [12.73044, 50.42268], [12.70731, 50.39948], [12.67261, 50.41949], [12.51356, 50.39694], [12.48747, 50.37278], [12.49214, 50.35228], [12.48256, 50.34784], [12.46643, 50.35527], [12.43722, 50.33774], [12.43371, 50.32506], [12.39924, 50.32302], [12.40158, 50.29521], [12.36594, 50.28289], [12.35425, 50.23993], [12.33263, 50.24367], [12.32445, 50.20442], [12.33847, 50.19432], [12.32596, 50.17146], [12.29232, 50.17524], [12.28063, 50.19544], [12.28755, 50.22429], [12.23943, 50.24594], [12.24791, 50.25525], [12.26953, 50.25189], [12.25119, 50.27079], [12.20823, 50.2729], [12.18013, 50.32146], [12.10907, 50.32041], [12.13716, 50.27396], [12.09287, 50.25032], [12.19335, 50.19997], [12.21484, 50.16399], [12.1917, 50.13434], [12.2073, 50.10315], [12.23709, 50.10213], [12.27433, 50.0771], [12.26111, 50.06331], [12.30798, 50.05719], [12.49908, 49.97305], [12.47264, 49.94222], [12.55197, 49.92094], [12.48256, 49.83575], [12.46603, 49.78882], [12.40489, 49.76321], [12.4462, 49.70233], [12.52553, 49.68415], [12.53544, 49.61888], [12.56188, 49.6146], [12.60155, 49.52887], [12.64782, 49.52565], [12.64121, 49.47628], [12.669, 49.42935], [12.71227, 49.42363], [12.75854, 49.3989], [12.78168, 49.34618], [12.88414, 49.33541], [12.88249, 49.35479], [12.94859, 49.34079], [13.03618, 49.30417], [13.02957, 49.27399], [13.05883, 49.26259], [13.17665, 49.16713], [13.17019, 49.14339], [13.20405, 49.12303], [13.23689, 49.11412], [13.28242, 49.1228], [13.39479, 49.04812], [13.40802, 48.98851], [13.50221, 48.93752], [13.50552, 48.97441], [13.58319, 48.96899], [13.61624, 48.9462], [13.67739, 48.87886], [13.73854, 48.88538], [13.76994, 48.83537], [13.78977, 48.83319], [13.8096, 48.77877], [13.84023, 48.76988], [14.06151, 48.66873], [14.01482, 48.63788], [14.09104, 48.5943], [14.20691, 48.5898], [14.33909, 48.55852], [14.43076, 48.58855], [14.4587, 48.64695], [14.56139, 48.60429], [14.60808, 48.62881], [14.66762, 48.58215], [14.71794, 48.59794], [14.72756, 48.69502], [14.80584, 48.73489], [14.80821, 48.77711], [14.81545, 48.7874], [14.94773, 48.76268], [14.95641, 48.75915], [14.9758, 48.76857], [14.98112, 48.77524], [14.9782, 48.7766], [14.98032, 48.77959], [14.95072, 48.79101], [14.98917, 48.90082], [14.97612, 48.96983], [14.99878, 49.01444], [15.15534, 48.99056], [15.16358, 48.94278], [15.26177, 48.95766], [15.28305, 48.98831], [15.34823, 48.98444], [15.48027, 48.94481], [15.51357, 48.91549], [15.61622, 48.89541], [15.6921, 48.85973], [15.75341, 48.8516], [15.78087, 48.87644], [15.84404, 48.86921], [16.06034, 48.75436], [16.37345, 48.729], [16.40915, 48.74576], [16.46134, 48.80865], [16.67008, 48.77699], [16.68518, 48.7281], [16.71883, 48.73806], [16.79779, 48.70998], [16.90354, 48.71541], [16.93955, 48.60371], [17.00215, 48.70887], [17.11202, 48.82925], [17.19355, 48.87602], [17.29054, 48.85546], [17.3853, 48.80936], [17.45671, 48.85004], [17.5295, 48.81117], [17.7094, 48.86721], [17.73126, 48.87885], [17.77944, 48.92318], [17.87831, 48.92679], [17.91814, 49.01784], [18.06885, 49.03157], [18.1104, 49.08624], [18.15022, 49.24518], [18.18456, 49.28909], [18.36446, 49.3267], [18.4139, 49.36517], [18.4084, 49.40003], [18.44686, 49.39467], [18.54848, 49.47059], [18.53063, 49.49022], [18.57183, 49.51162], [18.6144, 49.49824], [18.67757, 49.50895], [18.74761, 49.492], [18.84521, 49.51672], [18.84786, 49.5446], [18.80479, 49.6815], [18.72838, 49.68163], [18.69817, 49.70473], [18.62676, 49.71983], [18.62943, 49.74603], [18.62645, 49.75002], [18.61368, 49.75426], [18.61278, 49.7618], [18.57183, 49.83334], [18.60341, 49.86256], [18.57045, 49.87849], [18.57697, 49.91565], [18.54299, 49.92537], [18.54495, 49.9079], [18.53423, 49.89906], [18.41604, 49.93498], [18.33562, 49.94747], [18.33278, 49.92415], [18.31914, 49.91565], [18.27794, 49.93863], [18.27107, 49.96779], [18.21752, 49.97309], [18.20241, 49.99958], [18.10628, 50.00223], [18.07898, 50.04535], [18.03212, 50.06574], [18.00396, 50.04954], [18.04585, 50.03311], [18.04585, 50.01194], [18.00191, 50.01723], [17.86886, 49.97452], [17.77669, 50.02253], [17.7506, 50.07896], [17.6888, 50.12037], [17.66683, 50.10275], [17.59404, 50.16437], [17.70528, 50.18812], [17.76296, 50.23382], [17.72176, 50.25665], [17.74648, 50.29966], [17.69292, 50.32859], [17.67764, 50.28977], [17.58889, 50.27837], [17.3702, 50.28123], [17.34548, 50.2628], [17.34273, 50.32947], [17.27681, 50.32246], [17.19991, 50.3654], [17.19579, 50.38817], [17.14498, 50.38117], [17.1224, 50.39494], [16.89229, 50.45117], [16.85933, 50.41093], [16.90877, 50.38642], [16.94448, 50.31281], [16.99803, 50.30316], [17.02138, 50.27772], [16.99803, 50.25753], [17.02825, 50.23118], [17.00353, 50.21449], [16.98018, 50.24172], [16.8456, 50.20834], [16.7014, 50.09659], [16.63137, 50.1142], [16.55446, 50.16613], [16.56407, 50.21009], [16.42674, 50.32509], [16.39379, 50.3207], [16.3622, 50.34875], [16.36495, 50.37679], [16.30289, 50.38292], [16.28118, 50.36891], [16.22821, 50.41054], [16.21585, 50.40627], [16.19526, 50.43291], [16.31413, 50.50274], [16.34572, 50.49575], [16.44597, 50.58041], [16.33611, 50.66579], [16.23174, 50.67101], [16.20839, 50.63096], [16.10265, 50.66405], [16.02437, 50.60046], [15.98317, 50.61528], [16.0175, 50.63009], [15.97219, 50.69799], [15.87331, 50.67188], [15.81683, 50.75666], [15.73186, 50.73885], [15.43798, 50.80833], [15.3803, 50.77187], [15.36656, 50.83956], [15.2773, 50.8907], [15.27043, 50.97724], [15.2361, 50.99886], [15.1743, 50.9833], [15.16744, 51.01959], [15.11937, 50.99021], [15.10152, 51.01095], [15.06218, 51.02269], [15.03895, 51.0123], [15.02433, 51.0242], [14.96419, 50.99108], [15.01088, 50.97984], [14.99852, 50.86817], [14.82803, 50.86966]]]]
+         }
+       }, {
+         type: "Feature",
+         properties: {
+           iso1A2: "DE",
+           iso1A3: "DEU",
+           iso1N3: "276",
+           wikidata: "Q183",
+           nameEn: "Germany",
+           groups: ["EU", "155", "150", "UN"],
+           callingCodes: ["49"]
+         },
+         geometry: {
+           type: "MultiPolygon",
+           coordinates: [[[[8.70847, 47.68904], [8.71773, 47.69088], [8.70237, 47.71453], [8.66416, 47.71367], [8.67508, 47.6979], [8.65769, 47.68928], [8.66837, 47.68437], [8.68985, 47.69552], [8.70847, 47.68904]]], [[[8.72617, 47.69651], [8.72809, 47.69282], [8.75856, 47.68969], [8.79511, 47.67462], [8.79966, 47.70222], [8.76965, 47.7075], [8.77309, 47.72059], [8.80663, 47.73821], [8.82002, 47.71458], [8.86989, 47.70504], [8.85065, 47.68209], [8.87383, 47.67045], [8.87625, 47.65441], [8.89946, 47.64769], [8.94093, 47.65596], [9.02093, 47.6868], [9.09891, 47.67801], [9.13845, 47.66389], [9.15181, 47.66904], [9.1705, 47.65513], [9.1755, 47.65584], [9.17593, 47.65399], [9.18203, 47.65598], [9.25619, 47.65939], [9.55125, 47.53629], [9.72736, 47.53457], [9.76748, 47.5934], [9.80254, 47.59419], [9.82591, 47.58158], [9.8189, 47.54688], [9.87499, 47.52953], [9.87733, 47.54688], [9.92407, 47.53111], [9.96029, 47.53899], [10.00003, 47.48216], [10.03859, 47.48927], [10.07131, 47.45531], [10.09001, 47.46005], [10.1052, 47.4316], [10.06897, 47.40709], [10.09819, 47.35724], [10.11805, 47.37228], [10.16362, 47.36674], [10.17648, 47.38889], [10.2127, 47.38019], [10.22774, 47.38904], [10.23757, 47.37609], [10.19998, 47.32832], [10.2147, 47.31014], [10.17648, 47.29149], [10.17531, 47.27167], [10.23257, 47.27088], [10.33424, 47.30813], [10.39851, 47.37623], [10.4324, 47.38494], [10.4359, 47.41183], [10.47446, 47.43318], [10.46278, 47.47901], [10.44291, 47.48453], [10.4324, 47.50111], [10.44992, 47.5524], [10.43473, 47.58394], [10.47329, 47.58552], [10.48849, 47.54057], [10.56912, 47.53584], [10.60337, 47.56755], [10.63456, 47.5591], [10.68832, 47.55752], [10.6965, 47.54253], [10.7596, 47.53228], [10.77596, 47.51729], [10.88814, 47.53701], [10.91268, 47.51334], [10.86945, 47.5015], [10.87061, 47.4786], [10.90918, 47.48571], [10.93839, 47.48018], [10.92437, 47.46991], [10.98513, 47.42882], [10.97111, 47.41617], [10.97111, 47.39561], [11.11835, 47.39719], [11.12536, 47.41222], [11.20482, 47.43198], [11.25157, 47.43277], [11.22002, 47.3964], [11.27844, 47.39956], [11.29597, 47.42566], [11.33804, 47.44937], [11.4175, 47.44621], [11.38128, 47.47465], [11.4362, 47.51413], [11.52618, 47.50939], [11.58578, 47.52281], [11.58811, 47.55515], [11.60681, 47.57881], [11.63934, 47.59202], [11.84052, 47.58354], [11.85572, 47.60166], [12.0088, 47.62451], [12.02282, 47.61033], [12.05788, 47.61742], [12.13734, 47.60639], [12.17824, 47.61506], [12.18145, 47.61019], [12.17737, 47.60121], [12.18568, 47.6049], [12.20398, 47.60667], [12.20801, 47.61082], [12.19895, 47.64085], [12.18507, 47.65984], [12.18347, 47.66663], [12.16769, 47.68167], [12.16217, 47.70105], [12.18303, 47.70065], [12.22571, 47.71776], [12.2542, 47.7433], [12.26238, 47.73544], [12.24017, 47.69534], [12.26004, 47.67725], [12.27991, 47.68827], [12.336, 47.69534], [12.37222, 47.68433], [12.43883, 47.6977], [12.44117, 47.6741], [12.50076, 47.62293], [12.53816, 47.63553], [12.57438, 47.63238], [12.6071, 47.6741], [12.7357, 47.6787], [12.77777, 47.66689], [12.76492, 47.64485], [12.82101, 47.61493], [12.77427, 47.58025], [12.80699, 47.54477], [12.84672, 47.54556], [12.85256, 47.52741], [12.9624, 47.47452], [12.98344, 47.48716], [12.9998, 47.46267], [13.04537, 47.49426], [13.03252, 47.53373], [13.05355, 47.56291], [13.04537, 47.58183], [13.06641, 47.58577], [13.06407, 47.60075], [13.09562, 47.63304], [13.07692, 47.68814], [13.01382, 47.72116], [12.98578, 47.7078], [12.92969, 47.71094], [12.91333, 47.7178], [12.90274, 47.72513], [12.91711, 47.74026], [12.9353, 47.74788], [12.94371, 47.76281], [12.93202, 47.77302], [12.96311, 47.79957], [12.98543, 47.82896], [13.00588, 47.84374], [12.94163, 47.92927], [12.93886, 47.94046], [12.93642, 47.94436], [12.93419, 47.94063], [12.92668, 47.93879], [12.91985, 47.94069], [12.9211, 47.95135], [12.91683, 47.95647], [12.87476, 47.96195], [12.8549, 48.01122], [12.76141, 48.07373], [12.74973, 48.10885], [12.7617, 48.12796], [12.78595, 48.12445], [12.80676, 48.14979], [12.82673, 48.15245], [12.8362, 48.15876], [12.836, 48.1647], [12.84475, 48.16556], [12.87126, 48.20318], [12.95306, 48.20629], [13.02083, 48.25689], [13.0851, 48.27711], [13.126, 48.27867], [13.18093, 48.29577], [13.26039, 48.29422], [13.30897, 48.31575], [13.40709, 48.37292], [13.43929, 48.43386], [13.42527, 48.45711], [13.45727, 48.51092], [13.43695, 48.55776], [13.45214, 48.56472], [13.46967, 48.55157], [13.50663, 48.57506], [13.50131, 48.58091], [13.51291, 48.59023], [13.57535, 48.55912], [13.59705, 48.57013], [13.62508, 48.55501], [13.65186, 48.55092], [13.66113, 48.53558], [13.72802, 48.51208], [13.74816, 48.53058], [13.7513, 48.5624], [13.76921, 48.55324], [13.80519, 48.58026], [13.80038, 48.59487], [13.82609, 48.62345], [13.81901, 48.6761], [13.81283, 48.68426], [13.81791, 48.69832], [13.79337, 48.71375], [13.81863, 48.73257], [13.82266, 48.75544], [13.84023, 48.76988], [13.8096, 48.77877], [13.78977, 48.83319], [13.76994, 48.83537], [13.73854, 48.88538], [13.67739, 48.87886], [13.61624, 48.9462], [13.58319, 48.96899], [13.50552, 48.97441], [13.50221, 48.93752], [13.40802, 48.98851], [13.39479, 49.04812], [13.28242, 49.1228], [13.23689, 49.11412], [13.20405, 49.12303], [13.17019, 49.14339], [13.17665, 49.16713], [13.05883, 49.26259], [13.02957, 49.27399], [13.03618, 49.30417], [12.94859, 49.34079], [12.88249, 49.35479], [12.88414, 49.33541], [12.78168, 49.34618], [12.75854, 49.3989], [12.71227, 49.42363], [12.669, 49.42935], [12.64121, 49.47628], [12.64782, 49.52565], [12.60155, 49.52887], [12.56188, 49.6146], [12.53544, 49.61888], [12.52553, 49.68415], [12.4462, 49.70233], [12.40489, 49.76321], [12.46603, 49.78882], [12.48256, 49.83575], [12.55197, 49.92094], [12.47264, 49.94222], [12.49908, 49.97305], [12.30798, 50.05719], [12.26111, 50.06331], [12.27433, 50.0771], [12.23709, 50.10213], [12.2073, 50.10315], [12.1917, 50.13434], [12.21484, 50.16399], [12.19335, 50.19997], [12.09287, 50.25032], [12.13716, 50.27396], [12.10907, 50.32041], [12.18013, 50.32146], [12.20823, 50.2729], [12.25119, 50.27079], [12.26953, 50.25189], [12.24791, 50.25525], [12.23943, 50.24594], [12.28755, 50.22429], [12.28063, 50.19544], [12.29232, 50.17524], [12.32596, 50.17146], [12.33847, 50.19432], [12.32445, 50.20442], [12.33263, 50.24367], [12.35425, 50.23993], [12.36594, 50.28289], [12.40158, 50.29521], [12.39924, 50.32302], [12.43371, 50.32506], [12.43722, 50.33774], [12.46643, 50.35527], [12.48256, 50.34784], [12.49214, 50.35228], [12.48747, 50.37278], [12.51356, 50.39694], [12.67261, 50.41949], [12.70731, 50.39948], [12.73044, 50.42268], [12.73476, 50.43237], [12.82465, 50.45738], [12.94058, 50.40944], [12.98433, 50.42016], [13.02147, 50.44763], [13.02038, 50.4734], [13.0312, 50.50944], [13.08301, 50.50132], [13.13424, 50.51709], [13.19043, 50.50237], [13.25158, 50.59268], [13.29454, 50.57904], [13.32594, 50.58009], [13.32264, 50.60317], [13.37805, 50.627], [13.37485, 50.64931], [13.42189, 50.61243], [13.46413, 50.60102], [13.49742, 50.63133], [13.5226, 50.64721], [13.53748, 50.67654], [13.52474, 50.70394], [13.65977, 50.73096], [13.70204, 50.71771], [13.76316, 50.73487], [13.82942, 50.7251], [13.89444, 50.74142], [13.89113, 50.78533], [13.98864, 50.8177], [14.02982, 50.80662], [14.22331, 50.86049], [14.24314, 50.88761], [14.27123, 50.89386], [14.30098, 50.88448], [14.38691, 50.89907], [14.39848, 50.93866], [14.31422, 50.95243], [14.30251, 50.96606], [14.32793, 50.97379], [14.32353, 50.98556], [14.28776, 50.97718], [14.25665, 50.98935], [14.30098, 51.05515], [14.41335, 51.02086], [14.45827, 51.03712], [14.49202, 51.02286], [14.49154, 51.04382], [14.49991, 51.04692], [14.50809, 51.0427], [14.49873, 51.02242], [14.53321, 51.01679], [14.53438, 51.00374], [14.56432, 51.01008], [14.58215, 50.99306], [14.59908, 50.98685], [14.59702, 50.96148], [14.56374, 50.922], [14.58024, 50.91443], [14.64802, 50.93241], [14.65259, 50.90513], [14.63434, 50.8883], [14.61993, 50.86049], [14.70661, 50.84096], [14.79139, 50.81438], [14.82803, 50.86966], [14.81664, 50.88148], [14.89681, 50.9422], [14.89252, 50.94999], [14.92942, 50.99744], [14.95529, 51.04552], [14.97938, 51.07742], [14.98229, 51.11354], [14.99689, 51.12205], [14.99079, 51.14284], [14.99646, 51.14365], [15.00083, 51.14974], [14.99414, 51.15813], [14.99311, 51.16249], [15.0047, 51.16874], [15.01242, 51.21285], [15.04288, 51.28387], [14.98008, 51.33449], [14.96899, 51.38367], [14.9652, 51.44793], [14.94749, 51.47155], [14.73219, 51.52922], [14.72652, 51.53902], [14.73047, 51.54606], [14.71125, 51.56209], [14.7727, 51.61263], [14.75759, 51.62318], [14.75392, 51.67445], [14.69065, 51.70842], [14.66386, 51.73282], [14.64625, 51.79472], [14.60493, 51.80473], [14.59089, 51.83302], [14.6588, 51.88359], [14.6933, 51.9044], [14.70601, 51.92944], [14.7177, 51.94048], [14.72163, 51.95188], [14.71836, 51.95606], [14.7139, 51.95643], [14.70488, 51.97679], [14.71339, 52.00337], [14.76026, 52.06624], [14.72971, 52.09167], [14.6917, 52.10283], [14.67683, 52.13936], [14.70616, 52.16927], [14.68344, 52.19612], [14.71319, 52.22144], [14.70139, 52.25038], [14.58149, 52.28007], [14.56378, 52.33838], [14.55228, 52.35264], [14.54423, 52.42568], [14.63056, 52.48993], [14.60081, 52.53116], [14.6289, 52.57136], [14.61073, 52.59847], [14.22071, 52.81175], [14.13806, 52.82392], [14.12256, 52.84311], [14.15873, 52.87715], [14.14056, 52.95786], [14.25954, 53.00264], [14.35044, 53.05829], [14.38679, 53.13669], [14.36696, 53.16444], [14.37853, 53.20405], [14.40662, 53.21098], [14.45125, 53.26241], [14.44133, 53.27427], [14.4215, 53.27724], [14.35209, 53.49506], [14.3273, 53.50587], [14.30416, 53.55499], [14.31904, 53.61581], [14.2853, 53.63392], [14.28477, 53.65955], [14.27133, 53.66613], [14.2836, 53.67721], [14.26782, 53.69866], [14.27249, 53.74464], [14.21323, 53.8664], [14.20823, 53.90776], [14.18544, 53.91258], [14.20647, 53.91671], [14.22634, 53.9291], [14.20811, 54.12784], [13.93395, 54.84044], [12.85844, 54.82438], [11.90309, 54.38543], [11.00303, 54.63689], [10.31111, 54.65968], [10.16755, 54.73883], [9.89314, 54.84171], [9.73563, 54.8247], [9.61187, 54.85548], [9.62734, 54.88057], [9.58937, 54.88785], [9.4659, 54.83131], [9.43155, 54.82586], [9.41213, 54.84254], [9.38532, 54.83968], [9.36496, 54.81749], [9.33849, 54.80233], [9.32771, 54.80602], [9.2474, 54.8112], [9.23445, 54.83432], [9.24631, 54.84726], [9.20571, 54.85841], [9.14275, 54.87421], [9.04629, 54.87249], [8.92795, 54.90452], [8.81178, 54.90518], [8.76387, 54.8948], [8.63979, 54.91069], [8.55769, 54.91837], [8.45719, 55.06747], [8.02459, 55.09613], [5.45168, 54.20039], [6.91025, 53.44221], [7.00198, 53.32672], [7.19052, 53.31866], [7.21679, 53.20058], [7.22681, 53.18165], [7.17898, 53.13817], [7.21694, 53.00742], [7.07253, 52.81083], [7.04557, 52.63318], [6.77307, 52.65375], [6.71641, 52.62905], [6.69507, 52.488], [6.94293, 52.43597], [6.99041, 52.47235], [7.03417, 52.40237], [7.07044, 52.37805], [7.02703, 52.27941], [7.06365, 52.23789], [7.03729, 52.22695], [6.9897, 52.2271], [6.97189, 52.20329], [6.83984, 52.11728], [6.76117, 52.11895], [6.68128, 52.05052], [6.83035, 51.9905], [6.82357, 51.96711], [6.72319, 51.89518], [6.68386, 51.91861], [6.58556, 51.89386], [6.50231, 51.86313], [6.47179, 51.85395], [6.38815, 51.87257], [6.40704, 51.82771], [6.30593, 51.84998], [6.29872, 51.86801], [6.21443, 51.86801], [6.15349, 51.90439], [6.11551, 51.89769], [6.16902, 51.84094], [6.10337, 51.84829], [6.06705, 51.86136], [5.99848, 51.83195], [5.94568, 51.82786], [5.98665, 51.76944], [5.95003, 51.7493], [6.04091, 51.71821], [6.02767, 51.6742], [6.11759, 51.65609], [6.09055, 51.60564], [6.18017, 51.54096], [6.21724, 51.48568], [6.20654, 51.40049], [6.22641, 51.39948], [6.22674, 51.36135], [6.16977, 51.33169], [6.07889, 51.24432], [6.07889, 51.17038], [6.17384, 51.19589], [6.16706, 51.15677], [5.98292, 51.07469], [5.9541, 51.03496], [5.9134, 51.06736], [5.86735, 51.05182], [5.87849, 51.01969], [5.90493, 51.00198], [5.90296, 50.97356], [5.95282, 50.98728], [6.02697, 50.98303], [6.01615, 50.93367], [6.09297, 50.92066], [6.07486, 50.89307], [6.08805, 50.87223], [6.07693, 50.86025], [6.07431, 50.84674], [6.05702, 50.85179], [6.05623, 50.8572], [6.01921, 50.84435], [6.02328, 50.81694], [6.00462, 50.80065], [5.98404, 50.80988], [5.97497, 50.79992], [6.02624, 50.77453], [6.01976, 50.75398], [6.03889, 50.74618], [6.0326, 50.72647], [6.0406, 50.71848], [6.04428, 50.72861], [6.11707, 50.72231], [6.17852, 50.6245], [6.26957, 50.62444], [6.2476, 50.60392], [6.24888, 50.59869], [6.24005, 50.58732], [6.22581, 50.5907], [6.20281, 50.56952], [6.17739, 50.55875], [6.17802, 50.54179], [6.19735, 50.53576], [6.19579, 50.5313], [6.18716, 50.52653], [6.19193, 50.5212], [6.20599, 50.52089], [6.22335, 50.49578], [6.26637, 50.50272], [6.30809, 50.50058], [6.3465, 50.48833], [6.34005, 50.46083], [6.37219, 50.45397], [6.36852, 50.40776], [6.34406, 50.37994], [6.3688, 50.35898], [6.40785, 50.33557], [6.40641, 50.32425], [6.35701, 50.31139], [6.32488, 50.32333], [6.29949, 50.30887], [6.28797, 50.27458], [6.208, 50.25179], [6.16853, 50.2234], [6.18364, 50.20815], [6.18739, 50.1822], [6.14588, 50.17106], [6.14132, 50.14971], [6.15298, 50.14126], [6.1379, 50.12964], [6.12055, 50.09171], [6.11274, 50.05916], [6.13458, 50.04141], [6.13044, 50.02929], [6.14666, 50.02207], [6.13794, 50.01466], [6.13273, 50.02019], [6.1295, 50.01849], [6.13806, 50.01056], [6.14948, 50.00908], [6.14147, 49.99563], [6.1701, 49.98518], [6.16466, 49.97086], [6.17872, 49.9537], [6.18554, 49.95622], [6.18045, 49.96611], [6.19089, 49.96991], [6.19856, 49.95053], [6.22094, 49.94955], [6.22608, 49.929], [6.21882, 49.92403], [6.22926, 49.92096], [6.23496, 49.89972], [6.26146, 49.88203], [6.28874, 49.87592], [6.29692, 49.86685], [6.30963, 49.87021], [6.32303, 49.85133], [6.32098, 49.83728], [6.33585, 49.83785], [6.34267, 49.84974], [6.36576, 49.85032], [6.40022, 49.82029], [6.42521, 49.81591], [6.42905, 49.81091], [6.44131, 49.81443], [6.45425, 49.81164], [6.47111, 49.82263], [6.48718, 49.81267], [6.50647, 49.80916], [6.51215, 49.80124], [6.52121, 49.81338], [6.53122, 49.80666], [6.52169, 49.79787], [6.50534, 49.78952], [6.51669, 49.78336], [6.51056, 49.77515], [6.51828, 49.76855], [6.51646, 49.75961], [6.50174, 49.75292], [6.50193, 49.73291], [6.51805, 49.72425], [6.51397, 49.72058], [6.50261, 49.72718], [6.49535, 49.72645], [6.49694, 49.72205], [6.5042, 49.71808], [6.50647, 49.71353], [6.49785, 49.71118], [6.48014, 49.69767], [6.46048, 49.69092], [6.44654, 49.67799], [6.42937, 49.66857], [6.42726, 49.66078], [6.43768, 49.66021], [6.4413, 49.65722], [6.41861, 49.61723], [6.39822, 49.60081], [6.385, 49.59946], [6.37464, 49.58886], [6.38342, 49.5799], [6.38024, 49.57593], [6.36676, 49.57813], [6.35825, 49.57053], [6.38228, 49.55855], [6.38072, 49.55171], [6.35666, 49.52931], [6.36788, 49.50377], [6.36907, 49.48931], [6.36778, 49.46937], [6.38352, 49.46463], [6.39168, 49.4667], [6.40274, 49.46546], [6.42432, 49.47683], [6.55404, 49.42464], [6.533, 49.40748], [6.60091, 49.36864], [6.58807, 49.35358], [6.572, 49.35027], [6.60186, 49.31055], [6.66583, 49.28065], [6.69274, 49.21661], [6.71843, 49.2208], [6.73256, 49.20486], [6.71137, 49.18808], [6.73765, 49.16375], [6.78265, 49.16793], [6.83385, 49.15162], [6.84703, 49.15734], [6.86225, 49.18185], [6.85016, 49.19354], [6.85119, 49.20038], [6.83555, 49.21249], [6.85939, 49.22376], [6.89298, 49.20863], [6.91875, 49.22261], [6.93831, 49.2223], [6.94028, 49.21641], [6.95963, 49.203], [6.97273, 49.2099], [7.01318, 49.19018], [7.03459, 49.19096], [7.0274, 49.17042], [7.03178, 49.15734], [7.04662, 49.13724], [7.04409, 49.12123], [7.04843, 49.11422], [7.05548, 49.11185], [7.06642, 49.11415], [7.07162, 49.1255], [7.09007, 49.13094], [7.07859, 49.15031], [7.10715, 49.15631], [7.10384, 49.13787], [7.12504, 49.14253], [7.1358, 49.1282], [7.1593, 49.1204], [7.23473, 49.12971], [7.29514, 49.11426], [7.3195, 49.14231], [7.35995, 49.14399], [7.3662, 49.17308], [7.44052, 49.18354], [7.44455, 49.16765], [7.49473, 49.17], [7.49172, 49.13915], [7.53012, 49.09818], [7.56416, 49.08136], [7.62575, 49.07654], [7.63618, 49.05428], [7.75948, 49.04562], [7.79557, 49.06583], [7.86386, 49.03499], [7.93641, 49.05544], [7.97783, 49.03161], [8.14189, 48.97833], [8.22604, 48.97352], [8.20031, 48.95856], [8.19989, 48.95825], [8.12813, 48.87985], [8.10253, 48.81829], [8.06802, 48.78957], [8.0326, 48.79017], [8.01534, 48.76085], [7.96994, 48.75606], [7.96812, 48.72491], [7.89002, 48.66317], [7.84098, 48.64217], [7.80057, 48.5857], [7.80167, 48.54758], [7.80647, 48.51239], [7.76833, 48.48945], [7.73109, 48.39192], [7.74562, 48.32736], [7.69022, 48.30018], [7.6648, 48.22219], [7.57137, 48.12292], [7.56966, 48.03265], [7.62302, 47.97898], [7.55673, 47.87371], [7.52921, 47.77747], [7.54761, 47.72912], [7.53722, 47.71635], [7.51266, 47.70197], [7.51915, 47.68335], [7.52067, 47.66437], [7.53384, 47.65115], [7.5591, 47.63849], [7.57423, 47.61628], [7.58851, 47.60794], [7.59301, 47.60058], [7.58945, 47.59017], [7.60523, 47.58519], [7.60459, 47.57869], [7.61929, 47.57683], [7.64309, 47.59151], [7.64213, 47.5944], [7.64599, 47.59695], [7.67395, 47.59212], [7.68229, 47.59905], [7.69385, 47.60099], [7.68486, 47.59601], [7.67115, 47.5871], [7.68904, 47.57133], [7.67655, 47.56435], [7.63338, 47.56256], [7.65083, 47.54662], [7.66174, 47.54554], [7.6656, 47.53752], [7.68101, 47.53232], [7.69642, 47.53297], [7.71961, 47.54219], [7.75261, 47.54599], [7.79486, 47.55691], [7.81901, 47.58798], [7.84412, 47.5841], [7.88664, 47.58854], [7.90673, 47.57674], [7.91251, 47.55031], [7.94494, 47.54511], [7.95682, 47.55789], [7.97581, 47.55493], [8.00113, 47.55616], [8.02136, 47.55096], [8.04383, 47.55443], [8.06663, 47.56374], [8.08557, 47.55768], [8.10002, 47.56504], [8.10395, 47.57918], [8.11543, 47.5841], [8.13662, 47.58432], [8.13823, 47.59147], [8.14947, 47.59558], [8.1652, 47.5945], [8.19378, 47.61636], [8.20617, 47.62141], [8.22011, 47.6181], [8.22577, 47.60385], [8.23809, 47.61204], [8.25863, 47.61571], [8.26313, 47.6103], [8.2824, 47.61225], [8.29722, 47.60603], [8.29524, 47.5919], [8.30277, 47.58607], [8.32735, 47.57133], [8.35512, 47.57014], [8.38273, 47.56608], [8.39477, 47.57826], [8.43235, 47.56617], [8.49431, 47.58107], [8.48949, 47.588], [8.46637, 47.58389], [8.45578, 47.60121], [8.50747, 47.61897], [8.51686, 47.63476], [8.55756, 47.62394], [8.57586, 47.59537], [8.60348, 47.61204], [8.59545, 47.64298], [8.60701, 47.65271], [8.61471, 47.64514], [8.60412, 47.63735], [8.62049, 47.63757], [8.62884, 47.65098], [8.61113, 47.66332], [8.6052, 47.67258], [8.57683, 47.66158], [8.56141, 47.67088], [8.52801, 47.66059], [8.5322, 47.64687], [8.49656, 47.64709], [8.46605, 47.64103], [8.4667, 47.65747], [8.44711, 47.65379], [8.42264, 47.66667], [8.41346, 47.66676], [8.40473, 47.67499], [8.4211, 47.68407], [8.40569, 47.69855], [8.44807, 47.72426], [8.45771, 47.7493], [8.48868, 47.77215], [8.56814, 47.78001], [8.56415, 47.80633], [8.61657, 47.79998], [8.62408, 47.7626], [8.64425, 47.76398], [8.65292, 47.80066], [8.68022, 47.78599], [8.68985, 47.75686], [8.71778, 47.76571], [8.74251, 47.75168], [8.70543, 47.73121], [8.73671, 47.7169], [8.72617, 47.69651]]]]
+         }
+       }, {
+         type: "Feature",
+         properties: {
+           iso1A2: "DG",
+           iso1A3: "DGA",
+           wikidata: "Q184851",
+           nameEn: "Diego Garcia",
+           country: "GB",
+           groups: ["IO", "BOTS", "014", "202", "002", "UN"],
+           isoStatus: "excRes",
+           callingCodes: ["246"]
+         },
+         geometry: {
+           type: "MultiPolygon",
+           coordinates: [[[[73.14823, -7.76302], [73.09982, -6.07324], [71.43792, -7.73904], [73.14823, -7.76302]]]]
+         }
+       }, {
+         type: "Feature",
+         properties: {
+           iso1A2: "DJ",
+           iso1A3: "DJI",
+           iso1N3: "262",
+           wikidata: "Q977",
+           nameEn: "Djibouti",
+           groups: ["014", "202", "002", "UN"],
+           callingCodes: ["253"]
+         },
+         geometry: {
+           type: "MultiPolygon",
+           coordinates: [[[[43.90659, 12.3823], [43.90659, 12.3823], [43.32909, 12.59711], [43.29075, 12.79154], [42.86195, 12.58747], [42.7996, 12.42629], [42.6957, 12.36201], [42.46941, 12.52661], [42.4037, 12.46478], [41.95461, 11.81157], [41.82878, 11.72361], [41.77727, 11.49902], [41.8096, 11.33606], [41.80056, 10.97127], [42.06302, 10.92599], [42.13691, 10.97586], [42.42669, 10.98493], [42.62989, 11.09711], [42.75111, 11.06992], [42.79037, 10.98493], [42.95776, 10.98533], [43.90659, 12.3823]]]]
+         }
+       }, {
+         type: "Feature",
+         properties: {
+           iso1A2: "DK",
+           iso1A3: "DNK",
+           iso1N3: "208",
+           wikidata: "Q756617",
+           nameEn: "Kingdom of Denmark"
+         },
+         geometry: null
+       }, {
+         type: "Feature",
+         properties: {
+           iso1A2: "DM",
+           iso1A3: "DMA",
+           iso1N3: "212",
+           wikidata: "Q784",
+           nameEn: "Dominica",
+           groups: ["029", "003", "419", "019", "UN"],
+           driveSide: "left",
+           roadSpeedUnit: "mph",
+           callingCodes: ["1 767"]
+         },
+         geometry: {
+           type: "MultiPolygon",
+           coordinates: [[[[-61.32485, 14.91445], [-60.86656, 15.82603], [-61.95646, 15.5094], [-61.32485, 14.91445]]]]
+         }
+       }, {
+         type: "Feature",
+         properties: {
+           iso1A2: "DO",
+           iso1A3: "DOM",
+           iso1N3: "214",
+           wikidata: "Q786",
+           nameEn: "Dominican Republic",
+           groups: ["029", "003", "419", "019", "UN"],
+           callingCodes: ["1 809", "1 829", "1 849"]
+         },
+         geometry: {
+           type: "MultiPolygon",
+           coordinates: [[[[-67.87844, 21.7938], [-72.38946, 20.27111], [-71.77419, 19.73128], [-71.75865, 19.70231], [-71.7429, 19.58445], [-71.71449, 19.55364], [-71.71268, 19.53374], [-71.6802, 19.45008], [-71.69448, 19.37866], [-71.77766, 19.33823], [-71.73229, 19.26686], [-71.62642, 19.21212], [-71.65337, 19.11759], [-71.69938, 19.10916], [-71.71088, 19.08353], [-71.74088, 19.0437], [-71.88102, 18.95007], [-71.77766, 18.95007], [-71.72624, 18.87802], [-71.71885, 18.78423], [-71.82556, 18.62551], [-71.95412, 18.64939], [-72.00201, 18.62312], [-71.88102, 18.50125], [-71.90875, 18.45821], [-71.69952, 18.34101], [-71.78271, 18.18302], [-71.75465, 18.14405], [-71.74994, 18.11115], [-71.73783, 18.07177], [-71.75671, 18.03456], [-72.29523, 17.48026], [-68.39466, 16.14167], [-67.87844, 21.7938]]]]
+         }
+       }, {
+         type: "Feature",
+         properties: {
+           iso1A2: "DZ",
+           iso1A3: "DZA",
+           iso1N3: "012",
+           wikidata: "Q262",
+           nameEn: "Algeria",
+           groups: ["015", "002", "UN"],
+           callingCodes: ["213"]
+         },
+         geometry: {
+           type: "MultiPolygon",
+           coordinates: [[[[8.59123, 37.14286], [5.10072, 39.89531], [-2.27707, 35.35051], [-2.21248, 35.08532], [-2.21445, 35.04378], [-2.04734, 34.93218], [-1.97833, 34.93218], [-1.97469, 34.886], [-1.73707, 34.74226], [-1.84569, 34.61907], [-1.69788, 34.48056], [-1.78042, 34.39018], [-1.64666, 34.10405], [-1.73494, 33.71721], [-1.59508, 33.59929], [-1.67067, 33.27084], [-1.46249, 33.0499], [-1.54244, 32.95499], [-1.37794, 32.73628], [-0.9912, 32.52467], [-1.24998, 32.32993], [-1.24453, 32.1917], [-1.15735, 32.12096], [-1.22829, 32.07832], [-2.46166, 32.16603], [-2.93873, 32.06557], [-2.82784, 31.79459], [-3.66314, 31.6339], [-3.66386, 31.39202], [-3.77647, 31.31912], [-3.77103, 31.14984], [-3.54944, 31.0503], [-3.65418, 30.85566], [-3.64735, 30.67539], [-4.31774, 30.53229], [-4.6058, 30.28343], [-5.21671, 29.95253], [-5.58831, 29.48103], [-5.72121, 29.52322], [-5.75616, 29.61407], [-6.69965, 29.51623], [-6.78351, 29.44634], [-6.95824, 29.50924], [-7.61585, 29.36252], [-8.6715, 28.71194], [-8.66879, 27.6666], [-8.66674, 27.31569], [-4.83423, 24.99935], [1.15698, 21.12843], [1.20992, 20.73533], [3.24648, 19.81703], [3.12501, 19.1366], [3.36082, 18.9745], [4.26651, 19.14224], [5.8153, 19.45101], [7.38361, 20.79165], [7.48273, 20.87258], [11.96886, 23.51735], [11.62498, 24.26669], [11.41061, 24.21456], [10.85323, 24.5595], [10.33159, 24.5465], [10.02432, 24.98124], [10.03146, 25.35635], [9.38834, 26.19288], [9.51696, 26.39148], [9.89569, 26.57696], [9.78136, 29.40961], [9.3876, 30.16738], [9.55544, 30.23971], [9.07483, 32.07865], [8.35999, 32.50101], [8.31895, 32.83483], [8.1179, 33.05086], [8.11433, 33.10175], [7.83028, 33.18851], [7.73687, 33.42114], [7.54088, 33.7726], [7.52851, 34.06493], [7.66174, 34.20167], [7.74207, 34.16492], [7.81242, 34.21841], [7.86264, 34.3987], [8.20482, 34.57575], [8.29655, 34.72798], [8.25189, 34.92009], [8.30727, 34.95378], [8.3555, 35.10007], [8.47318, 35.23376], [8.30329, 35.29884], [8.36086, 35.47774], [8.35371, 35.66373], [8.26472, 35.73669], [8.2626, 35.91733], [8.40731, 36.42208], [8.18936, 36.44939], [8.16167, 36.48817], [8.47609, 36.66607], [8.46537, 36.7706], [8.57613, 36.78062], [8.67706, 36.8364], [8.62972, 36.86499], [8.64044, 36.9401], [8.59123, 37.14286]]]]
+         }
+       }, {
+         type: "Feature",
+         properties: {
+           iso1A2: "EA",
+           wikidata: "Q28868874",
+           nameEn: "Ceuta, Melilla",
+           country: "ES",
+           level: "territory",
+           isoStatus: "excRes"
+         },
+         geometry: null
+       }, {
+         type: "Feature",
+         properties: {
+           iso1A2: "EC",
+           iso1A3: "ECU",
+           iso1N3: "218",
+           wikidata: "Q736",
+           nameEn: "Ecuador"
+         },
+         geometry: null
+       }, {
+         type: "Feature",
+         properties: {
+           iso1A2: "EE",
+           iso1A3: "EST",
+           iso1N3: "233",
+           wikidata: "Q191",
+           nameEn: "Estonia",
+           aliases: ["EW"],
+           groups: ["EU", "154", "150", "UN"],
+           callingCodes: ["372"]
+         },
+         geometry: {
+           type: "MultiPolygon",
+           coordinates: [[[[26.32936, 60.00121], [20.5104, 59.15546], [19.84909, 57.57876], [22.80496, 57.87798], [23.20055, 57.56697], [24.26221, 57.91787], [24.3579, 57.87471], [25.19484, 58.0831], [25.28237, 57.98539], [25.29581, 58.08288], [25.73499, 57.90193], [26.05949, 57.84744], [26.0324, 57.79037], [26.02456, 57.78342], [26.027, 57.78158], [26.0266, 57.77441], [26.02069, 57.77169], [26.02415, 57.76865], [26.03332, 57.7718], [26.0543, 57.76105], [26.08098, 57.76619], [26.2029, 57.7206], [26.1866, 57.6849], [26.29253, 57.59244], [26.46527, 57.56885], [26.54675, 57.51813], [26.90364, 57.62823], [27.34698, 57.52242], [27.31919, 57.57672], [27.40393, 57.62125], [27.3746, 57.66834], [27.52615, 57.72843], [27.50171, 57.78842], [27.56689, 57.83356], [27.78526, 57.83963], [27.81841, 57.89244], [27.67282, 57.92627], [27.62393, 58.09462], [27.48541, 58.22615], [27.55489, 58.39525], [27.36366, 58.78381], [27.74429, 58.98351], [27.80482, 59.1116], [27.87978, 59.18097], [27.90911, 59.24353], [28.00689, 59.28351], [28.14215, 59.28934], [28.19284, 59.35791], [28.20537, 59.36491], [28.21137, 59.38058], [28.19061, 59.39962], [28.04187, 59.47017], [27.85643, 59.58538], [26.90044, 59.63819], [26.32936, 60.00121]]]]
+         }
+       }, {
+         type: "Feature",
+         properties: {
+           iso1A2: "EG",
+           iso1A3: "EGY",
+           iso1N3: "818",
+           wikidata: "Q79",
+           nameEn: "Egypt",
+           groups: ["015", "002", "UN"],
+           callingCodes: ["20"]
+         },
+         geometry: {
+           type: "MultiPolygon",
+           coordinates: [[[[33.62659, 31.82938], [26.92891, 33.39516], [24.8458, 31.39877], [25.01077, 30.73861], [24.71117, 30.17441], [24.99968, 29.24574], [24.99885, 21.99535], [33.17563, 22.00405], [34.0765, 22.00501], [37.8565, 22.00903], [34.4454, 27.91479], [34.8812, 29.36878], [34.92298, 29.45305], [34.26742, 31.21998], [34.24012, 31.29591], [34.23572, 31.2966], [34.21853, 31.32363], [34.052, 31.46619], [33.62659, 31.82938]]]]
+         }
+       }, {
+         type: "Feature",
+         properties: {
+           iso1A2: "EH",
+           iso1A3: "ESH",
+           iso1N3: "732",
+           wikidata: "Q6250",
+           nameEn: "Western Sahara",
+           groups: ["015", "002"],
+           callingCodes: ["212"]
+         },
+         geometry: {
+           type: "MultiPolygon",
+           coordinates: [[[[-8.66879, 27.6666], [-8.77527, 27.66663], [-8.71787, 26.9898], [-9.08698, 26.98639], [-9.56957, 26.90042], [-9.81998, 26.71379], [-10.68417, 26.90984], [-11.35695, 26.8505], [-11.23622, 26.72023], [-11.38635, 26.611], [-11.62052, 26.05229], [-12.06001, 26.04442], [-12.12281, 25.13682], [-12.92147, 24.39502], [-13.00628, 24.01923], [-13.75627, 23.77231], [-14.10361, 22.75501], [-14.1291, 22.41636], [-14.48112, 22.00886], [-14.47329, 21.63839], [-14.78487, 21.36587], [-16.44269, 21.39745], [-16.9978, 21.36239], [-17.02707, 21.34022], [-17.21511, 21.34226], [-17.35589, 20.80492], [-17.0471, 20.76408], [-17.0695, 20.85742], [-17.06781, 20.92697], [-17.0396, 20.9961], [-17.0357, 21.05368], [-16.99806, 21.12142], [-16.95474, 21.33997], [-13.01525, 21.33343], [-13.08438, 22.53866], [-13.15313, 22.75649], [-13.10753, 22.89493], [-13.00412, 23.02297], [-12.5741, 23.28975], [-12.36213, 23.3187], [-12.14969, 23.41935], [-12.00251, 23.4538], [-12.0002, 25.9986], [-8.66721, 25.99918], [-8.66674, 27.31569], [-8.66879, 27.6666]]]]
+         }
+       }, {
+         type: "Feature",
+         properties: {
+           iso1A2: "ER",
+           iso1A3: "ERI",
+           iso1N3: "232",
+           wikidata: "Q986",
+           nameEn: "Eritrea",
+           groups: ["014", "202", "002", "UN"],
+           callingCodes: ["291"]
+         },
+         geometry: {
+           type: "MultiPolygon",
+           coordinates: [[[[40.99158, 15.81743], [39.63762, 18.37348], [38.57727, 17.98125], [38.45916, 17.87167], [38.37133, 17.66269], [38.13362, 17.53906], [37.50967, 17.32199], [37.42694, 17.04041], [36.99777, 17.07172], [36.92193, 16.23451], [36.76371, 15.80831], [36.69761, 15.75323], [36.54276, 15.23478], [36.44337, 15.14963], [36.54376, 14.25597], [36.56536, 14.26177], [36.55659, 14.28237], [36.63364, 14.31172], [36.85787, 14.32201], [37.01622, 14.2561], [37.09486, 14.27155], [37.13206, 14.40746], [37.3106, 14.44657], [37.47319, 14.2149], [37.528, 14.18413], [37.91287, 14.89447], [38.0364, 14.72745], [38.25562, 14.67287], [38.3533, 14.51323], [38.45748, 14.41445], [38.78306, 14.4754], [38.98058, 14.54895], [39.02834, 14.63717], [39.16074, 14.65187], [39.14772, 14.61827], [39.19547, 14.56996], [39.23888, 14.56365], [39.26927, 14.48801], [39.2302, 14.44598], [39.2519, 14.40393], [39.37685, 14.54402], [39.52756, 14.49011], [39.50585, 14.55735], [39.58182, 14.60987], [39.76632, 14.54264], [39.9443, 14.41024], [40.07236, 14.54264], [40.14649, 14.53969], [40.21128, 14.39342], [40.25686, 14.41445], [40.9167, 14.11152], [41.25097, 13.60787], [41.62864, 13.38626], [42.05841, 12.80912], [42.21469, 12.75832], [42.2798, 12.6355], [42.4037, 12.46478], [42.46941, 12.52661], [42.6957, 12.36201], [42.7996, 12.42629], [42.86195, 12.58747], [43.29075, 12.79154], [40.99158, 15.81743]]]]
+         }
+       }, {
+         type: "Feature",
+         properties: {
+           iso1A2: "ES",
+           iso1A3: "ESP",
+           iso1N3: "724",
+           wikidata: "Q29",
+           nameEn: "Spain"
+         },
+         geometry: null
+       }, {
+         type: "Feature",
+         properties: {
+           iso1A2: "ET",
+           iso1A3: "ETH",
+           iso1N3: "231",
+           wikidata: "Q115",
+           nameEn: "Ethiopia",
+           groups: ["014", "202", "002", "UN"],
+           callingCodes: ["251"]
+         },
+         geometry: {
+           type: "MultiPolygon",
+           coordinates: [[[[42.4037, 12.46478], [42.2798, 12.6355], [42.21469, 12.75832], [42.05841, 12.80912], [41.62864, 13.38626], [41.25097, 13.60787], [40.9167, 14.11152], [40.25686, 14.41445], [40.21128, 14.39342], [40.14649, 14.53969], [40.07236, 14.54264], [39.9443, 14.41024], [39.76632, 14.54264], [39.58182, 14.60987], [39.50585, 14.55735], [39.52756, 14.49011], [39.37685, 14.54402], [39.2519, 14.40393], [39.2302, 14.44598], [39.26927, 14.48801], [39.23888, 14.56365], [39.19547, 14.56996], [39.14772, 14.61827], [39.16074, 14.65187], [39.02834, 14.63717], [38.98058, 14.54895], [38.78306, 14.4754], [38.45748, 14.41445], [38.3533, 14.51323], [38.25562, 14.67287], [38.0364, 14.72745], [37.91287, 14.89447], [37.528, 14.18413], [37.47319, 14.2149], [37.3106, 14.44657], [37.13206, 14.40746], [37.09486, 14.27155], [37.01622, 14.2561], [36.85787, 14.32201], [36.63364, 14.31172], [36.55659, 14.28237], [36.56536, 14.26177], [36.54376, 14.25597], [36.44653, 13.95666], [36.48824, 13.83954], [36.38993, 13.56459], [36.24545, 13.36759], [36.13374, 12.92665], [36.16651, 12.88019], [36.14268, 12.70879], [36.01458, 12.72478], [35.70476, 12.67101], [35.24302, 11.91132], [35.11492, 11.85156], [35.05832, 11.71158], [35.09556, 11.56278], [34.95704, 11.24448], [35.01215, 11.19626], [34.93172, 10.95946], [34.97789, 10.91559], [34.97491, 10.86147], [34.86916, 10.78832], [34.86618, 10.74588], [34.77532, 10.69027], [34.77383, 10.74588], [34.59062, 10.89072], [34.4372, 10.781], [34.2823, 10.53508], [34.34783, 10.23914], [34.32102, 10.11599], [34.22718, 10.02506], [34.20484, 9.9033], [34.13186, 9.7492], [34.08717, 9.55243], [34.10229, 9.50238], [34.14304, 9.04654], [34.14453, 8.60204], [34.01346, 8.50041], [33.89579, 8.4842], [33.87195, 8.41938], [33.71407, 8.3678], [33.66938, 8.44442], [33.54575, 8.47094], [33.3119, 8.45474], [33.19721, 8.40317], [33.1853, 8.29264], [33.18083, 8.13047], [33.08401, 8.05822], [33.0006, 7.90333], [33.04944, 7.78989], [33.24637, 7.77939], [33.32531, 7.71297], [33.44745, 7.7543], [33.71407, 7.65983], [33.87642, 7.5491], [34.02984, 7.36449], [34.03878, 7.27437], [34.01495, 7.25664], [34.19369, 7.12807], [34.19369, 7.04382], [34.35753, 6.91963], [34.47669, 6.91076], [34.53925, 6.82794], [34.53776, 6.74808], [34.65096, 6.72589], [34.77459, 6.5957], [34.87736, 6.60161], [35.01738, 6.46991], [34.96227, 6.26415], [35.00546, 5.89387], [35.12611, 5.68937], [35.13058, 5.62118], [35.31188, 5.50106], [35.29938, 5.34042], [35.50792, 5.42431], [35.8576, 5.33413], [35.81968, 5.10757], [35.82118, 4.77382], [35.9419, 4.61933], [35.95449, 4.53244], [36.03924, 4.44406], [36.84474, 4.44518], [37.07724, 4.33503], [38.14168, 3.62487], [38.45812, 3.60445], [38.52336, 3.62551], [38.91938, 3.51198], [39.07736, 3.5267], [39.19954, 3.47834], [39.49444, 3.45521], [39.51551, 3.40895], [39.55132, 3.39634], [39.58339, 3.47434], [39.76808, 3.67058], [39.86043, 3.86974], [40.77498, 4.27683], [41.1754, 3.94079], [41.89488, 3.97375], [42.07619, 4.17667], [42.55853, 4.20518], [42.84526, 4.28357], [42.97746, 4.44032], [43.04177, 4.57923], [43.40263, 4.79289], [44.02436, 4.9451], [44.98104, 4.91821], [47.97917, 8.00124], [47.92477, 8.00111], [46.99339, 7.9989], [44.19222, 8.93028], [43.32613, 9.59205], [43.23518, 9.84605], [43.0937, 9.90579], [42.87643, 10.18441], [42.69452, 10.62672], [42.95776, 10.98533], [42.79037, 10.98493], [42.75111, 11.06992], [42.62989, 11.09711], [42.42669, 10.98493], [42.13691, 10.97586], [42.06302, 10.92599], [41.80056, 10.97127], [41.8096, 11.33606], [41.77727, 11.49902], [41.82878, 11.72361], [41.95461, 11.81157], [42.4037, 12.46478]]]]
+         }
+       }, {
+         type: "Feature",
+         properties: {
+           iso1A2: "EU",
+           iso1A3: "EUE",
+           wikidata: "Q458",
+           nameEn: "European Union",
+           level: "union",
+           isoStatus: "excRes"
+         },
+         geometry: null
+       }, {
+         type: "Feature",
+         properties: {
+           iso1A2: "FI",
+           iso1A3: "FIN",
+           iso1N3: "246",
+           wikidata: "Q33",
+           nameEn: "Finland",
+           aliases: ["SF"]
+         },
+         geometry: null
+       }, {
+         type: "Feature",
+         properties: {
+           iso1A2: "FJ",
+           iso1A3: "FJI",
+           iso1N3: "242",
+           wikidata: "Q712",
+           nameEn: "Fiji",
+           groups: ["054", "009", "UN"],
+           driveSide: "left",
+           callingCodes: ["679"]
+         },
+         geometry: {
+           type: "MultiPolygon",
+           coordinates: [[[[174.245, -23.1974], [179.99999, -22.5], [179.99999, -11.5], [174, -11.5], [174.245, -23.1974]]], [[[-176.76826, -14.95183], [-180, -14.96041], [-180, -22.90585], [-176.74538, -22.89767], [-176.76826, -14.95183]]]]
+         }
+       }, {
+         type: "Feature",
+         properties: {
+           iso1A2: "FK",
+           iso1A3: "FLK",
+           iso1N3: "238",
+           wikidata: "Q9648",
+           nameEn: "Falkland Islands",
+           country: "GB",
+           groups: ["BOTS", "005", "419", "019", "UN"],
+           driveSide: "left",
+           roadSpeedUnit: "mph",
+           roadHeightUnit: "ft",
+           callingCodes: ["500"]
+         },
+         geometry: {
+           type: "MultiPolygon",
+           coordinates: [[[[-63.67376, -55.11859], [-54.56126, -51.26248], [-61.26735, -50.63919], [-63.67376, -55.11859]]]]
+         }
+       }, {
+         type: "Feature",
+         properties: {
+           iso1A2: "FM",
+           iso1A3: "FSM",
+           iso1N3: "583",
+           wikidata: "Q702",
+           nameEn: "Federated States of Micronesia",
+           groups: ["057", "009", "UN"],
+           roadSpeedUnit: "mph",
+           roadHeightUnit: "ft",
+           callingCodes: ["691"]
+         },
+         geometry: {
+           type: "MultiPolygon",
+           coordinates: [[[[138.20583, 13.3783], [136.27107, 6.73747], [156.88247, -1.39237], [165.19726, 6.22546], [138.20583, 13.3783]]]]
+         }
+       }, {
+         type: "Feature",
+         properties: {
+           iso1A2: "FO",
+           iso1A3: "FRO",
+           iso1N3: "234",
+           wikidata: "Q4628",
+           nameEn: "Faroe Islands",
+           country: "DK",
+           groups: ["154", "150", "UN"],
+           callingCodes: ["298"]
+         },
+         geometry: {
+           type: "MultiPolygon",
+           coordinates: [[[[-8.51774, 62.35338], [-6.51083, 60.95272], [-5.70102, 62.77194], [-8.51774, 62.35338]]]]
+         }
+       }, {
+         type: "Feature",
+         properties: {
+           iso1A2: "FR",
+           iso1A3: "FRA",
+           iso1N3: "250",
+           wikidata: "Q142",
+           nameEn: "France"
+         },
+         geometry: null
+       }, {
+         type: "Feature",
+         properties: {
+           iso1A2: "FX",
+           iso1A3: "FXX",
+           iso1N3: "249",
+           wikidata: "Q212429",
+           nameEn: "Metropolitan France",
+           country: "FR",
+           groups: ["EU", "155", "150", "UN"],
+           isoStatus: "excRes",
+           callingCodes: ["33"]
+         },
+         geometry: {
+           type: "MultiPolygon",
+           coordinates: [[[[2.55904, 51.07014], [2.18458, 51.52087], [1.17405, 50.74239], [-2.02963, 49.91866], [-2.09454, 49.46288], [-1.83944, 49.23037], [-2.00491, 48.86706], [-2.65349, 49.15373], [-6.28985, 48.93406], [-1.81005, 43.59738], [-1.77289, 43.38957], [-1.79319, 43.37497], [-1.78332, 43.36399], [-1.78714, 43.35476], [-1.77068, 43.34396], [-1.75334, 43.34107], [-1.75079, 43.3317], [-1.7397, 43.32979], [-1.73074, 43.29481], [-1.69407, 43.31378], [-1.62481, 43.30726], [-1.63052, 43.28591], [-1.61341, 43.25269], [-1.57674, 43.25269], [-1.55963, 43.28828], [-1.50992, 43.29481], [-1.45289, 43.27049], [-1.40942, 43.27272], [-1.3758, 43.24511], [-1.41562, 43.12815], [-1.47555, 43.08372], [-1.44067, 43.047], [-1.35272, 43.02658], [-1.34419, 43.09665], [-1.32209, 43.1127], [-1.27118, 43.11961], [-1.30052, 43.09581], [-1.30531, 43.06859], [-1.25244, 43.04164], [-1.22881, 43.05534], [-1.10333, 43.0059], [-1.00963, 42.99279], [-0.97133, 42.96239], [-0.81652, 42.95166], [-0.75478, 42.96916], [-0.72037, 42.92541], [-0.73422, 42.91228], [-0.72608, 42.89318], [-0.69837, 42.87945], [-0.67637, 42.88303], [-0.55497, 42.77846], [-0.50863, 42.82713], [-0.44334, 42.79939], [-0.41319, 42.80776], [-0.38833, 42.80132], [-0.3122, 42.84788], [-0.17939, 42.78974], [-0.16141, 42.79535], [-0.10519, 42.72761], [-0.02468, 42.68513], [0.17569, 42.73424], [0.25336, 42.7174], [0.29407, 42.67431], [0.36251, 42.72282], [0.40214, 42.69779], [0.67873, 42.69458], [0.65421, 42.75872], [0.66121, 42.84021], [0.711, 42.86372], [0.93089, 42.79154], [0.96166, 42.80629], [0.98292, 42.78754], [1.0804, 42.78569], [1.15928, 42.71407], [1.35562, 42.71944], [1.44197, 42.60217], [1.47986, 42.61346], [1.46718, 42.63296], [1.48043, 42.65203], [1.50867, 42.64483], [1.55418, 42.65669], [1.60085, 42.62703], [1.63485, 42.62957], [1.6625, 42.61982], [1.68267, 42.62533], [1.73452, 42.61515], [1.72588, 42.59098], [1.7858, 42.57698], [1.73683, 42.55492], [1.72515, 42.50338], [1.76335, 42.48863], [1.83037, 42.48395], [1.88853, 42.4501], [1.93663, 42.45439], [1.94292, 42.44316], [1.94061, 42.43333], [1.94084, 42.43039], [1.9574, 42.42401], [1.96482, 42.37787], [2.00488, 42.35399], [2.06241, 42.35906], [2.11621, 42.38393], [2.12789, 42.41291], [2.16599, 42.42314], [2.20578, 42.41633], [2.25551, 42.43757], [2.38504, 42.39977], [2.43299, 42.39423], [2.43508, 42.37568], [2.48457, 42.33933], [2.54382, 42.33406], [2.55516, 42.35351], [2.57934, 42.35808], [2.6747, 42.33974], [2.65311, 42.38771], [2.72056, 42.42298], [2.75497, 42.42578], [2.77464, 42.41046], [2.84335, 42.45724], [2.85675, 42.45444], [2.86983, 42.46843], [2.88413, 42.45938], [2.92107, 42.4573], [2.94283, 42.48174], [2.96518, 42.46692], [3.03734, 42.47363], [3.08167, 42.42748], [3.10027, 42.42621], [3.11379, 42.43646], [3.17156, 42.43545], [3.75438, 42.33445], [7.60802, 41.05927], [10.09675, 41.44089], [9.56115, 43.20816], [7.50102, 43.51859], [7.42422, 43.72209], [7.40903, 43.7296], [7.41113, 43.73156], [7.41291, 43.73168], [7.41298, 43.73311], [7.41233, 43.73439], [7.42062, 43.73977], [7.42299, 43.74176], [7.42443, 43.74087], [7.42809, 43.74396], [7.43013, 43.74895], [7.43624, 43.75014], [7.43708, 43.75197], [7.4389, 43.75151], [7.4379, 43.74963], [7.47823, 43.73341], [7.53006, 43.78405], [7.50423, 43.84345], [7.49355, 43.86551], [7.51162, 43.88301], [7.56075, 43.89932], [7.56858, 43.94506], [7.60771, 43.95772], [7.65266, 43.9763], [7.66848, 43.99943], [7.6597, 44.03009], [7.72508, 44.07578], [7.66878, 44.12795], [7.68694, 44.17487], [7.63245, 44.17877], [7.62155, 44.14881], [7.36364, 44.11882], [7.34547, 44.14359], [7.27827, 44.1462], [7.16929, 44.20352], [7.00764, 44.23736], [6.98221, 44.28289], [6.89171, 44.36637], [6.88784, 44.42043], [6.94504, 44.43112], [6.86233, 44.49834], [6.85507, 44.53072], [6.96042, 44.62129], [6.95133, 44.66264], [7.00582, 44.69364], [7.07484, 44.68073], [7.00401, 44.78782], [7.02217, 44.82519], [6.93499, 44.8664], [6.90774, 44.84322], [6.75518, 44.89915], [6.74519, 44.93661], [6.74791, 45.01939], [6.66981, 45.02324], [6.62803, 45.11175], [6.7697, 45.16044], [6.85144, 45.13226], [6.96706, 45.20841], [7.07074, 45.21228], [7.13115, 45.25386], [7.10572, 45.32924], [7.18019, 45.40071], [7.00037, 45.509], [6.98948, 45.63869], [6.80785, 45.71864], [6.80785, 45.83265], [6.95315, 45.85163], [7.04151, 45.92435], [7.00946, 45.9944], [6.93862, 46.06502], [6.87868, 46.03855], [6.89321, 46.12548], [6.78968, 46.14058], [6.86052, 46.28512], [6.77152, 46.34784], [6.8024, 46.39171], [6.82312, 46.42661], [6.53358, 46.45431], [6.25432, 46.3632], [6.21981, 46.31304], [6.24826, 46.30175], [6.25137, 46.29014], [6.23775, 46.27822], [6.24952, 46.26255], [6.26749, 46.24745], [6.29474, 46.26221], [6.31041, 46.24417], [6.29663, 46.22688], [6.27694, 46.21566], [6.26007, 46.21165], [6.24821, 46.20531], [6.23913, 46.20511], [6.23544, 46.20714], [6.22175, 46.20045], [6.22222, 46.19888], [6.21844, 46.19837], [6.21603, 46.19507], [6.21273, 46.19409], [6.21114, 46.1927], [6.20539, 46.19163], [6.19807, 46.18369], [6.19552, 46.18401], [6.18707, 46.17999], [6.18871, 46.16644], [6.18116, 46.16187], [6.15305, 46.15194], [6.13397, 46.1406], [6.09926, 46.14373], [6.09199, 46.15191], [6.07491, 46.14879], [6.05203, 46.15191], [6.04564, 46.14031], [6.03614, 46.13712], [6.01791, 46.14228], [5.9871, 46.14499], [5.97893, 46.13303], [5.95781, 46.12925], [5.9641, 46.14412], [5.97508, 46.15863], [5.98188, 46.17392], [5.98846, 46.17046], [5.99573, 46.18587], [5.96515, 46.19638], [5.97542, 46.21525], [6.02461, 46.23313], [6.03342, 46.2383], [6.04602, 46.23127], [6.05029, 46.23518], [6.0633, 46.24583], [6.07072, 46.24085], [6.08563, 46.24651], [6.10071, 46.23772], [6.12446, 46.25059], [6.11926, 46.2634], [6.1013, 46.28512], [6.11697, 46.29547], [6.1198, 46.31157], [6.13876, 46.33844], [6.15738, 46.3491], [6.16987, 46.36759], [6.15985, 46.37721], [6.15016, 46.3778], [6.09926, 46.40768], [6.06407, 46.41676], [6.08427, 46.44305], [6.07269, 46.46244], [6.1567, 46.54402], [6.11084, 46.57649], [6.27135, 46.68251], [6.38351, 46.73171], [6.45209, 46.77502], [6.43216, 46.80336], [6.46456, 46.88865], [6.43341, 46.92703], [6.71531, 47.0494], [6.68823, 47.06616], [6.76788, 47.1208], [6.8489, 47.15933], [6.9508, 47.24338], [6.95108, 47.26428], [6.94316, 47.28747], [7.05305, 47.33304], [7.0564, 47.35134], [7.03125, 47.36996], [6.87959, 47.35335], [6.88542, 47.37262], [6.93744, 47.40714], [6.93953, 47.43388], [7.0024, 47.45264], [6.98425, 47.49432], [7.0231, 47.50522], [7.07425, 47.48863], [7.12781, 47.50371], [7.16249, 47.49025], [7.19583, 47.49455], [7.17026, 47.44312], [7.24669, 47.4205], [7.33526, 47.44186], [7.35603, 47.43432], [7.40308, 47.43638], [7.43088, 47.45846], [7.4462, 47.46264], [7.4583, 47.47216], [7.42923, 47.48628], [7.43356, 47.49712], [7.47534, 47.47932], [7.51076, 47.49651], [7.49804, 47.51798], [7.5229, 47.51644], [7.53199, 47.5284], [7.51904, 47.53515], [7.50588, 47.52856], [7.49691, 47.53821], [7.50873, 47.54546], [7.51723, 47.54578], [7.52831, 47.55347], [7.53634, 47.55553], [7.55652, 47.56779], [7.55689, 47.57232], [7.56548, 47.57617], [7.56684, 47.57785], [7.58386, 47.57536], [7.58945, 47.59017], [7.59301, 47.60058], [7.58851, 47.60794], [7.57423, 47.61628], [7.5591, 47.63849], [7.53384, 47.65115], [7.52067, 47.66437], [7.51915, 47.68335], [7.51266, 47.70197], [7.53722, 47.71635], [7.54761, 47.72912], [7.52921, 47.77747], [7.55673, 47.87371], [7.62302, 47.97898], [7.56966, 48.03265], [7.57137, 48.12292], [7.6648, 48.22219], [7.69022, 48.30018], [7.74562, 48.32736], [7.73109, 48.39192], [7.76833, 48.48945], [7.80647, 48.51239], [7.80167, 48.54758], [7.80057, 48.5857], [7.84098, 48.64217], [7.89002, 48.66317], [7.96812, 48.72491], [7.96994, 48.75606], [8.01534, 48.76085], [8.0326, 48.79017], [8.06802, 48.78957], [8.10253, 48.81829], [8.12813, 48.87985], [8.19989, 48.95825], [8.20031, 48.95856], [8.22604, 48.97352], [8.14189, 48.97833], [7.97783, 49.03161], [7.93641, 49.05544], [7.86386, 49.03499], [7.79557, 49.06583], [7.75948, 49.04562], [7.63618, 49.05428], [7.62575, 49.07654], [7.56416, 49.08136], [7.53012, 49.09818], [7.49172, 49.13915], [7.49473, 49.17], [7.44455, 49.16765], [7.44052, 49.18354], [7.3662, 49.17308], [7.35995, 49.14399], [7.3195, 49.14231], [7.29514, 49.11426], [7.23473, 49.12971], [7.1593, 49.1204], [7.1358, 49.1282], [7.12504, 49.14253], [7.10384, 49.13787], [7.10715, 49.15631], [7.07859, 49.15031], [7.09007, 49.13094], [7.07162, 49.1255], [7.06642, 49.11415], [7.05548, 49.11185], [7.04843, 49.11422], [7.04409, 49.12123], [7.04662, 49.13724], [7.03178, 49.15734], [7.0274, 49.17042], [7.03459, 49.19096], [7.01318, 49.19018], [6.97273, 49.2099], [6.95963, 49.203], [6.94028, 49.21641], [6.93831, 49.2223], [6.91875, 49.22261], [6.89298, 49.20863], [6.85939, 49.22376], [6.83555, 49.21249], [6.85119, 49.20038], [6.85016, 49.19354], [6.86225, 49.18185], [6.84703, 49.15734], [6.83385, 49.15162], [6.78265, 49.16793], [6.73765, 49.16375], [6.71137, 49.18808], [6.73256, 49.20486], [6.71843, 49.2208], [6.69274, 49.21661], [6.66583, 49.28065], [6.60186, 49.31055], [6.572, 49.35027], [6.58807, 49.35358], [6.60091, 49.36864], [6.533, 49.40748], [6.55404, 49.42464], [6.42432, 49.47683], [6.40274, 49.46546], [6.39168, 49.4667], [6.38352, 49.46463], [6.36778, 49.46937], [6.3687, 49.4593], [6.28818, 49.48465], [6.27875, 49.503], [6.25029, 49.50609], [6.2409, 49.51408], [6.19543, 49.50536], [6.17386, 49.50934], [6.15366, 49.50226], [6.16115, 49.49297], [6.14321, 49.48796], [6.12814, 49.49365], [6.12346, 49.4735], [6.10325, 49.4707], [6.09845, 49.46351], [6.10072, 49.45268], [6.08373, 49.45594], [6.07887, 49.46399], [6.05553, 49.46663], [6.04176, 49.44801], [6.02743, 49.44845], [6.02648, 49.45451], [5.97693, 49.45513], [5.96876, 49.49053], [5.94224, 49.49608], [5.94128, 49.50034], [5.86571, 49.50015], [5.83389, 49.52152], [5.83467, 49.52717], [5.84466, 49.53027], [5.83648, 49.5425], [5.81664, 49.53775], [5.80871, 49.5425], [5.81838, 49.54777], [5.79195, 49.55228], [5.77435, 49.56298], [5.7577, 49.55915], [5.75649, 49.54321], [5.64505, 49.55146], [5.60909, 49.51228], [5.55001, 49.52729], [5.46541, 49.49825], [5.46734, 49.52648], [5.43713, 49.5707], [5.3974, 49.61596], [5.34837, 49.62889], [5.33851, 49.61599], [5.3137, 49.61225], [5.30214, 49.63055], [5.33039, 49.6555], [5.31465, 49.66846], [5.26232, 49.69456], [5.14545, 49.70287], [5.09249, 49.76193], [4.96714, 49.79872], [4.85464, 49.78995], [4.86965, 49.82271], [4.85134, 49.86457], [4.88529, 49.9236], [4.78827, 49.95609], [4.8382, 50.06738], [4.88602, 50.15182], [4.83279, 50.15331], [4.82438, 50.16878], [4.75237, 50.11314], [4.70064, 50.09384], [4.68695, 49.99685], [4.5414, 49.96911], [4.51098, 49.94659], [4.43488, 49.94122], [4.35051, 49.95315], [4.31963, 49.97043], [4.20532, 49.95803], [4.14239, 49.98034], [4.13508, 50.01976], [4.16294, 50.04719], [4.23101, 50.06945], [4.20147, 50.13535], [4.13561, 50.13078], [4.16014, 50.19239], [4.15524, 50.21103], [4.21945, 50.25539], [4.20651, 50.27333], [4.17861, 50.27443], [4.17347, 50.28838], [4.15524, 50.2833], [4.16808, 50.25786], [4.13665, 50.25609], [4.11954, 50.30425], [4.10957, 50.30234], [4.10237, 50.31247], [4.0689, 50.3254], [4.0268, 50.35793], [3.96771, 50.34989], [3.90781, 50.32814], [3.84314, 50.35219], [3.73911, 50.34809], [3.70987, 50.3191], [3.71009, 50.30305], [3.66976, 50.34563], [3.65709, 50.36873], [3.67262, 50.38663], [3.67494, 50.40239], [3.66153, 50.45165], [3.64426, 50.46275], [3.61014, 50.49568], [3.58361, 50.49049], [3.5683, 50.50192], [3.49509, 50.48885], [3.51564, 50.5256], [3.47385, 50.53397], [3.44629, 50.51009], [3.37693, 50.49538], [3.28575, 50.52724], [3.2729, 50.60718], [3.23951, 50.6585], [3.264, 50.67668], [3.2536, 50.68977], [3.26141, 50.69151], [3.26063, 50.70086], [3.24593, 50.71389], [3.22042, 50.71019], [3.20845, 50.71662], [3.19017, 50.72569], [3.20064, 50.73547], [3.18811, 50.74025], [3.18339, 50.74981], [3.16476, 50.76843], [3.15017, 50.79031], [3.1257, 50.78603], [3.11987, 50.79188], [3.11206, 50.79416], [3.10614, 50.78303], [3.09163, 50.77717], [3.04314, 50.77674], [3.00537, 50.76588], [2.96778, 50.75242], [2.95019, 50.75138], [2.90873, 50.702], [2.91036, 50.6939], [2.90069, 50.69263], [2.88504, 50.70656], [2.87937, 50.70298], [2.86985, 50.7033], [2.8483, 50.72276], [2.81056, 50.71773], [2.71165, 50.81295], [2.63331, 50.81457], [2.59093, 50.91751], [2.63074, 50.94746], [2.57551, 51.00326], [2.55904, 51.07014]], [[1.99838, 42.44682], [1.98378, 42.44697], [1.96125, 42.45364], [1.95606, 42.45785], [1.96215, 42.47854], [1.97003, 42.48081], [1.97227, 42.48487], [1.97697, 42.48568], [1.98022, 42.49569], [1.98916, 42.49351], [1.99766, 42.4858], [1.98579, 42.47486], [1.99216, 42.46208], [2.01564, 42.45171], [1.99838, 42.44682]]]]
+         }
+       }, {
+         type: "Feature",
+         properties: {
+           iso1A2: "GA",
+           iso1A3: "GAB",
+           iso1N3: "266",
+           wikidata: "Q1000",
+           nameEn: "Gabon",
+           groups: ["017", "202", "002", "UN"],
+           callingCodes: ["241"]
+         },
+         geometry: {
+           type: "MultiPolygon",
+           coordinates: [[[[13.29457, 2.16106], [13.28534, 2.25716], [11.37116, 2.29975], [11.3561, 2.17217], [11.35307, 1.00251], [9.79648, 1.0019], [9.75065, 1.06753], [9.66433, 1.06723], [7.24416, -0.64092], [10.75913, -4.39519], [11.12647, -3.94169], [11.22301, -3.69888], [11.48764, -3.51089], [11.57949, -3.52798], [11.68608, -3.68942], [11.87083, -3.71571], [11.92719, -3.62768], [11.8318, -3.5812], [11.96554, -3.30267], [11.70227, -3.17465], [11.70558, -3.0773], [11.80365, -3.00424], [11.64798, -2.81146], [11.5359, -2.85654], [11.64487, -2.61865], [11.57637, -2.33379], [11.74605, -2.39936], [11.96866, -2.33559], [12.04895, -2.41704], [12.47925, -2.32626], [12.44656, -1.92025], [12.61312, -1.8129], [12.82172, -1.91091], [13.02759, -2.33098], [13.47977, -2.43224], [13.75884, -2.09293], [13.92073, -2.35581], [13.85846, -2.46935], [14.10442, -2.49268], [14.23829, -2.33715], [14.16202, -2.23916], [14.23518, -2.15671], [14.25932, -1.97624], [14.41838, -1.89412], [14.52569, -0.57818], [14.41887, -0.44799], [14.2165, -0.38261], [14.06862, -0.20826], [13.90632, -0.2287], [13.88648, 0.26652], [14.10909, 0.58563], [14.26066, 0.57255], [14.48179, 0.9152], [14.25186, 1.39842], [13.89582, 1.4261], [13.15519, 1.23368], [13.25447, 1.32339], [13.13461, 1.57238], [13.29457, 2.16106]]]]
+         }
+       }, {
+         type: "Feature",
+         properties: {
+           iso1A2: "GB",
+           iso1A3: "GBR",
+           iso1N3: "826",
+           wikidata: "Q145",
+           ccTLD: ".uk",
+           nameEn: "United Kingdom",
+           aliases: ["UK"]
+         },
+         geometry: null
+       }, {
+         type: "Feature",
+         properties: {
+           iso1A2: "GD",
+           iso1A3: "GRD",
+           iso1N3: "308",
+           wikidata: "Q769",
+           nameEn: "Grenada",
+           aliases: ["WG"],
+           groups: ["029", "003", "419", "019", "UN"],
+           driveSide: "left",
+           roadSpeedUnit: "mph",
+           callingCodes: ["1 473"]
+         },
+         geometry: {
+           type: "MultiPolygon",
+           coordinates: [[[[-62.64026, 12.69984], [-61.77886, 11.36496], [-59.94058, 12.34011], [-62.64026, 12.69984]]]]
+         }
+       }, {
+         type: "Feature",
+         properties: {
+           iso1A2: "GE",
+           iso1A3: "GEO",
+           iso1N3: "268",
+           wikidata: "Q230",
+           nameEn: "Georgia",
+           groups: ["145", "142", "UN"],
+           callingCodes: ["995"]
+         },
+         geometry: {
+           type: "MultiPolygon",
+           coordinates: [[[[46.42738, 41.91323], [45.61676, 42.20768], [45.78692, 42.48358], [45.36501, 42.55268], [45.15318, 42.70598], [44.88754, 42.74934], [44.80941, 42.61277], [44.70002, 42.74679], [44.54202, 42.75699], [43.95517, 42.55396], [43.73119, 42.62043], [43.81453, 42.74297], [43.0419, 43.02413], [43.03322, 43.08883], [42.75889, 43.19651], [42.66667, 43.13917], [42.40563, 43.23226], [41.64935, 43.22331], [40.65957, 43.56212], [40.10657, 43.57344], [40.04445, 43.47776], [40.03312, 43.44262], [40.01007, 43.42411], [40.01552, 43.42025], [40.00853, 43.40578], [40.0078, 43.38551], [39.81147, 43.06294], [40.89217, 41.72528], [41.54366, 41.52185], [41.7148, 41.4932], [41.7124, 41.47417], [41.81939, 41.43621], [41.95134, 41.52466], [42.26387, 41.49346], [42.51772, 41.43606], [42.59202, 41.58183], [42.72794, 41.59714], [42.84471, 41.58912], [42.78995, 41.50126], [42.84899, 41.47265], [42.8785, 41.50516], [43.02956, 41.37891], [43.21707, 41.30331], [43.13373, 41.25503], [43.1945, 41.25242], [43.23096, 41.17536], [43.36118, 41.2028], [43.44973, 41.17666], [43.4717, 41.12611], [43.67712, 41.13398], [43.74717, 41.1117], [43.84835, 41.16329], [44.16591, 41.19141], [44.18148, 41.24644], [44.32139, 41.2079], [44.34337, 41.20312], [44.34417, 41.2382], [44.46791, 41.18204], [44.59322, 41.1933], [44.61462, 41.24018], [44.72814, 41.20338], [44.82084, 41.21513], [44.87887, 41.20195], [44.89911, 41.21366], [44.84358, 41.23088], [44.81749, 41.23488], [44.80053, 41.25949], [44.81437, 41.30371], [44.93493, 41.25685], [45.0133, 41.29747], [45.09867, 41.34065], [45.1797, 41.42231], [45.26285, 41.46433], [45.31352, 41.47168], [45.4006, 41.42402], [45.45973, 41.45898], [45.68389, 41.3539], [45.71035, 41.36208], [45.75705, 41.35157], [45.69946, 41.29545], [45.80842, 41.2229], [45.95786, 41.17956], [46.13221, 41.19479], [46.27698, 41.19011], [46.37661, 41.10805], [46.456, 41.09984], [46.48558, 41.0576], [46.55096, 41.1104], [46.63969, 41.09515], [46.66148, 41.20533], [46.72375, 41.28609], [46.63658, 41.37727], [46.4669, 41.43331], [46.40307, 41.48464], [46.33925, 41.4963], [46.29794, 41.5724], [46.34126, 41.57454], [46.34039, 41.5947], [46.3253, 41.60912], [46.28182, 41.60089], [46.26531, 41.63339], [46.24429, 41.59883], [46.19759, 41.62327], [46.17891, 41.72094], [46.20538, 41.77205], [46.23962, 41.75811], [46.30863, 41.79133], [46.3984, 41.84399], [46.42738, 41.91323]]]]
+         }
+       }, {
+         type: "Feature",
+         properties: {
+           iso1A2: "GF",
+           iso1A3: "GUF",
+           iso1N3: "254",
+           wikidata: "Q3769",
+           nameEn: "French Guiana",
+           country: "FR",
+           groups: ["Q3320166", "EU", "005", "419", "019", "UN"],
+           callingCodes: ["594"]
+         },
+         geometry: {
+           type: "MultiPolygon",
+           coordinates: [[[[-51.35485, 4.8383], [-53.7094, 6.2264], [-54.01074, 5.68785], [-54.01877, 5.52789], [-54.26916, 5.26909], [-54.4717, 4.91964], [-54.38444, 4.13222], [-54.19367, 3.84387], [-54.05128, 3.63557], [-53.98914, 3.627], [-53.9849, 3.58697], [-54.28534, 2.67798], [-54.42864, 2.42442], [-54.6084, 2.32856], [-54.16286, 2.10779], [-53.78743, 2.34412], [-52.96539, 2.1881], [-52.6906, 2.37298], [-52.31787, 3.17896], [-51.85573, 3.83427], [-51.82312, 3.85825], [-51.79599, 3.89336], [-51.61983, 4.14596], [-51.63798, 4.51394], [-51.35485, 4.8383]]]]
+         }
+       }, {
+         type: "Feature",
+         properties: {
+           iso1A2: "GG",
+           iso1A3: "GGY",
+           iso1N3: "831",
+           wikidata: "Q25230",
+           nameEn: "Bailiwick of Guernsey",
+           country: "GB"
+         },
+         geometry: null
+       }, {
+         type: "Feature",
+         properties: {
+           iso1A2: "GH",
+           iso1A3: "GHA",
+           iso1N3: "288",
+           wikidata: "Q117",
+           nameEn: "Ghana",
+           groups: ["011", "202", "002", "UN"],
+           callingCodes: ["233"]
+         },
+         geometry: {
+           type: "MultiPolygon",
+           coordinates: [[[[-0.13493, 11.14075], [-0.27374, 11.17157], [-0.28566, 11.12713], [-0.35955, 11.07801], [-0.38219, 11.12596], [-0.42391, 11.11661], [-0.44298, 11.04292], [-0.61937, 10.91305], [-0.67143, 10.99811], [-2.83373, 11.0067], [-2.94232, 10.64281], [-2.83108, 10.40252], [-2.74174, 9.83172], [-2.76534, 9.56589], [-2.68802, 9.49343], [-2.69814, 9.22717], [-2.77799, 9.04949], [-2.66357, 9.01771], [-2.58243, 8.7789], [-2.49037, 8.20872], [-2.62901, 8.11495], [-2.61232, 8.02645], [-2.67787, 8.02055], [-2.74819, 7.92613], [-2.78395, 7.94974], [-2.79467, 7.86002], [-2.92339, 7.60847], [-2.97822, 7.27165], [-2.95438, 7.23737], [-3.23327, 6.81744], [-3.21954, 6.74407], [-3.25999, 6.62521], [-3.01896, 5.71697], [-2.95323, 5.71865], [-2.96671, 5.6415], [-2.93132, 5.62137], [-2.85378, 5.65156], [-2.76614, 5.60963], [-2.72737, 5.34789], [-2.77625, 5.34621], [-2.73074, 5.1364], [-2.75502, 5.10657], [-2.95261, 5.12477], [-2.96554, 5.10397], [-3.063, 5.13665], [-3.11073, 5.12675], [-3.10675, 5.08515], [-3.34019, 4.17519], [1.07031, 5.15655], [1.27574, 5.93551], [1.19771, 6.11522], [1.19966, 6.17069], [1.09187, 6.17074], [1.05969, 6.22998], [1.03108, 6.24064], [0.99652, 6.33779], [0.89283, 6.33779], [0.71048, 6.53083], [0.74862, 6.56517], [0.63659, 6.63857], [0.6497, 6.73682], [0.58176, 6.76049], [0.57406, 6.80348], [0.52853, 6.82921], [0.56508, 6.92971], [0.52098, 6.94391], [0.52217, 6.9723], [0.59606, 7.01252], [0.65327, 7.31643], [0.62943, 7.41099], [0.57223, 7.39326], [0.52455, 7.45354], [0.51979, 7.58706], [0.58295, 7.62368], [0.62943, 7.85751], [0.58891, 8.12779], [0.6056, 8.13959], [0.61156, 8.18324], [0.5913, 8.19622], [0.63897, 8.25873], [0.73432, 8.29529], [0.64731, 8.48866], [0.47211, 8.59945], [0.37319, 8.75262], [0.52455, 8.87746], [0.45424, 9.04581], [0.56388, 9.40697], [0.49118, 9.48339], [0.36485, 9.49749], [0.33148, 9.44812], [0.25758, 9.42696], [0.2254, 9.47869], [0.31241, 9.50337], [0.30406, 9.521], [0.2409, 9.52335], [0.23851, 9.57389], [0.38153, 9.58682], [0.36008, 9.6256], [0.29334, 9.59387], [0.26712, 9.66437], [0.28261, 9.69022], [0.32313, 9.6491], [0.34816, 9.66907], [0.34816, 9.71607], [0.32075, 9.72781], [0.36366, 10.03309], [0.41252, 10.02018], [0.41371, 10.06361], [0.35293, 10.09412], [0.39584, 10.31112], [0.33028, 10.30408], [0.29453, 10.41546], [0.18846, 10.4096], [0.12886, 10.53149], [-0.05945, 10.63458], [-0.09141, 10.7147], [-0.07327, 10.71845], [-0.07183, 10.76794], [-0.0228, 10.81916], [-0.02685, 10.8783], [-908e-5, 10.91644], [-63e-4, 10.96417], [0.03355, 10.9807], [0.02395, 11.06229], [342e-5, 11.08317], [-514e-5, 11.10763], [-0.0275, 11.11202], [-0.05733, 11.08628], [-0.14462, 11.10811], [-0.13493, 11.14075]]]]
+         }
+       }, {
+         type: "Feature",
+         properties: {
+           iso1A2: "GI",
+           iso1A3: "GIB",
+           iso1N3: "292",
+           wikidata: "Q1410",
+           nameEn: "Gibraltar",
+           country: "GB",
+           groups: ["Q12837", "BOTS", "039", "150", "UN"],
+           callingCodes: ["350"]
+         },
+         geometry: {
+           type: "MultiPolygon",
+           coordinates: [[[[-5.34064, 36.03744], [-5.27801, 36.14942], [-5.33822, 36.15272], [-5.34536, 36.15501], [-5.40526, 36.15488], [-5.34064, 36.03744]]]]
+         }
+       }, {
+         type: "Feature",
+         properties: {
+           iso1A2: "GL",
+           iso1A3: "GRL",
+           iso1N3: "304",
+           wikidata: "Q223",
+           nameEn: "Greenland",
+           country: "DK",
+           groups: ["Q1451600", "021", "003", "019", "UN"],
+           callingCodes: ["299"]
+         },
+         geometry: {
+           type: "MultiPolygon",
+           coordinates: [[[[-49.33696, 84.57952], [-68.21821, 80.48551], [-77.52957, 77.23408], [-46.37635, 57.3249], [-9.68082, 72.73731], [-5.7106, 84.28058], [-49.33696, 84.57952]]]]
+         }
+       }, {
+         type: "Feature",
+         properties: {
+           iso1A2: "GM",
+           iso1A3: "GMB",
+           iso1N3: "270",
+           wikidata: "Q1005",
+           nameEn: "The Gambia",
+           groups: ["011", "202", "002", "UN"],
+           callingCodes: ["220"]
+         },
+         geometry: {
+           type: "MultiPolygon",
+           coordinates: [[[[-15.14917, 13.57989], [-14.36795, 13.23033], [-13.79409, 13.34472], [-13.8955, 13.59126], [-14.34721, 13.46578], [-14.93719, 13.80173], [-15.36504, 13.79313], [-15.47902, 13.58758], [-17.43598, 13.59273], [-17.43966, 13.04579], [-16.74676, 13.06025], [-16.69343, 13.16791], [-15.80355, 13.16729], [-15.80478, 13.34832], [-15.26908, 13.37768], [-15.14917, 13.57989]]]]
+         }
+       }, {
+         type: "Feature",
+         properties: {
+           iso1A2: "GN",
+           iso1A3: "GIN",
+           iso1N3: "324",
+           wikidata: "Q1006",
+           nameEn: "Guinea",
+           groups: ["011", "202", "002", "UN"],
+           callingCodes: ["224"]
+         },
+         geometry: {
+           type: "MultiPolygon",
+           coordinates: [[[[-11.37536, 12.40788], [-11.46267, 12.44559], [-11.91331, 12.42008], [-12.35415, 12.32758], [-12.87336, 12.51892], [-13.06603, 12.49342], [-13.05296, 12.64003], [-13.70523, 12.68013], [-13.7039, 12.60313], [-13.65089, 12.49515], [-13.64168, 12.42764], [-13.70851, 12.24978], [-13.92745, 12.24077], [-13.94589, 12.16869], [-13.7039, 12.00869], [-13.7039, 11.70195], [-14.09799, 11.63649], [-14.26623, 11.67486], [-14.31513, 11.60713], [-14.51173, 11.49708], [-14.66677, 11.51188], [-14.77786, 11.36323], [-14.95993, 10.99244], [-15.07174, 10.89557], [-15.96748, 10.162], [-14.36218, 8.64107], [-13.29911, 9.04245], [-13.18586, 9.0925], [-13.08953, 9.0409], [-12.94095, 9.26335], [-12.76788, 9.3133], [-12.47254, 9.86834], [-12.24262, 9.92386], [-12.12634, 9.87203], [-11.91023, 9.93927], [-11.89624, 9.99763], [-11.2118, 10.00098], [-10.6534, 9.29919], [-10.74484, 9.07998], [-10.5783, 9.06386], [-10.56197, 8.81225], [-10.47707, 8.67669], [-10.61422, 8.5314], [-10.70565, 8.29235], [-10.63934, 8.35326], [-10.54891, 8.31174], [-10.37257, 8.48941], [-10.27575, 8.48711], [-10.203, 8.47991], [-10.14579, 8.52665], [-10.05375, 8.50697], [-10.05873, 8.42578], [-9.77763, 8.54633], [-9.47415, 8.35195], [-9.50898, 8.18455], [-9.41445, 8.02448], [-9.44928, 7.9284], [-9.35724, 7.74111], [-9.37465, 7.62032], [-9.48161, 7.37122], [-9.41943, 7.41809], [-9.305, 7.42056], [-9.20798, 7.38109], [-9.18311, 7.30461], [-9.09107, 7.1985], [-8.93435, 7.2824], [-8.85724, 7.26019], [-8.8448, 7.35149], [-8.72789, 7.51429], [-8.67814, 7.69428], [-8.55874, 7.70167], [-8.55874, 7.62525], [-8.47114, 7.55676], [-8.4003, 7.6285], [-8.21374, 7.54466], [-8.09931, 7.78626], [-8.13414, 7.87991], [-8.06449, 8.04989], [-7.94695, 8.00925], [-7.99919, 8.11023], [-7.98675, 8.20134], [-8.062, 8.16071], [-8.2411, 8.24196], [-8.22991, 8.48438], [-7.92518, 8.50652], [-7.65653, 8.36873], [-7.69882, 8.66148], [-7.95503, 8.81146], [-7.92518, 8.99332], [-7.73862, 9.08422], [-7.90777, 9.20456], [-7.85056, 9.41812], [-8.03463, 9.39604], [-8.14657, 9.55062], [-8.09434, 9.86936], [-8.15652, 9.94288], [-8.11921, 10.04577], [-8.01225, 10.1021], [-7.97971, 10.17117], [-7.9578, 10.2703], [-8.10207, 10.44649], [-8.22711, 10.41722], [-8.32614, 10.69273], [-8.2667, 10.91762], [-8.35083, 11.06234], [-8.66923, 10.99397], [-8.40058, 11.37466], [-8.80854, 11.66715], [-8.94784, 12.34842], [-9.13689, 12.50875], [-9.38067, 12.48446], [-9.32097, 12.29009], [-9.63938, 12.18312], [-9.714, 12.0226], [-10.30604, 12.24634], [-10.71897, 11.91552], [-10.80355, 12.1053], [-10.99758, 12.24634], [-11.24136, 12.01286], [-11.50006, 12.17826], [-11.37536, 12.40788]]]]
+         }
+       }, {
+         type: "Feature",
+         properties: {
+           iso1A2: "GP",
+           iso1A3: "GLP",
+           iso1N3: "312",
+           wikidata: "Q17012",
+           nameEn: "Guadeloupe",
+           country: "FR",
+           groups: ["Q3320166", "EU", "029", "003", "419", "019", "UN"],
+           callingCodes: ["590"]
+         },
+         geometry: {
+           type: "MultiPolygon",
+           coordinates: [[[[-60.03183, 16.1129], [-61.60296, 16.73066], [-63.00549, 15.26166], [-60.03183, 16.1129]]]]
+         }
+       }, {
+         type: "Feature",
+         properties: {
+           iso1A2: "GQ",
+           iso1A3: "GNQ",
+           iso1N3: "226",
+           wikidata: "Q983",
+           nameEn: "Equatorial Guinea",
+           groups: ["017", "202", "002", "UN"],
+           callingCodes: ["240"]
+         },
+         geometry: {
+           type: "MultiPolygon",
+           coordinates: [[[[9.22018, 3.72052], [8.34397, 4.30689], [7.71762, 0.6674], [3.35016, -3.29031], [9.66433, 1.06723], [9.75065, 1.06753], [9.79648, 1.0019], [11.35307, 1.00251], [11.3561, 2.17217], [9.991, 2.16561], [9.90749, 2.20049], [9.89012, 2.20457], [9.84716, 2.24676], [9.83238, 2.29079], [9.83754, 2.32428], [9.82123, 2.35097], [9.81162, 2.33797], [9.22018, 3.72052]]]]
+         }
+       }, {
+         type: "Feature",
+         properties: {
+           iso1A2: "GR",
+           iso1A3: "GRC",
+           iso1N3: "300",
+           wikidata: "Q41",
+           nameEn: "Greece",
+           aliases: ["EL"],
+           groups: ["EU", "039", "150", "UN"],
+           callingCodes: ["30"]
+         },
+         geometry: {
+           type: "MultiPolygon",
+           coordinates: [[[[26.03489, 40.73051], [26.0754, 40.72772], [26.08638, 40.73214], [26.12495, 40.74283], [26.12854, 40.77339], [26.15685, 40.80709], [26.21351, 40.83298], [26.20856, 40.86048], [26.26169, 40.9168], [26.29441, 40.89119], [26.28623, 40.93005], [26.32259, 40.94042], [26.35894, 40.94292], [26.33297, 40.98388], [26.3606, 41.02027], [26.31928, 41.07386], [26.32259, 41.24929], [26.39861, 41.25053], [26.5209, 41.33993], [26.5837, 41.32131], [26.62997, 41.34613], [26.61767, 41.42281], [26.59742, 41.48058], [26.59196, 41.60491], [26.5209, 41.62592], [26.47958, 41.67037], [26.35957, 41.71149], [26.30255, 41.70925], [26.2654, 41.71544], [26.22888, 41.74139], [26.21325, 41.73223], [26.16841, 41.74858], [26.06148, 41.70345], [26.07083, 41.64584], [26.15146, 41.60828], [26.14328, 41.55496], [26.17951, 41.55409], [26.176, 41.50072], [26.14796, 41.47533], [26.20288, 41.43943], [26.16548, 41.42278], [26.12926, 41.35878], [25.87919, 41.30526], [25.8266, 41.34563], [25.70507, 41.29209], [25.66183, 41.31316], [25.61042, 41.30614], [25.55082, 41.31667], [25.52394, 41.2798], [25.48187, 41.28506], [25.28322, 41.23411], [25.11611, 41.34212], [24.942, 41.38685], [24.90928, 41.40876], [24.86136, 41.39298], [24.82514, 41.4035], [24.8041, 41.34913], [24.71529, 41.41928], [24.61129, 41.42278], [24.52599, 41.56808], [24.30513, 41.51297], [24.27124, 41.57682], [24.18126, 41.51735], [24.10063, 41.54796], [24.06323, 41.53222], [24.06908, 41.46132], [23.96975, 41.44118], [23.91483, 41.47971], [23.89613, 41.45257], [23.80148, 41.43943], [23.76525, 41.40175], [23.67644, 41.41139], [23.63203, 41.37632], [23.52453, 41.40262], [23.40416, 41.39999], [23.33639, 41.36317], [23.31301, 41.40525], [23.22771, 41.37106], [23.21953, 41.33773], [23.1833, 41.31755], [22.93334, 41.34104], [22.81199, 41.3398], [22.76408, 41.32225], [22.74538, 41.16321], [22.71266, 41.13945], [22.65306, 41.18168], [22.62852, 41.14385], [22.58295, 41.11568], [22.5549, 41.13065], [22.42285, 41.11921], [22.26744, 41.16409], [22.17629, 41.15969], [22.1424, 41.12449], [22.06527, 41.15617], [21.90869, 41.09191], [21.91102, 41.04786], [21.7556, 40.92525], [21.69601, 40.9429], [21.57448, 40.86076], [21.53007, 40.90759], [21.41555, 40.9173], [21.35595, 40.87578], [21.25779, 40.86165], [21.21105, 40.8855], [21.15262, 40.85546], [20.97887, 40.85475], [20.98396, 40.79109], [20.95752, 40.76982], [20.98134, 40.76046], [21.05833, 40.66586], [21.03932, 40.56299], [20.96908, 40.51526], [20.94925, 40.46625], [20.83688, 40.47882], [20.7906, 40.42726], [20.78234, 40.35803], [20.71789, 40.27739], [20.67162, 40.09433], [20.62566, 40.0897], [20.61081, 40.07866], [20.55593, 40.06524], [20.51297, 40.08168], [20.48487, 40.06271], [20.42373, 40.06777], [20.37911, 39.99058], [20.31135, 39.99438], [20.41546, 39.82832], [20.41475, 39.81437], [20.38572, 39.78516], [20.30804, 39.81563], [20.29152, 39.80421], [20.31961, 39.72799], [20.27412, 39.69884], [20.22707, 39.67459], [20.22376, 39.64532], [20.15988, 39.652], [20.12956, 39.65805], [20.05189, 39.69112], [20.00957, 39.69227], [19.98042, 39.6504], [19.92466, 39.69533], [19.97622, 39.78684], [19.95905, 39.82857], [19.0384, 40.35325], [19.20409, 39.7532], [22.5213, 33.45682], [29.73302, 35.92555], [29.69611, 36.10365], [29.61805, 36.14179], [29.61002, 36.1731], [29.48192, 36.18377], [29.30783, 36.01033], [28.23708, 36.56812], [27.95037, 36.46155], [27.89482, 36.69898], [27.46117, 36.53789], [27.24613, 36.71622], [27.45627, 36.9008], [27.20312, 36.94571], [27.14757, 37.32], [26.95583, 37.64989], [26.99377, 37.69034], [27.16428, 37.72343], [27.05537, 37.9131], [26.21136, 38.17558], [26.24183, 38.44695], [26.32173, 38.48731], [26.21136, 38.65436], [26.61814, 38.81372], [26.70773, 39.0312], [26.43357, 39.43096], [25.94257, 39.39358], [25.61285, 40.17161], [26.04292, 40.3958], [25.94795, 40.72797], [26.03489, 40.73051]]]]
+         }
+       }, {
+         type: "Feature",
+         properties: {
+           iso1A2: "GS",
+           iso1A3: "SGS",
+           iso1N3: "239",
+           wikidata: "Q35086",
+           nameEn: "South Georgia and South Sandwich Islands",
+           country: "GB",
+           groups: ["BOTS", "005", "419", "019", "UN"],
+           driveSide: "left",
+           roadSpeedUnit: "mph",
+           roadHeightUnit: "ft",
+           callingCodes: ["500"]
+         },
+         geometry: {
+           type: "MultiPolygon",
+           coordinates: [[[[-35.26394, -43.68272], [-53.39656, -59.87088], [-22.31757, -59.85974], [-35.26394, -43.68272]]]]
+         }
+       }, {
+         type: "Feature",
+         properties: {
+           iso1A2: "GT",
+           iso1A3: "GTM",
+           iso1N3: "320",
+           wikidata: "Q774",
+           nameEn: "Guatemala",
+           groups: ["013", "003", "419", "019", "UN"],
+           callingCodes: ["502"]
+         },
+         geometry: {
+           type: "MultiPolygon",
+           coordinates: [[[[-89.14985, 17.81563], [-90.98678, 17.81655], [-90.99199, 17.25192], [-91.43809, 17.25373], [-91.04436, 16.92175], [-90.69064, 16.70697], [-90.61212, 16.49832], [-90.40499, 16.40524], [-90.44567, 16.07573], [-91.73182, 16.07371], [-92.20983, 15.26077], [-92.0621, 15.07406], [-92.1454, 14.98143], [-92.1423, 14.88647], [-92.18161, 14.84147], [-92.1454, 14.6804], [-92.2261, 14.53423], [-92.37213, 14.39277], [-90.55276, 12.8866], [-90.11344, 13.73679], [-90.10505, 13.85104], [-89.88937, 14.0396], [-89.81807, 14.07073], [-89.76103, 14.02923], [-89.73251, 14.04133], [-89.75569, 14.07073], [-89.70756, 14.1537], [-89.61844, 14.21937], [-89.52397, 14.22628], [-89.50614, 14.26084], [-89.58814, 14.33165], [-89.57441, 14.41637], [-89.39028, 14.44561], [-89.34776, 14.43013], [-89.35189, 14.47553], [-89.23719, 14.58046], [-89.15653, 14.57802], [-89.13132, 14.71582], [-89.23467, 14.85596], [-89.15149, 14.97775], [-89.18048, 14.99967], [-89.15149, 15.07392], [-88.97343, 15.14039], [-88.32467, 15.63665], [-88.31459, 15.66942], [-88.24022, 15.69247], [-88.22552, 15.72294], [-88.20359, 16.03858], [-88.40779, 16.09624], [-88.95358, 15.88698], [-89.02415, 15.9063], [-89.17418, 15.90898], [-89.22683, 15.88619], [-89.15025, 17.04813], [-89.14985, 17.81563]]]]
+         }
+       }, {
+         type: "Feature",
+         properties: {
+           iso1A2: "GU",
+           iso1A3: "GUM",
+           iso1N3: "316",
+           wikidata: "Q16635",
+           nameEn: "Guam",
+           aliases: ["US-GU"],
+           country: "US",
+           groups: ["Q1352230", "Q153732", "057", "009", "UN"],
+           roadSpeedUnit: "mph",
+           roadHeightUnit: "ft",
+           callingCodes: ["1 671"]
+         },
+         geometry: {
+           type: "MultiPolygon",
+           coordinates: [[[[146.25931, 13.85876], [143.82485, 13.92273], [144.61642, 12.82462], [146.25931, 13.85876]]]]
+         }
+       }, {
+         type: "Feature",
+         properties: {
+           iso1A2: "GW",
+           iso1A3: "GNB",
+           iso1N3: "624",
+           wikidata: "Q1007",
+           nameEn: "Guinea-Bissau",
+           groups: ["011", "202", "002", "UN"],
+           callingCodes: ["245"]
+         },
+         geometry: {
+           type: "MultiPolygon",
+           coordinates: [[[[-14.31513, 11.60713], [-14.26623, 11.67486], [-14.09799, 11.63649], [-13.7039, 11.70195], [-13.7039, 12.00869], [-13.94589, 12.16869], [-13.92745, 12.24077], [-13.70851, 12.24978], [-13.64168, 12.42764], [-13.65089, 12.49515], [-13.7039, 12.60313], [-13.70523, 12.68013], [-15.17582, 12.6847], [-15.67302, 12.42974], [-16.20591, 12.46157], [-16.38191, 12.36449], [-16.70562, 12.34803], [-17.4623, 11.92379], [-15.96748, 10.162], [-15.07174, 10.89557], [-14.95993, 10.99244], [-14.77786, 11.36323], [-14.66677, 11.51188], [-14.51173, 11.49708], [-14.31513, 11.60713]]]]
+         }
+       }, {
+         type: "Feature",
+         properties: {
+           iso1A2: "GY",
+           iso1A3: "GUY",
+           iso1N3: "328",
+           wikidata: "Q734",
+           nameEn: "Guyana",
+           groups: ["005", "419", "019", "UN"],
+           driveSide: "left",
+           callingCodes: ["592"]
+         },
+         geometry: {
+           type: "MultiPolygon",
+           coordinates: [[[[-56.84822, 6.73257], [-59.54058, 8.6862], [-59.98508, 8.53046], [-59.85562, 8.35213], [-59.80661, 8.28906], [-59.83156, 8.23261], [-59.97059, 8.20791], [-60.02407, 8.04557], [-60.38056, 7.8302], [-60.51959, 7.83373], [-60.64793, 7.56877], [-60.71923, 7.55817], [-60.59802, 7.33194], [-60.63367, 7.25061], [-60.54098, 7.14804], [-60.44116, 7.20817], [-60.28074, 7.1162], [-60.39419, 6.94847], [-60.54873, 6.8631], [-61.13632, 6.70922], [-61.20762, 6.58174], [-61.15058, 6.19558], [-61.4041, 5.95304], [-60.73204, 5.20931], [-60.32352, 5.21299], [-60.20944, 5.28754], [-59.98129, 5.07097], [-60.04189, 4.69801], [-60.15953, 4.53456], [-59.78878, 4.45637], [-59.69361, 4.34069], [-59.73353, 4.20399], [-59.51963, 3.91951], [-59.86899, 3.57089], [-59.79769, 3.37162], [-59.99733, 2.92312], [-59.91177, 2.36759], [-59.7264, 2.27497], [-59.74066, 1.87596], [-59.25583, 1.40559], [-58.92072, 1.31293], [-58.84229, 1.17749], [-58.53571, 1.29154], [-58.4858, 1.48399], [-58.33887, 1.58014], [-58.01873, 1.51966], [-57.97336, 1.64566], [-57.77281, 1.73344], [-57.55743, 1.69605], [-57.35073, 1.98327], [-57.23981, 1.95808], [-57.09109, 2.01854], [-57.07092, 1.95304], [-56.7659, 1.89509], [-56.47045, 1.95135], [-56.55439, 2.02003], [-56.70519, 2.02964], [-57.35891, 3.32121], [-58.0307, 3.95513], [-57.8699, 4.89394], [-57.37442, 5.0208], [-57.22536, 5.15605], [-57.31629, 5.33714], [-56.84822, 6.73257]]]]
+         }
+       }, {
+         type: "Feature",
+         properties: {
+           iso1A2: "HK",
+           iso1A3: "HKG",
+           iso1N3: "344",
+           wikidata: "Q8646",
+           nameEn: "Hong Kong",
+           country: "CN",
+           groups: ["030", "142", "UN"],
+           driveSide: "left",
+           callingCodes: ["852"]
+         },
+         geometry: {
+           type: "MultiPolygon",
+           coordinates: [[[[113.92195, 22.13873], [114.50148, 22.15017], [114.44998, 22.55977], [114.25154, 22.55977], [114.22888, 22.5436], [114.22185, 22.55343], [114.20655, 22.55706], [114.18338, 22.55444], [114.17247, 22.55944], [114.1597, 22.56041], [114.15123, 22.55163], [114.1482, 22.54091], [114.13823, 22.54319], [114.12665, 22.54003], [114.11656, 22.53415], [114.11181, 22.52878], [114.1034, 22.5352], [114.09692, 22.53435], [114.09048, 22.53716], [114.08606, 22.53276], [114.07817, 22.52997], [114.07267, 22.51855], [114.06272, 22.51617], [114.05729, 22.51104], [114.05438, 22.5026], [114.03113, 22.5065], [113.86771, 22.42972], [113.81621, 22.2163], [113.83338, 22.1826], [113.92195, 22.13873]]]]
+         }
+       }, {
+         type: "Feature",
+         properties: {
+           iso1A2: "HM",
+           iso1A3: "HMD",
+           iso1N3: "334",
+           wikidata: "Q131198",
+           nameEn: "Heard Island and McDonald Islands",
+           country: "AU",
+           groups: ["053", "009", "UN"],
+           driveSide: "left"
+         },
+         geometry: {
+           type: "MultiPolygon",
+           coordinates: [[[[71.08716, -53.87687], [75.44182, -53.99822], [72.87012, -51.48322], [71.08716, -53.87687]]]]
+         }
+       }, {
+         type: "Feature",
+         properties: {
+           iso1A2: "HN",
+           iso1A3: "HND",
+           iso1N3: "340",
+           wikidata: "Q783",
+           nameEn: "Honduras",
+           groups: ["013", "003", "419", "019", "UN"],
+           callingCodes: ["504"]
+         },
+         geometry: {
+           type: "MultiPolygon",
+           coordinates: [[[[-83.86109, 17.73736], [-88.20359, 16.03858], [-88.22552, 15.72294], [-88.24022, 15.69247], [-88.31459, 15.66942], [-88.32467, 15.63665], [-88.97343, 15.14039], [-89.15149, 15.07392], [-89.18048, 14.99967], [-89.15149, 14.97775], [-89.23467, 14.85596], [-89.13132, 14.71582], [-89.15653, 14.57802], [-89.23719, 14.58046], [-89.35189, 14.47553], [-89.34776, 14.43013], [-89.04187, 14.33644], [-88.94608, 14.20207], [-88.85785, 14.17763], [-88.815, 14.11652], [-88.73182, 14.10919], [-88.70661, 14.04317], [-88.49738, 13.97224], [-88.48982, 13.86458], [-88.25791, 13.91108], [-88.23018, 13.99915], [-88.07641, 13.98447], [-88.00331, 13.86948], [-87.7966, 13.91353], [-87.68821, 13.80829], [-87.73106, 13.75443], [-87.78148, 13.52906], [-87.71657, 13.50577], [-87.72115, 13.46083], [-87.73841, 13.44169], [-87.77354, 13.45767], [-87.83467, 13.44655], [-87.84675, 13.41078], [-87.80177, 13.35689], [-87.73714, 13.32715], [-87.69751, 13.25228], [-87.55124, 13.12523], [-87.37107, 12.98646], [-87.06306, 13.00892], [-87.03785, 12.98682], [-86.93197, 13.05313], [-86.93383, 13.18677], [-86.87066, 13.30641], [-86.71267, 13.30348], [-86.76812, 13.79605], [-86.35219, 13.77157], [-86.14801, 14.04317], [-86.00685, 14.08474], [-86.03458, 13.99181], [-85.75477, 13.8499], [-85.73964, 13.9698], [-85.45762, 14.11304], [-85.32149, 14.2562], [-85.18602, 14.24929], [-85.1575, 14.53934], [-84.90082, 14.80489], [-84.82596, 14.82212], [-84.70119, 14.68078], [-84.48373, 14.63249], [-84.10584, 14.76353], [-83.89551, 14.76697], [-83.62101, 14.89448], [-83.49268, 15.01158], [-83.13724, 15.00002], [-83.04763, 15.03256], [-82.06974, 14.49418], [-81.58685, 18.0025], [-83.86109, 17.73736]]]]
+         }
+       }, {
+         type: "Feature",
+         properties: {
+           iso1A2: "HR",
+           iso1A3: "HRV",
+           iso1N3: "191",
+           wikidata: "Q224",
+           nameEn: "Croatia",
+           groups: ["EU", "039", "150", "UN"],
+           callingCodes: ["385"]
+         },
+         geometry: {
+           type: "MultiPolygon",
+           coordinates: [[[[17.6444, 42.88641], [17.5392, 42.92787], [17.70879, 42.97223], [17.64268, 43.08595], [17.46986, 43.16559], [17.286, 43.33065], [17.25579, 43.40353], [17.29699, 43.44542], [17.24411, 43.49376], [17.15828, 43.49376], [17.00585, 43.58037], [16.80736, 43.76011], [16.75316, 43.77157], [16.70922, 43.84887], [16.55472, 43.95326], [16.50528, 44.0244], [16.43629, 44.02826], [16.43662, 44.07523], [16.36864, 44.08263], [16.18688, 44.27012], [16.21346, 44.35231], [16.12969, 44.38275], [16.16814, 44.40679], [16.10566, 44.52586], [16.03012, 44.55572], [16.00884, 44.58605], [16.05828, 44.61538], [15.89348, 44.74964], [15.8255, 44.71501], [15.72584, 44.82334], [15.79472, 44.8455], [15.76096, 44.87045], [15.74723, 44.96818], [15.78568, 44.97401], [15.74585, 45.0638], [15.78842, 45.11519], [15.76371, 45.16508], [15.83512, 45.22459], [15.98412, 45.23088], [16.12153, 45.09616], [16.29036, 44.99732], [16.35404, 45.00241], [16.35863, 45.03529], [16.3749, 45.05206], [16.38219, 45.05139], [16.38309, 45.05955], [16.40023, 45.1147], [16.4634, 45.14522], [16.49155, 45.21153], [16.52982, 45.22713], [16.5501, 45.2212], [16.56559, 45.22307], [16.60194, 45.23042], [16.64962, 45.20714], [16.74845, 45.20393], [16.78219, 45.19002], [16.81137, 45.18434], [16.83804, 45.18951], [16.92405, 45.27607], [16.9385, 45.22742], [17.0415, 45.20759], [17.18438, 45.14764], [17.24325, 45.146], [17.25131, 45.14957], [17.26815, 45.18444], [17.32092, 45.16246], [17.33573, 45.14521], [17.41229, 45.13335], [17.4498, 45.16119], [17.45615, 45.12523], [17.47589, 45.12656], [17.51469, 45.10791], [17.59104, 45.10816], [17.66571, 45.13408], [17.84826, 45.04489], [17.87148, 45.04645], [17.93706, 45.08016], [17.97336, 45.12245], [17.97834, 45.13831], [17.99479, 45.14958], [18.01594, 45.15163], [18.03121, 45.12632], [18.1624, 45.07654], [18.24387, 45.13699], [18.32077, 45.1021], [18.41896, 45.11083], [18.47939, 45.05871], [18.65723, 45.07544], [18.78357, 44.97741], [18.80661, 44.93561], [18.76369, 44.93707], [18.76347, 44.90669], [18.8704, 44.85097], [19.01994, 44.85493], [18.98957, 44.90645], [19.02871, 44.92541], [19.06853, 44.89915], [19.15573, 44.95409], [19.05205, 44.97692], [19.1011, 45.01191], [19.07952, 45.14668], [19.14063, 45.12972], [19.19144, 45.17863], [19.43589, 45.17137], [19.41941, 45.23475], [19.28208, 45.23813], [19.10774, 45.29547], [18.97446, 45.37528], [18.99918, 45.49333], [19.08364, 45.48804], [19.07471, 45.53086], [18.94562, 45.53712], [18.88776, 45.57253], [18.96691, 45.66731], [18.90305, 45.71863], [18.85783, 45.85493], [18.81394, 45.91329], [18.80211, 45.87995], [18.6792, 45.92057], [18.57483, 45.80772], [18.44368, 45.73972], [18.12439, 45.78905], [18.08869, 45.76511], [17.99805, 45.79671], [17.87377, 45.78522], [17.66545, 45.84207], [17.56821, 45.93728], [17.35672, 45.95209], [17.14592, 46.16697], [16.8903, 46.28122], [16.8541, 46.36255], [16.7154, 46.39523], [16.6639, 46.45203], [16.59527, 46.47524], [16.52604, 46.47831], [16.5007, 46.49644], [16.44036, 46.5171], [16.38771, 46.53608], [16.37193, 46.55008], [16.29793, 46.5121], [16.26733, 46.51505], [16.26759, 46.50566], [16.23961, 46.49653], [16.25124, 46.48067], [16.27398, 46.42875], [16.27329, 46.41467], [16.30162, 46.40437], [16.30233, 46.37837], [16.18824, 46.38282], [16.14859, 46.40547], [16.05281, 46.39141], [16.05065, 46.3833], [16.07314, 46.36458], [16.07616, 46.3463], [15.97965, 46.30652], [15.79284, 46.25811], [15.78817, 46.21719], [15.75479, 46.20336], [15.75436, 46.21969], [15.67395, 46.22478], [15.6434, 46.21396], [15.64904, 46.19229], [15.59909, 46.14761], [15.6083, 46.11992], [15.62317, 46.09103], [15.72977, 46.04682], [15.71246, 46.01196], [15.70327, 46.00015], [15.70636, 45.92116], [15.67967, 45.90455], [15.68383, 45.88867], [15.68232, 45.86819], [15.70411, 45.8465], [15.66662, 45.84085], [15.64185, 45.82915], [15.57952, 45.84953], [15.52234, 45.82195], [15.47325, 45.8253], [15.47531, 45.79802], [15.40836, 45.79491], [15.25423, 45.72275], [15.30872, 45.69014], [15.34919, 45.71623], [15.4057, 45.64727], [15.38952, 45.63682], [15.34214, 45.64702], [15.34695, 45.63382], [15.31027, 45.6303], [15.27747, 45.60504], [15.29837, 45.5841], [15.30249, 45.53224], [15.38188, 45.48752], [15.33051, 45.45258], [15.27758, 45.46678], [15.16862, 45.42309], [15.05187, 45.49079], [15.02385, 45.48533], [14.92266, 45.52788], [14.90554, 45.47769], [14.81992, 45.45913], [14.80124, 45.49515], [14.71718, 45.53442], [14.68605, 45.53006], [14.69694, 45.57366], [14.59576, 45.62812], [14.60977, 45.66403], [14.57397, 45.67165], [14.53816, 45.6205], [14.5008, 45.60852], [14.49769, 45.54424], [14.36693, 45.48642], [14.32487, 45.47142], [14.27681, 45.4902], [14.26611, 45.48239], [14.24239, 45.50607], [14.22371, 45.50388], [14.20348, 45.46896], [14.07116, 45.48752], [14.00578, 45.52352], [13.96063, 45.50825], [13.99488, 45.47551], [13.97309, 45.45258], [13.90771, 45.45149], [13.88124, 45.42637], [13.81742, 45.43729], [13.7785, 45.46787], [13.67398, 45.4436], [13.62902, 45.45898], [13.56979, 45.4895], [13.45644, 45.59464], [13.05142, 45.33128], [13.12821, 44.48877], [16.15283, 42.18525], [18.45131, 42.21682], [18.54128, 42.39171], [18.52152, 42.42302], [18.43588, 42.48556], [18.44307, 42.51077], [18.43735, 42.55921], [18.36197, 42.61423], [18.24318, 42.6112], [17.88201, 42.83668], [17.80854, 42.9182], [17.7948, 42.89556], [17.68151, 42.92725], [17.6444, 42.88641]]]]
+         }
+       }, {
+         type: "Feature",
+         properties: {
+           iso1A2: "HT",
+           iso1A3: "HTI",
+           iso1N3: "332",
+           wikidata: "Q790",
+           nameEn: "Haiti",
+           aliases: ["RH"],
+           groups: ["029", "003", "419", "019", "UN"],
+           callingCodes: ["509"]
+         },
+         geometry: {
+           type: "MultiPolygon",
+           coordinates: [[[[-71.71885, 18.78423], [-71.72624, 18.87802], [-71.77766, 18.95007], [-71.88102, 18.95007], [-71.74088, 19.0437], [-71.71088, 19.08353], [-71.69938, 19.10916], [-71.65337, 19.11759], [-71.62642, 19.21212], [-71.73229, 19.26686], [-71.77766, 19.33823], [-71.69448, 19.37866], [-71.6802, 19.45008], [-71.71268, 19.53374], [-71.71449, 19.55364], [-71.7429, 19.58445], [-71.75865, 19.70231], [-71.77419, 19.73128], [-72.38946, 20.27111], [-73.37289, 20.43199], [-74.7289, 18.71009], [-74.76465, 18.06252], [-72.29523, 17.48026], [-71.75671, 18.03456], [-71.73783, 18.07177], [-71.74994, 18.11115], [-71.75465, 18.14405], [-71.78271, 18.18302], [-71.69952, 18.34101], [-71.90875, 18.45821], [-71.88102, 18.50125], [-72.00201, 18.62312], [-71.95412, 18.64939], [-71.82556, 18.62551], [-71.71885, 18.78423]]]]
+         }
+       }, {
+         type: "Feature",
+         properties: {
+           iso1A2: "HU",
+           iso1A3: "HUN",
+           iso1N3: "348",
+           wikidata: "Q28",
+           nameEn: "Hungary",
+           groups: ["EU", "151", "150", "UN"],
+           callingCodes: ["36"]
+         },
+         geometry: {
+           type: "MultiPolygon",
+           coordinates: [[[[21.72525, 48.34628], [21.67134, 48.3989], [21.6068, 48.50365], [21.44063, 48.58456], [21.11516, 48.49546], [20.83248, 48.5824], [20.5215, 48.53336], [20.29943, 48.26104], [20.24312, 48.2784], [19.92452, 48.1283], [19.63338, 48.25006], [19.52489, 48.19791], [19.47957, 48.09437], [19.28182, 48.08336], [19.23924, 48.0595], [19.01952, 48.07052], [18.82176, 48.04206], [18.76134, 47.97499], [18.76821, 47.87469], [18.8506, 47.82308], [18.74074, 47.8157], [18.66521, 47.76772], [18.56496, 47.76588], [18.29305, 47.73541], [18.02938, 47.75665], [17.71215, 47.7548], [17.23699, 48.02094], [17.16001, 48.00636], [17.09786, 47.97336], [17.11022, 47.92461], [17.08275, 47.87719], [17.00997, 47.86245], [17.07039, 47.81129], [17.05048, 47.79377], [17.08893, 47.70928], [16.87538, 47.68895], [16.86509, 47.72268], [16.82938, 47.68432], [16.7511, 47.67878], [16.72089, 47.73469], [16.65679, 47.74197], [16.61183, 47.76171], [16.54779, 47.75074], [16.53514, 47.73837], [16.55129, 47.72268], [16.4222, 47.66537], [16.58699, 47.61772], [16.64193, 47.63114], [16.71059, 47.52692], [16.64821, 47.50155], [16.6718, 47.46139], [16.57152, 47.40868], [16.52414, 47.41007], [16.49908, 47.39416], [16.45104, 47.41181], [16.47782, 47.25918], [16.44142, 47.25079], [16.43663, 47.21127], [16.41739, 47.20649], [16.42801, 47.18422], [16.4523, 47.18812], [16.46442, 47.16845], [16.44932, 47.14418], [16.52863, 47.13974], [16.46134, 47.09395], [16.52176, 47.05747], [16.43936, 47.03548], [16.51369, 47.00084], [16.28202, 47.00159], [16.27594, 46.9643], [16.22403, 46.939], [16.19904, 46.94134], [16.10983, 46.867], [16.14365, 46.8547], [16.15711, 46.85434], [16.21892, 46.86961], [16.2365, 46.87775], [16.2941, 46.87137], [16.34547, 46.83836], [16.3408, 46.80641], [16.31303, 46.79838], [16.30966, 46.7787], [16.37816, 46.69975], [16.42641, 46.69228], [16.41863, 46.66238], [16.38594, 46.6549], [16.39217, 46.63673], [16.50139, 46.56684], [16.52885, 46.53303], [16.52604, 46.5051], [16.59527, 46.47524], [16.6639, 46.45203], [16.7154, 46.39523], [16.8541, 46.36255], [16.8903, 46.28122], [17.14592, 46.16697], [17.35672, 45.95209], [17.56821, 45.93728], [17.66545, 45.84207], [17.87377, 45.78522], [17.99805, 45.79671], [18.08869, 45.76511], [18.12439, 45.78905], [18.44368, 45.73972], [18.57483, 45.80772], [18.6792, 45.92057], [18.80211, 45.87995], [18.81394, 45.91329], [18.99712, 45.93537], [19.01284, 45.96529], [19.0791, 45.96458], [19.10388, 46.04015], [19.14543, 45.9998], [19.28826, 45.99694], [19.52473, 46.1171], [19.56113, 46.16824], [19.66007, 46.19005], [19.81491, 46.1313], [19.93508, 46.17553], [20.01816, 46.17696], [20.03533, 46.14509], [20.09713, 46.17315], [20.26068, 46.12332], [20.28324, 46.1438], [20.35573, 46.16629], [20.45377, 46.14405], [20.49718, 46.18721], [20.63863, 46.12728], [20.76085, 46.21002], [20.74574, 46.25467], [20.86797, 46.28884], [21.06572, 46.24897], [21.16872, 46.30118], [21.28061, 46.44941], [21.26929, 46.4993], [21.33214, 46.63035], [21.43926, 46.65109], [21.5151, 46.72147], [21.48935, 46.7577], [21.52028, 46.84118], [21.59307, 46.86935], [21.59581, 46.91628], [21.68645, 46.99595], [21.648, 47.03902], [21.78395, 47.11104], [21.94463, 47.38046], [22.01055, 47.37767], [22.03389, 47.42508], [22.00917, 47.50492], [22.31816, 47.76126], [22.41979, 47.7391], [22.46559, 47.76583], [22.67247, 47.7871], [22.76617, 47.8417], [22.77991, 47.87211], [22.89849, 47.95851], [22.84276, 47.98602], [22.87847, 48.04665], [22.81804, 48.11363], [22.73427, 48.12005], [22.66835, 48.09162], [22.58733, 48.10813], [22.59007, 48.15121], [22.49806, 48.25189], [22.38133, 48.23726], [22.2083, 48.42534], [22.14689, 48.4005], [21.83339, 48.36242], [21.8279, 48.33321], [21.72525, 48.34628]]]]
+         }
+       }, {
+         type: "Feature",
+         properties: {
+           iso1A2: "IC",
+           wikidata: "Q5813",
+           nameEn: "Canary Islands",
+           country: "ES",
+           groups: ["Q3320166", "Q105472", "EU", "039", "150", "UN"],
+           isoStatus: "excRes",
+           callingCodes: ["34"]
+         },
+         geometry: {
+           type: "MultiPolygon",
+           coordinates: [[[[-12.00985, 30.24121], [-25.3475, 27.87574], [-14.43883, 27.02969], [-12.00985, 30.24121]]]]
+         }
+       }, {
+         type: "Feature",
+         properties: {
+           iso1A2: "ID",
+           iso1A3: "IDN",
+           iso1N3: "360",
+           wikidata: "Q252",
+           nameEn: "Indonesia",
+           aliases: ["RI"]
+         },
+         geometry: null
+       }, {
+         type: "Feature",
+         properties: {
+           iso1A2: "IE",
+           iso1A3: "IRL",
+           iso1N3: "372",
+           wikidata: "Q27",
+           nameEn: "Republic of Ireland",
+           groups: ["EU", "Q22890", "154", "150", "UN"],
+           driveSide: "left",
+           callingCodes: ["353"]
+         },
+         geometry: {
+           type: "MultiPolygon",
+           coordinates: [[[[-6.26218, 54.09785], [-6.29003, 54.11278], [-6.32694, 54.09337], [-6.36279, 54.11248], [-6.36605, 54.07234], [-6.47849, 54.06947], [-6.62842, 54.03503], [-6.66264, 54.0666], [-6.6382, 54.17071], [-6.70175, 54.20218], [-6.74575, 54.18788], [-6.81583, 54.22791], [-6.85179, 54.29176], [-6.87775, 54.34682], [-7.02034, 54.4212], [-7.19145, 54.31296], [-7.14908, 54.22732], [-7.25012, 54.20063], [-7.26316, 54.13863], [-7.29493, 54.12013], [-7.29687, 54.1354], [-7.28017, 54.16714], [-7.29157, 54.17191], [-7.34005, 54.14698], [-7.30553, 54.11869], [-7.32834, 54.11475], [-7.44567, 54.1539], [-7.4799, 54.12239], [-7.55812, 54.12239], [-7.69501, 54.20731], [-7.81397, 54.20159], [-7.8596, 54.21779], [-7.87101, 54.29299], [-8.04555, 54.36292], [-8.179, 54.46763], [-8.04538, 54.48941], [-7.99812, 54.54427], [-7.8596, 54.53671], [-7.70315, 54.62077], [-7.93293, 54.66603], [-7.83352, 54.73854], [-7.75041, 54.7103], [-7.64449, 54.75265], [-7.54671, 54.74606], [-7.54508, 54.79401], [-7.47626, 54.83084], [-7.4473, 54.87003], [-7.44404, 54.9403], [-7.40004, 54.94498], [-7.4033, 55.00391], [-7.34464, 55.04688], [-7.2471, 55.06933], [-6.34755, 55.49206], [-7.75229, 55.93854], [-22.01468, 48.19557], [-6.03913, 51.13217], [-5.37267, 53.63269], [-6.26218, 54.09785]]]]
+         }
+       }, {
+         type: "Feature",
+         properties: {
+           iso1A2: "IL",
+           iso1A3: "ISR",
+           iso1N3: "376",
+           wikidata: "Q801",
+           nameEn: "Israel",
+           groups: ["145", "142", "UN"],
+           callingCodes: ["972"]
+         },
+         geometry: {
+           type: "MultiPolygon",
+           coordinates: [[[[34.052, 31.46619], [34.29262, 31.70393], [34.48681, 31.59711], [34.56797, 31.54197], [34.48892, 31.48365], [34.40077, 31.40926], [34.36505, 31.36404], [34.37381, 31.30598], [34.36523, 31.28963], [34.29417, 31.24194], [34.26742, 31.21998], [34.92298, 29.45305], [34.97718, 29.54294], [34.98207, 29.58147], [35.02147, 29.66343], [35.14108, 30.07374], [35.19183, 30.34636], [35.16218, 30.43535], [35.19595, 30.50297], [35.21379, 30.60401], [35.29311, 30.71365], [35.33456, 30.81224], [35.33984, 30.8802], [35.41371, 30.95565], [35.43658, 31.12444], [35.40316, 31.25535], [35.47672, 31.49578], [35.39675, 31.49572], [35.22921, 31.37445], [35.13033, 31.3551], [35.02459, 31.35979], [34.92571, 31.34337], [34.88932, 31.37093], [34.87833, 31.39321], [34.89756, 31.43891], [34.93258, 31.47816], [34.94356, 31.50743], [34.9415, 31.55601], [34.95249, 31.59813], [35.00879, 31.65426], [35.08226, 31.69107], [35.10782, 31.71594], [35.11895, 31.71454], [35.12933, 31.7325], [35.13931, 31.73012], [35.15119, 31.73634], [35.15474, 31.73352], [35.16478, 31.73242], [35.18023, 31.72067], [35.20538, 31.72388], [35.21937, 31.71578], [35.22392, 31.71899], [35.23972, 31.70896], [35.24315, 31.71244], [35.2438, 31.7201], [35.24981, 31.72543], [35.25182, 31.73945], [35.26319, 31.74846], [35.25225, 31.7678], [35.26058, 31.79064], [35.25573, 31.81362], [35.26404, 31.82567], [35.251, 31.83085], [35.25753, 31.8387], [35.24816, 31.8458], [35.2304, 31.84222], [35.2249, 31.85433], [35.22817, 31.8638], [35.22567, 31.86745], [35.22294, 31.87889], [35.22014, 31.88264], [35.2136, 31.88241], [35.21276, 31.88153], [35.21016, 31.88237], [35.20945, 31.8815], [35.20791, 31.8821], [35.20673, 31.88151], [35.20381, 31.86716], [35.21128, 31.863], [35.216, 31.83894], [35.21469, 31.81835], [35.19461, 31.82687], [35.18169, 31.82542], [35.18603, 31.80901], [35.14174, 31.81325], [35.07677, 31.85627], [35.05617, 31.85685], [35.01978, 31.82944], [34.9724, 31.83352], [34.99712, 31.85569], [35.03489, 31.85919], [35.03978, 31.89276], [35.03489, 31.92448], [35.00124, 31.93264], [34.98682, 31.96935], [35.00261, 32.027], [34.9863, 32.09551], [34.99437, 32.10962], [34.98507, 32.12606], [34.99039, 32.14626], [34.96009, 32.17503], [34.95703, 32.19522], [34.98885, 32.20758], [35.01841, 32.23981], [35.02939, 32.2671], [35.01119, 32.28684], [35.01772, 32.33863], [35.04243, 32.35008], [35.05142, 32.3667], [35.0421, 32.38242], [35.05311, 32.4024], [35.05423, 32.41754], [35.07059, 32.4585], [35.08564, 32.46948], [35.09236, 32.47614], [35.10024, 32.47856], [35.10882, 32.4757], [35.15937, 32.50466], [35.2244, 32.55289], [35.25049, 32.52453], [35.29306, 32.50947], [35.30685, 32.51024], [35.35212, 32.52047], [35.40224, 32.50136], [35.42034, 32.46009], [35.41598, 32.45593], [35.41048, 32.43706], [35.42078, 32.41562], [35.55807, 32.38674], [35.55494, 32.42687], [35.57485, 32.48669], [35.56614, 32.64393], [35.59813, 32.65159], [35.61669, 32.67999], [35.66527, 32.681], [35.68467, 32.70715], [35.75983, 32.74803], [35.78745, 32.77938], [35.83758, 32.82817], [35.84021, 32.8725], [35.87012, 32.91976], [35.89298, 32.9456], [35.87188, 32.98028], [35.84802, 33.1031], [35.81911, 33.11077], [35.81911, 33.1336], [35.84285, 33.16673], [35.83846, 33.19397], [35.81647, 33.2028], [35.81295, 33.24841], [35.77513, 33.27342], [35.813, 33.3172], [35.77477, 33.33609], [35.62019, 33.27278], [35.62283, 33.24226], [35.58502, 33.26653], [35.58326, 33.28381], [35.56523, 33.28969], [35.55555, 33.25844], [35.54544, 33.25513], [35.54808, 33.236], [35.5362, 33.23196], [35.54228, 33.19865], [35.52573, 33.11921], [35.50335, 33.114], [35.50272, 33.09056], [35.448, 33.09264], [35.43059, 33.06659], [35.35223, 33.05617], [35.31429, 33.10515], [35.1924, 33.08743], [35.10645, 33.09318], [34.78515, 33.20368], [33.62659, 31.82938], [34.052, 31.46619]]]]
+         }
+       }, {
+         type: "Feature",
+         properties: {
+           iso1A2: "IM",
+           iso1A3: "IMN",
+           iso1N3: "833",
+           wikidata: "Q9676",
+           nameEn: "Isle of Man",
+           country: "GB",
+           groups: ["Q185086", "154", "150", "UN"],
+           driveSide: "left",
+           roadSpeedUnit: "mph",
+           roadHeightUnit: "ft",
+           callingCodes: ["44 01624", "44 07624", "44 07524", "44 07924"]
+         },
+         geometry: {
+           type: "MultiPolygon",
+           coordinates: [[[[-3.98763, 54.07351], [-4.1819, 54.57861], [-5.6384, 53.81157], [-3.98763, 54.07351]]]]
+         }
+       }, {
+         type: "Feature",
+         properties: {
+           iso1A2: "IN",
+           iso1A3: "IND",
+           iso1N3: "356",
+           wikidata: "Q668",
+           nameEn: "India"
+         },
+         geometry: null
+       }, {
+         type: "Feature",
+         properties: {
+           iso1A2: "IO",
+           iso1A3: "IOT",
+           iso1N3: "086",
+           wikidata: "Q43448",
+           nameEn: "British Indian Ocean Territory",
+           country: "GB"
+         },
+         geometry: null
+       }, {
+         type: "Feature",
+         properties: {
+           iso1A2: "IQ",
+           iso1A3: "IRQ",
+           iso1N3: "368",
+           wikidata: "Q796",
+           nameEn: "Iraq",
+           groups: ["145", "142", "UN"],
+           callingCodes: ["964"]
+         },
+         geometry: {
+           type: "MultiPolygon",
+           coordinates: [[[[42.78887, 37.38615], [42.56725, 37.14878], [42.35724, 37.10998], [42.36697, 37.0627], [41.81736, 36.58782], [41.40058, 36.52502], [41.28864, 36.35368], [41.2564, 36.06012], [41.37027, 35.84095], [41.38184, 35.62502], [41.26569, 35.42708], [41.21654, 35.1508], [41.2345, 34.80049], [41.12388, 34.65742], [40.97676, 34.39788], [40.64314, 34.31604], [38.79171, 33.37328], [39.08202, 32.50304], [38.98762, 32.47694], [39.04251, 32.30203], [39.26157, 32.35555], [39.29903, 32.23259], [40.01521, 32.05667], [42.97601, 30.72204], [42.97796, 30.48295], [44.72255, 29.19736], [46.42415, 29.05947], [46.5527, 29.10283], [46.89695, 29.50584], [47.15166, 30.01044], [47.37192, 30.10421], [47.7095, 30.10453], [48.01114, 29.98906], [48.06782, 30.02906], [48.17332, 30.02448], [48.40479, 29.85763], [48.59531, 29.66815], [48.83867, 29.78572], [48.61441, 29.93675], [48.51011, 29.96238], [48.44785, 30.00148], [48.4494, 30.04456], [48.43384, 30.08233], [48.38869, 30.11062], [48.38714, 30.13485], [48.41671, 30.17254], [48.41117, 30.19846], [48.26393, 30.3408], [48.24385, 30.33846], [48.21279, 30.31644], [48.19425, 30.32796], [48.18321, 30.39703], [48.14585, 30.44133], [48.02443, 30.4789], [48.03221, 30.9967], [47.68219, 31.00004], [47.6804, 31.39086], [47.86337, 31.78422], [47.64771, 32.07666], [47.52474, 32.15972], [47.57144, 32.20583], [47.37529, 32.47808], [47.17218, 32.45393], [46.46788, 32.91992], [46.32298, 32.9731], [46.17198, 32.95612], [46.09103, 32.98354], [46.15175, 33.07229], [46.03966, 33.09577], [46.05367, 33.13097], [46.11905, 33.11924], [46.20623, 33.20395], [45.99919, 33.5082], [45.86687, 33.49263], [45.96183, 33.55751], [45.89801, 33.63661], [45.77814, 33.60938], [45.50261, 33.94968], [45.42789, 33.9458], [45.41077, 33.97421], [45.47264, 34.03099], [45.56176, 34.15088], [45.58667, 34.30147], [45.53552, 34.35148], [45.49171, 34.3439], [45.46697, 34.38221], [45.43879, 34.45949], [45.51883, 34.47692], [45.53219, 34.60441], [45.59074, 34.55558], [45.60224, 34.55057], [45.73923, 34.54416], [45.70031, 34.69277], [45.65672, 34.7222], [45.68284, 34.76624], [45.70031, 34.82322], [45.73641, 34.83975], [45.79682, 34.85133], [45.78904, 34.91135], [45.86532, 34.89858], [45.89477, 34.95805], [45.87864, 35.03441], [45.92173, 35.0465], [45.92203, 35.09538], [45.93108, 35.08148], [45.94756, 35.09188], [46.06508, 35.03699], [46.07747, 35.0838], [46.11763, 35.07551], [46.19116, 35.11097], [46.15642, 35.1268], [46.16229, 35.16984], [46.19738, 35.18536], [46.18457, 35.22561], [46.11367, 35.23729], [46.15474, 35.2883], [46.13152, 35.32548], [46.05358, 35.38568], [45.98453, 35.49848], [46.01518, 35.52012], [45.97584, 35.58132], [46.03028, 35.57416], [46.01307, 35.59756], [46.0165, 35.61501], [45.99452, 35.63574], [46.0117, 35.65059], [46.01631, 35.69139], [46.23736, 35.71414], [46.34166, 35.78363], [46.32921, 35.82655], [46.17198, 35.8013], [46.08325, 35.8581], [45.94711, 35.82218], [45.89784, 35.83708], [45.81442, 35.82107], [45.76145, 35.79898], [45.6645, 35.92872], [45.60018, 35.96069], [45.55245, 35.99943], [45.46594, 36.00042], [45.38275, 35.97156], [45.33916, 35.99424], [45.37652, 36.06222], [45.37312, 36.09917], [45.32235, 36.17383], [45.30038, 36.27769], [45.26261, 36.3001], [45.27394, 36.35846], [45.23953, 36.43257], [45.11811, 36.40751], [45.00759, 36.5402], [45.06985, 36.62645], [45.06985, 36.6814], [45.01537, 36.75128], [44.84725, 36.77622], [44.83479, 36.81362], [44.90173, 36.86096], [44.91199, 36.91468], [44.89862, 37.01897], [44.81611, 37.04383], [44.75229, 37.11958], [44.78319, 37.1431], [44.76698, 37.16162], [44.63179, 37.19229], [44.42631, 37.05825], [44.38117, 37.05825], [44.35315, 37.04955], [44.35937, 37.02843], [44.30645, 36.97373], [44.25975, 36.98119], [44.18503, 37.09551], [44.22239, 37.15756], [44.27998, 37.16501], [44.2613, 37.25055], [44.13521, 37.32486], [44.02002, 37.33229], [43.90949, 37.22453], [43.84878, 37.22205], [43.82699, 37.19477], [43.8052, 37.22825], [43.7009, 37.23692], [43.63085, 37.21957], [43.56702, 37.25675], [43.50787, 37.24436], [43.33508, 37.33105], [43.30083, 37.30629], [43.11403, 37.37436], [42.93705, 37.32015], [42.78887, 37.38615]]]]
+         }
+       }, {
+         type: "Feature",
+         properties: {
+           iso1A2: "IR",
+           iso1A3: "IRN",
+           iso1N3: "364",
+           wikidata: "Q794",
+           nameEn: "Iran",
+           groups: ["034", "142", "UN"],
+           callingCodes: ["98"]
+         },
+         geometry: {
+           type: "MultiPolygon",
+           coordinates: [[[[44.96746, 39.42998], [44.88916, 39.59653], [44.81043, 39.62677], [44.71806, 39.71124], [44.65422, 39.72163], [44.6137, 39.78393], [44.47298, 39.68788], [44.48111, 39.61579], [44.41849, 39.56659], [44.42832, 39.4131], [44.37921, 39.4131], [44.29818, 39.378], [44.22452, 39.4169], [44.03667, 39.39223], [44.1043, 39.19842], [44.20946, 39.13975], [44.18863, 38.93881], [44.30322, 38.81581], [44.26155, 38.71427], [44.28065, 38.6465], [44.32058, 38.62752], [44.3207, 38.49799], [44.3119, 38.37887], [44.38309, 38.36117], [44.44386, 38.38295], [44.50115, 38.33939], [44.42476, 38.25763], [44.22509, 37.88859], [44.3883, 37.85433], [44.45948, 37.77065], [44.55498, 37.783], [44.62096, 37.71985], [44.56887, 37.6429], [44.61401, 37.60165], [44.58449, 37.45018], [44.81021, 37.2915], [44.75986, 37.21549], [44.7868, 37.16644], [44.78319, 37.1431], [44.75229, 37.11958], [44.81611, 37.04383], [44.89862, 37.01897], [44.91199, 36.91468], [44.90173, 36.86096], [44.83479, 36.81362], [44.84725, 36.77622], [45.01537, 36.75128], [45.06985, 36.6814], [45.06985, 36.62645], [45.00759, 36.5402], [45.11811, 36.40751], [45.23953, 36.43257], [45.27394, 36.35846], [45.26261, 36.3001], [45.30038, 36.27769], [45.32235, 36.17383], [45.37312, 36.09917], [45.37652, 36.06222], [45.33916, 35.99424], [45.38275, 35.97156], [45.46594, 36.00042], [45.55245, 35.99943], [45.60018, 35.96069], [45.6645, 35.92872], [45.76145, 35.79898], [45.81442, 35.82107], [45.89784, 35.83708], [45.94711, 35.82218], [46.08325, 35.8581], [46.17198, 35.8013], [46.32921, 35.82655], [46.34166, 35.78363], [46.23736, 35.71414], [46.01631, 35.69139], [46.0117, 35.65059], [45.99452, 35.63574], [46.0165, 35.61501], [46.01307, 35.59756], [46.03028, 35.57416], [45.97584, 35.58132], [46.01518, 35.52012], [45.98453, 35.49848], [46.05358, 35.38568], [46.13152, 35.32548], [46.15474, 35.2883], [46.11367, 35.23729], [46.18457, 35.22561], [46.19738, 35.18536], [46.16229, 35.16984], [46.15642, 35.1268], [46.19116, 35.11097], [46.11763, 35.07551], [46.07747, 35.0838], [46.06508, 35.03699], [45.94756, 35.09188], [45.93108, 35.08148], [45.92203, 35.09538], [45.92173, 35.0465], [45.87864, 35.03441], [45.89477, 34.95805], [45.86532, 34.89858], [45.78904, 34.91135], [45.79682, 34.85133], [45.73641, 34.83975], [45.70031, 34.82322], [45.68284, 34.76624], [45.65672, 34.7222], [45.70031, 34.69277], [45.73923, 34.54416], [45.60224, 34.55057], [45.59074, 34.55558], [45.53219, 34.60441], [45.51883, 34.47692], [45.43879, 34.45949], [45.46697, 34.38221], [45.49171, 34.3439], [45.53552, 34.35148], [45.58667, 34.30147], [45.56176, 34.15088], [45.47264, 34.03099], [45.41077, 33.97421], [45.42789, 33.9458], [45.50261, 33.94968], [45.77814, 33.60938], [45.89801, 33.63661], [45.96183, 33.55751], [45.86687, 33.49263], [45.99919, 33.5082], [46.20623, 33.20395], [46.11905, 33.11924], [46.05367, 33.13097], [46.03966, 33.09577], [46.15175, 33.07229], [46.09103, 32.98354], [46.17198, 32.95612], [46.32298, 32.9731], [46.46788, 32.91992], [47.17218, 32.45393], [47.37529, 32.47808], [47.57144, 32.20583], [47.52474, 32.15972], [47.64771, 32.07666], [47.86337, 31.78422], [47.6804, 31.39086], [47.68219, 31.00004], [48.03221, 30.9967], [48.02443, 30.4789], [48.14585, 30.44133], [48.18321, 30.39703], [48.19425, 30.32796], [48.21279, 30.31644], [48.24385, 30.33846], [48.26393, 30.3408], [48.41117, 30.19846], [48.41671, 30.17254], [48.38714, 30.13485], [48.38869, 30.11062], [48.43384, 30.08233], [48.4494, 30.04456], [48.44785, 30.00148], [48.51011, 29.96238], [48.61441, 29.93675], [48.83867, 29.78572], [49.98877, 27.87827], [50.37726, 27.89227], [54.39838, 25.68383], [55.14145, 25.62624], [55.81777, 26.18798], [56.2644, 26.58649], [56.68954, 26.76645], [56.79239, 26.41236], [56.82555, 25.7713], [56.86325, 25.03856], [61.46682, 24.57869], [61.6433, 25.27541], [61.683, 25.66638], [61.83968, 25.7538], [61.83831, 26.07249], [61.89391, 26.26251], [62.05117, 26.31647], [62.21304, 26.26601], [62.31484, 26.528], [62.77352, 26.64099], [63.1889, 26.65072], [63.18688, 26.83844], [63.25005, 26.84212], [63.25005, 27.08692], [63.32283, 27.14437], [63.19649, 27.25674], [62.80604, 27.22412], [62.79684, 27.34381], [62.84905, 27.47627], [62.7638, 28.02992], [62.79412, 28.28108], [62.59499, 28.24842], [62.40259, 28.42703], [61.93581, 28.55284], [61.65978, 28.77937], [61.53765, 29.00507], [61.31508, 29.38903], [60.87231, 29.86514], [61.80829, 30.84224], [61.78268, 30.92724], [61.8335, 30.97669], [61.83257, 31.0452], [61.80957, 31.12576], [61.80569, 31.16167], [61.70929, 31.37391], [60.84541, 31.49561], [60.86191, 32.22565], [60.56485, 33.12944], [60.88908, 33.50219], [60.91133, 33.55596], [60.69573, 33.56054], [60.57762, 33.59772], [60.5485, 33.73422], [60.5838, 33.80793], [60.50209, 34.13992], [60.66502, 34.31539], [60.91321, 34.30411], [60.72316, 34.52857], [60.99922, 34.63064], [61.00197, 34.70631], [61.06926, 34.82139], [61.12831, 35.09938], [61.0991, 35.27845], [61.18187, 35.30249], [61.27371, 35.61482], [61.22719, 35.67038], [61.26152, 35.80749], [61.22444, 35.92879], [61.12007, 35.95992], [61.22719, 36.12759], [61.1393, 36.38782], [61.18187, 36.55348], [61.14516, 36.64644], [60.34767, 36.63214], [60.00768, 37.04102], [59.74678, 37.12499], [59.55178, 37.13594], [59.39385, 37.34257], [59.39797, 37.47892], [59.33507, 37.53146], [59.22905, 37.51161], [58.9338, 37.67374], [58.6921, 37.64548], [58.5479, 37.70526], [58.47786, 37.6433], [58.39959, 37.63134], [58.22999, 37.6856], [58.21399, 37.77281], [57.79534, 37.89299], [57.35042, 37.98546], [57.37236, 38.09321], [57.21169, 38.28965], [57.03453, 38.18717], [56.73928, 38.27887], [56.62255, 38.24005], [56.43303, 38.26054], [56.32454, 38.18502], [56.33278, 38.08132], [55.97847, 38.08024], [55.76561, 38.12238], [55.44152, 38.08564], [55.13412, 37.94705], [54.851, 37.75739], [54.77684, 37.62264], [54.81804, 37.61285], [54.77822, 37.51597], [54.67247, 37.43532], [54.58664, 37.45809], [54.36211, 37.34912], [54.24565, 37.32047], [53.89734, 37.3464], [48.88288, 38.43975], [48.84969, 38.45015], [48.81072, 38.44853], [48.78979, 38.45026], [48.70001, 38.40564], [48.62217, 38.40198], [48.58793, 38.45076], [48.45084, 38.61013], [48.3146, 38.59958], [48.24773, 38.71883], [48.02581, 38.82705], [48.01409, 38.90333], [48.07734, 38.91616], [48.08627, 38.94434], [48.28437, 38.97186], [48.33884, 39.03022], [48.31239, 39.09278], [48.15361, 39.19419], [48.12404, 39.25208], [48.15984, 39.30028], [48.37385, 39.37584], [48.34264, 39.42935], [47.98977, 39.70999], [47.84774, 39.66285], [47.50099, 39.49615], [47.38978, 39.45999], [47.31301, 39.37492], [47.05927, 39.24846], [47.05771, 39.20143], [46.95341, 39.13505], [46.92539, 39.16644], [46.83822, 39.13143], [46.75752, 39.03231], [46.53497, 38.86548], [46.34059, 38.92076], [46.20601, 38.85262], [46.14785, 38.84206], [46.06766, 38.87861], [46.00228, 38.87376], [45.94624, 38.89072], [45.90266, 38.87739], [45.83883, 38.90768], [45.65172, 38.95199], [45.6155, 38.94304], [45.6131, 38.964], [45.44966, 38.99243], [45.44811, 39.04927], [45.40452, 39.07224], [45.40148, 39.09007], [45.30489, 39.18333], [45.16168, 39.21952], [45.08751, 39.35052], [45.05932, 39.36435], [44.96746, 39.42998]]]]
+         }
+       }, {
+         type: "Feature",
+         properties: {
+           iso1A2: "IS",
+           iso1A3: "ISL",
+           iso1N3: "352",
+           wikidata: "Q189",
+           nameEn: "Iceland",
+           groups: ["154", "150", "UN"],
+           callingCodes: ["354"]
+         },
+         geometry: {
+           type: "MultiPolygon",
+           coordinates: [[[[-33.15676, 62.62995], [-8.25539, 63.0423], [-15.70914, 69.67442], [-33.15676, 62.62995]]]]
+         }
+       }, {
+         type: "Feature",
+         properties: {
+           iso1A2: "IT",
+           iso1A3: "ITA",
+           iso1N3: "380",
+           wikidata: "Q38",
+           nameEn: "Italy",
+           groups: ["EU", "039", "150", "UN"],
+           callingCodes: ["39"]
+         },
+         geometry: {
+           type: "MultiPolygon",
+           coordinates: [[[[8.95861, 45.96485], [8.97604, 45.96151], [8.97741, 45.98317], [8.96668, 45.98436], [8.95861, 45.96485]]], [[[7.63035, 43.57419], [9.56115, 43.20816], [10.09675, 41.44089], [7.60802, 41.05927], [7.89009, 38.19924], [11.2718, 37.6713], [12.13667, 34.20326], [14.02721, 36.53141], [17.67657, 35.68918], [18.83516, 40.36999], [16.15283, 42.18525], [13.12821, 44.48877], [13.05142, 45.33128], [13.45644, 45.59464], [13.6076, 45.64761], [13.7198, 45.59352], [13.74587, 45.59811], [13.78445, 45.5825], [13.84106, 45.58185], [13.86771, 45.59898], [13.8695, 45.60835], [13.9191, 45.6322], [13.87933, 45.65207], [13.83422, 45.68703], [13.83332, 45.70855], [13.8235, 45.7176], [13.66986, 45.79955], [13.59784, 45.8072], [13.58858, 45.83503], [13.57563, 45.8425], [13.58644, 45.88173], [13.59565, 45.89446], [13.60857, 45.89907], [13.61931, 45.91782], [13.63815, 45.93607], [13.6329, 45.94894], [13.64307, 45.98326], [13.63458, 45.98947], [13.62074, 45.98388], [13.58903, 45.99009], [13.56759, 45.96991], [13.52963, 45.96588], [13.50104, 45.98078], [13.47474, 46.00546], [13.49702, 46.01832], [13.50998, 46.04498], [13.49568, 46.04839], [13.50104, 46.05986], [13.57072, 46.09022], [13.64053, 46.13587], [13.66472, 46.17392], [13.64451, 46.18966], [13.56682, 46.18703], [13.56114, 46.2054], [13.47587, 46.22725], [13.42218, 46.20758], [13.37671, 46.29668], [13.44808, 46.33507], [13.43418, 46.35992], [13.47019, 46.3621], [13.5763, 46.40915], [13.5763, 46.42613], [13.59777, 46.44137], [13.68684, 46.43881], [13.7148, 46.5222], [13.64088, 46.53438], [13.27627, 46.56059], [12.94445, 46.60401], [12.59992, 46.6595], [12.38708, 46.71529], [12.27591, 46.88651], [12.2006, 46.88854], [12.11675, 47.01241], [12.21781, 47.03996], [12.19254, 47.09331], [11.74789, 46.98484], [11.50739, 47.00644], [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.54783, 46.84505], [10.47197, 46.85698], [10.38659, 46.67847], [10.40475, 46.63671], [10.44686, 46.64162], [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.14439, 46.22992], [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.25502, 46.43743], [9.29226, 46.32717], [9.24503, 46.23616], [9.01618, 46.04928], [8.99257, 45.9698], [9.09065, 45.89906], [9.06642, 45.8761], [9.04546, 45.84968], [9.04059, 45.8464], [9.03505, 45.83976], [9.03793, 45.83548], [9.03279, 45.82865], [9.0298, 45.82127], [9.00324, 45.82055], [8.99663, 45.83466], [8.9621, 45.83707], [8.94737, 45.84285], [8.91129, 45.8388], [8.93504, 45.86245], [8.94372, 45.86587], [8.93649, 45.86775], [8.88904, 45.95465], [8.86688, 45.96135], [8.85121, 45.97239], [8.8319, 45.9879], [8.79362, 45.99207], [8.78585, 45.98973], [8.79414, 46.00913], [8.85617, 46.0748], [8.80778, 46.10085], [8.75697, 46.10395], [8.62242, 46.12112], [8.45032, 46.26869], [8.46317, 46.43712], [8.42464, 46.46367], [8.30648, 46.41587], [8.31162, 46.38044], [8.08814, 46.26692], [8.16866, 46.17817], [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], [7.07074, 45.21228], [6.96706, 45.20841], [6.85144, 45.13226], [6.7697, 45.16044], [6.62803, 45.11175], [6.66981, 45.02324], [6.74791, 45.01939], [6.74519, 44.93661], [6.75518, 44.89915], [6.90774, 44.84322], [6.93499, 44.8664], [7.02217, 44.82519], [7.00401, 44.78782], [7.07484, 44.68073], [7.00582, 44.69364], [6.95133, 44.66264], [6.96042, 44.62129], [6.85507, 44.53072], [6.86233, 44.49834], [6.94504, 44.43112], [6.88784, 44.42043], [6.89171, 44.36637], [6.98221, 44.28289], [7.00764, 44.23736], [7.16929, 44.20352], [7.27827, 44.1462], [7.34547, 44.14359], [7.36364, 44.11882], [7.62155, 44.14881], [7.63245, 44.17877], [7.68694, 44.17487], [7.66878, 44.12795], [7.72508, 44.07578], [7.6597, 44.03009], [7.66848, 43.99943], [7.65266, 43.9763], [7.60771, 43.95772], [7.56858, 43.94506], [7.56075, 43.89932], [7.51162, 43.88301], [7.49355, 43.86551], [7.50423, 43.84345], [7.53006, 43.78405], [7.63035, 43.57419]], [[12.45181, 41.90056], [12.44834, 41.90095], [12.44582, 41.90194], [12.44815, 41.90326], [12.44984, 41.90545], [12.45091, 41.90625], [12.45543, 41.90738], [12.45561, 41.90629], [12.45762, 41.9058], [12.45755, 41.9033], [12.45826, 41.90281], [12.45834, 41.90174], [12.4577, 41.90115], [12.45691, 41.90125], [12.45626, 41.90172], [12.45435, 41.90143], [12.45446, 41.90028], [12.45181, 41.90056]], [[12.45648, 43.89369], [12.44184, 43.90498], [12.41641, 43.89991], [12.40935, 43.9024], [12.41233, 43.90956], [12.40733, 43.92379], [12.41551, 43.92984], [12.41165, 43.93769], [12.40506, 43.94325], [12.40415, 43.95485], [12.41414, 43.95273], [12.42005, 43.9578], [12.43662, 43.95698], [12.44684, 43.96597], [12.46205, 43.97463], [12.47853, 43.98052], [12.49406, 43.98492], [12.50678, 43.99113], [12.51463, 43.99122], [12.5154, 43.98508], [12.51064, 43.98165], [12.51109, 43.97201], [12.50622, 43.97131], [12.50875, 43.96198], [12.50655, 43.95796], [12.51427, 43.94897], [12.51553, 43.94096], [12.50496, 43.93017], [12.50269, 43.92363], [12.49724, 43.92248], [12.49247, 43.91774], [12.49429, 43.90973], [12.48771, 43.89706], [12.45648, 43.89369]]]]
+         }
+       }, {
+         type: "Feature",
+         properties: {
+           iso1A2: "JE",
+           iso1A3: "JEY",
+           iso1N3: "832",
+           wikidata: "Q785",
+           nameEn: "Bailiwick of Jersey",
+           country: "GB",
+           groups: ["830", "Q185086", "154", "150", "UN"],
+           driveSide: "left",
+           roadSpeedUnit: "mph",
+           roadHeightUnit: "ft",
+           callingCodes: ["44 01534"]
+         },
+         geometry: {
+           type: "MultiPolygon",
+           coordinates: [[[[-2.00491, 48.86706], [-1.83944, 49.23037], [-2.09454, 49.46288], [-2.65349, 49.15373], [-2.00491, 48.86706]]]]
+         }
+       }, {
+         type: "Feature",
+         properties: {
+           iso1A2: "JM",
+           iso1A3: "JAM",
+           iso1N3: "388",
+           wikidata: "Q766",
+           nameEn: "Jamaica",
+           aliases: ["JA"],
+           groups: ["029", "003", "419", "019", "UN"],
+           driveSide: "left",
+           callingCodes: ["1 876", "1 658"]
+         },
+         geometry: {
+           type: "MultiPolygon",
+           coordinates: [[[[-74.09729, 17.36817], [-78.9741, 19.59515], [-78.34606, 16.57862], [-74.09729, 17.36817]]]]
+         }
+       }, {
+         type: "Feature",
+         properties: {
+           iso1A2: "JO",
+           iso1A3: "JOR",
+           iso1N3: "400",
+           wikidata: "Q810",
+           nameEn: "Jordan",
+           groups: ["145", "142", "UN"],
+           callingCodes: ["962"]
+         },
+         geometry: {
+           type: "MultiPolygon",
+           coordinates: [[[[39.04251, 32.30203], [38.98762, 32.47694], [39.08202, 32.50304], [38.79171, 33.37328], [36.83946, 32.31293], [36.40959, 32.37908], [36.23948, 32.50108], [36.20875, 32.49529], [36.20379, 32.52751], [36.08074, 32.51463], [36.02239, 32.65911], [35.96633, 32.66237], [35.93307, 32.71966], [35.88405, 32.71321], [35.75983, 32.74803], [35.68467, 32.70715], [35.66527, 32.681], [35.61669, 32.67999], [35.59813, 32.65159], [35.56614, 32.64393], [35.57485, 32.48669], [35.55494, 32.42687], [35.55807, 32.38674], [35.57111, 32.21877], [35.52012, 32.04076], [35.54375, 31.96587], [35.52758, 31.9131], [35.55941, 31.76535], [35.47672, 31.49578], [35.40316, 31.25535], [35.43658, 31.12444], [35.41371, 30.95565], [35.33984, 30.8802], [35.33456, 30.81224], [35.29311, 30.71365], [35.21379, 30.60401], [35.19595, 30.50297], [35.16218, 30.43535], [35.19183, 30.34636], [35.14108, 30.07374], [35.02147, 29.66343], [34.98207, 29.58147], [34.97718, 29.54294], [34.92298, 29.45305], [34.8812, 29.36878], [36.07081, 29.18469], [36.50005, 29.49696], [36.75083, 29.86903], [37.4971, 29.99949], [37.66395, 30.33245], [37.99354, 30.49998], [36.99791, 31.50081], [38.99233, 31.99721], [39.29903, 32.23259], [39.26157, 32.35555], [39.04251, 32.30203]]]]
+         }
+       }, {
+         type: "Feature",
+         properties: {
+           iso1A2: "JP",
+           iso1A3: "JPN",
+           iso1N3: "392",
+           wikidata: "Q17",
+           nameEn: "Japan",
+           groups: ["030", "142", "UN"],
+           driveSide: "left",
+           callingCodes: ["81"]
+         },
+         geometry: {
+           type: "MultiPolygon",
+           coordinates: [[[[145.82361, 43.38904], [145.23667, 43.76813], [145.82343, 44.571], [140.9182, 45.92937], [133.61399, 37.41], [129.2669, 34.87122], [122.26612, 25.98197], [123.92912, 17.8782], [155.16731, 23.60141], [145.82361, 43.38904]]]]
+         }
+       }, {
+         type: "Feature",
+         properties: {
+           iso1A2: "KE",
+           iso1A3: "KEN",
+           iso1N3: "404",
+           wikidata: "Q114",
+           nameEn: "Kenya",
+           groups: ["014", "202", "002", "UN"],
+           driveSide: "left",
+           callingCodes: ["254"]
+         },
+         geometry: {
+           type: "MultiPolygon",
+           coordinates: [[[[35.9419, 4.61933], [35.51424, 4.61643], [35.42366, 4.76969], [35.47843, 4.91872], [35.30992, 4.90402], [35.34151, 5.02364], [34.47601, 4.72162], [33.9873, 4.23316], [34.06046, 4.15235], [34.15429, 3.80464], [34.45815, 3.67385], [34.44922, 3.51627], [34.39112, 3.48802], [34.41794, 3.44342], [34.40006, 3.37949], [34.45815, 3.18319], [34.56242, 3.11478], [34.60114, 2.93034], [34.65774, 2.8753], [34.73967, 2.85447], [34.78137, 2.76223], [34.77244, 2.70272], [34.95267, 2.47209], [34.90947, 2.42447], [34.98692, 1.97348], [34.9899, 1.6668], [34.92734, 1.56109], [34.87819, 1.5596], [34.7918, 1.36752], [34.82606, 1.30944], [34.82606, 1.26626], [34.80223, 1.22754], [34.67562, 1.21265], [34.58029, 1.14712], [34.57427, 1.09868], [34.52369, 1.10692], [34.43349, 0.85254], [34.40041, 0.80266], [34.31516, 0.75693], [34.27345, 0.63182], [34.20196, 0.62289], [34.13493, 0.58118], [34.11408, 0.48884], [34.08727, 0.44713], [34.10067, 0.36372], [33.90936, 0.10581], [33.98449, -0.13079], [33.9264, -0.54188], [33.93107, -0.99298], [34.02286, -1.00779], [34.03084, -1.05101], [34.0824, -1.02264], [37.67199, -3.06222], [37.71745, -3.304], [37.5903, -3.42735], [37.63099, -3.50723], [37.75036, -3.54243], [37.81321, -3.69179], [39.21631, -4.67835], [39.44306, -4.93877], [39.62121, -4.68136], [41.75542, -1.85308], [41.56362, -1.66375], [41.56, -1.59812], [41.00099, -0.83068], [40.98767, 2.82959], [41.31368, 3.14314], [41.89488, 3.97375], [41.1754, 3.94079], [40.77498, 4.27683], [39.86043, 3.86974], [39.76808, 3.67058], [39.58339, 3.47434], [39.55132, 3.39634], [39.51551, 3.40895], [39.49444, 3.45521], [39.19954, 3.47834], [39.07736, 3.5267], [38.91938, 3.51198], [38.52336, 3.62551], [38.45812, 3.60445], [38.14168, 3.62487], [37.07724, 4.33503], [36.84474, 4.44518], [36.03924, 4.44406], [35.95449, 4.53244], [35.9419, 4.61933]]]]
+         }
+       }, {
+         type: "Feature",
+         properties: {
+           iso1A2: "KG",
+           iso1A3: "KGZ",
+           iso1N3: "417",
+           wikidata: "Q813",
+           nameEn: "Kyrgyzstan",
+           groups: ["143", "142", "UN"],
+           callingCodes: ["996"]
+         },
+         geometry: {
+           type: "MultiPolygon",
+           coordinates: [[[[74.88756, 42.98612], [74.75, 42.99029], [74.70331, 43.02519], [74.64615, 43.05881], [74.57491, 43.13702], [74.22489, 43.24657], [73.55634, 43.03071], [73.50992, 42.82356], [73.44393, 42.43098], [71.88792, 42.83578], [71.62405, 42.76613], [71.53272, 42.8014], [71.2724, 42.77853], [71.22785, 42.69248], [71.17807, 42.67381], [71.15232, 42.60486], [70.97717, 42.50147], [70.85973, 42.30188], [70.94483, 42.26238], [71.13263, 42.28356], [71.28719, 42.18033], [70.69777, 41.92554], [70.17682, 41.5455], [70.48909, 41.40335], [70.67586, 41.47953], [70.78572, 41.36419], [70.77885, 41.24813], [70.86263, 41.23833], [70.9615, 41.16393], [71.02193, 41.19494], [71.11806, 41.15359], [71.25813, 41.18796], [71.27187, 41.11015], [71.34877, 41.16807], [71.40198, 41.09436], [71.46148, 41.13958], [71.43814, 41.19644], [71.46688, 41.31883], [71.57227, 41.29175], [71.6787, 41.42111], [71.65914, 41.49599], [71.73054, 41.54713], [71.71132, 41.43012], [71.76625, 41.4466], [71.83914, 41.3546], [71.91457, 41.2982], [71.85964, 41.19081], [72.07249, 41.11739], [72.10745, 41.15483], [72.16433, 41.16483], [72.17594, 41.15522], [72.14864, 41.13363], [72.1792, 41.10621], [72.21061, 41.05607], [72.17594, 41.02377], [72.18339, 40.99571], [72.324, 41.03381], [72.34026, 41.04539], [72.34757, 41.06104], [72.36138, 41.04384], [72.38511, 41.02785], [72.45206, 41.03018], [72.48742, 40.97136], [72.55109, 40.96046], [72.59136, 40.86947], [72.68157, 40.84942], [72.84291, 40.85512], [72.94454, 40.8094], [73.01869, 40.84681], [73.13267, 40.83512], [73.13412, 40.79122], [73.0612, 40.76678], [72.99133, 40.76457], [72.93296, 40.73089], [72.8722, 40.71111], [72.85372, 40.7116], [72.84754, 40.67229], [72.80137, 40.67856], [72.74866, 40.60873], [72.74894, 40.59592], [72.75982, 40.57273], [72.74862, 40.57131], [72.74768, 40.58051], [72.73995, 40.58409], [72.69579, 40.59778], [72.66713, 40.59076], [72.66713, 40.5219], [72.47795, 40.5532], [72.40517, 40.61917], [72.34406, 40.60144], [72.41714, 40.55736], [72.38384, 40.51535], [72.41513, 40.50856], [72.44191, 40.48222], [72.40346, 40.4007], [72.24368, 40.46091], [72.18648, 40.49893], [71.96401, 40.31907], [72.05464, 40.27586], [71.85002, 40.25647], [71.82646, 40.21872], [71.73054, 40.14818], [71.71719, 40.17886], [71.69621, 40.18492], [71.70569, 40.20391], [71.68386, 40.26984], [71.61931, 40.26775], [71.61725, 40.20615], [71.51549, 40.22986], [71.51215, 40.26943], [71.4246, 40.28619], [71.36663, 40.31593], [71.13042, 40.34106], [71.05901, 40.28765], [70.95789, 40.28761], [70.9818, 40.22392], [70.80495, 40.16813], [70.7928, 40.12797], [70.65827, 40.0981], [70.65946, 39.9878], [70.58912, 39.95211], [70.55033, 39.96619], [70.47557, 39.93216], [70.57384, 39.99394], [70.58297, 40.00891], [70.01283, 40.23288], [69.67001, 40.10639], [69.64704, 40.12165], [69.57615, 40.10524], [69.55555, 40.12296], [69.53794, 40.11833], [69.53855, 40.0887], [69.5057, 40.03277], [69.53615, 39.93991], [69.43557, 39.92877], [69.43134, 39.98431], [69.35649, 40.01994], [69.26938, 39.8127], [69.3594, 39.52516], [69.68677, 39.59281], [69.87491, 39.53882], [70.11111, 39.58223], [70.2869, 39.53141], [70.44757, 39.60128], [70.64087, 39.58792], [70.7854, 39.38933], [71.06418, 39.41586], [71.08752, 39.50704], [71.49814, 39.61397], [71.55856, 39.57588], [71.5517, 39.45722], [71.62688, 39.44056], [71.76816, 39.45456], [71.80164, 39.40631], [71.7522, 39.32031], [71.79202, 39.27355], [71.90601, 39.27674], [72.04059, 39.36704], [72.09689, 39.26823], [72.17242, 39.2661], [72.23834, 39.17248], [72.33173, 39.33093], [72.62027, 39.39696], [72.85934, 39.35116], [73.18454, 39.35536], [73.31912, 39.38615], [73.45096, 39.46677], [73.59831, 39.46425], [73.87018, 39.47879], [73.94683, 39.60733], [73.92354, 39.69565], [73.9051, 39.75073], [73.83006, 39.76136], [73.97049, 40.04378], [74.25533, 40.13191], [74.35063, 40.09742], [74.69875, 40.34668], [74.85996, 40.32857], [74.78168, 40.44886], [74.82013, 40.52197], [75.08243, 40.43945], [75.22834, 40.45382], [75.5854, 40.66874], [75.69663, 40.28642], [75.91361, 40.2948], [75.96168, 40.38064], [76.33659, 40.3482], [76.5261, 40.46114], [76.75681, 40.95354], [76.99302, 41.0696], [77.28004, 41.0033], [77.3693, 41.0375], [77.52723, 41.00227], [77.76206, 41.01574], [77.81287, 41.14307], [78.12873, 41.23091], [78.15757, 41.38565], [78.3732, 41.39603], [79.92977, 42.04113], [80.17842, 42.03211], [80.17807, 42.21166], [79.97364, 42.42816], [79.52921, 42.44778], [79.19763, 42.804], [78.91502, 42.76839], [78.48469, 42.89649], [75.82823, 42.94848], [75.72174, 42.79672], [75.29966, 42.86183], [75.22619, 42.85528], [74.88756, 42.98612]], [[70.74189, 39.86319], [70.63105, 39.77923], [70.59667, 39.83542], [70.54998, 39.85137], [70.52631, 39.86989], [70.53651, 39.89155], [70.74189, 39.86319]], [[71.86463, 39.98598], [71.84316, 39.95582], [71.7504, 39.93701], [71.71511, 39.96348], [71.78838, 40.01404], [71.86463, 39.98598]], [[71.21139, 40.03369], [71.1427, 39.95026], [71.23067, 39.93581], [71.16101, 39.88423], [71.10531, 39.91354], [71.04979, 39.89808], [71.10501, 39.95568], [71.09063, 39.99], [71.11668, 39.99291], [71.11037, 40.01984], [71.01035, 40.05481], [71.00236, 40.18154], [71.06305, 40.1771], [71.12218, 40.03052], [71.21139, 40.03369]]]]
+         }
+       }, {
+         type: "Feature",
+         properties: {
+           iso1A2: "KH",
+           iso1A3: "KHM",
+           iso1N3: "116",
+           wikidata: "Q424",
+           nameEn: "Cambodia",
+           groups: ["035", "142", "UN"],
+           callingCodes: ["855"]
+         },
+         geometry: {
+           type: "MultiPolygon",
+           coordinates: [[[[105.87328, 11.55953], [105.81645, 11.56876], [105.80867, 11.60536], [105.8507, 11.66635], [105.88962, 11.67854], [105.95188, 11.63738], [106.00792, 11.7197], [106.02038, 11.77457], [106.06708, 11.77761], [106.13158, 11.73283], [106.18539, 11.75171], [106.26478, 11.72122], [106.30525, 11.67549], [106.37219, 11.69836], [106.44691, 11.66787], [106.45158, 11.68616], [106.41577, 11.76999], [106.44535, 11.8279], [106.44068, 11.86294], [106.4687, 11.86751], [106.4111, 11.97413], [106.70687, 11.96956], [106.79405, 12.0807], [106.92325, 12.06548], [106.99953, 12.08983], [107.15831, 12.27547], [107.34511, 12.33327], [107.42917, 12.24657], [107.4463, 12.29373], [107.55059, 12.36824], [107.5755, 12.52177], [107.55993, 12.7982], [107.49611, 12.88926], [107.49144, 13.01215], [107.62843, 13.3668], [107.61909, 13.52577], [107.53503, 13.73908], [107.45252, 13.78897], [107.46498, 13.91593], [107.44318, 13.99751], [107.38247, 13.99147], [107.35757, 14.02319], [107.37158, 14.07906], [107.33577, 14.11832], [107.40427, 14.24509], [107.39493, 14.32655], [107.44941, 14.41552], [107.48521, 14.40346], [107.52569, 14.54665], [107.52102, 14.59034], [107.55371, 14.628], [107.54361, 14.69092], [107.47238, 14.61523], [107.44435, 14.52785], [107.37897, 14.54443], [107.3276, 14.58812], [107.29803, 14.58963], [107.26534, 14.54292], [107.256, 14.48716], [107.21241, 14.48716], [107.17038, 14.41782], [107.09722, 14.3937], [107.03962, 14.45099], [107.04585, 14.41782], [106.98825, 14.36806], [106.9649, 14.3198], [106.90574, 14.33639], [106.8497, 14.29416], [106.80767, 14.31226], [106.73762, 14.42687], [106.63333, 14.44194], [106.59908, 14.50977], [106.57106, 14.50525], [106.54148, 14.59565], [106.50723, 14.58963], [106.45898, 14.55045], [106.47766, 14.50977], [106.43874, 14.52032], [106.40916, 14.45249], [106.32355, 14.44043], [106.25194, 14.48415], [106.21302, 14.36203], [106.00131, 14.36957], [105.99509, 14.32734], [106.02311, 14.30623], [106.04801, 14.20363], [106.10872, 14.18401], [106.11962, 14.11307], [106.18656, 14.06324], [106.16632, 14.01794], [106.10094, 13.98471], [106.10405, 13.9137], [105.90791, 13.92881], [105.78182, 14.02247], [105.78338, 14.08438], [105.5561, 14.15684], [105.44869, 14.10703], [105.36775, 14.09948], [105.2759, 14.17496], [105.20894, 14.34967], [105.17748, 14.34432], [105.14012, 14.23873], [105.08408, 14.20402], [105.02804, 14.23722], [104.97667, 14.38806], [104.69335, 14.42726], [104.55014, 14.36091], [104.27616, 14.39861], [103.93836, 14.3398], [103.70175, 14.38052], [103.71109, 14.4348], [103.53518, 14.42575], [103.39353, 14.35639], [103.16469, 14.33075], [102.93275, 14.19044], [102.91251, 14.01531], [102.77864, 13.93374], [102.72727, 13.77806], [102.56848, 13.69366], [102.5481, 13.6589], [102.58635, 13.6286], [102.62483, 13.60883], [102.57573, 13.60461], [102.5358, 13.56933], [102.44601, 13.5637], [102.36859, 13.57488], [102.33828, 13.55613], [102.361, 13.50551], [102.35563, 13.47307], [102.35692, 13.38274], [102.34611, 13.35618], [102.36001, 13.31142], [102.36146, 13.26006], [102.43422, 13.09061], [102.46011, 13.08057], [102.52275, 12.99813], [102.48694, 12.97537], [102.49335, 12.92711], [102.53053, 12.77506], [102.4994, 12.71736], [102.51963, 12.66117], [102.57567, 12.65358], [102.7796, 12.43781], [102.78116, 12.40284], [102.73134, 12.37091], [102.70176, 12.1686], [102.77026, 12.06815], [102.78427, 11.98746], [102.83957, 11.8519], [102.90973, 11.75613], [102.91449, 11.65512], [102.52395, 11.25257], [102.47649, 9.66162], [103.99198, 10.48391], [104.43778, 10.42386], [104.47963, 10.43046], [104.49869, 10.4057], [104.59018, 10.53073], [104.87933, 10.52833], [104.95094, 10.64003], [105.09571, 10.72722], [105.02722, 10.89236], [105.08326, 10.95656], [105.11449, 10.96332], [105.34011, 10.86179], [105.42884, 10.96878], [105.50045, 10.94586], [105.77751, 11.03671], [105.86376, 10.89839], [105.84603, 10.85873], [105.93403, 10.83853], [105.94535, 10.9168], [106.06708, 10.8098], [106.18539, 10.79451], [106.14301, 10.98176], [106.20095, 10.97795], [106.1757, 11.07301], [106.1527, 11.10476], [106.10444, 11.07879], [105.86782, 11.28343], [105.88962, 11.43605], [105.87328, 11.55953]]]]
+         }
+       }, {
+         type: "Feature",
+         properties: {
+           iso1A2: "KI",
+           iso1A3: "KIR",
+           iso1N3: "296",
+           wikidata: "Q710",
+           nameEn: "Kiribati",
+           groups: ["057", "009", "UN"],
+           driveSide: "left",
+           callingCodes: ["686"]
+         },
+         geometry: {
+           type: "MultiPolygon",
+           coordinates: [[[[169, 3.9], [169, -3.5], [178, -3.5], [178, 3.9], [169, 3.9]]], [[[-161.06795, 5.2462], [-158.12991, -1.86122], [-175.33482, -1.40631], [-175.31804, -7.54825], [-156.50903, -7.4975], [-156.48634, -15.52824], [-135.59706, -4.70473], [-161.06795, 5.2462]]]]
+         }
+       }, {
+         type: "Feature",
+         properties: {
+           iso1A2: "KM",
+           iso1A3: "COM",
+           iso1N3: "174",
+           wikidata: "Q970",
+           nameEn: "Comoros",
+           groups: ["014", "202", "002", "UN"],
+           callingCodes: ["269"]
+         },
+         geometry: {
+           type: "MultiPolygon",
+           coordinates: [[[[42.63904, -10.02522], [43.28731, -13.97126], [45.4971, -11.75965], [42.63904, -10.02522]]]]
+         }
+       }, {
+         type: "Feature",
+         properties: {
+           iso1A2: "KN",
+           iso1A3: "KNA",
+           iso1N3: "659",
+           wikidata: "Q763",
+           nameEn: "St. Kitts and Nevis",
+           groups: ["029", "003", "419", "019", "UN"],
+           driveSide: "left",
+           roadSpeedUnit: "mph",
+           callingCodes: ["1 869"]
+         },
+         geometry: {
+           type: "MultiPolygon",
+           coordinates: [[[[-62.29333, 17.43155], [-62.76692, 17.64353], [-63.09677, 17.21372], [-62.63813, 16.65446], [-62.29333, 17.43155]]]]
+         }
+       }, {
+         type: "Feature",
+         properties: {
+           iso1A2: "KP",
+           iso1A3: "PRK",
+           iso1N3: "408",
+           wikidata: "Q423",
+           nameEn: "North Korea",
+           groups: ["030", "142", "UN"],
+           callingCodes: ["850"]
+         },
+         geometry: {
+           type: "MultiPolygon",
+           coordinates: [[[[130.26095, 42.9027], [130.09764, 42.91425], [130.12957, 42.98361], [129.96409, 42.97306], [129.95082, 43.01051], [129.8865, 43.00395], [129.85261, 42.96494], [129.83277, 42.86746], [129.80719, 42.79218], [129.7835, 42.76521], [129.77183, 42.69435], [129.75294, 42.59409], [129.72541, 42.43739], [129.60482, 42.44461], [129.54701, 42.37254], [129.42882, 42.44702], [129.28541, 42.41574], [129.22423, 42.3553], [129.22285, 42.26491], [129.15178, 42.17224], [128.96068, 42.06657], [128.94007, 42.03537], [128.04487, 42.01769], [128.15119, 41.74568], [128.30716, 41.60322], [128.20061, 41.40895], [128.18546, 41.41279], [128.12967, 41.37931], [128.03311, 41.39232], [128.02633, 41.42103], [127.92943, 41.44291], [127.29712, 41.49473], [127.17841, 41.59714], [126.90729, 41.79955], [126.60631, 41.65565], [126.53189, 41.35206], [126.242, 41.15454], [126.00335, 40.92835], [125.76869, 40.87908], [125.71172, 40.85223], [124.86913, 40.45387], [124.40719, 40.13655], [124.38556, 40.11047], [124.3322, 40.05573], [124.37089, 40.03004], [124.35029, 39.95639], [124.23201, 39.9248], [124.17532, 39.8232], [123.90497, 38.79949], [123.85601, 37.49093], [124.67666, 38.05679], [124.84224, 37.977], [124.87921, 37.80827], [125.06408, 37.66334], [125.37112, 37.62643], [125.81159, 37.72949], [126.13074, 37.70512], [126.18776, 37.74728], [126.19097, 37.81462], [126.24402, 37.83113], [126.43239, 37.84095], [126.46818, 37.80873], [126.56709, 37.76857], [126.59918, 37.76364], [126.66067, 37.7897], [126.68793, 37.83728], [126.68793, 37.9175], [126.67023, 37.95852], [126.84961, 38.0344], [126.88106, 38.10246], [126.95887, 38.1347], [126.95338, 38.17735], [127.04479, 38.25518], [127.15749, 38.30722], [127.38727, 38.33227], [127.49672, 38.30647], [127.55013, 38.32257], [128.02917, 38.31861], [128.27652, 38.41657], [128.31105, 38.58462], [128.37487, 38.62345], [128.65655, 38.61914], [131.95041, 41.5445], [130.65022, 42.32281], [130.66367, 42.38024], [130.64181, 42.41422], [130.60805, 42.4317], [130.56835, 42.43281], [130.55143, 42.52158], [130.50123, 42.61636], [130.44361, 42.54849], [130.41826, 42.6011], [130.2385, 42.71127], [130.23068, 42.80125], [130.26095, 42.9027]]]]
+         }
+       }, {
+         type: "Feature",
+         properties: {
+           iso1A2: "KR",
+           iso1A3: "KOR",
+           iso1N3: "410",
+           wikidata: "Q884",
+           nameEn: "South Korea",
+           groups: ["030", "142", "UN"],
+           callingCodes: ["82"]
+         },
+         geometry: {
+           type: "MultiPolygon",
+           coordinates: [[[[133.11729, 37.53115], [128.65655, 38.61914], [128.37487, 38.62345], [128.31105, 38.58462], [128.27652, 38.41657], [128.02917, 38.31861], [127.55013, 38.32257], [127.49672, 38.30647], [127.38727, 38.33227], [127.15749, 38.30722], [127.04479, 38.25518], [126.95338, 38.17735], [126.95887, 38.1347], [126.88106, 38.10246], [126.84961, 38.0344], [126.67023, 37.95852], [126.68793, 37.9175], [126.68793, 37.83728], [126.66067, 37.7897], [126.59918, 37.76364], [126.56709, 37.76857], [126.46818, 37.80873], [126.43239, 37.84095], [126.24402, 37.83113], [126.19097, 37.81462], [126.18776, 37.74728], [126.13074, 37.70512], [125.81159, 37.72949], [125.37112, 37.62643], [125.06408, 37.66334], [124.87921, 37.80827], [124.84224, 37.977], [124.67666, 38.05679], [123.85601, 37.49093], [122.80525, 33.30571], [125.99728, 32.63328], [129.2669, 34.87122], [133.11729, 37.53115]]]]
+         }
+       }, {
+         type: "Feature",
+         properties: {
+           iso1A2: "KW",
+           iso1A3: "KWT",
+           iso1N3: "414",
+           wikidata: "Q817",
+           nameEn: "Kuwait",
+           groups: ["145", "142", "UN"],
+           callingCodes: ["965"]
+         },
+         geometry: {
+           type: "MultiPolygon",
+           coordinates: [[[[49.00421, 28.81495], [48.59531, 29.66815], [48.40479, 29.85763], [48.17332, 30.02448], [48.06782, 30.02906], [48.01114, 29.98906], [47.7095, 30.10453], [47.37192, 30.10421], [47.15166, 30.01044], [46.89695, 29.50584], [46.5527, 29.10283], [47.46202, 29.0014], [47.58376, 28.83382], [47.59863, 28.66798], [47.70561, 28.5221], [48.42991, 28.53628], [49.00421, 28.81495]]]]
+         }
+       }, {
+         type: "Feature",
+         properties: {
+           iso1A2: "KY",
+           iso1A3: "CYM",
+           iso1N3: "136",
+           wikidata: "Q5785",
+           nameEn: "Cayman Islands",
+           country: "GB",
+           groups: ["BOTS", "029", "003", "419", "019", "UN"],
+           driveSide: "left",
+           roadSpeedUnit: "mph",
+           roadHeightUnit: "ft",
+           callingCodes: ["1 345"]
+         },
+         geometry: {
+           type: "MultiPolygon",
+           coordinates: [[[[-82.11509, 19.60401], [-80.36068, 18.11751], [-79.32727, 20.06742], [-82.11509, 19.60401]]]]
+         }
+       }, {
+         type: "Feature",
+         properties: {
+           iso1A2: "KZ",
+           iso1A3: "KAZ",
+           iso1N3: "398",
+           wikidata: "Q232",
+           nameEn: "Kazakhstan",
+           groups: ["143", "142", "UN"],
+           callingCodes: ["7"]
+         },
+         geometry: {
+           type: "MultiPolygon",
+           coordinates: [[[[68.90865, 55.38148], [68.19206, 55.18823], [68.26661, 55.09226], [68.21308, 54.98645], [65.20174, 54.55216], [65.24663, 54.35721], [65.11033, 54.33028], [64.97216, 54.4212], [63.97686, 54.29763], [64.02715, 54.22679], [63.91224, 54.20013], [63.80604, 54.27079], [62.58651, 54.05871], [62.56876, 53.94047], [62.45931, 53.90737], [62.38535, 54.03961], [62.00966, 54.04134], [62.03913, 53.94768], [61.65318, 54.02445], [61.56941, 53.95703], [61.47603, 54.08048], [61.3706, 54.08464], [61.26863, 53.92797], [60.99796, 53.93699], [61.14283, 53.90063], [61.22574, 53.80268], [60.90626, 53.62937], [61.55706, 53.57144], [61.57185, 53.50112], [61.37957, 53.45887], [61.29082, 53.50992], [61.14291, 53.41481], [61.19024, 53.30536], [62.14574, 53.09626], [62.12799, 52.99133], [62.0422, 52.96105], [61.23462, 53.03227], [61.05842, 52.92217], [60.71989, 52.75923], [60.71693, 52.66245], [60.84118, 52.63912], [60.84709, 52.52228], [60.98021, 52.50068], [61.05417, 52.35096], [60.78201, 52.22067], [60.72581, 52.15538], [60.48915, 52.15175], [60.19925, 51.99173], [59.99809, 51.98263], [60.09867, 51.87135], [60.50986, 51.7964], [60.36787, 51.66815], [60.5424, 51.61675], [60.92401, 51.61124], [60.95655, 51.48615], [61.50677, 51.40687], [61.55114, 51.32746], [61.6813, 51.25716], [61.56889, 51.23679], [61.4431, 50.80679], [60.81833, 50.6629], [60.31914, 50.67705], [60.17262, 50.83312], [60.01288, 50.8163], [59.81172, 50.54451], [59.51886, 50.49937], [59.48928, 50.64216], [58.87974, 50.70852], [58.3208, 51.15151], [57.75578, 51.13852], [57.74986, 50.93017], [57.44221, 50.88354], [57.17302, 51.11253], [56.17906, 50.93204], [56.11398, 50.7471], [55.67774, 50.54508], [54.72067, 51.03261], [54.56685, 51.01958], [54.71476, 50.61214], [54.55797, 50.52006], [54.41894, 50.61214], [54.46331, 50.85554], [54.12248, 51.11542], [53.69299, 51.23466], [53.46165, 51.49445], [52.54329, 51.48444], [52.36119, 51.74161], [51.8246, 51.67916], [51.77431, 51.49536], [51.301, 51.48799], [51.26254, 51.68466], [50.59695, 51.61859], [50.26859, 51.28677], [49.97277, 51.2405], [49.76866, 51.11067], [49.39001, 51.09396], [49.41959, 50.85927], [49.12673, 50.78639], [48.86936, 50.61589], [48.57946, 50.63278], [48.90782, 50.02281], [48.68352, 49.89546], [48.42564, 49.82283], [48.24519, 49.86099], [48.10044, 50.09242], [47.58551, 50.47867], [47.30448, 50.30894], [47.34589, 50.09308], [47.18319, 49.93721], [46.9078, 49.86707], [46.78398, 49.34026], [47.04658, 49.19834], [47.00857, 49.04921], [46.78392, 48.95352], [46.49011, 48.43019], [47.11516, 48.27188], [47.12107, 47.83687], [47.38731, 47.68176], [47.41689, 47.83687], [47.64973, 47.76559], [48.15348, 47.74545], [48.45173, 47.40818], [48.52326, 47.4102], [49.01136, 46.72716], [48.51142, 46.69268], [48.54988, 46.56267], [49.16518, 46.38542], [49.32259, 46.26944], [49.88945, 46.04554], [49.2134, 44.84989], [52.26048, 41.69249], [52.47884, 41.78034], [52.97575, 42.1308], [54.20635, 42.38477], [54.95182, 41.92424], [55.45471, 41.25609], [56.00314, 41.32584], [55.97584, 44.99322], [55.97584, 44.99328], [55.97584, 44.99338], [55.97584, 44.99343], [55.97584, 44.99348], [55.97584, 44.99353], [55.97584, 44.99359], [55.97584, 44.99369], [55.97584, 44.99374], [55.97584, 44.99384], [55.97584, 44.9939], [55.97584, 44.994], [55.97584, 44.99405], [55.97584, 44.99415], [55.97584, 44.99421], [55.97584, 44.99426], [55.97584, 44.99431], [55.97584, 44.99436], [55.97584, 44.99441], [55.97594, 44.99446], [55.97605, 44.99452], [55.97605, 44.99457], [55.97605, 44.99462], [55.97605, 44.99467], [55.97605, 44.99477], [55.97615, 44.99477], [55.97615, 44.99483], [55.97615, 44.99493], [55.97615, 44.99498], [55.97615, 44.99503], [55.97615, 44.99508], [55.97625, 44.99514], [55.97636, 44.99519], [55.97636, 44.99524], [55.97646, 44.99529], [55.97646, 44.99534], [55.97656, 44.99539], [55.97667, 44.99545], [55.97677, 44.9955], [55.97677, 44.99555], [55.97677, 44.9956], [55.97687, 44.9956], [55.97698, 44.99565], [55.97698, 44.9957], [55.97708, 44.99576], [55.97718, 44.99581], [55.97729, 44.99586], [55.97739, 44.99586], [55.97739, 44.99591], [55.97749, 44.99591], [55.9776, 44.99591], [55.9777, 44.99596], [55.9777, 44.99601], [55.9778, 44.99607], [55.97791, 44.99607], [55.97801, 44.99607], [55.97801, 44.99612], [55.97811, 44.99617], [55.97822, 44.99617], [55.97832, 44.99622], [55.97842, 44.99622], [58.59711, 45.58671], [61.01475, 44.41383], [62.01711, 43.51008], [63.34656, 43.64003], [64.53885, 43.56941], [64.96464, 43.74748], [65.18666, 43.48835], [65.53277, 43.31856], [65.85194, 42.85481], [66.09482, 42.93426], [66.00546, 41.94455], [66.53302, 41.87388], [66.69129, 41.1311], [67.9644, 41.14611], [67.98511, 41.02794], [68.08273, 41.08148], [68.1271, 41.0324], [67.96736, 40.83798], [68.49983, 40.56437], [68.63, 40.59358], [68.58444, 40.91447], [68.49983, 40.99669], [68.62221, 41.03019], [68.65662, 40.93861], [68.73945, 40.96989], [68.7217, 41.05025], [69.01308, 41.22804], [69.05006, 41.36183], [69.15137, 41.43078], [69.17701, 41.43769], [69.18528, 41.45175], [69.20439, 41.45391], [69.22671, 41.46298], [69.23332, 41.45847], [69.25059, 41.46693], [69.29778, 41.43673], [69.35554, 41.47211], [69.37468, 41.46555], [69.45081, 41.46246], [69.39485, 41.51518], [69.45751, 41.56863], [69.49545, 41.545], [70.94483, 42.26238], [70.85973, 42.30188], [70.97717, 42.50147], [71.15232, 42.60486], [71.17807, 42.67381], [71.22785, 42.69248], [71.2724, 42.77853], [71.53272, 42.8014], [71.62405, 42.76613], [71.88792, 42.83578], [73.44393, 42.43098], [73.50992, 42.82356], [73.55634, 43.03071], [74.22489, 43.24657], [74.57491, 43.13702], [74.64615, 43.05881], [74.70331, 43.02519], [74.75, 42.99029], [74.88756, 42.98612], [75.22619, 42.85528], [75.29966, 42.86183], [75.72174, 42.79672], [75.82823, 42.94848], [78.48469, 42.89649], [78.91502, 42.76839], [79.19763, 42.804], [79.52921, 42.44778], [79.97364, 42.42816], [80.17807, 42.21166], [80.26841, 42.23797], [80.16892, 42.61137], [80.26886, 42.8366], [80.38169, 42.83142], [80.58999, 42.9011], [80.3735, 43.01557], [80.62913, 43.141], [80.78817, 43.14235], [80.77771, 43.30065], [80.69718, 43.32589], [80.75156, 43.44948], [80.40031, 44.10986], [80.40229, 44.23319], [80.38384, 44.63073], [79.8987, 44.89957], [80.11169, 45.03352], [81.73278, 45.3504], [82.51374, 45.1755], [82.58474, 45.40027], [82.21792, 45.56619], [83.04622, 47.19053], [83.92184, 46.98912], [84.73077, 47.01394], [84.93995, 46.87399], [85.22443, 47.04816], [85.54294, 47.06171], [85.69696, 47.2898], [85.61067, 47.49753], [85.5169, 48.05493], [85.73581, 48.3939], [86.38069, 48.46064], [86.75343, 48.70331], [86.73568, 48.99918], [86.87238, 49.12432], [87.28386, 49.11626], [87.31465, 49.23603], [87.03071, 49.25142], [86.82606, 49.51796], [86.61307, 49.60239], [86.79056, 49.74787], [86.63674, 49.80136], [86.18709, 49.50259], [85.24047, 49.60239], [84.99198, 50.06793], [84.29385, 50.27257], [83.8442, 50.87375], [83.14607, 51.00796], [82.55443, 50.75412], [81.94999, 50.79307], [81.46581, 50.77658], [81.41248, 50.97524], [81.06091, 50.94833], [81.16999, 51.15662], [80.80318, 51.28262], [80.44819, 51.20855], [80.4127, 50.95581], [80.08138, 50.77658], [79.11255, 52.01171], [77.90383, 53.29807], [76.54243, 53.99329], [76.44076, 54.16017], [76.82266, 54.1798], [76.91052, 54.4677], [75.3668, 54.07439], [75.43398, 53.98652], [75.07405, 53.80831], [73.39218, 53.44623], [73.25412, 53.61532], [73.68921, 53.86522], [73.74778, 54.07194], [73.37963, 53.96132], [72.71026, 54.1161], [72.43415, 53.92685], [72.17477, 54.36303], [71.96141, 54.17736], [71.10379, 54.13326], [71.08706, 54.33376], [71.24185, 54.64965], [71.08288, 54.71253], [70.96009, 55.10558], [70.76493, 55.3027], [70.19179, 55.1476], [69.74917, 55.35545], [69.34224, 55.36344], [68.90865, 55.38148]]]]
+         }
+       }, {
+         type: "Feature",
+         properties: {
+           iso1A2: "LA",
+           iso1A3: "LAO",
+           iso1N3: "418",
+           wikidata: "Q819",
+           nameEn: "Laos",
+           groups: ["035", "142", "UN"],
+           callingCodes: ["856"]
+         },
+         geometry: {
+           type: "MultiPolygon",
+           coordinates: [[[[102.1245, 22.43372], [102.03633, 22.46164], [101.98487, 22.42766], [101.91344, 22.44417], [101.90714, 22.38688], [101.86828, 22.38397], [101.7685, 22.50337], [101.68973, 22.46843], [101.61306, 22.27515], [101.56789, 22.28876], [101.53638, 22.24794], [101.60675, 22.13513], [101.57525, 22.13026], [101.62566, 21.96574], [101.7791, 21.83019], [101.74555, 21.72852], [101.83257, 21.61562], [101.80001, 21.57461], [101.7475, 21.5873], [101.7727, 21.51794], [101.74224, 21.48276], [101.74014, 21.30967], [101.84412, 21.25291], [101.83887, 21.20983], [101.76745, 21.21571], [101.79266, 21.19025], [101.7622, 21.14813], [101.70548, 21.14911], [101.66977, 21.20004], [101.60886, 21.17947], [101.59491, 21.18621], [101.6068, 21.23329], [101.54563, 21.25668], [101.29326, 21.17254], [101.2229, 21.23271], [101.26912, 21.36482], [101.19349, 21.41959], [101.2124, 21.56422], [101.15156, 21.56129], [101.16198, 21.52808], [101.00234, 21.39612], [100.80173, 21.2934], [100.72716, 21.31786], [100.63578, 21.05639], [100.55281, 21.02796], [100.50974, 20.88574], [100.64628, 20.88279], [100.60112, 20.8347], [100.51079, 20.82194], [100.36375, 20.82783], [100.1957, 20.68247], [100.08404, 20.36626], [100.09999, 20.31614], [100.09337, 20.26293], [100.11785, 20.24787], [100.1712, 20.24324], [100.16668, 20.2986], [100.22076, 20.31598], [100.25769, 20.3992], [100.33383, 20.4028], [100.37439, 20.35156], [100.41473, 20.25625], [100.44992, 20.23644], [100.4537, 20.19971], [100.47567, 20.19133], [100.51052, 20.14928], [100.55218, 20.17741], [100.58808, 20.15791], [100.5094, 19.87904], [100.398, 19.75047], [100.49604, 19.53504], [100.58219, 19.49164], [100.64606, 19.55884], [100.77231, 19.48324], [100.90302, 19.61901], [101.08928, 19.59748], [101.26545, 19.59242], [101.26991, 19.48324], [101.21347, 19.46223], [101.20604, 19.35296], [101.24911, 19.33334], [101.261, 19.12717], [101.35606, 19.04716], [101.25803, 18.89545], [101.22832, 18.73377], [101.27585, 18.68875], [101.06047, 18.43247], [101.18227, 18.34367], [101.15108, 18.25624], [101.19118, 18.2125], [101.1793, 18.0544], [101.02185, 17.87637], [100.96541, 17.57926], [101.15108, 17.47586], [101.44667, 17.7392], [101.72294, 17.92867], [101.78087, 18.07559], [101.88485, 18.02474], [102.11359, 18.21532], [102.45523, 17.97106], [102.59234, 17.96127], [102.60971, 17.95411], [102.61432, 17.92273], [102.5896, 17.84889], [102.59485, 17.83537], [102.68194, 17.80151], [102.69946, 17.81686], [102.67543, 17.84529], [102.68538, 17.86653], [102.75954, 17.89561], [102.79044, 17.93612], [102.81988, 17.94233], [102.86323, 17.97531], [102.95812, 18.0054], [102.9912, 17.9949], [103.01998, 17.97095], [103.0566, 18.00144], [103.07823, 18.03833], [103.07343, 18.12351], [103.1493, 18.17799], [103.14994, 18.23172], [103.17093, 18.2618], [103.29757, 18.30475], [103.23818, 18.34875], [103.24779, 18.37807], [103.30977, 18.4341], [103.41044, 18.4486], [103.47773, 18.42841], [103.60957, 18.40528], [103.699, 18.34125], [103.82449, 18.33979], [103.85642, 18.28666], [103.93916, 18.33914], [103.97725, 18.33631], [104.06533, 18.21656], [104.10927, 18.10826], [104.21776, 17.99335], [104.2757, 17.86139], [104.35432, 17.82871], [104.45404, 17.66788], [104.69867, 17.53038], [104.80061, 17.39367], [104.80716, 17.19025], [104.73712, 17.01404], [104.7373, 16.91125], [104.76442, 16.84752], [104.7397, 16.81005], [104.76099, 16.69302], [104.73349, 16.565], [104.88057, 16.37311], [105.00262, 16.25627], [105.06204, 16.09792], [105.42001, 16.00657], [105.38508, 15.987], [105.34115, 15.92737], [105.37959, 15.84074], [105.42285, 15.76971], [105.46573, 15.74742], [105.61756, 15.68792], [105.60446, 15.53301], [105.58191, 15.41031], [105.47635, 15.3796], [105.4692, 15.33709], [105.50662, 15.32054], [105.58043, 15.32724], [105.46661, 15.13132], [105.61162, 15.00037], [105.5121, 14.80802], [105.53864, 14.55731], [105.43783, 14.43865], [105.20894, 14.34967], [105.2759, 14.17496], [105.36775, 14.09948], [105.44869, 14.10703], [105.5561, 14.15684], [105.78338, 14.08438], [105.78182, 14.02247], [105.90791, 13.92881], [106.10405, 13.9137], [106.10094, 13.98471], [106.16632, 14.01794], [106.18656, 14.06324], [106.11962, 14.11307], [106.10872, 14.18401], [106.04801, 14.20363], [106.02311, 14.30623], [105.99509, 14.32734], [106.00131, 14.36957], [106.21302, 14.36203], [106.25194, 14.48415], [106.32355, 14.44043], [106.40916, 14.45249], [106.43874, 14.52032], [106.47766, 14.50977], [106.45898, 14.55045], [106.50723, 14.58963], [106.54148, 14.59565], [106.57106, 14.50525], [106.59908, 14.50977], [106.63333, 14.44194], [106.73762, 14.42687], [106.80767, 14.31226], [106.8497, 14.29416], [106.90574, 14.33639], [106.9649, 14.3198], [106.98825, 14.36806], [107.04585, 14.41782], [107.03962, 14.45099], [107.09722, 14.3937], [107.17038, 14.41782], [107.21241, 14.48716], [107.256, 14.48716], [107.26534, 14.54292], [107.29803, 14.58963], [107.3276, 14.58812], [107.37897, 14.54443], [107.44435, 14.52785], [107.47238, 14.61523], [107.54361, 14.69092], [107.51579, 14.79282], [107.59285, 14.87795], [107.48277, 14.93751], [107.46516, 15.00982], [107.61486, 15.0566], [107.61926, 15.13949], [107.58844, 15.20111], [107.62587, 15.2266], [107.60605, 15.37524], [107.62367, 15.42193], [107.53341, 15.40496], [107.50699, 15.48771], [107.3815, 15.49832], [107.34408, 15.62345], [107.27583, 15.62769], [107.27143, 15.71459], [107.21859, 15.74638], [107.21419, 15.83747], [107.34188, 15.89464], [107.39471, 15.88829], [107.46296, 16.01106], [107.44975, 16.08511], [107.33968, 16.05549], [107.25822, 16.13587], [107.14595, 16.17816], [107.15035, 16.26271], [107.09091, 16.3092], [107.02597, 16.31132], [106.97385, 16.30204], [106.96638, 16.34938], [106.88067, 16.43594], [106.88727, 16.52671], [106.84104, 16.55415], [106.74418, 16.41904], [106.65832, 16.47816], [106.66052, 16.56892], [106.61477, 16.60713], [106.58267, 16.6012], [106.59013, 16.62259], [106.55485, 16.68704], [106.55265, 16.86831], [106.52183, 16.87884], [106.51963, 16.92097], [106.54824, 16.92729], [106.55045, 17.0031], [106.50862, 16.9673], [106.43597, 17.01362], [106.31929, 17.20509], [106.29287, 17.3018], [106.24444, 17.24714], [106.18991, 17.28227], [106.09019, 17.36399], [105.85744, 17.63221], [105.76612, 17.67147], [105.60381, 17.89356], [105.64784, 17.96687], [105.46292, 18.22008], [105.38366, 18.15315], [105.15942, 18.38691], [105.10408, 18.43533], [105.1327, 18.58355], [105.19654, 18.64196], [105.12829, 18.70453], [104.64617, 18.85668], [104.5361, 18.97747], [103.87125, 19.31854], [104.06058, 19.43484], [104.10832, 19.51575], [104.05617, 19.61743], [104.06498, 19.66926], [104.23229, 19.70242], [104.41281, 19.70035], [104.53169, 19.61743], [104.64837, 19.62365], [104.68359, 19.72729], [104.8355, 19.80395], [104.8465, 19.91783], [104.9874, 20.09573], [104.91695, 20.15567], [104.86852, 20.14121], [104.61315, 20.24452], [104.62195, 20.36633], [104.72102, 20.40554], [104.66158, 20.47774], [104.47886, 20.37459], [104.40621, 20.3849], [104.38199, 20.47155], [104.63957, 20.6653], [104.27412, 20.91433], [104.11121, 20.96779], [103.98024, 20.91531], [103.82282, 20.8732], [103.73478, 20.6669], [103.68633, 20.66324], [103.45737, 20.82382], [103.38032, 20.79501], [103.21497, 20.89832], [103.12055, 20.89994], [103.03469, 21.05821], [102.97745, 21.05821], [102.89825, 21.24707], [102.80794, 21.25736], [102.88939, 21.3107], [102.94223, 21.46034], [102.86297, 21.4255], [102.98846, 21.58936], [102.97965, 21.74076], [102.86077, 21.71213], [102.85637, 21.84501], [102.81894, 21.83888], [102.82115, 21.73667], [102.74189, 21.66713], [102.67145, 21.65894], [102.62301, 21.91447], [102.49092, 21.99002], [102.51734, 22.02676], [102.18712, 22.30403], [102.14099, 22.40092], [102.1245, 22.43372]]]]
+         }
+       }, {
+         type: "Feature",
+         properties: {
+           iso1A2: "LB",
+           iso1A3: "LBN",
+           iso1N3: "422",
+           wikidata: "Q822",
+           nameEn: "Lebanon",
+           aliases: ["RL"],
+           groups: ["145", "142", "UN"],
+           callingCodes: ["961"]
+         },
+         geometry: {
+           type: "MultiPolygon",
+           coordinates: [[[[35.94816, 33.47886], [35.94465, 33.52774], [36.05723, 33.57904], [35.9341, 33.6596], [36.06778, 33.82927], [36.14517, 33.85118], [36.3967, 33.83365], [36.38263, 33.86579], [36.28589, 33.91981], [36.41078, 34.05253], [36.50576, 34.05982], [36.5128, 34.09916], [36.62537, 34.20251], [36.59195, 34.2316], [36.58667, 34.27667], [36.60778, 34.31009], [36.56556, 34.31881], [36.53039, 34.3798], [36.55853, 34.41609], [36.46179, 34.46541], [36.4442, 34.50165], [36.34745, 34.5002], [36.3369, 34.52629], [36.39846, 34.55672], [36.41429, 34.61175], [36.45299, 34.59438], [36.46003, 34.6378], [36.42941, 34.62505], [36.35384, 34.65447], [36.35135, 34.68516], [36.32399, 34.69334], [36.29165, 34.62991], [35.98718, 34.64977], [35.97386, 34.63322], [35.48515, 34.70851], [34.78515, 33.20368], [35.10645, 33.09318], [35.1924, 33.08743], [35.31429, 33.10515], [35.35223, 33.05617], [35.43059, 33.06659], [35.448, 33.09264], [35.50272, 33.09056], [35.50335, 33.114], [35.52573, 33.11921], [35.54228, 33.19865], [35.5362, 33.23196], [35.54808, 33.236], [35.54544, 33.25513], [35.55555, 33.25844], [35.56523, 33.28969], [35.58326, 33.28381], [35.58502, 33.26653], [35.62283, 33.24226], [35.62019, 33.27278], [35.77477, 33.33609], [35.81324, 33.36354], [35.82577, 33.40479], [35.88668, 33.43183], [35.94816, 33.47886]]]]
+         }
+       }, {
+         type: "Feature",
+         properties: {
+           iso1A2: "LC",
+           iso1A3: "LCA",
+           iso1N3: "662",
+           wikidata: "Q760",
+           nameEn: "St. Lucia",
+           aliases: ["WL"],
+           groups: ["029", "003", "419", "019", "UN"],
+           driveSide: "left",
+           roadSpeedUnit: "mph",
+           callingCodes: ["1 758"]
+         },
+         geometry: {
+           type: "MultiPolygon",
+           coordinates: [[[[-59.95997, 14.20285], [-61.69315, 14.26451], [-59.94058, 12.34011], [-59.95997, 14.20285]]]]
+         }
+       }, {
+         type: "Feature",
+         properties: {
+           iso1A2: "LI",
+           iso1A3: "LIE",
+           iso1N3: "438",
+           wikidata: "Q347",
+           nameEn: "Liechtenstein",
+           aliases: ["FL"],
+           groups: ["155", "150", "UN"],
+           callingCodes: ["423"]
+         },
+         geometry: {
+           type: "MultiPolygon",
+           coordinates: [[[[9.60717, 47.06091], [9.61216, 47.07732], [9.63395, 47.08443], [9.62623, 47.14685], [9.56539, 47.17124], [9.58264, 47.20673], [9.56981, 47.21926], [9.55176, 47.22585], [9.56766, 47.24281], [9.53116, 47.27029], [9.52406, 47.24959], [9.50318, 47.22153], [9.4891, 47.19346], [9.48774, 47.17402], [9.51044, 47.13727], [9.52089, 47.10019], [9.51362, 47.08505], [9.47139, 47.06402], [9.47548, 47.05257], [9.54041, 47.06495], [9.55721, 47.04762], [9.60717, 47.06091]]]]
+         }
+       }, {
+         type: "Feature",
+         properties: {
+           iso1A2: "LK",
+           iso1A3: "LKA",
+           iso1N3: "144",
+           wikidata: "Q854",
+           nameEn: "Sri Lanka",
+           groups: ["034", "142", "UN"],
+           driveSide: "left",
+           callingCodes: ["94"]
+         },
+         geometry: {
+           type: "MultiPolygon",
+           coordinates: [[[[76.59015, 5.591], [85.15017, 5.21497], [80.48418, 10.20786], [79.42124, 9.80115], [79.50447, 8.91876], [76.59015, 5.591]]]]
+         }
+       }, {
+         type: "Feature",
+         properties: {
+           iso1A2: "LR",
+           iso1A3: "LBR",
+           iso1N3: "430",
+           wikidata: "Q1014",
+           nameEn: "Liberia",
+           groups: ["011", "202", "002", "UN"],
+           callingCodes: ["231"]
+         },
+         geometry: {
+           type: "MultiPolygon",
+           coordinates: [[[[-8.47114, 7.55676], [-8.55874, 7.62525], [-8.55874, 7.70167], [-8.67814, 7.69428], [-8.72789, 7.51429], [-8.8448, 7.35149], [-8.85724, 7.26019], [-8.93435, 7.2824], [-9.09107, 7.1985], [-9.18311, 7.30461], [-9.20798, 7.38109], [-9.305, 7.42056], [-9.41943, 7.41809], [-9.48161, 7.37122], [-9.37465, 7.62032], [-9.35724, 7.74111], [-9.44928, 7.9284], [-9.41445, 8.02448], [-9.50898, 8.18455], [-9.47415, 8.35195], [-9.77763, 8.54633], [-10.05873, 8.42578], [-10.05375, 8.50697], [-10.14579, 8.52665], [-10.203, 8.47991], [-10.27575, 8.48711], [-10.30084, 8.30008], [-10.31635, 8.28554], [-10.29839, 8.21283], [-10.35227, 8.15223], [-10.45023, 8.15627], [-10.51554, 8.1393], [-10.57523, 8.04829], [-10.60492, 8.04072], [-10.60422, 7.7739], [-11.29417, 7.21576], [-11.4027, 6.97746], [-11.50429, 6.92704], [-12.15048, 6.15992], [-7.52774, 3.7105], [-7.53259, 4.35145], [-7.59349, 4.8909], [-7.53876, 4.94294], [-7.55369, 5.08667], [-7.48901, 5.14118], [-7.46165, 5.26256], [-7.36463, 5.32944], [-7.43428, 5.42355], [-7.37209, 5.61173], [-7.43926, 5.74787], [-7.43677, 5.84687], [-7.46165, 5.84934], [-7.48155, 5.80974], [-7.67309, 5.94337], [-7.70294, 5.90625], [-7.78254, 5.99037], [-7.79747, 6.07696], [-7.8497, 6.08932], [-7.83478, 6.20309], [-7.90692, 6.27728], [-8.00642, 6.31684], [-8.17557, 6.28222], [-8.3298, 6.36381], [-8.38453, 6.35887], [-8.45666, 6.49977], [-8.48652, 6.43797], [-8.59456, 6.50612], [-8.31736, 6.82837], [-8.29249, 7.1691], [-8.37458, 7.25794], [-8.41935, 7.51203], [-8.47114, 7.55676]]]]
+         }
+       }, {
+         type: "Feature",
+         properties: {
+           iso1A2: "LS",
+           iso1A3: "LSO",
+           iso1N3: "426",
+           wikidata: "Q1013",
+           nameEn: "Lesotho",
+           groups: ["018", "202", "002", "UN"],
+           driveSide: "left",
+           callingCodes: ["266"]
+         },
+         geometry: {
+           type: "MultiPolygon",
+           coordinates: [[[[29.33204, -29.45598], [29.44883, -29.3772], [29.40524, -29.21246], [28.68043, -28.58744], [28.65091, -28.57025], [28.40612, -28.6215], [28.30518, -28.69531], [28.2348, -28.69471], [28.1317, -28.7293], [28.02503, -28.85991], [27.98675, -28.8787], [27.9392, -28.84864], [27.88933, -28.88156], [27.8907, -28.91612], [27.75458, -28.89839], [27.55974, -29.18954], [27.5158, -29.2261], [27.54258, -29.25575], [27.48679, -29.29349], [27.45125, -29.29708], [27.47254, -29.31968], [27.4358, -29.33465], [27.33464, -29.48161], [27.01016, -29.65439], [27.09489, -29.72796], [27.22719, -30.00718], [27.29603, -30.05473], [27.32555, -30.14785], [27.40778, -30.14577], [27.37293, -30.19401], [27.36649, -30.27246], [27.38108, -30.33456], [27.45452, -30.32239], [27.56901, -30.42504], [27.56781, -30.44562], [27.62137, -30.50509], [27.6521, -30.51707], [27.67819, -30.53437], [27.69467, -30.55862], [27.74814, -30.60635], [28.12073, -30.68072], [28.2319, -30.28476], [28.399, -30.1592], [28.68627, -30.12885], [28.80222, -30.10579], [28.9338, -30.05072], [29.16548, -29.91706], [29.12553, -29.76266], [29.28545, -29.58456], [29.33204, -29.45598]]]]
+         }
+       }, {
+         type: "Feature",
+         properties: {
+           iso1A2: "LT",
+           iso1A3: "LTU",
+           iso1N3: "440",
+           wikidata: "Q37",
+           nameEn: "Lithuania",
+           groups: ["EU", "154", "150", "UN"],
+           callingCodes: ["370"]
+         },
+         geometry: {
+           type: "MultiPolygon",
+           coordinates: [[[[24.89005, 56.46666], [24.83686, 56.41565], [24.70022, 56.40483], [24.57353, 56.31525], [24.58143, 56.29125], [24.42746, 56.26522], [24.32334, 56.30226], [24.13139, 56.24881], [24.02657, 56.3231], [23.75726, 56.37282], [23.49803, 56.34307], [23.40486, 56.37689], [23.31606, 56.3827], [23.17312, 56.36795], [23.09531, 56.30511], [22.96988, 56.41213], [22.83048, 56.367], [22.69354, 56.36284], [22.56441, 56.39305], [22.3361, 56.4016], [22.09728, 56.42851], [22.00548, 56.41508], [21.74558, 56.33181], [21.57888, 56.31406], [21.49736, 56.29106], [21.24644, 56.16917], [21.15016, 56.07818], [20.68447, 56.04073], [20.60454, 55.40986], [20.95181, 55.27994], [21.26425, 55.24456], [21.35465, 55.28427], [21.38446, 55.29348], [21.46766, 55.21115], [21.51095, 55.18507], [21.55605, 55.20311], [21.64954, 55.1791], [21.85521, 55.09493], [21.96505, 55.07353], [21.99543, 55.08691], [22.03984, 55.07888], [22.02582, 55.05078], [22.06087, 55.02935], [22.11697, 55.02131], [22.14267, 55.05345], [22.31562, 55.0655], [22.47688, 55.04408], [22.58907, 55.07085], [22.60075, 55.01863], [22.65451, 54.97037], [22.68723, 54.9811], [22.76422, 54.92521], [22.85083, 54.88711], [22.87317, 54.79492], [22.73631, 54.72952], [22.73397, 54.66604], [22.75467, 54.6483], [22.74225, 54.64339], [22.7522, 54.63525], [22.68021, 54.58486], [22.71293, 54.56454], [22.67788, 54.532], [22.70208, 54.45312], [22.7253, 54.41732], [22.79705, 54.36264], [22.83756, 54.40827], [23.00584, 54.38514], [22.99649, 54.35927], [23.05726, 54.34565], [23.04323, 54.31567], [23.104, 54.29794], [23.13905, 54.31567], [23.15526, 54.31076], [23.15938, 54.29894], [23.24656, 54.25701], [23.3494, 54.25155], [23.39525, 54.21672], [23.42418, 54.17911], [23.45223, 54.17775], [23.49196, 54.14764], [23.52702, 54.04622], [23.48261, 53.98855], [23.51284, 53.95052], [23.61677, 53.92691], [23.71726, 53.93379], [23.80543, 53.89558], [23.81309, 53.94205], [23.95098, 53.9613], [23.98837, 53.92554], [24.19638, 53.96405], [24.34128, 53.90076], [24.44411, 53.90076], [24.62275, 54.00217], [24.69652, 54.01901], [24.69185, 53.96543], [24.74279, 53.96663], [24.85311, 54.02862], [24.77131, 54.11091], [24.96894, 54.17589], [24.991, 54.14241], [25.0728, 54.13419], [25.19199, 54.219], [25.22705, 54.26271], [25.35559, 54.26544], [25.509, 54.30267], [25.56823, 54.25212], [25.51452, 54.17799], [25.54724, 54.14925], [25.64875, 54.1259], [25.71084, 54.16704], [25.78563, 54.15747], [25.78553, 54.23327], [25.68513, 54.31727], [25.55425, 54.31591], [25.5376, 54.33158], [25.63371, 54.42075], [25.62203, 54.4656], [25.64813, 54.48704], [25.68045, 54.5321], [25.75977, 54.57252], [25.74122, 54.80108], [25.89462, 54.93438], [25.99129, 54.95705], [26.05907, 54.94631], [26.13386, 54.98924], [26.20397, 54.99729], [26.26941, 55.08032], [26.23202, 55.10439], [26.30628, 55.12536], [26.35121, 55.1525], [26.46249, 55.12814], [26.51481, 55.16051], [26.54753, 55.14181], [26.69243, 55.16718], [26.68075, 55.19787], [26.72983, 55.21788], [26.73017, 55.24226], [26.835, 55.28182], [26.83266, 55.30444], [26.80929, 55.31642], [26.6714, 55.33902], [26.5709, 55.32572], [26.44937, 55.34832], [26.5522, 55.40277], [26.55094, 55.5093], [26.63167, 55.57887], [26.63231, 55.67968], [26.58248, 55.6754], [26.46661, 55.70375], [26.39561, 55.71156], [26.18509, 55.86813], [26.03815, 55.95884], [25.90047, 56.0013], [25.85893, 56.00188], [25.81773, 56.05444], [25.69246, 56.08892], [25.68588, 56.14725], [25.53621, 56.16663], [25.39751, 56.15707], [25.23099, 56.19147], [25.09325, 56.1878], [25.05762, 56.26742], [24.89005, 56.46666]]]]
+         }
+       }, {
+         type: "Feature",
+         properties: {
+           iso1A2: "LU",
+           iso1A3: "LUX",
+           iso1N3: "442",
+           wikidata: "Q32",
+           nameEn: "Luxembourg",
+           groups: ["EU", "155", "150", "UN"],
+           callingCodes: ["352"]
+         },
+         geometry: {
+           type: "MultiPolygon",
+           coordinates: [[[[6.1379, 50.12964], [6.1137, 50.13668], [6.12028, 50.16374], [6.08577, 50.17246], [6.06406, 50.15344], [6.03093, 50.16362], [6.02488, 50.18283], [5.96453, 50.17259], [5.95929, 50.13295], [5.89488, 50.11476], [5.8857, 50.07824], [5.85474, 50.06342], [5.86904, 50.04614], [5.8551, 50.02683], [5.81866, 50.01286], [5.82331, 49.99662], [5.83968, 49.9892], [5.83467, 49.97823], [5.81163, 49.97142], [5.80833, 49.96451], [5.77291, 49.96056], [5.77314, 49.93646], [5.73621, 49.89796], [5.78415, 49.87922], [5.75269, 49.8711], [5.75861, 49.85631], [5.74567, 49.85368], [5.75884, 49.84811], [5.74953, 49.84709], [5.74975, 49.83933], [5.74076, 49.83823], [5.7404, 49.83452], [5.74844, 49.82435], [5.74364, 49.82058], [5.74953, 49.81428], [5.75409, 49.79239], [5.78871, 49.7962], [5.82245, 49.75048], [5.83149, 49.74729], [5.82562, 49.72395], [5.84193, 49.72161], [5.86503, 49.72739], [5.88677, 49.70951], [5.86527, 49.69291], [5.86175, 49.67862], [5.9069, 49.66377], [5.90164, 49.6511], [5.90599, 49.63853], [5.88552, 49.63507], [5.88393, 49.62802], [5.87609, 49.62047], [5.8762, 49.60898], [5.84826, 49.5969], [5.84971, 49.58674], [5.86986, 49.58756], [5.87256, 49.57539], [5.8424, 49.56082], [5.84692, 49.55663], [5.84143, 49.5533], [5.81838, 49.54777], [5.80871, 49.5425], [5.81664, 49.53775], [5.83648, 49.5425], [5.84466, 49.53027], [5.83467, 49.52717], [5.83389, 49.52152], [5.86571, 49.50015], [5.94128, 49.50034], [5.94224, 49.49608], [5.96876, 49.49053], [5.97693, 49.45513], [6.02648, 49.45451], [6.02743, 49.44845], [6.04176, 49.44801], [6.05553, 49.46663], [6.07887, 49.46399], [6.08373, 49.45594], [6.10072, 49.45268], [6.09845, 49.46351], [6.10325, 49.4707], [6.12346, 49.4735], [6.12814, 49.49365], [6.14321, 49.48796], [6.16115, 49.49297], [6.15366, 49.50226], [6.17386, 49.50934], [6.19543, 49.50536], [6.2409, 49.51408], [6.25029, 49.50609], [6.27875, 49.503], [6.28818, 49.48465], [6.3687, 49.4593], [6.36778, 49.46937], [6.36907, 49.48931], [6.36788, 49.50377], [6.35666, 49.52931], [6.38072, 49.55171], [6.38228, 49.55855], [6.35825, 49.57053], [6.36676, 49.57813], [6.38024, 49.57593], [6.38342, 49.5799], [6.37464, 49.58886], [6.385, 49.59946], [6.39822, 49.60081], [6.41861, 49.61723], [6.4413, 49.65722], [6.43768, 49.66021], [6.42726, 49.66078], [6.42937, 49.66857], [6.44654, 49.67799], [6.46048, 49.69092], [6.48014, 49.69767], [6.49785, 49.71118], [6.50647, 49.71353], [6.5042, 49.71808], [6.49694, 49.72205], [6.49535, 49.72645], [6.50261, 49.72718], [6.51397, 49.72058], [6.51805, 49.72425], [6.50193, 49.73291], [6.50174, 49.75292], [6.51646, 49.75961], [6.51828, 49.76855], [6.51056, 49.77515], [6.51669, 49.78336], [6.50534, 49.78952], [6.52169, 49.79787], [6.53122, 49.80666], [6.52121, 49.81338], [6.51215, 49.80124], [6.50647, 49.80916], [6.48718, 49.81267], [6.47111, 49.82263], [6.45425, 49.81164], [6.44131, 49.81443], [6.42905, 49.81091], [6.42521, 49.81591], [6.40022, 49.82029], [6.36576, 49.85032], [6.34267, 49.84974], [6.33585, 49.83785], [6.32098, 49.83728], [6.32303, 49.85133], [6.30963, 49.87021], [6.29692, 49.86685], [6.28874, 49.87592], [6.26146, 49.88203], [6.23496, 49.89972], [6.22926, 49.92096], [6.21882, 49.92403], [6.22608, 49.929], [6.22094, 49.94955], [6.19856, 49.95053], [6.19089, 49.96991], [6.18045, 49.96611], [6.18554, 49.95622], [6.17872, 49.9537], [6.16466, 49.97086], [6.1701, 49.98518], [6.14147, 49.99563], [6.14948, 50.00908], [6.13806, 50.01056], [6.1295, 50.01849], [6.13273, 50.02019], [6.13794, 50.01466], [6.14666, 50.02207], [6.13044, 50.02929], [6.13458, 50.04141], [6.11274, 50.05916], [6.12055, 50.09171], [6.1379, 50.12964]]]]
+         }
+       }, {
+         type: "Feature",
+         properties: {
+           iso1A2: "LV",
+           iso1A3: "LVA",
+           iso1N3: "428",
+           wikidata: "Q211",
+           nameEn: "Latvia",
+           groups: ["EU", "154", "150", "UN"],
+           callingCodes: ["371"]
+         },
+         geometry: {
+           type: "MultiPolygon",
+           coordinates: [[[[27.34698, 57.52242], [26.90364, 57.62823], [26.54675, 57.51813], [26.46527, 57.56885], [26.29253, 57.59244], [26.1866, 57.6849], [26.2029, 57.7206], [26.08098, 57.76619], [26.0543, 57.76105], [26.03332, 57.7718], [26.02415, 57.76865], [26.02069, 57.77169], [26.0266, 57.77441], [26.027, 57.78158], [26.02456, 57.78342], [26.0324, 57.79037], [26.05949, 57.84744], [25.73499, 57.90193], [25.29581, 58.08288], [25.28237, 57.98539], [25.19484, 58.0831], [24.3579, 57.87471], [24.26221, 57.91787], [23.20055, 57.56697], [22.80496, 57.87798], [19.84909, 57.57876], [19.64795, 57.06466], [20.68447, 56.04073], [21.15016, 56.07818], [21.24644, 56.16917], [21.49736, 56.29106], [21.57888, 56.31406], [21.74558, 56.33181], [22.00548, 56.41508], [22.09728, 56.42851], [22.3361, 56.4016], [22.56441, 56.39305], [22.69354, 56.36284], [22.83048, 56.367], [22.96988, 56.41213], [23.09531, 56.30511], [23.17312, 56.36795], [23.31606, 56.3827], [23.40486, 56.37689], [23.49803, 56.34307], [23.75726, 56.37282], [24.02657, 56.3231], [24.13139, 56.24881], [24.32334, 56.30226], [24.42746, 56.26522], [24.58143, 56.29125], [24.57353, 56.31525], [24.70022, 56.40483], [24.83686, 56.41565], [24.89005, 56.46666], [25.05762, 56.26742], [25.09325, 56.1878], [25.23099, 56.19147], [25.39751, 56.15707], [25.53621, 56.16663], [25.68588, 56.14725], [25.69246, 56.08892], [25.81773, 56.05444], [25.85893, 56.00188], [25.90047, 56.0013], [26.03815, 55.95884], [26.18509, 55.86813], [26.39561, 55.71156], [26.46661, 55.70375], [26.58248, 55.6754], [26.63231, 55.67968], [26.64888, 55.70515], [26.71802, 55.70645], [26.76872, 55.67658], [26.87448, 55.7172], [26.97153, 55.8102], [27.1559, 55.85032], [27.27804, 55.78299], [27.3541, 55.8089], [27.61683, 55.78558], [27.63065, 55.89687], [27.97865, 56.11849], [28.15217, 56.16964], [28.23716, 56.27588], [28.16599, 56.37806], [28.19057, 56.44637], [28.10069, 56.524], [28.13526, 56.57989], [28.04768, 56.59004], [27.86101, 56.88204], [27.66511, 56.83921], [27.86101, 57.29402], [27.52453, 57.42826], [27.56832, 57.53728], [27.34698, 57.52242]]]]
+         }
+       }, {
+         type: "Feature",
+         properties: {
+           iso1A2: "LY",
+           iso1A3: "LBY",
+           iso1N3: "434",
+           wikidata: "Q1016",
+           nameEn: "Libya",
+           groups: ["015", "002", "UN"],
+           callingCodes: ["218"]
+         },
+         geometry: {
+           type: "MultiPolygon",
+           coordinates: [[[[26.92891, 33.39516], [11.58941, 33.36891], [11.55852, 33.1409], [11.51549, 33.09826], [11.46037, 32.6307], [11.57828, 32.48013], [11.53898, 32.4138], [11.04234, 32.2145], [10.7315, 31.97235], [10.62788, 31.96629], [10.48497, 31.72956], [10.31364, 31.72648], [10.12239, 31.42098], [10.29516, 30.90337], [9.88152, 30.34074], [9.76848, 30.34366], [9.55544, 30.23971], [9.3876, 30.16738], [9.78136, 29.40961], [9.89569, 26.57696], [9.51696, 26.39148], [9.38834, 26.19288], [10.03146, 25.35635], [10.02432, 24.98124], [10.33159, 24.5465], [10.85323, 24.5595], [11.41061, 24.21456], [11.62498, 24.26669], [11.96886, 23.51735], [13.5631, 23.16574], [14.22918, 22.61719], [14.99751, 23.00539], [15.99566, 23.49639], [23.99539, 19.49944], [23.99715, 20.00038], [24.99794, 19.99661], [24.99885, 21.99535], [24.99968, 29.24574], [24.71117, 30.17441], [25.01077, 30.73861], [24.8458, 31.39877], [26.92891, 33.39516]]]]
+         }
+       }, {
+         type: "Feature",
+         properties: {
+           iso1A2: "MA",
+           iso1A3: "MAR",
+           iso1N3: "504",
+           wikidata: "Q1028",
+           nameEn: "Morocco",
+           groups: ["015", "002", "UN"],
+           callingCodes: ["212"]
+         },
+         geometry: {
+           type: "MultiPolygon",
+           coordinates: [[[[-2.27707, 35.35051], [-5.10878, 36.05227], [-7.2725, 35.73269], [-14.43883, 27.02969], [-17.27295, 21.93519], [-17.21511, 21.34226], [-17.02707, 21.34022], [-16.9978, 21.36239], [-16.44269, 21.39745], [-14.78487, 21.36587], [-14.47329, 21.63839], [-14.48112, 22.00886], [-14.1291, 22.41636], [-14.10361, 22.75501], [-13.75627, 23.77231], [-13.00628, 24.01923], [-12.92147, 24.39502], [-12.12281, 25.13682], [-12.06001, 26.04442], [-11.62052, 26.05229], [-11.38635, 26.611], [-11.23622, 26.72023], [-11.35695, 26.8505], [-10.68417, 26.90984], [-9.81998, 26.71379], [-9.56957, 26.90042], [-9.08698, 26.98639], [-8.71787, 26.9898], [-8.77527, 27.66663], [-8.66879, 27.6666], [-8.6715, 28.71194], [-7.61585, 29.36252], [-6.95824, 29.50924], [-6.78351, 29.44634], [-6.69965, 29.51623], [-5.75616, 29.61407], [-5.72121, 29.52322], [-5.58831, 29.48103], [-5.21671, 29.95253], [-4.6058, 30.28343], [-4.31774, 30.53229], [-3.64735, 30.67539], [-3.65418, 30.85566], [-3.54944, 31.0503], [-3.77103, 31.14984], [-3.77647, 31.31912], [-3.66386, 31.39202], [-3.66314, 31.6339], [-2.82784, 31.79459], [-2.93873, 32.06557], [-2.46166, 32.16603], [-1.22829, 32.07832], [-1.15735, 32.12096], [-1.24453, 32.1917], [-1.24998, 32.32993], [-0.9912, 32.52467], [-1.37794, 32.73628], [-1.54244, 32.95499], [-1.46249, 33.0499], [-1.67067, 33.27084], [-1.59508, 33.59929], [-1.73494, 33.71721], [-1.64666, 34.10405], [-1.78042, 34.39018], [-1.69788, 34.48056], [-1.84569, 34.61907], [-1.73707, 34.74226], [-1.97469, 34.886], [-1.97833, 34.93218], [-2.04734, 34.93218], [-2.21445, 35.04378], [-2.21248, 35.08532], [-2.27707, 35.35051]], [[-2.91909, 35.33927], [-2.92272, 35.27509], [-2.93893, 35.26737], [-2.95065, 35.26576], [-2.95431, 35.2728], [-2.96516, 35.27967], [-2.96826, 35.28296], [-2.96507, 35.28801], [-2.97035, 35.28852], [-2.96978, 35.29459], [-2.96648, 35.30475], [-2.96038, 35.31609], [-2.91909, 35.33927]], [[-3.90602, 35.21494], [-3.89343, 35.22728], [-3.88372, 35.20767], [-3.90602, 35.21494]], [[-4.30191, 35.17419], [-4.29436, 35.17149], [-4.30112, 35.17058], [-4.30191, 35.17419]], [[-2.40316, 35.16893], [-2.45965, 35.16527], [-2.43262, 35.20652], [-2.40316, 35.16893]], [[-5.38491, 35.92591], [-5.21179, 35.90091], [-5.34379, 35.8711], [-5.35844, 35.87375], [-5.37338, 35.88417], [-5.38491, 35.92591]]]]
+         }
+       }, {
+         type: "Feature",
+         properties: {
+           iso1A2: "MC",
+           iso1A3: "MCO",
+           iso1N3: "492",
+           wikidata: "Q235",
+           nameEn: "Monaco",
+           groups: ["155", "150", "UN"],
+           callingCodes: ["377"]
+         },
+         geometry: {
+           type: "MultiPolygon",
+           coordinates: [[[[7.47823, 43.73341], [7.4379, 43.74963], [7.4389, 43.75151], [7.43708, 43.75197], [7.43624, 43.75014], [7.43013, 43.74895], [7.42809, 43.74396], [7.42443, 43.74087], [7.42299, 43.74176], [7.42062, 43.73977], [7.41233, 43.73439], [7.41298, 43.73311], [7.41291, 43.73168], [7.41113, 43.73156], [7.40903, 43.7296], [7.42422, 43.72209], [7.47823, 43.73341]]]]
+         }
+       }, {
+         type: "Feature",
+         properties: {
+           iso1A2: "MD",
+           iso1A3: "MDA",
+           iso1N3: "498",
+           wikidata: "Q217",
+           nameEn: "Moldova",
+           groups: ["151", "150", "UN"],
+           callingCodes: ["373"]
+         },
+         geometry: {
+           type: "MultiPolygon",
+           coordinates: [[[[27.74422, 48.45926], [27.6658, 48.44034], [27.59027, 48.46311], [27.5889, 48.49224], [27.46942, 48.454], [27.44333, 48.41209], [27.37741, 48.41026], [27.37604, 48.44398], [27.32159, 48.4434], [27.27855, 48.37534], [27.13434, 48.37288], [27.08078, 48.43214], [27.0231, 48.42485], [27.03821, 48.37653], [26.93384, 48.36558], [26.85556, 48.41095], [26.71274, 48.40388], [26.82809, 48.31629], [26.79239, 48.29071], [26.6839, 48.35828], [26.62823, 48.25804], [26.81161, 48.25049], [26.87708, 48.19919], [26.94265, 48.1969], [26.98042, 48.15752], [26.96119, 48.13003], [27.04118, 48.12522], [27.02985, 48.09083], [27.15622, 47.98538], [27.1618, 47.92391], [27.29069, 47.73722], [27.25519, 47.71366], [27.32202, 47.64009], [27.3979, 47.59473], [27.47942, 47.48113], [27.55731, 47.46637], [27.60263, 47.32507], [27.68706, 47.28962], [27.73172, 47.29248], [27.81892, 47.1381], [28.09095, 46.97621], [28.12173, 46.82283], [28.24808, 46.64305], [28.22281, 46.50481], [28.25769, 46.43334], [28.18902, 46.35283], [28.19864, 46.31869], [28.10937, 46.22852], [28.13684, 46.18099], [28.08612, 46.01105], [28.13111, 45.92819], [28.16568, 45.6421], [28.08927, 45.6051], [28.18741, 45.47358], [28.21139, 45.46895], [28.30201, 45.54744], [28.41836, 45.51715], [28.43072, 45.48538], [28.51449, 45.49982], [28.49252, 45.56716], [28.54196, 45.58062], [28.51587, 45.6613], [28.47879, 45.66994], [28.52823, 45.73803], [28.70401, 45.78019], [28.69852, 45.81753], [28.78503, 45.83475], [28.74383, 45.96664], [28.98004, 46.00385], [29.00613, 46.04962], [28.94643, 46.09176], [29.06656, 46.19716], [28.94953, 46.25852], [28.98478, 46.31803], [29.004, 46.31495], [28.9306, 46.45699], [29.01241, 46.46177], [29.02409, 46.49582], [29.23547, 46.55435], [29.24886, 46.37912], [29.35357, 46.49505], [29.49914, 46.45889], [29.5939, 46.35472], [29.6763, 46.36041], [29.66359, 46.4215], [29.74496, 46.45605], [29.88329, 46.35851], [29.94114, 46.40114], [30.09103, 46.38694], [30.16794, 46.40967], [30.02511, 46.45132], [29.88916, 46.54302], [29.94409, 46.56002], [29.9743, 46.75325], [29.94522, 46.80055], [29.98814, 46.82358], [29.87405, 46.88199], [29.75458, 46.8604], [29.72986, 46.92234], [29.57056, 46.94766], [29.62137, 47.05069], [29.61038, 47.09932], [29.53044, 47.07851], [29.49732, 47.12878], [29.57696, 47.13581], [29.54996, 47.24962], [29.59665, 47.25521], [29.5733, 47.36508], [29.48678, 47.36043], [29.47854, 47.30366], [29.39889, 47.30179], [29.3261, 47.44664], [29.18603, 47.43387], [29.11743, 47.55001], [29.22414, 47.60012], [29.22242, 47.73607], [29.27255, 47.79953], [29.20663, 47.80367], [29.27804, 47.88893], [29.19839, 47.89261], [29.1723, 47.99013], [28.9306, 47.96255], [28.8414, 48.03392], [28.85232, 48.12506], [28.69896, 48.13106], [28.53921, 48.17453], [28.48428, 48.0737], [28.42454, 48.12047], [28.43701, 48.15832], [28.38712, 48.17567], [28.34009, 48.13147], [28.30609, 48.14018], [28.30586, 48.1597], [28.34912, 48.1787], [28.36996, 48.20543], [28.35519, 48.24957], [28.32508, 48.23384], [28.2856, 48.23202], [28.19314, 48.20749], [28.17666, 48.25963], [28.07504, 48.23494], [28.09873, 48.3124], [28.04527, 48.32661], [27.95883, 48.32368], [27.88391, 48.36699], [27.87533, 48.4037], [27.81902, 48.41874], [27.79225, 48.44244], [27.74422, 48.45926]]]]
+         }
+       }, {
+         type: "Feature",
+         properties: {
+           iso1A2: "ME",
+           iso1A3: "MNE",
+           iso1N3: "499",
+           wikidata: "Q236",
+           nameEn: "Montenegro",
+           groups: ["039", "150", "UN"],
+           callingCodes: ["382"]
+         },
+         geometry: {
+           type: "MultiPolygon",
+           coordinates: [[[[19.22807, 43.5264], [19.15685, 43.53943], [19.13933, 43.5282], [19.04934, 43.50384], [19.01078, 43.55806], [18.91379, 43.50299], [18.95469, 43.49367], [18.96053, 43.45042], [19.01078, 43.43854], [19.04071, 43.397], [19.08673, 43.31453], [19.08206, 43.29668], [19.04233, 43.30008], [19.00844, 43.24988], [18.95001, 43.29327], [18.95819, 43.32899], [18.90911, 43.36383], [18.83912, 43.34795], [18.84794, 43.33735], [18.85342, 43.32426], [18.76538, 43.29838], [18.6976, 43.25243], [18.71747, 43.2286], [18.66605, 43.2056], [18.64735, 43.14766], [18.66254, 43.03928], [18.52232, 43.01451], [18.49076, 42.95553], [18.49661, 42.89306], [18.4935, 42.86433], [18.47633, 42.85829], [18.45921, 42.81682], [18.47324, 42.74992], [18.56789, 42.72074], [18.55221, 42.69045], [18.54603, 42.69171], [18.54841, 42.68328], [18.57373, 42.64429], [18.52232, 42.62279], [18.55504, 42.58409], [18.53751, 42.57376], [18.49778, 42.58409], [18.43735, 42.55921], [18.44307, 42.51077], [18.43588, 42.48556], [18.52152, 42.42302], [18.54128, 42.39171], [18.45131, 42.21682], [19.26406, 41.74971], [19.37597, 41.84849], [19.37451, 41.8842], [19.33812, 41.90669], [19.34601, 41.95675], [19.37691, 41.96977], [19.36867, 42.02564], [19.37548, 42.06835], [19.40687, 42.10024], [19.28623, 42.17745], [19.42, 42.33019], [19.42352, 42.36546], [19.4836, 42.40831], [19.65972, 42.62774], [19.73244, 42.66299], [19.77375, 42.58517], [19.74731, 42.57422], [19.76549, 42.50237], [19.82333, 42.46581], [19.9324, 42.51699], [20.00842, 42.5109], [20.01834, 42.54622], [20.07761, 42.55582], [20.0969, 42.65559], [20.02915, 42.71147], [20.02088, 42.74789], [20.04898, 42.77701], [20.2539, 42.76245], [20.27869, 42.81945], [20.35692, 42.8335], [20.34528, 42.90676], [20.16415, 42.97177], [20.14896, 42.99058], [20.12325, 42.96237], [20.05431, 42.99571], [20.04729, 43.02732], [19.98887, 43.0538], [19.96549, 43.11098], [19.92576, 43.08539], [19.79255, 43.11951], [19.76918, 43.16044], [19.64063, 43.19027], [19.62661, 43.2286], [19.54598, 43.25158], [19.52962, 43.31623], [19.48171, 43.32644], [19.44315, 43.38846], [19.22229, 43.47926], [19.22807, 43.5264]]]]
+         }
+       }, {
+         type: "Feature",
+         properties: {
+           iso1A2: "MF",
+           iso1A3: "MAF",
+           iso1N3: "663",
+           wikidata: "Q126125",
+           nameEn: "Saint-Martin",
+           country: "FR",
+           groups: ["Q3320166", "EU", "029", "003", "419", "019", "UN"],
+           callingCodes: ["590"]
+         },
+         geometry: {
+           type: "MultiPolygon",
+           coordinates: [[[[-62.93924, 18.02904], [-62.62718, 18.26185], [-63.35989, 18.06012], [-63.33064, 17.9615], [-63.13502, 18.05445], [-63.11042, 18.05339], [-63.09686, 18.04608], [-63.07759, 18.04943], [-63.0579, 18.06614], [-63.04039, 18.05619], [-63.02323, 18.05757], [-62.93924, 18.02904]]]]
+         }
+       }, {
+         type: "Feature",
+         properties: {
+           iso1A2: "MG",
+           iso1A3: "MDG",
+           iso1N3: "450",
+           wikidata: "Q1019",
+           nameEn: "Madagascar",
+           aliases: ["RM"],
+           groups: ["014", "202", "002", "UN"],
+           callingCodes: ["261"]
+         },
+         geometry: {
+           type: "MultiPolygon",
+           coordinates: [[[[51.93891, -10.85085], [45.84651, -12.77177], [42.14681, -19.63341], [45.80092, -33.00974], [51.93891, -10.85085]]]]
+         }
+       }, {
+         type: "Feature",
+         properties: {
+           iso1A2: "MH",
+           iso1A3: "MHL",
+           iso1N3: "584",
+           wikidata: "Q709",
+           nameEn: "Marshall Islands",
+           groups: ["057", "009", "UN"],
+           roadSpeedUnit: "mph",
+           callingCodes: ["692"]
+         },
+         geometry: {
+           type: "MultiPolygon",
+           coordinates: [[[[169, 3.9], [173.53711, 5.70687], [169.29099, 15.77133], [159.04653, 10.59067], [169, 3.9]]]]
+         }
+       }, {
+         type: "Feature",
+         properties: {
+           iso1A2: "MK",
+           iso1A3: "MKD",
+           iso1N3: "807",
+           wikidata: "Q221",
+           nameEn: "North Macedonia",
+           groups: ["039", "150", "UN"],
+           callingCodes: ["389"]
+         },
+         geometry: {
+           type: "MultiPolygon",
+           coordinates: [[[[22.34773, 42.31725], [22.29275, 42.34913], [22.29605, 42.37477], [22.16384, 42.32103], [22.02908, 42.29848], [21.94405, 42.34669], [21.91595, 42.30392], [21.84654, 42.3247], [21.77176, 42.2648], [21.70111, 42.23789], [21.58992, 42.25915], [21.52145, 42.24465], [21.50823, 42.27156], [21.43882, 42.2789], [21.43882, 42.23609], [21.38428, 42.24465], [21.30496, 42.1418], [21.29913, 42.13954], [21.31983, 42.10993], [21.22728, 42.08909], [21.16614, 42.19815], [21.11491, 42.20794], [20.75464, 42.05229], [20.76786, 41.91839], [20.68523, 41.85318], [20.59524, 41.8818], [20.55976, 41.87068], [20.57144, 41.7897], [20.53405, 41.78099], [20.51301, 41.72433], [20.52937, 41.69292], [20.51769, 41.65975], [20.55508, 41.58113], [20.52103, 41.56473], [20.45809, 41.5549], [20.45331, 41.51436], [20.49039, 41.49277], [20.51301, 41.442], [20.55976, 41.4087], [20.52119, 41.34381], [20.49432, 41.33679], [20.51068, 41.2323], [20.59715, 41.13644], [20.58546, 41.11179], [20.59832, 41.09066], [20.63454, 41.0889], [20.65558, 41.08009], [20.71634, 40.91781], [20.73504, 40.9081], [20.81567, 40.89662], [20.83671, 40.92752], [20.94305, 40.92399], [20.97693, 40.90103], [20.97887, 40.85475], [21.15262, 40.85546], [21.21105, 40.8855], [21.25779, 40.86165], [21.35595, 40.87578], [21.41555, 40.9173], [21.53007, 40.90759], [21.57448, 40.86076], [21.69601, 40.9429], [21.7556, 40.92525], [21.91102, 41.04786], [21.90869, 41.09191], [22.06527, 41.15617], [22.1424, 41.12449], [22.17629, 41.15969], [22.26744, 41.16409], [22.42285, 41.11921], [22.5549, 41.13065], [22.58295, 41.11568], [22.62852, 41.14385], [22.65306, 41.18168], [22.71266, 41.13945], [22.74538, 41.16321], [22.76408, 41.32225], [22.81199, 41.3398], [22.93334, 41.34104], [22.96331, 41.35782], [22.95513, 41.63265], [23.03342, 41.71034], [23.01239, 41.76527], [22.96682, 41.77137], [22.90254, 41.87587], [22.86749, 42.02275], [22.67701, 42.06614], [22.51224, 42.15457], [22.50289, 42.19527], [22.47251, 42.20393], [22.38136, 42.30339], [22.34773, 42.31725]]]]
+         }
+       }, {
+         type: "Feature",
+         properties: {
+           iso1A2: "ML",
+           iso1A3: "MLI",
+           iso1N3: "466",
+           wikidata: "Q912",
+           nameEn: "Mali",
+           groups: ["011", "202", "002", "UN"],
+           callingCodes: ["223"]
+         },
+         geometry: {
+           type: "MultiPolygon",
+           coordinates: [[[[-4.83423, 24.99935], [-6.57191, 25.0002], [-5.60725, 16.49919], [-5.33435, 16.33354], [-5.50165, 15.50061], [-9.32979, 15.50032], [-9.31106, 15.69412], [-9.33314, 15.7044], [-9.44673, 15.60553], [-9.40447, 15.4396], [-10.71721, 15.4223], [-10.90932, 15.11001], [-11.43483, 15.62339], [-11.70705, 15.51558], [-11.94903, 14.76143], [-12.23936, 14.76324], [-11.93043, 13.84505], [-12.06897, 13.71049], [-11.83345, 13.33333], [-11.63025, 13.39174], [-11.39935, 12.97808], [-11.37536, 12.40788], [-11.50006, 12.17826], [-11.24136, 12.01286], [-10.99758, 12.24634], [-10.80355, 12.1053], [-10.71897, 11.91552], [-10.30604, 12.24634], [-9.714, 12.0226], [-9.63938, 12.18312], [-9.32097, 12.29009], [-9.38067, 12.48446], [-9.13689, 12.50875], [-8.94784, 12.34842], [-8.80854, 11.66715], [-8.40058, 11.37466], [-8.66923, 10.99397], [-8.35083, 11.06234], [-8.2667, 10.91762], [-8.32614, 10.69273], [-8.22711, 10.41722], [-8.10207, 10.44649], [-7.9578, 10.2703], [-7.97971, 10.17117], [-7.92107, 10.15577], [-7.63048, 10.46334], [-7.54462, 10.40921], [-7.52261, 10.4655], [-7.44555, 10.44602], [-7.3707, 10.24677], [-7.13331, 10.24877], [-7.0603, 10.14711], [-7.00966, 10.15794], [-6.97444, 10.21644], [-7.01186, 10.25111], [-6.93921, 10.35291], [-6.68164, 10.35074], [-6.63541, 10.66893], [-6.52974, 10.59104], [-6.42847, 10.5694], [-6.40646, 10.69922], [-6.325, 10.68624], [-6.24795, 10.74248], [-6.1731, 10.46983], [-6.18851, 10.24244], [-5.99478, 10.19694], [-5.78124, 10.43952], [-5.65135, 10.46767], [-5.51058, 10.43177], [-5.46643, 10.56074], [-5.47083, 10.75329], [-5.41579, 10.84628], [-5.49284, 11.07538], [-5.32994, 11.13371], [-5.32553, 11.21578], [-5.25949, 11.24816], [-5.25509, 11.36905], [-5.20665, 11.43811], [-5.22867, 11.60421], [-5.29251, 11.61715], [-5.26389, 11.75728], [-5.40258, 11.8327], [-5.26389, 11.84778], [-5.07897, 11.97918], [-4.72893, 12.01579], [-4.70692, 12.06746], [-4.62987, 12.06531], [-4.62546, 12.13204], [-4.54841, 12.1385], [-4.57703, 12.19875], [-4.41412, 12.31922], [-4.47356, 12.71252], [-4.238, 12.71467], [-4.21819, 12.95722], [-4.34477, 13.12927], [-3.96501, 13.49778], [-3.90558, 13.44375], [-3.96282, 13.38164], [-3.7911, 13.36665], [-3.54454, 13.1781], [-3.4313, 13.1588], [-3.43507, 13.27272], [-3.23599, 13.29035], [-3.28396, 13.5422], [-3.26407, 13.70699], [-2.88189, 13.64921], [-2.90831, 13.81174], [-2.84667, 14.05532], [-2.66175, 14.14713], [-2.47587, 14.29671], [-2.10223, 14.14878], [-1.9992, 14.19011], [-1.97945, 14.47709], [-1.68083, 14.50023], [-1.32166, 14.72774], [-1.05875, 14.7921], [-0.72004, 15.08655], [-0.24673, 15.07805], [0.06588, 14.96961], [0.23859, 15.00135], [0.72632, 14.95898], [0.96711, 14.98275], [1.31275, 15.27978], [3.01806, 15.34571], [3.03134, 15.42221], [3.50368, 15.35934], [4.19893, 16.39923], [4.21787, 17.00118], [4.26762, 17.00432], [4.26651, 19.14224], [3.36082, 18.9745], [3.12501, 19.1366], [3.24648, 19.81703], [1.20992, 20.73533], [1.15698, 21.12843], [-4.83423, 24.99935]]]]
+         }
+       }, {
+         type: "Feature",
+         properties: {
+           iso1A2: "MM",
+           iso1A3: "MMR",
+           iso1N3: "104",
+           wikidata: "Q836",
+           nameEn: "Myanmar",
+           aliases: ["Burma", "BU"],
+           groups: ["035", "142", "UN"],
+           callingCodes: ["95"]
+         },
+         geometry: {
+           type: "MultiPolygon",
+           coordinates: [[[[92.62187, 21.87037], [92.59775, 21.6092], [92.68152, 21.28454], [92.60187, 21.24615], [92.55105, 21.3856], [92.43158, 21.37025], [92.37939, 21.47764], [92.20087, 21.337], [92.17752, 21.17445], [92.26071, 21.05697], [92.47409, 20.38654], [92.61042, 13.76986], [94.6371, 13.81803], [97.63455, 9.60854], [98.12555, 9.44056], [98.33094, 9.91973], [98.47298, 9.95782], [98.52291, 9.92389], [98.55174, 9.92804], [98.7391, 10.31488], [98.81944, 10.52761], [98.77275, 10.62548], [98.78511, 10.68351], [98.86819, 10.78336], [99.0069, 10.85485], [98.99701, 10.92962], [99.02337, 10.97217], [99.06938, 10.94857], [99.32756, 11.28545], [99.31573, 11.32081], [99.39485, 11.3925], [99.47598, 11.62434], [99.5672, 11.62732], [99.64108, 11.78948], [99.64891, 11.82699], [99.53424, 12.02317], [99.56445, 12.14805], [99.47519, 12.1353], [99.409, 12.60603], [99.29254, 12.68921], [99.18905, 12.84799], [99.18748, 12.9898], [99.10646, 13.05804], [99.12225, 13.19847], [99.20617, 13.20575], [99.16695, 13.72621], [98.97356, 14.04868], [98.56762, 14.37701], [98.24874, 14.83013], [98.18821, 15.13125], [98.22, 15.21327], [98.30446, 15.30667], [98.40522, 15.25268], [98.41906, 15.27103], [98.39351, 15.34177], [98.4866, 15.39154], [98.56027, 15.33471], [98.58598, 15.46821], [98.541, 15.65406], [98.59853, 15.87197], [98.57019, 16.04578], [98.69585, 16.13353], [98.8376, 16.11706], [98.92656, 16.36425], [98.84485, 16.42354], [98.68074, 16.27068], [98.63817, 16.47424], [98.57912, 16.55983], [98.5695, 16.62826], [98.51113, 16.64503], [98.51833, 16.676], [98.51472, 16.68521], [98.51579, 16.69433], [98.51043, 16.70107], [98.49713, 16.69022], [98.50253, 16.7139], [98.46994, 16.73613], [98.53833, 16.81934], [98.49603, 16.8446], [98.52624, 16.89979], [98.39441, 17.06266], [98.34566, 17.04822], [98.10439, 17.33847], [98.11185, 17.36829], [97.91829, 17.54504], [97.76407, 17.71595], [97.66794, 17.88005], [97.73723, 17.97912], [97.60841, 18.23846], [97.64116, 18.29778], [97.56219, 18.33885], [97.50383, 18.26844], [97.34522, 18.54596], [97.36444, 18.57138], [97.5258, 18.4939], [97.76752, 18.58097], [97.73836, 18.88478], [97.66487, 18.9371], [97.73654, 18.9812], [97.73797, 19.04261], [97.83479, 19.09972], [97.84024, 19.22217], [97.78606, 19.26769], [97.84186, 19.29526], [97.78769, 19.39429], [97.88423, 19.5041], [97.84715, 19.55782], [98.04364, 19.65755], [98.03314, 19.80941], [98.13829, 19.78541], [98.24884, 19.67876], [98.51182, 19.71303], [98.56065, 19.67807], [98.83661, 19.80931], [98.98679, 19.7419], [99.0735, 20.10298], [99.20328, 20.12877], [99.416, 20.08614], [99.52943, 20.14811], [99.5569, 20.20676], [99.46077, 20.36198], [99.46008, 20.39673], [99.68255, 20.32077], [99.81096, 20.33687], [99.86383, 20.44371], [99.88211, 20.44488], [99.88451, 20.44596], [99.89168, 20.44548], [99.89301, 20.44311], [99.89692, 20.44789], [99.90499, 20.4487], [99.91616, 20.44986], [99.95721, 20.46301], [100.08404, 20.36626], [100.1957, 20.68247], [100.36375, 20.82783], [100.51079, 20.82194], [100.60112, 20.8347], [100.64628, 20.88279], [100.50974, 20.88574], [100.55281, 21.02796], [100.63578, 21.05639], [100.72716, 21.31786], [100.80173, 21.2934], [101.00234, 21.39612], [101.16198, 21.52808], [101.15156, 21.56129], [101.11744, 21.77659], [100.87265, 21.67396], [100.72143, 21.51898], [100.57861, 21.45637], [100.4811, 21.46148], [100.42892, 21.54325], [100.35201, 21.53176], [100.25863, 21.47043], [100.18447, 21.51898], [100.1625, 21.48704], [100.12542, 21.50365], [100.10757, 21.59945], [100.17486, 21.65306], [100.12679, 21.70539], [100.04956, 21.66843], [99.98654, 21.71064], [99.94003, 21.82782], [99.99084, 21.97053], [99.96612, 22.05965], [99.85351, 22.04183], [99.47585, 22.13345], [99.33166, 22.09656], [99.1552, 22.15874], [99.19176, 22.16983], [99.17318, 22.18025], [99.28771, 22.4105], [99.37972, 22.50188], [99.38247, 22.57544], [99.31243, 22.73893], [99.45654, 22.85726], [99.43537, 22.94086], [99.54218, 22.90014], [99.52214, 23.08218], [99.34127, 23.13099], [99.25741, 23.09025], [99.04601, 23.12215], [99.05975, 23.16382], [98.88597, 23.18656], [98.92515, 23.29535], [98.93958, 23.31414], [98.87573, 23.33038], [98.92104, 23.36946], [98.87683, 23.48995], [98.82877, 23.47908], [98.80294, 23.5345], [98.88396, 23.59555], [98.81775, 23.694], [98.82933, 23.72921], [98.79607, 23.77947], [98.68209, 23.80492], [98.67797, 23.9644], [98.89632, 24.10612], [98.87998, 24.15624], [98.85319, 24.13042], [98.59256, 24.08371], [98.54476, 24.13119], [98.20666, 24.11406], [98.07806, 24.07988], [98.06703, 24.08028], [98.0607, 24.07812], [98.05671, 24.07961], [98.05302, 24.07408], [98.04709, 24.07616], [97.99583, 24.04932], [97.98691, 24.03897], [97.93951, 24.01953], [97.90998, 24.02094], [97.88616, 24.00463], [97.88414, 23.99405], [97.88814, 23.98605], [97.89683, 23.98389], [97.89676, 23.97931], [97.8955, 23.97758], [97.88811, 23.97446], [97.86545, 23.97723], [97.84328, 23.97603], [97.79416, 23.95663], [97.79456, 23.94836], [97.72302, 23.89288], [97.64667, 23.84574], [97.5247, 23.94032], [97.62363, 24.00506], [97.72903, 24.12606], [97.75305, 24.16902], [97.72799, 24.18883], [97.72998, 24.2302], [97.76799, 24.26365], [97.71941, 24.29652], [97.66723, 24.30027], [97.65624, 24.33781], [97.7098, 24.35658], [97.66998, 24.45288], [97.60029, 24.4401], [97.52757, 24.43748], [97.56286, 24.54535], [97.56525, 24.72838], [97.54675, 24.74202], [97.5542, 24.74943], [97.56383, 24.75535], [97.56648, 24.76475], [97.64354, 24.79171], [97.70181, 24.84557], [97.73127, 24.83015], [97.76481, 24.8289], [97.79949, 24.85655], [97.72903, 24.91332], [97.72216, 25.08508], [97.77023, 25.11492], [97.83614, 25.2715], [97.92541, 25.20815], [98.14925, 25.41547], [98.12591, 25.50722], [98.18084, 25.56298], [98.16848, 25.62739], [98.25774, 25.6051], [98.31268, 25.55307], [98.40606, 25.61129], [98.54064, 25.85129], [98.63128, 25.79937], [98.70818, 25.86241], [98.60763, 26.01512], [98.57085, 26.11547], [98.63128, 26.15492], [98.66884, 26.09165], [98.7329, 26.17218], [98.67797, 26.24487], [98.72741, 26.36183], [98.77547, 26.61994], [98.7333, 26.85615], [98.69582, 27.56499], [98.43353, 27.67086], [98.42529, 27.55404], [98.32641, 27.51385], [98.13964, 27.9478], [98.15337, 28.12114], [97.90069, 28.3776], [97.79632, 28.33168], [97.70705, 28.5056], [97.56835, 28.55628], [97.50518, 28.49716], [97.47085, 28.2688], [97.41729, 28.29783], [97.34547, 28.21385], [97.31292, 28.06784], [97.35412, 28.06663], [97.38845, 28.01329], [97.35824, 27.87256], [97.29919, 27.92233], [96.90112, 27.62149], [96.91431, 27.45752], [97.17422, 27.14052], [97.14675, 27.09041], [96.89132, 27.17474], [96.85287, 27.2065], [96.88445, 27.25046], [96.73888, 27.36638], [96.55761, 27.29928], [96.40779, 27.29818], [96.15591, 27.24572], [96.04949, 27.19428], [95.93002, 27.04149], [95.81603, 27.01335], [95.437, 26.7083], [95.30339, 26.65372], [95.23513, 26.68499], [95.05798, 26.45408], [95.12801, 26.38397], [95.11428, 26.1019], [95.18556, 26.07338], [94.80117, 25.49359], [94.68032, 25.47003], [94.57458, 25.20318], [94.74212, 25.13606], [94.73937, 25.00545], [94.60204, 24.70889], [94.5526, 24.70764], [94.50729, 24.59281], [94.45279, 24.56656], [94.32362, 24.27692], [94.30215, 24.23752], [94.14081, 23.83333], [93.92089, 23.95812], [93.80279, 23.92549], [93.75952, 24.0003], [93.62871, 24.00922], [93.50616, 23.94432], [93.46633, 23.97067], [93.41415, 24.07854], [93.34735, 24.10151], [93.32351, 24.04468], [93.36059, 23.93176], [93.3908, 23.92925], [93.3908, 23.7622], [93.43475, 23.68299], [93.38805, 23.4728], [93.39981, 23.38828], [93.38781, 23.36139], [93.36862, 23.35426], [93.38478, 23.13698], [93.2878, 23.00464], [93.12988, 23.05772], [93.134, 22.92498], [93.09417, 22.69459], [93.134, 22.59573], [93.11477, 22.54374], [93.13537, 22.45873], [93.18206, 22.43716], [93.19991, 22.25425], [93.14224, 22.24535], [93.15734, 22.18687], [93.04885, 22.20595], [92.99255, 22.05965], [92.99804, 21.98964], [92.93899, 22.02656], [92.89504, 21.95143], [92.86208, 22.05456], [92.70416, 22.16017], [92.67532, 22.03547], [92.60949, 21.97638], [92.62187, 21.87037]]]]
+         }
+       }, {
+         type: "Feature",
+         properties: {
+           iso1A2: "MN",
+           iso1A3: "MNG",
+           iso1N3: "496",
+           wikidata: "Q711",
+           nameEn: "Mongolia",
+           groups: ["030", "142", "UN"],
+           callingCodes: ["976"]
+         },
+         geometry: {
+           type: "MultiPolygon",
+           coordinates: [[[[102.14032, 51.35566], [101.5044, 51.50467], [101.39085, 51.45753], [100.61116, 51.73028], [99.89203, 51.74903], [99.75578, 51.90108], [99.27888, 51.96876], [98.87768, 52.14563], [98.74142, 51.8637], [98.33222, 51.71832], [98.22053, 51.46579], [98.05257, 51.46696], [97.83305, 51.00248], [98.01472, 50.86652], [97.9693, 50.78044], [98.06393, 50.61262], [98.31373, 50.4996], [98.29481, 50.33561], [97.85197, 49.91339], [97.76871, 49.99861], [97.56432, 49.92801], [97.56811, 49.84265], [97.24639, 49.74737], [96.97388, 49.88413], [95.80056, 50.04239], [95.74757, 49.97915], [95.02465, 49.96941], [94.97166, 50.04725], [94.6121, 50.04239], [94.49477, 50.17832], [94.39258, 50.22193], [94.30823, 50.57498], [92.99595, 50.63183], [93.01109, 50.79001], [92.44714, 50.78762], [92.07173, 50.69585], [91.86048, 50.73734], [89.59711, 49.90851], [89.70687, 49.72535], [88.82499, 49.44808], [88.42449, 49.48821], [88.17223, 49.46934], [88.15543, 49.30314], [87.98977, 49.18147], [87.81333, 49.17354], [87.88171, 48.95853], [87.73822, 48.89582], [88.0788, 48.71436], [87.96361, 48.58478], [88.58939, 48.34531], [88.58316, 48.21893], [88.8011, 48.11302], [88.93186, 48.10263], [89.0711, 47.98528], [89.55453, 48.0423], [89.76624, 47.82745], [90.06512, 47.88177], [90.10871, 47.7375], [90.33598, 47.68303], [90.48854, 47.41826], [90.48542, 47.30438], [90.76108, 46.99399], [90.84035, 46.99525], [91.03649, 46.72916], [91.0147, 46.58171], [91.07696, 46.57315], [90.89639, 46.30711], [90.99672, 46.14207], [91.03026, 46.04194], [90.70907, 45.73437], [90.65114, 45.49314], [90.89169, 45.19667], [91.64048, 45.07408], [93.51161, 44.95964], [94.10003, 44.71016], [94.71959, 44.35284], [95.01191, 44.25274], [95.39772, 44.2805], [95.32891, 44.02407], [95.52594, 43.99353], [95.89543, 43.2528], [96.35658, 42.90363], [96.37926, 42.72055], [97.1777, 42.7964], [99.50671, 42.56535], [100.33297, 42.68231], [100.84979, 42.67087], [101.80515, 42.50074], [102.07645, 42.22519], [102.72403, 42.14675], [103.92804, 41.78246], [104.52258, 41.8706], [104.51667, 41.66113], [105.0123, 41.63188], [106.76517, 42.28741], [107.24774, 42.36107], [107.29755, 42.41395], [107.49681, 42.46221], [107.57258, 42.40898], [108.84489, 42.40246], [109.00679, 42.45302], [109.452, 42.44842], [109.89402, 42.63111], [110.08401, 42.6411], [110.4327, 42.78293], [111.0149, 43.3289], [111.59087, 43.51207], [111.79758, 43.6637], [111.93776, 43.68709], [111.96289, 43.81596], [111.40498, 44.3461], [111.76275, 44.98032], [111.98695, 45.09074], [112.4164, 45.06858], [112.74662, 44.86297], [113.70918, 44.72891], [114.5166, 45.27189], [114.54801, 45.38337], [114.74612, 45.43585], [114.94546, 45.37377], [115.60329, 45.44717], [116.16989, 45.68603], [116.27366, 45.78637], [116.24012, 45.8778], [116.26678, 45.96479], [116.58612, 46.30211], [116.75551, 46.33083], [116.83166, 46.38637], [117.36609, 46.36335], [117.41782, 46.57862], [117.60748, 46.59771], [117.69554, 46.50991], [118.30534, 46.73519], [118.78747, 46.68689], [118.8337, 46.77742], [118.89974, 46.77139], [118.92616, 46.72765], [119.00541, 46.74273], [119.10448, 46.65516], [119.24978, 46.64761], [119.32827, 46.61433], [119.42827, 46.63783], [119.65265, 46.62342], [119.68127, 46.59015], [119.77373, 46.62947], [119.80455, 46.67631], [119.89261, 46.66423], [119.91242, 46.90091], [119.85518, 46.92196], [119.71209, 47.19192], [119.62403, 47.24575], [119.56019, 47.24874], [119.54918, 47.29505], [119.31964, 47.42617], [119.35892, 47.48104], [119.13995, 47.53997], [119.12343, 47.66458], [118.7564, 47.76947], [118.55766, 47.99277], [118.29654, 48.00246], [118.22677, 48.03853], [118.11009, 48.04], [118.03676, 48.00982], [117.80196, 48.01661], [117.50181, 47.77216], [117.37875, 47.63627], [116.9723, 47.87285], [116.67405, 47.89039], [116.4465, 47.83662], [116.21879, 47.88505], [115.94296, 47.67741], [115.57128, 47.91988], [115.52082, 48.15367], [115.811, 48.25699], [115.78876, 48.51781], [116.06565, 48.81716], [116.03781, 48.87014], [116.71193, 49.83813], [116.62502, 49.92919], [116.22402, 50.04477], [115.73602, 49.87688], [115.26068, 49.97367], [114.9703, 50.19254], [114.325, 50.28098], [113.20216, 49.83356], [113.02647, 49.60772], [110.64493, 49.1816], [110.39891, 49.25083], [110.24373, 49.16676], [109.51325, 49.22859], [109.18017, 49.34709], [108.53969, 49.32325], [108.27937, 49.53167], [107.95387, 49.66659], [107.96116, 49.93191], [107.36407, 49.97612], [107.1174, 50.04239], [107.00007, 50.1977], [106.80326, 50.30177], [106.58373, 50.34044], [106.51122, 50.34408], [106.49628, 50.32436], [106.47156, 50.31909], [106.07865, 50.33474], [106.05562, 50.40582], [105.32528, 50.4648], [103.70343, 50.13952], [102.71178, 50.38873], [102.32194, 50.67982], [102.14032, 51.35566]]]]
+         }
+       }, {
+         type: "Feature",
+         properties: {
+           iso1A2: "MO",
+           iso1A3: "MAC",
+           iso1N3: "446",
+           wikidata: "Q14773",
+           nameEn: "Macau",
+           aliases: ["Macao"],
+           country: "CN",
+           groups: ["030", "142", "UN"],
+           driveSide: "left",
+           callingCodes: ["853"]
+         },
+         geometry: {
+           type: "MultiPolygon",
+           coordinates: [[[[113.54942, 22.14519], [113.54839, 22.10909], [113.57191, 22.07696], [113.63011, 22.10782], [113.60504, 22.20464], [113.57123, 22.20416], [113.56865, 22.20973], [113.5508, 22.21672], [113.54333, 22.21688], [113.54093, 22.21314], [113.53593, 22.2137], [113.53301, 22.21235], [113.53552, 22.20607], [113.52659, 22.18271], [113.54093, 22.15497], [113.54942, 22.14519]]]]
+         }
+       }, {
+         type: "Feature",
+         properties: {
+           iso1A2: "MP",
+           iso1A3: "MNP",
+           iso1N3: "580",
+           wikidata: "Q16644",
+           nameEn: "Northern Mariana Islands",
+           aliases: ["US-MP"],
+           country: "US",
+           groups: ["Q1352230", "Q153732", "057", "009", "UN"],
+           roadSpeedUnit: "mph",
+           callingCodes: ["1 670"]
+         },
+         geometry: {
+           type: "MultiPolygon",
+           coordinates: [[[[135.52896, 14.32623], [152.19114, 13.63487], [145.05972, 21.28731], [135.52896, 14.32623]]]]
+         }
+       }, {
+         type: "Feature",
+         properties: {
+           iso1A2: "MQ",
+           iso1A3: "MTQ",
+           iso1N3: "474",
+           wikidata: "Q17054",
+           nameEn: "Martinique",
+           country: "FR",
+           groups: ["Q3320166", "EU", "029", "003", "419", "019", "UN"],
+           callingCodes: ["596"]
+         },
+         geometry: {
+           type: "MultiPolygon",
+           coordinates: [[[[-59.95997, 14.20285], [-61.07821, 15.25109], [-61.69315, 14.26451], [-59.95997, 14.20285]]]]
+         }
+       }, {
+         type: "Feature",
+         properties: {
+           iso1A2: "MR",
+           iso1A3: "MRT",
+           iso1N3: "478",
+           wikidata: "Q1025",
+           nameEn: "Mauritania",
+           groups: ["011", "202", "002", "UN"],
+           callingCodes: ["222"]
+         },
+         geometry: {
+           type: "MultiPolygon",
+           coordinates: [[[[-5.60725, 16.49919], [-6.57191, 25.0002], [-4.83423, 24.99935], [-8.66674, 27.31569], [-8.66721, 25.99918], [-12.0002, 25.9986], [-12.00251, 23.4538], [-12.14969, 23.41935], [-12.36213, 23.3187], [-12.5741, 23.28975], [-13.00412, 23.02297], [-13.10753, 22.89493], [-13.15313, 22.75649], [-13.08438, 22.53866], [-13.01525, 21.33343], [-16.95474, 21.33997], [-16.99806, 21.12142], [-17.0357, 21.05368], [-17.0396, 20.9961], [-17.06781, 20.92697], [-17.0695, 20.85742], [-17.0471, 20.76408], [-17.15288, 16.07139], [-16.50854, 16.09032], [-16.48967, 16.0496], [-16.44814, 16.09753], [-16.4429, 16.20605], [-16.27016, 16.51565], [-15.6509, 16.50315], [-15.00557, 16.64997], [-14.32144, 16.61495], [-13.80075, 16.13961], [-13.43135, 16.09022], [-13.11029, 15.52116], [-12.23936, 14.76324], [-11.94903, 14.76143], [-11.70705, 15.51558], [-11.43483, 15.62339], [-10.90932, 15.11001], [-10.71721, 15.4223], [-9.40447, 15.4396], [-9.44673, 15.60553], [-9.33314, 15.7044], [-9.31106, 15.69412], [-9.32979, 15.50032], [-5.50165, 15.50061], [-5.33435, 16.33354], [-5.60725, 16.49919]]]]
+         }
+       }, {
+         type: "Feature",
+         properties: {
+           iso1A2: "MS",
+           iso1A3: "MSR",
+           iso1N3: "500",
+           wikidata: "Q13353",
+           nameEn: "Montserrat",
+           country: "GB",
+           groups: ["BOTS", "029", "003", "419", "019", "UN"],
+           driveSide: "left",
+           roadSpeedUnit: "mph",
+           roadHeightUnit: "ft",
+           callingCodes: ["1 664"]
+         },
+         geometry: {
+           type: "MultiPolygon",
+           coordinates: [[[[-61.91508, 16.51165], [-62.1023, 16.97277], [-62.58307, 16.68909], [-61.91508, 16.51165]]]]
+         }
+       }, {
+         type: "Feature",
+         properties: {
+           iso1A2: "MT",
+           iso1A3: "MLT",
+           iso1N3: "470",
+           wikidata: "Q233",
+           nameEn: "Malta",
+           groups: ["EU", "039", "150", "UN"],
+           driveSide: "left",
+           callingCodes: ["356"]
+         },
+         geometry: {
+           type: "MultiPolygon",
+           coordinates: [[[[15.70991, 35.79901], [14.07544, 36.41525], [13.27636, 35.20764], [15.70991, 35.79901]]]]
+         }
+       }, {
+         type: "Feature",
+         properties: {
+           iso1A2: "MU",
+           iso1A3: "MUS",
+           iso1N3: "480",
+           wikidata: "Q1027",
+           nameEn: "Mauritius",
+           groups: ["014", "202", "002", "UN"],
+           driveSide: "left",
+           callingCodes: ["230"]
+         },
+         geometry: {
+           type: "MultiPolygon",
+           coordinates: [[[[56.09755, -9.55401], [57.50644, -31.92637], [68.4673, -19.15185], [56.09755, -9.55401]]]]
+         }
+       }, {
+         type: "Feature",
+         properties: {
+           iso1A2: "MV",
+           iso1A3: "MDV",
+           iso1N3: "462",
+           wikidata: "Q826",
+           nameEn: "Maldives",
+           groups: ["034", "142", "UN"],
+           driveSide: "left",
+           callingCodes: ["960"]
+         },
+         geometry: {
+           type: "MultiPolygon",
+           coordinates: [[[[71.9161, 8.55531], [72.57428, -3.7623], [76.59015, 5.591], [71.9161, 8.55531]]]]
+         }
+       }, {
+         type: "Feature",
+         properties: {
+           iso1A2: "MW",
+           iso1A3: "MWI",
+           iso1N3: "454",
+           wikidata: "Q1020",
+           nameEn: "Malawi",
+           groups: ["014", "202", "002", "UN"],
+           driveSide: "left",
+           callingCodes: ["265"]
+         },
+         geometry: {
+           type: "MultiPolygon",
+           coordinates: [[[[33.48052, -9.62442], [33.31581, -9.48554], [33.14925, -9.49322], [32.99397, -9.36712], [32.95389, -9.40138], [33.00476, -9.5133], [33.00256, -9.63053], [33.05485, -9.61316], [33.10163, -9.66525], [33.12144, -9.58929], [33.2095, -9.61099], [33.31517, -9.82364], [33.36581, -9.81063], [33.37902, -9.9104], [33.31297, -10.05133], [33.53863, -10.20148], [33.54797, -10.36077], [33.70675, -10.56896], [33.47636, -10.78465], [33.28022, -10.84428], [33.25998, -10.88862], [33.39697, -11.15296], [33.29267, -11.3789], [33.29267, -11.43536], [33.23663, -11.40637], [33.24252, -11.59302], [33.32692, -11.59248], [33.33937, -11.91252], [33.25998, -12.14242], [33.3705, -12.34931], [33.47636, -12.32498], [33.54485, -12.35996], [33.37517, -12.54085], [33.28177, -12.54692], [33.18837, -12.61377], [33.05917, -12.59554], [32.94397, -12.76868], [32.96733, -12.88251], [33.02181, -12.88707], [32.98289, -13.12671], [33.0078, -13.19492], [32.86113, -13.47292], [32.84176, -13.52794], [32.73683, -13.57682], [32.68436, -13.55769], [32.66468, -13.60019], [32.68654, -13.64268], [32.7828, -13.64805], [32.84528, -13.71576], [32.76962, -13.77224], [32.79015, -13.80755], [32.88985, -13.82956], [32.99042, -13.95689], [33.02977, -14.05022], [33.07568, -13.98447], [33.16749, -13.93992], [33.24249, -14.00019], [33.66677, -14.61306], [33.7247, -14.4989], [33.88503, -14.51652], [33.92898, -14.47929], [34.08588, -14.48893], [34.18733, -14.43823], [34.22355, -14.43607], [34.34453, -14.3985], [34.35843, -14.38652], [34.39277, -14.39467], [34.4192, -14.43191], [34.44641, -14.47746], [34.45053, -14.49873], [34.47628, -14.53363], [34.48932, -14.53646], [34.49636, -14.55091], [34.52366, -14.5667], [34.53962, -14.59776], [34.55112, -14.64494], [34.53516, -14.67782], [34.52057, -14.68263], [34.54503, -14.74672], [34.567, -14.77345], [34.61522, -14.99583], [34.57503, -15.30619], [34.43126, -15.44778], [34.44981, -15.60864], [34.25195, -15.90321], [34.43126, -16.04737], [34.40344, -16.20923], [35.04805, -16.83167], [35.13771, -16.81687], [35.17017, -16.93521], [35.04805, -17.00027], [35.0923, -17.13235], [35.3062, -17.1244], [35.27065, -16.93817], [35.30929, -16.82871], [35.27219, -16.69402], [35.14235, -16.56812], [35.25828, -16.4792], [35.30157, -16.2211], [35.43355, -16.11371], [35.52365, -16.15414], [35.70107, -16.10147], [35.80487, -16.03907], [35.85303, -15.41913], [35.78799, -15.17428], [35.91812, -14.89514], [35.87212, -14.89478], [35.86945, -14.67481], [35.5299, -14.27714], [35.47989, -14.15594], [34.86229, -13.48958], [34.60253, -13.48487], [34.37831, -12.17408], [34.46088, -12.0174], [34.70739, -12.15652], [34.82903, -12.04837], [34.57917, -11.87849], [34.64241, -11.57499], [34.96296, -11.57354], [34.91153, -11.39799], [34.79375, -11.32245], [34.63305, -11.11731], [34.61161, -11.01611], [34.67047, -10.93796], [34.65946, -10.6828], [34.57581, -10.56271], [34.51911, -10.12279], [34.54499, -10.0678], [34.03865, -9.49398], [33.95829, -9.54066], [33.9638, -9.62206], [33.93298, -9.71647], [33.76677, -9.58516], [33.48052, -9.62442]]]]
+         }
+       }, {
+         type: "Feature",
+         properties: {
+           iso1A2: "MX",
+           iso1A3: "MEX",
+           iso1N3: "484",
+           wikidata: "Q96",
+           nameEn: "Mexico",
+           groups: ["013", "003", "419", "019", "UN"],
+           callingCodes: ["52"]
+         },
+         geometry: {
+           type: "MultiPolygon",
+           coordinates: [[[[-117.1243, 32.53427], [-118.48109, 32.5991], [-120.12904, 18.41089], [-92.37213, 14.39277], [-92.2261, 14.53423], [-92.1454, 14.6804], [-92.18161, 14.84147], [-92.1423, 14.88647], [-92.1454, 14.98143], [-92.0621, 15.07406], [-92.20983, 15.26077], [-91.73182, 16.07371], [-90.44567, 16.07573], [-90.40499, 16.40524], [-90.61212, 16.49832], [-90.69064, 16.70697], [-91.04436, 16.92175], [-91.43809, 17.25373], [-90.99199, 17.25192], [-90.98678, 17.81655], [-89.14985, 17.81563], [-89.15105, 17.95104], [-89.03839, 18.0067], [-88.8716, 17.89535], [-88.71505, 18.0707], [-88.48242, 18.49164], [-88.3268, 18.49048], [-88.29909, 18.47591], [-88.26593, 18.47617], [-88.03238, 18.41778], [-88.03165, 18.16657], [-87.90671, 18.15213], [-87.87604, 18.18313], [-87.86657, 18.19971], [-87.85693, 18.18266], [-87.84815, 18.18511], [-86.92368, 17.61462], [-85.9092, 21.8218], [-96.92418, 25.97377], [-97.13927, 25.96583], [-97.35946, 25.92189], [-97.37332, 25.83854], [-97.42511, 25.83969], [-97.45669, 25.86874], [-97.49828, 25.89877], [-97.52025, 25.88518], [-97.66511, 26.01708], [-97.95155, 26.0625], [-97.97017, 26.05232], [-98.24603, 26.07191], [-98.27075, 26.09457], [-98.30491, 26.10475], [-98.35126, 26.15129], [-99.00546, 26.3925], [-99.03053, 26.41249], [-99.08477, 26.39849], [-99.53573, 27.30926], [-99.49744, 27.43746], [-99.482, 27.47128], [-99.48045, 27.49016], [-99.50208, 27.50021], [-99.52955, 27.49747], [-99.51478, 27.55836], [-99.55409, 27.61314], [-100.50029, 28.66117], [-100.51222, 28.70679], [-100.5075, 28.74066], [-100.52313, 28.75598], [-100.59809, 28.88197], [-100.63689, 28.90812], [-100.67294, 29.09744], [-100.79696, 29.24688], [-100.87982, 29.296], [-100.94056, 29.33371], [-100.94579, 29.34523], [-100.96725, 29.3477], [-101.01128, 29.36947], [-101.05686, 29.44738], [-101.47277, 29.7744], [-102.60596, 29.8192], [-103.15787, 28.93865], [-104.37752, 29.54255], [-104.39363, 29.55396], [-104.3969, 29.57105], [-104.5171, 29.64671], [-104.77674, 30.4236], [-106.00363, 31.39181], [-106.09025, 31.40569], [-106.20346, 31.46305], [-106.23711, 31.51262], [-106.24612, 31.54193], [-106.28084, 31.56173], [-106.30305, 31.62154], [-106.33419, 31.66303], [-106.34864, 31.69663], [-106.3718, 31.71165], [-106.38003, 31.73151], [-106.41773, 31.75196], [-106.43419, 31.75478], [-106.45244, 31.76523], [-106.46726, 31.75998], [-106.47298, 31.75054], [-106.48815, 31.74769], [-106.50111, 31.75714], [-106.50962, 31.76155], [-106.51251, 31.76922], [-106.52266, 31.77509], [-106.529, 31.784], [-108.20899, 31.78534], [-108.20979, 31.33316], [-111.07523, 31.33232], [-114.82011, 32.49609], [-114.79524, 32.55731], [-114.81141, 32.55543], [-114.80584, 32.62028], [-114.76736, 32.64094], [-114.71871, 32.71894], [-115.88053, 32.63624], [-117.1243, 32.53427]]]]
+         }
+       }, {
+         type: "Feature",
+         properties: {
+           iso1A2: "MY",
+           iso1A3: "MYS",
+           iso1N3: "458",
+           wikidata: "Q833",
+           nameEn: "Malaysia"
+         },
+         geometry: null
+       }, {
+         type: "Feature",
+         properties: {
+           iso1A2: "MZ",
+           iso1A3: "MOZ",
+           iso1N3: "508",
+           wikidata: "Q1029",
+           nameEn: "Mozambique",
+           groups: ["014", "202", "002", "UN"],
+           driveSide: "left",
+           callingCodes: ["258"]
+         },
+         geometry: {
+           type: "MultiPolygon",
+           coordinates: [[[[40.74206, -10.25691], [40.44265, -10.4618], [40.00295, -10.80255], [39.58249, -10.96043], [39.24395, -11.17433], [38.88996, -11.16978], [38.47258, -11.4199], [38.21598, -11.27289], [37.93618, -11.26228], [37.8388, -11.3123], [37.76614, -11.53352], [37.3936, -11.68949], [36.80309, -11.56836], [36.62068, -11.72884], [36.19094, -11.70008], [36.19094, -11.57593], [35.82767, -11.41081], [35.63599, -11.55927], [34.96296, -11.57354], [34.64241, -11.57499], [34.57917, -11.87849], [34.82903, -12.04837], [34.70739, -12.15652], [34.46088, -12.0174], [34.37831, -12.17408], [34.60253, -13.48487], [34.86229, -13.48958], [35.47989, -14.15594], [35.5299, -14.27714], [35.86945, -14.67481], [35.87212, -14.89478], [35.91812, -14.89514], [35.78799, -15.17428], [35.85303, -15.41913], [35.80487, -16.03907], [35.70107, -16.10147], [35.52365, -16.15414], [35.43355, -16.11371], [35.30157, -16.2211], [35.25828, -16.4792], [35.14235, -16.56812], [35.27219, -16.69402], [35.30929, -16.82871], [35.27065, -16.93817], [35.3062, -17.1244], [35.0923, -17.13235], [35.04805, -17.00027], [35.17017, -16.93521], [35.13771, -16.81687], [35.04805, -16.83167], [34.40344, -16.20923], [34.43126, -16.04737], [34.25195, -15.90321], [34.44981, -15.60864], [34.43126, -15.44778], [34.57503, -15.30619], [34.61522, -14.99583], [34.567, -14.77345], [34.54503, -14.74672], [34.52057, -14.68263], [34.53516, -14.67782], [34.55112, -14.64494], [34.53962, -14.59776], [34.52366, -14.5667], [34.49636, -14.55091], [34.48932, -14.53646], [34.47628, -14.53363], [34.45053, -14.49873], [34.44641, -14.47746], [34.4192, -14.43191], [34.39277, -14.39467], [34.35843, -14.38652], [34.34453, -14.3985], [34.22355, -14.43607], [34.18733, -14.43823], [34.08588, -14.48893], [33.92898, -14.47929], [33.88503, -14.51652], [33.7247, -14.4989], [33.66677, -14.61306], [33.24249, -14.00019], [30.22098, -14.99447], [30.41902, -15.62269], [30.42568, -15.9962], [30.91597, -15.99924], [30.97761, -16.05848], [31.13171, -15.98019], [31.30563, -16.01193], [31.42451, -16.15154], [31.67988, -16.19595], [31.90223, -16.34388], [31.91324, -16.41569], [32.02772, -16.43892], [32.28529, -16.43892], [32.42838, -16.4727], [32.71017, -16.59932], [32.69917, -16.66893], [32.78943, -16.70267], [32.97655, -16.70689], [32.91051, -16.89446], [32.84113, -16.92259], [32.96554, -17.11971], [33.00517, -17.30477], [33.0426, -17.3468], [32.96554, -17.48964], [32.98536, -17.55891], [33.0492, -17.60298], [32.94133, -17.99705], [33.03159, -18.35054], [33.02278, -18.4696], [32.88629, -18.51344], [32.88629, -18.58023], [32.95013, -18.69079], [32.9017, -18.7992], [32.82465, -18.77419], [32.70137, -18.84712], [32.73439, -18.92628], [32.69917, -18.94293], [32.72118, -19.02204], [32.84006, -19.0262], [32.87088, -19.09279], [32.85107, -19.29238], [32.77966, -19.36098], [32.78282, -19.47513], [32.84446, -19.48343], [32.84666, -19.68462], [32.95013, -19.67219], [33.06461, -19.77787], [33.01178, -20.02007], [32.93032, -20.03868], [32.85987, -20.16686], [32.85987, -20.27841], [32.66174, -20.56106], [32.55167, -20.56312], [32.48122, -20.63319], [32.51644, -20.91929], [32.37115, -21.133], [32.48236, -21.32873], [32.41234, -21.31246], [31.38336, -22.36919], [31.30611, -22.422], [31.55779, -23.176], [31.56539, -23.47268], [31.67942, -23.60858], [31.70223, -23.72695], [31.77445, -23.90082], [31.87707, -23.95293], [31.90368, -24.18892], [31.9835, -24.29983], [32.03196, -25.10785], [32.01676, -25.38117], [31.97875, -25.46356], [32.00631, -25.65044], [31.92649, -25.84216], [31.974, -25.95387], [32.00916, -25.999], [32.08599, -26.00978], [32.10435, -26.15656], [32.07352, -26.40185], [32.13409, -26.5317], [32.13315, -26.84345], [32.19409, -26.84032], [32.22302, -26.84136], [32.29584, -26.852], [32.35222, -26.86027], [34.51034, -26.91792], [42.99868, -12.65261], [40.74206, -10.25691]]]]
+         }
+       }, {
+         type: "Feature",
+         properties: {
+           iso1A2: "NA",
+           iso1A3: "NAM",
+           iso1N3: "516",
+           wikidata: "Q1030",
+           nameEn: "Namibia",
+           groups: ["018", "202", "002", "UN"],
+           driveSide: "left",
+           callingCodes: ["264"]
+         },
+         geometry: {
+           type: "MultiPolygon",
+           coordinates: [[[[14.28743, -17.38814], [13.95896, -17.43141], [13.36212, -16.98048], [12.97145, -16.98567], [12.52111, -17.24495], [12.07076, -17.15165], [11.75063, -17.25013], [10.5065, -17.25284], [12.51595, -32.27486], [16.45332, -28.63117], [16.46592, -28.57126], [16.59922, -28.53246], [16.90446, -28.057], [17.15405, -28.08573], [17.4579, -28.68718], [18.99885, -28.89165], [19.99882, -28.42622], [19.99817, -24.76768], [19.99912, -21.99991], [20.99751, -22.00026], [20.99904, -18.31743], [21.45556, -18.31795], [23.0996, -18.00075], [23.29618, -17.99855], [23.61088, -18.4881], [24.19416, -18.01919], [24.40577, -17.95726], [24.57485, -18.07151], [24.6303, -17.9863], [24.71887, -17.9218], [24.73364, -17.89338], [24.95586, -17.79674], [25.05895, -17.84452], [25.16882, -17.78253], [25.26433, -17.79571], [25.00198, -17.58221], [24.70864, -17.49501], [24.5621, -17.52963], [24.38712, -17.46818], [24.32811, -17.49082], [24.23619, -17.47489], [23.47474, -17.62877], [21.42741, -18.02787], [21.14283, -17.94318], [18.84226, -17.80375], [18.39229, -17.38927], [14.28743, -17.38814]]]]
+         }
+       }, {
+         type: "Feature",
+         properties: {
+           iso1A2: "NC",
+           iso1A3: "NCL",
+           iso1N3: "540",
+           wikidata: "Q33788",
+           nameEn: "New Caledonia",
+           country: "FR",
+           groups: ["Q1451600", "054", "009", "UN"],
+           callingCodes: ["687"]
+         },
+         geometry: {
+           type: "MultiPolygon",
+           coordinates: [[[[159.77159, -28.41151], [174.245, -23.1974], [156.73836, -14.50464], [159.77159, -28.41151]]]]
+         }
+       }, {
+         type: "Feature",
+         properties: {
+           iso1A2: "NE",
+           iso1A3: "NER",
+           iso1N3: "562",
+           wikidata: "Q1032",
+           nameEn: "Niger",
+           aliases: ["RN"],
+           groups: ["011", "202", "002", "UN"],
+           callingCodes: ["227"]
+         },
+         geometry: {
+           type: "MultiPolygon",
+           coordinates: [[[[14.22918, 22.61719], [13.5631, 23.16574], [11.96886, 23.51735], [7.48273, 20.87258], [7.38361, 20.79165], [5.8153, 19.45101], [4.26651, 19.14224], [4.26762, 17.00432], [4.21787, 17.00118], [4.19893, 16.39923], [3.50368, 15.35934], [3.03134, 15.42221], [3.01806, 15.34571], [1.31275, 15.27978], [0.96711, 14.98275], [0.72632, 14.95898], [0.23859, 15.00135], [0.16936, 14.51654], [0.38051, 14.05575], [0.61924, 13.68491], [0.77377, 13.6866], [0.77637, 13.64442], [0.99514, 13.5668], [1.02813, 13.46635], [1.20088, 13.38951], [1.24429, 13.39373], [1.28509, 13.35488], [1.24516, 13.33968], [1.21217, 13.37853], [1.18873, 13.31771], [0.99253, 13.37515], [0.99167, 13.10727], [2.26349, 12.41915], [2.05785, 12.35539], [2.39723, 11.89473], [2.45824, 11.98672], [2.39657, 12.10952], [2.37783, 12.24804], [2.6593, 12.30631], [2.83978, 12.40585], [3.25352, 12.01467], [3.31613, 11.88495], [3.48187, 11.86092], [3.59375, 11.70269], [3.61075, 11.69181], [3.67988, 11.75429], [3.67122, 11.80865], [3.63063, 11.83042], [3.61955, 11.91847], [3.67775, 11.97599], [3.63136, 12.11826], [3.66364, 12.25884], [3.65111, 12.52223], [3.94339, 12.74979], [4.10006, 12.98862], [4.14367, 13.17189], [4.14186, 13.47586], [4.23456, 13.47725], [4.4668, 13.68286], [4.87425, 13.78], [4.9368, 13.7345], [5.07396, 13.75052], [5.21026, 13.73627], [5.27797, 13.75474], [5.35437, 13.83567], [5.52957, 13.8845], [6.15771, 13.64564], [6.27411, 13.67835], [6.43053, 13.6006], [6.69617, 13.34057], [6.94445, 12.99825], [7.0521, 13.00076], [7.12676, 13.02445], [7.22399, 13.1293], [7.39241, 13.09717], [7.81085, 13.34902], [8.07997, 13.30847], [8.25185, 13.20369], [8.41853, 13.06166], [8.49493, 13.07519], [8.60431, 13.01768], [8.64251, 12.93985], [8.97413, 12.83661], [9.65995, 12.80614], [10.00373, 13.18171], [10.19993, 13.27129], [10.46731, 13.28819], [10.66004, 13.36422], [11.4535, 13.37773], [11.88236, 13.2527], [12.04209, 13.14452], [12.16189, 13.10056], [12.19315, 13.12423], [12.47095, 13.06673], [12.58033, 13.27805], [12.6793, 13.29157], [12.87376, 13.48919], [13.05085, 13.53984], [13.19844, 13.52802], [13.33213, 13.71195], [13.6302, 13.71094], [13.47559, 14.40881], [13.48259, 14.46704], [13.68573, 14.55276], [13.67878, 14.64013], [13.809, 14.72915], [13.78991, 14.87519], [13.86301, 15.04043], [14.37425, 15.72591], [15.50373, 16.89649], [15.6032, 18.77402], [15.75098, 19.93002], [15.99632, 20.35364], [15.6721, 20.70069], [15.59841, 20.74039], [15.56004, 20.79488], [15.55382, 20.86507], [15.57248, 20.92138], [15.62515, 20.95395], [15.28332, 21.44557], [15.20213, 21.49365], [15.19692, 21.99339], [14.99751, 23.00539], [14.22918, 22.61719]]]]
+         }
+       }, {
+         type: "Feature",
+         properties: {
+           iso1A2: "NF",
+           iso1A3: "NFK",
+           iso1N3: "574",
+           wikidata: "Q31057",
+           nameEn: "Norfolk Island",
+           country: "AU",
+           groups: ["053", "009", "UN"],
+           driveSide: "left",
+           callingCodes: ["672 3"]
+         },
+         geometry: {
+           type: "MultiPolygon",
+           coordinates: [[[[169.82316, -28.16667], [166.29505, -28.29175], [167.94076, -30.60745], [169.82316, -28.16667]]]]
+         }
+       }, {
+         type: "Feature",
+         properties: {
+           iso1A2: "NG",
+           iso1A3: "NGA",
+           iso1N3: "566",
+           wikidata: "Q1033",
+           nameEn: "Nigeria",
+           groups: ["011", "202", "002", "UN"],
+           callingCodes: ["234"]
+         },
+         geometry: {
+           type: "MultiPolygon",
+           coordinates: [[[[6.15771, 13.64564], [5.52957, 13.8845], [5.35437, 13.83567], [5.27797, 13.75474], [5.21026, 13.73627], [5.07396, 13.75052], [4.9368, 13.7345], [4.87425, 13.78], [4.4668, 13.68286], [4.23456, 13.47725], [4.14186, 13.47586], [4.14367, 13.17189], [4.10006, 12.98862], [3.94339, 12.74979], [3.65111, 12.52223], [3.66364, 12.25884], [3.63136, 12.11826], [3.67775, 11.97599], [3.61955, 11.91847], [3.63063, 11.83042], [3.67122, 11.80865], [3.67988, 11.75429], [3.61075, 11.69181], [3.59375, 11.70269], [3.49175, 11.29765], [3.71505, 11.13015], [3.84243, 10.59316], [3.78292, 10.40538], [3.6844, 10.46351], [3.57275, 10.27185], [3.66908, 10.18136], [3.54429, 9.87739], [3.35383, 9.83641], [3.32099, 9.78032], [3.34726, 9.70696], [3.25093, 9.61632], [3.13928, 9.47167], [3.14147, 9.28375], [3.08017, 9.10006], [2.77907, 9.06924], [2.67523, 7.87825], [2.73095, 7.7755], [2.73405, 7.5423], [2.78668, 7.5116], [2.79442, 7.43486], [2.74489, 7.42565], [2.76965, 7.13543], [2.71702, 6.95722], [2.74024, 6.92802], [2.73405, 6.78508], [2.78823, 6.76356], [2.78204, 6.70514], [2.7325, 6.64057], [2.74334, 6.57291], [2.70464, 6.50831], [2.70566, 6.38038], [2.74181, 6.13349], [5.87055, 3.78489], [8.34397, 4.30689], [8.60302, 4.87353], [8.78027, 5.1243], [8.92029, 5.58403], [8.83687, 5.68483], [8.88156, 5.78857], [8.84209, 5.82562], [9.51757, 6.43874], [9.70674, 6.51717], [9.77824, 6.79088], [9.86314, 6.77756], [10.15135, 7.03781], [10.21466, 6.88996], [10.53639, 6.93432], [10.57214, 7.16345], [10.59746, 7.14719], [10.60789, 7.06885], [10.83727, 6.9358], [10.8179, 6.83377], [10.94302, 6.69325], [11.09644, 6.68437], [11.09495, 6.51717], [11.42041, 6.53789], [11.42264, 6.5882], [11.51499, 6.60892], [11.57755, 6.74059], [11.55818, 6.86186], [11.63117, 6.9905], [11.87396, 7.09398], [11.84864, 7.26098], [11.93205, 7.47812], [12.01844, 7.52981], [11.99908, 7.67302], [12.20909, 7.97553], [12.19271, 8.10826], [12.24782, 8.17904], [12.26123, 8.43696], [12.4489, 8.52536], [12.44146, 8.6152], [12.68722, 8.65938], [12.71701, 8.7595], [12.79, 8.75361], [12.81085, 8.91992], [12.90022, 9.11411], [12.91958, 9.33905], [12.85628, 9.36698], [13.02385, 9.49334], [13.22642, 9.57266], [13.25472, 9.76795], [13.29941, 9.8296], [13.25025, 9.86042], [13.24132, 9.91031], [13.27409, 9.93232], [13.286, 9.9822], [13.25323, 10.00127], [13.25025, 10.03647], [13.34111, 10.12299], [13.43644, 10.13326], [13.5705, 10.53183], [13.54964, 10.61236], [13.73434, 10.9255], [13.70753, 10.94451], [13.7403, 11.00593], [13.78945, 11.00154], [13.97489, 11.30258], [14.17821, 11.23831], [14.6124, 11.51283], [14.64591, 11.66166], [14.55207, 11.72001], [14.61612, 11.7798], [14.6474, 12.17466], [14.4843, 12.35223], [14.22215, 12.36533], [14.17523, 12.41916], [14.20204, 12.53405], [14.08251, 13.0797], [13.6302, 13.71094], [13.33213, 13.71195], [13.19844, 13.52802], [13.05085, 13.53984], [12.87376, 13.48919], [12.6793, 13.29157], [12.58033, 13.27805], [12.47095, 13.06673], [12.19315, 13.12423], [12.16189, 13.10056], [12.04209, 13.14452], [11.88236, 13.2527], [11.4535, 13.37773], [10.66004, 13.36422], [10.46731, 13.28819], [10.19993, 13.27129], [10.00373, 13.18171], [9.65995, 12.80614], [8.97413, 12.83661], [8.64251, 12.93985], [8.60431, 13.01768], [8.49493, 13.07519], [8.41853, 13.06166], [8.25185, 13.20369], [8.07997, 13.30847], [7.81085, 13.34902], [7.39241, 13.09717], [7.22399, 13.1293], [7.12676, 13.02445], [7.0521, 13.00076], [6.94445, 12.99825], [6.69617, 13.34057], [6.43053, 13.6006], [6.27411, 13.67835], [6.15771, 13.64564]]]]
+         }
+       }, {
+         type: "Feature",
+         properties: {
+           iso1A2: "NI",
+           iso1A3: "NIC",
+           iso1N3: "558",
+           wikidata: "Q811",
+           nameEn: "Nicaragua",
+           groups: ["013", "003", "419", "019", "UN"],
+           callingCodes: ["505"]
+         },
+         geometry: {
+           type: "MultiPolygon",
+           coordinates: [[[[-83.13724, 15.00002], [-83.49268, 15.01158], [-83.62101, 14.89448], [-83.89551, 14.76697], [-84.10584, 14.76353], [-84.48373, 14.63249], [-84.70119, 14.68078], [-84.82596, 14.82212], [-84.90082, 14.80489], [-85.1575, 14.53934], [-85.18602, 14.24929], [-85.32149, 14.2562], [-85.45762, 14.11304], [-85.73964, 13.9698], [-85.75477, 13.8499], [-86.03458, 13.99181], [-86.00685, 14.08474], [-86.14801, 14.04317], [-86.35219, 13.77157], [-86.76812, 13.79605], [-86.71267, 13.30348], [-86.87066, 13.30641], [-86.93383, 13.18677], [-86.93197, 13.05313], [-87.03785, 12.98682], [-87.06306, 13.00892], [-87.37107, 12.98646], [-87.55124, 13.12523], [-87.7346, 13.13228], [-88.11443, 12.63306], [-86.14524, 11.09059], [-85.71223, 11.06868], [-85.60529, 11.22607], [-84.92439, 10.9497], [-84.68197, 11.07568], [-83.90838, 10.71161], [-83.66597, 10.79916], [-83.68276, 11.01562], [-82.56142, 11.91792], [-82.06974, 14.49418], [-83.04763, 15.03256], [-83.13724, 15.00002]]]]
+         }
+       }, {
+         type: "Feature",
+         properties: {
+           iso1A2: "NL",
+           iso1A3: "NLD",
+           iso1N3: "528",
+           wikidata: "Q29999",
+           nameEn: "Kingdom of the Netherlands"
+         },
+         geometry: null
+       }, {
+         type: "Feature",
+         properties: {
+           iso1A2: "NO",
+           iso1A3: "NOR",
+           iso1N3: "578",
+           wikidata: "Q20",
+           nameEn: "Norway"
+         },
+         geometry: null
+       }, {
+         type: "Feature",
+         properties: {
+           iso1A2: "NP",
+           iso1A3: "NPL",
+           iso1N3: "524",
+           wikidata: "Q837",
+           nameEn: "Nepal",
+           groups: ["034", "142", "UN"],
+           driveSide: "left",
+           callingCodes: ["977"]
+         },
+         geometry: {
+           type: "MultiPolygon",
+           coordinates: [[[[88.13378, 27.88015], [87.82681, 27.95248], [87.72718, 27.80938], [87.56996, 27.84517], [87.11696, 27.84104], [87.03757, 27.94835], [86.75582, 28.04182], [86.74181, 28.10638], [86.56265, 28.09569], [86.51609, 27.96623], [86.42736, 27.91122], [86.22966, 27.9786], [86.18607, 28.17364], [86.088, 28.09264], [86.08333, 28.02121], [86.12069, 27.93047], [86.06309, 27.90021], [85.94946, 27.9401], [85.97813, 27.99023], [85.90743, 28.05144], [85.84672, 28.18187], [85.74864, 28.23126], [85.71907, 28.38064], [85.69105, 28.38475], [85.60854, 28.25045], [85.59765, 28.30529], [85.4233, 28.32996], [85.38127, 28.28336], [85.10729, 28.34092], [85.18668, 28.54076], [85.19135, 28.62825], [85.06059, 28.68562], [84.85511, 28.58041], [84.62317, 28.73887], [84.47528, 28.74023], [84.2231, 28.89571], [84.24801, 29.02783], [84.18107, 29.23451], [83.97559, 29.33091], [83.82303, 29.30513], [83.63156, 29.16249], [83.44787, 29.30513], [83.28131, 29.56813], [83.07116, 29.61957], [82.73024, 29.81695], [82.5341, 29.9735], [82.38622, 30.02608], [82.16984, 30.0692], [82.19475, 30.16884], [82.10757, 30.23745], [82.10135, 30.35439], [81.99082, 30.33423], [81.62033, 30.44703], [81.5459, 30.37688], [81.41018, 30.42153], [81.39928, 30.21862], [81.33355, 30.15303], [81.2623, 30.14596], [81.29032, 30.08806], [81.24362, 30.0126], [81.12842, 30.01395], [81.03953, 30.20059], [80.92547, 30.17193], [80.91143, 30.22173], [80.86673, 30.17321], [80.8778, 30.13384], [80.67076, 29.95732], [80.60226, 29.95732], [80.57179, 29.91422], [80.56247, 29.86661], [80.48997, 29.79566], [80.43458, 29.80466], [80.41554, 29.79451], [80.36803, 29.73865], [80.38428, 29.68513], [80.41858, 29.63581], [80.37939, 29.57098], [80.24322, 29.44299], [80.31428, 29.30784], [80.28626, 29.20327], [80.24112, 29.21414], [80.26602, 29.13938], [80.23178, 29.11626], [80.18085, 29.13649], [80.05743, 28.91479], [80.06957, 28.82763], [80.12125, 28.82346], [80.37188, 28.63371], [80.44504, 28.63098], [80.52443, 28.54897], [80.50575, 28.6706], [80.55142, 28.69182], [81.03471, 28.40054], [81.19847, 28.36284], [81.32923, 28.13521], [81.38683, 28.17638], [81.48179, 28.12148], [81.47867, 28.08303], [81.91223, 27.84995], [81.97214, 27.93322], [82.06554, 27.92222], [82.46405, 27.6716], [82.70378, 27.72122], [82.74119, 27.49838], [82.93261, 27.50328], [82.94938, 27.46036], [83.19413, 27.45632], [83.27197, 27.38309], [83.2673, 27.36235], [83.29999, 27.32778], [83.35136, 27.33885], [83.38872, 27.39276], [83.39495, 27.4798], [83.61288, 27.47013], [83.85595, 27.35797], [83.86182, 27.4241], [83.93306, 27.44939], [84.02229, 27.43836], [84.10791, 27.52399], [84.21376, 27.45218], [84.25735, 27.44941], [84.29315, 27.39], [84.62161, 27.33885], [84.69166, 27.21294], [84.64496, 27.04669], [84.793, 26.9968], [84.82913, 27.01989], [84.85754, 26.98984], [84.96687, 26.95599], [84.97186, 26.9149], [85.00536, 26.89523], [85.05592, 26.88991], [85.02635, 26.85381], [85.15883, 26.86966], [85.19291, 26.86909], [85.18046, 26.80519], [85.21159, 26.75933], [85.34302, 26.74954], [85.47752, 26.79292], [85.56471, 26.84133], [85.5757, 26.85955], [85.59461, 26.85161], [85.61621, 26.86721], [85.66239, 26.84822], [85.73483, 26.79613], [85.72315, 26.67471], [85.76907, 26.63076], [85.83126, 26.61134], [85.85126, 26.60866], [85.8492, 26.56667], [86.02729, 26.66756], [86.13596, 26.60651], [86.22513, 26.58863], [86.26235, 26.61886], [86.31564, 26.61925], [86.49726, 26.54218], [86.54258, 26.53819], [86.57073, 26.49825], [86.61313, 26.48658], [86.62686, 26.46891], [86.69124, 26.45169], [86.74025, 26.42386], [86.76797, 26.45892], [86.82898, 26.43919], [86.94543, 26.52076], [86.95912, 26.52076], [87.01559, 26.53228], [87.04691, 26.58685], [87.0707, 26.58571], [87.09147, 26.45039], [87.14751, 26.40542], [87.18863, 26.40558], [87.24682, 26.4143], [87.26587, 26.40592], [87.26568, 26.37294], [87.34568, 26.34787], [87.37314, 26.40815], [87.46566, 26.44058], [87.51571, 26.43106], [87.55274, 26.40596], [87.59175, 26.38342], [87.66803, 26.40294], [87.67893, 26.43501], [87.76004, 26.40711], [87.7918, 26.46737], [87.84193, 26.43663], [87.89085, 26.48565], [87.90115, 26.44923], [88.00895, 26.36029], [88.09414, 26.43732], [88.09963, 26.54195], [88.16452, 26.64111], [88.1659, 26.68177], [88.19107, 26.75516], [88.12302, 26.95324], [88.13422, 26.98705], [88.11719, 26.98758], [87.9887, 27.11045], [88.01587, 27.21388], [88.01646, 27.21612], [88.07277, 27.43007], [88.04008, 27.49223], [88.19107, 27.79285], [88.1973, 27.85067], [88.13378, 27.88015]]]]
+         }
+       }, {
+         type: "Feature",
+         properties: {
+           iso1A2: "NR",
+           iso1A3: "NRU",
+           iso1N3: "520",
+           wikidata: "Q697",
+           nameEn: "Nauru",
+           groups: ["057", "009", "UN"],
+           driveSide: "left",
+           callingCodes: ["674"]
+         },
+         geometry: {
+           type: "MultiPolygon",
+           coordinates: [[[[166.95155, 0.14829], [166.21778, -0.7977], [167.60042, -0.88259], [166.95155, 0.14829]]]]
+         }
+       }, {
+         type: "Feature",
+         properties: {
+           iso1A2: "NU",
+           iso1A3: "NIU",
+           iso1N3: "570",
+           wikidata: "Q34020",
+           nameEn: "Niue",
+           country: "NZ",
+           groups: ["061", "009", "UN"],
+           driveSide: "left",
+           callingCodes: ["683"]
+         },
+         geometry: {
+           type: "MultiPolygon",
+           coordinates: [[[[-170.83899, -18.53439], [-170.82274, -20.44429], [-168.63096, -18.60489], [-170.83899, -18.53439]]]]
+         }
+       }, {
+         type: "Feature",
+         properties: {
+           iso1A2: "NZ",
+           iso1A3: "NZL",
+           iso1N3: "554",
+           wikidata: "Q664",
+           nameEn: "New Zealand"
+         },
+         geometry: null
+       }, {
+         type: "Feature",
+         properties: {
+           iso1A2: "OM",
+           iso1A3: "OMN",
+           iso1N3: "512",
+           wikidata: "Q842",
+           nameEn: "Oman",
+           groups: ["145", "142", "UN"],
+           callingCodes: ["968"]
+         },
+         geometry: {
+           type: "MultiPolygon",
+           coordinates: [[[[56.82555, 25.7713], [56.79239, 26.41236], [56.68954, 26.76645], [56.2644, 26.58649], [55.81777, 26.18798], [56.08666, 26.05038], [56.15498, 26.06828], [56.19334, 25.9795], [56.13963, 25.82765], [56.17416, 25.77239], [56.13579, 25.73524], [56.14826, 25.66351], [56.18363, 25.65508], [56.20473, 25.61119], [56.25365, 25.60211], [56.26636, 25.60643], [56.25341, 25.61443], [56.26534, 25.62825], [56.82555, 25.7713]]], [[[56.26062, 25.33108], [56.23362, 25.31253], [56.25008, 25.28843], [56.24465, 25.27505], [56.20838, 25.25668], [56.20872, 25.24104], [56.24341, 25.22867], [56.27628, 25.23404], [56.34438, 25.26653], [56.35172, 25.30681], [56.3111, 25.30107], [56.3005, 25.31815], [56.26062, 25.33108]], [[56.28423, 25.26344], [56.27086, 25.26128], [56.2716, 25.27916], [56.28102, 25.28486], [56.29379, 25.2754], [56.28423, 25.26344]]], [[[61.45114, 22.55394], [56.86325, 25.03856], [56.3227, 24.97284], [56.34873, 24.93205], [56.30269, 24.88334], [56.20568, 24.85063], [56.20062, 24.78565], [56.13684, 24.73699], [56.06128, 24.74457], [56.03535, 24.81161], [55.97836, 24.87673], [55.97467, 24.89639], [56.05106, 24.87461], [56.05715, 24.95727], [55.96316, 25.00857], [55.90849, 24.96771], [55.85094, 24.96858], [55.81116, 24.9116], [55.81348, 24.80102], [55.83408, 24.77858], [55.83271, 24.68567], [55.76461, 24.5287], [55.83271, 24.41521], [55.83395, 24.32776], [55.80747, 24.31069], [55.79145, 24.27914], [55.76781, 24.26209], [55.75939, 24.26114], [55.75382, 24.2466], [55.75257, 24.23466], [55.76558, 24.23227], [55.77658, 24.23476], [55.83367, 24.20193], [55.95472, 24.2172], [56.01799, 24.07426], [55.8308, 24.01633], [55.73301, 24.05994], [55.48677, 23.94946], [55.57358, 23.669], [55.22634, 23.10378], [55.2137, 22.71065], [55.66469, 21.99658], [54.99756, 20.00083], [52.00311, 19.00083], [52.78009, 17.35124], [52.74267, 17.29519], [52.81185, 17.28568], [57.49095, 8.14549], [61.45114, 22.55394]]]]
+         }
+       }, {
+         type: "Feature",
+         properties: {
+           iso1A2: "PA",
+           iso1A3: "PAN",
+           iso1N3: "591",
+           wikidata: "Q804",
+           nameEn: "Panama",
+           groups: ["013", "003", "419", "019", "UN"],
+           callingCodes: ["507"]
+         },
+         geometry: {
+           type: "MultiPolygon",
+           coordinates: [[[[-77.32389, 8.81247], [-77.58292, 9.22278], [-78.79327, 9.93766], [-82.51044, 9.65379], [-82.56507, 9.57279], [-82.61345, 9.49881], [-82.66667, 9.49746], [-82.77206, 9.59573], [-82.87919, 9.62645], [-82.84871, 9.4973], [-82.93516, 9.46741], [-82.93516, 9.07687], [-82.72126, 8.97125], [-82.88253, 8.83331], [-82.91377, 8.774], [-82.92068, 8.74832], [-82.8794, 8.6981], [-82.82739, 8.60153], [-82.83975, 8.54755], [-82.83322, 8.52464], [-82.8382, 8.48117], [-82.8679, 8.44042], [-82.93056, 8.43465], [-83.05209, 8.33394], [-82.9388, 8.26634], [-82.88641, 8.10219], [-82.89137, 8.05755], [-82.89978, 8.04083], [-82.94503, 7.93865], [-82.13751, 6.97312], [-78.06168, 7.07793], [-77.89178, 7.22681], [-77.81426, 7.48319], [-77.72157, 7.47612], [-77.72514, 7.72348], [-77.57185, 7.51147], [-77.17257, 7.97422], [-77.45064, 8.49991], [-77.32389, 8.81247]]]]
+         }
+       }, {
+         type: "Feature",
+         properties: {
+           iso1A2: "PE",
+           iso1A3: "PER",
+           iso1N3: "604",
+           wikidata: "Q419",
+           nameEn: "Peru",
+           groups: ["005", "419", "019", "UN"],
+           callingCodes: ["51"]
+         },
+         geometry: {
+           type: "MultiPolygon",
+           coordinates: [[[[-74.26675, -0.97229], [-74.42701, -0.50218], [-75.18513, -0.0308], [-75.25764, -0.11943], [-75.40192, -0.17196], [-75.61997, -0.10012], [-75.60169, -0.18708], [-75.53615, -0.19213], [-75.22862, -0.60048], [-75.22862, -0.95588], [-75.3872, -0.9374], [-75.57429, -1.55961], [-76.05203, -2.12179], [-76.6324, -2.58397], [-77.94147, -3.05454], [-78.19369, -3.36431], [-78.14324, -3.47653], [-78.22642, -3.51113], [-78.24589, -3.39907], [-78.34362, -3.38633], [-78.68394, -4.60754], [-78.85149, -4.66795], [-79.01659, -5.01481], [-79.1162, -4.97774], [-79.26248, -4.95167], [-79.59402, -4.46848], [-79.79722, -4.47558], [-80.13945, -4.29786], [-80.39256, -4.48269], [-80.46386, -4.41516], [-80.32114, -4.21323], [-80.45023, -4.20938], [-80.4822, -4.05477], [-80.46386, -4.01342], [-80.13232, -3.90317], [-80.19926, -3.68894], [-80.18741, -3.63994], [-80.19848, -3.59249], [-80.21642, -3.5888], [-80.20535, -3.51667], [-80.22629, -3.501], [-80.23651, -3.48652], [-80.24586, -3.48677], [-80.24123, -3.46124], [-80.20647, -3.431], [-80.30602, -3.39149], [-84.52388, -3.36941], [-85.71054, -21.15413], [-70.59118, -18.35072], [-70.378, -18.3495], [-70.31267, -18.31258], [-70.16394, -18.31737], [-69.96732, -18.25992], [-69.81607, -18.12582], [-69.75305, -17.94605], [-69.82868, -17.72048], [-69.79087, -17.65563], [-69.66483, -17.65083], [-69.46897, -17.4988], [-69.46863, -17.37466], [-69.62883, -17.28142], [-69.16896, -16.72233], [-69.00853, -16.66769], [-69.04027, -16.57214], [-68.98358, -16.42165], [-68.79464, -16.33272], [-68.96238, -16.194], [-69.09986, -16.22693], [-69.20291, -16.16668], [-69.40336, -15.61358], [-69.14856, -15.23478], [-69.36254, -14.94634], [-68.88135, -14.18639], [-69.05265, -13.68546], [-68.8864, -13.40792], [-68.85615, -12.87769], [-68.65044, -12.50689], [-68.98115, -11.8979], [-69.57156, -10.94555], [-69.57835, -10.94051], [-69.90896, -10.92744], [-70.38791, -11.07096], [-70.51395, -10.92249], [-70.64134, -11.0108], [-70.62487, -9.80666], [-70.55429, -9.76692], [-70.58453, -9.58303], [-70.53373, -9.42628], [-71.23394, -9.9668], [-72.14742, -9.98049], [-72.31883, -9.5184], [-72.72216, -9.41397], [-73.21498, -9.40904], [-72.92886, -9.04074], [-73.76576, -7.89884], [-73.65485, -7.77897], [-73.96938, -7.58465], [-73.77011, -7.28944], [-73.73986, -6.87919], [-73.12983, -6.43852], [-73.24579, -6.05764], [-72.83973, -5.14765], [-72.64391, -5.0391], [-71.87003, -4.51661], [-70.96814, -4.36915], [-70.77601, -4.15717], [-70.33236, -4.15214], [-70.19582, -4.3607], [-70.11305, -4.27281], [-70.00888, -4.37833], [-69.94708, -4.2431], [-70.3374, -3.79505], [-70.52393, -3.87553], [-70.71396, -3.7921], [-70.04609, -2.73906], [-70.94377, -2.23142], [-71.75223, -2.15058], [-72.92587, -2.44514], [-73.65312, -1.26222], [-74.26675, -0.97229]]]]
+         }
+       }, {
+         type: "Feature",
+         properties: {
+           iso1A2: "PF",
+           iso1A3: "PYF",
+           iso1N3: "258",
+           wikidata: "Q30971",
+           nameEn: "French Polynesia",
+           country: "FR",
+           groups: ["Q1451600", "061", "009", "UN"],
+           callingCodes: ["689"]
+         },
+         geometry: {
+           type: "MultiPolygon",
+           coordinates: [[[[-135.59706, -4.70473], [-156.48634, -15.52824], [-156.45576, -31.75456], [-133.59543, -28.4709], [-135.59706, -4.70473]]]]
+         }
+       }, {
+         type: "Feature",
+         properties: {
+           iso1A2: "PG",
+           iso1A3: "PNG",
+           iso1N3: "598",
+           wikidata: "Q691",
+           nameEn: "Papua New Guinea",
+           groups: ["054", "009", "UN"],
+           driveSide: "left",
+           callingCodes: ["675"]
+         },
+         geometry: {
+           type: "MultiPolygon",
+           coordinates: [[[[141.03157, 2.12829], [140.99813, -6.3233], [140.85295, -6.72996], [140.90448, -6.85033], [141.01763, -6.90181], [141.01842, -9.35091], [141.88934, -9.36111], [142.19246, -9.15378], [142.48658, -9.36754], [143.29772, -9.33993], [143.87386, -9.02382], [145.2855, -9.62524], [156.73836, -14.50464], [154.74815, -7.33315], [155.60735, -6.92266], [155.69784, -6.92661], [155.92557, -6.84664], [156.03993, -6.65703], [156.03296, -6.55528], [160.43769, -4.17974], [141.03157, 2.12829]]]]
+         }
+       }, {
+         type: "Feature",
+         properties: {
+           iso1A2: "PH",
+           iso1A3: "PHL",
+           iso1N3: "608",
+           wikidata: "Q928",
+           nameEn: "Philippines",
+           aliases: ["PI", "RP"],
+           groups: ["035", "142", "UN"],
+           callingCodes: ["63"]
+         },
+         geometry: {
+           type: "MultiPolygon",
+           coordinates: [[[[129.19694, 7.84182], [121.8109, 21.77688], [120.69238, 21.52331], [118.82252, 14.67191], [115.39742, 10.92666], [116.79524, 7.43869], [117.17735, 7.52841], [117.93857, 6.89845], [117.98544, 6.27477], [119.52945, 5.35672], [118.93936, 4.09009], [118.06469, 4.16638], [121.14448, 2.12444], [129.19694, 7.84182]]]]
+         }
+       }, {
+         type: "Feature",
+         properties: {
+           iso1A2: "PK",
+           iso1A3: "PAK",
+           iso1N3: "586",
+           wikidata: "Q843",
+           nameEn: "Pakistan",
+           groups: ["034", "142", "UN"],
+           driveSide: "left",
+           callingCodes: ["92"]
+         },
+         geometry: {
+           type: "MultiPolygon",
+           coordinates: [[[[75.72737, 36.7529], [75.45562, 36.71971], [75.40481, 36.95382], [75.13839, 37.02622], [74.56453, 37.03023], [74.53739, 36.96224], [74.43389, 37.00977], [74.04856, 36.82648], [73.82685, 36.91421], [72.6323, 36.84601], [72.18135, 36.71838], [71.80267, 36.49924], [71.60491, 36.39429], [71.19505, 36.04134], [71.37969, 35.95865], [71.55273, 35.71483], [71.49917, 35.6267], [71.65435, 35.4479], [71.54294, 35.31037], [71.5541, 35.28776], [71.67495, 35.21262], [71.52938, 35.09023], [71.55273, 35.02615], [71.49917, 35.00478], [71.50329, 34.97328], [71.29472, 34.87728], [71.28356, 34.80882], [71.08718, 34.69034], [71.11602, 34.63047], [71.0089, 34.54568], [71.02401, 34.44835], [71.17662, 34.36769], [71.12815, 34.26619], [71.13078, 34.16503], [71.09453, 34.13524], [71.09307, 34.11961], [71.06933, 34.10564], [71.07345, 34.06242], [70.88119, 33.97933], [70.54336, 33.9463], [69.90203, 34.04194], [69.87307, 33.9689], [69.85671, 33.93719], [70.00503, 33.73528], [70.14236, 33.71701], [70.14785, 33.6553], [70.20141, 33.64387], [70.17062, 33.53535], [70.32775, 33.34496], [70.13686, 33.21064], [70.07369, 33.22557], [70.02563, 33.14282], [69.85259, 33.09451], [69.79766, 33.13247], [69.71526, 33.09911], [69.57656, 33.09911], [69.49004, 33.01509], [69.49854, 32.88843], [69.5436, 32.8768], [69.47082, 32.85834], [69.38018, 32.76601], [69.43649, 32.7302], [69.44747, 32.6678], [69.38155, 32.56601], [69.2868, 32.53938], [69.23599, 32.45946], [69.27932, 32.29119], [69.27032, 32.14141], [69.3225, 31.93186], [69.20577, 31.85957], [69.11514, 31.70782], [69.00939, 31.62249], [68.95995, 31.64822], [68.91078, 31.59687], [68.79997, 31.61665], [68.6956, 31.75687], [68.57475, 31.83158], [68.44222, 31.76446], [68.27605, 31.75863], [68.25614, 31.80357], [68.1655, 31.82691], [68.00071, 31.6564], [67.86887, 31.63536], [67.72056, 31.52304], [67.58323, 31.52772], [67.62374, 31.40473], [67.7748, 31.4188], [67.78854, 31.33203], [67.29964, 31.19586], [67.03323, 31.24519], [67.04147, 31.31561], [66.83273, 31.26867], [66.72561, 31.20526], [66.68166, 31.07597], [66.58175, 30.97532], [66.42645, 30.95309], [66.39194, 30.9408], [66.28413, 30.57001], [66.34869, 30.404], [66.23609, 30.06321], [66.36042, 29.9583], [66.24175, 29.85181], [65.04005, 29.53957], [64.62116, 29.58903], [64.19796, 29.50407], [64.12966, 29.39157], [63.5876, 29.50456], [62.47751, 29.40782], [60.87231, 29.86514], [61.31508, 29.38903], [61.53765, 29.00507], [61.65978, 28.77937], [61.93581, 28.55284], [62.40259, 28.42703], [62.59499, 28.24842], [62.79412, 28.28108], [62.7638, 28.02992], [62.84905, 27.47627], [62.79684, 27.34381], [62.80604, 27.22412], [63.19649, 27.25674], [63.32283, 27.14437], [63.25005, 27.08692], [63.25005, 26.84212], [63.18688, 26.83844], [63.1889, 26.65072], [62.77352, 26.64099], [62.31484, 26.528], [62.21304, 26.26601], [62.05117, 26.31647], [61.89391, 26.26251], [61.83831, 26.07249], [61.83968, 25.7538], [61.683, 25.66638], [61.6433, 25.27541], [61.46682, 24.57869], [68.11329, 23.53945], [68.20763, 23.85849], [68.39339, 23.96838], [68.74643, 23.97027], [68.7416, 24.31904], [68.90914, 24.33156], [68.97781, 24.26021], [69.07806, 24.29777], [69.19341, 24.25646], [69.29778, 24.28712], [69.59579, 24.29777], [69.73335, 24.17007], [70.03428, 24.172], [70.11712, 24.30915], [70.5667, 24.43787], [70.57906, 24.27774], [70.71502, 24.23517], [70.88393, 24.27398], [70.85784, 24.30903], [70.94985, 24.3791], [71.04461, 24.34657], [71.12838, 24.42662], [71.00341, 24.46038], [70.97594, 24.60904], [71.09405, 24.69017], [70.94002, 24.92843], [70.89148, 25.15064], [70.66695, 25.39314], [70.67382, 25.68186], [70.60378, 25.71898], [70.53649, 25.68928], [70.37444, 25.67443], [70.2687, 25.71156], [70.0985, 25.93238], [70.08193, 26.08094], [70.17532, 26.24118], [70.17532, 26.55362], [70.05584, 26.60398], [69.88555, 26.56836], [69.50904, 26.74892], [69.58519, 27.18109], [70.03136, 27.56627], [70.12502, 27.8057], [70.37307, 28.01208], [70.60927, 28.02178], [70.79054, 27.68423], [71.89921, 27.96035], [71.9244, 28.11555], [72.20329, 28.3869], [72.29495, 28.66367], [72.40402, 28.78283], [72.94272, 29.02487], [73.01337, 29.16422], [73.05886, 29.1878], [73.28094, 29.56646], [73.3962, 29.94707], [73.58665, 30.01848], [73.80299, 30.06969], [73.97225, 30.19829], [73.95736, 30.28466], [73.88993, 30.36305], [74.5616, 31.04153], [74.67971, 31.05479], [74.6852, 31.12771], [74.60006, 31.13711], [74.60281, 31.10419], [74.56023, 31.08303], [74.51629, 31.13829], [74.53223, 31.30321], [74.59773, 31.4136], [74.64713, 31.45605], [74.59319, 31.50197], [74.61517, 31.55698], [74.57498, 31.60382], [74.47771, 31.72227], [74.58907, 31.87824], [74.79919, 31.95983], [74.86236, 32.04485], [74.9269, 32.0658], [75.00793, 32.03786], [75.25649, 32.10187], [75.38046, 32.26836], [75.28259, 32.36556], [75.03265, 32.49538], [74.97634, 32.45367], [74.84725, 32.49075], [74.68362, 32.49298], [74.67431, 32.56676], [74.65251, 32.56416], [74.64424, 32.60985], [74.69542, 32.66792], [74.65345, 32.71225], [74.7113, 32.84219], [74.64675, 32.82604], [74.6289, 32.75561], [74.45312, 32.77755], [74.41467, 32.90563], [74.31227, 32.92795], [74.34875, 32.97823], [74.31854, 33.02891], [74.17571, 33.07495], [74.15374, 33.13477], [74.02144, 33.18908], [74.01366, 33.25199], [74.08782, 33.26232], [74.17983, 33.3679], [74.18121, 33.4745], [74.10115, 33.56392], [74.03576, 33.56718], [73.97367, 33.64061], [73.98968, 33.66155], [73.96423, 33.73071], [74.00891, 33.75437], [74.05898, 33.82089], [74.14001, 33.83002], [74.26086, 33.92237], [74.25262, 34.01577], [74.21554, 34.03853], [73.91341, 34.01235], [73.88732, 34.05105], [73.90677, 34.10504], [73.98208, 34.2522], [73.90517, 34.35317], [73.8475, 34.32935], [73.74862, 34.34183], [73.74999, 34.3781], [73.88732, 34.48911], [73.89419, 34.54568], [73.93951, 34.57169], [73.93401, 34.63386], [73.96423, 34.68244], [74.12897, 34.70073], [74.31239, 34.79626], [74.58083, 34.77386], [74.6663, 34.703], [75.01479, 34.64629], [75.38009, 34.55021], [75.75438, 34.51827], [76.04614, 34.67566], [76.15463, 34.6429], [76.47186, 34.78965], [76.67648, 34.76371], [76.74377, 34.84039], [76.74514, 34.92488], [76.87193, 34.96906], [76.99251, 34.93349], [77.11796, 35.05419], [76.93465, 35.39866], [76.85088, 35.39754], [76.75475, 35.52617], [76.77323, 35.66062], [76.50961, 35.8908], [76.33453, 35.84296], [76.14913, 35.82848], [76.15325, 35.9264], [75.93028, 36.13136], [76.00906, 36.17511], [76.0324, 36.41198], [75.92391, 36.56986], [75.72737, 36.7529]]]]
+         }
+       }, {
+         type: "Feature",
+         properties: {
+           iso1A2: "PL",
+           iso1A3: "POL",
+           iso1N3: "616",
+           wikidata: "Q36",
+           nameEn: "Poland",
+           groups: ["EU", "151", "150", "UN"],
+           callingCodes: ["48"]
+         },
+         geometry: {
+           type: "MultiPolygon",
+           coordinates: [[[[18.57853, 55.25302], [14.20811, 54.12784], [14.22634, 53.9291], [14.20647, 53.91671], [14.18544, 53.91258], [14.20823, 53.90776], [14.21323, 53.8664], [14.27249, 53.74464], [14.26782, 53.69866], [14.2836, 53.67721], [14.27133, 53.66613], [14.28477, 53.65955], [14.2853, 53.63392], [14.31904, 53.61581], [14.30416, 53.55499], [14.3273, 53.50587], [14.35209, 53.49506], [14.4215, 53.27724], [14.44133, 53.27427], [14.45125, 53.26241], [14.40662, 53.21098], [14.37853, 53.20405], [14.36696, 53.16444], [14.38679, 53.13669], [14.35044, 53.05829], [14.25954, 53.00264], [14.14056, 52.95786], [14.15873, 52.87715], [14.12256, 52.84311], [14.13806, 52.82392], [14.22071, 52.81175], [14.61073, 52.59847], [14.6289, 52.57136], [14.60081, 52.53116], [14.63056, 52.48993], [14.54423, 52.42568], [14.55228, 52.35264], [14.56378, 52.33838], [14.58149, 52.28007], [14.70139, 52.25038], [14.71319, 52.22144], [14.68344, 52.19612], [14.70616, 52.16927], [14.67683, 52.13936], [14.6917, 52.10283], [14.72971, 52.09167], [14.76026, 52.06624], [14.71339, 52.00337], [14.70488, 51.97679], [14.7139, 51.95643], [14.71836, 51.95606], [14.72163, 51.95188], [14.7177, 51.94048], [14.70601, 51.92944], [14.6933, 51.9044], [14.6588, 51.88359], [14.59089, 51.83302], [14.60493, 51.80473], [14.64625, 51.79472], [14.66386, 51.73282], [14.69065, 51.70842], [14.75392, 51.67445], [14.75759, 51.62318], [14.7727, 51.61263], [14.71125, 51.56209], [14.73047, 51.54606], [14.72652, 51.53902], [14.73219, 51.52922], [14.94749, 51.47155], [14.9652, 51.44793], [14.96899, 51.38367], [14.98008, 51.33449], [15.04288, 51.28387], [15.01242, 51.21285], [15.0047, 51.16874], [14.99311, 51.16249], [14.99414, 51.15813], [15.00083, 51.14974], [14.99646, 51.14365], [14.99079, 51.14284], [14.99689, 51.12205], [14.98229, 51.11354], [14.97938, 51.07742], [14.95529, 51.04552], [14.92942, 50.99744], [14.89252, 50.94999], [14.89681, 50.9422], [14.81664, 50.88148], [14.82803, 50.86966], [14.99852, 50.86817], [15.01088, 50.97984], [14.96419, 50.99108], [15.02433, 51.0242], [15.03895, 51.0123], [15.06218, 51.02269], [15.10152, 51.01095], [15.11937, 50.99021], [15.16744, 51.01959], [15.1743, 50.9833], [15.2361, 50.99886], [15.27043, 50.97724], [15.2773, 50.8907], [15.36656, 50.83956], [15.3803, 50.77187], [15.43798, 50.80833], [15.73186, 50.73885], [15.81683, 50.75666], [15.87331, 50.67188], [15.97219, 50.69799], [16.0175, 50.63009], [15.98317, 50.61528], [16.02437, 50.60046], [16.10265, 50.66405], [16.20839, 50.63096], [16.23174, 50.67101], [16.33611, 50.66579], [16.44597, 50.58041], [16.34572, 50.49575], [16.31413, 50.50274], [16.19526, 50.43291], [16.21585, 50.40627], [16.22821, 50.41054], [16.28118, 50.36891], [16.30289, 50.38292], [16.36495, 50.37679], [16.3622, 50.34875], [16.39379, 50.3207], [16.42674, 50.32509], [16.56407, 50.21009], [16.55446, 50.16613], [16.63137, 50.1142], [16.7014, 50.09659], [16.8456, 50.20834], [16.98018, 50.24172], [17.00353, 50.21449], [17.02825, 50.23118], [16.99803, 50.25753], [17.02138, 50.27772], [16.99803, 50.30316], [16.94448, 50.31281], [16.90877, 50.38642], [16.85933, 50.41093], [16.89229, 50.45117], [17.1224, 50.39494], [17.14498, 50.38117], [17.19579, 50.38817], [17.19991, 50.3654], [17.27681, 50.32246], [17.34273, 50.32947], [17.34548, 50.2628], [17.3702, 50.28123], [17.58889, 50.27837], [17.67764, 50.28977], [17.69292, 50.32859], [17.74648, 50.29966], [17.72176, 50.25665], [17.76296, 50.23382], [17.70528, 50.18812], [17.59404, 50.16437], [17.66683, 50.10275], [17.6888, 50.12037], [17.7506, 50.07896], [17.77669, 50.02253], [17.86886, 49.97452], [18.00191, 50.01723], [18.04585, 50.01194], [18.04585, 50.03311], [18.00396, 50.04954], [18.03212, 50.06574], [18.07898, 50.04535], [18.10628, 50.00223], [18.20241, 49.99958], [18.21752, 49.97309], [18.27107, 49.96779], [18.27794, 49.93863], [18.31914, 49.91565], [18.33278, 49.92415], [18.33562, 49.94747], [18.41604, 49.93498], [18.53423, 49.89906], [18.54495, 49.9079], [18.54299, 49.92537], [18.57697, 49.91565], [18.57045, 49.87849], [18.60341, 49.86256], [18.57183, 49.83334], [18.61278, 49.7618], [18.61368, 49.75426], [18.62645, 49.75002], [18.62943, 49.74603], [18.62676, 49.71983], [18.69817, 49.70473], [18.72838, 49.68163], [18.80479, 49.6815], [18.84786, 49.5446], [18.84521, 49.51672], [18.94536, 49.52143], [18.97283, 49.49914], [18.9742, 49.39557], [19.18019, 49.41165], [19.25435, 49.53391], [19.36009, 49.53747], [19.37795, 49.574], [19.45348, 49.61583], [19.52626, 49.57311], [19.53313, 49.52856], [19.57845, 49.46077], [19.64162, 49.45184], [19.6375, 49.40897], [19.72127, 49.39288], [19.78581, 49.41701], [19.82237, 49.27806], [19.75286, 49.20751], [19.86409, 49.19316], [19.90529, 49.23532], [19.98494, 49.22904], [20.08238, 49.1813], [20.13738, 49.31685], [20.21977, 49.35265], [20.31453, 49.34817], [20.31728, 49.39914], [20.39939, 49.3896], [20.46422, 49.41612], [20.5631, 49.375], [20.61666, 49.41791], [20.72274, 49.41813], [20.77971, 49.35383], [20.9229, 49.29626], [20.98733, 49.30774], [21.09799, 49.37176], [21.041, 49.41791], [21.12477, 49.43666], [21.19756, 49.4054], [21.27858, 49.45988], [21.43376, 49.41433], [21.62328, 49.4447], [21.77983, 49.35443], [21.82927, 49.39467], [21.96385, 49.3437], [22.04427, 49.22136], [22.56155, 49.08865], [22.89122, 49.00725], [22.86336, 49.10513], [22.72009, 49.20288], [22.748, 49.32759], [22.69444, 49.49378], [22.64534, 49.53094], [22.78304, 49.65543], [22.80261, 49.69098], [22.83179, 49.69875], [22.99329, 49.84249], [23.28221, 50.0957], [23.67635, 50.33385], [23.71382, 50.38248], [23.79445, 50.40481], [23.99563, 50.41289], [24.03668, 50.44507], [24.07048, 50.5071], [24.0996, 50.60752], [24.0595, 50.71625], [23.95925, 50.79271], [23.99254, 50.83847], [24.0952, 50.83262], [24.14524, 50.86128], [24.04576, 50.90196], [23.92217, 51.00836], [23.90376, 51.07697], [23.80678, 51.18405], [23.63858, 51.32182], [23.69905, 51.40871], [23.62751, 51.50512], [23.56236, 51.53673], [23.57053, 51.55938], [23.53198, 51.74298], [23.62691, 51.78208], [23.61523, 51.92066], [23.68733, 51.9906], [23.64066, 52.07626], [23.61, 52.11264], [23.54314, 52.12148], [23.47859, 52.18215], [23.20071, 52.22848], [23.18196, 52.28812], [23.34141, 52.44845], [23.45112, 52.53774], [23.58296, 52.59868], [23.73615, 52.6149], [23.93763, 52.71332], [23.91805, 52.94016], [23.94689, 52.95919], [23.92184, 53.02079], [23.87548, 53.0831], [23.91393, 53.16469], [23.85657, 53.22923], [23.81995, 53.24131], [23.62004, 53.60942], [23.51284, 53.95052], [23.48261, 53.98855], [23.52702, 54.04622], [23.49196, 54.14764], [23.45223, 54.17775], [23.42418, 54.17911], [23.39525, 54.21672], [23.3494, 54.25155], [23.24656, 54.25701], [23.15938, 54.29894], [23.15526, 54.31076], [23.13905, 54.31567], [23.104, 54.29794], [23.04323, 54.31567], [23.05726, 54.34565], [22.99649, 54.35927], [23.00584, 54.38514], [22.83756, 54.40827], [22.79705, 54.36264], [21.41123, 54.32395], [20.63871, 54.3706], [19.8038, 54.44203], [19.64312, 54.45423], [18.57853, 55.25302]]]]
+         }
+       }, {
+         type: "Feature",
+         properties: {
+           iso1A2: "PM",
+           iso1A3: "SPM",
+           iso1N3: "666",
+           wikidata: "Q34617",
+           nameEn: "Saint Pierre and Miquelon",
+           country: "FR",
+           groups: ["Q1451600", "021", "003", "019", "UN"],
+           callingCodes: ["508"]
+         },
+         geometry: {
+           type: "MultiPolygon",
+           coordinates: [[[[-56.72993, 46.65575], [-55.90758, 46.6223], [-56.27503, 47.39728], [-56.72993, 46.65575]]]]
+         }
+       }, {
+         type: "Feature",
+         properties: {
+           iso1A2: "PN",
+           iso1A3: "PCN",
+           iso1N3: "612",
+           wikidata: "Q35672",
+           nameEn: "Pitcairn Islands",
+           country: "GB",
+           groups: ["BOTS", "061", "009", "UN"],
+           driveSide: "left",
+           callingCodes: ["64"]
+         },
+         geometry: {
+           type: "MultiPolygon",
+           coordinates: [[[[-133.59543, -28.4709], [-122.0366, -24.55017], [-133.61511, -21.93325], [-133.59543, -28.4709]]]]
+         }
+       }, {
+         type: "Feature",
+         properties: {
+           iso1A2: "PR",
+           iso1A3: "PRI",
+           iso1N3: "630",
+           wikidata: "Q1183",
+           nameEn: "Puerto Rico",
+           aliases: ["US-PR"],
+           country: "US",
+           groups: ["Q1352230", "029", "003", "419", "019", "UN"],
+           roadSpeedUnit: "mph",
+           callingCodes: ["1 787", "1 939"]
+         },
+         geometry: {
+           type: "MultiPolygon",
+           coordinates: [[[[-65.27974, 17.56928], [-65.02435, 18.73231], [-67.99519, 18.97186], [-68.23894, 17.84663], [-65.27974, 17.56928]]]]
+         }
+       }, {
+         type: "Feature",
+         properties: {
+           iso1A2: "PS",
+           iso1A3: "PSE",
+           iso1N3: "275",
+           wikidata: "Q219060",
+           nameEn: "Palestine"
+         },
+         geometry: null
+       }, {
+         type: "Feature",
+         properties: {
+           iso1A2: "PT",
+           iso1A3: "PRT",
+           iso1N3: "620",
+           wikidata: "Q45",
+           nameEn: "Portugal"
+         },
+         geometry: null
+       }, {
+         type: "Feature",
+         properties: {
+           iso1A2: "PW",
+           iso1A3: "PLW",
+           iso1N3: "585",
+           wikidata: "Q695",
+           nameEn: "Palau",
+           groups: ["057", "009", "UN"],
+           roadSpeedUnit: "mph",
+           callingCodes: ["680"]
+         },
+         geometry: {
+           type: "MultiPolygon",
+           coordinates: [[[[128.97621, 3.08804], [136.39296, 1.54187], [136.04605, 12.45908], [128.97621, 3.08804]]]]
+         }
+       }, {
+         type: "Feature",
+         properties: {
+           iso1A2: "PY",
+           iso1A3: "PRY",
+           iso1N3: "600",
+           wikidata: "Q733",
+           nameEn: "Paraguay",
+           groups: ["005", "419", "019", "UN"],
+           callingCodes: ["595"]
+         },
+         geometry: {
+           type: "MultiPolygon",
+           coordinates: [[[[-58.16225, -20.16193], [-58.23216, -19.80058], [-59.06965, -19.29148], [-60.00638, -19.2981], [-61.73723, -19.63958], [-61.93912, -20.10053], [-62.26883, -20.55311], [-62.2757, -21.06657], [-62.64455, -22.25091], [-62.51761, -22.37684], [-62.22768, -22.55807], [-61.9756, -23.0507], [-61.0782, -23.62932], [-60.99754, -23.80934], [-60.28163, -24.04436], [-60.03367, -24.00701], [-59.45482, -24.34787], [-59.33886, -24.49935], [-58.33055, -24.97099], [-58.25492, -24.92528], [-57.80821, -25.13863], [-57.57431, -25.47269], [-57.87176, -25.93604], [-58.1188, -26.16704], [-58.3198, -26.83443], [-58.65321, -27.14028], [-58.59549, -27.29973], [-58.04205, -27.2387], [-56.85337, -27.5165], [-56.18313, -27.29851], [-55.89195, -27.3467], [-55.74475, -27.44485], [-55.59094, -27.32444], [-55.62322, -27.1941], [-55.39611, -26.97679], [-55.25243, -26.93808], [-55.16948, -26.96068], [-55.06351, -26.80195], [-55.00584, -26.78754], [-54.80868, -26.55669], [-54.70732, -26.45099], [-54.69333, -26.37705], [-54.67359, -25.98607], [-54.60664, -25.9691], [-54.62063, -25.91213], [-54.59398, -25.59224], [-54.59509, -25.53696], [-54.60196, -25.48397], [-54.62033, -25.46026], [-54.4423, -25.13381], [-54.28207, -24.07305], [-54.32807, -24.01865], [-54.6238, -23.83078], [-55.02691, -23.97317], [-55.0518, -23.98666], [-55.12292, -23.99669], [-55.41784, -23.9657], [-55.44117, -23.9185], [-55.43585, -23.87157], [-55.5555, -23.28237], [-55.52288, -23.2595], [-55.5446, -23.22811], [-55.63849, -22.95122], [-55.62493, -22.62765], [-55.68742, -22.58407], [-55.6986, -22.56268], [-55.72366, -22.5519], [-55.741, -22.52018], [-55.74941, -22.46436], [-55.8331, -22.29008], [-56.23206, -22.25347], [-56.45893, -22.08072], [-56.5212, -22.11556], [-56.6508, -22.28387], [-57.98625, -22.09157], [-57.94642, -21.73799], [-57.88239, -21.6868], [-57.93492, -21.65505], [-57.84536, -20.93155], [-58.16225, -20.16193]]]]
+         }
+       }, {
+         type: "Feature",
+         properties: {
+           iso1A2: "QA",
+           iso1A3: "QAT",
+           iso1N3: "634",
+           wikidata: "Q846",
+           nameEn: "Qatar",
+           groups: ["145", "142", "UN"],
+           callingCodes: ["974"]
+         },
+         geometry: {
+           type: "MultiPolygon",
+           coordinates: [[[[50.92992, 24.54396], [51.09638, 24.46907], [51.29972, 24.50747], [51.39468, 24.62785], [51.58834, 24.66608], [51.83108, 24.71675], [51.83682, 26.70231], [50.93865, 26.30758], [50.81266, 25.88946], [50.86149, 25.6965], [50.7801, 25.595], [50.80824, 25.54641], [50.57069, 25.57887], [50.8133, 24.74049], [50.92992, 24.54396]]]]
+         }
+       }, {
+         type: "Feature",
+         properties: {
+           iso1A2: "RE",
+           iso1A3: "REU",
+           iso1N3: "638",
+           wikidata: "Q17070",
+           nameEn: "R\xE9union",
+           country: "FR",
+           groups: ["Q3320166", "EU", "014", "202", "002", "UN"],
+           callingCodes: ["262"]
+         },
+         geometry: {
+           type: "MultiPolygon",
+           coordinates: [[[[53.37984, -21.23941], [56.73473, -21.9174], [56.62373, -20.2711], [53.37984, -21.23941]]]]
+         }
+       }, {
+         type: "Feature",
+         properties: {
+           iso1A2: "RO",
+           iso1A3: "ROU",
+           iso1N3: "642",
+           wikidata: "Q218",
+           nameEn: "Romania",
+           groups: ["EU", "151", "150", "UN"],
+           callingCodes: ["40"]
+         },
+         geometry: {
+           type: "MultiPolygon",
+           coordinates: [[[[27.15622, 47.98538], [27.02985, 48.09083], [27.04118, 48.12522], [26.96119, 48.13003], [26.98042, 48.15752], [26.94265, 48.1969], [26.87708, 48.19919], [26.81161, 48.25049], [26.62823, 48.25804], [26.55202, 48.22445], [26.33504, 48.18418], [26.17711, 47.99246], [26.05901, 47.9897], [25.77723, 47.93919], [25.63878, 47.94924], [25.23778, 47.89403], [25.11144, 47.75203], [24.88896, 47.7234], [24.81893, 47.82031], [24.70632, 47.84428], [24.61994, 47.95062], [24.43578, 47.97131], [24.34926, 47.9244], [24.22566, 47.90231], [24.11281, 47.91487], [24.06466, 47.95317], [24.02999, 47.95087], [24.00801, 47.968], [23.98553, 47.96076], [23.96337, 47.96672], [23.94192, 47.94868], [23.89352, 47.94512], [23.8602, 47.9329], [23.80904, 47.98142], [23.75188, 47.99705], [23.66262, 47.98786], [23.63894, 48.00293], [23.5653, 48.00499], [23.52803, 48.01818], [23.4979, 47.96858], [23.33577, 48.0237], [23.27397, 48.08245], [23.15999, 48.12188], [23.1133, 48.08061], [23.08858, 48.00716], [23.0158, 47.99338], [22.92241, 48.02002], [22.94301, 47.96672], [22.89849, 47.95851], [22.77991, 47.87211], [22.76617, 47.8417], [22.67247, 47.7871], [22.46559, 47.76583], [22.41979, 47.7391], [22.31816, 47.76126], [22.00917, 47.50492], [22.03389, 47.42508], [22.01055, 47.37767], [21.94463, 47.38046], [21.78395, 47.11104], [21.648, 47.03902], [21.68645, 46.99595], [21.59581, 46.91628], [21.59307, 46.86935], [21.52028, 46.84118], [21.48935, 46.7577], [21.5151, 46.72147], [21.43926, 46.65109], [21.33214, 46.63035], [21.26929, 46.4993], [21.28061, 46.44941], [21.16872, 46.30118], [21.06572, 46.24897], [20.86797, 46.28884], [20.74574, 46.25467], [20.76085, 46.21002], [20.63863, 46.12728], [20.49718, 46.18721], [20.45377, 46.14405], [20.35573, 46.16629], [20.28324, 46.1438], [20.26068, 46.12332], [20.35862, 45.99356], [20.54818, 45.89939], [20.65645, 45.82801], [20.70069, 45.7493], [20.77416, 45.75601], [20.78446, 45.78522], [20.82364, 45.77738], [20.80361, 45.65875], [20.76798, 45.60969], [20.83321, 45.53567], [20.77217, 45.49788], [20.86026, 45.47295], [20.87948, 45.42743], [21.09894, 45.30144], [21.17612, 45.32566], [21.20392, 45.2677], [21.29398, 45.24148], [21.48278, 45.19557], [21.51299, 45.15345], [21.4505, 45.04294], [21.35855, 45.01941], [21.54938, 44.9327], [21.56328, 44.89502], [21.48202, 44.87199], [21.44013, 44.87613], [21.35643, 44.86364], [21.38802, 44.78133], [21.55007, 44.77304], [21.60019, 44.75208], [21.61942, 44.67059], [21.67504, 44.67107], [21.71692, 44.65349], [21.7795, 44.66165], [21.99364, 44.63395], [22.08016, 44.49844], [22.13234, 44.47444], [22.18315, 44.48179], [22.30844, 44.6619], [22.45301, 44.7194], [22.61917, 44.61489], [22.69196, 44.61587], [22.76749, 44.54446], [22.70981, 44.51852], [22.61368, 44.55719], [22.56493, 44.53419], [22.54021, 44.47836], [22.45436, 44.47258], [22.56012, 44.30712], [22.68166, 44.28206], [22.67173, 44.21564], [23.04988, 44.07694], [23.01674, 44.01946], [22.87873, 43.9844], [22.83753, 43.88055], [22.85314, 43.84452], [23.05288, 43.79494], [23.26772, 43.84843], [23.4507, 43.84936], [23.61687, 43.79289], [23.73978, 43.80627], [24.18149, 43.68218], [24.35364, 43.70211], [24.50264, 43.76314], [24.62281, 43.74082], [24.73542, 43.68523], [24.96682, 43.72693], [25.10718, 43.6831], [25.17144, 43.70261], [25.39528, 43.61866], [25.72792, 43.69263], [25.94911, 43.85745], [26.05584, 43.90925], [26.10115, 43.96908], [26.38764, 44.04356], [26.62712, 44.05698], [26.95141, 44.13555], [27.26845, 44.12602], [27.39757, 44.0141], [27.60834, 44.01206], [27.64542, 44.04958], [27.73468, 43.95326], [27.92008, 44.00761], [27.99558, 43.84193], [28.23293, 43.76], [29.24336, 43.70874], [30.04414, 45.08461], [29.69272, 45.19227], [29.65428, 45.25629], [29.68175, 45.26885], [29.59798, 45.38857], [29.42632, 45.44545], [29.24779, 45.43388], [28.96077, 45.33164], [28.94292, 45.28045], [28.81383, 45.3384], [28.78911, 45.24179], [28.71358, 45.22631], [28.5735, 45.24759], [28.34554, 45.32102], [28.28504, 45.43907], [28.21139, 45.46895], [28.18741, 45.47358], [28.08927, 45.6051], [28.16568, 45.6421], [28.13111, 45.92819], [28.08612, 46.01105], [28.13684, 46.18099], [28.10937, 46.22852], [28.19864, 46.31869], [28.18902, 46.35283], [28.25769, 46.43334], [28.22281, 46.50481], [28.24808, 46.64305], [28.12173, 46.82283], [28.09095, 46.97621], [27.81892, 47.1381], [27.73172, 47.29248], [27.68706, 47.28962], [27.60263, 47.32507], [27.55731, 47.46637], [27.47942, 47.48113], [27.3979, 47.59473], [27.32202, 47.64009], [27.25519, 47.71366], [27.29069, 47.73722], [27.1618, 47.92391], [27.15622, 47.98538]]]]
+         }
+       }, {
+         type: "Feature",
+         properties: {
+           iso1A2: "RS",
+           iso1A3: "SRB",
+           iso1N3: "688",
+           wikidata: "Q403",
+           nameEn: "Serbia",
+           groups: ["039", "150", "UN"],
+           callingCodes: ["381"]
+         },
+         geometry: {
+           type: "MultiPolygon",
+           coordinates: [[[[19.66007, 46.19005], [19.56113, 46.16824], [19.52473, 46.1171], [19.28826, 45.99694], [19.14543, 45.9998], [19.10388, 46.04015], [19.0791, 45.96458], [19.01284, 45.96529], [18.99712, 45.93537], [18.81394, 45.91329], [18.85783, 45.85493], [18.90305, 45.71863], [18.96691, 45.66731], [18.88776, 45.57253], [18.94562, 45.53712], [19.07471, 45.53086], [19.08364, 45.48804], [18.99918, 45.49333], [18.97446, 45.37528], [19.10774, 45.29547], [19.28208, 45.23813], [19.41941, 45.23475], [19.43589, 45.17137], [19.19144, 45.17863], [19.14063, 45.12972], [19.07952, 45.14668], [19.1011, 45.01191], [19.05205, 44.97692], [19.15573, 44.95409], [19.06853, 44.89915], [19.02871, 44.92541], [18.98957, 44.90645], [19.01994, 44.85493], [19.18183, 44.92055], [19.36722, 44.88164], [19.32543, 44.74058], [19.26388, 44.65412], [19.16699, 44.52197], [19.13369, 44.52521], [19.12278, 44.50132], [19.14837, 44.45253], [19.14681, 44.41463], [19.11785, 44.40313], [19.10749, 44.39421], [19.10704, 44.38249], [19.10365, 44.37795], [19.10298, 44.36924], [19.11865, 44.36712], [19.1083, 44.3558], [19.11547, 44.34218], [19.13556, 44.338], [19.13332, 44.31492], [19.16741, 44.28648], [19.18328, 44.28383], [19.20508, 44.2917], [19.23306, 44.26097], [19.26945, 44.26957], [19.32464, 44.27185], [19.34773, 44.23244], [19.3588, 44.18353], [19.40927, 44.16722], [19.43905, 44.13088], [19.47338, 44.15034], [19.48386, 44.14332], [19.47321, 44.1193], [19.51167, 44.08158], [19.55999, 44.06894], [19.57467, 44.04716], [19.61991, 44.05254], [19.61836, 44.01464], [19.56498, 43.99922], [19.52515, 43.95573], [19.38439, 43.96611], [19.24363, 44.01502], [19.23465, 43.98764], [19.3986, 43.79668], [19.5176, 43.71403], [19.50455, 43.58385], [19.42696, 43.57987], [19.41941, 43.54056], [19.36653, 43.60921], [19.33426, 43.58833], [19.2553, 43.5938], [19.24774, 43.53061], [19.22807, 43.5264], [19.22229, 43.47926], [19.44315, 43.38846], [19.48171, 43.32644], [19.52962, 43.31623], [19.54598, 43.25158], [19.62661, 43.2286], [19.64063, 43.19027], [19.76918, 43.16044], [19.79255, 43.11951], [19.92576, 43.08539], [19.96549, 43.11098], [19.98887, 43.0538], [20.04729, 43.02732], [20.05431, 42.99571], [20.12325, 42.96237], [20.14896, 42.99058], [20.16415, 42.97177], [20.34528, 42.90676], [20.35692, 42.8335], [20.40594, 42.84853], [20.43734, 42.83157], [20.53484, 42.8885], [20.48692, 42.93208], [20.59929, 43.01067], [20.64557, 43.00826], [20.69515, 43.09641], [20.59929, 43.20492], [20.68688, 43.21335], [20.73811, 43.25068], [20.82145, 43.26769], [20.88685, 43.21697], [20.83727, 43.17842], [20.96287, 43.12416], [21.00749, 43.13984], [21.05378, 43.10707], [21.08952, 43.13471], [21.14465, 43.11089], [21.16734, 42.99694], [21.2041, 43.02277], [21.23877, 43.00848], [21.23534, 42.95523], [21.2719, 42.8994], [21.32974, 42.90424], [21.36941, 42.87397], [21.44047, 42.87276], [21.39045, 42.74888], [21.47498, 42.74695], [21.59154, 42.72643], [21.58755, 42.70418], [21.6626, 42.67813], [21.75025, 42.70125], [21.79413, 42.65923], [21.75672, 42.62695], [21.7327, 42.55041], [21.70522, 42.54176], [21.7035, 42.51899], [21.62556, 42.45106], [21.64209, 42.41081], [21.62887, 42.37664], [21.59029, 42.38042], [21.57021, 42.3647], [21.53467, 42.36809], [21.5264, 42.33634], [21.56772, 42.30946], [21.58992, 42.25915], [21.70111, 42.23789], [21.77176, 42.2648], [21.84654, 42.3247], [21.91595, 42.30392], [21.94405, 42.34669], [22.02908, 42.29848], [22.16384, 42.32103], [22.29605, 42.37477], [22.29275, 42.34913], [22.34773, 42.31725], [22.45919, 42.33822], [22.47498, 42.3915], [22.51961, 42.3991], [22.55669, 42.50144], [22.43983, 42.56851], [22.4997, 42.74144], [22.43309, 42.82057], [22.54302, 42.87774], [22.74826, 42.88701], [22.78397, 42.98253], [22.89521, 43.03625], [22.98104, 43.11199], [23.00806, 43.19279], [22.89727, 43.22417], [22.82036, 43.33665], [22.53397, 43.47225], [22.47582, 43.6558], [22.41043, 43.69566], [22.35558, 43.81281], [22.41449, 44.00514], [22.61688, 44.06534], [22.61711, 44.16938], [22.67173, 44.21564], [22.68166, 44.28206], [22.56012, 44.30712], [22.45436, 44.47258], [22.54021, 44.47836], [22.56493, 44.53419], [22.61368, 44.55719], [22.70981, 44.51852], [22.76749, 44.54446], [22.69196, 44.61587], [22.61917, 44.61489], [22.45301, 44.7194], [22.30844, 44.6619], [22.18315, 44.48179], [22.13234, 44.47444], [22.08016, 44.49844], [21.99364, 44.63395], [21.7795, 44.66165], [21.71692, 44.65349], [21.67504, 44.67107], [21.61942, 44.67059], [21.60019, 44.75208], [21.55007, 44.77304], [21.38802, 44.78133], [21.35643, 44.86364], [21.44013, 44.87613], [21.48202, 44.87199], [21.56328, 44.89502], [21.54938, 44.9327], [21.35855, 45.01941], [21.4505, 45.04294], [21.51299, 45.15345], [21.48278, 45.19557], [21.29398, 45.24148], [21.20392, 45.2677], [21.17612, 45.32566], [21.09894, 45.30144], [20.87948, 45.42743], [20.86026, 45.47295], [20.77217, 45.49788], [20.83321, 45.53567], [20.76798, 45.60969], [20.80361, 45.65875], [20.82364, 45.77738], [20.78446, 45.78522], [20.77416, 45.75601], [20.70069, 45.7493], [20.65645, 45.82801], [20.54818, 45.89939], [20.35862, 45.99356], [20.26068, 46.12332], [20.09713, 46.17315], [20.03533, 46.14509], [20.01816, 46.17696], [19.93508, 46.17553], [19.81491, 46.1313], [19.66007, 46.19005]]]]
+         }
+       }, {
+         type: "Feature",
+         properties: {
+           iso1A2: "RU",
+           iso1A3: "RUS",
+           iso1N3: "643",
+           wikidata: "Q159",
+           nameEn: "Russia"
+         },
+         geometry: null
+       }, {
+         type: "Feature",
+         properties: {
+           iso1A2: "RW",
+           iso1A3: "RWA",
+           iso1N3: "646",
+           wikidata: "Q1037",
+           nameEn: "Rwanda",
+           groups: ["014", "202", "002", "UN"],
+           callingCodes: ["250"]
+         },
+         geometry: {
+           type: "MultiPolygon",
+           coordinates: [[[[30.47194, -1.0555], [30.35212, -1.06896], [30.16369, -1.34303], [29.912, -1.48269], [29.82657, -1.31187], [29.59061, -1.39016], [29.53062, -1.40499], [29.45038, -1.5054], [29.36322, -1.50887], [29.24323, -1.66826], [29.24458, -1.69663], [29.11847, -1.90576], [29.17562, -2.12278], [29.105, -2.27043], [29.00051, -2.29001], [28.95642, -2.37321], [28.89601, -2.37321], [28.86826, -2.41888], [28.86846, -2.44866], [28.89132, -2.47557], [28.89342, -2.49017], [28.88846, -2.50493], [28.87497, -2.50887], [28.86209, -2.5231], [28.86193, -2.53185], [28.87943, -2.55165], [28.89288, -2.55848], [28.90226, -2.62385], [28.89793, -2.66111], [28.94346, -2.69124], [29.00357, -2.70596], [29.04081, -2.7416], [29.0562, -2.58632], [29.32234, -2.6483], [29.36805, -2.82933], [29.88237, -2.75105], [29.95911, -2.33348], [30.14034, -2.43626], [30.42933, -2.31064], [30.54501, -2.41404], [30.83915, -2.35795], [30.89303, -2.08223], [30.80802, -1.91477], [30.84079, -1.64652], [30.71974, -1.43244], [30.57123, -1.33264], [30.50889, -1.16412], [30.45116, -1.10641], [30.47194, -1.0555]]]]
+         }
+       }, {
+         type: "Feature",
+         properties: {
+           iso1A2: "SA",
+           iso1A3: "SAU",
+           iso1N3: "682",
+           wikidata: "Q851",
+           nameEn: "Saudi Arabia",
+           groups: ["145", "142", "UN"],
+           callingCodes: ["966"]
+         },
+         geometry: {
+           type: "MultiPolygon",
+           coordinates: [[[[40.01521, 32.05667], [39.29903, 32.23259], [38.99233, 31.99721], [36.99791, 31.50081], [37.99354, 30.49998], [37.66395, 30.33245], [37.4971, 29.99949], [36.75083, 29.86903], [36.50005, 29.49696], [36.07081, 29.18469], [34.8812, 29.36878], [34.4454, 27.91479], [37.8565, 22.00903], [39.63762, 18.37348], [40.99158, 15.81743], [42.15205, 16.40211], [42.76801, 16.40371], [42.94625, 16.39721], [42.94351, 16.49467], [42.97215, 16.51093], [43.11601, 16.53166], [43.15274, 16.67248], [43.22066, 16.65179], [43.21325, 16.74416], [43.25857, 16.75304], [43.26303, 16.79479], [43.24801, 16.80613], [43.22956, 16.80613], [43.22012, 16.83932], [43.18338, 16.84852], [43.1398, 16.90696], [43.19328, 16.94703], [43.1813, 16.98438], [43.18233, 17.02673], [43.23967, 17.03428], [43.17787, 17.14717], [43.20156, 17.25901], [43.32653, 17.31179], [43.22533, 17.38343], [43.29185, 17.53224], [43.43005, 17.56148], [43.70631, 17.35762], [44.50126, 17.47475], [46.31018, 17.20464], [46.76494, 17.29151], [47.00571, 16.94765], [47.48245, 17.10808], [47.58351, 17.50366], [48.19996, 18.20584], [49.04884, 18.59899], [52.00311, 19.00083], [54.99756, 20.00083], [55.66469, 21.99658], [55.2137, 22.71065], [55.13599, 22.63334], [52.56622, 22.94341], [51.59617, 24.12041], [51.58871, 24.27256], [51.41644, 24.39615], [51.58834, 24.66608], [51.39468, 24.62785], [51.29972, 24.50747], [51.09638, 24.46907], [50.92992, 24.54396], [50.8133, 24.74049], [50.57069, 25.57887], [50.302, 25.87592], [50.26923, 26.08243], [50.38162, 26.53976], [50.71771, 26.73086], [50.37726, 27.89227], [49.98877, 27.87827], [49.00421, 28.81495], [48.42991, 28.53628], [47.70561, 28.5221], [47.59863, 28.66798], [47.58376, 28.83382], [47.46202, 29.0014], [46.5527, 29.10283], [46.42415, 29.05947], [44.72255, 29.19736], [42.97796, 30.48295], [42.97601, 30.72204], [40.01521, 32.05667]]]]
+         }
+       }, {
+         type: "Feature",
+         properties: {
+           iso1A2: "SB",
+           iso1A3: "SLB",
+           iso1N3: "090",
+           wikidata: "Q685",
+           nameEn: "Solomon Islands",
+           groups: ["054", "009", "UN"],
+           driveSide: "left",
+           callingCodes: ["677"]
+         },
+         geometry: {
+           type: "MultiPolygon",
+           coordinates: [[[[172.71443, -12.01327], [160.43769, -4.17974], [156.03296, -6.55528], [156.03993, -6.65703], [155.92557, -6.84664], [155.69784, -6.92661], [155.60735, -6.92266], [154.74815, -7.33315], [156.73836, -14.50464], [172.71443, -12.01327]]]]
+         }
+       }, {
+         type: "Feature",
+         properties: {
+           iso1A2: "SC",
+           iso1A3: "SYC",
+           iso1N3: "690",
+           wikidata: "Q1042",
+           nameEn: "Seychelles",
+           groups: ["014", "202", "002", "UN"],
+           driveSide: "left",
+           callingCodes: ["248"]
+         },
+         geometry: {
+           type: "MultiPolygon",
+           coordinates: [[[[43.75112, -10.38913], [54.83239, -10.93575], [66.3222, 5.65313], [43.75112, -10.38913]]]]
+         }
+       }, {
+         type: "Feature",
+         properties: {
+           iso1A2: "SD",
+           iso1A3: "SDN",
+           iso1N3: "729",
+           wikidata: "Q1049",
+           nameEn: "Sudan",
+           groups: ["015", "002", "UN"],
+           callingCodes: ["249"]
+         },
+         geometry: {
+           type: "MultiPolygon",
+           coordinates: [[[[37.8565, 22.00903], [34.0765, 22.00501], [33.99686, 21.76784], [33.57251, 21.72406], [33.17563, 22.00405], [24.99885, 21.99535], [24.99794, 19.99661], [23.99715, 20.00038], [23.99539, 19.49944], [23.99997, 15.69575], [23.62785, 15.7804], [23.38812, 15.69649], [23.10792, 15.71297], [22.93201, 15.55107], [22.92579, 15.47007], [22.99584, 15.40105], [22.99584, 15.22989], [22.66115, 14.86308], [22.70474, 14.69149], [22.38562, 14.58907], [22.44944, 14.24986], [22.55997, 14.23024], [22.5553, 14.11704], [22.22995, 13.96754], [22.08674, 13.77863], [22.29689, 13.3731], [22.1599, 13.19281], [22.02914, 13.13976], [21.94819, 13.05637], [21.81432, 12.81362], [21.89371, 12.68001], [21.98711, 12.63292], [22.15679, 12.66634], [22.22684, 12.74682], [22.46345, 12.61925], [22.38873, 12.45514], [22.50548, 12.16769], [22.48369, 12.02766], [22.64092, 12.07485], [22.54907, 11.64372], [22.7997, 11.40424], [22.93124, 11.41645], [22.97249, 11.21955], [22.87758, 10.91915], [23.02221, 10.69235], [23.3128, 10.45214], [23.67164, 9.86923], [23.69155, 9.67566], [24.09319, 9.66572], [24.12744, 9.73784], [24.49389, 9.79962], [24.84653, 9.80643], [24.97739, 9.9081], [25.05688, 10.06776], [25.0918, 10.33718], [25.78141, 10.42599], [25.93163, 10.38159], [25.93241, 10.17941], [26.21338, 9.91545], [26.35815, 9.57946], [26.70685, 9.48735], [27.14427, 9.62858], [27.90704, 9.61323], [28.99983, 9.67155], [29.06988, 9.74826], [29.53844, 9.75133], [29.54, 10.07949], [29.94629, 10.29245], [30.00389, 10.28633], [30.53005, 9.95992], [30.82893, 9.71451], [30.84605, 9.7498], [31.28504, 9.75287], [31.77539, 10.28939], [31.99177, 10.65065], [32.46967, 11.04662], [32.39358, 11.18207], [32.39578, 11.70208], [32.10079, 11.95203], [32.73921, 11.95203], [32.73921, 12.22757], [33.25876, 12.22111], [33.13988, 11.43248], [33.26977, 10.83632], [33.24645, 10.77913], [33.52294, 10.64382], [33.66604, 10.44254], [33.80913, 10.32994], [33.90159, 10.17179], [33.96984, 10.15446], [33.99185, 9.99623], [33.96323, 9.80972], [33.9082, 9.762], [33.87958, 9.49937], [34.10229, 9.50238], [34.08717, 9.55243], [34.13186, 9.7492], [34.20484, 9.9033], [34.22718, 10.02506], [34.32102, 10.11599], [34.34783, 10.23914], [34.2823, 10.53508], [34.4372, 10.781], [34.59062, 10.89072], [34.77383, 10.74588], [34.77532, 10.69027], [34.86618, 10.74588], [34.86916, 10.78832], [34.97491, 10.86147], [34.97789, 10.91559], [34.93172, 10.95946], [35.01215, 11.19626], [34.95704, 11.24448], [35.09556, 11.56278], [35.05832, 11.71158], [35.11492, 11.85156], [35.24302, 11.91132], [35.70476, 12.67101], [36.01458, 12.72478], [36.14268, 12.70879], [36.16651, 12.88019], [36.13374, 12.92665], [36.24545, 13.36759], [36.38993, 13.56459], [36.48824, 13.83954], [36.44653, 13.95666], [36.54376, 14.25597], [36.44337, 15.14963], [36.54276, 15.23478], [36.69761, 15.75323], [36.76371, 15.80831], [36.92193, 16.23451], [36.99777, 17.07172], [37.42694, 17.04041], [37.50967, 17.32199], [38.13362, 17.53906], [38.37133, 17.66269], [38.45916, 17.87167], [38.57727, 17.98125], [39.63762, 18.37348], [37.8565, 22.00903]]]]
+         }
+       }, {
+         type: "Feature",
+         properties: {
+           iso1A2: "SE",
+           iso1A3: "SWE",
+           iso1N3: "752",
+           wikidata: "Q34",
+           nameEn: "Sweden",
+           groups: ["EU", "154", "150", "UN"],
+           callingCodes: ["46"]
+         },
+         geometry: {
+           type: "MultiPolygon",
+           coordinates: [[[[24.15791, 65.85385], [23.90497, 66.15802], [23.71339, 66.21299], [23.64982, 66.30603], [23.67591, 66.3862], [23.63776, 66.43568], [23.85959, 66.56434], [23.89488, 66.772], [23.98059, 66.79585], [23.98563, 66.84149], [23.56214, 67.17038], [23.58735, 67.20752], [23.54701, 67.25435], [23.75372, 67.29914], [23.75372, 67.43688], [23.39577, 67.46974], [23.54701, 67.59306], [23.45627, 67.85297], [23.65793, 67.9497], [23.40081, 68.05545], [23.26469, 68.15134], [23.15377, 68.14759], [23.10336, 68.26551], [22.73028, 68.40881], [22.00429, 68.50692], [21.03001, 68.88969], [20.90649, 68.89696], [20.85104, 68.93142], [20.91658, 68.96764], [20.78802, 69.03087], [20.55258, 69.06069], [20.0695, 69.04469], [20.28444, 68.93283], [20.33435, 68.80174], [20.22027, 68.67246], [19.95647, 68.55546], [20.22027, 68.48759], [19.93508, 68.35911], [18.97255, 68.52416], [18.63032, 68.50849], [18.39503, 68.58672], [18.1241, 68.53721], [18.13836, 68.20874], [17.90787, 67.96537], [17.30416, 68.11591], [16.7409, 67.91037], [16.38441, 67.52923], [16.12774, 67.52106], [16.09922, 67.4364], [16.39154, 67.21653], [16.35589, 67.06419], [15.37197, 66.48217], [15.49318, 66.28509], [15.05113, 66.15572], [14.53778, 66.12399], [14.50926, 65.31786], [13.64276, 64.58402], [14.11117, 64.46674], [14.16051, 64.18725], [13.98222, 64.00953], [13.23411, 64.09087], [12.74105, 64.02171], [12.14928, 63.59373], [12.19919, 63.47935], [11.98529, 63.27487], [12.19919, 63.00104], [12.07085, 62.6297], [12.29187, 62.25699], [12.14746, 61.7147], [12.40595, 61.57226], [12.57707, 61.56547], [12.86939, 61.35427], [12.69115, 61.06584], [12.2277, 61.02442], [12.59133, 60.50559], [12.52003, 60.13846], [12.36317, 59.99259], [12.15641, 59.8926], [11.87121, 59.86039], [11.92112, 59.69531], [11.69297, 59.59442], [11.8213, 59.24985], [11.65732, 58.90177], [11.45199, 58.89604], [11.4601, 58.99022], [11.34459, 59.11672], [11.15367, 59.07862], [11.08911, 58.98745], [10.64958, 58.89391], [10.40861, 58.38489], [12.16597, 56.60205], [12.07466, 56.29488], [12.65312, 56.04345], [12.6372, 55.91371], [12.88472, 55.63369], [12.60345, 55.42675], [12.84405, 55.13257], [14.28399, 55.1553], [14.89259, 55.5623], [15.79951, 55.54655], [19.64795, 57.06466], [19.84909, 57.57876], [20.5104, 59.15546], [19.08191, 60.19152], [19.23413, 60.61414], [20.15877, 63.06556], [24.14112, 65.39731], [24.15107, 65.81427], [24.14798, 65.83466], [24.15791, 65.85385]]]]
+         }
+       }, {
+         type: "Feature",
+         properties: {
+           iso1A2: "SG",
+           iso1A3: "SGP",
+           iso1N3: "702",
+           wikidata: "Q334",
+           nameEn: "Singapore",
+           groups: ["035", "142", "UN"],
+           driveSide: "left",
+           callingCodes: ["65"]
+         },
+         geometry: {
+           type: "MultiPolygon",
+           coordinates: [[[[104.00131, 1.42405], [103.93384, 1.42926], [103.89565, 1.42841], [103.86383, 1.46288], [103.81181, 1.47953], [103.76395, 1.45183], [103.74161, 1.4502], [103.7219, 1.46108], [103.67468, 1.43166], [103.62738, 1.35255], [103.56591, 1.19719], [103.66049, 1.18825], [103.74084, 1.12902], [104.03085, 1.26954], [104.12282, 1.27714], [104.08072, 1.35998], [104.09162, 1.39694], [104.08871, 1.42015], [104.07348, 1.43322], [104.04622, 1.44691], [104.02277, 1.4438], [104.00131, 1.42405]]]]
+         }
+       }, {
+         type: "Feature",
+         properties: {
+           iso1A2: "SH",
+           iso1A3: "SHN",
+           iso1N3: "654",
+           wikidata: "Q192184",
+           nameEn: "Saint Helena, Ascension and Tristan da Cunha",
+           country: "GB"
+         },
+         geometry: null
+       }, {
+         type: "Feature",
+         properties: {
+           iso1A2: "SI",
+           iso1A3: "SVN",
+           iso1N3: "705",
+           wikidata: "Q215",
+           nameEn: "Slovenia",
+           groups: ["EU", "039", "150", "UN"],
+           callingCodes: ["386"]
+         },
+         geometry: {
+           type: "MultiPolygon",
+           coordinates: [[[[16.50139, 46.56684], [16.39217, 46.63673], [16.38594, 46.6549], [16.41863, 46.66238], [16.42641, 46.69228], [16.37816, 46.69975], [16.30966, 46.7787], [16.31303, 46.79838], [16.3408, 46.80641], [16.34547, 46.83836], [16.2941, 46.87137], [16.2365, 46.87775], [16.21892, 46.86961], [16.15711, 46.85434], [16.14365, 46.8547], [16.10983, 46.867], [16.05786, 46.83927], [15.99054, 46.82772], [15.99126, 46.78199], [15.98432, 46.74991], [15.99769, 46.7266], [16.02808, 46.71094], [16.04347, 46.68694], [16.04036, 46.6549], [15.99988, 46.67947], [15.98512, 46.68463], [15.94864, 46.68769], [15.87691, 46.7211], [15.8162, 46.71897], [15.78518, 46.70712], [15.76771, 46.69863], [15.73823, 46.70011], [15.72279, 46.69548], [15.69523, 46.69823], [15.67411, 46.70735], [15.6543, 46.70616], [15.6543, 46.69228], [15.6365, 46.6894], [15.63255, 46.68069], [15.62317, 46.67947], [15.59826, 46.68908], [15.54533, 46.66985], [15.55333, 46.64988], [15.54431, 46.6312], [15.46906, 46.61321], [15.45514, 46.63697], [15.41235, 46.65556], [15.23711, 46.63994], [15.14215, 46.66131], [15.01451, 46.641], [14.98024, 46.6009], [14.96002, 46.63459], [14.92283, 46.60848], [14.87129, 46.61], [14.86419, 46.59411], [14.83549, 46.56614], [14.81836, 46.51046], [14.72185, 46.49974], [14.66892, 46.44936], [14.5942, 46.43434], [14.56463, 46.37208], [14.52176, 46.42617], [14.45877, 46.41717], [14.42608, 46.44614], [14.314, 46.43327], [14.28326, 46.44315], [14.15989, 46.43327], [14.12097, 46.47724], [14.04002, 46.49117], [14.00422, 46.48474], [13.89837, 46.52331], [13.7148, 46.5222], [13.68684, 46.43881], [13.59777, 46.44137], [13.5763, 46.42613], [13.5763, 46.40915], [13.47019, 46.3621], [13.43418, 46.35992], [13.44808, 46.33507], [13.37671, 46.29668], [13.42218, 46.20758], [13.47587, 46.22725], [13.56114, 46.2054], [13.56682, 46.18703], [13.64451, 46.18966], [13.66472, 46.17392], [13.64053, 46.13587], [13.57072, 46.09022], [13.50104, 46.05986], [13.49568, 46.04839], [13.50998, 46.04498], [13.49702, 46.01832], [13.47474, 46.00546], [13.50104, 45.98078], [13.52963, 45.96588], [13.56759, 45.96991], [13.58903, 45.99009], [13.62074, 45.98388], [13.63458, 45.98947], [13.64307, 45.98326], [13.6329, 45.94894], [13.63815, 45.93607], [13.61931, 45.91782], [13.60857, 45.89907], [13.59565, 45.89446], [13.58644, 45.88173], [13.57563, 45.8425], [13.58858, 45.83503], [13.59784, 45.8072], [13.66986, 45.79955], [13.8235, 45.7176], [13.83332, 45.70855], [13.83422, 45.68703], [13.87933, 45.65207], [13.9191, 45.6322], [13.8695, 45.60835], [13.86771, 45.59898], [13.84106, 45.58185], [13.78445, 45.5825], [13.74587, 45.59811], [13.7198, 45.59352], [13.6076, 45.64761], [13.45644, 45.59464], [13.56979, 45.4895], [13.62902, 45.45898], [13.67398, 45.4436], [13.7785, 45.46787], [13.81742, 45.43729], [13.88124, 45.42637], [13.90771, 45.45149], [13.97309, 45.45258], [13.99488, 45.47551], [13.96063, 45.50825], [14.00578, 45.52352], [14.07116, 45.48752], [14.20348, 45.46896], [14.22371, 45.50388], [14.24239, 45.50607], [14.26611, 45.48239], [14.27681, 45.4902], [14.32487, 45.47142], [14.36693, 45.48642], [14.49769, 45.54424], [14.5008, 45.60852], [14.53816, 45.6205], [14.57397, 45.67165], [14.60977, 45.66403], [14.59576, 45.62812], [14.69694, 45.57366], [14.68605, 45.53006], [14.71718, 45.53442], [14.80124, 45.49515], [14.81992, 45.45913], [14.90554, 45.47769], [14.92266, 45.52788], [15.02385, 45.48533], [15.05187, 45.49079], [15.16862, 45.42309], [15.27758, 45.46678], [15.33051, 45.45258], [15.38188, 45.48752], [15.30249, 45.53224], [15.29837, 45.5841], [15.27747, 45.60504], [15.31027, 45.6303], [15.34695, 45.63382], [15.34214, 45.64702], [15.38952, 45.63682], [15.4057, 45.64727], [15.34919, 45.71623], [15.30872, 45.69014], [15.25423, 45.72275], [15.40836, 45.79491], [15.47531, 45.79802], [15.47325, 45.8253], [15.52234, 45.82195], [15.57952, 45.84953], [15.64185, 45.82915], [15.66662, 45.84085], [15.70411, 45.8465], [15.68232, 45.86819], [15.68383, 45.88867], [15.67967, 45.90455], [15.70636, 45.92116], [15.70327, 46.00015], [15.71246, 46.01196], [15.72977, 46.04682], [15.62317, 46.09103], [15.6083, 46.11992], [15.59909, 46.14761], [15.64904, 46.19229], [15.6434, 46.21396], [15.67395, 46.22478], [15.75436, 46.21969], [15.75479, 46.20336], [15.78817, 46.21719], [15.79284, 46.25811], [15.97965, 46.30652], [16.07616, 46.3463], [16.07314, 46.36458], [16.05065, 46.3833], [16.05281, 46.39141], [16.14859, 46.40547], [16.18824, 46.38282], [16.30233, 46.37837], [16.30162, 46.40437], [16.27329, 46.41467], [16.27398, 46.42875], [16.25124, 46.48067], [16.23961, 46.49653], [16.26759, 46.50566], [16.26733, 46.51505], [16.29793, 46.5121], [16.37193, 46.55008], [16.38771, 46.53608], [16.44036, 46.5171], [16.5007, 46.49644], [16.52604, 46.47831], [16.59527, 46.47524], [16.52604, 46.5051], [16.52885, 46.53303], [16.50139, 46.56684]]]]
+         }
+       }, {
+         type: "Feature",
+         properties: {
+           iso1A2: "SJ",
+           iso1A3: "SJM",
+           iso1N3: "744",
+           wikidata: "Q842829",
+           nameEn: "Svalbard and Jan Mayen",
+           country: "NO"
+         },
+         geometry: null
+       }, {
+         type: "Feature",
+         properties: {
+           iso1A2: "SK",
+           iso1A3: "SVK",
+           iso1N3: "703",
+           wikidata: "Q214",
+           nameEn: "Slovakia",
+           groups: ["EU", "151", "150", "UN"],
+           callingCodes: ["421"]
+         },
+         geometry: {
+           type: "MultiPolygon",
+           coordinates: [[[[19.82237, 49.27806], [19.78581, 49.41701], [19.72127, 49.39288], [19.6375, 49.40897], [19.64162, 49.45184], [19.57845, 49.46077], [19.53313, 49.52856], [19.52626, 49.57311], [19.45348, 49.61583], [19.37795, 49.574], [19.36009, 49.53747], [19.25435, 49.53391], [19.18019, 49.41165], [18.9742, 49.39557], [18.97283, 49.49914], [18.94536, 49.52143], [18.84521, 49.51672], [18.74761, 49.492], [18.67757, 49.50895], [18.6144, 49.49824], [18.57183, 49.51162], [18.53063, 49.49022], [18.54848, 49.47059], [18.44686, 49.39467], [18.4084, 49.40003], [18.4139, 49.36517], [18.36446, 49.3267], [18.18456, 49.28909], [18.15022, 49.24518], [18.1104, 49.08624], [18.06885, 49.03157], [17.91814, 49.01784], [17.87831, 48.92679], [17.77944, 48.92318], [17.73126, 48.87885], [17.7094, 48.86721], [17.5295, 48.81117], [17.45671, 48.85004], [17.3853, 48.80936], [17.29054, 48.85546], [17.19355, 48.87602], [17.11202, 48.82925], [17.00215, 48.70887], [16.93955, 48.60371], [16.94611, 48.53614], [16.85204, 48.44968], [16.8497, 48.38321], [16.83588, 48.3844], [16.83317, 48.38138], [16.84243, 48.35258], [16.90903, 48.32519], [16.89461, 48.31332], [16.97701, 48.17385], [17.02919, 48.13996], [17.05735, 48.14179], [17.09168, 48.09366], [17.07039, 48.0317], [17.16001, 48.00636], [17.23699, 48.02094], [17.71215, 47.7548], [18.02938, 47.75665], [18.29305, 47.73541], [18.56496, 47.76588], [18.66521, 47.76772], [18.74074, 47.8157], [18.8506, 47.82308], [18.76821, 47.87469], [18.76134, 47.97499], [18.82176, 48.04206], [19.01952, 48.07052], [19.23924, 48.0595], [19.28182, 48.08336], [19.47957, 48.09437], [19.52489, 48.19791], [19.63338, 48.25006], [19.92452, 48.1283], [20.24312, 48.2784], [20.29943, 48.26104], [20.5215, 48.53336], [20.83248, 48.5824], [21.11516, 48.49546], [21.44063, 48.58456], [21.6068, 48.50365], [21.67134, 48.3989], [21.72525, 48.34628], [21.8279, 48.33321], [21.83339, 48.36242], [22.14689, 48.4005], [22.16023, 48.56548], [22.21379, 48.6218], [22.34151, 48.68893], [22.42934, 48.92857], [22.48296, 48.99172], [22.54338, 49.01424], [22.56155, 49.08865], [22.04427, 49.22136], [21.96385, 49.3437], [21.82927, 49.39467], [21.77983, 49.35443], [21.62328, 49.4447], [21.43376, 49.41433], [21.27858, 49.45988], [21.19756, 49.4054], [21.12477, 49.43666], [21.041, 49.41791], [21.09799, 49.37176], [20.98733, 49.30774], [20.9229, 49.29626], [20.77971, 49.35383], [20.72274, 49.41813], [20.61666, 49.41791], [20.5631, 49.375], [20.46422, 49.41612], [20.39939, 49.3896], [20.31728, 49.39914], [20.31453, 49.34817], [20.21977, 49.35265], [20.13738, 49.31685], [20.08238, 49.1813], [19.98494, 49.22904], [19.90529, 49.23532], [19.86409, 49.19316], [19.75286, 49.20751], [19.82237, 49.27806]]]]
+         }
+       }, {
+         type: "Feature",
+         properties: {
+           iso1A2: "SL",
+           iso1A3: "SLE",
+           iso1N3: "694",
+           wikidata: "Q1044",
+           nameEn: "Sierra Leone",
+           groups: ["011", "202", "002", "UN"],
+           callingCodes: ["232"]
+         },
+         geometry: {
+           type: "MultiPolygon",
+           coordinates: [[[[-10.27575, 8.48711], [-10.37257, 8.48941], [-10.54891, 8.31174], [-10.63934, 8.35326], [-10.70565, 8.29235], [-10.61422, 8.5314], [-10.47707, 8.67669], [-10.56197, 8.81225], [-10.5783, 9.06386], [-10.74484, 9.07998], [-10.6534, 9.29919], [-11.2118, 10.00098], [-11.89624, 9.99763], [-11.91023, 9.93927], [-12.12634, 9.87203], [-12.24262, 9.92386], [-12.47254, 9.86834], [-12.76788, 9.3133], [-12.94095, 9.26335], [-13.08953, 9.0409], [-13.18586, 9.0925], [-13.29911, 9.04245], [-14.36218, 8.64107], [-12.15048, 6.15992], [-11.50429, 6.92704], [-11.4027, 6.97746], [-11.29417, 7.21576], [-10.60422, 7.7739], [-10.60492, 8.04072], [-10.57523, 8.04829], [-10.51554, 8.1393], [-10.45023, 8.15627], [-10.35227, 8.15223], [-10.29839, 8.21283], [-10.31635, 8.28554], [-10.30084, 8.30008], [-10.27575, 8.48711]]]]
+         }
+       }, {
+         type: "Feature",
+         properties: {
+           iso1A2: "SM",
+           iso1A3: "SMR",
+           iso1N3: "674",
+           wikidata: "Q238",
+           nameEn: "San Marino",
+           groups: ["039", "150", "UN"],
+           callingCodes: ["378"]
+         },
+         geometry: {
+           type: "MultiPolygon",
+           coordinates: [[[[12.45648, 43.89369], [12.48771, 43.89706], [12.49429, 43.90973], [12.49247, 43.91774], [12.49724, 43.92248], [12.50269, 43.92363], [12.50496, 43.93017], [12.51553, 43.94096], [12.51427, 43.94897], [12.50655, 43.95796], [12.50875, 43.96198], [12.50622, 43.97131], [12.51109, 43.97201], [12.51064, 43.98165], [12.5154, 43.98508], [12.51463, 43.99122], [12.50678, 43.99113], [12.49406, 43.98492], [12.47853, 43.98052], [12.46205, 43.97463], [12.44684, 43.96597], [12.43662, 43.95698], [12.42005, 43.9578], [12.41414, 43.95273], [12.40415, 43.95485], [12.40506, 43.94325], [12.41165, 43.93769], [12.41551, 43.92984], [12.40733, 43.92379], [12.41233, 43.90956], [12.40935, 43.9024], [12.41641, 43.89991], [12.44184, 43.90498], [12.45648, 43.89369]]]]
+         }
+       }, {
+         type: "Feature",
+         properties: {
+           iso1A2: "SN",
+           iso1A3: "SEN",
+           iso1N3: "686",
+           wikidata: "Q1041",
+           nameEn: "Senegal",
+           groups: ["011", "202", "002", "UN"],
+           callingCodes: ["221"]
+         },
+         geometry: {
+           type: "MultiPolygon",
+           coordinates: [[[[-14.32144, 16.61495], [-15.00557, 16.64997], [-15.6509, 16.50315], [-16.27016, 16.51565], [-16.4429, 16.20605], [-16.44814, 16.09753], [-16.48967, 16.0496], [-16.50854, 16.09032], [-17.15288, 16.07139], [-18.35085, 14.63444], [-17.43598, 13.59273], [-15.47902, 13.58758], [-15.36504, 13.79313], [-14.93719, 13.80173], [-14.34721, 13.46578], [-13.8955, 13.59126], [-13.79409, 13.34472], [-14.36795, 13.23033], [-15.14917, 13.57989], [-15.26908, 13.37768], [-15.80478, 13.34832], [-15.80355, 13.16729], [-16.69343, 13.16791], [-16.74676, 13.06025], [-17.43966, 13.04579], [-17.4623, 11.92379], [-16.70562, 12.34803], [-16.38191, 12.36449], [-16.20591, 12.46157], [-15.67302, 12.42974], [-15.17582, 12.6847], [-13.70523, 12.68013], [-13.05296, 12.64003], [-13.06603, 12.49342], [-12.87336, 12.51892], [-12.35415, 12.32758], [-11.91331, 12.42008], [-11.46267, 12.44559], [-11.37536, 12.40788], [-11.39935, 12.97808], [-11.63025, 13.39174], [-11.83345, 13.33333], [-12.06897, 13.71049], [-11.93043, 13.84505], [-12.23936, 14.76324], [-13.11029, 15.52116], [-13.43135, 16.09022], [-13.80075, 16.13961], [-14.32144, 16.61495]]]]
+         }
+       }, {
+         type: "Feature",
+         properties: {
+           iso1A2: "SO",
+           iso1A3: "SOM",
+           iso1N3: "706",
+           wikidata: "Q1045",
+           nameEn: "Somalia",
+           groups: ["014", "202", "002", "UN"],
+           callingCodes: ["252"]
+         },
+         geometry: {
+           type: "MultiPolygon",
+           coordinates: [[[[51.12877, 12.56479], [43.90659, 12.3823], [42.95776, 10.98533], [42.69452, 10.62672], [42.87643, 10.18441], [43.0937, 9.90579], [43.23518, 9.84605], [43.32613, 9.59205], [44.19222, 8.93028], [46.99339, 7.9989], [47.92477, 8.00111], [47.97917, 8.00124], [44.98104, 4.91821], [44.02436, 4.9451], [43.40263, 4.79289], [43.04177, 4.57923], [42.97746, 4.44032], [42.84526, 4.28357], [42.55853, 4.20518], [42.07619, 4.17667], [41.89488, 3.97375], [41.31368, 3.14314], [40.98767, 2.82959], [41.00099, -0.83068], [41.56, -1.59812], [41.56362, -1.66375], [41.75542, -1.85308], [57.49095, 8.14549], [51.12877, 12.56479]]]]
+         }
+       }, {
+         type: "Feature",
+         properties: {
+           iso1A2: "SR",
+           iso1A3: "SUR",
+           iso1N3: "740",
+           wikidata: "Q730",
+           nameEn: "Suriname",
+           groups: ["005", "419", "019", "UN"],
+           driveSide: "left",
+           callingCodes: ["597"]
+         },
+         geometry: {
+           type: "MultiPolygon",
+           coordinates: [[[[-54.26916, 5.26909], [-54.01877, 5.52789], [-54.01074, 5.68785], [-53.7094, 6.2264], [-56.84822, 6.73257], [-57.31629, 5.33714], [-57.22536, 5.15605], [-57.37442, 5.0208], [-57.8699, 4.89394], [-58.0307, 3.95513], [-57.35891, 3.32121], [-56.70519, 2.02964], [-56.55439, 2.02003], [-56.47045, 1.95135], [-55.99278, 1.83137], [-55.89863, 1.89861], [-55.92159, 2.05236], [-56.13054, 2.27723], [-55.96292, 2.53188], [-55.71493, 2.40342], [-55.01919, 2.564], [-54.6084, 2.32856], [-54.42864, 2.42442], [-54.28534, 2.67798], [-53.9849, 3.58697], [-53.98914, 3.627], [-54.05128, 3.63557], [-54.19367, 3.84387], [-54.38444, 4.13222], [-54.4717, 4.91964], [-54.26916, 5.26909]]]]
+         }
+       }, {
+         type: "Feature",
+         properties: {
+           iso1A2: "SS",
+           iso1A3: "SSD",
+           iso1N3: "728",
+           wikidata: "Q958",
+           nameEn: "South Sudan",
+           groups: ["014", "202", "002", "UN"],
+           callingCodes: ["211"]
+         },
+         geometry: {
+           type: "MultiPolygon",
+           coordinates: [[[[34.10229, 9.50238], [33.87958, 9.49937], [33.9082, 9.762], [33.96323, 9.80972], [33.99185, 9.99623], [33.96984, 10.15446], [33.90159, 10.17179], [33.80913, 10.32994], [33.66604, 10.44254], [33.52294, 10.64382], [33.24645, 10.77913], [33.26977, 10.83632], [33.13988, 11.43248], [33.25876, 12.22111], [32.73921, 12.22757], [32.73921, 11.95203], [32.10079, 11.95203], [32.39578, 11.70208], [32.39358, 11.18207], [32.46967, 11.04662], [31.99177, 10.65065], [31.77539, 10.28939], [31.28504, 9.75287], [30.84605, 9.7498], [30.82893, 9.71451], [30.53005, 9.95992], [30.00389, 10.28633], [29.94629, 10.29245], [29.54, 10.07949], [29.53844, 9.75133], [29.06988, 9.74826], [28.99983, 9.67155], [27.90704, 9.61323], [27.14427, 9.62858], [26.70685, 9.48735], [26.35815, 9.57946], [26.21338, 9.91545], [25.93241, 10.17941], [25.93163, 10.38159], [25.78141, 10.42599], [25.0918, 10.33718], [25.05688, 10.06776], [24.97739, 9.9081], [24.84653, 9.80643], [24.49389, 9.79962], [24.12744, 9.73784], [24.09319, 9.66572], [23.69155, 9.67566], [23.62179, 9.53823], [23.64981, 9.44303], [23.64358, 9.28637], [23.56263, 9.19418], [23.4848, 9.16959], [23.44744, 8.99128], [23.59065, 8.99743], [23.51905, 8.71749], [24.25691, 8.69288], [24.13238, 8.36959], [24.35965, 8.26177], [24.85156, 8.16933], [24.98855, 7.96588], [25.25319, 7.8487], [25.29214, 7.66675], [25.20649, 7.61115], [25.20337, 7.50312], [25.35281, 7.42595], [25.37461, 7.33024], [25.90076, 7.09549], [26.38022, 6.63493], [26.32729, 6.36272], [26.58259, 6.1987], [26.51721, 6.09655], [27.22705, 5.71254], [27.22705, 5.62889], [27.28621, 5.56382], [27.23017, 5.37167], [27.26886, 5.25876], [27.44012, 5.07349], [27.56656, 4.89375], [27.65462, 4.89375], [27.76469, 4.79284], [27.79551, 4.59976], [28.20719, 4.35614], [28.6651, 4.42638], [28.8126, 4.48784], [29.03054, 4.48784], [29.22207, 4.34297], [29.43341, 4.50101], [29.49726, 4.7007], [29.82087, 4.56246], [29.79666, 4.37809], [30.06964, 4.13221], [30.1621, 4.10586], [30.22374, 3.93896], [30.27658, 3.95653], [30.47691, 3.83353], [30.55396, 3.84451], [30.57378, 3.74567], [30.56277, 3.62703], [30.78512, 3.67097], [30.80713, 3.60506], [30.85997, 3.5743], [30.85153, 3.48867], [30.97601, 3.693], [31.16666, 3.79853], [31.29476, 3.8015], [31.50478, 3.67814], [31.50776, 3.63652], [31.72075, 3.74354], [31.81459, 3.82083], [31.86821, 3.78664], [31.96205, 3.6499], [31.95907, 3.57408], [32.05187, 3.589], [32.08491, 3.56287], [32.08866, 3.53543], [32.19888, 3.50867], [32.20782, 3.6053], [32.41337, 3.748], [32.72021, 3.77327], [32.89746, 3.81339], [33.02852, 3.89296], [33.18356, 3.77812], [33.51264, 3.75068], [33.9873, 4.23316], [34.47601, 4.72162], [35.34151, 5.02364], [35.30992, 4.90402], [35.47843, 4.91872], [35.42366, 4.76969], [35.51424, 4.61643], [35.9419, 4.61933], [35.82118, 4.77382], [35.81968, 5.10757], [35.8576, 5.33413], [35.50792, 5.42431], [35.29938, 5.34042], [35.31188, 5.50106], [35.13058, 5.62118], [35.12611, 5.68937], [35.00546, 5.89387], [34.96227, 6.26415], [35.01738, 6.46991], [34.87736, 6.60161], [34.77459, 6.5957], [34.65096, 6.72589], [34.53776, 6.74808], [34.53925, 6.82794], [34.47669, 6.91076], [34.35753, 6.91963], [34.19369, 7.04382], [34.19369, 7.12807], [34.01495, 7.25664], [34.03878, 7.27437], [34.02984, 7.36449], [33.87642, 7.5491], [33.71407, 7.65983], [33.44745, 7.7543], [33.32531, 7.71297], [33.24637, 7.77939], [33.04944, 7.78989], [33.0006, 7.90333], [33.08401, 8.05822], [33.18083, 8.13047], [33.1853, 8.29264], [33.19721, 8.40317], [33.3119, 8.45474], [33.54575, 8.47094], [33.66938, 8.44442], [33.71407, 8.3678], [33.87195, 8.41938], [33.89579, 8.4842], [34.01346, 8.50041], [34.14453, 8.60204], [34.14304, 9.04654], [34.10229, 9.50238]]]]
+         }
+       }, {
+         type: "Feature",
+         properties: {
+           iso1A2: "ST",
+           iso1A3: "STP",
+           iso1N3: "678",
+           wikidata: "Q1039",
+           nameEn: "S\xE3o Tom\xE9 and Principe",
+           groups: ["017", "202", "002", "UN"],
+           callingCodes: ["239"]
+         },
+         geometry: {
+           type: "MultiPolygon",
+           coordinates: [[[[4.34149, 1.91417], [6.6507, -0.28606], [7.9035, 1.92304], [4.34149, 1.91417]]]]
+         }
+       }, {
+         type: "Feature",
+         properties: {
+           iso1A2: "SV",
+           iso1A3: "SLV",
+           iso1N3: "222",
+           wikidata: "Q792",
+           nameEn: "El Salvador",
+           groups: ["013", "003", "419", "019", "UN"],
+           callingCodes: ["503"]
+         },
+         geometry: {
+           type: "MultiPolygon",
+           coordinates: [[[[-89.34776, 14.43013], [-89.39028, 14.44561], [-89.57441, 14.41637], [-89.58814, 14.33165], [-89.50614, 14.26084], [-89.52397, 14.22628], [-89.61844, 14.21937], [-89.70756, 14.1537], [-89.75569, 14.07073], [-89.73251, 14.04133], [-89.76103, 14.02923], [-89.81807, 14.07073], [-89.88937, 14.0396], [-90.10505, 13.85104], [-90.11344, 13.73679], [-90.55276, 12.8866], [-88.11443, 12.63306], [-87.7346, 13.13228], [-87.55124, 13.12523], [-87.69751, 13.25228], [-87.73714, 13.32715], [-87.80177, 13.35689], [-87.84675, 13.41078], [-87.83467, 13.44655], [-87.77354, 13.45767], [-87.73841, 13.44169], [-87.72115, 13.46083], [-87.71657, 13.50577], [-87.78148, 13.52906], [-87.73106, 13.75443], [-87.68821, 13.80829], [-87.7966, 13.91353], [-88.00331, 13.86948], [-88.07641, 13.98447], [-88.23018, 13.99915], [-88.25791, 13.91108], [-88.48982, 13.86458], [-88.49738, 13.97224], [-88.70661, 14.04317], [-88.73182, 14.10919], [-88.815, 14.11652], [-88.85785, 14.17763], [-88.94608, 14.20207], [-89.04187, 14.33644], [-89.34776, 14.43013]]]]
+         }
+       }, {
+         type: "Feature",
+         properties: {
+           iso1A2: "SX",
+           iso1A3: "SXM",
+           iso1N3: "534",
+           wikidata: "Q26273",
+           nameEn: "Sint Maarten",
+           aliases: ["NL-SX"],
+           country: "NL",
+           groups: ["Q1451600", "029", "003", "419", "019", "UN"],
+           callingCodes: ["1 721"]
+         },
+         geometry: {
+           type: "MultiPolygon",
+           coordinates: [[[[-63.33064, 17.9615], [-63.1055, 17.86651], [-62.93924, 18.02904], [-63.02323, 18.05757], [-63.04039, 18.05619], [-63.0579, 18.06614], [-63.07759, 18.04943], [-63.09686, 18.04608], [-63.11042, 18.05339], [-63.13502, 18.05445], [-63.33064, 17.9615]]]]
+         }
+       }, {
+         type: "Feature",
+         properties: {
+           iso1A2: "SY",
+           iso1A3: "SYR",
+           iso1N3: "760",
+           wikidata: "Q858",
+           nameEn: "Syria",
+           groups: ["145", "142", "UN"],
+           callingCodes: ["963"]
+         },
+         geometry: {
+           type: "MultiPolygon",
+           coordinates: [[[[42.23683, 37.2863], [42.21548, 37.28026], [42.20454, 37.28715], [42.22381, 37.30238], [42.22257, 37.31395], [42.2112, 37.32491], [42.19301, 37.31323], [42.18225, 37.28569], [42.00894, 37.17209], [41.515, 37.08084], [41.21937, 37.07665], [40.90856, 37.13147], [40.69136, 37.0996], [39.81589, 36.75538], [39.21538, 36.66834], [39.03217, 36.70911], [38.74042, 36.70629], [38.55908, 36.84429], [38.38859, 36.90064], [38.21064, 36.91842], [37.81974, 36.76055], [37.68048, 36.75065], [37.49103, 36.66904], [37.47253, 36.63243], [37.21988, 36.6736], [37.16177, 36.66069], [37.10894, 36.6704], [37.08279, 36.63495], [37.02088, 36.66422], [37.01647, 36.69512], [37.04619, 36.71101], [37.04399, 36.73483], [36.99886, 36.74012], [36.99557, 36.75997], [36.66727, 36.82901], [36.61581, 36.74629], [36.62681, 36.71189], [36.57398, 36.65186], [36.58829, 36.58295], [36.54206, 36.49539], [36.6081, 36.33772], [36.65653, 36.33861], [36.68672, 36.23677], [36.6125, 36.22592], [36.50463, 36.2419], [36.4617, 36.20461], [36.39206, 36.22088], [36.37474, 36.01163], [36.33956, 35.98687], [36.30099, 36.00985], [36.28338, 36.00273], [36.29769, 35.96086], [36.27678, 35.94839], [36.25366, 35.96264], [36.19973, 35.95195], [36.17441, 35.92076], [36.1623, 35.80925], [36.14029, 35.81015], [36.13919, 35.83692], [36.11827, 35.85923], [35.99829, 35.88242], [36.01844, 35.92403], [36.00514, 35.94113], [35.98499, 35.94107], [35.931, 35.92109], [35.51152, 36.10954], [35.48515, 34.70851], [35.97386, 34.63322], [35.98718, 34.64977], [36.29165, 34.62991], [36.32399, 34.69334], [36.35135, 34.68516], [36.35384, 34.65447], [36.42941, 34.62505], [36.46003, 34.6378], [36.45299, 34.59438], [36.41429, 34.61175], [36.39846, 34.55672], [36.3369, 34.52629], [36.34745, 34.5002], [36.4442, 34.50165], [36.46179, 34.46541], [36.55853, 34.41609], [36.53039, 34.3798], [36.56556, 34.31881], [36.60778, 34.31009], [36.58667, 34.27667], [36.59195, 34.2316], [36.62537, 34.20251], [36.5128, 34.09916], [36.50576, 34.05982], [36.41078, 34.05253], [36.28589, 33.91981], [36.38263, 33.86579], [36.3967, 33.83365], [36.14517, 33.85118], [36.06778, 33.82927], [35.9341, 33.6596], [36.05723, 33.57904], [35.94465, 33.52774], [35.94816, 33.47886], [35.88668, 33.43183], [35.82577, 33.40479], [35.81324, 33.36354], [35.77477, 33.33609], [35.813, 33.3172], [35.77513, 33.27342], [35.81295, 33.24841], [35.81647, 33.2028], [35.83846, 33.19397], [35.84285, 33.16673], [35.81911, 33.1336], [35.81911, 33.11077], [35.84802, 33.1031], [35.87188, 32.98028], [35.89298, 32.9456], [35.87012, 32.91976], [35.84021, 32.8725], [35.83758, 32.82817], [35.78745, 32.77938], [35.75983, 32.74803], [35.88405, 32.71321], [35.93307, 32.71966], [35.96633, 32.66237], [36.02239, 32.65911], [36.08074, 32.51463], [36.20379, 32.52751], [36.20875, 32.49529], [36.23948, 32.50108], [36.40959, 32.37908], [36.83946, 32.31293], [38.79171, 33.37328], [40.64314, 34.31604], [40.97676, 34.39788], [41.12388, 34.65742], [41.2345, 34.80049], [41.21654, 35.1508], [41.26569, 35.42708], [41.38184, 35.62502], [41.37027, 35.84095], [41.2564, 36.06012], [41.28864, 36.35368], [41.40058, 36.52502], [41.81736, 36.58782], [42.36697, 37.0627], [42.35724, 37.10998], [42.32313, 37.17814], [42.34735, 37.22548], [42.2824, 37.2798], [42.26039, 37.27017], [42.23683, 37.2863]]]]
+         }
+       }, {
+         type: "Feature",
+         properties: {
+           iso1A2: "SZ",
+           iso1A3: "SWZ",
+           iso1N3: "748",
+           wikidata: "Q1050",
+           nameEn: "Eswatini",
+           aliases: ["Swaziland"],
+           groups: ["018", "202", "002", "UN"],
+           driveSide: "left",
+           callingCodes: ["268"]
+         },
+         geometry: {
+           type: "MultiPolygon",
+           coordinates: [[[[31.86881, -25.99973], [31.4175, -25.71886], [31.31237, -25.7431], [31.13073, -25.91558], [30.95819, -26.26303], [30.78927, -26.48271], [30.81101, -26.84722], [30.88826, -26.79622], [30.97757, -26.92706], [30.96088, -27.0245], [31.15027, -27.20151], [31.49834, -27.31549], [31.97592, -27.31675], [31.97463, -27.11057], [32.00893, -26.8096], [32.09664, -26.80721], [32.13315, -26.84345], [32.13409, -26.5317], [32.07352, -26.40185], [32.10435, -26.15656], [32.08599, -26.00978], [32.00916, -25.999], [31.974, -25.95387], [31.86881, -25.99973]]]]
+         }
+       }, {
+         type: "Feature",
+         properties: {
+           iso1A2: "TA",
+           iso1A3: "TAA",
+           wikidata: "Q220982",
+           nameEn: "Tristan da Cunha",
+           aliases: ["SH-TA"],
+           country: "GB",
+           groups: ["SH", "BOTS", "011", "202", "002", "UN"],
+           isoStatus: "excRes",
+           driveSide: "left",
+           roadSpeedUnit: "mph",
+           roadHeightUnit: "ft",
+           callingCodes: ["290 8", "44 20"]
+         },
+         geometry: {
+           type: "MultiPolygon",
+           coordinates: [[[[-13.38232, -34.07258], [-16.67337, -41.9188], [-5.88482, -41.4829], [-13.38232, -34.07258]]]]
+         }
+       }, {
+         type: "Feature",
+         properties: {
+           iso1A2: "TC",
+           iso1A3: "TCA",
+           iso1N3: "796",
+           wikidata: "Q18221",
+           nameEn: "Turks and Caicos Islands",
+           country: "GB",
+           groups: ["BOTS", "029", "003", "419", "019", "UN"],
+           driveSide: "left",
+           roadSpeedUnit: "mph",
+           roadHeightUnit: "ft",
+           callingCodes: ["1 649"]
+         },
+         geometry: {
+           type: "MultiPolygon",
+           coordinates: [[[[-71.70065, 25.7637], [-72.98446, 20.4801], [-69.80718, 21.35956], [-71.70065, 25.7637]]]]
+         }
+       }, {
+         type: "Feature",
+         properties: {
+           iso1A2: "TD",
+           iso1A3: "TCD",
+           iso1N3: "148",
+           wikidata: "Q657",
+           nameEn: "Chad",
+           groups: ["017", "202", "002", "UN"],
+           callingCodes: ["235"]
+         },
+         geometry: {
+           type: "MultiPolygon",
+           coordinates: [[[[23.99539, 19.49944], [15.99566, 23.49639], [14.99751, 23.00539], [15.19692, 21.99339], [15.20213, 21.49365], [15.28332, 21.44557], [15.62515, 20.95395], [15.57248, 20.92138], [15.55382, 20.86507], [15.56004, 20.79488], [15.59841, 20.74039], [15.6721, 20.70069], [15.99632, 20.35364], [15.75098, 19.93002], [15.6032, 18.77402], [15.50373, 16.89649], [14.37425, 15.72591], [13.86301, 15.04043], [13.78991, 14.87519], [13.809, 14.72915], [13.67878, 14.64013], [13.68573, 14.55276], [13.48259, 14.46704], [13.47559, 14.40881], [13.6302, 13.71094], [14.08251, 13.0797], [14.46881, 13.08259], [14.56101, 12.91036], [14.55058, 12.78256], [14.83314, 12.62963], [14.90827, 12.3269], [14.89019, 12.16593], [14.96952, 12.0925], [15.00146, 12.1223], [15.0349, 12.10698], [15.05786, 12.0608], [15.04808, 11.8731], [15.11579, 11.79313], [15.06595, 11.71126], [15.13149, 11.5537], [15.0585, 11.40481], [15.10021, 11.04101], [15.04957, 11.02347], [15.09127, 10.87431], [15.06737, 10.80921], [15.15532, 10.62846], [15.14936, 10.53915], [15.23724, 10.47764], [15.30874, 10.31063], [15.50535, 10.1098], [15.68761, 9.99344], [15.41408, 9.92876], [15.24618, 9.99246], [15.14043, 9.99246], [15.05999, 9.94845], [14.95722, 9.97926], [14.80082, 9.93818], [14.4673, 10.00264], [14.20411, 10.00055], [14.1317, 9.82413], [14.01793, 9.73169], [13.97544, 9.6365], [14.37094, 9.2954], [14.35707, 9.19611], [14.83566, 8.80557], [15.09484, 8.65982], [15.20426, 8.50892], [15.50743, 7.79302], [15.59272, 7.7696], [15.56964, 7.58936], [15.49743, 7.52179], [15.73118, 7.52006], [15.79942, 7.44149], [16.40703, 7.68809], [16.41583, 7.77971], [16.58315, 7.88657], [16.59415, 7.76444], [16.658, 7.75353], [16.6668, 7.67281], [16.8143, 7.53971], [17.67288, 7.98905], [17.93926, 7.95853], [18.02731, 8.01085], [18.6085, 8.05009], [18.64153, 8.08714], [18.62612, 8.14163], [18.67455, 8.22226], [18.79783, 8.25929], [19.11044, 8.68172], [18.86388, 8.87971], [19.06421, 9.00367], [20.36748, 9.11019], [20.82979, 9.44696], [21.26348, 9.97642], [21.34934, 9.95907], [21.52766, 10.2105], [21.63553, 10.217], [21.71479, 10.29932], [21.72139, 10.64136], [22.45889, 11.00246], [22.87758, 10.91915], [22.97249, 11.21955], [22.93124, 11.41645], [22.7997, 11.40424], [22.54907, 11.64372], [22.64092, 12.07485], [22.48369, 12.02766], [22.50548, 12.16769], [22.38873, 12.45514], [22.46345, 12.61925], [22.22684, 12.74682], [22.15679, 12.66634], [21.98711, 12.63292], [21.89371, 12.68001], [21.81432, 12.81362], [21.94819, 13.05637], [22.02914, 13.13976], [22.1599, 13.19281], [22.29689, 13.3731], [22.08674, 13.77863], [22.22995, 13.96754], [22.5553, 14.11704], [22.55997, 14.23024], [22.44944, 14.24986], [22.38562, 14.58907], [22.70474, 14.69149], [22.66115, 14.86308], [22.99584, 15.22989], [22.99584, 15.40105], [22.92579, 15.47007], [22.93201, 15.55107], [23.10792, 15.71297], [23.38812, 15.69649], [23.62785, 15.7804], [23.99997, 15.69575], [23.99539, 19.49944]]]]
+         }
+       }, {
+         type: "Feature",
+         properties: {
+           iso1A2: "TF",
+           iso1A3: "ATF",
+           iso1N3: "260",
+           wikidata: "Q129003",
+           nameEn: "French Southern Territories",
+           country: "FR"
+         },
+         geometry: null
+       }, {
+         type: "Feature",
+         properties: {
+           iso1A2: "TG",
+           iso1A3: "TGO",
+           iso1N3: "768",
+           wikidata: "Q945",
+           nameEn: "Togo",
+           groups: ["011", "202", "002", "UN"],
+           callingCodes: ["228"]
+         },
+         geometry: {
+           type: "MultiPolygon",
+           coordinates: [[[[0.50388, 11.01011], [-0.13493, 11.14075], [-0.14462, 11.10811], [-0.05733, 11.08628], [-0.0275, 11.11202], [-514e-5, 11.10763], [342e-5, 11.08317], [0.02395, 11.06229], [0.03355, 10.9807], [-63e-4, 10.96417], [-908e-5, 10.91644], [-0.02685, 10.8783], [-0.0228, 10.81916], [-0.07183, 10.76794], [-0.07327, 10.71845], [-0.09141, 10.7147], [-0.05945, 10.63458], [0.12886, 10.53149], [0.18846, 10.4096], [0.29453, 10.41546], [0.33028, 10.30408], [0.39584, 10.31112], [0.35293, 10.09412], [0.41371, 10.06361], [0.41252, 10.02018], [0.36366, 10.03309], [0.32075, 9.72781], [0.34816, 9.71607], [0.34816, 9.66907], [0.32313, 9.6491], [0.28261, 9.69022], [0.26712, 9.66437], [0.29334, 9.59387], [0.36008, 9.6256], [0.38153, 9.58682], [0.23851, 9.57389], [0.2409, 9.52335], [0.30406, 9.521], [0.31241, 9.50337], [0.2254, 9.47869], [0.25758, 9.42696], [0.33148, 9.44812], [0.36485, 9.49749], [0.49118, 9.48339], [0.56388, 9.40697], [0.45424, 9.04581], [0.52455, 8.87746], [0.37319, 8.75262], [0.47211, 8.59945], [0.64731, 8.48866], [0.73432, 8.29529], [0.63897, 8.25873], [0.5913, 8.19622], [0.61156, 8.18324], [0.6056, 8.13959], [0.58891, 8.12779], [0.62943, 7.85751], [0.58295, 7.62368], [0.51979, 7.58706], [0.52455, 7.45354], [0.57223, 7.39326], [0.62943, 7.41099], [0.65327, 7.31643], [0.59606, 7.01252], [0.52217, 6.9723], [0.52098, 6.94391], [0.56508, 6.92971], [0.52853, 6.82921], [0.57406, 6.80348], [0.58176, 6.76049], [0.6497, 6.73682], [0.63659, 6.63857], [0.74862, 6.56517], [0.71048, 6.53083], [0.89283, 6.33779], [0.99652, 6.33779], [1.03108, 6.24064], [1.05969, 6.22998], [1.09187, 6.17074], [1.19966, 6.17069], [1.19771, 6.11522], [1.27574, 5.93551], [1.67336, 6.02702], [1.62913, 6.24075], [1.79826, 6.28221], [1.76906, 6.43189], [1.58105, 6.68619], [1.61812, 6.74843], [1.55877, 6.99737], [1.64249, 6.99562], [1.61838, 9.0527], [1.5649, 9.16941], [1.41746, 9.3226], [1.33675, 9.54765], [1.36624, 9.5951], [1.35507, 9.99525], [0.77666, 10.37665], [0.80358, 10.71459], [0.8804, 10.803], [0.91245, 10.99597], [0.66104, 10.99964], [0.4958, 10.93269], [0.50521, 10.98035], [0.48852, 10.98561], [0.50388, 11.01011]]]]
+         }
+       }, {
+         type: "Feature",
+         properties: {
+           iso1A2: "TH",
+           iso1A3: "THA",
+           iso1N3: "764",
+           wikidata: "Q869",
+           nameEn: "Thailand",
+           groups: ["035", "142", "UN"],
+           driveSide: "left",
+           callingCodes: ["66"]
+         },
+         geometry: {
+           type: "MultiPolygon",
+           coordinates: [[[[100.08404, 20.36626], [99.95721, 20.46301], [99.91616, 20.44986], [99.90499, 20.4487], [99.89692, 20.44789], [99.89301, 20.44311], [99.89168, 20.44548], [99.88451, 20.44596], [99.88211, 20.44488], [99.86383, 20.44371], [99.81096, 20.33687], [99.68255, 20.32077], [99.46008, 20.39673], [99.46077, 20.36198], [99.5569, 20.20676], [99.52943, 20.14811], [99.416, 20.08614], [99.20328, 20.12877], [99.0735, 20.10298], [98.98679, 19.7419], [98.83661, 19.80931], [98.56065, 19.67807], [98.51182, 19.71303], [98.24884, 19.67876], [98.13829, 19.78541], [98.03314, 19.80941], [98.04364, 19.65755], [97.84715, 19.55782], [97.88423, 19.5041], [97.78769, 19.39429], [97.84186, 19.29526], [97.78606, 19.26769], [97.84024, 19.22217], [97.83479, 19.09972], [97.73797, 19.04261], [97.73654, 18.9812], [97.66487, 18.9371], [97.73836, 18.88478], [97.76752, 18.58097], [97.5258, 18.4939], [97.36444, 18.57138], [97.34522, 18.54596], [97.50383, 18.26844], [97.56219, 18.33885], [97.64116, 18.29778], [97.60841, 18.23846], [97.73723, 17.97912], [97.66794, 17.88005], [97.76407, 17.71595], [97.91829, 17.54504], [98.11185, 17.36829], [98.10439, 17.33847], [98.34566, 17.04822], [98.39441, 17.06266], [98.52624, 16.89979], [98.49603, 16.8446], [98.53833, 16.81934], [98.46994, 16.73613], [98.50253, 16.7139], [98.49713, 16.69022], [98.51043, 16.70107], [98.51579, 16.69433], [98.51472, 16.68521], [98.51833, 16.676], [98.51113, 16.64503], [98.5695, 16.62826], [98.57912, 16.55983], [98.63817, 16.47424], [98.68074, 16.27068], [98.84485, 16.42354], [98.92656, 16.36425], [98.8376, 16.11706], [98.69585, 16.13353], [98.57019, 16.04578], [98.59853, 15.87197], [98.541, 15.65406], [98.58598, 15.46821], [98.56027, 15.33471], [98.4866, 15.39154], [98.39351, 15.34177], [98.41906, 15.27103], [98.40522, 15.25268], [98.30446, 15.30667], [98.22, 15.21327], [98.18821, 15.13125], [98.24874, 14.83013], [98.56762, 14.37701], [98.97356, 14.04868], [99.16695, 13.72621], [99.20617, 13.20575], [99.12225, 13.19847], [99.10646, 13.05804], [99.18748, 12.9898], [99.18905, 12.84799], [99.29254, 12.68921], [99.409, 12.60603], [99.47519, 12.1353], [99.56445, 12.14805], [99.53424, 12.02317], [99.64891, 11.82699], [99.64108, 11.78948], [99.5672, 11.62732], [99.47598, 11.62434], [99.39485, 11.3925], [99.31573, 11.32081], [99.32756, 11.28545], [99.06938, 10.94857], [99.02337, 10.97217], [98.99701, 10.92962], [99.0069, 10.85485], [98.86819, 10.78336], [98.78511, 10.68351], [98.77275, 10.62548], [98.81944, 10.52761], [98.7391, 10.31488], [98.55174, 9.92804], [98.52291, 9.92389], [98.47298, 9.95782], [98.33094, 9.91973], [98.12555, 9.44056], [97.63455, 9.60854], [97.19814, 8.18901], [99.31854, 5.99868], [99.50117, 6.44501], [99.91873, 6.50233], [100.0756, 6.4045], [100.12, 6.42105], [100.19511, 6.72559], [100.29651, 6.68439], [100.30828, 6.66462], [100.31618, 6.66781], [100.31884, 6.66423], [100.32671, 6.66526], [100.32607, 6.65933], [100.31929, 6.65413], [100.35413, 6.54932], [100.41152, 6.52299], [100.41791, 6.5189], [100.42351, 6.51762], [100.43027, 6.52389], [100.66986, 6.45086], [100.74361, 6.50811], [100.74822, 6.46231], [100.81045, 6.45086], [100.85884, 6.24929], [101.10313, 6.25617], [101.12618, 6.19431], [101.06165, 6.14161], [101.12388, 6.11411], [101.087, 5.9193], [101.02708, 5.91013], [100.98815, 5.79464], [101.14062, 5.61613], [101.25755, 5.71065], [101.25524, 5.78633], [101.58019, 5.93534], [101.69773, 5.75881], [101.75074, 5.79091], [101.80144, 5.74505], [101.89188, 5.8386], [101.91776, 5.84269], [101.92819, 5.85511], [101.94712, 5.98421], [101.9714, 6.00575], [101.97114, 6.01992], [101.99209, 6.04075], [102.01835, 6.05407], [102.09182, 6.14161], [102.07732, 6.193], [102.08127, 6.22679], [102.09086, 6.23546], [102.46318, 7.22462], [102.47649, 9.66162], [102.52395, 11.25257], [102.91449, 11.65512], [102.90973, 11.75613], [102.83957, 11.8519], [102.78427, 11.98746], [102.77026, 12.06815], [102.70176, 12.1686], [102.73134, 12.37091], [102.78116, 12.40284], [102.7796, 12.43781], [102.57567, 12.65358], [102.51963, 12.66117], [102.4994, 12.71736], [102.53053, 12.77506], [102.49335, 12.92711], [102.48694, 12.97537], [102.52275, 12.99813], [102.46011, 13.08057], [102.43422, 13.09061], [102.36146, 13.26006], [102.36001, 13.31142], [102.34611, 13.35618], [102.35692, 13.38274], [102.35563, 13.47307], [102.361, 13.50551], [102.33828, 13.55613], [102.36859, 13.57488], [102.44601, 13.5637], [102.5358, 13.56933], [102.57573, 13.60461], [102.62483, 13.60883], [102.58635, 13.6286], [102.5481, 13.6589], [102.56848, 13.69366], [102.72727, 13.77806], [102.77864, 13.93374], [102.91251, 14.01531], [102.93275, 14.19044], [103.16469, 14.33075], [103.39353, 14.35639], [103.53518, 14.42575], [103.71109, 14.4348], [103.70175, 14.38052], [103.93836, 14.3398], [104.27616, 14.39861], [104.55014, 14.36091], [104.69335, 14.42726], [104.97667, 14.38806], [105.02804, 14.23722], [105.08408, 14.20402], [105.14012, 14.23873], [105.17748, 14.34432], [105.20894, 14.34967], [105.43783, 14.43865], [105.53864, 14.55731], [105.5121, 14.80802], [105.61162, 15.00037], [105.46661, 15.13132], [105.58043, 15.32724], [105.50662, 15.32054], [105.4692, 15.33709], [105.47635, 15.3796], [105.58191, 15.41031], [105.60446, 15.53301], [105.61756, 15.68792], [105.46573, 15.74742], [105.42285, 15.76971], [105.37959, 15.84074], [105.34115, 15.92737], [105.38508, 15.987], [105.42001, 16.00657], [105.06204, 16.09792], [105.00262, 16.25627], [104.88057, 16.37311], [104.73349, 16.565], [104.76099, 16.69302], [104.7397, 16.81005], [104.76442, 16.84752], [104.7373, 16.91125], [104.73712, 17.01404], [104.80716, 17.19025], [104.80061, 17.39367], [104.69867, 17.53038], [104.45404, 17.66788], [104.35432, 17.82871], [104.2757, 17.86139], [104.21776, 17.99335], [104.10927, 18.10826], [104.06533, 18.21656], [103.97725, 18.33631], [103.93916, 18.33914], [103.85642, 18.28666], [103.82449, 18.33979], [103.699, 18.34125], [103.60957, 18.40528], [103.47773, 18.42841], [103.41044, 18.4486], [103.30977, 18.4341], [103.24779, 18.37807], [103.23818, 18.34875], [103.29757, 18.30475], [103.17093, 18.2618], [103.14994, 18.23172], [103.1493, 18.17799], [103.07343, 18.12351], [103.07823, 18.03833], [103.0566, 18.00144], [103.01998, 17.97095], [102.9912, 17.9949], [102.95812, 18.0054], [102.86323, 17.97531], [102.81988, 17.94233], [102.79044, 17.93612], [102.75954, 17.89561], [102.68538, 17.86653], [102.67543, 17.84529], [102.69946, 17.81686], [102.68194, 17.80151], [102.59485, 17.83537], [102.5896, 17.84889], [102.61432, 17.92273], [102.60971, 17.95411], [102.59234, 17.96127], [102.45523, 17.97106], [102.11359, 18.21532], [101.88485, 18.02474], [101.78087, 18.07559], [101.72294, 17.92867], [101.44667, 17.7392], [101.15108, 17.47586], [100.96541, 17.57926], [101.02185, 17.87637], [101.1793, 18.0544], [101.19118, 18.2125], [101.15108, 18.25624], [101.18227, 18.34367], [101.06047, 18.43247], [101.27585, 18.68875], [101.22832, 18.73377], [101.25803, 18.89545], [101.35606, 19.04716], [101.261, 19.12717], [101.24911, 19.33334], [101.20604, 19.35296], [101.21347, 19.46223], [101.26991, 19.48324], [101.26545, 19.59242], [101.08928, 19.59748], [100.90302, 19.61901], [100.77231, 19.48324], [100.64606, 19.55884], [100.58219, 19.49164], [100.49604, 19.53504], [100.398, 19.75047], [100.5094, 19.87904], [100.58808, 20.15791], [100.55218, 20.17741], [100.51052, 20.14928], [100.47567, 20.19133], [100.4537, 20.19971], [100.44992, 20.23644], [100.41473, 20.25625], [100.37439, 20.35156], [100.33383, 20.4028], [100.25769, 20.3992], [100.22076, 20.31598], [100.16668, 20.2986], [100.1712, 20.24324], [100.11785, 20.24787], [100.09337, 20.26293], [100.09999, 20.31614], [100.08404, 20.36626]]]]
+         }
+       }, {
+         type: "Feature",
+         properties: {
+           iso1A2: "TJ",
+           iso1A3: "TJK",
+           iso1N3: "762",
+           wikidata: "Q863",
+           nameEn: "Tajikistan",
+           groups: ["143", "142", "UN"],
+           callingCodes: ["992"]
+         },
+         geometry: {
+           type: "MultiPolygon",
+           coordinates: [[[[70.45251, 41.04438], [70.38028, 41.02014], [70.36655, 40.90296], [69.69434, 40.62615], [69.59441, 40.70181], [69.53021, 40.77621], [69.38327, 40.7918], [69.32834, 40.70233], [69.3455, 40.57988], [69.2643, 40.57506], [69.21063, 40.54469], [69.27066, 40.49274], [69.28525, 40.41894], [69.30774, 40.36102], [69.33794, 40.34819], [69.32833, 40.29794], [69.30808, 40.2821], [69.24817, 40.30357], [69.25229, 40.26362], [69.30104, 40.24502], [69.30448, 40.18774], [69.2074, 40.21488], [69.15659, 40.2162], [69.04544, 40.22904], [68.85832, 40.20885], [68.84357, 40.18604], [68.79276, 40.17555], [68.77902, 40.20492], [68.5332, 40.14826], [68.52771, 40.11676], [68.62796, 40.07789], [69.01523, 40.15771], [69.01935, 40.11466], [68.96579, 40.06949], [68.84906, 40.04952], [68.93695, 39.91167], [68.88889, 39.87163], [68.63071, 39.85265], [68.61972, 39.68905], [68.54166, 39.53929], [68.12053, 39.56317], [67.70992, 39.66156], [67.62889, 39.60234], [67.44899, 39.57799], [67.46547, 39.53564], [67.39681, 39.52505], [67.46822, 39.46146], [67.45998, 39.315], [67.36522, 39.31287], [67.33226, 39.23739], [67.67833, 39.14479], [67.68915, 39.00775], [68.09704, 39.02589], [68.19743, 38.85985], [68.06948, 38.82115], [68.12877, 38.73677], [68.05598, 38.71641], [68.0807, 38.64136], [68.05873, 38.56087], [68.11366, 38.47169], [68.06274, 38.39435], [68.13289, 38.40822], [68.40343, 38.19484], [68.27159, 37.91477], [68.12635, 37.93], [67.81566, 37.43107], [67.8474, 37.31594], [67.78329, 37.1834], [67.7803, 37.08978], [67.87917, 37.0591], [68.02194, 36.91923], [68.18542, 37.02074], [68.27605, 37.00977], [68.29253, 37.10621], [68.41201, 37.10402], [68.41888, 37.13906], [68.61851, 37.19815], [68.6798, 37.27906], [68.81438, 37.23862], [68.80889, 37.32494], [68.91189, 37.26704], [68.88168, 37.33368], [68.96407, 37.32603], [69.03274, 37.25174], [69.25152, 37.09426], [69.39529, 37.16752], [69.45022, 37.23315], [69.36645, 37.40462], [69.44954, 37.4869], [69.51888, 37.5844], [69.80041, 37.5746], [69.84435, 37.60616], [69.93362, 37.61378], [69.95971, 37.5659], [70.15015, 37.52519], [70.28243, 37.66706], [70.27694, 37.81258], [70.1863, 37.84296], [70.17206, 37.93276], [70.4898, 38.12546], [70.54673, 38.24541], [70.60407, 38.28046], [70.61526, 38.34774], [70.64966, 38.34999], [70.69189, 38.37031], [70.6761, 38.39144], [70.67438, 38.40597], [70.69807, 38.41861], [70.72485, 38.4131], [70.75455, 38.4252], [70.77132, 38.45548], [70.78581, 38.45502], [70.78702, 38.45031], [70.79766, 38.44944], [70.80521, 38.44447], [70.81697, 38.44507], [70.82538, 38.45394], [70.84376, 38.44688], [70.88719, 38.46826], [70.92728, 38.43021], [70.98693, 38.48862], [71.03545, 38.44779], [71.0556, 38.40176], [71.09542, 38.42517], [71.10592, 38.42077], [71.10957, 38.40671], [71.1451, 38.40106], [71.21291, 38.32797], [71.33114, 38.30339], [71.33869, 38.27335], [71.37803, 38.25641], [71.36444, 38.15358], [71.29878, 38.04429], [71.28922, 38.01272], [71.27622, 37.99946], [71.27278, 37.96496], [71.24969, 37.93031], [71.2809, 37.91995], [71.296, 37.93403], [71.32871, 37.88564], [71.51565, 37.95349], [71.58843, 37.92425], [71.59255, 37.79956], [71.55752, 37.78677], [71.54324, 37.77104], [71.53053, 37.76534], [71.55234, 37.73209], [71.54186, 37.69691], [71.51972, 37.61945], [71.5065, 37.60912], [71.49693, 37.53527], [71.50616, 37.50733], [71.5256, 37.47971], [71.49612, 37.4279], [71.47685, 37.40281], [71.4862, 37.33405], [71.49821, 37.31975], [71.50674, 37.31502], [71.48536, 37.26017], [71.4824, 37.24921], [71.48339, 37.23937], [71.47386, 37.2269], [71.4555, 37.21418], [71.4494, 37.18137], [71.44127, 37.11856], [71.43097, 37.05855], [71.45578, 37.03094], [71.46923, 36.99925], [71.48481, 36.93218], [71.51502, 36.89128], [71.57195, 36.74943], [71.67083, 36.67346], [71.83229, 36.68084], [72.31676, 36.98115], [72.54095, 37.00007], [72.66381, 37.02014], [72.79693, 37.22222], [73.06884, 37.31729], [73.29633, 37.46495], [73.77197, 37.4417], [73.76647, 37.33913], [73.61129, 37.27469], [73.64974, 37.23643], [73.82552, 37.22659], [73.8564, 37.26158], [74.20308, 37.34208], [74.23339, 37.41116], [74.41055, 37.3948], [74.56161, 37.37734], [74.68383, 37.3948], [74.8294, 37.3435], [74.88887, 37.23275], [75.12328, 37.31839], [75.09719, 37.37297], [75.15899, 37.41443], [75.06011, 37.52779], [74.94338, 37.55501], [74.8912, 37.67576], [75.00935, 37.77486], [74.92416, 37.83428], [74.9063, 38.03033], [74.82665, 38.07359], [74.80331, 38.19889], [74.69894, 38.22155], [74.69619, 38.42947], [74.51217, 38.47034], [74.17022, 38.65504], [73.97933, 38.52945], [73.79806, 38.61106], [73.80656, 38.66449], [73.7033, 38.84782], [73.7445, 38.93867], [73.82964, 38.91517], [73.81728, 39.04007], [73.75823, 39.023], [73.60638, 39.24534], [73.54572, 39.27567], [73.55396, 39.3543], [73.5004, 39.38402], [73.59241, 39.40843], [73.59831, 39.46425], [73.45096, 39.46677], [73.31912, 39.38615], [73.18454, 39.35536], [72.85934, 39.35116], [72.62027, 39.39696], [72.33173, 39.33093], [72.23834, 39.17248], [72.17242, 39.2661], [72.09689, 39.26823], [72.04059, 39.36704], [71.90601, 39.27674], [71.79202, 39.27355], [71.7522, 39.32031], [71.80164, 39.40631], [71.76816, 39.45456], [71.62688, 39.44056], [71.5517, 39.45722], [71.55856, 39.57588], [71.49814, 39.61397], [71.08752, 39.50704], [71.06418, 39.41586], [70.7854, 39.38933], [70.64087, 39.58792], [70.44757, 39.60128], [70.2869, 39.53141], [70.11111, 39.58223], [69.87491, 39.53882], [69.68677, 39.59281], [69.3594, 39.52516], [69.26938, 39.8127], [69.35649, 40.01994], [69.43134, 39.98431], [69.43557, 39.92877], [69.53615, 39.93991], [69.5057, 40.03277], [69.53855, 40.0887], [69.53794, 40.11833], [69.55555, 40.12296], [69.57615, 40.10524], [69.64704, 40.12165], [69.67001, 40.10639], [70.01283, 40.23288], [70.58297, 40.00891], [70.57384, 39.99394], [70.47557, 39.93216], [70.55033, 39.96619], [70.58912, 39.95211], [70.65946, 39.9878], [70.65827, 40.0981], [70.7928, 40.12797], [70.80495, 40.16813], [70.9818, 40.22392], [70.8607, 40.217], [70.62342, 40.17396], [70.56394, 40.26421], [70.57149, 40.3442], [70.37511, 40.38605], [70.32626, 40.45174], [70.49871, 40.52503], [70.80009, 40.72825], [70.45251, 41.04438]]], [[[70.68112, 40.90612], [70.6158, 40.97661], [70.56077, 41.00642], [70.54223, 40.98787], [70.57501, 40.98941], [70.6721, 40.90555], [70.68112, 40.90612]]], [[[70.74189, 39.86319], [70.53651, 39.89155], [70.52631, 39.86989], [70.54998, 39.85137], [70.59667, 39.83542], [70.63105, 39.77923], [70.74189, 39.86319]]]]
+         }
+       }, {
+         type: "Feature",
+         properties: {
+           iso1A2: "TK",
+           iso1A3: "TKL",
+           iso1N3: "772",
+           wikidata: "Q36823",
+           nameEn: "Tokelau",
+           country: "NZ",
+           groups: ["061", "009", "UN"],
+           driveSide: "left",
+           callingCodes: ["690"]
+         },
+         geometry: {
+           type: "MultiPolygon",
+           coordinates: [[[[-168.251, -9.44289], [-174.18635, -7.80441], [-174.17993, -10.13616], [-168.251, -9.44289]]]]
+         }
+       }, {
+         type: "Feature",
+         properties: {
+           iso1A2: "TL",
+           iso1A3: "TLS",
+           iso1N3: "626",
+           wikidata: "Q574",
+           nameEn: "East Timor",
+           aliases: ["Timor-Leste", "TP"],
+           groups: ["035", "142", "UN"],
+           driveSide: "left",
+           callingCodes: ["670"]
+         },
+         geometry: {
+           type: "MultiPolygon",
+           coordinates: [[[[124.46701, -9.13002], [124.94011, -8.85617], [124.97742, -9.08128], [125.11764, -8.96359], [125.18632, -9.03142], [125.18907, -9.16434], [125.09434, -9.19669], [125.04044, -9.17093], [124.97892, -9.19281], [125.09025, -9.46406], [125.68138, -9.85176], [127.55165, -9.05052], [127.42116, -8.22471], [125.87691, -8.31789], [125.58506, -7.95311], [124.92337, -8.75859], [124.33472, -9.11416], [124.04628, -9.22671], [124.04286, -9.34243], [124.10539, -9.41206], [124.14517, -9.42324], [124.21247, -9.36904], [124.28115, -9.42189], [124.28115, -9.50453], [124.3535, -9.48493], [124.35258, -9.43002], [124.38554, -9.3582], [124.45971, -9.30263], [124.46701, -9.13002]]]]
+         }
+       }, {
+         type: "Feature",
+         properties: {
+           iso1A2: "TM",
+           iso1A3: "TKM",
+           iso1N3: "795",
+           wikidata: "Q874",
+           nameEn: "Turkmenistan",
+           groups: ["143", "142", "UN"],
+           callingCodes: ["993"]
+         },
+         geometry: {
+           type: "MultiPolygon",
+           coordinates: [[[[60.5078, 41.21694], [60.06581, 41.4363], [60.18117, 41.60082], [60.06032, 41.76287], [60.08504, 41.80997], [60.33223, 41.75058], [59.95046, 41.97966], [60.0356, 42.01028], [60.04659, 42.08982], [59.96419, 42.1428], [60.00539, 42.212], [59.94633, 42.27655], [59.4341, 42.29738], [59.2955, 42.37064], [59.17317, 42.52248], [58.93422, 42.5407], [58.6266, 42.79314], [58.57991, 42.64988], [58.27504, 42.69632], [58.14321, 42.62159], [58.29427, 42.56497], [58.51674, 42.30348], [58.40688, 42.29535], [58.3492, 42.43335], [57.99214, 42.50021], [57.90975, 42.4374], [57.92897, 42.24047], [57.84932, 42.18555], [57.6296, 42.16519], [57.30275, 42.14076], [57.03633, 41.92043], [56.96218, 41.80383], [57.03359, 41.41777], [57.13796, 41.36625], [57.03423, 41.25435], [56.00314, 41.32584], [55.45471, 41.25609], [54.95182, 41.92424], [54.20635, 42.38477], [52.97575, 42.1308], [52.47884, 41.78034], [52.26048, 41.69249], [51.7708, 40.29239], [53.89734, 37.3464], [54.24565, 37.32047], [54.36211, 37.34912], [54.58664, 37.45809], [54.67247, 37.43532], [54.77822, 37.51597], [54.81804, 37.61285], [54.77684, 37.62264], [54.851, 37.75739], [55.13412, 37.94705], [55.44152, 38.08564], [55.76561, 38.12238], [55.97847, 38.08024], [56.33278, 38.08132], [56.32454, 38.18502], [56.43303, 38.26054], [56.62255, 38.24005], [56.73928, 38.27887], [57.03453, 38.18717], [57.21169, 38.28965], [57.37236, 38.09321], [57.35042, 37.98546], [57.79534, 37.89299], [58.21399, 37.77281], [58.22999, 37.6856], [58.39959, 37.63134], [58.47786, 37.6433], [58.5479, 37.70526], [58.6921, 37.64548], [58.9338, 37.67374], [59.22905, 37.51161], [59.33507, 37.53146], [59.39797, 37.47892], [59.39385, 37.34257], [59.55178, 37.13594], [59.74678, 37.12499], [60.00768, 37.04102], [60.34767, 36.63214], [61.14516, 36.64644], [61.18187, 36.55348], [61.1393, 36.38782], [61.22719, 36.12759], [61.12007, 35.95992], [61.22444, 35.92879], [61.26152, 35.80749], [61.22719, 35.67038], [61.27371, 35.61482], [61.58742, 35.43803], [61.77693, 35.41341], [61.97743, 35.4604], [62.05709, 35.43803], [62.15871, 35.33278], [62.29191, 35.25964], [62.29878, 35.13312], [62.48006, 35.28796], [62.62288, 35.22067], [62.74098, 35.25432], [62.90853, 35.37086], [63.0898, 35.43131], [63.12276, 35.53196], [63.10079, 35.63024], [63.23262, 35.67487], [63.10318, 35.81782], [63.12276, 35.86208], [63.29579, 35.85985], [63.53475, 35.90881], [63.56496, 35.95106], [63.98519, 36.03773], [64.05385, 36.10433], [64.43288, 36.24401], [64.57295, 36.34362], [64.62514, 36.44311], [64.61141, 36.6351], [64.97945, 37.21913], [65.51778, 37.23881], [65.64263, 37.34388], [65.64137, 37.45061], [65.72274, 37.55438], [66.30993, 37.32409], [66.55743, 37.35409], [66.52303, 37.39827], [66.65761, 37.45497], [66.52852, 37.58568], [66.53676, 37.80084], [66.67684, 37.96776], [66.56697, 38.0435], [66.41042, 38.02403], [66.24013, 38.16238], [65.83913, 38.25733], [65.55873, 38.29052], [64.32576, 38.98691], [64.19086, 38.95561], [63.70778, 39.22349], [63.6913, 39.27666], [62.43337, 39.98528], [62.34273, 40.43206], [62.11751, 40.58242], [61.87856, 41.12257], [61.4446, 41.29407], [61.39732, 41.19873], [61.33199, 41.14946], [61.22212, 41.14946], [61.03261, 41.25691], [60.5078, 41.21694]]]]
+         }
+       }, {
+         type: "Feature",
+         properties: {
+           iso1A2: "TN",
+           iso1A3: "TUN",
+           iso1N3: "788",
+           wikidata: "Q948",
+           nameEn: "Tunisia",
+           groups: ["015", "002", "UN"],
+           callingCodes: ["216"]
+         },
+         geometry: {
+           type: "MultiPolygon",
+           coordinates: [[[[11.2718, 37.6713], [7.89009, 38.19924], [8.59123, 37.14286], [8.64044, 36.9401], [8.62972, 36.86499], [8.67706, 36.8364], [8.57613, 36.78062], [8.46537, 36.7706], [8.47609, 36.66607], [8.16167, 36.48817], [8.18936, 36.44939], [8.40731, 36.42208], [8.2626, 35.91733], [8.26472, 35.73669], [8.35371, 35.66373], [8.36086, 35.47774], [8.30329, 35.29884], [8.47318, 35.23376], [8.3555, 35.10007], [8.30727, 34.95378], [8.25189, 34.92009], [8.29655, 34.72798], [8.20482, 34.57575], [7.86264, 34.3987], [7.81242, 34.21841], [7.74207, 34.16492], [7.66174, 34.20167], [7.52851, 34.06493], [7.54088, 33.7726], [7.73687, 33.42114], [7.83028, 33.18851], [8.11433, 33.10175], [8.1179, 33.05086], [8.31895, 32.83483], [8.35999, 32.50101], [9.07483, 32.07865], [9.55544, 30.23971], [9.76848, 30.34366], [9.88152, 30.34074], [10.29516, 30.90337], [10.12239, 31.42098], [10.31364, 31.72648], [10.48497, 31.72956], [10.62788, 31.96629], [10.7315, 31.97235], [11.04234, 32.2145], [11.53898, 32.4138], [11.57828, 32.48013], [11.46037, 32.6307], [11.51549, 33.09826], [11.55852, 33.1409], [11.58941, 33.36891], [11.2718, 37.6713]]]]
+         }
+       }, {
+         type: "Feature",
+         properties: {
+           iso1A2: "TO",
+           iso1A3: "TON",
+           iso1N3: "776",
+           wikidata: "Q678",
+           nameEn: "Tonga",
+           groups: ["061", "009", "UN"],
+           driveSide: "left",
+           callingCodes: ["676"]
+         },
+         geometry: {
+           type: "MultiPolygon",
+           coordinates: [[[[-176.74538, -22.89767], [-180, -22.90585], [-180, -24.21376], [-173.10761, -24.19665], [-173.13438, -14.94228], [-176.76826, -14.95183], [-176.74538, -22.89767]]]]
+         }
+       }, {
+         type: "Feature",
+         properties: {
+           iso1A2: "TR",
+           iso1A3: "TUR",
+           iso1N3: "792",
+           wikidata: "Q43",
+           nameEn: "Turkey",
+           groups: ["145", "142", "UN"],
+           callingCodes: ["90"]
+         },
+         geometry: {
+           type: "MultiPolygon",
+           coordinates: [[[[41.54366, 41.52185], [40.89217, 41.72528], [34.8305, 42.4581], [28.32297, 41.98371], [28.02971, 41.98066], [27.91479, 41.97902], [27.83492, 41.99709], [27.81235, 41.94803], [27.69949, 41.97515], [27.55191, 41.90928], [27.52379, 41.93756], [27.45478, 41.96591], [27.27411, 42.10409], [27.22376, 42.10152], [27.19251, 42.06028], [27.08486, 42.08735], [27.03277, 42.0809], [26.95638, 42.00741], [26.79143, 41.97386], [26.62996, 41.97644], [26.56051, 41.92995], [26.57961, 41.90024], [26.53968, 41.82653], [26.36952, 41.82265], [26.33589, 41.76802], [26.32952, 41.73637], [26.35957, 41.71149], [26.47958, 41.67037], [26.5209, 41.62592], [26.59196, 41.60491], [26.59742, 41.48058], [26.61767, 41.42281], [26.62997, 41.34613], [26.5837, 41.32131], [26.5209, 41.33993], [26.39861, 41.25053], [26.32259, 41.24929], [26.31928, 41.07386], [26.3606, 41.02027], [26.33297, 40.98388], [26.35894, 40.94292], [26.32259, 40.94042], [26.28623, 40.93005], [26.29441, 40.89119], [26.26169, 40.9168], [26.20856, 40.86048], [26.21351, 40.83298], [26.15685, 40.80709], [26.12854, 40.77339], [26.12495, 40.74283], [26.08638, 40.73214], [26.0754, 40.72772], [26.03489, 40.73051], [25.94795, 40.72797], [26.04292, 40.3958], [25.61285, 40.17161], [25.94257, 39.39358], [26.43357, 39.43096], [26.70773, 39.0312], [26.61814, 38.81372], [26.21136, 38.65436], [26.32173, 38.48731], [26.24183, 38.44695], [26.21136, 38.17558], [27.05537, 37.9131], [27.16428, 37.72343], [26.99377, 37.69034], [26.95583, 37.64989], [27.14757, 37.32], [27.20312, 36.94571], [27.45627, 36.9008], [27.24613, 36.71622], [27.46117, 36.53789], [27.89482, 36.69898], [27.95037, 36.46155], [28.23708, 36.56812], [29.30783, 36.01033], [29.48192, 36.18377], [29.61002, 36.1731], [29.61805, 36.14179], [29.69611, 36.10365], [29.73302, 35.92555], [32.82353, 35.70297], [35.51152, 36.10954], [35.931, 35.92109], [35.98499, 35.94107], [36.00514, 35.94113], [36.01844, 35.92403], [35.99829, 35.88242], [36.11827, 35.85923], [36.13919, 35.83692], [36.14029, 35.81015], [36.1623, 35.80925], [36.17441, 35.92076], [36.19973, 35.95195], [36.25366, 35.96264], [36.27678, 35.94839], [36.29769, 35.96086], [36.28338, 36.00273], [36.30099, 36.00985], [36.33956, 35.98687], [36.37474, 36.01163], [36.39206, 36.22088], [36.4617, 36.20461], [36.50463, 36.2419], [36.6125, 36.22592], [36.68672, 36.23677], [36.65653, 36.33861], [36.6081, 36.33772], [36.54206, 36.49539], [36.58829, 36.58295], [36.57398, 36.65186], [36.62681, 36.71189], [36.61581, 36.74629], [36.66727, 36.82901], [36.99557, 36.75997], [36.99886, 36.74012], [37.04399, 36.73483], [37.04619, 36.71101], [37.01647, 36.69512], [37.02088, 36.66422], [37.08279, 36.63495], [37.10894, 36.6704], [37.16177, 36.66069], [37.21988, 36.6736], [37.47253, 36.63243], [37.49103, 36.66904], [37.68048, 36.75065], [37.81974, 36.76055], [38.21064, 36.91842], [38.38859, 36.90064], [38.55908, 36.84429], [38.74042, 36.70629], [39.03217, 36.70911], [39.21538, 36.66834], [39.81589, 36.75538], [40.69136, 37.0996], [40.90856, 37.13147], [41.21937, 37.07665], [41.515, 37.08084], [42.00894, 37.17209], [42.18225, 37.28569], [42.19301, 37.31323], [42.2112, 37.32491], [42.22257, 37.31395], [42.22381, 37.30238], [42.20454, 37.28715], [42.21548, 37.28026], [42.23683, 37.2863], [42.26039, 37.27017], [42.2824, 37.2798], [42.34735, 37.22548], [42.32313, 37.17814], [42.35724, 37.10998], [42.56725, 37.14878], [42.78887, 37.38615], [42.93705, 37.32015], [43.11403, 37.37436], [43.30083, 37.30629], [43.33508, 37.33105], [43.50787, 37.24436], [43.56702, 37.25675], [43.63085, 37.21957], [43.7009, 37.23692], [43.8052, 37.22825], [43.82699, 37.19477], [43.84878, 37.22205], [43.90949, 37.22453], [44.02002, 37.33229], [44.13521, 37.32486], [44.2613, 37.25055], [44.27998, 37.16501], [44.22239, 37.15756], [44.18503, 37.09551], [44.25975, 36.98119], [44.30645, 36.97373], [44.35937, 37.02843], [44.35315, 37.04955], [44.38117, 37.05825], [44.42631, 37.05825], [44.63179, 37.19229], [44.76698, 37.16162], [44.78319, 37.1431], [44.7868, 37.16644], [44.75986, 37.21549], [44.81021, 37.2915], [44.58449, 37.45018], [44.61401, 37.60165], [44.56887, 37.6429], [44.62096, 37.71985], [44.55498, 37.783], [44.45948, 37.77065], [44.3883, 37.85433], [44.22509, 37.88859], [44.42476, 38.25763], [44.50115, 38.33939], [44.44386, 38.38295], [44.38309, 38.36117], [44.3119, 38.37887], [44.3207, 38.49799], [44.32058, 38.62752], [44.28065, 38.6465], [44.26155, 38.71427], [44.30322, 38.81581], [44.18863, 38.93881], [44.20946, 39.13975], [44.1043, 39.19842], [44.03667, 39.39223], [44.22452, 39.4169], [44.29818, 39.378], [44.37921, 39.4131], [44.42832, 39.4131], [44.41849, 39.56659], [44.48111, 39.61579], [44.47298, 39.68788], [44.6137, 39.78393], [44.65422, 39.72163], [44.71806, 39.71124], [44.81043, 39.62677], [44.80977, 39.65768], [44.75779, 39.7148], [44.61845, 39.8281], [44.46635, 39.97733], [44.26973, 40.04866], [44.1778, 40.02845], [44.1057, 40.03555], [43.92307, 40.01787], [43.65688, 40.11199], [43.65221, 40.14889], [43.71136, 40.16673], [43.59928, 40.34019], [43.60862, 40.43267], [43.54791, 40.47413], [43.63664, 40.54159], [43.7425, 40.66805], [43.74872, 40.7365], [43.67712, 40.84846], [43.67712, 40.93084], [43.58683, 40.98961], [43.47319, 41.02251], [43.44984, 41.0988], [43.4717, 41.12611], [43.44973, 41.17666], [43.36118, 41.2028], [43.23096, 41.17536], [43.1945, 41.25242], [43.13373, 41.25503], [43.21707, 41.30331], [43.02956, 41.37891], [42.8785, 41.50516], [42.84899, 41.47265], [42.78995, 41.50126], [42.84471, 41.58912], [42.72794, 41.59714], [42.59202, 41.58183], [42.51772, 41.43606], [42.26387, 41.49346], [41.95134, 41.52466], [41.81939, 41.43621], [41.7124, 41.47417], [41.7148, 41.4932], [41.54366, 41.52185]]]]
+         }
+       }, {
+         type: "Feature",
+         properties: {
+           iso1A2: "TT",
+           iso1A3: "TTO",
+           iso1N3: "780",
+           wikidata: "Q754",
+           nameEn: "Trinidad and Tobago",
+           groups: ["029", "003", "419", "019", "UN"],
+           driveSide: "left",
+           callingCodes: ["1 868"]
+         },
+         geometry: {
+           type: "MultiPolygon",
+           coordinates: [[[[-61.62505, 11.18974], [-62.08693, 10.04435], [-60.89962, 9.81445], [-60.07172, 11.77667], [-61.62505, 11.18974]]]]
+         }
+       }, {
+         type: "Feature",
+         properties: {
+           iso1A2: "TV",
+           iso1A3: "TUV",
+           iso1N3: "798",
+           wikidata: "Q672",
+           nameEn: "Tuvalu",
+           groups: ["061", "009", "UN"],
+           driveSide: "left",
+           callingCodes: ["688"]
+         },
+         geometry: {
+           type: "MultiPolygon",
+           coordinates: [[[[174, -5], [174, -11.5], [179.99999, -11.5], [179.99999, -5], [174, -5]]]]
+         }
+       }, {
+         type: "Feature",
+         properties: {
+           iso1A2: "TW",
+           iso1A3: "TWN",
+           iso1N3: "158",
+           wikidata: "Q865",
+           nameEn: "Taiwan",
+           aliases: ["RC"],
+           groups: ["030", "142"],
+           callingCodes: ["886"]
+         },
+         geometry: {
+           type: "MultiPolygon",
+           coordinates: [[[[121.8109, 21.77688], [122.26612, 25.98197], [120.49232, 25.22863], [118.56434, 24.49266], [118.42453, 24.54644], [118.35291, 24.51645], [118.28244, 24.51231], [118.11703, 24.39734], [120.69238, 21.52331], [121.8109, 21.77688]]]]
+         }
+       }, {
+         type: "Feature",
+         properties: {
+           iso1A2: "TZ",
+           iso1A3: "TZA",
+           iso1N3: "834",
+           wikidata: "Q924",
+           nameEn: "Tanzania",
+           groups: ["014", "202", "002", "UN"],
+           driveSide: "left",
+           callingCodes: ["255"]
+         },
+         geometry: {
+           type: "MultiPolygon",
+           coordinates: [[[[30.80408, -0.99911], [30.76635, -0.9852], [30.70631, -1.01175], [30.64166, -1.06601], [30.47194, -1.0555], [30.45116, -1.10641], [30.50889, -1.16412], [30.57123, -1.33264], [30.71974, -1.43244], [30.84079, -1.64652], [30.80802, -1.91477], [30.89303, -2.08223], [30.83915, -2.35795], [30.54501, -2.41404], [30.41789, -2.66266], [30.52747, -2.65841], [30.40662, -2.86151], [30.4987, -2.9573], [30.57926, -2.89791], [30.6675, -2.98987], [30.83823, -2.97837], [30.84165, -3.25152], [30.45915, -3.56532], [30.22042, -4.01738], [30.03323, -4.26631], [29.88172, -4.35743], [29.82885, -4.36153], [29.77289, -4.41733], [29.75109, -4.45836], [29.63827, -4.44681], [29.43673, -4.44845], [29.52552, -6.2731], [30.2567, -7.14121], [30.79243, -8.27382], [31.00796, -8.58615], [31.37533, -8.60769], [31.57147, -8.70619], [31.57147, -8.81388], [31.71158, -8.91386], [31.81587, -8.88618], [31.94663, -8.93846], [31.94196, -9.02303], [31.98866, -9.07069], [32.08206, -9.04609], [32.16146, -9.05993], [32.25486, -9.13371], [32.43543, -9.11988], [32.49147, -9.14754], [32.53661, -9.24281], [32.75611, -9.28583], [32.76233, -9.31963], [32.95389, -9.40138], [32.99397, -9.36712], [33.14925, -9.49322], [33.31581, -9.48554], [33.48052, -9.62442], [33.76677, -9.58516], [33.93298, -9.71647], [33.9638, -9.62206], [33.95829, -9.54066], [34.03865, -9.49398], [34.54499, -10.0678], [34.51911, -10.12279], [34.57581, -10.56271], [34.65946, -10.6828], [34.67047, -10.93796], [34.61161, -11.01611], [34.63305, -11.11731], [34.79375, -11.32245], [34.91153, -11.39799], [34.96296, -11.57354], [35.63599, -11.55927], [35.82767, -11.41081], [36.19094, -11.57593], [36.19094, -11.70008], [36.62068, -11.72884], [36.80309, -11.56836], [37.3936, -11.68949], [37.76614, -11.53352], [37.8388, -11.3123], [37.93618, -11.26228], [38.21598, -11.27289], [38.47258, -11.4199], [38.88996, -11.16978], [39.24395, -11.17433], [39.58249, -10.96043], [40.00295, -10.80255], [40.44265, -10.4618], [40.74206, -10.25691], [40.14328, -4.64201], [39.62121, -4.68136], [39.44306, -4.93877], [39.21631, -4.67835], [37.81321, -3.69179], [37.75036, -3.54243], [37.63099, -3.50723], [37.5903, -3.42735], [37.71745, -3.304], [37.67199, -3.06222], [34.0824, -1.02264], [34.03084, -1.05101], [34.02286, -1.00779], [33.93107, -0.99298], [30.80408, -0.99911]]]]
+         }
+       }, {
+         type: "Feature",
+         properties: {
+           iso1A2: "UA",
+           iso1A3: "UKR",
+           iso1N3: "804",
+           wikidata: "Q212",
+           nameEn: "Ukraine",
+           groups: ["151", "150", "UN"],
+           callingCodes: ["380"]
+         },
+         geometry: {
+           type: "MultiPolygon",
+           coordinates: [[[[33.57318, 46.10317], [33.61467, 46.13561], [33.63854, 46.14147], [33.61517, 46.22615], [33.646, 46.23028], [33.74047, 46.18555], [33.79715, 46.20482], [33.85234, 46.19863], [33.91549, 46.15938], [34.05272, 46.10838], [34.07311, 46.11769], [34.12929, 46.10494], [34.181, 46.06804], [34.25111, 46.0532], [34.33912, 46.06114], [34.41221, 46.00245], [34.44155, 45.95995], [34.48729, 45.94267], [34.52011, 45.95097], [34.55889, 45.99347], [34.60861, 45.99347], [34.66679, 45.97136], [34.75479, 45.90705], [34.80153, 45.90047], [34.79905, 45.81009], [34.96015, 45.75634], [35.23066, 45.79231], [37.62608, 46.82615], [38.12112, 46.86078], [38.3384, 46.98085], [38.22955, 47.12069], [38.23049, 47.2324], [38.32112, 47.2585], [38.33074, 47.30508], [38.22225, 47.30788], [38.28954, 47.39255], [38.28679, 47.53552], [38.35062, 47.61631], [38.76379, 47.69346], [38.79628, 47.81109], [38.87979, 47.87719], [39.73935, 47.82876], [39.82213, 47.96396], [39.77544, 48.04206], [39.88256, 48.04482], [39.83724, 48.06501], [39.94847, 48.22811], [40.00752, 48.22445], [39.99241, 48.31768], [39.97325, 48.31399], [39.9693, 48.29904], [39.95248, 48.29972], [39.91465, 48.26743], [39.90041, 48.3049], [39.84273, 48.30947], [39.84136, 48.33321], [39.94847, 48.35055], [39.88794, 48.44226], [39.86196, 48.46633], [39.84548, 48.57821], [39.79764, 48.58668], [39.67226, 48.59368], [39.71765, 48.68673], [39.73104, 48.7325], [39.79466, 48.83739], [39.97182, 48.79398], [40.08168, 48.87443], [40.03636, 48.91957], [39.98967, 48.86901], [39.78368, 48.91596], [39.74874, 48.98675], [39.72649, 48.9754], [39.71353, 48.98959], [39.6683, 48.99454], [39.6836, 49.05121], [39.93437, 49.05709], [40.01988, 49.1761], [40.22176, 49.25683], [40.18331, 49.34996], [40.14912, 49.37681], [40.1141, 49.38798], [40.03087, 49.45452], [40.03636, 49.52321], [40.16683, 49.56865], [40.13249, 49.61672], [39.84548, 49.56064], [39.65047, 49.61761], [39.59142, 49.73758], [39.44496, 49.76067], [39.27968, 49.75976], [39.1808, 49.88911], [38.9391, 49.79524], [38.90477, 49.86787], [38.73311, 49.90238], [38.68677, 50.00904], [38.65688, 49.97176], [38.35408, 50.00664], [38.32524, 50.08866], [38.18517, 50.08161], [38.21675, 49.98104], [38.02999, 49.90592], [38.02999, 49.94482], [37.90776, 50.04194], [37.79515, 50.08425], [37.75807, 50.07896], [37.61113, 50.21976], [37.62879, 50.24481], [37.62486, 50.29966], [37.47243, 50.36277], [37.48204, 50.46079], [37.08468, 50.34935], [36.91762, 50.34963], [36.69377, 50.26982], [36.64571, 50.218], [36.56655, 50.2413], [36.58371, 50.28563], [36.47817, 50.31457], [36.30101, 50.29088], [36.20763, 50.3943], [36.06893, 50.45205], [35.8926, 50.43829], [35.80388, 50.41356], [35.73659, 50.35489], [35.61711, 50.35707], [35.58003, 50.45117], [35.47463, 50.49247], [35.39464, 50.64751], [35.48116, 50.66405], [35.47704, 50.77274], [35.41367, 50.80227], [35.39307, 50.92145], [35.32598, 50.94524], [35.40837, 51.04119], [35.31774, 51.08434], [35.20375, 51.04723], [35.12685, 51.16191], [35.14058, 51.23162], [34.97304, 51.2342], [34.82472, 51.17483], [34.6874, 51.18], [34.6613, 51.25053], [34.38802, 51.2746], [34.31661, 51.23936], [34.23009, 51.26429], [34.33446, 51.363], [34.22048, 51.4187], [34.30562, 51.5205], [34.17599, 51.63253], [34.07765, 51.67065], [34.42922, 51.72852], [34.41136, 51.82793], [34.09413, 52.00835], [34.11199, 52.14087], [34.05239, 52.20132], [33.78789, 52.37204], [33.55718, 52.30324], [33.48027, 52.31499], [33.51323, 52.35779], [33.18913, 52.3754], [32.89937, 52.2461], [32.85405, 52.27888], [32.69475, 52.25535], [32.54781, 52.32423], [32.3528, 52.32842], [32.38988, 52.24946], [32.33083, 52.23685], [32.34044, 52.1434], [32.2777, 52.10266], [32.23331, 52.08085], [32.08813, 52.03319], [31.92159, 52.05144], [31.96141, 52.08015], [31.85018, 52.11305], [31.81722, 52.09955], [31.7822, 52.11406], [31.38326, 52.12991], [31.25142, 52.04131], [31.13332, 52.1004], [30.95589, 52.07775], [30.90897, 52.00699], [30.76443, 51.89739], [30.68804, 51.82806], [30.51946, 51.59649], [30.64992, 51.35014], [30.56203, 51.25655], [30.36153, 51.33984], [30.34642, 51.42555], [30.17888, 51.51025], [29.77376, 51.4461], [29.7408, 51.53417], [29.54372, 51.48372], [29.49773, 51.39814], [29.42357, 51.4187], [29.32881, 51.37843], [29.25191, 51.49828], [29.25603, 51.57089], [29.20659, 51.56918], [29.16402, 51.64679], [29.1187, 51.65872], [28.99098, 51.56833], [28.95528, 51.59222], [28.81795, 51.55552], [28.76027, 51.48802], [28.78224, 51.45294], [28.75615, 51.41442], [28.73143, 51.46236], [28.69161, 51.44695], [28.64429, 51.5664], [28.47051, 51.59734], [28.37592, 51.54505], [28.23452, 51.66988], [28.10658, 51.57857], [27.95827, 51.56065], [27.91844, 51.61952], [27.85253, 51.62293], [27.76052, 51.47604], [27.67125, 51.50854], [27.71932, 51.60672], [27.55727, 51.63486], [27.51058, 51.5854], [27.47212, 51.61184], [27.24828, 51.60161], [27.26613, 51.65957], [27.20948, 51.66713], [27.20602, 51.77291], [26.99422, 51.76933], [26.9489, 51.73788], [26.80043, 51.75777], [26.69759, 51.82284], [26.46962, 51.80501], [26.39367, 51.87315], [26.19084, 51.86781], [26.00408, 51.92967], [25.83217, 51.92587], [25.80574, 51.94556], [25.73673, 51.91973], [25.46163, 51.92205], [25.20228, 51.97143], [24.98784, 51.91273], [24.37123, 51.88222], [24.29021, 51.80841], [24.3163, 51.75063], [24.13075, 51.66979], [23.99907, 51.58369], [23.8741, 51.59734], [23.91118, 51.63316], [23.7766, 51.66809], [23.60906, 51.62122], [23.6736, 51.50255], [23.62751, 51.50512], [23.69905, 51.40871], [23.63858, 51.32182], [23.80678, 51.18405], [23.90376, 51.07697], [23.92217, 51.00836], [24.04576, 50.90196], [24.14524, 50.86128], [24.0952, 50.83262], [23.99254, 50.83847], [23.95925, 50.79271], [24.0595, 50.71625], [24.0996, 50.60752], [24.07048, 50.5071], [24.03668, 50.44507], [23.99563, 50.41289], [23.79445, 50.40481], [23.71382, 50.38248], [23.67635, 50.33385], [23.28221, 50.0957], [22.99329, 49.84249], [22.83179, 49.69875], [22.80261, 49.69098], [22.78304, 49.65543], [22.64534, 49.53094], [22.69444, 49.49378], [22.748, 49.32759], [22.72009, 49.20288], [22.86336, 49.10513], [22.89122, 49.00725], [22.56155, 49.08865], [22.54338, 49.01424], [22.48296, 48.99172], [22.42934, 48.92857], [22.34151, 48.68893], [22.21379, 48.6218], [22.16023, 48.56548], [22.14689, 48.4005], [22.2083, 48.42534], [22.38133, 48.23726], [22.49806, 48.25189], [22.59007, 48.15121], [22.58733, 48.10813], [22.66835, 48.09162], [22.73427, 48.12005], [22.81804, 48.11363], [22.87847, 48.04665], [22.84276, 47.98602], [22.89849, 47.95851], [22.94301, 47.96672], [22.92241, 48.02002], [23.0158, 47.99338], [23.08858, 48.00716], [23.1133, 48.08061], [23.15999, 48.12188], [23.27397, 48.08245], [23.33577, 48.0237], [23.4979, 47.96858], [23.52803, 48.01818], [23.5653, 48.00499], [23.63894, 48.00293], [23.66262, 47.98786], [23.75188, 47.99705], [23.80904, 47.98142], [23.8602, 47.9329], [23.89352, 47.94512], [23.94192, 47.94868], [23.96337, 47.96672], [23.98553, 47.96076], [24.00801, 47.968], [24.02999, 47.95087], [24.06466, 47.95317], [24.11281, 47.91487], [24.22566, 47.90231], [24.34926, 47.9244], [24.43578, 47.97131], [24.61994, 47.95062], [24.70632, 47.84428], [24.81893, 47.82031], [24.88896, 47.7234], [25.11144, 47.75203], [25.23778, 47.89403], [25.63878, 47.94924], [25.77723, 47.93919], [26.05901, 47.9897], [26.17711, 47.99246], [26.33504, 48.18418], [26.55202, 48.22445], [26.62823, 48.25804], [26.6839, 48.35828], [26.79239, 48.29071], [26.82809, 48.31629], [26.71274, 48.40388], [26.85556, 48.41095], [26.93384, 48.36558], [27.03821, 48.37653], [27.0231, 48.42485], [27.08078, 48.43214], [27.13434, 48.37288], [27.27855, 48.37534], [27.32159, 48.4434], [27.37604, 48.44398], [27.37741, 48.41026], [27.44333, 48.41209], [27.46942, 48.454], [27.5889, 48.49224], [27.59027, 48.46311], [27.6658, 48.44034], [27.74422, 48.45926], [27.79225, 48.44244], [27.81902, 48.41874], [27.87533, 48.4037], [27.88391, 48.36699], [27.95883, 48.32368], [28.04527, 48.32661], [28.09873, 48.3124], [28.07504, 48.23494], [28.17666, 48.25963], [28.19314, 48.20749], [28.2856, 48.23202], [28.32508, 48.23384], [28.35519, 48.24957], [28.36996, 48.20543], [28.34912, 48.1787], [28.30586, 48.1597], [28.30609, 48.14018], [28.34009, 48.13147], [28.38712, 48.17567], [28.43701, 48.15832], [28.42454, 48.12047], [28.48428, 48.0737], [28.53921, 48.17453], [28.69896, 48.13106], [28.85232, 48.12506], [28.8414, 48.03392], [28.9306, 47.96255], [29.1723, 47.99013], [29.19839, 47.89261], [29.27804, 47.88893], [29.20663, 47.80367], [29.27255, 47.79953], [29.22242, 47.73607], [29.22414, 47.60012], [29.11743, 47.55001], [29.18603, 47.43387], [29.3261, 47.44664], [29.39889, 47.30179], [29.47854, 47.30366], [29.48678, 47.36043], [29.5733, 47.36508], [29.59665, 47.25521], [29.54996, 47.24962], [29.57696, 47.13581], [29.49732, 47.12878], [29.53044, 47.07851], [29.61038, 47.09932], [29.62137, 47.05069], [29.57056, 46.94766], [29.72986, 46.92234], [29.75458, 46.8604], [29.87405, 46.88199], [29.98814, 46.82358], [29.94522, 46.80055], [29.9743, 46.75325], [29.94409, 46.56002], [29.88916, 46.54302], [30.02511, 46.45132], [30.16794, 46.40967], [30.09103, 46.38694], [29.94114, 46.40114], [29.88329, 46.35851], [29.74496, 46.45605], [29.66359, 46.4215], [29.6763, 46.36041], [29.5939, 46.35472], [29.49914, 46.45889], [29.35357, 46.49505], [29.24886, 46.37912], [29.23547, 46.55435], [29.02409, 46.49582], [29.01241, 46.46177], [28.9306, 46.45699], [29.004, 46.31495], [28.98478, 46.31803], [28.94953, 46.25852], [29.06656, 46.19716], [28.94643, 46.09176], [29.00613, 46.04962], [28.98004, 46.00385], [28.74383, 45.96664], [28.78503, 45.83475], [28.69852, 45.81753], [28.70401, 45.78019], [28.52823, 45.73803], [28.47879, 45.66994], [28.51587, 45.6613], [28.54196, 45.58062], [28.49252, 45.56716], [28.51449, 45.49982], [28.43072, 45.48538], [28.41836, 45.51715], [28.30201, 45.54744], [28.21139, 45.46895], [28.28504, 45.43907], [28.34554, 45.32102], [28.5735, 45.24759], [28.71358, 45.22631], [28.78911, 45.24179], [28.81383, 45.3384], [28.94292, 45.28045], [28.96077, 45.33164], [29.24779, 45.43388], [29.42632, 45.44545], [29.59798, 45.38857], [29.68175, 45.26885], [29.65428, 45.25629], [29.69272, 45.19227], [30.04414, 45.08461], [31.62627, 45.50633], [33.54017, 46.0123], [33.59087, 46.06013], [33.57318, 46.10317]]]]
+         }
+       }, {
+         type: "Feature",
+         properties: {
+           iso1A2: "UG",
+           iso1A3: "UGA",
+           iso1N3: "800",
+           wikidata: "Q1036",
+           nameEn: "Uganda",
+           groups: ["014", "202", "002", "UN"],
+           driveSide: "left",
+           callingCodes: ["256"]
+         },
+         geometry: {
+           type: "MultiPolygon",
+           coordinates: [[[[33.93107, -0.99298], [33.9264, -0.54188], [33.98449, -0.13079], [33.90936, 0.10581], [34.10067, 0.36372], [34.08727, 0.44713], [34.11408, 0.48884], [34.13493, 0.58118], [34.20196, 0.62289], [34.27345, 0.63182], [34.31516, 0.75693], [34.40041, 0.80266], [34.43349, 0.85254], [34.52369, 1.10692], [34.57427, 1.09868], [34.58029, 1.14712], [34.67562, 1.21265], [34.80223, 1.22754], [34.82606, 1.26626], [34.82606, 1.30944], [34.7918, 1.36752], [34.87819, 1.5596], [34.92734, 1.56109], [34.9899, 1.6668], [34.98692, 1.97348], [34.90947, 2.42447], [34.95267, 2.47209], [34.77244, 2.70272], [34.78137, 2.76223], [34.73967, 2.85447], [34.65774, 2.8753], [34.60114, 2.93034], [34.56242, 3.11478], [34.45815, 3.18319], [34.40006, 3.37949], [34.41794, 3.44342], [34.39112, 3.48802], [34.44922, 3.51627], [34.45815, 3.67385], [34.15429, 3.80464], [34.06046, 4.15235], [33.9873, 4.23316], [33.51264, 3.75068], [33.18356, 3.77812], [33.02852, 3.89296], [32.89746, 3.81339], [32.72021, 3.77327], [32.41337, 3.748], [32.20782, 3.6053], [32.19888, 3.50867], [32.08866, 3.53543], [32.08491, 3.56287], [32.05187, 3.589], [31.95907, 3.57408], [31.96205, 3.6499], [31.86821, 3.78664], [31.81459, 3.82083], [31.72075, 3.74354], [31.50776, 3.63652], [31.50478, 3.67814], [31.29476, 3.8015], [31.16666, 3.79853], [30.97601, 3.693], [30.85153, 3.48867], [30.94081, 3.50847], [30.93486, 3.40737], [30.84251, 3.26908], [30.77101, 3.04897], [30.8574, 2.9508], [30.8857, 2.83923], [30.75612, 2.5863], [30.74271, 2.43601], [30.83059, 2.42559], [30.91102, 2.33332], [30.96911, 2.41071], [31.06593, 2.35862], [31.07934, 2.30207], [31.12104, 2.27676], [31.1985, 2.29462], [31.20148, 2.2217], [31.28042, 2.17853], [31.30127, 2.11006], [30.48503, 1.21675], [30.24671, 1.14974], [30.22139, 0.99635], [30.1484, 0.89805], [29.98307, 0.84295], [29.95477, 0.64486], [29.97413, 0.52124], [29.87284, 0.39166], [29.81922, 0.16824], [29.77454, 0.16675], [29.7224, 0.07291], [29.72687, -0.08051], [29.65091, -0.46777], [29.67474, -0.47969], [29.67176, -0.55714], [29.62708, -0.71055], [29.63006, -0.8997], [29.58388, -0.89821], [29.59061, -1.39016], [29.82657, -1.31187], [29.912, -1.48269], [30.16369, -1.34303], [30.35212, -1.06896], [30.47194, -1.0555], [30.64166, -1.06601], [30.70631, -1.01175], [30.76635, -0.9852], [30.80408, -0.99911], [33.93107, -0.99298]]]]
+         }
+       }, {
+         type: "Feature",
+         properties: {
+           iso1A2: "UM",
+           iso1A3: "UMI",
+           iso1N3: "581",
+           wikidata: "Q16645",
+           nameEn: "United States Minor Outlying Islands",
+           country: "US"
+         },
+         geometry: null
+       }, {
+         type: "Feature",
+         properties: {
+           iso1A2: "UN",
+           wikidata: "Q1065",
+           nameEn: "United Nations",
+           level: "unitedNations",
+           isoStatus: "excRes"
+         },
+         geometry: null
+       }, {
+         type: "Feature",
+         properties: {
+           iso1A2: "US",
+           iso1A3: "USA",
+           iso1N3: "840",
+           wikidata: "Q30",
+           nameEn: "United States of America"
+         },
+         geometry: null
+       }, {
+         type: "Feature",
+         properties: {
+           iso1A2: "UY",
+           iso1A3: "URY",
+           iso1N3: "858",
+           wikidata: "Q77",
+           nameEn: "Uruguay",
+           groups: ["005", "419", "019", "UN"],
+           callingCodes: ["598"]
+         },
+         geometry: {
+           type: "MultiPolygon",
+           coordinates: [[[[-57.65132, -30.19229], [-57.61478, -30.25165], [-57.64859, -30.35095], [-57.89115, -30.49572], [-57.8024, -30.77193], [-57.89476, -30.95994], [-57.86729, -31.06352], [-57.9908, -31.34924], [-57.98127, -31.3872], [-58.07569, -31.44916], [-58.0023, -31.53084], [-58.00076, -31.65016], [-58.20252, -31.86966], [-58.10036, -32.25338], [-58.22362, -32.52416], [-58.1224, -32.98842], [-58.40475, -33.11777], [-58.44442, -33.84033], [-58.34425, -34.15035], [-57.83001, -34.69099], [-54.78916, -36.21945], [-52.83257, -34.01481], [-53.37138, -33.74313], [-53.39593, -33.75169], [-53.44031, -33.69344], [-53.52794, -33.68908], [-53.53459, -33.16843], [-53.1111, -32.71147], [-53.37671, -32.57005], [-53.39572, -32.58596], [-53.76024, -32.0751], [-54.17384, -31.86168], [-55.50821, -30.91349], [-55.50841, -30.9027], [-55.51862, -30.89828], [-55.52712, -30.89997], [-55.53276, -30.90218], [-55.53431, -30.89714], [-55.54572, -30.89051], [-55.55218, -30.88193], [-55.55373, -30.8732], [-55.5634, -30.8686], [-55.58866, -30.84117], [-55.87388, -31.05053], [-56.4619, -30.38457], [-56.4795, -30.3899], [-56.49267, -30.39471], [-56.90236, -30.02578], [-57.22502, -30.26121], [-57.65132, -30.19229]]]]
+         }
+       }, {
+         type: "Feature",
+         properties: {
+           iso1A2: "UZ",
+           iso1A3: "UZB",
+           iso1N3: "860",
+           wikidata: "Q265",
+           nameEn: "Uzbekistan",
+           groups: ["143", "142", "UN"],
+           callingCodes: ["998"]
+         },
+         geometry: {
+           type: "MultiPolygon",
+           coordinates: [[[[65.85194, 42.85481], [65.53277, 43.31856], [65.18666, 43.48835], [64.96464, 43.74748], [64.53885, 43.56941], [63.34656, 43.64003], [62.01711, 43.51008], [61.01475, 44.41383], [58.59711, 45.58671], [55.97842, 44.99622], [55.97832, 44.99622], [55.97822, 44.99617], [55.97811, 44.99617], [55.97801, 44.99612], [55.97801, 44.99607], [55.97791, 44.99607], [55.9778, 44.99607], [55.9777, 44.99601], [55.9777, 44.99596], [55.9776, 44.99591], [55.97749, 44.99591], [55.97739, 44.99591], [55.97739, 44.99586], [55.97729, 44.99586], [55.97718, 44.99581], [55.97708, 44.99576], [55.97698, 44.9957], [55.97698, 44.99565], [55.97687, 44.9956], [55.97677, 44.9956], [55.97677, 44.99555], [55.97677, 44.9955], [55.97667, 44.99545], [55.97656, 44.99539], [55.97646, 44.99534], [55.97646, 44.99529], [55.97636, 44.99524], [55.97636, 44.99519], [55.97625, 44.99514], [55.97615, 44.99508], [55.97615, 44.99503], [55.97615, 44.99498], [55.97615, 44.99493], [55.97615, 44.99483], [55.97615, 44.99477], [55.97605, 44.99477], [55.97605, 44.99467], [55.97605, 44.99462], [55.97605, 44.99457], [55.97605, 44.99452], [55.97594, 44.99446], [55.97584, 44.99441], [55.97584, 44.99436], [55.97584, 44.99431], [55.97584, 44.99426], [55.97584, 44.99421], [55.97584, 44.99415], [55.97584, 44.99405], [55.97584, 44.994], [55.97584, 44.9939], [55.97584, 44.99384], [55.97584, 44.99374], [55.97584, 44.99369], [55.97584, 44.99359], [55.97584, 44.99353], [55.97584, 44.99348], [55.97584, 44.99343], [55.97584, 44.99338], [55.97584, 44.99328], [55.97584, 44.99322], [56.00314, 41.32584], [57.03423, 41.25435], [57.13796, 41.36625], [57.03359, 41.41777], [56.96218, 41.80383], [57.03633, 41.92043], [57.30275, 42.14076], [57.6296, 42.16519], [57.84932, 42.18555], [57.92897, 42.24047], [57.90975, 42.4374], [57.99214, 42.50021], [58.3492, 42.43335], [58.40688, 42.29535], [58.51674, 42.30348], [58.29427, 42.56497], [58.14321, 42.62159], [58.27504, 42.69632], [58.57991, 42.64988], [58.6266, 42.79314], [58.93422, 42.5407], [59.17317, 42.52248], [59.2955, 42.37064], [59.4341, 42.29738], [59.94633, 42.27655], [60.00539, 42.212], [59.96419, 42.1428], [60.04659, 42.08982], [60.0356, 42.01028], [59.95046, 41.97966], [60.33223, 41.75058], [60.08504, 41.80997], [60.06032, 41.76287], [60.18117, 41.60082], [60.06581, 41.4363], [60.5078, 41.21694], [61.03261, 41.25691], [61.22212, 41.14946], [61.33199, 41.14946], [61.39732, 41.19873], [61.4446, 41.29407], [61.87856, 41.12257], [62.11751, 40.58242], [62.34273, 40.43206], [62.43337, 39.98528], [63.6913, 39.27666], [63.70778, 39.22349], [64.19086, 38.95561], [64.32576, 38.98691], [65.55873, 38.29052], [65.83913, 38.25733], [66.24013, 38.16238], [66.41042, 38.02403], [66.56697, 38.0435], [66.67684, 37.96776], [66.53676, 37.80084], [66.52852, 37.58568], [66.65761, 37.45497], [66.52303, 37.39827], [66.55743, 37.35409], [66.64699, 37.32958], [66.95598, 37.40162], [67.08232, 37.35469], [67.13039, 37.27168], [67.2224, 37.24545], [67.2581, 37.17216], [67.51868, 37.26102], [67.78329, 37.1834], [67.8474, 37.31594], [67.81566, 37.43107], [68.12635, 37.93], [68.27159, 37.91477], [68.40343, 38.19484], [68.13289, 38.40822], [68.06274, 38.39435], [68.11366, 38.47169], [68.05873, 38.56087], [68.0807, 38.64136], [68.05598, 38.71641], [68.12877, 38.73677], [68.06948, 38.82115], [68.19743, 38.85985], [68.09704, 39.02589], [67.68915, 39.00775], [67.67833, 39.14479], [67.33226, 39.23739], [67.36522, 39.31287], [67.45998, 39.315], [67.46822, 39.46146], [67.39681, 39.52505], [67.46547, 39.53564], [67.44899, 39.57799], [67.62889, 39.60234], [67.70992, 39.66156], [68.12053, 39.56317], [68.54166, 39.53929], [68.61972, 39.68905], [68.63071, 39.85265], [68.88889, 39.87163], [68.93695, 39.91167], [68.84906, 40.04952], [68.96579, 40.06949], [69.01935, 40.11466], [69.01523, 40.15771], [68.62796, 40.07789], [68.52771, 40.11676], [68.5332, 40.14826], [68.77902, 40.20492], [68.79276, 40.17555], [68.84357, 40.18604], [68.85832, 40.20885], [69.04544, 40.22904], [69.15659, 40.2162], [69.2074, 40.21488], [69.30448, 40.18774], [69.30104, 40.24502], [69.25229, 40.26362], [69.24817, 40.30357], [69.30808, 40.2821], [69.32833, 40.29794], [69.33794, 40.34819], [69.30774, 40.36102], [69.28525, 40.41894], [69.27066, 40.49274], [69.21063, 40.54469], [69.2643, 40.57506], [69.3455, 40.57988], [69.32834, 40.70233], [69.38327, 40.7918], [69.53021, 40.77621], [69.59441, 40.70181], [69.69434, 40.62615], [70.36655, 40.90296], [70.38028, 41.02014], [70.45251, 41.04438], [70.80009, 40.72825], [70.49871, 40.52503], [70.32626, 40.45174], [70.37511, 40.38605], [70.57149, 40.3442], [70.56394, 40.26421], [70.62342, 40.17396], [70.8607, 40.217], [70.9818, 40.22392], [70.95789, 40.28761], [71.05901, 40.28765], [71.13042, 40.34106], [71.36663, 40.31593], [71.4246, 40.28619], [71.51215, 40.26943], [71.51549, 40.22986], [71.61725, 40.20615], [71.61931, 40.26775], [71.68386, 40.26984], [71.70569, 40.20391], [71.69621, 40.18492], [71.71719, 40.17886], [71.73054, 40.14818], [71.82646, 40.21872], [71.85002, 40.25647], [72.05464, 40.27586], [71.96401, 40.31907], [72.18648, 40.49893], [72.24368, 40.46091], [72.40346, 40.4007], [72.44191, 40.48222], [72.41513, 40.50856], [72.38384, 40.51535], [72.41714, 40.55736], [72.34406, 40.60144], [72.40517, 40.61917], [72.47795, 40.5532], [72.66713, 40.5219], [72.66713, 40.59076], [72.69579, 40.59778], [72.73995, 40.58409], [72.74768, 40.58051], [72.74862, 40.57131], [72.75982, 40.57273], [72.74894, 40.59592], [72.74866, 40.60873], [72.80137, 40.67856], [72.84754, 40.67229], [72.85372, 40.7116], [72.8722, 40.71111], [72.93296, 40.73089], [72.99133, 40.76457], [73.0612, 40.76678], [73.13412, 40.79122], [73.13267, 40.83512], [73.01869, 40.84681], [72.94454, 40.8094], [72.84291, 40.85512], [72.68157, 40.84942], [72.59136, 40.86947], [72.55109, 40.96046], [72.48742, 40.97136], [72.45206, 41.03018], [72.38511, 41.02785], [72.36138, 41.04384], [72.34757, 41.06104], [72.34026, 41.04539], [72.324, 41.03381], [72.18339, 40.99571], [72.17594, 41.02377], [72.21061, 41.05607], [72.1792, 41.10621], [72.14864, 41.13363], [72.17594, 41.15522], [72.16433, 41.16483], [72.10745, 41.15483], [72.07249, 41.11739], [71.85964, 41.19081], [71.91457, 41.2982], [71.83914, 41.3546], [71.76625, 41.4466], [71.71132, 41.43012], [71.73054, 41.54713], [71.65914, 41.49599], [71.6787, 41.42111], [71.57227, 41.29175], [71.46688, 41.31883], [71.43814, 41.19644], [71.46148, 41.13958], [71.40198, 41.09436], [71.34877, 41.16807], [71.27187, 41.11015], [71.25813, 41.18796], [71.11806, 41.15359], [71.02193, 41.19494], [70.9615, 41.16393], [70.86263, 41.23833], [70.77885, 41.24813], [70.78572, 41.36419], [70.67586, 41.47953], [70.48909, 41.40335], [70.17682, 41.5455], [70.69777, 41.92554], [71.28719, 42.18033], [71.13263, 42.28356], [70.94483, 42.26238], [69.49545, 41.545], [69.45751, 41.56863], [69.39485, 41.51518], [69.45081, 41.46246], [69.37468, 41.46555], [69.35554, 41.47211], [69.29778, 41.43673], [69.25059, 41.46693], [69.23332, 41.45847], [69.22671, 41.46298], [69.20439, 41.45391], [69.18528, 41.45175], [69.17701, 41.43769], [69.15137, 41.43078], [69.05006, 41.36183], [69.01308, 41.22804], [68.7217, 41.05025], [68.73945, 40.96989], [68.65662, 40.93861], [68.62221, 41.03019], [68.49983, 40.99669], [68.58444, 40.91447], [68.63, 40.59358], [68.49983, 40.56437], [67.96736, 40.83798], [68.1271, 41.0324], [68.08273, 41.08148], [67.98511, 41.02794], [67.9644, 41.14611], [66.69129, 41.1311], [66.53302, 41.87388], [66.00546, 41.94455], [66.09482, 42.93426], [65.85194, 42.85481]], [[70.68112, 40.90612], [70.6721, 40.90555], [70.57501, 40.98941], [70.54223, 40.98787], [70.56077, 41.00642], [70.6158, 40.97661], [70.68112, 40.90612]]], [[[71.21139, 40.03369], [71.12218, 40.03052], [71.06305, 40.1771], [71.00236, 40.18154], [71.01035, 40.05481], [71.11037, 40.01984], [71.11668, 39.99291], [71.09063, 39.99], [71.10501, 39.95568], [71.04979, 39.89808], [71.10531, 39.91354], [71.16101, 39.88423], [71.23067, 39.93581], [71.1427, 39.95026], [71.21139, 40.03369]]], [[[71.86463, 39.98598], [71.78838, 40.01404], [71.71511, 39.96348], [71.7504, 39.93701], [71.84316, 39.95582], [71.86463, 39.98598]]]]
+         }
+       }, {
+         type: "Feature",
+         properties: {
+           iso1A2: "VA",
+           iso1A3: "VAT",
+           iso1N3: "336",
+           wikidata: "Q237",
+           nameEn: "Vatican City",
+           aliases: ["Holy See"],
+           groups: ["039", "150"],
+           callingCodes: ["379", "39 06"]
+         },
+         geometry: {
+           type: "MultiPolygon",
+           coordinates: [[[[12.45181, 41.90056], [12.45446, 41.90028], [12.45435, 41.90143], [12.45626, 41.90172], [12.45691, 41.90125], [12.4577, 41.90115], [12.45834, 41.90174], [12.45826, 41.90281], [12.45755, 41.9033], [12.45762, 41.9058], [12.45561, 41.90629], [12.45543, 41.90738], [12.45091, 41.90625], [12.44984, 41.90545], [12.44815, 41.90326], [12.44582, 41.90194], [12.44834, 41.90095], [12.45181, 41.90056]]]]
+         }
+       }, {
+         type: "Feature",
+         properties: {
+           iso1A2: "VC",
+           iso1A3: "VCT",
+           iso1N3: "670",
+           wikidata: "Q757",
+           nameEn: "St. Vincent and the Grenadines",
+           aliases: ["WV"],
+           groups: ["029", "003", "419", "019", "UN"],
+           driveSide: "left",
+           roadSpeedUnit: "mph",
+           callingCodes: ["1 784"]
+         },
+         geometry: {
+           type: "MultiPolygon",
+           coordinates: [[[[-62.64026, 12.69984], [-59.94058, 12.34011], [-61.69315, 14.26451], [-62.64026, 12.69984]]]]
+         }
+       }, {
+         type: "Feature",
+         properties: {
+           iso1A2: "VE",
+           iso1A3: "VEN",
+           iso1N3: "862",
+           wikidata: "Q717",
+           nameEn: "Venezuela",
+           aliases: ["YV"],
+           groups: ["005", "419", "019", "UN"],
+           callingCodes: ["58"]
+         },
+         geometry: {
+           type: "MultiPolygon",
+           coordinates: [[[[-71.22331, 13.01387], [-70.92579, 11.96275], [-71.3275, 11.85], [-71.9675, 11.65536], [-72.24983, 11.14138], [-72.4767, 11.1117], [-72.88002, 10.44309], [-72.98085, 9.85253], [-73.36905, 9.16636], [-73.02119, 9.27584], [-72.94052, 9.10663], [-72.77415, 9.10165], [-72.65474, 8.61428], [-72.4042, 8.36513], [-72.36987, 8.19976], [-72.35163, 8.01163], [-72.39137, 8.03534], [-72.47213, 7.96106], [-72.48801, 7.94329], [-72.48183, 7.92909], [-72.47042, 7.92306], [-72.45806, 7.91141], [-72.46183, 7.90682], [-72.44454, 7.86031], [-72.46763, 7.79518], [-72.47827, 7.65604], [-72.45321, 7.57232], [-72.47415, 7.48928], [-72.43132, 7.40034], [-72.19437, 7.37034], [-72.04895, 7.03837], [-71.82441, 7.04314], [-71.44118, 7.02116], [-71.42212, 7.03854], [-71.37234, 7.01588], [-71.03941, 6.98163], [-70.7596, 7.09799], [-70.10716, 6.96516], [-69.41843, 6.1072], [-67.60654, 6.2891], [-67.4625, 6.20625], [-67.43513, 5.98835], [-67.58558, 5.84537], [-67.63914, 5.64963], [-67.59141, 5.5369], [-67.83341, 5.31104], [-67.85358, 4.53249], [-67.62671, 3.74303], [-67.50067, 3.75812], [-67.30945, 3.38393], [-67.85862, 2.86727], [-67.85862, 2.79173], [-67.65696, 2.81691], [-67.21967, 2.35778], [-66.85795, 1.22998], [-66.28507, 0.74585], [-65.6727, 1.01353], [-65.50158, 0.92086], [-65.57288, 0.62856], [-65.11657, 1.12046], [-64.38932, 1.5125], [-64.34654, 1.35569], [-64.08274, 1.64792], [-64.06135, 1.94722], [-63.39827, 2.16098], [-63.39114, 2.4317], [-64.0257, 2.48156], [-64.02908, 2.79797], [-64.48379, 3.7879], [-64.84028, 4.24665], [-64.72977, 4.28931], [-64.57648, 4.12576], [-64.14512, 4.12932], [-63.99183, 3.90172], [-63.86082, 3.94796], [-63.70218, 3.91417], [-63.67099, 4.01731], [-63.50611, 3.83592], [-63.42233, 3.89995], [-63.4464, 3.9693], [-63.21111, 3.96219], [-62.98296, 3.59935], [-62.7655, 3.73099], [-62.74411, 4.03331], [-62.57656, 4.04754], [-62.44822, 4.18621], [-62.13094, 4.08309], [-61.54629, 4.2822], [-61.48569, 4.43149], [-61.29675, 4.44216], [-61.31457, 4.54167], [-61.15703, 4.49839], [-60.98303, 4.54167], [-60.86539, 4.70512], [-60.5802, 4.94312], [-60.73204, 5.20931], [-61.4041, 5.95304], [-61.15058, 6.19558], [-61.20762, 6.58174], [-61.13632, 6.70922], [-60.54873, 6.8631], [-60.39419, 6.94847], [-60.28074, 7.1162], [-60.44116, 7.20817], [-60.54098, 7.14804], [-60.63367, 7.25061], [-60.59802, 7.33194], [-60.71923, 7.55817], [-60.64793, 7.56877], [-60.51959, 7.83373], [-60.38056, 7.8302], [-60.02407, 8.04557], [-59.97059, 8.20791], [-59.83156, 8.23261], [-59.80661, 8.28906], [-59.85562, 8.35213], [-59.98508, 8.53046], [-59.54058, 8.6862], [-60.89962, 9.81445], [-62.08693, 10.04435], [-61.62505, 11.18974], [-63.73917, 11.92623], [-63.19938, 16.44103], [-67.89186, 12.4116], [-68.01417, 11.77722], [-68.33524, 11.78151], [-68.99639, 11.79035], [-71.22331, 13.01387]]]]
+         }
+       }, {
+         type: "Feature",
+         properties: {
+           iso1A2: "VG",
+           iso1A3: "VGB",
+           iso1N3: "092",
+           wikidata: "Q25305",
+           nameEn: "British Virgin Islands",
+           country: "GB",
+           groups: ["BOTS", "029", "003", "419", "019", "UN"],
+           driveSide: "left",
+           roadSpeedUnit: "mph",
+           roadHeightUnit: "ft",
+           callingCodes: ["1 284"]
+         },
+         geometry: {
+           type: "MultiPolygon",
+           coordinates: [[[[-64.47127, 17.55688], [-63.88746, 19.15706], [-65.02435, 18.73231], [-64.86027, 18.39056], [-64.64673, 18.36549], [-64.47127, 17.55688]]]]
+         }
+       }, {
+         type: "Feature",
+         properties: {
+           iso1A2: "VI",
+           iso1A3: "VIR",
+           iso1N3: "850",
+           wikidata: "Q11703",
+           nameEn: "United States Virgin Islands",
+           aliases: ["US-VI"],
+           country: "US",
+           groups: ["Q1352230", "029", "003", "419", "019", "UN"],
+           driveSide: "left",
+           roadSpeedUnit: "mph",
+           roadHeightUnit: "ft",
+           callingCodes: ["1 340"]
+         },
+         geometry: {
+           type: "MultiPolygon",
+           coordinates: [[[[-65.02435, 18.73231], [-65.27974, 17.56928], [-64.47127, 17.55688], [-64.64673, 18.36549], [-64.86027, 18.39056], [-65.02435, 18.73231]]]]
+         }
+       }, {
+         type: "Feature",
+         properties: {
+           iso1A2: "VN",
+           iso1A3: "VNM",
+           iso1N3: "704",
+           wikidata: "Q881",
+           nameEn: "Vietnam",
+           groups: ["035", "142", "UN"],
+           callingCodes: ["84"]
+         },
+         geometry: {
+           type: "MultiPolygon",
+           coordinates: [[[[108.10003, 21.47338], [108.0569, 21.53604], [108.02926, 21.54997], [107.97932, 21.54503], [107.97383, 21.53961], [107.97074, 21.54072], [107.96774, 21.53601], [107.95232, 21.5388], [107.92652, 21.58906], [107.90006, 21.5905], [107.86114, 21.65128], [107.80355, 21.66141], [107.66967, 21.60787], [107.56537, 21.61945], [107.54047, 21.5934], [107.49065, 21.59774], [107.49532, 21.62958], [107.47197, 21.6672], [107.41593, 21.64839], [107.38636, 21.59774], [107.35989, 21.60063], [107.35834, 21.6672], [107.29296, 21.74674], [107.24625, 21.7077], [107.20734, 21.71493], [107.10771, 21.79879], [107.02615, 21.81981], [107.00964, 21.85948], [107.06101, 21.88982], [107.05634, 21.92303], [106.99252, 21.95191], [106.97228, 21.92592], [106.92714, 21.93459], [106.9178, 21.97357], [106.81038, 21.97934], [106.74345, 22.00965], [106.72551, 21.97923], [106.69276, 21.96013], [106.68274, 21.99811], [106.70142, 22.02409], [106.6983, 22.15102], [106.67495, 22.1885], [106.69986, 22.22309], [106.6516, 22.33977], [106.55976, 22.34841], [106.57221, 22.37], [106.55665, 22.46498], [106.58395, 22.474], [106.61269, 22.60301], [106.65316, 22.5757], [106.71698, 22.58432], [106.72321, 22.63606], [106.76293, 22.73491], [106.82404, 22.7881], [106.83685, 22.8098], [106.81271, 22.8226], [106.78422, 22.81532], [106.71128, 22.85982], [106.71387, 22.88296], [106.6734, 22.89587], [106.6516, 22.86862], [106.60179, 22.92884], [106.55976, 22.92311], [106.51306, 22.94891], [106.49749, 22.91164], [106.34961, 22.86718], [106.27022, 22.87722], [106.19705, 22.98475], [106.00179, 22.99049], [105.99568, 22.94178], [105.90119, 22.94168], [105.8726, 22.92756], [105.72382, 23.06641], [105.57594, 23.075], [105.56037, 23.16806], [105.49966, 23.20669], [105.42805, 23.30824], [105.40782, 23.28107], [105.32376, 23.39684], [105.22569, 23.27249], [105.17276, 23.28679], [105.11672, 23.25247], [105.07002, 23.26248], [104.98712, 23.19176], [104.96532, 23.20463], [104.9486, 23.17235], [104.91435, 23.18666], [104.87992, 23.17141], [104.87382, 23.12854], [104.79478, 23.12934], [104.8334, 23.01484], [104.86765, 22.95178], [104.84942, 22.93631], [104.77114, 22.90017], [104.72755, 22.81984], [104.65283, 22.83419], [104.60457, 22.81841], [104.58122, 22.85571], [104.47225, 22.75813], [104.35593, 22.69353], [104.25683, 22.76534], [104.27084, 22.8457], [104.11384, 22.80363], [104.03734, 22.72945], [104.01088, 22.51823], [103.99247, 22.51958], [103.97384, 22.50634], [103.96783, 22.51173], [103.96352, 22.50584], [103.95191, 22.5134], [103.94513, 22.52553], [103.93286, 22.52703], [103.87904, 22.56683], [103.64506, 22.79979], [103.56255, 22.69499], [103.57812, 22.65764], [103.52675, 22.59155], [103.43646, 22.70648], [103.43179, 22.75816], [103.32282, 22.8127], [103.28079, 22.68063], [103.18895, 22.64471], [103.15782, 22.59873], [103.17961, 22.55705], [103.07843, 22.50097], [103.0722, 22.44775], [102.9321, 22.48659], [102.8636, 22.60735], [102.60675, 22.73376], [102.57095, 22.7036], [102.51802, 22.77969], [102.46665, 22.77108], [102.42618, 22.69212], [102.38415, 22.67919], [102.41061, 22.64184], [102.25339, 22.4607], [102.26428, 22.41321], [102.16621, 22.43336], [102.14099, 22.40092], [102.18712, 22.30403], [102.51734, 22.02676], [102.49092, 21.99002], [102.62301, 21.91447], [102.67145, 21.65894], [102.74189, 21.66713], [102.82115, 21.73667], [102.81894, 21.83888], [102.85637, 21.84501], [102.86077, 21.71213], [102.97965, 21.74076], [102.98846, 21.58936], [102.86297, 21.4255], [102.94223, 21.46034], [102.88939, 21.3107], [102.80794, 21.25736], [102.89825, 21.24707], [102.97745, 21.05821], [103.03469, 21.05821], [103.12055, 20.89994], [103.21497, 20.89832], [103.38032, 20.79501], [103.45737, 20.82382], [103.68633, 20.66324], [103.73478, 20.6669], [103.82282, 20.8732], [103.98024, 20.91531], [104.11121, 20.96779], [104.27412, 20.91433], [104.63957, 20.6653], [104.38199, 20.47155], [104.40621, 20.3849], [104.47886, 20.37459], [104.66158, 20.47774], [104.72102, 20.40554], [104.62195, 20.36633], [104.61315, 20.24452], [104.86852, 20.14121], [104.91695, 20.15567], [104.9874, 20.09573], [104.8465, 19.91783], [104.8355, 19.80395], [104.68359, 19.72729], [104.64837, 19.62365], [104.53169, 19.61743], [104.41281, 19.70035], [104.23229, 19.70242], [104.06498, 19.66926], [104.05617, 19.61743], [104.10832, 19.51575], [104.06058, 19.43484], [103.87125, 19.31854], [104.5361, 18.97747], [104.64617, 18.85668], [105.12829, 18.70453], [105.19654, 18.64196], [105.1327, 18.58355], [105.10408, 18.43533], [105.15942, 18.38691], [105.38366, 18.15315], [105.46292, 18.22008], [105.64784, 17.96687], [105.60381, 17.89356], [105.76612, 17.67147], [105.85744, 17.63221], [106.09019, 17.36399], [106.18991, 17.28227], [106.24444, 17.24714], [106.29287, 17.3018], [106.31929, 17.20509], [106.43597, 17.01362], [106.50862, 16.9673], [106.55045, 17.0031], [106.54824, 16.92729], [106.51963, 16.92097], [106.52183, 16.87884], [106.55265, 16.86831], [106.55485, 16.68704], [106.59013, 16.62259], [106.58267, 16.6012], [106.61477, 16.60713], [106.66052, 16.56892], [106.65832, 16.47816], [106.74418, 16.41904], [106.84104, 16.55415], [106.88727, 16.52671], [106.88067, 16.43594], [106.96638, 16.34938], [106.97385, 16.30204], [107.02597, 16.31132], [107.09091, 16.3092], [107.15035, 16.26271], [107.14595, 16.17816], [107.25822, 16.13587], [107.33968, 16.05549], [107.44975, 16.08511], [107.46296, 16.01106], [107.39471, 15.88829], [107.34188, 15.89464], [107.21419, 15.83747], [107.21859, 15.74638], [107.27143, 15.71459], [107.27583, 15.62769], [107.34408, 15.62345], [107.3815, 15.49832], [107.50699, 15.48771], [107.53341, 15.40496], [107.62367, 15.42193], [107.60605, 15.37524], [107.62587, 15.2266], [107.58844, 15.20111], [107.61926, 15.13949], [107.61486, 15.0566], [107.46516, 15.00982], [107.48277, 14.93751], [107.59285, 14.87795], [107.51579, 14.79282], [107.54361, 14.69092], [107.55371, 14.628], [107.52102, 14.59034], [107.52569, 14.54665], [107.48521, 14.40346], [107.44941, 14.41552], [107.39493, 14.32655], [107.40427, 14.24509], [107.33577, 14.11832], [107.37158, 14.07906], [107.35757, 14.02319], [107.38247, 13.99147], [107.44318, 13.99751], [107.46498, 13.91593], [107.45252, 13.78897], [107.53503, 13.73908], [107.61909, 13.52577], [107.62843, 13.3668], [107.49144, 13.01215], [107.49611, 12.88926], [107.55993, 12.7982], [107.5755, 12.52177], [107.55059, 12.36824], [107.4463, 12.29373], [107.42917, 12.24657], [107.34511, 12.33327], [107.15831, 12.27547], [106.99953, 12.08983], [106.92325, 12.06548], [106.79405, 12.0807], [106.70687, 11.96956], [106.4111, 11.97413], [106.4687, 11.86751], [106.44068, 11.86294], [106.44535, 11.8279], [106.41577, 11.76999], [106.45158, 11.68616], [106.44691, 11.66787], [106.37219, 11.69836], [106.30525, 11.67549], [106.26478, 11.72122], [106.18539, 11.75171], [106.13158, 11.73283], [106.06708, 11.77761], [106.02038, 11.77457], [106.00792, 11.7197], [105.95188, 11.63738], [105.88962, 11.67854], [105.8507, 11.66635], [105.80867, 11.60536], [105.81645, 11.56876], [105.87328, 11.55953], [105.88962, 11.43605], [105.86782, 11.28343], [106.10444, 11.07879], [106.1527, 11.10476], [106.1757, 11.07301], [106.20095, 10.97795], [106.14301, 10.98176], [106.18539, 10.79451], [106.06708, 10.8098], [105.94535, 10.9168], [105.93403, 10.83853], [105.84603, 10.85873], [105.86376, 10.89839], [105.77751, 11.03671], [105.50045, 10.94586], [105.42884, 10.96878], [105.34011, 10.86179], [105.11449, 10.96332], [105.08326, 10.95656], [105.02722, 10.89236], [105.09571, 10.72722], [104.95094, 10.64003], [104.87933, 10.52833], [104.59018, 10.53073], [104.49869, 10.4057], [104.47963, 10.43046], [104.43778, 10.42386], [103.99198, 10.48391], [102.47649, 9.66162], [104.81582, 8.03101], [109.55486, 8.10026], [111.60491, 13.57105], [108.00365, 17.98159], [108.10003, 21.47338]]]]
+         }
+       }, {
+         type: "Feature",
+         properties: {
+           iso1A2: "VU",
+           iso1A3: "VUT",
+           iso1N3: "548",
+           wikidata: "Q686",
+           nameEn: "Vanuatu",
+           groups: ["054", "009", "UN"],
+           callingCodes: ["678"]
+         },
+         geometry: {
+           type: "MultiPolygon",
+           coordinates: [[[[156.73836, -14.50464], [174.245, -23.1974], [172.71443, -12.01327], [156.73836, -14.50464]]]]
+         }
+       }, {
+         type: "Feature",
+         properties: {
+           iso1A2: "WF",
+           iso1A3: "WLF",
+           iso1N3: "876",
+           wikidata: "Q35555",
+           nameEn: "Wallis and Futuna",
+           country: "FR",
+           groups: ["Q1451600", "061", "009", "UN"],
+           callingCodes: ["681"]
+         },
+         geometry: {
+           type: "MultiPolygon",
+           coordinates: [[[[-178.66551, -14.32452], [-176.76826, -14.95183], [-175.59809, -12.61507], [-178.66551, -14.32452]]]]
+         }
+       }, {
+         type: "Feature",
+         properties: {
+           iso1A2: "WS",
+           iso1A3: "WSM",
+           iso1N3: "882",
+           wikidata: "Q683",
+           nameEn: "Samoa",
+           groups: ["061", "009", "UN"],
+           driveSide: "left",
+           callingCodes: ["685"]
+         },
+         geometry: {
+           type: "MultiPolygon",
+           coordinates: [[[[-173.74402, -14.26669], [-170.99605, -15.1275], [-171.39864, -10.21587], [-173.74402, -14.26669]]]]
+         }
+       }, {
+         type: "Feature",
+         properties: {
+           iso1A2: "XK",
+           iso1A3: "XKX",
+           wikidata: "Q1246",
+           nameEn: "Kosovo",
+           aliases: ["KV"],
+           groups: ["039", "150"],
+           isoStatus: "usrAssn",
+           callingCodes: ["383"]
+         },
+         geometry: {
+           type: "MultiPolygon",
+           coordinates: [[[[21.39045, 42.74888], [21.44047, 42.87276], [21.36941, 42.87397], [21.32974, 42.90424], [21.2719, 42.8994], [21.23534, 42.95523], [21.23877, 43.00848], [21.2041, 43.02277], [21.16734, 42.99694], [21.14465, 43.11089], [21.08952, 43.13471], [21.05378, 43.10707], [21.00749, 43.13984], [20.96287, 43.12416], [20.83727, 43.17842], [20.88685, 43.21697], [20.82145, 43.26769], [20.73811, 43.25068], [20.68688, 43.21335], [20.59929, 43.20492], [20.69515, 43.09641], [20.64557, 43.00826], [20.59929, 43.01067], [20.48692, 42.93208], [20.53484, 42.8885], [20.43734, 42.83157], [20.40594, 42.84853], [20.35692, 42.8335], [20.27869, 42.81945], [20.2539, 42.76245], [20.04898, 42.77701], [20.02088, 42.74789], [20.02915, 42.71147], [20.0969, 42.65559], [20.07761, 42.55582], [20.17127, 42.50469], [20.21797, 42.41237], [20.24399, 42.32168], [20.34479, 42.32656], [20.3819, 42.3029], [20.48857, 42.25444], [20.56955, 42.12097], [20.55633, 42.08173], [20.59434, 42.03879], [20.63069, 41.94913], [20.57946, 41.91593], [20.59524, 41.8818], [20.68523, 41.85318], [20.76786, 41.91839], [20.75464, 42.05229], [21.11491, 42.20794], [21.16614, 42.19815], [21.22728, 42.08909], [21.31983, 42.10993], [21.29913, 42.13954], [21.30496, 42.1418], [21.38428, 42.24465], [21.43882, 42.23609], [21.43882, 42.2789], [21.50823, 42.27156], [21.52145, 42.24465], [21.58992, 42.25915], [21.56772, 42.30946], [21.5264, 42.33634], [21.53467, 42.36809], [21.57021, 42.3647], [21.59029, 42.38042], [21.62887, 42.37664], [21.64209, 42.41081], [21.62556, 42.45106], [21.7035, 42.51899], [21.70522, 42.54176], [21.7327, 42.55041], [21.75672, 42.62695], [21.79413, 42.65923], [21.75025, 42.70125], [21.6626, 42.67813], [21.58755, 42.70418], [21.59154, 42.72643], [21.47498, 42.74695], [21.39045, 42.74888]]]]
+         }
+       }, {
+         type: "Feature",
+         properties: {
+           iso1A2: "YE",
+           iso1A3: "YEM",
+           iso1N3: "887",
+           wikidata: "Q805",
+           nameEn: "Yemen",
+           groups: ["145", "142", "UN"],
+           callingCodes: ["967"]
+         },
+         geometry: {
+           type: "MultiPolygon",
+           coordinates: [[[[57.49095, 8.14549], [52.81185, 17.28568], [52.74267, 17.29519], [52.78009, 17.35124], [52.00311, 19.00083], [49.04884, 18.59899], [48.19996, 18.20584], [47.58351, 17.50366], [47.48245, 17.10808], [47.00571, 16.94765], [46.76494, 17.29151], [46.31018, 17.20464], [44.50126, 17.47475], [43.70631, 17.35762], [43.43005, 17.56148], [43.29185, 17.53224], [43.22533, 17.38343], [43.32653, 17.31179], [43.20156, 17.25901], [43.17787, 17.14717], [43.23967, 17.03428], [43.18233, 17.02673], [43.1813, 16.98438], [43.19328, 16.94703], [43.1398, 16.90696], [43.18338, 16.84852], [43.22012, 16.83932], [43.22956, 16.80613], [43.24801, 16.80613], [43.26303, 16.79479], [43.25857, 16.75304], [43.21325, 16.74416], [43.22066, 16.65179], [43.15274, 16.67248], [43.11601, 16.53166], [42.97215, 16.51093], [42.94351, 16.49467], [42.94625, 16.39721], [42.76801, 16.40371], [42.15205, 16.40211], [40.99158, 15.81743], [43.29075, 12.79154], [43.32909, 12.59711], [43.90659, 12.3823], [51.12877, 12.56479], [57.49095, 8.14549]]]]
+         }
+       }, {
+         type: "Feature",
+         properties: {
+           iso1A2: "YT",
+           iso1A3: "MYT",
+           iso1N3: "175",
+           wikidata: "Q17063",
+           nameEn: "Mayotte",
+           country: "FR",
+           groups: ["Q3320166", "EU", "014", "202", "002", "UN"],
+           callingCodes: ["262"]
+         },
+         geometry: {
+           type: "MultiPolygon",
+           coordinates: [[[[43.28731, -13.97126], [45.54824, -13.22353], [45.4971, -11.75965], [43.28731, -13.97126]]]]
+         }
+       }, {
+         type: "Feature",
+         properties: {
+           iso1A2: "ZA",
+           iso1A3: "ZAF",
+           iso1N3: "710",
+           wikidata: "Q258",
+           nameEn: "South Africa",
+           groups: ["018", "202", "002", "UN"],
+           driveSide: "left",
+           callingCodes: ["27"]
+         },
+         geometry: {
+           type: "MultiPolygon",
+           coordinates: [[[[31.30611, -22.422], [31.16344, -22.32599], [31.08932, -22.34884], [30.86696, -22.28907], [30.6294, -22.32599], [30.48686, -22.31368], [30.38614, -22.34533], [30.28351, -22.35587], [30.2265, -22.2961], [30.13147, -22.30841], [29.92242, -22.19408], [29.76848, -22.14128], [29.64609, -22.12917], [29.37703, -22.19581], [29.21955, -22.17771], [29.18974, -22.18599], [29.15268, -22.21399], [29.10881, -22.21202], [29.0151, -22.22907], [28.91889, -22.44299], [28.63287, -22.55887], [28.34874, -22.5694], [28.04562, -22.8394], [28.04752, -22.90243], [27.93729, -22.96194], [27.93539, -23.04941], [27.74154, -23.2137], [27.6066, -23.21894], [27.52393, -23.37952], [27.33768, -23.40917], [26.99749, -23.65486], [26.84165, -24.24885], [26.51667, -24.47219], [26.46346, -24.60358], [26.39409, -24.63468], [25.8515, -24.75727], [25.84295, -24.78661], [25.88571, -24.87802], [25.72702, -25.25503], [25.69661, -25.29284], [25.6643, -25.4491], [25.58543, -25.6343], [25.33076, -25.76616], [25.12266, -25.75931], [25.01718, -25.72507], [24.8946, -25.80723], [24.67319, -25.81749], [24.44703, -25.73021], [24.36531, -25.773], [24.18287, -25.62916], [23.9244, -25.64286], [23.47588, -25.29971], [23.03497, -25.29971], [22.86012, -25.50572], [22.70808, -25.99186], [22.56365, -26.19668], [22.41921, -26.23078], [22.21206, -26.3773], [22.06192, -26.61882], [21.90703, -26.66808], [21.83291, -26.65959], [21.77114, -26.69015], [21.7854, -26.79199], [21.69322, -26.86152], [21.37869, -26.82083], [21.13353, -26.86661], [20.87031, -26.80047], [20.68596, -26.9039], [20.63275, -26.78181], [20.61754, -26.4692], [20.86081, -26.14892], [20.64795, -25.47827], [20.29826, -24.94869], [20.03678, -24.81004], [20.02809, -24.78725], [19.99817, -24.76768], [19.99882, -28.42622], [18.99885, -28.89165], [17.4579, -28.68718], [17.15405, -28.08573], [16.90446, -28.057], [16.59922, -28.53246], [16.46592, -28.57126], [16.45332, -28.63117], [12.51595, -32.27486], [38.88176, -48.03306], [34.51034, -26.91792], [32.35222, -26.86027], [32.29584, -26.852], [32.22302, -26.84136], [32.19409, -26.84032], [32.13315, -26.84345], [32.09664, -26.80721], [32.00893, -26.8096], [31.97463, -27.11057], [31.97592, -27.31675], [31.49834, -27.31549], [31.15027, -27.20151], [30.96088, -27.0245], [30.97757, -26.92706], [30.88826, -26.79622], [30.81101, -26.84722], [30.78927, -26.48271], [30.95819, -26.26303], [31.13073, -25.91558], [31.31237, -25.7431], [31.4175, -25.71886], [31.86881, -25.99973], [31.974, -25.95387], [31.92649, -25.84216], [32.00631, -25.65044], [31.97875, -25.46356], [32.01676, -25.38117], [32.03196, -25.10785], [31.9835, -24.29983], [31.90368, -24.18892], [31.87707, -23.95293], [31.77445, -23.90082], [31.70223, -23.72695], [31.67942, -23.60858], [31.56539, -23.47268], [31.55779, -23.176], [31.30611, -22.422]], [[29.33204, -29.45598], [29.28545, -29.58456], [29.12553, -29.76266], [29.16548, -29.91706], [28.9338, -30.05072], [28.80222, -30.10579], [28.68627, -30.12885], [28.399, -30.1592], [28.2319, -30.28476], [28.12073, -30.68072], [27.74814, -30.60635], [27.69467, -30.55862], [27.67819, -30.53437], [27.6521, -30.51707], [27.62137, -30.50509], [27.56781, -30.44562], [27.56901, -30.42504], [27.45452, -30.32239], [27.38108, -30.33456], [27.36649, -30.27246], [27.37293, -30.19401], [27.40778, -30.14577], [27.32555, -30.14785], [27.29603, -30.05473], [27.22719, -30.00718], [27.09489, -29.72796], [27.01016, -29.65439], [27.33464, -29.48161], [27.4358, -29.33465], [27.47254, -29.31968], [27.45125, -29.29708], [27.48679, -29.29349], [27.54258, -29.25575], [27.5158, -29.2261], [27.55974, -29.18954], [27.75458, -28.89839], [27.8907, -28.91612], [27.88933, -28.88156], [27.9392, -28.84864], [27.98675, -28.8787], [28.02503, -28.85991], [28.1317, -28.7293], [28.2348, -28.69471], [28.30518, -28.69531], [28.40612, -28.6215], [28.65091, -28.57025], [28.68043, -28.58744], [29.40524, -29.21246], [29.44883, -29.3772], [29.33204, -29.45598]]]]
+         }
+       }, {
+         type: "Feature",
+         properties: {
+           iso1A2: "ZM",
+           iso1A3: "ZMB",
+           iso1N3: "894",
+           wikidata: "Q953",
+           nameEn: "Zambia",
+           groups: ["014", "202", "002", "UN"],
+           driveSide: "left",
+           callingCodes: ["260"]
+         },
+         geometry: {
+           type: "MultiPolygon",
+           coordinates: [[[[32.95389, -9.40138], [32.76233, -9.31963], [32.75611, -9.28583], [32.53661, -9.24281], [32.49147, -9.14754], [32.43543, -9.11988], [32.25486, -9.13371], [32.16146, -9.05993], [32.08206, -9.04609], [31.98866, -9.07069], [31.94196, -9.02303], [31.94663, -8.93846], [31.81587, -8.88618], [31.71158, -8.91386], [31.57147, -8.81388], [31.57147, -8.70619], [31.37533, -8.60769], [31.00796, -8.58615], [30.79243, -8.27382], [28.88917, -8.4831], [28.9711, -8.66935], [28.38526, -9.23393], [28.36562, -9.30091], [28.52636, -9.35379], [28.51627, -9.44726], [28.56208, -9.49122], [28.68532, -9.78], [28.62795, -9.92942], [28.65032, -10.65133], [28.37241, -11.57848], [28.48357, -11.87532], [29.18592, -12.37921], [29.4992, -12.43843], [29.48404, -12.23604], [29.8139, -12.14898], [29.81551, -13.44683], [29.65078, -13.41844], [29.60531, -13.21685], [29.01918, -13.41353], [28.33199, -12.41375], [27.59932, -12.22123], [27.21025, -11.76157], [27.22541, -11.60323], [27.04351, -11.61312], [26.88687, -12.01868], [26.01777, -11.91488], [25.33058, -11.65767], [25.34069, -11.19707], [24.42612, -11.44975], [24.34528, -11.06816], [24.00027, -10.89356], [24.02603, -11.15368], [23.98804, -12.13149], [24.06672, -12.29058], [23.90937, -12.844], [24.03339, -12.99091], [21.97988, -13.00148], [22.00323, -16.18028], [22.17217, -16.50269], [23.20038, -17.47563], [23.47474, -17.62877], [24.23619, -17.47489], [24.32811, -17.49082], [24.38712, -17.46818], [24.5621, -17.52963], [24.70864, -17.49501], [25.00198, -17.58221], [25.26433, -17.79571], [25.51646, -17.86232], [25.6827, -17.81987], [25.85738, -17.91403], [25.85892, -17.97726], [26.08925, -17.98168], [26.0908, -17.93021], [26.21601, -17.88608], [26.55918, -17.99638], [26.68403, -18.07411], [26.74314, -18.0199], [26.89926, -17.98756], [27.14196, -17.81398], [27.30736, -17.60487], [27.61377, -17.34378], [27.62795, -17.24365], [27.83141, -16.96274], [28.73725, -16.5528], [28.76199, -16.51575], [28.81454, -16.48611], [28.8501, -16.04537], [28.9243, -15.93987], [29.01298, -15.93805], [29.21955, -15.76589], [29.4437, -15.68702], [29.8317, -15.6126], [30.35574, -15.6513], [30.41902, -15.62269], [30.22098, -14.99447], [33.24249, -14.00019], [33.16749, -13.93992], [33.07568, -13.98447], [33.02977, -14.05022], [32.99042, -13.95689], [32.88985, -13.82956], [32.79015, -13.80755], [32.76962, -13.77224], [32.84528, -13.71576], [32.7828, -13.64805], [32.68654, -13.64268], [32.66468, -13.60019], [32.68436, -13.55769], [32.73683, -13.57682], [32.84176, -13.52794], [32.86113, -13.47292], [33.0078, -13.19492], [32.98289, -13.12671], [33.02181, -12.88707], [32.96733, -12.88251], [32.94397, -12.76868], [33.05917, -12.59554], [33.18837, -12.61377], [33.28177, -12.54692], [33.37517, -12.54085], [33.54485, -12.35996], [33.47636, -12.32498], [33.3705, -12.34931], [33.25998, -12.14242], [33.33937, -11.91252], [33.32692, -11.59248], [33.24252, -11.59302], [33.23663, -11.40637], [33.29267, -11.43536], [33.29267, -11.3789], [33.39697, -11.15296], [33.25998, -10.88862], [33.28022, -10.84428], [33.47636, -10.78465], [33.70675, -10.56896], [33.54797, -10.36077], [33.53863, -10.20148], [33.31297, -10.05133], [33.37902, -9.9104], [33.36581, -9.81063], [33.31517, -9.82364], [33.2095, -9.61099], [33.12144, -9.58929], [33.10163, -9.66525], [33.05485, -9.61316], [33.00256, -9.63053], [33.00476, -9.5133], [32.95389, -9.40138]]]]
+         }
+       }, {
+         type: "Feature",
+         properties: {
+           iso1A2: "ZW",
+           iso1A3: "ZWE",
+           iso1N3: "716",
+           wikidata: "Q954",
+           nameEn: "Zimbabwe",
+           groups: ["014", "202", "002", "UN"],
+           driveSide: "left",
+           callingCodes: ["263"]
+         },
+         geometry: {
+           type: "MultiPolygon",
+           coordinates: [[[[30.41902, -15.62269], [30.35574, -15.6513], [29.8317, -15.6126], [29.4437, -15.68702], [29.21955, -15.76589], [29.01298, -15.93805], [28.9243, -15.93987], [28.8501, -16.04537], [28.81454, -16.48611], [28.76199, -16.51575], [28.73725, -16.5528], [27.83141, -16.96274], [27.62795, -17.24365], [27.61377, -17.34378], [27.30736, -17.60487], [27.14196, -17.81398], [26.89926, -17.98756], [26.74314, -18.0199], [26.68403, -18.07411], [26.55918, -17.99638], [26.21601, -17.88608], [26.0908, -17.93021], [26.08925, -17.98168], [25.85892, -17.97726], [25.85738, -17.91403], [25.6827, -17.81987], [25.51646, -17.86232], [25.26433, -17.79571], [25.23909, -17.90832], [25.31799, -18.07091], [25.39972, -18.12691], [25.53465, -18.39041], [25.68859, -18.56165], [25.79217, -18.6355], [25.82353, -18.82808], [25.94326, -18.90362], [25.99837, -19.02943], [25.96226, -19.08152], [26.17227, -19.53709], [26.72246, -19.92707], [27.21278, -20.08244], [27.29831, -20.28935], [27.28865, -20.49873], [27.69361, -20.48531], [27.72972, -20.51735], [27.69171, -21.08409], [27.91407, -21.31621], [28.01669, -21.57624], [28.29416, -21.59037], [28.49942, -21.66634], [28.58114, -21.63455], [29.07763, -21.81877], [29.04023, -21.85864], [29.02191, -21.90647], [29.02191, -21.95665], [29.04108, -22.00563], [29.08495, -22.04867], [29.14501, -22.07275], [29.1974, -22.07472], [29.24648, -22.05967], [29.3533, -22.18363], [29.37703, -22.19581], [29.64609, -22.12917], [29.76848, -22.14128], [29.92242, -22.19408], [30.13147, -22.30841], [30.2265, -22.2961], [30.28351, -22.35587], [30.38614, -22.34533], [30.48686, -22.31368], [30.6294, -22.32599], [30.86696, -22.28907], [31.08932, -22.34884], [31.16344, -22.32599], [31.30611, -22.422], [31.38336, -22.36919], [32.41234, -21.31246], [32.48236, -21.32873], [32.37115, -21.133], [32.51644, -20.91929], [32.48122, -20.63319], [32.55167, -20.56312], [32.66174, -20.56106], [32.85987, -20.27841], [32.85987, -20.16686], [32.93032, -20.03868], [33.01178, -20.02007], [33.06461, -19.77787], [32.95013, -19.67219], [32.84666, -19.68462], [32.84446, -19.48343], [32.78282, -19.47513], [32.77966, -19.36098], [32.85107, -19.29238], [32.87088, -19.09279], [32.84006, -19.0262], [32.72118, -19.02204], [32.69917, -18.94293], [32.73439, -18.92628], [32.70137, -18.84712], [32.82465, -18.77419], [32.9017, -18.7992], [32.95013, -18.69079], [32.88629, -18.58023], [32.88629, -18.51344], [33.02278, -18.4696], [33.03159, -18.35054], [32.94133, -17.99705], [33.0492, -17.60298], [32.98536, -17.55891], [32.96554, -17.48964], [33.0426, -17.3468], [33.00517, -17.30477], [32.96554, -17.11971], [32.84113, -16.92259], [32.91051, -16.89446], [32.97655, -16.70689], [32.78943, -16.70267], [32.69917, -16.66893], [32.71017, -16.59932], [32.42838, -16.4727], [32.28529, -16.43892], [32.02772, -16.43892], [31.91324, -16.41569], [31.90223, -16.34388], [31.67988, -16.19595], [31.42451, -16.15154], [31.30563, -16.01193], [31.13171, -15.98019], [30.97761, -16.05848], [30.91597, -15.99924], [30.42568, -15.9962], [30.41902, -15.62269]]]]
+         }
+       }];
+       var borders_default = {
+         type: type,
+         features: features
+       }; // src/country-coder.ts
+
+       var borders = borders_default;
+       var whichPolygonGetter = {};
+       var featuresByCode = {};
+       var idFilterRegex = /(?=(?!^(and|the|of|el|la|de)$))(\b(and|the|of|el|la|de)\b)|[-_ .,'()&[\]/]/gi;
+
+       function canonicalID(id) {
+         var s = id || "";
+
+         if (s.charAt(0) === ".") {
+           return s.toUpperCase();
+         } else {
+           return s.replace(idFilterRegex, "").toUpperCase();
+         }
+       }
+
+       var levels = ["subterritory", "territory", "subcountryGroup", "country", "sharedLandform", "intermediateRegion", "subregion", "region", "subunion", "union", "unitedNations", "world"];
+       loadDerivedDataAndCaches(borders);
+
+       function loadDerivedDataAndCaches(borders2) {
+         var identifierProps = ["iso1A2", "iso1A3", "m49", "wikidata", "emojiFlag", "ccTLD", "nameEn"];
+         var geometryFeatures = [];
+
+         for (var i in borders2.features) {
+           var feature2 = borders2.features[i];
+           feature2.properties.id = feature2.properties.iso1A2 || feature2.properties.m49 || feature2.properties.wikidata;
+           loadM49(feature2);
+           loadTLD(feature2);
+           loadIsoStatus(feature2);
+           loadLevel(feature2);
+           loadGroups(feature2);
+           loadFlag(feature2);
+           cacheFeatureByIDs(feature2);
+           if (feature2.geometry) geometryFeatures.push(feature2);
+         }
+
+         for (var _i in borders2.features) {
+           var _feature = borders2.features[_i];
+           _feature.properties.groups = _feature.properties.groups.map(function (groupID) {
+             return featuresByCode[groupID].properties.id;
+           });
+           loadMembersForGroupsOf(_feature);
+         }
+
+         for (var _i2 in borders2.features) {
+           var _feature2 = borders2.features[_i2];
+           loadRoadSpeedUnit(_feature2);
+           loadRoadHeightUnit(_feature2);
+           loadDriveSide(_feature2);
+           loadCallingCodes(_feature2);
+           loadGroupGroups(_feature2);
+         }
+
+         for (var _i3 in borders2.features) {
+           var _feature3 = borders2.features[_i3];
+
+           _feature3.properties.groups.sort(function (groupID1, groupID2) {
+             return levels.indexOf(featuresByCode[groupID1].properties.level) - levels.indexOf(featuresByCode[groupID2].properties.level);
+           });
+
+           if (_feature3.properties.members) _feature3.properties.members.sort(function (id1, id2) {
+             var diff = levels.indexOf(featuresByCode[id1].properties.level) - levels.indexOf(featuresByCode[id2].properties.level);
+
+             if (diff === 0) {
+               return borders2.features.indexOf(featuresByCode[id1]) - borders2.features.indexOf(featuresByCode[id2]);
+             }
+
+             return diff;
+           });
+         }
+
+         var geometryOnlyCollection = {
+           type: "FeatureCollection",
+           features: geometryFeatures
+         };
+         whichPolygonGetter = whichPolygon_1(geometryOnlyCollection);
+
+         function loadGroups(feature2) {
+           var props = feature2.properties;
+
+           if (!props.groups) {
+             props.groups = [];
+           }
+
+           if (feature2.geometry && props.country) {
+             props.groups.push(props.country);
+           }
+
+           if (props.m49 !== "001") {
+             props.groups.push("001");
+           }
+         }
+
+         function loadM49(feature2) {
+           var props = feature2.properties;
+
+           if (!props.m49 && props.iso1N3) {
+             props.m49 = props.iso1N3;
+           }
+         }
+
+         function loadTLD(feature2) {
+           var props = feature2.properties;
+           if (props.level === "unitedNations") return;
+
+           if (!props.ccTLD && props.iso1A2) {
+             props.ccTLD = "." + props.iso1A2.toLowerCase();
+           }
+         }
+
+         function loadIsoStatus(feature2) {
+           var props = feature2.properties;
+
+           if (!props.isoStatus && props.iso1A2) {
+             props.isoStatus = "official";
+           }
+         }
+
+         function loadLevel(feature2) {
+           var props = feature2.properties;
+           if (props.level) return;
+
+           if (!props.country) {
+             props.level = "country";
+           } else if (!props.iso1A2 || props.isoStatus === "official") {
+             props.level = "territory";
+           } else {
+             props.level = "subterritory";
+           }
+         }
+
+         function loadGroupGroups(feature2) {
+           var props = feature2.properties;
+           if (feature2.geometry || !props.members) return;
+           var featureLevelIndex = levels.indexOf(props.level);
+           var sharedGroups = [];
+
+           var _loop = function _loop(_i4) {
+             var memberID = props.members[_i4];
+             var member = featuresByCode[memberID];
+             var memberGroups = member.properties.groups.filter(function (groupID) {
+               return groupID !== feature2.properties.id && featureLevelIndex < levels.indexOf(featuresByCode[groupID].properties.level);
+             });
+
+             if (_i4 === "0") {
+               sharedGroups = memberGroups;
+             } else {
+               sharedGroups = sharedGroups.filter(function (groupID) {
+                 return memberGroups.indexOf(groupID) !== -1;
+               });
+             }
+           };
+
+           for (var _i4 in props.members) {
+             _loop(_i4);
+           }
+
+           props.groups = props.groups.concat(sharedGroups.filter(function (groupID) {
+             return props.groups.indexOf(groupID) === -1;
+           }));
+
+           for (var j in sharedGroups) {
+             var groupFeature = featuresByCode[sharedGroups[j]];
+
+             if (groupFeature.properties.members.indexOf(props.id) === -1) {
+               groupFeature.properties.members.push(props.id);
+             }
+           }
+         }
+
+         function loadRoadSpeedUnit(feature2) {
+           var props = feature2.properties;
+
+           if (feature2.geometry) {
+             if (!props.roadSpeedUnit) props.roadSpeedUnit = "km/h";
+           } else if (props.members) {
+             var vals = Array.from(new Set(props.members.map(function (id) {
+               var member = featuresByCode[id];
+               if (member.geometry) return member.properties.roadSpeedUnit || "km/h";
+             }).filter(Boolean)));
+             if (vals.length === 1) props.roadSpeedUnit = vals[0];
+           }
+         }
+
+         function loadRoadHeightUnit(feature2) {
+           var props = feature2.properties;
+
+           if (feature2.geometry) {
+             if (!props.roadHeightUnit) props.roadHeightUnit = "m";
+           } else if (props.members) {
+             var vals = Array.from(new Set(props.members.map(function (id) {
+               var member = featuresByCode[id];
+               if (member.geometry) return member.properties.roadHeightUnit || "m";
+             }).filter(Boolean)));
+             if (vals.length === 1) props.roadHeightUnit = vals[0];
+           }
+         }
+
+         function loadDriveSide(feature2) {
+           var props = feature2.properties;
+
+           if (feature2.geometry) {
+             if (!props.driveSide) props.driveSide = "right";
+           } else if (props.members) {
+             var vals = Array.from(new Set(props.members.map(function (id) {
+               var member = featuresByCode[id];
+               if (member.geometry) return member.properties.driveSide || "right";
+             }).filter(Boolean)));
+             if (vals.length === 1) props.driveSide = vals[0];
+           }
+         }
+
+         function loadCallingCodes(feature2) {
+           var props = feature2.properties;
+
+           if (!feature2.geometry && props.members) {
+             props.callingCodes = Array.from(new Set(props.members.reduce(function (array, id) {
+               var member = featuresByCode[id];
+               if (member.geometry && member.properties.callingCodes) return array.concat(member.properties.callingCodes);
+               return array;
+             }, [])));
+           }
+         }
+
+         function loadFlag(feature2) {
+           if (!feature2.properties.iso1A2) return;
+           var flag = feature2.properties.iso1A2.replace(/./g, function (_char) {
+             return String.fromCodePoint(_char.charCodeAt(0) + 127397);
+           });
+           feature2.properties.emojiFlag = flag;
+         }
+
+         function loadMembersForGroupsOf(feature2) {
+           for (var j in feature2.properties.groups) {
+             var groupID = feature2.properties.groups[j];
+             var groupFeature = featuresByCode[groupID];
+             if (!groupFeature.properties.members) groupFeature.properties.members = [];
+             groupFeature.properties.members.push(feature2.properties.id);
+           }
+         }
+
+         function cacheFeatureByIDs(feature2) {
+           var ids = [];
+
+           for (var k in identifierProps) {
+             var prop = identifierProps[k];
+             var id = feature2.properties[prop];
+             if (id) ids.push(id);
+           }
+
+           if (feature2.properties.aliases) {
+             for (var j in feature2.properties.aliases) {
+               ids.push(feature2.properties.aliases[j]);
+             }
+           }
+
+           for (var _i5 in ids) {
+             var _id = canonicalID(ids[_i5]);
+
+             featuresByCode[_id] = feature2;
+           }
+         }
+       }
+
+       function locArray(loc) {
+         if (Array.isArray(loc)) {
+           return loc;
+         } else if (loc.coordinates) {
+           return loc.coordinates;
+         }
+
+         return loc.geometry.coordinates;
+       }
+
+       function smallestFeature(loc) {
+         var query = locArray(loc);
+         var featureProperties = whichPolygonGetter(query);
+         if (!featureProperties) return null;
+         return featuresByCode[featureProperties.id];
+       }
+
+       function countryFeature(loc) {
+         var feature2 = smallestFeature(loc);
+         if (!feature2) return null;
+         var countryCode = feature2.properties.country || feature2.properties.iso1A2;
+         return featuresByCode[countryCode] || null;
+       }
+
+       var defaultOpts = {
+         level: void 0,
+         maxLevel: void 0,
+         withProp: void 0
+       };
+
+       function featureForLoc(loc, opts) {
+         var targetLevel = opts.level || "country";
+         var maxLevel = opts.maxLevel || "world";
+         var withProp = opts.withProp;
+         var targetLevelIndex = levels.indexOf(targetLevel);
+         if (targetLevelIndex === -1) return null;
+         var maxLevelIndex = levels.indexOf(maxLevel);
+         if (maxLevelIndex === -1) return null;
+         if (maxLevelIndex < targetLevelIndex) return null;
+
+         if (targetLevel === "country") {
+           var fastFeature = countryFeature(loc);
+
+           if (fastFeature) {
+             if (!withProp || fastFeature.properties[withProp]) {
+               return fastFeature;
+             }
+           }
+         }
+
+         var features2 = featuresContaining(loc);
+
+         for (var i in features2) {
+           var feature2 = features2[i];
+           var levelIndex = levels.indexOf(feature2.properties.level);
+
+           if (feature2.properties.level === targetLevel || levelIndex > targetLevelIndex && levelIndex <= maxLevelIndex) {
+             if (!withProp || feature2.properties[withProp]) {
+               return feature2;
+             }
+           }
+         }
+
+         return null;
+       }
+
+       function featureForID(id) {
+         var stringID;
+
+         if (typeof id === "number") {
+           stringID = id.toString();
+
+           if (stringID.length === 1) {
+             stringID = "00" + stringID;
+           } else if (stringID.length === 2) {
+             stringID = "0" + stringID;
+           }
+         } else {
+           stringID = canonicalID(id);
+         }
+
+         return featuresByCode[stringID] || null;
+       }
+
+       function smallestFeaturesForBbox(bbox) {
+         return whichPolygonGetter.bbox(bbox).map(function (props) {
+           return featuresByCode[props.id];
+         });
+       }
+
+       function smallestOrMatchingFeature(query) {
+         if (_typeof(query) === "object") {
+           return smallestFeature(query);
+         }
+
+         return featureForID(query);
+       }
+
+       function feature$1(query) {
+         var opts = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : defaultOpts;
+
+         if (_typeof(query) === "object") {
+           return featureForLoc(query, opts);
+         }
+
+         return featureForID(query);
+       }
+
+       function iso1A2Code(query) {
+         var opts = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : defaultOpts;
+         opts.withProp = "iso1A2";
+         var match = feature$1(query, opts);
+         if (!match) return null;
+         return match.properties.iso1A2 || null;
+       }
+
+       function featuresContaining(query, strict) {
+         var matchingFeatures;
+
+         if (Array.isArray(query) && query.length === 4) {
+           matchingFeatures = smallestFeaturesForBbox(query);
+         } else {
+           var smallestOrMatching = smallestOrMatchingFeature(query);
+           matchingFeatures = smallestOrMatching ? [smallestOrMatching] : [];
+         }
+
+         if (!matchingFeatures.length) return [];
+         var returnFeatures;
+
+         if (!strict || _typeof(query) === "object") {
+           returnFeatures = matchingFeatures.slice();
+         } else {
+           returnFeatures = [];
+         }
+
+         for (var j in matchingFeatures) {
+           var properties = matchingFeatures[j].properties;
+
+           for (var i in properties.groups) {
+             var groupID = properties.groups[i];
+             var groupFeature = featuresByCode[groupID];
+
+             if (returnFeatures.indexOf(groupFeature) === -1) {
+               returnFeatures.push(groupFeature);
+             }
+           }
+         }
+
+         return returnFeatures;
+       }
+
+       function featuresIn(id, strict) {
+         var feature2 = featureForID(id);
+         if (!feature2) return [];
+         var features2 = [];
+
+         if (!strict) {
+           features2.push(feature2);
+         }
+
+         var properties = feature2.properties;
+
+         if (properties.members) {
+           for (var i in properties.members) {
+             var memberID = properties.members[i];
+             features2.push(featuresByCode[memberID]);
+           }
+         }
+
+         return features2;
+       }
+
+       function aggregateFeature(id) {
+         var features2 = featuresIn(id, false);
+         if (features2.length === 0) return null;
+         var aggregateCoordinates = [];
+
+         for (var i in features2) {
+           var feature2 = features2[i];
+
+           if (feature2.geometry && feature2.geometry.type === "MultiPolygon" && feature2.geometry.coordinates) {
+             aggregateCoordinates = aggregateCoordinates.concat(feature2.geometry.coordinates);
+           }
+         }
+
+         return {
+           type: "Feature",
+           properties: features2[0].properties,
+           geometry: {
+             type: "MultiPolygon",
+             coordinates: aggregateCoordinates
+           }
+         };
+       }
+
+       function roadSpeedUnit(query) {
+         var feature2 = smallestOrMatchingFeature(query);
+         return feature2 && feature2.properties.roadSpeedUnit || null;
+       }
+
+       function roadHeightUnit(query) {
+         var feature2 = smallestOrMatchingFeature(query);
+         return feature2 && feature2.properties.roadHeightUnit || null;
+       }
+
+       var geojsonArea = {};
+
+       var wgs84$1 = {};
+
+       wgs84$1.RADIUS = 6378137;
+       wgs84$1.FLATTENING = 1 / 298.257223563;
+       wgs84$1.POLAR_RADIUS = 6356752.3142;
+
+       var wgs84 = wgs84$1;
+       geojsonArea.geometry = geometry;
+       geojsonArea.ring = ringArea;
+
+       function geometry(_) {
+         var area = 0,
+             i;
+
+         switch (_.type) {
+           case 'Polygon':
+             return polygonArea(_.coordinates);
+
+           case 'MultiPolygon':
+             for (i = 0; i < _.coordinates.length; i++) {
+               area += polygonArea(_.coordinates[i]);
+             }
+
+             return area;
+
+           case 'Point':
+           case 'MultiPoint':
+           case 'LineString':
+           case 'MultiLineString':
+             return 0;
+
+           case 'GeometryCollection':
+             for (i = 0; i < _.geometries.length; i++) {
+               area += geometry(_.geometries[i]);
+             }
+
+             return area;
+         }
+       }
+
+       function polygonArea(coords) {
+         var area = 0;
+
+         if (coords && coords.length > 0) {
+           area += Math.abs(ringArea(coords[0]));
+
+           for (var i = 1; i < coords.length; i++) {
+             area -= Math.abs(ringArea(coords[i]));
+           }
+         }
+
+         return area;
+       }
+       /**
+        * Calculate the approximate area of the polygon were it projected onto
+        *     the earth.  Note that this area will be positive if ring is oriented
+        *     clockwise, otherwise it will be negative.
+        *
+        * Reference:
+        * Robert. G. Chamberlain and William H. Duquette, "Some Algorithms for
+        *     Polygons on a Sphere", JPL Publication 07-03, Jet Propulsion
+        *     Laboratory, Pasadena, CA, June 2007 http://trs-new.jpl.nasa.gov/dspace/handle/2014/40409
+        *
+        * Returns:
+        * {float} The approximate signed geodesic area of the polygon in square
+        *     meters.
+        */
+
+
+       function ringArea(coords) {
+         var p1,
+             p2,
+             p3,
+             lowerIndex,
+             middleIndex,
+             upperIndex,
+             i,
+             area = 0,
+             coordsLength = coords.length;
+
+         if (coordsLength > 2) {
+           for (i = 0; i < coordsLength; i++) {
+             if (i === coordsLength - 2) {
+               // i = N-2
+               lowerIndex = coordsLength - 2;
+               middleIndex = coordsLength - 1;
+               upperIndex = 0;
+             } else if (i === coordsLength - 1) {
+               // i = N-1
+               lowerIndex = coordsLength - 1;
+               middleIndex = 0;
+               upperIndex = 1;
+             } else {
+               // i = 0 to N-3
+               lowerIndex = i;
+               middleIndex = i + 1;
+               upperIndex = i + 2;
+             }
+
+             p1 = coords[lowerIndex];
+             p2 = coords[middleIndex];
+             p3 = coords[upperIndex];
+             area += (rad(p3[0]) - rad(p1[0])) * Math.sin(rad(p2[1]));
+           }
+
+           area = area * wgs84.RADIUS * wgs84.RADIUS / 2;
+         }
+
+         return area;
+       }
+
+       function rad(_) {
+         return _ * Math.PI / 180;
+       }
+
+       var inputValidation = {};
+
+       var $$n = _export;
+       var $includes = arrayIncludes.includes;
+       var addToUnscopables$2 = addToUnscopables$6;
+
+       // `Array.prototype.includes` method
+       // https://tc39.es/ecma262/#sec-array.prototype.includes
+       $$n({ target: 'Array', proto: true }, {
+         includes: function includes(el /* , fromIndex = 0 */) {
+           return $includes(this, el, arguments.length > 1 ? arguments[1] : undefined);
+         }
+       });
+
+       // https://tc39.es/ecma262/#sec-array.prototype-@@unscopables
+       addToUnscopables$2('includes');
+
+       var validateCenter$1 = {};
+
+       validateCenter$1.validateCenter = function validateCenter(center) {
+         var validCenterLengths = [2, 3];
+
+         if (!Array.isArray(center) || !validCenterLengths.includes(center.length)) {
+           throw new Error("ERROR! Center has to be an array of length two or three");
+         }
+
+         var _center = _slicedToArray(center, 2),
+             lng = _center[0],
+             lat = _center[1];
+
+         if (typeof lng !== "number" || typeof lat !== "number") {
+           throw new Error("ERROR! Longitude and Latitude has to be numbers but where ".concat(_typeof(lng), " and ").concat(_typeof(lat)));
+         }
+
+         if (lng > 180 || lng < -180) {
+           throw new Error("ERROR! Longitude has to be between -180 and 180 but was ".concat(lng));
+         }
+
+         if (lat > 90 || lat < -90) {
+           throw new Error("ERROR! Latitude has to be between -90 and 90 but was ".concat(lat));
+         }
+       };
+
+       var validateRadius$1 = {};
+
+       validateRadius$1.validateRadius = function validateRadius(radius) {
+         if (typeof radius !== "number") {
+           throw new Error("ERROR! Radius has to be a positive number but was: ".concat(_typeof(radius)));
+         }
+
+         if (radius <= 0) {
+           throw new Error("ERROR! Radius has to be a positive number but was: ".concat(radius));
+         }
+       };
+
+       var validateNumberOfEdges$1 = {};
+
+       validateNumberOfEdges$1.validateNumberOfEdges = function validateNumberOfEdges(numberOfEdges) {
+         if (typeof numberOfEdges !== "number") {
+           var ARGUMENT_TYPE = Array.isArray(numberOfEdges) ? "array" : _typeof(numberOfEdges);
+           throw new Error("ERROR! Number of edges has to be a number but was: ".concat(ARGUMENT_TYPE));
+         }
+
+         if (numberOfEdges < 3) {
+           throw new Error("ERROR! Number of edges has to be at least 3 but was: ".concat(numberOfEdges));
+         }
+       };
+
+       var validateEarthRadius$1 = {};
+
+       validateEarthRadius$1.validateEarthRadius = function validateEarthRadius(earthRadius) {
+         if (typeof earthRadius !== "number") {
+           var ARGUMENT_TYPE = Array.isArray(earthRadius) ? "array" : _typeof(earthRadius);
+           throw new Error("ERROR! Earth radius has to be a number but was: ".concat(ARGUMENT_TYPE));
+         }
+
+         if (earthRadius <= 0) {
+           throw new Error("ERROR! Earth radius has to be a positive number but was: ".concat(earthRadius));
+         }
+       };
+
+       var validateBearing$1 = {};
+
+       validateBearing$1.validateBearing = function validateBearing(bearing) {
+         if (typeof bearing !== "number") {
+           var ARGUMENT_TYPE = Array.isArray(bearing) ? "array" : _typeof(bearing);
+           throw new Error("ERROR! Bearing has to be a number but was: ".concat(ARGUMENT_TYPE));
+         }
+       };
+
+       var validateCenter = validateCenter$1.validateCenter;
+       var validateRadius = validateRadius$1.validateRadius;
+       var validateNumberOfEdges = validateNumberOfEdges$1.validateNumberOfEdges;
+       var validateEarthRadius = validateEarthRadius$1.validateEarthRadius;
+       var validateBearing = validateBearing$1.validateBearing;
+
+       function validateInput$1(_ref) {
+         var center = _ref.center,
+             radius = _ref.radius,
+             numberOfEdges = _ref.numberOfEdges,
+             earthRadius = _ref.earthRadius,
+             bearing = _ref.bearing;
+         validateCenter(center);
+         validateRadius(radius);
+         validateNumberOfEdges(numberOfEdges);
+         validateEarthRadius(earthRadius);
+         validateBearing(bearing);
+       }
+
+       inputValidation.validateCenter = validateCenter;
+       inputValidation.validateRadius = validateRadius;
+       inputValidation.validateNumberOfEdges = validateNumberOfEdges;
+       inputValidation.validateEarthRadius = validateEarthRadius;
+       inputValidation.validateBearing = validateBearing;
+       inputValidation.validateInput = validateInput$1;
+
+       var validateInput = inputValidation.validateInput;
+       var defaultEarthRadius = 6378137; // equatorial Earth radius
+
+       function toRadians(angleInDegrees) {
+         return angleInDegrees * Math.PI / 180;
+       }
+
+       function toDegrees(angleInRadians) {
+         return angleInRadians * 180 / Math.PI;
+       }
+
+       function offset(c1, distance, earthRadius, bearing) {
+         var lat1 = toRadians(c1[1]);
+         var lon1 = toRadians(c1[0]);
+         var dByR = distance / earthRadius;
+         var lat = Math.asin(Math.sin(lat1) * Math.cos(dByR) + Math.cos(lat1) * Math.sin(dByR) * Math.cos(bearing));
+         var lon = lon1 + Math.atan2(Math.sin(bearing) * Math.sin(dByR) * Math.cos(lat1), Math.cos(dByR) - Math.sin(lat1) * Math.sin(lat));
+         return [toDegrees(lon), toDegrees(lat)];
+       }
+
+       var circleToPolygon = function circleToPolygon(center, radius, options) {
+         var n = getNumberOfEdges(options);
+         var earthRadius = getEarthRadius(options);
+         var bearing = getBearing(options);
+         var direction = getDirection(options); // validateInput() throws error on invalid input and do nothing on valid input
+
+         validateInput({
+           center: center,
+           radius: radius,
+           numberOfEdges: n,
+           earthRadius: earthRadius,
+           bearing: bearing
+         });
+         var start = toRadians(bearing);
+         var coordinates = [];
+
+         for (var i = 0; i < n; ++i) {
+           coordinates.push(offset(center, radius, earthRadius, start + direction * 2 * Math.PI * -i / n));
+         }
+
+         coordinates.push(coordinates[0]);
+         return {
+           type: "Polygon",
+           coordinates: [coordinates]
+         };
+       };
+
+       function getNumberOfEdges(options) {
+         if (isUndefinedOrNull(options)) {
+           return 32;
+         } else if (isObjectNotArray(options)) {
+           var numberOfEdges = options.numberOfEdges;
+           return numberOfEdges === undefined ? 32 : numberOfEdges;
+         }
+
+         return options;
+       }
+
+       function getEarthRadius(options) {
+         if (isUndefinedOrNull(options)) {
+           return defaultEarthRadius;
+         } else if (isObjectNotArray(options)) {
+           var earthRadius = options.earthRadius;
+           return earthRadius === undefined ? defaultEarthRadius : earthRadius;
+         }
+
+         return defaultEarthRadius;
+       }
+
+       function getDirection(options) {
+         if (isObjectNotArray(options) && options.rightHandRule) {
+           return -1;
+         }
+
+         return 1;
+       }
+
+       function getBearing(options) {
+         if (isUndefinedOrNull(options)) {
+           return 0;
+         } else if (isObjectNotArray(options)) {
+           var bearing = options.bearing;
+           return bearing === undefined ? 0 : bearing;
+         }
+
+         return 0;
+       }
+
+       function isObjectNotArray(argument) {
+         return argument !== null && _typeof(argument) === "object" && !Array.isArray(argument);
+       }
+
+       function isUndefinedOrNull(argument) {
+         return argument === null || argument === undefined;
+       }
+
+       var $$m = _export;
+
+       // `Number.EPSILON` constant
+       // https://tc39.es/ecma262/#sec-number.epsilon
+       $$m({ target: 'Number', stat: true }, {
+         EPSILON: Math.pow(2, -52)
+       });
+
+       var uncurryThis$8 = functionUncurryThis;
+       var requireObjectCoercible$4 = requireObjectCoercible$e;
+       var toString$5 = toString$k;
+
+       var quot = /"/g;
+       var replace$2 = uncurryThis$8(''.replace);
+
+       // `CreateHTML` abstract operation
+       // https://tc39.es/ecma262/#sec-createhtml
+       var createHtml = function (string, tag, attribute, value) {
+         var S = toString$5(requireObjectCoercible$4(string));
+         var p1 = '<' + tag;
+         if (attribute !== '') p1 += ' ' + attribute + '="' + replace$2(toString$5(value), quot, '&quot;') + '"';
+         return p1 + '>' + S + '</' + tag + '>';
+       };
+
+       var fails$6 = fails$V;
+
+       // check the existence of a method, lowercase
+       // of a tag and escaping quotes in arguments
+       var stringHtmlForced = function (METHOD_NAME) {
+         return fails$6(function () {
+           var test = ''[METHOD_NAME]('"');
+           return test !== test.toLowerCase() || test.split('"').length > 3;
+         });
+       };
+
+       var $$l = _export;
+       var createHTML = createHtml;
+       var forcedStringHTMLMethod = stringHtmlForced;
+
+       // `String.prototype.link` method
+       // https://tc39.es/ecma262/#sec-string.prototype.link
+       $$l({ target: 'String', proto: true, forced: forcedStringHTMLMethod('link') }, {
+         link: function link(url) {
+           return createHTML(this, 'a', 'href', url);
+         }
+       });
+
+       /**
+        * splaytree v3.1.0
+        * Fast Splay tree for Node and browser
+        *
+        * @author Alexander Milevski <info@w8r.name>
+        * @license MIT
+        * @preserve
+        */
+       var Node =
+       /** @class */
+       function () {
+         function Node(key, data) {
+           this.next = null;
+           this.key = key;
+           this.data = data;
+           this.left = null;
+           this.right = null;
+         }
+
+         return Node;
+       }();
+       /* follows "An implementation of top-down splaying"
+        * by D. Sleator <sleator@cs.cmu.edu> March 1992
+        */
+
+
+       function DEFAULT_COMPARE(a, b) {
+         return a > b ? 1 : a < b ? -1 : 0;
+       }
+       /**
+        * Simple top down splay, not requiring i to be in the tree t.
+        */
+
+
+       function splay(i, t, comparator) {
+         var N = new Node(null, null);
+         var l = N;
+         var r = N;
+
+         while (true) {
+           var cmp = comparator(i, t.key); //if (i < t.key) {
+
+           if (cmp < 0) {
+             if (t.left === null) break; //if (i < t.left.key) {
+
+             if (comparator(i, t.left.key) < 0) {
+               var y = t.left;
+               /* rotate right */
+
+               t.left = y.right;
+               y.right = t;
+               t = y;
+               if (t.left === null) break;
+             }
+
+             r.left = t;
+             /* link right */
+
+             r = t;
+             t = t.left; //} else if (i > t.key) {
+           } else if (cmp > 0) {
+             if (t.right === null) break; //if (i > t.right.key) {
+
+             if (comparator(i, t.right.key) > 0) {
+               var y = t.right;
+               /* rotate left */
+
+               t.right = y.left;
+               y.left = t;
+               t = y;
+               if (t.right === null) break;
+             }
+
+             l.right = t;
+             /* link left */
+
+             l = t;
+             t = t.right;
+           } else break;
+         }
+         /* assemble */
+
+
+         l.right = t.left;
+         r.left = t.right;
+         t.left = N.right;
+         t.right = N.left;
+         return t;
+       }
+
+       function insert(i, data, t, comparator) {
+         var node = new Node(i, data);
+
+         if (t === null) {
+           node.left = node.right = null;
+           return node;
+         }
+
+         t = splay(i, t, comparator);
+         var cmp = comparator(i, t.key);
+
+         if (cmp < 0) {
+           node.left = t.left;
+           node.right = t;
+           t.left = null;
+         } else if (cmp >= 0) {
+           node.right = t.right;
+           node.left = t;
+           t.right = null;
+         }
+
+         return node;
+       }
+
+       function split$2(key, v, comparator) {
+         var left = null;
+         var right = null;
+
+         if (v) {
+           v = splay(key, v, comparator);
+           var cmp = comparator(v.key, key);
+
+           if (cmp === 0) {
+             left = v.left;
+             right = v.right;
+           } else if (cmp < 0) {
+             right = v.right;
+             v.right = null;
+             left = v;
+           } else {
+             left = v.left;
+             v.left = null;
+             right = v;
+           }
+         }
+
+         return {
+           left: left,
+           right: right
+         };
+       }
+
+       function merge$3(left, right, comparator) {
+         if (right === null) return left;
+         if (left === null) return right;
+         right = splay(left.key, right, comparator);
+         right.left = left;
+         return right;
+       }
+       /**
+        * Prints level of the tree
+        */
+
+
+       function printRow(root, prefix, isTail, out, printNode) {
+         if (root) {
+           out("" + prefix + (isTail ? '└── ' : '├── ') + printNode(root) + "\n");
+           var indent = prefix + (isTail ? '    ' : '│   ');
+           if (root.left) printRow(root.left, indent, false, out, printNode);
+           if (root.right) printRow(root.right, indent, true, out, printNode);
+         }
+       }
+
+       var Tree =
+       /** @class */
+       function () {
+         function Tree(comparator) {
+           if (comparator === void 0) {
+             comparator = DEFAULT_COMPARE;
+           }
+
+           this._root = null;
+           this._size = 0;
+           this._comparator = comparator;
+         }
+         /**
+          * Inserts a key, allows duplicates
+          */
+
+
+         Tree.prototype.insert = function (key, data) {
+           this._size++;
+           return this._root = insert(key, data, this._root, this._comparator);
+         };
+         /**
+          * Adds a key, if it is not present in the tree
+          */
+
+
+         Tree.prototype.add = function (key, data) {
+           var node = new Node(key, data);
+
+           if (this._root === null) {
+             node.left = node.right = null;
+             this._size++;
+             this._root = node;
+           }
+
+           var comparator = this._comparator;
+           var t = splay(key, this._root, comparator);
+           var cmp = comparator(key, t.key);
+           if (cmp === 0) this._root = t;else {
+             if (cmp < 0) {
+               node.left = t.left;
+               node.right = t;
+               t.left = null;
+             } else if (cmp > 0) {
+               node.right = t.right;
+               node.left = t;
+               t.right = null;
+             }
+
+             this._size++;
+             this._root = node;
+           }
+           return this._root;
+         };
+         /**
+          * @param  {Key} key
+          * @return {Node|null}
+          */
+
+
+         Tree.prototype.remove = function (key) {
+           this._root = this._remove(key, this._root, this._comparator);
+         };
+         /**
+          * Deletes i from the tree if it's there
+          */
+
+
+         Tree.prototype._remove = function (i, t, comparator) {
+           var x;
+           if (t === null) return null;
+           t = splay(i, t, comparator);
+           var cmp = comparator(i, t.key);
+
+           if (cmp === 0) {
+             /* found it */
+             if (t.left === null) {
+               x = t.right;
+             } else {
+               x = splay(i, t.left, comparator);
+               x.right = t.right;
+             }
+
+             this._size--;
+             return x;
+           }
+
+           return t;
+           /* It wasn't there */
+         };
+         /**
+          * Removes and returns the node with smallest key
+          */
+
+
+         Tree.prototype.pop = function () {
+           var node = this._root;
+
+           if (node) {
+             while (node.left) {
+               node = node.left;
+             }
+
+             this._root = splay(node.key, this._root, this._comparator);
+             this._root = this._remove(node.key, this._root, this._comparator);
+             return {
+               key: node.key,
+               data: node.data
+             };
+           }
+
+           return null;
+         };
+         /**
+          * Find without splaying
+          */
+
+
+         Tree.prototype.findStatic = function (key) {
+           var current = this._root;
+           var compare = this._comparator;
+
+           while (current) {
+             var cmp = compare(key, current.key);
+             if (cmp === 0) return current;else if (cmp < 0) current = current.left;else current = current.right;
+           }
+
+           return null;
+         };
+
+         Tree.prototype.find = function (key) {
+           if (this._root) {
+             this._root = splay(key, this._root, this._comparator);
+             if (this._comparator(key, this._root.key) !== 0) return null;
+           }
+
+           return this._root;
+         };
+
+         Tree.prototype.contains = function (key) {
+           var current = this._root;
+           var compare = this._comparator;
+
+           while (current) {
+             var cmp = compare(key, current.key);
+             if (cmp === 0) return true;else if (cmp < 0) current = current.left;else current = current.right;
+           }
+
+           return false;
+         };
+
+         Tree.prototype.forEach = function (visitor, ctx) {
+           var current = this._root;
+           var Q = [];
+           /* Initialize stack s */
+
+           var done = false;
+
+           while (!done) {
+             if (current !== null) {
+               Q.push(current);
+               current = current.left;
+             } else {
+               if (Q.length !== 0) {
+                 current = Q.pop();
+                 visitor.call(ctx, current);
+                 current = current.right;
+               } else done = true;
+             }
+           }
+
+           return this;
+         };
+         /**
+          * Walk key range from `low` to `high`. Stops if `fn` returns a value.
+          */
+
+
+         Tree.prototype.range = function (low, high, fn, ctx) {
+           var Q = [];
+           var compare = this._comparator;
+           var node = this._root;
+           var cmp;
+
+           while (Q.length !== 0 || node) {
+             if (node) {
+               Q.push(node);
+               node = node.left;
+             } else {
+               node = Q.pop();
+               cmp = compare(node.key, high);
+
+               if (cmp > 0) {
+                 break;
+               } else if (compare(node.key, low) >= 0) {
+                 if (fn.call(ctx, node)) return this; // stop if smth is returned
+               }
+
+               node = node.right;
+             }
+           }
+
+           return this;
+         };
+         /**
+          * Returns array of keys
+          */
+
+
+         Tree.prototype.keys = function () {
+           var keys = [];
+           this.forEach(function (_a) {
+             var key = _a.key;
+             return keys.push(key);
+           });
+           return keys;
+         };
+         /**
+          * Returns array of all the data in the nodes
+          */
+
+
+         Tree.prototype.values = function () {
+           var values = [];
+           this.forEach(function (_a) {
+             var data = _a.data;
+             return values.push(data);
+           });
+           return values;
+         };
+
+         Tree.prototype.min = function () {
+           if (this._root) return this.minNode(this._root).key;
+           return null;
+         };
+
+         Tree.prototype.max = function () {
+           if (this._root) return this.maxNode(this._root).key;
+           return null;
+         };
+
+         Tree.prototype.minNode = function (t) {
+           if (t === void 0) {
+             t = this._root;
+           }
+
+           if (t) while (t.left) {
+             t = t.left;
+           }
+           return t;
+         };
+
+         Tree.prototype.maxNode = function (t) {
+           if (t === void 0) {
+             t = this._root;
+           }
+
+           if (t) while (t.right) {
+             t = t.right;
+           }
+           return t;
+         };
+         /**
+          * Returns node at given index
+          */
+
+
+         Tree.prototype.at = function (index) {
+           var current = this._root;
+           var done = false;
+           var i = 0;
+           var Q = [];
+
+           while (!done) {
+             if (current) {
+               Q.push(current);
+               current = current.left;
+             } else {
+               if (Q.length > 0) {
+                 current = Q.pop();
+                 if (i === index) return current;
+                 i++;
+                 current = current.right;
+               } else done = true;
+             }
+           }
+
+           return null;
+         };
+
+         Tree.prototype.next = function (d) {
+           var root = this._root;
+           var successor = null;
+
+           if (d.right) {
+             successor = d.right;
+
+             while (successor.left) {
+               successor = successor.left;
+             }
+
+             return successor;
+           }
+
+           var comparator = this._comparator;
+
+           while (root) {
+             var cmp = comparator(d.key, root.key);
+             if (cmp === 0) break;else if (cmp < 0) {
+               successor = root;
+               root = root.left;
+             } else root = root.right;
+           }
+
+           return successor;
+         };
+
+         Tree.prototype.prev = function (d) {
+           var root = this._root;
+           var predecessor = null;
+
+           if (d.left !== null) {
+             predecessor = d.left;
+
+             while (predecessor.right) {
+               predecessor = predecessor.right;
+             }
+
+             return predecessor;
+           }
+
+           var comparator = this._comparator;
+
+           while (root) {
+             var cmp = comparator(d.key, root.key);
+             if (cmp === 0) break;else if (cmp < 0) root = root.left;else {
+               predecessor = root;
+               root = root.right;
+             }
+           }
+
+           return predecessor;
+         };
+
+         Tree.prototype.clear = function () {
+           this._root = null;
+           this._size = 0;
+           return this;
+         };
+
+         Tree.prototype.toList = function () {
+           return toList(this._root);
+         };
+         /**
+          * Bulk-load items. Both array have to be same size
+          */
+
+
+         Tree.prototype.load = function (keys, values, presort) {
+           if (values === void 0) {
+             values = [];
+           }
+
+           if (presort === void 0) {
+             presort = false;
+           }
+
+           var size = keys.length;
+           var comparator = this._comparator; // sort if needed
+
+           if (presort) sort(keys, values, 0, size - 1, comparator);
+
+           if (this._root === null) {
+             // empty tree
+             this._root = loadRecursive(keys, values, 0, size);
+             this._size = size;
+           } else {
+             // that re-builds the whole tree from two in-order traversals
+             var mergedList = mergeLists(this.toList(), createList(keys, values), comparator);
+             size = this._size + size;
+             this._root = sortedListToBST({
+               head: mergedList
+             }, 0, size);
+           }
+
+           return this;
+         };
+
+         Tree.prototype.isEmpty = function () {
+           return this._root === null;
+         };
+
+         Object.defineProperty(Tree.prototype, "size", {
+           get: function get() {
+             return this._size;
+           },
+           enumerable: true,
+           configurable: true
+         });
+         Object.defineProperty(Tree.prototype, "root", {
+           get: function get() {
+             return this._root;
+           },
+           enumerable: true,
+           configurable: true
+         });
+
+         Tree.prototype.toString = function (printNode) {
+           if (printNode === void 0) {
+             printNode = function printNode(n) {
+               return String(n.key);
+             };
+           }
+
+           var out = [];
+           printRow(this._root, '', true, function (v) {
+             return out.push(v);
+           }, printNode);
+           return out.join('');
+         };
+
+         Tree.prototype.update = function (key, newKey, newData) {
+           var comparator = this._comparator;
+
+           var _a = split$2(key, this._root, comparator),
+               left = _a.left,
+               right = _a.right;
+
+           if (comparator(key, newKey) < 0) {
+             right = insert(newKey, newData, right, comparator);
+           } else {
+             left = insert(newKey, newData, left, comparator);
+           }
+
+           this._root = merge$3(left, right, comparator);
+         };
+
+         Tree.prototype.split = function (key) {
+           return split$2(key, this._root, this._comparator);
+         };
+
+         return Tree;
+       }();
+
+       function loadRecursive(keys, values, start, end) {
+         var size = end - start;
+
+         if (size > 0) {
+           var middle = start + Math.floor(size / 2);
+           var key = keys[middle];
+           var data = values[middle];
+           var node = new Node(key, data);
+           node.left = loadRecursive(keys, values, start, middle);
+           node.right = loadRecursive(keys, values, middle + 1, end);
+           return node;
+         }
+
+         return null;
+       }
+
+       function createList(keys, values) {
+         var head = new Node(null, null);
+         var p = head;
+
+         for (var i = 0; i < keys.length; i++) {
+           p = p.next = new Node(keys[i], values[i]);
+         }
+
+         p.next = null;
+         return head.next;
+       }
+
+       function toList(root) {
+         var current = root;
+         var Q = [];
+         var done = false;
+         var head = new Node(null, null);
+         var p = head;
+
+         while (!done) {
+           if (current) {
+             Q.push(current);
+             current = current.left;
+           } else {
+             if (Q.length > 0) {
+               current = p = p.next = Q.pop();
+               current = current.right;
+             } else done = true;
+           }
+         }
+
+         p.next = null; // that'll work even if the tree was empty
+
+         return head.next;
+       }
+
+       function sortedListToBST(list, start, end) {
+         var size = end - start;
+
+         if (size > 0) {
+           var middle = start + Math.floor(size / 2);
+           var left = sortedListToBST(list, start, middle);
+           var root = list.head;
+           root.left = left;
+           list.head = list.head.next;
+           root.right = sortedListToBST(list, middle + 1, end);
+           return root;
+         }
+
+         return null;
+       }
+
+       function mergeLists(l1, l2, compare) {
+         var head = new Node(null, null); // dummy
+
+         var p = head;
+         var p1 = l1;
+         var p2 = l2;
+
+         while (p1 !== null && p2 !== null) {
+           if (compare(p1.key, p2.key) < 0) {
+             p.next = p1;
+             p1 = p1.next;
+           } else {
+             p.next = p2;
+             p2 = p2.next;
+           }
+
+           p = p.next;
+         }
+
+         if (p1 !== null) {
+           p.next = p1;
+         } else if (p2 !== null) {
+           p.next = p2;
+         }
+
+         return head.next;
+       }
+
+       function sort(keys, values, left, right, compare) {
+         if (left >= right) return;
+         var pivot = keys[left + right >> 1];
+         var i = left - 1;
+         var j = right + 1;
+
+         while (true) {
+           do {
+             i++;
+           } while (compare(keys[i], pivot) < 0);
+
+           do {
+             j--;
+           } while (compare(keys[j], pivot) > 0);
+
+           if (i >= j) break;
+           var tmp = keys[i];
+           keys[i] = keys[j];
+           keys[j] = tmp;
+           tmp = values[i];
+           values[i] = values[j];
+           values[j] = tmp;
+         }
+
+         sort(keys, values, left, j, compare);
+         sort(keys, values, j + 1, right, compare);
+       }
+
+       function _classCallCheck(instance, Constructor) {
+         if (!(instance instanceof Constructor)) {
+           throw new TypeError("Cannot call a class as a function");
+         }
+       }
+
+       function _defineProperties(target, props) {
+         for (var i = 0; i < props.length; i++) {
+           var descriptor = props[i];
+           descriptor.enumerable = descriptor.enumerable || false;
+           descriptor.configurable = true;
+           if ("value" in descriptor) descriptor.writable = true;
+           Object.defineProperty(target, descriptor.key, descriptor);
+         }
+       }
+
+       function _createClass(Constructor, protoProps, staticProps) {
+         if (protoProps) _defineProperties(Constructor.prototype, protoProps);
+         if (staticProps) _defineProperties(Constructor, staticProps);
+         return Constructor;
+       }
+       /**
+        * A bounding box has the format:
+        *
+        *  { ll: { x: xmin, y: ymin }, ur: { x: xmax, y: ymax } }
+        *
+        */
+
+
+       var isInBbox = function isInBbox(bbox, point) {
+         return bbox.ll.x <= point.x && point.x <= bbox.ur.x && bbox.ll.y <= point.y && point.y <= bbox.ur.y;
+       };
+       /* Returns either null, or a bbox (aka an ordered pair of points)
+        * If there is only one point of overlap, a bbox with identical points
+        * will be returned */
+
+
+       var getBboxOverlap = function getBboxOverlap(b1, b2) {
+         // check if the bboxes overlap at all
+         if (b2.ur.x < b1.ll.x || b1.ur.x < b2.ll.x || b2.ur.y < b1.ll.y || b1.ur.y < b2.ll.y) return null; // find the middle two X values
+
+         var lowerX = b1.ll.x < b2.ll.x ? b2.ll.x : b1.ll.x;
+         var upperX = b1.ur.x < b2.ur.x ? b1.ur.x : b2.ur.x; // find the middle two Y values
+
+         var lowerY = b1.ll.y < b2.ll.y ? b2.ll.y : b1.ll.y;
+         var upperY = b1.ur.y < b2.ur.y ? b1.ur.y : b2.ur.y; // put those middle values together to get the overlap
+
+         return {
+           ll: {
+             x: lowerX,
+             y: lowerY
+           },
+           ur: {
+             x: upperX,
+             y: upperY
+           }
+         };
+       };
+       /* Javascript doesn't do integer math. Everything is
+        * floating point with percision Number.EPSILON.
+        *
+        * https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number/EPSILON
+        */
+
+
+       var epsilon = Number.EPSILON; // IE Polyfill
+
+       if (epsilon === undefined) epsilon = Math.pow(2, -52);
+       var EPSILON_SQ = epsilon * epsilon;
+       /* FLP comparator */
+
+       var cmp = function cmp(a, b) {
+         // check if they're both 0
+         if (-epsilon < a && a < epsilon) {
+           if (-epsilon < b && b < epsilon) {
+             return 0;
+           }
+         } // check if they're flp equal
+
+
+         var ab = a - b;
+
+         if (ab * ab < EPSILON_SQ * a * b) {
+           return 0;
+         } // normal comparison
+
+
+         return a < b ? -1 : 1;
+       };
+       /**
+        * This class rounds incoming values sufficiently so that
+        * floating points problems are, for the most part, avoided.
+        *
+        * Incoming points are have their x & y values tested against
+        * all previously seen x & y values. If either is 'too close'
+        * to a previously seen value, it's value is 'snapped' to the
+        * previously seen value.
+        *
+        * All points should be rounded by this class before being
+        * stored in any data structures in the rest of this algorithm.
+        */
+
+
+       var PtRounder = /*#__PURE__*/function () {
+         function PtRounder() {
+           _classCallCheck(this, PtRounder);
+
+           this.reset();
+         }
+
+         _createClass(PtRounder, [{
+           key: "reset",
+           value: function reset() {
+             this.xRounder = new CoordRounder();
+             this.yRounder = new CoordRounder();
+           }
+         }, {
+           key: "round",
+           value: function round(x, y) {
+             return {
+               x: this.xRounder.round(x),
+               y: this.yRounder.round(y)
+             };
+           }
+         }]);
+
+         return PtRounder;
+       }();
+
+       var CoordRounder = /*#__PURE__*/function () {
+         function CoordRounder() {
+           _classCallCheck(this, CoordRounder);
+
+           this.tree = new Tree(); // preseed with 0 so we don't end up with values < Number.EPSILON
+
+           this.round(0);
+         } // Note: this can rounds input values backwards or forwards.
+         //       You might ask, why not restrict this to just rounding
+         //       forwards? Wouldn't that allow left endpoints to always
+         //       remain left endpoints during splitting (never change to
+         //       right). No - it wouldn't, because we snap intersections
+         //       to endpoints (to establish independence from the segment
+         //       angle for t-intersections).
+
+
+         _createClass(CoordRounder, [{
+           key: "round",
+           value: function round(coord) {
+             var node = this.tree.add(coord);
+             var prevNode = this.tree.prev(node);
+
+             if (prevNode !== null && cmp(node.key, prevNode.key) === 0) {
+               this.tree.remove(coord);
+               return prevNode.key;
+             }
+
+             var nextNode = this.tree.next(node);
+
+             if (nextNode !== null && cmp(node.key, nextNode.key) === 0) {
+               this.tree.remove(coord);
+               return nextNode.key;
+             }
+
+             return coord;
+           }
+         }]);
+
+         return CoordRounder;
+       }(); // singleton available by import
+
+
+       var rounder = new PtRounder();
+       /* Cross Product of two vectors with first point at origin */
+
+       var crossProduct = function crossProduct(a, b) {
+         return a.x * b.y - a.y * b.x;
+       };
+       /* Dot Product of two vectors with first point at origin */
+
+
+       var dotProduct = function dotProduct(a, b) {
+         return a.x * b.x + a.y * b.y;
+       };
+       /* Comparator for two vectors with same starting point */
+
+
+       var compareVectorAngles = function compareVectorAngles(basePt, endPt1, endPt2) {
+         var v1 = {
+           x: endPt1.x - basePt.x,
+           y: endPt1.y - basePt.y
+         };
+         var v2 = {
+           x: endPt2.x - basePt.x,
+           y: endPt2.y - basePt.y
+         };
+         var kross = crossProduct(v1, v2);
+         return cmp(kross, 0);
+       };
+
+       var length = function length(v) {
+         return Math.sqrt(dotProduct(v, v));
+       };
+       /* Get the sine of the angle from pShared -> pAngle to pShaed -> pBase */
+
+
+       var sineOfAngle = function sineOfAngle(pShared, pBase, pAngle) {
+         var vBase = {
+           x: pBase.x - pShared.x,
+           y: pBase.y - pShared.y
+         };
+         var vAngle = {
+           x: pAngle.x - pShared.x,
+           y: pAngle.y - pShared.y
+         };
+         return crossProduct(vAngle, vBase) / length(vAngle) / length(vBase);
+       };
+       /* Get the cosine of the angle from pShared -> pAngle to pShaed -> pBase */
+
+
+       var cosineOfAngle = function cosineOfAngle(pShared, pBase, pAngle) {
+         var vBase = {
+           x: pBase.x - pShared.x,
+           y: pBase.y - pShared.y
+         };
+         var vAngle = {
+           x: pAngle.x - pShared.x,
+           y: pAngle.y - pShared.y
+         };
+         return dotProduct(vAngle, vBase) / length(vAngle) / length(vBase);
+       };
+       /* Get the x coordinate where the given line (defined by a point and vector)
+        * crosses the horizontal line with the given y coordiante.
+        * In the case of parrallel lines (including overlapping ones) returns null. */
+
+
+       var horizontalIntersection = function horizontalIntersection(pt, v, y) {
+         if (v.y === 0) return null;
+         return {
+           x: pt.x + v.x / v.y * (y - pt.y),
+           y: y
+         };
+       };
+       /* Get the y coordinate where the given line (defined by a point and vector)
+        * crosses the vertical line with the given x coordiante.
+        * In the case of parrallel lines (including overlapping ones) returns null. */
+
+
+       var verticalIntersection = function verticalIntersection(pt, v, x) {
+         if (v.x === 0) return null;
+         return {
+           x: x,
+           y: pt.y + v.y / v.x * (x - pt.x)
+         };
+       };
+       /* Get the intersection of two lines, each defined by a base point and a vector.
+        * In the case of parrallel lines (including overlapping ones) returns null. */
+
+
+       var intersection = function intersection(pt1, v1, pt2, v2) {
+         // take some shortcuts for vertical and horizontal lines
+         // this also ensures we don't calculate an intersection and then discover
+         // it's actually outside the bounding box of the line
+         if (v1.x === 0) return verticalIntersection(pt2, v2, pt1.x);
+         if (v2.x === 0) return verticalIntersection(pt1, v1, pt2.x);
+         if (v1.y === 0) return horizontalIntersection(pt2, v2, pt1.y);
+         if (v2.y === 0) return horizontalIntersection(pt1, v1, pt2.y); // General case for non-overlapping segments.
+         // This algorithm is based on Schneider and Eberly.
+         // http://www.cimec.org.ar/~ncalvo/Schneider_Eberly.pdf - pg 244
+
+         var kross = crossProduct(v1, v2);
+         if (kross == 0) return null;
+         var ve = {
+           x: pt2.x - pt1.x,
+           y: pt2.y - pt1.y
+         };
+         var d1 = crossProduct(ve, v1) / kross;
+         var d2 = crossProduct(ve, v2) / kross; // take the average of the two calculations to minimize rounding error
+
+         var x1 = pt1.x + d2 * v1.x,
+             x2 = pt2.x + d1 * v2.x;
+         var y1 = pt1.y + d2 * v1.y,
+             y2 = pt2.y + d1 * v2.y;
+         var x = (x1 + x2) / 2;
+         var y = (y1 + y2) / 2;
+         return {
+           x: x,
+           y: y
+         };
+       };
+
+       var SweepEvent = /*#__PURE__*/function () {
+         _createClass(SweepEvent, null, [{
+           key: "compare",
+           // for ordering sweep events in the sweep event queue
+           value: function compare(a, b) {
+             // favor event with a point that the sweep line hits first
+             var ptCmp = SweepEvent.comparePoints(a.point, b.point);
+             if (ptCmp !== 0) return ptCmp; // the points are the same, so link them if needed
+
+             if (a.point !== b.point) a.link(b); // favor right events over left
+
+             if (a.isLeft !== b.isLeft) return a.isLeft ? 1 : -1; // we have two matching left or right endpoints
+             // ordering of this case is the same as for their segments
+
+             return Segment.compare(a.segment, b.segment);
+           } // for ordering points in sweep line order
+
+         }, {
+           key: "comparePoints",
+           value: function comparePoints(aPt, bPt) {
+             if (aPt.x < bPt.x) return -1;
+             if (aPt.x > bPt.x) return 1;
+             if (aPt.y < bPt.y) return -1;
+             if (aPt.y > bPt.y) return 1;
+             return 0;
+           } // Warning: 'point' input will be modified and re-used (for performance)
+
+         }]);
+
+         function SweepEvent(point, isLeft) {
+           _classCallCheck(this, SweepEvent);
+
+           if (point.events === undefined) point.events = [this];else point.events.push(this);
+           this.point = point;
+           this.isLeft = isLeft; // this.segment, this.otherSE set by factory
+         }
+
+         _createClass(SweepEvent, [{
+           key: "link",
+           value: function link(other) {
+             if (other.point === this.point) {
+               throw new Error('Tried to link already linked events');
+             }
+
+             var otherEvents = other.point.events;
+
+             for (var i = 0, iMax = otherEvents.length; i < iMax; i++) {
+               var evt = otherEvents[i];
+               this.point.events.push(evt);
+               evt.point = this.point;
+             }
+
+             this.checkForConsuming();
+           }
+           /* Do a pass over our linked events and check to see if any pair
+            * of segments match, and should be consumed. */
+
+         }, {
+           key: "checkForConsuming",
+           value: function checkForConsuming() {
+             // FIXME: The loops in this method run O(n^2) => no good.
+             //        Maintain little ordered sweep event trees?
+             //        Can we maintaining an ordering that avoids the need
+             //        for the re-sorting with getLeftmostComparator in geom-out?
+             // Compare each pair of events to see if other events also match
+             var numEvents = this.point.events.length;
+
+             for (var i = 0; i < numEvents; i++) {
+               var evt1 = this.point.events[i];
+               if (evt1.segment.consumedBy !== undefined) continue;
+
+               for (var j = i + 1; j < numEvents; j++) {
+                 var evt2 = this.point.events[j];
+                 if (evt2.consumedBy !== undefined) continue;
+                 if (evt1.otherSE.point.events !== evt2.otherSE.point.events) continue;
+                 evt1.segment.consume(evt2.segment);
+               }
+             }
+           }
+         }, {
+           key: "getAvailableLinkedEvents",
+           value: function getAvailableLinkedEvents() {
+             // point.events is always of length 2 or greater
+             var events = [];
+
+             for (var i = 0, iMax = this.point.events.length; i < iMax; i++) {
+               var evt = this.point.events[i];
+
+               if (evt !== this && !evt.segment.ringOut && evt.segment.isInResult()) {
+                 events.push(evt);
+               }
+             }
+
+             return events;
+           }
+           /**
+            * Returns a comparator function for sorting linked events that will
+            * favor the event that will give us the smallest left-side angle.
+            * All ring construction starts as low as possible heading to the right,
+            * so by always turning left as sharp as possible we'll get polygons
+            * without uncessary loops & holes.
+            *
+            * The comparator function has a compute cache such that it avoids
+            * re-computing already-computed values.
+            */
+
+         }, {
+           key: "getLeftmostComparator",
+           value: function getLeftmostComparator(baseEvent) {
+             var _this = this;
+
+             var cache = new Map();
+
+             var fillCache = function fillCache(linkedEvent) {
+               var nextEvent = linkedEvent.otherSE;
+               cache.set(linkedEvent, {
+                 sine: sineOfAngle(_this.point, baseEvent.point, nextEvent.point),
+                 cosine: cosineOfAngle(_this.point, baseEvent.point, nextEvent.point)
+               });
+             };
+
+             return function (a, b) {
+               if (!cache.has(a)) fillCache(a);
+               if (!cache.has(b)) fillCache(b);
+
+               var _cache$get = cache.get(a),
+                   asine = _cache$get.sine,
+                   acosine = _cache$get.cosine;
+
+               var _cache$get2 = cache.get(b),
+                   bsine = _cache$get2.sine,
+                   bcosine = _cache$get2.cosine; // both on or above x-axis
+
+
+               if (asine >= 0 && bsine >= 0) {
+                 if (acosine < bcosine) return 1;
+                 if (acosine > bcosine) return -1;
+                 return 0;
+               } // both below x-axis
+
+
+               if (asine < 0 && bsine < 0) {
+                 if (acosine < bcosine) return -1;
+                 if (acosine > bcosine) return 1;
+                 return 0;
+               } // one above x-axis, one below
+
+
+               if (bsine < asine) return -1;
+               if (bsine > asine) return 1;
+               return 0;
+             };
+           }
+         }]);
+
+         return SweepEvent;
+       }(); // segments and sweep events when all else is identical
+
+
+       var segmentId = 0;
+
+       var Segment = /*#__PURE__*/function () {
+         _createClass(Segment, null, [{
+           key: "compare",
+
+           /* This compare() function is for ordering segments in the sweep
+            * line tree, and does so according to the following criteria:
+            *
+            * Consider the vertical line that lies an infinestimal step to the
+            * right of the right-more of the two left endpoints of the input
+            * segments. Imagine slowly moving a point up from negative infinity
+            * in the increasing y direction. Which of the two segments will that
+            * point intersect first? That segment comes 'before' the other one.
+            *
+            * If neither segment would be intersected by such a line, (if one
+            * or more of the segments are vertical) then the line to be considered
+            * is directly on the right-more of the two left inputs.
+            */
+           value: function compare(a, b) {
+             var alx = a.leftSE.point.x;
+             var blx = b.leftSE.point.x;
+             var arx = a.rightSE.point.x;
+             var brx = b.rightSE.point.x; // check if they're even in the same vertical plane
+
+             if (brx < alx) return 1;
+             if (arx < blx) return -1;
+             var aly = a.leftSE.point.y;
+             var bly = b.leftSE.point.y;
+             var ary = a.rightSE.point.y;
+             var bry = b.rightSE.point.y; // is left endpoint of segment B the right-more?
+
+             if (alx < blx) {
+               // are the two segments in the same horizontal plane?
+               if (bly < aly && bly < ary) return 1;
+               if (bly > aly && bly > ary) return -1; // is the B left endpoint colinear to segment A?
+
+               var aCmpBLeft = a.comparePoint(b.leftSE.point);
+               if (aCmpBLeft < 0) return 1;
+               if (aCmpBLeft > 0) return -1; // is the A right endpoint colinear to segment B ?
+
+               var bCmpARight = b.comparePoint(a.rightSE.point);
+               if (bCmpARight !== 0) return bCmpARight; // colinear segments, consider the one with left-more
+               // left endpoint to be first (arbitrary?)
+
+               return -1;
+             } // is left endpoint of segment A the right-more?
+
+
+             if (alx > blx) {
+               if (aly < bly && aly < bry) return -1;
+               if (aly > bly && aly > bry) return 1; // is the A left endpoint colinear to segment B?
+
+               var bCmpALeft = b.comparePoint(a.leftSE.point);
+               if (bCmpALeft !== 0) return bCmpALeft; // is the B right endpoint colinear to segment A?
+
+               var aCmpBRight = a.comparePoint(b.rightSE.point);
+               if (aCmpBRight < 0) return 1;
+               if (aCmpBRight > 0) return -1; // colinear segments, consider the one with left-more
+               // left endpoint to be first (arbitrary?)
+
+               return 1;
+             } // if we get here, the two left endpoints are in the same
+             // vertical plane, ie alx === blx
+             // consider the lower left-endpoint to come first
+
+
+             if (aly < bly) return -1;
+             if (aly > bly) return 1; // left endpoints are identical
+             // check for colinearity by using the left-more right endpoint
+             // is the A right endpoint more left-more?
+
+             if (arx < brx) {
+               var _bCmpARight = b.comparePoint(a.rightSE.point);
+
+               if (_bCmpARight !== 0) return _bCmpARight;
+             } // is the B right endpoint more left-more?
+
+
+             if (arx > brx) {
+               var _aCmpBRight = a.comparePoint(b.rightSE.point);
+
+               if (_aCmpBRight < 0) return 1;
+               if (_aCmpBRight > 0) return -1;
+             }
+
+             if (arx !== brx) {
+               // are these two [almost] vertical segments with opposite orientation?
+               // if so, the one with the lower right endpoint comes first
+               var ay = ary - aly;
+               var ax = arx - alx;
+               var by = bry - bly;
+               var bx = brx - blx;
+               if (ay > ax && by < bx) return 1;
+               if (ay < ax && by > bx) return -1;
+             } // we have colinear segments with matching orientation
+             // consider the one with more left-more right endpoint to be first
+
+
+             if (arx > brx) return 1;
+             if (arx < brx) return -1; // if we get here, two two right endpoints are in the same
+             // vertical plane, ie arx === brx
+             // consider the lower right-endpoint to come first
+
+             if (ary < bry) return -1;
+             if (ary > bry) return 1; // right endpoints identical as well, so the segments are idential
+             // fall back on creation order as consistent tie-breaker
+
+             if (a.id < b.id) return -1;
+             if (a.id > b.id) return 1; // identical segment, ie a === b
+
+             return 0;
+           }
+           /* Warning: a reference to ringWindings input will be stored,
+            *  and possibly will be later modified */
+
+         }]);
+
+         function Segment(leftSE, rightSE, rings, windings) {
+           _classCallCheck(this, Segment);
+
+           this.id = ++segmentId;
+           this.leftSE = leftSE;
+           leftSE.segment = this;
+           leftSE.otherSE = rightSE;
+           this.rightSE = rightSE;
+           rightSE.segment = this;
+           rightSE.otherSE = leftSE;
+           this.rings = rings;
+           this.windings = windings; // left unset for performance, set later in algorithm
+           // this.ringOut, this.consumedBy, this.prev
+         }
+
+         _createClass(Segment, [{
+           key: "replaceRightSE",
+
+           /* When a segment is split, the rightSE is replaced with a new sweep event */
+           value: function replaceRightSE(newRightSE) {
+             this.rightSE = newRightSE;
+             this.rightSE.segment = this;
+             this.rightSE.otherSE = this.leftSE;
+             this.leftSE.otherSE = this.rightSE;
+           }
+         }, {
+           key: "bbox",
+           value: function bbox() {
+             var y1 = this.leftSE.point.y;
+             var y2 = this.rightSE.point.y;
+             return {
+               ll: {
+                 x: this.leftSE.point.x,
+                 y: y1 < y2 ? y1 : y2
+               },
+               ur: {
+                 x: this.rightSE.point.x,
+                 y: y1 > y2 ? y1 : y2
+               }
+             };
+           }
+           /* A vector from the left point to the right */
+
+         }, {
+           key: "vector",
+           value: function vector() {
+             return {
+               x: this.rightSE.point.x - this.leftSE.point.x,
+               y: this.rightSE.point.y - this.leftSE.point.y
+             };
+           }
+         }, {
+           key: "isAnEndpoint",
+           value: function isAnEndpoint(pt) {
+             return pt.x === this.leftSE.point.x && pt.y === this.leftSE.point.y || pt.x === this.rightSE.point.x && pt.y === this.rightSE.point.y;
+           }
+           /* Compare this segment with a point.
+            *
+            * A point P is considered to be colinear to a segment if there
+            * exists a distance D such that if we travel along the segment
+            * from one * endpoint towards the other a distance D, we find
+            * ourselves at point P.
+            *
+            * Return value indicates:
+            *
+            *   1: point lies above the segment (to the left of vertical)
+            *   0: point is colinear to segment
+            *  -1: point lies below the segment (to the right of vertical)
+            */
+
+         }, {
+           key: "comparePoint",
+           value: function comparePoint(point) {
+             if (this.isAnEndpoint(point)) return 0;
+             var lPt = this.leftSE.point;
+             var rPt = this.rightSE.point;
+             var v = this.vector(); // Exactly vertical segments.
+
+             if (lPt.x === rPt.x) {
+               if (point.x === lPt.x) return 0;
+               return point.x < lPt.x ? 1 : -1;
+             } // Nearly vertical segments with an intersection.
+             // Check to see where a point on the line with matching Y coordinate is.
+
+
+             var yDist = (point.y - lPt.y) / v.y;
+             var xFromYDist = lPt.x + yDist * v.x;
+             if (point.x === xFromYDist) return 0; // General case.
+             // Check to see where a point on the line with matching X coordinate is.
+
+             var xDist = (point.x - lPt.x) / v.x;
+             var yFromXDist = lPt.y + xDist * v.y;
+             if (point.y === yFromXDist) return 0;
+             return point.y < yFromXDist ? -1 : 1;
+           }
+           /**
+            * Given another segment, returns the first non-trivial intersection
+            * between the two segments (in terms of sweep line ordering), if it exists.
+            *
+            * A 'non-trivial' intersection is one that will cause one or both of the
+            * segments to be split(). As such, 'trivial' vs. 'non-trivial' intersection:
+            *
+            *   * endpoint of segA with endpoint of segB --> trivial
+            *   * endpoint of segA with point along segB --> non-trivial
+            *   * endpoint of segB with point along segA --> non-trivial
+            *   * point along segA with point along segB --> non-trivial
+            *
+            * If no non-trivial intersection exists, return null
+            * Else, return null.
+            */
+
+         }, {
+           key: "getIntersection",
+           value: function getIntersection(other) {
+             // If bboxes don't overlap, there can't be any intersections
+             var tBbox = this.bbox();
+             var oBbox = other.bbox();
+             var bboxOverlap = getBboxOverlap(tBbox, oBbox);
+             if (bboxOverlap === null) return null; // We first check to see if the endpoints can be considered intersections.
+             // This will 'snap' intersections to endpoints if possible, and will
+             // handle cases of colinearity.
+
+             var tlp = this.leftSE.point;
+             var trp = this.rightSE.point;
+             var olp = other.leftSE.point;
+             var orp = other.rightSE.point; // does each endpoint touch the other segment?
+             // note that we restrict the 'touching' definition to only allow segments
+             // to touch endpoints that lie forward from where we are in the sweep line pass
+
+             var touchesOtherLSE = isInBbox(tBbox, olp) && this.comparePoint(olp) === 0;
+             var touchesThisLSE = isInBbox(oBbox, tlp) && other.comparePoint(tlp) === 0;
+             var touchesOtherRSE = isInBbox(tBbox, orp) && this.comparePoint(orp) === 0;
+             var touchesThisRSE = isInBbox(oBbox, trp) && other.comparePoint(trp) === 0; // do left endpoints match?
+
+             if (touchesThisLSE && touchesOtherLSE) {
+               // these two cases are for colinear segments with matching left
+               // endpoints, and one segment being longer than the other
+               if (touchesThisRSE && !touchesOtherRSE) return trp;
+               if (!touchesThisRSE && touchesOtherRSE) return orp; // either the two segments match exactly (two trival intersections)
+               // or just on their left endpoint (one trivial intersection
+
+               return null;
+             } // does this left endpoint matches (other doesn't)
+
+
+             if (touchesThisLSE) {
+               // check for segments that just intersect on opposing endpoints
+               if (touchesOtherRSE) {
+                 if (tlp.x === orp.x && tlp.y === orp.y) return null;
+               } // t-intersection on left endpoint
+
+
+               return tlp;
+             } // does other left endpoint matches (this doesn't)
+
+
+             if (touchesOtherLSE) {
+               // check for segments that just intersect on opposing endpoints
+               if (touchesThisRSE) {
+                 if (trp.x === olp.x && trp.y === olp.y) return null;
+               } // t-intersection on left endpoint
+
+
+               return olp;
+             } // trivial intersection on right endpoints
+
+
+             if (touchesThisRSE && touchesOtherRSE) return null; // t-intersections on just one right endpoint
+
+             if (touchesThisRSE) return trp;
+             if (touchesOtherRSE) return orp; // None of our endpoints intersect. Look for a general intersection between
+             // infinite lines laid over the segments
+
+             var pt = intersection(tlp, this.vector(), olp, other.vector()); // are the segments parrallel? Note that if they were colinear with overlap,
+             // they would have an endpoint intersection and that case was already handled above
+
+             if (pt === null) return null; // is the intersection found between the lines not on the segments?
+
+             if (!isInBbox(bboxOverlap, pt)) return null; // round the the computed point if needed
+
+             return rounder.round(pt.x, pt.y);
+           }
+           /**
+            * Split the given segment into multiple segments on the given points.
+            *  * Each existing segment will retain its leftSE and a new rightSE will be
+            *    generated for it.
+            *  * A new segment will be generated which will adopt the original segment's
+            *    rightSE, and a new leftSE will be generated for it.
+            *  * If there are more than two points given to split on, new segments
+            *    in the middle will be generated with new leftSE and rightSE's.
+            *  * An array of the newly generated SweepEvents will be returned.
+            *
+            * Warning: input array of points is modified
+            */
+
+         }, {
+           key: "split",
+           value: function split(point) {
+             var newEvents = [];
+             var alreadyLinked = point.events !== undefined;
+             var newLeftSE = new SweepEvent(point, true);
+             var newRightSE = new SweepEvent(point, false);
+             var oldRightSE = this.rightSE;
+             this.replaceRightSE(newRightSE);
+             newEvents.push(newRightSE);
+             newEvents.push(newLeftSE);
+             var newSeg = new Segment(newLeftSE, oldRightSE, this.rings.slice(), this.windings.slice()); // when splitting a nearly vertical downward-facing segment,
+             // sometimes one of the resulting new segments is vertical, in which
+             // case its left and right events may need to be swapped
+
+             if (SweepEvent.comparePoints(newSeg.leftSE.point, newSeg.rightSE.point) > 0) {
+               newSeg.swapEvents();
+             }
+
+             if (SweepEvent.comparePoints(this.leftSE.point, this.rightSE.point) > 0) {
+               this.swapEvents();
+             } // in the point we just used to create new sweep events with was already
+             // linked to other events, we need to check if either of the affected
+             // segments should be consumed
+
+
+             if (alreadyLinked) {
+               newLeftSE.checkForConsuming();
+               newRightSE.checkForConsuming();
+             }
+
+             return newEvents;
+           }
+           /* Swap which event is left and right */
+
+         }, {
+           key: "swapEvents",
+           value: function swapEvents() {
+             var tmpEvt = this.rightSE;
+             this.rightSE = this.leftSE;
+             this.leftSE = tmpEvt;
+             this.leftSE.isLeft = true;
+             this.rightSE.isLeft = false;
+
+             for (var i = 0, iMax = this.windings.length; i < iMax; i++) {
+               this.windings[i] *= -1;
+             }
+           }
+           /* Consume another segment. We take their rings under our wing
+            * and mark them as consumed. Use for perfectly overlapping segments */
+
+         }, {
+           key: "consume",
+           value: function consume(other) {
+             var consumer = this;
+             var consumee = other;
+
+             while (consumer.consumedBy) {
+               consumer = consumer.consumedBy;
+             }
+
+             while (consumee.consumedBy) {
+               consumee = consumee.consumedBy;
+             }
+
+             var cmp = Segment.compare(consumer, consumee);
+             if (cmp === 0) return; // already consumed
+             // the winner of the consumption is the earlier segment
+             // according to sweep line ordering
+
+             if (cmp > 0) {
+               var tmp = consumer;
+               consumer = consumee;
+               consumee = tmp;
+             } // make sure a segment doesn't consume it's prev
+
+
+             if (consumer.prev === consumee) {
+               var _tmp = consumer;
+               consumer = consumee;
+               consumee = _tmp;
+             }
+
+             for (var i = 0, iMax = consumee.rings.length; i < iMax; i++) {
+               var ring = consumee.rings[i];
+               var winding = consumee.windings[i];
+               var index = consumer.rings.indexOf(ring);
+
+               if (index === -1) {
+                 consumer.rings.push(ring);
+                 consumer.windings.push(winding);
+               } else consumer.windings[index] += winding;
+             }
+
+             consumee.rings = null;
+             consumee.windings = null;
+             consumee.consumedBy = consumer; // mark sweep events consumed as to maintain ordering in sweep event queue
+
+             consumee.leftSE.consumedBy = consumer.leftSE;
+             consumee.rightSE.consumedBy = consumer.rightSE;
+           }
+           /* The first segment previous segment chain that is in the result */
+
+         }, {
+           key: "prevInResult",
+           value: function prevInResult() {
+             if (this._prevInResult !== undefined) return this._prevInResult;
+             if (!this.prev) this._prevInResult = null;else if (this.prev.isInResult()) this._prevInResult = this.prev;else this._prevInResult = this.prev.prevInResult();
+             return this._prevInResult;
+           }
+         }, {
+           key: "beforeState",
+           value: function beforeState() {
+             if (this._beforeState !== undefined) return this._beforeState;
+             if (!this.prev) this._beforeState = {
+               rings: [],
+               windings: [],
+               multiPolys: []
+             };else {
+               var seg = this.prev.consumedBy || this.prev;
+               this._beforeState = seg.afterState();
+             }
+             return this._beforeState;
+           }
+         }, {
+           key: "afterState",
+           value: function afterState() {
+             if (this._afterState !== undefined) return this._afterState;
+             var beforeState = this.beforeState();
+             this._afterState = {
+               rings: beforeState.rings.slice(0),
+               windings: beforeState.windings.slice(0),
+               multiPolys: []
+             };
+             var ringsAfter = this._afterState.rings;
+             var windingsAfter = this._afterState.windings;
+             var mpsAfter = this._afterState.multiPolys; // calculate ringsAfter, windingsAfter
+
+             for (var i = 0, iMax = this.rings.length; i < iMax; i++) {
+               var ring = this.rings[i];
+               var winding = this.windings[i];
+               var index = ringsAfter.indexOf(ring);
+
+               if (index === -1) {
+                 ringsAfter.push(ring);
+                 windingsAfter.push(winding);
+               } else windingsAfter[index] += winding;
+             } // calcualte polysAfter
+
+
+             var polysAfter = [];
+             var polysExclude = [];
+
+             for (var _i = 0, _iMax = ringsAfter.length; _i < _iMax; _i++) {
+               if (windingsAfter[_i] === 0) continue; // non-zero rule
+
+               var _ring = ringsAfter[_i];
+               var poly = _ring.poly;
+               if (polysExclude.indexOf(poly) !== -1) continue;
+               if (_ring.isExterior) polysAfter.push(poly);else {
+                 if (polysExclude.indexOf(poly) === -1) polysExclude.push(poly);
+
+                 var _index = polysAfter.indexOf(_ring.poly);
+
+                 if (_index !== -1) polysAfter.splice(_index, 1);
+               }
+             } // calculate multiPolysAfter
+
+
+             for (var _i2 = 0, _iMax2 = polysAfter.length; _i2 < _iMax2; _i2++) {
+               var mp = polysAfter[_i2].multiPoly;
+               if (mpsAfter.indexOf(mp) === -1) mpsAfter.push(mp);
+             }
+
+             return this._afterState;
+           }
+           /* Is this segment part of the final result? */
+
+         }, {
+           key: "isInResult",
+           value: function isInResult() {
+             // if we've been consumed, we're not in the result
+             if (this.consumedBy) return false;
+             if (this._isInResult !== undefined) return this._isInResult;
+             var mpsBefore = this.beforeState().multiPolys;
+             var mpsAfter = this.afterState().multiPolys;
+
+             switch (operation.type) {
+               case 'union':
+                 {
+                   // UNION - included iff:
+                   //  * On one side of us there is 0 poly interiors AND
+                   //  * On the other side there is 1 or more.
+                   var noBefores = mpsBefore.length === 0;
+                   var noAfters = mpsAfter.length === 0;
+                   this._isInResult = noBefores !== noAfters;
+                   break;
+                 }
+
+               case 'intersection':
+                 {
+                   // INTERSECTION - included iff:
+                   //  * on one side of us all multipolys are rep. with poly interiors AND
+                   //  * on the other side of us, not all multipolys are repsented
+                   //    with poly interiors
+                   var least;
+                   var most;
+
+                   if (mpsBefore.length < mpsAfter.length) {
+                     least = mpsBefore.length;
+                     most = mpsAfter.length;
+                   } else {
+                     least = mpsAfter.length;
+                     most = mpsBefore.length;
+                   }
+
+                   this._isInResult = most === operation.numMultiPolys && least < most;
+                   break;
+                 }
+
+               case 'xor':
+                 {
+                   // XOR - included iff:
+                   //  * the difference between the number of multipolys represented
+                   //    with poly interiors on our two sides is an odd number
+                   var diff = Math.abs(mpsBefore.length - mpsAfter.length);
+                   this._isInResult = diff % 2 === 1;
+                   break;
+                 }
+
+               case 'difference':
+                 {
+                   // DIFFERENCE included iff:
+                   //  * on exactly one side, we have just the subject
+                   var isJustSubject = function isJustSubject(mps) {
+                     return mps.length === 1 && mps[0].isSubject;
+                   };
+
+                   this._isInResult = isJustSubject(mpsBefore) !== isJustSubject(mpsAfter);
+                   break;
+                 }
+
+               default:
+                 throw new Error("Unrecognized operation type found ".concat(operation.type));
+             }
+
+             return this._isInResult;
+           }
+         }], [{
+           key: "fromRing",
+           value: function fromRing(pt1, pt2, ring) {
+             var leftPt, rightPt, winding; // ordering the two points according to sweep line ordering
+
+             var cmpPts = SweepEvent.comparePoints(pt1, pt2);
+
+             if (cmpPts < 0) {
+               leftPt = pt1;
+               rightPt = pt2;
+               winding = 1;
+             } else if (cmpPts > 0) {
+               leftPt = pt2;
+               rightPt = pt1;
+               winding = -1;
+             } else throw new Error("Tried to create degenerate segment at [".concat(pt1.x, ", ").concat(pt1.y, "]"));
+
+             var leftSE = new SweepEvent(leftPt, true);
+             var rightSE = new SweepEvent(rightPt, false);
+             return new Segment(leftSE, rightSE, [ring], [winding]);
+           }
+         }]);
+
+         return Segment;
+       }();
+
+       var RingIn = /*#__PURE__*/function () {
+         function RingIn(geomRing, poly, isExterior) {
+           _classCallCheck(this, RingIn);
+
+           if (!Array.isArray(geomRing) || geomRing.length === 0) {
+             throw new Error('Input geometry is not a valid Polygon or MultiPolygon');
+           }
+
+           this.poly = poly;
+           this.isExterior = isExterior;
+           this.segments = [];
+
+           if (typeof geomRing[0][0] !== 'number' || typeof geomRing[0][1] !== 'number') {
+             throw new Error('Input geometry is not a valid Polygon or MultiPolygon');
+           }
+
+           var firstPoint = rounder.round(geomRing[0][0], geomRing[0][1]);
+           this.bbox = {
+             ll: {
+               x: firstPoint.x,
+               y: firstPoint.y
+             },
+             ur: {
+               x: firstPoint.x,
+               y: firstPoint.y
+             }
+           };
+           var prevPoint = firstPoint;
+
+           for (var i = 1, iMax = geomRing.length; i < iMax; i++) {
+             if (typeof geomRing[i][0] !== 'number' || typeof geomRing[i][1] !== 'number') {
+               throw new Error('Input geometry is not a valid Polygon or MultiPolygon');
+             }
+
+             var point = rounder.round(geomRing[i][0], geomRing[i][1]); // skip repeated points
+
+             if (point.x === prevPoint.x && point.y === prevPoint.y) continue;
+             this.segments.push(Segment.fromRing(prevPoint, point, this));
+             if (point.x < this.bbox.ll.x) this.bbox.ll.x = point.x;
+             if (point.y < this.bbox.ll.y) this.bbox.ll.y = point.y;
+             if (point.x > this.bbox.ur.x) this.bbox.ur.x = point.x;
+             if (point.y > this.bbox.ur.y) this.bbox.ur.y = point.y;
+             prevPoint = point;
+           } // add segment from last to first if last is not the same as first
+
+
+           if (firstPoint.x !== prevPoint.x || firstPoint.y !== prevPoint.y) {
+             this.segments.push(Segment.fromRing(prevPoint, firstPoint, this));
+           }
+         }
+
+         _createClass(RingIn, [{
+           key: "getSweepEvents",
+           value: function getSweepEvents() {
+             var sweepEvents = [];
+
+             for (var i = 0, iMax = this.segments.length; i < iMax; i++) {
+               var segment = this.segments[i];
+               sweepEvents.push(segment.leftSE);
+               sweepEvents.push(segment.rightSE);
+             }
+
+             return sweepEvents;
+           }
+         }]);
+
+         return RingIn;
+       }();
+
+       var PolyIn = /*#__PURE__*/function () {
+         function PolyIn(geomPoly, multiPoly) {
+           _classCallCheck(this, PolyIn);
+
+           if (!Array.isArray(geomPoly)) {
+             throw new Error('Input geometry is not a valid Polygon or MultiPolygon');
+           }
+
+           this.exteriorRing = new RingIn(geomPoly[0], this, true); // copy by value
+
+           this.bbox = {
+             ll: {
+               x: this.exteriorRing.bbox.ll.x,
+               y: this.exteriorRing.bbox.ll.y
+             },
+             ur: {
+               x: this.exteriorRing.bbox.ur.x,
+               y: this.exteriorRing.bbox.ur.y
+             }
+           };
+           this.interiorRings = [];
+
+           for (var i = 1, iMax = geomPoly.length; i < iMax; i++) {
+             var ring = new RingIn(geomPoly[i], this, false);
+             if (ring.bbox.ll.x < this.bbox.ll.x) this.bbox.ll.x = ring.bbox.ll.x;
+             if (ring.bbox.ll.y < this.bbox.ll.y) this.bbox.ll.y = ring.bbox.ll.y;
+             if (ring.bbox.ur.x > this.bbox.ur.x) this.bbox.ur.x = ring.bbox.ur.x;
+             if (ring.bbox.ur.y > this.bbox.ur.y) this.bbox.ur.y = ring.bbox.ur.y;
+             this.interiorRings.push(ring);
+           }
+
+           this.multiPoly = multiPoly;
+         }
+
+         _createClass(PolyIn, [{
+           key: "getSweepEvents",
+           value: function getSweepEvents() {
+             var sweepEvents = this.exteriorRing.getSweepEvents();
+
+             for (var i = 0, iMax = this.interiorRings.length; i < iMax; i++) {
+               var ringSweepEvents = this.interiorRings[i].getSweepEvents();
+
+               for (var j = 0, jMax = ringSweepEvents.length; j < jMax; j++) {
+                 sweepEvents.push(ringSweepEvents[j]);
+               }
+             }
+
+             return sweepEvents;
+           }
+         }]);
+
+         return PolyIn;
+       }();
+
+       var MultiPolyIn = /*#__PURE__*/function () {
+         function MultiPolyIn(geom, isSubject) {
+           _classCallCheck(this, MultiPolyIn);
+
+           if (!Array.isArray(geom)) {
+             throw new Error('Input geometry is not a valid Polygon or MultiPolygon');
+           }
+
+           try {
+             // if the input looks like a polygon, convert it to a multipolygon
+             if (typeof geom[0][0][0] === 'number') geom = [geom];
+           } catch (ex) {// The input is either malformed or has empty arrays.
+             // In either case, it will be handled later on.
+           }
+
+           this.polys = [];
+           this.bbox = {
+             ll: {
+               x: Number.POSITIVE_INFINITY,
+               y: Number.POSITIVE_INFINITY
+             },
+             ur: {
+               x: Number.NEGATIVE_INFINITY,
+               y: Number.NEGATIVE_INFINITY
+             }
+           };
+
+           for (var i = 0, iMax = geom.length; i < iMax; i++) {
+             var poly = new PolyIn(geom[i], this);
+             if (poly.bbox.ll.x < this.bbox.ll.x) this.bbox.ll.x = poly.bbox.ll.x;
+             if (poly.bbox.ll.y < this.bbox.ll.y) this.bbox.ll.y = poly.bbox.ll.y;
+             if (poly.bbox.ur.x > this.bbox.ur.x) this.bbox.ur.x = poly.bbox.ur.x;
+             if (poly.bbox.ur.y > this.bbox.ur.y) this.bbox.ur.y = poly.bbox.ur.y;
+             this.polys.push(poly);
+           }
+
+           this.isSubject = isSubject;
+         }
+
+         _createClass(MultiPolyIn, [{
+           key: "getSweepEvents",
+           value: function getSweepEvents() {
+             var sweepEvents = [];
+
+             for (var i = 0, iMax = this.polys.length; i < iMax; i++) {
+               var polySweepEvents = this.polys[i].getSweepEvents();
+
+               for (var j = 0, jMax = polySweepEvents.length; j < jMax; j++) {
+                 sweepEvents.push(polySweepEvents[j]);
+               }
+             }
+
+             return sweepEvents;
+           }
+         }]);
+
+         return MultiPolyIn;
+       }();
+
+       var RingOut = /*#__PURE__*/function () {
+         _createClass(RingOut, null, [{
+           key: "factory",
+
+           /* Given the segments from the sweep line pass, compute & return a series
+            * of closed rings from all the segments marked to be part of the result */
+           value: function factory(allSegments) {
+             var ringsOut = [];
+
+             for (var i = 0, iMax = allSegments.length; i < iMax; i++) {
+               var segment = allSegments[i];
+               if (!segment.isInResult() || segment.ringOut) continue;
+               var prevEvent = null;
+               var event = segment.leftSE;
+               var nextEvent = segment.rightSE;
+               var events = [event];
+               var startingPoint = event.point;
+               var intersectionLEs = [];
+               /* Walk the chain of linked events to form a closed ring */
+
+               while (true) {
+                 prevEvent = event;
+                 event = nextEvent;
+                 events.push(event);
+                 /* Is the ring complete? */
+
+                 if (event.point === startingPoint) break;
+
+                 while (true) {
+                   var availableLEs = event.getAvailableLinkedEvents();
+                   /* Did we hit a dead end? This shouldn't happen. Indicates some earlier
+                    * part of the algorithm malfunctioned... please file a bug report. */
+
+                   if (availableLEs.length === 0) {
+                     var firstPt = events[0].point;
+                     var lastPt = events[events.length - 1].point;
+                     throw new Error("Unable to complete output ring starting at [".concat(firstPt.x, ",") + " ".concat(firstPt.y, "]. Last matching segment found ends at") + " [".concat(lastPt.x, ", ").concat(lastPt.y, "]."));
+                   }
+                   /* Only one way to go, so cotinue on the path */
+
+
+                   if (availableLEs.length === 1) {
+                     nextEvent = availableLEs[0].otherSE;
+                     break;
+                   }
+                   /* We must have an intersection. Check for a completed loop */
+
+
+                   var indexLE = null;
+
+                   for (var j = 0, jMax = intersectionLEs.length; j < jMax; j++) {
+                     if (intersectionLEs[j].point === event.point) {
+                       indexLE = j;
+                       break;
+                     }
+                   }
+                   /* Found a completed loop. Cut that off and make a ring */
+
+
+                   if (indexLE !== null) {
+                     var intersectionLE = intersectionLEs.splice(indexLE)[0];
+                     var ringEvents = events.splice(intersectionLE.index);
+                     ringEvents.unshift(ringEvents[0].otherSE);
+                     ringsOut.push(new RingOut(ringEvents.reverse()));
+                     continue;
+                   }
+                   /* register the intersection */
+
+
+                   intersectionLEs.push({
+                     index: events.length,
+                     point: event.point
+                   });
+                   /* Choose the left-most option to continue the walk */
+
+                   var comparator = event.getLeftmostComparator(prevEvent);
+                   nextEvent = availableLEs.sort(comparator)[0].otherSE;
+                   break;
+                 }
+               }
+
+               ringsOut.push(new RingOut(events));
+             }
+
+             return ringsOut;
+           }
+         }]);
+
+         function RingOut(events) {
+           _classCallCheck(this, RingOut);
+
+           this.events = events;
+
+           for (var i = 0, iMax = events.length; i < iMax; i++) {
+             events[i].segment.ringOut = this;
+           }
+
+           this.poly = null;
+         }
+
+         _createClass(RingOut, [{
+           key: "getGeom",
+           value: function getGeom() {
+             // Remove superfluous points (ie extra points along a straight line),
+             var prevPt = this.events[0].point;
+             var points = [prevPt];
+
+             for (var i = 1, iMax = this.events.length - 1; i < iMax; i++) {
+               var _pt = this.events[i].point;
+               var _nextPt = this.events[i + 1].point;
+               if (compareVectorAngles(_pt, prevPt, _nextPt) === 0) continue;
+               points.push(_pt);
+               prevPt = _pt;
+             } // ring was all (within rounding error of angle calc) colinear points
+
+
+             if (points.length === 1) return null; // check if the starting point is necessary
+
+             var pt = points[0];
+             var nextPt = points[1];
+             if (compareVectorAngles(pt, prevPt, nextPt) === 0) points.shift();
+             points.push(points[0]);
+             var step = this.isExteriorRing() ? 1 : -1;
+             var iStart = this.isExteriorRing() ? 0 : points.length - 1;
+             var iEnd = this.isExteriorRing() ? points.length : -1;
+             var orderedPoints = [];
+
+             for (var _i = iStart; _i != iEnd; _i += step) {
+               orderedPoints.push([points[_i].x, points[_i].y]);
+             }
+
+             return orderedPoints;
+           }
+         }, {
+           key: "isExteriorRing",
+           value: function isExteriorRing() {
+             if (this._isExteriorRing === undefined) {
+               var enclosing = this.enclosingRing();
+               this._isExteriorRing = enclosing ? !enclosing.isExteriorRing() : true;
+             }
+
+             return this._isExteriorRing;
+           }
+         }, {
+           key: "enclosingRing",
+           value: function enclosingRing() {
+             if (this._enclosingRing === undefined) {
+               this._enclosingRing = this._calcEnclosingRing();
+             }
+
+             return this._enclosingRing;
+           }
+           /* Returns the ring that encloses this one, if any */
+
+         }, {
+           key: "_calcEnclosingRing",
+           value: function _calcEnclosingRing() {
+             // start with the ealier sweep line event so that the prevSeg
+             // chain doesn't lead us inside of a loop of ours
+             var leftMostEvt = this.events[0];
+
+             for (var i = 1, iMax = this.events.length; i < iMax; i++) {
+               var evt = this.events[i];
+               if (SweepEvent.compare(leftMostEvt, evt) > 0) leftMostEvt = evt;
+             }
+
+             var prevSeg = leftMostEvt.segment.prevInResult();
+             var prevPrevSeg = prevSeg ? prevSeg.prevInResult() : null;
+
+             while (true) {
+               // no segment found, thus no ring can enclose us
+               if (!prevSeg) return null; // no segments below prev segment found, thus the ring of the prev
+               // segment must loop back around and enclose us
+
+               if (!prevPrevSeg) return prevSeg.ringOut; // if the two segments are of different rings, the ring of the prev
+               // segment must either loop around us or the ring of the prev prev
+               // seg, which would make us and the ring of the prev peers
+
+               if (prevPrevSeg.ringOut !== prevSeg.ringOut) {
+                 if (prevPrevSeg.ringOut.enclosingRing() !== prevSeg.ringOut) {
+                   return prevSeg.ringOut;
+                 } else return prevSeg.ringOut.enclosingRing();
+               } // two segments are from the same ring, so this was a penisula
+               // of that ring. iterate downward, keep searching
+
+
+               prevSeg = prevPrevSeg.prevInResult();
+               prevPrevSeg = prevSeg ? prevSeg.prevInResult() : null;
+             }
+           }
+         }]);
+
+         return RingOut;
+       }();
+
+       var PolyOut = /*#__PURE__*/function () {
+         function PolyOut(exteriorRing) {
+           _classCallCheck(this, PolyOut);
+
+           this.exteriorRing = exteriorRing;
+           exteriorRing.poly = this;
+           this.interiorRings = [];
+         }
+
+         _createClass(PolyOut, [{
+           key: "addInterior",
+           value: function addInterior(ring) {
+             this.interiorRings.push(ring);
+             ring.poly = this;
+           }
+         }, {
+           key: "getGeom",
+           value: function getGeom() {
+             var geom = [this.exteriorRing.getGeom()]; // exterior ring was all (within rounding error of angle calc) colinear points
+
+             if (geom[0] === null) return null;
+
+             for (var i = 0, iMax = this.interiorRings.length; i < iMax; i++) {
+               var ringGeom = this.interiorRings[i].getGeom(); // interior ring was all (within rounding error of angle calc) colinear points
+
+               if (ringGeom === null) continue;
+               geom.push(ringGeom);
+             }
+
+             return geom;
+           }
+         }]);
+
+         return PolyOut;
+       }();
+
+       var MultiPolyOut = /*#__PURE__*/function () {
+         function MultiPolyOut(rings) {
+           _classCallCheck(this, MultiPolyOut);
+
+           this.rings = rings;
+           this.polys = this._composePolys(rings);
+         }
+
+         _createClass(MultiPolyOut, [{
+           key: "getGeom",
+           value: function getGeom() {
+             var geom = [];
+
+             for (var i = 0, iMax = this.polys.length; i < iMax; i++) {
+               var polyGeom = this.polys[i].getGeom(); // exterior ring was all (within rounding error of angle calc) colinear points
+
+               if (polyGeom === null) continue;
+               geom.push(polyGeom);
+             }
+
+             return geom;
+           }
+         }, {
+           key: "_composePolys",
+           value: function _composePolys(rings) {
+             var polys = [];
+
+             for (var i = 0, iMax = rings.length; i < iMax; i++) {
+               var ring = rings[i];
+               if (ring.poly) continue;
+               if (ring.isExteriorRing()) polys.push(new PolyOut(ring));else {
+                 var enclosingRing = ring.enclosingRing();
+                 if (!enclosingRing.poly) polys.push(new PolyOut(enclosingRing));
+                 enclosingRing.poly.addInterior(ring);
+               }
+             }
+
+             return polys;
+           }
+         }]);
+
+         return MultiPolyOut;
+       }();
+       /**
+        * NOTE:  We must be careful not to change any segments while
+        *        they are in the SplayTree. AFAIK, there's no way to tell
+        *        the tree to rebalance itself - thus before splitting
+        *        a segment that's in the tree, we remove it from the tree,
+        *        do the split, then re-insert it. (Even though splitting a
+        *        segment *shouldn't* change its correct position in the
+        *        sweep line tree, the reality is because of rounding errors,
+        *        it sometimes does.)
+        */
+
+
+       var SweepLine = /*#__PURE__*/function () {
+         function SweepLine(queue) {
+           var comparator = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : Segment.compare;
+
+           _classCallCheck(this, SweepLine);
+
+           this.queue = queue;
+           this.tree = new Tree(comparator);
+           this.segments = [];
+         }
+
+         _createClass(SweepLine, [{
+           key: "process",
+           value: function process(event) {
+             var segment = event.segment;
+             var newEvents = []; // if we've already been consumed by another segment,
+             // clean up our body parts and get out
+
+             if (event.consumedBy) {
+               if (event.isLeft) this.queue.remove(event.otherSE);else this.tree.remove(segment);
+               return newEvents;
+             }
+
+             var node = event.isLeft ? this.tree.insert(segment) : this.tree.find(segment);
+             if (!node) throw new Error("Unable to find segment #".concat(segment.id, " ") + "[".concat(segment.leftSE.point.x, ", ").concat(segment.leftSE.point.y, "] -> ") + "[".concat(segment.rightSE.point.x, ", ").concat(segment.rightSE.point.y, "] ") + 'in SweepLine tree. Please submit a bug report.');
+             var prevNode = node;
+             var nextNode = node;
+             var prevSeg = undefined;
+             var nextSeg = undefined; // skip consumed segments still in tree
+
+             while (prevSeg === undefined) {
+               prevNode = this.tree.prev(prevNode);
+               if (prevNode === null) prevSeg = null;else if (prevNode.key.consumedBy === undefined) prevSeg = prevNode.key;
+             } // skip consumed segments still in tree
+
+
+             while (nextSeg === undefined) {
+               nextNode = this.tree.next(nextNode);
+               if (nextNode === null) nextSeg = null;else if (nextNode.key.consumedBy === undefined) nextSeg = nextNode.key;
+             }
+
+             if (event.isLeft) {
+               // Check for intersections against the previous segment in the sweep line
+               var prevMySplitter = null;
+
+               if (prevSeg) {
+                 var prevInter = prevSeg.getIntersection(segment);
+
+                 if (prevInter !== null) {
+                   if (!segment.isAnEndpoint(prevInter)) prevMySplitter = prevInter;
+
+                   if (!prevSeg.isAnEndpoint(prevInter)) {
+                     var newEventsFromSplit = this._splitSafely(prevSeg, prevInter);
+
+                     for (var i = 0, iMax = newEventsFromSplit.length; i < iMax; i++) {
+                       newEvents.push(newEventsFromSplit[i]);
+                     }
+                   }
+                 }
+               } // Check for intersections against the next segment in the sweep line
+
+
+               var nextMySplitter = null;
+
+               if (nextSeg) {
+                 var nextInter = nextSeg.getIntersection(segment);
+
+                 if (nextInter !== null) {
+                   if (!segment.isAnEndpoint(nextInter)) nextMySplitter = nextInter;
+
+                   if (!nextSeg.isAnEndpoint(nextInter)) {
+                     var _newEventsFromSplit = this._splitSafely(nextSeg, nextInter);
+
+                     for (var _i = 0, _iMax = _newEventsFromSplit.length; _i < _iMax; _i++) {
+                       newEvents.push(_newEventsFromSplit[_i]);
+                     }
+                   }
+                 }
+               } // For simplicity, even if we find more than one intersection we only
+               // spilt on the 'earliest' (sweep-line style) of the intersections.
+               // The other intersection will be handled in a future process().
+
+
+               if (prevMySplitter !== null || nextMySplitter !== null) {
+                 var mySplitter = null;
+                 if (prevMySplitter === null) mySplitter = nextMySplitter;else if (nextMySplitter === null) mySplitter = prevMySplitter;else {
+                   var cmpSplitters = SweepEvent.comparePoints(prevMySplitter, nextMySplitter);
+                   mySplitter = cmpSplitters <= 0 ? prevMySplitter : nextMySplitter;
+                 } // Rounding errors can cause changes in ordering,
+                 // so remove afected segments and right sweep events before splitting
+
+                 this.queue.remove(segment.rightSE);
+                 newEvents.push(segment.rightSE);
+
+                 var _newEventsFromSplit2 = segment.split(mySplitter);
+
+                 for (var _i2 = 0, _iMax2 = _newEventsFromSplit2.length; _i2 < _iMax2; _i2++) {
+                   newEvents.push(_newEventsFromSplit2[_i2]);
+                 }
+               }
+
+               if (newEvents.length > 0) {
+                 // We found some intersections, so re-do the current event to
+                 // make sure sweep line ordering is totally consistent for later
+                 // use with the segment 'prev' pointers
+                 this.tree.remove(segment);
+                 newEvents.push(event);
+               } else {
+                 // done with left event
+                 this.segments.push(segment);
+                 segment.prev = prevSeg;
+               }
+             } else {
+               // event.isRight
+               // since we're about to be removed from the sweep line, check for
+               // intersections between our previous and next segments
+               if (prevSeg && nextSeg) {
+                 var inter = prevSeg.getIntersection(nextSeg);
+
+                 if (inter !== null) {
+                   if (!prevSeg.isAnEndpoint(inter)) {
+                     var _newEventsFromSplit3 = this._splitSafely(prevSeg, inter);
+
+                     for (var _i3 = 0, _iMax3 = _newEventsFromSplit3.length; _i3 < _iMax3; _i3++) {
+                       newEvents.push(_newEventsFromSplit3[_i3]);
+                     }
+                   }
+
+                   if (!nextSeg.isAnEndpoint(inter)) {
+                     var _newEventsFromSplit4 = this._splitSafely(nextSeg, inter);
+
+                     for (var _i4 = 0, _iMax4 = _newEventsFromSplit4.length; _i4 < _iMax4; _i4++) {
+                       newEvents.push(_newEventsFromSplit4[_i4]);
+                     }
+                   }
+                 }
+               }
+
+               this.tree.remove(segment);
+             }
+
+             return newEvents;
+           }
+           /* Safely split a segment that is currently in the datastructures
+            * IE - a segment other than the one that is currently being processed. */
+
+         }, {
+           key: "_splitSafely",
+           value: function _splitSafely(seg, pt) {
+             // Rounding errors can cause changes in ordering,
+             // so remove afected segments and right sweep events before splitting
+             // removeNode() doesn't work, so have re-find the seg
+             // https://github.com/w8r/splay-tree/pull/5
+             this.tree.remove(seg);
+             var rightSE = seg.rightSE;
+             this.queue.remove(rightSE);
+             var newEvents = seg.split(pt);
+             newEvents.push(rightSE); // splitting can trigger consumption
+
+             if (seg.consumedBy === undefined) this.tree.insert(seg);
+             return newEvents;
+           }
+         }]);
+
+         return SweepLine;
+       }();
+
+       var POLYGON_CLIPPING_MAX_QUEUE_SIZE = typeof process !== 'undefined' && process.env.POLYGON_CLIPPING_MAX_QUEUE_SIZE || 1000000;
+       var POLYGON_CLIPPING_MAX_SWEEPLINE_SEGMENTS = typeof process !== 'undefined' && process.env.POLYGON_CLIPPING_MAX_SWEEPLINE_SEGMENTS || 1000000;
+
+       var Operation = /*#__PURE__*/function () {
+         function Operation() {
+           _classCallCheck(this, Operation);
+         }
+
+         _createClass(Operation, [{
+           key: "run",
+           value: function run(type, geom, moreGeoms) {
+             operation.type = type;
+             rounder.reset();
+             /* Convert inputs to MultiPoly objects */
+
+             var multipolys = [new MultiPolyIn(geom, true)];
+
+             for (var i = 0, iMax = moreGeoms.length; i < iMax; i++) {
+               multipolys.push(new MultiPolyIn(moreGeoms[i], false));
+             }
+
+             operation.numMultiPolys = multipolys.length;
+             /* BBox optimization for difference operation
+              * If the bbox of a multipolygon that's part of the clipping doesn't
+              * intersect the bbox of the subject at all, we can just drop that
+              * multiploygon. */
+
+             if (operation.type === 'difference') {
+               // in place removal
+               var subject = multipolys[0];
+               var _i = 1;
+
+               while (_i < multipolys.length) {
+                 if (getBboxOverlap(multipolys[_i].bbox, subject.bbox) !== null) _i++;else multipolys.splice(_i, 1);
+               }
+             }
+             /* BBox optimization for intersection operation
+              * If we can find any pair of multipolygons whose bbox does not overlap,
+              * then the result will be empty. */
+
+
+             if (operation.type === 'intersection') {
+               // TODO: this is O(n^2) in number of polygons. By sorting the bboxes,
+               //       it could be optimized to O(n * ln(n))
+               for (var _i2 = 0, _iMax = multipolys.length; _i2 < _iMax; _i2++) {
+                 var mpA = multipolys[_i2];
+
+                 for (var j = _i2 + 1, jMax = multipolys.length; j < jMax; j++) {
+                   if (getBboxOverlap(mpA.bbox, multipolys[j].bbox) === null) return [];
+                 }
+               }
+             }
+             /* Put segment endpoints in a priority queue */
+
+
+             var queue = new Tree(SweepEvent.compare);
+
+             for (var _i3 = 0, _iMax2 = multipolys.length; _i3 < _iMax2; _i3++) {
+               var sweepEvents = multipolys[_i3].getSweepEvents();
+
+               for (var _j = 0, _jMax = sweepEvents.length; _j < _jMax; _j++) {
+                 queue.insert(sweepEvents[_j]);
+
+                 if (queue.size > POLYGON_CLIPPING_MAX_QUEUE_SIZE) {
+                   // prevents an infinite loop, an otherwise common manifestation of bugs
+                   throw new Error('Infinite loop when putting segment endpoints in a priority queue ' + '(queue size too big). Please file a bug report.');
+                 }
+               }
+             }
+             /* Pass the sweep line over those endpoints */
+
+
+             var sweepLine = new SweepLine(queue);
+             var prevQueueSize = queue.size;
+             var node = queue.pop();
+
+             while (node) {
+               var evt = node.key;
+
+               if (queue.size === prevQueueSize) {
+                 // prevents an infinite loop, an otherwise common manifestation of bugs
+                 var seg = evt.segment;
+                 throw new Error("Unable to pop() ".concat(evt.isLeft ? 'left' : 'right', " SweepEvent ") + "[".concat(evt.point.x, ", ").concat(evt.point.y, "] from segment #").concat(seg.id, " ") + "[".concat(seg.leftSE.point.x, ", ").concat(seg.leftSE.point.y, "] -> ") + "[".concat(seg.rightSE.point.x, ", ").concat(seg.rightSE.point.y, "] from queue. ") + 'Please file a bug report.');
+               }
+
+               if (queue.size > POLYGON_CLIPPING_MAX_QUEUE_SIZE) {
+                 // prevents an infinite loop, an otherwise common manifestation of bugs
+                 throw new Error('Infinite loop when passing sweep line over endpoints ' + '(queue size too big). Please file a bug report.');
+               }
+
+               if (sweepLine.segments.length > POLYGON_CLIPPING_MAX_SWEEPLINE_SEGMENTS) {
+                 // prevents an infinite loop, an otherwise common manifestation of bugs
+                 throw new Error('Infinite loop when passing sweep line over endpoints ' + '(too many sweep line segments). Please file a bug report.');
+               }
+
+               var newEvents = sweepLine.process(evt);
+
+               for (var _i4 = 0, _iMax3 = newEvents.length; _i4 < _iMax3; _i4++) {
+                 var _evt = newEvents[_i4];
+                 if (_evt.consumedBy === undefined) queue.insert(_evt);
+               }
+
+               prevQueueSize = queue.size;
+               node = queue.pop();
+             } // free some memory we don't need anymore
+
+
+             rounder.reset();
+             /* Collect and compile segments we're keeping into a multipolygon */
+
+             var ringsOut = RingOut.factory(sweepLine.segments);
+             var result = new MultiPolyOut(ringsOut);
+             return result.getGeom();
+           }
+         }]);
+
+         return Operation;
+       }(); // singleton available by import
+
+
+       var operation = new Operation();
+
+       var union = function union(geom) {
+         for (var _len = arguments.length, moreGeoms = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {
+           moreGeoms[_key - 1] = arguments[_key];
+         }
+
+         return operation.run('union', geom, moreGeoms);
+       };
+
+       var intersection$1 = function intersection(geom) {
+         for (var _len2 = arguments.length, moreGeoms = new Array(_len2 > 1 ? _len2 - 1 : 0), _key2 = 1; _key2 < _len2; _key2++) {
+           moreGeoms[_key2 - 1] = arguments[_key2];
+         }
+
+         return operation.run('intersection', geom, moreGeoms);
+       };
+
+       var xor = function xor(geom) {
+         for (var _len3 = arguments.length, moreGeoms = new Array(_len3 > 1 ? _len3 - 1 : 0), _key3 = 1; _key3 < _len3; _key3++) {
+           moreGeoms[_key3 - 1] = arguments[_key3];
+         }
+
+         return operation.run('xor', geom, moreGeoms);
+       };
+
+       var difference = function difference(subjectGeom) {
+         for (var _len4 = arguments.length, clippingGeoms = new Array(_len4 > 1 ? _len4 - 1 : 0), _key4 = 1; _key4 < _len4; _key4++) {
+           clippingGeoms[_key4 - 1] = arguments[_key4];
+         }
+
+         return operation.run('difference', subjectGeom, clippingGeoms);
+       };
+
+       var index = {
+         union: union,
+         intersection: intersection$1,
+         xor: xor,
+         difference: difference
+       };
+
+       var geojsonPrecision = {exports: {}};
+
+       (function () {
+         function parse(t, coordinatePrecision, extrasPrecision) {
+           function point(p) {
+             return p.map(function (e, index) {
+               if (index < 2) {
+                 return 1 * e.toFixed(coordinatePrecision);
+               } else {
+                 return 1 * e.toFixed(extrasPrecision);
+               }
+             });
+           }
+
+           function multi(l) {
+             return l.map(point);
+           }
+
+           function poly(p) {
+             return p.map(multi);
+           }
+
+           function multiPoly(m) {
+             return m.map(poly);
+           }
+
+           function geometry(obj) {
+             if (!obj) {
+               return {};
+             }
+
+             switch (obj.type) {
+               case "Point":
+                 obj.coordinates = point(obj.coordinates);
+                 return obj;
+
+               case "LineString":
+               case "MultiPoint":
+                 obj.coordinates = multi(obj.coordinates);
+                 return obj;
+
+               case "Polygon":
+               case "MultiLineString":
+                 obj.coordinates = poly(obj.coordinates);
+                 return obj;
+
+               case "MultiPolygon":
+                 obj.coordinates = multiPoly(obj.coordinates);
+                 return obj;
+
+               case "GeometryCollection":
+                 obj.geometries = obj.geometries.map(geometry);
+                 return obj;
+
+               default:
+                 return {};
+             }
+           }
+
+           function feature(obj) {
+             obj.geometry = geometry(obj.geometry);
+             return obj;
+           }
+
+           function featureCollection(f) {
+             f.features = f.features.map(feature);
+             return f;
+           }
+
+           function geometryCollection(g) {
+             g.geometries = g.geometries.map(geometry);
+             return g;
+           }
+
+           if (!t) {
+             return t;
+           }
+
+           switch (t.type) {
+             case "Feature":
+               return feature(t);
+
+             case "GeometryCollection":
+               return geometryCollection(t);
+
+             case "FeatureCollection":
+               return featureCollection(t);
+
+             case "Point":
+             case "LineString":
+             case "Polygon":
+             case "MultiPoint":
+             case "MultiPolygon":
+             case "MultiLineString":
+               return geometry(t);
+
+             default:
+               return t;
+           }
+         }
+
+         geojsonPrecision.exports = parse;
+         geojsonPrecision.exports.parse = parse;
+       })();
+
+       var precision = geojsonPrecision.exports;
+
+       var $$k = _export;
+       var fails$5 = fails$V;
+       var toObject$1 = toObject$i;
+       var toPrimitive = toPrimitive$3;
+
+       var FORCED$5 = fails$5(function () {
+         return new Date(NaN).toJSON() !== null
+           || Date.prototype.toJSON.call({ toISOString: function () { return 1; } }) !== 1;
+       });
+
+       // `Date.prototype.toJSON` method
+       // https://tc39.es/ecma262/#sec-date.prototype.tojson
+       $$k({ target: 'Date', proto: true, forced: FORCED$5 }, {
+         // eslint-disable-next-line no-unused-vars -- required for `.length`
+         toJSON: function toJSON(key) {
+           var O = toObject$1(this);
+           var pv = toPrimitive(O, 'number');
+           return typeof pv == 'number' && !isFinite(pv) ? null : O.toISOString();
+         }
+       });
+
+       var $$j = _export;
+       var call = functionCall;
+
+       // `URL.prototype.toJSON` method
+       // https://url.spec.whatwg.org/#dom-url-tojson
+       $$j({ target: 'URL', proto: true, enumerable: true }, {
+         toJSON: function toJSON() {
+           return call(URL.prototype.toString, this);
+         }
+       });
+
+       function isObject$3(obj) {
+         return _typeof(obj) === 'object' && obj !== null;
+       }
+
+       function forEach(obj, cb) {
+         if (Array.isArray(obj)) {
+           obj.forEach(cb);
+         } else if (isObject$3(obj)) {
+           Object.keys(obj).forEach(function (key) {
+             var val = obj[key];
+             cb(val, key);
+           });
+         }
+       }
+
+       function getTreeDepth(obj) {
+         var depth = 0;
+
+         if (Array.isArray(obj) || isObject$3(obj)) {
+           forEach(obj, function (val) {
+             if (Array.isArray(val) || isObject$3(val)) {
+               var tmpDepth = getTreeDepth(val);
+
+               if (tmpDepth > depth) {
+                 depth = tmpDepth;
+               }
+             }
+           });
+           return depth + 1;
+         }
+
+         return depth;
+       }
+
+       function stringify(obj, options) {
+         options = options || {};
+         var indent = JSON.stringify([1], null, get(options, 'indent', 2)).slice(2, -3);
+         var addMargin = get(options, 'margins', false);
+         var addArrayMargin = get(options, 'arrayMargins', false);
+         var addObjectMargin = get(options, 'objectMargins', false);
+         var maxLength = indent === '' ? Infinity : get(options, 'maxLength', 80);
+         var maxNesting = get(options, 'maxNesting', Infinity);
+         return function _stringify(obj, currentIndent, reserved) {
+           if (obj && typeof obj.toJSON === 'function') {
+             obj = obj.toJSON();
+           }
+
+           var string = JSON.stringify(obj);
+
+           if (string === undefined) {
+             return string;
+           }
+
+           var length = maxLength - currentIndent.length - reserved;
+           var treeDepth = getTreeDepth(obj);
+
+           if (treeDepth <= maxNesting && string.length <= length) {
+             var prettified = prettify(string, {
+               addMargin: addMargin,
+               addArrayMargin: addArrayMargin,
+               addObjectMargin: addObjectMargin
+             });
+
+             if (prettified.length <= length) {
+               return prettified;
+             }
+           }
+
+           if (isObject$3(obj)) {
+             var nextIndent = currentIndent + indent;
+             var items = [];
+             var delimiters;
+
+             var comma = function comma(array, index) {
+               return index === array.length - 1 ? 0 : 1;
+             };
+
+             if (Array.isArray(obj)) {
+               for (var index = 0; index < obj.length; index++) {
+                 items.push(_stringify(obj[index], nextIndent, comma(obj, index)) || 'null');
+               }
+
+               delimiters = '[]';
+             } else {
+               Object.keys(obj).forEach(function (key, index, array) {
+                 var keyPart = JSON.stringify(key) + ': ';
+
+                 var value = _stringify(obj[key], nextIndent, keyPart.length + comma(array, index));
+
+                 if (value !== undefined) {
+                   items.push(keyPart + value);
+                 }
+               });
+               delimiters = '{}';
+             }
+
+             if (items.length > 0) {
+               return [delimiters[0], indent + items.join(',\n' + nextIndent), delimiters[1]].join('\n' + currentIndent);
+             }
+           }
+
+           return string;
+         }(obj, '', 0);
+       } // Note: This regex matches even invalid JSON strings, but since we’re
+       // working on the output of `JSON.stringify` we know that only valid strings
+       // are present (unless the user supplied a weird `options.indent` but in
+       // that case we don’t care since the output would be invalid anyway).
+
+
+       var stringOrChar = /("(?:[^\\"]|\\.)*")|[:,\][}{]/g;
+
+       function prettify(string, options) {
+         options = options || {};
+         var tokens = {
+           '{': '{',
+           '}': '}',
+           '[': '[',
+           ']': ']',
+           ',': ', ',
+           ':': ': '
+         };
+
+         if (options.addMargin || options.addObjectMargin) {
+           tokens['{'] = '{ ';
+           tokens['}'] = ' }';
+         }
+
+         if (options.addMargin || options.addArrayMargin) {
+           tokens['['] = '[ ';
+           tokens[']'] = ' ]';
+         }
+
+         return string.replace(stringOrChar, function (match, string) {
+           return string ? match : tokens[match];
+         });
+       }
+
+       function get(options, name, defaultValue) {
+         return name in options ? options[name] : defaultValue;
+       }
+
+       var jsonStringifyPrettyCompact = stringify;
+
+       var _default = /*#__PURE__*/function () {
+         // constructor
+         //
+         // `fc`  Optional FeatureCollection of known features
+         //
+         // Optionally pass a GeoJSON FeatureCollection of known features which we can refer to later.
+         // Each feature must have a filename-like `id`, for example: `something.geojson`
+         //
+         // {
+         //   "type": "FeatureCollection"
+         //   "features": [
+         //     {
+         //       "type": "Feature",
+         //       "id": "philly_metro.geojson",
+         //       "properties": { … },
+         //       "geometry": { … }
+         //     }
+         //   ]
+         // }
+         function _default(fc) {
+           var _this = this;
+
+           _classCallCheck$1(this, _default);
+
+           // The _cache retains resolved features, so if you ask for the same thing multiple times
+           // we don't repeat the expensive resolving/clipping operations.
+           //
+           // Each feature has a stable identifier that is used as the cache key.
+           // The identifiers look like:
+           // - for point locations, the stringified point:          e.g. '[8.67039,49.41882]'
+           // - for geojson locations, the geojson id:               e.g. 'de-hamburg.geojson'
+           // - for countrycoder locations, feature.id property:     e.g. 'Q2'  (countrycoder uses Wikidata identifiers)
+           // - for aggregated locationSets, +[include]-[exclude]:   e.g '+[Q2]-[Q18,Q27611]'
+           this._cache = {}; // When strict mode = true, throw on invalid locations or locationSets.
+           // When strict mode = false, return `null` for invalid locations or locationSets.
+
+           this._strict = true; // process input FeatureCollection
+
+           if (fc && fc.type === 'FeatureCollection' && Array.isArray(fc.features)) {
+             fc.features.forEach(function (feature) {
+               feature.properties = feature.properties || {};
+               var props = feature.properties; // Get `id` from either `id` or `properties`
+
+               var id = feature.id || props.id;
+               if (!id || !/^\S+\.geojson$/i.test(id)) return; // Ensure `id` exists and is lowercase
+
+               id = id.toLowerCase();
+               feature.id = id;
+               props.id = id; // Ensure `area` property exists
+
+               if (!props.area) {
+                 var area = geojsonArea.geometry(feature.geometry) / 1e6; // m² to km²
+
+                 props.area = Number(area.toFixed(2));
+               }
+
+               _this._cache[id] = feature;
+             });
+           } // Replace CountryCoder world geometry to be a polygon covering the world.
+
+
+           var world = _cloneDeep(feature$1('Q2'));
+
+           world.geometry = {
+             type: 'Polygon',
+             coordinates: [[[-180, -90], [180, -90], [180, 90], [-180, 90], [-180, -90]]]
+           };
+           world.id = 'Q2';
+           world.properties.id = 'Q2';
+           world.properties.area = geojsonArea.geometry(world.geometry) / 1e6; // m² to km²
+
+           this._cache.Q2 = world;
+         } // validateLocation
+         // `location`  The location to validate
+         //
+         // Pass a `location` value to validate
+         //
+         // Returns a result like:
+         //   {
+         //     type:     'point', 'geojson', or 'countrycoder'
+         //     location:  the queried location
+         //     id:        the stable identifier for the feature
+         //   }
+         // or `null` if the location is invalid
+         //
+
+
+         _createClass$1(_default, [{
+           key: "validateLocation",
+           value: function validateLocation(location) {
+             if (Array.isArray(location) && (location.length === 2 || location.length === 3)) {
+               // [lon, lat] or [lon, lat, radius] point?
+               var lon = location[0];
+               var lat = location[1];
+               var radius = location[2];
+
+               if (Number.isFinite(lon) && lon >= -180 && lon <= 180 && Number.isFinite(lat) && lat >= -90 && lat <= 90 && (location.length === 2 || Number.isFinite(radius) && radius > 0)) {
+                 var id = '[' + location.toString() + ']';
+                 return {
+                   type: 'point',
+                   location: location,
+                   id: id
+                 };
+               }
+             } else if (typeof location === 'string' && /^\S+\.geojson$/i.test(location)) {
+               // a .geojson filename?
+               var _id = location.toLowerCase();
+
+               if (this._cache[_id]) {
+                 return {
+                   type: 'geojson',
+                   location: location,
+                   id: _id
+                 };
+               }
+             } else if (typeof location === 'string' || typeof location === 'number') {
+               // a country-coder value?
+               var feature = feature$1(location);
+
+               if (feature) {
+                 // Use wikidata QID as the identifier, since that seems to be the one
+                 // property that everything in CountryCoder is guaranteed to have.
+                 var _id2 = feature.properties.wikidata;
+                 return {
+                   type: 'countrycoder',
+                   location: location,
+                   id: _id2
+                 };
+               }
+             }
+
+             if (this._strict) {
+               throw new Error("validateLocation:  Invalid location: \"".concat(location, "\"."));
+             } else {
+               return null;
+             }
+           } // resolveLocation
+           // `location`  The location to resolve
+           //
+           // Pass a `location` value to resolve
+           //
+           // Returns a result like:
+           //   {
+           //     type:      'point', 'geojson', or 'countrycoder'
+           //     location:  the queried location
+           //     id:        a stable identifier for the feature
+           //     feature:   the resolved GeoJSON feature
+           //   }
+           //  or `null` if the location is invalid
+           //
+
+         }, {
+           key: "resolveLocation",
+           value: function resolveLocation(location) {
+             var valid = this.validateLocation(location);
+             if (!valid) return null;
+             var id = valid.id; // Return a result from cache if we can
+
+             if (this._cache[id]) {
+               return Object.assign(valid, {
+                 feature: this._cache[id]
+               });
+             } // A [lon,lat] coordinate pair?
+
+
+             if (valid.type === 'point') {
+               var lon = location[0];
+               var lat = location[1];
+               var radius = location[2] || 25; // km
+
+               var EDGES = 10;
+               var PRECISION = 3;
+               var area = Math.PI * radius * radius;
+               var feature = this._cache[id] = precision({
+                 type: 'Feature',
+                 id: id,
+                 properties: {
+                   id: id,
+                   area: Number(area.toFixed(2))
+                 },
+                 geometry: circleToPolygon([lon, lat], radius * 1000, EDGES) // km to m
+
+               }, PRECISION);
+               return Object.assign(valid, {
+                 feature: feature
+               }); // A .geojson filename?
+             } else if (valid.type === 'geojson') ; else if (valid.type === 'countrycoder') {
+               var _feature = _cloneDeep(feature$1(id));
+
+               var props = _feature.properties; // -> This block of code is weird and requires some explanation. <-
+               // CountryCoder includes higher level features which are made up of members.
+               // These features don't have their own geometry, but CountryCoder provides an
+               //   `aggregateFeature` method to combine these members into a MultiPolygon.
+               // In the past, Turf/JSTS/martinez could not handle the aggregated features,
+               //   so we'd iteratively union them all together.  (this was slow)
+               // But now mfogel/polygon-clipping handles these MultiPolygons like a boss.
+               // This approach also has the benefit of removing all the internal boaders and
+               //   simplifying the regional polygons a lot.
+
+               if (Array.isArray(props.members)) {
+                 var aggregate = aggregateFeature(id);
+                 aggregate.geometry.coordinates = _clip([aggregate], 'UNION').geometry.coordinates;
+                 _feature.geometry = aggregate.geometry;
+               } // Ensure `area` property exists
+
+
+               if (!props.area) {
+                 var _area = geojsonArea.geometry(_feature.geometry) / 1e6; // m² to km²
+
+
+                 props.area = Number(_area.toFixed(2));
+               } // Ensure `id` property exists
+
+
+               _feature.id = id;
+               props.id = id;
+               this._cache[id] = _feature;
+               return Object.assign(valid, {
+                 feature: _feature
+               });
+             }
+
+             if (this._strict) {
+               throw new Error("resolveLocation:  Couldn't resolve location \"".concat(location, "\"."));
+             } else {
+               return null;
+             }
+           } // validateLocationSet
+           // `locationSet`  the locationSet to validate
+           //
+           // Pass a locationSet Object to validate like:
+           //   {
+           //     include: [ Array of locations ],
+           //     exclude: [ Array of locations ]
+           //   }
+           //
+           // Returns a result like:
+           //   {
+           //     type:         'locationset'
+           //     locationSet:  the queried locationSet
+           //     id:           the stable identifier for the feature
+           //   }
+           // or `null` if the locationSet is invalid
+           //
+
+         }, {
+           key: "validateLocationSet",
+           value: function validateLocationSet(locationSet) {
+             locationSet = locationSet || {};
+             var validator = this.validateLocation.bind(this);
+             var include = (locationSet.include || []).map(validator).filter(Boolean);
+             var exclude = (locationSet.exclude || []).map(validator).filter(Boolean);
+
+             if (!include.length) {
+               if (this._strict) {
+                 throw new Error("validateLocationSet:  LocationSet includes nothing.");
+               } else {
+                 // non-strict mode, replace an empty locationSet with one that includes "the world"
+                 locationSet.include = ['Q2'];
+                 include = [{
+                   type: 'countrycoder',
+                   location: 'Q2',
+                   id: 'Q2'
+                 }];
+               }
+             } // Generate stable identifier
+
+
+             include.sort(_sortLocations);
+             var id = '+[' + include.map(function (d) {
+               return d.id;
+             }).join(',') + ']';
+
+             if (exclude.length) {
+               exclude.sort(_sortLocations);
+               id += '-[' + exclude.map(function (d) {
+                 return d.id;
+               }).join(',') + ']';
+             }
+
+             return {
+               type: 'locationset',
+               locationSet: locationSet,
+               id: id
+             };
+           } // resolveLocationSet
+           // `locationSet`  the locationSet to resolve
+           //
+           // Pass a locationSet Object to validate like:
+           //   {
+           //     include: [ Array of locations ],
+           //     exclude: [ Array of locations ]
+           //   }
+           //
+           // Returns a result like:
+           //   {
+           //     type:         'locationset'
+           //     locationSet:  the queried locationSet
+           //     id:           the stable identifier for the feature
+           //     feature:      the resolved GeoJSON feature
+           //   }
+           // or `null` if the locationSet is invalid
+           //
+
+         }, {
+           key: "resolveLocationSet",
+           value: function resolveLocationSet(locationSet) {
+             locationSet = locationSet || {};
+             var valid = this.validateLocationSet(locationSet);
+             if (!valid) return null;
+             var id = valid.id; // Return a result from cache if we can
+
+             if (this._cache[id]) {
+               return Object.assign(valid, {
+                 feature: this._cache[id]
+               });
+             }
+
+             var resolver = this.resolveLocation.bind(this);
+             var includes = (locationSet.include || []).map(resolver).filter(Boolean);
+             var excludes = (locationSet.exclude || []).map(resolver).filter(Boolean); // Return quickly if it's a single included location..
+
+             if (includes.length === 1 && excludes.length === 0) {
+               return Object.assign(valid, {
+                 feature: includes[0].feature
+               });
+             } // Calculate unions
+
+
+             var includeGeoJSON = _clip(includes.map(function (d) {
+               return d.feature;
+             }), 'UNION');
+
+             var excludeGeoJSON = _clip(excludes.map(function (d) {
+               return d.feature;
+             }), 'UNION'); // Calculate difference, update `area` and return result
+
+
+             var resultGeoJSON = excludeGeoJSON ? _clip([includeGeoJSON, excludeGeoJSON], 'DIFFERENCE') : includeGeoJSON;
+             var area = geojsonArea.geometry(resultGeoJSON.geometry) / 1e6; // m² to km²
+
+             resultGeoJSON.id = id;
+             resultGeoJSON.properties = {
+               id: id,
+               area: Number(area.toFixed(2))
+             };
+             this._cache[id] = resultGeoJSON;
+             return Object.assign(valid, {
+               feature: resultGeoJSON
+             });
+           } // strict
+           //
+
+         }, {
+           key: "strict",
+           value: function strict(val) {
+             if (val === undefined) {
+               // get
+               return this._strict;
+             } else {
+               // set
+               this._strict = val;
+               return this;
+             }
+           } // cache
+           // convenience method to access the internal cache
+
+         }, {
+           key: "cache",
+           value: function cache() {
+             return this._cache;
+           } // stringify
+           // convenience method to prettyStringify the given object
+
+         }, {
+           key: "stringify",
+           value: function stringify(obj, options) {
+             return jsonStringifyPrettyCompact(obj, options);
+           }
+         }]);
+
+         return _default;
+       }(); // Wrap the mfogel/polygon-clipping library and return a GeoJSON feature.
+
+       function _clip(features, which) {
+         if (!Array.isArray(features) || !features.length) return null;
+         var fn = {
+           UNION: index.union,
+           DIFFERENCE: index.difference
+         }[which];
+         var args = features.map(function (feature) {
+           return feature.geometry.coordinates;
+         });
+         var coords = fn.apply(null, args);
+         return {
+           type: 'Feature',
+           properties: {},
+           geometry: {
+             type: whichType(coords),
+             coordinates: coords
+           }
+         }; // is this a Polygon or a MultiPolygon?
+
+         function whichType(coords) {
+           var a = Array.isArray(coords);
+           var b = a && Array.isArray(coords[0]);
+           var c = b && Array.isArray(coords[0][0]);
+           var d = c && Array.isArray(coords[0][0][0]);
+           return d ? 'MultiPolygon' : 'Polygon';
+         }
+       }
+
+       function _cloneDeep(obj) {
+         return JSON.parse(JSON.stringify(obj));
+       } // Sorting the location lists is ok because they end up unioned together.
+       // This sorting makes it possible to generate a deterministic id.
+
+
+       function _sortLocations(a, b) {
+         var rank = {
+           countrycoder: 1,
+           geojson: 2,
+           point: 3
+         };
+         var aRank = rank[a.type];
+         var bRank = rank[b.type];
+         return aRank > bRank ? 1 : aRank < bRank ? -1 : a.id.localeCompare(b.id);
+       }
+
+       var $$i = _export;
+
+       // `Number.MAX_SAFE_INTEGER` constant
+       // https://tc39.es/ecma262/#sec-number.max_safe_integer
+       $$i({ target: 'Number', stat: true }, {
+         MAX_SAFE_INTEGER: 0x1FFFFFFFFFFFFF
+       });
+
+       var aesJs = {exports: {}};
+
+       (function (module, exports) {
+         (function (root) {
+
+           function checkInt(value) {
+             return parseInt(value) === value;
+           }
+
+           function checkInts(arrayish) {
+             if (!checkInt(arrayish.length)) {
+               return false;
+             }
+
+             for (var i = 0; i < arrayish.length; i++) {
+               if (!checkInt(arrayish[i]) || arrayish[i] < 0 || arrayish[i] > 255) {
+                 return false;
+               }
+             }
+
+             return true;
+           }
+
+           function coerceArray(arg, copy) {
+             // ArrayBuffer view
+             if (arg.buffer && arg.name === 'Uint8Array') {
+               if (copy) {
+                 if (arg.slice) {
+                   arg = arg.slice();
+                 } else {
+                   arg = Array.prototype.slice.call(arg);
+                 }
+               }
+
+               return arg;
+             } // It's an array; check it is a valid representation of a byte
+
+
+             if (Array.isArray(arg)) {
+               if (!checkInts(arg)) {
+                 throw new Error('Array contains invalid value: ' + arg);
+               }
+
+               return new Uint8Array(arg);
+             } // Something else, but behaves like an array (maybe a Buffer? Arguments?)
+
+
+             if (checkInt(arg.length) && checkInts(arg)) {
+               return new Uint8Array(arg);
+             }
+
+             throw new Error('unsupported array-like object');
+           }
+
+           function createArray(length) {
+             return new Uint8Array(length);
+           }
+
+           function copyArray(sourceArray, targetArray, targetStart, sourceStart, sourceEnd) {
+             if (sourceStart != null || sourceEnd != null) {
+               if (sourceArray.slice) {
+                 sourceArray = sourceArray.slice(sourceStart, sourceEnd);
+               } else {
+                 sourceArray = Array.prototype.slice.call(sourceArray, sourceStart, sourceEnd);
+               }
+             }
+
+             targetArray.set(sourceArray, targetStart);
+           }
+
+           var convertUtf8 = function () {
+             function toBytes(text) {
+               var result = [],
+                   i = 0;
+               text = encodeURI(text);
+
+               while (i < text.length) {
+                 var c = text.charCodeAt(i++); // if it is a % sign, encode the following 2 bytes as a hex value
+
+                 if (c === 37) {
+                   result.push(parseInt(text.substr(i, 2), 16));
+                   i += 2; // otherwise, just the actual byte
+                 } else {
+                   result.push(c);
+                 }
+               }
+
+               return coerceArray(result);
+             }
+
+             function fromBytes(bytes) {
+               var result = [],
+                   i = 0;
+
+               while (i < bytes.length) {
+                 var c = bytes[i];
+
+                 if (c < 128) {
+                   result.push(String.fromCharCode(c));
+                   i++;
+                 } else if (c > 191 && c < 224) {
+                   result.push(String.fromCharCode((c & 0x1f) << 6 | bytes[i + 1] & 0x3f));
+                   i += 2;
+                 } else {
+                   result.push(String.fromCharCode((c & 0x0f) << 12 | (bytes[i + 1] & 0x3f) << 6 | bytes[i + 2] & 0x3f));
+                   i += 3;
+                 }
+               }
+
+               return result.join('');
+             }
+
+             return {
+               toBytes: toBytes,
+               fromBytes: fromBytes
+             };
+           }();
+
+           var convertHex = function () {
+             function toBytes(text) {
+               var result = [];
+
+               for (var i = 0; i < text.length; i += 2) {
+                 result.push(parseInt(text.substr(i, 2), 16));
+               }
+
+               return result;
+             } // http://ixti.net/development/javascript/2011/11/11/base64-encodedecode-of-utf8-in-browser-with-js.html
+
+
+             var Hex = '0123456789abcdef';
+
+             function fromBytes(bytes) {
+               var result = [];
+
+               for (var i = 0; i < bytes.length; i++) {
+                 var v = bytes[i];
+                 result.push(Hex[(v & 0xf0) >> 4] + Hex[v & 0x0f]);
+               }
+
+               return result.join('');
+             }
+
+             return {
+               toBytes: toBytes,
+               fromBytes: fromBytes
+             };
+           }(); // Number of rounds by keysize
+
+
+           var numberOfRounds = {
+             16: 10,
+             24: 12,
+             32: 14
+           }; // Round constant words
+
+           var rcon = [0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1b, 0x36, 0x6c, 0xd8, 0xab, 0x4d, 0x9a, 0x2f, 0x5e, 0xbc, 0x63, 0xc6, 0x97, 0x35, 0x6a, 0xd4, 0xb3, 0x7d, 0xfa, 0xef, 0xc5, 0x91]; // S-box and Inverse S-box (S is for Substitution)
+
+           var S = [0x63, 0x7c, 0x77, 0x7b, 0xf2, 0x6b, 0x6f, 0xc5, 0x30, 0x01, 0x67, 0x2b, 0xfe, 0xd7, 0xab, 0x76, 0xca, 0x82, 0xc9, 0x7d, 0xfa, 0x59, 0x47, 0xf0, 0xad, 0xd4, 0xa2, 0xaf, 0x9c, 0xa4, 0x72, 0xc0, 0xb7, 0xfd, 0x93, 0x26, 0x36, 0x3f, 0xf7, 0xcc, 0x34, 0xa5, 0xe5, 0xf1, 0x71, 0xd8, 0x31, 0x15, 0x04, 0xc7, 0x23, 0xc3, 0x18, 0x96, 0x05, 0x9a, 0x07, 0x12, 0x80, 0xe2, 0xeb, 0x27, 0xb2, 0x75, 0x09, 0x83, 0x2c, 0x1a, 0x1b, 0x6e, 0x5a, 0xa0, 0x52, 0x3b, 0xd6, 0xb3, 0x29, 0xe3, 0x2f, 0x84, 0x53, 0xd1, 0x00, 0xed, 0x20, 0xfc, 0xb1, 0x5b, 0x6a, 0xcb, 0xbe, 0x39, 0x4a, 0x4c, 0x58, 0xcf, 0xd0, 0xef, 0xaa, 0xfb, 0x43, 0x4d, 0x33, 0x85, 0x45, 0xf9, 0x02, 0x7f, 0x50, 0x3c, 0x9f, 0xa8, 0x51, 0xa3, 0x40, 0x8f, 0x92, 0x9d, 0x38, 0xf5, 0xbc, 0xb6, 0xda, 0x21, 0x10, 0xff, 0xf3, 0xd2, 0xcd, 0x0c, 0x13, 0xec, 0x5f, 0x97, 0x44, 0x17, 0xc4, 0xa7, 0x7e, 0x3d, 0x64, 0x5d, 0x19, 0x73, 0x60, 0x81, 0x4f, 0xdc, 0x22, 0x2a, 0x90, 0x88, 0x46, 0xee, 0xb8, 0x14, 0xde, 0x5e, 0x0b, 0xdb, 0xe0, 0x32, 0x3a, 0x0a, 0x49, 0x06, 0x24, 0x5c, 0xc2, 0xd3, 0xac, 0x62, 0x91, 0x95, 0xe4, 0x79, 0xe7, 0xc8, 0x37, 0x6d, 0x8d, 0xd5, 0x4e, 0xa9, 0x6c, 0x56, 0xf4, 0xea, 0x65, 0x7a, 0xae, 0x08, 0xba, 0x78, 0x25, 0x2e, 0x1c, 0xa6, 0xb4, 0xc6, 0xe8, 0xdd, 0x74, 0x1f, 0x4b, 0xbd, 0x8b, 0x8a, 0x70, 0x3e, 0xb5, 0x66, 0x48, 0x03, 0xf6, 0x0e, 0x61, 0x35, 0x57, 0xb9, 0x86, 0xc1, 0x1d, 0x9e, 0xe1, 0xf8, 0x98, 0x11, 0x69, 0xd9, 0x8e, 0x94, 0x9b, 0x1e, 0x87, 0xe9, 0xce, 0x55, 0x28, 0xdf, 0x8c, 0xa1, 0x89, 0x0d, 0xbf, 0xe6, 0x42, 0x68, 0x41, 0x99, 0x2d, 0x0f, 0xb0, 0x54, 0xbb, 0x16];
+           var Si = [0x52, 0x09, 0x6a, 0xd5, 0x30, 0x36, 0xa5, 0x38, 0xbf, 0x40, 0xa3, 0x9e, 0x81, 0xf3, 0xd7, 0xfb, 0x7c, 0xe3, 0x39, 0x82, 0x9b, 0x2f, 0xff, 0x87, 0x34, 0x8e, 0x43, 0x44, 0xc4, 0xde, 0xe9, 0xcb, 0x54, 0x7b, 0x94, 0x32, 0xa6, 0xc2, 0x23, 0x3d, 0xee, 0x4c, 0x95, 0x0b, 0x42, 0xfa, 0xc3, 0x4e, 0x08, 0x2e, 0xa1, 0x66, 0x28, 0xd9, 0x24, 0xb2, 0x76, 0x5b, 0xa2, 0x49, 0x6d, 0x8b, 0xd1, 0x25, 0x72, 0xf8, 0xf6, 0x64, 0x86, 0x68, 0x98, 0x16, 0xd4, 0xa4, 0x5c, 0xcc, 0x5d, 0x65, 0xb6, 0x92, 0x6c, 0x70, 0x48, 0x50, 0xfd, 0xed, 0xb9, 0xda, 0x5e, 0x15, 0x46, 0x57, 0xa7, 0x8d, 0x9d, 0x84, 0x90, 0xd8, 0xab, 0x00, 0x8c, 0xbc, 0xd3, 0x0a, 0xf7, 0xe4, 0x58, 0x05, 0xb8, 0xb3, 0x45, 0x06, 0xd0, 0x2c, 0x1e, 0x8f, 0xca, 0x3f, 0x0f, 0x02, 0xc1, 0xaf, 0xbd, 0x03, 0x01, 0x13, 0x8a, 0x6b, 0x3a, 0x91, 0x11, 0x41, 0x4f, 0x67, 0xdc, 0xea, 0x97, 0xf2, 0xcf, 0xce, 0xf0, 0xb4, 0xe6, 0x73, 0x96, 0xac, 0x74, 0x22, 0xe7, 0xad, 0x35, 0x85, 0xe2, 0xf9, 0x37, 0xe8, 0x1c, 0x75, 0xdf, 0x6e, 0x47, 0xf1, 0x1a, 0x71, 0x1d, 0x29, 0xc5, 0x89, 0x6f, 0xb7, 0x62, 0x0e, 0xaa, 0x18, 0xbe, 0x1b, 0xfc, 0x56, 0x3e, 0x4b, 0xc6, 0xd2, 0x79, 0x20, 0x9a, 0xdb, 0xc0, 0xfe, 0x78, 0xcd, 0x5a, 0xf4, 0x1f, 0xdd, 0xa8, 0x33, 0x88, 0x07, 0xc7, 0x31, 0xb1, 0x12, 0x10, 0x59, 0x27, 0x80, 0xec, 0x5f, 0x60, 0x51, 0x7f, 0xa9, 0x19, 0xb5, 0x4a, 0x0d, 0x2d, 0xe5, 0x7a, 0x9f, 0x93, 0xc9, 0x9c, 0xef, 0xa0, 0xe0, 0x3b, 0x4d, 0xae, 0x2a, 0xf5, 0xb0, 0xc8, 0xeb, 0xbb, 0x3c, 0x83, 0x53, 0x99, 0x61, 0x17, 0x2b, 0x04, 0x7e, 0xba, 0x77, 0xd6, 0x26, 0xe1, 0x69, 0x14, 0x63, 0x55, 0x21, 0x0c, 0x7d]; // Transformations for encryption
+
+           var T1 = [0xc66363a5, 0xf87c7c84, 0xee777799, 0xf67b7b8d, 0xfff2f20d, 0xd66b6bbd, 0xde6f6fb1, 0x91c5c554, 0x60303050, 0x02010103, 0xce6767a9, 0x562b2b7d, 0xe7fefe19, 0xb5d7d762, 0x4dababe6, 0xec76769a, 0x8fcaca45, 0x1f82829d, 0x89c9c940, 0xfa7d7d87, 0xeffafa15, 0xb25959eb, 0x8e4747c9, 0xfbf0f00b, 0x41adadec, 0xb3d4d467, 0x5fa2a2fd, 0x45afafea, 0x239c9cbf, 0x53a4a4f7, 0xe4727296, 0x9bc0c05b, 0x75b7b7c2, 0xe1fdfd1c, 0x3d9393ae, 0x4c26266a, 0x6c36365a, 0x7e3f3f41, 0xf5f7f702, 0x83cccc4f, 0x6834345c, 0x51a5a5f4, 0xd1e5e534, 0xf9f1f108, 0xe2717193, 0xabd8d873, 0x62313153, 0x2a15153f, 0x0804040c, 0x95c7c752, 0x46232365, 0x9dc3c35e, 0x30181828, 0x379696a1, 0x0a05050f, 0x2f9a9ab5, 0x0e070709, 0x24121236, 0x1b80809b, 0xdfe2e23d, 0xcdebeb26, 0x4e272769, 0x7fb2b2cd, 0xea75759f, 0x1209091b, 0x1d83839e, 0x582c2c74, 0x341a1a2e, 0x361b1b2d, 0xdc6e6eb2, 0xb45a5aee, 0x5ba0a0fb, 0xa45252f6, 0x763b3b4d, 0xb7d6d661, 0x7db3b3ce, 0x5229297b, 0xdde3e33e, 0x5e2f2f71, 0x13848497, 0xa65353f5, 0xb9d1d168, 0x00000000, 0xc1eded2c, 0x40202060, 0xe3fcfc1f, 0x79b1b1c8, 0xb65b5bed, 0xd46a6abe, 0x8dcbcb46, 0x67bebed9, 0x7239394b, 0x944a4ade, 0x984c4cd4, 0xb05858e8, 0x85cfcf4a, 0xbbd0d06b, 0xc5efef2a, 0x4faaaae5, 0xedfbfb16, 0x864343c5, 0x9a4d4dd7, 0x66333355, 0x11858594, 0x8a4545cf, 0xe9f9f910, 0x04020206, 0xfe7f7f81, 0xa05050f0, 0x783c3c44, 0x259f9fba, 0x4ba8a8e3, 0xa25151f3, 0x5da3a3fe, 0x804040c0, 0x058f8f8a, 0x3f9292ad, 0x219d9dbc, 0x70383848, 0xf1f5f504, 0x63bcbcdf, 0x77b6b6c1, 0xafdada75, 0x42212163, 0x20101030, 0xe5ffff1a, 0xfdf3f30e, 0xbfd2d26d, 0x81cdcd4c, 0x180c0c14, 0x26131335, 0xc3ecec2f, 0xbe5f5fe1, 0x359797a2, 0x884444cc, 0x2e171739, 0x93c4c457, 0x55a7a7f2, 0xfc7e7e82, 0x7a3d3d47, 0xc86464ac, 0xba5d5de7, 0x3219192b, 0xe6737395, 0xc06060a0, 0x19818198, 0x9e4f4fd1, 0xa3dcdc7f, 0x44222266, 0x542a2a7e, 0x3b9090ab, 0x0b888883, 0x8c4646ca, 0xc7eeee29, 0x6bb8b8d3, 0x2814143c, 0xa7dede79, 0xbc5e5ee2, 0x160b0b1d, 0xaddbdb76, 0xdbe0e03b, 0x64323256, 0x743a3a4e, 0x140a0a1e, 0x924949db, 0x0c06060a, 0x4824246c, 0xb85c5ce4, 0x9fc2c25d, 0xbdd3d36e, 0x43acacef, 0xc46262a6, 0x399191a8, 0x319595a4, 0xd3e4e437, 0xf279798b, 0xd5e7e732, 0x8bc8c843, 0x6e373759, 0xda6d6db7, 0x018d8d8c, 0xb1d5d564, 0x9c4e4ed2, 0x49a9a9e0, 0xd86c6cb4, 0xac5656fa, 0xf3f4f407, 0xcfeaea25, 0xca6565af, 0xf47a7a8e, 0x47aeaee9, 0x10080818, 0x6fbabad5, 0xf0787888, 0x4a25256f, 0x5c2e2e72, 0x381c1c24, 0x57a6a6f1, 0x73b4b4c7, 0x97c6c651, 0xcbe8e823, 0xa1dddd7c, 0xe874749c, 0x3e1f1f21, 0x964b4bdd, 0x61bdbddc, 0x0d8b8b86, 0x0f8a8a85, 0xe0707090, 0x7c3e3e42, 0x71b5b5c4, 0xcc6666aa, 0x904848d8, 0x06030305, 0xf7f6f601, 0x1c0e0e12, 0xc26161a3, 0x6a35355f, 0xae5757f9, 0x69b9b9d0, 0x17868691, 0x99c1c158, 0x3a1d1d27, 0x279e9eb9, 0xd9e1e138, 0xebf8f813, 0x2b9898b3, 0x22111133, 0xd26969bb, 0xa9d9d970, 0x078e8e89, 0x339494a7, 0x2d9b9bb6, 0x3c1e1e22, 0x15878792, 0xc9e9e920, 0x87cece49, 0xaa5555ff, 0x50282878, 0xa5dfdf7a, 0x038c8c8f, 0x59a1a1f8, 0x09898980, 0x1a0d0d17, 0x65bfbfda, 0xd7e6e631, 0x844242c6, 0xd06868b8, 0x824141c3, 0x299999b0, 0x5a2d2d77, 0x1e0f0f11, 0x7bb0b0cb, 0xa85454fc, 0x6dbbbbd6, 0x2c16163a];
+           var T2 = [0xa5c66363, 0x84f87c7c, 0x99ee7777, 0x8df67b7b, 0x0dfff2f2, 0xbdd66b6b, 0xb1de6f6f, 0x5491c5c5, 0x50603030, 0x03020101, 0xa9ce6767, 0x7d562b2b, 0x19e7fefe, 0x62b5d7d7, 0xe64dabab, 0x9aec7676, 0x458fcaca, 0x9d1f8282, 0x4089c9c9, 0x87fa7d7d, 0x15effafa, 0xebb25959, 0xc98e4747, 0x0bfbf0f0, 0xec41adad, 0x67b3d4d4, 0xfd5fa2a2, 0xea45afaf, 0xbf239c9c, 0xf753a4a4, 0x96e47272, 0x5b9bc0c0, 0xc275b7b7, 0x1ce1fdfd, 0xae3d9393, 0x6a4c2626, 0x5a6c3636, 0x417e3f3f, 0x02f5f7f7, 0x4f83cccc, 0x5c683434, 0xf451a5a5, 0x34d1e5e5, 0x08f9f1f1, 0x93e27171, 0x73abd8d8, 0x53623131, 0x3f2a1515, 0x0c080404, 0x5295c7c7, 0x65462323, 0x5e9dc3c3, 0x28301818, 0xa1379696, 0x0f0a0505, 0xb52f9a9a, 0x090e0707, 0x36241212, 0x9b1b8080, 0x3ddfe2e2, 0x26cdebeb, 0x694e2727, 0xcd7fb2b2, 0x9fea7575, 0x1b120909, 0x9e1d8383, 0x74582c2c, 0x2e341a1a, 0x2d361b1b, 0xb2dc6e6e, 0xeeb45a5a, 0xfb5ba0a0, 0xf6a45252, 0x4d763b3b, 0x61b7d6d6, 0xce7db3b3, 0x7b522929, 0x3edde3e3, 0x715e2f2f, 0x97138484, 0xf5a65353, 0x68b9d1d1, 0x00000000, 0x2cc1eded, 0x60402020, 0x1fe3fcfc, 0xc879b1b1, 0xedb65b5b, 0xbed46a6a, 0x468dcbcb, 0xd967bebe, 0x4b723939, 0xde944a4a, 0xd4984c4c, 0xe8b05858, 0x4a85cfcf, 0x6bbbd0d0, 0x2ac5efef, 0xe54faaaa, 0x16edfbfb, 0xc5864343, 0xd79a4d4d, 0x55663333, 0x94118585, 0xcf8a4545, 0x10e9f9f9, 0x06040202, 0x81fe7f7f, 0xf0a05050, 0x44783c3c, 0xba259f9f, 0xe34ba8a8, 0xf3a25151, 0xfe5da3a3, 0xc0804040, 0x8a058f8f, 0xad3f9292, 0xbc219d9d, 0x48703838, 0x04f1f5f5, 0xdf63bcbc, 0xc177b6b6, 0x75afdada, 0x63422121, 0x30201010, 0x1ae5ffff, 0x0efdf3f3, 0x6dbfd2d2, 0x4c81cdcd, 0x14180c0c, 0x35261313, 0x2fc3ecec, 0xe1be5f5f, 0xa2359797, 0xcc884444, 0x392e1717, 0x5793c4c4, 0xf255a7a7, 0x82fc7e7e, 0x477a3d3d, 0xacc86464, 0xe7ba5d5d, 0x2b321919, 0x95e67373, 0xa0c06060, 0x98198181, 0xd19e4f4f, 0x7fa3dcdc, 0x66442222, 0x7e542a2a, 0xab3b9090, 0x830b8888, 0xca8c4646, 0x29c7eeee, 0xd36bb8b8, 0x3c281414, 0x79a7dede, 0xe2bc5e5e, 0x1d160b0b, 0x76addbdb, 0x3bdbe0e0, 0x56643232, 0x4e743a3a, 0x1e140a0a, 0xdb924949, 0x0a0c0606, 0x6c482424, 0xe4b85c5c, 0x5d9fc2c2, 0x6ebdd3d3, 0xef43acac, 0xa6c46262, 0xa8399191, 0xa4319595, 0x37d3e4e4, 0x8bf27979, 0x32d5e7e7, 0x438bc8c8, 0x596e3737, 0xb7da6d6d, 0x8c018d8d, 0x64b1d5d5, 0xd29c4e4e, 0xe049a9a9, 0xb4d86c6c, 0xfaac5656, 0x07f3f4f4, 0x25cfeaea, 0xafca6565, 0x8ef47a7a, 0xe947aeae, 0x18100808, 0xd56fbaba, 0x88f07878, 0x6f4a2525, 0x725c2e2e, 0x24381c1c, 0xf157a6a6, 0xc773b4b4, 0x5197c6c6, 0x23cbe8e8, 0x7ca1dddd, 0x9ce87474, 0x213e1f1f, 0xdd964b4b, 0xdc61bdbd, 0x860d8b8b, 0x850f8a8a, 0x90e07070, 0x427c3e3e, 0xc471b5b5, 0xaacc6666, 0xd8904848, 0x05060303, 0x01f7f6f6, 0x121c0e0e, 0xa3c26161, 0x5f6a3535, 0xf9ae5757, 0xd069b9b9, 0x91178686, 0x5899c1c1, 0x273a1d1d, 0xb9279e9e, 0x38d9e1e1, 0x13ebf8f8, 0xb32b9898, 0x33221111, 0xbbd26969, 0x70a9d9d9, 0x89078e8e, 0xa7339494, 0xb62d9b9b, 0x223c1e1e, 0x92158787, 0x20c9e9e9, 0x4987cece, 0xffaa5555, 0x78502828, 0x7aa5dfdf, 0x8f038c8c, 0xf859a1a1, 0x80098989, 0x171a0d0d, 0xda65bfbf, 0x31d7e6e6, 0xc6844242, 0xb8d06868, 0xc3824141, 0xb0299999, 0x775a2d2d, 0x111e0f0f, 0xcb7bb0b0, 0xfca85454, 0xd66dbbbb, 0x3a2c1616];
+           var T3 = [0x63a5c663, 0x7c84f87c, 0x7799ee77, 0x7b8df67b, 0xf20dfff2, 0x6bbdd66b, 0x6fb1de6f, 0xc55491c5, 0x30506030, 0x01030201, 0x67a9ce67, 0x2b7d562b, 0xfe19e7fe, 0xd762b5d7, 0xabe64dab, 0x769aec76, 0xca458fca, 0x829d1f82, 0xc94089c9, 0x7d87fa7d, 0xfa15effa, 0x59ebb259, 0x47c98e47, 0xf00bfbf0, 0xadec41ad, 0xd467b3d4, 0xa2fd5fa2, 0xafea45af, 0x9cbf239c, 0xa4f753a4, 0x7296e472, 0xc05b9bc0, 0xb7c275b7, 0xfd1ce1fd, 0x93ae3d93, 0x266a4c26, 0x365a6c36, 0x3f417e3f, 0xf702f5f7, 0xcc4f83cc, 0x345c6834, 0xa5f451a5, 0xe534d1e5, 0xf108f9f1, 0x7193e271, 0xd873abd8, 0x31536231, 0x153f2a15, 0x040c0804, 0xc75295c7, 0x23654623, 0xc35e9dc3, 0x18283018, 0x96a13796, 0x050f0a05, 0x9ab52f9a, 0x07090e07, 0x12362412, 0x809b1b80, 0xe23ddfe2, 0xeb26cdeb, 0x27694e27, 0xb2cd7fb2, 0x759fea75, 0x091b1209, 0x839e1d83, 0x2c74582c, 0x1a2e341a, 0x1b2d361b, 0x6eb2dc6e, 0x5aeeb45a, 0xa0fb5ba0, 0x52f6a452, 0x3b4d763b, 0xd661b7d6, 0xb3ce7db3, 0x297b5229, 0xe33edde3, 0x2f715e2f, 0x84971384, 0x53f5a653, 0xd168b9d1, 0x00000000, 0xed2cc1ed, 0x20604020, 0xfc1fe3fc, 0xb1c879b1, 0x5bedb65b, 0x6abed46a, 0xcb468dcb, 0xbed967be, 0x394b7239, 0x4ade944a, 0x4cd4984c, 0x58e8b058, 0xcf4a85cf, 0xd06bbbd0, 0xef2ac5ef, 0xaae54faa, 0xfb16edfb, 0x43c58643, 0x4dd79a4d, 0x33556633, 0x85941185, 0x45cf8a45, 0xf910e9f9, 0x02060402, 0x7f81fe7f, 0x50f0a050, 0x3c44783c, 0x9fba259f, 0xa8e34ba8, 0x51f3a251, 0xa3fe5da3, 0x40c08040, 0x8f8a058f, 0x92ad3f92, 0x9dbc219d, 0x38487038, 0xf504f1f5, 0xbcdf63bc, 0xb6c177b6, 0xda75afda, 0x21634221, 0x10302010, 0xff1ae5ff, 0xf30efdf3, 0xd26dbfd2, 0xcd4c81cd, 0x0c14180c, 0x13352613, 0xec2fc3ec, 0x5fe1be5f, 0x97a23597, 0x44cc8844, 0x17392e17, 0xc45793c4, 0xa7f255a7, 0x7e82fc7e, 0x3d477a3d, 0x64acc864, 0x5de7ba5d, 0x192b3219, 0x7395e673, 0x60a0c060, 0x81981981, 0x4fd19e4f, 0xdc7fa3dc, 0x22664422, 0x2a7e542a, 0x90ab3b90, 0x88830b88, 0x46ca8c46, 0xee29c7ee, 0xb8d36bb8, 0x143c2814, 0xde79a7de, 0x5ee2bc5e, 0x0b1d160b, 0xdb76addb, 0xe03bdbe0, 0x32566432, 0x3a4e743a, 0x0a1e140a, 0x49db9249, 0x060a0c06, 0x246c4824, 0x5ce4b85c, 0xc25d9fc2, 0xd36ebdd3, 0xacef43ac, 0x62a6c462, 0x91a83991, 0x95a43195, 0xe437d3e4, 0x798bf279, 0xe732d5e7, 0xc8438bc8, 0x37596e37, 0x6db7da6d, 0x8d8c018d, 0xd564b1d5, 0x4ed29c4e, 0xa9e049a9, 0x6cb4d86c, 0x56faac56, 0xf407f3f4, 0xea25cfea, 0x65afca65, 0x7a8ef47a, 0xaee947ae, 0x08181008, 0xbad56fba, 0x7888f078, 0x256f4a25, 0x2e725c2e, 0x1c24381c, 0xa6f157a6, 0xb4c773b4, 0xc65197c6, 0xe823cbe8, 0xdd7ca1dd, 0x749ce874, 0x1f213e1f, 0x4bdd964b, 0xbddc61bd, 0x8b860d8b, 0x8a850f8a, 0x7090e070, 0x3e427c3e, 0xb5c471b5, 0x66aacc66, 0x48d89048, 0x03050603, 0xf601f7f6, 0x0e121c0e, 0x61a3c261, 0x355f6a35, 0x57f9ae57, 0xb9d069b9, 0x86911786, 0xc15899c1, 0x1d273a1d, 0x9eb9279e, 0xe138d9e1, 0xf813ebf8, 0x98b32b98, 0x11332211, 0x69bbd269, 0xd970a9d9, 0x8e89078e, 0x94a73394, 0x9bb62d9b, 0x1e223c1e, 0x87921587, 0xe920c9e9, 0xce4987ce, 0x55ffaa55, 0x28785028, 0xdf7aa5df, 0x8c8f038c, 0xa1f859a1, 0x89800989, 0x0d171a0d, 0xbfda65bf, 0xe631d7e6, 0x42c68442, 0x68b8d068, 0x41c38241, 0x99b02999, 0x2d775a2d, 0x0f111e0f, 0xb0cb7bb0, 0x54fca854, 0xbbd66dbb, 0x163a2c16];
+           var T4 = [0x6363a5c6, 0x7c7c84f8, 0x777799ee, 0x7b7b8df6, 0xf2f20dff, 0x6b6bbdd6, 0x6f6fb1de, 0xc5c55491, 0x30305060, 0x01010302, 0x6767a9ce, 0x2b2b7d56, 0xfefe19e7, 0xd7d762b5, 0xababe64d, 0x76769aec, 0xcaca458f, 0x82829d1f, 0xc9c94089, 0x7d7d87fa, 0xfafa15ef, 0x5959ebb2, 0x4747c98e, 0xf0f00bfb, 0xadadec41, 0xd4d467b3, 0xa2a2fd5f, 0xafafea45, 0x9c9cbf23, 0xa4a4f753, 0x727296e4, 0xc0c05b9b, 0xb7b7c275, 0xfdfd1ce1, 0x9393ae3d, 0x26266a4c, 0x36365a6c, 0x3f3f417e, 0xf7f702f5, 0xcccc4f83, 0x34345c68, 0xa5a5f451, 0xe5e534d1, 0xf1f108f9, 0x717193e2, 0xd8d873ab, 0x31315362, 0x15153f2a, 0x04040c08, 0xc7c75295, 0x23236546, 0xc3c35e9d, 0x18182830, 0x9696a137, 0x05050f0a, 0x9a9ab52f, 0x0707090e, 0x12123624, 0x80809b1b, 0xe2e23ddf, 0xebeb26cd, 0x2727694e, 0xb2b2cd7f, 0x75759fea, 0x09091b12, 0x83839e1d, 0x2c2c7458, 0x1a1a2e34, 0x1b1b2d36, 0x6e6eb2dc, 0x5a5aeeb4, 0xa0a0fb5b, 0x5252f6a4, 0x3b3b4d76, 0xd6d661b7, 0xb3b3ce7d, 0x29297b52, 0xe3e33edd, 0x2f2f715e, 0x84849713, 0x5353f5a6, 0xd1d168b9, 0x00000000, 0xeded2cc1, 0x20206040, 0xfcfc1fe3, 0xb1b1c879, 0x5b5bedb6, 0x6a6abed4, 0xcbcb468d, 0xbebed967, 0x39394b72, 0x4a4ade94, 0x4c4cd498, 0x5858e8b0, 0xcfcf4a85, 0xd0d06bbb, 0xefef2ac5, 0xaaaae54f, 0xfbfb16ed, 0x4343c586, 0x4d4dd79a, 0x33335566, 0x85859411, 0x4545cf8a, 0xf9f910e9, 0x02020604, 0x7f7f81fe, 0x5050f0a0, 0x3c3c4478, 0x9f9fba25, 0xa8a8e34b, 0x5151f3a2, 0xa3a3fe5d, 0x4040c080, 0x8f8f8a05, 0x9292ad3f, 0x9d9dbc21, 0x38384870, 0xf5f504f1, 0xbcbcdf63, 0xb6b6c177, 0xdada75af, 0x21216342, 0x10103020, 0xffff1ae5, 0xf3f30efd, 0xd2d26dbf, 0xcdcd4c81, 0x0c0c1418, 0x13133526, 0xecec2fc3, 0x5f5fe1be, 0x9797a235, 0x4444cc88, 0x1717392e, 0xc4c45793, 0xa7a7f255, 0x7e7e82fc, 0x3d3d477a, 0x6464acc8, 0x5d5de7ba, 0x19192b32, 0x737395e6, 0x6060a0c0, 0x81819819, 0x4f4fd19e, 0xdcdc7fa3, 0x22226644, 0x2a2a7e54, 0x9090ab3b, 0x8888830b, 0x4646ca8c, 0xeeee29c7, 0xb8b8d36b, 0x14143c28, 0xdede79a7, 0x5e5ee2bc, 0x0b0b1d16, 0xdbdb76ad, 0xe0e03bdb, 0x32325664, 0x3a3a4e74, 0x0a0a1e14, 0x4949db92, 0x06060a0c, 0x24246c48, 0x5c5ce4b8, 0xc2c25d9f, 0xd3d36ebd, 0xacacef43, 0x6262a6c4, 0x9191a839, 0x9595a431, 0xe4e437d3, 0x79798bf2, 0xe7e732d5, 0xc8c8438b, 0x3737596e, 0x6d6db7da, 0x8d8d8c01, 0xd5d564b1, 0x4e4ed29c, 0xa9a9e049, 0x6c6cb4d8, 0x5656faac, 0xf4f407f3, 0xeaea25cf, 0x6565afca, 0x7a7a8ef4, 0xaeaee947, 0x08081810, 0xbabad56f, 0x787888f0, 0x25256f4a, 0x2e2e725c, 0x1c1c2438, 0xa6a6f157, 0xb4b4c773, 0xc6c65197, 0xe8e823cb, 0xdddd7ca1, 0x74749ce8, 0x1f1f213e, 0x4b4bdd96, 0xbdbddc61, 0x8b8b860d, 0x8a8a850f, 0x707090e0, 0x3e3e427c, 0xb5b5c471, 0x6666aacc, 0x4848d890, 0x03030506, 0xf6f601f7, 0x0e0e121c, 0x6161a3c2, 0x35355f6a, 0x5757f9ae, 0xb9b9d069, 0x86869117, 0xc1c15899, 0x1d1d273a, 0x9e9eb927, 0xe1e138d9, 0xf8f813eb, 0x9898b32b, 0x11113322, 0x6969bbd2, 0xd9d970a9, 0x8e8e8907, 0x9494a733, 0x9b9bb62d, 0x1e1e223c, 0x87879215, 0xe9e920c9, 0xcece4987, 0x5555ffaa, 0x28287850, 0xdfdf7aa5, 0x8c8c8f03, 0xa1a1f859, 0x89898009, 0x0d0d171a, 0xbfbfda65, 0xe6e631d7, 0x4242c684, 0x6868b8d0, 0x4141c382, 0x9999b029, 0x2d2d775a, 0x0f0f111e, 0xb0b0cb7b, 0x5454fca8, 0xbbbbd66d, 0x16163a2c]; // Transformations for decryption
+
+           var T5 = [0x51f4a750, 0x7e416553, 0x1a17a4c3, 0x3a275e96, 0x3bab6bcb, 0x1f9d45f1, 0xacfa58ab, 0x4be30393, 0x2030fa55, 0xad766df6, 0x88cc7691, 0xf5024c25, 0x4fe5d7fc, 0xc52acbd7, 0x26354480, 0xb562a38f, 0xdeb15a49, 0x25ba1b67, 0x45ea0e98, 0x5dfec0e1, 0xc32f7502, 0x814cf012, 0x8d4697a3, 0x6bd3f9c6, 0x038f5fe7, 0x15929c95, 0xbf6d7aeb, 0x955259da, 0xd4be832d, 0x587421d3, 0x49e06929, 0x8ec9c844, 0x75c2896a, 0xf48e7978, 0x99583e6b, 0x27b971dd, 0xbee14fb6, 0xf088ad17, 0xc920ac66, 0x7dce3ab4, 0x63df4a18, 0xe51a3182, 0x97513360, 0x62537f45, 0xb16477e0, 0xbb6bae84, 0xfe81a01c, 0xf9082b94, 0x70486858, 0x8f45fd19, 0x94de6c87, 0x527bf8b7, 0xab73d323, 0x724b02e2, 0xe31f8f57, 0x6655ab2a, 0xb2eb2807, 0x2fb5c203, 0x86c57b9a, 0xd33708a5, 0x302887f2, 0x23bfa5b2, 0x02036aba, 0xed16825c, 0x8acf1c2b, 0xa779b492, 0xf307f2f0, 0x4e69e2a1, 0x65daf4cd, 0x0605bed5, 0xd134621f, 0xc4a6fe8a, 0x342e539d, 0xa2f355a0, 0x058ae132, 0xa4f6eb75, 0x0b83ec39, 0x4060efaa, 0x5e719f06, 0xbd6e1051, 0x3e218af9, 0x96dd063d, 0xdd3e05ae, 0x4de6bd46, 0x91548db5, 0x71c45d05, 0x0406d46f, 0x605015ff, 0x1998fb24, 0xd6bde997, 0x894043cc, 0x67d99e77, 0xb0e842bd, 0x07898b88, 0xe7195b38, 0x79c8eedb, 0xa17c0a47, 0x7c420fe9, 0xf8841ec9, 0x00000000, 0x09808683, 0x322bed48, 0x1e1170ac, 0x6c5a724e, 0xfd0efffb, 0x0f853856, 0x3daed51e, 0x362d3927, 0x0a0fd964, 0x685ca621, 0x9b5b54d1, 0x24362e3a, 0x0c0a67b1, 0x9357e70f, 0xb4ee96d2, 0x1b9b919e, 0x80c0c54f, 0x61dc20a2, 0x5a774b69, 0x1c121a16, 0xe293ba0a, 0xc0a02ae5, 0x3c22e043, 0x121b171d, 0x0e090d0b, 0xf28bc7ad, 0x2db6a8b9, 0x141ea9c8, 0x57f11985, 0xaf75074c, 0xee99ddbb, 0xa37f60fd, 0xf701269f, 0x5c72f5bc, 0x44663bc5, 0x5bfb7e34, 0x8b432976, 0xcb23c6dc, 0xb6edfc68, 0xb8e4f163, 0xd731dcca, 0x42638510, 0x13972240, 0x84c61120, 0x854a247d, 0xd2bb3df8, 0xaef93211, 0xc729a16d, 0x1d9e2f4b, 0xdcb230f3, 0x0d8652ec, 0x77c1e3d0, 0x2bb3166c, 0xa970b999, 0x119448fa, 0x47e96422, 0xa8fc8cc4, 0xa0f03f1a, 0x567d2cd8, 0x223390ef, 0x87494ec7, 0xd938d1c1, 0x8ccaa2fe, 0x98d40b36, 0xa6f581cf, 0xa57ade28, 0xdab78e26, 0x3fadbfa4, 0x2c3a9de4, 0x5078920d, 0x6a5fcc9b, 0x547e4662, 0xf68d13c2, 0x90d8b8e8, 0x2e39f75e, 0x82c3aff5, 0x9f5d80be, 0x69d0937c, 0x6fd52da9, 0xcf2512b3, 0xc8ac993b, 0x10187da7, 0xe89c636e, 0xdb3bbb7b, 0xcd267809, 0x6e5918f4, 0xec9ab701, 0x834f9aa8, 0xe6956e65, 0xaaffe67e, 0x21bccf08, 0xef15e8e6, 0xbae79bd9, 0x4a6f36ce, 0xea9f09d4, 0x29b07cd6, 0x31a4b2af, 0x2a3f2331, 0xc6a59430, 0x35a266c0, 0x744ebc37, 0xfc82caa6, 0xe090d0b0, 0x33a7d815, 0xf104984a, 0x41ecdaf7, 0x7fcd500e, 0x1791f62f, 0x764dd68d, 0x43efb04d, 0xccaa4d54, 0xe49604df, 0x9ed1b5e3, 0x4c6a881b, 0xc12c1fb8, 0x4665517f, 0x9d5eea04, 0x018c355d, 0xfa877473, 0xfb0b412e, 0xb3671d5a, 0x92dbd252, 0xe9105633, 0x6dd64713, 0x9ad7618c, 0x37a10c7a, 0x59f8148e, 0xeb133c89, 0xcea927ee, 0xb761c935, 0xe11ce5ed, 0x7a47b13c, 0x9cd2df59, 0x55f2733f, 0x1814ce79, 0x73c737bf, 0x53f7cdea, 0x5ffdaa5b, 0xdf3d6f14, 0x7844db86, 0xcaaff381, 0xb968c43e, 0x3824342c, 0xc2a3405f, 0x161dc372, 0xbce2250c, 0x283c498b, 0xff0d9541, 0x39a80171, 0x080cb3de, 0xd8b4e49c, 0x6456c190, 0x7bcb8461, 0xd532b670, 0x486c5c74, 0xd0b85742];
+           var T6 = [0x5051f4a7, 0x537e4165, 0xc31a17a4, 0x963a275e, 0xcb3bab6b, 0xf11f9d45, 0xabacfa58, 0x934be303, 0x552030fa, 0xf6ad766d, 0x9188cc76, 0x25f5024c, 0xfc4fe5d7, 0xd7c52acb, 0x80263544, 0x8fb562a3, 0x49deb15a, 0x6725ba1b, 0x9845ea0e, 0xe15dfec0, 0x02c32f75, 0x12814cf0, 0xa38d4697, 0xc66bd3f9, 0xe7038f5f, 0x9515929c, 0xebbf6d7a, 0xda955259, 0x2dd4be83, 0xd3587421, 0x2949e069, 0x448ec9c8, 0x6a75c289, 0x78f48e79, 0x6b99583e, 0xdd27b971, 0xb6bee14f, 0x17f088ad, 0x66c920ac, 0xb47dce3a, 0x1863df4a, 0x82e51a31, 0x60975133, 0x4562537f, 0xe0b16477, 0x84bb6bae, 0x1cfe81a0, 0x94f9082b, 0x58704868, 0x198f45fd, 0x8794de6c, 0xb7527bf8, 0x23ab73d3, 0xe2724b02, 0x57e31f8f, 0x2a6655ab, 0x07b2eb28, 0x032fb5c2, 0x9a86c57b, 0xa5d33708, 0xf2302887, 0xb223bfa5, 0xba02036a, 0x5ced1682, 0x2b8acf1c, 0x92a779b4, 0xf0f307f2, 0xa14e69e2, 0xcd65daf4, 0xd50605be, 0x1fd13462, 0x8ac4a6fe, 0x9d342e53, 0xa0a2f355, 0x32058ae1, 0x75a4f6eb, 0x390b83ec, 0xaa4060ef, 0x065e719f, 0x51bd6e10, 0xf93e218a, 0x3d96dd06, 0xaedd3e05, 0x464de6bd, 0xb591548d, 0x0571c45d, 0x6f0406d4, 0xff605015, 0x241998fb, 0x97d6bde9, 0xcc894043, 0x7767d99e, 0xbdb0e842, 0x8807898b, 0x38e7195b, 0xdb79c8ee, 0x47a17c0a, 0xe97c420f, 0xc9f8841e, 0x00000000, 0x83098086, 0x48322bed, 0xac1e1170, 0x4e6c5a72, 0xfbfd0eff, 0x560f8538, 0x1e3daed5, 0x27362d39, 0x640a0fd9, 0x21685ca6, 0xd19b5b54, 0x3a24362e, 0xb10c0a67, 0x0f9357e7, 0xd2b4ee96, 0x9e1b9b91, 0x4f80c0c5, 0xa261dc20, 0x695a774b, 0x161c121a, 0x0ae293ba, 0xe5c0a02a, 0x433c22e0, 0x1d121b17, 0x0b0e090d, 0xadf28bc7, 0xb92db6a8, 0xc8141ea9, 0x8557f119, 0x4caf7507, 0xbbee99dd, 0xfda37f60, 0x9ff70126, 0xbc5c72f5, 0xc544663b, 0x345bfb7e, 0x768b4329, 0xdccb23c6, 0x68b6edfc, 0x63b8e4f1, 0xcad731dc, 0x10426385, 0x40139722, 0x2084c611, 0x7d854a24, 0xf8d2bb3d, 0x11aef932, 0x6dc729a1, 0x4b1d9e2f, 0xf3dcb230, 0xec0d8652, 0xd077c1e3, 0x6c2bb316, 0x99a970b9, 0xfa119448, 0x2247e964, 0xc4a8fc8c, 0x1aa0f03f, 0xd8567d2c, 0xef223390, 0xc787494e, 0xc1d938d1, 0xfe8ccaa2, 0x3698d40b, 0xcfa6f581, 0x28a57ade, 0x26dab78e, 0xa43fadbf, 0xe42c3a9d, 0x0d507892, 0x9b6a5fcc, 0x62547e46, 0xc2f68d13, 0xe890d8b8, 0x5e2e39f7, 0xf582c3af, 0xbe9f5d80, 0x7c69d093, 0xa96fd52d, 0xb3cf2512, 0x3bc8ac99, 0xa710187d, 0x6ee89c63, 0x7bdb3bbb, 0x09cd2678, 0xf46e5918, 0x01ec9ab7, 0xa8834f9a, 0x65e6956e, 0x7eaaffe6, 0x0821bccf, 0xe6ef15e8, 0xd9bae79b, 0xce4a6f36, 0xd4ea9f09, 0xd629b07c, 0xaf31a4b2, 0x312a3f23, 0x30c6a594, 0xc035a266, 0x37744ebc, 0xa6fc82ca, 0xb0e090d0, 0x1533a7d8, 0x4af10498, 0xf741ecda, 0x0e7fcd50, 0x2f1791f6, 0x8d764dd6, 0x4d43efb0, 0x54ccaa4d, 0xdfe49604, 0xe39ed1b5, 0x1b4c6a88, 0xb8c12c1f, 0x7f466551, 0x049d5eea, 0x5d018c35, 0x73fa8774, 0x2efb0b41, 0x5ab3671d, 0x5292dbd2, 0x33e91056, 0x136dd647, 0x8c9ad761, 0x7a37a10c, 0x8e59f814, 0x89eb133c, 0xeecea927, 0x35b761c9, 0xede11ce5, 0x3c7a47b1, 0x599cd2df, 0x3f55f273, 0x791814ce, 0xbf73c737, 0xea53f7cd, 0x5b5ffdaa, 0x14df3d6f, 0x867844db, 0x81caaff3, 0x3eb968c4, 0x2c382434, 0x5fc2a340, 0x72161dc3, 0x0cbce225, 0x8b283c49, 0x41ff0d95, 0x7139a801, 0xde080cb3, 0x9cd8b4e4, 0x906456c1, 0x617bcb84, 0x70d532b6, 0x74486c5c, 0x42d0b857];
+           var T7 = [0xa75051f4, 0x65537e41, 0xa4c31a17, 0x5e963a27, 0x6bcb3bab, 0x45f11f9d, 0x58abacfa, 0x03934be3, 0xfa552030, 0x6df6ad76, 0x769188cc, 0x4c25f502, 0xd7fc4fe5, 0xcbd7c52a, 0x44802635, 0xa38fb562, 0x5a49deb1, 0x1b6725ba, 0x0e9845ea, 0xc0e15dfe, 0x7502c32f, 0xf012814c, 0x97a38d46, 0xf9c66bd3, 0x5fe7038f, 0x9c951592, 0x7aebbf6d, 0x59da9552, 0x832dd4be, 0x21d35874, 0x692949e0, 0xc8448ec9, 0x896a75c2, 0x7978f48e, 0x3e6b9958, 0x71dd27b9, 0x4fb6bee1, 0xad17f088, 0xac66c920, 0x3ab47dce, 0x4a1863df, 0x3182e51a, 0x33609751, 0x7f456253, 0x77e0b164, 0xae84bb6b, 0xa01cfe81, 0x2b94f908, 0x68587048, 0xfd198f45, 0x6c8794de, 0xf8b7527b, 0xd323ab73, 0x02e2724b, 0x8f57e31f, 0xab2a6655, 0x2807b2eb, 0xc2032fb5, 0x7b9a86c5, 0x08a5d337, 0x87f23028, 0xa5b223bf, 0x6aba0203, 0x825ced16, 0x1c2b8acf, 0xb492a779, 0xf2f0f307, 0xe2a14e69, 0xf4cd65da, 0xbed50605, 0x621fd134, 0xfe8ac4a6, 0x539d342e, 0x55a0a2f3, 0xe132058a, 0xeb75a4f6, 0xec390b83, 0xefaa4060, 0x9f065e71, 0x1051bd6e, 0x8af93e21, 0x063d96dd, 0x05aedd3e, 0xbd464de6, 0x8db59154, 0x5d0571c4, 0xd46f0406, 0x15ff6050, 0xfb241998, 0xe997d6bd, 0x43cc8940, 0x9e7767d9, 0x42bdb0e8, 0x8b880789, 0x5b38e719, 0xeedb79c8, 0x0a47a17c, 0x0fe97c42, 0x1ec9f884, 0x00000000, 0x86830980, 0xed48322b, 0x70ac1e11, 0x724e6c5a, 0xfffbfd0e, 0x38560f85, 0xd51e3dae, 0x3927362d, 0xd9640a0f, 0xa621685c, 0x54d19b5b, 0x2e3a2436, 0x67b10c0a, 0xe70f9357, 0x96d2b4ee, 0x919e1b9b, 0xc54f80c0, 0x20a261dc, 0x4b695a77, 0x1a161c12, 0xba0ae293, 0x2ae5c0a0, 0xe0433c22, 0x171d121b, 0x0d0b0e09, 0xc7adf28b, 0xa8b92db6, 0xa9c8141e, 0x198557f1, 0x074caf75, 0xddbbee99, 0x60fda37f, 0x269ff701, 0xf5bc5c72, 0x3bc54466, 0x7e345bfb, 0x29768b43, 0xc6dccb23, 0xfc68b6ed, 0xf163b8e4, 0xdccad731, 0x85104263, 0x22401397, 0x112084c6, 0x247d854a, 0x3df8d2bb, 0x3211aef9, 0xa16dc729, 0x2f4b1d9e, 0x30f3dcb2, 0x52ec0d86, 0xe3d077c1, 0x166c2bb3, 0xb999a970, 0x48fa1194, 0x642247e9, 0x8cc4a8fc, 0x3f1aa0f0, 0x2cd8567d, 0x90ef2233, 0x4ec78749, 0xd1c1d938, 0xa2fe8cca, 0x0b3698d4, 0x81cfa6f5, 0xde28a57a, 0x8e26dab7, 0xbfa43fad, 0x9de42c3a, 0x920d5078, 0xcc9b6a5f, 0x4662547e, 0x13c2f68d, 0xb8e890d8, 0xf75e2e39, 0xaff582c3, 0x80be9f5d, 0x937c69d0, 0x2da96fd5, 0x12b3cf25, 0x993bc8ac, 0x7da71018, 0x636ee89c, 0xbb7bdb3b, 0x7809cd26, 0x18f46e59, 0xb701ec9a, 0x9aa8834f, 0x6e65e695, 0xe67eaaff, 0xcf0821bc, 0xe8e6ef15, 0x9bd9bae7, 0x36ce4a6f, 0x09d4ea9f, 0x7cd629b0, 0xb2af31a4, 0x23312a3f, 0x9430c6a5, 0x66c035a2, 0xbc37744e, 0xcaa6fc82, 0xd0b0e090, 0xd81533a7, 0x984af104, 0xdaf741ec, 0x500e7fcd, 0xf62f1791, 0xd68d764d, 0xb04d43ef, 0x4d54ccaa, 0x04dfe496, 0xb5e39ed1, 0x881b4c6a, 0x1fb8c12c, 0x517f4665, 0xea049d5e, 0x355d018c, 0x7473fa87, 0x412efb0b, 0x1d5ab367, 0xd25292db, 0x5633e910, 0x47136dd6, 0x618c9ad7, 0x0c7a37a1, 0x148e59f8, 0x3c89eb13, 0x27eecea9, 0xc935b761, 0xe5ede11c, 0xb13c7a47, 0xdf599cd2, 0x733f55f2, 0xce791814, 0x37bf73c7, 0xcdea53f7, 0xaa5b5ffd, 0x6f14df3d, 0xdb867844, 0xf381caaf, 0xc43eb968, 0x342c3824, 0x405fc2a3, 0xc372161d, 0x250cbce2, 0x498b283c, 0x9541ff0d, 0x017139a8, 0xb3de080c, 0xe49cd8b4, 0xc1906456, 0x84617bcb, 0xb670d532, 0x5c74486c, 0x5742d0b8];
+           var T8 = [0xf4a75051, 0x4165537e, 0x17a4c31a, 0x275e963a, 0xab6bcb3b, 0x9d45f11f, 0xfa58abac, 0xe303934b, 0x30fa5520, 0x766df6ad, 0xcc769188, 0x024c25f5, 0xe5d7fc4f, 0x2acbd7c5, 0x35448026, 0x62a38fb5, 0xb15a49de, 0xba1b6725, 0xea0e9845, 0xfec0e15d, 0x2f7502c3, 0x4cf01281, 0x4697a38d, 0xd3f9c66b, 0x8f5fe703, 0x929c9515, 0x6d7aebbf, 0x5259da95, 0xbe832dd4, 0x7421d358, 0xe0692949, 0xc9c8448e, 0xc2896a75, 0x8e7978f4, 0x583e6b99, 0xb971dd27, 0xe14fb6be, 0x88ad17f0, 0x20ac66c9, 0xce3ab47d, 0xdf4a1863, 0x1a3182e5, 0x51336097, 0x537f4562, 0x6477e0b1, 0x6bae84bb, 0x81a01cfe, 0x082b94f9, 0x48685870, 0x45fd198f, 0xde6c8794, 0x7bf8b752, 0x73d323ab, 0x4b02e272, 0x1f8f57e3, 0x55ab2a66, 0xeb2807b2, 0xb5c2032f, 0xc57b9a86, 0x3708a5d3, 0x2887f230, 0xbfa5b223, 0x036aba02, 0x16825ced, 0xcf1c2b8a, 0x79b492a7, 0x07f2f0f3, 0x69e2a14e, 0xdaf4cd65, 0x05bed506, 0x34621fd1, 0xa6fe8ac4, 0x2e539d34, 0xf355a0a2, 0x8ae13205, 0xf6eb75a4, 0x83ec390b, 0x60efaa40, 0x719f065e, 0x6e1051bd, 0x218af93e, 0xdd063d96, 0x3e05aedd, 0xe6bd464d, 0x548db591, 0xc45d0571, 0x06d46f04, 0x5015ff60, 0x98fb2419, 0xbde997d6, 0x4043cc89, 0xd99e7767, 0xe842bdb0, 0x898b8807, 0x195b38e7, 0xc8eedb79, 0x7c0a47a1, 0x420fe97c, 0x841ec9f8, 0x00000000, 0x80868309, 0x2bed4832, 0x1170ac1e, 0x5a724e6c, 0x0efffbfd, 0x8538560f, 0xaed51e3d, 0x2d392736, 0x0fd9640a, 0x5ca62168, 0x5b54d19b, 0x362e3a24, 0x0a67b10c, 0x57e70f93, 0xee96d2b4, 0x9b919e1b, 0xc0c54f80, 0xdc20a261, 0x774b695a, 0x121a161c, 0x93ba0ae2, 0xa02ae5c0, 0x22e0433c, 0x1b171d12, 0x090d0b0e, 0x8bc7adf2, 0xb6a8b92d, 0x1ea9c814, 0xf1198557, 0x75074caf, 0x99ddbbee, 0x7f60fda3, 0x01269ff7, 0x72f5bc5c, 0x663bc544, 0xfb7e345b, 0x4329768b, 0x23c6dccb, 0xedfc68b6, 0xe4f163b8, 0x31dccad7, 0x63851042, 0x97224013, 0xc6112084, 0x4a247d85, 0xbb3df8d2, 0xf93211ae, 0x29a16dc7, 0x9e2f4b1d, 0xb230f3dc, 0x8652ec0d, 0xc1e3d077, 0xb3166c2b, 0x70b999a9, 0x9448fa11, 0xe9642247, 0xfc8cc4a8, 0xf03f1aa0, 0x7d2cd856, 0x3390ef22, 0x494ec787, 0x38d1c1d9, 0xcaa2fe8c, 0xd40b3698, 0xf581cfa6, 0x7ade28a5, 0xb78e26da, 0xadbfa43f, 0x3a9de42c, 0x78920d50, 0x5fcc9b6a, 0x7e466254, 0x8d13c2f6, 0xd8b8e890, 0x39f75e2e, 0xc3aff582, 0x5d80be9f, 0xd0937c69, 0xd52da96f, 0x2512b3cf, 0xac993bc8, 0x187da710, 0x9c636ee8, 0x3bbb7bdb, 0x267809cd, 0x5918f46e, 0x9ab701ec, 0x4f9aa883, 0x956e65e6, 0xffe67eaa, 0xbccf0821, 0x15e8e6ef, 0xe79bd9ba, 0x6f36ce4a, 0x9f09d4ea, 0xb07cd629, 0xa4b2af31, 0x3f23312a, 0xa59430c6, 0xa266c035, 0x4ebc3774, 0x82caa6fc, 0x90d0b0e0, 0xa7d81533, 0x04984af1, 0xecdaf741, 0xcd500e7f, 0x91f62f17, 0x4dd68d76, 0xefb04d43, 0xaa4d54cc, 0x9604dfe4, 0xd1b5e39e, 0x6a881b4c, 0x2c1fb8c1, 0x65517f46, 0x5eea049d, 0x8c355d01, 0x877473fa, 0x0b412efb, 0x671d5ab3, 0xdbd25292, 0x105633e9, 0xd647136d, 0xd7618c9a, 0xa10c7a37, 0xf8148e59, 0x133c89eb, 0xa927eece, 0x61c935b7, 0x1ce5ede1, 0x47b13c7a, 0xd2df599c, 0xf2733f55, 0x14ce7918, 0xc737bf73, 0xf7cdea53, 0xfdaa5b5f, 0x3d6f14df, 0x44db8678, 0xaff381ca, 0x68c43eb9, 0x24342c38, 0xa3405fc2, 0x1dc37216, 0xe2250cbc, 0x3c498b28, 0x0d9541ff, 0xa8017139, 0x0cb3de08, 0xb4e49cd8, 0x56c19064, 0xcb84617b, 0x32b670d5, 0x6c5c7448, 0xb85742d0]; // Transformations for decryption key expansion
+
+           var U1 = [0x00000000, 0x0e090d0b, 0x1c121a16, 0x121b171d, 0x3824342c, 0x362d3927, 0x24362e3a, 0x2a3f2331, 0x70486858, 0x7e416553, 0x6c5a724e, 0x62537f45, 0x486c5c74, 0x4665517f, 0x547e4662, 0x5a774b69, 0xe090d0b0, 0xee99ddbb, 0xfc82caa6, 0xf28bc7ad, 0xd8b4e49c, 0xd6bde997, 0xc4a6fe8a, 0xcaaff381, 0x90d8b8e8, 0x9ed1b5e3, 0x8ccaa2fe, 0x82c3aff5, 0xa8fc8cc4, 0xa6f581cf, 0xb4ee96d2, 0xbae79bd9, 0xdb3bbb7b, 0xd532b670, 0xc729a16d, 0xc920ac66, 0xe31f8f57, 0xed16825c, 0xff0d9541, 0xf104984a, 0xab73d323, 0xa57ade28, 0xb761c935, 0xb968c43e, 0x9357e70f, 0x9d5eea04, 0x8f45fd19, 0x814cf012, 0x3bab6bcb, 0x35a266c0, 0x27b971dd, 0x29b07cd6, 0x038f5fe7, 0x0d8652ec, 0x1f9d45f1, 0x119448fa, 0x4be30393, 0x45ea0e98, 0x57f11985, 0x59f8148e, 0x73c737bf, 0x7dce3ab4, 0x6fd52da9, 0x61dc20a2, 0xad766df6, 0xa37f60fd, 0xb16477e0, 0xbf6d7aeb, 0x955259da, 0x9b5b54d1, 0x894043cc, 0x87494ec7, 0xdd3e05ae, 0xd33708a5, 0xc12c1fb8, 0xcf2512b3, 0xe51a3182, 0xeb133c89, 0xf9082b94, 0xf701269f, 0x4de6bd46, 0x43efb04d, 0x51f4a750, 0x5ffdaa5b, 0x75c2896a, 0x7bcb8461, 0x69d0937c, 0x67d99e77, 0x3daed51e, 0x33a7d815, 0x21bccf08, 0x2fb5c203, 0x058ae132, 0x0b83ec39, 0x1998fb24, 0x1791f62f, 0x764dd68d, 0x7844db86, 0x6a5fcc9b, 0x6456c190, 0x4e69e2a1, 0x4060efaa, 0x527bf8b7, 0x5c72f5bc, 0x0605bed5, 0x080cb3de, 0x1a17a4c3, 0x141ea9c8, 0x3e218af9, 0x302887f2, 0x223390ef, 0x2c3a9de4, 0x96dd063d, 0x98d40b36, 0x8acf1c2b, 0x84c61120, 0xaef93211, 0xa0f03f1a, 0xb2eb2807, 0xbce2250c, 0xe6956e65, 0xe89c636e, 0xfa877473, 0xf48e7978, 0xdeb15a49, 0xd0b85742, 0xc2a3405f, 0xccaa4d54, 0x41ecdaf7, 0x4fe5d7fc, 0x5dfec0e1, 0x53f7cdea, 0x79c8eedb, 0x77c1e3d0, 0x65daf4cd, 0x6bd3f9c6, 0x31a4b2af, 0x3fadbfa4, 0x2db6a8b9, 0x23bfa5b2, 0x09808683, 0x07898b88, 0x15929c95, 0x1b9b919e, 0xa17c0a47, 0xaf75074c, 0xbd6e1051, 0xb3671d5a, 0x99583e6b, 0x97513360, 0x854a247d, 0x8b432976, 0xd134621f, 0xdf3d6f14, 0xcd267809, 0xc32f7502, 0xe9105633, 0xe7195b38, 0xf5024c25, 0xfb0b412e, 0x9ad7618c, 0x94de6c87, 0x86c57b9a, 0x88cc7691, 0xa2f355a0, 0xacfa58ab, 0xbee14fb6, 0xb0e842bd, 0xea9f09d4, 0xe49604df, 0xf68d13c2, 0xf8841ec9, 0xd2bb3df8, 0xdcb230f3, 0xcea927ee, 0xc0a02ae5, 0x7a47b13c, 0x744ebc37, 0x6655ab2a, 0x685ca621, 0x42638510, 0x4c6a881b, 0x5e719f06, 0x5078920d, 0x0a0fd964, 0x0406d46f, 0x161dc372, 0x1814ce79, 0x322bed48, 0x3c22e043, 0x2e39f75e, 0x2030fa55, 0xec9ab701, 0xe293ba0a, 0xf088ad17, 0xfe81a01c, 0xd4be832d, 0xdab78e26, 0xc8ac993b, 0xc6a59430, 0x9cd2df59, 0x92dbd252, 0x80c0c54f, 0x8ec9c844, 0xa4f6eb75, 0xaaffe67e, 0xb8e4f163, 0xb6edfc68, 0x0c0a67b1, 0x02036aba, 0x10187da7, 0x1e1170ac, 0x342e539d, 0x3a275e96, 0x283c498b, 0x26354480, 0x7c420fe9, 0x724b02e2, 0x605015ff, 0x6e5918f4, 0x44663bc5, 0x4a6f36ce, 0x587421d3, 0x567d2cd8, 0x37a10c7a, 0x39a80171, 0x2bb3166c, 0x25ba1b67, 0x0f853856, 0x018c355d, 0x13972240, 0x1d9e2f4b, 0x47e96422, 0x49e06929, 0x5bfb7e34, 0x55f2733f, 0x7fcd500e, 0x71c45d05, 0x63df4a18, 0x6dd64713, 0xd731dcca, 0xd938d1c1, 0xcb23c6dc, 0xc52acbd7, 0xef15e8e6, 0xe11ce5ed, 0xf307f2f0, 0xfd0efffb, 0xa779b492, 0xa970b999, 0xbb6bae84, 0xb562a38f, 0x9f5d80be, 0x91548db5, 0x834f9aa8, 0x8d4697a3];
+           var U2 = [0x00000000, 0x0b0e090d, 0x161c121a, 0x1d121b17, 0x2c382434, 0x27362d39, 0x3a24362e, 0x312a3f23, 0x58704868, 0x537e4165, 0x4e6c5a72, 0x4562537f, 0x74486c5c, 0x7f466551, 0x62547e46, 0x695a774b, 0xb0e090d0, 0xbbee99dd, 0xa6fc82ca, 0xadf28bc7, 0x9cd8b4e4, 0x97d6bde9, 0x8ac4a6fe, 0x81caaff3, 0xe890d8b8, 0xe39ed1b5, 0xfe8ccaa2, 0xf582c3af, 0xc4a8fc8c, 0xcfa6f581, 0xd2b4ee96, 0xd9bae79b, 0x7bdb3bbb, 0x70d532b6, 0x6dc729a1, 0x66c920ac, 0x57e31f8f, 0x5ced1682, 0x41ff0d95, 0x4af10498, 0x23ab73d3, 0x28a57ade, 0x35b761c9, 0x3eb968c4, 0x0f9357e7, 0x049d5eea, 0x198f45fd, 0x12814cf0, 0xcb3bab6b, 0xc035a266, 0xdd27b971, 0xd629b07c, 0xe7038f5f, 0xec0d8652, 0xf11f9d45, 0xfa119448, 0x934be303, 0x9845ea0e, 0x8557f119, 0x8e59f814, 0xbf73c737, 0xb47dce3a, 0xa96fd52d, 0xa261dc20, 0xf6ad766d, 0xfda37f60, 0xe0b16477, 0xebbf6d7a, 0xda955259, 0xd19b5b54, 0xcc894043, 0xc787494e, 0xaedd3e05, 0xa5d33708, 0xb8c12c1f, 0xb3cf2512, 0x82e51a31, 0x89eb133c, 0x94f9082b, 0x9ff70126, 0x464de6bd, 0x4d43efb0, 0x5051f4a7, 0x5b5ffdaa, 0x6a75c289, 0x617bcb84, 0x7c69d093, 0x7767d99e, 0x1e3daed5, 0x1533a7d8, 0x0821bccf, 0x032fb5c2, 0x32058ae1, 0x390b83ec, 0x241998fb, 0x2f1791f6, 0x8d764dd6, 0x867844db, 0x9b6a5fcc, 0x906456c1, 0xa14e69e2, 0xaa4060ef, 0xb7527bf8, 0xbc5c72f5, 0xd50605be, 0xde080cb3, 0xc31a17a4, 0xc8141ea9, 0xf93e218a, 0xf2302887, 0xef223390, 0xe42c3a9d, 0x3d96dd06, 0x3698d40b, 0x2b8acf1c, 0x2084c611, 0x11aef932, 0x1aa0f03f, 0x07b2eb28, 0x0cbce225, 0x65e6956e, 0x6ee89c63, 0x73fa8774, 0x78f48e79, 0x49deb15a, 0x42d0b857, 0x5fc2a340, 0x54ccaa4d, 0xf741ecda, 0xfc4fe5d7, 0xe15dfec0, 0xea53f7cd, 0xdb79c8ee, 0xd077c1e3, 0xcd65daf4, 0xc66bd3f9, 0xaf31a4b2, 0xa43fadbf, 0xb92db6a8, 0xb223bfa5, 0x83098086, 0x8807898b, 0x9515929c, 0x9e1b9b91, 0x47a17c0a, 0x4caf7507, 0x51bd6e10, 0x5ab3671d, 0x6b99583e, 0x60975133, 0x7d854a24, 0x768b4329, 0x1fd13462, 0x14df3d6f, 0x09cd2678, 0x02c32f75, 0x33e91056, 0x38e7195b, 0x25f5024c, 0x2efb0b41, 0x8c9ad761, 0x8794de6c, 0x9a86c57b, 0x9188cc76, 0xa0a2f355, 0xabacfa58, 0xb6bee14f, 0xbdb0e842, 0xd4ea9f09, 0xdfe49604, 0xc2f68d13, 0xc9f8841e, 0xf8d2bb3d, 0xf3dcb230, 0xeecea927, 0xe5c0a02a, 0x3c7a47b1, 0x37744ebc, 0x2a6655ab, 0x21685ca6, 0x10426385, 0x1b4c6a88, 0x065e719f, 0x0d507892, 0x640a0fd9, 0x6f0406d4, 0x72161dc3, 0x791814ce, 0x48322bed, 0x433c22e0, 0x5e2e39f7, 0x552030fa, 0x01ec9ab7, 0x0ae293ba, 0x17f088ad, 0x1cfe81a0, 0x2dd4be83, 0x26dab78e, 0x3bc8ac99, 0x30c6a594, 0x599cd2df, 0x5292dbd2, 0x4f80c0c5, 0x448ec9c8, 0x75a4f6eb, 0x7eaaffe6, 0x63b8e4f1, 0x68b6edfc, 0xb10c0a67, 0xba02036a, 0xa710187d, 0xac1e1170, 0x9d342e53, 0x963a275e, 0x8b283c49, 0x80263544, 0xe97c420f, 0xe2724b02, 0xff605015, 0xf46e5918, 0xc544663b, 0xce4a6f36, 0xd3587421, 0xd8567d2c, 0x7a37a10c, 0x7139a801, 0x6c2bb316, 0x6725ba1b, 0x560f8538, 0x5d018c35, 0x40139722, 0x4b1d9e2f, 0x2247e964, 0x2949e069, 0x345bfb7e, 0x3f55f273, 0x0e7fcd50, 0x0571c45d, 0x1863df4a, 0x136dd647, 0xcad731dc, 0xc1d938d1, 0xdccb23c6, 0xd7c52acb, 0xe6ef15e8, 0xede11ce5, 0xf0f307f2, 0xfbfd0eff, 0x92a779b4, 0x99a970b9, 0x84bb6bae, 0x8fb562a3, 0xbe9f5d80, 0xb591548d, 0xa8834f9a, 0xa38d4697];
+           var U3 = [0x00000000, 0x0d0b0e09, 0x1a161c12, 0x171d121b, 0x342c3824, 0x3927362d, 0x2e3a2436, 0x23312a3f, 0x68587048, 0x65537e41, 0x724e6c5a, 0x7f456253, 0x5c74486c, 0x517f4665, 0x4662547e, 0x4b695a77, 0xd0b0e090, 0xddbbee99, 0xcaa6fc82, 0xc7adf28b, 0xe49cd8b4, 0xe997d6bd, 0xfe8ac4a6, 0xf381caaf, 0xb8e890d8, 0xb5e39ed1, 0xa2fe8cca, 0xaff582c3, 0x8cc4a8fc, 0x81cfa6f5, 0x96d2b4ee, 0x9bd9bae7, 0xbb7bdb3b, 0xb670d532, 0xa16dc729, 0xac66c920, 0x8f57e31f, 0x825ced16, 0x9541ff0d, 0x984af104, 0xd323ab73, 0xde28a57a, 0xc935b761, 0xc43eb968, 0xe70f9357, 0xea049d5e, 0xfd198f45, 0xf012814c, 0x6bcb3bab, 0x66c035a2, 0x71dd27b9, 0x7cd629b0, 0x5fe7038f, 0x52ec0d86, 0x45f11f9d, 0x48fa1194, 0x03934be3, 0x0e9845ea, 0x198557f1, 0x148e59f8, 0x37bf73c7, 0x3ab47dce, 0x2da96fd5, 0x20a261dc, 0x6df6ad76, 0x60fda37f, 0x77e0b164, 0x7aebbf6d, 0x59da9552, 0x54d19b5b, 0x43cc8940, 0x4ec78749, 0x05aedd3e, 0x08a5d337, 0x1fb8c12c, 0x12b3cf25, 0x3182e51a, 0x3c89eb13, 0x2b94f908, 0x269ff701, 0xbd464de6, 0xb04d43ef, 0xa75051f4, 0xaa5b5ffd, 0x896a75c2, 0x84617bcb, 0x937c69d0, 0x9e7767d9, 0xd51e3dae, 0xd81533a7, 0xcf0821bc, 0xc2032fb5, 0xe132058a, 0xec390b83, 0xfb241998, 0xf62f1791, 0xd68d764d, 0xdb867844, 0xcc9b6a5f, 0xc1906456, 0xe2a14e69, 0xefaa4060, 0xf8b7527b, 0xf5bc5c72, 0xbed50605, 0xb3de080c, 0xa4c31a17, 0xa9c8141e, 0x8af93e21, 0x87f23028, 0x90ef2233, 0x9de42c3a, 0x063d96dd, 0x0b3698d4, 0x1c2b8acf, 0x112084c6, 0x3211aef9, 0x3f1aa0f0, 0x2807b2eb, 0x250cbce2, 0x6e65e695, 0x636ee89c, 0x7473fa87, 0x7978f48e, 0x5a49deb1, 0x5742d0b8, 0x405fc2a3, 0x4d54ccaa, 0xdaf741ec, 0xd7fc4fe5, 0xc0e15dfe, 0xcdea53f7, 0xeedb79c8, 0xe3d077c1, 0xf4cd65da, 0xf9c66bd3, 0xb2af31a4, 0xbfa43fad, 0xa8b92db6, 0xa5b223bf, 0x86830980, 0x8b880789, 0x9c951592, 0x919e1b9b, 0x0a47a17c, 0x074caf75, 0x1051bd6e, 0x1d5ab367, 0x3e6b9958, 0x33609751, 0x247d854a, 0x29768b43, 0x621fd134, 0x6f14df3d, 0x7809cd26, 0x7502c32f, 0x5633e910, 0x5b38e719, 0x4c25f502, 0x412efb0b, 0x618c9ad7, 0x6c8794de, 0x7b9a86c5, 0x769188cc, 0x55a0a2f3, 0x58abacfa, 0x4fb6bee1, 0x42bdb0e8, 0x09d4ea9f, 0x04dfe496, 0x13c2f68d, 0x1ec9f884, 0x3df8d2bb, 0x30f3dcb2, 0x27eecea9, 0x2ae5c0a0, 0xb13c7a47, 0xbc37744e, 0xab2a6655, 0xa621685c, 0x85104263, 0x881b4c6a, 0x9f065e71, 0x920d5078, 0xd9640a0f, 0xd46f0406, 0xc372161d, 0xce791814, 0xed48322b, 0xe0433c22, 0xf75e2e39, 0xfa552030, 0xb701ec9a, 0xba0ae293, 0xad17f088, 0xa01cfe81, 0x832dd4be, 0x8e26dab7, 0x993bc8ac, 0x9430c6a5, 0xdf599cd2, 0xd25292db, 0xc54f80c0, 0xc8448ec9, 0xeb75a4f6, 0xe67eaaff, 0xf163b8e4, 0xfc68b6ed, 0x67b10c0a, 0x6aba0203, 0x7da71018, 0x70ac1e11, 0x539d342e, 0x5e963a27, 0x498b283c, 0x44802635, 0x0fe97c42, 0x02e2724b, 0x15ff6050, 0x18f46e59, 0x3bc54466, 0x36ce4a6f, 0x21d35874, 0x2cd8567d, 0x0c7a37a1, 0x017139a8, 0x166c2bb3, 0x1b6725ba, 0x38560f85, 0x355d018c, 0x22401397, 0x2f4b1d9e, 0x642247e9, 0x692949e0, 0x7e345bfb, 0x733f55f2, 0x500e7fcd, 0x5d0571c4, 0x4a1863df, 0x47136dd6, 0xdccad731, 0xd1c1d938, 0xc6dccb23, 0xcbd7c52a, 0xe8e6ef15, 0xe5ede11c, 0xf2f0f307, 0xfffbfd0e, 0xb492a779, 0xb999a970, 0xae84bb6b, 0xa38fb562, 0x80be9f5d, 0x8db59154, 0x9aa8834f, 0x97a38d46];
+           var U4 = [0x00000000, 0x090d0b0e, 0x121a161c, 0x1b171d12, 0x24342c38, 0x2d392736, 0x362e3a24, 0x3f23312a, 0x48685870, 0x4165537e, 0x5a724e6c, 0x537f4562, 0x6c5c7448, 0x65517f46, 0x7e466254, 0x774b695a, 0x90d0b0e0, 0x99ddbbee, 0x82caa6fc, 0x8bc7adf2, 0xb4e49cd8, 0xbde997d6, 0xa6fe8ac4, 0xaff381ca, 0xd8b8e890, 0xd1b5e39e, 0xcaa2fe8c, 0xc3aff582, 0xfc8cc4a8, 0xf581cfa6, 0xee96d2b4, 0xe79bd9ba, 0x3bbb7bdb, 0x32b670d5, 0x29a16dc7, 0x20ac66c9, 0x1f8f57e3, 0x16825ced, 0x0d9541ff, 0x04984af1, 0x73d323ab, 0x7ade28a5, 0x61c935b7, 0x68c43eb9, 0x57e70f93, 0x5eea049d, 0x45fd198f, 0x4cf01281, 0xab6bcb3b, 0xa266c035, 0xb971dd27, 0xb07cd629, 0x8f5fe703, 0x8652ec0d, 0x9d45f11f, 0x9448fa11, 0xe303934b, 0xea0e9845, 0xf1198557, 0xf8148e59, 0xc737bf73, 0xce3ab47d, 0xd52da96f, 0xdc20a261, 0x766df6ad, 0x7f60fda3, 0x6477e0b1, 0x6d7aebbf, 0x5259da95, 0x5b54d19b, 0x4043cc89, 0x494ec787, 0x3e05aedd, 0x3708a5d3, 0x2c1fb8c1, 0x2512b3cf, 0x1a3182e5, 0x133c89eb, 0x082b94f9, 0x01269ff7, 0xe6bd464d, 0xefb04d43, 0xf4a75051, 0xfdaa5b5f, 0xc2896a75, 0xcb84617b, 0xd0937c69, 0xd99e7767, 0xaed51e3d, 0xa7d81533, 0xbccf0821, 0xb5c2032f, 0x8ae13205, 0x83ec390b, 0x98fb2419, 0x91f62f17, 0x4dd68d76, 0x44db8678, 0x5fcc9b6a, 0x56c19064, 0x69e2a14e, 0x60efaa40, 0x7bf8b752, 0x72f5bc5c, 0x05bed506, 0x0cb3de08, 0x17a4c31a, 0x1ea9c814, 0x218af93e, 0x2887f230, 0x3390ef22, 0x3a9de42c, 0xdd063d96, 0xd40b3698, 0xcf1c2b8a, 0xc6112084, 0xf93211ae, 0xf03f1aa0, 0xeb2807b2, 0xe2250cbc, 0x956e65e6, 0x9c636ee8, 0x877473fa, 0x8e7978f4, 0xb15a49de, 0xb85742d0, 0xa3405fc2, 0xaa4d54cc, 0xecdaf741, 0xe5d7fc4f, 0xfec0e15d, 0xf7cdea53, 0xc8eedb79, 0xc1e3d077, 0xdaf4cd65, 0xd3f9c66b, 0xa4b2af31, 0xadbfa43f, 0xb6a8b92d, 0xbfa5b223, 0x80868309, 0x898b8807, 0x929c9515, 0x9b919e1b, 0x7c0a47a1, 0x75074caf, 0x6e1051bd, 0x671d5ab3, 0x583e6b99, 0x51336097, 0x4a247d85, 0x4329768b, 0x34621fd1, 0x3d6f14df, 0x267809cd, 0x2f7502c3, 0x105633e9, 0x195b38e7, 0x024c25f5, 0x0b412efb, 0xd7618c9a, 0xde6c8794, 0xc57b9a86, 0xcc769188, 0xf355a0a2, 0xfa58abac, 0xe14fb6be, 0xe842bdb0, 0x9f09d4ea, 0x9604dfe4, 0x8d13c2f6, 0x841ec9f8, 0xbb3df8d2, 0xb230f3dc, 0xa927eece, 0xa02ae5c0, 0x47b13c7a, 0x4ebc3774, 0x55ab2a66, 0x5ca62168, 0x63851042, 0x6a881b4c, 0x719f065e, 0x78920d50, 0x0fd9640a, 0x06d46f04, 0x1dc37216, 0x14ce7918, 0x2bed4832, 0x22e0433c, 0x39f75e2e, 0x30fa5520, 0x9ab701ec, 0x93ba0ae2, 0x88ad17f0, 0x81a01cfe, 0xbe832dd4, 0xb78e26da, 0xac993bc8, 0xa59430c6, 0xd2df599c, 0xdbd25292, 0xc0c54f80, 0xc9c8448e, 0xf6eb75a4, 0xffe67eaa, 0xe4f163b8, 0xedfc68b6, 0x0a67b10c, 0x036aba02, 0x187da710, 0x1170ac1e, 0x2e539d34, 0x275e963a, 0x3c498b28, 0x35448026, 0x420fe97c, 0x4b02e272, 0x5015ff60, 0x5918f46e, 0x663bc544, 0x6f36ce4a, 0x7421d358, 0x7d2cd856, 0xa10c7a37, 0xa8017139, 0xb3166c2b, 0xba1b6725, 0x8538560f, 0x8c355d01, 0x97224013, 0x9e2f4b1d, 0xe9642247, 0xe0692949, 0xfb7e345b, 0xf2733f55, 0xcd500e7f, 0xc45d0571, 0xdf4a1863, 0xd647136d, 0x31dccad7, 0x38d1c1d9, 0x23c6dccb, 0x2acbd7c5, 0x15e8e6ef, 0x1ce5ede1, 0x07f2f0f3, 0x0efffbfd, 0x79b492a7, 0x70b999a9, 0x6bae84bb, 0x62a38fb5, 0x5d80be9f, 0x548db591, 0x4f9aa883, 0x4697a38d];
+
+           function convertToInt32(bytes) {
+             var result = [];
+
+             for (var i = 0; i < bytes.length; i += 4) {
+               result.push(bytes[i] << 24 | bytes[i + 1] << 16 | bytes[i + 2] << 8 | bytes[i + 3]);
+             }
+
+             return result;
+           }
+
+           var AES = function AES(key) {
+             if (!(this instanceof AES)) {
+               throw Error('AES must be instanitated with `new`');
+             }
+
+             Object.defineProperty(this, 'key', {
+               value: coerceArray(key, true)
+             });
+
+             this._prepare();
+           };
+
+           AES.prototype._prepare = function () {
+             var rounds = numberOfRounds[this.key.length];
+
+             if (rounds == null) {
+               throw new Error('invalid key size (must be 16, 24 or 32 bytes)');
+             } // encryption round keys
+
+
+             this._Ke = []; // decryption round keys
+
+             this._Kd = [];
+
+             for (var i = 0; i <= rounds; i++) {
+               this._Ke.push([0, 0, 0, 0]);
+
+               this._Kd.push([0, 0, 0, 0]);
+             }
+
+             var roundKeyCount = (rounds + 1) * 4;
+             var KC = this.key.length / 4; // convert the key into ints
+
+             var tk = convertToInt32(this.key); // copy values into round key arrays
+
+             var index;
+
+             for (var i = 0; i < KC; i++) {
+               index = i >> 2;
+               this._Ke[index][i % 4] = tk[i];
+               this._Kd[rounds - index][i % 4] = tk[i];
+             } // key expansion (fips-197 section 5.2)
+
+
+             var rconpointer = 0;
+             var t = KC,
+                 tt;
+
+             while (t < roundKeyCount) {
+               tt = tk[KC - 1];
+               tk[0] ^= S[tt >> 16 & 0xFF] << 24 ^ S[tt >> 8 & 0xFF] << 16 ^ S[tt & 0xFF] << 8 ^ S[tt >> 24 & 0xFF] ^ rcon[rconpointer] << 24;
+               rconpointer += 1; // key expansion (for non-256 bit)
+
+               if (KC != 8) {
+                 for (var i = 1; i < KC; i++) {
+                   tk[i] ^= tk[i - 1];
+                 } // key expansion for 256-bit keys is "slightly different" (fips-197)
+
+               } else {
+                 for (var i = 1; i < KC / 2; i++) {
+                   tk[i] ^= tk[i - 1];
+                 }
+
+                 tt = tk[KC / 2 - 1];
+                 tk[KC / 2] ^= S[tt & 0xFF] ^ S[tt >> 8 & 0xFF] << 8 ^ S[tt >> 16 & 0xFF] << 16 ^ S[tt >> 24 & 0xFF] << 24;
+
+                 for (var i = KC / 2 + 1; i < KC; i++) {
+                   tk[i] ^= tk[i - 1];
+                 }
+               } // copy values into round key arrays
+
+
+               var i = 0,
+                   r,
+                   c;
+
+               while (i < KC && t < roundKeyCount) {
+                 r = t >> 2;
+                 c = t % 4;
+                 this._Ke[r][c] = tk[i];
+                 this._Kd[rounds - r][c] = tk[i++];
+                 t++;
+               }
+             } // inverse-cipher-ify the decryption round key (fips-197 section 5.3)
+
+
+             for (var r = 1; r < rounds; r++) {
+               for (var c = 0; c < 4; c++) {
+                 tt = this._Kd[r][c];
+                 this._Kd[r][c] = U1[tt >> 24 & 0xFF] ^ U2[tt >> 16 & 0xFF] ^ U3[tt >> 8 & 0xFF] ^ U4[tt & 0xFF];
+               }
+             }
+           };
+
+           AES.prototype.encrypt = function (plaintext) {
+             if (plaintext.length != 16) {
+               throw new Error('invalid plaintext size (must be 16 bytes)');
+             }
+
+             var rounds = this._Ke.length - 1;
+             var a = [0, 0, 0, 0]; // convert plaintext to (ints ^ key)
+
+             var t = convertToInt32(plaintext);
+
+             for (var i = 0; i < 4; i++) {
+               t[i] ^= this._Ke[0][i];
+             } // apply round transforms
+
+
+             for (var r = 1; r < rounds; r++) {
+               for (var i = 0; i < 4; i++) {
+                 a[i] = T1[t[i] >> 24 & 0xff] ^ T2[t[(i + 1) % 4] >> 16 & 0xff] ^ T3[t[(i + 2) % 4] >> 8 & 0xff] ^ T4[t[(i + 3) % 4] & 0xff] ^ this._Ke[r][i];
+               }
+
+               t = a.slice();
+             } // the last round is special
+
+
+             var result = createArray(16),
+                 tt;
+
+             for (var i = 0; i < 4; i++) {
+               tt = this._Ke[rounds][i];
+               result[4 * i] = (S[t[i] >> 24 & 0xff] ^ tt >> 24) & 0xff;
+               result[4 * i + 1] = (S[t[(i + 1) % 4] >> 16 & 0xff] ^ tt >> 16) & 0xff;
+               result[4 * i + 2] = (S[t[(i + 2) % 4] >> 8 & 0xff] ^ tt >> 8) & 0xff;
+               result[4 * i + 3] = (S[t[(i + 3) % 4] & 0xff] ^ tt) & 0xff;
+             }
+
+             return result;
+           };
+
+           AES.prototype.decrypt = function (ciphertext) {
+             if (ciphertext.length != 16) {
+               throw new Error('invalid ciphertext size (must be 16 bytes)');
+             }
+
+             var rounds = this._Kd.length - 1;
+             var a = [0, 0, 0, 0]; // convert plaintext to (ints ^ key)
+
+             var t = convertToInt32(ciphertext);
+
+             for (var i = 0; i < 4; i++) {
+               t[i] ^= this._Kd[0][i];
+             } // apply round transforms
+
+
+             for (var r = 1; r < rounds; r++) {
+               for (var i = 0; i < 4; i++) {
+                 a[i] = T5[t[i] >> 24 & 0xff] ^ T6[t[(i + 3) % 4] >> 16 & 0xff] ^ T7[t[(i + 2) % 4] >> 8 & 0xff] ^ T8[t[(i + 1) % 4] & 0xff] ^ this._Kd[r][i];
+               }
+
+               t = a.slice();
+             } // the last round is special
+
+
+             var result = createArray(16),
+                 tt;
+
+             for (var i = 0; i < 4; i++) {
+               tt = this._Kd[rounds][i];
+               result[4 * i] = (Si[t[i] >> 24 & 0xff] ^ tt >> 24) & 0xff;
+               result[4 * i + 1] = (Si[t[(i + 3) % 4] >> 16 & 0xff] ^ tt >> 16) & 0xff;
+               result[4 * i + 2] = (Si[t[(i + 2) % 4] >> 8 & 0xff] ^ tt >> 8) & 0xff;
+               result[4 * i + 3] = (Si[t[(i + 1) % 4] & 0xff] ^ tt) & 0xff;
+             }
+
+             return result;
+           };
+           /**
+            *  Mode Of Operation - Electonic Codebook (ECB)
+            */
+
+
+           var ModeOfOperationECB = function ModeOfOperationECB(key) {
+             if (!(this instanceof ModeOfOperationECB)) {
+               throw Error('AES must be instanitated with `new`');
+             }
+
+             this.description = "Electronic Code Block";
+             this.name = "ecb";
+             this._aes = new AES(key);
+           };
+
+           ModeOfOperationECB.prototype.encrypt = function (plaintext) {
+             plaintext = coerceArray(plaintext);
+
+             if (plaintext.length % 16 !== 0) {
+               throw new Error('invalid plaintext size (must be multiple of 16 bytes)');
+             }
+
+             var ciphertext = createArray(plaintext.length);
+             var block = createArray(16);
+
+             for (var i = 0; i < plaintext.length; i += 16) {
+               copyArray(plaintext, block, 0, i, i + 16);
+               block = this._aes.encrypt(block);
+               copyArray(block, ciphertext, i);
+             }
+
+             return ciphertext;
+           };
+
+           ModeOfOperationECB.prototype.decrypt = function (ciphertext) {
+             ciphertext = coerceArray(ciphertext);
+
+             if (ciphertext.length % 16 !== 0) {
+               throw new Error('invalid ciphertext size (must be multiple of 16 bytes)');
+             }
+
+             var plaintext = createArray(ciphertext.length);
+             var block = createArray(16);
+
+             for (var i = 0; i < ciphertext.length; i += 16) {
+               copyArray(ciphertext, block, 0, i, i + 16);
+               block = this._aes.decrypt(block);
+               copyArray(block, plaintext, i);
+             }
+
+             return plaintext;
+           };
+           /**
+            *  Mode Of Operation - Cipher Block Chaining (CBC)
+            */
+
+
+           var ModeOfOperationCBC = function ModeOfOperationCBC(key, iv) {
+             if (!(this instanceof ModeOfOperationCBC)) {
+               throw Error('AES must be instanitated with `new`');
+             }
+
+             this.description = "Cipher Block Chaining";
+             this.name = "cbc";
+
+             if (!iv) {
+               iv = createArray(16);
+             } else if (iv.length != 16) {
+               throw new Error('invalid initialation vector size (must be 16 bytes)');
+             }
+
+             this._lastCipherblock = coerceArray(iv, true);
+             this._aes = new AES(key);
+           };
+
+           ModeOfOperationCBC.prototype.encrypt = function (plaintext) {
+             plaintext = coerceArray(plaintext);
+
+             if (plaintext.length % 16 !== 0) {
+               throw new Error('invalid plaintext size (must be multiple of 16 bytes)');
+             }
+
+             var ciphertext = createArray(plaintext.length);
+             var block = createArray(16);
+
+             for (var i = 0; i < plaintext.length; i += 16) {
+               copyArray(plaintext, block, 0, i, i + 16);
+
+               for (var j = 0; j < 16; j++) {
+                 block[j] ^= this._lastCipherblock[j];
+               }
+
+               this._lastCipherblock = this._aes.encrypt(block);
+               copyArray(this._lastCipherblock, ciphertext, i);
+             }
+
+             return ciphertext;
+           };
+
+           ModeOfOperationCBC.prototype.decrypt = function (ciphertext) {
+             ciphertext = coerceArray(ciphertext);
+
+             if (ciphertext.length % 16 !== 0) {
+               throw new Error('invalid ciphertext size (must be multiple of 16 bytes)');
+             }
+
+             var plaintext = createArray(ciphertext.length);
+             var block = createArray(16);
+
+             for (var i = 0; i < ciphertext.length; i += 16) {
+               copyArray(ciphertext, block, 0, i, i + 16);
+               block = this._aes.decrypt(block);
+
+               for (var j = 0; j < 16; j++) {
+                 plaintext[i + j] = block[j] ^ this._lastCipherblock[j];
+               }
+
+               copyArray(ciphertext, this._lastCipherblock, 0, i, i + 16);
+             }
+
+             return plaintext;
+           };
+           /**
+            *  Mode Of Operation - Cipher Feedback (CFB)
+            */
+
+
+           var ModeOfOperationCFB = function ModeOfOperationCFB(key, iv, segmentSize) {
+             if (!(this instanceof ModeOfOperationCFB)) {
+               throw Error('AES must be instanitated with `new`');
+             }
+
+             this.description = "Cipher Feedback";
+             this.name = "cfb";
+
+             if (!iv) {
+               iv = createArray(16);
+             } else if (iv.length != 16) {
+               throw new Error('invalid initialation vector size (must be 16 size)');
+             }
+
+             if (!segmentSize) {
+               segmentSize = 1;
+             }
+
+             this.segmentSize = segmentSize;
+             this._shiftRegister = coerceArray(iv, true);
+             this._aes = new AES(key);
+           };
+
+           ModeOfOperationCFB.prototype.encrypt = function (plaintext) {
+             if (plaintext.length % this.segmentSize != 0) {
+               throw new Error('invalid plaintext size (must be segmentSize bytes)');
+             }
+
+             var encrypted = coerceArray(plaintext, true);
+             var xorSegment;
+
+             for (var i = 0; i < encrypted.length; i += this.segmentSize) {
+               xorSegment = this._aes.encrypt(this._shiftRegister);
+
+               for (var j = 0; j < this.segmentSize; j++) {
+                 encrypted[i + j] ^= xorSegment[j];
+               } // Shift the register
+
+
+               copyArray(this._shiftRegister, this._shiftRegister, 0, this.segmentSize);
+               copyArray(encrypted, this._shiftRegister, 16 - this.segmentSize, i, i + this.segmentSize);
+             }
+
+             return encrypted;
+           };
+
+           ModeOfOperationCFB.prototype.decrypt = function (ciphertext) {
+             if (ciphertext.length % this.segmentSize != 0) {
+               throw new Error('invalid ciphertext size (must be segmentSize bytes)');
+             }
+
+             var plaintext = coerceArray(ciphertext, true);
+             var xorSegment;
+
+             for (var i = 0; i < plaintext.length; i += this.segmentSize) {
+               xorSegment = this._aes.encrypt(this._shiftRegister);
+
+               for (var j = 0; j < this.segmentSize; j++) {
+                 plaintext[i + j] ^= xorSegment[j];
+               } // Shift the register
+
+
+               copyArray(this._shiftRegister, this._shiftRegister, 0, this.segmentSize);
+               copyArray(ciphertext, this._shiftRegister, 16 - this.segmentSize, i, i + this.segmentSize);
+             }
+
+             return plaintext;
+           };
+           /**
+            *  Mode Of Operation - Output Feedback (OFB)
+            */
+
+
+           var ModeOfOperationOFB = function ModeOfOperationOFB(key, iv) {
+             if (!(this instanceof ModeOfOperationOFB)) {
+               throw Error('AES must be instanitated with `new`');
+             }
+
+             this.description = "Output Feedback";
+             this.name = "ofb";
+
+             if (!iv) {
+               iv = createArray(16);
+             } else if (iv.length != 16) {
+               throw new Error('invalid initialation vector size (must be 16 bytes)');
+             }
+
+             this._lastPrecipher = coerceArray(iv, true);
+             this._lastPrecipherIndex = 16;
+             this._aes = new AES(key);
+           };
+
+           ModeOfOperationOFB.prototype.encrypt = function (plaintext) {
+             var encrypted = coerceArray(plaintext, true);
+
+             for (var i = 0; i < encrypted.length; i++) {
+               if (this._lastPrecipherIndex === 16) {
+                 this._lastPrecipher = this._aes.encrypt(this._lastPrecipher);
+                 this._lastPrecipherIndex = 0;
+               }
+
+               encrypted[i] ^= this._lastPrecipher[this._lastPrecipherIndex++];
+             }
+
+             return encrypted;
+           }; // Decryption is symetric
+
+
+           ModeOfOperationOFB.prototype.decrypt = ModeOfOperationOFB.prototype.encrypt;
+           /**
+            *  Counter object for CTR common mode of operation
+            */
+
+           var Counter = function Counter(initialValue) {
+             if (!(this instanceof Counter)) {
+               throw Error('Counter must be instanitated with `new`');
+             } // We allow 0, but anything false-ish uses the default 1
+
+
+             if (initialValue !== 0 && !initialValue) {
+               initialValue = 1;
+             }
+
+             if (typeof initialValue === 'number') {
+               this._counter = createArray(16);
+               this.setValue(initialValue);
+             } else {
+               this.setBytes(initialValue);
+             }
+           };
+
+           Counter.prototype.setValue = function (value) {
+             if (typeof value !== 'number' || parseInt(value) != value) {
+               throw new Error('invalid counter value (must be an integer)');
+             } // We cannot safely handle numbers beyond the safe range for integers
+
+
+             if (value > Number.MAX_SAFE_INTEGER) {
+               throw new Error('integer value out of safe range');
+             }
+
+             for (var index = 15; index >= 0; --index) {
+               this._counter[index] = value % 256;
+               value = parseInt(value / 256);
+             }
+           };
+
+           Counter.prototype.setBytes = function (bytes) {
+             bytes = coerceArray(bytes, true);
+
+             if (bytes.length != 16) {
+               throw new Error('invalid counter bytes size (must be 16 bytes)');
+             }
+
+             this._counter = bytes;
+           };
+
+           Counter.prototype.increment = function () {
+             for (var i = 15; i >= 0; i--) {
+               if (this._counter[i] === 255) {
+                 this._counter[i] = 0;
+               } else {
+                 this._counter[i]++;
+                 break;
+               }
+             }
+           };
+           /**
+            *  Mode Of Operation - Counter (CTR)
+            */
+
+
+           var ModeOfOperationCTR = function ModeOfOperationCTR(key, counter) {
+             if (!(this instanceof ModeOfOperationCTR)) {
+               throw Error('AES must be instanitated with `new`');
+             }
+
+             this.description = "Counter";
+             this.name = "ctr";
+
+             if (!(counter instanceof Counter)) {
+               counter = new Counter(counter);
+             }
+
+             this._counter = counter;
+             this._remainingCounter = null;
+             this._remainingCounterIndex = 16;
+             this._aes = new AES(key);
+           };
+
+           ModeOfOperationCTR.prototype.encrypt = function (plaintext) {
+             var encrypted = coerceArray(plaintext, true);
+
+             for (var i = 0; i < encrypted.length; i++) {
+               if (this._remainingCounterIndex === 16) {
+                 this._remainingCounter = this._aes.encrypt(this._counter._counter);
+                 this._remainingCounterIndex = 0;
+
+                 this._counter.increment();
+               }
+
+               encrypted[i] ^= this._remainingCounter[this._remainingCounterIndex++];
+             }
+
+             return encrypted;
+           }; // Decryption is symetric
+
+
+           ModeOfOperationCTR.prototype.decrypt = ModeOfOperationCTR.prototype.encrypt; ///////////////////////
+           // Padding
+           // See:https://tools.ietf.org/html/rfc2315
+
+           function pkcs7pad(data) {
+             data = coerceArray(data, true);
+             var padder = 16 - data.length % 16;
+             var result = createArray(data.length + padder);
+             copyArray(data, result);
+
+             for (var i = data.length; i < result.length; i++) {
+               result[i] = padder;
+             }
+
+             return result;
+           }
+
+           function pkcs7strip(data) {
+             data = coerceArray(data, true);
+
+             if (data.length < 16) {
+               throw new Error('PKCS#7 invalid length');
+             }
+
+             var padder = data[data.length - 1];
+
+             if (padder > 16) {
+               throw new Error('PKCS#7 padding byte out of range');
+             }
+
+             var length = data.length - padder;
+
+             for (var i = 0; i < padder; i++) {
+               if (data[length + i] !== padder) {
+                 throw new Error('PKCS#7 invalid padding byte');
+               }
+             }
+
+             var result = createArray(length);
+             copyArray(data, result, 0, 0, length);
+             return result;
+           } ///////////////////////
+           // Exporting
+           // The block cipher
+
+
+           var aesjs = {
+             AES: AES,
+             Counter: Counter,
+             ModeOfOperation: {
+               ecb: ModeOfOperationECB,
+               cbc: ModeOfOperationCBC,
+               cfb: ModeOfOperationCFB,
+               ofb: ModeOfOperationOFB,
+               ctr: ModeOfOperationCTR
+             },
+             utils: {
+               hex: convertHex,
+               utf8: convertUtf8
+             },
+             padding: {
+               pkcs7: {
+                 pad: pkcs7pad,
+                 strip: pkcs7strip
+               }
+             },
+             _arrayTest: {
+               coerceArray: coerceArray,
+               createArray: createArray,
+               copyArray: copyArray
+             }
+           }; // node.js
+
+           {
+             module.exports = aesjs; // RequireJS/AMD
+             // http://www.requirejs.org/docs/api.html
+             // https://github.com/amdjs/amdjs-api/wiki/AMD
+           }
+         })();
+       })(aesJs);
+
+       var aesjs = aesJs.exports;
+
+       // We can use keys that are 128 bits (16 bytes), 192 bits (24 bytes) or 256 bits (32 bytes).
+       // To generate a random key:  window.crypto.getRandomValues(new Uint8Array(16));
+       // This default signing key is built into iD and can be used to mask/unmask sensitive values.
+
+       var DEFAULT_128 = [250, 157, 60, 79, 142, 134, 229, 129, 138, 126, 210, 129, 29, 71, 160, 208];
+       function utilAesEncrypt(text, key) {
+         key = key || DEFAULT_128;
+         var textBytes = aesjs.utils.utf8.toBytes(text);
+         var aesCtr = new aesjs.ModeOfOperation.ctr(key);
+         var encryptedBytes = aesCtr.encrypt(textBytes);
+         var encryptedHex = aesjs.utils.hex.fromBytes(encryptedBytes);
+         return encryptedHex;
+       }
+       function utilAesDecrypt(encryptedHex, key) {
+         key = key || DEFAULT_128;
+         var encryptedBytes = aesjs.utils.hex.toBytes(encryptedHex);
+         var aesCtr = new aesjs.ModeOfOperation.ctr(key);
+         var decryptedBytes = aesCtr.decrypt(encryptedBytes);
+         var text = aesjs.utils.utf8.fromBytes(decryptedBytes);
+         return text;
+       }
+
+       function utilCleanTags(tags) {
+         var out = {};
+
+         for (var k in tags) {
+           if (!k) continue;
+           var v = tags[k];
+
+           if (v !== undefined) {
+             out[k] = cleanValue(k, v);
+           }
+         }
+
+         return out;
+
+         function cleanValue(k, v) {
+           function keepSpaces(k) {
+             return /_hours|_times|:conditional$/.test(k);
+           }
+
+           function skip(k) {
+             return /^(description|note|fixme)$/.test(k);
+           }
+
+           if (skip(k)) return v;
+           var cleaned = v.split(';').map(function (s) {
+             return s.trim();
+           }).join(keepSpaces(k) ? '; ' : ';'); // The code below is not intended to validate websites and emails.
+           // It is only intended to prevent obvious copy-paste errors. (#2323)
+           // clean website- and email-like tags
+
+           if (k.indexOf('website') !== -1 || k.indexOf('email') !== -1 || cleaned.indexOf('http') === 0) {
+             cleaned = cleaned.replace(/[\u200B-\u200F\uFEFF]/g, ''); // strip LRM and other zero width chars
+           }
+
+           return cleaned;
+         }
+       }
+
+       var _detected;
+
+       function utilDetect(refresh) {
+         if (_detected && !refresh) return _detected;
+         _detected = {};
+         var ua = navigator.userAgent;
+         var m = null;
+         /* Browser */
+
+         m = ua.match(/(edge)\/?\s*(\.?\d+(\.\d+)*)/i); // Edge
+
+         if (m !== null) {
+           _detected.browser = m[1];
+           _detected.version = m[2];
+         }
+
+         if (!_detected.browser) {
+           m = ua.match(/Trident\/.*rv:([0-9]{1,}[\.0-9]{0,})/i); // IE11
+
+           if (m !== null) {
+             _detected.browser = 'msie';
+             _detected.version = m[1];
+           }
+         }
+
+         if (!_detected.browser) {
+           m = ua.match(/(opr)\/?\s*(\.?\d+(\.\d+)*)/i); // Opera 15+
+
+           if (m !== null) {
+             _detected.browser = 'Opera';
+             _detected.version = m[2];
+           }
+         }
+
+         if (!_detected.browser) {
+           m = ua.match(/(opera|chrome|safari|firefox|msie)\/?\s*(\.?\d+(\.\d+)*)/i);
+
+           if (m !== null) {
+             _detected.browser = m[1];
+             _detected.version = m[2];
+             m = ua.match(/version\/([\.\d]+)/i);
+             if (m !== null) _detected.version = m[1];
+           }
+         }
+
+         if (!_detected.browser) {
+           _detected.browser = navigator.appName;
+           _detected.version = navigator.appVersion;
+         } // keep major.minor version only..
+
+
+         _detected.version = _detected.version.split(/\W/).slice(0, 2).join('.'); // detect other browser capabilities
+         // Legacy Opera has incomplete svg style support. See #715
+
+         _detected.opera = _detected.browser.toLowerCase() === 'opera' && parseFloat(_detected.version) < 15;
+
+         if (_detected.browser.toLowerCase() === 'msie') {
+           _detected.ie = true;
+           _detected.browser = 'Internet Explorer';
+           _detected.support = parseFloat(_detected.version) >= 11;
+         } else {
+           _detected.ie = false;
+           _detected.support = true;
+         }
+
+         _detected.filedrop = window.FileReader && 'ondrop' in window;
+         _detected.download = !(_detected.ie || _detected.browser.toLowerCase() === 'edge');
+         _detected.cssfilters = !(_detected.ie || _detected.browser.toLowerCase() === 'edge');
+         /* Platform */
+
+         if (/Win/.test(ua)) {
+           _detected.os = 'win';
+           _detected.platform = 'Windows';
+         } else if (/Mac/.test(ua)) {
+           _detected.os = 'mac';
+           _detected.platform = 'Macintosh';
+         } else if (/X11/.test(ua) || /Linux/.test(ua)) {
+           _detected.os = 'linux';
+           _detected.platform = 'Linux';
+         } else {
+           _detected.os = 'win';
+           _detected.platform = 'Unknown';
+         }
+
+         _detected.isMobileWebKit = (/\b(iPad|iPhone|iPod)\b/.test(ua) || // HACK: iPadOS 13+ requests desktop sites by default by using a Mac user agent,
+         // so assume any "mac" with multitouch is actually iOS
+         navigator.platform === 'MacIntel' && 'maxTouchPoints' in navigator && navigator.maxTouchPoints > 1) && /WebKit/.test(ua) && !/Edge/.test(ua) && !window.MSStream;
+         /* Locale */
+         // An array of locales requested by the browser in priority order.
+
+         _detected.browserLocales = Array.from(new Set( // remove duplicates
+         [navigator.language].concat(navigator.languages || []).concat([// old property for backwards compatibility
+         navigator.userLanguage]) // remove any undefined values
+         .filter(Boolean)));
+         /* Host */
+
+         var loc = window.top.location;
+         var origin = loc.origin;
+
+         if (!origin) {
+           // for unpatched IE11
+           origin = loc.protocol + '//' + loc.hostname + (loc.port ? ':' + loc.port : '');
+         }
+
+         _detected.host = origin + loc.pathname;
+         return _detected;
+       }
+
+       // Like selection.property('value', ...), but avoids no-op value sets,
+       // which can result in layout/repaint thrashing in some situations.
+
+       /** @returns {string} */
+       function utilGetSetValue(selection, value) {
+         function d3_selection_value(value) {
+           function valueNull() {
+             delete this.value;
+           }
+
+           function valueConstant() {
+             if (this.value !== value) {
+               this.value = value;
+             }
+           }
+
+           function valueFunction() {
+             var x = value.apply(this, arguments);
+
+             if (x === null || x === undefined) {
+               delete this.value;
+             } else if (this.value !== x) {
+               this.value = x;
+             }
+           }
+
+           return value === null || value === undefined ? valueNull : typeof value === 'function' ? valueFunction : valueConstant;
+         }
+
+         if (arguments.length === 1) {
+           return selection.property('value');
+         }
+
+         return selection.each(d3_selection_value(value));
+       }
+
+       function utilKeybinding(namespace) {
+         var _keybindings = {};
+
+         function testBindings(d3_event, isCapturing) {
+           var didMatch = false;
+           var bindings = Object.keys(_keybindings).map(function (id) {
+             return _keybindings[id];
+           });
+           var i, binding; // Most key shortcuts will accept either lower or uppercase ('h' or 'H'),
+           // so we don't strictly match on the shift key, but we prioritize
+           // shifted keybindings first, and fallback to unshifted only if no match.
+           // (This lets us differentiate between '←'/'⇧←' or '⌘Z'/'⌘⇧Z')
+           // priority match shifted keybindings first
+
+           for (i = 0; i < bindings.length; i++) {
+             binding = bindings[i];
+             if (!binding.event.modifiers.shiftKey) continue; // no shift
+
+             if (!!binding.capture !== isCapturing) continue;
+
+             if (matches(d3_event, binding, true)) {
+               binding.callback(d3_event);
+               didMatch = true; // match a max of one binding per event
+
+               break;
+             }
+           }
+
+           if (didMatch) return; // then unshifted keybindings
+
+           for (i = 0; i < bindings.length; i++) {
+             binding = bindings[i];
+             if (binding.event.modifiers.shiftKey) continue; // shift
+
+             if (!!binding.capture !== isCapturing) continue;
+
+             if (matches(d3_event, binding, false)) {
+               binding.callback(d3_event);
+               break;
+             }
+           }
+
+           function matches(d3_event, binding, testShift) {
+             var event = d3_event;
+             var isMatch = false;
+             var tryKeyCode = true; // Prefer a match on `KeyboardEvent.key`
+
+             if (event.key !== undefined) {
+               tryKeyCode = event.key.charCodeAt(0) > 255; // outside ISO-Latin-1
+
+               isMatch = true;
+
+               if (binding.event.key === undefined) {
+                 isMatch = false;
+               } else if (Array.isArray(binding.event.key)) {
+                 if (binding.event.key.map(function (s) {
+                   return s.toLowerCase();
+                 }).indexOf(event.key.toLowerCase()) === -1) {
+                   isMatch = false;
+                 }
+               } else {
+                 if (event.key.toLowerCase() !== binding.event.key.toLowerCase()) {
+                   isMatch = false;
+                 }
+               }
+             } // Fallback match on `KeyboardEvent.keyCode`, can happen if:
+             // - browser doesn't support `KeyboardEvent.key`
+             // - `KeyboardEvent.key` is outside ISO-Latin-1 range (cyrillic?)
+
+
+             if (!isMatch && tryKeyCode) {
+               isMatch = event.keyCode === binding.event.keyCode;
+             }
+
+             if (!isMatch) return false; // test modifier keys
+
+             if (!(event.ctrlKey && event.altKey)) {
+               // if both are set, assume AltGr and skip it - #4096
+               if (event.ctrlKey !== binding.event.modifiers.ctrlKey) return false;
+               if (event.altKey !== binding.event.modifiers.altKey) return false;
+             }
+
+             if (event.metaKey !== binding.event.modifiers.metaKey) return false;
+             if (testShift && event.shiftKey !== binding.event.modifiers.shiftKey) return false;
+             return true;
+           }
+         }
+
+         function capture(d3_event) {
+           testBindings(d3_event, true);
+         }
+
+         function bubble(d3_event) {
+           var tagName = select(d3_event.target).node().tagName;
+
+           if (tagName === 'INPUT' || tagName === 'SELECT' || tagName === 'TEXTAREA') {
+             return;
+           }
+
+           testBindings(d3_event, false);
+         }
+
+         function keybinding(selection) {
+           selection = selection || select(document);
+           selection.on('keydown.capture.' + namespace, capture, true);
+           selection.on('keydown.bubble.' + namespace, bubble, false);
+           return keybinding;
+         } // was: keybinding.off()
+
+
+         keybinding.unbind = function (selection) {
+           _keybindings = [];
+           selection = selection || select(document);
+           selection.on('keydown.capture.' + namespace, null);
+           selection.on('keydown.bubble.' + namespace, null);
+           return keybinding;
+         };
+
+         keybinding.clear = function () {
+           _keybindings = {};
+           return keybinding;
+         }; // Remove one or more keycode bindings.
+
+
+         keybinding.off = function (codes, capture) {
+           var arr = utilArrayUniq([].concat(codes));
+
+           for (var i = 0; i < arr.length; i++) {
+             var id = arr[i] + (capture ? '-capture' : '-bubble');
+             delete _keybindings[id];
+           }
+
+           return keybinding;
+         }; // Add one or more keycode bindings.
+
+
+         keybinding.on = function (codes, callback, capture) {
+           if (typeof callback !== 'function') {
+             return keybinding.off(codes, capture);
+           }
+
+           var arr = utilArrayUniq([].concat(codes));
+
+           for (var i = 0; i < arr.length; i++) {
+             var id = arr[i] + (capture ? '-capture' : '-bubble');
+             var binding = {
+               id: id,
+               capture: capture,
+               callback: callback,
+               event: {
+                 key: undefined,
+                 // preferred
+                 keyCode: 0,
+                 // fallback
+                 modifiers: {
+                   shiftKey: false,
+                   ctrlKey: false,
+                   altKey: false,
+                   metaKey: false
+                 }
+               }
+             };
+
+             if (_keybindings[id]) {
+               console.warn('warning: duplicate keybinding for "' + id + '"'); // eslint-disable-line no-console
+             }
+
+             _keybindings[id] = binding;
+             var matches = arr[i].toLowerCase().match(/(?:(?:[^+⇧⌃⌥⌘])+|[⇧⌃⌥⌘]|\+\+|^\+$)/g);
+
+             for (var j = 0; j < matches.length; j++) {
+               // Normalise matching errors
+               if (matches[j] === '++') matches[j] = '+';
+
+               if (matches[j] in utilKeybinding.modifierCodes) {
+                 var prop = utilKeybinding.modifierProperties[utilKeybinding.modifierCodes[matches[j]]];
+                 binding.event.modifiers[prop] = true;
+               } else {
+                 binding.event.key = utilKeybinding.keys[matches[j]] || matches[j];
+
+                 if (matches[j] in utilKeybinding.keyCodes) {
+                   binding.event.keyCode = utilKeybinding.keyCodes[matches[j]];
+                 }
+               }
+             }
+           }
+
+           return keybinding;
+         };
+
+         return keybinding;
+       }
+       /*
+        * See https://github.com/keithamus/jwerty
+        */
+
+       utilKeybinding.modifierCodes = {
+         // Shift key, ⇧
+         '⇧': 16,
+         shift: 16,
+         // CTRL key, on Mac: ⌃
+         '⌃': 17,
+         ctrl: 17,
+         // ALT key, on Mac: ⌥ (Alt)
+         '⌥': 18,
+         alt: 18,
+         option: 18,
+         // META, on Mac: ⌘ (CMD), on Windows (Win), on Linux (Super)
+         '⌘': 91,
+         meta: 91,
+         cmd: 91,
+         'super': 91,
+         win: 91
+       };
+       utilKeybinding.modifierProperties = {
+         16: 'shiftKey',
+         17: 'ctrlKey',
+         18: 'altKey',
+         91: 'metaKey'
+       };
+       utilKeybinding.plusKeys = ['plus', 'ffplus', '=', 'ffequals', '≠', '±'];
+       utilKeybinding.minusKeys = ['_', '-', 'ffminus', 'dash', '–', '—'];
+       utilKeybinding.keys = {
+         // Backspace key, on Mac: ⌫ (Backspace)
+         '⌫': 'Backspace',
+         backspace: 'Backspace',
+         // Tab Key, on Mac: ⇥ (Tab), on Windows ⇥⇥
+         '⇥': 'Tab',
+         '⇆': 'Tab',
+         tab: 'Tab',
+         // Return key, ↩
+         '↩': 'Enter',
+         '↵': 'Enter',
+         '⏎': 'Enter',
+         'return': 'Enter',
+         enter: 'Enter',
+         '⌅': 'Enter',
+         // Pause/Break key
+         'pause': 'Pause',
+         'pause-break': 'Pause',
+         // Caps Lock key, ⇪
+         '⇪': 'CapsLock',
+         caps: 'CapsLock',
+         'caps-lock': 'CapsLock',
+         // Escape key, on Mac: ⎋, on Windows: Esc
+         '⎋': ['Escape', 'Esc'],
+         escape: ['Escape', 'Esc'],
+         esc: ['Escape', 'Esc'],
+         // Space key
+         space: [' ', 'Spacebar'],
+         // Page-Up key, or pgup, on Mac: ↖
+         '↖': 'PageUp',
+         pgup: 'PageUp',
+         'page-up': 'PageUp',
+         // Page-Down key, or pgdown, on Mac: ↘
+         '↘': 'PageDown',
+         pgdown: 'PageDown',
+         'page-down': 'PageDown',
+         // END key, on Mac: ⇟
+         '⇟': 'End',
+         end: 'End',
+         // HOME key, on Mac: ⇞
+         '⇞': 'Home',
+         home: 'Home',
+         // Insert key, or ins
+         ins: 'Insert',
+         insert: 'Insert',
+         // Delete key, on Mac: ⌦ (Delete)
+         '⌦': ['Delete', 'Del'],
+         del: ['Delete', 'Del'],
+         'delete': ['Delete', 'Del'],
+         // Left Arrow Key, or ←
+         '←': ['ArrowLeft', 'Left'],
+         left: ['ArrowLeft', 'Left'],
+         'arrow-left': ['ArrowLeft', 'Left'],
+         // Up Arrow Key, or ↑
+         '↑': ['ArrowUp', 'Up'],
+         up: ['ArrowUp', 'Up'],
+         'arrow-up': ['ArrowUp', 'Up'],
+         // Right Arrow Key, or →
+         '→': ['ArrowRight', 'Right'],
+         right: ['ArrowRight', 'Right'],
+         'arrow-right': ['ArrowRight', 'Right'],
+         // Up Arrow Key, or ↓
+         '↓': ['ArrowDown', 'Down'],
+         down: ['ArrowDown', 'Down'],
+         'arrow-down': ['ArrowDown', 'Down'],
+         // odities, stuff for backward compatibility (browsers and code):
+         // Num-Multiply, or *
+         '*': ['*', 'Multiply'],
+         star: ['*', 'Multiply'],
+         asterisk: ['*', 'Multiply'],
+         multiply: ['*', 'Multiply'],
+         // Num-Plus or +
+         '+': ['+', 'Add'],
+         'plus': ['+', 'Add'],
+         // Num-Subtract, or -
+         '-': ['-', 'Subtract'],
+         subtract: ['-', 'Subtract'],
+         'dash': ['-', 'Subtract'],
+         // Semicolon
+         semicolon: ';',
+         // = or equals
+         equals: '=',
+         // Comma, or ,
+         comma: ',',
+         // Period, or ., or full-stop
+         period: '.',
+         'full-stop': '.',
+         // Slash, or /, or forward-slash
+         slash: '/',
+         'forward-slash': '/',
+         // Tick, or `, or back-quote
+         tick: '`',
+         'back-quote': '`',
+         // Open bracket, or [
+         'open-bracket': '[',
+         // Back slash, or \
+         'back-slash': '\\',
+         // Close backet, or ]
+         'close-bracket': ']',
+         // Apostrophe, or Quote, or '
+         quote: '\'',
+         apostrophe: '\'',
+         // NUMPAD 0-9
+         'num-0': '0',
+         'num-1': '1',
+         'num-2': '2',
+         'num-3': '3',
+         'num-4': '4',
+         'num-5': '5',
+         'num-6': '6',
+         'num-7': '7',
+         'num-8': '8',
+         'num-9': '9',
+         // F1-F25
+         f1: 'F1',
+         f2: 'F2',
+         f3: 'F3',
+         f4: 'F4',
+         f5: 'F5',
+         f6: 'F6',
+         f7: 'F7',
+         f8: 'F8',
+         f9: 'F9',
+         f10: 'F10',
+         f11: 'F11',
+         f12: 'F12',
+         f13: 'F13',
+         f14: 'F14',
+         f15: 'F15',
+         f16: 'F16',
+         f17: 'F17',
+         f18: 'F18',
+         f19: 'F19',
+         f20: 'F20',
+         f21: 'F21',
+         f22: 'F22',
+         f23: 'F23',
+         f24: 'F24',
+         f25: 'F25'
+       };
+       utilKeybinding.keyCodes = {
+         // Backspace key, on Mac: ⌫ (Backspace)
+         '⌫': 8,
+         backspace: 8,
+         // Tab Key, on Mac: ⇥ (Tab), on Windows ⇥⇥
+         '⇥': 9,
+         '⇆': 9,
+         tab: 9,
+         // Return key, ↩
+         '↩': 13,
+         '↵': 13,
+         '⏎': 13,
+         'return': 13,
+         enter: 13,
+         '⌅': 13,
+         // Pause/Break key
+         'pause': 19,
+         'pause-break': 19,
+         // Caps Lock key, ⇪
+         '⇪': 20,
+         caps: 20,
+         'caps-lock': 20,
+         // Escape key, on Mac: ⎋, on Windows: Esc
+         '⎋': 27,
+         escape: 27,
+         esc: 27,
+         // Space key
+         space: 32,
+         // Page-Up key, or pgup, on Mac: ↖
+         '↖': 33,
+         pgup: 33,
+         'page-up': 33,
+         // Page-Down key, or pgdown, on Mac: ↘
+         '↘': 34,
+         pgdown: 34,
+         'page-down': 34,
+         // END key, on Mac: ⇟
+         '⇟': 35,
+         end: 35,
+         // HOME key, on Mac: ⇞
+         '⇞': 36,
+         home: 36,
+         // Insert key, or ins
+         ins: 45,
+         insert: 45,
+         // Delete key, on Mac: ⌦ (Delete)
+         '⌦': 46,
+         del: 46,
+         'delete': 46,
+         // Left Arrow Key, or ←
+         '←': 37,
+         left: 37,
+         'arrow-left': 37,
+         // Up Arrow Key, or ↑
+         '↑': 38,
+         up: 38,
+         'arrow-up': 38,
+         // Right Arrow Key, or →
+         '→': 39,
+         right: 39,
+         'arrow-right': 39,
+         // Up Arrow Key, or ↓
+         '↓': 40,
+         down: 40,
+         'arrow-down': 40,
+         // odities, printing characters that come out wrong:
+         // Firefox Equals
+         'ffequals': 61,
+         // Num-Multiply, or *
+         '*': 106,
+         star: 106,
+         asterisk: 106,
+         multiply: 106,
+         // Num-Plus or +
+         '+': 107,
+         'plus': 107,
+         // Num-Subtract, or -
+         '-': 109,
+         subtract: 109,
+         // Vertical Bar / Pipe
+         '|': 124,
+         // Firefox Plus
+         'ffplus': 171,
+         // Firefox Minus
+         'ffminus': 173,
+         // Semicolon
+         ';': 186,
+         semicolon: 186,
+         // = or equals
+         '=': 187,
+         'equals': 187,
+         // Comma, or ,
+         ',': 188,
+         comma: 188,
+         // Dash / Underscore key
+         'dash': 189,
+         // Period, or ., or full-stop
+         '.': 190,
+         period: 190,
+         'full-stop': 190,
+         // Slash, or /, or forward-slash
+         '/': 191,
+         slash: 191,
+         'forward-slash': 191,
+         // Tick, or `, or back-quote
+         '`': 192,
+         tick: 192,
+         'back-quote': 192,
+         // Open bracket, or [
+         '[': 219,
+         'open-bracket': 219,
+         // Back slash, or \
+         '\\': 220,
+         'back-slash': 220,
+         // Close backet, or ]
+         ']': 221,
+         'close-bracket': 221,
+         // Apostrophe, or Quote, or '
+         '\'': 222,
+         quote: 222,
+         apostrophe: 222
+       }; // NUMPAD 0-9
+
+       var i = 95,
+           n = 0;
+
+       while (++i < 106) {
+         utilKeybinding.keyCodes['num-' + n] = i;
+         ++n;
+       } // 0-9
+
+
+       i = 47;
+       n = 0;
+
+       while (++i < 58) {
+         utilKeybinding.keyCodes[n] = i;
+         ++n;
+       } // F1-F25
+
+
+       i = 111;
+       n = 1;
+
+       while (++i < 136) {
+         utilKeybinding.keyCodes['f' + n] = i;
+         ++n;
+       } // a-z
+
+
+       i = 64;
+
+       while (++i < 91) {
+         utilKeybinding.keyCodes[String.fromCharCode(i).toLowerCase()] = i;
+       }
+
+       function utilObjectOmit(obj, omitKeys) {
+         return Object.keys(obj).reduce(function (result, key) {
+           if (omitKeys.indexOf(key) === -1) {
+             result[key] = obj[key]; // keep
+           }
+
+           return result;
+         }, {});
+       }
+
+       // Copies a variable number of methods from source to target.
+       function utilRebind(target, source) {
+         var i = 1,
+             n = arguments.length,
+             method;
+
+         while (++i < n) {
+           target[method = arguments[i]] = d3_rebind(target, source, source[method]);
+         }
+
+         return target;
+       } // Method is assumed to be a standard D3 getter-setter:
+       // If passed with no arguments, gets the value.
+       // If passed with arguments, sets the value and returns the target.
+
+       function d3_rebind(target, source, method) {
+         return function () {
+           var value = method.apply(source, arguments);
+           return value === source ? target : value;
+         };
+       }
+
+       // A per-domain session mutex backed by a cookie and dead man's
+       // switch. If the session crashes, the mutex will auto-release
+       // after 5 seconds.
+       // This accepts a string and returns an object that complies with utilSessionMutexType
+       function utilSessionMutex(name) {
+         var mutex = {};
+         var intervalID;
+
+         function renew() {
+           var expires = new Date();
+           expires.setSeconds(expires.getSeconds() + 5);
+           document.cookie = name + '=1; expires=' + expires.toUTCString() + '; sameSite=strict';
+         }
+
+         mutex.lock = function () {
+           if (intervalID) return true;
+           var cookie = document.cookie.replace(new RegExp('(?:(?:^|.*;)\\s*' + name + '\\s*\\=\\s*([^;]*).*$)|^.*$'), '$1');
+           if (cookie) return false;
+           renew();
+           intervalID = window.setInterval(renew, 4000);
+           return true;
+         };
+
+         mutex.unlock = function () {
+           if (!intervalID) return;
+           document.cookie = name + '=; expires=Thu, 01 Jan 1970 00:00:00 GMT; sameSite=strict';
+           clearInterval(intervalID);
+           intervalID = null;
+         };
+
+         mutex.locked = function () {
+           return !!intervalID;
+         };
+
+         return mutex;
+       }
+
+       function utilTiler() {
+         var _size = [256, 256];
+         var _scale = 256;
+         var _tileSize = 256;
+         var _zoomExtent = [0, 20];
+         var _translate = [_size[0] / 2, _size[1] / 2];
+         var _margin = 0;
+         var _skipNullIsland = false;
+
+         function clamp(num, min, max) {
+           return Math.max(min, Math.min(num, max));
+         }
+
+         function nearNullIsland(tile) {
+           var x = tile[0];
+           var y = tile[1];
+           var z = tile[2];
+
+           if (z >= 7) {
+             var center = Math.pow(2, z - 1);
+             var width = Math.pow(2, z - 6);
+             var min = center - width / 2;
+             var max = center + width / 2 - 1;
+             return x >= min && x <= max && y >= min && y <= max;
+           }
+
+           return false;
+         }
+
+         function tiler() {
+           var z = geoScaleToZoom(_scale / (2 * Math.PI), _tileSize);
+           var z0 = clamp(Math.round(z), _zoomExtent[0], _zoomExtent[1]);
+           var tileMin = 0;
+           var tileMax = Math.pow(2, z0) - 1;
+           var log2ts = Math.log(_tileSize) * Math.LOG2E;
+           var k = Math.pow(2, z - z0 + log2ts);
+           var origin = [(_translate[0] - _scale / 2) / k, (_translate[1] - _scale / 2) / k];
+           var cols = range$1(clamp(Math.floor(-origin[0]) - _margin, tileMin, tileMax + 1), clamp(Math.ceil(_size[0] / k - origin[0]) + _margin, tileMin, tileMax + 1));
+           var rows = range$1(clamp(Math.floor(-origin[1]) - _margin, tileMin, tileMax + 1), clamp(Math.ceil(_size[1] / k - origin[1]) + _margin, tileMin, tileMax + 1));
+           var tiles = [];
+
+           for (var i = 0; i < rows.length; i++) {
+             var y = rows[i];
+
+             for (var j = 0; j < cols.length; j++) {
+               var x = cols[j];
+
+               if (i >= _margin && i <= rows.length - _margin && j >= _margin && j <= cols.length - _margin) {
+                 tiles.unshift([x, y, z0]); // tiles in view at beginning
+               } else {
+                 tiles.push([x, y, z0]); // tiles in margin at the end
+               }
+             }
+           }
+
+           tiles.translate = origin;
+           tiles.scale = k;
+           return tiles;
+         }
+         /**
+          * getTiles() returns an array of tiles that cover the map view
+          */
+
+
+         tiler.getTiles = function (projection) {
+           var origin = [projection.scale() * Math.PI - projection.translate()[0], projection.scale() * Math.PI - projection.translate()[1]];
+           this.size(projection.clipExtent()[1]).scale(projection.scale() * 2 * Math.PI).translate(projection.translate());
+           var tiles = tiler();
+           var ts = tiles.scale;
+           return tiles.map(function (tile) {
+             if (_skipNullIsland && nearNullIsland(tile)) {
+               return false;
+             }
+
+             var x = tile[0] * ts - origin[0];
+             var y = tile[1] * ts - origin[1];
+             return {
+               id: tile.toString(),
+               xyz: tile,
+               extent: geoExtent(projection.invert([x, y + ts]), projection.invert([x + ts, y]))
+             };
+           }).filter(Boolean);
+         };
+         /**
+          * getGeoJSON() returns a FeatureCollection for debugging tiles
+          */
+
+
+         tiler.getGeoJSON = function (projection) {
+           var features = tiler.getTiles(projection).map(function (tile) {
+             return {
+               type: 'Feature',
+               properties: {
+                 id: tile.id,
+                 name: tile.id
+               },
+               geometry: {
+                 type: 'Polygon',
+                 coordinates: [tile.extent.polygon()]
+               }
+             };
+           });
+           return {
+             type: 'FeatureCollection',
+             features: features
+           };
+         };
+
+         tiler.tileSize = function (val) {
+           if (!arguments.length) return _tileSize;
+           _tileSize = val;
+           return tiler;
+         };
+
+         tiler.zoomExtent = function (val) {
+           if (!arguments.length) return _zoomExtent;
+           _zoomExtent = val;
+           return tiler;
+         };
+
+         tiler.size = function (val) {
+           if (!arguments.length) return _size;
+           _size = val;
+           return tiler;
+         };
+
+         tiler.scale = function (val) {
+           if (!arguments.length) return _scale;
+           _scale = val;
+           return tiler;
+         };
+
+         tiler.translate = function (val) {
+           if (!arguments.length) return _translate;
+           _translate = val;
+           return tiler;
+         }; // number to extend the rows/columns beyond those covering the viewport
+
+
+         tiler.margin = function (val) {
+           if (!arguments.length) return _margin;
+           _margin = +val;
+           return tiler;
+         };
+
+         tiler.skipNullIsland = function (val) {
+           if (!arguments.length) return _skipNullIsland;
+           _skipNullIsland = val;
+           return tiler;
+         };
+
+         return tiler;
+       }
+
+       function utilTriggerEvent(target, type) {
+         target.each(function () {
+           var evt = document.createEvent('HTMLEvents');
+           evt.initEvent(type, true, true);
+           this.dispatchEvent(evt);
+         });
+       }
+
+       var _mainLocations = coreLocations(); // singleton
+       // `coreLocations` maintains an internal index of all the boundaries/geofences used by iD.
+       // It's used by presets, community index, background imagery, to know where in the world these things are valid.
+       // These geofences should be defined by `locationSet` objects:
+       //
+       // let locationSet = {
+       //   include: [ Array of locations ],
+       //   exclude: [ Array of locations ]
+       // };
+       //
+       // For more info see the location-conflation and country-coder projects, see:
+       // https://github.com/ideditor/location-conflation
+       // https://github.com/ideditor/country-coder
+       //
+
+       function coreLocations() {
+         var _this = {};
+         var _resolvedFeatures = {}; // cache of *resolved* locationSet features
+
+         var _loco = new _default(); // instance of a location-conflation resolver
+
+
+         var _wp; // instance of a which-polygon index
+         // pre-resolve the worldwide locationSet
+
+
+         var world = {
+           locationSet: {
+             include: ['Q2']
+           }
+         };
+         resolveLocationSet(world);
+         rebuildIndex();
+         var _queue = [];
+
+         var _deferred = new Set();
+
+         var _inProcess; // Returns a Promise to process the queue
+
+
+         function processQueue() {
+           if (!_queue.length) return Promise.resolve(); // console.log(`queue length ${_queue.length}`);
+
+           var chunk = _queue.pop();
+
+           return new Promise(function (resolvePromise) {
+             var handle = window.requestIdleCallback(function () {
+               _deferred["delete"](handle); // const t0 = performance.now();
+
+
+               chunk.forEach(resolveLocationSet); // const t1 = performance.now();
+               // console.log('chunk processed in ' + (t1 - t0) + ' ms');
+
+               resolvePromise();
+             });
+
+             _deferred.add(handle);
+           }).then(function () {
+             return processQueue();
+           });
+         } // Pass an Object with a `locationSet` property,
+         // Performs the locationSet resolution, caches the result, and sets a `locationSetID` property on the object.
+
+
+         function resolveLocationSet(obj) {
+           if (obj.locationSetID) return; // work was done already
+
+           try {
+             var locationSet = obj.locationSet;
+
+             if (!locationSet) {
+               throw new Error('object missing locationSet property');
+             }
+
+             if (!locationSet.include) {
+               // missing `include`, default to worldwide include
+               locationSet.include = ['Q2']; // https://github.com/openstreetmap/iD/pull/8305#discussion_r662344647
+             }
+
+             var resolved = _loco.resolveLocationSet(locationSet);
+
+             var locationSetID = resolved.id;
+             obj.locationSetID = locationSetID;
+
+             if (!resolved.feature.geometry.coordinates.length || !resolved.feature.properties.area) {
+               throw new Error("locationSet ".concat(locationSetID, " resolves to an empty feature."));
+             }
+
+             if (!_resolvedFeatures[locationSetID]) {
+               // First time seeing this locationSet feature
+               var feature = JSON.parse(JSON.stringify(resolved.feature)); // deep clone
+
+               feature.id = locationSetID; // Important: always use the locationSet `id` (`+[Q30]`), not the feature `id` (`Q30`)
+
+               feature.properties.id = locationSetID;
+               _resolvedFeatures[locationSetID] = feature; // insert into cache
+             }
+           } catch (err) {
+             obj.locationSet = {
+               include: ['Q2']
+             }; // default worldwide
+
+             obj.locationSetID = '+[Q2]';
+           }
+         } // Rebuilds the whichPolygon index with whatever features have been resolved.
+
+
+         function rebuildIndex() {
+           _wp = whichPolygon_1({
+             features: Object.values(_resolvedFeatures)
+           });
+         } //
+         // `mergeCustomGeoJSON`
+         //  Accepts an FeatureCollection-like object containing custom locations
+         //  Each feature must have a filename-like `id`, for example: `something.geojson`
+         //
+         //  {
+         //    "type": "FeatureCollection"
+         //    "features": [
+         //      {
+         //        "type": "Feature",
+         //        "id": "philly_metro.geojson",
+         //        "properties": { … },
+         //        "geometry": { … }
+         //      }
+         //    ]
+         //  }
+         //
+
+
+         _this.mergeCustomGeoJSON = function (fc) {
+           if (fc && fc.type === 'FeatureCollection' && Array.isArray(fc.features)) {
+             fc.features.forEach(function (feature) {
+               feature.properties = feature.properties || {};
+               var props = feature.properties; // Get `id` from either `id` or `properties`
+
+               var id = feature.id || props.id;
+               if (!id || !/^\S+\.geojson$/i.test(id)) return; // Ensure `id` exists and is lowercase
+
+               id = id.toLowerCase();
+               feature.id = id;
+               props.id = id; // Ensure `area` property exists
+
+               if (!props.area) {
+                 var area = geojsonArea.geometry(feature.geometry) / 1e6; // m² to km²
+
+                 props.area = Number(area.toFixed(2));
+               }
+
+               _loco._cache[id] = feature;
+             });
+           }
+         }; //
+         // `mergeLocationSets`
+         //  Accepts an Array of Objects containing `locationSet` properties.
+         //  The locationSets will be resolved and indexed in the background.
+         //  [
+         //   { id: 'preset1', locationSet: {…} },
+         //   { id: 'preset2', locationSet: {…} },
+         //   { id: 'preset3', locationSet: {…} },
+         //   …
+         //  ]
+         //  After resolving and indexing, the Objects will be decorated with a
+         //  `locationSetID` property.
+         //  [
+         //   { id: 'preset1', locationSet: {…}, locationSetID: '+[Q2]' },
+         //   { id: 'preset2', locationSet: {…}, locationSetID: '+[Q30]' },
+         //   { id: 'preset3', locationSet: {…}, locationSetID: '+[Q2]' },
+         //   …
+         //  ]
+         //
+         //  Returns a Promise fulfilled when the resolving/indexing has been completed
+         //  This will take some seconds but happen in the background during browser idle time.
+         //
+
+
+         _this.mergeLocationSets = function (objects) {
+           if (!Array.isArray(objects)) return Promise.reject('nothing to do'); // Resolve all locationSets -> geojson, processing data in chunks
+           //
+           // Because this will happen during idle callbacks, we want to choose a chunk size
+           // that won't make the browser stutter too badly.  LocationSets that are a simple
+           // country coder include will resolve instantly, but ones that involve complex
+           // include/exclude operations will take some milliseconds longer.
+           //
+           // Some discussion and performance results on these tickets:
+           // https://github.com/ideditor/location-conflation/issues/26
+           // https://github.com/osmlab/name-suggestion-index/issues/4784#issuecomment-742003434
+
+           _queue = _queue.concat(utilArrayChunk(objects, 200));
+
+           if (!_inProcess) {
+             _inProcess = processQueue().then(function () {
+               rebuildIndex();
+               _inProcess = null;
+               return objects;
+             });
+           }
+
+           return _inProcess;
+         }; //
+         // `locationSetID`
+         // Returns a locationSetID for a given locationSet (fallback to `+[Q2]`, world)
+         // (The locationset doesn't necessarily need to be resolved to compute its `id`)
+         //
+         // Arguments
+         //   `locationSet`: A locationSet, e.g. `{ include: ['us'] }`
+         // Returns
+         //   The locationSetID, e.g. `+[Q30]`
+         //
+
+
+         _this.locationSetID = function (locationSet) {
+           var locationSetID;
+
+           try {
+             locationSetID = _loco.validateLocationSet(locationSet).id;
+           } catch (err) {
+             locationSetID = '+[Q2]'; // the world
+           }
+
+           return locationSetID;
+         }; //
+         // `feature`
+         // Returns the resolved GeoJSON feature for a given locationSetID (fallback to 'world')
+         //
+         // Arguments
+         //   `locationSetID`: id of the form like `+[Q30]`  (United States)
+         // Returns
+         //   A GeoJSON feature:
+         //   {
+         //     type: 'Feature',
+         //     id: '+[Q30]',
+         //     properties: { id: '+[Q30]', area: 21817019.17, … },
+         //     geometry: { … }
+         //   }
+
+
+         _this.feature = function (locationSetID) {
+           return _resolvedFeatures[locationSetID] || _resolvedFeatures['+[Q2]'];
+         }; //
+         // `locationsAt`
+         // Find all the resolved locationSets valid at the given location.
+         // Results include the area (in km²) to facilitate sorting.
+         //
+         // Arguments
+         //   `loc`: the [lon,lat] location to query, e.g. `[-74.4813, 40.7967]`
+         // Returns
+         //   Object of locationSetIDs to areas (in km²)
+         //   {
+         //     "+[Q2]": 511207893.3958111,
+         //     "+[Q30]": 21817019.17,
+         //     "+[new_jersey.geojson]": 22390.77,
+         //     …
+         //   }
+         //
+
+
+         _this.locationsAt = function (loc) {
+           var result = {};
+           (_wp(loc, true) || []).forEach(function (prop) {
+             return result[prop.id] = prop.area;
+           });
+           return result;
+         }; //
+         // `query`
+         // Execute a query directly against which-polygon
+         // https://github.com/mapbox/which-polygon
+         //
+         // Arguments
+         //   `loc`: the [lon,lat] location to query,
+         //   `multi`: `true` to return all results, `false` to return first result
+         // Returns
+         //   Array of GeoJSON *properties* for the locationSet features that exist at `loc`
+         //
+
+
+         _this.query = function (loc, multi) {
+           return _wp(loc, multi);
+         }; // Direct access to the location-conflation resolver
+
+
+         _this.loco = function () {
+           return _loco;
+         }; // Direct access to the which-polygon index
+
+
+         _this.wp = function () {
+           return _wp;
+         };
+
+         return _this;
+       }
+
+       var $$h = _export;
+       var $findIndex = arrayIteration.findIndex;
+       var addToUnscopables$1 = addToUnscopables$6;
+
+       var FIND_INDEX = 'findIndex';
+       var SKIPS_HOLES = true;
+
+       // Shouldn't skip holes
+       if (FIND_INDEX in []) Array(1)[FIND_INDEX](function () { SKIPS_HOLES = false; });
+
+       // `Array.prototype.findIndex` method
+       // https://tc39.es/ecma262/#sec-array.prototype.findindex
+       $$h({ target: 'Array', proto: true, forced: SKIPS_HOLES }, {
+         findIndex: function findIndex(callbackfn /* , that = undefined */) {
+           return $findIndex(this, callbackfn, arguments.length > 1 ? arguments[1] : undefined);
+         }
+       });
+
+       // https://tc39.es/ecma262/#sec-array.prototype-@@unscopables
+       addToUnscopables$1(FIND_INDEX);
+
+       var global$5 = global$1o;
+       var isRegExp = isRegexp;
+
+       var TypeError$3 = global$5.TypeError;
+
+       var notARegexp = function (it) {
+         if (isRegExp(it)) {
+           throw TypeError$3("The method doesn't accept regular expressions");
+         } return it;
+       };
+
+       var wellKnownSymbol = wellKnownSymbol$t;
+
+       var MATCH = wellKnownSymbol('match');
+
+       var correctIsRegexpLogic = function (METHOD_NAME) {
+         var regexp = /./;
+         try {
+           '/./'[METHOD_NAME](regexp);
+         } catch (error1) {
+           try {
+             regexp[MATCH] = false;
+             return '/./'[METHOD_NAME](regexp);
+           } catch (error2) { /* empty */ }
+         } return false;
+       };
+
+       var $$g = _export;
+       var uncurryThis$7 = functionUncurryThis;
+       var notARegExp$2 = notARegexp;
+       var requireObjectCoercible$3 = requireObjectCoercible$e;
+       var toString$4 = toString$k;
+       var correctIsRegExpLogic$2 = correctIsRegexpLogic;
+
+       var stringIndexOf = uncurryThis$7(''.indexOf);
+
+       // `String.prototype.includes` method
+       // https://tc39.es/ecma262/#sec-string.prototype.includes
+       $$g({ target: 'String', proto: true, forced: !correctIsRegExpLogic$2('includes') }, {
+         includes: function includes(searchString /* , position = 0 */) {
+           return !!~stringIndexOf(
+             toString$4(requireObjectCoercible$3(this)),
+             toString$4(notARegExp$2(searchString)),
+             arguments.length > 1 ? arguments[1] : undefined
+           );
+         }
+       });
+
+       /** Detect free variable `global` from Node.js. */
+       var freeGlobal = (typeof global === "undefined" ? "undefined" : _typeof(global)) == 'object' && global && global.Object === Object && global;
+
+       /** Detect free variable `self`. */
+
+       var freeSelf = (typeof self === "undefined" ? "undefined" : _typeof(self)) == 'object' && self && self.Object === Object && self;
+       /** Used as a reference to the global object. */
+
+       var root = freeGlobal || freeSelf || Function('return this')();
+
+       /** Built-in value references. */
+
+       var _Symbol = root.Symbol;
+
+       /** Used for built-in method references. */
+
+       var objectProto$1 = Object.prototype;
+       /** Used to check objects for own properties. */
+
+       var hasOwnProperty$2 = objectProto$1.hasOwnProperty;
+       /**
+        * Used to resolve the
+        * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)
+        * of values.
+        */
+
+       var nativeObjectToString$1 = objectProto$1.toString;
+       /** Built-in value references. */
+
+       var symToStringTag$1 = _Symbol ? _Symbol.toStringTag : undefined;
+       /**
+        * A specialized version of `baseGetTag` which ignores `Symbol.toStringTag` values.
+        *
+        * @private
+        * @param {*} value The value to query.
+        * @returns {string} Returns the raw `toStringTag`.
+        */
+
+       function getRawTag(value) {
+         var isOwn = hasOwnProperty$2.call(value, symToStringTag$1),
+             tag = value[symToStringTag$1];
+
+         try {
+           value[symToStringTag$1] = undefined;
+           var unmasked = true;
+         } catch (e) {}
+
+         var result = nativeObjectToString$1.call(value);
+
+         if (unmasked) {
+           if (isOwn) {
+             value[symToStringTag$1] = tag;
+           } else {
+             delete value[symToStringTag$1];
+           }
+         }
+
+         return result;
+       }
+
+       /** Used for built-in method references. */
+       var objectProto = Object.prototype;
+       /**
+        * Used to resolve the
+        * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)
+        * of values.
+        */
+
+       var nativeObjectToString = objectProto.toString;
+       /**
+        * Converts `value` to a string using `Object.prototype.toString`.
+        *
+        * @private
+        * @param {*} value The value to convert.
+        * @returns {string} Returns the converted string.
+        */
+
+       function objectToString(value) {
+         return nativeObjectToString.call(value);
+       }
+
+       /** `Object#toString` result references. */
+
+       var nullTag = '[object Null]',
+           undefinedTag = '[object Undefined]';
+       /** Built-in value references. */
+
+       var symToStringTag = _Symbol ? _Symbol.toStringTag : undefined;
+       /**
+        * The base implementation of `getTag` without fallbacks for buggy environments.
+        *
+        * @private
+        * @param {*} value The value to query.
+        * @returns {string} Returns the `toStringTag`.
+        */
+
+       function baseGetTag(value) {
+         if (value == null) {
+           return value === undefined ? undefinedTag : nullTag;
+         }
+
+         return symToStringTag && symToStringTag in Object(value) ? getRawTag(value) : objectToString(value);
+       }
+
+       /**
+        * Checks if `value` is object-like. A value is object-like if it's not `null`
+        * and has a `typeof` result of "object".
+        *
+        * @static
+        * @memberOf _
+        * @since 4.0.0
+        * @category Lang
+        * @param {*} value The value to check.
+        * @returns {boolean} Returns `true` if `value` is object-like, else `false`.
+        * @example
+        *
+        * _.isObjectLike({});
+        * // => true
+        *
+        * _.isObjectLike([1, 2, 3]);
+        * // => true
+        *
+        * _.isObjectLike(_.noop);
+        * // => false
+        *
+        * _.isObjectLike(null);
+        * // => false
+        */
+       function isObjectLike(value) {
+         return value != null && _typeof(value) == 'object';
+       }
+
+       /** `Object#toString` result references. */
+
+       var symbolTag = '[object Symbol]';
+       /**
+        * Checks if `value` is classified as a `Symbol` primitive or object.
+        *
+        * @static
+        * @memberOf _
+        * @since 4.0.0
+        * @category Lang
+        * @param {*} value The value to check.
+        * @returns {boolean} Returns `true` if `value` is a symbol, else `false`.
+        * @example
+        *
+        * _.isSymbol(Symbol.iterator);
+        * // => true
+        *
+        * _.isSymbol('abc');
+        * // => false
+        */
+
+       function isSymbol(value) {
+         return _typeof(value) == 'symbol' || isObjectLike(value) && baseGetTag(value) == symbolTag;
+       }
+
+       /**
+        * A specialized version of `_.map` for arrays without support for iteratee
+        * shorthands.
+        *
+        * @private
+        * @param {Array} [array] The array to iterate over.
+        * @param {Function} iteratee The function invoked per iteration.
+        * @returns {Array} Returns the new mapped array.
+        */
+       function arrayMap(array, iteratee) {
+         var index = -1,
+             length = array == null ? 0 : array.length,
+             result = Array(length);
+
+         while (++index < length) {
+           result[index] = iteratee(array[index], index, array);
+         }
+
+         return result;
+       }
+
+       /**
+        * Checks if `value` is classified as an `Array` object.
+        *
+        * @static
+        * @memberOf _
+        * @since 0.1.0
+        * @category Lang
+        * @param {*} value The value to check.
+        * @returns {boolean} Returns `true` if `value` is an array, else `false`.
+        * @example
+        *
+        * _.isArray([1, 2, 3]);
+        * // => true
+        *
+        * _.isArray(document.body.children);
+        * // => false
+        *
+        * _.isArray('abc');
+        * // => false
+        *
+        * _.isArray(_.noop);
+        * // => false
+        */
+       var isArray$1 = Array.isArray;
+
+       /** Used as references for various `Number` constants. */
+
+       var INFINITY = 1 / 0;
+       /** Used to convert symbols to primitives and strings. */
+
+       var symbolProto = _Symbol ? _Symbol.prototype : undefined,
+           symbolToString = symbolProto ? symbolProto.toString : undefined;
+       /**
+        * The base implementation of `_.toString` which doesn't convert nullish
+        * values to empty strings.
+        *
+        * @private
+        * @param {*} value The value to process.
+        * @returns {string} Returns the string.
+        */
+
+       function baseToString(value) {
+         // Exit early for strings to avoid a performance hit in some environments.
+         if (typeof value == 'string') {
+           return value;
+         }
+
+         if (isArray$1(value)) {
+           // Recursively convert values (susceptible to call stack limits).
+           return arrayMap(value, baseToString) + '';
+         }
+
+         if (isSymbol(value)) {
+           return symbolToString ? symbolToString.call(value) : '';
+         }
+
+         var result = value + '';
+         return result == '0' && 1 / value == -INFINITY ? '-0' : result;
+       }
+
+       /** Used to match a single whitespace character. */
+       var reWhitespace = /\s/;
+       /**
+        * Used by `_.trim` and `_.trimEnd` to get the index of the last non-whitespace
+        * character of `string`.
+        *
+        * @private
+        * @param {string} string The string to inspect.
+        * @returns {number} Returns the index of the last non-whitespace character.
+        */
+
+       function trimmedEndIndex(string) {
+         var index = string.length;
+
+         while (index-- && reWhitespace.test(string.charAt(index))) {}
+
+         return index;
+       }
+
+       /** Used to match leading whitespace. */
+
+       var reTrimStart = /^\s+/;
+       /**
+        * The base implementation of `_.trim`.
+        *
+        * @private
+        * @param {string} string The string to trim.
+        * @returns {string} Returns the trimmed string.
+        */
+
+       function baseTrim(string) {
+         return string ? string.slice(0, trimmedEndIndex(string) + 1).replace(reTrimStart, '') : string;
+       }
+
+       /**
+        * Checks if `value` is the
+        * [language type](http://www.ecma-international.org/ecma-262/7.0/#sec-ecmascript-language-types)
+        * of `Object`. (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)
+        *
+        * @static
+        * @memberOf _
+        * @since 0.1.0
+        * @category Lang
+        * @param {*} value The value to check.
+        * @returns {boolean} Returns `true` if `value` is an object, else `false`.
+        * @example
+        *
+        * _.isObject({});
+        * // => true
+        *
+        * _.isObject([1, 2, 3]);
+        * // => true
+        *
+        * _.isObject(_.noop);
+        * // => true
+        *
+        * _.isObject(null);
+        * // => false
+        */
+       function isObject$2(value) {
+         var type = _typeof(value);
+
+         return value != null && (type == 'object' || type == 'function');
+       }
+
+       /** Used as references for various `Number` constants. */
+
+       var NAN = 0 / 0;
+       /** Used to detect bad signed hexadecimal string values. */
+
+       var reIsBadHex = /^[-+]0x[0-9a-f]+$/i;
+       /** Used to detect binary string values. */
+
+       var reIsBinary = /^0b[01]+$/i;
+       /** Used to detect octal string values. */
+
+       var reIsOctal = /^0o[0-7]+$/i;
+       /** Built-in method references without a dependency on `root`. */
+
+       var freeParseInt = parseInt;
+       /**
+        * Converts `value` to a number.
+        *
+        * @static
+        * @memberOf _
+        * @since 4.0.0
+        * @category Lang
+        * @param {*} value The value to process.
+        * @returns {number} Returns the number.
+        * @example
+        *
+        * _.toNumber(3.2);
+        * // => 3.2
+        *
+        * _.toNumber(Number.MIN_VALUE);
+        * // => 5e-324
+        *
+        * _.toNumber(Infinity);
+        * // => Infinity
+        *
+        * _.toNumber('3.2');
+        * // => 3.2
+        */
+
+       function toNumber(value) {
+         if (typeof value == 'number') {
+           return value;
+         }
+
+         if (isSymbol(value)) {
+           return NAN;
+         }
+
+         if (isObject$2(value)) {
+           var other = typeof value.valueOf == 'function' ? value.valueOf() : value;
+           value = isObject$2(other) ? other + '' : other;
+         }
+
+         if (typeof value != 'string') {
+           return value === 0 ? value : +value;
+         }
+
+         value = baseTrim(value);
+         var isBinary = reIsBinary.test(value);
+         return isBinary || reIsOctal.test(value) ? freeParseInt(value.slice(2), isBinary ? 2 : 8) : reIsBadHex.test(value) ? NAN : +value;
+       }
+
+       /**
+        * Converts `value` to a string. An empty string is returned for `null`
+        * and `undefined` values. The sign of `-0` is preserved.
+        *
+        * @static
+        * @memberOf _
+        * @since 4.0.0
+        * @category Lang
+        * @param {*} value The value to convert.
+        * @returns {string} Returns the converted string.
+        * @example
+        *
+        * _.toString(null);
+        * // => ''
+        *
+        * _.toString(-0);
+        * // => '-0'
+        *
+        * _.toString([1, 2, 3]);
+        * // => '1,2,3'
+        */
+
+       function toString$3(value) {
+         return value == null ? '' : baseToString(value);
+       }
+
+       /**
+        * The base implementation of `_.propertyOf` without support for deep paths.
+        *
+        * @private
+        * @param {Object} object The object to query.
+        * @returns {Function} Returns the new accessor function.
+        */
+       function basePropertyOf(object) {
+         return function (key) {
+           return object == null ? undefined : object[key];
+         };
+       }
+
+       /**
+        * Gets the timestamp of the number of milliseconds that have elapsed since
+        * the Unix epoch (1 January 1970 00:00:00 UTC).
+        *
+        * @static
+        * @memberOf _
+        * @since 2.4.0
+        * @category Date
+        * @returns {number} Returns the timestamp.
+        * @example
+        *
+        * _.defer(function(stamp) {
+        *   console.log(_.now() - stamp);
+        * }, _.now());
+        * // => Logs the number of milliseconds it took for the deferred invocation.
+        */
+
+       var now = function now() {
+         return root.Date.now();
+       };
+
+       /** Error message constants. */
+
+       var FUNC_ERROR_TEXT$1 = 'Expected a function';
+       /* Built-in method references for those with the same name as other `lodash` methods. */
+
+       var nativeMax = Math.max,
+           nativeMin = Math.min;
+       /**
+        * Creates a debounced function that delays invoking `func` until after `wait`
+        * milliseconds have elapsed since the last time the debounced function was
+        * invoked. The debounced function comes with a `cancel` method to cancel
+        * delayed `func` invocations and a `flush` method to immediately invoke them.
+        * Provide `options` to indicate whether `func` should be invoked on the
+        * leading and/or trailing edge of the `wait` timeout. The `func` is invoked
+        * with the last arguments provided to the debounced function. Subsequent
+        * calls to the debounced function return the result of the last `func`
+        * invocation.
+        *
+        * **Note:** If `leading` and `trailing` options are `true`, `func` is
+        * invoked on the trailing edge of the timeout only if the debounced function
+        * is invoked more than once during the `wait` timeout.
+        *
+        * If `wait` is `0` and `leading` is `false`, `func` invocation is deferred
+        * until to the next tick, similar to `setTimeout` with a timeout of `0`.
+        *
+        * See [David Corbacho's article](https://css-tricks.com/debouncing-throttling-explained-examples/)
+        * for details over the differences between `_.debounce` and `_.throttle`.
+        *
+        * @static
+        * @memberOf _
+        * @since 0.1.0
+        * @category Function
+        * @param {Function} func The function to debounce.
+        * @param {number} [wait=0] The number of milliseconds to delay.
+        * @param {Object} [options={}] The options object.
+        * @param {boolean} [options.leading=false]
+        *  Specify invoking on the leading edge of the timeout.
+        * @param {number} [options.maxWait]
+        *  The maximum time `func` is allowed to be delayed before it's invoked.
+        * @param {boolean} [options.trailing=true]
+        *  Specify invoking on the trailing edge of the timeout.
+        * @returns {Function} Returns the new debounced function.
+        * @example
+        *
+        * // Avoid costly calculations while the window size is in flux.
+        * jQuery(window).on('resize', _.debounce(calculateLayout, 150));
+        *
+        * // Invoke `sendMail` when clicked, debouncing subsequent calls.
+        * jQuery(element).on('click', _.debounce(sendMail, 300, {
+        *   'leading': true,
+        *   'trailing': false
+        * }));
+        *
+        * // Ensure `batchLog` is invoked once after 1 second of debounced calls.
+        * var debounced = _.debounce(batchLog, 250, { 'maxWait': 1000 });
+        * var source = new EventSource('/stream');
+        * jQuery(source).on('message', debounced);
+        *
+        * // Cancel the trailing debounced invocation.
+        * jQuery(window).on('popstate', debounced.cancel);
+        */
+
+       function debounce(func, wait, options) {
+         var lastArgs,
+             lastThis,
+             maxWait,
+             result,
+             timerId,
+             lastCallTime,
+             lastInvokeTime = 0,
+             leading = false,
+             maxing = false,
+             trailing = true;
+
+         if (typeof func != 'function') {
+           throw new TypeError(FUNC_ERROR_TEXT$1);
+         }
+
+         wait = toNumber(wait) || 0;
+
+         if (isObject$2(options)) {
+           leading = !!options.leading;
+           maxing = 'maxWait' in options;
+           maxWait = maxing ? nativeMax(toNumber(options.maxWait) || 0, wait) : maxWait;
+           trailing = 'trailing' in options ? !!options.trailing : trailing;
+         }
+
+         function invokeFunc(time) {
+           var args = lastArgs,
+               thisArg = lastThis;
+           lastArgs = lastThis = undefined;
+           lastInvokeTime = time;
+           result = func.apply(thisArg, args);
+           return result;
+         }
+
+         function leadingEdge(time) {
+           // Reset any `maxWait` timer.
+           lastInvokeTime = time; // Start the timer for the trailing edge.
+
+           timerId = setTimeout(timerExpired, wait); // Invoke the leading edge.
+
+           return leading ? invokeFunc(time) : result;
+         }
+
+         function remainingWait(time) {
+           var timeSinceLastCall = time - lastCallTime,
+               timeSinceLastInvoke = time - lastInvokeTime,
+               timeWaiting = wait - timeSinceLastCall;
+           return maxing ? nativeMin(timeWaiting, maxWait - timeSinceLastInvoke) : timeWaiting;
+         }
+
+         function shouldInvoke(time) {
+           var timeSinceLastCall = time - lastCallTime,
+               timeSinceLastInvoke = time - lastInvokeTime; // Either this is the first call, activity has stopped and we're at the
+           // trailing edge, the system time has gone backwards and we're treating
+           // it as the trailing edge, or we've hit the `maxWait` limit.
+
+           return lastCallTime === undefined || timeSinceLastCall >= wait || timeSinceLastCall < 0 || maxing && timeSinceLastInvoke >= maxWait;
+         }
+
+         function timerExpired() {
+           var time = now();
+
+           if (shouldInvoke(time)) {
+             return trailingEdge(time);
+           } // Restart the timer.
+
+
+           timerId = setTimeout(timerExpired, remainingWait(time));
+         }
+
+         function trailingEdge(time) {
+           timerId = undefined; // Only invoke if we have `lastArgs` which means `func` has been
+           // debounced at least once.
+
+           if (trailing && lastArgs) {
+             return invokeFunc(time);
+           }
+
+           lastArgs = lastThis = undefined;
+           return result;
+         }
+
+         function cancel() {
+           if (timerId !== undefined) {
+             clearTimeout(timerId);
+           }
+
+           lastInvokeTime = 0;
+           lastArgs = lastCallTime = lastThis = timerId = undefined;
+         }
+
+         function flush() {
+           return timerId === undefined ? result : trailingEdge(now());
+         }
+
+         function debounced() {
+           var time = now(),
+               isInvoking = shouldInvoke(time);
+           lastArgs = arguments;
+           lastThis = this;
+           lastCallTime = time;
+
+           if (isInvoking) {
+             if (timerId === undefined) {
+               return leadingEdge(lastCallTime);
+             }
+
+             if (maxing) {
+               // Handle invocations in a tight loop.
+               clearTimeout(timerId);
+               timerId = setTimeout(timerExpired, wait);
+               return invokeFunc(lastCallTime);
+             }
+           }
+
+           if (timerId === undefined) {
+             timerId = setTimeout(timerExpired, wait);
+           }
+
+           return result;
+         }
+
+         debounced.cancel = cancel;
+         debounced.flush = flush;
+         return debounced;
+       }
+
+       /** Used to map characters to HTML entities. */
+
+       var htmlEscapes = {
+         '&': '&amp;',
+         '<': '&lt;',
+         '>': '&gt;',
+         '"': '&quot;',
+         "'": '&#39;'
+       };
+       /**
+        * Used by `_.escape` to convert characters to HTML entities.
+        *
+        * @private
+        * @param {string} chr The matched character to escape.
+        * @returns {string} Returns the escaped character.
+        */
+
+       var escapeHtmlChar = basePropertyOf(htmlEscapes);
+
+       /** Used to match HTML entities and HTML characters. */
+
+       var reUnescapedHtml = /[&<>"']/g,
+           reHasUnescapedHtml = RegExp(reUnescapedHtml.source);
+       /**
+        * Converts the characters "&", "<", ">", '"', and "'" in `string` to their
+        * corresponding HTML entities.
+        *
+        * **Note:** No other characters are escaped. To escape additional
+        * characters use a third-party library like [_he_](https://mths.be/he).
+        *
+        * Though the ">" character is escaped for symmetry, characters like
+        * ">" and "/" don't need escaping in HTML and have no special meaning
+        * unless they're part of a tag or unquoted attribute value. See
+        * [Mathias Bynens's article](https://mathiasbynens.be/notes/ambiguous-ampersands)
+        * (under "semi-related fun fact") for more details.
+        *
+        * When working with HTML you should always
+        * [quote attribute values](http://wonko.com/post/html-escaping) to reduce
+        * XSS vectors.
+        *
+        * @static
+        * @since 0.1.0
+        * @memberOf _
+        * @category String
+        * @param {string} [string=''] The string to escape.
+        * @returns {string} Returns the escaped string.
+        * @example
+        *
+        * _.escape('fred, barney, & pebbles');
+        * // => 'fred, barney, &amp; pebbles'
+        */
+
+       function escape$4(string) {
+         string = toString$3(string);
+         return string && reHasUnescapedHtml.test(string) ? string.replace(reUnescapedHtml, escapeHtmlChar) : string;
+       }
+
+       /** Error message constants. */
+
+       var FUNC_ERROR_TEXT = 'Expected a function';
+       /**
+        * Creates a throttled function that only invokes `func` at most once per
+        * every `wait` milliseconds. The throttled function comes with a `cancel`
+        * method to cancel delayed `func` invocations and a `flush` method to
+        * immediately invoke them. Provide `options` to indicate whether `func`
+        * should be invoked on the leading and/or trailing edge of the `wait`
+        * timeout. The `func` is invoked with the last arguments provided to the
+        * throttled function. Subsequent calls to the throttled function return the
+        * result of the last `func` invocation.
+        *
+        * **Note:** If `leading` and `trailing` options are `true`, `func` is
+        * invoked on the trailing edge of the timeout only if the throttled function
+        * is invoked more than once during the `wait` timeout.
+        *
+        * If `wait` is `0` and `leading` is `false`, `func` invocation is deferred
+        * until to the next tick, similar to `setTimeout` with a timeout of `0`.
+        *
+        * See [David Corbacho's article](https://css-tricks.com/debouncing-throttling-explained-examples/)
+        * for details over the differences between `_.throttle` and `_.debounce`.
+        *
+        * @static
+        * @memberOf _
+        * @since 0.1.0
+        * @category Function
+        * @param {Function} func The function to throttle.
+        * @param {number} [wait=0] The number of milliseconds to throttle invocations to.
+        * @param {Object} [options={}] The options object.
+        * @param {boolean} [options.leading=true]
+        *  Specify invoking on the leading edge of the timeout.
+        * @param {boolean} [options.trailing=true]
+        *  Specify invoking on the trailing edge of the timeout.
+        * @returns {Function} Returns the new throttled function.
+        * @example
+        *
+        * // Avoid excessively updating the position while scrolling.
+        * jQuery(window).on('scroll', _.throttle(updatePosition, 100));
+        *
+        * // Invoke `renewToken` when the click event is fired, but not more than once every 5 minutes.
+        * var throttled = _.throttle(renewToken, 300000, { 'trailing': false });
+        * jQuery(element).on('click', throttled);
+        *
+        * // Cancel the trailing throttled invocation.
+        * jQuery(window).on('popstate', throttled.cancel);
+        */
+
+       function throttle(func, wait, options) {
+         var leading = true,
+             trailing = true;
+
+         if (typeof func != 'function') {
+           throw new TypeError(FUNC_ERROR_TEXT);
+         }
+
+         if (isObject$2(options)) {
+           leading = 'leading' in options ? !!options.leading : leading;
+           trailing = 'trailing' in options ? !!options.trailing : trailing;
+         }
+
+         return debounce(func, wait, {
+           'leading': leading,
+           'maxWait': wait,
+           'trailing': trailing
+         });
+       }
+
+       var $$f = _export;
+       var lastIndexOf = arrayLastIndexOf;
+
+       // `Array.prototype.lastIndexOf` method
+       // https://tc39.es/ecma262/#sec-array.prototype.lastindexof
+       // eslint-disable-next-line es/no-array-prototype-lastindexof -- required for testing
+       $$f({ target: 'Array', proto: true, forced: lastIndexOf !== [].lastIndexOf }, {
+         lastIndexOf: lastIndexOf
+       });
+
+       /** Used to map HTML entities to characters. */
+
+       var htmlUnescapes = {
+         '&amp;': '&',
+         '&lt;': '<',
+         '&gt;': '>',
+         '&quot;': '"',
+         '&#39;': "'"
+       };
+       /**
+        * Used by `_.unescape` to convert HTML entities to characters.
+        *
+        * @private
+        * @param {string} chr The matched character to unescape.
+        * @returns {string} Returns the unescaped character.
+        */
+
+       var unescapeHtmlChar = basePropertyOf(htmlUnescapes);
+
+       /** Used to match HTML entities and HTML characters. */
+
+       var reEscapedHtml = /&(?:amp|lt|gt|quot|#39);/g,
+           reHasEscapedHtml = RegExp(reEscapedHtml.source);
+       /**
+        * The inverse of `_.escape`; this method converts the HTML entities
+        * `&amp;`, `&lt;`, `&gt;`, `&quot;`, and `&#39;` in `string` to
+        * their corresponding characters.
+        *
+        * **Note:** No other HTML entities are unescaped. To unescape additional
+        * HTML entities use a third-party library like [_he_](https://mths.be/he).
+        *
+        * @static
+        * @memberOf _
+        * @since 0.6.0
+        * @category String
+        * @param {string} [string=''] The string to unescape.
+        * @returns {string} Returns the unescaped string.
+        * @example
+        *
+        * _.unescape('fred, barney, &amp; pebbles');
+        * // => 'fred, barney, & pebbles'
+        */
+
+       function unescape$3(string) {
+         string = toString$3(string);
+         return string && reHasEscapedHtml.test(string) ? string.replace(reEscapedHtml, unescapeHtmlChar) : string;
+       }
+
+       var global$4 = global$1o;
+       var isArray = isArray$8;
+       var lengthOfArrayLike$1 = lengthOfArrayLike$i;
+       var bind$3 = functionBindContext;
+
+       var TypeError$2 = global$4.TypeError;
+
+       // `FlattenIntoArray` abstract operation
+       // https://tc39.github.io/proposal-flatMap/#sec-FlattenIntoArray
+       var flattenIntoArray$1 = function (target, original, source, sourceLen, start, depth, mapper, thisArg) {
+         var targetIndex = start;
+         var sourceIndex = 0;
+         var mapFn = mapper ? bind$3(mapper, thisArg) : false;
+         var element, elementLen;
+
+         while (sourceIndex < sourceLen) {
+           if (sourceIndex in source) {
+             element = mapFn ? mapFn(source[sourceIndex], sourceIndex, original) : source[sourceIndex];
+
+             if (depth > 0 && isArray(element)) {
+               elementLen = lengthOfArrayLike$1(element);
+               targetIndex = flattenIntoArray$1(target, original, element, elementLen, targetIndex, depth - 1) - 1;
+             } else {
+               if (targetIndex >= 0x1FFFFFFFFFFFFF) throw TypeError$2('Exceed the acceptable array length');
+               target[targetIndex] = element;
+             }
+
+             targetIndex++;
+           }
+           sourceIndex++;
+         }
+         return targetIndex;
+       };
+
+       var flattenIntoArray_1 = flattenIntoArray$1;
+
+       var $$e = _export;
+       var flattenIntoArray = flattenIntoArray_1;
+       var aCallable = aCallable$a;
+       var toObject = toObject$i;
+       var lengthOfArrayLike = lengthOfArrayLike$i;
+       var arraySpeciesCreate = arraySpeciesCreate$4;
+
+       // `Array.prototype.flatMap` method
+       // https://tc39.es/ecma262/#sec-array.prototype.flatmap
+       $$e({ target: 'Array', proto: true }, {
+         flatMap: function flatMap(callbackfn /* , thisArg */) {
+           var O = toObject(this);
+           var sourceLen = lengthOfArrayLike(O);
+           var A;
+           aCallable(callbackfn);
+           A = arraySpeciesCreate(O, 0);
+           A.length = flattenIntoArray(A, O, O, sourceLen, 0, 1, callbackfn, arguments.length > 1 ? arguments[1] : undefined);
+           return A;
+         }
+       });
+
+       // this method was added to unscopables after implementation
+       // in popular engines, so it's moved to a separate module
+       var addToUnscopables = addToUnscopables$6;
+
+       // https://tc39.es/ecma262/#sec-array.prototype-@@unscopables
+       addToUnscopables('flatMap');
+
+       var $$d = _export;
+       var uncurryThis$6 = functionUncurryThis;
+       var getOwnPropertyDescriptor$1 = objectGetOwnPropertyDescriptor.f;
+       var toLength$2 = toLength$c;
+       var toString$2 = toString$k;
+       var notARegExp$1 = notARegexp;
+       var requireObjectCoercible$2 = requireObjectCoercible$e;
+       var correctIsRegExpLogic$1 = correctIsRegexpLogic;
+
+       // eslint-disable-next-line es/no-string-prototype-endswith -- safe
+       var un$EndsWith = uncurryThis$6(''.endsWith);
+       var slice$2 = uncurryThis$6(''.slice);
+       var min$1 = Math.min;
+
+       var CORRECT_IS_REGEXP_LOGIC$1 = correctIsRegExpLogic$1('endsWith');
+       // https://github.com/zloirock/core-js/pull/702
+       var MDN_POLYFILL_BUG$1 = !CORRECT_IS_REGEXP_LOGIC$1 && !!function () {
+         var descriptor = getOwnPropertyDescriptor$1(String.prototype, 'endsWith');
+         return descriptor && !descriptor.writable;
+       }();
+
+       // `String.prototype.endsWith` method
+       // https://tc39.es/ecma262/#sec-string.prototype.endswith
+       $$d({ target: 'String', proto: true, forced: !MDN_POLYFILL_BUG$1 && !CORRECT_IS_REGEXP_LOGIC$1 }, {
+         endsWith: function endsWith(searchString /* , endPosition = @length */) {
+           var that = toString$2(requireObjectCoercible$2(this));
+           notARegExp$1(searchString);
+           var endPosition = arguments.length > 1 ? arguments[1] : undefined;
+           var len = that.length;
+           var end = endPosition === undefined ? len : min$1(toLength$2(endPosition), len);
+           var search = toString$2(searchString);
+           return un$EndsWith
+             ? un$EndsWith(that, search, end)
+             : slice$2(that, end - search.length, end) === search;
+         }
+       });
+
+       // https://github.com/tc39/proposal-string-pad-start-end
+       var uncurryThis$5 = functionUncurryThis;
+       var toLength$1 = toLength$c;
+       var toString$1 = toString$k;
+       var $repeat = stringRepeat;
+       var requireObjectCoercible$1 = requireObjectCoercible$e;
+
+       var repeat$1 = uncurryThis$5($repeat);
+       var stringSlice$2 = uncurryThis$5(''.slice);
+       var ceil = Math.ceil;
+
+       // `String.prototype.{ padStart, padEnd }` methods implementation
+       var createMethod = function (IS_END) {
+         return function ($this, maxLength, fillString) {
+           var S = toString$1(requireObjectCoercible$1($this));
+           var intMaxLength = toLength$1(maxLength);
+           var stringLength = S.length;
+           var fillStr = fillString === undefined ? ' ' : toString$1(fillString);
+           var fillLen, stringFiller;
+           if (intMaxLength <= stringLength || fillStr == '') return S;
+           fillLen = intMaxLength - stringLength;
+           stringFiller = repeat$1(fillStr, ceil(fillLen / fillStr.length));
+           if (stringFiller.length > fillLen) stringFiller = stringSlice$2(stringFiller, 0, fillLen);
+           return IS_END ? S + stringFiller : stringFiller + S;
+         };
+       };
+
+       var stringPad = {
+         // `String.prototype.padStart` method
+         // https://tc39.es/ecma262/#sec-string.prototype.padstart
+         start: createMethod(false),
+         // `String.prototype.padEnd` method
+         // https://tc39.es/ecma262/#sec-string.prototype.padend
+         end: createMethod(true)
+       };
+
+       // https://github.com/zloirock/core-js/issues/280
+       var userAgent = engineUserAgent;
+
+       var stringPadWebkitBug = /Version\/10(?:\.\d+){1,2}(?: [\w./]+)?(?: Mobile\/\w+)? Safari\//.test(userAgent);
+
+       var $$c = _export;
+       var $padEnd = stringPad.end;
+       var WEBKIT_BUG$1 = stringPadWebkitBug;
+
+       // `String.prototype.padEnd` method
+       // https://tc39.es/ecma262/#sec-string.prototype.padend
+       $$c({ target: 'String', proto: true, forced: WEBKIT_BUG$1 }, {
+         padEnd: function padEnd(maxLength /* , fillString = ' ' */) {
+           return $padEnd(this, maxLength, arguments.length > 1 ? arguments[1] : undefined);
+         }
+       });
+
+       var $$b = _export;
+       var $padStart = stringPad.start;
+       var WEBKIT_BUG = stringPadWebkitBug;
+
+       // `String.prototype.padStart` method
+       // https://tc39.es/ecma262/#sec-string.prototype.padstart
+       $$b({ target: 'String', proto: true, forced: WEBKIT_BUG }, {
+         padStart: function padStart(maxLength /* , fillString = ' ' */) {
+           return $padStart(this, maxLength, arguments.length > 1 ? arguments[1] : undefined);
+         }
+       });
+
+       var $$a = _export;
+       var $reduceRight = arrayReduce.right;
+       var arrayMethodIsStrict = arrayMethodIsStrict$9;
+       var CHROME_VERSION = engineV8Version;
+       var IS_NODE = engineIsNode;
+
+       var STRICT_METHOD = arrayMethodIsStrict('reduceRight');
+       // Chrome 80-82 has a critical bug
+       // https://bugs.chromium.org/p/chromium/issues/detail?id=1049982
+       var CHROME_BUG = !IS_NODE && CHROME_VERSION > 79 && CHROME_VERSION < 83;
+
+       // `Array.prototype.reduceRight` method
+       // https://tc39.es/ecma262/#sec-array.prototype.reduceright
+       $$a({ target: 'Array', proto: true, forced: !STRICT_METHOD || CHROME_BUG }, {
+         reduceRight: function reduceRight(callbackfn /* , initialValue */) {
+           return $reduceRight(this, callbackfn, arguments.length, arguments.length > 1 ? arguments[1] : undefined);
+         }
+       });
+
+       var $$9 = _export;
+       var repeat = stringRepeat;
+
+       // `String.prototype.repeat` method
+       // https://tc39.es/ecma262/#sec-string.prototype.repeat
+       $$9({ target: 'String', proto: true }, {
+         repeat: repeat
+       });
+
+       var $$8 = _export;
+       var uncurryThis$4 = functionUncurryThis;
+       var getOwnPropertyDescriptor = objectGetOwnPropertyDescriptor.f;
+       var toLength = toLength$c;
+       var toString = toString$k;
+       var notARegExp = notARegexp;
+       var requireObjectCoercible = requireObjectCoercible$e;
+       var correctIsRegExpLogic = correctIsRegexpLogic;
+
+       // eslint-disable-next-line es/no-string-prototype-startswith -- safe
+       var un$StartsWith = uncurryThis$4(''.startsWith);
+       var stringSlice$1 = uncurryThis$4(''.slice);
+       var min = Math.min;
+
+       var CORRECT_IS_REGEXP_LOGIC = correctIsRegExpLogic('startsWith');
+       // https://github.com/zloirock/core-js/pull/702
+       var MDN_POLYFILL_BUG = !CORRECT_IS_REGEXP_LOGIC && !!function () {
+         var descriptor = getOwnPropertyDescriptor(String.prototype, 'startsWith');
+         return descriptor && !descriptor.writable;
+       }();
+
+       // `String.prototype.startsWith` method
+       // https://tc39.es/ecma262/#sec-string.prototype.startswith
+       $$8({ target: 'String', proto: true, forced: !MDN_POLYFILL_BUG && !CORRECT_IS_REGEXP_LOGIC }, {
+         startsWith: function startsWith(searchString /* , position = 0 */) {
+           var that = toString(requireObjectCoercible(this));
+           notARegExp(searchString);
+           var index = toLength(min(arguments.length > 1 ? arguments[1] : undefined, that.length));
+           var search = toString(searchString);
+           return un$StartsWith
+             ? un$StartsWith(that, search, index)
+             : stringSlice$1(that, index, index + search.length) === search;
+         }
+       });
+
+       var $$7 = _export;
+       var $trimEnd = stringTrim.end;
+       var forcedStringTrimMethod$1 = stringTrimForced;
+
+       var FORCED$4 = forcedStringTrimMethod$1('trimEnd');
+
+       var trimEnd = FORCED$4 ? function trimEnd() {
+         return $trimEnd(this);
+       // eslint-disable-next-line es/no-string-prototype-trimstart-trimend -- safe
+       } : ''.trimEnd;
+
+       // `String.prototype.{ trimEnd, trimRight }` methods
+       // https://tc39.es/ecma262/#sec-string.prototype.trimend
+       // https://tc39.es/ecma262/#String.prototype.trimright
+       $$7({ target: 'String', proto: true, name: 'trimEnd', forced: FORCED$4 }, {
+         trimEnd: trimEnd,
+         trimRight: trimEnd
+       });
+
+       var $$6 = _export;
+       var $trimStart = stringTrim.start;
+       var forcedStringTrimMethod = stringTrimForced;
+
+       var FORCED$3 = forcedStringTrimMethod('trimStart');
+
+       var trimStart = FORCED$3 ? function trimStart() {
+         return $trimStart(this);
+       // eslint-disable-next-line es/no-string-prototype-trimstart-trimend -- safe
+       } : ''.trimStart;
+
+       // `String.prototype.{ trimStart, trimLeft }` methods
+       // https://tc39.es/ecma262/#sec-string.prototype.trimstart
+       // https://tc39.es/ecma262/#String.prototype.trimleft
+       $$6({ target: 'String', proto: true, name: 'trimStart', forced: FORCED$3 }, {
+         trimStart: trimStart,
+         trimLeft: trimStart
+       });
+
+       var _mainLocalizer = coreLocalizer(); // singleton
+
+
+       var _t = _mainLocalizer.t;
+       // coreLocalizer manages language and locale parameters including translated strings
+       //
+
+       function coreLocalizer() {
+         var localizer = {};
+         var _dataLanguages = {}; // `_dataLocales` is an object containing all _supported_ locale codes -> language info.
+         // * `rtl` - right-to-left or left-to-right text direction
+         // * `pct` - the percent of strings translated; 1 = 100%, full coverage
+         //
+         // {
+         // en: { rtl: false, pct: {…} },
+         // de: { rtl: false, pct: {…} },
+         // …
+         // }
+
+         var _dataLocales = {}; // `localeStrings` is an object containing all _loaded_ locale codes -> string data.
+         // {
+         // en: { icons: {…}, toolbar: {…}, modes: {…}, operations: {…}, … },
+         // de: { icons: {…}, toolbar: {…}, modes: {…}, operations: {…}, … },
+         // …
+         // }
+
+         var _localeStrings = {}; // the current locale
+
+         var _localeCode = 'en-US'; // `_localeCodes` must contain `_localeCode` first, optionally followed by fallbacks
+
+         var _localeCodes = ['en-US', 'en'];
+         var _languageCode = 'en';
+         var _textDirection = 'ltr';
+         var _usesMetric = false;
+         var _languageNames = {};
+         var _scriptNames = {}; // getters for the current locale parameters
+
+         localizer.localeCode = function () {
+           return _localeCode;
+         };
+
+         localizer.localeCodes = function () {
+           return _localeCodes;
+         };
+
+         localizer.languageCode = function () {
+           return _languageCode;
+         };
+
+         localizer.textDirection = function () {
+           return _textDirection;
+         };
+
+         localizer.usesMetric = function () {
+           return _usesMetric;
+         };
+
+         localizer.languageNames = function () {
+           return _languageNames;
+         };
+
+         localizer.scriptNames = function () {
+           return _scriptNames;
+         }; // The client app may want to manually set the locale, regardless of the
+         // settings provided by the browser
+
+
+         var _preferredLocaleCodes = [];
+
+         localizer.preferredLocaleCodes = function (codes) {
+           if (!arguments.length) return _preferredLocaleCodes;
+
+           if (typeof codes === 'string') {
+             // be generous and accept delimited strings as input
+             _preferredLocaleCodes = codes.split(/,|;| /gi).filter(Boolean);
+           } else {
+             _preferredLocaleCodes = codes;
+           }
+
+           return localizer;
+         };
+
+         var _loadPromise;
+
+         localizer.ensureLoaded = function () {
+           if (_loadPromise) return _loadPromise;
+           var filesToFetch = ['languages', // load the list of languages
+           'locales' // load the list of supported locales
+           ];
+           var localeDirs = {
+             general: 'locales',
+             tagging: 'https://cdn.jsdelivr.net/npm/@openstreetmap/id-tagging-schema@3/dist/translations'
+           };
+           var fileMap = _mainFileFetcher.fileMap();
+
+           for (var scopeId in localeDirs) {
+             var key = "locales_index_".concat(scopeId);
+
+             if (!fileMap[key]) {
+               fileMap[key] = localeDirs[scopeId] + '/index.min.json';
+             }
+
+             filesToFetch.push(key);
+           }
+
+           return _loadPromise = Promise.all(filesToFetch.map(function (key) {
+             return _mainFileFetcher.get(key);
+           })).then(function (results) {
+             _dataLanguages = results[0];
+             _dataLocales = results[1];
+             var indexes = results.slice(2);
+
+             var requestedLocales = (_preferredLocaleCodes || []).concat(utilDetect().browserLocales) // List of locales preferred by the browser in priority order.
+             .concat(['en']); // fallback to English since it's the only guaranteed complete language
+
+
+             _localeCodes = localesToUseFrom(requestedLocales);
+             _localeCode = _localeCodes[0]; // Run iD in the highest-priority locale; the rest are fallbacks
+
+             var loadStringsPromises = [];
+             indexes.forEach(function (index, i) {
+               // Will always return the index for `en` if nothing else
+               var fullCoverageIndex = _localeCodes.findIndex(function (locale) {
+                 return index[locale] && index[locale].pct === 1;
+               }); // We only need to load locales up until we find one with full coverage
+
+
+               _localeCodes.slice(0, fullCoverageIndex + 1).forEach(function (code) {
+                 var scopeId = Object.keys(localeDirs)[i];
+                 var directory = Object.values(localeDirs)[i];
+                 if (index[code]) loadStringsPromises.push(localizer.loadLocale(code, scopeId, directory));
+               });
+             });
+             return Promise.all(loadStringsPromises);
+           }).then(function () {
+             updateForCurrentLocale();
+           })["catch"](function (err) {
+             return console.error(err);
+           }); // eslint-disable-line
+         }; // Returns the locales from `requestedLocales` supported by iD that we should use
+
+
+         function localesToUseFrom(requestedLocales) {
+           var supportedLocales = _dataLocales;
+           var toUse = [];
+
+           for (var i in requestedLocales) {
+             var locale = requestedLocales[i];
+             if (supportedLocales[locale]) toUse.push(locale);
+
+             if (locale.includes('-')) {
+               // Full locale ('es-ES'), add fallback to the base ('es')
+               var langPart = locale.split('-')[0];
+               if (supportedLocales[langPart]) toUse.push(langPart);
+             }
+           } // remove duplicates
+
+
+           return utilArrayUniq(toUse);
+         }
+
+         function updateForCurrentLocale() {
+           if (!_localeCode) return;
+           _languageCode = _localeCode.split('-')[0];
+           var currentData = _dataLocales[_localeCode] || _dataLocales[_languageCode];
+           var hash = utilStringQs(window.location.hash);
+
+           if (hash.rtl === 'true') {
+             _textDirection = 'rtl';
+           } else if (hash.rtl === 'false') {
+             _textDirection = 'ltr';
+           } else {
+             _textDirection = currentData && currentData.rtl ? 'rtl' : 'ltr';
+           }
+
+           var locale = _localeCode;
+           if (locale.toLowerCase() === 'en-us') locale = 'en';
+           _languageNames = _localeStrings.general[locale].languageNames;
+           _scriptNames = _localeStrings.general[locale].scriptNames;
+           _usesMetric = _localeCode.slice(-3).toLowerCase() !== '-us';
+         }
+         /* Locales */
+         // Returns a Promise to load the strings for the requested locale
+
+
+         localizer.loadLocale = function (locale, scopeId, directory) {
+           // US English is the default
+           if (locale.toLowerCase() === 'en-us') locale = 'en';
+
+           if (_localeStrings[scopeId] && _localeStrings[scopeId][locale]) {
+             // already loaded
+             return Promise.resolve(locale);
+           }
+
+           var fileMap = _mainFileFetcher.fileMap();
+           var key = "locale_".concat(scopeId, "_").concat(locale);
+
+           if (!fileMap[key]) {
+             fileMap[key] = "".concat(directory, "/").concat(locale, ".min.json");
+           }
+
+           return _mainFileFetcher.get(key).then(function (d) {
+             if (!_localeStrings[scopeId]) _localeStrings[scopeId] = {};
+             _localeStrings[scopeId][locale] = d[locale];
+             return locale;
+           });
+         };
+
+         localizer.pluralRule = function (number) {
+           return pluralRule(number, _localeCode);
+         }; // Returns the plural rule for the given `number` with the given `localeCode`.
+         // One of: `zero`, `one`, `two`, `few`, `many`, `other`
+
+
+         function pluralRule(number, localeCode) {
+           // modern browsers have this functionality built-in
+           var rules = 'Intl' in window && Intl.PluralRules && new Intl.PluralRules(localeCode);
+
+           if (rules) {
+             return rules.select(number);
+           } // fallback to basic one/other, as in English
+
+
+           if (number === 1) return 'one';
+           return 'other';
+         }
+         /**
+         * Try to find that string in `locale` or the current `_localeCode` matching
+         * the given `stringId`. If no string can be found in the requested locale,
+         * we'll recurse down all the `_localeCodes` until one is found.
+         *
+         * @param  {string}   stringId      string identifier
+         * @param  {object?}  replacements  token replacements and default string
+         * @param  {string?}  locale        locale to use (defaults to currentLocale)
+         * @return {string?}  localized string
+         */
+
+
+         localizer.tInfo = function (origStringId, replacements, locale) {
+           var stringId = origStringId.trim();
+           var scopeId = 'general';
+
+           if (stringId[0] === '_') {
+             var split = stringId.split('.');
+             scopeId = split[0].slice(1);
+             stringId = split.slice(1).join('.');
+           }
+
+           locale = locale || _localeCode;
+           var path = stringId.split('.').map(function (s) {
+             return s.replace(/<TX_DOT>/g, '.');
+           }).reverse();
+           var stringsKey = locale; // US English is the default
+
+           if (stringsKey.toLowerCase() === 'en-us') stringsKey = 'en';
+           var result = _localeStrings && _localeStrings[scopeId] && _localeStrings[scopeId][stringsKey];
+
+           while (result !== undefined && path.length) {
+             result = result[path.pop()];
+           }
+
+           if (result !== undefined) {
+             if (replacements) {
+               if (_typeof(result) === 'object' && Object.keys(result).length) {
+                 // If plural forms are provided, dig one level deeper based on the
+                 // first numeric token replacement provided.
+                 var number = Object.values(replacements).find(function (value) {
+                   return typeof value === 'number';
+                 });
+
+                 if (number !== undefined) {
+                   var rule = pluralRule(number, locale);
+
+                   if (result[rule]) {
+                     result = result[rule];
+                   } else {
+                     // We're pretty sure this should be a plural but no string
+                     // could be found for the given rule. Just pick the first
+                     // string and hope it makes sense.
+                     result = Object.values(result)[0];
+                   }
+                 }
+               }
+
+               if (typeof result === 'string') {
+                 for (var key in replacements) {
+                   var value = replacements[key];
+
+                   if (typeof value === 'number') {
+                     if (value.toLocaleString) {
+                       // format numbers for the locale
+                       value = value.toLocaleString(locale, {
+                         style: 'decimal',
+                         useGrouping: true,
+                         minimumFractionDigits: 0
+                       });
+                     } else {
+                       value = value.toString();
+                     }
+                   }
+
+                   var token = "{".concat(key, "}");
+                   var regex = new RegExp(token, 'g');
+                   result = result.replace(regex, value);
+                 }
+               }
+             }
+
+             if (typeof result === 'string') {
+               // found a localized string!
+               return {
+                 text: result,
+                 locale: locale
+               };
+             }
+           } // no localized string found...
+           // attempt to fallback to a lower-priority language
+
+
+           var index = _localeCodes.indexOf(locale);
+
+           if (index >= 0 && index < _localeCodes.length - 1) {
+             // eventually this will be 'en' or another locale with 100% coverage
+             var fallback = _localeCodes[index + 1];
+             return localizer.tInfo(origStringId, replacements, fallback);
+           }
+
+           if (replacements && 'default' in replacements) {
+             // Fallback to a default value if one is specified in `replacements`
+             return {
+               text: replacements["default"],
+               locale: null
+             };
+           }
+
+           var missing = "Missing ".concat(locale, " translation: ").concat(origStringId);
+           if (typeof console !== 'undefined') console.error(missing); // eslint-disable-line
+
+           return {
+             text: missing,
+             locale: 'en'
+           };
+         };
+
+         localizer.hasTextForStringId = function (stringId) {
+           return !!localizer.tInfo(stringId, {
+             "default": 'nothing found'
+           }).locale;
+         }; // Returns only the localized text, discarding the locale info
+
+
+         localizer.t = function (stringId, replacements, locale) {
+           return localizer.tInfo(stringId, replacements, locale).text;
+         }; // Returns the localized text wrapped in an HTML element encoding the locale info
+
+         /**
+          * @deprecated This method is considered deprecated. Instead, use the direct DOM manipulating
+          *             method `t.append`.
+          */
+
+
+         localizer.t.html = function (stringId, replacements, locale) {
+           // replacement string might be html unsafe, so we need to escape it except if it is explicitly marked as html code
+           replacements = Object.assign({}, replacements);
+
+           for (var k in replacements) {
+             if (typeof replacements[k] === 'string') {
+               replacements[k] = escape$4(replacements[k]);
+             }
+
+             if (_typeof(replacements[k]) === 'object' && typeof replacements[k].html === 'string') {
+               replacements[k] = replacements[k].html;
+             }
+           }
+
+           var info = localizer.tInfo(stringId, replacements, locale); // text may be empty or undefined if `replacements.default` is
+
+           if (info.text) {
+             return "<span class=\"localized-text\" lang=\"".concat(info.locale || 'und', "\">").concat(info.text, "</span>");
+           } else {
+             return '';
+           }
+         }; // Adds localized text wrapped as an HTML span element with locale info to the DOM
+
+
+         localizer.t.append = function (stringId, replacements, locale) {
+           return function (selection) {
+             var info = localizer.tInfo(stringId, replacements, locale);
+             return selection.append('span').attr('class', 'localized-text').attr('lang', info.locale || 'und').text((replacements && replacements.prefix || '') + info.text + (replacements && replacements.suffix || ''));
+           };
+         };
+
+         localizer.languageName = function (code, options) {
+           if (_languageNames[code]) {
+             // name in locale language
+             // e.g. "German"
+             return _languageNames[code];
+           } // sometimes we only want the local name
+
+
+           if (options && options.localOnly) return null;
+           var langInfo = _dataLanguages[code];
+
+           if (langInfo) {
+             if (langInfo.nativeName) {
+               // name in native language
+               // e.g. "Deutsch (de)"
+               return localizer.t('translate.language_and_code', {
+                 language: langInfo.nativeName,
+                 code: code
+               });
+             } else if (langInfo.base && langInfo.script) {
+               var base = langInfo.base; // the code of the language this is based on
+
+               if (_languageNames[base]) {
+                 // base language name in locale language
+                 var scriptCode = langInfo.script;
+                 var script = _scriptNames[scriptCode] || scriptCode; // e.g. "Serbian (Cyrillic)"
+
+                 return localizer.t('translate.language_and_code', {
+                   language: _languageNames[base],
+                   code: script
+                 });
+               } else if (_dataLanguages[base] && _dataLanguages[base].nativeName) {
+                 // e.g. "српски (sr-Cyrl)"
+                 return localizer.t('translate.language_and_code', {
+                   language: _dataLanguages[base].nativeName,
+                   code: code
+                 });
+               }
+             }
+           }
+
+           return code; // if not found, use the code
+         };
+
+         return localizer;
+       }
+
+       // `presetCollection` is a wrapper around an `Array` of presets `collection`,
+       // and decorated with some extra methods for searching and matching geometry
+       //
+
+       function presetCollection(collection) {
+         var MAXRESULTS = 50;
+         var _this = {};
+         var _memo = {};
+         _this.collection = collection;
+
+         _this.item = function (id) {
+           if (_memo[id]) return _memo[id];
+
+           var found = _this.collection.find(function (d) {
+             return d.id === id;
+           });
+
+           if (found) _memo[id] = found;
+           return found;
+         };
+
+         _this.index = function (id) {
+           return _this.collection.findIndex(function (d) {
+             return d.id === id;
+           });
+         };
+
+         _this.matchGeometry = function (geometry) {
+           return presetCollection(_this.collection.filter(function (d) {
+             return d.matchGeometry(geometry);
+           }));
+         };
+
+         _this.matchAllGeometry = function (geometries) {
+           return presetCollection(_this.collection.filter(function (d) {
+             return d && d.matchAllGeometry(geometries);
+           }));
+         };
+
+         _this.matchAnyGeometry = function (geometries) {
+           return presetCollection(_this.collection.filter(function (d) {
+             return geometries.some(function (geom) {
+               return d.matchGeometry(geom);
+             });
+           }));
+         };
+
+         _this.fallback = function (geometry) {
+           var id = geometry;
+           if (id === 'vertex') id = 'point';
+           return _this.item(id);
+         };
+
+         _this.search = function (value, geometry, loc) {
+           if (!value) return _this; // don't remove diacritical characters since we're assuming the user is being intentional
+
+           value = value.toLowerCase().trim(); // match at name beginning or just after a space (e.g. "office" -> match "Law Office")
+
+           function leading(a) {
+             var index = a.indexOf(value);
+             return index === 0 || a[index - 1] === ' ';
+           } // match at name beginning only
+
+
+           function leadingStrict(a) {
+             var index = a.indexOf(value);
+             return index === 0;
+           }
+
+           function sortPresets(nameProp) {
+             return function sortNames(a, b) {
+               var aCompare = a[nameProp]();
+               var bCompare = b[nameProp](); // priority if search string matches preset name exactly - #4325
+
+               if (value === aCompare) return -1;
+               if (value === bCompare) return 1; // priority for higher matchScore
+
+               var i = b.originalScore - a.originalScore;
+               if (i !== 0) return i; // priority if search string appears earlier in preset name
+
+               i = aCompare.indexOf(value) - bCompare.indexOf(value);
+               if (i !== 0) return i; // priority for shorter preset names
+
+               return aCompare.length - bCompare.length;
+             };
+           }
+
+           var pool = _this.collection;
+
+           if (Array.isArray(loc)) {
+             var validLocations = _mainLocations.locationsAt(loc);
+             pool = pool.filter(function (a) {
+               return !a.locationSetID || validLocations[a.locationSetID];
+             });
+           }
+
+           var searchable = pool.filter(function (a) {
+             return a.searchable !== false && a.suggestion !== true;
+           });
+           var suggestions = pool.filter(function (a) {
+             return a.suggestion === true;
+           }); // matches value to preset.name
+
+           var leadingNames = searchable.filter(function (a) {
+             return leading(a.searchName());
+           }).sort(sortPresets('searchName')); // matches value to preset suggestion name
+
+           var leadingSuggestions = suggestions.filter(function (a) {
+             return leadingStrict(a.searchName());
+           }).sort(sortPresets('searchName'));
+           var leadingNamesStripped = searchable.filter(function (a) {
+             return leading(a.searchNameStripped());
+           }).sort(sortPresets('searchNameStripped'));
+           var leadingSuggestionsStripped = suggestions.filter(function (a) {
+             return leadingStrict(a.searchNameStripped());
+           }).sort(sortPresets('searchNameStripped')); // matches value to preset.terms values
+
+           var leadingTerms = searchable.filter(function (a) {
+             return (a.terms() || []).some(leading);
+           });
+           var leadingSuggestionTerms = suggestions.filter(function (a) {
+             return (a.terms() || []).some(leading);
+           }); // matches value to preset.tags values
+
+           var leadingTagValues = searchable.filter(function (a) {
+             return Object.values(a.tags || {}).filter(function (val) {
+               return val !== '*';
+             }).some(leading);
+           }); // finds close matches to value in preset.name
+
+           var similarName = searchable.map(function (a) {
+             return {
+               preset: a,
+               dist: utilEditDistance(value, a.searchName())
+             };
+           }).filter(function (a) {
+             return a.dist + Math.min(value.length - a.preset.searchName().length, 0) < 3;
+           }).sort(function (a, b) {
+             return a.dist - b.dist;
+           }).map(function (a) {
+             return a.preset;
+           }); // finds close matches to value to preset suggestion name
+
+           var similarSuggestions = suggestions.map(function (a) {
+             return {
+               preset: a,
+               dist: utilEditDistance(value, a.searchName())
+             };
+           }).filter(function (a) {
+             return a.dist + Math.min(value.length - a.preset.searchName().length, 0) < 1;
+           }).sort(function (a, b) {
+             return a.dist - b.dist;
+           }).map(function (a) {
+             return a.preset;
+           }); // finds close matches to value in preset.terms
+
+           var similarTerms = searchable.filter(function (a) {
+             return (a.terms() || []).some(function (b) {
+               return utilEditDistance(value, b) + Math.min(value.length - b.length, 0) < 3;
+             });
+           });
+           var results = leadingNames.concat(leadingSuggestions, leadingNamesStripped, leadingSuggestionsStripped, leadingTerms, leadingSuggestionTerms, leadingTagValues, similarName, similarSuggestions, similarTerms).slice(0, MAXRESULTS - 1);
+
+           if (geometry) {
+             if (typeof geometry === 'string') {
+               results.push(_this.fallback(geometry));
+             } else {
+               geometry.forEach(function (geom) {
+                 return results.push(_this.fallback(geom));
+               });
+             }
+           }
+
+           return presetCollection(utilArrayUniq(results));
+         };
+
+         return _this;
+       }
+
+       // `presetCategory` builds a `presetCollection` of member presets,
+       // decorated with some extra methods for searching and matching geometry
+       //
+
+       function presetCategory(categoryID, category, allPresets) {
+         var _this = Object.assign({}, category); // shallow copy
+
+
+         var _searchName; // cache
+
+
+         var _searchNameStripped; // cache
+
+
+         _this.id = categoryID;
+         _this.members = presetCollection((category.members || []).map(function (presetID) {
+           return allPresets[presetID];
+         }).filter(Boolean));
+         _this.geometry = _this.members.collection.reduce(function (acc, preset) {
+           for (var i in preset.geometry) {
+             var geometry = preset.geometry[i];
+
+             if (acc.indexOf(geometry) === -1) {
+               acc.push(geometry);
+             }
+           }
+
+           return acc;
+         }, []);
+
+         _this.matchGeometry = function (geom) {
+           return _this.geometry.indexOf(geom) >= 0;
+         };
+
+         _this.matchAllGeometry = function (geometries) {
+           return _this.members.collection.some(function (preset) {
+             return preset.matchAllGeometry(geometries);
+           });
+         };
+
+         _this.matchScore = function () {
+           return -1;
+         };
+
+         _this.name = function () {
+           return _t("_tagging.presets.categories.".concat(categoryID, ".name"), {
+             'default': categoryID
+           });
+         };
+
+         _this.nameLabel = function () {
+           return _t.html("_tagging.presets.categories.".concat(categoryID, ".name"), {
+             'default': categoryID
+           });
+         };
+
+         _this.terms = function () {
+           return [];
+         };
+
+         _this.searchName = function () {
+           if (!_searchName) {
+             _searchName = (_this.suggestion ? _this.originalName : _this.name()).toLowerCase();
+           }
+
+           return _searchName;
+         };
+
+         _this.searchNameStripped = function () {
+           if (!_searchNameStripped) {
+             _searchNameStripped = _this.searchName(); // split combined diacritical characters into their parts
+
+             if (_searchNameStripped.normalize) _searchNameStripped = _searchNameStripped.normalize('NFD'); // remove diacritics
+
+             _searchNameStripped = _searchNameStripped.replace(/[\u0300-\u036f]/g, '');
+           }
+
+           return _searchNameStripped;
+         };
+
+         return _this;
+       }
+
+       // `presetField` decorates a given `field` Object
+       // with some extra methods for searching and matching geometry
+       //
+
+       function presetField(fieldID, field) {
+         var _this = Object.assign({}, field); // shallow copy
+
+
+         _this.id = fieldID; // for use in classes, element ids, css selectors
+
+         _this.safeid = utilSafeClassName(fieldID);
+
+         _this.matchGeometry = function (geom) {
+           return !_this.geometry || _this.geometry.indexOf(geom) !== -1;
+         };
+
+         _this.matchAllGeometry = function (geometries) {
+           return !_this.geometry || geometries.every(function (geom) {
+             return _this.geometry.indexOf(geom) !== -1;
+           });
+         };
+
+         _this.t = function (scope, options) {
+           return _t("_tagging.presets.fields.".concat(fieldID, ".").concat(scope), options);
+         };
+
+         _this.t.html = function (scope, options) {
+           return _t.html("_tagging.presets.fields.".concat(fieldID, ".").concat(scope), options);
+         };
+
+         _this.hasTextForStringId = function (scope) {
+           return _mainLocalizer.hasTextForStringId("_tagging.presets.fields.".concat(fieldID, ".").concat(scope));
+         };
+
+         _this.title = function () {
+           return _this.overrideLabel || _this.t('label', {
+             'default': fieldID
+           });
+         };
+
+         _this.label = function () {
+           return _this.overrideLabel || _this.t.html('label', {
+             'default': fieldID
+           });
+         };
+
+         var _placeholder = _this.placeholder;
+
+         _this.placeholder = function () {
+           return _this.t('placeholder', {
+             'default': _placeholder
+           });
+         };
+
+         _this.originalTerms = (_this.terms || []).join();
+
+         _this.terms = function () {
+           return _this.t('terms', {
+             'default': _this.originalTerms
+           }).toLowerCase().trim().split(/\s*,+\s*/);
+         };
+
+         _this.increment = _this.type === 'number' ? _this.increment || 1 : undefined;
+         return _this;
+       }
+
+       // `presetPreset` decorates a given `preset` Object
+       // with some extra methods for searching and matching geometry
+       //
+
+       function presetPreset(presetID, preset, addable, allFields, allPresets) {
+         allFields = allFields || {};
+         allPresets = allPresets || {};
+
+         var _this = Object.assign({}, preset); // shallow copy
+
+
+         var _addable = addable || false;
+
+         var _resolvedFields; // cache
+
+
+         var _resolvedMoreFields; // cache
+
+
+         var _searchName; // cache
+
+
+         var _searchNameStripped; // cache
+
+
+         _this.id = presetID;
+         _this.safeid = utilSafeClassName(presetID); // for use in css classes, selectors, element ids
+
+         _this.originalTerms = (_this.terms || []).join();
+         _this.originalName = _this.name || '';
+         _this.originalScore = _this.matchScore || 1;
+         _this.originalReference = _this.reference || {};
+         _this.originalFields = _this.fields || [];
+         _this.originalMoreFields = _this.moreFields || [];
+
+         _this.fields = function () {
+           return _resolvedFields || (_resolvedFields = resolve('fields'));
+         };
+
+         _this.moreFields = function () {
+           return _resolvedMoreFields || (_resolvedMoreFields = resolve('moreFields'));
+         };
+
+         _this.resetFields = function () {
+           return _resolvedFields = _resolvedMoreFields = null;
+         };
+
+         _this.tags = _this.tags || {};
+         _this.addTags = _this.addTags || _this.tags;
+         _this.removeTags = _this.removeTags || _this.addTags;
+         _this.geometry = _this.geometry || [];
+
+         _this.matchGeometry = function (geom) {
+           return _this.geometry.indexOf(geom) >= 0;
+         };
+
+         _this.matchAllGeometry = function (geoms) {
+           return geoms.every(_this.matchGeometry);
+         };
+
+         _this.matchScore = function (entityTags) {
+           var tags = _this.tags;
+           var seen = {};
+           var score = 0; // match on tags
+
+           for (var k in tags) {
+             seen[k] = true;
+
+             if (entityTags[k] === tags[k]) {
+               score += _this.originalScore;
+             } else if (tags[k] === '*' && k in entityTags) {
+               score += _this.originalScore / 2;
+             } else {
+               return -1;
+             }
+           } // boost score for additional matches in addTags - #6802
+
+
+           var addTags = _this.addTags;
+
+           for (var _k in addTags) {
+             if (!seen[_k] && entityTags[_k] === addTags[_k]) {
+               score += _this.originalScore;
+             }
+           }
+
+           return score;
+         };
+
+         _this.t = function (scope, options) {
+           var textID = "_tagging.presets.presets.".concat(presetID, ".").concat(scope);
+           return _t(textID, options);
+         };
+
+         _this.t.html = function (scope, options) {
+           var textID = "_tagging.presets.presets.".concat(presetID, ".").concat(scope);
+           return _t.html(textID, options);
+         };
+
+         _this.name = function () {
+           return _this.t('name', {
+             'default': _this.originalName
+           });
+         };
+
+         _this.nameLabel = function () {
+           return _this.t.html('name', {
+             'default': _this.originalName
+           });
+         };
+
+         _this.subtitle = function () {
+           if (_this.suggestion) {
+             var path = presetID.split('/');
+             path.pop(); // remove brand name
+
+             return _t('_tagging.presets.presets.' + path.join('/') + '.name');
+           }
+
+           return null;
+         };
+
+         _this.subtitleLabel = function () {
+           if (_this.suggestion) {
+             var path = presetID.split('/');
+             path.pop(); // remove brand name
+
+             return _t.html('_tagging.presets.presets.' + path.join('/') + '.name');
+           }
+
+           return null;
+         };
+
+         _this.terms = function () {
+           return _this.t('terms', {
+             'default': _this.originalTerms
+           }).toLowerCase().trim().split(/\s*,+\s*/);
+         };
+
+         _this.searchName = function () {
+           if (!_searchName) {
+             _searchName = (_this.suggestion ? _this.originalName : _this.name()).toLowerCase();
+           }
+
+           return _searchName;
+         };
+
+         _this.searchNameStripped = function () {
+           if (!_searchNameStripped) {
+             _searchNameStripped = _this.searchName(); // split combined diacritical characters into their parts
+
+             if (_searchNameStripped.normalize) _searchNameStripped = _searchNameStripped.normalize('NFD'); // remove diacritics
+
+             _searchNameStripped = _searchNameStripped.replace(/[\u0300-\u036f]/g, '');
+           }
+
+           return _searchNameStripped;
+         };
+
+         _this.isFallback = function () {
+           var tagCount = Object.keys(_this.tags).length;
+           return tagCount === 0 || tagCount === 1 && _this.tags.hasOwnProperty('area');
+         };
+
+         _this.addable = function (val) {
+           if (!arguments.length) return _addable;
+           _addable = val;
+           return _this;
+         };
+
+         _this.reference = function () {
+           // Lookup documentation on Wikidata...
+           var qid = _this.tags.wikidata || _this.tags['flag:wikidata'] || _this.tags['brand:wikidata'] || _this.tags['network:wikidata'] || _this.tags['operator:wikidata'];
+
+           if (qid) {
+             return {
+               qid: qid
+             };
+           } // Lookup documentation on OSM Wikibase...
+
+
+           var key = _this.originalReference.key || Object.keys(utilObjectOmit(_this.tags, 'name'))[0];
+           var value = _this.originalReference.value || _this.tags[key];
+
+           if (value === '*') {
+             return {
+               key: key
+             };
+           } else {
+             return {
+               key: key,
+               value: value
+             };
+           }
+         };
+
+         _this.unsetTags = function (tags, geometry, ignoringKeys, skipFieldDefaults) {
+           // allow manually keeping some tags
+           var removeTags = ignoringKeys ? utilObjectOmit(_this.removeTags, ignoringKeys) : _this.removeTags;
+           tags = utilObjectOmit(tags, Object.keys(removeTags));
+
+           if (geometry && !skipFieldDefaults) {
+             _this.fields().forEach(function (field) {
+               if (field.matchGeometry(geometry) && field.key && field["default"] === tags[field.key]) {
+                 delete tags[field.key];
+               }
+             });
+           }
+
+           delete tags.area;
+           return tags;
+         };
+
+         _this.setTags = function (tags, geometry, skipFieldDefaults) {
+           var addTags = _this.addTags;
+           tags = Object.assign({}, tags); // shallow copy
+
+           for (var k in addTags) {
+             if (addTags[k] === '*') {
+               // if this tag is ancillary, don't override an existing value since any value is okay
+               if (_this.tags[k] || !tags[k] || tags[k] === 'no') {
+                 tags[k] = 'yes';
+               }
+             } else {
+               tags[k] = addTags[k];
+             }
+           } // Add area=yes if necessary.
+           // This is necessary if the geometry is already an area (e.g. user drew an area) AND any of:
+           // 1. chosen preset could be either an area or a line (`barrier=city_wall`)
+           // 2. chosen preset doesn't have a key in osmAreaKeys (`railway=station`)
+
+
+           if (!addTags.hasOwnProperty('area')) {
+             delete tags.area;
+
+             if (geometry === 'area') {
+               var needsAreaTag = true;
+
+               if (_this.geometry.indexOf('line') === -1) {
+                 for (var _k2 in addTags) {
+                   if (_k2 in osmAreaKeys) {
+                     needsAreaTag = false;
+                     break;
+                   }
+                 }
+               }
+
+               if (needsAreaTag) {
+                 tags.area = 'yes';
+               }
+             }
+           }
+
+           if (geometry && !skipFieldDefaults) {
+             _this.fields().forEach(function (field) {
+               if (field.matchGeometry(geometry) && field.key && !tags[field.key] && field["default"]) {
+                 tags[field.key] = field["default"];
+               }
+             });
+           }
+
+           return tags;
+         }; // For a preset without fields, use the fields of the parent preset.
+         // Replace {preset} placeholders with the fields of the specified presets.
+
+
+         function resolve(which) {
+           var fieldIDs = which === 'fields' ? _this.originalFields : _this.originalMoreFields;
+           var resolved = [];
+           fieldIDs.forEach(function (fieldID) {
+             var match = fieldID.match(/\{(.*)\}/);
+
+             if (match !== null) {
+               // a presetID wrapped in braces {}
+               resolved = resolved.concat(inheritFields(match[1], which));
+             } else if (allFields[fieldID]) {
+               // a normal fieldID
+               resolved.push(allFields[fieldID]);
+             } else {
+               console.log("Cannot resolve \"".concat(fieldID, "\" found in ").concat(_this.id, ".").concat(which)); // eslint-disable-line no-console
+             }
+           }); // no fields resolved, so use the parent's if possible
+
+           if (!resolved.length) {
+             var endIndex = _this.id.lastIndexOf('/');
+
+             var parentID = endIndex && _this.id.substring(0, endIndex);
+
+             if (parentID) {
+               resolved = inheritFields(parentID, which);
+             }
+           }
+
+           return utilArrayUniq(resolved); // returns an array of fields to inherit from the given presetID, if found
+
+           function inheritFields(presetID, which) {
+             var parent = allPresets[presetID];
+             if (!parent) return [];
+
+             if (which === 'fields') {
+               return parent.fields().filter(shouldInherit);
+             } else if (which === 'moreFields') {
+               return parent.moreFields();
+             } else {
+               return [];
+             }
+           } // Skip `fields` for the keys which define the preset.
+           // These are usually `typeCombo` fields like `shop=*`
+
+
+           function shouldInherit(f) {
+             if (f.key && _this.tags[f.key] !== undefined && // inherit anyway if multiple values are allowed or just a checkbox
+             f.type !== 'multiCombo' && f.type !== 'semiCombo' && f.type !== 'manyCombo' && f.type !== 'check') return false;
+             return true;
+           }
+         }
+
+         return _this;
+       }
+
+       var _mainPresetIndex = presetIndex(); // singleton
+       // `presetIndex` wraps a `presetCollection`
+       // with methods for loading new data and returning defaults
+       //
+
+       function presetIndex() {
+         var dispatch = dispatch$8('favoritePreset', 'recentsChange');
+         var MAXRECENTS = 30; // seed the preset lists with geometry fallbacks
+
+         var POINT = presetPreset('point', {
+           name: 'Point',
+           tags: {},
+           geometry: ['point', 'vertex'],
+           matchScore: 0.1
+         });
+         var LINE = presetPreset('line', {
+           name: 'Line',
+           tags: {},
+           geometry: ['line'],
+           matchScore: 0.1
+         });
+         var AREA = presetPreset('area', {
+           name: 'Area',
+           tags: {
+             area: 'yes'
+           },
+           geometry: ['area'],
+           matchScore: 0.1
+         });
+         var RELATION = presetPreset('relation', {
+           name: 'Relation',
+           tags: {},
+           geometry: ['relation'],
+           matchScore: 0.1
+         });
+
+         var _this = presetCollection([POINT, LINE, AREA, RELATION]);
+
+         var _presets = {
+           point: POINT,
+           line: LINE,
+           area: AREA,
+           relation: RELATION
+         };
+         var _defaults = {
+           point: presetCollection([POINT]),
+           vertex: presetCollection([POINT]),
+           line: presetCollection([LINE]),
+           area: presetCollection([AREA]),
+           relation: presetCollection([RELATION])
+         };
+         var _fields = {};
+         var _categories = {};
+         var _universal = [];
+         var _addablePresetIDs = null; // Set of preset IDs that the user can add
+
+         var _recents;
+
+         var _favorites; // Index of presets by (geometry, tag key).
+
+
+         var _geometryIndex = {
+           point: {},
+           vertex: {},
+           line: {},
+           area: {},
+           relation: {}
+         };
+
+         var _loadPromise;
+
+         _this.ensureLoaded = function () {
+           if (_loadPromise) return _loadPromise;
+           return _loadPromise = Promise.all([_mainFileFetcher.get('preset_categories'), _mainFileFetcher.get('preset_defaults'), _mainFileFetcher.get('preset_presets'), _mainFileFetcher.get('preset_fields')]).then(function (vals) {
+             _this.merge({
+               categories: vals[0],
+               defaults: vals[1],
+               presets: vals[2],
+               fields: vals[3]
+             });
+
+             osmSetAreaKeys(_this.areaKeys());
+             osmSetPointTags(_this.pointTags());
+             osmSetVertexTags(_this.vertexTags());
+           });
+         }; // `merge` accepts an object containing new preset data (all properties optional):
+         // {
+         //   fields: {},
+         //   presets: {},
+         //   categories: {},
+         //   defaults: {},
+         //   featureCollection: {}
+         //}
+
+
+         _this.merge = function (d) {
+           var newLocationSets = []; // Merge Fields
+
+           if (d.fields) {
+             Object.keys(d.fields).forEach(function (fieldID) {
+               var f = d.fields[fieldID];
+
+               if (f) {
+                 // add or replace
+                 f = presetField(fieldID, f);
+                 if (f.locationSet) newLocationSets.push(f);
+                 _fields[fieldID] = f;
+               } else {
+                 // remove
+                 delete _fields[fieldID];
+               }
+             });
+           } // Merge Presets
+
+
+           if (d.presets) {
+             Object.keys(d.presets).forEach(function (presetID) {
+               var p = d.presets[presetID];
+
+               if (p) {
+                 // add or replace
+                 var isAddable = !_addablePresetIDs || _addablePresetIDs.has(presetID);
+
+                 p = presetPreset(presetID, p, isAddable, _fields, _presets);
+                 if (p.locationSet) newLocationSets.push(p);
+                 _presets[presetID] = p;
+               } else {
+                 // remove (but not if it's a fallback)
+                 var existing = _presets[presetID];
+
+                 if (existing && !existing.isFallback()) {
+                   delete _presets[presetID];
+                 }
+               }
+             });
+           } // Merge Categories
+
+
+           if (d.categories) {
+             Object.keys(d.categories).forEach(function (categoryID) {
+               var c = d.categories[categoryID];
+
+               if (c) {
+                 // add or replace
+                 c = presetCategory(categoryID, c, _presets);
+                 if (c.locationSet) newLocationSets.push(c);
+                 _categories[categoryID] = c;
+               } else {
+                 // remove
+                 delete _categories[categoryID];
+               }
+             });
+           } // Rebuild _this.collection after changing presets and categories
+
+
+           _this.collection = Object.values(_presets).concat(Object.values(_categories)); // Merge Defaults
+
+           if (d.defaults) {
+             Object.keys(d.defaults).forEach(function (geometry) {
+               var def = d.defaults[geometry];
+
+               if (Array.isArray(def)) {
+                 // add or replace
+                 _defaults[geometry] = presetCollection(def.map(function (id) {
+                   return _presets[id] || _categories[id];
+                 }).filter(Boolean));
+               } else {
+                 // remove
+                 delete _defaults[geometry];
+               }
+             });
+           } // Rebuild universal fields array
+
+
+           _universal = Object.values(_fields).filter(function (field) {
+             return field.universal;
+           }); // Reset all the preset fields - they'll need to be resolved again
+
+           Object.values(_presets).forEach(function (preset) {
+             return preset.resetFields();
+           }); // Rebuild geometry index
+
+           _geometryIndex = {
+             point: {},
+             vertex: {},
+             line: {},
+             area: {},
+             relation: {}
+           };
+
+           _this.collection.forEach(function (preset) {
+             (preset.geometry || []).forEach(function (geometry) {
+               var g = _geometryIndex[geometry];
+
+               for (var key in preset.tags) {
+                 g[key] = g[key] || {};
+                 var value = preset.tags[key];
+                 (g[key][value] = g[key][value] || []).push(preset);
+               }
+             });
+           }); // Merge Custom Features
+
+
+           if (d.featureCollection && Array.isArray(d.featureCollection.features)) {
+             _mainLocations.mergeCustomGeoJSON(d.featureCollection);
+           } // Resolve all locationSet features.
+
+
+           if (newLocationSets.length) {
+             _mainLocations.mergeLocationSets(newLocationSets);
+           }
+
+           return _this;
+         };
+
+         _this.match = function (entity, resolver) {
+           return resolver["transient"](entity, 'presetMatch', function () {
+             var geometry = entity.geometry(resolver); // Treat entities on addr:interpolation lines as points, not vertices - #3241
+
+             if (geometry === 'vertex' && entity.isOnAddressLine(resolver)) {
+               geometry = 'point';
+             }
+
+             var entityExtent = entity.extent(resolver);
+             return _this.matchTags(entity.tags, geometry, entityExtent.center());
+           });
+         };
+
+         _this.matchTags = function (tags, geometry, loc) {
+           var keyIndex = _geometryIndex[geometry];
+           var bestScore = -1;
+           var bestMatch;
+           var matchCandidates = [];
+
+           for (var k in tags) {
+             var indexMatches = [];
+             var valueIndex = keyIndex[k];
+             if (!valueIndex) continue;
+             var keyValueMatches = valueIndex[tags[k]];
+             if (keyValueMatches) indexMatches.push.apply(indexMatches, _toConsumableArray(keyValueMatches));
+             var keyStarMatches = valueIndex['*'];
+             if (keyStarMatches) indexMatches.push.apply(indexMatches, _toConsumableArray(keyStarMatches));
+             if (indexMatches.length === 0) continue;
+
+             for (var i = 0; i < indexMatches.length; i++) {
+               var candidate = indexMatches[i];
+               var score = candidate.matchScore(tags);
+
+               if (score === -1) {
+                 continue;
+               }
+
+               matchCandidates.push({
+                 score: score,
+                 candidate: candidate
+               });
+
+               if (score > bestScore) {
+                 bestScore = score;
+                 bestMatch = candidate;
+               }
+             }
+           }
+
+           if (bestMatch && bestMatch.locationSetID && bestMatch.locationSetID !== '+[Q2]' && Array.isArray(loc)) {
+             var validLocations = _mainLocations.locationsAt(loc);
+
+             if (!validLocations[bestMatch.locationSetID]) {
+               matchCandidates.sort(function (a, b) {
+                 return a.score < b.score ? 1 : -1;
+               });
+
+               for (var _i = 0; _i < matchCandidates.length; _i++) {
+                 var candidateScore = matchCandidates[_i];
+
+                 if (!candidateScore.candidate.locationSetID || validLocations[candidateScore.candidate.locationSetID]) {
+                   bestMatch = candidateScore.candidate;
+                   bestScore = candidateScore.score;
+                   break;
+                 }
+               }
+             }
+           } // If any part of an address is present, allow fallback to "Address" preset - #4353
+
+
+           if (!bestMatch || bestMatch.isFallback()) {
+             for (var _k in tags) {
+               if (/^addr:/.test(_k) && keyIndex['addr:*'] && keyIndex['addr:*']['*']) {
+                 bestMatch = keyIndex['addr:*']['*'][0];
+                 break;
+               }
+             }
+           }
+
+           return bestMatch || _this.fallback(geometry);
+         };
+
+         _this.allowsVertex = function (entity, resolver) {
+           if (entity.type !== 'node') return false;
+           if (Object.keys(entity.tags).length === 0) return true;
+           return resolver["transient"](entity, 'vertexMatch', function () {
+             // address lines allow vertices to act as standalone points
+             if (entity.isOnAddressLine(resolver)) return true;
+             var geometries = osmNodeGeometriesForTags(entity.tags);
+             if (geometries.vertex) return true;
+             if (geometries.point) return false; // allow vertices for unspecified points
+
+             return true;
+           });
+         }; // Because of the open nature of tagging, iD will never have a complete
+         // list of tags used in OSM, so we want it to have logic like "assume
+         // that a closed way with an amenity tag is an area, unless the amenity
+         // is one of these specific types". This function computes a structure
+         // that allows testing of such conditions, based on the presets designated
+         // as as supporting (or not supporting) the area geometry.
+         //
+         // The returned object L is a keeplist/discardlist of tags. A closed way
+         // with a tag (k, v) is considered to be an area if `k in L && !(v in L[k])`
+         // (see `Way#isArea()`). In other words, the keys of L form the keeplist,
+         // and the subkeys form the discardlist.
+
+
+         _this.areaKeys = function () {
+           // The ignore list is for keys that imply lines. (We always add `area=yes` for exceptions)
+           var ignore = ['barrier', 'highway', 'footway', 'railway', 'junction', 'type'];
+           var areaKeys = {}; // ignore name-suggestion-index and deprecated presets
+
+           var presets = _this.collection.filter(function (p) {
+             return !p.suggestion && !p.replacement;
+           }); // keeplist
+
+
+           presets.forEach(function (p) {
+             var keys = p.tags && Object.keys(p.tags);
+             var key = keys && keys.length && keys[0]; // pick the first tag
+
+             if (!key) return;
+             if (ignore.indexOf(key) !== -1) return;
+
+             if (p.geometry.indexOf('area') !== -1) {
+               // probably an area..
+               areaKeys[key] = areaKeys[key] || {};
+             }
+           }); // discardlist
+
+           presets.forEach(function (p) {
+             var key;
+
+             for (key in p.addTags) {
+               // examine all addTags to get a better sense of what can be tagged on lines - #6800
+               var value = p.addTags[key];
+
+               if (key in areaKeys && // probably an area...
+               p.geometry.indexOf('line') !== -1 && // but sometimes a line
+               value !== '*') {
+                 areaKeys[key][value] = true;
+               }
+             }
+           });
+           return areaKeys;
+         };
+
+         _this.pointTags = function () {
+           return _this.collection.reduce(function (pointTags, d) {
+             // ignore name-suggestion-index, deprecated, and generic presets
+             if (d.suggestion || d.replacement || d.searchable === false) return pointTags; // only care about the primary tag
+
+             var keys = d.tags && Object.keys(d.tags);
+             var key = keys && keys.length && keys[0]; // pick the first tag
+
+             if (!key) return pointTags; // if this can be a point
+
+             if (d.geometry.indexOf('point') !== -1) {
+               pointTags[key] = pointTags[key] || {};
+               pointTags[key][d.tags[key]] = true;
+             }
+
+             return pointTags;
+           }, {});
+         };
+
+         _this.vertexTags = function () {
+           return _this.collection.reduce(function (vertexTags, d) {
+             // ignore name-suggestion-index, deprecated, and generic presets
+             if (d.suggestion || d.replacement || d.searchable === false) return vertexTags; // only care about the primary tag
+
+             var keys = d.tags && Object.keys(d.tags);
+             var key = keys && keys.length && keys[0]; // pick the first tag
+
+             if (!key) return vertexTags; // if this can be a vertex
+
+             if (d.geometry.indexOf('vertex') !== -1) {
+               vertexTags[key] = vertexTags[key] || {};
+               vertexTags[key][d.tags[key]] = true;
+             }
+
+             return vertexTags;
+           }, {});
+         };
+
+         _this.field = function (id) {
+           return _fields[id];
+         };
+
+         _this.universal = function () {
+           return _universal;
+         };
+
+         _this.defaults = function (geometry, n, startWithRecents, loc) {
+           var recents = [];
+
+           if (startWithRecents) {
+             recents = _this.recent().matchGeometry(geometry).collection.slice(0, 4);
+           }
+
+           var defaults;
+
+           if (_addablePresetIDs) {
+             defaults = Array.from(_addablePresetIDs).map(function (id) {
+               var preset = _this.item(id);
+
+               if (preset && preset.matchGeometry(geometry)) return preset;
+               return null;
+             }).filter(Boolean);
+           } else {
+             defaults = _defaults[geometry].collection.concat(_this.fallback(geometry));
+           }
+
+           var result = presetCollection(utilArrayUniq(recents.concat(defaults)).slice(0, n - 1));
+
+           if (Array.isArray(loc)) {
+             var validLocations = _mainLocations.locationsAt(loc);
+             result.collection = result.collection.filter(function (a) {
+               return !a.locationSetID || validLocations[a.locationSetID];
+             });
+           }
+
+           return result;
+         }; // pass a Set of addable preset ids
+
+
+         _this.addablePresetIDs = function (val) {
+           if (!arguments.length) return _addablePresetIDs; // accept and convert arrays
+
+           if (Array.isArray(val)) val = new Set(val);
+           _addablePresetIDs = val;
+
+           if (_addablePresetIDs) {
+             // reset all presets
+             _this.collection.forEach(function (p) {
+               // categories aren't addable
+               if (p.addable) p.addable(_addablePresetIDs.has(p.id));
+             });
+           } else {
+             _this.collection.forEach(function (p) {
+               if (p.addable) p.addable(true);
+             });
+           }
+
+           return _this;
+         };
+
+         _this.recent = function () {
+           return presetCollection(utilArrayUniq(_this.getRecents().map(function (d) {
+             return d.preset;
+           })));
+         };
+
+         function RibbonItem(preset, source) {
+           var item = {};
+           item.preset = preset;
+           item.source = source;
+
+           item.isFavorite = function () {
+             return item.source === 'favorite';
+           };
+
+           item.isRecent = function () {
+             return item.source === 'recent';
+           };
+
+           item.matches = function (preset) {
+             return item.preset.id === preset.id;
+           };
+
+           item.minified = function () {
+             return {
+               pID: item.preset.id
+             };
+           };
+
+           return item;
+         }
+
+         function ribbonItemForMinified(d, source) {
+           if (d && d.pID) {
+             var preset = _this.item(d.pID);
+
+             if (!preset) return null;
+             return RibbonItem(preset, source);
+           }
+
+           return null;
+         }
+
+         _this.getGenericRibbonItems = function () {
+           return ['point', 'line', 'area'].map(function (id) {
+             return RibbonItem(_this.item(id), 'generic');
+           });
+         };
+
+         _this.getAddable = function () {
+           if (!_addablePresetIDs) return [];
+           return _addablePresetIDs.map(function (id) {
+             var preset = _this.item(id);
+
+             if (preset) return RibbonItem(preset, 'addable');
+             return null;
+           }).filter(Boolean);
+         };
+
+         function setRecents(items) {
+           _recents = items;
+           var minifiedItems = items.map(function (d) {
+             return d.minified();
+           });
+           corePreferences('preset_recents', JSON.stringify(minifiedItems));
+           dispatch.call('recentsChange');
+         }
+
+         _this.getRecents = function () {
+           if (!_recents) {
+             // fetch from local storage
+             _recents = (JSON.parse(corePreferences('preset_recents')) || []).reduce(function (acc, d) {
+               var item = ribbonItemForMinified(d, 'recent');
+               if (item && item.preset.addable()) acc.push(item);
+               return acc;
+             }, []);
+           }
+
+           return _recents;
+         };
+
+         _this.addRecent = function (preset, besidePreset, after) {
+           var recents = _this.getRecents();
+
+           var beforeItem = _this.recentMatching(besidePreset);
+
+           var toIndex = recents.indexOf(beforeItem);
+           if (after) toIndex += 1;
+           var newItem = RibbonItem(preset, 'recent');
+           recents.splice(toIndex, 0, newItem);
+           setRecents(recents);
+         };
+
+         _this.removeRecent = function (preset) {
+           var item = _this.recentMatching(preset);
+
+           if (item) {
+             var items = _this.getRecents();
+
+             items.splice(items.indexOf(item), 1);
+             setRecents(items);
+           }
+         };
+
+         _this.recentMatching = function (preset) {
+           var items = _this.getRecents();
+
+           for (var i in items) {
+             if (items[i].matches(preset)) {
+               return items[i];
+             }
+           }
+
+           return null;
+         };
+
+         _this.moveItem = function (items, fromIndex, toIndex) {
+           if (fromIndex === toIndex || fromIndex < 0 || toIndex < 0 || fromIndex >= items.length || toIndex >= items.length) return null;
+           items.splice(toIndex, 0, items.splice(fromIndex, 1)[0]);
+           return items;
+         };
+
+         _this.moveRecent = function (item, beforeItem) {
+           var recents = _this.getRecents();
+
+           var fromIndex = recents.indexOf(item);
+           var toIndex = recents.indexOf(beforeItem);
+
+           var items = _this.moveItem(recents, fromIndex, toIndex);
+
+           if (items) setRecents(items);
+         };
+
+         _this.setMostRecent = function (preset) {
+           if (preset.searchable === false) return;
+
+           var items = _this.getRecents();
+
+           var item = _this.recentMatching(preset);
+
+           if (item) {
+             items.splice(items.indexOf(item), 1);
+           } else {
+             item = RibbonItem(preset, 'recent');
+           } // remove the last recent (first in, first out)
+
+
+           while (items.length >= MAXRECENTS) {
+             items.pop();
+           } // prepend array
+
+
+           items.unshift(item);
+           setRecents(items);
+         };
+
+         function setFavorites(items) {
+           _favorites = items;
+           var minifiedItems = items.map(function (d) {
+             return d.minified();
+           });
+           corePreferences('preset_favorites', JSON.stringify(minifiedItems)); // call update
+
+           dispatch.call('favoritePreset');
+         }
+
+         _this.addFavorite = function (preset, besidePreset, after) {
+           var favorites = _this.getFavorites();
+
+           var beforeItem = _this.favoriteMatching(besidePreset);
+
+           var toIndex = favorites.indexOf(beforeItem);
+           if (after) toIndex += 1;
+           var newItem = RibbonItem(preset, 'favorite');
+           favorites.splice(toIndex, 0, newItem);
+           setFavorites(favorites);
+         };
+
+         _this.toggleFavorite = function (preset) {
+           var favs = _this.getFavorites();
+
+           var favorite = _this.favoriteMatching(preset);
+
+           if (favorite) {
+             favs.splice(favs.indexOf(favorite), 1);
+           } else {
+             // only allow 10 favorites
+             if (favs.length === 10) {
+               // remove the last favorite (last in, first out)
+               favs.pop();
+             } // append array
+
+
+             favs.push(RibbonItem(preset, 'favorite'));
+           }
+
+           setFavorites(favs);
+         };
+
+         _this.removeFavorite = function (preset) {
+           var item = _this.favoriteMatching(preset);
+
+           if (item) {
+             var items = _this.getFavorites();
+
+             items.splice(items.indexOf(item), 1);
+             setFavorites(items);
+           }
+         };
+
+         _this.getFavorites = function () {
+           if (!_favorites) {
+             // fetch from local storage
+             var rawFavorites = JSON.parse(corePreferences('preset_favorites'));
+
+             if (!rawFavorites) {
+               rawFavorites = [];
+               corePreferences('preset_favorites', JSON.stringify(rawFavorites));
+             }
+
+             _favorites = rawFavorites.reduce(function (output, d) {
+               var item = ribbonItemForMinified(d, 'favorite');
+               if (item && item.preset.addable()) output.push(item);
+               return output;
+             }, []);
+           }
+
+           return _favorites;
+         };
+
+         _this.favoriteMatching = function (preset) {
+           var favs = _this.getFavorites();
+
+           for (var index in favs) {
+             if (favs[index].matches(preset)) {
+               return favs[index];
+             }
+           }
+
+           return null;
+         };
+
+         return utilRebind(_this, dispatch, 'on');
+       }
+
+       function utilTagText(entity) {
+         var obj = entity && entity.tags || {};
+         return Object.keys(obj).map(function (k) {
+           return k + '=' + obj[k];
+         }).join(', ');
+       }
+       function utilTotalExtent(array, graph) {
+         var extent = geoExtent();
+         var val, entity;
+
+         for (var i = 0; i < array.length; i++) {
+           val = array[i];
+           entity = typeof val === 'string' ? graph.hasEntity(val) : val;
+
+           if (entity) {
+             extent._extend(entity.extent(graph));
+           }
+         }
+
+         return extent;
+       }
+       function utilTagDiff(oldTags, newTags) {
+         var tagDiff = [];
+         var keys = utilArrayUnion(Object.keys(oldTags), Object.keys(newTags)).sort();
+         keys.forEach(function (k) {
+           var oldVal = oldTags[k];
+           var newVal = newTags[k];
+
+           if ((oldVal || oldVal === '') && (newVal === undefined || newVal !== oldVal)) {
+             tagDiff.push({
+               type: '-',
+               key: k,
+               oldVal: oldVal,
+               newVal: newVal,
+               display: '- ' + k + '=' + oldVal
+             });
+           }
+
+           if ((newVal || newVal === '') && (oldVal === undefined || newVal !== oldVal)) {
+             tagDiff.push({
+               type: '+',
+               key: k,
+               oldVal: oldVal,
+               newVal: newVal,
+               display: '+ ' + k + '=' + newVal
+             });
+           }
+         });
+         return tagDiff;
+       }
+       function utilEntitySelector(ids) {
+         return ids.length ? '.' + ids.join(',.') : 'nothing';
+       } // returns an selector to select entity ids for:
+       //  - entityIDs passed in
+       //  - shallow descendant entityIDs for any of those entities that are relations
+
+       function utilEntityOrMemberSelector(ids, graph) {
+         var seen = new Set(ids);
+         ids.forEach(collectShallowDescendants);
+         return utilEntitySelector(Array.from(seen));
+
+         function collectShallowDescendants(id) {
+           var entity = graph.hasEntity(id);
+           if (!entity || entity.type !== 'relation') return;
+           entity.members.map(function (member) {
+             return member.id;
+           }).forEach(function (id) {
+             seen.add(id);
+           });
+         }
+       } // returns an selector to select entity ids for:
+       //  - entityIDs passed in
+       //  - deep descendant entityIDs for any of those entities that are relations
+
+       function utilEntityOrDeepMemberSelector(ids, graph) {
+         return utilEntitySelector(utilEntityAndDeepMemberIDs(ids, graph));
+       } // returns an selector to select entity ids for:
+       //  - entityIDs passed in
+       //  - deep descendant entityIDs for any of those entities that are relations
+
+       function utilEntityAndDeepMemberIDs(ids, graph) {
+         var seen = new Set();
+         ids.forEach(collectDeepDescendants);
+         return Array.from(seen);
+
+         function collectDeepDescendants(id) {
+           if (seen.has(id)) return;
+           seen.add(id);
+           var entity = graph.hasEntity(id);
+           if (!entity || entity.type !== 'relation') return;
+           entity.members.map(function (member) {
+             return member.id;
+           }).forEach(collectDeepDescendants); // recurse
+         }
+       } // returns an selector to select entity ids for:
+       //  - deep descendant entityIDs for any of those entities that are relations
+
+       function utilDeepMemberSelector(ids, graph, skipMultipolgonMembers) {
+         var idsSet = new Set(ids);
+         var seen = new Set();
+         var returners = new Set();
+         ids.forEach(collectDeepDescendants);
+         return utilEntitySelector(Array.from(returners));
+
+         function collectDeepDescendants(id) {
+           if (seen.has(id)) return;
+           seen.add(id);
+
+           if (!idsSet.has(id)) {
+             returners.add(id);
+           }
+
+           var entity = graph.hasEntity(id);
+           if (!entity || entity.type !== 'relation') return;
+           if (skipMultipolgonMembers && entity.isMultipolygon()) return;
+           entity.members.map(function (member) {
+             return member.id;
+           }).forEach(collectDeepDescendants); // recurse
+         }
+       } // Adds or removes highlight styling for the specified entities
+
+       function utilHighlightEntities(ids, highlighted, context) {
+         context.surface().selectAll(utilEntityOrDeepMemberSelector(ids, context.graph())).classed('highlighted', highlighted);
+       } // returns an Array that is the union of:
+       //  - nodes for any nodeIDs passed in
+       //  - child nodes of any wayIDs passed in
+       //  - descendant member and child nodes of relationIDs passed in
+
+       function utilGetAllNodes(ids, graph) {
+         var seen = new Set();
+         var nodes = new Set();
+         ids.forEach(collectNodes);
+         return Array.from(nodes);
+
+         function collectNodes(id) {
+           if (seen.has(id)) return;
+           seen.add(id);
+           var entity = graph.hasEntity(id);
+           if (!entity) return;
+
+           if (entity.type === 'node') {
+             nodes.add(entity);
+           } else if (entity.type === 'way') {
+             entity.nodes.forEach(collectNodes);
+           } else {
+             entity.members.map(function (member) {
+               return member.id;
+             }).forEach(collectNodes); // recurse
+           }
+         }
+       }
+       function utilDisplayName(entity) {
+         var localizedNameKey = 'name:' + _mainLocalizer.languageCode().toLowerCase();
+         var name = entity.tags[localizedNameKey] || entity.tags.name || '';
+         if (name) return name;
+         var tags = {
+           direction: entity.tags.direction,
+           from: entity.tags.from,
+           network: entity.tags.cycle_network || entity.tags.network,
+           ref: entity.tags.ref,
+           to: entity.tags.to,
+           via: entity.tags.via
+         };
+         var keyComponents = [];
+
+         if (tags.network) {
+           keyComponents.push('network');
+         }
+
+         if (tags.ref) {
+           keyComponents.push('ref');
+         } // Routes may need more disambiguation based on direction or destination
+
+
+         if (entity.tags.route) {
+           if (tags.direction) {
+             keyComponents.push('direction');
+           } else if (tags.from && tags.to) {
+             keyComponents.push('from');
+             keyComponents.push('to');
+
+             if (tags.via) {
+               keyComponents.push('via');
+             }
+           }
+         }
+
+         if (keyComponents.length) {
+           name = _t('inspector.display_name.' + keyComponents.join('_'), tags);
+         }
+
+         return name;
+       }
+       function utilDisplayNameForPath(entity) {
+         var name = utilDisplayName(entity);
+         var isFirefox = utilDetect().browser.toLowerCase().indexOf('firefox') > -1;
+         var isNewChromium = Number(utilDetect().version.split('.')[0]) >= 96.0;
+
+         if (!isFirefox && !isNewChromium && name && rtlRegex.test(name)) {
+           name = fixRTLTextForSvg(name);
+         }
+
+         return name;
+       }
+       function utilDisplayType(id) {
+         return {
+           n: _t('inspector.node'),
+           w: _t('inspector.way'),
+           r: _t('inspector.relation')
+         }[id.charAt(0)];
+       } // `utilDisplayLabel`
+       // Returns a string suitable for display
+       // By default returns something like name/ref, fallback to preset type, fallback to OSM type
+       //   "Main Street" or "Tertiary Road"
+       // If `verbose=true`, include both preset name and feature name.
+       //   "Tertiary Road Main Street"
+       //
+
+       function utilDisplayLabel(entity, graphOrGeometry, verbose) {
+         var result;
+         var displayName = utilDisplayName(entity);
+         var preset = typeof graphOrGeometry === 'string' ? _mainPresetIndex.matchTags(entity.tags, graphOrGeometry) : _mainPresetIndex.match(entity, graphOrGeometry);
+         var presetName = preset && (preset.suggestion ? preset.subtitle() : preset.name());
+
+         if (verbose) {
+           result = [presetName, displayName].filter(Boolean).join(' ');
+         } else {
+           result = displayName || presetName;
+         } // Fallback to the OSM type (node/way/relation)
+
+
+         return result || utilDisplayType(entity.id);
+       }
+       function utilEntityRoot(entityType) {
+         return {
+           node: 'n',
+           way: 'w',
+           relation: 'r'
+         }[entityType];
+       } // Returns a single object containing the tags of all the given entities.
+       // Example:
+       // {
+       //   highway: 'service',
+       //   service: 'parking_aisle'
+       // }
+       //           +
+       // {
+       //   highway: 'service',
+       //   service: 'driveway',
+       //   width: '3'
+       // }
+       //           =
+       // {
+       //   highway: 'service',
+       //   service: [ 'driveway', 'parking_aisle' ],
+       //   width: [ '3', undefined ]
+       // }
+
+       function utilCombinedTags(entityIDs, graph) {
+         var tags = {};
+         var tagCounts = {};
+         var allKeys = new Set();
+         var entities = entityIDs.map(function (entityID) {
+           return graph.hasEntity(entityID);
+         }).filter(Boolean); // gather the aggregate keys
+
+         entities.forEach(function (entity) {
+           var keys = Object.keys(entity.tags).filter(Boolean);
+           keys.forEach(function (key) {
+             allKeys.add(key);
+           });
+         });
+         entities.forEach(function (entity) {
+           allKeys.forEach(function (key) {
+             var value = entity.tags[key]; // purposely allow `undefined`
+
+             if (!tags.hasOwnProperty(key)) {
+               // first value, set as raw
+               tags[key] = value;
+             } else {
+               if (!Array.isArray(tags[key])) {
+                 if (tags[key] !== value) {
+                   // first alternate value, replace single value with array
+                   tags[key] = [tags[key], value];
+                 }
+               } else {
+                 // type is array
+                 if (tags[key].indexOf(value) === -1) {
+                   // subsequent alternate value, add to array
+                   tags[key].push(value);
+                 }
+               }
+             }
+
+             var tagHash = key + '=' + value;
+             if (!tagCounts[tagHash]) tagCounts[tagHash] = 0;
+             tagCounts[tagHash] += 1;
+           });
+         });
+
+         for (var key in tags) {
+           if (!Array.isArray(tags[key])) continue; // sort values by frequency then alphabetically
+
+           tags[key] = tags[key].sort(function (val1, val2) {
+             var key = key; // capture
+
+             var count2 = tagCounts[key + '=' + val2];
+             var count1 = tagCounts[key + '=' + val1];
+
+             if (count2 !== count1) {
+               return count2 - count1;
+             }
+
+             if (val2 && val1) {
+               return val1.localeCompare(val2);
+             }
+
+             return val1 ? 1 : -1;
+           });
+         }
+
+         return tags;
+       }
+       function utilStringQs(str) {
+         var i = 0; // advance past any leading '?' or '#' characters
+
+         while (i < str.length && (str[i] === '?' || str[i] === '#')) {
+           i++;
+         }
+
+         str = str.slice(i);
+         return str.split('&').reduce(function (obj, pair) {
+           var parts = pair.split('=');
+
+           if (parts.length === 2) {
+             obj[parts[0]] = null === parts[1] ? '' : decodeURIComponent(parts[1]);
+           }
+
+           return obj;
+         }, {});
+       }
+       function utilQsString(obj, noencode) {
+         // encode everything except special characters used in certain hash parameters:
+         // "/" in map states, ":", ",", {" and "}" in background
+         function softEncode(s) {
+           return encodeURIComponent(s).replace(/(%2F|%3A|%2C|%7B|%7D)/g, decodeURIComponent);
+         }
+
+         return Object.keys(obj).sort().map(function (key) {
+           return encodeURIComponent(key) + '=' + (noencode ? softEncode(obj[key]) : encodeURIComponent(obj[key]));
+         }).join('&');
+       }
+       function utilPrefixDOMProperty(property) {
+         var prefixes = ['webkit', 'ms', 'moz', 'o'];
+         var i = -1;
+         var n = prefixes.length;
+         var s = document.body;
+         if (property in s) return property;
+         property = property.substr(0, 1).toUpperCase() + property.substr(1);
+
+         while (++i < n) {
+           if (prefixes[i] + property in s) {
+             return prefixes[i] + property;
+           }
+         }
+
+         return false;
+       }
+       function utilPrefixCSSProperty(property) {
+         var prefixes = ['webkit', 'ms', 'Moz', 'O'];
+         var i = -1;
+         var n = prefixes.length;
+         var s = document.body.style;
+
+         if (property.toLowerCase() in s) {
+           return property.toLowerCase();
+         }
+
+         while (++i < n) {
+           if (prefixes[i] + property in s) {
+             return '-' + prefixes[i].toLowerCase() + property.replace(/([A-Z])/g, '-$1').toLowerCase();
+           }
+         }
+
+         return false;
+       }
+       var transformProperty;
+       function utilSetTransform(el, x, y, scale) {
+         var prop = transformProperty = transformProperty || utilPrefixCSSProperty('Transform');
+         var translate = utilDetect().opera ? 'translate(' + x + 'px,' + y + 'px)' : 'translate3d(' + x + 'px,' + y + 'px,0)';
+         return el.style(prop, translate + (scale ? ' scale(' + scale + ')' : ''));
+       } // Calculates Levenshtein distance between two strings
+       // see:  https://en.wikipedia.org/wiki/Levenshtein_distance
+       // first converts the strings to lowercase and replaces diacritic marks with ascii equivalents.
+
+       function utilEditDistance(a, b) {
+         a = remove$6(a.toLowerCase());
+         b = remove$6(b.toLowerCase());
+         if (a.length === 0) return b.length;
+         if (b.length === 0) return a.length;
+         var matrix = [];
+         var i, j;
+
+         for (i = 0; i <= b.length; i++) {
+           matrix[i] = [i];
+         }
+
+         for (j = 0; j <= a.length; j++) {
+           matrix[0][j] = j;
+         }
+
+         for (i = 1; i <= b.length; i++) {
+           for (j = 1; j <= a.length; j++) {
+             if (b.charAt(i - 1) === a.charAt(j - 1)) {
+               matrix[i][j] = matrix[i - 1][j - 1];
+             } else {
+               matrix[i][j] = Math.min(matrix[i - 1][j - 1] + 1, // substitution
+               Math.min(matrix[i][j - 1] + 1, // insertion
+               matrix[i - 1][j] + 1)); // deletion
+             }
+           }
+         }
+
+         return matrix[b.length][a.length];
+       } // a d3.mouse-alike which
+       // 1. Only works on HTML elements, not SVG
+       // 2. Does not cause style recalculation
+
+       function utilFastMouse(container) {
+         var rect = container.getBoundingClientRect();
+         var rectLeft = rect.left;
+         var rectTop = rect.top;
+         var clientLeft = +container.clientLeft;
+         var clientTop = +container.clientTop;
+         return function (e) {
+           return [e.clientX - rectLeft - clientLeft, e.clientY - rectTop - clientTop];
+         };
+       }
+       function utilAsyncMap(inputs, func, callback) {
+         var remaining = inputs.length;
+         var results = [];
+         var errors = [];
+         inputs.forEach(function (d, i) {
+           func(d, function done(err, data) {
+             errors[i] = err;
+             results[i] = data;
+             remaining--;
+             if (!remaining) callback(errors, results);
+           });
+         });
+       } // wraps an index to an interval [0..length-1]
+
+       function utilWrap(index, length) {
+         if (index < 0) {
+           index += Math.ceil(-index / length) * length;
+         }
+
+         return index % length;
+       }
+       /**
+        * a replacement for functor
+        *
+        * @param {*} value any value
+        * @returns {Function} a function that returns that value or the value if it's a function
+        */
+
+       function utilFunctor(value) {
+         if (typeof value === 'function') return value;
+         return function () {
+           return value;
+         };
+       }
+       function utilNoAuto(selection) {
+         var isText = selection.size() && selection.node().tagName.toLowerCase() === 'textarea';
+         return selection // assign 'new-password' even for non-password fields to prevent browsers (Chrome) ignoring 'off'
+         .attr('autocomplete', 'new-password').attr('autocorrect', 'off').attr('autocapitalize', 'off').attr('spellcheck', isText ? 'true' : 'false');
+       } // https://stackoverflow.com/questions/194846/is-there-any-kind-of-hash-code-function-in-javascript
+       // https://werxltd.com/wp/2010/05/13/javascript-implementation-of-javas-string-hashcode-method/
+
+       function utilHashcode(str) {
+         var hash = 0;
+
+         if (str.length === 0) {
+           return hash;
+         }
+
+         for (var i = 0; i < str.length; i++) {
+           var _char = str.charCodeAt(i);
+
+           hash = (hash << 5) - hash + _char;
+           hash = hash & hash; // Convert to 32bit integer
+         }
+
+         return hash;
+       } // Returns version of `str` with all runs of special characters replaced by `_`;
+       // suitable for HTML ids, classes, selectors, etc.
+
+       function utilSafeClassName(str) {
+         return str.toLowerCase().replace(/[^a-z0-9]+/g, '_');
+       } // Returns string based on `val` that is highly unlikely to collide with an id
+       // used previously or that's present elsewhere in the document. Useful for preventing
+       // browser-provided autofills or when embedding iD on pages with unknown elements.
+
+       function utilUniqueDomId(val) {
+         return 'ideditor-' + utilSafeClassName(val.toString()) + '-' + new Date().getTime().toString();
+       } // Returns the length of `str` in unicode characters. This can be less than
+       // `String.length()` since a single unicode character can be composed of multiple
+       // JavaScript UTF-16 code units.
+
+       function utilUnicodeCharsCount(str) {
+         // Native ES2015 implementations of `Array.from` split strings into unicode characters
+         return Array.from(str).length;
+       } // Returns a new string representing `str` cut from its start to `limit` length
+       // in unicode characters. Note that this runs the risk of splitting graphemes.
+
+       function utilUnicodeCharsTruncated(str, limit) {
+         return Array.from(str).slice(0, limit).join('');
+       }
+
+       function toNumericID(id) {
+         var match = id.match(/^[cnwr](-?\d+)$/);
+
+         if (match) {
+           return parseInt(match[1], 10);
+         }
+
+         return NaN;
+       }
+
+       function compareNumericIDs(left, right) {
+         if (isNaN(left) && isNaN(right)) return -1;
+         if (isNaN(left)) return 1;
+         if (isNaN(right)) return -1;
+         if (Math.sign(left) !== Math.sign(right)) return -Math.sign(left);
+         if (Math.sign(left) < 0) return Math.sign(right - left);
+         return Math.sign(left - right);
+       } // Returns -1 if the first parameter ID is older than the second,
+       // 1 if the second parameter is older, 0 if they are the same.
+       // If both IDs are test IDs, the function returns -1.
+
+
+       function utilCompareIDs(left, right) {
+         return compareNumericIDs(toNumericID(left), toNumericID(right));
+       } // Returns the chronologically oldest ID in the list.
+       // Database IDs (with positive numbers) before editor ones (with negative numbers).
+       // Among each category, the closest number to 0 is the oldest.
+       // Test IDs (any string that does not conform to OSM's ID scheme) are taken last.
+
+       function utilOldestID(ids) {
+         if (ids.length === 0) {
+           return undefined;
+         }
+
+         var oldestIDIndex = 0;
+         var oldestID = toNumericID(ids[0]);
+
+         for (var i = 1; i < ids.length; i++) {
+           var num = toNumericID(ids[i]);
+
+           if (compareNumericIDs(oldestID, num) === 1) {
+             oldestIDIndex = i;
+             oldestID = num;
+           }
+         }
+
+         return ids[oldestIDIndex];
+       }
+
+       function osmEntity(attrs) {
+         // For prototypal inheritance.
+         if (this instanceof osmEntity) return; // Create the appropriate subtype.
+
+         if (attrs && attrs.type) {
+           return osmEntity[attrs.type].apply(this, arguments);
+         } else if (attrs && attrs.id) {
+           return osmEntity[osmEntity.id.type(attrs.id)].apply(this, arguments);
+         } // Initialize a generic Entity (used only in tests).
+
+
+         return new osmEntity().initialize(arguments);
+       }
+
+       osmEntity.id = function (type) {
+         return osmEntity.id.fromOSM(type, osmEntity.id.next[type]--);
+       };
+
+       osmEntity.id.next = {
+         changeset: -1,
+         node: -1,
+         way: -1,
+         relation: -1
+       };
+
+       osmEntity.id.fromOSM = function (type, id) {
+         return type[0] + id;
+       };
+
+       osmEntity.id.toOSM = function (id) {
+         var match = id.match(/^[cnwr](-?\d+)$/);
+
+         if (match) {
+           return match[1];
+         }
+
+         return '';
+       };
+
+       osmEntity.id.type = function (id) {
+         return {
+           'c': 'changeset',
+           'n': 'node',
+           'w': 'way',
+           'r': 'relation'
+         }[id[0]];
+       }; // A function suitable for use as the second argument to d3.selection#data().
+
+
+       osmEntity.key = function (entity) {
+         return entity.id + 'v' + (entity.v || 0);
+       };
+
+       var _deprecatedTagValuesByKey;
+
+       osmEntity.deprecatedTagValuesByKey = function (dataDeprecated) {
+         if (!_deprecatedTagValuesByKey) {
+           _deprecatedTagValuesByKey = {};
+           dataDeprecated.forEach(function (d) {
+             var oldKeys = Object.keys(d.old);
+
+             if (oldKeys.length === 1) {
+               var oldKey = oldKeys[0];
+               var oldValue = d.old[oldKey];
+
+               if (oldValue !== '*') {
+                 if (!_deprecatedTagValuesByKey[oldKey]) {
+                   _deprecatedTagValuesByKey[oldKey] = [oldValue];
+                 } else {
+                   _deprecatedTagValuesByKey[oldKey].push(oldValue);
+                 }
+               }
+             }
+           });
+         }
+
+         return _deprecatedTagValuesByKey;
+       };
+
+       osmEntity.prototype = {
+         tags: {},
+         initialize: function initialize(sources) {
+           for (var i = 0; i < sources.length; ++i) {
+             var source = sources[i];
+
+             for (var prop in source) {
+               if (Object.prototype.hasOwnProperty.call(source, prop)) {
+                 if (source[prop] === undefined) {
+                   delete this[prop];
+                 } else {
+                   this[prop] = source[prop];
+                 }
+               }
+             }
+           }
+
+           if (!this.id && this.type) {
+             this.id = osmEntity.id(this.type);
+           }
+
+           if (!this.hasOwnProperty('visible')) {
+             this.visible = true;
+           }
+
+           if (debug) {
+             Object.freeze(this);
+             Object.freeze(this.tags);
+             if (this.loc) Object.freeze(this.loc);
+             if (this.nodes) Object.freeze(this.nodes);
+             if (this.members) Object.freeze(this.members);
+           }
+
+           return this;
+         },
+         copy: function copy(resolver, copies) {
+           if (copies[this.id]) return copies[this.id];
+           var copy = osmEntity(this, {
+             id: undefined,
+             user: undefined,
+             version: undefined
+           });
+           copies[this.id] = copy;
+           return copy;
+         },
+         osmId: function osmId() {
+           return osmEntity.id.toOSM(this.id);
+         },
+         isNew: function isNew() {
+           var osmId = osmEntity.id.toOSM(this.id);
+           return osmId.length === 0 || osmId[0] === '-';
+         },
+         update: function update(attrs) {
+           return osmEntity(this, attrs, {
+             v: 1 + (this.v || 0)
+           });
+         },
+         mergeTags: function mergeTags(tags) {
+           var merged = Object.assign({}, this.tags); // shallow copy
+
+           var changed = false;
+
+           for (var k in tags) {
+             var t1 = merged[k];
+             var t2 = tags[k];
+
+             if (!t1) {
+               changed = true;
+               merged[k] = t2;
+             } else if (t1 !== t2) {
+               changed = true;
+               merged[k] = utilUnicodeCharsTruncated(utilArrayUnion(t1.split(/;\s*/), t2.split(/;\s*/)).join(';'), 255 // avoid exceeding character limit; see also services/osm.js -> maxCharsForTagValue()
+               );
+             }
+           }
+
+           return changed ? this.update({
+             tags: merged
+           }) : this;
+         },
+         intersects: function intersects(extent, resolver) {
+           return this.extent(resolver).intersects(extent);
+         },
+         hasNonGeometryTags: function hasNonGeometryTags() {
+           return Object.keys(this.tags).some(function (k) {
+             return k !== 'area';
+           });
+         },
+         hasParentRelations: function hasParentRelations(resolver) {
+           return resolver.parentRelations(this).length > 0;
+         },
+         hasInterestingTags: function hasInterestingTags() {
+           return Object.keys(this.tags).some(osmIsInterestingTag);
+         },
+         isHighwayIntersection: function isHighwayIntersection() {
+           return false;
+         },
+         isDegenerate: function isDegenerate() {
+           return true;
+         },
+         deprecatedTags: function deprecatedTags(dataDeprecated) {
+           var tags = this.tags; // if there are no tags, none can be deprecated
+
+           if (Object.keys(tags).length === 0) return [];
+           var deprecated = [];
+           dataDeprecated.forEach(function (d) {
+             var oldKeys = Object.keys(d.old);
+
+             if (d.replace) {
+               var hasExistingValues = Object.keys(d.replace).some(function (replaceKey) {
+                 if (!tags[replaceKey] || d.old[replaceKey]) return false;
+                 var replaceValue = d.replace[replaceKey];
+                 if (replaceValue === '*') return false;
+                 if (replaceValue === tags[replaceKey]) return false;
+                 return true;
+               }); // don't flag deprecated tags if the upgrade path would overwrite existing data - #7843
+
+               if (hasExistingValues) return;
+             }
+
+             var matchesDeprecatedTags = oldKeys.every(function (oldKey) {
+               if (!tags[oldKey]) return false;
+               if (d.old[oldKey] === '*') return true;
+               if (d.old[oldKey] === tags[oldKey]) return true;
+               var vals = tags[oldKey].split(';').filter(Boolean);
+
+               if (vals.length === 0) {
+                 return false;
+               } else if (vals.length > 1) {
+                 return vals.indexOf(d.old[oldKey]) !== -1;
+               } else {
+                 if (tags[oldKey] === d.old[oldKey]) {
+                   if (d.replace && d.old[oldKey] === d.replace[oldKey]) {
+                     var replaceKeys = Object.keys(d.replace);
+                     return !replaceKeys.every(function (replaceKey) {
+                       return tags[replaceKey] === d.replace[replaceKey];
+                     });
+                   } else {
+                     return true;
+                   }
+                 }
+               }
+
+               return false;
+             });
+
+             if (matchesDeprecatedTags) {
+               deprecated.push(d);
+             }
+           });
+           return deprecated;
+         }
+       };
+
+       function osmLanes(entity) {
+         if (entity.type !== 'way') return null;
+         if (!entity.tags.highway) return null;
+         var tags = entity.tags;
+         var isOneWay = entity.isOneWay();
+         var laneCount = getLaneCount(tags, isOneWay);
+         var maxspeed = parseMaxspeed(tags);
+         var laneDirections = parseLaneDirections(tags, isOneWay, laneCount);
+         var forward = laneDirections.forward;
+         var backward = laneDirections.backward;
+         var bothways = laneDirections.bothways; // parse the piped string 'x|y|z' format
+
+         var turnLanes = {};
+         turnLanes.unspecified = parseTurnLanes(tags['turn:lanes']);
+         turnLanes.forward = parseTurnLanes(tags['turn:lanes:forward']);
+         turnLanes.backward = parseTurnLanes(tags['turn:lanes:backward']);
+         var maxspeedLanes = {};
+         maxspeedLanes.unspecified = parseMaxspeedLanes(tags['maxspeed:lanes'], maxspeed);
+         maxspeedLanes.forward = parseMaxspeedLanes(tags['maxspeed:lanes:forward'], maxspeed);
+         maxspeedLanes.backward = parseMaxspeedLanes(tags['maxspeed:lanes:backward'], maxspeed);
+         var psvLanes = {};
+         psvLanes.unspecified = parseMiscLanes(tags['psv:lanes']);
+         psvLanes.forward = parseMiscLanes(tags['psv:lanes:forward']);
+         psvLanes.backward = parseMiscLanes(tags['psv:lanes:backward']);
+         var busLanes = {};
+         busLanes.unspecified = parseMiscLanes(tags['bus:lanes']);
+         busLanes.forward = parseMiscLanes(tags['bus:lanes:forward']);
+         busLanes.backward = parseMiscLanes(tags['bus:lanes:backward']);
+         var taxiLanes = {};
+         taxiLanes.unspecified = parseMiscLanes(tags['taxi:lanes']);
+         taxiLanes.forward = parseMiscLanes(tags['taxi:lanes:forward']);
+         taxiLanes.backward = parseMiscLanes(tags['taxi:lanes:backward']);
+         var hovLanes = {};
+         hovLanes.unspecified = parseMiscLanes(tags['hov:lanes']);
+         hovLanes.forward = parseMiscLanes(tags['hov:lanes:forward']);
+         hovLanes.backward = parseMiscLanes(tags['hov:lanes:backward']);
+         var hgvLanes = {};
+         hgvLanes.unspecified = parseMiscLanes(tags['hgv:lanes']);
+         hgvLanes.forward = parseMiscLanes(tags['hgv:lanes:forward']);
+         hgvLanes.backward = parseMiscLanes(tags['hgv:lanes:backward']);
+         var bicyclewayLanes = {};
+         bicyclewayLanes.unspecified = parseBicycleWay(tags['bicycleway:lanes']);
+         bicyclewayLanes.forward = parseBicycleWay(tags['bicycleway:lanes:forward']);
+         bicyclewayLanes.backward = parseBicycleWay(tags['bicycleway:lanes:backward']);
+         var lanesObj = {
+           forward: [],
+           backward: [],
+           unspecified: []
+         }; // map forward/backward/unspecified of each lane type to lanesObj
+
+         mapToLanesObj(lanesObj, turnLanes, 'turnLane');
+         mapToLanesObj(lanesObj, maxspeedLanes, 'maxspeed');
+         mapToLanesObj(lanesObj, psvLanes, 'psv');
+         mapToLanesObj(lanesObj, busLanes, 'bus');
+         mapToLanesObj(lanesObj, taxiLanes, 'taxi');
+         mapToLanesObj(lanesObj, hovLanes, 'hov');
+         mapToLanesObj(lanesObj, hgvLanes, 'hgv');
+         mapToLanesObj(lanesObj, bicyclewayLanes, 'bicycleway');
+         return {
+           metadata: {
+             count: laneCount,
+             oneway: isOneWay,
+             forward: forward,
+             backward: backward,
+             bothways: bothways,
+             turnLanes: turnLanes,
+             maxspeed: maxspeed,
+             maxspeedLanes: maxspeedLanes,
+             psvLanes: psvLanes,
+             busLanes: busLanes,
+             taxiLanes: taxiLanes,
+             hovLanes: hovLanes,
+             hgvLanes: hgvLanes,
+             bicyclewayLanes: bicyclewayLanes
+           },
+           lanes: lanesObj
+         };
+       }
+
+       function getLaneCount(tags, isOneWay) {
+         var count;
+
+         if (tags.lanes) {
+           count = parseInt(tags.lanes, 10);
+
+           if (count > 0) {
+             return count;
+           }
+         }
+
+         switch (tags.highway) {
+           case 'trunk':
+           case 'motorway':
+             count = isOneWay ? 2 : 4;
+             break;
+
+           default:
+             count = isOneWay ? 1 : 2;
+             break;
+         }
+
+         return count;
+       }
+
+       function parseMaxspeed(tags) {
+         var maxspeed = tags.maxspeed;
+         if (!maxspeed) return;
+         var maxspeedRegex = /^([0-9][\.0-9]+?)(?:[ ]?(?:km\/h|kmh|kph|mph|knots))?$/;
+         if (!maxspeedRegex.test(maxspeed)) return;
+         return parseInt(maxspeed, 10);
+       }
+
+       function parseLaneDirections(tags, isOneWay, laneCount) {
+         var forward = parseInt(tags['lanes:forward'], 10);
+         var backward = parseInt(tags['lanes:backward'], 10);
+         var bothways = parseInt(tags['lanes:both_ways'], 10) > 0 ? 1 : 0;
+
+         if (parseInt(tags.oneway, 10) === -1) {
+           forward = 0;
+           bothways = 0;
+           backward = laneCount;
+         } else if (isOneWay) {
+           forward = laneCount;
+           bothways = 0;
+           backward = 0;
+         } else if (isNaN(forward) && isNaN(backward)) {
+           backward = Math.floor((laneCount - bothways) / 2);
+           forward = laneCount - bothways - backward;
+         } else if (isNaN(forward)) {
+           if (backward > laneCount - bothways) {
+             backward = laneCount - bothways;
+           }
+
+           forward = laneCount - bothways - backward;
+         } else if (isNaN(backward)) {
+           if (forward > laneCount - bothways) {
+             forward = laneCount - bothways;
+           }
+
+           backward = laneCount - bothways - forward;
+         }
+
+         return {
+           forward: forward,
+           backward: backward,
+           bothways: bothways
+         };
+       }
+
+       function parseTurnLanes(tag) {
+         if (!tag) return;
+         var validValues = ['left', 'slight_left', 'sharp_left', 'through', 'right', 'slight_right', 'sharp_right', 'reverse', 'merge_to_left', 'merge_to_right', 'none'];
+         return tag.split('|').map(function (s) {
+           if (s === '') s = 'none';
+           return s.split(';').map(function (d) {
+             return validValues.indexOf(d) === -1 ? 'unknown' : d;
+           });
+         });
+       }
+
+       function parseMaxspeedLanes(tag, maxspeed) {
+         if (!tag) return;
+         return tag.split('|').map(function (s) {
+           if (s === 'none') return s;
+           var m = parseInt(s, 10);
+           if (s === '' || m === maxspeed) return null;
+           return isNaN(m) ? 'unknown' : m;
+         });
+       }
+
+       function parseMiscLanes(tag) {
+         if (!tag) return;
+         var validValues = ['yes', 'no', 'designated'];
+         return tag.split('|').map(function (s) {
+           if (s === '') s = 'no';
+           return validValues.indexOf(s) === -1 ? 'unknown' : s;
+         });
+       }
+
+       function parseBicycleWay(tag) {
+         if (!tag) return;
+         var validValues = ['yes', 'no', 'designated', 'lane'];
+         return tag.split('|').map(function (s) {
+           if (s === '') s = 'no';
+           return validValues.indexOf(s) === -1 ? 'unknown' : s;
+         });
+       }
+
+       function mapToLanesObj(lanesObj, data, key) {
+         if (data.forward) {
+           data.forward.forEach(function (l, i) {
+             if (!lanesObj.forward[i]) lanesObj.forward[i] = {};
+             lanesObj.forward[i][key] = l;
+           });
+         }
+
+         if (data.backward) {
+           data.backward.forEach(function (l, i) {
+             if (!lanesObj.backward[i]) lanesObj.backward[i] = {};
+             lanesObj.backward[i][key] = l;
+           });
+         }
+
+         if (data.unspecified) {
+           data.unspecified.forEach(function (l, i) {
+             if (!lanesObj.unspecified[i]) lanesObj.unspecified[i] = {};
+             lanesObj.unspecified[i][key] = l;
+           });
+         }
+       }
+
+       function osmWay() {
+         if (!(this instanceof osmWay)) {
+           return new osmWay().initialize(arguments);
+         } else if (arguments.length) {
+           this.initialize(arguments);
+         }
+       }
+       osmEntity.way = osmWay;
+       osmWay.prototype = Object.create(osmEntity.prototype);
+       Object.assign(osmWay.prototype, {
+         type: 'way',
+         nodes: [],
+         copy: function copy(resolver, copies) {
+           if (copies[this.id]) return copies[this.id];
+           var copy = osmEntity.prototype.copy.call(this, resolver, copies);
+           var nodes = this.nodes.map(function (id) {
+             return resolver.entity(id).copy(resolver, copies).id;
+           });
+           copy = copy.update({
+             nodes: nodes
+           });
+           copies[this.id] = copy;
+           return copy;
+         },
+         extent: function extent(resolver) {
+           return resolver["transient"](this, 'extent', function () {
+             var extent = geoExtent();
+
+             for (var i = 0; i < this.nodes.length; i++) {
+               var node = resolver.hasEntity(this.nodes[i]);
+
+               if (node) {
+                 extent._extend(node.extent());
+               }
+             }
+
+             return extent;
+           });
+         },
+         first: function first() {
+           return this.nodes[0];
+         },
+         last: function last() {
+           return this.nodes[this.nodes.length - 1];
+         },
+         contains: function contains(node) {
+           return this.nodes.indexOf(node) >= 0;
+         },
+         affix: function affix(node) {
+           if (this.nodes[0] === node) return 'prefix';
+           if (this.nodes[this.nodes.length - 1] === node) return 'suffix';
+         },
+         layer: function layer() {
+           // explicit layer tag, clamp between -10, 10..
+           if (isFinite(this.tags.layer)) {
+             return Math.max(-10, Math.min(+this.tags.layer, 10));
+           } // implied layer tag..
+
+
+           if (this.tags.covered === 'yes') return -1;
+           if (this.tags.location === 'overground') return 1;
+           if (this.tags.location === 'underground') return -1;
+           if (this.tags.location === 'underwater') return -10;
+           if (this.tags.power === 'line') return 10;
+           if (this.tags.power === 'minor_line') return 10;
+           if (this.tags.aerialway) return 10;
+           if (this.tags.bridge) return 1;
+           if (this.tags.cutting) return -1;
+           if (this.tags.tunnel) return -1;
+           if (this.tags.waterway) return -1;
+           if (this.tags.man_made === 'pipeline') return -10;
+           if (this.tags.boundary) return -10;
+           return 0;
+         },
+         // the approximate width of the line based on its tags except its `width` tag
+         impliedLineWidthMeters: function impliedLineWidthMeters() {
+           var averageWidths = {
+             highway: {
+               // width is for single lane
+               motorway: 5,
+               motorway_link: 5,
+               trunk: 4.5,
+               trunk_link: 4.5,
+               primary: 4,
+               secondary: 4,
+               tertiary: 4,
+               primary_link: 4,
+               secondary_link: 4,
+               tertiary_link: 4,
+               unclassified: 4,
+               road: 4,
+               living_street: 4,
+               bus_guideway: 4,
+               pedestrian: 4,
+               residential: 3.5,
+               service: 3.5,
+               track: 3,
+               cycleway: 2.5,
+               bridleway: 2,
+               corridor: 2,
+               steps: 2,
+               path: 1.5,
+               footway: 1.5
+             },
+             railway: {
+               // width includes ties and rail bed, not just track gauge
+               rail: 2.5,
+               light_rail: 2.5,
+               tram: 2.5,
+               subway: 2.5,
+               monorail: 2.5,
+               funicular: 2.5,
+               disused: 2.5,
+               preserved: 2.5,
+               miniature: 1.5,
+               narrow_gauge: 1.5
+             },
+             waterway: {
+               river: 50,
+               canal: 25,
+               stream: 5,
+               tidal_channel: 5,
+               fish_pass: 2.5,
+               drain: 2.5,
+               ditch: 1.5
+             }
+           };
+
+           for (var key in averageWidths) {
+             if (this.tags[key] && averageWidths[key][this.tags[key]]) {
+               var width = averageWidths[key][this.tags[key]];
+
+               if (key === 'highway') {
+                 var laneCount = this.tags.lanes && parseInt(this.tags.lanes, 10);
+                 if (!laneCount) laneCount = this.isOneWay() ? 1 : 2;
+                 return width * laneCount;
+               }
+
+               return width;
+             }
+           }
+
+           return null;
+         },
+         isOneWay: function isOneWay() {
+           // explicit oneway tag..
+           var values = {
+             'yes': true,
+             '1': true,
+             '-1': true,
+             'reversible': true,
+             'alternating': true,
+             'no': false,
+             '0': false
+           };
+
+           if (values[this.tags.oneway] !== undefined) {
+             return values[this.tags.oneway];
+           } // implied oneway tag..
+
+
+           for (var key in this.tags) {
+             if (key in osmOneWayTags && this.tags[key] in osmOneWayTags[key]) {
+               return true;
+             }
+           }
+
+           return false;
+         },
+         // Some identifier for tag that implies that this way is "sided",
+         // i.e. the right side is the 'inside' (e.g. the right side of a
+         // natural=cliff is lower).
+         sidednessIdentifier: function sidednessIdentifier() {
+           for (var key in this.tags) {
+             var value = this.tags[key];
+
+             if (key in osmRightSideIsInsideTags && value in osmRightSideIsInsideTags[key]) {
+               if (osmRightSideIsInsideTags[key][value] === true) {
+                 return key;
+               } else {
+                 // if the map's value is something other than a
+                 // literal true, we should use it so we can
+                 // special case some keys (e.g. natural=coastline
+                 // is handled differently to other naturals).
+                 return osmRightSideIsInsideTags[key][value];
+               }
+             }
+           }
+
+           return null;
+         },
+         isSided: function isSided() {
+           if (this.tags.two_sided === 'yes') {
+             return false;
+           }
+
+           return this.sidednessIdentifier() !== null;
+         },
+         lanes: function lanes() {
+           return osmLanes(this);
+         },
+         isClosed: function isClosed() {
+           return this.nodes.length > 1 && this.first() === this.last();
+         },
+         isConvex: function isConvex(resolver) {
+           if (!this.isClosed() || this.isDegenerate()) return null;
+           var nodes = utilArrayUniq(resolver.childNodes(this));
+           var coords = nodes.map(function (n) {
+             return n.loc;
+           });
+           var curr = 0;
+           var prev = 0;
+
+           for (var i = 0; i < coords.length; i++) {
+             var o = coords[(i + 1) % coords.length];
+             var a = coords[i];
+             var b = coords[(i + 2) % coords.length];
+             var res = geoVecCross(a, b, o);
+             curr = res > 0 ? 1 : res < 0 ? -1 : 0;
+
+             if (curr === 0) {
+               continue;
+             } else if (prev && curr !== prev) {
+               return false;
+             }
+
+             prev = curr;
+           }
+
+           return true;
+         },
+         // returns an object with the tag that implies this is an area, if any
+         tagSuggestingArea: function tagSuggestingArea() {
+           return osmTagSuggestingArea(this.tags);
+         },
+         isArea: function isArea() {
+           if (this.tags.area === 'yes') return true;
+           if (!this.isClosed() || this.tags.area === 'no') return false;
+           return this.tagSuggestingArea() !== null;
+         },
+         isDegenerate: function isDegenerate() {
+           return new Set(this.nodes).size < (this.isArea() ? 3 : 2);
+         },
+         areAdjacent: function areAdjacent(n1, n2) {
+           for (var i = 0; i < this.nodes.length; i++) {
+             if (this.nodes[i] === n1) {
+               if (this.nodes[i - 1] === n2) return true;
+               if (this.nodes[i + 1] === n2) return true;
+             }
+           }
+
+           return false;
+         },
+         geometry: function geometry(graph) {
+           return graph["transient"](this, 'geometry', function () {
+             return this.isArea() ? 'area' : 'line';
+           });
+         },
+         // returns an array of objects representing the segments between the nodes in this way
+         segments: function segments(graph) {
+           function segmentExtent(graph) {
+             var n1 = graph.hasEntity(this.nodes[0]);
+             var n2 = graph.hasEntity(this.nodes[1]);
+             return n1 && n2 && geoExtent([[Math.min(n1.loc[0], n2.loc[0]), Math.min(n1.loc[1], n2.loc[1])], [Math.max(n1.loc[0], n2.loc[0]), Math.max(n1.loc[1], n2.loc[1])]]);
+           }
+
+           return graph["transient"](this, 'segments', function () {
+             var segments = [];
+
+             for (var i = 0; i < this.nodes.length - 1; i++) {
+               segments.push({
+                 id: this.id + '-' + i,
+                 wayId: this.id,
+                 index: i,
+                 nodes: [this.nodes[i], this.nodes[i + 1]],
+                 extent: segmentExtent
+               });
+             }
+
+             return segments;
+           });
+         },
+         // If this way is not closed, append the beginning node to the end of the nodelist to close it.
+         close: function close() {
+           if (this.isClosed() || !this.nodes.length) return this;
+           var nodes = this.nodes.slice();
+           nodes = nodes.filter(noRepeatNodes);
+           nodes.push(nodes[0]);
+           return this.update({
+             nodes: nodes
+           });
+         },
+         // If this way is closed, remove any connector nodes from the end of the nodelist to unclose it.
+         unclose: function unclose() {
+           if (!this.isClosed()) return this;
+           var nodes = this.nodes.slice();
+           var connector = this.first();
+           var i = nodes.length - 1; // remove trailing connectors..
+
+           while (i > 0 && nodes.length > 1 && nodes[i] === connector) {
+             nodes.splice(i, 1);
+             i = nodes.length - 1;
+           }
+
+           nodes = nodes.filter(noRepeatNodes);
+           return this.update({
+             nodes: nodes
+           });
+         },
+         // Adds a node (id) in front of the node which is currently at position index.
+         // If index is undefined, the node will be added to the end of the way for linear ways,
+         //   or just before the final connecting node for circular ways.
+         // Consecutive duplicates are eliminated including existing ones.
+         // Circularity is always preserved when adding a node.
+         addNode: function addNode(id, index) {
+           var nodes = this.nodes.slice();
+           var isClosed = this.isClosed();
+           var max = isClosed ? nodes.length - 1 : nodes.length;
+
+           if (index === undefined) {
+             index = max;
+           }
+
+           if (index < 0 || index > max) {
+             throw new RangeError('index ' + index + ' out of range 0..' + max);
+           } // If this is a closed way, remove all connector nodes except the first one
+           // (there may be duplicates) and adjust index if necessary..
+
+
+           if (isClosed) {
+             var connector = this.first(); // leading connectors..
+
+             var i = 1;
+
+             while (i < nodes.length && nodes.length > 2 && nodes[i] === connector) {
+               nodes.splice(i, 1);
+               if (index > i) index--;
+             } // trailing connectors..
+
+
+             i = nodes.length - 1;
+
+             while (i > 0 && nodes.length > 1 && nodes[i] === connector) {
+               nodes.splice(i, 1);
+               if (index > i) index--;
+               i = nodes.length - 1;
+             }
+           }
+
+           nodes.splice(index, 0, id);
+           nodes = nodes.filter(noRepeatNodes); // If the way was closed before, append a connector node to keep it closed..
+
+           if (isClosed && (nodes.length === 1 || nodes[0] !== nodes[nodes.length - 1])) {
+             nodes.push(nodes[0]);
+           }
+
+           return this.update({
+             nodes: nodes
+           });
+         },
+         // Replaces the node which is currently at position index with the given node (id).
+         // Consecutive duplicates are eliminated including existing ones.
+         // Circularity is preserved when updating a node.
+         updateNode: function updateNode(id, index) {
+           var nodes = this.nodes.slice();
+           var isClosed = this.isClosed();
+           var max = nodes.length - 1;
+
+           if (index === undefined || index < 0 || index > max) {
+             throw new RangeError('index ' + index + ' out of range 0..' + max);
+           } // If this is a closed way, remove all connector nodes except the first one
+           // (there may be duplicates) and adjust index if necessary..
+
+
+           if (isClosed) {
+             var connector = this.first(); // leading connectors..
+
+             var i = 1;
+
+             while (i < nodes.length && nodes.length > 2 && nodes[i] === connector) {
+               nodes.splice(i, 1);
+               if (index > i) index--;
+             } // trailing connectors..
+
+
+             i = nodes.length - 1;
+
+             while (i > 0 && nodes.length > 1 && nodes[i] === connector) {
+               nodes.splice(i, 1);
+               if (index === i) index = 0; // update leading connector instead
+
+               i = nodes.length - 1;
+             }
+           }
+
+           nodes.splice(index, 1, id);
+           nodes = nodes.filter(noRepeatNodes); // If the way was closed before, append a connector node to keep it closed..
+
+           if (isClosed && (nodes.length === 1 || nodes[0] !== nodes[nodes.length - 1])) {
+             nodes.push(nodes[0]);
+           }
+
+           return this.update({
+             nodes: nodes
+           });
+         },
+         // Replaces each occurrence of node id needle with replacement.
+         // Consecutive duplicates are eliminated including existing ones.
+         // Circularity is preserved.
+         replaceNode: function replaceNode(needleID, replacementID) {
+           var nodes = this.nodes.slice();
+           var isClosed = this.isClosed();
+
+           for (var i = 0; i < nodes.length; i++) {
+             if (nodes[i] === needleID) {
+               nodes[i] = replacementID;
+             }
+           }
+
+           nodes = nodes.filter(noRepeatNodes); // If the way was closed before, append a connector node to keep it closed..
+
+           if (isClosed && (nodes.length === 1 || nodes[0] !== nodes[nodes.length - 1])) {
+             nodes.push(nodes[0]);
+           }
+
+           return this.update({
+             nodes: nodes
+           });
+         },
+         // Removes each occurrence of node id.
+         // Consecutive duplicates are eliminated including existing ones.
+         // Circularity is preserved.
+         removeNode: function removeNode(id) {
+           var nodes = this.nodes.slice();
+           var isClosed = this.isClosed();
+           nodes = nodes.filter(function (node) {
+             return node !== id;
+           }).filter(noRepeatNodes); // If the way was closed before, append a connector node to keep it closed..
+
+           if (isClosed && (nodes.length === 1 || nodes[0] !== nodes[nodes.length - 1])) {
+             nodes.push(nodes[0]);
+           }
+
+           return this.update({
+             nodes: nodes
+           });
+         },
+         asJXON: function asJXON(changeset_id) {
+           var r = {
+             way: {
+               '@id': this.osmId(),
+               '@version': this.version || 0,
+               nd: this.nodes.map(function (id) {
+                 return {
+                   keyAttributes: {
+                     ref: osmEntity.id.toOSM(id)
+                   }
+                 };
+               }, this),
+               tag: Object.keys(this.tags).map(function (k) {
+                 return {
+                   keyAttributes: {
+                     k: k,
+                     v: this.tags[k]
+                   }
+                 };
+               }, this)
+             }
+           };
+
+           if (changeset_id) {
+             r.way['@changeset'] = changeset_id;
+           }
+
+           return r;
+         },
+         asGeoJSON: function asGeoJSON(resolver) {
+           return resolver["transient"](this, 'GeoJSON', function () {
+             var coordinates = resolver.childNodes(this).map(function (n) {
+               return n.loc;
+             });
+
+             if (this.isArea() && this.isClosed()) {
+               return {
+                 type: 'Polygon',
+                 coordinates: [coordinates]
+               };
+             } else {
+               return {
+                 type: 'LineString',
+                 coordinates: coordinates
+               };
+             }
+           });
+         },
+         area: function area(resolver) {
+           return resolver["transient"](this, 'area', function () {
+             var nodes = resolver.childNodes(this);
+             var json = {
+               type: 'Polygon',
+               coordinates: [nodes.map(function (n) {
+                 return n.loc;
+               })]
+             };
+
+             if (!this.isClosed() && nodes.length) {
+               json.coordinates[0].push(nodes[0].loc);
+             }
+
+             var area = d3_geoArea(json); // Heuristic for detecting counterclockwise winding order. Assumes
+             // that OpenStreetMap polygons are not hemisphere-spanning.
+
+             if (area > 2 * Math.PI) {
+               json.coordinates[0] = json.coordinates[0].reverse();
+               area = d3_geoArea(json);
+             }
+
+             return isNaN(area) ? 0 : area;
+           });
+         }
+       }); // Filter function to eliminate consecutive duplicates.
+
+       function noRepeatNodes(node, i, arr) {
+         return i === 0 || node !== arr[i - 1];
+       }
+
+       //
+       // 1. Relation tagged with `type=multipolygon` and no interesting tags.
+       // 2. One and only one member with the `outer` role. Must be a way with interesting tags.
+       // 3. No members without a role.
+       //
+       // Old multipolygons are no longer recommended but are still rendered as areas by iD.
+
+       function osmOldMultipolygonOuterMemberOfRelation(entity, graph) {
+         if (entity.type !== 'relation' || !entity.isMultipolygon() || Object.keys(entity.tags).filter(osmIsInterestingTag).length > 1) {
+           return false;
+         }
+
+         var outerMember;
+
+         for (var memberIndex in entity.members) {
+           var member = entity.members[memberIndex];
+
+           if (!member.role || member.role === 'outer') {
+             if (outerMember) return false;
+             if (member.type !== 'way') return false;
+             if (!graph.hasEntity(member.id)) return false;
+             outerMember = graph.entity(member.id);
+
+             if (Object.keys(outerMember.tags).filter(osmIsInterestingTag).length === 0) {
+               return false;
+             }
+           }
+         }
+
+         return outerMember;
+       } // For fixing up rendering of multipolygons with tags on the outer member.
+       // https://github.com/openstreetmap/iD/issues/613
+
+       function osmIsOldMultipolygonOuterMember(entity, graph) {
+         if (entity.type !== 'way' || Object.keys(entity.tags).filter(osmIsInterestingTag).length === 0) {
+           return false;
+         }
+
+         var parents = graph.parentRelations(entity);
+         if (parents.length !== 1) return false;
+         var parent = parents[0];
+
+         if (!parent.isMultipolygon() || Object.keys(parent.tags).filter(osmIsInterestingTag).length > 1) {
+           return false;
+         }
+
+         var members = parent.members,
+             member;
+
+         for (var i = 0; i < members.length; i++) {
+           member = members[i];
+
+           if (member.id === entity.id && member.role && member.role !== 'outer') {
+             // Not outer member
+             return false;
+           }
+
+           if (member.id !== entity.id && (!member.role || member.role === 'outer')) {
+             // Not a simple multipolygon
+             return false;
+           }
+         }
+
+         return parent;
+       }
+       function osmOldMultipolygonOuterMember(entity, graph) {
+         if (entity.type !== 'way') return false;
+         var parents = graph.parentRelations(entity);
+         if (parents.length !== 1) return false;
+         var parent = parents[0];
+
+         if (!parent.isMultipolygon() || Object.keys(parent.tags).filter(osmIsInterestingTag).length > 1) {
+           return false;
+         }
+
+         var members = parent.members,
+             member,
+             outerMember;
+
+         for (var i = 0; i < members.length; i++) {
+           member = members[i];
+
+           if (!member.role || member.role === 'outer') {
+             if (outerMember) return false; // Not a simple multipolygon
+
+             outerMember = member;
+           }
+         }
+
+         if (!outerMember) return false;
+         var outerEntity = graph.hasEntity(outerMember.id);
+
+         if (!outerEntity || !Object.keys(outerEntity.tags).filter(osmIsInterestingTag).length) {
+           return false;
+         }
+
+         return outerEntity;
+       } // Join `toJoin` array into sequences of connecting ways.
+       // Segments which share identical start/end nodes will, as much as possible,
+       // be connected with each other.
+       //
+       // The return value is a nested array. Each constituent array contains elements
+       // of `toJoin` which have been determined to connect.
+       //
+       // Each consitituent array also has a `nodes` property whose value is an
+       // ordered array of member nodes, with appropriate order reversal and
+       // start/end coordinate de-duplication.
+       //
+       // Members of `toJoin` must have, at minimum, `type` and `id` properties.
+       // Thus either an array of `osmWay`s or a relation member array may be used.
+       //
+       // If an member is an `osmWay`, its tags and childnodes may be reversed via
+       // `actionReverse` in the output.
+       //
+       // The returned sequences array also has an `actions` array property, containing
+       // any reversal actions that should be applied to the graph, should the calling
+       // code attempt to actually join the given ways.
+       //
+       // Incomplete members (those for which `graph.hasEntity(element.id)` returns
+       // false) and non-way members are ignored.
+       //
+
+       function osmJoinWays(toJoin, graph) {
+         function resolve(member) {
+           return graph.childNodes(graph.entity(member.id));
+         }
+
+         function reverse(item) {
+           var action = actionReverse(item.id, {
+             reverseOneway: true
+           });
+           sequences.actions.push(action);
+           return item instanceof osmWay ? action(graph).entity(item.id) : item;
+         } // make a copy containing only the items to join
+
+
+         toJoin = toJoin.filter(function (member) {
+           return member.type === 'way' && graph.hasEntity(member.id);
+         }); // Are the things we are joining relation members or `osmWays`?
+         // If `osmWays`, skip the "prefer a forward path" code below (see #4872)
+
+         var i;
+         var joinAsMembers = true;
+
+         for (i = 0; i < toJoin.length; i++) {
+           if (toJoin[i] instanceof osmWay) {
+             joinAsMembers = false;
+             break;
+           }
+         }
+
+         var sequences = [];
+         sequences.actions = [];
+
+         while (toJoin.length) {
+           // start a new sequence
+           var item = toJoin.shift();
+           var currWays = [item];
+           var currNodes = resolve(item).slice(); // add to it
+
+           while (toJoin.length) {
+             var start = currNodes[0];
+             var end = currNodes[currNodes.length - 1];
+             var fn = null;
+             var nodes = null; // Find the next way/member to join.
+
+             for (i = 0; i < toJoin.length; i++) {
+               item = toJoin[i];
+               nodes = resolve(item); // (for member ordering only, not way ordering - see #4872)
+               // Strongly prefer to generate a forward path that preserves the order
+               // of the members array. For multipolygons and most relations, member
+               // order does not matter - but for routes, it does. (see #4589)
+               // If we started this sequence backwards (i.e. next member way attaches to
+               // the start node and not the end node), reverse the initial way before continuing.
+
+               if (joinAsMembers && currWays.length === 1 && nodes[0] !== end && nodes[nodes.length - 1] !== end && (nodes[nodes.length - 1] === start || nodes[0] === start)) {
+                 currWays[0] = reverse(currWays[0]);
+                 currNodes.reverse();
+                 start = currNodes[0];
+                 end = currNodes[currNodes.length - 1];
+               }
+
+               if (nodes[0] === end) {
+                 fn = currNodes.push; // join to end
+
+                 nodes = nodes.slice(1);
+                 break;
+               } else if (nodes[nodes.length - 1] === end) {
+                 fn = currNodes.push; // join to end
+
+                 nodes = nodes.slice(0, -1).reverse();
+                 item = reverse(item);
+                 break;
+               } else if (nodes[nodes.length - 1] === start) {
+                 fn = currNodes.unshift; // join to beginning
+
+                 nodes = nodes.slice(0, -1);
+                 break;
+               } else if (nodes[0] === start) {
+                 fn = currNodes.unshift; // join to beginning
+
+                 nodes = nodes.slice(1).reverse();
+                 item = reverse(item);
+                 break;
+               } else {
+                 fn = nodes = null;
+               }
+             }
+
+             if (!nodes) {
+               // couldn't find a joinable way/member
+               break;
+             }
+
+             fn.apply(currWays, [item]);
+             fn.apply(currNodes, nodes);
+             toJoin.splice(i, 1);
+           }
+
+           currWays.nodes = currNodes;
+           sequences.push(currWays);
+         }
+
+         return sequences;
+       }
+
+       function actionAddMember(relationId, member, memberIndex, insertPair) {
+         return function action(graph) {
+           var relation = graph.entity(relationId); // There are some special rules for Public Transport v2 routes.
+
+           var isPTv2 = /stop|platform/.test(member.role);
+
+           if ((isNaN(memberIndex) || insertPair) && member.type === 'way' && !isPTv2) {
+             // Try to perform sensible inserts based on how the ways join together
+             graph = addWayMember(relation, graph);
+           } else {
+             // see https://wiki.openstreetmap.org/wiki/Public_transport#Service_routes
+             // Stops and Platforms for PTv2 should be ordered first.
+             // hack: We do not currently have the ability to place them in the exactly correct order.
+             if (isPTv2 && isNaN(memberIndex)) {
+               memberIndex = 0;
+             }
+
+             graph = graph.replace(relation.addMember(member, memberIndex));
+           }
+
+           return graph;
+         }; // Add a way member into the relation "wherever it makes sense".
+         // In this situation we were not supplied a memberIndex.
+
+         function addWayMember(relation, graph) {
+           var groups, tempWay, insertPairIsReversed, item, i, j, k; // remove PTv2 stops and platforms before doing anything.
+
+           var PTv2members = [];
+           var members = [];
+
+           for (i = 0; i < relation.members.length; i++) {
+             var m = relation.members[i];
+
+             if (/stop|platform/.test(m.role)) {
+               PTv2members.push(m);
+             } else {
+               members.push(m);
+             }
+           }
+
+           relation = relation.update({
+             members: members
+           });
+
+           if (insertPair) {
+             // We're adding a member that must stay paired with an existing member.
+             // (This feature is used by `actionSplit`)
+             //
+             // This is tricky because the members may exist multiple times in the
+             // member list, and with different A-B/B-A ordering and different roles.
+             // (e.g. a bus route that loops out and back - #4589).
+             //
+             // Replace the existing member with a temporary way,
+             // so that `osmJoinWays` can treat the pair like a single way.
+             tempWay = osmWay({
+               id: 'wTemp',
+               nodes: insertPair.nodes
+             });
+             graph = graph.replace(tempWay);
+             var tempMember = {
+               id: tempWay.id,
+               type: 'way',
+               role: member.role
+             };
+             var tempRelation = relation.replaceMember({
+               id: insertPair.originalID
+             }, tempMember, true);
+             groups = utilArrayGroupBy(tempRelation.members, 'type');
+             groups.way = groups.way || []; // Insert pair is reversed if the inserted way comes before the original one.
+             // (Except when they form a loop.)
+
+             var originalWay = graph.entity(insertPair.originalID);
+             var insertedWay = graph.entity(insertPair.insertedID);
+             insertPairIsReversed = originalWay.nodes.length > 0 && insertedWay.nodes.length > 0 && insertedWay.nodes[insertedWay.nodes.length - 1] === originalWay.nodes[0] && originalWay.nodes[originalWay.nodes.length - 1] !== insertedWay.nodes[0];
+           } else {
+             // Add the member anywhere, one time. Just push and let `osmJoinWays` decide where to put it.
+             groups = utilArrayGroupBy(relation.members, 'type');
+             groups.way = groups.way || [];
+             groups.way.push(member);
+           }
+
+           members = withIndex(groups.way);
+           var joined = osmJoinWays(members, graph); // `joined` might not contain all of the way members,
+           // But will contain only the completed (downloaded) members
+
+           for (i = 0; i < joined.length; i++) {
+             var segment = joined[i];
+             var nodes = segment.nodes.slice();
+             var startIndex = segment[0].index; // j = array index in `members` where this segment starts
+
+             for (j = 0; j < members.length; j++) {
+               if (members[j].index === startIndex) {
+                 break;
+               }
+             } // k = each member in segment
+
+
+             for (k = 0; k < segment.length; k++) {
+               item = segment[k];
+               var way = graph.entity(item.id); // If this is a paired item, generate members in correct order and role
+
+               if (tempWay && item.id === tempWay.id) {
+                 var reverse = nodes[0].id !== insertPair.nodes[0] ^ insertPairIsReversed;
+
+                 if (reverse) {
+                   item.pair = [{
+                     id: insertPair.insertedID,
+                     type: 'way',
+                     role: item.role
+                   }, {
+                     id: insertPair.originalID,
+                     type: 'way',
+                     role: item.role
+                   }];
+                 } else {
+                   item.pair = [{
+                     id: insertPair.originalID,
+                     type: 'way',
+                     role: item.role
+                   }, {
+                     id: insertPair.insertedID,
+                     type: 'way',
+                     role: item.role
+                   }];
+                 }
+               } // reorder `members` if necessary
+
+
+               if (k > 0) {
+                 if (j + k >= members.length || item.index !== members[j + k].index) {
+                   moveMember(members, item.index, j + k);
+                 }
+               }
+
+               nodes.splice(0, way.nodes.length - 1);
+             }
+           }
+
+           if (tempWay) {
+             graph = graph.remove(tempWay);
+           } // Final pass: skip dead items, split pairs, remove index properties
+
+
+           var wayMembers = [];
+
+           for (i = 0; i < members.length; i++) {
+             item = members[i];
+             if (item.index === -1) continue;
+
+             if (item.pair) {
+               wayMembers.push(item.pair[0]);
+               wayMembers.push(item.pair[1]);
+             } else {
+               wayMembers.push(utilObjectOmit(item, ['index']));
+             }
+           } // Put stops and platforms first, then nodes, ways, relations
+           // This is recommended for Public Transport v2 routes:
+           // see https://wiki.openstreetmap.org/wiki/Public_transport#Service_routes
+
+
+           var newMembers = PTv2members.concat(groups.node || [], wayMembers, groups.relation || []);
+           return graph.replace(relation.update({
+             members: newMembers
+           })); // `moveMember()` changes the `members` array in place by splicing
+           // the item with `.index = findIndex` to where it belongs,
+           // and marking the old position as "dead" with `.index = -1`
+           //
+           // j=5, k=0                jk
+           // segment                 5 4 7 6
+           // members       0 1 2 3 4 5 6 7 8 9        keep 5 in j+k
+           //
+           // j=5, k=1                j k
+           // segment                 5 4 7 6
+           // members       0 1 2 3 4 5 6 7 8 9        move 4 to j+k
+           // members       0 1 2 3 x 5 4 6 7 8 9      moved
+           //
+           // j=5, k=2                j   k
+           // segment                 5 4 7 6
+           // members       0 1 2 3 x 5 4 6 7 8 9      move 7 to j+k
+           // members       0 1 2 3 x 5 4 7 6 x 8 9    moved
+           //
+           // j=5, k=3                j     k
+           // segment                 5 4 7 6
+           // members       0 1 2 3 x 5 4 7 6 x 8 9    keep 6 in j+k
+           //
+
+           function moveMember(arr, findIndex, toIndex) {
+             var i;
+
+             for (i = 0; i < arr.length; i++) {
+               if (arr[i].index === findIndex) {
+                 break;
+               }
+             }
+
+             var item = Object.assign({}, arr[i]); // shallow copy
+
+             arr[i].index = -1; // mark as dead
+
+             item.index = toIndex;
+             arr.splice(toIndex, 0, item);
+           } // This is the same as `Relation.indexedMembers`,
+           // Except we don't want to index all the members, only the ways
+
+
+           function withIndex(arr) {
+             var result = new Array(arr.length);
+
+             for (var i = 0; i < arr.length; i++) {
+               result[i] = Object.assign({}, arr[i]); // shallow copy
+
+               result[i].index = i;
+             }
+
+             return result;
+           }
+         }
+       }
+
+       function actionAddMidpoint(midpoint, node) {
+         return function (graph) {
+           graph = graph.replace(node.move(midpoint.loc));
+           var parents = utilArrayIntersection(graph.parentWays(graph.entity(midpoint.edge[0])), graph.parentWays(graph.entity(midpoint.edge[1])));
+           parents.forEach(function (way) {
+             for (var i = 0; i < way.nodes.length - 1; i++) {
+               if (geoEdgeEqual([way.nodes[i], way.nodes[i + 1]], midpoint.edge)) {
+                 graph = graph.replace(graph.entity(way.id).addNode(node.id, i + 1)); // Add only one midpoint on doubled-back segments,
+                 // turning them into self-intersections.
+
+                 return;
+               }
+             }
+           });
+           return graph;
+         };
+       }
+
+       // https://github.com/openstreetmap/potlatch2/blob/master/net/systemeD/halcyon/connection/actions/AddNodeToWayAction.as
+       function actionAddVertex(wayId, nodeId, index) {
+         return function (graph) {
+           return graph.replace(graph.entity(wayId).addNode(nodeId, index));
+         };
+       }
+
+       function actionChangeMember(relationId, member, memberIndex) {
+         return function (graph) {
+           return graph.replace(graph.entity(relationId).updateMember(member, memberIndex));
+         };
+       }
+
+       function actionChangePreset(entityID, oldPreset, newPreset, skipFieldDefaults) {
+         return function action(graph) {
+           var entity = graph.entity(entityID);
+           var geometry = entity.geometry(graph);
+           var tags = entity.tags; // preserve tags that the new preset might care about, if any
+
+           if (oldPreset) tags = oldPreset.unsetTags(tags, geometry, newPreset && newPreset.addTags ? Object.keys(newPreset.addTags) : null);
+           if (newPreset) tags = newPreset.setTags(tags, geometry, skipFieldDefaults);
+           return graph.replace(entity.update({
+             tags: tags
+           }));
+         };
+       }
+
+       function actionChangeTags(entityId, tags) {
+         return function (graph) {
+           var entity = graph.entity(entityId);
+           return graph.replace(entity.update({
+             tags: tags
+           }));
+         };
+       }
+
+       function osmNode() {
+         if (!(this instanceof osmNode)) {
+           return new osmNode().initialize(arguments);
+         } else if (arguments.length) {
+           this.initialize(arguments);
+         }
+       }
+       osmEntity.node = osmNode;
+       osmNode.prototype = Object.create(osmEntity.prototype);
+       Object.assign(osmNode.prototype, {
+         type: 'node',
+         loc: [9999, 9999],
+         extent: function extent() {
+           return new geoExtent(this.loc);
+         },
+         geometry: function geometry(graph) {
+           return graph["transient"](this, 'geometry', function () {
+             return graph.isPoi(this) ? 'point' : 'vertex';
+           });
+         },
+         move: function move(loc) {
+           return this.update({
+             loc: loc
+           });
+         },
+         isDegenerate: function isDegenerate() {
+           return !(Array.isArray(this.loc) && this.loc.length === 2 && this.loc[0] >= -180 && this.loc[0] <= 180 && this.loc[1] >= -90 && this.loc[1] <= 90);
+         },
+         // Inspect tags and geometry to determine which direction(s) this node/vertex points
+         directions: function directions(resolver, projection) {
+           var val;
+           var i; // which tag to use?
+
+           if (this.isHighwayIntersection(resolver) && (this.tags.stop || '').toLowerCase() === 'all') {
+             // all-way stop tag on a highway intersection
+             val = 'all';
+           } else {
+             // generic direction tag
+             val = (this.tags.direction || '').toLowerCase(); // better suffix-style direction tag
+
+             var re = /:direction$/i;
+             var keys = Object.keys(this.tags);
+
+             for (i = 0; i < keys.length; i++) {
+               if (re.test(keys[i])) {
+                 val = this.tags[keys[i]].toLowerCase();
+                 break;
+               }
+             }
+           }
+
+           if (val === '') return [];
+           var cardinal = {
+             north: 0,
+             n: 0,
+             northnortheast: 22,
+             nne: 22,
+             northeast: 45,
+             ne: 45,
+             eastnortheast: 67,
+             ene: 67,
+             east: 90,
+             e: 90,
+             eastsoutheast: 112,
+             ese: 112,
+             southeast: 135,
+             se: 135,
+             southsoutheast: 157,
+             sse: 157,
+             south: 180,
+             s: 180,
+             southsouthwest: 202,
+             ssw: 202,
+             southwest: 225,
+             sw: 225,
+             westsouthwest: 247,
+             wsw: 247,
+             west: 270,
+             w: 270,
+             westnorthwest: 292,
+             wnw: 292,
+             northwest: 315,
+             nw: 315,
+             northnorthwest: 337,
+             nnw: 337
+           };
+           var values = val.split(';');
+           var results = [];
+           values.forEach(function (v) {
+             // swap cardinal for numeric directions
+             if (cardinal[v] !== undefined) {
+               v = cardinal[v];
+             } // numeric direction - just add to results
+
+
+             if (v !== '' && !isNaN(+v)) {
+               results.push(+v);
+               return;
+             } // string direction - inspect parent ways
+
+
+             var lookBackward = this.tags['traffic_sign:backward'] || v === 'backward' || v === 'both' || v === 'all';
+             var lookForward = this.tags['traffic_sign:forward'] || v === 'forward' || v === 'both' || v === 'all';
+             if (!lookForward && !lookBackward) return;
+             var nodeIds = {};
+             resolver.parentWays(this).forEach(function (parent) {
+               var nodes = parent.nodes;
+
+               for (i = 0; i < nodes.length; i++) {
+                 if (nodes[i] === this.id) {
+                   // match current entity
+                   if (lookForward && i > 0) {
+                     nodeIds[nodes[i - 1]] = true; // look back to prev node
+                   }
+
+                   if (lookBackward && i < nodes.length - 1) {
+                     nodeIds[nodes[i + 1]] = true; // look ahead to next node
+                   }
+                 }
+               }
+             }, this);
+             Object.keys(nodeIds).forEach(function (nodeId) {
+               // +90 because geoAngle returns angle from X axis, not Y (north)
+               results.push(geoAngle(this, resolver.entity(nodeId), projection) * (180 / Math.PI) + 90);
+             }, this);
+           }, this);
+           return utilArrayUniq(results);
+         },
+         isCrossing: function isCrossing() {
+           return this.tags.highway === 'crossing' || this.tags.railway && this.tags.railway.indexOf('crossing') !== -1;
+         },
+         isEndpoint: function isEndpoint(resolver) {
+           return resolver["transient"](this, 'isEndpoint', function () {
+             var id = this.id;
+             return resolver.parentWays(this).filter(function (parent) {
+               return !parent.isClosed() && !!parent.affix(id);
+             }).length > 0;
+           });
+         },
+         isConnected: function isConnected(resolver) {
+           return resolver["transient"](this, 'isConnected', function () {
+             var parents = resolver.parentWays(this);
+
+             if (parents.length > 1) {
+               // vertex is connected to multiple parent ways
+               for (var i in parents) {
+                 if (parents[i].geometry(resolver) === 'line' && parents[i].hasInterestingTags()) return true;
+               }
+             } else if (parents.length === 1) {
+               var way = parents[0];
+               var nodes = way.nodes.slice();
+
+               if (way.isClosed()) {
+                 nodes.pop();
+               } // ignore connecting node if closed
+               // return true if vertex appears multiple times (way is self intersecting)
+
+
+               return nodes.indexOf(this.id) !== nodes.lastIndexOf(this.id);
+             }
+
+             return false;
+           });
+         },
+         parentIntersectionWays: function parentIntersectionWays(resolver) {
+           return resolver["transient"](this, 'parentIntersectionWays', function () {
+             return resolver.parentWays(this).filter(function (parent) {
+               return (parent.tags.highway || parent.tags.waterway || parent.tags.railway || parent.tags.aeroway) && parent.geometry(resolver) === 'line';
+             });
+           });
+         },
+         isIntersection: function isIntersection(resolver) {
+           return this.parentIntersectionWays(resolver).length > 1;
+         },
+         isHighwayIntersection: function isHighwayIntersection(resolver) {
+           return resolver["transient"](this, 'isHighwayIntersection', function () {
+             return resolver.parentWays(this).filter(function (parent) {
+               return parent.tags.highway && parent.geometry(resolver) === 'line';
+             }).length > 1;
+           });
+         },
+         isOnAddressLine: function isOnAddressLine(resolver) {
+           return resolver["transient"](this, 'isOnAddressLine', function () {
+             return resolver.parentWays(this).filter(function (parent) {
+               return parent.tags.hasOwnProperty('addr:interpolation') && parent.geometry(resolver) === 'line';
+             }).length > 0;
+           });
+         },
+         asJXON: function asJXON(changeset_id) {
+           var r = {
+             node: {
+               '@id': this.osmId(),
+               '@lon': this.loc[0],
+               '@lat': this.loc[1],
+               '@version': this.version || 0,
+               tag: Object.keys(this.tags).map(function (k) {
+                 return {
+                   keyAttributes: {
+                     k: k,
+                     v: this.tags[k]
+                   }
+                 };
+               }, this)
+             }
+           };
+           if (changeset_id) r.node['@changeset'] = changeset_id;
+           return r;
+         },
+         asGeoJSON: function asGeoJSON() {
+           return {
+             type: 'Point',
+             coordinates: this.loc
+           };
+         }
+       });
+
+       function actionCircularize(wayId, projection, maxAngle) {
+         maxAngle = (maxAngle || 20) * Math.PI / 180;
+
+         var action = function action(graph, t) {
+           if (t === null || !isFinite(t)) t = 1;
+           t = Math.min(Math.max(+t, 0), 1);
+           var way = graph.entity(wayId);
+           var origNodes = {};
+           graph.childNodes(way).forEach(function (node) {
+             if (!origNodes[node.id]) origNodes[node.id] = node;
+           });
+
+           if (!way.isConvex(graph)) {
+             graph = action.makeConvex(graph);
+           }
+
+           var nodes = utilArrayUniq(graph.childNodes(way));
+           var keyNodes = nodes.filter(function (n) {
+             return graph.parentWays(n).length !== 1;
+           });
+           var points = nodes.map(function (n) {
+             return projection(n.loc);
+           });
+           var keyPoints = keyNodes.map(function (n) {
+             return projection(n.loc);
+           });
+           var centroid = points.length === 2 ? geoVecInterp(points[0], points[1], 0.5) : d3_polygonCentroid(points);
+           var radius = d3_median(points, function (p) {
+             return geoVecLength(centroid, p);
+           });
+           var sign = d3_polygonArea(points) > 0 ? 1 : -1;
+           var ids, i, j, k; // we need at least two key nodes for the algorithm to work
+
+           if (!keyNodes.length) {
+             keyNodes = [nodes[0]];
+             keyPoints = [points[0]];
+           }
+
+           if (keyNodes.length === 1) {
+             var index = nodes.indexOf(keyNodes[0]);
+             var oppositeIndex = Math.floor((index + nodes.length / 2) % nodes.length);
+             keyNodes.push(nodes[oppositeIndex]);
+             keyPoints.push(points[oppositeIndex]);
+           } // key points and nodes are those connected to the ways,
+           // they are projected onto the circle, in between nodes are moved
+           // to constant intervals between key nodes, extra in between nodes are
+           // added if necessary.
+
+
+           for (i = 0; i < keyPoints.length; i++) {
+             var nextKeyNodeIndex = (i + 1) % keyNodes.length;
+             var startNode = keyNodes[i];
+             var endNode = keyNodes[nextKeyNodeIndex];
+             var startNodeIndex = nodes.indexOf(startNode);
+             var endNodeIndex = nodes.indexOf(endNode);
+             var numberNewPoints = -1;
+             var indexRange = endNodeIndex - startNodeIndex;
+             var nearNodes = {};
+             var inBetweenNodes = [];
+             var startAngle, endAngle, totalAngle, eachAngle;
+             var angle, loc, node, origNode;
+
+             if (indexRange < 0) {
+               indexRange += nodes.length;
+             } // position this key node
+
+
+             var distance = geoVecLength(centroid, keyPoints[i]) || 1e-4;
+             keyPoints[i] = [centroid[0] + (keyPoints[i][0] - centroid[0]) / distance * radius, centroid[1] + (keyPoints[i][1] - centroid[1]) / distance * radius];
+             loc = projection.invert(keyPoints[i]);
+             node = keyNodes[i];
+             origNode = origNodes[node.id];
+             node = node.move(geoVecInterp(origNode.loc, loc, t));
+             graph = graph.replace(node); // figure out the between delta angle we want to match to
+
+             startAngle = Math.atan2(keyPoints[i][1] - centroid[1], keyPoints[i][0] - centroid[0]);
+             endAngle = Math.atan2(keyPoints[nextKeyNodeIndex][1] - centroid[1], keyPoints[nextKeyNodeIndex][0] - centroid[0]);
+             totalAngle = endAngle - startAngle; // detects looping around -pi/pi
+
+             if (totalAngle * sign > 0) {
+               totalAngle = -sign * (2 * Math.PI - Math.abs(totalAngle));
+             }
+
+             do {
+               numberNewPoints++;
+               eachAngle = totalAngle / (indexRange + numberNewPoints);
+             } while (Math.abs(eachAngle) > maxAngle); // move existing nodes
+
+
+             for (j = 1; j < indexRange; j++) {
+               angle = startAngle + j * eachAngle;
+               loc = projection.invert([centroid[0] + Math.cos(angle) * radius, centroid[1] + Math.sin(angle) * radius]);
+               node = nodes[(j + startNodeIndex) % nodes.length];
+               origNode = origNodes[node.id];
+               nearNodes[node.id] = angle;
+               node = node.move(geoVecInterp(origNode.loc, loc, t));
+               graph = graph.replace(node);
+             } // add new in between nodes if necessary
+
+
+             for (j = 0; j < numberNewPoints; j++) {
+               angle = startAngle + (indexRange + j) * eachAngle;
+               loc = projection.invert([centroid[0] + Math.cos(angle) * radius, centroid[1] + Math.sin(angle) * radius]); // choose a nearnode to use as the original
+
+               var min = Infinity;
+
+               for (var nodeId in nearNodes) {
+                 var nearAngle = nearNodes[nodeId];
+                 var dist = Math.abs(nearAngle - angle);
+
+                 if (dist < min) {
+                   min = dist;
+                   origNode = origNodes[nodeId];
+                 }
+               }
+
+               node = osmNode({
+                 loc: geoVecInterp(origNode.loc, loc, t)
+               });
+               graph = graph.replace(node);
+               nodes.splice(endNodeIndex + j, 0, node);
+               inBetweenNodes.push(node.id);
+             } // Check for other ways that share these keyNodes..
+             // If keyNodes are adjacent in both ways,
+             // we can add inBetweenNodes to that shared way too..
+
+
+             if (indexRange === 1 && inBetweenNodes.length) {
+               var startIndex1 = way.nodes.lastIndexOf(startNode.id);
+               var endIndex1 = way.nodes.lastIndexOf(endNode.id);
+               var wayDirection1 = endIndex1 - startIndex1;
+
+               if (wayDirection1 < -1) {
+                 wayDirection1 = 1;
+               }
+
+               var parentWays = graph.parentWays(keyNodes[i]);
+
+               for (j = 0; j < parentWays.length; j++) {
+                 var sharedWay = parentWays[j];
+                 if (sharedWay === way) continue;
+
+                 if (sharedWay.areAdjacent(startNode.id, endNode.id)) {
+                   var startIndex2 = sharedWay.nodes.lastIndexOf(startNode.id);
+                   var endIndex2 = sharedWay.nodes.lastIndexOf(endNode.id);
+                   var wayDirection2 = endIndex2 - startIndex2;
+                   var insertAt = endIndex2;
+
+                   if (wayDirection2 < -1) {
+                     wayDirection2 = 1;
+                   }
+
+                   if (wayDirection1 !== wayDirection2) {
+                     inBetweenNodes.reverse();
+                     insertAt = startIndex2;
+                   }
+
+                   for (k = 0; k < inBetweenNodes.length; k++) {
+                     sharedWay = sharedWay.addNode(inBetweenNodes[k], insertAt + k);
+                   }
+
+                   graph = graph.replace(sharedWay);
+                 }
+               }
+             }
+           } // update the way to have all the new nodes
+
+
+           ids = nodes.map(function (n) {
+             return n.id;
+           });
+           ids.push(ids[0]);
+           way = way.update({
+             nodes: ids
+           });
+           graph = graph.replace(way);
+           return graph;
+         };
+
+         action.makeConvex = function (graph) {
+           var way = graph.entity(wayId);
+           var nodes = utilArrayUniq(graph.childNodes(way));
+           var points = nodes.map(function (n) {
+             return projection(n.loc);
+           });
+           var sign = d3_polygonArea(points) > 0 ? 1 : -1;
+           var hull = d3_polygonHull(points);
+           var i, j; // D3 convex hulls go counterclockwise..
+
+           if (sign === -1) {
+             nodes.reverse();
+             points.reverse();
+           }
+
+           for (i = 0; i < hull.length - 1; i++) {
+             var startIndex = points.indexOf(hull[i]);
+             var endIndex = points.indexOf(hull[i + 1]);
+             var indexRange = endIndex - startIndex;
+
+             if (indexRange < 0) {
+               indexRange += nodes.length;
+             } // move interior nodes to the surface of the convex hull..
+
+
+             for (j = 1; j < indexRange; j++) {
+               var point = geoVecInterp(hull[i], hull[i + 1], j / indexRange);
+               var node = nodes[(j + startIndex) % nodes.length].move(projection.invert(point));
+               graph = graph.replace(node);
+             }
+           }
+
+           return graph;
+         };
+
+         action.disabled = function (graph) {
+           if (!graph.entity(wayId).isClosed()) {
+             return 'not_closed';
+           } //disable when already circular
+
+
+           var way = graph.entity(wayId);
+           var nodes = utilArrayUniq(graph.childNodes(way));
+           var points = nodes.map(function (n) {
+             return projection(n.loc);
+           });
+           var hull = d3_polygonHull(points);
+           var epsilonAngle = Math.PI / 180;
+
+           if (hull.length !== points.length || hull.length < 3) {
+             return false;
+           }
+
+           var centroid = d3_polygonCentroid(points);
+           var radius = geoVecLengthSquare(centroid, points[0]);
+           var i, actualPoint; // compare distances between centroid and points
+
+           for (i = 0; i < hull.length; i++) {
+             actualPoint = hull[i];
+             var actualDist = geoVecLengthSquare(actualPoint, centroid);
+             var diff = Math.abs(actualDist - radius); //compare distances with epsilon-error (5%)
+
+             if (diff > 0.05 * radius) {
+               return false;
+             }
+           } //check if central angles are smaller than maxAngle
+
+
+           for (i = 0; i < hull.length; i++) {
+             actualPoint = hull[i];
+             var nextPoint = hull[(i + 1) % hull.length];
+             var startAngle = Math.atan2(actualPoint[1] - centroid[1], actualPoint[0] - centroid[0]);
+             var endAngle = Math.atan2(nextPoint[1] - centroid[1], nextPoint[0] - centroid[0]);
+             var angle = endAngle - startAngle;
+
+             if (angle < 0) {
+               angle = -angle;
+             }
+
+             if (angle > Math.PI) {
+               angle = 2 * Math.PI - angle;
+             }
+
+             if (angle > maxAngle + epsilonAngle) {
+               return false;
+             }
+           }
+
+           return 'already_circular';
+         };
+
+         action.transitionable = true;
+         return action;
+       }
+
+       function actionDeleteWay(wayID) {
+         function canDeleteNode(node, graph) {
+           // don't delete nodes still attached to ways or relations
+           if (graph.parentWays(node).length || graph.parentRelations(node).length) return false;
+           var geometries = osmNodeGeometriesForTags(node.tags); // don't delete if this node can be a standalone point
+
+           if (geometries.point) return false; // delete if this node only be a vertex
+
+           if (geometries.vertex) return true; // iD doesn't know if this should be a point or vertex,
+           // so only delete if there are no interesting tags
+
+           return !node.hasInterestingTags();
+         }
+
+         var action = function action(graph) {
+           var way = graph.entity(wayID);
+           graph.parentRelations(way).forEach(function (parent) {
+             parent = parent.removeMembersWithID(wayID);
+             graph = graph.replace(parent);
+
+             if (parent.isDegenerate()) {
+               graph = actionDeleteRelation(parent.id)(graph);
+             }
+           });
+           new Set(way.nodes).forEach(function (nodeID) {
+             graph = graph.replace(way.removeNode(nodeID));
+             var node = graph.entity(nodeID);
+
+             if (canDeleteNode(node, graph)) {
+               graph = graph.remove(node);
+             }
+           });
+           return graph.remove(way);
+         };
+
+         return action;
+       }
+
+       function actionDeleteMultiple(ids) {
+         var actions = {
+           way: actionDeleteWay,
+           node: actionDeleteNode,
+           relation: actionDeleteRelation
+         };
+
+         var action = function action(graph) {
+           ids.forEach(function (id) {
+             if (graph.hasEntity(id)) {
+               // It may have been deleted already.
+               graph = actions[graph.entity(id).type](id)(graph);
+             }
+           });
+           return graph;
+         };
+
+         return action;
+       }
+
+       function actionDeleteRelation(relationID, allowUntaggedMembers) {
+         function canDeleteEntity(entity, graph) {
+           return !graph.parentWays(entity).length && !graph.parentRelations(entity).length && !entity.hasInterestingTags() && !allowUntaggedMembers;
+         }
+
+         var action = function action(graph) {
+           var relation = graph.entity(relationID);
+           graph.parentRelations(relation).forEach(function (parent) {
+             parent = parent.removeMembersWithID(relationID);
+             graph = graph.replace(parent);
+
+             if (parent.isDegenerate()) {
+               graph = actionDeleteRelation(parent.id)(graph);
+             }
+           });
+           var memberIDs = utilArrayUniq(relation.members.map(function (m) {
+             return m.id;
+           }));
+           memberIDs.forEach(function (memberID) {
+             graph = graph.replace(relation.removeMembersWithID(memberID));
+             var entity = graph.entity(memberID);
+
+             if (canDeleteEntity(entity, graph)) {
+               graph = actionDeleteMultiple([memberID])(graph);
+             }
+           });
+           return graph.remove(relation);
+         };
+
+         return action;
+       }
+
+       function actionDeleteNode(nodeId) {
+         var action = function action(graph) {
+           var node = graph.entity(nodeId);
+           graph.parentWays(node).forEach(function (parent) {
+             parent = parent.removeNode(nodeId);
+             graph = graph.replace(parent);
+
+             if (parent.isDegenerate()) {
+               graph = actionDeleteWay(parent.id)(graph);
+             }
+           });
+           graph.parentRelations(node).forEach(function (parent) {
+             parent = parent.removeMembersWithID(nodeId);
+             graph = graph.replace(parent);
+
+             if (parent.isDegenerate()) {
+               graph = actionDeleteRelation(parent.id)(graph);
+             }
+           });
+           return graph.remove(node);
+         };
+
+         return action;
+       }
+
+       //
+       // First choose a node to be the survivor, with preference given
+       // to the oldest existing (not new) and "interesting" node.
+       //
+       // Tags and relation memberships of of non-surviving nodes are merged
+       // to the survivor.
+       //
+       // This is the inverse of `iD.actionDisconnect`.
+       //
+       // Reference:
+       //   https://github.com/openstreetmap/potlatch2/blob/master/net/systemeD/halcyon/connection/actions/MergeNodesAction.as
+       //   https://github.com/openstreetmap/josm/blob/mirror/src/org/openstreetmap/josm/actions/MergeNodesAction.java
+       //
+
+       function actionConnect(nodeIDs) {
+         var action = function action(graph) {
+           var survivor;
+           var node;
+           var parents;
+           var i, j; // Select the node with the ID passed as parameter if it is in the list,
+           // otherwise select the node with the oldest ID as the survivor, or the
+           // last one if there are only new nodes.
+
+           nodeIDs.reverse();
+           var interestingIDs = [];
+
+           for (i = 0; i < nodeIDs.length; i++) {
+             node = graph.entity(nodeIDs[i]);
+
+             if (node.hasInterestingTags()) {
+               if (!node.isNew()) {
+                 interestingIDs.push(node.id);
+               }
+             }
+           }
+
+           survivor = graph.entity(utilOldestID(interestingIDs.length > 0 ? interestingIDs : nodeIDs)); // Replace all non-surviving nodes with the survivor and merge tags.
+
+           for (i = 0; i < nodeIDs.length; i++) {
+             node = graph.entity(nodeIDs[i]);
+             if (node.id === survivor.id) continue;
+             parents = graph.parentWays(node);
+
+             for (j = 0; j < parents.length; j++) {
+               graph = graph.replace(parents[j].replaceNode(node.id, survivor.id));
+             }
+
+             parents = graph.parentRelations(node);
+
+             for (j = 0; j < parents.length; j++) {
+               graph = graph.replace(parents[j].replaceMember(node, survivor));
+             }
+
+             survivor = survivor.mergeTags(node.tags);
+             graph = actionDeleteNode(node.id)(graph);
+           }
+
+           graph = graph.replace(survivor); // find and delete any degenerate ways created by connecting adjacent vertices
+
+           parents = graph.parentWays(survivor);
+
+           for (i = 0; i < parents.length; i++) {
+             if (parents[i].isDegenerate()) {
+               graph = actionDeleteWay(parents[i].id)(graph);
+             }
+           }
+
+           return graph;
+         };
+
+         action.disabled = function (graph) {
+           var seen = {};
+           var restrictionIDs = [];
+           var survivor;
+           var node, way;
+           var relations, relation, role;
+           var i, j, k; // Select the node with the oldest ID as the survivor.
+
+           survivor = graph.entity(utilOldestID(nodeIDs)); // 1. disable if the nodes being connected have conflicting relation roles
+
+           for (i = 0; i < nodeIDs.length; i++) {
+             node = graph.entity(nodeIDs[i]);
+             relations = graph.parentRelations(node);
+
+             for (j = 0; j < relations.length; j++) {
+               relation = relations[j];
+               role = relation.memberById(node.id).role || ''; // if this node is a via node in a restriction, remember for later
+
+               if (relation.hasFromViaTo()) {
+                 restrictionIDs.push(relation.id);
+               }
+
+               if (seen[relation.id] !== undefined && seen[relation.id] !== role) {
+                 return 'relation';
+               } else {
+                 seen[relation.id] = role;
+               }
+             }
+           } // gather restrictions for parent ways
+
+
+           for (i = 0; i < nodeIDs.length; i++) {
+             node = graph.entity(nodeIDs[i]);
+             var parents = graph.parentWays(node);
+
+             for (j = 0; j < parents.length; j++) {
+               var parent = parents[j];
+               relations = graph.parentRelations(parent);
+
+               for (k = 0; k < relations.length; k++) {
+                 relation = relations[k];
+
+                 if (relation.hasFromViaTo()) {
+                   restrictionIDs.push(relation.id);
+                 }
+               }
+             }
+           } // test restrictions
+
+
+           restrictionIDs = utilArrayUniq(restrictionIDs);
+
+           for (i = 0; i < restrictionIDs.length; i++) {
+             relation = graph.entity(restrictionIDs[i]);
+             if (!relation.isComplete(graph)) continue;
+             var memberWays = relation.members.filter(function (m) {
+               return m.type === 'way';
+             }).map(function (m) {
+               return graph.entity(m.id);
+             });
+             memberWays = utilArrayUniq(memberWays);
+             var f = relation.memberByRole('from');
+             var t = relation.memberByRole('to');
+             var isUturn = f.id === t.id; // 2a. disable if connection would damage a restriction
+             // (a key node is a node at the junction of ways)
+
+             var nodes = {
+               from: [],
+               via: [],
+               to: [],
+               keyfrom: [],
+               keyto: []
+             };
+
+             for (j = 0; j < relation.members.length; j++) {
+               collectNodes(relation.members[j], nodes);
+             }
+
+             nodes.keyfrom = utilArrayUniq(nodes.keyfrom.filter(hasDuplicates));
+             nodes.keyto = utilArrayUniq(nodes.keyto.filter(hasDuplicates));
+             var filter = keyNodeFilter(nodes.keyfrom, nodes.keyto);
+             nodes.from = nodes.from.filter(filter);
+             nodes.via = nodes.via.filter(filter);
+             nodes.to = nodes.to.filter(filter);
+             var connectFrom = false;
+             var connectVia = false;
+             var connectTo = false;
+             var connectKeyFrom = false;
+             var connectKeyTo = false;
+
+             for (j = 0; j < nodeIDs.length; j++) {
+               var n = nodeIDs[j];
+
+               if (nodes.from.indexOf(n) !== -1) {
+                 connectFrom = true;
+               }
+
+               if (nodes.via.indexOf(n) !== -1) {
+                 connectVia = true;
+               }
+
+               if (nodes.to.indexOf(n) !== -1) {
+                 connectTo = true;
+               }
+
+               if (nodes.keyfrom.indexOf(n) !== -1) {
+                 connectKeyFrom = true;
+               }
+
+               if (nodes.keyto.indexOf(n) !== -1) {
+                 connectKeyTo = true;
+               }
+             }
+
+             if (connectFrom && connectTo && !isUturn) {
+               return 'restriction';
+             }
+
+             if (connectFrom && connectVia) {
+               return 'restriction';
+             }
+
+             if (connectTo && connectVia) {
+               return 'restriction';
+             } // connecting to a key node -
+             // if both nodes are on a member way (i.e. part of the turn restriction),
+             // the connecting node must be adjacent to the key node.
+
+
+             if (connectKeyFrom || connectKeyTo) {
+               if (nodeIDs.length !== 2) {
+                 return 'restriction';
+               }
+
+               var n0 = null;
+               var n1 = null;
+
+               for (j = 0; j < memberWays.length; j++) {
+                 way = memberWays[j];
+
+                 if (way.contains(nodeIDs[0])) {
+                   n0 = nodeIDs[0];
+                 }
+
+                 if (way.contains(nodeIDs[1])) {
+                   n1 = nodeIDs[1];
+                 }
+               }
+
+               if (n0 && n1) {
+                 // both nodes are part of the restriction
+                 var ok = false;
+
+                 for (j = 0; j < memberWays.length; j++) {
+                   way = memberWays[j];
+
+                   if (way.areAdjacent(n0, n1)) {
+                     ok = true;
+                     break;
+                   }
+                 }
+
+                 if (!ok) {
+                   return 'restriction';
+                 }
+               }
+             } // 2b. disable if nodes being connected will destroy a member way in a restriction
+             // (to test, make a copy and try actually connecting the nodes)
+
+
+             for (j = 0; j < memberWays.length; j++) {
+               way = memberWays[j].update({}); // make copy
+
+               for (k = 0; k < nodeIDs.length; k++) {
+                 if (nodeIDs[k] === survivor.id) continue;
+
+                 if (way.areAdjacent(nodeIDs[k], survivor.id)) {
+                   way = way.removeNode(nodeIDs[k]);
+                 } else {
+                   way = way.replaceNode(nodeIDs[k], survivor.id);
+                 }
+               }
+
+               if (way.isDegenerate()) {
+                 return 'restriction';
+               }
+             }
+           }
+
+           return false; // if a key node appears multiple times (indexOf !== lastIndexOf) it's a FROM-VIA or TO-VIA junction
+
+           function hasDuplicates(n, i, arr) {
+             return arr.indexOf(n) !== arr.lastIndexOf(n);
+           }
+
+           function keyNodeFilter(froms, tos) {
+             return function (n) {
+               return froms.indexOf(n) === -1 && tos.indexOf(n) === -1;
+             };
+           }
+
+           function collectNodes(member, collection) {
+             var entity = graph.hasEntity(member.id);
+             if (!entity) return;
+             var role = member.role || '';
+
+             if (!collection[role]) {
+               collection[role] = [];
+             }
+
+             if (member.type === 'node') {
+               collection[role].push(member.id);
+
+               if (role === 'via') {
+                 collection.keyfrom.push(member.id);
+                 collection.keyto.push(member.id);
+               }
+             } else if (member.type === 'way') {
+               collection[role].push.apply(collection[role], entity.nodes);
+
+               if (role === 'from' || role === 'via') {
+                 collection.keyfrom.push(entity.first());
+                 collection.keyfrom.push(entity.last());
+               }
+
+               if (role === 'to' || role === 'via') {
+                 collection.keyto.push(entity.first());
+                 collection.keyto.push(entity.last());
+               }
+             }
+           }
+         };
+
+         return action;
+       }
+
+       function actionCopyEntities(ids, fromGraph) {
+         var _copies = {};
+
+         var action = function action(graph) {
+           ids.forEach(function (id) {
+             fromGraph.entity(id).copy(fromGraph, _copies);
+           });
+
+           for (var id in _copies) {
+             graph = graph.replace(_copies[id]);
+           }
+
+           return graph;
+         };
+
+         action.copies = function () {
+           return _copies;
+         };
+
+         return action;
+       }
+
+       function actionDeleteMember(relationId, memberIndex) {
+         return function (graph) {
+           var relation = graph.entity(relationId).removeMember(memberIndex);
+           graph = graph.replace(relation);
+
+           if (relation.isDegenerate()) {
+             graph = actionDeleteRelation(relation.id)(graph);
+           }
+
+           return graph;
+         };
+       }
+
+       function actionDiscardTags(difference, discardTags) {
+         discardTags = discardTags || {};
+         return function (graph) {
+           difference.modified().forEach(checkTags);
+           difference.created().forEach(checkTags);
+           return graph;
+
+           function checkTags(entity) {
+             var keys = Object.keys(entity.tags);
+             var didDiscard = false;
+             var tags = {};
+
+             for (var i = 0; i < keys.length; i++) {
+               var k = keys[i];
+
+               if (discardTags[k] || !entity.tags[k]) {
+                 didDiscard = true;
+               } else {
+                 tags[k] = entity.tags[k];
+               }
+             }
+
+             if (didDiscard) {
+               graph = graph.replace(entity.update({
+                 tags: tags
+               }));
+             }
+           }
+         };
+       }
+
+       //
+       // Optionally, disconnect only the given ways.
+       //
+       // For testing convenience, accepts an ID to assign to the (first) new node.
+       // Normally, this will be undefined and the way will automatically
+       // be assigned a new ID.
+       //
+       // This is the inverse of `iD.actionConnect`.
+       //
+       // Reference:
+       //   https://github.com/openstreetmap/potlatch2/blob/master/net/systemeD/halcyon/connection/actions/UnjoinNodeAction.as
+       //   https://github.com/openstreetmap/josm/blob/mirror/src/org/openstreetmap/josm/actions/UnGlueAction.java
+       //
+
+       function actionDisconnect(nodeId, newNodeId) {
+         var wayIds;
+         var disconnectableRelationTypes = {
+           'associatedStreet': true,
+           'enforcement': true,
+           'site': true
+         };
+
+         var action = function action(graph) {
+           var node = graph.entity(nodeId);
+           var connections = action.connections(graph);
+           connections.forEach(function (connection) {
+             var way = graph.entity(connection.wayID);
+             var newNode = osmNode({
+               id: newNodeId,
+               loc: node.loc,
+               tags: node.tags
+             });
+             graph = graph.replace(newNode);
+
+             if (connection.index === 0 && way.isArea()) {
+               // replace shared node with shared node..
+               graph = graph.replace(way.replaceNode(way.nodes[0], newNode.id));
+             } else if (way.isClosed() && connection.index === way.nodes.length - 1) {
+               // replace closing node with new new node..
+               graph = graph.replace(way.unclose().addNode(newNode.id));
+             } else {
+               // replace shared node with multiple new nodes..
+               graph = graph.replace(way.updateNode(newNode.id, connection.index));
+             }
+           });
+           return graph;
+         };
+
+         action.connections = function (graph) {
+           var candidates = [];
+           var keeping = false;
+           var parentWays = graph.parentWays(graph.entity(nodeId));
+           var way, waynode;
+
+           for (var i = 0; i < parentWays.length; i++) {
+             way = parentWays[i];
+
+             if (wayIds && wayIds.indexOf(way.id) === -1) {
+               keeping = true;
+               continue;
+             }
+
+             if (way.isArea() && way.nodes[0] === nodeId) {
+               candidates.push({
+                 wayID: way.id,
+                 index: 0
+               });
+             } else {
+               for (var j = 0; j < way.nodes.length; j++) {
+                 waynode = way.nodes[j];
+
+                 if (waynode === nodeId) {
+                   if (way.isClosed() && parentWays.length > 1 && wayIds && wayIds.indexOf(way.id) !== -1 && j === way.nodes.length - 1) {
+                     continue;
+                   }
+
+                   candidates.push({
+                     wayID: way.id,
+                     index: j
+                   });
+                 }
+               }
+             }
+           }
+
+           return keeping ? candidates : candidates.slice(1);
+         };
+
+         action.disabled = function (graph) {
+           var connections = action.connections(graph);
+           if (connections.length === 0) return 'not_connected';
+           var parentWays = graph.parentWays(graph.entity(nodeId));
+           var seenRelationIds = {};
+           var sharedRelation;
+           parentWays.forEach(function (way) {
+             var relations = graph.parentRelations(way);
+             relations.filter(function (relation) {
+               return !disconnectableRelationTypes[relation.tags.type];
+             }).forEach(function (relation) {
+               if (relation.id in seenRelationIds) {
+                 if (wayIds) {
+                   if (wayIds.indexOf(way.id) !== -1 || wayIds.indexOf(seenRelationIds[relation.id]) !== -1) {
+                     sharedRelation = relation;
+                   }
+                 } else {
+                   sharedRelation = relation;
+                 }
+               } else {
+                 seenRelationIds[relation.id] = way.id;
+               }
+             });
+           });
+           if (sharedRelation) return 'relation';
+         };
+
+         action.limitWays = function (val) {
+           if (!arguments.length) return wayIds;
+           wayIds = val;
+           return action;
+         };
+
+         return action;
+       }
+
+       function actionExtract(entityID, projection) {
+         var extractedNodeID;
+
+         var action = function action(graph) {
+           var entity = graph.entity(entityID);
+
+           if (entity.type === 'node') {
+             return extractFromNode(entity, graph);
+           }
+
+           return extractFromWayOrRelation(entity, graph);
+         };
+
+         function extractFromNode(node, graph) {
+           extractedNodeID = node.id; // Create a new node to replace the one we will detach
+
+           var replacement = osmNode({
+             loc: node.loc
+           });
+           graph = graph.replace(replacement); // Process each way in turn, updating the graph as we go
+
+           graph = graph.parentWays(node).reduce(function (accGraph, parentWay) {
+             return accGraph.replace(parentWay.replaceNode(entityID, replacement.id));
+           }, graph); // Process any relations too
+
+           return graph.parentRelations(node).reduce(function (accGraph, parentRel) {
+             return accGraph.replace(parentRel.replaceMember(node, replacement));
+           }, graph);
+         }
+
+         function extractFromWayOrRelation(entity, graph) {
+           var fromGeometry = entity.geometry(graph);
+           var keysToCopyAndRetain = ['source', 'wheelchair'];
+           var keysToRetain = ['area'];
+           var buildingKeysToRetain = ['architect', 'building', 'height', 'layer'];
+           var extractedLoc = d3_geoPath(projection).centroid(entity.asGeoJSON(graph));
+           extractedLoc = extractedLoc && projection.invert(extractedLoc);
+
+           if (!extractedLoc || !isFinite(extractedLoc[0]) || !isFinite(extractedLoc[1])) {
+             extractedLoc = entity.extent(graph).center();
+           }
+
+           var indoorAreaValues = {
+             area: true,
+             corridor: true,
+             elevator: true,
+             level: true,
+             room: true
+           };
+           var isBuilding = entity.tags.building && entity.tags.building !== 'no' || entity.tags['building:part'] && entity.tags['building:part'] !== 'no';
+           var isIndoorArea = fromGeometry === 'area' && entity.tags.indoor && indoorAreaValues[entity.tags.indoor];
+           var entityTags = Object.assign({}, entity.tags); // shallow copy
+
+           var pointTags = {};
+
+           for (var key in entityTags) {
+             if (entity.type === 'relation' && key === 'type') {
+               continue;
+             }
+
+             if (keysToRetain.indexOf(key) !== -1) {
+               continue;
+             }
+
+             if (isBuilding) {
+               // don't transfer building-related tags
+               if (buildingKeysToRetain.indexOf(key) !== -1 || key.match(/^building:.{1,}/) || key.match(/^roof:.{1,}/)) continue;
+             } // leave `indoor` tag on the area
+
+
+             if (isIndoorArea && key === 'indoor') {
+               continue;
+             } // copy the tag from the entity to the point
+
+
+             pointTags[key] = entityTags[key]; // leave addresses and some other tags so they're on both features
+
+             if (keysToCopyAndRetain.indexOf(key) !== -1 || key.match(/^addr:.{1,}/)) {
+               continue;
+             } else if (isIndoorArea && key === 'level') {
+               // leave `level` on both features
+               continue;
+             } // remove the tag from the entity
+
+
+             delete entityTags[key];
+           }
+
+           if (!isBuilding && !isIndoorArea && fromGeometry === 'area') {
+             // ensure that areas keep area geometry
+             entityTags.area = 'yes';
+           }
+
+           var replacement = osmNode({
+             loc: extractedLoc,
+             tags: pointTags
+           });
+           graph = graph.replace(replacement);
+           extractedNodeID = replacement.id;
+           return graph.replace(entity.update({
+             tags: entityTags
+           }));
+         }
+
+         action.getExtractedNodeID = function () {
+           return extractedNodeID;
+         };
+
+         return action;
+       }
+
+       //
+       // This is the inverse of `iD.actionSplit`.
+       //
+       // Reference:
+       //   https://github.com/systemed/potlatch2/blob/master/net/systemeD/halcyon/connection/actions/MergeWaysAction.as
+       //   https://github.com/openstreetmap/josm/blob/mirror/src/org/openstreetmap/josm/actions/CombineWayAction.java
+       //
+
+       function actionJoin(ids) {
+         function groupEntitiesByGeometry(graph) {
+           var entities = ids.map(function (id) {
+             return graph.entity(id);
+           });
+           return Object.assign({
+             line: []
+           }, utilArrayGroupBy(entities, function (entity) {
+             return entity.geometry(graph);
+           }));
+         }
+
+         var action = function action(graph) {
+           var ways = ids.map(graph.entity, graph); // Prefer to keep an existing way.
+           // if there are multiple existing ways, keep the oldest one
+           // the oldest way is determined by the ID of the way.
+
+           var survivorID = utilOldestID(ways.map(function (way) {
+             return way.id;
+           })); // if any of the ways are sided (e.g. coastline, cliff, kerb)
+           // sort them first so they establish the overall order - #6033
+
+           ways.sort(function (a, b) {
+             var aSided = a.isSided();
+             var bSided = b.isSided();
+             return aSided && !bSided ? -1 : bSided && !aSided ? 1 : 0;
+           });
+           var sequences = osmJoinWays(ways, graph);
+           var joined = sequences[0]; // We might need to reverse some of these ways before joining them.  #4688
+           // `joined.actions` property will contain any actions we need to apply.
+
+           graph = sequences.actions.reduce(function (g, action) {
+             return action(g);
+           }, graph);
+           var survivor = graph.entity(survivorID);
+           survivor = survivor.update({
+             nodes: joined.nodes.map(function (n) {
+               return n.id;
+             })
+           });
+           graph = graph.replace(survivor);
+           joined.forEach(function (way) {
+             if (way.id === survivorID) return;
+             graph.parentRelations(way).forEach(function (parent) {
+               graph = graph.replace(parent.replaceMember(way, survivor));
+             });
+             survivor = survivor.mergeTags(way.tags);
+             graph = graph.replace(survivor);
+             graph = actionDeleteWay(way.id)(graph);
+           }); // Finds if the join created a single-member multipolygon,
+           // and if so turns it into a basic area instead
+
+           function checkForSimpleMultipolygon() {
+             if (!survivor.isClosed()) return;
+             var multipolygons = graph.parentMultipolygons(survivor).filter(function (multipolygon) {
+               // find multipolygons where the survivor is the only member
+               return multipolygon.members.length === 1;
+             }); // skip if this is the single member of multiple multipolygons
+
+             if (multipolygons.length !== 1) return;
+             var multipolygon = multipolygons[0];
+
+             for (var key in survivor.tags) {
+               if (multipolygon.tags[key] && // don't collapse if tags cannot be cleanly merged
+               multipolygon.tags[key] !== survivor.tags[key]) return;
+             }
+
+             survivor = survivor.mergeTags(multipolygon.tags);
+             graph = graph.replace(survivor);
+             graph = actionDeleteRelation(multipolygon.id, true
+             /* allow untagged members */
+             )(graph);
+             var tags = Object.assign({}, survivor.tags);
+
+             if (survivor.geometry(graph) !== 'area') {
+               // ensure the feature persists as an area
+               tags.area = 'yes';
+             }
+
+             delete tags.type; // remove type=multipolygon
+
+             survivor = survivor.update({
+               tags: tags
+             });
+             graph = graph.replace(survivor);
+           }
+
+           checkForSimpleMultipolygon();
+           return graph;
+         }; // Returns the number of nodes the resultant way is expected to have
+
+
+         action.resultingWayNodesLength = function (graph) {
+           return ids.reduce(function (count, id) {
+             return count + graph.entity(id).nodes.length;
+           }, 0) - ids.length - 1;
+         };
+
+         action.disabled = function (graph) {
+           var geometries = groupEntitiesByGeometry(graph);
+
+           if (ids.length < 2 || ids.length !== geometries.line.length) {
+             return 'not_eligible';
+           }
+
+           var joined = osmJoinWays(ids.map(graph.entity, graph), graph);
+
+           if (joined.length > 1) {
+             return 'not_adjacent';
+           }
+
+           var i; // All joined ways must belong to the same set of (non-restriction) relations.
+           // Restriction relations have different logic, below, which allows some cases
+           // this prohibits, and prohibits some cases this allows.
+
+           var sortedParentRelations = function sortedParentRelations(id) {
+             return graph.parentRelations(graph.entity(id)).filter(function (rel) {
+               return !rel.isRestriction() && !rel.isConnectivity();
+             }).sort(function (a, b) {
+               return a.id - b.id;
+             });
+           };
+
+           var relsA = sortedParentRelations(ids[0]);
+
+           for (i = 1; i < ids.length; i++) {
+             var relsB = sortedParentRelations(ids[i]);
+
+             if (!utilArrayIdentical(relsA, relsB)) {
+               return 'conflicting_relations';
+             }
+           } // Loop through all combinations of path-pairs
+           // to check potential intersections between all pairs
+
+
+           for (i = 0; i < ids.length - 1; i++) {
+             for (var j = i + 1; j < ids.length; j++) {
+               var path1 = graph.childNodes(graph.entity(ids[i])).map(function (e) {
+                 return e.loc;
+               });
+               var path2 = graph.childNodes(graph.entity(ids[j])).map(function (e) {
+                 return e.loc;
+               });
+               var intersections = geoPathIntersections(path1, path2); // Check if intersections are just nodes lying on top of
+               // each other/the line, as opposed to crossing it
+
+               var common = utilArrayIntersection(joined[0].nodes.map(function (n) {
+                 return n.loc.toString();
+               }), intersections.map(function (n) {
+                 return n.toString();
+               }));
+
+               if (common.length !== intersections.length) {
+                 return 'paths_intersect';
+               }
+             }
+           }
+
+           var nodeIds = joined[0].nodes.map(function (n) {
+             return n.id;
+           }).slice(1, -1);
+           var relation;
+           var tags = {};
+           var conflicting = false;
+           joined[0].forEach(function (way) {
+             var parents = graph.parentRelations(way);
+             parents.forEach(function (parent) {
+               if ((parent.isRestriction() || parent.isConnectivity()) && parent.members.some(function (m) {
+                 return nodeIds.indexOf(m.id) >= 0;
+               })) {
+                 relation = parent;
+               }
+             });
+
+             for (var k in way.tags) {
+               if (!(k in tags)) {
+                 tags[k] = way.tags[k];
+               } else if (tags[k] && osmIsInterestingTag(k) && tags[k] !== way.tags[k]) {
+                 conflicting = true;
+               }
+             }
+           });
+
+           if (relation) {
+             return relation.isRestriction() ? 'restriction' : 'connectivity';
+           }
+
+           if (conflicting) {
+             return 'conflicting_tags';
+           }
+         };
+
+         return action;
+       }
+
+       function actionMerge(ids) {
+         function groupEntitiesByGeometry(graph) {
+           var entities = ids.map(function (id) {
+             return graph.entity(id);
+           });
+           return Object.assign({
+             point: [],
+             area: [],
+             line: [],
+             relation: []
+           }, utilArrayGroupBy(entities, function (entity) {
+             return entity.geometry(graph);
+           }));
+         }
+
+         var action = function action(graph) {
+           var geometries = groupEntitiesByGeometry(graph);
+           var target = geometries.area[0] || geometries.line[0];
+           var points = geometries.point;
+           points.forEach(function (point) {
+             target = target.mergeTags(point.tags);
+             graph = graph.replace(target);
+             graph.parentRelations(point).forEach(function (parent) {
+               graph = graph.replace(parent.replaceMember(point, target));
+             });
+             var nodes = utilArrayUniq(graph.childNodes(target));
+             var removeNode = point;
+
+             if (!point.isNew()) {
+               // Try to preserve the original point if it already has
+               // an ID in the database.
+               var inserted = false;
+
+               var canBeReplaced = function canBeReplaced(node) {
+                 return !(graph.parentWays(node).length > 1 || graph.parentRelations(node).length);
+               };
+
+               var replaceNode = function replaceNode(node) {
+                 graph = graph.replace(point.update({
+                   tags: node.tags,
+                   loc: node.loc
+                 }));
+                 target = target.replaceNode(node.id, point.id);
+                 graph = graph.replace(target);
+                 removeNode = node;
+                 inserted = true;
+               };
+
+               var i;
+               var node; // First, try to replace a new child node on the target way.
+
+               for (i = 0; i < nodes.length; i++) {
+                 node = nodes[i];
+
+                 if (canBeReplaced(node) && node.isNew()) {
+                   replaceNode(node);
+                   break;
+                 }
+               }
+
+               if (!inserted && point.hasInterestingTags()) {
+                 // No new child node found, try to find an existing, but
+                 // uninteresting child node instead.
+                 for (i = 0; i < nodes.length; i++) {
+                   node = nodes[i];
+
+                   if (canBeReplaced(node) && !node.hasInterestingTags()) {
+                     replaceNode(node);
+                     break;
+                   }
+                 }
+
+                 if (!inserted) {
+                   // Still not inserted, try to find an existing, interesting,
+                   // but more recent child node.
+                   for (i = 0; i < nodes.length; i++) {
+                     node = nodes[i];
+
+                     if (canBeReplaced(node) && utilCompareIDs(point.id, node.id) < 0) {
+                       replaceNode(node);
+                       break;
+                     }
+                   }
+                 } // If the point still hasn't been inserted, we give up.
+                 // There are more interesting or older nodes on the way.
+
+               }
+             }
+
+             graph = graph.remove(removeNode);
+           });
+
+           if (target.tags.area === 'yes') {
+             var tags = Object.assign({}, target.tags); // shallow copy
+
+             delete tags.area;
+
+             if (osmTagSuggestingArea(tags)) {
+               // remove the `area` tag if area geometry is now implied - #3851
+               target = target.update({
+                 tags: tags
+               });
+               graph = graph.replace(target);
+             }
+           }
+
+           return graph;
+         };
+
+         action.disabled = function (graph) {
+           var geometries = groupEntitiesByGeometry(graph);
+
+           if (geometries.point.length === 0 || geometries.area.length + geometries.line.length !== 1 || geometries.relation.length !== 0) {
+             return 'not_eligible';
+           }
+         };
+
+         return action;
+       }
+
+       //
+       // 1. move all the nodes to a common location
+       // 2. `actionConnect` them
+
+       function actionMergeNodes(nodeIDs, loc) {
+         // If there is a single "interesting" node, use that as the location.
+         // Otherwise return the average location of all the nodes.
+         function chooseLoc(graph) {
+           if (!nodeIDs.length) return null;
+           var sum = [0, 0];
+           var interestingCount = 0;
+           var interestingLoc;
+
+           for (var i = 0; i < nodeIDs.length; i++) {
+             var node = graph.entity(nodeIDs[i]);
+
+             if (node.hasInterestingTags()) {
+               interestingLoc = ++interestingCount === 1 ? node.loc : null;
+             }
+
+             sum = geoVecAdd(sum, node.loc);
+           }
+
+           return interestingLoc || geoVecScale(sum, 1 / nodeIDs.length);
+         }
+
+         var action = function action(graph) {
+           if (nodeIDs.length < 2) return graph;
+           var toLoc = loc;
+
+           if (!toLoc) {
+             toLoc = chooseLoc(graph);
+           }
+
+           for (var i = 0; i < nodeIDs.length; i++) {
+             var node = graph.entity(nodeIDs[i]);
+
+             if (node.loc !== toLoc) {
+               graph = graph.replace(node.move(toLoc));
+             }
+           }
+
+           return actionConnect(nodeIDs)(graph);
+         };
+
+         action.disabled = function (graph) {
+           if (nodeIDs.length < 2) return 'not_eligible';
+
+           for (var i = 0; i < nodeIDs.length; i++) {
+             var entity = graph.entity(nodeIDs[i]);
+             if (entity.type !== 'node') return 'not_eligible';
+           }
+
+           return actionConnect(nodeIDs).disabled(graph);
+         };
+
+         return action;
+       }
+
+       function osmChangeset() {
+         if (!(this instanceof osmChangeset)) {
+           return new osmChangeset().initialize(arguments);
+         } else if (arguments.length) {
+           this.initialize(arguments);
+         }
+       }
+       osmEntity.changeset = osmChangeset;
+       osmChangeset.prototype = Object.create(osmEntity.prototype);
+       Object.assign(osmChangeset.prototype, {
+         type: 'changeset',
+         extent: function extent() {
+           return new geoExtent();
+         },
+         geometry: function geometry() {
+           return 'changeset';
+         },
+         asJXON: function asJXON() {
+           return {
+             osm: {
+               changeset: {
+                 tag: Object.keys(this.tags).map(function (k) {
+                   return {
+                     '@k': k,
+                     '@v': this.tags[k]
+                   };
+                 }, this),
+                 '@version': 0.6,
+                 '@generator': 'iD'
+               }
+             }
+           };
+         },
+         // Generate [osmChange](http://wiki.openstreetmap.org/wiki/OsmChange)
+         // XML. Returns a string.
+         osmChangeJXON: function osmChangeJXON(changes) {
+           var changeset_id = this.id;
+
+           function nest(x, order) {
+             var groups = {};
+
+             for (var i = 0; i < x.length; i++) {
+               var tagName = Object.keys(x[i])[0];
+               if (!groups[tagName]) groups[tagName] = [];
+               groups[tagName].push(x[i][tagName]);
+             }
+
+             var ordered = {};
+             order.forEach(function (o) {
+               if (groups[o]) ordered[o] = groups[o];
+             });
+             return ordered;
+           } // sort relations in a changeset by dependencies
+
+
+           function sort(changes) {
+             // find a referenced relation in the current changeset
+             function resolve(item) {
+               return relations.find(function (relation) {
+                 return item.keyAttributes.type === 'relation' && item.keyAttributes.ref === relation['@id'];
+               });
+             } // a new item is an item that has not been already processed
+
+
+             function isNew(item) {
+               return !sorted[item['@id']] && !processing.find(function (proc) {
+                 return proc['@id'] === item['@id'];
+               });
+             }
+
+             var processing = [];
+             var sorted = {};
+             var relations = changes.relation;
+             if (!relations) return changes;
+
+             for (var i = 0; i < relations.length; i++) {
+               var relation = relations[i]; // skip relation if already sorted
+
+               if (!sorted[relation['@id']]) {
+                 processing.push(relation);
+               }
+
+               while (processing.length > 0) {
+                 var next = processing[0],
+                     deps = next.member.map(resolve).filter(Boolean).filter(isNew);
+
+                 if (deps.length === 0) {
+                   sorted[next['@id']] = next;
+                   processing.shift();
+                 } else {
+                   processing = deps.concat(processing);
+                 }
+               }
+             }
+
+             changes.relation = Object.values(sorted);
+             return changes;
+           }
+
+           function rep(entity) {
+             return entity.asJXON(changeset_id);
+           }
+
+           return {
+             osmChange: {
+               '@version': 0.6,
+               '@generator': 'iD',
+               'create': sort(nest(changes.created.map(rep), ['node', 'way', 'relation'])),
+               'modify': nest(changes.modified.map(rep), ['node', 'way', 'relation']),
+               'delete': Object.assign(nest(changes.deleted.map(rep), ['relation', 'way', 'node']), {
+                 '@if-unused': true
+               })
+             }
+           };
+         },
+         asGeoJSON: function asGeoJSON() {
+           return {};
+         }
+       });
+
+       function osmNote() {
+         if (!(this instanceof osmNote)) {
+           return new osmNote().initialize(arguments);
+         } else if (arguments.length) {
+           this.initialize(arguments);
+         }
+       }
+
+       osmNote.id = function () {
+         return osmNote.id.next--;
+       };
+
+       osmNote.id.next = -1;
+       Object.assign(osmNote.prototype, {
+         type: 'note',
+         initialize: function initialize(sources) {
+           for (var i = 0; i < sources.length; ++i) {
+             var source = sources[i];
+
+             for (var prop in source) {
+               if (Object.prototype.hasOwnProperty.call(source, prop)) {
+                 if (source[prop] === undefined) {
+                   delete this[prop];
+                 } else {
+                   this[prop] = source[prop];
+                 }
+               }
+             }
+           }
+
+           if (!this.id) {
+             this.id = osmNote.id().toString();
+           }
+
+           return this;
+         },
+         extent: function extent() {
+           return new geoExtent(this.loc);
+         },
+         update: function update(attrs) {
+           return osmNote(this, attrs); // {v: 1 + (this.v || 0)}
+         },
+         isNew: function isNew() {
+           return this.id < 0;
+         },
+         move: function move(loc) {
+           return this.update({
+             loc: loc
+           });
+         }
+       });
+
+       function osmRelation() {
+         if (!(this instanceof osmRelation)) {
+           return new osmRelation().initialize(arguments);
+         } else if (arguments.length) {
+           this.initialize(arguments);
+         }
+       }
+       osmEntity.relation = osmRelation;
+       osmRelation.prototype = Object.create(osmEntity.prototype);
+
+       osmRelation.creationOrder = function (a, b) {
+         var aId = parseInt(osmEntity.id.toOSM(a.id), 10);
+         var bId = parseInt(osmEntity.id.toOSM(b.id), 10);
+         if (aId < 0 || bId < 0) return aId - bId;
+         return bId - aId;
+       };
+
+       Object.assign(osmRelation.prototype, {
+         type: 'relation',
+         members: [],
+         copy: function copy(resolver, copies) {
+           if (copies[this.id]) return copies[this.id];
+           var copy = osmEntity.prototype.copy.call(this, resolver, copies);
+           var members = this.members.map(function (member) {
+             return Object.assign({}, member, {
+               id: resolver.entity(member.id).copy(resolver, copies).id
+             });
+           });
+           copy = copy.update({
+             members: members
+           });
+           copies[this.id] = copy;
+           return copy;
+         },
+         extent: function extent(resolver, memo) {
+           return resolver["transient"](this, 'extent', function () {
+             if (memo && memo[this.id]) return geoExtent();
+             memo = memo || {};
+             memo[this.id] = true;
+             var extent = geoExtent();
+
+             for (var i = 0; i < this.members.length; i++) {
+               var member = resolver.hasEntity(this.members[i].id);
+
+               if (member) {
+                 extent._extend(member.extent(resolver, memo));
+               }
+             }
+
+             return extent;
+           });
+         },
+         geometry: function geometry(graph) {
+           return graph["transient"](this, 'geometry', function () {
+             return this.isMultipolygon() ? 'area' : 'relation';
+           });
+         },
+         isDegenerate: function isDegenerate() {
+           return this.members.length === 0;
+         },
+         // Return an array of members, each extended with an 'index' property whose value
+         // is the member index.
+         indexedMembers: function indexedMembers() {
+           var result = new Array(this.members.length);
+
+           for (var i = 0; i < this.members.length; i++) {
+             result[i] = Object.assign({}, this.members[i], {
+               index: i
+             });
+           }
+
+           return result;
+         },
+         // Return the first member with the given role. A copy of the member object
+         // is returned, extended with an 'index' property whose value is the member index.
+         memberByRole: function memberByRole(role) {
+           for (var i = 0; i < this.members.length; i++) {
+             if (this.members[i].role === role) {
+               return Object.assign({}, this.members[i], {
+                 index: i
+               });
+             }
+           }
+         },
+         // Same as memberByRole, but returns all members with the given role
+         membersByRole: function membersByRole(role) {
+           var result = [];
+
+           for (var i = 0; i < this.members.length; i++) {
+             if (this.members[i].role === role) {
+               result.push(Object.assign({}, this.members[i], {
+                 index: i
+               }));
+             }
+           }
+
+           return result;
+         },
+         // Return the first member with the given id. A copy of the member object
+         // is returned, extended with an 'index' property whose value is the member index.
+         memberById: function memberById(id) {
+           for (var i = 0; i < this.members.length; i++) {
+             if (this.members[i].id === id) {
+               return Object.assign({}, this.members[i], {
+                 index: i
+               });
+             }
+           }
+         },
+         // Return the first member with the given id and role. A copy of the member object
+         // is returned, extended with an 'index' property whose value is the member index.
+         memberByIdAndRole: function memberByIdAndRole(id, role) {
+           for (var i = 0; i < this.members.length; i++) {
+             if (this.members[i].id === id && this.members[i].role === role) {
+               return Object.assign({}, this.members[i], {
+                 index: i
+               });
+             }
+           }
+         },
+         addMember: function addMember(member, index) {
+           var members = this.members.slice();
+           members.splice(index === undefined ? members.length : index, 0, member);
+           return this.update({
+             members: members
+           });
+         },
+         updateMember: function updateMember(member, index) {
+           var members = this.members.slice();
+           members.splice(index, 1, Object.assign({}, members[index], member));
+           return this.update({
+             members: members
+           });
+         },
+         removeMember: function removeMember(index) {
+           var members = this.members.slice();
+           members.splice(index, 1);
+           return this.update({
+             members: members
+           });
+         },
+         removeMembersWithID: function removeMembersWithID(id) {
+           var members = this.members.filter(function (m) {
+             return m.id !== id;
+           });
+           return this.update({
+             members: members
+           });
+         },
+         moveMember: function moveMember(fromIndex, toIndex) {
+           var members = this.members.slice();
+           members.splice(toIndex, 0, members.splice(fromIndex, 1)[0]);
+           return this.update({
+             members: members
+           });
+         },
+         // Wherever a member appears with id `needle.id`, replace it with a member
+         // with id `replacement.id`, type `replacement.type`, and the original role,
+         // By default, adding a duplicate member (by id and role) is prevented.
+         // Return an updated relation.
+         replaceMember: function replaceMember(needle, replacement, keepDuplicates) {
+           if (!this.memberById(needle.id)) return this;
+           var members = [];
+
+           for (var i = 0; i < this.members.length; i++) {
+             var member = this.members[i];
+
+             if (member.id !== needle.id) {
+               members.push(member);
+             } else if (keepDuplicates || !this.memberByIdAndRole(replacement.id, member.role)) {
+               members.push({
+                 id: replacement.id,
+                 type: replacement.type,
+                 role: member.role
+               });
+             }
+           }
+
+           return this.update({
+             members: members
+           });
+         },
+         asJXON: function asJXON(changeset_id) {
+           var r = {
+             relation: {
+               '@id': this.osmId(),
+               '@version': this.version || 0,
+               member: this.members.map(function (member) {
+                 return {
+                   keyAttributes: {
+                     type: member.type,
+                     role: member.role,
+                     ref: osmEntity.id.toOSM(member.id)
+                   }
+                 };
+               }, this),
+               tag: Object.keys(this.tags).map(function (k) {
+                 return {
+                   keyAttributes: {
+                     k: k,
+                     v: this.tags[k]
+                   }
+                 };
+               }, this)
+             }
+           };
+
+           if (changeset_id) {
+             r.relation['@changeset'] = changeset_id;
+           }
+
+           return r;
+         },
+         asGeoJSON: function asGeoJSON(resolver) {
+           return resolver["transient"](this, 'GeoJSON', function () {
+             if (this.isMultipolygon()) {
+               return {
+                 type: 'MultiPolygon',
+                 coordinates: this.multipolygon(resolver)
+               };
+             } else {
+               return {
+                 type: 'FeatureCollection',
+                 properties: this.tags,
+                 features: this.members.map(function (member) {
+                   return Object.assign({
+                     role: member.role
+                   }, resolver.entity(member.id).asGeoJSON(resolver));
+                 })
+               };
+             }
+           });
+         },
+         area: function area(resolver) {
+           return resolver["transient"](this, 'area', function () {
+             return d3_geoArea(this.asGeoJSON(resolver));
+           });
+         },
+         isMultipolygon: function isMultipolygon() {
+           return this.tags.type === 'multipolygon';
+         },
+         isComplete: function isComplete(resolver) {
+           for (var i = 0; i < this.members.length; i++) {
+             if (!resolver.hasEntity(this.members[i].id)) {
+               return false;
+             }
+           }
+
+           return true;
+         },
+         hasFromViaTo: function hasFromViaTo() {
+           return this.members.some(function (m) {
+             return m.role === 'from';
+           }) && this.members.some(function (m) {
+             return m.role === 'via';
+           }) && this.members.some(function (m) {
+             return m.role === 'to';
+           });
+         },
+         isRestriction: function isRestriction() {
+           return !!(this.tags.type && this.tags.type.match(/^restriction:?/));
+         },
+         isValidRestriction: function isValidRestriction() {
+           if (!this.isRestriction()) return false;
+           var froms = this.members.filter(function (m) {
+             return m.role === 'from';
+           });
+           var vias = this.members.filter(function (m) {
+             return m.role === 'via';
+           });
+           var tos = this.members.filter(function (m) {
+             return m.role === 'to';
+           });
+           if (froms.length !== 1 && this.tags.restriction !== 'no_entry') return false;
+           if (froms.some(function (m) {
+             return m.type !== 'way';
+           })) return false;
+           if (tos.length !== 1 && this.tags.restriction !== 'no_exit') return false;
+           if (tos.some(function (m) {
+             return m.type !== 'way';
+           })) return false;
+           if (vias.length === 0) return false;
+           if (vias.length > 1 && vias.some(function (m) {
+             return m.type !== 'way';
+           })) return false;
+           return true;
+         },
+         isConnectivity: function isConnectivity() {
+           return !!(this.tags.type && this.tags.type.match(/^connectivity:?/));
+         },
+         // Returns an array [A0, ... An], each Ai being an array of node arrays [Nds0, ... Ndsm],
+         // where Nds0 is an outer ring and subsequent Ndsi's (if any i > 0) being inner rings.
+         //
+         // This corresponds to the structure needed for rendering a multipolygon path using a
+         // `evenodd` fill rule, as well as the structure of a GeoJSON MultiPolygon geometry.
+         //
+         // In the case of invalid geometries, this function will still return a result which
+         // includes the nodes of all way members, but some Nds may be unclosed and some inner
+         // rings not matched with the intended outer ring.
+         //
+         multipolygon: function multipolygon(resolver) {
+           var outers = this.members.filter(function (m) {
+             return 'outer' === (m.role || 'outer');
+           });
+           var inners = this.members.filter(function (m) {
+             return 'inner' === m.role;
+           });
+           outers = osmJoinWays(outers, resolver);
+           inners = osmJoinWays(inners, resolver);
+
+           var sequenceToLineString = function sequenceToLineString(sequence) {
+             if (sequence.nodes.length > 2 && sequence.nodes[0] !== sequence.nodes[sequence.nodes.length - 1]) {
+               // close unclosed parts to ensure correct area rendering - #2945
+               sequence.nodes.push(sequence.nodes[0]);
+             }
+
+             return sequence.nodes.map(function (node) {
+               return node.loc;
+             });
+           };
+
+           outers = outers.map(sequenceToLineString);
+           inners = inners.map(sequenceToLineString);
+           var result = outers.map(function (o) {
+             // Heuristic for detecting counterclockwise winding order. Assumes
+             // that OpenStreetMap polygons are not hemisphere-spanning.
+             return [d3_geoArea({
+               type: 'Polygon',
+               coordinates: [o]
+             }) > 2 * Math.PI ? o.reverse() : o];
+           });
+
+           function findOuter(inner) {
+             var o, outer;
+
+             for (o = 0; o < outers.length; o++) {
+               outer = outers[o];
+
+               if (geoPolygonContainsPolygon(outer, inner)) {
+                 return o;
+               }
+             }
+
+             for (o = 0; o < outers.length; o++) {
+               outer = outers[o];
+
+               if (geoPolygonIntersectsPolygon(outer, inner, false)) {
+                 return o;
+               }
+             }
+           }
+
+           for (var i = 0; i < inners.length; i++) {
+             var inner = inners[i];
+
+             if (d3_geoArea({
+               type: 'Polygon',
+               coordinates: [inner]
+             }) < 2 * Math.PI) {
+               inner = inner.reverse();
+             }
+
+             var o = findOuter(inners[i]);
+
+             if (o !== undefined) {
+               result[o].push(inners[i]);
+             } else {
+               result.push([inners[i]]); // Invalid geometry
+             }
+           }
+
+           return result;
+         }
+       });
+
+       var QAItem = /*#__PURE__*/function () {
+         function QAItem(loc, service, itemType, id, props) {
+           _classCallCheck$1(this, QAItem);
+
+           // Store required properties
+           this.loc = loc;
+           this.service = service.title;
+           this.itemType = itemType; // All issues must have an ID for selection, use generic if none specified
+
+           this.id = id ? id : "".concat(QAItem.id());
+           this.update(props); // Some QA services have marker icons to differentiate issues
+
+           if (service && typeof service.getIcon === 'function') {
+             this.icon = service.getIcon(itemType);
+           }
+         }
+
+         _createClass$1(QAItem, [{
+           key: "update",
+           value: function update(props) {
+             var _this = this;
+
+             // You can't override this initial information
+             var loc = this.loc,
+                 service = this.service,
+                 itemType = this.itemType,
+                 id = this.id;
+             Object.keys(props).forEach(function (prop) {
+               return _this[prop] = props[prop];
+             });
+             this.loc = loc;
+             this.service = service;
+             this.itemType = itemType;
+             this.id = id;
+             return this;
+           } // Generic handling for newly created QAItems
+
+         }], [{
+           key: "id",
+           value: function id() {
+             return this.nextId--;
+           }
+         }]);
+
+         return QAItem;
+       }();
+       QAItem.nextId = -1;
+
+       //
+       // Optionally, split only the given ways, if multiple ways share
+       // the given node.
+       //
+       // This is the inverse of `iD.actionJoin`.
+       //
+       // For testing convenience, accepts an ID to assign to the new way.
+       // Normally, this will be undefined and the way will automatically
+       // be assigned a new ID.
+       //
+       // Reference:
+       //   https://github.com/systemed/potlatch2/blob/master/net/systemeD/halcyon/connection/actions/SplitWayAction.as
+       //
+
+       function actionSplit(nodeIds, newWayIds) {
+         // accept single ID for backwards-compatiblity
+         if (typeof nodeIds === 'string') nodeIds = [nodeIds];
+
+         var _wayIDs; // the strategy for picking which way will have a new version and which way is newly created
+
+
+         var _keepHistoryOn = 'longest'; // 'longest', 'first'
+         // The IDs of the ways actually created by running this action
+
+         var _createdWayIDs = [];
+
+         function dist(graph, nA, nB) {
+           var locA = graph.entity(nA).loc;
+           var locB = graph.entity(nB).loc;
+           var epsilon = 1e-6;
+           return locA && locB ? geoSphericalDistance(locA, locB) : epsilon;
+         } // If the way is closed, we need to search for a partner node
+         // to split the way at.
+         //
+         // The following looks for a node that is both far away from
+         // the initial node in terms of way segment length and nearby
+         // in terms of beeline-distance. This assures that areas get
+         // split on the most "natural" points (independent of the number
+         // of nodes).
+         // For example: bone-shaped areas get split across their waist
+         // line, circles across the diameter.
+
+
+         function splitArea(nodes, idxA, graph) {
+           var lengths = new Array(nodes.length);
+           var length;
+           var i;
+           var best = 0;
+           var idxB;
+
+           function wrap(index) {
+             return utilWrap(index, nodes.length);
+           } // calculate lengths
+
+
+           length = 0;
+
+           for (i = wrap(idxA + 1); i !== idxA; i = wrap(i + 1)) {
+             length += dist(graph, nodes[i], nodes[wrap(i - 1)]);
+             lengths[i] = length;
+           }
+
+           length = 0;
+
+           for (i = wrap(idxA - 1); i !== idxA; i = wrap(i - 1)) {
+             length += dist(graph, nodes[i], nodes[wrap(i + 1)]);
+
+             if (length < lengths[i]) {
+               lengths[i] = length;
+             }
+           } // determine best opposite node to split
+
+
+           for (i = 0; i < nodes.length; i++) {
+             var cost = lengths[i] / dist(graph, nodes[idxA], nodes[i]);
+
+             if (cost > best) {
+               idxB = i;
+               best = cost;
+             }
+           }
+
+           return idxB;
+         }
+
+         function totalLengthBetweenNodes(graph, nodes) {
+           var totalLength = 0;
+
+           for (var i = 0; i < nodes.length - 1; i++) {
+             totalLength += dist(graph, nodes[i], nodes[i + 1]);
+           }
+
+           return totalLength;
+         }
+
+         function split(graph, nodeId, wayA, newWayId) {
+           var wayB = osmWay({
+             id: newWayId,
+             tags: wayA.tags
+           }); // `wayB` is the NEW way
+
+           var origNodes = wayA.nodes.slice();
+           var nodesA;
+           var nodesB;
+           var isArea = wayA.isArea();
+           var isOuter = osmIsOldMultipolygonOuterMember(wayA, graph);
+
+           if (wayA.isClosed()) {
+             var nodes = wayA.nodes.slice(0, -1);
+             var idxA = nodes.indexOf(nodeId);
+             var idxB = splitArea(nodes, idxA, graph);
+
+             if (idxB < idxA) {
+               nodesA = nodes.slice(idxA).concat(nodes.slice(0, idxB + 1));
+               nodesB = nodes.slice(idxB, idxA + 1);
+             } else {
+               nodesA = nodes.slice(idxA, idxB + 1);
+               nodesB = nodes.slice(idxB).concat(nodes.slice(0, idxA + 1));
+             }
+           } else {
+             var idx = wayA.nodes.indexOf(nodeId, 1);
+             nodesA = wayA.nodes.slice(0, idx + 1);
+             nodesB = wayA.nodes.slice(idx);
+           }
+
+           var lengthA = totalLengthBetweenNodes(graph, nodesA);
+           var lengthB = totalLengthBetweenNodes(graph, nodesB);
+
+           if (_keepHistoryOn === 'longest' && lengthB > lengthA) {
+             // keep the history on the longer way, regardless of the node count
+             wayA = wayA.update({
+               nodes: nodesB
+             });
+             wayB = wayB.update({
+               nodes: nodesA
+             });
+             var temp = lengthA;
+             lengthA = lengthB;
+             lengthB = temp;
+           } else {
+             wayA = wayA.update({
+               nodes: nodesA
+             });
+             wayB = wayB.update({
+               nodes: nodesB
+             });
+           }
+
+           if (wayA.tags.step_count) {
+             // divide up the the step count proportionally between the two ways
+             var stepCount = parseFloat(wayA.tags.step_count);
+
+             if (stepCount && // ensure a number
+             isFinite(stepCount) && // ensure positive
+             stepCount > 0 && // ensure integer
+             Math.round(stepCount) === stepCount) {
+               var tagsA = Object.assign({}, wayA.tags);
+               var tagsB = Object.assign({}, wayB.tags);
+               var ratioA = lengthA / (lengthA + lengthB);
+               var countA = Math.round(stepCount * ratioA);
+               tagsA.step_count = countA.toString();
+               tagsB.step_count = (stepCount - countA).toString();
+               wayA = wayA.update({
+                 tags: tagsA
+               });
+               wayB = wayB.update({
+                 tags: tagsB
+               });
+             }
+           }
+
+           graph = graph.replace(wayA);
+           graph = graph.replace(wayB);
+           graph.parentRelations(wayA).forEach(function (relation) {
+             var member; // Turn restrictions - make sure:
+             // 1. Splitting a FROM/TO way - only `wayA` OR `wayB` remains in relation
+             //    (whichever one is connected to the VIA node/ways)
+             // 2. Splitting a VIA way - `wayB` remains in relation as a VIA way
+
+             if (relation.hasFromViaTo()) {
+               var f = relation.memberByRole('from');
+               var v = relation.membersByRole('via');
+               var t = relation.memberByRole('to');
+               var i; // 1. split a FROM/TO
+
+               if (f.id === wayA.id || t.id === wayA.id) {
+                 var keepB = false;
+
+                 if (v.length === 1 && v[0].type === 'node') {
+                   // check via node
+                   keepB = wayB.contains(v[0].id);
+                 } else {
+                   // check via way(s)
+                   for (i = 0; i < v.length; i++) {
+                     if (v[i].type === 'way') {
+                       var wayVia = graph.hasEntity(v[i].id);
+
+                       if (wayVia && utilArrayIntersection(wayB.nodes, wayVia.nodes).length) {
+                         keepB = true;
+                         break;
+                       }
+                     }
+                   }
+                 }
+
+                 if (keepB) {
+                   relation = relation.replaceMember(wayA, wayB);
+                   graph = graph.replace(relation);
+                 } // 2. split a VIA
+
+               } else {
+                 for (i = 0; i < v.length; i++) {
+                   if (v[i].type === 'way' && v[i].id === wayA.id) {
+                     member = {
+                       id: wayB.id,
+                       type: 'way',
+                       role: 'via'
+                     };
+                     graph = actionAddMember(relation.id, member, v[i].index + 1)(graph);
+                     break;
+                   }
+                 }
+               } // All other relations (Routes, Multipolygons, etc):
+               // 1. Both `wayA` and `wayB` remain in the relation
+               // 2. But must be inserted as a pair (see `actionAddMember` for details)
+
+             } else {
+               if (relation === isOuter) {
+                 graph = graph.replace(relation.mergeTags(wayA.tags));
+                 graph = graph.replace(wayA.update({
+                   tags: {}
+                 }));
+                 graph = graph.replace(wayB.update({
+                   tags: {}
+                 }));
+               }
+
+               member = {
+                 id: wayB.id,
+                 type: 'way',
+                 role: relation.memberById(wayA.id).role
+               };
+               var insertPair = {
+                 originalID: wayA.id,
+                 insertedID: wayB.id,
+                 nodes: origNodes
+               };
+               graph = actionAddMember(relation.id, member, undefined, insertPair)(graph);
+             }
+           });
+
+           if (!isOuter && isArea) {
+             var multipolygon = osmRelation({
+               tags: Object.assign({}, wayA.tags, {
+                 type: 'multipolygon'
+               }),
+               members: [{
+                 id: wayA.id,
+                 role: 'outer',
+                 type: 'way'
+               }, {
+                 id: wayB.id,
+                 role: 'outer',
+                 type: 'way'
+               }]
+             });
+             graph = graph.replace(multipolygon);
+             graph = graph.replace(wayA.update({
+               tags: {}
+             }));
+             graph = graph.replace(wayB.update({
+               tags: {}
+             }));
+           }
+
+           _createdWayIDs.push(wayB.id);
+
+           return graph;
+         }
+
+         var action = function action(graph) {
+           _createdWayIDs = [];
+           var newWayIndex = 0;
+
+           for (var i = 0; i < nodeIds.length; i++) {
+             var nodeId = nodeIds[i];
+             var candidates = action.waysForNode(nodeId, graph);
+
+             for (var j = 0; j < candidates.length; j++) {
+               graph = split(graph, nodeId, candidates[j], newWayIds && newWayIds[newWayIndex]);
+               newWayIndex += 1;
+             }
+           }
+
+           return graph;
+         };
+
+         action.getCreatedWayIDs = function () {
+           return _createdWayIDs;
+         };
+
+         action.waysForNode = function (nodeId, graph) {
+           var node = graph.entity(nodeId);
+           var splittableParents = graph.parentWays(node).filter(isSplittable);
+
+           if (!_wayIDs) {
+             // If the ways to split aren't specified, only split the lines.
+             // If there are no lines to split, split the areas.
+             var hasLine = splittableParents.some(function (parent) {
+               return parent.geometry(graph) === 'line';
+             });
+
+             if (hasLine) {
+               return splittableParents.filter(function (parent) {
+                 return parent.geometry(graph) === 'line';
+               });
+             }
+           }
+
+           return splittableParents;
+
+           function isSplittable(parent) {
+             // If the ways to split are specified, ignore everything else.
+             if (_wayIDs && _wayIDs.indexOf(parent.id) === -1) return false; // We can fake splitting closed ways at their endpoints...
+
+             if (parent.isClosed()) return true; // otherwise, we can't split nodes at their endpoints.
+
+             for (var i = 1; i < parent.nodes.length - 1; i++) {
+               if (parent.nodes[i] === nodeId) return true;
+             }
+
+             return false;
+           }
+         };
+
+         action.ways = function (graph) {
+           return utilArrayUniq([].concat.apply([], nodeIds.map(function (nodeId) {
+             return action.waysForNode(nodeId, graph);
+           })));
+         };
+
+         action.disabled = function (graph) {
+           for (var i = 0; i < nodeIds.length; i++) {
+             var nodeId = nodeIds[i];
+             var candidates = action.waysForNode(nodeId, graph);
+
+             if (candidates.length === 0 || _wayIDs && _wayIDs.length !== candidates.length) {
+               return 'not_eligible';
+             }
+           }
+         };
+
+         action.limitWays = function (val) {
+           if (!arguments.length) return _wayIDs;
+           _wayIDs = val;
+           return action;
+         };
+
+         action.keepHistoryOn = function (val) {
+           if (!arguments.length) return _keepHistoryOn;
+           _keepHistoryOn = val;
+           return action;
+         };
+
+         return action;
+       }
+
+       function coreGraph(other, mutable) {
+         if (!(this instanceof coreGraph)) return new coreGraph(other, mutable);
+
+         if (other instanceof coreGraph) {
+           var base = other.base();
+           this.entities = Object.assign(Object.create(base.entities), other.entities);
+           this._parentWays = Object.assign(Object.create(base.parentWays), other._parentWays);
+           this._parentRels = Object.assign(Object.create(base.parentRels), other._parentRels);
+         } else {
+           this.entities = Object.create({});
+           this._parentWays = Object.create({});
+           this._parentRels = Object.create({});
+           this.rebase(other || [], [this]);
+         }
+
+         this.transients = {};
+         this._childNodes = {};
+         this.frozen = !mutable;
+       }
+       coreGraph.prototype = {
+         hasEntity: function hasEntity(id) {
+           return this.entities[id];
+         },
+         entity: function entity(id) {
+           var entity = this.entities[id]; //https://github.com/openstreetmap/iD/issues/3973#issuecomment-307052376
+
+           if (!entity) {
+             entity = this.entities.__proto__[id]; // eslint-disable-line no-proto
+           }
+
+           if (!entity) {
+             throw new Error('entity ' + id + ' not found');
+           }
+
+           return entity;
+         },
+         geometry: function geometry(id) {
+           return this.entity(id).geometry(this);
+         },
+         "transient": function transient(entity, key, fn) {
+           var id = entity.id;
+           var transients = this.transients[id] || (this.transients[id] = {});
+
+           if (transients[key] !== undefined) {
+             return transients[key];
+           }
+
+           transients[key] = fn.call(entity);
+           return transients[key];
+         },
+         parentWays: function parentWays(entity) {
+           var parents = this._parentWays[entity.id];
+           var result = [];
+
+           if (parents) {
+             parents.forEach(function (id) {
+               result.push(this.entity(id));
+             }, this);
+           }
+
+           return result;
+         },
+         isPoi: function isPoi(entity) {
+           var parents = this._parentWays[entity.id];
+           return !parents || parents.size === 0;
+         },
+         isShared: function isShared(entity) {
+           var parents = this._parentWays[entity.id];
+           return parents && parents.size > 1;
+         },
+         parentRelations: function parentRelations(entity) {
+           var parents = this._parentRels[entity.id];
+           var result = [];
+
+           if (parents) {
+             parents.forEach(function (id) {
+               result.push(this.entity(id));
+             }, this);
+           }
+
+           return result;
+         },
+         parentMultipolygons: function parentMultipolygons(entity) {
+           return this.parentRelations(entity).filter(function (relation) {
+             return relation.isMultipolygon();
+           });
+         },
+         childNodes: function childNodes(entity) {
+           if (this._childNodes[entity.id]) return this._childNodes[entity.id];
+           if (!entity.nodes) return [];
+           var nodes = [];
+
+           for (var i = 0; i < entity.nodes.length; i++) {
+             nodes[i] = this.entity(entity.nodes[i]);
+           }
+           this._childNodes[entity.id] = nodes;
+           return this._childNodes[entity.id];
+         },
+         base: function base() {
+           return {
+             'entities': Object.getPrototypeOf(this.entities),
+             'parentWays': Object.getPrototypeOf(this._parentWays),
+             'parentRels': Object.getPrototypeOf(this._parentRels)
+           };
+         },
+         // Unlike other graph methods, rebase mutates in place. This is because it
+         // is used only during the history operation that merges newly downloaded
+         // data into each state. To external consumers, it should appear as if the
+         // graph always contained the newly downloaded data.
+         rebase: function rebase(entities, stack, force) {
+           var base = this.base();
+           var i, j, k, id;
+
+           for (i = 0; i < entities.length; i++) {
+             var entity = entities[i];
+             if (!entity.visible || !force && base.entities[entity.id]) continue; // Merging data into the base graph
+
+             base.entities[entity.id] = entity;
+
+             this._updateCalculated(undefined, entity, base.parentWays, base.parentRels); // Restore provisionally-deleted nodes that are discovered to have an extant parent
+
+
+             if (entity.type === 'way') {
+               for (j = 0; j < entity.nodes.length; j++) {
+                 id = entity.nodes[j];
+
+                 for (k = 1; k < stack.length; k++) {
+                   var ents = stack[k].entities;
+
+                   if (ents.hasOwnProperty(id) && ents[id] === undefined) {
+                     delete ents[id];
+                   }
+                 }
+               }
+             }
+           }
+
+           for (i = 0; i < stack.length; i++) {
+             stack[i]._updateRebased();
+           }
+         },
+         _updateRebased: function _updateRebased() {
+           var base = this.base();
+           Object.keys(this._parentWays).forEach(function (child) {
+             if (base.parentWays[child]) {
+               base.parentWays[child].forEach(function (id) {
+                 if (!this.entities.hasOwnProperty(id)) {
+                   this._parentWays[child].add(id);
+                 }
+               }, this);
+             }
+           }, this);
+           Object.keys(this._parentRels).forEach(function (child) {
+             if (base.parentRels[child]) {
+               base.parentRels[child].forEach(function (id) {
+                 if (!this.entities.hasOwnProperty(id)) {
+                   this._parentRels[child].add(id);
+                 }
+               }, this);
+             }
+           }, this);
+           this.transients = {}; // this._childNodes is not updated, under the assumption that
+           // ways are always downloaded with their child nodes.
+         },
+         // Updates calculated properties (parentWays, parentRels) for the specified change
+         _updateCalculated: function _updateCalculated(oldentity, entity, parentWays, parentRels) {
+           parentWays = parentWays || this._parentWays;
+           parentRels = parentRels || this._parentRels;
+           var type = entity && entity.type || oldentity && oldentity.type;
+           var removed, added, i;
+
+           if (type === 'way') {
+             // Update parentWays
+             if (oldentity && entity) {
+               removed = utilArrayDifference(oldentity.nodes, entity.nodes);
+               added = utilArrayDifference(entity.nodes, oldentity.nodes);
+             } else if (oldentity) {
+               removed = oldentity.nodes;
+               added = [];
+             } else if (entity) {
+               removed = [];
+               added = entity.nodes;
+             }
+
+             for (i = 0; i < removed.length; i++) {
+               // make a copy of prototype property, store as own property, and update..
+               parentWays[removed[i]] = new Set(parentWays[removed[i]]);
+               parentWays[removed[i]]["delete"](oldentity.id);
+             }
+
+             for (i = 0; i < added.length; i++) {
+               // make a copy of prototype property, store as own property, and update..
+               parentWays[added[i]] = new Set(parentWays[added[i]]);
+               parentWays[added[i]].add(entity.id);
+             }
+           } else if (type === 'relation') {
+             // Update parentRels
+             // diff only on the IDs since the same entity can be a member multiple times with different roles
+             var oldentityMemberIDs = oldentity ? oldentity.members.map(function (m) {
+               return m.id;
+             }) : [];
+             var entityMemberIDs = entity ? entity.members.map(function (m) {
+               return m.id;
+             }) : [];
+
+             if (oldentity && entity) {
+               removed = utilArrayDifference(oldentityMemberIDs, entityMemberIDs);
+               added = utilArrayDifference(entityMemberIDs, oldentityMemberIDs);
+             } else if (oldentity) {
+               removed = oldentityMemberIDs;
+               added = [];
+             } else if (entity) {
+               removed = [];
+               added = entityMemberIDs;
+             }
+
+             for (i = 0; i < removed.length; i++) {
+               // make a copy of prototype property, store as own property, and update..
+               parentRels[removed[i]] = new Set(parentRels[removed[i]]);
+               parentRels[removed[i]]["delete"](oldentity.id);
+             }
+
+             for (i = 0; i < added.length; i++) {
+               // make a copy of prototype property, store as own property, and update..
+               parentRels[added[i]] = new Set(parentRels[added[i]]);
+               parentRels[added[i]].add(entity.id);
+             }
+           }
+         },
+         replace: function replace(entity) {
+           if (this.entities[entity.id] === entity) return this;
+           return this.update(function () {
+             this._updateCalculated(this.entities[entity.id], entity);
+
+             this.entities[entity.id] = entity;
+           });
+         },
+         remove: function remove(entity) {
+           return this.update(function () {
+             this._updateCalculated(entity, undefined);
+
+             this.entities[entity.id] = undefined;
+           });
+         },
+         revert: function revert(id) {
+           var baseEntity = this.base().entities[id];
+           var headEntity = this.entities[id];
+           if (headEntity === baseEntity) return this;
+           return this.update(function () {
+             this._updateCalculated(headEntity, baseEntity);
+
+             delete this.entities[id];
+           });
+         },
+         update: function update() {
+           var graph = this.frozen ? coreGraph(this, true) : this;
+
+           for (var i = 0; i < arguments.length; i++) {
+             arguments[i].call(graph, graph);
+           }
+
+           if (this.frozen) graph.frozen = true;
+           return graph;
+         },
+         // Obliterates any existing entities
+         load: function load(entities) {
+           var base = this.base();
+           this.entities = Object.create(base.entities);
+
+           for (var i in entities) {
+             this.entities[i] = entities[i];
+
+             this._updateCalculated(base.entities[i], this.entities[i]);
+           }
+
+           return this;
+         }
+       };
+
+       function osmTurn(turn) {
+         if (!(this instanceof osmTurn)) {
+           return new osmTurn(turn);
+         }
+
+         Object.assign(this, turn);
+       }
+       function osmIntersection(graph, startVertexId, maxDistance) {
+         maxDistance = maxDistance || 30; // in meters
+
+         var vgraph = coreGraph(); // virtual graph
+
+         var i, j, k;
+
+         function memberOfRestriction(entity) {
+           return graph.parentRelations(entity).some(function (r) {
+             return r.isRestriction();
+           });
+         }
+
+         function isRoad(way) {
+           if (way.isArea() || way.isDegenerate()) return false;
+           var roads = {
+             'motorway': true,
+             'motorway_link': true,
+             'trunk': true,
+             'trunk_link': true,
+             'primary': true,
+             'primary_link': true,
+             'secondary': true,
+             'secondary_link': true,
+             'tertiary': true,
+             'tertiary_link': true,
+             'residential': true,
+             'unclassified': true,
+             'living_street': true,
+             'service': true,
+             'road': true,
+             'track': true
+           };
+           return roads[way.tags.highway];
+         }
+
+         var startNode = graph.entity(startVertexId);
+         var checkVertices = [startNode];
+         var checkWays;
+         var vertices = [];
+         var vertexIds = [];
+         var vertex;
+         var ways = [];
+         var wayIds = [];
+         var way;
+         var nodes = [];
+         var node;
+         var parents = [];
+         var parent; // `actions` will store whatever actions must be performed to satisfy
+         // preconditions for adding a turn restriction to this intersection.
+         //  - Remove any existing degenerate turn restrictions (missing from/to, etc)
+         //  - Reverse oneways so that they are drawn in the forward direction
+         //  - Split ways on key vertices
+
+         var actions = []; // STEP 1:  walk the graph outwards from starting vertex to search
+         //  for more key vertices and ways to include in the intersection..
+
+         while (checkVertices.length) {
+           vertex = checkVertices.pop(); // check this vertex for parent ways that are roads
+
+           checkWays = graph.parentWays(vertex);
+           var hasWays = false;
+
+           for (i = 0; i < checkWays.length; i++) {
+             way = checkWays[i];
+             if (!isRoad(way) && !memberOfRestriction(way)) continue;
+             ways.push(way); // it's a road, or it's already in a turn restriction
+
+             hasWays = true; // check the way's children for more key vertices
+
+             nodes = utilArrayUniq(graph.childNodes(way));
+
+             for (j = 0; j < nodes.length; j++) {
+               node = nodes[j];
+               if (node === vertex) continue; // same thing
+
+               if (vertices.indexOf(node) !== -1) continue; // seen it already
+
+               if (geoSphericalDistance(node.loc, startNode.loc) > maxDistance) continue; // too far from start
+               // a key vertex will have parents that are also roads
+
+               var hasParents = false;
+               parents = graph.parentWays(node);
+
+               for (k = 0; k < parents.length; k++) {
+                 parent = parents[k];
+                 if (parent === way) continue; // same thing
+
+                 if (ways.indexOf(parent) !== -1) continue; // seen it already
+
+                 if (!isRoad(parent)) continue; // not a road
+
+                 hasParents = true;
+                 break;
+               }
+
+               if (hasParents) {
+                 checkVertices.push(node);
+               }
+             }
+           }
+
+           if (hasWays) {
+             vertices.push(vertex);
+           }
+         }
+
+         vertices = utilArrayUniq(vertices);
+         ways = utilArrayUniq(ways); // STEP 2:  Build a virtual graph containing only the entities in the intersection..
+         // Everything done after this step should act on the virtual graph
+         // Any actions that must be performed later to the main graph go in `actions` array
+
+         ways.forEach(function (way) {
+           graph.childNodes(way).forEach(function (node) {
+             vgraph = vgraph.replace(node);
+           });
+           vgraph = vgraph.replace(way);
+           graph.parentRelations(way).forEach(function (relation) {
+             if (relation.isRestriction()) {
+               if (relation.isValidRestriction(graph)) {
+                 vgraph = vgraph.replace(relation);
+               } else if (relation.isComplete(graph)) {
+                 actions.push(actionDeleteRelation(relation.id));
+               }
+             }
+           });
+         }); // STEP 3:  Force all oneways to be drawn in the forward direction
+
+         ways.forEach(function (w) {
+           var way = vgraph.entity(w.id);
+
+           if (way.tags.oneway === '-1') {
+             var action = actionReverse(way.id, {
+               reverseOneway: true
+             });
+             actions.push(action);
+             vgraph = action(vgraph);
+           }
+         }); // STEP 4:  Split ways on key vertices
+
+         var origCount = osmEntity.id.next.way;
+         vertices.forEach(function (v) {
+           // This is an odd way to do it, but we need to find all the ways that
+           // will be split here, then split them one at a time to ensure that these
+           // actions can be replayed on the main graph exactly in the same order.
+           // (It is unintuitive, but the order of ways returned from graph.parentWays()
+           // is arbitrary, depending on how the main graph and vgraph were built)
+           var splitAll = actionSplit([v.id]).keepHistoryOn('first');
+
+           if (!splitAll.disabled(vgraph)) {
+             splitAll.ways(vgraph).forEach(function (way) {
+               var splitOne = actionSplit([v.id]).limitWays([way.id]).keepHistoryOn('first');
+               actions.push(splitOne);
+               vgraph = splitOne(vgraph);
+             });
+           }
+         }); // In here is where we should also split the intersection at nearby junction.
+         //   for https://github.com/mapbox/iD-internal/issues/31
+         // nearbyVertices.forEach(function(v) {
+         // });
+         // Reasons why we reset the way id count here:
+         //  1. Continuity with way ids created by the splits so that we can replay
+         //     these actions later if the user decides to create a turn restriction
+         //  2. Avoids churning way ids just by hovering over a vertex
+         //     and displaying the turn restriction editor
+
+         osmEntity.id.next.way = origCount; // STEP 5:  Update arrays to point to vgraph entities
+
+         vertexIds = vertices.map(function (v) {
+           return v.id;
+         });
+         vertices = [];
+         ways = [];
+         vertexIds.forEach(function (id) {
+           var vertex = vgraph.entity(id);
+           var parents = vgraph.parentWays(vertex);
+           vertices.push(vertex);
+           ways = ways.concat(parents);
+         });
+         vertices = utilArrayUniq(vertices);
+         ways = utilArrayUniq(ways);
+         vertexIds = vertices.map(function (v) {
+           return v.id;
+         });
+         wayIds = ways.map(function (w) {
+           return w.id;
+         }); // STEP 6:  Update the ways with some metadata that will be useful for
+         // walking the intersection graph later and rendering turn arrows.
+
+         function withMetadata(way, vertexIds) {
+           var __oneWay = way.isOneWay(); // which affixes are key vertices?
+
+
+           var __first = vertexIds.indexOf(way.first()) !== -1;
+
+           var __last = vertexIds.indexOf(way.last()) !== -1; // what roles is this way eligible for?
+
+
+           var __via = __first && __last;
+
+           var __from = __first && !__oneWay || __last;
+
+           var __to = __first || __last && !__oneWay;
+
+           return way.update({
+             __first: __first,
+             __last: __last,
+             __from: __from,
+             __via: __via,
+             __to: __to,
+             __oneWay: __oneWay
+           });
+         }
+
+         ways = [];
+         wayIds.forEach(function (id) {
+           var way = withMetadata(vgraph.entity(id), vertexIds);
+           vgraph = vgraph.replace(way);
+           ways.push(way);
+         }); // STEP 7:  Simplify - This is an iterative process where we:
+         //  1. Find trivial vertices with only 2 parents
+         //  2. trim off the leaf way from those vertices and remove from vgraph
+
+         var keepGoing;
+         var removeWayIds = [];
+         var removeVertexIds = [];
+
+         do {
+           keepGoing = false;
+           checkVertices = vertexIds.slice();
+
+           for (i = 0; i < checkVertices.length; i++) {
+             var vertexId = checkVertices[i];
+             vertex = vgraph.hasEntity(vertexId);
+
+             if (!vertex) {
+               if (vertexIds.indexOf(vertexId) !== -1) {
+                 vertexIds.splice(vertexIds.indexOf(vertexId), 1); // stop checking this one
+               }
+
+               removeVertexIds.push(vertexId);
+               continue;
+             }
+
+             parents = vgraph.parentWays(vertex);
+
+             if (parents.length < 3) {
+               if (vertexIds.indexOf(vertexId) !== -1) {
+                 vertexIds.splice(vertexIds.indexOf(vertexId), 1); // stop checking this one
+               }
+             }
+
+             if (parents.length === 2) {
+               // vertex with 2 parents is trivial
+               var a = parents[0];
+               var b = parents[1];
+               var aIsLeaf = a && !a.__via;
+               var bIsLeaf = b && !b.__via;
+               var leaf, survivor;
+
+               if (aIsLeaf && !bIsLeaf) {
+                 leaf = a;
+                 survivor = b;
+               } else if (!aIsLeaf && bIsLeaf) {
+                 leaf = b;
+                 survivor = a;
+               }
+
+               if (leaf && survivor) {
+                 survivor = withMetadata(survivor, vertexIds); // update survivor way
+
+                 vgraph = vgraph.replace(survivor).remove(leaf); // update graph
+
+                 removeWayIds.push(leaf.id);
+                 keepGoing = true;
+               }
+             }
+
+             parents = vgraph.parentWays(vertex);
+
+             if (parents.length < 2) {
+               // vertex is no longer a key vertex
+               if (vertexIds.indexOf(vertexId) !== -1) {
+                 vertexIds.splice(vertexIds.indexOf(vertexId), 1); // stop checking this one
+               }
+
+               removeVertexIds.push(vertexId);
+               keepGoing = true;
+             }
+
+             if (parents.length < 1) {
+               // vertex is no longer attached to anything
+               vgraph = vgraph.remove(vertex);
+             }
+           }
+         } while (keepGoing);
+
+         vertices = vertices.filter(function (vertex) {
+           return removeVertexIds.indexOf(vertex.id) === -1;
+         }).map(function (vertex) {
+           return vgraph.entity(vertex.id);
+         });
+         ways = ways.filter(function (way) {
+           return removeWayIds.indexOf(way.id) === -1;
+         }).map(function (way) {
+           return vgraph.entity(way.id);
+         }); // OK!  Here is our intersection..
+
+         var intersection = {
+           graph: vgraph,
+           actions: actions,
+           vertices: vertices,
+           ways: ways
+         }; // Get all the valid turns through this intersection given a starting way id.
+         // This operates on the virtual graph for everything.
+         //
+         // Basically, walk through all possible paths from starting way,
+         //   honoring the existing turn restrictions as we go (watch out for loops!)
+         //
+         // For each path found, generate and return a `osmTurn` datastructure.
+         //
+
+         intersection.turns = function (fromWayId, maxViaWay) {
+           if (!fromWayId) return [];
+           if (!maxViaWay) maxViaWay = 0;
+           var vgraph = intersection.graph;
+           var keyVertexIds = intersection.vertices.map(function (v) {
+             return v.id;
+           });
+           var start = vgraph.entity(fromWayId);
+           if (!start || !(start.__from || start.__via)) return []; // maxViaWay=0   from-*-to              (0 vias)
+           // maxViaWay=1   from-*-via-*-to        (1 via max)
+           // maxViaWay=2   from-*-via-*-via-*-to  (2 vias max)
+
+           var maxPathLength = maxViaWay * 2 + 3;
+           var turns = [];
+           step(start);
+           return turns; // traverse the intersection graph and find all the valid paths
+
+           function step(entity, currPath, currRestrictions, matchedRestriction) {
+             currPath = (currPath || []).slice(); // shallow copy
+
+             if (currPath.length >= maxPathLength) return;
+             currPath.push(entity.id);
+             currRestrictions = (currRestrictions || []).slice(); // shallow copy
+
+             var i, j;
+
+             if (entity.type === 'node') {
+               var parents = vgraph.parentWays(entity);
+               var nextWays = []; // which ways can we step into?
+
+               for (i = 0; i < parents.length; i++) {
+                 var way = parents[i]; // if next way is a oneway incoming to this vertex, skip
+
+                 if (way.__oneWay && way.nodes[0] !== entity.id) continue; // if we have seen it before (allowing for an initial u-turn), skip
+
+                 if (currPath.indexOf(way.id) !== -1 && currPath.length >= 3) continue; // Check all "current" restrictions (where we've already walked the `FROM`)
+
+                 var restrict = null;
+
+                 for (j = 0; j < currRestrictions.length; j++) {
+                   var restriction = currRestrictions[j];
+                   var f = restriction.memberByRole('from');
+                   var v = restriction.membersByRole('via');
+                   var t = restriction.memberByRole('to');
+                   var isOnly = /^only_/.test(restriction.tags.restriction); // Does the current path match this turn restriction?
+
+                   var matchesFrom = f.id === fromWayId;
+                   var matchesViaTo = false;
+                   var isAlongOnlyPath = false;
+
+                   if (t.id === way.id) {
+                     // match TO
+                     if (v.length === 1 && v[0].type === 'node') {
+                       // match VIA node
+                       matchesViaTo = v[0].id === entity.id && (matchesFrom && currPath.length === 2 || !matchesFrom && currPath.length > 2);
+                     } else {
+                       // match all VIA ways
+                       var pathVias = [];
+
+                       for (k = 2; k < currPath.length; k += 2) {
+                         // k = 2 skips FROM
+                         pathVias.push(currPath[k]); // (path goes way-node-way...)
+                       }
+
+                       var restrictionVias = [];
+
+                       for (k = 0; k < v.length; k++) {
+                         if (v[k].type === 'way') {
+                           restrictionVias.push(v[k].id);
+                         }
+                       }
+
+                       var diff = utilArrayDifference(pathVias, restrictionVias);
+                       matchesViaTo = !diff.length;
+                     }
+                   } else if (isOnly) {
+                     for (k = 0; k < v.length; k++) {
+                       // way doesn't match TO, but is one of the via ways along the path of an "only"
+                       if (v[k].type === 'way' && v[k].id === way.id) {
+                         isAlongOnlyPath = true;
+                         break;
+                       }
+                     }
+                   }
+
+                   if (matchesViaTo) {
+                     if (isOnly) {
+                       restrict = {
+                         id: restriction.id,
+                         direct: matchesFrom,
+                         from: f.id,
+                         only: true,
+                         end: true
+                       };
+                     } else {
+                       restrict = {
+                         id: restriction.id,
+                         direct: matchesFrom,
+                         from: f.id,
+                         no: true,
+                         end: true
+                       };
+                     }
+                   } else {
+                     // indirect - caused by a different nearby restriction
+                     if (isAlongOnlyPath) {
+                       restrict = {
+                         id: restriction.id,
+                         direct: false,
+                         from: f.id,
+                         only: true,
+                         end: false
+                       };
+                     } else if (isOnly) {
+                       restrict = {
+                         id: restriction.id,
+                         direct: false,
+                         from: f.id,
+                         no: true,
+                         end: true
+                       };
+                     }
+                   } // stop looking if we find a "direct" restriction (matching FROM, VIA, TO)
+
+
+                   if (restrict && restrict.direct) break;
+                 }
+
+                 nextWays.push({
+                   way: way,
+                   restrict: restrict
+                 });
+               }
+
+               nextWays.forEach(function (nextWay) {
+                 step(nextWay.way, currPath, currRestrictions, nextWay.restrict);
+               });
+             } else {
+               // entity.type === 'way'
+               if (currPath.length >= 3) {
+                 // this is a "complete" path..
+                 var turnPath = currPath.slice(); // shallow copy
+                 // an indirect restriction - only include the partial path (starting at FROM)
+
+                 if (matchedRestriction && matchedRestriction.direct === false) {
+                   for (i = 0; i < turnPath.length; i++) {
+                     if (turnPath[i] === matchedRestriction.from) {
+                       turnPath = turnPath.slice(i);
+                       break;
+                     }
+                   }
+                 }
+
+                 var turn = pathToTurn(turnPath);
+
+                 if (turn) {
+                   if (matchedRestriction) {
+                     turn.restrictionID = matchedRestriction.id;
+                     turn.no = matchedRestriction.no;
+                     turn.only = matchedRestriction.only;
+                     turn.direct = matchedRestriction.direct;
+                   }
+
+                   turns.push(osmTurn(turn));
+                 }
+
+                 if (currPath[0] === currPath[2]) return; // if we made a u-turn - stop here
+               }
+
+               if (matchedRestriction && matchedRestriction.end) return; // don't advance any further
+               // which nodes can we step into?
+
+               var n1 = vgraph.entity(entity.first());
+               var n2 = vgraph.entity(entity.last());
+               var dist = geoSphericalDistance(n1.loc, n2.loc);
+               var nextNodes = [];
+
+               if (currPath.length > 1) {
+                 if (dist > maxDistance) return; // the next node is too far
+
+                 if (!entity.__via) return; // this way is a leaf / can't be a via
+               }
+
+               if (!entity.__oneWay && // bidirectional..
+               keyVertexIds.indexOf(n1.id) !== -1 && // key vertex..
+               currPath.indexOf(n1.id) === -1) {
+                 // haven't seen it yet..
+                 nextNodes.push(n1); // can advance to first node
+               }
+
+               if (keyVertexIds.indexOf(n2.id) !== -1 && // key vertex..
+               currPath.indexOf(n2.id) === -1) {
+                 // haven't seen it yet..
+                 nextNodes.push(n2); // can advance to last node
+               }
+
+               nextNodes.forEach(function (nextNode) {
+                 // gather restrictions FROM this way
+                 var fromRestrictions = vgraph.parentRelations(entity).filter(function (r) {
+                   if (!r.isRestriction()) return false;
+                   var f = r.memberByRole('from');
+                   if (!f || f.id !== entity.id) return false;
+                   var isOnly = /^only_/.test(r.tags.restriction);
+                   if (!isOnly) return true; // `only_` restrictions only matter along the direction of the VIA - #4849
+
+                   var isOnlyVia = false;
+                   var v = r.membersByRole('via');
+
+                   if (v.length === 1 && v[0].type === 'node') {
+                     // via node
+                     isOnlyVia = v[0].id === nextNode.id;
+                   } else {
+                     // via way(s)
+                     for (var i = 0; i < v.length; i++) {
+                       if (v[i].type !== 'way') continue;
+                       var viaWay = vgraph.entity(v[i].id);
+
+                       if (viaWay.first() === nextNode.id || viaWay.last() === nextNode.id) {
+                         isOnlyVia = true;
+                         break;
+                       }
+                     }
+                   }
+
+                   return isOnlyVia;
+                 });
+                 step(nextNode, currPath, currRestrictions.concat(fromRestrictions), false);
+               });
+             }
+           } // assumes path is alternating way-node-way of odd length
+
+
+           function pathToTurn(path) {
+             if (path.length < 3) return;
+             var fromWayId, fromNodeId, fromVertexId;
+             var toWayId, toNodeId, toVertexId;
+             var viaWayIds, viaNodeId, isUturn;
+             fromWayId = path[0];
+             toWayId = path[path.length - 1];
+
+             if (path.length === 3 && fromWayId === toWayId) {
+               // u turn
+               var way = vgraph.entity(fromWayId);
+               if (way.__oneWay) return null;
+               isUturn = true;
+               viaNodeId = fromVertexId = toVertexId = path[1];
+               fromNodeId = toNodeId = adjacentNode(fromWayId, viaNodeId);
+             } else {
+               isUturn = false;
+               fromVertexId = path[1];
+               fromNodeId = adjacentNode(fromWayId, fromVertexId);
+               toVertexId = path[path.length - 2];
+               toNodeId = adjacentNode(toWayId, toVertexId);
+
+               if (path.length === 3) {
+                 viaNodeId = path[1];
+               } else {
+                 viaWayIds = path.filter(function (entityId) {
+                   return entityId[0] === 'w';
+                 });
+                 viaWayIds = viaWayIds.slice(1, viaWayIds.length - 1); // remove first, last
+               }
+             }
+
+             return {
+               key: path.join('_'),
+               path: path,
+               from: {
+                 node: fromNodeId,
+                 way: fromWayId,
+                 vertex: fromVertexId
+               },
+               via: {
+                 node: viaNodeId,
+                 ways: viaWayIds
+               },
+               to: {
+                 node: toNodeId,
+                 way: toWayId,
+                 vertex: toVertexId
+               },
+               u: isUturn
+             };
+
+             function adjacentNode(wayId, affixId) {
+               var nodes = vgraph.entity(wayId).nodes;
+               return affixId === nodes[0] ? nodes[1] : nodes[nodes.length - 2];
+             }
+           }
+         };
+
+         return intersection;
+       }
+       function osmInferRestriction(graph, turn, projection) {
+         var fromWay = graph.entity(turn.from.way);
+         var fromNode = graph.entity(turn.from.node);
+         var fromVertex = graph.entity(turn.from.vertex);
+         var toWay = graph.entity(turn.to.way);
+         var toNode = graph.entity(turn.to.node);
+         var toVertex = graph.entity(turn.to.vertex);
+         var fromOneWay = fromWay.tags.oneway === 'yes';
+         var toOneWay = toWay.tags.oneway === 'yes';
+         var angle = (geoAngle(fromVertex, fromNode, projection) - geoAngle(toVertex, toNode, projection)) * 180 / Math.PI;
+
+         while (angle < 0) {
+           angle += 360;
+         }
+
+         if (fromNode === toNode) {
+           return 'no_u_turn';
+         }
+
+         if ((angle < 23 || angle > 336) && fromOneWay && toOneWay) {
+           return 'no_u_turn'; // wider tolerance for u-turn if both ways are oneway
+         }
+
+         if ((angle < 40 || angle > 319) && fromOneWay && toOneWay && turn.from.vertex !== turn.to.vertex) {
+           return 'no_u_turn'; // even wider tolerance for u-turn if there is a via way (from !== to)
+         }
+
+         if (angle < 158) {
+           return 'no_right_turn';
+         }
+
+         if (angle > 202) {
+           return 'no_left_turn';
+         }
+
+         return 'no_straight_on';
+       }
+
+       function actionMergePolygon(ids, newRelationId) {
+         function groupEntities(graph) {
+           var entities = ids.map(function (id) {
+             return graph.entity(id);
+           });
+           var geometryGroups = utilArrayGroupBy(entities, function (entity) {
+             if (entity.type === 'way' && entity.isClosed()) {
+               return 'closedWay';
+             } else if (entity.type === 'relation' && entity.isMultipolygon()) {
+               return 'multipolygon';
+             } else {
+               return 'other';
+             }
+           });
+           return Object.assign({
+             closedWay: [],
+             multipolygon: [],
+             other: []
+           }, geometryGroups);
+         }
+
+         var action = function action(graph) {
+           var entities = groupEntities(graph); // An array representing all the polygons that are part of the multipolygon.
+           //
+           // Each element is itself an array of objects with an id property, and has a
+           // locs property which is an array of the locations forming the polygon.
+
+           var polygons = entities.multipolygon.reduce(function (polygons, m) {
+             return polygons.concat(osmJoinWays(m.members, graph));
+           }, []).concat(entities.closedWay.map(function (d) {
+             var member = [{
+               id: d.id
+             }];
+             member.nodes = graph.childNodes(d);
+             return member;
+           })); // contained is an array of arrays of boolean values,
+           // where contained[j][k] is true iff the jth way is
+           // contained by the kth way.
+
+           var contained = polygons.map(function (w, i) {
+             return polygons.map(function (d, n) {
+               if (i === n) return null;
+               return geoPolygonContainsPolygon(d.nodes.map(function (n) {
+                 return n.loc;
+               }), w.nodes.map(function (n) {
+                 return n.loc;
+               }));
+             });
+           }); // Sort all polygons as either outer or inner ways
+
+           var members = [];
+           var outer = true;
+
+           while (polygons.length) {
+             extractUncontained(polygons);
+             polygons = polygons.filter(isContained);
+             contained = contained.filter(isContained).map(filterContained);
+           }
+
+           function isContained(d, i) {
+             return contained[i].some(function (val) {
+               return val;
+             });
+           }
+
+           function filterContained(d) {
+             return d.filter(isContained);
+           }
+
+           function extractUncontained(polygons) {
+             polygons.forEach(function (d, i) {
+               if (!isContained(d, i)) {
+                 d.forEach(function (member) {
+                   members.push({
+                     type: 'way',
+                     id: member.id,
+                     role: outer ? 'outer' : 'inner'
+                   });
+                 });
+               }
+             });
+             outer = !outer;
+           } // Move all tags to one relation.
+           // Keep the oldest multipolygon alive if it exists.
+
+
+           var relation;
+
+           if (entities.multipolygon.length > 0) {
+             var oldestID = utilOldestID(entities.multipolygon.map(function (entity) {
+               return entity.id;
+             }));
+             relation = entities.multipolygon.find(function (entity) {
+               return entity.id === oldestID;
+             });
+           } else {
+             relation = osmRelation({
+               id: newRelationId,
+               tags: {
+                 type: 'multipolygon'
+               }
+             });
+           }
+
+           entities.multipolygon.forEach(function (m) {
+             if (m.id !== relation.id) {
+               relation = relation.mergeTags(m.tags);
+               graph = graph.remove(m);
+             }
+           });
+           entities.closedWay.forEach(function (way) {
+             function isThisOuter(m) {
+               return m.id === way.id && m.role !== 'inner';
+             }
+
+             if (members.some(isThisOuter)) {
+               relation = relation.mergeTags(way.tags);
+               graph = graph.replace(way.update({
+                 tags: {}
+               }));
+             }
+           });
+           return graph.replace(relation.update({
+             members: members,
+             tags: utilObjectOmit(relation.tags, ['area'])
+           }));
+         };
+
+         action.disabled = function (graph) {
+           var entities = groupEntities(graph);
+
+           if (entities.other.length > 0 || entities.closedWay.length + entities.multipolygon.length < 2) {
+             return 'not_eligible';
+           }
+
+           if (!entities.multipolygon.every(function (r) {
+             return r.isComplete(graph);
+           })) {
+             return 'incomplete_relation';
+           }
+
+           if (!entities.multipolygon.length) {
+             var sharedMultipolygons = [];
+             entities.closedWay.forEach(function (way, i) {
+               if (i === 0) {
+                 sharedMultipolygons = graph.parentMultipolygons(way);
+               } else {
+                 sharedMultipolygons = utilArrayIntersection(sharedMultipolygons, graph.parentMultipolygons(way));
+               }
+             });
+             sharedMultipolygons = sharedMultipolygons.filter(function (relation) {
+               return relation.members.length === entities.closedWay.length;
+             });
+
+             if (sharedMultipolygons.length) {
+               // don't create a new multipolygon if it'd be redundant
+               return 'not_eligible';
+             }
+           } else if (entities.closedWay.some(function (way) {
+             return utilArrayIntersection(graph.parentMultipolygons(way), entities.multipolygon).length;
+           })) {
+             // don't add a way to a multipolygon again if it's already a member
+             return 'not_eligible';
+           }
+         };
+
+         return action;
+       }
+
+       var DESCRIPTORS$1 = descriptors;
+       var objectDefinePropertyModule = objectDefineProperty;
+       var regExpFlags = regexpFlags$1;
+       var fails$4 = fails$V;
+
+       var RegExpPrototype = RegExp.prototype;
+
+       var FORCED$2 = DESCRIPTORS$1 && fails$4(function () {
+         // eslint-disable-next-line es/no-object-getownpropertydescriptor -- safe
+         return Object.getOwnPropertyDescriptor(RegExpPrototype, 'flags').get.call({ dotAll: true, sticky: true }) !== 'sy';
+       });
+
+       // `RegExp.prototype.flags` getter
+       // https://tc39.es/ecma262/#sec-get-regexp.prototype.flags
+       if (FORCED$2) objectDefinePropertyModule.f(RegExpPrototype, 'flags', {
+         configurable: true,
+         get: regExpFlags
+       });
+
+       var fastDeepEqual = function equal(a, b) {
+         if (a === b) return true;
+
+         if (a && b && _typeof(a) == 'object' && _typeof(b) == 'object') {
+           if (a.constructor !== b.constructor) return false;
+           var length, i, keys;
+
+           if (Array.isArray(a)) {
+             length = a.length;
+             if (length != b.length) return false;
+
+             for (i = length; i-- !== 0;) {
+               if (!equal(a[i], b[i])) return false;
+             }
+
+             return true;
+           }
+
+           if (a.constructor === RegExp) return a.source === b.source && a.flags === b.flags;
+           if (a.valueOf !== Object.prototype.valueOf) return a.valueOf() === b.valueOf();
+           if (a.toString !== Object.prototype.toString) return a.toString() === b.toString();
+           keys = Object.keys(a);
+           length = keys.length;
+           if (length !== Object.keys(b).length) return false;
+
+           for (i = length; i-- !== 0;) {
+             if (!Object.prototype.hasOwnProperty.call(b, keys[i])) return false;
+           }
+
+           for (i = length; i-- !== 0;) {
+             var key = keys[i];
+             if (!equal(a[key], b[key])) return false;
+           }
+
+           return true;
+         } // true if both NaN, false otherwise
+
+
+         return a !== a && b !== b;
+       };
+
+       // J. W. Hunt and M. D. McIlroy, An algorithm for differential buffer
+       // comparison, Bell Telephone Laboratories CSTR #41 (1976)
+       // http://www.cs.dartmouth.edu/~doug/
+       // https://en.wikipedia.org/wiki/Longest_common_subsequence_problem
+       //
+       // Expects two arrays, finds longest common sequence
+
+       function LCS(buffer1, buffer2) {
+         var equivalenceClasses = {};
+
+         for (var j = 0; j < buffer2.length; j++) {
+           var item = buffer2[j];
+
+           if (equivalenceClasses[item]) {
+             equivalenceClasses[item].push(j);
+           } else {
+             equivalenceClasses[item] = [j];
+           }
+         }
+
+         var NULLRESULT = {
+           buffer1index: -1,
+           buffer2index: -1,
+           chain: null
+         };
+         var candidates = [NULLRESULT];
+
+         for (var i = 0; i < buffer1.length; i++) {
+           var _item = buffer1[i];
+           var buffer2indices = equivalenceClasses[_item] || [];
+           var r = 0;
+           var c = candidates[0];
+
+           for (var jx = 0; jx < buffer2indices.length; jx++) {
+             var _j = buffer2indices[jx];
+             var s = void 0;
+
+             for (s = r; s < candidates.length; s++) {
+               if (candidates[s].buffer2index < _j && (s === candidates.length - 1 || candidates[s + 1].buffer2index > _j)) {
+                 break;
+               }
+             }
+
+             if (s < candidates.length) {
+               var newCandidate = {
+                 buffer1index: i,
+                 buffer2index: _j,
+                 chain: candidates[s]
+               };
+
+               if (r === candidates.length) {
+                 candidates.push(c);
+               } else {
+                 candidates[r] = c;
+               }
+
+               r = s + 1;
+               c = newCandidate;
+
+               if (r === candidates.length) {
+                 break; // no point in examining further (j)s
+               }
+             }
+           }
+
+           candidates[r] = c;
+         } // At this point, we know the LCS: it's in the reverse of the
+         // linked-list through .chain of candidates[candidates.length - 1].
+
+
+         return candidates[candidates.length - 1];
+       } // We apply the LCS to build a 'comm'-style picture of the
+       // offsets and lengths of mismatched chunks in the input
+       // buffers. This is used by diff3MergeRegions.
+
+
+       function diffIndices(buffer1, buffer2) {
+         var lcs = LCS(buffer1, buffer2);
+         var result = [];
+         var tail1 = buffer1.length;
+         var tail2 = buffer2.length;
+
+         for (var candidate = lcs; candidate !== null; candidate = candidate.chain) {
+           var mismatchLength1 = tail1 - candidate.buffer1index - 1;
+           var mismatchLength2 = tail2 - candidate.buffer2index - 1;
+           tail1 = candidate.buffer1index;
+           tail2 = candidate.buffer2index;
+
+           if (mismatchLength1 || mismatchLength2) {
+             result.push({
+               buffer1: [tail1 + 1, mismatchLength1],
+               buffer1Content: buffer1.slice(tail1 + 1, tail1 + 1 + mismatchLength1),
+               buffer2: [tail2 + 1, mismatchLength2],
+               buffer2Content: buffer2.slice(tail2 + 1, tail2 + 1 + mismatchLength2)
+             });
+           }
+         }
+
+         result.reverse();
+         return result;
+       } // We apply the LCS to build a JSON representation of a
+       // independently derived from O, returns a fairly complicated
+       // internal representation of merge decisions it's taken. The
+       // interested reader may wish to consult
+       //
+       // Sanjeev Khanna, Keshav Kunal, and Benjamin C. Pierce.
+       // 'A Formal Investigation of ' In Arvind and Prasad,
+       // editors, Foundations of Software Technology and Theoretical
+       // Computer Science (FSTTCS), December 2007.
+       //
+       // (http://www.cis.upenn.edu/~bcpierce/papers/diff3-short.pdf)
+       //
+
+
+       function diff3MergeRegions(a, o, b) {
+         // "hunks" are array subsets where `a` or `b` are different from `o`
+         // https://www.gnu.org/software/diffutils/manual/html_node/diff3-Hunks.html
+         var hunks = [];
+
+         function addHunk(h, ab) {
+           hunks.push({
+             ab: ab,
+             oStart: h.buffer1[0],
+             oLength: h.buffer1[1],
+             // length of o to remove
+             abStart: h.buffer2[0],
+             abLength: h.buffer2[1] // length of a/b to insert
+             // abContent: (ab === 'a' ? a : b).slice(h.buffer2[0], h.buffer2[0] + h.buffer2[1])
+
+           });
+         }
+
+         diffIndices(o, a).forEach(function (item) {
+           return addHunk(item, 'a');
+         });
+         diffIndices(o, b).forEach(function (item) {
+           return addHunk(item, 'b');
+         });
+         hunks.sort(function (x, y) {
+           return x.oStart - y.oStart;
+         });
+         var results = [];
+         var currOffset = 0;
+
+         function advanceTo(endOffset) {
+           if (endOffset > currOffset) {
+             results.push({
+               stable: true,
+               buffer: 'o',
+               bufferStart: currOffset,
+               bufferLength: endOffset - currOffset,
+               bufferContent: o.slice(currOffset, endOffset)
+             });
+             currOffset = endOffset;
+           }
+         }
+
+         while (hunks.length) {
+           var hunk = hunks.shift();
+           var regionStart = hunk.oStart;
+           var regionEnd = hunk.oStart + hunk.oLength;
+           var regionHunks = [hunk];
+           advanceTo(regionStart); // Try to pull next overlapping hunk into this region
+
+           while (hunks.length) {
+             var nextHunk = hunks[0];
+             var nextHunkStart = nextHunk.oStart;
+             if (nextHunkStart > regionEnd) break; // no overlap
+
+             regionEnd = Math.max(regionEnd, nextHunkStart + nextHunk.oLength);
+             regionHunks.push(hunks.shift());
+           }
+
+           if (regionHunks.length === 1) {
+             // Only one hunk touches this region, meaning that there is no conflict here.
+             // Either `a` or `b` is inserting into a region of `o` unchanged by the other.
+             if (hunk.abLength > 0) {
+               var buffer = hunk.ab === 'a' ? a : b;
+               results.push({
+                 stable: true,
+                 buffer: hunk.ab,
+                 bufferStart: hunk.abStart,
+                 bufferLength: hunk.abLength,
+                 bufferContent: buffer.slice(hunk.abStart, hunk.abStart + hunk.abLength)
+               });
+             }
+           } else {
+             // A true a/b conflict. Determine the bounds involved from `a`, `o`, and `b`.
+             // Effectively merge all the `a` hunks into one giant hunk, then do the
+             // same for the `b` hunks; then, correct for skew in the regions of `o`
+             // that each side changed, and report appropriate spans for the three sides.
+             var bounds = {
+               a: [a.length, -1, o.length, -1],
+               b: [b.length, -1, o.length, -1]
+             };
+
+             while (regionHunks.length) {
+               hunk = regionHunks.shift();
+               var oStart = hunk.oStart;
+               var oEnd = oStart + hunk.oLength;
+               var abStart = hunk.abStart;
+               var abEnd = abStart + hunk.abLength;
+               var _b = bounds[hunk.ab];
+               _b[0] = Math.min(abStart, _b[0]);
+               _b[1] = Math.max(abEnd, _b[1]);
+               _b[2] = Math.min(oStart, _b[2]);
+               _b[3] = Math.max(oEnd, _b[3]);
+             }
+
+             var aStart = bounds.a[0] + (regionStart - bounds.a[2]);
+             var aEnd = bounds.a[1] + (regionEnd - bounds.a[3]);
+             var bStart = bounds.b[0] + (regionStart - bounds.b[2]);
+             var bEnd = bounds.b[1] + (regionEnd - bounds.b[3]);
+             var result = {
+               stable: false,
+               aStart: aStart,
+               aLength: aEnd - aStart,
+               aContent: a.slice(aStart, aEnd),
+               oStart: regionStart,
+               oLength: regionEnd - regionStart,
+               oContent: o.slice(regionStart, regionEnd),
+               bStart: bStart,
+               bLength: bEnd - bStart,
+               bContent: b.slice(bStart, bEnd)
+             };
+             results.push(result);
+           }
+
+           currOffset = regionEnd;
+         }
+
+         advanceTo(o.length);
+         return results;
+       } // Applies the output of diff3MergeRegions to actually
+       // construct the merged buffer; the returned result alternates
+       // between 'ok' and 'conflict' blocks.
+       // A "false conflict" is where `a` and `b` both change the same from `o`
+
+
+       function diff3Merge(a, o, b, options) {
+         var defaults = {
+           excludeFalseConflicts: true,
+           stringSeparator: /\s+/
+         };
+         options = Object.assign(defaults, options);
+         var aString = typeof a === 'string';
+         var oString = typeof o === 'string';
+         var bString = typeof b === 'string';
+         if (aString) a = a.split(options.stringSeparator);
+         if (oString) o = o.split(options.stringSeparator);
+         if (bString) b = b.split(options.stringSeparator);
+         var results = [];
+         var regions = diff3MergeRegions(a, o, b);
+         var okBuffer = [];
+
+         function flushOk() {
+           if (okBuffer.length) {
+             results.push({
+               ok: okBuffer
+             });
+           }
+
+           okBuffer = [];
+         }
+
+         function isFalseConflict(a, b) {
+           if (a.length !== b.length) return false;
+
+           for (var i = 0; i < a.length; i++) {
+             if (a[i] !== b[i]) return false;
+           }
+
+           return true;
+         }
+
+         regions.forEach(function (region) {
+           if (region.stable) {
+             var _okBuffer;
+
+             (_okBuffer = okBuffer).push.apply(_okBuffer, _toConsumableArray(region.bufferContent));
+           } else {
+             if (options.excludeFalseConflicts && isFalseConflict(region.aContent, region.bContent)) {
+               var _okBuffer2;
+
+               (_okBuffer2 = okBuffer).push.apply(_okBuffer2, _toConsumableArray(region.aContent));
+             } else {
+               flushOk();
+               results.push({
+                 conflict: {
+                   a: region.aContent,
+                   aIndex: region.aStart,
+                   o: region.oContent,
+                   oIndex: region.oStart,
+                   b: region.bContent,
+                   bIndex: region.bStart
+                 }
+               });
+             }
+           }
+         });
+         flushOk();
+         return results;
+       }
+
+       var lodash = {exports: {}};
+
+       (function (module, exports) {
+         (function () {
+           /** Used as a safe reference for `undefined` in pre-ES5 environments. */
+           var undefined$1;
+           /** Used as the semantic version number. */
+
+           var VERSION = '4.17.21';
+           /** Used as the size to enable large array optimizations. */
+
+           var LARGE_ARRAY_SIZE = 200;
+           /** Error message constants. */
+
+           var CORE_ERROR_TEXT = 'Unsupported core-js use. Try https://npms.io/search?q=ponyfill.',
+               FUNC_ERROR_TEXT = 'Expected a function',
+               INVALID_TEMPL_VAR_ERROR_TEXT = 'Invalid `variable` option passed into `_.template`';
+           /** Used to stand-in for `undefined` hash values. */
+
+           var HASH_UNDEFINED = '__lodash_hash_undefined__';
+           /** Used as the maximum memoize cache size. */
+
+           var MAX_MEMOIZE_SIZE = 500;
+           /** Used as the internal argument placeholder. */
+
+           var PLACEHOLDER = '__lodash_placeholder__';
+           /** Used to compose bitmasks for cloning. */
+
+           var CLONE_DEEP_FLAG = 1,
+               CLONE_FLAT_FLAG = 2,
+               CLONE_SYMBOLS_FLAG = 4;
+           /** Used to compose bitmasks for value comparisons. */
+
+           var COMPARE_PARTIAL_FLAG = 1,
+               COMPARE_UNORDERED_FLAG = 2;
+           /** Used to compose bitmasks for function metadata. */
+
+           var WRAP_BIND_FLAG = 1,
+               WRAP_BIND_KEY_FLAG = 2,
+               WRAP_CURRY_BOUND_FLAG = 4,
+               WRAP_CURRY_FLAG = 8,
+               WRAP_CURRY_RIGHT_FLAG = 16,
+               WRAP_PARTIAL_FLAG = 32,
+               WRAP_PARTIAL_RIGHT_FLAG = 64,
+               WRAP_ARY_FLAG = 128,
+               WRAP_REARG_FLAG = 256,
+               WRAP_FLIP_FLAG = 512;
+           /** Used as default options for `_.truncate`. */
+
+           var DEFAULT_TRUNC_LENGTH = 30,
+               DEFAULT_TRUNC_OMISSION = '...';
+           /** Used to detect hot functions by number of calls within a span of milliseconds. */
+
+           var HOT_COUNT = 800,
+               HOT_SPAN = 16;
+           /** Used to indicate the type of lazy iteratees. */
+
+           var LAZY_FILTER_FLAG = 1,
+               LAZY_MAP_FLAG = 2,
+               LAZY_WHILE_FLAG = 3;
+           /** Used as references for various `Number` constants. */
+
+           var INFINITY = 1 / 0,
+               MAX_SAFE_INTEGER = 9007199254740991,
+               MAX_INTEGER = 1.7976931348623157e+308,
+               NAN = 0 / 0;
+           /** Used as references for the maximum length and index of an array. */
+
+           var MAX_ARRAY_LENGTH = 4294967295,
+               MAX_ARRAY_INDEX = MAX_ARRAY_LENGTH - 1,
+               HALF_MAX_ARRAY_LENGTH = MAX_ARRAY_LENGTH >>> 1;
+           /** Used to associate wrap methods with their bit flags. */
+
+           var wrapFlags = [['ary', WRAP_ARY_FLAG], ['bind', WRAP_BIND_FLAG], ['bindKey', WRAP_BIND_KEY_FLAG], ['curry', WRAP_CURRY_FLAG], ['curryRight', WRAP_CURRY_RIGHT_FLAG], ['flip', WRAP_FLIP_FLAG], ['partial', WRAP_PARTIAL_FLAG], ['partialRight', WRAP_PARTIAL_RIGHT_FLAG], ['rearg', WRAP_REARG_FLAG]];
+           /** `Object#toString` result references. */
+
+           var argsTag = '[object Arguments]',
+               arrayTag = '[object Array]',
+               asyncTag = '[object AsyncFunction]',
+               boolTag = '[object Boolean]',
+               dateTag = '[object Date]',
+               domExcTag = '[object DOMException]',
+               errorTag = '[object Error]',
+               funcTag = '[object Function]',
+               genTag = '[object GeneratorFunction]',
+               mapTag = '[object Map]',
+               numberTag = '[object Number]',
+               nullTag = '[object Null]',
+               objectTag = '[object Object]',
+               promiseTag = '[object Promise]',
+               proxyTag = '[object Proxy]',
+               regexpTag = '[object RegExp]',
+               setTag = '[object Set]',
+               stringTag = '[object String]',
+               symbolTag = '[object Symbol]',
+               undefinedTag = '[object Undefined]',
+               weakMapTag = '[object WeakMap]',
+               weakSetTag = '[object WeakSet]';
+           var arrayBufferTag = '[object ArrayBuffer]',
+               dataViewTag = '[object DataView]',
+               float32Tag = '[object Float32Array]',
+               float64Tag = '[object Float64Array]',
+               int8Tag = '[object Int8Array]',
+               int16Tag = '[object Int16Array]',
+               int32Tag = '[object Int32Array]',
+               uint8Tag = '[object Uint8Array]',
+               uint8ClampedTag = '[object Uint8ClampedArray]',
+               uint16Tag = '[object Uint16Array]',
+               uint32Tag = '[object Uint32Array]';
+           /** Used to match empty string literals in compiled template source. */
+
+           var reEmptyStringLeading = /\b__p \+= '';/g,
+               reEmptyStringMiddle = /\b(__p \+=) '' \+/g,
+               reEmptyStringTrailing = /(__e\(.*?\)|\b__t\)) \+\n'';/g;
+           /** Used to match HTML entities and HTML characters. */
+
+           var reEscapedHtml = /&(?:amp|lt|gt|quot|#39);/g,
+               reUnescapedHtml = /[&<>"']/g,
+               reHasEscapedHtml = RegExp(reEscapedHtml.source),
+               reHasUnescapedHtml = RegExp(reUnescapedHtml.source);
+           /** Used to match template delimiters. */
+
+           var reEscape = /<%-([\s\S]+?)%>/g,
+               reEvaluate = /<%([\s\S]+?)%>/g,
+               reInterpolate = /<%=([\s\S]+?)%>/g;
+           /** Used to match property names within property paths. */
+
+           var reIsDeepProp = /\.|\[(?:[^[\]]*|(["'])(?:(?!\1)[^\\]|\\.)*?\1)\]/,
+               reIsPlainProp = /^\w*$/,
+               rePropName = /[^.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]|(?=(?:\.|\[\])(?:\.|\[\]|$))/g;
+           /**
+            * Used to match `RegExp`
+            * [syntax characters](http://ecma-international.org/ecma-262/7.0/#sec-patterns).
+            */
+
+           var reRegExpChar = /[\\^$.*+?()[\]{}|]/g,
+               reHasRegExpChar = RegExp(reRegExpChar.source);
+           /** Used to match leading whitespace. */
+
+           var reTrimStart = /^\s+/;
+           /** Used to match a single whitespace character. */
+
+           var reWhitespace = /\s/;
+           /** Used to match wrap detail comments. */
+
+           var reWrapComment = /\{(?:\n\/\* \[wrapped with .+\] \*\/)?\n?/,
+               reWrapDetails = /\{\n\/\* \[wrapped with (.+)\] \*/,
+               reSplitDetails = /,? & /;
+           /** Used to match words composed of alphanumeric characters. */
+
+           var reAsciiWord = /[^\x00-\x2f\x3a-\x40\x5b-\x60\x7b-\x7f]+/g;
+           /**
+            * Used to validate the `validate` option in `_.template` variable.
+            *
+            * Forbids characters which could potentially change the meaning of the function argument definition:
+            * - "()," (modification of function parameters)
+            * - "=" (default value)
+            * - "[]{}" (destructuring of function parameters)
+            * - "/" (beginning of a comment)
+            * - whitespace
+            */
+
+           var reForbiddenIdentifierChars = /[()=,{}\[\]\/\s]/;
+           /** Used to match backslashes in property paths. */
+
+           var reEscapeChar = /\\(\\)?/g;
+           /**
+            * Used to match
+            * [ES template delimiters](http://ecma-international.org/ecma-262/7.0/#sec-template-literal-lexical-components).
+            */
+
+           var reEsTemplate = /\$\{([^\\}]*(?:\\.[^\\}]*)*)\}/g;
+           /** Used to match `RegExp` flags from their coerced string values. */
+
+           var reFlags = /\w*$/;
+           /** Used to detect bad signed hexadecimal string values. */
+
+           var reIsBadHex = /^[-+]0x[0-9a-f]+$/i;
+           /** Used to detect binary string values. */
+
+           var reIsBinary = /^0b[01]+$/i;
+           /** Used to detect host constructors (Safari). */
+
+           var reIsHostCtor = /^\[object .+?Constructor\]$/;
+           /** Used to detect octal string values. */
+
+           var reIsOctal = /^0o[0-7]+$/i;
+           /** Used to detect unsigned integer values. */
+
+           var reIsUint = /^(?:0|[1-9]\d*)$/;
+           /** Used to match Latin Unicode letters (excluding mathematical operators). */
+
+           var reLatin = /[\xc0-\xd6\xd8-\xf6\xf8-\xff\u0100-\u017f]/g;
+           /** Used to ensure capturing order of template delimiters. */
+
+           var reNoMatch = /($^)/;
+           /** Used to match unescaped characters in compiled string literals. */
+
+           var reUnescapedString = /['\n\r\u2028\u2029\\]/g;
+           /** Used to compose unicode character classes. */
+
+           var rsAstralRange = "\\ud800-\\udfff",
+               rsComboMarksRange = "\\u0300-\\u036f",
+               reComboHalfMarksRange = "\\ufe20-\\ufe2f",
+               rsComboSymbolsRange = "\\u20d0-\\u20ff",
+               rsComboRange = rsComboMarksRange + reComboHalfMarksRange + rsComboSymbolsRange,
+               rsDingbatRange = "\\u2700-\\u27bf",
+               rsLowerRange = 'a-z\\xdf-\\xf6\\xf8-\\xff',
+               rsMathOpRange = '\\xac\\xb1\\xd7\\xf7',
+               rsNonCharRange = '\\x00-\\x2f\\x3a-\\x40\\x5b-\\x60\\x7b-\\xbf',
+               rsPunctuationRange = "\\u2000-\\u206f",
+               rsSpaceRange = " \\t\\x0b\\f\\xa0\\ufeff\\n\\r\\u2028\\u2029\\u1680\\u180e\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200a\\u202f\\u205f\\u3000",
+               rsUpperRange = 'A-Z\\xc0-\\xd6\\xd8-\\xde',
+               rsVarRange = "\\ufe0e\\ufe0f",
+               rsBreakRange = rsMathOpRange + rsNonCharRange + rsPunctuationRange + rsSpaceRange;
+           /** Used to compose unicode capture groups. */
+
+           var rsApos = "['\u2019]",
+               rsAstral = '[' + rsAstralRange + ']',
+               rsBreak = '[' + rsBreakRange + ']',
+               rsCombo = '[' + rsComboRange + ']',
+               rsDigits = '\\d+',
+               rsDingbat = '[' + rsDingbatRange + ']',
+               rsLower = '[' + rsLowerRange + ']',
+               rsMisc = '[^' + rsAstralRange + rsBreakRange + rsDigits + rsDingbatRange + rsLowerRange + rsUpperRange + ']',
+               rsFitz = "\\ud83c[\\udffb-\\udfff]",
+               rsModifier = '(?:' + rsCombo + '|' + rsFitz + ')',
+               rsNonAstral = '[^' + rsAstralRange + ']',
+               rsRegional = "(?:\\ud83c[\\udde6-\\uddff]){2}",
+               rsSurrPair = "[\\ud800-\\udbff][\\udc00-\\udfff]",
+               rsUpper = '[' + rsUpperRange + ']',
+               rsZWJ = "\\u200d";
+           /** Used to compose unicode regexes. */
+
+           var rsMiscLower = '(?:' + rsLower + '|' + rsMisc + ')',
+               rsMiscUpper = '(?:' + rsUpper + '|' + rsMisc + ')',
+               rsOptContrLower = '(?:' + rsApos + '(?:d|ll|m|re|s|t|ve))?',
+               rsOptContrUpper = '(?:' + rsApos + '(?:D|LL|M|RE|S|T|VE))?',
+               reOptMod = rsModifier + '?',
+               rsOptVar = '[' + rsVarRange + ']?',
+               rsOptJoin = '(?:' + rsZWJ + '(?:' + [rsNonAstral, rsRegional, rsSurrPair].join('|') + ')' + rsOptVar + reOptMod + ')*',
+               rsOrdLower = '\\d*(?:1st|2nd|3rd|(?![123])\\dth)(?=\\b|[A-Z_])',
+               rsOrdUpper = '\\d*(?:1ST|2ND|3RD|(?![123])\\dTH)(?=\\b|[a-z_])',
+               rsSeq = rsOptVar + reOptMod + rsOptJoin,
+               rsEmoji = '(?:' + [rsDingbat, rsRegional, rsSurrPair].join('|') + ')' + rsSeq,
+               rsSymbol = '(?:' + [rsNonAstral + rsCombo + '?', rsCombo, rsRegional, rsSurrPair, rsAstral].join('|') + ')';
+           /** Used to match apostrophes. */
+
+           var reApos = RegExp(rsApos, 'g');
+           /**
+            * Used to match [combining diacritical marks](https://en.wikipedia.org/wiki/Combining_Diacritical_Marks) and
+            * [combining diacritical marks for symbols](https://en.wikipedia.org/wiki/Combining_Diacritical_Marks_for_Symbols).
+            */
+
+           var reComboMark = RegExp(rsCombo, 'g');
+           /** Used to match [string symbols](https://mathiasbynens.be/notes/javascript-unicode). */
+
+           var reUnicode = RegExp(rsFitz + '(?=' + rsFitz + ')|' + rsSymbol + rsSeq, 'g');
+           /** Used to match complex or compound words. */
+
+           var reUnicodeWord = RegExp([rsUpper + '?' + rsLower + '+' + rsOptContrLower + '(?=' + [rsBreak, rsUpper, '$'].join('|') + ')', rsMiscUpper + '+' + rsOptContrUpper + '(?=' + [rsBreak, rsUpper + rsMiscLower, '$'].join('|') + ')', rsUpper + '?' + rsMiscLower + '+' + rsOptContrLower, rsUpper + '+' + rsOptContrUpper, rsOrdUpper, rsOrdLower, rsDigits, rsEmoji].join('|'), 'g');
+           /** Used to detect strings with [zero-width joiners or code points from the astral planes](http://eev.ee/blog/2015/09/12/dark-corners-of-unicode/). */
+
+           var reHasUnicode = RegExp('[' + rsZWJ + rsAstralRange + rsComboRange + rsVarRange + ']');
+           /** Used to detect strings that need a more robust regexp to match words. */
+
+           var reHasUnicodeWord = /[a-z][A-Z]|[A-Z]{2}[a-z]|[0-9][a-zA-Z]|[a-zA-Z][0-9]|[^a-zA-Z0-9 ]/;
+           /** Used to assign default `context` object properties. */
+
+           var contextProps = ['Array', 'Buffer', 'DataView', 'Date', 'Error', 'Float32Array', 'Float64Array', 'Function', 'Int8Array', 'Int16Array', 'Int32Array', 'Map', 'Math', 'Object', 'Promise', 'RegExp', 'Set', 'String', 'Symbol', 'TypeError', 'Uint8Array', 'Uint8ClampedArray', 'Uint16Array', 'Uint32Array', 'WeakMap', '_', 'clearTimeout', 'isFinite', 'parseInt', 'setTimeout'];
+           /** Used to make template sourceURLs easier to identify. */
+
+           var templateCounter = -1;
+           /** Used to identify `toStringTag` values of typed arrays. */
+
+           var typedArrayTags = {};
+           typedArrayTags[float32Tag] = typedArrayTags[float64Tag] = typedArrayTags[int8Tag] = typedArrayTags[int16Tag] = typedArrayTags[int32Tag] = typedArrayTags[uint8Tag] = typedArrayTags[uint8ClampedTag] = typedArrayTags[uint16Tag] = typedArrayTags[uint32Tag] = true;
+           typedArrayTags[argsTag] = typedArrayTags[arrayTag] = typedArrayTags[arrayBufferTag] = typedArrayTags[boolTag] = typedArrayTags[dataViewTag] = typedArrayTags[dateTag] = typedArrayTags[errorTag] = typedArrayTags[funcTag] = typedArrayTags[mapTag] = typedArrayTags[numberTag] = typedArrayTags[objectTag] = typedArrayTags[regexpTag] = typedArrayTags[setTag] = typedArrayTags[stringTag] = typedArrayTags[weakMapTag] = false;
+           /** Used to identify `toStringTag` values supported by `_.clone`. */
+
+           var cloneableTags = {};
+           cloneableTags[argsTag] = cloneableTags[arrayTag] = cloneableTags[arrayBufferTag] = cloneableTags[dataViewTag] = cloneableTags[boolTag] = cloneableTags[dateTag] = cloneableTags[float32Tag] = cloneableTags[float64Tag] = cloneableTags[int8Tag] = cloneableTags[int16Tag] = cloneableTags[int32Tag] = cloneableTags[mapTag] = cloneableTags[numberTag] = cloneableTags[objectTag] = cloneableTags[regexpTag] = cloneableTags[setTag] = cloneableTags[stringTag] = cloneableTags[symbolTag] = cloneableTags[uint8Tag] = cloneableTags[uint8ClampedTag] = cloneableTags[uint16Tag] = cloneableTags[uint32Tag] = true;
+           cloneableTags[errorTag] = cloneableTags[funcTag] = cloneableTags[weakMapTag] = false;
+           /** Used to map Latin Unicode letters to basic Latin letters. */
+
+           var deburredLetters = {
+             // Latin-1 Supplement block.
+             '\xc0': 'A',
+             '\xc1': 'A',
+             '\xc2': 'A',
+             '\xc3': 'A',
+             '\xc4': 'A',
+             '\xc5': 'A',
+             '\xe0': 'a',
+             '\xe1': 'a',
+             '\xe2': 'a',
+             '\xe3': 'a',
+             '\xe4': 'a',
+             '\xe5': 'a',
+             '\xc7': 'C',
+             '\xe7': 'c',
+             '\xd0': 'D',
+             '\xf0': 'd',
+             '\xc8': 'E',
+             '\xc9': 'E',
+             '\xca': 'E',
+             '\xcb': 'E',
+             '\xe8': 'e',
+             '\xe9': 'e',
+             '\xea': 'e',
+             '\xeb': 'e',
+             '\xcc': 'I',
+             '\xcd': 'I',
+             '\xce': 'I',
+             '\xcf': 'I',
+             '\xec': 'i',
+             '\xed': 'i',
+             '\xee': 'i',
+             '\xef': 'i',
+             '\xd1': 'N',
+             '\xf1': 'n',
+             '\xd2': 'O',
+             '\xd3': 'O',
+             '\xd4': 'O',
+             '\xd5': 'O',
+             '\xd6': 'O',
+             '\xd8': 'O',
+             '\xf2': 'o',
+             '\xf3': 'o',
+             '\xf4': 'o',
+             '\xf5': 'o',
+             '\xf6': 'o',
+             '\xf8': 'o',
+             '\xd9': 'U',
+             '\xda': 'U',
+             '\xdb': 'U',
+             '\xdc': 'U',
+             '\xf9': 'u',
+             '\xfa': 'u',
+             '\xfb': 'u',
+             '\xfc': 'u',
+             '\xdd': 'Y',
+             '\xfd': 'y',
+             '\xff': 'y',
+             '\xc6': 'Ae',
+             '\xe6': 'ae',
+             '\xde': 'Th',
+             '\xfe': 'th',
+             '\xdf': 'ss',
+             // Latin Extended-A block.
+             "\u0100": 'A',
+             "\u0102": 'A',
+             "\u0104": 'A',
+             "\u0101": 'a',
+             "\u0103": 'a',
+             "\u0105": 'a',
+             "\u0106": 'C',
+             "\u0108": 'C',
+             "\u010A": 'C',
+             "\u010C": 'C',
+             "\u0107": 'c',
+             "\u0109": 'c',
+             "\u010B": 'c',
+             "\u010D": 'c',
+             "\u010E": 'D',
+             "\u0110": 'D',
+             "\u010F": 'd',
+             "\u0111": 'd',
+             "\u0112": 'E',
+             "\u0114": 'E',
+             "\u0116": 'E',
+             "\u0118": 'E',
+             "\u011A": 'E',
+             "\u0113": 'e',
+             "\u0115": 'e',
+             "\u0117": 'e',
+             "\u0119": 'e',
+             "\u011B": 'e',
+             "\u011C": 'G',
+             "\u011E": 'G',
+             "\u0120": 'G',
+             "\u0122": 'G',
+             "\u011D": 'g',
+             "\u011F": 'g',
+             "\u0121": 'g',
+             "\u0123": 'g',
+             "\u0124": 'H',
+             "\u0126": 'H',
+             "\u0125": 'h',
+             "\u0127": 'h',
+             "\u0128": 'I',
+             "\u012A": 'I',
+             "\u012C": 'I',
+             "\u012E": 'I',
+             "\u0130": 'I',
+             "\u0129": 'i',
+             "\u012B": 'i',
+             "\u012D": 'i',
+             "\u012F": 'i',
+             "\u0131": 'i',
+             "\u0134": 'J',
+             "\u0135": 'j',
+             "\u0136": 'K',
+             "\u0137": 'k',
+             "\u0138": 'k',
+             "\u0139": 'L',
+             "\u013B": 'L',
+             "\u013D": 'L',
+             "\u013F": 'L',
+             "\u0141": 'L',
+             "\u013A": 'l',
+             "\u013C": 'l',
+             "\u013E": 'l',
+             "\u0140": 'l',
+             "\u0142": 'l',
+             "\u0143": 'N',
+             "\u0145": 'N',
+             "\u0147": 'N',
+             "\u014A": 'N',
+             "\u0144": 'n',
+             "\u0146": 'n',
+             "\u0148": 'n',
+             "\u014B": 'n',
+             "\u014C": 'O',
+             "\u014E": 'O',
+             "\u0150": 'O',
+             "\u014D": 'o',
+             "\u014F": 'o',
+             "\u0151": 'o',
+             "\u0154": 'R',
+             "\u0156": 'R',
+             "\u0158": 'R',
+             "\u0155": 'r',
+             "\u0157": 'r',
+             "\u0159": 'r',
+             "\u015A": 'S',
+             "\u015C": 'S',
+             "\u015E": 'S',
+             "\u0160": 'S',
+             "\u015B": 's',
+             "\u015D": 's',
+             "\u015F": 's',
+             "\u0161": 's',
+             "\u0162": 'T',
+             "\u0164": 'T',
+             "\u0166": 'T',
+             "\u0163": 't',
+             "\u0165": 't',
+             "\u0167": 't',
+             "\u0168": 'U',
+             "\u016A": 'U',
+             "\u016C": 'U',
+             "\u016E": 'U',
+             "\u0170": 'U',
+             "\u0172": 'U',
+             "\u0169": 'u',
+             "\u016B": 'u',
+             "\u016D": 'u',
+             "\u016F": 'u',
+             "\u0171": 'u',
+             "\u0173": 'u',
+             "\u0174": 'W',
+             "\u0175": 'w',
+             "\u0176": 'Y',
+             "\u0177": 'y',
+             "\u0178": 'Y',
+             "\u0179": 'Z',
+             "\u017B": 'Z',
+             "\u017D": 'Z',
+             "\u017A": 'z',
+             "\u017C": 'z',
+             "\u017E": 'z',
+             "\u0132": 'IJ',
+             "\u0133": 'ij',
+             "\u0152": 'Oe',
+             "\u0153": 'oe',
+             "\u0149": "'n",
+             "\u017F": 's'
+           };
+           /** Used to map characters to HTML entities. */
+
+           var htmlEscapes = {
+             '&': '&amp;',
+             '<': '&lt;',
+             '>': '&gt;',
+             '"': '&quot;',
+             "'": '&#39;'
+           };
+           /** Used to map HTML entities to characters. */
+
+           var htmlUnescapes = {
+             '&amp;': '&',
+             '&lt;': '<',
+             '&gt;': '>',
+             '&quot;': '"',
+             '&#39;': "'"
+           };
+           /** Used to escape characters for inclusion in compiled string literals. */
+
+           var stringEscapes = {
+             '\\': '\\',
+             "'": "'",
+             '\n': 'n',
+             '\r': 'r',
+             "\u2028": 'u2028',
+             "\u2029": 'u2029'
+           };
+           /** Built-in method references without a dependency on `root`. */
+
+           var freeParseFloat = parseFloat,
+               freeParseInt = parseInt;
+           /** Detect free variable `global` from Node.js. */
+
+           var freeGlobal = _typeof(commonjsGlobal) == 'object' && commonjsGlobal && commonjsGlobal.Object === Object && commonjsGlobal;
+           /** Detect free variable `self`. */
+
+           var freeSelf = (typeof self === "undefined" ? "undefined" : _typeof(self)) == 'object' && self && self.Object === Object && self;
+           /** Used as a reference to the global object. */
+
+           var root = freeGlobal || freeSelf || Function('return this')();
+           /** Detect free variable `exports`. */
+
+           var freeExports = exports && !exports.nodeType && exports;
+           /** Detect free variable `module`. */
+
+           var freeModule = freeExports && 'object' == 'object' && module && !module.nodeType && module;
+           /** Detect the popular CommonJS extension `module.exports`. */
+
+           var moduleExports = freeModule && freeModule.exports === freeExports;
+           /** Detect free variable `process` from Node.js. */
+
+           var freeProcess = moduleExports && freeGlobal.process;
+           /** Used to access faster Node.js helpers. */
+
+           var nodeUtil = function () {
+             try {
+               // Use `util.types` for Node.js 10+.
+               var types = freeModule && freeModule.require && freeModule.require('util').types;
+
+               if (types) {
+                 return types;
+               } // Legacy `process.binding('util')` for Node.js < 10.
+
+
+               return freeProcess && freeProcess.binding && freeProcess.binding('util');
+             } catch (e) {}
+           }();
+           /* Node.js helper references. */
+
+
+           var nodeIsArrayBuffer = nodeUtil && nodeUtil.isArrayBuffer,
+               nodeIsDate = nodeUtil && nodeUtil.isDate,
+               nodeIsMap = nodeUtil && nodeUtil.isMap,
+               nodeIsRegExp = nodeUtil && nodeUtil.isRegExp,
+               nodeIsSet = nodeUtil && nodeUtil.isSet,
+               nodeIsTypedArray = nodeUtil && nodeUtil.isTypedArray;
+           /*--------------------------------------------------------------------------*/
+
+           /**
+            * A faster alternative to `Function#apply`, this function invokes `func`
+            * with the `this` binding of `thisArg` and the arguments of `args`.
+            *
+            * @private
+            * @param {Function} func The function to invoke.
+            * @param {*} thisArg The `this` binding of `func`.
+            * @param {Array} args The arguments to invoke `func` with.
+            * @returns {*} Returns the result of `func`.
+            */
+
+           function apply(func, thisArg, args) {
+             switch (args.length) {
+               case 0:
+                 return func.call(thisArg);
+
+               case 1:
+                 return func.call(thisArg, args[0]);
+
+               case 2:
+                 return func.call(thisArg, args[0], args[1]);
+
+               case 3:
+                 return func.call(thisArg, args[0], args[1], args[2]);
+             }
+
+             return func.apply(thisArg, args);
+           }
+           /**
+            * A specialized version of `baseAggregator` for arrays.
+            *
+            * @private
+            * @param {Array} [array] The array to iterate over.
+            * @param {Function} setter The function to set `accumulator` values.
+            * @param {Function} iteratee The iteratee to transform keys.
+            * @param {Object} accumulator The initial aggregated object.
+            * @returns {Function} Returns `accumulator`.
+            */
+
+
+           function arrayAggregator(array, setter, iteratee, accumulator) {
+             var index = -1,
+                 length = array == null ? 0 : array.length;
+
+             while (++index < length) {
+               var value = array[index];
+               setter(accumulator, value, iteratee(value), array);
+             }
+
+             return accumulator;
+           }
+           /**
+            * A specialized version of `_.forEach` for arrays without support for
+            * iteratee shorthands.
+            *
+            * @private
+            * @param {Array} [array] The array to iterate over.
+            * @param {Function} iteratee The function invoked per iteration.
+            * @returns {Array} Returns `array`.
+            */
+
+
+           function arrayEach(array, iteratee) {
+             var index = -1,
+                 length = array == null ? 0 : array.length;
+
+             while (++index < length) {
+               if (iteratee(array[index], index, array) === false) {
+                 break;
+               }
+             }
+
+             return array;
+           }
+           /**
+            * A specialized version of `_.forEachRight` for arrays without support for
+            * iteratee shorthands.
+            *
+            * @private
+            * @param {Array} [array] The array to iterate over.
+            * @param {Function} iteratee The function invoked per iteration.
+            * @returns {Array} Returns `array`.
+            */
+
+
+           function arrayEachRight(array, iteratee) {
+             var length = array == null ? 0 : array.length;
+
+             while (length--) {
+               if (iteratee(array[length], length, array) === false) {
+                 break;
+               }
+             }
+
+             return array;
+           }
+           /**
+            * A specialized version of `_.every` for arrays without support for
+            * iteratee shorthands.
+            *
+            * @private
+            * @param {Array} [array] The array to iterate over.
+            * @param {Function} predicate The function invoked per iteration.
+            * @returns {boolean} Returns `true` if all elements pass the predicate check,
+            *  else `false`.
+            */
+
+
+           function arrayEvery(array, predicate) {
+             var index = -1,
+                 length = array == null ? 0 : array.length;
+
+             while (++index < length) {
+               if (!predicate(array[index], index, array)) {
+                 return false;
+               }
+             }
+
+             return true;
+           }
+           /**
+            * A specialized version of `_.filter` for arrays without support for
+            * iteratee shorthands.
+            *
+            * @private
+            * @param {Array} [array] The array to iterate over.
+            * @param {Function} predicate The function invoked per iteration.
+            * @returns {Array} Returns the new filtered array.
+            */
+
+
+           function arrayFilter(array, predicate) {
+             var index = -1,
+                 length = array == null ? 0 : array.length,
+                 resIndex = 0,
+                 result = [];
+
+             while (++index < length) {
+               var value = array[index];
+
+               if (predicate(value, index, array)) {
+                 result[resIndex++] = value;
+               }
+             }
+
+             return result;
+           }
+           /**
+            * A specialized version of `_.includes` for arrays without support for
+            * specifying an index to search from.
+            *
+            * @private
+            * @param {Array} [array] The array to inspect.
+            * @param {*} target The value to search for.
+            * @returns {boolean} Returns `true` if `target` is found, else `false`.
+            */
+
+
+           function arrayIncludes(array, value) {
+             var length = array == null ? 0 : array.length;
+             return !!length && baseIndexOf(array, value, 0) > -1;
+           }
+           /**
+            * This function is like `arrayIncludes` except that it accepts a comparator.
+            *
+            * @private
+            * @param {Array} [array] The array to inspect.
+            * @param {*} target The value to search for.
+            * @param {Function} comparator The comparator invoked per element.
+            * @returns {boolean} Returns `true` if `target` is found, else `false`.
+            */
+
+
+           function arrayIncludesWith(array, value, comparator) {
+             var index = -1,
+                 length = array == null ? 0 : array.length;
+
+             while (++index < length) {
+               if (comparator(value, array[index])) {
+                 return true;
+               }
+             }
+
+             return false;
+           }
+           /**
+            * A specialized version of `_.map` for arrays without support for iteratee
+            * shorthands.
+            *
+            * @private
+            * @param {Array} [array] The array to iterate over.
+            * @param {Function} iteratee The function invoked per iteration.
+            * @returns {Array} Returns the new mapped array.
+            */
+
+
+           function arrayMap(array, iteratee) {
+             var index = -1,
+                 length = array == null ? 0 : array.length,
+                 result = Array(length);
+
+             while (++index < length) {
+               result[index] = iteratee(array[index], index, array);
+             }
+
+             return result;
+           }
+           /**
+            * Appends the elements of `values` to `array`.
+            *
+            * @private
+            * @param {Array} array The array to modify.
+            * @param {Array} values The values to append.
+            * @returns {Array} Returns `array`.
+            */
+
+
+           function arrayPush(array, values) {
+             var index = -1,
+                 length = values.length,
+                 offset = array.length;
+
+             while (++index < length) {
+               array[offset + index] = values[index];
+             }
+
+             return array;
+           }
+           /**
+            * A specialized version of `_.reduce` for arrays without support for
+            * iteratee shorthands.
+            *
+            * @private
+            * @param {Array} [array] The array to iterate over.
+            * @param {Function} iteratee The function invoked per iteration.
+            * @param {*} [accumulator] The initial value.
+            * @param {boolean} [initAccum] Specify using the first element of `array` as
+            *  the initial value.
+            * @returns {*} Returns the accumulated value.
+            */
+
+
+           function arrayReduce(array, iteratee, accumulator, initAccum) {
+             var index = -1,
+                 length = array == null ? 0 : array.length;
+
+             if (initAccum && length) {
+               accumulator = array[++index];
+             }
+
+             while (++index < length) {
+               accumulator = iteratee(accumulator, array[index], index, array);
+             }
+
+             return accumulator;
+           }
+           /**
+            * A specialized version of `_.reduceRight` for arrays without support for
+            * iteratee shorthands.
+            *
+            * @private
+            * @param {Array} [array] The array to iterate over.
+            * @param {Function} iteratee The function invoked per iteration.
+            * @param {*} [accumulator] The initial value.
+            * @param {boolean} [initAccum] Specify using the last element of `array` as
+            *  the initial value.
+            * @returns {*} Returns the accumulated value.
+            */
+
+
+           function arrayReduceRight(array, iteratee, accumulator, initAccum) {
+             var length = array == null ? 0 : array.length;
+
+             if (initAccum && length) {
+               accumulator = array[--length];
+             }
+
+             while (length--) {
+               accumulator = iteratee(accumulator, array[length], length, array);
+             }
+
+             return accumulator;
+           }
+           /**
+            * A specialized version of `_.some` for arrays without support for iteratee
+            * shorthands.
+            *
+            * @private
+            * @param {Array} [array] The array to iterate over.
+            * @param {Function} predicate The function invoked per iteration.
+            * @returns {boolean} Returns `true` if any element passes the predicate check,
+            *  else `false`.
+            */
+
+
+           function arraySome(array, predicate) {
+             var index = -1,
+                 length = array == null ? 0 : array.length;
+
+             while (++index < length) {
+               if (predicate(array[index], index, array)) {
+                 return true;
+               }
+             }
+
+             return false;
+           }
+           /**
+            * Gets the size of an ASCII `string`.
+            *
+            * @private
+            * @param {string} string The string inspect.
+            * @returns {number} Returns the string size.
+            */
+
+
+           var asciiSize = baseProperty('length');
+           /**
+            * Converts an ASCII `string` to an array.
+            *
+            * @private
+            * @param {string} string The string to convert.
+            * @returns {Array} Returns the converted array.
+            */
+
+           function asciiToArray(string) {
+             return string.split('');
+           }
+           /**
+            * Splits an ASCII `string` into an array of its words.
+            *
+            * @private
+            * @param {string} The string to inspect.
+            * @returns {Array} Returns the words of `string`.
+            */
+
+
+           function asciiWords(string) {
+             return string.match(reAsciiWord) || [];
+           }
+           /**
+            * The base implementation of methods like `_.findKey` and `_.findLastKey`,
+            * without support for iteratee shorthands, which iterates over `collection`
+            * using `eachFunc`.
+            *
+            * @private
+            * @param {Array|Object} collection The collection to inspect.
+            * @param {Function} predicate The function invoked per iteration.
+            * @param {Function} eachFunc The function to iterate over `collection`.
+            * @returns {*} Returns the found element or its key, else `undefined`.
+            */
+
+
+           function baseFindKey(collection, predicate, eachFunc) {
+             var result;
+             eachFunc(collection, function (value, key, collection) {
+               if (predicate(value, key, collection)) {
+                 result = key;
+                 return false;
+               }
+             });
+             return result;
+           }
+           /**
+            * The base implementation of `_.findIndex` and `_.findLastIndex` without
+            * support for iteratee shorthands.
+            *
+            * @private
+            * @param {Array} array The array to inspect.
+            * @param {Function} predicate The function invoked per iteration.
+            * @param {number} fromIndex The index to search from.
+            * @param {boolean} [fromRight] Specify iterating from right to left.
+            * @returns {number} Returns the index of the matched value, else `-1`.
+            */
+
+
+           function baseFindIndex(array, predicate, fromIndex, fromRight) {
+             var length = array.length,
+                 index = fromIndex + (fromRight ? 1 : -1);
+
+             while (fromRight ? index-- : ++index < length) {
+               if (predicate(array[index], index, array)) {
+                 return index;
+               }
+             }
+
+             return -1;
+           }
+           /**
+            * The base implementation of `_.indexOf` without `fromIndex` bounds checks.
+            *
+            * @private
+            * @param {Array} array The array to inspect.
+            * @param {*} value The value to search for.
+            * @param {number} fromIndex The index to search from.
+            * @returns {number} Returns the index of the matched value, else `-1`.
+            */
+
+
+           function baseIndexOf(array, value, fromIndex) {
+             return value === value ? strictIndexOf(array, value, fromIndex) : baseFindIndex(array, baseIsNaN, fromIndex);
+           }
+           /**
+            * This function is like `baseIndexOf` except that it accepts a comparator.
+            *
+            * @private
+            * @param {Array} array The array to inspect.
+            * @param {*} value The value to search for.
+            * @param {number} fromIndex The index to search from.
+            * @param {Function} comparator The comparator invoked per element.
+            * @returns {number} Returns the index of the matched value, else `-1`.
+            */
+
+
+           function baseIndexOfWith(array, value, fromIndex, comparator) {
+             var index = fromIndex - 1,
+                 length = array.length;
+
+             while (++index < length) {
+               if (comparator(array[index], value)) {
+                 return index;
+               }
+             }
+
+             return -1;
+           }
+           /**
+            * The base implementation of `_.isNaN` without support for number objects.
+            *
+            * @private
+            * @param {*} value The value to check.
+            * @returns {boolean} Returns `true` if `value` is `NaN`, else `false`.
+            */
+
+
+           function baseIsNaN(value) {
+             return value !== value;
+           }
+           /**
+            * The base implementation of `_.mean` and `_.meanBy` without support for
+            * iteratee shorthands.
+            *
+            * @private
+            * @param {Array} array The array to iterate over.
+            * @param {Function} iteratee The function invoked per iteration.
+            * @returns {number} Returns the mean.
+            */
+
+
+           function baseMean(array, iteratee) {
+             var length = array == null ? 0 : array.length;
+             return length ? baseSum(array, iteratee) / length : NAN;
+           }
+           /**
+            * The base implementation of `_.property` without support for deep paths.
+            *
+            * @private
+            * @param {string} key The key of the property to get.
+            * @returns {Function} Returns the new accessor function.
+            */
+
+
+           function baseProperty(key) {
+             return function (object) {
+               return object == null ? undefined$1 : object[key];
+             };
+           }
+           /**
+            * The base implementation of `_.propertyOf` without support for deep paths.
+            *
+            * @private
+            * @param {Object} object The object to query.
+            * @returns {Function} Returns the new accessor function.
+            */
+
+
+           function basePropertyOf(object) {
+             return function (key) {
+               return object == null ? undefined$1 : object[key];
+             };
+           }
+           /**
+            * The base implementation of `_.reduce` and `_.reduceRight`, without support
+            * for iteratee shorthands, which iterates over `collection` using `eachFunc`.
+            *
+            * @private
+            * @param {Array|Object} collection The collection to iterate over.
+            * @param {Function} iteratee The function invoked per iteration.
+            * @param {*} accumulator The initial value.
+            * @param {boolean} initAccum Specify using the first or last element of
+            *  `collection` as the initial value.
+            * @param {Function} eachFunc The function to iterate over `collection`.
+            * @returns {*} Returns the accumulated value.
+            */
+
+
+           function baseReduce(collection, iteratee, accumulator, initAccum, eachFunc) {
+             eachFunc(collection, function (value, index, collection) {
+               accumulator = initAccum ? (initAccum = false, value) : iteratee(accumulator, value, index, collection);
+             });
+             return accumulator;
+           }
+           /**
+            * The base implementation of `_.sortBy` which uses `comparer` to define the
+            * sort order of `array` and replaces criteria objects with their corresponding
+            * values.
+            *
+            * @private
+            * @param {Array} array The array to sort.
+            * @param {Function} comparer The function to define sort order.
+            * @returns {Array} Returns `array`.
+            */
+
+
+           function baseSortBy(array, comparer) {
+             var length = array.length;
+             array.sort(comparer);
+
+             while (length--) {
+               array[length] = array[length].value;
+             }
+
+             return array;
+           }
+           /**
+            * The base implementation of `_.sum` and `_.sumBy` without support for
+            * iteratee shorthands.
+            *
+            * @private
+            * @param {Array} array The array to iterate over.
+            * @param {Function} iteratee The function invoked per iteration.
+            * @returns {number} Returns the sum.
+            */
+
+
+           function baseSum(array, iteratee) {
+             var result,
+                 index = -1,
+                 length = array.length;
+
+             while (++index < length) {
+               var current = iteratee(array[index]);
+
+               if (current !== undefined$1) {
+                 result = result === undefined$1 ? current : result + current;
+               }
+             }
+
+             return result;
+           }
+           /**
+            * The base implementation of `_.times` without support for iteratee shorthands
+            * or max array length checks.
+            *
+            * @private
+            * @param {number} n The number of times to invoke `iteratee`.
+            * @param {Function} iteratee The function invoked per iteration.
+            * @returns {Array} Returns the array of results.
+            */
+
+
+           function baseTimes(n, iteratee) {
+             var index = -1,
+                 result = Array(n);
+
+             while (++index < n) {
+               result[index] = iteratee(index);
+             }
+
+             return result;
+           }
+           /**
+            * The base implementation of `_.toPairs` and `_.toPairsIn` which creates an array
+            * of key-value pairs for `object` corresponding to the property names of `props`.
+            *
+            * @private
+            * @param {Object} object The object to query.
+            * @param {Array} props The property names to get values for.
+            * @returns {Object} Returns the key-value pairs.
+            */
+
+
+           function baseToPairs(object, props) {
+             return arrayMap(props, function (key) {
+               return [key, object[key]];
+             });
+           }
+           /**
+            * The base implementation of `_.trim`.
+            *
+            * @private
+            * @param {string} string The string to trim.
+            * @returns {string} Returns the trimmed string.
+            */
+
+
+           function baseTrim(string) {
+             return string ? string.slice(0, trimmedEndIndex(string) + 1).replace(reTrimStart, '') : string;
+           }
+           /**
+            * The base implementation of `_.unary` without support for storing metadata.
+            *
+            * @private
+            * @param {Function} func The function to cap arguments for.
+            * @returns {Function} Returns the new capped function.
+            */
+
+
+           function baseUnary(func) {
+             return function (value) {
+               return func(value);
+             };
+           }
+           /**
+            * The base implementation of `_.values` and `_.valuesIn` which creates an
+            * array of `object` property values corresponding to the property names
+            * of `props`.
+            *
+            * @private
+            * @param {Object} object The object to query.
+            * @param {Array} props The property names to get values for.
+            * @returns {Object} Returns the array of property values.
+            */
+
+
+           function baseValues(object, props) {
+             return arrayMap(props, function (key) {
+               return object[key];
+             });
+           }
+           /**
+            * Checks if a `cache` value for `key` exists.
+            *
+            * @private
+            * @param {Object} cache The cache to query.
+            * @param {string} key The key of the entry to check.
+            * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.
+            */
+
+
+           function cacheHas(cache, key) {
+             return cache.has(key);
+           }
+           /**
+            * Used by `_.trim` and `_.trimStart` to get the index of the first string symbol
+            * that is not found in the character symbols.
+            *
+            * @private
+            * @param {Array} strSymbols The string symbols to inspect.
+            * @param {Array} chrSymbols The character symbols to find.
+            * @returns {number} Returns the index of the first unmatched string symbol.
+            */
+
+
+           function charsStartIndex(strSymbols, chrSymbols) {
+             var index = -1,
+                 length = strSymbols.length;
+
+             while (++index < length && baseIndexOf(chrSymbols, strSymbols[index], 0) > -1) {}
+
+             return index;
+           }
+           /**
+            * Used by `_.trim` and `_.trimEnd` to get the index of the last string symbol
+            * that is not found in the character symbols.
+            *
+            * @private
+            * @param {Array} strSymbols The string symbols to inspect.
+            * @param {Array} chrSymbols The character symbols to find.
+            * @returns {number} Returns the index of the last unmatched string symbol.
+            */
+
+
+           function charsEndIndex(strSymbols, chrSymbols) {
+             var index = strSymbols.length;
+
+             while (index-- && baseIndexOf(chrSymbols, strSymbols[index], 0) > -1) {}
+
+             return index;
+           }
+           /**
+            * Gets the number of `placeholder` occurrences in `array`.
+            *
+            * @private
+            * @param {Array} array The array to inspect.
+            * @param {*} placeholder The placeholder to search for.
+            * @returns {number} Returns the placeholder count.
+            */
+
+
+           function countHolders(array, placeholder) {
+             var length = array.length,
+                 result = 0;
+
+             while (length--) {
+               if (array[length] === placeholder) {
+                 ++result;
+               }
+             }
+
+             return result;
+           }
+           /**
+            * Used by `_.deburr` to convert Latin-1 Supplement and Latin Extended-A
+            * letters to basic Latin letters.
+            *
+            * @private
+            * @param {string} letter The matched letter to deburr.
+            * @returns {string} Returns the deburred letter.
+            */
+
+
+           var deburrLetter = basePropertyOf(deburredLetters);
+           /**
+            * Used by `_.escape` to convert characters to HTML entities.
+            *
+            * @private
+            * @param {string} chr The matched character to escape.
+            * @returns {string} Returns the escaped character.
+            */
+
+           var escapeHtmlChar = basePropertyOf(htmlEscapes);
+           /**
+            * Used by `_.template` to escape characters for inclusion in compiled string literals.
+            *
+            * @private
+            * @param {string} chr The matched character to escape.
+            * @returns {string} Returns the escaped character.
+            */
+
+           function escapeStringChar(chr) {
+             return '\\' + stringEscapes[chr];
+           }
+           /**
+            * Gets the value at `key` of `object`.
+            *
+            * @private
+            * @param {Object} [object] The object to query.
+            * @param {string} key The key of the property to get.
+            * @returns {*} Returns the property value.
+            */
+
+
+           function getValue(object, key) {
+             return object == null ? undefined$1 : object[key];
+           }
+           /**
+            * Checks if `string` contains Unicode symbols.
+            *
+            * @private
+            * @param {string} string The string to inspect.
+            * @returns {boolean} Returns `true` if a symbol is found, else `false`.
+            */
+
+
+           function hasUnicode(string) {
+             return reHasUnicode.test(string);
+           }
+           /**
+            * Checks if `string` contains a word composed of Unicode symbols.
+            *
+            * @private
+            * @param {string} string The string to inspect.
+            * @returns {boolean} Returns `true` if a word is found, else `false`.
+            */
+
+
+           function hasUnicodeWord(string) {
+             return reHasUnicodeWord.test(string);
+           }
+           /**
+            * Converts `iterator` to an array.
+            *
+            * @private
+            * @param {Object} iterator The iterator to convert.
+            * @returns {Array} Returns the converted array.
+            */
+
+
+           function iteratorToArray(iterator) {
+             var data,
+                 result = [];
+
+             while (!(data = iterator.next()).done) {
+               result.push(data.value);
+             }
+
+             return result;
+           }
+           /**
+            * Converts `map` to its key-value pairs.
+            *
+            * @private
+            * @param {Object} map The map to convert.
+            * @returns {Array} Returns the key-value pairs.
+            */
+
+
+           function mapToArray(map) {
+             var index = -1,
+                 result = Array(map.size);
+             map.forEach(function (value, key) {
+               result[++index] = [key, value];
+             });
+             return result;
+           }
+           /**
+            * Creates a unary function that invokes `func` with its argument transformed.
+            *
+            * @private
+            * @param {Function} func The function to wrap.
+            * @param {Function} transform The argument transform.
+            * @returns {Function} Returns the new function.
+            */
+
+
+           function overArg(func, transform) {
+             return function (arg) {
+               return func(transform(arg));
+             };
+           }
+           /**
+            * Replaces all `placeholder` elements in `array` with an internal placeholder
+            * and returns an array of their indexes.
+            *
+            * @private
+            * @param {Array} array The array to modify.
+            * @param {*} placeholder The placeholder to replace.
+            * @returns {Array} Returns the new array of placeholder indexes.
+            */
+
+
+           function replaceHolders(array, placeholder) {
+             var index = -1,
+                 length = array.length,
+                 resIndex = 0,
+                 result = [];
+
+             while (++index < length) {
+               var value = array[index];
+
+               if (value === placeholder || value === PLACEHOLDER) {
+                 array[index] = PLACEHOLDER;
+                 result[resIndex++] = index;
+               }
+             }
+
+             return result;
+           }
+           /**
+            * Converts `set` to an array of its values.
+            *
+            * @private
+            * @param {Object} set The set to convert.
+            * @returns {Array} Returns the values.
+            */
+
+
+           function setToArray(set) {
+             var index = -1,
+                 result = Array(set.size);
+             set.forEach(function (value) {
+               result[++index] = value;
+             });
+             return result;
+           }
+           /**
+            * Converts `set` to its value-value pairs.
+            *
+            * @private
+            * @param {Object} set The set to convert.
+            * @returns {Array} Returns the value-value pairs.
+            */
+
+
+           function setToPairs(set) {
+             var index = -1,
+                 result = Array(set.size);
+             set.forEach(function (value) {
+               result[++index] = [value, value];
+             });
+             return result;
+           }
+           /**
+            * A specialized version of `_.indexOf` which performs strict equality
+            * comparisons of values, i.e. `===`.
+            *
+            * @private
+            * @param {Array} array The array to inspect.
+            * @param {*} value The value to search for.
+            * @param {number} fromIndex The index to search from.
+            * @returns {number} Returns the index of the matched value, else `-1`.
+            */
+
+
+           function strictIndexOf(array, value, fromIndex) {
+             var index = fromIndex - 1,
+                 length = array.length;
+
+             while (++index < length) {
+               if (array[index] === value) {
+                 return index;
+               }
+             }
+
+             return -1;
+           }
+           /**
+            * A specialized version of `_.lastIndexOf` which performs strict equality
+            * comparisons of values, i.e. `===`.
+            *
+            * @private
+            * @param {Array} array The array to inspect.
+            * @param {*} value The value to search for.
+            * @param {number} fromIndex The index to search from.
+            * @returns {number} Returns the index of the matched value, else `-1`.
+            */
+
+
+           function strictLastIndexOf(array, value, fromIndex) {
+             var index = fromIndex + 1;
+
+             while (index--) {
+               if (array[index] === value) {
+                 return index;
+               }
+             }
+
+             return index;
+           }
+           /**
+            * Gets the number of symbols in `string`.
+            *
+            * @private
+            * @param {string} string The string to inspect.
+            * @returns {number} Returns the string size.
+            */
+
+
+           function stringSize(string) {
+             return hasUnicode(string) ? unicodeSize(string) : asciiSize(string);
+           }
+           /**
+            * Converts `string` to an array.
+            *
+            * @private
+            * @param {string} string The string to convert.
+            * @returns {Array} Returns the converted array.
+            */
+
+
+           function stringToArray(string) {
+             return hasUnicode(string) ? unicodeToArray(string) : asciiToArray(string);
+           }
+           /**
+            * Used by `_.trim` and `_.trimEnd` to get the index of the last non-whitespace
+            * character of `string`.
+            *
+            * @private
+            * @param {string} string The string to inspect.
+            * @returns {number} Returns the index of the last non-whitespace character.
+            */
+
+
+           function trimmedEndIndex(string) {
+             var index = string.length;
+
+             while (index-- && reWhitespace.test(string.charAt(index))) {}
+
+             return index;
+           }
+           /**
+            * Used by `_.unescape` to convert HTML entities to characters.
+            *
+            * @private
+            * @param {string} chr The matched character to unescape.
+            * @returns {string} Returns the unescaped character.
+            */
+
+
+           var unescapeHtmlChar = basePropertyOf(htmlUnescapes);
+           /**
+            * Gets the size of a Unicode `string`.
+            *
+            * @private
+            * @param {string} string The string inspect.
+            * @returns {number} Returns the string size.
+            */
+
+           function unicodeSize(string) {
+             var result = reUnicode.lastIndex = 0;
+
+             while (reUnicode.test(string)) {
+               ++result;
+             }
+
+             return result;
+           }
+           /**
+            * Converts a Unicode `string` to an array.
+            *
+            * @private
+            * @param {string} string The string to convert.
+            * @returns {Array} Returns the converted array.
+            */
+
+
+           function unicodeToArray(string) {
+             return string.match(reUnicode) || [];
+           }
+           /**
+            * Splits a Unicode `string` into an array of its words.
+            *
+            * @private
+            * @param {string} The string to inspect.
+            * @returns {Array} Returns the words of `string`.
+            */
+
+
+           function unicodeWords(string) {
+             return string.match(reUnicodeWord) || [];
+           }
+           /*--------------------------------------------------------------------------*/
+
+           /**
+            * Create a new pristine `lodash` function using the `context` object.
+            *
+            * @static
+            * @memberOf _
+            * @since 1.1.0
+            * @category Util
+            * @param {Object} [context=root] The context object.
+            * @returns {Function} Returns a new `lodash` function.
+            * @example
+            *
+            * _.mixin({ 'foo': _.constant('foo') });
+            *
+            * var lodash = _.runInContext();
+            * lodash.mixin({ 'bar': lodash.constant('bar') });
+            *
+            * _.isFunction(_.foo);
+            * // => true
+            * _.isFunction(_.bar);
+            * // => false
+            *
+            * lodash.isFunction(lodash.foo);
+            * // => false
+            * lodash.isFunction(lodash.bar);
+            * // => true
+            *
+            * // Create a suped-up `defer` in Node.js.
+            * var defer = _.runInContext({ 'setTimeout': setImmediate }).defer;
+            */
+
+
+           var runInContext = function runInContext(context) {
+             context = context == null ? root : _.defaults(root.Object(), context, _.pick(root, contextProps));
+             /** Built-in constructor references. */
+
+             var Array = context.Array,
+                 Date = context.Date,
+                 Error = context.Error,
+                 Function = context.Function,
+                 Math = context.Math,
+                 Object = context.Object,
+                 RegExp = context.RegExp,
+                 String = context.String,
+                 TypeError = context.TypeError;
+             /** Used for built-in method references. */
+
+             var arrayProto = Array.prototype,
+                 funcProto = Function.prototype,
+                 objectProto = Object.prototype;
+             /** Used to detect overreaching core-js shims. */
+
+             var coreJsData = context['__core-js_shared__'];
+             /** Used to resolve the decompiled source of functions. */
+
+             var funcToString = funcProto.toString;
+             /** Used to check objects for own properties. */
+
+             var hasOwnProperty = objectProto.hasOwnProperty;
+             /** Used to generate unique IDs. */
+
+             var idCounter = 0;
+             /** Used to detect methods masquerading as native. */
+
+             var maskSrcKey = function () {
+               var uid = /[^.]+$/.exec(coreJsData && coreJsData.keys && coreJsData.keys.IE_PROTO || '');
+               return uid ? 'Symbol(src)_1.' + uid : '';
+             }();
+             /**
+              * Used to resolve the
+              * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)
+              * of values.
+              */
+
+
+             var nativeObjectToString = objectProto.toString;
+             /** Used to infer the `Object` constructor. */
+
+             var objectCtorString = funcToString.call(Object);
+             /** Used to restore the original `_` reference in `_.noConflict`. */
+
+             var oldDash = root._;
+             /** Used to detect if a method is native. */
+
+             var reIsNative = RegExp('^' + funcToString.call(hasOwnProperty).replace(reRegExpChar, '\\$&').replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g, '$1.*?') + '$');
+             /** Built-in value references. */
+
+             var Buffer = moduleExports ? context.Buffer : undefined$1,
+                 _Symbol = context.Symbol,
+                 Uint8Array = context.Uint8Array,
+                 allocUnsafe = Buffer ? Buffer.allocUnsafe : undefined$1,
+                 getPrototype = overArg(Object.getPrototypeOf, Object),
+                 objectCreate = Object.create,
+                 propertyIsEnumerable = objectProto.propertyIsEnumerable,
+                 splice = arrayProto.splice,
+                 spreadableSymbol = _Symbol ? _Symbol.isConcatSpreadable : undefined$1,
+                 symIterator = _Symbol ? _Symbol.iterator : undefined$1,
+                 symToStringTag = _Symbol ? _Symbol.toStringTag : undefined$1;
+
+             var defineProperty = function () {
+               try {
+                 var func = getNative(Object, 'defineProperty');
+                 func({}, '', {});
+                 return func;
+               } catch (e) {}
+             }();
+             /** Mocked built-ins. */
+
+
+             var ctxClearTimeout = context.clearTimeout !== root.clearTimeout && context.clearTimeout,
+                 ctxNow = Date && Date.now !== root.Date.now && Date.now,
+                 ctxSetTimeout = context.setTimeout !== root.setTimeout && context.setTimeout;
+             /* Built-in method references for those with the same name as other `lodash` methods. */
+
+             var nativeCeil = Math.ceil,
+                 nativeFloor = Math.floor,
+                 nativeGetSymbols = Object.getOwnPropertySymbols,
+                 nativeIsBuffer = Buffer ? Buffer.isBuffer : undefined$1,
+                 nativeIsFinite = context.isFinite,
+                 nativeJoin = arrayProto.join,
+                 nativeKeys = overArg(Object.keys, Object),
+                 nativeMax = Math.max,
+                 nativeMin = Math.min,
+                 nativeNow = Date.now,
+                 nativeParseInt = context.parseInt,
+                 nativeRandom = Math.random,
+                 nativeReverse = arrayProto.reverse;
+             /* Built-in method references that are verified to be native. */
+
+             var DataView = getNative(context, 'DataView'),
+                 Map = getNative(context, 'Map'),
+                 Promise = getNative(context, 'Promise'),
+                 Set = getNative(context, 'Set'),
+                 WeakMap = getNative(context, 'WeakMap'),
+                 nativeCreate = getNative(Object, 'create');
+             /** Used to store function metadata. */
+
+             var metaMap = WeakMap && new WeakMap();
+             /** Used to lookup unminified function names. */
+
+             var realNames = {};
+             /** Used to detect maps, sets, and weakmaps. */
+
+             var dataViewCtorString = toSource(DataView),
+                 mapCtorString = toSource(Map),
+                 promiseCtorString = toSource(Promise),
+                 setCtorString = toSource(Set),
+                 weakMapCtorString = toSource(WeakMap);
+             /** Used to convert symbols to primitives and strings. */
+
+             var symbolProto = _Symbol ? _Symbol.prototype : undefined$1,
+                 symbolValueOf = symbolProto ? symbolProto.valueOf : undefined$1,
+                 symbolToString = symbolProto ? symbolProto.toString : undefined$1;
+             /*------------------------------------------------------------------------*/
+
+             /**
+              * Creates a `lodash` object which wraps `value` to enable implicit method
+              * chain sequences. Methods that operate on and return arrays, collections,
+              * and functions can be chained together. Methods that retrieve a single value
+              * or may return a primitive value will automatically end the chain sequence
+              * and return the unwrapped value. Otherwise, the value must be unwrapped
+              * with `_#value`.
+              *
+              * Explicit chain sequences, which must be unwrapped with `_#value`, may be
+              * enabled using `_.chain`.
+              *
+              * The execution of chained methods is lazy, that is, it's deferred until
+              * `_#value` is implicitly or explicitly called.
+              *
+              * Lazy evaluation allows several methods to support shortcut fusion.
+              * Shortcut fusion is an optimization to merge iteratee calls; this avoids
+              * the creation of intermediate arrays and can greatly reduce the number of
+              * iteratee executions. Sections of a chain sequence qualify for shortcut
+              * fusion if the section is applied to an array and iteratees accept only
+              * one argument. The heuristic for whether a section qualifies for shortcut
+              * fusion is subject to change.
+              *
+              * Chaining is supported in custom builds as long as the `_#value` method is
+              * directly or indirectly included in the build.
+              *
+              * In addition to lodash methods, wrappers have `Array` and `String` methods.
+              *
+              * The wrapper `Array` methods are:
+              * `concat`, `join`, `pop`, `push`, `shift`, `sort`, `splice`, and `unshift`
+              *
+              * The wrapper `String` methods are:
+              * `replace` and `split`
+              *
+              * The wrapper methods that support shortcut fusion are:
+              * `at`, `compact`, `drop`, `dropRight`, `dropWhile`, `filter`, `find`,
+              * `findLast`, `head`, `initial`, `last`, `map`, `reject`, `reverse`, `slice`,
+              * `tail`, `take`, `takeRight`, `takeRightWhile`, `takeWhile`, and `toArray`
+              *
+              * The chainable wrapper methods are:
+              * `after`, `ary`, `assign`, `assignIn`, `assignInWith`, `assignWith`, `at`,
+              * `before`, `bind`, `bindAll`, `bindKey`, `castArray`, `chain`, `chunk`,
+              * `commit`, `compact`, `concat`, `conforms`, `constant`, `countBy`, `create`,
+              * `curry`, `debounce`, `defaults`, `defaultsDeep`, `defer`, `delay`,
+              * `difference`, `differenceBy`, `differenceWith`, `drop`, `dropRight`,
+              * `dropRightWhile`, `dropWhile`, `extend`, `extendWith`, `fill`, `filter`,
+              * `flatMap`, `flatMapDeep`, `flatMapDepth`, `flatten`, `flattenDeep`,
+              * `flattenDepth`, `flip`, `flow`, `flowRight`, `fromPairs`, `functions`,
+              * `functionsIn`, `groupBy`, `initial`, `intersection`, `intersectionBy`,
+              * `intersectionWith`, `invert`, `invertBy`, `invokeMap`, `iteratee`, `keyBy`,
+              * `keys`, `keysIn`, `map`, `mapKeys`, `mapValues`, `matches`, `matchesProperty`,
+              * `memoize`, `merge`, `mergeWith`, `method`, `methodOf`, `mixin`, `negate`,
+              * `nthArg`, `omit`, `omitBy`, `once`, `orderBy`, `over`, `overArgs`,
+              * `overEvery`, `overSome`, `partial`, `partialRight`, `partition`, `pick`,
+              * `pickBy`, `plant`, `property`, `propertyOf`, `pull`, `pullAll`, `pullAllBy`,
+              * `pullAllWith`, `pullAt`, `push`, `range`, `rangeRight`, `rearg`, `reject`,
+              * `remove`, `rest`, `reverse`, `sampleSize`, `set`, `setWith`, `shuffle`,
+              * `slice`, `sort`, `sortBy`, `splice`, `spread`, `tail`, `take`, `takeRight`,
+              * `takeRightWhile`, `takeWhile`, `tap`, `throttle`, `thru`, `toArray`,
+              * `toPairs`, `toPairsIn`, `toPath`, `toPlainObject`, `transform`, `unary`,
+              * `union`, `unionBy`, `unionWith`, `uniq`, `uniqBy`, `uniqWith`, `unset`,
+              * `unshift`, `unzip`, `unzipWith`, `update`, `updateWith`, `values`,
+              * `valuesIn`, `without`, `wrap`, `xor`, `xorBy`, `xorWith`, `zip`,
+              * `zipObject`, `zipObjectDeep`, and `zipWith`
+              *
+              * The wrapper methods that are **not** chainable by default are:
+              * `add`, `attempt`, `camelCase`, `capitalize`, `ceil`, `clamp`, `clone`,
+              * `cloneDeep`, `cloneDeepWith`, `cloneWith`, `conformsTo`, `deburr`,
+              * `defaultTo`, `divide`, `each`, `eachRight`, `endsWith`, `eq`, `escape`,
+              * `escapeRegExp`, `every`, `find`, `findIndex`, `findKey`, `findLast`,
+              * `findLastIndex`, `findLastKey`, `first`, `floor`, `forEach`, `forEachRight`,
+              * `forIn`, `forInRight`, `forOwn`, `forOwnRight`, `get`, `gt`, `gte`, `has`,
+              * `hasIn`, `head`, `identity`, `includes`, `indexOf`, `inRange`, `invoke`,
+              * `isArguments`, `isArray`, `isArrayBuffer`, `isArrayLike`, `isArrayLikeObject`,
+              * `isBoolean`, `isBuffer`, `isDate`, `isElement`, `isEmpty`, `isEqual`,
+              * `isEqualWith`, `isError`, `isFinite`, `isFunction`, `isInteger`, `isLength`,
+              * `isMap`, `isMatch`, `isMatchWith`, `isNaN`, `isNative`, `isNil`, `isNull`,
+              * `isNumber`, `isObject`, `isObjectLike`, `isPlainObject`, `isRegExp`,
+              * `isSafeInteger`, `isSet`, `isString`, `isUndefined`, `isTypedArray`,
+              * `isWeakMap`, `isWeakSet`, `join`, `kebabCase`, `last`, `lastIndexOf`,
+              * `lowerCase`, `lowerFirst`, `lt`, `lte`, `max`, `maxBy`, `mean`, `meanBy`,
+              * `min`, `minBy`, `multiply`, `noConflict`, `noop`, `now`, `nth`, `pad`,
+              * `padEnd`, `padStart`, `parseInt`, `pop`, `random`, `reduce`, `reduceRight`,
+              * `repeat`, `result`, `round`, `runInContext`, `sample`, `shift`, `size`,
+              * `snakeCase`, `some`, `sortedIndex`, `sortedIndexBy`, `sortedLastIndex`,
+              * `sortedLastIndexBy`, `startCase`, `startsWith`, `stubArray`, `stubFalse`,
+              * `stubObject`, `stubString`, `stubTrue`, `subtract`, `sum`, `sumBy`,
+              * `template`, `times`, `toFinite`, `toInteger`, `toJSON`, `toLength`,
+              * `toLower`, `toNumber`, `toSafeInteger`, `toString`, `toUpper`, `trim`,
+              * `trimEnd`, `trimStart`, `truncate`, `unescape`, `uniqueId`, `upperCase`,
+              * `upperFirst`, `value`, and `words`
+              *
+              * @name _
+              * @constructor
+              * @category Seq
+              * @param {*} value The value to wrap in a `lodash` instance.
+              * @returns {Object} Returns the new `lodash` wrapper instance.
+              * @example
+              *
+              * function square(n) {
+              *   return n * n;
+              * }
+              *
+              * var wrapped = _([1, 2, 3]);
+              *
+              * // Returns an unwrapped value.
+              * wrapped.reduce(_.add);
+              * // => 6
+              *
+              * // Returns a wrapped value.
+              * var squares = wrapped.map(square);
+              *
+              * _.isArray(squares);
+              * // => false
+              *
+              * _.isArray(squares.value());
+              * // => true
+              */
+
+             function lodash(value) {
+               if (isObjectLike(value) && !isArray(value) && !(value instanceof LazyWrapper)) {
+                 if (value instanceof LodashWrapper) {
+                   return value;
+                 }
+
+                 if (hasOwnProperty.call(value, '__wrapped__')) {
+                   return wrapperClone(value);
+                 }
+               }
+
+               return new LodashWrapper(value);
+             }
+             /**
+              * The base implementation of `_.create` without support for assigning
+              * properties to the created object.
+              *
+              * @private
+              * @param {Object} proto The object to inherit from.
+              * @returns {Object} Returns the new object.
+              */
+
+
+             var baseCreate = function () {
+               function object() {}
+
+               return function (proto) {
+                 if (!isObject(proto)) {
+                   return {};
+                 }
+
+                 if (objectCreate) {
+                   return objectCreate(proto);
+                 }
+
+                 object.prototype = proto;
+                 var result = new object();
+                 object.prototype = undefined$1;
+                 return result;
+               };
+             }();
+             /**
+              * The function whose prototype chain sequence wrappers inherit from.
+              *
+              * @private
+              */
+
+
+             function baseLodash() {// No operation performed.
+             }
+             /**
+              * The base constructor for creating `lodash` wrapper objects.
+              *
+              * @private
+              * @param {*} value The value to wrap.
+              * @param {boolean} [chainAll] Enable explicit method chain sequences.
+              */
+
+
+             function LodashWrapper(value, chainAll) {
+               this.__wrapped__ = value;
+               this.__actions__ = [];
+               this.__chain__ = !!chainAll;
+               this.__index__ = 0;
+               this.__values__ = undefined$1;
+             }
+             /**
+              * By default, the template delimiters used by lodash are like those in
+              * embedded Ruby (ERB) as well as ES2015 template strings. Change the
+              * following template settings to use alternative delimiters.
+              *
+              * @static
+              * @memberOf _
+              * @type {Object}
+              */
+
+
+             lodash.templateSettings = {
+               /**
+                * Used to detect `data` property values to be HTML-escaped.
+                *
+                * @memberOf _.templateSettings
+                * @type {RegExp}
+                */
+               'escape': reEscape,
+
+               /**
+                * Used to detect code to be evaluated.
+                *
+                * @memberOf _.templateSettings
+                * @type {RegExp}
+                */
+               'evaluate': reEvaluate,
+
+               /**
+                * Used to detect `data` property values to inject.
+                *
+                * @memberOf _.templateSettings
+                * @type {RegExp}
+                */
+               'interpolate': reInterpolate,
+
+               /**
+                * Used to reference the data object in the template text.
+                *
+                * @memberOf _.templateSettings
+                * @type {string}
+                */
+               'variable': '',
+
+               /**
+                * Used to import variables into the compiled template.
+                *
+                * @memberOf _.templateSettings
+                * @type {Object}
+                */
+               'imports': {
+                 /**
+                  * A reference to the `lodash` function.
+                  *
+                  * @memberOf _.templateSettings.imports
+                  * @type {Function}
+                  */
+                 '_': lodash
+               }
+             }; // Ensure wrappers are instances of `baseLodash`.
+
+             lodash.prototype = baseLodash.prototype;
+             lodash.prototype.constructor = lodash;
+             LodashWrapper.prototype = baseCreate(baseLodash.prototype);
+             LodashWrapper.prototype.constructor = LodashWrapper;
+             /*------------------------------------------------------------------------*/
+
+             /**
+              * Creates a lazy wrapper object which wraps `value` to enable lazy evaluation.
+              *
+              * @private
+              * @constructor
+              * @param {*} value The value to wrap.
+              */
+
+             function LazyWrapper(value) {
+               this.__wrapped__ = value;
+               this.__actions__ = [];
+               this.__dir__ = 1;
+               this.__filtered__ = false;
+               this.__iteratees__ = [];
+               this.__takeCount__ = MAX_ARRAY_LENGTH;
+               this.__views__ = [];
+             }
+             /**
+              * Creates a clone of the lazy wrapper object.
+              *
+              * @private
+              * @name clone
+              * @memberOf LazyWrapper
+              * @returns {Object} Returns the cloned `LazyWrapper` object.
+              */
+
+
+             function lazyClone() {
+               var result = new LazyWrapper(this.__wrapped__);
+               result.__actions__ = copyArray(this.__actions__);
+               result.__dir__ = this.__dir__;
+               result.__filtered__ = this.__filtered__;
+               result.__iteratees__ = copyArray(this.__iteratees__);
+               result.__takeCount__ = this.__takeCount__;
+               result.__views__ = copyArray(this.__views__);
+               return result;
+             }
+             /**
+              * Reverses the direction of lazy iteration.
+              *
+              * @private
+              * @name reverse
+              * @memberOf LazyWrapper
+              * @returns {Object} Returns the new reversed `LazyWrapper` object.
+              */
+
+
+             function lazyReverse() {
+               if (this.__filtered__) {
+                 var result = new LazyWrapper(this);
+                 result.__dir__ = -1;
+                 result.__filtered__ = true;
+               } else {
+                 result = this.clone();
+                 result.__dir__ *= -1;
+               }
+
+               return result;
+             }
+             /**
+              * Extracts the unwrapped value from its lazy wrapper.
+              *
+              * @private
+              * @name value
+              * @memberOf LazyWrapper
+              * @returns {*} Returns the unwrapped value.
+              */
+
+
+             function lazyValue() {
+               var array = this.__wrapped__.value(),
+                   dir = this.__dir__,
+                   isArr = isArray(array),
+                   isRight = dir < 0,
+                   arrLength = isArr ? array.length : 0,
+                   view = getView(0, arrLength, this.__views__),
+                   start = view.start,
+                   end = view.end,
+                   length = end - start,
+                   index = isRight ? end : start - 1,
+                   iteratees = this.__iteratees__,
+                   iterLength = iteratees.length,
+                   resIndex = 0,
+                   takeCount = nativeMin(length, this.__takeCount__);
+
+               if (!isArr || !isRight && arrLength == length && takeCount == length) {
+                 return baseWrapperValue(array, this.__actions__);
+               }
+
+               var result = [];
+
+               outer: while (length-- && resIndex < takeCount) {
+                 index += dir;
+                 var iterIndex = -1,
+                     value = array[index];
+
+                 while (++iterIndex < iterLength) {
+                   var data = iteratees[iterIndex],
+                       iteratee = data.iteratee,
+                       type = data.type,
+                       computed = iteratee(value);
+
+                   if (type == LAZY_MAP_FLAG) {
+                     value = computed;
+                   } else if (!computed) {
+                     if (type == LAZY_FILTER_FLAG) {
+                       continue outer;
+                     } else {
+                       break outer;
+                     }
+                   }
+                 }
+
+                 result[resIndex++] = value;
+               }
+
+               return result;
+             } // Ensure `LazyWrapper` is an instance of `baseLodash`.
+
+
+             LazyWrapper.prototype = baseCreate(baseLodash.prototype);
+             LazyWrapper.prototype.constructor = LazyWrapper;
+             /*------------------------------------------------------------------------*/
+
+             /**
+              * Creates a hash object.
+              *
+              * @private
+              * @constructor
+              * @param {Array} [entries] The key-value pairs to cache.
+              */
+
+             function Hash(entries) {
+               var index = -1,
+                   length = entries == null ? 0 : entries.length;
+               this.clear();
+
+               while (++index < length) {
+                 var entry = entries[index];
+                 this.set(entry[0], entry[1]);
+               }
+             }
+             /**
+              * Removes all key-value entries from the hash.
+              *
+              * @private
+              * @name clear
+              * @memberOf Hash
+              */
+
+
+             function hashClear() {
+               this.__data__ = nativeCreate ? nativeCreate(null) : {};
+               this.size = 0;
+             }
+             /**
+              * Removes `key` and its value from the hash.
+              *
+              * @private
+              * @name delete
+              * @memberOf Hash
+              * @param {Object} hash The hash to modify.
+              * @param {string} key The key of the value to remove.
+              * @returns {boolean} Returns `true` if the entry was removed, else `false`.
+              */
+
+
+             function hashDelete(key) {
+               var result = this.has(key) && delete this.__data__[key];
+               this.size -= result ? 1 : 0;
+               return result;
+             }
+             /**
+              * Gets the hash value for `key`.
+              *
+              * @private
+              * @name get
+              * @memberOf Hash
+              * @param {string} key The key of the value to get.
+              * @returns {*} Returns the entry value.
+              */
+
+
+             function hashGet(key) {
+               var data = this.__data__;
+
+               if (nativeCreate) {
+                 var result = data[key];
+                 return result === HASH_UNDEFINED ? undefined$1 : result;
+               }
+
+               return hasOwnProperty.call(data, key) ? data[key] : undefined$1;
+             }
+             /**
+              * Checks if a hash value for `key` exists.
+              *
+              * @private
+              * @name has
+              * @memberOf Hash
+              * @param {string} key The key of the entry to check.
+              * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.
+              */
+
+
+             function hashHas(key) {
+               var data = this.__data__;
+               return nativeCreate ? data[key] !== undefined$1 : hasOwnProperty.call(data, key);
+             }
+             /**
+              * Sets the hash `key` to `value`.
+              *
+              * @private
+              * @name set
+              * @memberOf Hash
+              * @param {string} key The key of the value to set.
+              * @param {*} value The value to set.
+              * @returns {Object} Returns the hash instance.
+              */
+
+
+             function hashSet(key, value) {
+               var data = this.__data__;
+               this.size += this.has(key) ? 0 : 1;
+               data[key] = nativeCreate && value === undefined$1 ? HASH_UNDEFINED : value;
+               return this;
+             } // Add methods to `Hash`.
+
+
+             Hash.prototype.clear = hashClear;
+             Hash.prototype['delete'] = hashDelete;
+             Hash.prototype.get = hashGet;
+             Hash.prototype.has = hashHas;
+             Hash.prototype.set = hashSet;
+             /*------------------------------------------------------------------------*/
+
+             /**
+              * Creates an list cache object.
+              *
+              * @private
+              * @constructor
+              * @param {Array} [entries] The key-value pairs to cache.
+              */
+
+             function ListCache(entries) {
+               var index = -1,
+                   length = entries == null ? 0 : entries.length;
+               this.clear();
+
+               while (++index < length) {
+                 var entry = entries[index];
+                 this.set(entry[0], entry[1]);
+               }
+             }
+             /**
+              * Removes all key-value entries from the list cache.
+              *
+              * @private
+              * @name clear
+              * @memberOf ListCache
+              */
+
+
+             function listCacheClear() {
+               this.__data__ = [];
+               this.size = 0;
+             }
+             /**
+              * Removes `key` and its value from the list cache.
+              *
+              * @private
+              * @name delete
+              * @memberOf ListCache
+              * @param {string} key The key of the value to remove.
+              * @returns {boolean} Returns `true` if the entry was removed, else `false`.
+              */
+
+
+             function listCacheDelete(key) {
+               var data = this.__data__,
+                   index = assocIndexOf(data, key);
+
+               if (index < 0) {
+                 return false;
+               }
+
+               var lastIndex = data.length - 1;
+
+               if (index == lastIndex) {
+                 data.pop();
+               } else {
+                 splice.call(data, index, 1);
+               }
+
+               --this.size;
+               return true;
+             }
+             /**
+              * Gets the list cache value for `key`.
+              *
+              * @private
+              * @name get
+              * @memberOf ListCache
+              * @param {string} key The key of the value to get.
+              * @returns {*} Returns the entry value.
+              */
+
+
+             function listCacheGet(key) {
+               var data = this.__data__,
+                   index = assocIndexOf(data, key);
+               return index < 0 ? undefined$1 : data[index][1];
+             }
+             /**
+              * Checks if a list cache value for `key` exists.
+              *
+              * @private
+              * @name has
+              * @memberOf ListCache
+              * @param {string} key The key of the entry to check.
+              * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.
+              */
+
+
+             function listCacheHas(key) {
+               return assocIndexOf(this.__data__, key) > -1;
+             }
+             /**
+              * Sets the list cache `key` to `value`.
+              *
+              * @private
+              * @name set
+              * @memberOf ListCache
+              * @param {string} key The key of the value to set.
+              * @param {*} value The value to set.
+              * @returns {Object} Returns the list cache instance.
+              */
+
+
+             function listCacheSet(key, value) {
+               var data = this.__data__,
+                   index = assocIndexOf(data, key);
+
+               if (index < 0) {
+                 ++this.size;
+                 data.push([key, value]);
+               } else {
+                 data[index][1] = value;
+               }
+
+               return this;
+             } // Add methods to `ListCache`.
+
+
+             ListCache.prototype.clear = listCacheClear;
+             ListCache.prototype['delete'] = listCacheDelete;
+             ListCache.prototype.get = listCacheGet;
+             ListCache.prototype.has = listCacheHas;
+             ListCache.prototype.set = listCacheSet;
+             /*------------------------------------------------------------------------*/
+
+             /**
+              * Creates a map cache object to store key-value pairs.
+              *
+              * @private
+              * @constructor
+              * @param {Array} [entries] The key-value pairs to cache.
+              */
+
+             function MapCache(entries) {
+               var index = -1,
+                   length = entries == null ? 0 : entries.length;
+               this.clear();
+
+               while (++index < length) {
+                 var entry = entries[index];
+                 this.set(entry[0], entry[1]);
+               }
+             }
+             /**
+              * Removes all key-value entries from the map.
+              *
+              * @private
+              * @name clear
+              * @memberOf MapCache
+              */
+
+
+             function mapCacheClear() {
+               this.size = 0;
+               this.__data__ = {
+                 'hash': new Hash(),
+                 'map': new (Map || ListCache)(),
+                 'string': new Hash()
+               };
+             }
+             /**
+              * Removes `key` and its value from the map.
+              *
+              * @private
+              * @name delete
+              * @memberOf MapCache
+              * @param {string} key The key of the value to remove.
+              * @returns {boolean} Returns `true` if the entry was removed, else `false`.
+              */
+
+
+             function mapCacheDelete(key) {
+               var result = getMapData(this, key)['delete'](key);
+               this.size -= result ? 1 : 0;
+               return result;
+             }
+             /**
+              * Gets the map value for `key`.
+              *
+              * @private
+              * @name get
+              * @memberOf MapCache
+              * @param {string} key The key of the value to get.
+              * @returns {*} Returns the entry value.
+              */
+
+
+             function mapCacheGet(key) {
+               return getMapData(this, key).get(key);
+             }
+             /**
+              * Checks if a map value for `key` exists.
+              *
+              * @private
+              * @name has
+              * @memberOf MapCache
+              * @param {string} key The key of the entry to check.
+              * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.
+              */
+
+
+             function mapCacheHas(key) {
+               return getMapData(this, key).has(key);
+             }
+             /**
+              * Sets the map `key` to `value`.
+              *
+              * @private
+              * @name set
+              * @memberOf MapCache
+              * @param {string} key The key of the value to set.
+              * @param {*} value The value to set.
+              * @returns {Object} Returns the map cache instance.
+              */
+
+
+             function mapCacheSet(key, value) {
+               var data = getMapData(this, key),
+                   size = data.size;
+               data.set(key, value);
+               this.size += data.size == size ? 0 : 1;
+               return this;
+             } // Add methods to `MapCache`.
+
+
+             MapCache.prototype.clear = mapCacheClear;
+             MapCache.prototype['delete'] = mapCacheDelete;
+             MapCache.prototype.get = mapCacheGet;
+             MapCache.prototype.has = mapCacheHas;
+             MapCache.prototype.set = mapCacheSet;
+             /*------------------------------------------------------------------------*/
+
+             /**
+              *
+              * Creates an array cache object to store unique values.
+              *
+              * @private
+              * @constructor
+              * @param {Array} [values] The values to cache.
+              */
+
+             function SetCache(values) {
+               var index = -1,
+                   length = values == null ? 0 : values.length;
+               this.__data__ = new MapCache();
+
+               while (++index < length) {
+                 this.add(values[index]);
+               }
+             }
+             /**
+              * Adds `value` to the array cache.
+              *
+              * @private
+              * @name add
+              * @memberOf SetCache
+              * @alias push
+              * @param {*} value The value to cache.
+              * @returns {Object} Returns the cache instance.
+              */
+
+
+             function setCacheAdd(value) {
+               this.__data__.set(value, HASH_UNDEFINED);
+
+               return this;
+             }
+             /**
+              * Checks if `value` is in the array cache.
+              *
+              * @private
+              * @name has
+              * @memberOf SetCache
+              * @param {*} value The value to search for.
+              * @returns {number} Returns `true` if `value` is found, else `false`.
+              */
+
+
+             function setCacheHas(value) {
+               return this.__data__.has(value);
+             } // Add methods to `SetCache`.
+
+
+             SetCache.prototype.add = SetCache.prototype.push = setCacheAdd;
+             SetCache.prototype.has = setCacheHas;
+             /*------------------------------------------------------------------------*/
+
+             /**
+              * Creates a stack cache object to store key-value pairs.
+              *
+              * @private
+              * @constructor
+              * @param {Array} [entries] The key-value pairs to cache.
+              */
+
+             function Stack(entries) {
+               var data = this.__data__ = new ListCache(entries);
+               this.size = data.size;
+             }
+             /**
+              * Removes all key-value entries from the stack.
+              *
+              * @private
+              * @name clear
+              * @memberOf Stack
+              */
+
+
+             function stackClear() {
+               this.__data__ = new ListCache();
+               this.size = 0;
+             }
+             /**
+              * Removes `key` and its value from the stack.
+              *
+              * @private
+              * @name delete
+              * @memberOf Stack
+              * @param {string} key The key of the value to remove.
+              * @returns {boolean} Returns `true` if the entry was removed, else `false`.
+              */
+
+
+             function stackDelete(key) {
+               var data = this.__data__,
+                   result = data['delete'](key);
+               this.size = data.size;
+               return result;
+             }
+             /**
+              * Gets the stack value for `key`.
+              *
+              * @private
+              * @name get
+              * @memberOf Stack
+              * @param {string} key The key of the value to get.
+              * @returns {*} Returns the entry value.
+              */
+
+
+             function stackGet(key) {
+               return this.__data__.get(key);
+             }
+             /**
+              * Checks if a stack value for `key` exists.
+              *
+              * @private
+              * @name has
+              * @memberOf Stack
+              * @param {string} key The key of the entry to check.
+              * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.
+              */
+
+
+             function stackHas(key) {
+               return this.__data__.has(key);
+             }
+             /**
+              * Sets the stack `key` to `value`.
+              *
+              * @private
+              * @name set
+              * @memberOf Stack
+              * @param {string} key The key of the value to set.
+              * @param {*} value The value to set.
+              * @returns {Object} Returns the stack cache instance.
+              */
+
+
+             function stackSet(key, value) {
+               var data = this.__data__;
+
+               if (data instanceof ListCache) {
+                 var pairs = data.__data__;
+
+                 if (!Map || pairs.length < LARGE_ARRAY_SIZE - 1) {
+                   pairs.push([key, value]);
+                   this.size = ++data.size;
+                   return this;
+                 }
+
+                 data = this.__data__ = new MapCache(pairs);
+               }
+
+               data.set(key, value);
+               this.size = data.size;
+               return this;
+             } // Add methods to `Stack`.
+
+
+             Stack.prototype.clear = stackClear;
+             Stack.prototype['delete'] = stackDelete;
+             Stack.prototype.get = stackGet;
+             Stack.prototype.has = stackHas;
+             Stack.prototype.set = stackSet;
+             /*------------------------------------------------------------------------*/
+
+             /**
+              * Creates an array of the enumerable property names of the array-like `value`.
+              *
+              * @private
+              * @param {*} value The value to query.
+              * @param {boolean} inherited Specify returning inherited property names.
+              * @returns {Array} Returns the array of property names.
+              */
+
+             function arrayLikeKeys(value, inherited) {
+               var isArr = isArray(value),
+                   isArg = !isArr && isArguments(value),
+                   isBuff = !isArr && !isArg && isBuffer(value),
+                   isType = !isArr && !isArg && !isBuff && isTypedArray(value),
+                   skipIndexes = isArr || isArg || isBuff || isType,
+                   result = skipIndexes ? baseTimes(value.length, String) : [],
+                   length = result.length;
+
+               for (var key in value) {
+                 if ((inherited || hasOwnProperty.call(value, key)) && !(skipIndexes && ( // Safari 9 has enumerable `arguments.length` in strict mode.
+                 key == 'length' || // Node.js 0.10 has enumerable non-index properties on buffers.
+                 isBuff && (key == 'offset' || key == 'parent') || // PhantomJS 2 has enumerable non-index properties on typed arrays.
+                 isType && (key == 'buffer' || key == 'byteLength' || key == 'byteOffset') || // Skip index properties.
+                 isIndex(key, length)))) {
+                   result.push(key);
+                 }
+               }
+
+               return result;
+             }
+             /**
+              * A specialized version of `_.sample` for arrays.
+              *
+              * @private
+              * @param {Array} array The array to sample.
+              * @returns {*} Returns the random element.
+              */
+
+
+             function arraySample(array) {
+               var length = array.length;
+               return length ? array[baseRandom(0, length - 1)] : undefined$1;
+             }
+             /**
+              * A specialized version of `_.sampleSize` for arrays.
+              *
+              * @private
+              * @param {Array} array The array to sample.
+              * @param {number} n The number of elements to sample.
+              * @returns {Array} Returns the random elements.
+              */
+
+
+             function arraySampleSize(array, n) {
+               return shuffleSelf(copyArray(array), baseClamp(n, 0, array.length));
+             }
+             /**
+              * A specialized version of `_.shuffle` for arrays.
+              *
+              * @private
+              * @param {Array} array The array to shuffle.
+              * @returns {Array} Returns the new shuffled array.
+              */
+
+
+             function arrayShuffle(array) {
+               return shuffleSelf(copyArray(array));
+             }
+             /**
+              * This function is like `assignValue` except that it doesn't assign
+              * `undefined` values.
+              *
+              * @private
+              * @param {Object} object The object to modify.
+              * @param {string} key The key of the property to assign.
+              * @param {*} value The value to assign.
+              */
+
+
+             function assignMergeValue(object, key, value) {
+               if (value !== undefined$1 && !eq(object[key], value) || value === undefined$1 && !(key in object)) {
+                 baseAssignValue(object, key, value);
+               }
+             }
+             /**
+              * Assigns `value` to `key` of `object` if the existing value is not equivalent
+              * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)
+              * for equality comparisons.
+              *
+              * @private
+              * @param {Object} object The object to modify.
+              * @param {string} key The key of the property to assign.
+              * @param {*} value The value to assign.
+              */
+
+
+             function assignValue(object, key, value) {
+               var objValue = object[key];
+
+               if (!(hasOwnProperty.call(object, key) && eq(objValue, value)) || value === undefined$1 && !(key in object)) {
+                 baseAssignValue(object, key, value);
+               }
+             }
+             /**
+              * Gets the index at which the `key` is found in `array` of key-value pairs.
+              *
+              * @private
+              * @param {Array} array The array to inspect.
+              * @param {*} key The key to search for.
+              * @returns {number} Returns the index of the matched value, else `-1`.
+              */
+
+
+             function assocIndexOf(array, key) {
+               var length = array.length;
+
+               while (length--) {
+                 if (eq(array[length][0], key)) {
+                   return length;
+                 }
+               }
+
+               return -1;
+             }
+             /**
+              * Aggregates elements of `collection` on `accumulator` with keys transformed
+              * by `iteratee` and values set by `setter`.
+              *
+              * @private
+              * @param {Array|Object} collection The collection to iterate over.
+              * @param {Function} setter The function to set `accumulator` values.
+              * @param {Function} iteratee The iteratee to transform keys.
+              * @param {Object} accumulator The initial aggregated object.
+              * @returns {Function} Returns `accumulator`.
+              */
+
+
+             function baseAggregator(collection, setter, iteratee, accumulator) {
+               baseEach(collection, function (value, key, collection) {
+                 setter(accumulator, value, iteratee(value), collection);
+               });
+               return accumulator;
+             }
+             /**
+              * The base implementation of `_.assign` without support for multiple sources
+              * or `customizer` functions.
+              *
+              * @private
+              * @param {Object} object The destination object.
+              * @param {Object} source The source object.
+              * @returns {Object} Returns `object`.
+              */
+
+
+             function baseAssign(object, source) {
+               return object && copyObject(source, keys(source), object);
+             }
+             /**
+              * The base implementation of `_.assignIn` without support for multiple sources
+              * or `customizer` functions.
+              *
+              * @private
+              * @param {Object} object The destination object.
+              * @param {Object} source The source object.
+              * @returns {Object} Returns `object`.
+              */
+
+
+             function baseAssignIn(object, source) {
+               return object && copyObject(source, keysIn(source), object);
+             }
+             /**
+              * The base implementation of `assignValue` and `assignMergeValue` without
+              * value checks.
+              *
+              * @private
+              * @param {Object} object The object to modify.
+              * @param {string} key The key of the property to assign.
+              * @param {*} value The value to assign.
+              */
+
+
+             function baseAssignValue(object, key, value) {
+               if (key == '__proto__' && defineProperty) {
+                 defineProperty(object, key, {
+                   'configurable': true,
+                   'enumerable': true,
+                   'value': value,
+                   'writable': true
+                 });
+               } else {
+                 object[key] = value;
+               }
+             }
+             /**
+              * The base implementation of `_.at` without support for individual paths.
+              *
+              * @private
+              * @param {Object} object The object to iterate over.
+              * @param {string[]} paths The property paths to pick.
+              * @returns {Array} Returns the picked elements.
+              */
+
+
+             function baseAt(object, paths) {
+               var index = -1,
+                   length = paths.length,
+                   result = Array(length),
+                   skip = object == null;
+
+               while (++index < length) {
+                 result[index] = skip ? undefined$1 : get(object, paths[index]);
+               }
+
+               return result;
+             }
+             /**
+              * The base implementation of `_.clamp` which doesn't coerce arguments.
+              *
+              * @private
+              * @param {number} number The number to clamp.
+              * @param {number} [lower] The lower bound.
+              * @param {number} upper The upper bound.
+              * @returns {number} Returns the clamped number.
+              */
+
+
+             function baseClamp(number, lower, upper) {
+               if (number === number) {
+                 if (upper !== undefined$1) {
+                   number = number <= upper ? number : upper;
+                 }
+
+                 if (lower !== undefined$1) {
+                   number = number >= lower ? number : lower;
+                 }
+               }
+
+               return number;
+             }
+             /**
+              * The base implementation of `_.clone` and `_.cloneDeep` which tracks
+              * traversed objects.
+              *
+              * @private
+              * @param {*} value The value to clone.
+              * @param {boolean} bitmask The bitmask flags.
+              *  1 - Deep clone
+              *  2 - Flatten inherited properties
+              *  4 - Clone symbols
+              * @param {Function} [customizer] The function to customize cloning.
+              * @param {string} [key] The key of `value`.
+              * @param {Object} [object] The parent object of `value`.
+              * @param {Object} [stack] Tracks traversed objects and their clone counterparts.
+              * @returns {*} Returns the cloned value.
+              */
+
+
+             function baseClone(value, bitmask, customizer, key, object, stack) {
+               var result,
+                   isDeep = bitmask & CLONE_DEEP_FLAG,
+                   isFlat = bitmask & CLONE_FLAT_FLAG,
+                   isFull = bitmask & CLONE_SYMBOLS_FLAG;
+
+               if (customizer) {
+                 result = object ? customizer(value, key, object, stack) : customizer(value);
+               }
+
+               if (result !== undefined$1) {
+                 return result;
+               }
+
+               if (!isObject(value)) {
+                 return value;
+               }
+
+               var isArr = isArray(value);
+
+               if (isArr) {
+                 result = initCloneArray(value);
+
+                 if (!isDeep) {
+                   return copyArray(value, result);
+                 }
+               } else {
+                 var tag = getTag(value),
+                     isFunc = tag == funcTag || tag == genTag;
+
+                 if (isBuffer(value)) {
+                   return cloneBuffer(value, isDeep);
+                 }
+
+                 if (tag == objectTag || tag == argsTag || isFunc && !object) {
+                   result = isFlat || isFunc ? {} : initCloneObject(value);
+
+                   if (!isDeep) {
+                     return isFlat ? copySymbolsIn(value, baseAssignIn(result, value)) : copySymbols(value, baseAssign(result, value));
+                   }
+                 } else {
+                   if (!cloneableTags[tag]) {
+                     return object ? value : {};
+                   }
+
+                   result = initCloneByTag(value, tag, isDeep);
+                 }
+               } // Check for circular references and return its corresponding clone.
+
+
+               stack || (stack = new Stack());
+               var stacked = stack.get(value);
+
+               if (stacked) {
+                 return stacked;
+               }
+
+               stack.set(value, result);
+
+               if (isSet(value)) {
+                 value.forEach(function (subValue) {
+                   result.add(baseClone(subValue, bitmask, customizer, subValue, value, stack));
+                 });
+               } else if (isMap(value)) {
+                 value.forEach(function (subValue, key) {
+                   result.set(key, baseClone(subValue, bitmask, customizer, key, value, stack));
+                 });
+               }
+
+               var keysFunc = isFull ? isFlat ? getAllKeysIn : getAllKeys : isFlat ? keysIn : keys;
+               var props = isArr ? undefined$1 : keysFunc(value);
+               arrayEach(props || value, function (subValue, key) {
+                 if (props) {
+                   key = subValue;
+                   subValue = value[key];
+                 } // Recursively populate clone (susceptible to call stack limits).
+
+
+                 assignValue(result, key, baseClone(subValue, bitmask, customizer, key, value, stack));
+               });
+               return result;
+             }
+             /**
+              * The base implementation of `_.conforms` which doesn't clone `source`.
+              *
+              * @private
+              * @param {Object} source The object of property predicates to conform to.
+              * @returns {Function} Returns the new spec function.
+              */
+
+
+             function baseConforms(source) {
+               var props = keys(source);
+               return function (object) {
+                 return baseConformsTo(object, source, props);
+               };
+             }
+             /**
+              * The base implementation of `_.conformsTo` which accepts `props` to check.
+              *
+              * @private
+              * @param {Object} object The object to inspect.
+              * @param {Object} source The object of property predicates to conform to.
+              * @returns {boolean} Returns `true` if `object` conforms, else `false`.
+              */
+
+
+             function baseConformsTo(object, source, props) {
+               var length = props.length;
+
+               if (object == null) {
+                 return !length;
+               }
+
+               object = Object(object);
+
+               while (length--) {
+                 var key = props[length],
+                     predicate = source[key],
+                     value = object[key];
+
+                 if (value === undefined$1 && !(key in object) || !predicate(value)) {
+                   return false;
+                 }
+               }
+
+               return true;
+             }
+             /**
+              * The base implementation of `_.delay` and `_.defer` which accepts `args`
+              * to provide to `func`.
+              *
+              * @private
+              * @param {Function} func The function to delay.
+              * @param {number} wait The number of milliseconds to delay invocation.
+              * @param {Array} args The arguments to provide to `func`.
+              * @returns {number|Object} Returns the timer id or timeout object.
+              */
+
+
+             function baseDelay(func, wait, args) {
+               if (typeof func != 'function') {
+                 throw new TypeError(FUNC_ERROR_TEXT);
+               }
+
+               return setTimeout(function () {
+                 func.apply(undefined$1, args);
+               }, wait);
+             }
+             /**
+              * The base implementation of methods like `_.difference` without support
+              * for excluding multiple arrays or iteratee shorthands.
+              *
+              * @private
+              * @param {Array} array The array to inspect.
+              * @param {Array} values The values to exclude.
+              * @param {Function} [iteratee] The iteratee invoked per element.
+              * @param {Function} [comparator] The comparator invoked per element.
+              * @returns {Array} Returns the new array of filtered values.
+              */
+
+
+             function baseDifference(array, values, iteratee, comparator) {
+               var index = -1,
+                   includes = arrayIncludes,
+                   isCommon = true,
+                   length = array.length,
+                   result = [],
+                   valuesLength = values.length;
+
+               if (!length) {
+                 return result;
+               }
+
+               if (iteratee) {
+                 values = arrayMap(values, baseUnary(iteratee));
+               }
+
+               if (comparator) {
+                 includes = arrayIncludesWith;
+                 isCommon = false;
+               } else if (values.length >= LARGE_ARRAY_SIZE) {
+                 includes = cacheHas;
+                 isCommon = false;
+                 values = new SetCache(values);
+               }
+
+               outer: while (++index < length) {
+                 var value = array[index],
+                     computed = iteratee == null ? value : iteratee(value);
+                 value = comparator || value !== 0 ? value : 0;
+
+                 if (isCommon && computed === computed) {
+                   var valuesIndex = valuesLength;
+
+                   while (valuesIndex--) {
+                     if (values[valuesIndex] === computed) {
+                       continue outer;
+                     }
+                   }
+
+                   result.push(value);
+                 } else if (!includes(values, computed, comparator)) {
+                   result.push(value);
+                 }
+               }
+
+               return result;
+             }
+             /**
+              * The base implementation of `_.forEach` without support for iteratee shorthands.
+              *
+              * @private
+              * @param {Array|Object} collection The collection to iterate over.
+              * @param {Function} iteratee The function invoked per iteration.
+              * @returns {Array|Object} Returns `collection`.
+              */
+
+
+             var baseEach = createBaseEach(baseForOwn);
+             /**
+              * The base implementation of `_.forEachRight` without support for iteratee shorthands.
+              *
+              * @private
+              * @param {Array|Object} collection The collection to iterate over.
+              * @param {Function} iteratee The function invoked per iteration.
+              * @returns {Array|Object} Returns `collection`.
+              */
+
+             var baseEachRight = createBaseEach(baseForOwnRight, true);
+             /**
+              * The base implementation of `_.every` without support for iteratee shorthands.
+              *
+              * @private
+              * @param {Array|Object} collection The collection to iterate over.
+              * @param {Function} predicate The function invoked per iteration.
+              * @returns {boolean} Returns `true` if all elements pass the predicate check,
+              *  else `false`
+              */
+
+             function baseEvery(collection, predicate) {
+               var result = true;
+               baseEach(collection, function (value, index, collection) {
+                 result = !!predicate(value, index, collection);
+                 return result;
+               });
+               return result;
+             }
+             /**
+              * The base implementation of methods like `_.max` and `_.min` which accepts a
+              * `comparator` to determine the extremum value.
+              *
+              * @private
+              * @param {Array} array The array to iterate over.
+              * @param {Function} iteratee The iteratee invoked per iteration.
+              * @param {Function} comparator The comparator used to compare values.
+              * @returns {*} Returns the extremum value.
+              */
+
+
+             function baseExtremum(array, iteratee, comparator) {
+               var index = -1,
+                   length = array.length;
+
+               while (++index < length) {
+                 var value = array[index],
+                     current = iteratee(value);
+
+                 if (current != null && (computed === undefined$1 ? current === current && !isSymbol(current) : comparator(current, computed))) {
+                   var computed = current,
+                       result = value;
+                 }
+               }
+
+               return result;
+             }
+             /**
+              * The base implementation of `_.fill` without an iteratee call guard.
+              *
+              * @private
+              * @param {Array} array The array to fill.
+              * @param {*} value The value to fill `array` with.
+              * @param {number} [start=0] The start position.
+              * @param {number} [end=array.length] The end position.
+              * @returns {Array} Returns `array`.
+              */
+
+
+             function baseFill(array, value, start, end) {
+               var length = array.length;
+               start = toInteger(start);
+
+               if (start < 0) {
+                 start = -start > length ? 0 : length + start;
+               }
+
+               end = end === undefined$1 || end > length ? length : toInteger(end);
+
+               if (end < 0) {
+                 end += length;
+               }
+
+               end = start > end ? 0 : toLength(end);
+
+               while (start < end) {
+                 array[start++] = value;
+               }
+
+               return array;
+             }
+             /**
+              * The base implementation of `_.filter` without support for iteratee shorthands.
+              *
+              * @private
+              * @param {Array|Object} collection The collection to iterate over.
+              * @param {Function} predicate The function invoked per iteration.
+              * @returns {Array} Returns the new filtered array.
+              */
+
+
+             function baseFilter(collection, predicate) {
+               var result = [];
+               baseEach(collection, function (value, index, collection) {
+                 if (predicate(value, index, collection)) {
+                   result.push(value);
+                 }
+               });
+               return result;
+             }
+             /**
+              * The base implementation of `_.flatten` with support for restricting flattening.
+              *
+              * @private
+              * @param {Array} array The array to flatten.
+              * @param {number} depth The maximum recursion depth.
+              * @param {boolean} [predicate=isFlattenable] The function invoked per iteration.
+              * @param {boolean} [isStrict] Restrict to values that pass `predicate` checks.
+              * @param {Array} [result=[]] The initial result value.
+              * @returns {Array} Returns the new flattened array.
+              */
+
+
+             function baseFlatten(array, depth, predicate, isStrict, result) {
+               var index = -1,
+                   length = array.length;
+               predicate || (predicate = isFlattenable);
+               result || (result = []);
+
+               while (++index < length) {
+                 var value = array[index];
+
+                 if (depth > 0 && predicate(value)) {
+                   if (depth > 1) {
+                     // Recursively flatten arrays (susceptible to call stack limits).
+                     baseFlatten(value, depth - 1, predicate, isStrict, result);
+                   } else {
+                     arrayPush(result, value);
+                   }
+                 } else if (!isStrict) {
+                   result[result.length] = value;
+                 }
+               }
+
+               return result;
+             }
+             /**
+              * The base implementation of `baseForOwn` which iterates over `object`
+              * properties returned by `keysFunc` and invokes `iteratee` for each property.
+              * Iteratee functions may exit iteration early by explicitly returning `false`.
+              *
+              * @private
+              * @param {Object} object The object to iterate over.
+              * @param {Function} iteratee The function invoked per iteration.
+              * @param {Function} keysFunc The function to get the keys of `object`.
+              * @returns {Object} Returns `object`.
+              */
+
+
+             var baseFor = createBaseFor();
+             /**
+              * This function is like `baseFor` except that it iterates over properties
+              * in the opposite order.
+              *
+              * @private
+              * @param {Object} object The object to iterate over.
+              * @param {Function} iteratee The function invoked per iteration.
+              * @param {Function} keysFunc The function to get the keys of `object`.
+              * @returns {Object} Returns `object`.
+              */
+
+             var baseForRight = createBaseFor(true);
+             /**
+              * The base implementation of `_.forOwn` without support for iteratee shorthands.
+              *
+              * @private
+              * @param {Object} object The object to iterate over.
+              * @param {Function} iteratee The function invoked per iteration.
+              * @returns {Object} Returns `object`.
+              */
+
+             function baseForOwn(object, iteratee) {
+               return object && baseFor(object, iteratee, keys);
+             }
+             /**
+              * The base implementation of `_.forOwnRight` without support for iteratee shorthands.
+              *
+              * @private
+              * @param {Object} object The object to iterate over.
+              * @param {Function} iteratee The function invoked per iteration.
+              * @returns {Object} Returns `object`.
+              */
+
+
+             function baseForOwnRight(object, iteratee) {
+               return object && baseForRight(object, iteratee, keys);
+             }
+             /**
+              * The base implementation of `_.functions` which creates an array of
+              * `object` function property names filtered from `props`.
+              *
+              * @private
+              * @param {Object} object The object to inspect.
+              * @param {Array} props The property names to filter.
+              * @returns {Array} Returns the function names.
+              */
+
+
+             function baseFunctions(object, props) {
+               return arrayFilter(props, function (key) {
+                 return isFunction(object[key]);
+               });
+             }
+             /**
+              * The base implementation of `_.get` without support for default values.
+              *
+              * @private
+              * @param {Object} object The object to query.
+              * @param {Array|string} path The path of the property to get.
+              * @returns {*} Returns the resolved value.
+              */
+
+
+             function baseGet(object, path) {
+               path = castPath(path, object);
+               var index = 0,
+                   length = path.length;
+
+               while (object != null && index < length) {
+                 object = object[toKey(path[index++])];
+               }
+
+               return index && index == length ? object : undefined$1;
+             }
+             /**
+              * The base implementation of `getAllKeys` and `getAllKeysIn` which uses
+              * `keysFunc` and `symbolsFunc` to get the enumerable property names and
+              * symbols of `object`.
+              *
+              * @private
+              * @param {Object} object The object to query.
+              * @param {Function} keysFunc The function to get the keys of `object`.
+              * @param {Function} symbolsFunc The function to get the symbols of `object`.
+              * @returns {Array} Returns the array of property names and symbols.
+              */
+
+
+             function baseGetAllKeys(object, keysFunc, symbolsFunc) {
+               var result = keysFunc(object);
+               return isArray(object) ? result : arrayPush(result, symbolsFunc(object));
+             }
+             /**
+              * The base implementation of `getTag` without fallbacks for buggy environments.
+              *
+              * @private
+              * @param {*} value The value to query.
+              * @returns {string} Returns the `toStringTag`.
+              */
+
+
+             function baseGetTag(value) {
+               if (value == null) {
+                 return value === undefined$1 ? undefinedTag : nullTag;
+               }
+
+               return symToStringTag && symToStringTag in Object(value) ? getRawTag(value) : objectToString(value);
+             }
+             /**
+              * The base implementation of `_.gt` which doesn't coerce arguments.
+              *
+              * @private
+              * @param {*} value The value to compare.
+              * @param {*} other The other value to compare.
+              * @returns {boolean} Returns `true` if `value` is greater than `other`,
+              *  else `false`.
+              */
+
+
+             function baseGt(value, other) {
+               return value > other;
+             }
+             /**
+              * The base implementation of `_.has` without support for deep paths.
+              *
+              * @private
+              * @param {Object} [object] The object to query.
+              * @param {Array|string} key The key to check.
+              * @returns {boolean} Returns `true` if `key` exists, else `false`.
+              */
+
+
+             function baseHas(object, key) {
+               return object != null && hasOwnProperty.call(object, key);
+             }
+             /**
+              * The base implementation of `_.hasIn` without support for deep paths.
+              *
+              * @private
+              * @param {Object} [object] The object to query.
+              * @param {Array|string} key The key to check.
+              * @returns {boolean} Returns `true` if `key` exists, else `false`.
+              */
+
+
+             function baseHasIn(object, key) {
+               return object != null && key in Object(object);
+             }
+             /**
+              * The base implementation of `_.inRange` which doesn't coerce arguments.
+              *
+              * @private
+              * @param {number} number The number to check.
+              * @param {number} start The start of the range.
+              * @param {number} end The end of the range.
+              * @returns {boolean} Returns `true` if `number` is in the range, else `false`.
+              */
+
+
+             function baseInRange(number, start, end) {
+               return number >= nativeMin(start, end) && number < nativeMax(start, end);
+             }
+             /**
+              * The base implementation of methods like `_.intersection`, without support
+              * for iteratee shorthands, that accepts an array of arrays to inspect.
+              *
+              * @private
+              * @param {Array} arrays The arrays to inspect.
+              * @param {Function} [iteratee] The iteratee invoked per element.
+              * @param {Function} [comparator] The comparator invoked per element.
+              * @returns {Array} Returns the new array of shared values.
+              */
+
+
+             function baseIntersection(arrays, iteratee, comparator) {
+               var includes = comparator ? arrayIncludesWith : arrayIncludes,
+                   length = arrays[0].length,
+                   othLength = arrays.length,
+                   othIndex = othLength,
+                   caches = Array(othLength),
+                   maxLength = Infinity,
+                   result = [];
+
+               while (othIndex--) {
+                 var array = arrays[othIndex];
+
+                 if (othIndex && iteratee) {
+                   array = arrayMap(array, baseUnary(iteratee));
+                 }
+
+                 maxLength = nativeMin(array.length, maxLength);
+                 caches[othIndex] = !comparator && (iteratee || length >= 120 && array.length >= 120) ? new SetCache(othIndex && array) : undefined$1;
+               }
+
+               array = arrays[0];
+               var index = -1,
+                   seen = caches[0];
+
+               outer: while (++index < length && result.length < maxLength) {
+                 var value = array[index],
+                     computed = iteratee ? iteratee(value) : value;
+                 value = comparator || value !== 0 ? value : 0;
+
+                 if (!(seen ? cacheHas(seen, computed) : includes(result, computed, comparator))) {
+                   othIndex = othLength;
+
+                   while (--othIndex) {
+                     var cache = caches[othIndex];
+
+                     if (!(cache ? cacheHas(cache, computed) : includes(arrays[othIndex], computed, comparator))) {
+                       continue outer;
+                     }
+                   }
+
+                   if (seen) {
+                     seen.push(computed);
+                   }
+
+                   result.push(value);
+                 }
+               }
+
+               return result;
+             }
+             /**
+              * The base implementation of `_.invert` and `_.invertBy` which inverts
+              * `object` with values transformed by `iteratee` and set by `setter`.
+              *
+              * @private
+              * @param {Object} object The object to iterate over.
+              * @param {Function} setter The function to set `accumulator` values.
+              * @param {Function} iteratee The iteratee to transform values.
+              * @param {Object} accumulator The initial inverted object.
+              * @returns {Function} Returns `accumulator`.
+              */
+
+
+             function baseInverter(object, setter, iteratee, accumulator) {
+               baseForOwn(object, function (value, key, object) {
+                 setter(accumulator, iteratee(value), key, object);
+               });
+               return accumulator;
+             }
+             /**
+              * The base implementation of `_.invoke` without support for individual
+              * method arguments.
+              *
+              * @private
+              * @param {Object} object The object to query.
+              * @param {Array|string} path The path of the method to invoke.
+              * @param {Array} args The arguments to invoke the method with.
+              * @returns {*} Returns the result of the invoked method.
+              */
+
+
+             function baseInvoke(object, path, args) {
+               path = castPath(path, object);
+               object = parent(object, path);
+               var func = object == null ? object : object[toKey(last(path))];
+               return func == null ? undefined$1 : apply(func, object, args);
+             }
+             /**
+              * The base implementation of `_.isArguments`.
+              *
+              * @private
+              * @param {*} value The value to check.
+              * @returns {boolean} Returns `true` if `value` is an `arguments` object,
+              */
+
+
+             function baseIsArguments(value) {
+               return isObjectLike(value) && baseGetTag(value) == argsTag;
+             }
+             /**
+              * The base implementation of `_.isArrayBuffer` without Node.js optimizations.
+              *
+              * @private
+              * @param {*} value The value to check.
+              * @returns {boolean} Returns `true` if `value` is an array buffer, else `false`.
+              */
+
+
+             function baseIsArrayBuffer(value) {
+               return isObjectLike(value) && baseGetTag(value) == arrayBufferTag;
+             }
+             /**
+              * The base implementation of `_.isDate` without Node.js optimizations.
+              *
+              * @private
+              * @param {*} value The value to check.
+              * @returns {boolean} Returns `true` if `value` is a date object, else `false`.
+              */
+
+
+             function baseIsDate(value) {
+               return isObjectLike(value) && baseGetTag(value) == dateTag;
+             }
+             /**
+              * The base implementation of `_.isEqual` which supports partial comparisons
+              * and tracks traversed objects.
+              *
+              * @private
+              * @param {*} value The value to compare.
+              * @param {*} other The other value to compare.
+              * @param {boolean} bitmask The bitmask flags.
+              *  1 - Unordered comparison
+              *  2 - Partial comparison
+              * @param {Function} [customizer] The function to customize comparisons.
+              * @param {Object} [stack] Tracks traversed `value` and `other` objects.
+              * @returns {boolean} Returns `true` if the values are equivalent, else `false`.
+              */
+
+
+             function baseIsEqual(value, other, bitmask, customizer, stack) {
+               if (value === other) {
+                 return true;
+               }
+
+               if (value == null || other == null || !isObjectLike(value) && !isObjectLike(other)) {
+                 return value !== value && other !== other;
+               }
+
+               return baseIsEqualDeep(value, other, bitmask, customizer, baseIsEqual, stack);
+             }
+             /**
+              * A specialized version of `baseIsEqual` for arrays and objects which performs
+              * deep comparisons and tracks traversed objects enabling objects with circular
+              * references to be compared.
+              *
+              * @private
+              * @param {Object} object The object to compare.
+              * @param {Object} other The other object to compare.
+              * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.
+              * @param {Function} customizer The function to customize comparisons.
+              * @param {Function} equalFunc The function to determine equivalents of values.
+              * @param {Object} [stack] Tracks traversed `object` and `other` objects.
+              * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.
+              */
+
+
+             function baseIsEqualDeep(object, other, bitmask, customizer, equalFunc, stack) {
+               var objIsArr = isArray(object),
+                   othIsArr = isArray(other),
+                   objTag = objIsArr ? arrayTag : getTag(object),
+                   othTag = othIsArr ? arrayTag : getTag(other);
+               objTag = objTag == argsTag ? objectTag : objTag;
+               othTag = othTag == argsTag ? objectTag : othTag;
+               var objIsObj = objTag == objectTag,
+                   othIsObj = othTag == objectTag,
+                   isSameTag = objTag == othTag;
+
+               if (isSameTag && isBuffer(object)) {
+                 if (!isBuffer(other)) {
+                   return false;
+                 }
+
+                 objIsArr = true;
+                 objIsObj = false;
+               }
+
+               if (isSameTag && !objIsObj) {
+                 stack || (stack = new Stack());
+                 return objIsArr || isTypedArray(object) ? equalArrays(object, other, bitmask, customizer, equalFunc, stack) : equalByTag(object, other, objTag, bitmask, customizer, equalFunc, stack);
+               }
+
+               if (!(bitmask & COMPARE_PARTIAL_FLAG)) {
+                 var objIsWrapped = objIsObj && hasOwnProperty.call(object, '__wrapped__'),
+                     othIsWrapped = othIsObj && hasOwnProperty.call(other, '__wrapped__');
+
+                 if (objIsWrapped || othIsWrapped) {
+                   var objUnwrapped = objIsWrapped ? object.value() : object,
+                       othUnwrapped = othIsWrapped ? other.value() : other;
+                   stack || (stack = new Stack());
+                   return equalFunc(objUnwrapped, othUnwrapped, bitmask, customizer, stack);
+                 }
+               }
+
+               if (!isSameTag) {
+                 return false;
+               }
+
+               stack || (stack = new Stack());
+               return equalObjects(object, other, bitmask, customizer, equalFunc, stack);
+             }
+             /**
+              * The base implementation of `_.isMap` without Node.js optimizations.
+              *
+              * @private
+              * @param {*} value The value to check.
+              * @returns {boolean} Returns `true` if `value` is a map, else `false`.
+              */
+
+
+             function baseIsMap(value) {
+               return isObjectLike(value) && getTag(value) == mapTag;
+             }
+             /**
+              * The base implementation of `_.isMatch` without support for iteratee shorthands.
+              *
+              * @private
+              * @param {Object} object The object to inspect.
+              * @param {Object} source The object of property values to match.
+              * @param {Array} matchData The property names, values, and compare flags to match.
+              * @param {Function} [customizer] The function to customize comparisons.
+              * @returns {boolean} Returns `true` if `object` is a match, else `false`.
+              */
+
+
+             function baseIsMatch(object, source, matchData, customizer) {
+               var index = matchData.length,
+                   length = index,
+                   noCustomizer = !customizer;
+
+               if (object == null) {
+                 return !length;
+               }
+
+               object = Object(object);
+
+               while (index--) {
+                 var data = matchData[index];
+
+                 if (noCustomizer && data[2] ? data[1] !== object[data[0]] : !(data[0] in object)) {
+                   return false;
+                 }
+               }
+
+               while (++index < length) {
+                 data = matchData[index];
+                 var key = data[0],
+                     objValue = object[key],
+                     srcValue = data[1];
+
+                 if (noCustomizer && data[2]) {
+                   if (objValue === undefined$1 && !(key in object)) {
+                     return false;
+                   }
+                 } else {
+                   var stack = new Stack();
+
+                   if (customizer) {
+                     var result = customizer(objValue, srcValue, key, object, source, stack);
+                   }
+
+                   if (!(result === undefined$1 ? baseIsEqual(srcValue, objValue, COMPARE_PARTIAL_FLAG | COMPARE_UNORDERED_FLAG, customizer, stack) : result)) {
+                     return false;
+                   }
+                 }
+               }
+
+               return true;
+             }
+             /**
+              * The base implementation of `_.isNative` without bad shim checks.
+              *
+              * @private
+              * @param {*} value The value to check.
+              * @returns {boolean} Returns `true` if `value` is a native function,
+              *  else `false`.
+              */
+
+
+             function baseIsNative(value) {
+               if (!isObject(value) || isMasked(value)) {
+                 return false;
+               }
+
+               var pattern = isFunction(value) ? reIsNative : reIsHostCtor;
+               return pattern.test(toSource(value));
+             }
+             /**
+              * The base implementation of `_.isRegExp` without Node.js optimizations.
+              *
+              * @private
+              * @param {*} value The value to check.
+              * @returns {boolean} Returns `true` if `value` is a regexp, else `false`.
+              */
+
+
+             function baseIsRegExp(value) {
+               return isObjectLike(value) && baseGetTag(value) == regexpTag;
+             }
+             /**
+              * The base implementation of `_.isSet` without Node.js optimizations.
+              *
+              * @private
+              * @param {*} value The value to check.
+              * @returns {boolean} Returns `true` if `value` is a set, else `false`.
+              */
+
+
+             function baseIsSet(value) {
+               return isObjectLike(value) && getTag(value) == setTag;
+             }
+             /**
+              * The base implementation of `_.isTypedArray` without Node.js optimizations.
+              *
+              * @private
+              * @param {*} value The value to check.
+              * @returns {boolean} Returns `true` if `value` is a typed array, else `false`.
+              */
+
+
+             function baseIsTypedArray(value) {
+               return isObjectLike(value) && isLength(value.length) && !!typedArrayTags[baseGetTag(value)];
+             }
+             /**
+              * The base implementation of `_.iteratee`.
+              *
+              * @private
+              * @param {*} [value=_.identity] The value to convert to an iteratee.
+              * @returns {Function} Returns the iteratee.
+              */
+
+
+             function baseIteratee(value) {
+               // Don't store the `typeof` result in a variable to avoid a JIT bug in Safari 9.
+               // See https://bugs.webkit.org/show_bug.cgi?id=156034 for more details.
+               if (typeof value == 'function') {
+                 return value;
+               }
+
+               if (value == null) {
+                 return identity;
+               }
+
+               if (_typeof(value) == 'object') {
+                 return isArray(value) ? baseMatchesProperty(value[0], value[1]) : baseMatches(value);
+               }
+
+               return property(value);
+             }
+             /**
+              * The base implementation of `_.keys` which doesn't treat sparse arrays as dense.
+              *
+              * @private
+              * @param {Object} object The object to query.
+              * @returns {Array} Returns the array of property names.
+              */
+
+
+             function baseKeys(object) {
+               if (!isPrototype(object)) {
+                 return nativeKeys(object);
+               }
+
+               var result = [];
+
+               for (var key in Object(object)) {
+                 if (hasOwnProperty.call(object, key) && key != 'constructor') {
+                   result.push(key);
+                 }
+               }
+
+               return result;
+             }
+             /**
+              * The base implementation of `_.keysIn` which doesn't treat sparse arrays as dense.
+              *
+              * @private
+              * @param {Object} object The object to query.
+              * @returns {Array} Returns the array of property names.
+              */
+
+
+             function baseKeysIn(object) {
+               if (!isObject(object)) {
+                 return nativeKeysIn(object);
+               }
+
+               var isProto = isPrototype(object),
+                   result = [];
+
+               for (var key in object) {
+                 if (!(key == 'constructor' && (isProto || !hasOwnProperty.call(object, key)))) {
+                   result.push(key);
+                 }
+               }
+
+               return result;
+             }
+             /**
+              * The base implementation of `_.lt` which doesn't coerce arguments.
+              *
+              * @private
+              * @param {*} value The value to compare.
+              * @param {*} other The other value to compare.
+              * @returns {boolean} Returns `true` if `value` is less than `other`,
+              *  else `false`.
+              */
+
+
+             function baseLt(value, other) {
+               return value < other;
+             }
+             /**
+              * The base implementation of `_.map` without support for iteratee shorthands.
+              *
+              * @private
+              * @param {Array|Object} collection The collection to iterate over.
+              * @param {Function} iteratee The function invoked per iteration.
+              * @returns {Array} Returns the new mapped array.
+              */
+
+
+             function baseMap(collection, iteratee) {
+               var index = -1,
+                   result = isArrayLike(collection) ? Array(collection.length) : [];
+               baseEach(collection, function (value, key, collection) {
+                 result[++index] = iteratee(value, key, collection);
+               });
+               return result;
+             }
+             /**
+              * The base implementation of `_.matches` which doesn't clone `source`.
+              *
+              * @private
+              * @param {Object} source The object of property values to match.
+              * @returns {Function} Returns the new spec function.
+              */
+
+
+             function baseMatches(source) {
+               var matchData = getMatchData(source);
+
+               if (matchData.length == 1 && matchData[0][2]) {
+                 return matchesStrictComparable(matchData[0][0], matchData[0][1]);
+               }
+
+               return function (object) {
+                 return object === source || baseIsMatch(object, source, matchData);
+               };
+             }
+             /**
+              * The base implementation of `_.matchesProperty` which doesn't clone `srcValue`.
+              *
+              * @private
+              * @param {string} path The path of the property to get.
+              * @param {*} srcValue The value to match.
+              * @returns {Function} Returns the new spec function.
+              */
+
+
+             function baseMatchesProperty(path, srcValue) {
+               if (isKey(path) && isStrictComparable(srcValue)) {
+                 return matchesStrictComparable(toKey(path), srcValue);
+               }
+
+               return function (object) {
+                 var objValue = get(object, path);
+                 return objValue === undefined$1 && objValue === srcValue ? hasIn(object, path) : baseIsEqual(srcValue, objValue, COMPARE_PARTIAL_FLAG | COMPARE_UNORDERED_FLAG);
+               };
+             }
+             /**
+              * The base implementation of `_.merge` without support for multiple sources.
+              *
+              * @private
+              * @param {Object} object The destination object.
+              * @param {Object} source The source object.
+              * @param {number} srcIndex The index of `source`.
+              * @param {Function} [customizer] The function to customize merged values.
+              * @param {Object} [stack] Tracks traversed source values and their merged
+              *  counterparts.
+              */
+
+
+             function baseMerge(object, source, srcIndex, customizer, stack) {
+               if (object === source) {
+                 return;
+               }
+
+               baseFor(source, function (srcValue, key) {
+                 stack || (stack = new Stack());
+
+                 if (isObject(srcValue)) {
+                   baseMergeDeep(object, source, key, srcIndex, baseMerge, customizer, stack);
+                 } else {
+                   var newValue = customizer ? customizer(safeGet(object, key), srcValue, key + '', object, source, stack) : undefined$1;
+
+                   if (newValue === undefined$1) {
+                     newValue = srcValue;
+                   }
+
+                   assignMergeValue(object, key, newValue);
+                 }
+               }, keysIn);
+             }
+             /**
+              * A specialized version of `baseMerge` for arrays and objects which performs
+              * deep merges and tracks traversed objects enabling objects with circular
+              * references to be merged.
+              *
+              * @private
+              * @param {Object} object The destination object.
+              * @param {Object} source The source object.
+              * @param {string} key The key of the value to merge.
+              * @param {number} srcIndex The index of `source`.
+              * @param {Function} mergeFunc The function to merge values.
+              * @param {Function} [customizer] The function to customize assigned values.
+              * @param {Object} [stack] Tracks traversed source values and their merged
+              *  counterparts.
+              */
+
+
+             function baseMergeDeep(object, source, key, srcIndex, mergeFunc, customizer, stack) {
+               var objValue = safeGet(object, key),
+                   srcValue = safeGet(source, key),
+                   stacked = stack.get(srcValue);
+
+               if (stacked) {
+                 assignMergeValue(object, key, stacked);
+                 return;
+               }
+
+               var newValue = customizer ? customizer(objValue, srcValue, key + '', object, source, stack) : undefined$1;
+               var isCommon = newValue === undefined$1;
+
+               if (isCommon) {
+                 var isArr = isArray(srcValue),
+                     isBuff = !isArr && isBuffer(srcValue),
+                     isTyped = !isArr && !isBuff && isTypedArray(srcValue);
+                 newValue = srcValue;
+
+                 if (isArr || isBuff || isTyped) {
+                   if (isArray(objValue)) {
+                     newValue = objValue;
+                   } else if (isArrayLikeObject(objValue)) {
+                     newValue = copyArray(objValue);
+                   } else if (isBuff) {
+                     isCommon = false;
+                     newValue = cloneBuffer(srcValue, true);
+                   } else if (isTyped) {
+                     isCommon = false;
+                     newValue = cloneTypedArray(srcValue, true);
+                   } else {
+                     newValue = [];
+                   }
+                 } else if (isPlainObject(srcValue) || isArguments(srcValue)) {
+                   newValue = objValue;
+
+                   if (isArguments(objValue)) {
+                     newValue = toPlainObject(objValue);
+                   } else if (!isObject(objValue) || isFunction(objValue)) {
+                     newValue = initCloneObject(srcValue);
+                   }
+                 } else {
+                   isCommon = false;
+                 }
+               }
+
+               if (isCommon) {
+                 // Recursively merge objects and arrays (susceptible to call stack limits).
+                 stack.set(srcValue, newValue);
+                 mergeFunc(newValue, srcValue, srcIndex, customizer, stack);
+                 stack['delete'](srcValue);
+               }
+
+               assignMergeValue(object, key, newValue);
+             }
+             /**
+              * The base implementation of `_.nth` which doesn't coerce arguments.
+              *
+              * @private
+              * @param {Array} array The array to query.
+              * @param {number} n The index of the element to return.
+              * @returns {*} Returns the nth element of `array`.
+              */
+
+
+             function baseNth(array, n) {
+               var length = array.length;
+
+               if (!length) {
+                 return;
+               }
+
+               n += n < 0 ? length : 0;
+               return isIndex(n, length) ? array[n] : undefined$1;
+             }
+             /**
+              * The base implementation of `_.orderBy` without param guards.
+              *
+              * @private
+              * @param {Array|Object} collection The collection to iterate over.
+              * @param {Function[]|Object[]|string[]} iteratees The iteratees to sort by.
+              * @param {string[]} orders The sort orders of `iteratees`.
+              * @returns {Array} Returns the new sorted array.
+              */
+
+
+             function baseOrderBy(collection, iteratees, orders) {
+               if (iteratees.length) {
+                 iteratees = arrayMap(iteratees, function (iteratee) {
+                   if (isArray(iteratee)) {
+                     return function (value) {
+                       return baseGet(value, iteratee.length === 1 ? iteratee[0] : iteratee);
+                     };
+                   }
+
+                   return iteratee;
+                 });
+               } else {
+                 iteratees = [identity];
+               }
+
+               var index = -1;
+               iteratees = arrayMap(iteratees, baseUnary(getIteratee()));
+               var result = baseMap(collection, function (value, key, collection) {
+                 var criteria = arrayMap(iteratees, function (iteratee) {
+                   return iteratee(value);
+                 });
+                 return {
+                   'criteria': criteria,
+                   'index': ++index,
+                   'value': value
+                 };
+               });
+               return baseSortBy(result, function (object, other) {
+                 return compareMultiple(object, other, orders);
+               });
+             }
+             /**
+              * The base implementation of `_.pick` without support for individual
+              * property identifiers.
+              *
+              * @private
+              * @param {Object} object The source object.
+              * @param {string[]} paths The property paths to pick.
+              * @returns {Object} Returns the new object.
+              */
+
+
+             function basePick(object, paths) {
+               return basePickBy(object, paths, function (value, path) {
+                 return hasIn(object, path);
+               });
+             }
+             /**
+              * The base implementation of  `_.pickBy` without support for iteratee shorthands.
+              *
+              * @private
+              * @param {Object} object The source object.
+              * @param {string[]} paths The property paths to pick.
+              * @param {Function} predicate The function invoked per property.
+              * @returns {Object} Returns the new object.
+              */
+
+
+             function basePickBy(object, paths, predicate) {
+               var index = -1,
+                   length = paths.length,
+                   result = {};
+
+               while (++index < length) {
+                 var path = paths[index],
+                     value = baseGet(object, path);
+
+                 if (predicate(value, path)) {
+                   baseSet(result, castPath(path, object), value);
+                 }
+               }
+
+               return result;
+             }
+             /**
+              * A specialized version of `baseProperty` which supports deep paths.
+              *
+              * @private
+              * @param {Array|string} path The path of the property to get.
+              * @returns {Function} Returns the new accessor function.
+              */
+
+
+             function basePropertyDeep(path) {
+               return function (object) {
+                 return baseGet(object, path);
+               };
+             }
+             /**
+              * The base implementation of `_.pullAllBy` without support for iteratee
+              * shorthands.
+              *
+              * @private
+              * @param {Array} array The array to modify.
+              * @param {Array} values The values to remove.
+              * @param {Function} [iteratee] The iteratee invoked per element.
+              * @param {Function} [comparator] The comparator invoked per element.
+              * @returns {Array} Returns `array`.
+              */
+
+
+             function basePullAll(array, values, iteratee, comparator) {
+               var indexOf = comparator ? baseIndexOfWith : baseIndexOf,
+                   index = -1,
+                   length = values.length,
+                   seen = array;
+
+               if (array === values) {
+                 values = copyArray(values);
+               }
+
+               if (iteratee) {
+                 seen = arrayMap(array, baseUnary(iteratee));
+               }
+
+               while (++index < length) {
+                 var fromIndex = 0,
+                     value = values[index],
+                     computed = iteratee ? iteratee(value) : value;
+
+                 while ((fromIndex = indexOf(seen, computed, fromIndex, comparator)) > -1) {
+                   if (seen !== array) {
+                     splice.call(seen, fromIndex, 1);
+                   }
+
+                   splice.call(array, fromIndex, 1);
+                 }
+               }
+
+               return array;
+             }
+             /**
+              * The base implementation of `_.pullAt` without support for individual
+              * indexes or capturing the removed elements.
+              *
+              * @private
+              * @param {Array} array The array to modify.
+              * @param {number[]} indexes The indexes of elements to remove.
+              * @returns {Array} Returns `array`.
+              */
+
+
+             function basePullAt(array, indexes) {
+               var length = array ? indexes.length : 0,
+                   lastIndex = length - 1;
+
+               while (length--) {
+                 var index = indexes[length];
+
+                 if (length == lastIndex || index !== previous) {
+                   var previous = index;
+
+                   if (isIndex(index)) {
+                     splice.call(array, index, 1);
+                   } else {
+                     baseUnset(array, index);
+                   }
+                 }
+               }
+
+               return array;
+             }
+             /**
+              * The base implementation of `_.random` without support for returning
+              * floating-point numbers.
+              *
+              * @private
+              * @param {number} lower The lower bound.
+              * @param {number} upper The upper bound.
+              * @returns {number} Returns the random number.
+              */
+
+
+             function baseRandom(lower, upper) {
+               return lower + nativeFloor(nativeRandom() * (upper - lower + 1));
+             }
+             /**
+              * The base implementation of `_.range` and `_.rangeRight` which doesn't
+              * coerce arguments.
+              *
+              * @private
+              * @param {number} start The start of the range.
+              * @param {number} end The end of the range.
+              * @param {number} step The value to increment or decrement by.
+              * @param {boolean} [fromRight] Specify iterating from right to left.
+              * @returns {Array} Returns the range of numbers.
+              */
+
+
+             function baseRange(start, end, step, fromRight) {
+               var index = -1,
+                   length = nativeMax(nativeCeil((end - start) / (step || 1)), 0),
+                   result = Array(length);
+
+               while (length--) {
+                 result[fromRight ? length : ++index] = start;
+                 start += step;
+               }
+
+               return result;
+             }
+             /**
+              * The base implementation of `_.repeat` which doesn't coerce arguments.
+              *
+              * @private
+              * @param {string} string The string to repeat.
+              * @param {number} n The number of times to repeat the string.
+              * @returns {string} Returns the repeated string.
+              */
+
+
+             function baseRepeat(string, n) {
+               var result = '';
+
+               if (!string || n < 1 || n > MAX_SAFE_INTEGER) {
+                 return result;
+               } // Leverage the exponentiation by squaring algorithm for a faster repeat.
+               // See https://en.wikipedia.org/wiki/Exponentiation_by_squaring for more details.
+
+
+               do {
+                 if (n % 2) {
+                   result += string;
+                 }
+
+                 n = nativeFloor(n / 2);
+
+                 if (n) {
+                   string += string;
+                 }
+               } while (n);
+
+               return result;
+             }
+             /**
+              * The base implementation of `_.rest` which doesn't validate or coerce arguments.
+              *
+              * @private
+              * @param {Function} func The function to apply a rest parameter to.
+              * @param {number} [start=func.length-1] The start position of the rest parameter.
+              * @returns {Function} Returns the new function.
+              */
+
+
+             function baseRest(func, start) {
+               return setToString(overRest(func, start, identity), func + '');
+             }
+             /**
+              * The base implementation of `_.sample`.
+              *
+              * @private
+              * @param {Array|Object} collection The collection to sample.
+              * @returns {*} Returns the random element.
+              */
+
+
+             function baseSample(collection) {
+               return arraySample(values(collection));
+             }
+             /**
+              * The base implementation of `_.sampleSize` without param guards.
+              *
+              * @private
+              * @param {Array|Object} collection The collection to sample.
+              * @param {number} n The number of elements to sample.
+              * @returns {Array} Returns the random elements.
+              */
+
+
+             function baseSampleSize(collection, n) {
+               var array = values(collection);
+               return shuffleSelf(array, baseClamp(n, 0, array.length));
+             }
+             /**
+              * The base implementation of `_.set`.
+              *
+              * @private
+              * @param {Object} object The object to modify.
+              * @param {Array|string} path The path of the property to set.
+              * @param {*} value The value to set.
+              * @param {Function} [customizer] The function to customize path creation.
+              * @returns {Object} Returns `object`.
+              */
+
+
+             function baseSet(object, path, value, customizer) {
+               if (!isObject(object)) {
+                 return object;
+               }
+
+               path = castPath(path, object);
+               var index = -1,
+                   length = path.length,
+                   lastIndex = length - 1,
+                   nested = object;
+
+               while (nested != null && ++index < length) {
+                 var key = toKey(path[index]),
+                     newValue = value;
+
+                 if (key === '__proto__' || key === 'constructor' || key === 'prototype') {
+                   return object;
+                 }
+
+                 if (index != lastIndex) {
+                   var objValue = nested[key];
+                   newValue = customizer ? customizer(objValue, key, nested) : undefined$1;
+
+                   if (newValue === undefined$1) {
+                     newValue = isObject(objValue) ? objValue : isIndex(path[index + 1]) ? [] : {};
+                   }
+                 }
+
+                 assignValue(nested, key, newValue);
+                 nested = nested[key];
+               }
+
+               return object;
+             }
+             /**
+              * The base implementation of `setData` without support for hot loop shorting.
+              *
+              * @private
+              * @param {Function} func The function to associate metadata with.
+              * @param {*} data The metadata.
+              * @returns {Function} Returns `func`.
+              */
+
+
+             var baseSetData = !metaMap ? identity : function (func, data) {
+               metaMap.set(func, data);
+               return func;
+             };
+             /**
+              * The base implementation of `setToString` without support for hot loop shorting.
+              *
+              * @private
+              * @param {Function} func The function to modify.
+              * @param {Function} string The `toString` result.
+              * @returns {Function} Returns `func`.
+              */
+
+             var baseSetToString = !defineProperty ? identity : function (func, string) {
+               return defineProperty(func, 'toString', {
+                 'configurable': true,
+                 'enumerable': false,
+                 'value': constant(string),
+                 'writable': true
+               });
+             };
+             /**
+              * The base implementation of `_.shuffle`.
+              *
+              * @private
+              * @param {Array|Object} collection The collection to shuffle.
+              * @returns {Array} Returns the new shuffled array.
+              */
+
+             function baseShuffle(collection) {
+               return shuffleSelf(values(collection));
+             }
+             /**
+              * The base implementation of `_.slice` without an iteratee call guard.
+              *
+              * @private
+              * @param {Array} array The array to slice.
+              * @param {number} [start=0] The start position.
+              * @param {number} [end=array.length] The end position.
+              * @returns {Array} Returns the slice of `array`.
+              */
+
+
+             function baseSlice(array, start, end) {
+               var index = -1,
+                   length = array.length;
+
+               if (start < 0) {
+                 start = -start > length ? 0 : length + start;
+               }
+
+               end = end > length ? length : end;
+
+               if (end < 0) {
+                 end += length;
+               }
+
+               length = start > end ? 0 : end - start >>> 0;
+               start >>>= 0;
+               var result = Array(length);
+
+               while (++index < length) {
+                 result[index] = array[index + start];
+               }
+
+               return result;
+             }
+             /**
+              * The base implementation of `_.some` without support for iteratee shorthands.
+              *
+              * @private
+              * @param {Array|Object} collection The collection to iterate over.
+              * @param {Function} predicate The function invoked per iteration.
+              * @returns {boolean} Returns `true` if any element passes the predicate check,
+              *  else `false`.
+              */
+
+
+             function baseSome(collection, predicate) {
+               var result;
+               baseEach(collection, function (value, index, collection) {
+                 result = predicate(value, index, collection);
+                 return !result;
+               });
+               return !!result;
+             }
+             /**
+              * The base implementation of `_.sortedIndex` and `_.sortedLastIndex` which
+              * performs a binary search of `array` to determine the index at which `value`
+              * should be inserted into `array` in order to maintain its sort order.
+              *
+              * @private
+              * @param {Array} array The sorted array to inspect.
+              * @param {*} value The value to evaluate.
+              * @param {boolean} [retHighest] Specify returning the highest qualified index.
+              * @returns {number} Returns the index at which `value` should be inserted
+              *  into `array`.
+              */
+
+
+             function baseSortedIndex(array, value, retHighest) {
+               var low = 0,
+                   high = array == null ? low : array.length;
+
+               if (typeof value == 'number' && value === value && high <= HALF_MAX_ARRAY_LENGTH) {
+                 while (low < high) {
+                   var mid = low + high >>> 1,
+                       computed = array[mid];
+
+                   if (computed !== null && !isSymbol(computed) && (retHighest ? computed <= value : computed < value)) {
+                     low = mid + 1;
+                   } else {
+                     high = mid;
+                   }
+                 }
+
+                 return high;
+               }
+
+               return baseSortedIndexBy(array, value, identity, retHighest);
+             }
+             /**
+              * The base implementation of `_.sortedIndexBy` and `_.sortedLastIndexBy`
+              * which invokes `iteratee` for `value` and each element of `array` to compute
+              * their sort ranking. The iteratee is invoked with one argument; (value).
+              *
+              * @private
+              * @param {Array} array The sorted array to inspect.
+              * @param {*} value The value to evaluate.
+              * @param {Function} iteratee The iteratee invoked per element.
+              * @param {boolean} [retHighest] Specify returning the highest qualified index.
+              * @returns {number} Returns the index at which `value` should be inserted
+              *  into `array`.
+              */
+
+
+             function baseSortedIndexBy(array, value, iteratee, retHighest) {
+               var low = 0,
+                   high = array == null ? 0 : array.length;
+
+               if (high === 0) {
+                 return 0;
+               }
+
+               value = iteratee(value);
+               var valIsNaN = value !== value,
+                   valIsNull = value === null,
+                   valIsSymbol = isSymbol(value),
+                   valIsUndefined = value === undefined$1;
+
+               while (low < high) {
+                 var mid = nativeFloor((low + high) / 2),
+                     computed = iteratee(array[mid]),
+                     othIsDefined = computed !== undefined$1,
+                     othIsNull = computed === null,
+                     othIsReflexive = computed === computed,
+                     othIsSymbol = isSymbol(computed);
+
+                 if (valIsNaN) {
+                   var setLow = retHighest || othIsReflexive;
+                 } else if (valIsUndefined) {
+                   setLow = othIsReflexive && (retHighest || othIsDefined);
+                 } else if (valIsNull) {
+                   setLow = othIsReflexive && othIsDefined && (retHighest || !othIsNull);
+                 } else if (valIsSymbol) {
+                   setLow = othIsReflexive && othIsDefined && !othIsNull && (retHighest || !othIsSymbol);
+                 } else if (othIsNull || othIsSymbol) {
+                   setLow = false;
+                 } else {
+                   setLow = retHighest ? computed <= value : computed < value;
+                 }
+
+                 if (setLow) {
+                   low = mid + 1;
+                 } else {
+                   high = mid;
+                 }
+               }
+
+               return nativeMin(high, MAX_ARRAY_INDEX);
+             }
+             /**
+              * The base implementation of `_.sortedUniq` and `_.sortedUniqBy` without
+              * support for iteratee shorthands.
+              *
+              * @private
+              * @param {Array} array The array to inspect.
+              * @param {Function} [iteratee] The iteratee invoked per element.
+              * @returns {Array} Returns the new duplicate free array.
+              */
+
+
+             function baseSortedUniq(array, iteratee) {
+               var index = -1,
+                   length = array.length,
+                   resIndex = 0,
+                   result = [];
+
+               while (++index < length) {
+                 var value = array[index],
+                     computed = iteratee ? iteratee(value) : value;
+
+                 if (!index || !eq(computed, seen)) {
+                   var seen = computed;
+                   result[resIndex++] = value === 0 ? 0 : value;
+                 }
+               }
+
+               return result;
+             }
+             /**
+              * The base implementation of `_.toNumber` which doesn't ensure correct
+              * conversions of binary, hexadecimal, or octal string values.
+              *
+              * @private
+              * @param {*} value The value to process.
+              * @returns {number} Returns the number.
+              */
+
+
+             function baseToNumber(value) {
+               if (typeof value == 'number') {
+                 return value;
+               }
+
+               if (isSymbol(value)) {
+                 return NAN;
+               }
+
+               return +value;
+             }
+             /**
+              * The base implementation of `_.toString` which doesn't convert nullish
+              * values to empty strings.
+              *
+              * @private
+              * @param {*} value The value to process.
+              * @returns {string} Returns the string.
+              */
+
+
+             function baseToString(value) {
+               // Exit early for strings to avoid a performance hit in some environments.
+               if (typeof value == 'string') {
+                 return value;
+               }
+
+               if (isArray(value)) {
+                 // Recursively convert values (susceptible to call stack limits).
+                 return arrayMap(value, baseToString) + '';
+               }
+
+               if (isSymbol(value)) {
+                 return symbolToString ? symbolToString.call(value) : '';
+               }
+
+               var result = value + '';
+               return result == '0' && 1 / value == -INFINITY ? '-0' : result;
+             }
+             /**
+              * The base implementation of `_.uniqBy` without support for iteratee shorthands.
+              *
+              * @private
+              * @param {Array} array The array to inspect.
+              * @param {Function} [iteratee] The iteratee invoked per element.
+              * @param {Function} [comparator] The comparator invoked per element.
+              * @returns {Array} Returns the new duplicate free array.
+              */
+
+
+             function baseUniq(array, iteratee, comparator) {
+               var index = -1,
+                   includes = arrayIncludes,
+                   length = array.length,
+                   isCommon = true,
+                   result = [],
+                   seen = result;
+
+               if (comparator) {
+                 isCommon = false;
+                 includes = arrayIncludesWith;
+               } else if (length >= LARGE_ARRAY_SIZE) {
+                 var set = iteratee ? null : createSet(array);
+
+                 if (set) {
+                   return setToArray(set);
+                 }
+
+                 isCommon = false;
+                 includes = cacheHas;
+                 seen = new SetCache();
+               } else {
+                 seen = iteratee ? [] : result;
+               }
+
+               outer: while (++index < length) {
+                 var value = array[index],
+                     computed = iteratee ? iteratee(value) : value;
+                 value = comparator || value !== 0 ? value : 0;
+
+                 if (isCommon && computed === computed) {
+                   var seenIndex = seen.length;
+
+                   while (seenIndex--) {
+                     if (seen[seenIndex] === computed) {
+                       continue outer;
+                     }
+                   }
+
+                   if (iteratee) {
+                     seen.push(computed);
+                   }
+
+                   result.push(value);
+                 } else if (!includes(seen, computed, comparator)) {
+                   if (seen !== result) {
+                     seen.push(computed);
+                   }
+
+                   result.push(value);
+                 }
+               }
+
+               return result;
+             }
+             /**
+              * The base implementation of `_.unset`.
+              *
+              * @private
+              * @param {Object} object The object to modify.
+              * @param {Array|string} path The property path to unset.
+              * @returns {boolean} Returns `true` if the property is deleted, else `false`.
+              */
+
+
+             function baseUnset(object, path) {
+               path = castPath(path, object);
+               object = parent(object, path);
+               return object == null || delete object[toKey(last(path))];
+             }
+             /**
+              * The base implementation of `_.update`.
+              *
+              * @private
+              * @param {Object} object The object to modify.
+              * @param {Array|string} path The path of the property to update.
+              * @param {Function} updater The function to produce the updated value.
+              * @param {Function} [customizer] The function to customize path creation.
+              * @returns {Object} Returns `object`.
+              */
+
+
+             function baseUpdate(object, path, updater, customizer) {
+               return baseSet(object, path, updater(baseGet(object, path)), customizer);
+             }
+             /**
+              * The base implementation of methods like `_.dropWhile` and `_.takeWhile`
+              * without support for iteratee shorthands.
+              *
+              * @private
+              * @param {Array} array The array to query.
+              * @param {Function} predicate The function invoked per iteration.
+              * @param {boolean} [isDrop] Specify dropping elements instead of taking them.
+              * @param {boolean} [fromRight] Specify iterating from right to left.
+              * @returns {Array} Returns the slice of `array`.
+              */
+
+
+             function baseWhile(array, predicate, isDrop, fromRight) {
+               var length = array.length,
+                   index = fromRight ? length : -1;
+
+               while ((fromRight ? index-- : ++index < length) && predicate(array[index], index, array)) {}
+
+               return isDrop ? baseSlice(array, fromRight ? 0 : index, fromRight ? index + 1 : length) : baseSlice(array, fromRight ? index + 1 : 0, fromRight ? length : index);
+             }
+             /**
+              * The base implementation of `wrapperValue` which returns the result of
+              * performing a sequence of actions on the unwrapped `value`, where each
+              * successive action is supplied the return value of the previous.
+              *
+              * @private
+              * @param {*} value The unwrapped value.
+              * @param {Array} actions Actions to perform to resolve the unwrapped value.
+              * @returns {*} Returns the resolved value.
+              */
+
+
+             function baseWrapperValue(value, actions) {
+               var result = value;
+
+               if (result instanceof LazyWrapper) {
+                 result = result.value();
+               }
+
+               return arrayReduce(actions, function (result, action) {
+                 return action.func.apply(action.thisArg, arrayPush([result], action.args));
+               }, result);
+             }
+             /**
+              * The base implementation of methods like `_.xor`, without support for
+              * iteratee shorthands, that accepts an array of arrays to inspect.
+              *
+              * @private
+              * @param {Array} arrays The arrays to inspect.
+              * @param {Function} [iteratee] The iteratee invoked per element.
+              * @param {Function} [comparator] The comparator invoked per element.
+              * @returns {Array} Returns the new array of values.
+              */
+
+
+             function baseXor(arrays, iteratee, comparator) {
+               var length = arrays.length;
+
+               if (length < 2) {
+                 return length ? baseUniq(arrays[0]) : [];
+               }
+
+               var index = -1,
+                   result = Array(length);
+
+               while (++index < length) {
+                 var array = arrays[index],
+                     othIndex = -1;
+
+                 while (++othIndex < length) {
+                   if (othIndex != index) {
+                     result[index] = baseDifference(result[index] || array, arrays[othIndex], iteratee, comparator);
+                   }
+                 }
+               }
+
+               return baseUniq(baseFlatten(result, 1), iteratee, comparator);
+             }
+             /**
+              * This base implementation of `_.zipObject` which assigns values using `assignFunc`.
+              *
+              * @private
+              * @param {Array} props The property identifiers.
+              * @param {Array} values The property values.
+              * @param {Function} assignFunc The function to assign values.
+              * @returns {Object} Returns the new object.
+              */
+
+
+             function baseZipObject(props, values, assignFunc) {
+               var index = -1,
+                   length = props.length,
+                   valsLength = values.length,
+                   result = {};
+
+               while (++index < length) {
+                 var value = index < valsLength ? values[index] : undefined$1;
+                 assignFunc(result, props[index], value);
+               }
+
+               return result;
+             }
+             /**
+              * Casts `value` to an empty array if it's not an array like object.
+              *
+              * @private
+              * @param {*} value The value to inspect.
+              * @returns {Array|Object} Returns the cast array-like object.
+              */
+
+
+             function castArrayLikeObject(value) {
+               return isArrayLikeObject(value) ? value : [];
+             }
+             /**
+              * Casts `value` to `identity` if it's not a function.
+              *
+              * @private
+              * @param {*} value The value to inspect.
+              * @returns {Function} Returns cast function.
+              */
+
+
+             function castFunction(value) {
+               return typeof value == 'function' ? value : identity;
+             }
+             /**
+              * Casts `value` to a path array if it's not one.
+              *
+              * @private
+              * @param {*} value The value to inspect.
+              * @param {Object} [object] The object to query keys on.
+              * @returns {Array} Returns the cast property path array.
+              */
+
+
+             function castPath(value, object) {
+               if (isArray(value)) {
+                 return value;
+               }
+
+               return isKey(value, object) ? [value] : stringToPath(toString(value));
+             }
+             /**
+              * A `baseRest` alias which can be replaced with `identity` by module
+              * replacement plugins.
+              *
+              * @private
+              * @type {Function}
+              * @param {Function} func The function to apply a rest parameter to.
+              * @returns {Function} Returns the new function.
+              */
+
+
+             var castRest = baseRest;
+             /**
+              * Casts `array` to a slice if it's needed.
+              *
+              * @private
+              * @param {Array} array The array to inspect.
+              * @param {number} start The start position.
+              * @param {number} [end=array.length] The end position.
+              * @returns {Array} Returns the cast slice.
+              */
+
+             function castSlice(array, start, end) {
+               var length = array.length;
+               end = end === undefined$1 ? length : end;
+               return !start && end >= length ? array : baseSlice(array, start, end);
+             }
+             /**
+              * A simple wrapper around the global [`clearTimeout`](https://mdn.io/clearTimeout).
+              *
+              * @private
+              * @param {number|Object} id The timer id or timeout object of the timer to clear.
+              */
+
+
+             var clearTimeout = ctxClearTimeout || function (id) {
+               return root.clearTimeout(id);
+             };
+             /**
+              * Creates a clone of  `buffer`.
+              *
+              * @private
+              * @param {Buffer} buffer The buffer to clone.
+              * @param {boolean} [isDeep] Specify a deep clone.
+              * @returns {Buffer} Returns the cloned buffer.
+              */
+
+
+             function cloneBuffer(buffer, isDeep) {
+               if (isDeep) {
+                 return buffer.slice();
+               }
+
+               var length = buffer.length,
+                   result = allocUnsafe ? allocUnsafe(length) : new buffer.constructor(length);
+               buffer.copy(result);
+               return result;
+             }
+             /**
+              * Creates a clone of `arrayBuffer`.
+              *
+              * @private
+              * @param {ArrayBuffer} arrayBuffer The array buffer to clone.
+              * @returns {ArrayBuffer} Returns the cloned array buffer.
+              */
+
+
+             function cloneArrayBuffer(arrayBuffer) {
+               var result = new arrayBuffer.constructor(arrayBuffer.byteLength);
+               new Uint8Array(result).set(new Uint8Array(arrayBuffer));
+               return result;
+             }
+             /**
+              * Creates a clone of `dataView`.
+              *
+              * @private
+              * @param {Object} dataView The data view to clone.
+              * @param {boolean} [isDeep] Specify a deep clone.
+              * @returns {Object} Returns the cloned data view.
+              */
+
+
+             function cloneDataView(dataView, isDeep) {
+               var buffer = isDeep ? cloneArrayBuffer(dataView.buffer) : dataView.buffer;
+               return new dataView.constructor(buffer, dataView.byteOffset, dataView.byteLength);
+             }
+             /**
+              * Creates a clone of `regexp`.
+              *
+              * @private
+              * @param {Object} regexp The regexp to clone.
+              * @returns {Object} Returns the cloned regexp.
+              */
+
+
+             function cloneRegExp(regexp) {
+               var result = new regexp.constructor(regexp.source, reFlags.exec(regexp));
+               result.lastIndex = regexp.lastIndex;
+               return result;
+             }
+             /**
+              * Creates a clone of the `symbol` object.
+              *
+              * @private
+              * @param {Object} symbol The symbol object to clone.
+              * @returns {Object} Returns the cloned symbol object.
+              */
+
+
+             function cloneSymbol(symbol) {
+               return symbolValueOf ? Object(symbolValueOf.call(symbol)) : {};
+             }
+             /**
+              * Creates a clone of `typedArray`.
+              *
+              * @private
+              * @param {Object} typedArray The typed array to clone.
+              * @param {boolean} [isDeep] Specify a deep clone.
+              * @returns {Object} Returns the cloned typed array.
+              */
+
+
+             function cloneTypedArray(typedArray, isDeep) {
+               var buffer = isDeep ? cloneArrayBuffer(typedArray.buffer) : typedArray.buffer;
+               return new typedArray.constructor(buffer, typedArray.byteOffset, typedArray.length);
+             }
+             /**
+              * Compares values to sort them in ascending order.
+              *
+              * @private
+              * @param {*} value The value to compare.
+              * @param {*} other The other value to compare.
+              * @returns {number} Returns the sort order indicator for `value`.
+              */
+
+
+             function compareAscending(value, other) {
+               if (value !== other) {
+                 var valIsDefined = value !== undefined$1,
+                     valIsNull = value === null,
+                     valIsReflexive = value === value,
+                     valIsSymbol = isSymbol(value);
+                 var othIsDefined = other !== undefined$1,
+                     othIsNull = other === null,
+                     othIsReflexive = other === other,
+                     othIsSymbol = isSymbol(other);
+
+                 if (!othIsNull && !othIsSymbol && !valIsSymbol && value > other || valIsSymbol && othIsDefined && othIsReflexive && !othIsNull && !othIsSymbol || valIsNull && othIsDefined && othIsReflexive || !valIsDefined && othIsReflexive || !valIsReflexive) {
+                   return 1;
+                 }
+
+                 if (!valIsNull && !valIsSymbol && !othIsSymbol && value < other || othIsSymbol && valIsDefined && valIsReflexive && !valIsNull && !valIsSymbol || othIsNull && valIsDefined && valIsReflexive || !othIsDefined && valIsReflexive || !othIsReflexive) {
+                   return -1;
+                 }
+               }
+
+               return 0;
+             }
+             /**
+              * Used by `_.orderBy` to compare multiple properties of a value to another
+              * and stable sort them.
+              *
+              * If `orders` is unspecified, all values are sorted in ascending order. Otherwise,
+              * specify an order of "desc" for descending or "asc" for ascending sort order
+              * of corresponding values.
+              *
+              * @private
+              * @param {Object} object The object to compare.
+              * @param {Object} other The other object to compare.
+              * @param {boolean[]|string[]} orders The order to sort by for each property.
+              * @returns {number} Returns the sort order indicator for `object`.
+              */
+
+
+             function compareMultiple(object, other, orders) {
+               var index = -1,
+                   objCriteria = object.criteria,
+                   othCriteria = other.criteria,
+                   length = objCriteria.length,
+                   ordersLength = orders.length;
+
+               while (++index < length) {
+                 var result = compareAscending(objCriteria[index], othCriteria[index]);
+
+                 if (result) {
+                   if (index >= ordersLength) {
+                     return result;
+                   }
+
+                   var order = orders[index];
+                   return result * (order == 'desc' ? -1 : 1);
+                 }
+               } // Fixes an `Array#sort` bug in the JS engine embedded in Adobe applications
+               // that causes it, under certain circumstances, to provide the same value for
+               // `object` and `other`. See https://github.com/jashkenas/underscore/pull/1247
+               // for more details.
+               //
+               // This also ensures a stable sort in V8 and other engines.
+               // See https://bugs.chromium.org/p/v8/issues/detail?id=90 for more details.
+
+
+               return object.index - other.index;
+             }
+             /**
+              * Creates an array that is the composition of partially applied arguments,
+              * placeholders, and provided arguments into a single array of arguments.
+              *
+              * @private
+              * @param {Array} args The provided arguments.
+              * @param {Array} partials The arguments to prepend to those provided.
+              * @param {Array} holders The `partials` placeholder indexes.
+              * @params {boolean} [isCurried] Specify composing for a curried function.
+              * @returns {Array} Returns the new array of composed arguments.
+              */
+
+
+             function composeArgs(args, partials, holders, isCurried) {
+               var argsIndex = -1,
+                   argsLength = args.length,
+                   holdersLength = holders.length,
+                   leftIndex = -1,
+                   leftLength = partials.length,
+                   rangeLength = nativeMax(argsLength - holdersLength, 0),
+                   result = Array(leftLength + rangeLength),
+                   isUncurried = !isCurried;
+
+               while (++leftIndex < leftLength) {
+                 result[leftIndex] = partials[leftIndex];
+               }
+
+               while (++argsIndex < holdersLength) {
+                 if (isUncurried || argsIndex < argsLength) {
+                   result[holders[argsIndex]] = args[argsIndex];
+                 }
+               }
+
+               while (rangeLength--) {
+                 result[leftIndex++] = args[argsIndex++];
+               }
+
+               return result;
+             }
+             /**
+              * This function is like `composeArgs` except that the arguments composition
+              * is tailored for `_.partialRight`.
+              *
+              * @private
+              * @param {Array} args The provided arguments.
+              * @param {Array} partials The arguments to append to those provided.
+              * @param {Array} holders The `partials` placeholder indexes.
+              * @params {boolean} [isCurried] Specify composing for a curried function.
+              * @returns {Array} Returns the new array of composed arguments.
+              */
+
+
+             function composeArgsRight(args, partials, holders, isCurried) {
+               var argsIndex = -1,
+                   argsLength = args.length,
+                   holdersIndex = -1,
+                   holdersLength = holders.length,
+                   rightIndex = -1,
+                   rightLength = partials.length,
+                   rangeLength = nativeMax(argsLength - holdersLength, 0),
+                   result = Array(rangeLength + rightLength),
+                   isUncurried = !isCurried;
+
+               while (++argsIndex < rangeLength) {
+                 result[argsIndex] = args[argsIndex];
+               }
+
+               var offset = argsIndex;
+
+               while (++rightIndex < rightLength) {
+                 result[offset + rightIndex] = partials[rightIndex];
+               }
+
+               while (++holdersIndex < holdersLength) {
+                 if (isUncurried || argsIndex < argsLength) {
+                   result[offset + holders[holdersIndex]] = args[argsIndex++];
+                 }
+               }
+
+               return result;
+             }
+             /**
+              * Copies the values of `source` to `array`.
+              *
+              * @private
+              * @param {Array} source The array to copy values from.
+              * @param {Array} [array=[]] The array to copy values to.
+              * @returns {Array} Returns `array`.
+              */
+
+
+             function copyArray(source, array) {
+               var index = -1,
+                   length = source.length;
+               array || (array = Array(length));
+
+               while (++index < length) {
+                 array[index] = source[index];
+               }
+
+               return array;
+             }
+             /**
+              * Copies properties of `source` to `object`.
+              *
+              * @private
+              * @param {Object} source The object to copy properties from.
+              * @param {Array} props The property identifiers to copy.
+              * @param {Object} [object={}] The object to copy properties to.
+              * @param {Function} [customizer] The function to customize copied values.
+              * @returns {Object} Returns `object`.
+              */
+
+
+             function copyObject(source, props, object, customizer) {
+               var isNew = !object;
+               object || (object = {});
+               var index = -1,
+                   length = props.length;
+
+               while (++index < length) {
+                 var key = props[index];
+                 var newValue = customizer ? customizer(object[key], source[key], key, object, source) : undefined$1;
+
+                 if (newValue === undefined$1) {
+                   newValue = source[key];
+                 }
+
+                 if (isNew) {
+                   baseAssignValue(object, key, newValue);
+                 } else {
+                   assignValue(object, key, newValue);
+                 }
+               }
+
+               return object;
+             }
+             /**
+              * Copies own symbols of `source` to `object`.
+              *
+              * @private
+              * @param {Object} source The object to copy symbols from.
+              * @param {Object} [object={}] The object to copy symbols to.
+              * @returns {Object} Returns `object`.
+              */
+
+
+             function copySymbols(source, object) {
+               return copyObject(source, getSymbols(source), object);
+             }
+             /**
+              * Copies own and inherited symbols of `source` to `object`.
+              *
+              * @private
+              * @param {Object} source The object to copy symbols from.
+              * @param {Object} [object={}] The object to copy symbols to.
+              * @returns {Object} Returns `object`.
+              */
+
+
+             function copySymbolsIn(source, object) {
+               return copyObject(source, getSymbolsIn(source), object);
+             }
+             /**
+              * Creates a function like `_.groupBy`.
+              *
+              * @private
+              * @param {Function} setter The function to set accumulator values.
+              * @param {Function} [initializer] The accumulator object initializer.
+              * @returns {Function} Returns the new aggregator function.
+              */
+
+
+             function createAggregator(setter, initializer) {
+               return function (collection, iteratee) {
+                 var func = isArray(collection) ? arrayAggregator : baseAggregator,
+                     accumulator = initializer ? initializer() : {};
+                 return func(collection, setter, getIteratee(iteratee, 2), accumulator);
+               };
+             }
+             /**
+              * Creates a function like `_.assign`.
+              *
+              * @private
+              * @param {Function} assigner The function to assign values.
+              * @returns {Function} Returns the new assigner function.
+              */
+
+
+             function createAssigner(assigner) {
+               return baseRest(function (object, sources) {
+                 var index = -1,
+                     length = sources.length,
+                     customizer = length > 1 ? sources[length - 1] : undefined$1,
+                     guard = length > 2 ? sources[2] : undefined$1;
+                 customizer = assigner.length > 3 && typeof customizer == 'function' ? (length--, customizer) : undefined$1;
+
+                 if (guard && isIterateeCall(sources[0], sources[1], guard)) {
+                   customizer = length < 3 ? undefined$1 : customizer;
+                   length = 1;
+                 }
+
+                 object = Object(object);
+
+                 while (++index < length) {
+                   var source = sources[index];
+
+                   if (source) {
+                     assigner(object, source, index, customizer);
+                   }
+                 }
+
+                 return object;
+               });
+             }
+             /**
+              * Creates a `baseEach` or `baseEachRight` function.
+              *
+              * @private
+              * @param {Function} eachFunc The function to iterate over a collection.
+              * @param {boolean} [fromRight] Specify iterating from right to left.
+              * @returns {Function} Returns the new base function.
+              */
+
+
+             function createBaseEach(eachFunc, fromRight) {
+               return function (collection, iteratee) {
+                 if (collection == null) {
+                   return collection;
+                 }
+
+                 if (!isArrayLike(collection)) {
+                   return eachFunc(collection, iteratee);
+                 }
+
+                 var length = collection.length,
+                     index = fromRight ? length : -1,
+                     iterable = Object(collection);
+
+                 while (fromRight ? index-- : ++index < length) {
+                   if (iteratee(iterable[index], index, iterable) === false) {
+                     break;
+                   }
+                 }
+
+                 return collection;
+               };
+             }
+             /**
+              * Creates a base function for methods like `_.forIn` and `_.forOwn`.
+              *
+              * @private
+              * @param {boolean} [fromRight] Specify iterating from right to left.
+              * @returns {Function} Returns the new base function.
+              */
+
+
+             function createBaseFor(fromRight) {
+               return function (object, iteratee, keysFunc) {
+                 var index = -1,
+                     iterable = Object(object),
+                     props = keysFunc(object),
+                     length = props.length;
+
+                 while (length--) {
+                   var key = props[fromRight ? length : ++index];
+
+                   if (iteratee(iterable[key], key, iterable) === false) {
+                     break;
+                   }
+                 }
+
+                 return object;
+               };
+             }
+             /**
+              * Creates a function that wraps `func` to invoke it with the optional `this`
+              * binding of `thisArg`.
+              *
+              * @private
+              * @param {Function} func The function to wrap.
+              * @param {number} bitmask The bitmask flags. See `createWrap` for more details.
+              * @param {*} [thisArg] The `this` binding of `func`.
+              * @returns {Function} Returns the new wrapped function.
+              */
+
+
+             function createBind(func, bitmask, thisArg) {
+               var isBind = bitmask & WRAP_BIND_FLAG,
+                   Ctor = createCtor(func);
+
+               function wrapper() {
+                 var fn = this && this !== root && this instanceof wrapper ? Ctor : func;
+                 return fn.apply(isBind ? thisArg : this, arguments);
+               }
+
+               return wrapper;
+             }
+             /**
+              * Creates a function like `_.lowerFirst`.
+              *
+              * @private
+              * @param {string} methodName The name of the `String` case method to use.
+              * @returns {Function} Returns the new case function.
+              */
+
+
+             function createCaseFirst(methodName) {
+               return function (string) {
+                 string = toString(string);
+                 var strSymbols = hasUnicode(string) ? stringToArray(string) : undefined$1;
+                 var chr = strSymbols ? strSymbols[0] : string.charAt(0);
+                 var trailing = strSymbols ? castSlice(strSymbols, 1).join('') : string.slice(1);
+                 return chr[methodName]() + trailing;
+               };
+             }
+             /**
+              * Creates a function like `_.camelCase`.
+              *
+              * @private
+              * @param {Function} callback The function to combine each word.
+              * @returns {Function} Returns the new compounder function.
+              */
+
+
+             function createCompounder(callback) {
+               return function (string) {
+                 return arrayReduce(words(deburr(string).replace(reApos, '')), callback, '');
+               };
+             }
+             /**
+              * Creates a function that produces an instance of `Ctor` regardless of
+              * whether it was invoked as part of a `new` expression or by `call` or `apply`.
+              *
+              * @private
+              * @param {Function} Ctor The constructor to wrap.
+              * @returns {Function} Returns the new wrapped function.
+              */
+
+
+             function createCtor(Ctor) {
+               return function () {
+                 // Use a `switch` statement to work with class constructors. See
+                 // http://ecma-international.org/ecma-262/7.0/#sec-ecmascript-function-objects-call-thisargument-argumentslist
+                 // for more details.
+                 var args = arguments;
+
+                 switch (args.length) {
+                   case 0:
+                     return new Ctor();
+
+                   case 1:
+                     return new Ctor(args[0]);
+
+                   case 2:
+                     return new Ctor(args[0], args[1]);
+
+                   case 3:
+                     return new Ctor(args[0], args[1], args[2]);
+
+                   case 4:
+                     return new Ctor(args[0], args[1], args[2], args[3]);
+
+                   case 5:
+                     return new Ctor(args[0], args[1], args[2], args[3], args[4]);
+
+                   case 6:
+                     return new Ctor(args[0], args[1], args[2], args[3], args[4], args[5]);
+
+                   case 7:
+                     return new Ctor(args[0], args[1], args[2], args[3], args[4], args[5], args[6]);
+                 }
+
+                 var thisBinding = baseCreate(Ctor.prototype),
+                     result = Ctor.apply(thisBinding, args); // Mimic the constructor's `return` behavior.
+                 // See https://es5.github.io/#x13.2.2 for more details.
+
+                 return isObject(result) ? result : thisBinding;
+               };
+             }
+             /**
+              * Creates a function that wraps `func` to enable currying.
+              *
+              * @private
+              * @param {Function} func The function to wrap.
+              * @param {number} bitmask The bitmask flags. See `createWrap` for more details.
+              * @param {number} arity The arity of `func`.
+              * @returns {Function} Returns the new wrapped function.
+              */
+
+
+             function createCurry(func, bitmask, arity) {
+               var Ctor = createCtor(func);
+
+               function wrapper() {
+                 var length = arguments.length,
+                     args = Array(length),
+                     index = length,
+                     placeholder = getHolder(wrapper);
+
+                 while (index--) {
+                   args[index] = arguments[index];
+                 }
+
+                 var holders = length < 3 && args[0] !== placeholder && args[length - 1] !== placeholder ? [] : replaceHolders(args, placeholder);
+                 length -= holders.length;
+
+                 if (length < arity) {
+                   return createRecurry(func, bitmask, createHybrid, wrapper.placeholder, undefined$1, args, holders, undefined$1, undefined$1, arity - length);
+                 }
+
+                 var fn = this && this !== root && this instanceof wrapper ? Ctor : func;
+                 return apply(fn, this, args);
+               }
+
+               return wrapper;
+             }
+             /**
+              * Creates a `_.find` or `_.findLast` function.
+              *
+              * @private
+              * @param {Function} findIndexFunc The function to find the collection index.
+              * @returns {Function} Returns the new find function.
+              */
+
+
+             function createFind(findIndexFunc) {
+               return function (collection, predicate, fromIndex) {
+                 var iterable = Object(collection);
+
+                 if (!isArrayLike(collection)) {
+                   var iteratee = getIteratee(predicate, 3);
+                   collection = keys(collection);
+
+                   predicate = function predicate(key) {
+                     return iteratee(iterable[key], key, iterable);
+                   };
+                 }
+
+                 var index = findIndexFunc(collection, predicate, fromIndex);
+                 return index > -1 ? iterable[iteratee ? collection[index] : index] : undefined$1;
+               };
+             }
+             /**
+              * Creates a `_.flow` or `_.flowRight` function.
+              *
+              * @private
+              * @param {boolean} [fromRight] Specify iterating from right to left.
+              * @returns {Function} Returns the new flow function.
+              */
+
+
+             function createFlow(fromRight) {
+               return flatRest(function (funcs) {
+                 var length = funcs.length,
+                     index = length,
+                     prereq = LodashWrapper.prototype.thru;
+
+                 if (fromRight) {
+                   funcs.reverse();
+                 }
+
+                 while (index--) {
+                   var func = funcs[index];
+
+                   if (typeof func != 'function') {
+                     throw new TypeError(FUNC_ERROR_TEXT);
+                   }
+
+                   if (prereq && !wrapper && getFuncName(func) == 'wrapper') {
+                     var wrapper = new LodashWrapper([], true);
+                   }
+                 }
+
+                 index = wrapper ? index : length;
+
+                 while (++index < length) {
+                   func = funcs[index];
+                   var funcName = getFuncName(func),
+                       data = funcName == 'wrapper' ? getData(func) : undefined$1;
+
+                   if (data && isLaziable(data[0]) && data[1] == (WRAP_ARY_FLAG | WRAP_CURRY_FLAG | WRAP_PARTIAL_FLAG | WRAP_REARG_FLAG) && !data[4].length && data[9] == 1) {
+                     wrapper = wrapper[getFuncName(data[0])].apply(wrapper, data[3]);
+                   } else {
+                     wrapper = func.length == 1 && isLaziable(func) ? wrapper[funcName]() : wrapper.thru(func);
+                   }
+                 }
+
+                 return function () {
+                   var args = arguments,
+                       value = args[0];
+
+                   if (wrapper && args.length == 1 && isArray(value)) {
+                     return wrapper.plant(value).value();
+                   }
+
+                   var index = 0,
+                       result = length ? funcs[index].apply(this, args) : value;
+
+                   while (++index < length) {
+                     result = funcs[index].call(this, result);
+                   }
+
+                   return result;
+                 };
+               });
+             }
+             /**
+              * Creates a function that wraps `func` to invoke it with optional `this`
+              * binding of `thisArg`, partial application, and currying.
+              *
+              * @private
+              * @param {Function|string} func The function or method name to wrap.
+              * @param {number} bitmask The bitmask flags. See `createWrap` for more details.
+              * @param {*} [thisArg] The `this` binding of `func`.
+              * @param {Array} [partials] The arguments to prepend to those provided to
+              *  the new function.
+              * @param {Array} [holders] The `partials` placeholder indexes.
+              * @param {Array} [partialsRight] The arguments to append to those provided
+              *  to the new function.
+              * @param {Array} [holdersRight] The `partialsRight` placeholder indexes.
+              * @param {Array} [argPos] The argument positions of the new function.
+              * @param {number} [ary] The arity cap of `func`.
+              * @param {number} [arity] The arity of `func`.
+              * @returns {Function} Returns the new wrapped function.
+              */
+
+
+             function createHybrid(func, bitmask, thisArg, partials, holders, partialsRight, holdersRight, argPos, ary, arity) {
+               var isAry = bitmask & WRAP_ARY_FLAG,
+                   isBind = bitmask & WRAP_BIND_FLAG,
+                   isBindKey = bitmask & WRAP_BIND_KEY_FLAG,
+                   isCurried = bitmask & (WRAP_CURRY_FLAG | WRAP_CURRY_RIGHT_FLAG),
+                   isFlip = bitmask & WRAP_FLIP_FLAG,
+                   Ctor = isBindKey ? undefined$1 : createCtor(func);
+
+               function wrapper() {
+                 var length = arguments.length,
+                     args = Array(length),
+                     index = length;
+
+                 while (index--) {
+                   args[index] = arguments[index];
+                 }
+
+                 if (isCurried) {
+                   var placeholder = getHolder(wrapper),
+                       holdersCount = countHolders(args, placeholder);
+                 }
+
+                 if (partials) {
+                   args = composeArgs(args, partials, holders, isCurried);
+                 }
+
+                 if (partialsRight) {
+                   args = composeArgsRight(args, partialsRight, holdersRight, isCurried);
+                 }
+
+                 length -= holdersCount;
+
+                 if (isCurried && length < arity) {
+                   var newHolders = replaceHolders(args, placeholder);
+                   return createRecurry(func, bitmask, createHybrid, wrapper.placeholder, thisArg, args, newHolders, argPos, ary, arity - length);
+                 }
+
+                 var thisBinding = isBind ? thisArg : this,
+                     fn = isBindKey ? thisBinding[func] : func;
+                 length = args.length;
+
+                 if (argPos) {
+                   args = reorder(args, argPos);
+                 } else if (isFlip && length > 1) {
+                   args.reverse();
+                 }
+
+                 if (isAry && ary < length) {
+                   args.length = ary;
+                 }
+
+                 if (this && this !== root && this instanceof wrapper) {
+                   fn = Ctor || createCtor(fn);
+                 }
+
+                 return fn.apply(thisBinding, args);
+               }
+
+               return wrapper;
+             }
+             /**
+              * Creates a function like `_.invertBy`.
+              *
+              * @private
+              * @param {Function} setter The function to set accumulator values.
+              * @param {Function} toIteratee The function to resolve iteratees.
+              * @returns {Function} Returns the new inverter function.
+              */
+
+
+             function createInverter(setter, toIteratee) {
+               return function (object, iteratee) {
+                 return baseInverter(object, setter, toIteratee(iteratee), {});
+               };
+             }
+             /**
+              * Creates a function that performs a mathematical operation on two values.
+              *
+              * @private
+              * @param {Function} operator The function to perform the operation.
+              * @param {number} [defaultValue] The value used for `undefined` arguments.
+              * @returns {Function} Returns the new mathematical operation function.
+              */
+
+
+             function createMathOperation(operator, defaultValue) {
+               return function (value, other) {
+                 var result;
+
+                 if (value === undefined$1 && other === undefined$1) {
+                   return defaultValue;
+                 }
+
+                 if (value !== undefined$1) {
+                   result = value;
+                 }
+
+                 if (other !== undefined$1) {
+                   if (result === undefined$1) {
+                     return other;
+                   }
+
+                   if (typeof value == 'string' || typeof other == 'string') {
+                     value = baseToString(value);
+                     other = baseToString(other);
+                   } else {
+                     value = baseToNumber(value);
+                     other = baseToNumber(other);
+                   }
+
+                   result = operator(value, other);
+                 }
+
+                 return result;
+               };
+             }
+             /**
+              * Creates a function like `_.over`.
+              *
+              * @private
+              * @param {Function} arrayFunc The function to iterate over iteratees.
+              * @returns {Function} Returns the new over function.
+              */
+
+
+             function createOver(arrayFunc) {
+               return flatRest(function (iteratees) {
+                 iteratees = arrayMap(iteratees, baseUnary(getIteratee()));
+                 return baseRest(function (args) {
+                   var thisArg = this;
+                   return arrayFunc(iteratees, function (iteratee) {
+                     return apply(iteratee, thisArg, args);
+                   });
+                 });
+               });
+             }
+             /**
+              * Creates the padding for `string` based on `length`. The `chars` string
+              * is truncated if the number of characters exceeds `length`.
+              *
+              * @private
+              * @param {number} length The padding length.
+              * @param {string} [chars=' '] The string used as padding.
+              * @returns {string} Returns the padding for `string`.
+              */
+
+
+             function createPadding(length, chars) {
+               chars = chars === undefined$1 ? ' ' : baseToString(chars);
+               var charsLength = chars.length;
+
+               if (charsLength < 2) {
+                 return charsLength ? baseRepeat(chars, length) : chars;
+               }
+
+               var result = baseRepeat(chars, nativeCeil(length / stringSize(chars)));
+               return hasUnicode(chars) ? castSlice(stringToArray(result), 0, length).join('') : result.slice(0, length);
+             }
+             /**
+              * Creates a function that wraps `func` to invoke it with the `this` binding
+              * of `thisArg` and `partials` prepended to the arguments it receives.
+              *
+              * @private
+              * @param {Function} func The function to wrap.
+              * @param {number} bitmask The bitmask flags. See `createWrap` for more details.
+              * @param {*} thisArg The `this` binding of `func`.
+              * @param {Array} partials The arguments to prepend to those provided to
+              *  the new function.
+              * @returns {Function} Returns the new wrapped function.
+              */
+
+
+             function createPartial(func, bitmask, thisArg, partials) {
+               var isBind = bitmask & WRAP_BIND_FLAG,
+                   Ctor = createCtor(func);
+
+               function wrapper() {
+                 var argsIndex = -1,
+                     argsLength = arguments.length,
+                     leftIndex = -1,
+                     leftLength = partials.length,
+                     args = Array(leftLength + argsLength),
+                     fn = this && this !== root && this instanceof wrapper ? Ctor : func;
+
+                 while (++leftIndex < leftLength) {
+                   args[leftIndex] = partials[leftIndex];
+                 }
+
+                 while (argsLength--) {
+                   args[leftIndex++] = arguments[++argsIndex];
+                 }
+
+                 return apply(fn, isBind ? thisArg : this, args);
+               }
+
+               return wrapper;
+             }
+             /**
+              * Creates a `_.range` or `_.rangeRight` function.
+              *
+              * @private
+              * @param {boolean} [fromRight] Specify iterating from right to left.
+              * @returns {Function} Returns the new range function.
+              */
+
+
+             function createRange(fromRight) {
+               return function (start, end, step) {
+                 if (step && typeof step != 'number' && isIterateeCall(start, end, step)) {
+                   end = step = undefined$1;
+                 } // Ensure the sign of `-0` is preserved.
+
+
+                 start = toFinite(start);
+
+                 if (end === undefined$1) {
+                   end = start;
+                   start = 0;
+                 } else {
+                   end = toFinite(end);
+                 }
+
+                 step = step === undefined$1 ? start < end ? 1 : -1 : toFinite(step);
+                 return baseRange(start, end, step, fromRight);
+               };
+             }
+             /**
+              * Creates a function that performs a relational operation on two values.
+              *
+              * @private
+              * @param {Function} operator The function to perform the operation.
+              * @returns {Function} Returns the new relational operation function.
+              */
+
+
+             function createRelationalOperation(operator) {
+               return function (value, other) {
+                 if (!(typeof value == 'string' && typeof other == 'string')) {
+                   value = toNumber(value);
+                   other = toNumber(other);
+                 }
+
+                 return operator(value, other);
+               };
+             }
+             /**
+              * Creates a function that wraps `func` to continue currying.
+              *
+              * @private
+              * @param {Function} func The function to wrap.
+              * @param {number} bitmask The bitmask flags. See `createWrap` for more details.
+              * @param {Function} wrapFunc The function to create the `func` wrapper.
+              * @param {*} placeholder The placeholder value.
+              * @param {*} [thisArg] The `this` binding of `func`.
+              * @param {Array} [partials] The arguments to prepend to those provided to
+              *  the new function.
+              * @param {Array} [holders] The `partials` placeholder indexes.
+              * @param {Array} [argPos] The argument positions of the new function.
+              * @param {number} [ary] The arity cap of `func`.
+              * @param {number} [arity] The arity of `func`.
+              * @returns {Function} Returns the new wrapped function.
+              */
+
+
+             function createRecurry(func, bitmask, wrapFunc, placeholder, thisArg, partials, holders, argPos, ary, arity) {
+               var isCurry = bitmask & WRAP_CURRY_FLAG,
+                   newHolders = isCurry ? holders : undefined$1,
+                   newHoldersRight = isCurry ? undefined$1 : holders,
+                   newPartials = isCurry ? partials : undefined$1,
+                   newPartialsRight = isCurry ? undefined$1 : partials;
+               bitmask |= isCurry ? WRAP_PARTIAL_FLAG : WRAP_PARTIAL_RIGHT_FLAG;
+               bitmask &= ~(isCurry ? WRAP_PARTIAL_RIGHT_FLAG : WRAP_PARTIAL_FLAG);
+
+               if (!(bitmask & WRAP_CURRY_BOUND_FLAG)) {
+                 bitmask &= ~(WRAP_BIND_FLAG | WRAP_BIND_KEY_FLAG);
+               }
+
+               var newData = [func, bitmask, thisArg, newPartials, newHolders, newPartialsRight, newHoldersRight, argPos, ary, arity];
+               var result = wrapFunc.apply(undefined$1, newData);
+
+               if (isLaziable(func)) {
+                 setData(result, newData);
+               }
+
+               result.placeholder = placeholder;
+               return setWrapToString(result, func, bitmask);
+             }
+             /**
+              * Creates a function like `_.round`.
+              *
+              * @private
+              * @param {string} methodName The name of the `Math` method to use when rounding.
+              * @returns {Function} Returns the new round function.
+              */
+
+
+             function createRound(methodName) {
+               var func = Math[methodName];
+               return function (number, precision) {
+                 number = toNumber(number);
+                 precision = precision == null ? 0 : nativeMin(toInteger(precision), 292);
+
+                 if (precision && nativeIsFinite(number)) {
+                   // Shift with exponential notation to avoid floating-point issues.
+                   // See [MDN](https://mdn.io/round#Examples) for more details.
+                   var pair = (toString(number) + 'e').split('e'),
+                       value = func(pair[0] + 'e' + (+pair[1] + precision));
+                   pair = (toString(value) + 'e').split('e');
+                   return +(pair[0] + 'e' + (+pair[1] - precision));
+                 }
+
+                 return func(number);
+               };
+             }
+             /**
+              * Creates a set object of `values`.
+              *
+              * @private
+              * @param {Array} values The values to add to the set.
+              * @returns {Object} Returns the new set.
+              */
+
+
+             var createSet = !(Set && 1 / setToArray(new Set([, -0]))[1] == INFINITY) ? noop : function (values) {
+               return new Set(values);
+             };
+             /**
+              * Creates a `_.toPairs` or `_.toPairsIn` function.
+              *
+              * @private
+              * @param {Function} keysFunc The function to get the keys of a given object.
+              * @returns {Function} Returns the new pairs function.
+              */
+
+             function createToPairs(keysFunc) {
+               return function (object) {
+                 var tag = getTag(object);
+
+                 if (tag == mapTag) {
+                   return mapToArray(object);
+                 }
+
+                 if (tag == setTag) {
+                   return setToPairs(object);
+                 }
+
+                 return baseToPairs(object, keysFunc(object));
+               };
+             }
+             /**
+              * Creates a function that either curries or invokes `func` with optional
+              * `this` binding and partially applied arguments.
+              *
+              * @private
+              * @param {Function|string} func The function or method name to wrap.
+              * @param {number} bitmask The bitmask flags.
+              *    1 - `_.bind`
+              *    2 - `_.bindKey`
+              *    4 - `_.curry` or `_.curryRight` of a bound function
+              *    8 - `_.curry`
+              *   16 - `_.curryRight`
+              *   32 - `_.partial`
+              *   64 - `_.partialRight`
+              *  128 - `_.rearg`
+              *  256 - `_.ary`
+              *  512 - `_.flip`
+              * @param {*} [thisArg] The `this` binding of `func`.
+              * @param {Array} [partials] The arguments to be partially applied.
+              * @param {Array} [holders] The `partials` placeholder indexes.
+              * @param {Array} [argPos] The argument positions of the new function.
+              * @param {number} [ary] The arity cap of `func`.
+              * @param {number} [arity] The arity of `func`.
+              * @returns {Function} Returns the new wrapped function.
+              */
+
+
+             function createWrap(func, bitmask, thisArg, partials, holders, argPos, ary, arity) {
+               var isBindKey = bitmask & WRAP_BIND_KEY_FLAG;
+
+               if (!isBindKey && typeof func != 'function') {
+                 throw new TypeError(FUNC_ERROR_TEXT);
+               }
+
+               var length = partials ? partials.length : 0;
+
+               if (!length) {
+                 bitmask &= ~(WRAP_PARTIAL_FLAG | WRAP_PARTIAL_RIGHT_FLAG);
+                 partials = holders = undefined$1;
+               }
+
+               ary = ary === undefined$1 ? ary : nativeMax(toInteger(ary), 0);
+               arity = arity === undefined$1 ? arity : toInteger(arity);
+               length -= holders ? holders.length : 0;
+
+               if (bitmask & WRAP_PARTIAL_RIGHT_FLAG) {
+                 var partialsRight = partials,
+                     holdersRight = holders;
+                 partials = holders = undefined$1;
+               }
+
+               var data = isBindKey ? undefined$1 : getData(func);
+               var newData = [func, bitmask, thisArg, partials, holders, partialsRight, holdersRight, argPos, ary, arity];
+
+               if (data) {
+                 mergeData(newData, data);
+               }
+
+               func = newData[0];
+               bitmask = newData[1];
+               thisArg = newData[2];
+               partials = newData[3];
+               holders = newData[4];
+               arity = newData[9] = newData[9] === undefined$1 ? isBindKey ? 0 : func.length : nativeMax(newData[9] - length, 0);
+
+               if (!arity && bitmask & (WRAP_CURRY_FLAG | WRAP_CURRY_RIGHT_FLAG)) {
+                 bitmask &= ~(WRAP_CURRY_FLAG | WRAP_CURRY_RIGHT_FLAG);
+               }
+
+               if (!bitmask || bitmask == WRAP_BIND_FLAG) {
+                 var result = createBind(func, bitmask, thisArg);
+               } else if (bitmask == WRAP_CURRY_FLAG || bitmask == WRAP_CURRY_RIGHT_FLAG) {
+                 result = createCurry(func, bitmask, arity);
+               } else if ((bitmask == WRAP_PARTIAL_FLAG || bitmask == (WRAP_BIND_FLAG | WRAP_PARTIAL_FLAG)) && !holders.length) {
+                 result = createPartial(func, bitmask, thisArg, partials);
+               } else {
+                 result = createHybrid.apply(undefined$1, newData);
+               }
+
+               var setter = data ? baseSetData : setData;
+               return setWrapToString(setter(result, newData), func, bitmask);
+             }
+             /**
+              * Used by `_.defaults` to customize its `_.assignIn` use to assign properties
+              * of source objects to the destination object for all destination properties
+              * that resolve to `undefined`.
+              *
+              * @private
+              * @param {*} objValue The destination value.
+              * @param {*} srcValue The source value.
+              * @param {string} key The key of the property to assign.
+              * @param {Object} object The parent object of `objValue`.
+              * @returns {*} Returns the value to assign.
+              */
+
+
+             function customDefaultsAssignIn(objValue, srcValue, key, object) {
+               if (objValue === undefined$1 || eq(objValue, objectProto[key]) && !hasOwnProperty.call(object, key)) {
+                 return srcValue;
+               }
+
+               return objValue;
+             }
+             /**
+              * Used by `_.defaultsDeep` to customize its `_.merge` use to merge source
+              * objects into destination objects that are passed thru.
+              *
+              * @private
+              * @param {*} objValue The destination value.
+              * @param {*} srcValue The source value.
+              * @param {string} key The key of the property to merge.
+              * @param {Object} object The parent object of `objValue`.
+              * @param {Object} source The parent object of `srcValue`.
+              * @param {Object} [stack] Tracks traversed source values and their merged
+              *  counterparts.
+              * @returns {*} Returns the value to assign.
+              */
+
+
+             function customDefaultsMerge(objValue, srcValue, key, object, source, stack) {
+               if (isObject(objValue) && isObject(srcValue)) {
+                 // Recursively merge objects and arrays (susceptible to call stack limits).
+                 stack.set(srcValue, objValue);
+                 baseMerge(objValue, srcValue, undefined$1, customDefaultsMerge, stack);
+                 stack['delete'](srcValue);
+               }
+
+               return objValue;
+             }
+             /**
+              * Used by `_.omit` to customize its `_.cloneDeep` use to only clone plain
+              * objects.
+              *
+              * @private
+              * @param {*} value The value to inspect.
+              * @param {string} key The key of the property to inspect.
+              * @returns {*} Returns the uncloned value or `undefined` to defer cloning to `_.cloneDeep`.
+              */
+
+
+             function customOmitClone(value) {
+               return isPlainObject(value) ? undefined$1 : value;
+             }
+             /**
+              * A specialized version of `baseIsEqualDeep` for arrays with support for
+              * partial deep comparisons.
+              *
+              * @private
+              * @param {Array} array The array to compare.
+              * @param {Array} other The other array to compare.
+              * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.
+              * @param {Function} customizer The function to customize comparisons.
+              * @param {Function} equalFunc The function to determine equivalents of values.
+              * @param {Object} stack Tracks traversed `array` and `other` objects.
+              * @returns {boolean} Returns `true` if the arrays are equivalent, else `false`.
+              */
+
+
+             function equalArrays(array, other, bitmask, customizer, equalFunc, stack) {
+               var isPartial = bitmask & COMPARE_PARTIAL_FLAG,
+                   arrLength = array.length,
+                   othLength = other.length;
+
+               if (arrLength != othLength && !(isPartial && othLength > arrLength)) {
+                 return false;
+               } // Check that cyclic values are equal.
+
+
+               var arrStacked = stack.get(array);
+               var othStacked = stack.get(other);
+
+               if (arrStacked && othStacked) {
+                 return arrStacked == other && othStacked == array;
+               }
+
+               var index = -1,
+                   result = true,
+                   seen = bitmask & COMPARE_UNORDERED_FLAG ? new SetCache() : undefined$1;
+               stack.set(array, other);
+               stack.set(other, array); // Ignore non-index properties.
+
+               while (++index < arrLength) {
+                 var arrValue = array[index],
+                     othValue = other[index];
+
+                 if (customizer) {
+                   var compared = isPartial ? customizer(othValue, arrValue, index, other, array, stack) : customizer(arrValue, othValue, index, array, other, stack);
+                 }
+
+                 if (compared !== undefined$1) {
+                   if (compared) {
+                     continue;
+                   }
+
+                   result = false;
+                   break;
+                 } // Recursively compare arrays (susceptible to call stack limits).
+
+
+                 if (seen) {
+                   if (!arraySome(other, function (othValue, othIndex) {
+                     if (!cacheHas(seen, othIndex) && (arrValue === othValue || equalFunc(arrValue, othValue, bitmask, customizer, stack))) {
+                       return seen.push(othIndex);
+                     }
+                   })) {
+                     result = false;
+                     break;
+                   }
+                 } else if (!(arrValue === othValue || equalFunc(arrValue, othValue, bitmask, customizer, stack))) {
+                   result = false;
+                   break;
+                 }
+               }
+
+               stack['delete'](array);
+               stack['delete'](other);
+               return result;
+             }
+             /**
+              * A specialized version of `baseIsEqualDeep` for comparing objects of
+              * the same `toStringTag`.
+              *
+              * **Note:** This function only supports comparing values with tags of
+              * `Boolean`, `Date`, `Error`, `Number`, `RegExp`, or `String`.
+              *
+              * @private
+              * @param {Object} object The object to compare.
+              * @param {Object} other The other object to compare.
+              * @param {string} tag The `toStringTag` of the objects to compare.
+              * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.
+              * @param {Function} customizer The function to customize comparisons.
+              * @param {Function} equalFunc The function to determine equivalents of values.
+              * @param {Object} stack Tracks traversed `object` and `other` objects.
+              * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.
+              */
+
+
+             function equalByTag(object, other, tag, bitmask, customizer, equalFunc, stack) {
+               switch (tag) {
+                 case dataViewTag:
+                   if (object.byteLength != other.byteLength || object.byteOffset != other.byteOffset) {
+                     return false;
+                   }
+
+                   object = object.buffer;
+                   other = other.buffer;
+
+                 case arrayBufferTag:
+                   if (object.byteLength != other.byteLength || !equalFunc(new Uint8Array(object), new Uint8Array(other))) {
+                     return false;
+                   }
+
+                   return true;
+
+                 case boolTag:
+                 case dateTag:
+                 case numberTag:
+                   // Coerce booleans to `1` or `0` and dates to milliseconds.
+                   // Invalid dates are coerced to `NaN`.
+                   return eq(+object, +other);
+
+                 case errorTag:
+                   return object.name == other.name && object.message == other.message;
+
+                 case regexpTag:
+                 case stringTag:
+                   // Coerce regexes to strings and treat strings, primitives and objects,
+                   // as equal. See http://www.ecma-international.org/ecma-262/7.0/#sec-regexp.prototype.tostring
+                   // for more details.
+                   return object == other + '';
+
+                 case mapTag:
+                   var convert = mapToArray;
+
+                 case setTag:
+                   var isPartial = bitmask & COMPARE_PARTIAL_FLAG;
+                   convert || (convert = setToArray);
+
+                   if (object.size != other.size && !isPartial) {
+                     return false;
+                   } // Assume cyclic values are equal.
+
+
+                   var stacked = stack.get(object);
+
+                   if (stacked) {
+                     return stacked == other;
+                   }
+
+                   bitmask |= COMPARE_UNORDERED_FLAG; // Recursively compare objects (susceptible to call stack limits).
+
+                   stack.set(object, other);
+                   var result = equalArrays(convert(object), convert(other), bitmask, customizer, equalFunc, stack);
+                   stack['delete'](object);
+                   return result;
+
+                 case symbolTag:
+                   if (symbolValueOf) {
+                     return symbolValueOf.call(object) == symbolValueOf.call(other);
+                   }
+
+               }
+
+               return false;
+             }
+             /**
+              * A specialized version of `baseIsEqualDeep` for objects with support for
+              * partial deep comparisons.
+              *
+              * @private
+              * @param {Object} object The object to compare.
+              * @param {Object} other The other object to compare.
+              * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.
+              * @param {Function} customizer The function to customize comparisons.
+              * @param {Function} equalFunc The function to determine equivalents of values.
+              * @param {Object} stack Tracks traversed `object` and `other` objects.
+              * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.
+              */
+
+
+             function equalObjects(object, other, bitmask, customizer, equalFunc, stack) {
+               var isPartial = bitmask & COMPARE_PARTIAL_FLAG,
+                   objProps = getAllKeys(object),
+                   objLength = objProps.length,
+                   othProps = getAllKeys(other),
+                   othLength = othProps.length;
+
+               if (objLength != othLength && !isPartial) {
+                 return false;
+               }
+
+               var index = objLength;
+
+               while (index--) {
+                 var key = objProps[index];
+
+                 if (!(isPartial ? key in other : hasOwnProperty.call(other, key))) {
+                   return false;
+                 }
+               } // Check that cyclic values are equal.
+
+
+               var objStacked = stack.get(object);
+               var othStacked = stack.get(other);
+
+               if (objStacked && othStacked) {
+                 return objStacked == other && othStacked == object;
+               }
+
+               var result = true;
+               stack.set(object, other);
+               stack.set(other, object);
+               var skipCtor = isPartial;
+
+               while (++index < objLength) {
+                 key = objProps[index];
+                 var objValue = object[key],
+                     othValue = other[key];
+
+                 if (customizer) {
+                   var compared = isPartial ? customizer(othValue, objValue, key, other, object, stack) : customizer(objValue, othValue, key, object, other, stack);
+                 } // Recursively compare objects (susceptible to call stack limits).
+
+
+                 if (!(compared === undefined$1 ? objValue === othValue || equalFunc(objValue, othValue, bitmask, customizer, stack) : compared)) {
+                   result = false;
+                   break;
+                 }
+
+                 skipCtor || (skipCtor = key == 'constructor');
+               }
+
+               if (result && !skipCtor) {
+                 var objCtor = object.constructor,
+                     othCtor = other.constructor; // Non `Object` object instances with different constructors are not equal.
+
+                 if (objCtor != othCtor && 'constructor' in object && 'constructor' in other && !(typeof objCtor == 'function' && objCtor instanceof objCtor && typeof othCtor == 'function' && othCtor instanceof othCtor)) {
+                   result = false;
+                 }
+               }
+
+               stack['delete'](object);
+               stack['delete'](other);
+               return result;
+             }
+             /**
+              * A specialized version of `baseRest` which flattens the rest array.
+              *
+              * @private
+              * @param {Function} func The function to apply a rest parameter to.
+              * @returns {Function} Returns the new function.
+              */
+
+
+             function flatRest(func) {
+               return setToString(overRest(func, undefined$1, flatten), func + '');
+             }
+             /**
+              * Creates an array of own enumerable property names and symbols of `object`.
+              *
+              * @private
+              * @param {Object} object The object to query.
+              * @returns {Array} Returns the array of property names and symbols.
+              */
+
+
+             function getAllKeys(object) {
+               return baseGetAllKeys(object, keys, getSymbols);
+             }
+             /**
+              * Creates an array of own and inherited enumerable property names and
+              * symbols of `object`.
+              *
+              * @private
+              * @param {Object} object The object to query.
+              * @returns {Array} Returns the array of property names and symbols.
+              */
+
+
+             function getAllKeysIn(object) {
+               return baseGetAllKeys(object, keysIn, getSymbolsIn);
+             }
+             /**
+              * Gets metadata for `func`.
+              *
+              * @private
+              * @param {Function} func The function to query.
+              * @returns {*} Returns the metadata for `func`.
+              */
+
+
+             var getData = !metaMap ? noop : function (func) {
+               return metaMap.get(func);
+             };
+             /**
+              * Gets the name of `func`.
+              *
+              * @private
+              * @param {Function} func The function to query.
+              * @returns {string} Returns the function name.
+              */
+
+             function getFuncName(func) {
+               var result = func.name + '',
+                   array = realNames[result],
+                   length = hasOwnProperty.call(realNames, result) ? array.length : 0;
+
+               while (length--) {
+                 var data = array[length],
+                     otherFunc = data.func;
+
+                 if (otherFunc == null || otherFunc == func) {
+                   return data.name;
+                 }
+               }
+
+               return result;
+             }
+             /**
+              * Gets the argument placeholder value for `func`.
+              *
+              * @private
+              * @param {Function} func The function to inspect.
+              * @returns {*} Returns the placeholder value.
+              */
+
+
+             function getHolder(func) {
+               var object = hasOwnProperty.call(lodash, 'placeholder') ? lodash : func;
+               return object.placeholder;
+             }
+             /**
+              * Gets the appropriate "iteratee" function. If `_.iteratee` is customized,
+              * this function returns the custom method, otherwise it returns `baseIteratee`.
+              * If arguments are provided, the chosen function is invoked with them and
+              * its result is returned.
+              *
+              * @private
+              * @param {*} [value] The value to convert to an iteratee.
+              * @param {number} [arity] The arity of the created iteratee.
+              * @returns {Function} Returns the chosen function or its result.
+              */
+
+
+             function getIteratee() {
+               var result = lodash.iteratee || iteratee;
+               result = result === iteratee ? baseIteratee : result;
+               return arguments.length ? result(arguments[0], arguments[1]) : result;
+             }
+             /**
+              * Gets the data for `map`.
+              *
+              * @private
+              * @param {Object} map The map to query.
+              * @param {string} key The reference key.
+              * @returns {*} Returns the map data.
+              */
+
+
+             function getMapData(map, key) {
+               var data = map.__data__;
+               return isKeyable(key) ? data[typeof key == 'string' ? 'string' : 'hash'] : data.map;
+             }
+             /**
+              * Gets the property names, values, and compare flags of `object`.
+              *
+              * @private
+              * @param {Object} object The object to query.
+              * @returns {Array} Returns the match data of `object`.
+              */
+
+
+             function getMatchData(object) {
+               var result = keys(object),
+                   length = result.length;
+
+               while (length--) {
+                 var key = result[length],
+                     value = object[key];
+                 result[length] = [key, value, isStrictComparable(value)];
+               }
+
+               return result;
+             }
+             /**
+              * Gets the native function at `key` of `object`.
+              *
+              * @private
+              * @param {Object} object The object to query.
+              * @param {string} key The key of the method to get.
+              * @returns {*} Returns the function if it's native, else `undefined`.
+              */
+
+
+             function getNative(object, key) {
+               var value = getValue(object, key);
+               return baseIsNative(value) ? value : undefined$1;
+             }
+             /**
+              * A specialized version of `baseGetTag` which ignores `Symbol.toStringTag` values.
+              *
+              * @private
+              * @param {*} value The value to query.
+              * @returns {string} Returns the raw `toStringTag`.
+              */
+
+
+             function getRawTag(value) {
+               var isOwn = hasOwnProperty.call(value, symToStringTag),
+                   tag = value[symToStringTag];
+
+               try {
+                 value[symToStringTag] = undefined$1;
+                 var unmasked = true;
+               } catch (e) {}
+
+               var result = nativeObjectToString.call(value);
+
+               if (unmasked) {
+                 if (isOwn) {
+                   value[symToStringTag] = tag;
+                 } else {
+                   delete value[symToStringTag];
+                 }
+               }
+
+               return result;
+             }
+             /**
+              * Creates an array of the own enumerable symbols of `object`.
+              *
+              * @private
+              * @param {Object} object The object to query.
+              * @returns {Array} Returns the array of symbols.
+              */
+
+
+             var getSymbols = !nativeGetSymbols ? stubArray : function (object) {
+               if (object == null) {
+                 return [];
+               }
+
+               object = Object(object);
+               return arrayFilter(nativeGetSymbols(object), function (symbol) {
+                 return propertyIsEnumerable.call(object, symbol);
+               });
+             };
+             /**
+              * Creates an array of the own and inherited enumerable symbols of `object`.
+              *
+              * @private
+              * @param {Object} object The object to query.
+              * @returns {Array} Returns the array of symbols.
+              */
+
+             var getSymbolsIn = !nativeGetSymbols ? stubArray : function (object) {
+               var result = [];
+
+               while (object) {
+                 arrayPush(result, getSymbols(object));
+                 object = getPrototype(object);
+               }
+
+               return result;
+             };
+             /**
+              * Gets the `toStringTag` of `value`.
+              *
+              * @private
+              * @param {*} value The value to query.
+              * @returns {string} Returns the `toStringTag`.
+              */
+
+             var getTag = baseGetTag; // Fallback for data views, maps, sets, and weak maps in IE 11 and promises in Node.js < 6.
+
+             if (DataView && getTag(new DataView(new ArrayBuffer(1))) != dataViewTag || Map && getTag(new Map()) != mapTag || Promise && getTag(Promise.resolve()) != promiseTag || Set && getTag(new Set()) != setTag || WeakMap && getTag(new WeakMap()) != weakMapTag) {
+               getTag = function getTag(value) {
+                 var result = baseGetTag(value),
+                     Ctor = result == objectTag ? value.constructor : undefined$1,
+                     ctorString = Ctor ? toSource(Ctor) : '';
+
+                 if (ctorString) {
+                   switch (ctorString) {
+                     case dataViewCtorString:
+                       return dataViewTag;
+
+                     case mapCtorString:
+                       return mapTag;
+
+                     case promiseCtorString:
+                       return promiseTag;
+
+                     case setCtorString:
+                       return setTag;
+
+                     case weakMapCtorString:
+                       return weakMapTag;
+                   }
+                 }
+
+                 return result;
+               };
+             }
+             /**
+              * Gets the view, applying any `transforms` to the `start` and `end` positions.
+              *
+              * @private
+              * @param {number} start The start of the view.
+              * @param {number} end The end of the view.
+              * @param {Array} transforms The transformations to apply to the view.
+              * @returns {Object} Returns an object containing the `start` and `end`
+              *  positions of the view.
+              */
+
+
+             function getView(start, end, transforms) {
+               var index = -1,
+                   length = transforms.length;
+
+               while (++index < length) {
+                 var data = transforms[index],
+                     size = data.size;
+
+                 switch (data.type) {
+                   case 'drop':
+                     start += size;
+                     break;
+
+                   case 'dropRight':
+                     end -= size;
+                     break;
+
+                   case 'take':
+                     end = nativeMin(end, start + size);
+                     break;
+
+                   case 'takeRight':
+                     start = nativeMax(start, end - size);
+                     break;
+                 }
+               }
+
+               return {
+                 'start': start,
+                 'end': end
+               };
+             }
+             /**
+              * Extracts wrapper details from the `source` body comment.
+              *
+              * @private
+              * @param {string} source The source to inspect.
+              * @returns {Array} Returns the wrapper details.
+              */
+
+
+             function getWrapDetails(source) {
+               var match = source.match(reWrapDetails);
+               return match ? match[1].split(reSplitDetails) : [];
+             }
+             /**
+              * Checks if `path` exists on `object`.
+              *
+              * @private
+              * @param {Object} object The object to query.
+              * @param {Array|string} path The path to check.
+              * @param {Function} hasFunc The function to check properties.
+              * @returns {boolean} Returns `true` if `path` exists, else `false`.
+              */
+
+
+             function hasPath(object, path, hasFunc) {
+               path = castPath(path, object);
+               var index = -1,
+                   length = path.length,
+                   result = false;
+
+               while (++index < length) {
+                 var key = toKey(path[index]);
+
+                 if (!(result = object != null && hasFunc(object, key))) {
+                   break;
+                 }
+
+                 object = object[key];
+               }
+
+               if (result || ++index != length) {
+                 return result;
+               }
+
+               length = object == null ? 0 : object.length;
+               return !!length && isLength(length) && isIndex(key, length) && (isArray(object) || isArguments(object));
+             }
+             /**
+              * Initializes an array clone.
+              *
+              * @private
+              * @param {Array} array The array to clone.
+              * @returns {Array} Returns the initialized clone.
+              */
+
+
+             function initCloneArray(array) {
+               var length = array.length,
+                   result = new array.constructor(length); // Add properties assigned by `RegExp#exec`.
+
+               if (length && typeof array[0] == 'string' && hasOwnProperty.call(array, 'index')) {
+                 result.index = array.index;
+                 result.input = array.input;
+               }
+
+               return result;
+             }
+             /**
+              * Initializes an object clone.
+              *
+              * @private
+              * @param {Object} object The object to clone.
+              * @returns {Object} Returns the initialized clone.
+              */
+
+
+             function initCloneObject(object) {
+               return typeof object.constructor == 'function' && !isPrototype(object) ? baseCreate(getPrototype(object)) : {};
+             }
+             /**
+              * Initializes an object clone based on its `toStringTag`.
+              *
+              * **Note:** This function only supports cloning values with tags of
+              * `Boolean`, `Date`, `Error`, `Map`, `Number`, `RegExp`, `Set`, or `String`.
+              *
+              * @private
+              * @param {Object} object The object to clone.
+              * @param {string} tag The `toStringTag` of the object to clone.
+              * @param {boolean} [isDeep] Specify a deep clone.
+              * @returns {Object} Returns the initialized clone.
+              */
+
+
+             function initCloneByTag(object, tag, isDeep) {
+               var Ctor = object.constructor;
+
+               switch (tag) {
+                 case arrayBufferTag:
+                   return cloneArrayBuffer(object);
+
+                 case boolTag:
+                 case dateTag:
+                   return new Ctor(+object);
+
+                 case dataViewTag:
+                   return cloneDataView(object, isDeep);
+
+                 case float32Tag:
+                 case float64Tag:
+                 case int8Tag:
+                 case int16Tag:
+                 case int32Tag:
+                 case uint8Tag:
+                 case uint8ClampedTag:
+                 case uint16Tag:
+                 case uint32Tag:
+                   return cloneTypedArray(object, isDeep);
+
+                 case mapTag:
+                   return new Ctor();
+
+                 case numberTag:
+                 case stringTag:
+                   return new Ctor(object);
+
+                 case regexpTag:
+                   return cloneRegExp(object);
+
+                 case setTag:
+                   return new Ctor();
+
+                 case symbolTag:
+                   return cloneSymbol(object);
+               }
+             }
+             /**
+              * Inserts wrapper `details` in a comment at the top of the `source` body.
+              *
+              * @private
+              * @param {string} source The source to modify.
+              * @returns {Array} details The details to insert.
+              * @returns {string} Returns the modified source.
+              */
+
+
+             function insertWrapDetails(source, details) {
+               var length = details.length;
+
+               if (!length) {
+                 return source;
+               }
+
+               var lastIndex = length - 1;
+               details[lastIndex] = (length > 1 ? '& ' : '') + details[lastIndex];
+               details = details.join(length > 2 ? ', ' : ' ');
+               return source.replace(reWrapComment, '{\n/* [wrapped with ' + details + '] */\n');
+             }
+             /**
+              * Checks if `value` is a flattenable `arguments` object or array.
+              *
+              * @private
+              * @param {*} value The value to check.
+              * @returns {boolean} Returns `true` if `value` is flattenable, else `false`.
+              */
+
+
+             function isFlattenable(value) {
+               return isArray(value) || isArguments(value) || !!(spreadableSymbol && value && value[spreadableSymbol]);
+             }
+             /**
+              * Checks if `value` is a valid array-like index.
+              *
+              * @private
+              * @param {*} value The value to check.
+              * @param {number} [length=MAX_SAFE_INTEGER] The upper bounds of a valid index.
+              * @returns {boolean} Returns `true` if `value` is a valid index, else `false`.
+              */
+
+
+             function isIndex(value, length) {
+               var type = _typeof(value);
+
+               length = length == null ? MAX_SAFE_INTEGER : length;
+               return !!length && (type == 'number' || type != 'symbol' && reIsUint.test(value)) && value > -1 && value % 1 == 0 && value < length;
+             }
+             /**
+              * Checks if the given arguments are from an iteratee call.
+              *
+              * @private
+              * @param {*} value The potential iteratee value argument.
+              * @param {*} index The potential iteratee index or key argument.
+              * @param {*} object The potential iteratee object argument.
+              * @returns {boolean} Returns `true` if the arguments are from an iteratee call,
+              *  else `false`.
+              */
+
+
+             function isIterateeCall(value, index, object) {
+               if (!isObject(object)) {
+                 return false;
+               }
+
+               var type = _typeof(index);
+
+               if (type == 'number' ? isArrayLike(object) && isIndex(index, object.length) : type == 'string' && index in object) {
+                 return eq(object[index], value);
+               }
+
+               return false;
+             }
+             /**
+              * Checks if `value` is a property name and not a property path.
+              *
+              * @private
+              * @param {*} value The value to check.
+              * @param {Object} [object] The object to query keys on.
+              * @returns {boolean} Returns `true` if `value` is a property name, else `false`.
+              */
+
+
+             function isKey(value, object) {
+               if (isArray(value)) {
+                 return false;
+               }
+
+               var type = _typeof(value);
+
+               if (type == 'number' || type == 'symbol' || type == 'boolean' || value == null || isSymbol(value)) {
+                 return true;
+               }
+
+               return reIsPlainProp.test(value) || !reIsDeepProp.test(value) || object != null && value in Object(object);
+             }
+             /**
+              * Checks if `value` is suitable for use as unique object key.
+              *
+              * @private
+              * @param {*} value The value to check.
+              * @returns {boolean} Returns `true` if `value` is suitable, else `false`.
+              */
+
+
+             function isKeyable(value) {
+               var type = _typeof(value);
+
+               return type == 'string' || type == 'number' || type == 'symbol' || type == 'boolean' ? value !== '__proto__' : value === null;
+             }
+             /**
+              * Checks if `func` has a lazy counterpart.
+              *
+              * @private
+              * @param {Function} func The function to check.
+              * @returns {boolean} Returns `true` if `func` has a lazy counterpart,
+              *  else `false`.
+              */
+
+
+             function isLaziable(func) {
+               var funcName = getFuncName(func),
+                   other = lodash[funcName];
+
+               if (typeof other != 'function' || !(funcName in LazyWrapper.prototype)) {
+                 return false;
+               }
+
+               if (func === other) {
+                 return true;
+               }
+
+               var data = getData(other);
+               return !!data && func === data[0];
+             }
+             /**
+              * Checks if `func` has its source masked.
+              *
+              * @private
+              * @param {Function} func The function to check.
+              * @returns {boolean} Returns `true` if `func` is masked, else `false`.
+              */
+
+
+             function isMasked(func) {
+               return !!maskSrcKey && maskSrcKey in func;
+             }
+             /**
+              * Checks if `func` is capable of being masked.
+              *
+              * @private
+              * @param {*} value The value to check.
+              * @returns {boolean} Returns `true` if `func` is maskable, else `false`.
+              */
+
+
+             var isMaskable = coreJsData ? isFunction : stubFalse;
+             /**
+              * Checks if `value` is likely a prototype object.
+              *
+              * @private
+              * @param {*} value The value to check.
+              * @returns {boolean} Returns `true` if `value` is a prototype, else `false`.
+              */
+
+             function isPrototype(value) {
+               var Ctor = value && value.constructor,
+                   proto = typeof Ctor == 'function' && Ctor.prototype || objectProto;
+               return value === proto;
+             }
+             /**
+              * Checks if `value` is suitable for strict equality comparisons, i.e. `===`.
+              *
+              * @private
+              * @param {*} value The value to check.
+              * @returns {boolean} Returns `true` if `value` if suitable for strict
+              *  equality comparisons, else `false`.
+              */
+
+
+             function isStrictComparable(value) {
+               return value === value && !isObject(value);
+             }
+             /**
+              * A specialized version of `matchesProperty` for source values suitable
+              * for strict equality comparisons, i.e. `===`.
+              *
+              * @private
+              * @param {string} key The key of the property to get.
+              * @param {*} srcValue The value to match.
+              * @returns {Function} Returns the new spec function.
+              */
+
+
+             function matchesStrictComparable(key, srcValue) {
+               return function (object) {
+                 if (object == null) {
+                   return false;
+                 }
+
+                 return object[key] === srcValue && (srcValue !== undefined$1 || key in Object(object));
+               };
+             }
+             /**
+              * A specialized version of `_.memoize` which clears the memoized function's
+              * cache when it exceeds `MAX_MEMOIZE_SIZE`.
+              *
+              * @private
+              * @param {Function} func The function to have its output memoized.
+              * @returns {Function} Returns the new memoized function.
+              */
+
+
+             function memoizeCapped(func) {
+               var result = memoize(func, function (key) {
+                 if (cache.size === MAX_MEMOIZE_SIZE) {
+                   cache.clear();
+                 }
+
+                 return key;
+               });
+               var cache = result.cache;
+               return result;
+             }
+             /**
+              * Merges the function metadata of `source` into `data`.
+              *
+              * Merging metadata reduces the number of wrappers used to invoke a function.
+              * This is possible because methods like `_.bind`, `_.curry`, and `_.partial`
+              * may be applied regardless of execution order. Methods like `_.ary` and
+              * `_.rearg` modify function arguments, making the order in which they are
+              * executed important, preventing the merging of metadata. However, we make
+              * an exception for a safe combined case where curried functions have `_.ary`
+              * and or `_.rearg` applied.
+              *
+              * @private
+              * @param {Array} data The destination metadata.
+              * @param {Array} source The source metadata.
+              * @returns {Array} Returns `data`.
+              */
+
+
+             function mergeData(data, source) {
+               var bitmask = data[1],
+                   srcBitmask = source[1],
+                   newBitmask = bitmask | srcBitmask,
+                   isCommon = newBitmask < (WRAP_BIND_FLAG | WRAP_BIND_KEY_FLAG | WRAP_ARY_FLAG);
+               var isCombo = srcBitmask == WRAP_ARY_FLAG && bitmask == WRAP_CURRY_FLAG || srcBitmask == WRAP_ARY_FLAG && bitmask == WRAP_REARG_FLAG && data[7].length <= source[8] || srcBitmask == (WRAP_ARY_FLAG | WRAP_REARG_FLAG) && source[7].length <= source[8] && bitmask == WRAP_CURRY_FLAG; // Exit early if metadata can't be merged.
+
+               if (!(isCommon || isCombo)) {
+                 return data;
+               } // Use source `thisArg` if available.
+
+
+               if (srcBitmask & WRAP_BIND_FLAG) {
+                 data[2] = source[2]; // Set when currying a bound function.
+
+                 newBitmask |= bitmask & WRAP_BIND_FLAG ? 0 : WRAP_CURRY_BOUND_FLAG;
+               } // Compose partial arguments.
+
+
+               var value = source[3];
+
+               if (value) {
+                 var partials = data[3];
+                 data[3] = partials ? composeArgs(partials, value, source[4]) : value;
+                 data[4] = partials ? replaceHolders(data[3], PLACEHOLDER) : source[4];
+               } // Compose partial right arguments.
+
+
+               value = source[5];
+
+               if (value) {
+                 partials = data[5];
+                 data[5] = partials ? composeArgsRight(partials, value, source[6]) : value;
+                 data[6] = partials ? replaceHolders(data[5], PLACEHOLDER) : source[6];
+               } // Use source `argPos` if available.
+
+
+               value = source[7];
+
+               if (value) {
+                 data[7] = value;
+               } // Use source `ary` if it's smaller.
+
+
+               if (srcBitmask & WRAP_ARY_FLAG) {
+                 data[8] = data[8] == null ? source[8] : nativeMin(data[8], source[8]);
+               } // Use source `arity` if one is not provided.
+
+
+               if (data[9] == null) {
+                 data[9] = source[9];
+               } // Use source `func` and merge bitmasks.
+
+
+               data[0] = source[0];
+               data[1] = newBitmask;
+               return data;
+             }
+             /**
+              * This function is like
+              * [`Object.keys`](http://ecma-international.org/ecma-262/7.0/#sec-object.keys)
+              * except that it includes inherited enumerable properties.
+              *
+              * @private
+              * @param {Object} object The object to query.
+              * @returns {Array} Returns the array of property names.
+              */
+
+
+             function nativeKeysIn(object) {
+               var result = [];
+
+               if (object != null) {
+                 for (var key in Object(object)) {
+                   result.push(key);
+                 }
+               }
+
+               return result;
+             }
+             /**
+              * Converts `value` to a string using `Object.prototype.toString`.
+              *
+              * @private
+              * @param {*} value The value to convert.
+              * @returns {string} Returns the converted string.
+              */
+
+
+             function objectToString(value) {
+               return nativeObjectToString.call(value);
+             }
+             /**
+              * A specialized version of `baseRest` which transforms the rest array.
+              *
+              * @private
+              * @param {Function} func The function to apply a rest parameter to.
+              * @param {number} [start=func.length-1] The start position of the rest parameter.
+              * @param {Function} transform The rest array transform.
+              * @returns {Function} Returns the new function.
+              */
+
+
+             function overRest(func, start, transform) {
+               start = nativeMax(start === undefined$1 ? func.length - 1 : start, 0);
+               return function () {
+                 var args = arguments,
+                     index = -1,
+                     length = nativeMax(args.length - start, 0),
+                     array = Array(length);
+
+                 while (++index < length) {
+                   array[index] = args[start + index];
+                 }
+
+                 index = -1;
+                 var otherArgs = Array(start + 1);
+
+                 while (++index < start) {
+                   otherArgs[index] = args[index];
+                 }
+
+                 otherArgs[start] = transform(array);
+                 return apply(func, this, otherArgs);
+               };
+             }
+             /**
+              * Gets the parent value at `path` of `object`.
+              *
+              * @private
+              * @param {Object} object The object to query.
+              * @param {Array} path The path to get the parent value of.
+              * @returns {*} Returns the parent value.
+              */
+
+
+             function parent(object, path) {
+               return path.length < 2 ? object : baseGet(object, baseSlice(path, 0, -1));
+             }
+             /**
+              * Reorder `array` according to the specified indexes where the element at
+              * the first index is assigned as the first element, the element at
+              * the second index is assigned as the second element, and so on.
+              *
+              * @private
+              * @param {Array} array The array to reorder.
+              * @param {Array} indexes The arranged array indexes.
+              * @returns {Array} Returns `array`.
+              */
+
+
+             function reorder(array, indexes) {
+               var arrLength = array.length,
+                   length = nativeMin(indexes.length, arrLength),
+                   oldArray = copyArray(array);
+
+               while (length--) {
+                 var index = indexes[length];
+                 array[length] = isIndex(index, arrLength) ? oldArray[index] : undefined$1;
+               }
+
+               return array;
+             }
+             /**
+              * Gets the value at `key`, unless `key` is "__proto__" or "constructor".
+              *
+              * @private
+              * @param {Object} object The object to query.
+              * @param {string} key The key of the property to get.
+              * @returns {*} Returns the property value.
+              */
+
+
+             function safeGet(object, key) {
+               if (key === 'constructor' && typeof object[key] === 'function') {
+                 return;
+               }
+
+               if (key == '__proto__') {
+                 return;
+               }
+
+               return object[key];
+             }
+             /**
+              * Sets metadata for `func`.
+              *
+              * **Note:** If this function becomes hot, i.e. is invoked a lot in a short
+              * period of time, it will trip its breaker and transition to an identity
+              * function to avoid garbage collection pauses in V8. See
+              * [V8 issue 2070](https://bugs.chromium.org/p/v8/issues/detail?id=2070)
+              * for more details.
+              *
+              * @private
+              * @param {Function} func The function to associate metadata with.
+              * @param {*} data The metadata.
+              * @returns {Function} Returns `func`.
+              */
+
+
+             var setData = shortOut(baseSetData);
+             /**
+              * A simple wrapper around the global [`setTimeout`](https://mdn.io/setTimeout).
+              *
+              * @private
+              * @param {Function} func The function to delay.
+              * @param {number} wait The number of milliseconds to delay invocation.
+              * @returns {number|Object} Returns the timer id or timeout object.
+              */
+
+             var setTimeout = ctxSetTimeout || function (func, wait) {
+               return root.setTimeout(func, wait);
+             };
+             /**
+              * Sets the `toString` method of `func` to return `string`.
+              *
+              * @private
+              * @param {Function} func The function to modify.
+              * @param {Function} string The `toString` result.
+              * @returns {Function} Returns `func`.
+              */
+
+
+             var setToString = shortOut(baseSetToString);
+             /**
+              * Sets the `toString` method of `wrapper` to mimic the source of `reference`
+              * with wrapper details in a comment at the top of the source body.
+              *
+              * @private
+              * @param {Function} wrapper The function to modify.
+              * @param {Function} reference The reference function.
+              * @param {number} bitmask The bitmask flags. See `createWrap` for more details.
+              * @returns {Function} Returns `wrapper`.
+              */
+
+             function setWrapToString(wrapper, reference, bitmask) {
+               var source = reference + '';
+               return setToString(wrapper, insertWrapDetails(source, updateWrapDetails(getWrapDetails(source), bitmask)));
+             }
+             /**
+              * Creates a function that'll short out and invoke `identity` instead
+              * of `func` when it's called `HOT_COUNT` or more times in `HOT_SPAN`
+              * milliseconds.
+              *
+              * @private
+              * @param {Function} func The function to restrict.
+              * @returns {Function} Returns the new shortable function.
+              */
+
+
+             function shortOut(func) {
+               var count = 0,
+                   lastCalled = 0;
+               return function () {
+                 var stamp = nativeNow(),
+                     remaining = HOT_SPAN - (stamp - lastCalled);
+                 lastCalled = stamp;
+
+                 if (remaining > 0) {
+                   if (++count >= HOT_COUNT) {
+                     return arguments[0];
+                   }
+                 } else {
+                   count = 0;
+                 }
+
+                 return func.apply(undefined$1, arguments);
+               };
+             }
+             /**
+              * A specialized version of `_.shuffle` which mutates and sets the size of `array`.
+              *
+              * @private
+              * @param {Array} array The array to shuffle.
+              * @param {number} [size=array.length] The size of `array`.
+              * @returns {Array} Returns `array`.
+              */
+
+
+             function shuffleSelf(array, size) {
+               var index = -1,
+                   length = array.length,
+                   lastIndex = length - 1;
+               size = size === undefined$1 ? length : size;
+
+               while (++index < size) {
+                 var rand = baseRandom(index, lastIndex),
+                     value = array[rand];
+                 array[rand] = array[index];
+                 array[index] = value;
+               }
+
+               array.length = size;
+               return array;
+             }
+             /**
+              * Converts `string` to a property path array.
+              *
+              * @private
+              * @param {string} string The string to convert.
+              * @returns {Array} Returns the property path array.
+              */
+
+
+             var stringToPath = memoizeCapped(function (string) {
+               var result = [];
+
+               if (string.charCodeAt(0) === 46
+               /* . */
+               ) {
+                 result.push('');
+               }
+
+               string.replace(rePropName, function (match, number, quote, subString) {
+                 result.push(quote ? subString.replace(reEscapeChar, '$1') : number || match);
+               });
+               return result;
+             });
+             /**
+              * Converts `value` to a string key if it's not a string or symbol.
+              *
+              * @private
+              * @param {*} value The value to inspect.
+              * @returns {string|symbol} Returns the key.
+              */
+
+             function toKey(value) {
+               if (typeof value == 'string' || isSymbol(value)) {
+                 return value;
+               }
+
+               var result = value + '';
+               return result == '0' && 1 / value == -INFINITY ? '-0' : result;
+             }
+             /**
+              * Converts `func` to its source code.
+              *
+              * @private
+              * @param {Function} func The function to convert.
+              * @returns {string} Returns the source code.
+              */
+
+
+             function toSource(func) {
+               if (func != null) {
+                 try {
+                   return funcToString.call(func);
+                 } catch (e) {}
+
+                 try {
+                   return func + '';
+                 } catch (e) {}
+               }
+
+               return '';
+             }
+             /**
+              * Updates wrapper `details` based on `bitmask` flags.
+              *
+              * @private
+              * @returns {Array} details The details to modify.
+              * @param {number} bitmask The bitmask flags. See `createWrap` for more details.
+              * @returns {Array} Returns `details`.
+              */
+
+
+             function updateWrapDetails(details, bitmask) {
+               arrayEach(wrapFlags, function (pair) {
+                 var value = '_.' + pair[0];
+
+                 if (bitmask & pair[1] && !arrayIncludes(details, value)) {
+                   details.push(value);
+                 }
+               });
+               return details.sort();
+             }
+             /**
+              * Creates a clone of `wrapper`.
+              *
+              * @private
+              * @param {Object} wrapper The wrapper to clone.
+              * @returns {Object} Returns the cloned wrapper.
+              */
+
+
+             function wrapperClone(wrapper) {
+               if (wrapper instanceof LazyWrapper) {
+                 return wrapper.clone();
+               }
+
+               var result = new LodashWrapper(wrapper.__wrapped__, wrapper.__chain__);
+               result.__actions__ = copyArray(wrapper.__actions__);
+               result.__index__ = wrapper.__index__;
+               result.__values__ = wrapper.__values__;
+               return result;
+             }
+             /*------------------------------------------------------------------------*/
+
+             /**
+              * Creates an array of elements split into groups the length of `size`.
+              * If `array` can't be split evenly, the final chunk will be the remaining
+              * elements.
+              *
+              * @static
+              * @memberOf _
+              * @since 3.0.0
+              * @category Array
+              * @param {Array} array The array to process.
+              * @param {number} [size=1] The length of each chunk
+              * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.
+              * @returns {Array} Returns the new array of chunks.
+              * @example
+              *
+              * _.chunk(['a', 'b', 'c', 'd'], 2);
+              * // => [['a', 'b'], ['c', 'd']]
+              *
+              * _.chunk(['a', 'b', 'c', 'd'], 3);
+              * // => [['a', 'b', 'c'], ['d']]
+              */
+
+
+             function chunk(array, size, guard) {
+               if (guard ? isIterateeCall(array, size, guard) : size === undefined$1) {
+                 size = 1;
+               } else {
+                 size = nativeMax(toInteger(size), 0);
+               }
+
+               var length = array == null ? 0 : array.length;
+
+               if (!length || size < 1) {
+                 return [];
+               }
+
+               var index = 0,
+                   resIndex = 0,
+                   result = Array(nativeCeil(length / size));
+
+               while (index < length) {
+                 result[resIndex++] = baseSlice(array, index, index += size);
+               }
+
+               return result;
+             }
+             /**
+              * Creates an array with all falsey values removed. The values `false`, `null`,
+              * `0`, `""`, `undefined`, and `NaN` are falsey.
+              *
+              * @static
+              * @memberOf _
+              * @since 0.1.0
+              * @category Array
+              * @param {Array} array The array to compact.
+              * @returns {Array} Returns the new array of filtered values.
+              * @example
+              *
+              * _.compact([0, 1, false, 2, '', 3]);
+              * // => [1, 2, 3]
+              */
+
+
+             function compact(array) {
+               var index = -1,
+                   length = array == null ? 0 : array.length,
+                   resIndex = 0,
+                   result = [];
+
+               while (++index < length) {
+                 var value = array[index];
+
+                 if (value) {
+                   result[resIndex++] = value;
+                 }
+               }
+
+               return result;
+             }
+             /**
+              * Creates a new array concatenating `array` with any additional arrays
+              * and/or values.
+              *
+              * @static
+              * @memberOf _
+              * @since 4.0.0
+              * @category Array
+              * @param {Array} array The array to concatenate.
+              * @param {...*} [values] The values to concatenate.
+              * @returns {Array} Returns the new concatenated array.
+              * @example
+              *
+              * var array = [1];
+              * var other = _.concat(array, 2, [3], [[4]]);
+              *
+              * console.log(other);
+              * // => [1, 2, 3, [4]]
+              *
+              * console.log(array);
+              * // => [1]
+              */
+
+
+             function concat() {
+               var length = arguments.length;
+
+               if (!length) {
+                 return [];
+               }
+
+               var args = Array(length - 1),
+                   array = arguments[0],
+                   index = length;
+
+               while (index--) {
+                 args[index - 1] = arguments[index];
+               }
+
+               return arrayPush(isArray(array) ? copyArray(array) : [array], baseFlatten(args, 1));
+             }
+             /**
+              * Creates an array of `array` values not included in the other given arrays
+              * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)
+              * for equality comparisons. The order and references of result values are
+              * determined by the first array.
+              *
+              * **Note:** Unlike `_.pullAll`, this method returns a new array.
+              *
+              * @static
+              * @memberOf _
+              * @since 0.1.0
+              * @category Array
+              * @param {Array} array The array to inspect.
+              * @param {...Array} [values] The values to exclude.
+              * @returns {Array} Returns the new array of filtered values.
+              * @see _.without, _.xor
+              * @example
+              *
+              * _.difference([2, 1], [2, 3]);
+              * // => [1]
+              */
+
+
+             var difference = baseRest(function (array, values) {
+               return isArrayLikeObject(array) ? baseDifference(array, baseFlatten(values, 1, isArrayLikeObject, true)) : [];
+             });
+             /**
+              * This method is like `_.difference` except that it accepts `iteratee` which
+              * is invoked for each element of `array` and `values` to generate the criterion
+              * by which they're compared. The order and references of result values are
+              * determined by the first array. The iteratee is invoked with one argument:
+              * (value).
+              *
+              * **Note:** Unlike `_.pullAllBy`, this method returns a new array.
+              *
+              * @static
+              * @memberOf _
+              * @since 4.0.0
+              * @category Array
+              * @param {Array} array The array to inspect.
+              * @param {...Array} [values] The values to exclude.
+              * @param {Function} [iteratee=_.identity] The iteratee invoked per element.
+              * @returns {Array} Returns the new array of filtered values.
+              * @example
+              *
+              * _.differenceBy([2.1, 1.2], [2.3, 3.4], Math.floor);
+              * // => [1.2]
+              *
+              * // The `_.property` iteratee shorthand.
+              * _.differenceBy([{ 'x': 2 }, { 'x': 1 }], [{ 'x': 1 }], 'x');
+              * // => [{ 'x': 2 }]
+              */
+
+             var differenceBy = baseRest(function (array, values) {
+               var iteratee = last(values);
+
+               if (isArrayLikeObject(iteratee)) {
+                 iteratee = undefined$1;
+               }
+
+               return isArrayLikeObject(array) ? baseDifference(array, baseFlatten(values, 1, isArrayLikeObject, true), getIteratee(iteratee, 2)) : [];
+             });
+             /**
+              * This method is like `_.difference` except that it accepts `comparator`
+              * which is invoked to compare elements of `array` to `values`. The order and
+              * references of result values are determined by the first array. The comparator
+              * is invoked with two arguments: (arrVal, othVal).
+              *
+              * **Note:** Unlike `_.pullAllWith`, this method returns a new array.
+              *
+              * @static
+              * @memberOf _
+              * @since 4.0.0
+              * @category Array
+              * @param {Array} array The array to inspect.
+              * @param {...Array} [values] The values to exclude.
+              * @param {Function} [comparator] The comparator invoked per element.
+              * @returns {Array} Returns the new array of filtered values.
+              * @example
+              *
+              * var objects = [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }];
+              *
+              * _.differenceWith(objects, [{ 'x': 1, 'y': 2 }], _.isEqual);
+              * // => [{ 'x': 2, 'y': 1 }]
+              */
+
+             var differenceWith = baseRest(function (array, values) {
+               var comparator = last(values);
+
+               if (isArrayLikeObject(comparator)) {
+                 comparator = undefined$1;
+               }
+
+               return isArrayLikeObject(array) ? baseDifference(array, baseFlatten(values, 1, isArrayLikeObject, true), undefined$1, comparator) : [];
+             });
+             /**
+              * Creates a slice of `array` with `n` elements dropped from the beginning.
+              *
+              * @static
+              * @memberOf _
+              * @since 0.5.0
+              * @category Array
+              * @param {Array} array The array to query.
+              * @param {number} [n=1] The number of elements to drop.
+              * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.
+              * @returns {Array} Returns the slice of `array`.
+              * @example
+              *
+              * _.drop([1, 2, 3]);
+              * // => [2, 3]
+              *
+              * _.drop([1, 2, 3], 2);
+              * // => [3]
+              *
+              * _.drop([1, 2, 3], 5);
+              * // => []
+              *
+              * _.drop([1, 2, 3], 0);
+              * // => [1, 2, 3]
+              */
+
+             function drop(array, n, guard) {
+               var length = array == null ? 0 : array.length;
+
+               if (!length) {
+                 return [];
+               }
+
+               n = guard || n === undefined$1 ? 1 : toInteger(n);
+               return baseSlice(array, n < 0 ? 0 : n, length);
+             }
+             /**
+              * Creates a slice of `array` with `n` elements dropped from the end.
+              *
+              * @static
+              * @memberOf _
+              * @since 3.0.0
+              * @category Array
+              * @param {Array} array The array to query.
+              * @param {number} [n=1] The number of elements to drop.
+              * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.
+              * @returns {Array} Returns the slice of `array`.
+              * @example
+              *
+              * _.dropRight([1, 2, 3]);
+              * // => [1, 2]
+              *
+              * _.dropRight([1, 2, 3], 2);
+              * // => [1]
+              *
+              * _.dropRight([1, 2, 3], 5);
+              * // => []
+              *
+              * _.dropRight([1, 2, 3], 0);
+              * // => [1, 2, 3]
+              */
+
+
+             function dropRight(array, n, guard) {
+               var length = array == null ? 0 : array.length;
+
+               if (!length) {
+                 return [];
+               }
+
+               n = guard || n === undefined$1 ? 1 : toInteger(n);
+               n = length - n;
+               return baseSlice(array, 0, n < 0 ? 0 : n);
+             }
+             /**
+              * Creates a slice of `array` excluding elements dropped from the end.
+              * Elements are dropped until `predicate` returns falsey. The predicate is
+              * invoked with three arguments: (value, index, array).
+              *
+              * @static
+              * @memberOf _
+              * @since 3.0.0
+              * @category Array
+              * @param {Array} array The array to query.
+              * @param {Function} [predicate=_.identity] The function invoked per iteration.
+              * @returns {Array} Returns the slice of `array`.
+              * @example
+              *
+              * var users = [
+              *   { 'user': 'barney',  'active': true },
+              *   { 'user': 'fred',    'active': false },
+              *   { 'user': 'pebbles', 'active': false }
+              * ];
+              *
+              * _.dropRightWhile(users, function(o) { return !o.active; });
+              * // => objects for ['barney']
+              *
+              * // The `_.matches` iteratee shorthand.
+              * _.dropRightWhile(users, { 'user': 'pebbles', 'active': false });
+              * // => objects for ['barney', 'fred']
+              *
+              * // The `_.matchesProperty` iteratee shorthand.
+              * _.dropRightWhile(users, ['active', false]);
+              * // => objects for ['barney']
+              *
+              * // The `_.property` iteratee shorthand.
+              * _.dropRightWhile(users, 'active');
+              * // => objects for ['barney', 'fred', 'pebbles']
+              */
+
+
+             function dropRightWhile(array, predicate) {
+               return array && array.length ? baseWhile(array, getIteratee(predicate, 3), true, true) : [];
+             }
+             /**
+              * Creates a slice of `array` excluding elements dropped from the beginning.
+              * Elements are dropped until `predicate` returns falsey. The predicate is
+              * invoked with three arguments: (value, index, array).
+              *
+              * @static
+              * @memberOf _
+              * @since 3.0.0
+              * @category Array
+              * @param {Array} array The array to query.
+              * @param {Function} [predicate=_.identity] The function invoked per iteration.
+              * @returns {Array} Returns the slice of `array`.
+              * @example
+              *
+              * var users = [
+              *   { 'user': 'barney',  'active': false },
+              *   { 'user': 'fred',    'active': false },
+              *   { 'user': 'pebbles', 'active': true }
+              * ];
+              *
+              * _.dropWhile(users, function(o) { return !o.active; });
+              * // => objects for ['pebbles']
+              *
+              * // The `_.matches` iteratee shorthand.
+              * _.dropWhile(users, { 'user': 'barney', 'active': false });
+              * // => objects for ['fred', 'pebbles']
+              *
+              * // The `_.matchesProperty` iteratee shorthand.
+              * _.dropWhile(users, ['active', false]);
+              * // => objects for ['pebbles']
+              *
+              * // The `_.property` iteratee shorthand.
+              * _.dropWhile(users, 'active');
+              * // => objects for ['barney', 'fred', 'pebbles']
+              */
+
+
+             function dropWhile(array, predicate) {
+               return array && array.length ? baseWhile(array, getIteratee(predicate, 3), true) : [];
+             }
+             /**
+              * Fills elements of `array` with `value` from `start` up to, but not
+              * including, `end`.
+              *
+              * **Note:** This method mutates `array`.
+              *
+              * @static
+              * @memberOf _
+              * @since 3.2.0
+              * @category Array
+              * @param {Array} array The array to fill.
+              * @param {*} value The value to fill `array` with.
+              * @param {number} [start=0] The start position.
+              * @param {number} [end=array.length] The end position.
+              * @returns {Array} Returns `array`.
+              * @example
+              *
+              * var array = [1, 2, 3];
+              *
+              * _.fill(array, 'a');
+              * console.log(array);
+              * // => ['a', 'a', 'a']
+              *
+              * _.fill(Array(3), 2);
+              * // => [2, 2, 2]
+              *
+              * _.fill([4, 6, 8, 10], '*', 1, 3);
+              * // => [4, '*', '*', 10]
+              */
+
+
+             function fill(array, value, start, end) {
+               var length = array == null ? 0 : array.length;
+
+               if (!length) {
+                 return [];
+               }
+
+               if (start && typeof start != 'number' && isIterateeCall(array, value, start)) {
+                 start = 0;
+                 end = length;
+               }
+
+               return baseFill(array, value, start, end);
+             }
+             /**
+              * This method is like `_.find` except that it returns the index of the first
+              * element `predicate` returns truthy for instead of the element itself.
+              *
+              * @static
+              * @memberOf _
+              * @since 1.1.0
+              * @category Array
+              * @param {Array} array The array to inspect.
+              * @param {Function} [predicate=_.identity] The function invoked per iteration.
+              * @param {number} [fromIndex=0] The index to search from.
+              * @returns {number} Returns the index of the found element, else `-1`.
+              * @example
+              *
+              * var users = [
+              *   { 'user': 'barney',  'active': false },
+              *   { 'user': 'fred',    'active': false },
+              *   { 'user': 'pebbles', 'active': true }
+              * ];
+              *
+              * _.findIndex(users, function(o) { return o.user == 'barney'; });
+              * // => 0
+              *
+              * // The `_.matches` iteratee shorthand.
+              * _.findIndex(users, { 'user': 'fred', 'active': false });
+              * // => 1
+              *
+              * // The `_.matchesProperty` iteratee shorthand.
+              * _.findIndex(users, ['active', false]);
+              * // => 0
+              *
+              * // The `_.property` iteratee shorthand.
+              * _.findIndex(users, 'active');
+              * // => 2
+              */
+
+
+             function findIndex(array, predicate, fromIndex) {
+               var length = array == null ? 0 : array.length;
+
+               if (!length) {
+                 return -1;
+               }
+
+               var index = fromIndex == null ? 0 : toInteger(fromIndex);
+
+               if (index < 0) {
+                 index = nativeMax(length + index, 0);
+               }
+
+               return baseFindIndex(array, getIteratee(predicate, 3), index);
+             }
+             /**
+              * This method is like `_.findIndex` except that it iterates over elements
+              * of `collection` from right to left.
+              *
+              * @static
+              * @memberOf _
+              * @since 2.0.0
+              * @category Array
+              * @param {Array} array The array to inspect.
+              * @param {Function} [predicate=_.identity] The function invoked per iteration.
+              * @param {number} [fromIndex=array.length-1] The index to search from.
+              * @returns {number} Returns the index of the found element, else `-1`.
+              * @example
+              *
+              * var users = [
+              *   { 'user': 'barney',  'active': true },
+              *   { 'user': 'fred',    'active': false },
+              *   { 'user': 'pebbles', 'active': false }
+              * ];
+              *
+              * _.findLastIndex(users, function(o) { return o.user == 'pebbles'; });
+              * // => 2
+              *
+              * // The `_.matches` iteratee shorthand.
+              * _.findLastIndex(users, { 'user': 'barney', 'active': true });
+              * // => 0
+              *
+              * // The `_.matchesProperty` iteratee shorthand.
+              * _.findLastIndex(users, ['active', false]);
+              * // => 2
+              *
+              * // The `_.property` iteratee shorthand.
+              * _.findLastIndex(users, 'active');
+              * // => 0
+              */
+
+
+             function findLastIndex(array, predicate, fromIndex) {
+               var length = array == null ? 0 : array.length;
+
+               if (!length) {
+                 return -1;
+               }
+
+               var index = length - 1;
+
+               if (fromIndex !== undefined$1) {
+                 index = toInteger(fromIndex);
+                 index = fromIndex < 0 ? nativeMax(length + index, 0) : nativeMin(index, length - 1);
+               }
+
+               return baseFindIndex(array, getIteratee(predicate, 3), index, true);
+             }
+             /**
+              * Flattens `array` a single level deep.
+              *
+              * @static
+              * @memberOf _
+              * @since 0.1.0
+              * @category Array
+              * @param {Array} array The array to flatten.
+              * @returns {Array} Returns the new flattened array.
+              * @example
+              *
+              * _.flatten([1, [2, [3, [4]], 5]]);
+              * // => [1, 2, [3, [4]], 5]
+              */
+
+
+             function flatten(array) {
+               var length = array == null ? 0 : array.length;
+               return length ? baseFlatten(array, 1) : [];
+             }
+             /**
+              * Recursively flattens `array`.
+              *
+              * @static
+              * @memberOf _
+              * @since 3.0.0
+              * @category Array
+              * @param {Array} array The array to flatten.
+              * @returns {Array} Returns the new flattened array.
+              * @example
+              *
+              * _.flattenDeep([1, [2, [3, [4]], 5]]);
+              * // => [1, 2, 3, 4, 5]
+              */
+
+
+             function flattenDeep(array) {
+               var length = array == null ? 0 : array.length;
+               return length ? baseFlatten(array, INFINITY) : [];
+             }
+             /**
+              * Recursively flatten `array` up to `depth` times.
+              *
+              * @static
+              * @memberOf _
+              * @since 4.4.0
+              * @category Array
+              * @param {Array} array The array to flatten.
+              * @param {number} [depth=1] The maximum recursion depth.
+              * @returns {Array} Returns the new flattened array.
+              * @example
+              *
+              * var array = [1, [2, [3, [4]], 5]];
+              *
+              * _.flattenDepth(array, 1);
+              * // => [1, 2, [3, [4]], 5]
+              *
+              * _.flattenDepth(array, 2);
+              * // => [1, 2, 3, [4], 5]
+              */
+
+
+             function flattenDepth(array, depth) {
+               var length = array == null ? 0 : array.length;
+
+               if (!length) {
+                 return [];
+               }
+
+               depth = depth === undefined$1 ? 1 : toInteger(depth);
+               return baseFlatten(array, depth);
+             }
+             /**
+              * The inverse of `_.toPairs`; this method returns an object composed
+              * from key-value `pairs`.
+              *
+              * @static
+              * @memberOf _
+              * @since 4.0.0
+              * @category Array
+              * @param {Array} pairs The key-value pairs.
+              * @returns {Object} Returns the new object.
+              * @example
+              *
+              * _.fromPairs([['a', 1], ['b', 2]]);
+              * // => { 'a': 1, 'b': 2 }
+              */
+
+
+             function fromPairs(pairs) {
+               var index = -1,
+                   length = pairs == null ? 0 : pairs.length,
+                   result = {};
+
+               while (++index < length) {
+                 var pair = pairs[index];
+                 result[pair[0]] = pair[1];
+               }
+
+               return result;
+             }
+             /**
+              * Gets the first element of `array`.
+              *
+              * @static
+              * @memberOf _
+              * @since 0.1.0
+              * @alias first
+              * @category Array
+              * @param {Array} array The array to query.
+              * @returns {*} Returns the first element of `array`.
+              * @example
+              *
+              * _.head([1, 2, 3]);
+              * // => 1
+              *
+              * _.head([]);
+              * // => undefined
+              */
+
+
+             function head(array) {
+               return array && array.length ? array[0] : undefined$1;
+             }
+             /**
+              * Gets the index at which the first occurrence of `value` is found in `array`
+              * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)
+              * for equality comparisons. If `fromIndex` is negative, it's used as the
+              * offset from the end of `array`.
+              *
+              * @static
+              * @memberOf _
+              * @since 0.1.0
+              * @category Array
+              * @param {Array} array The array to inspect.
+              * @param {*} value The value to search for.
+              * @param {number} [fromIndex=0] The index to search from.
+              * @returns {number} Returns the index of the matched value, else `-1`.
+              * @example
+              *
+              * _.indexOf([1, 2, 1, 2], 2);
+              * // => 1
+              *
+              * // Search from the `fromIndex`.
+              * _.indexOf([1, 2, 1, 2], 2, 2);
+              * // => 3
+              */
+
+
+             function indexOf(array, value, fromIndex) {
+               var length = array == null ? 0 : array.length;
+
+               if (!length) {
+                 return -1;
+               }
+
+               var index = fromIndex == null ? 0 : toInteger(fromIndex);
+
+               if (index < 0) {
+                 index = nativeMax(length + index, 0);
+               }
+
+               return baseIndexOf(array, value, index);
+             }
+             /**
+              * Gets all but the last element of `array`.
+              *
+              * @static
+              * @memberOf _
+              * @since 0.1.0
+              * @category Array
+              * @param {Array} array The array to query.
+              * @returns {Array} Returns the slice of `array`.
+              * @example
+              *
+              * _.initial([1, 2, 3]);
+              * // => [1, 2]
+              */
+
+
+             function initial(array) {
+               var length = array == null ? 0 : array.length;
+               return length ? baseSlice(array, 0, -1) : [];
+             }
+             /**
+              * Creates an array of unique values that are included in all given arrays
+              * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)
+              * for equality comparisons. The order and references of result values are
+              * determined by the first array.
+              *
+              * @static
+              * @memberOf _
+              * @since 0.1.0
+              * @category Array
+              * @param {...Array} [arrays] The arrays to inspect.
+              * @returns {Array} Returns the new array of intersecting values.
+              * @example
+              *
+              * _.intersection([2, 1], [2, 3]);
+              * // => [2]
+              */
+
+
+             var intersection = baseRest(function (arrays) {
+               var mapped = arrayMap(arrays, castArrayLikeObject);
+               return mapped.length && mapped[0] === arrays[0] ? baseIntersection(mapped) : [];
+             });
+             /**
+              * This method is like `_.intersection` except that it accepts `iteratee`
+              * which is invoked for each element of each `arrays` to generate the criterion
+              * by which they're compared. The order and references of result values are
+              * determined by the first array. The iteratee is invoked with one argument:
+              * (value).
+              *
+              * @static
+              * @memberOf _
+              * @since 4.0.0
+              * @category Array
+              * @param {...Array} [arrays] The arrays to inspect.
+              * @param {Function} [iteratee=_.identity] The iteratee invoked per element.
+              * @returns {Array} Returns the new array of intersecting values.
+              * @example
+              *
+              * _.intersectionBy([2.1, 1.2], [2.3, 3.4], Math.floor);
+              * // => [2.1]
+              *
+              * // The `_.property` iteratee shorthand.
+              * _.intersectionBy([{ 'x': 1 }], [{ 'x': 2 }, { 'x': 1 }], 'x');
+              * // => [{ 'x': 1 }]
+              */
+
+             var intersectionBy = baseRest(function (arrays) {
+               var iteratee = last(arrays),
+                   mapped = arrayMap(arrays, castArrayLikeObject);
+
+               if (iteratee === last(mapped)) {
+                 iteratee = undefined$1;
+               } else {
+                 mapped.pop();
+               }
+
+               return mapped.length && mapped[0] === arrays[0] ? baseIntersection(mapped, getIteratee(iteratee, 2)) : [];
+             });
+             /**
+              * This method is like `_.intersection` except that it accepts `comparator`
+              * which is invoked to compare elements of `arrays`. The order and references
+              * of result values are determined by the first array. The comparator is
+              * invoked with two arguments: (arrVal, othVal).
+              *
+              * @static
+              * @memberOf _
+              * @since 4.0.0
+              * @category Array
+              * @param {...Array} [arrays] The arrays to inspect.
+              * @param {Function} [comparator] The comparator invoked per element.
+              * @returns {Array} Returns the new array of intersecting values.
+              * @example
+              *
+              * var objects = [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }];
+              * var others = [{ 'x': 1, 'y': 1 }, { 'x': 1, 'y': 2 }];
+              *
+              * _.intersectionWith(objects, others, _.isEqual);
+              * // => [{ 'x': 1, 'y': 2 }]
+              */
+
+             var intersectionWith = baseRest(function (arrays) {
+               var comparator = last(arrays),
+                   mapped = arrayMap(arrays, castArrayLikeObject);
+               comparator = typeof comparator == 'function' ? comparator : undefined$1;
+
+               if (comparator) {
+                 mapped.pop();
+               }
+
+               return mapped.length && mapped[0] === arrays[0] ? baseIntersection(mapped, undefined$1, comparator) : [];
+             });
+             /**
+              * Converts all elements in `array` into a string separated by `separator`.
+              *
+              * @static
+              * @memberOf _
+              * @since 4.0.0
+              * @category Array
+              * @param {Array} array The array to convert.
+              * @param {string} [separator=','] The element separator.
+              * @returns {string} Returns the joined string.
+              * @example
+              *
+              * _.join(['a', 'b', 'c'], '~');
+              * // => 'a~b~c'
+              */
+
+             function join(array, separator) {
+               return array == null ? '' : nativeJoin.call(array, separator);
+             }
+             /**
+              * Gets the last element of `array`.
+              *
+              * @static
+              * @memberOf _
+              * @since 0.1.0
+              * @category Array
+              * @param {Array} array The array to query.
+              * @returns {*} Returns the last element of `array`.
+              * @example
+              *
+              * _.last([1, 2, 3]);
+              * // => 3
+              */
+
+
+             function last(array) {
+               var length = array == null ? 0 : array.length;
+               return length ? array[length - 1] : undefined$1;
+             }
+             /**
+              * This method is like `_.indexOf` except that it iterates over elements of
+              * `array` from right to left.
+              *
+              * @static
+              * @memberOf _
+              * @since 0.1.0
+              * @category Array
+              * @param {Array} array The array to inspect.
+              * @param {*} value The value to search for.
+              * @param {number} [fromIndex=array.length-1] The index to search from.
+              * @returns {number} Returns the index of the matched value, else `-1`.
+              * @example
+              *
+              * _.lastIndexOf([1, 2, 1, 2], 2);
+              * // => 3
+              *
+              * // Search from the `fromIndex`.
+              * _.lastIndexOf([1, 2, 1, 2], 2, 2);
+              * // => 1
+              */
+
+
+             function lastIndexOf(array, value, fromIndex) {
+               var length = array == null ? 0 : array.length;
+
+               if (!length) {
+                 return -1;
+               }
+
+               var index = length;
+
+               if (fromIndex !== undefined$1) {
+                 index = toInteger(fromIndex);
+                 index = index < 0 ? nativeMax(length + index, 0) : nativeMin(index, length - 1);
+               }
+
+               return value === value ? strictLastIndexOf(array, value, index) : baseFindIndex(array, baseIsNaN, index, true);
+             }
+             /**
+              * Gets the element at index `n` of `array`. If `n` is negative, the nth
+              * element from the end is returned.
+              *
+              * @static
+              * @memberOf _
+              * @since 4.11.0
+              * @category Array
+              * @param {Array} array The array to query.
+              * @param {number} [n=0] The index of the element to return.
+              * @returns {*} Returns the nth element of `array`.
+              * @example
+              *
+              * var array = ['a', 'b', 'c', 'd'];
+              *
+              * _.nth(array, 1);
+              * // => 'b'
+              *
+              * _.nth(array, -2);
+              * // => 'c';
+              */
+
+
+             function nth(array, n) {
+               return array && array.length ? baseNth(array, toInteger(n)) : undefined$1;
+             }
+             /**
+              * Removes all given values from `array` using
+              * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)
+              * for equality comparisons.
+              *
+              * **Note:** Unlike `_.without`, this method mutates `array`. Use `_.remove`
+              * to remove elements from an array by predicate.
+              *
+              * @static
+              * @memberOf _
+              * @since 2.0.0
+              * @category Array
+              * @param {Array} array The array to modify.
+              * @param {...*} [values] The values to remove.
+              * @returns {Array} Returns `array`.
+              * @example
+              *
+              * var array = ['a', 'b', 'c', 'a', 'b', 'c'];
+              *
+              * _.pull(array, 'a', 'c');
+              * console.log(array);
+              * // => ['b', 'b']
+              */
+
+
+             var pull = baseRest(pullAll);
+             /**
+              * This method is like `_.pull` except that it accepts an array of values to remove.
+              *
+              * **Note:** Unlike `_.difference`, this method mutates `array`.
+              *
+              * @static
+              * @memberOf _
+              * @since 4.0.0
+              * @category Array
+              * @param {Array} array The array to modify.
+              * @param {Array} values The values to remove.
+              * @returns {Array} Returns `array`.
+              * @example
+              *
+              * var array = ['a', 'b', 'c', 'a', 'b', 'c'];
+              *
+              * _.pullAll(array, ['a', 'c']);
+              * console.log(array);
+              * // => ['b', 'b']
+              */
+
+             function pullAll(array, values) {
+               return array && array.length && values && values.length ? basePullAll(array, values) : array;
+             }
+             /**
+              * This method is like `_.pullAll` except that it accepts `iteratee` which is
+              * invoked for each element of `array` and `values` to generate the criterion
+              * by which they're compared. The iteratee is invoked with one argument: (value).
+              *
+              * **Note:** Unlike `_.differenceBy`, this method mutates `array`.
+              *
+              * @static
+              * @memberOf _
+              * @since 4.0.0
+              * @category Array
+              * @param {Array} array The array to modify.
+              * @param {Array} values The values to remove.
+              * @param {Function} [iteratee=_.identity] The iteratee invoked per element.
+              * @returns {Array} Returns `array`.
+              * @example
+              *
+              * var array = [{ 'x': 1 }, { 'x': 2 }, { 'x': 3 }, { 'x': 1 }];
+              *
+              * _.pullAllBy(array, [{ 'x': 1 }, { 'x': 3 }], 'x');
+              * console.log(array);
+              * // => [{ 'x': 2 }]
+              */
+
+
+             function pullAllBy(array, values, iteratee) {
+               return array && array.length && values && values.length ? basePullAll(array, values, getIteratee(iteratee, 2)) : array;
+             }
+             /**
+              * This method is like `_.pullAll` except that it accepts `comparator` which
+              * is invoked to compare elements of `array` to `values`. The comparator is
+              * invoked with two arguments: (arrVal, othVal).
+              *
+              * **Note:** Unlike `_.differenceWith`, this method mutates `array`.
+              *
+              * @static
+              * @memberOf _
+              * @since 4.6.0
+              * @category Array
+              * @param {Array} array The array to modify.
+              * @param {Array} values The values to remove.
+              * @param {Function} [comparator] The comparator invoked per element.
+              * @returns {Array} Returns `array`.
+              * @example
+              *
+              * var array = [{ 'x': 1, 'y': 2 }, { 'x': 3, 'y': 4 }, { 'x': 5, 'y': 6 }];
+              *
+              * _.pullAllWith(array, [{ 'x': 3, 'y': 4 }], _.isEqual);
+              * console.log(array);
+              * // => [{ 'x': 1, 'y': 2 }, { 'x': 5, 'y': 6 }]
+              */
+
+
+             function pullAllWith(array, values, comparator) {
+               return array && array.length && values && values.length ? basePullAll(array, values, undefined$1, comparator) : array;
+             }
+             /**
+              * Removes elements from `array` corresponding to `indexes` and returns an
+              * array of removed elements.
+              *
+              * **Note:** Unlike `_.at`, this method mutates `array`.
+              *
+              * @static
+              * @memberOf _
+              * @since 3.0.0
+              * @category Array
+              * @param {Array} array The array to modify.
+              * @param {...(number|number[])} [indexes] The indexes of elements to remove.
+              * @returns {Array} Returns the new array of removed elements.
+              * @example
+              *
+              * var array = ['a', 'b', 'c', 'd'];
+              * var pulled = _.pullAt(array, [1, 3]);
+              *
+              * console.log(array);
+              * // => ['a', 'c']
+              *
+              * console.log(pulled);
+              * // => ['b', 'd']
+              */
+
+
+             var pullAt = flatRest(function (array, indexes) {
+               var length = array == null ? 0 : array.length,
+                   result = baseAt(array, indexes);
+               basePullAt(array, arrayMap(indexes, function (index) {
+                 return isIndex(index, length) ? +index : index;
+               }).sort(compareAscending));
+               return result;
+             });
+             /**
+              * Removes all elements from `array` that `predicate` returns truthy for
+              * and returns an array of the removed elements. The predicate is invoked
+              * with three arguments: (value, index, array).
+              *
+              * **Note:** Unlike `_.filter`, this method mutates `array`. Use `_.pull`
+              * to pull elements from an array by value.
+              *
+              * @static
+              * @memberOf _
+              * @since 2.0.0
+              * @category Array
+              * @param {Array} array The array to modify.
+              * @param {Function} [predicate=_.identity] The function invoked per iteration.
+              * @returns {Array} Returns the new array of removed elements.
+              * @example
+              *
+              * var array = [1, 2, 3, 4];
+              * var evens = _.remove(array, function(n) {
+              *   return n % 2 == 0;
+              * });
+              *
+              * console.log(array);
+              * // => [1, 3]
+              *
+              * console.log(evens);
+              * // => [2, 4]
+              */
+
+             function remove(array, predicate) {
+               var result = [];
+
+               if (!(array && array.length)) {
+                 return result;
+               }
+
+               var index = -1,
+                   indexes = [],
+                   length = array.length;
+               predicate = getIteratee(predicate, 3);
+
+               while (++index < length) {
+                 var value = array[index];
+
+                 if (predicate(value, index, array)) {
+                   result.push(value);
+                   indexes.push(index);
+                 }
+               }
+
+               basePullAt(array, indexes);
+               return result;
+             }
+             /**
+              * Reverses `array` so that the first element becomes the last, the second
+              * element becomes the second to last, and so on.
+              *
+              * **Note:** This method mutates `array` and is based on
+              * [`Array#reverse`](https://mdn.io/Array/reverse).
+              *
+              * @static
+              * @memberOf _
+              * @since 4.0.0
+              * @category Array
+              * @param {Array} array The array to modify.
+              * @returns {Array} Returns `array`.
+              * @example
+              *
+              * var array = [1, 2, 3];
+              *
+              * _.reverse(array);
+              * // => [3, 2, 1]
+              *
+              * console.log(array);
+              * // => [3, 2, 1]
+              */
+
+
+             function reverse(array) {
+               return array == null ? array : nativeReverse.call(array);
+             }
+             /**
+              * Creates a slice of `array` from `start` up to, but not including, `end`.
+              *
+              * **Note:** This method is used instead of
+              * [`Array#slice`](https://mdn.io/Array/slice) to ensure dense arrays are
+              * returned.
+              *
+              * @static
+              * @memberOf _
+              * @since 3.0.0
+              * @category Array
+              * @param {Array} array The array to slice.
+              * @param {number} [start=0] The start position.
+              * @param {number} [end=array.length] The end position.
+              * @returns {Array} Returns the slice of `array`.
+              */
+
+
+             function slice(array, start, end) {
+               var length = array == null ? 0 : array.length;
+
+               if (!length) {
+                 return [];
+               }
+
+               if (end && typeof end != 'number' && isIterateeCall(array, start, end)) {
+                 start = 0;
+                 end = length;
+               } else {
+                 start = start == null ? 0 : toInteger(start);
+                 end = end === undefined$1 ? length : toInteger(end);
+               }
+
+               return baseSlice(array, start, end);
+             }
+             /**
+              * Uses a binary search to determine the lowest index at which `value`
+              * should be inserted into `array` in order to maintain its sort order.
+              *
+              * @static
+              * @memberOf _
+              * @since 0.1.0
+              * @category Array
+              * @param {Array} array The sorted array to inspect.
+              * @param {*} value The value to evaluate.
+              * @returns {number} Returns the index at which `value` should be inserted
+              *  into `array`.
+              * @example
+              *
+              * _.sortedIndex([30, 50], 40);
+              * // => 1
+              */
+
+
+             function sortedIndex(array, value) {
+               return baseSortedIndex(array, value);
+             }
+             /**
+              * This method is like `_.sortedIndex` except that it accepts `iteratee`
+              * which is invoked for `value` and each element of `array` to compute their
+              * sort ranking. The iteratee is invoked with one argument: (value).
+              *
+              * @static
+              * @memberOf _
+              * @since 4.0.0
+              * @category Array
+              * @param {Array} array The sorted array to inspect.
+              * @param {*} value The value to evaluate.
+              * @param {Function} [iteratee=_.identity] The iteratee invoked per element.
+              * @returns {number} Returns the index at which `value` should be inserted
+              *  into `array`.
+              * @example
+              *
+              * var objects = [{ 'x': 4 }, { 'x': 5 }];
+              *
+              * _.sortedIndexBy(objects, { 'x': 4 }, function(o) { return o.x; });
+              * // => 0
+              *
+              * // The `_.property` iteratee shorthand.
+              * _.sortedIndexBy(objects, { 'x': 4 }, 'x');
+              * // => 0
+              */
+
+
+             function sortedIndexBy(array, value, iteratee) {
+               return baseSortedIndexBy(array, value, getIteratee(iteratee, 2));
+             }
+             /**
+              * This method is like `_.indexOf` except that it performs a binary
+              * search on a sorted `array`.
+              *
+              * @static
+              * @memberOf _
+              * @since 4.0.0
+              * @category Array
+              * @param {Array} array The array to inspect.
+              * @param {*} value The value to search for.
+              * @returns {number} Returns the index of the matched value, else `-1`.
+              * @example
+              *
+              * _.sortedIndexOf([4, 5, 5, 5, 6], 5);
+              * // => 1
+              */
+
+
+             function sortedIndexOf(array, value) {
+               var length = array == null ? 0 : array.length;
+
+               if (length) {
+                 var index = baseSortedIndex(array, value);
+
+                 if (index < length && eq(array[index], value)) {
+                   return index;
+                 }
+               }
+
+               return -1;
+             }
+             /**
+              * This method is like `_.sortedIndex` except that it returns the highest
+              * index at which `value` should be inserted into `array` in order to
+              * maintain its sort order.
+              *
+              * @static
+              * @memberOf _
+              * @since 3.0.0
+              * @category Array
+              * @param {Array} array The sorted array to inspect.
+              * @param {*} value The value to evaluate.
+              * @returns {number} Returns the index at which `value` should be inserted
+              *  into `array`.
+              * @example
+              *
+              * _.sortedLastIndex([4, 5, 5, 5, 6], 5);
+              * // => 4
+              */
+
+
+             function sortedLastIndex(array, value) {
+               return baseSortedIndex(array, value, true);
+             }
+             /**
+              * This method is like `_.sortedLastIndex` except that it accepts `iteratee`
+              * which is invoked for `value` and each element of `array` to compute their
+              * sort ranking. The iteratee is invoked with one argument: (value).
+              *
+              * @static
+              * @memberOf _
+              * @since 4.0.0
+              * @category Array
+              * @param {Array} array The sorted array to inspect.
+              * @param {*} value The value to evaluate.
+              * @param {Function} [iteratee=_.identity] The iteratee invoked per element.
+              * @returns {number} Returns the index at which `value` should be inserted
+              *  into `array`.
+              * @example
+              *
+              * var objects = [{ 'x': 4 }, { 'x': 5 }];
+              *
+              * _.sortedLastIndexBy(objects, { 'x': 4 }, function(o) { return o.x; });
+              * // => 1
+              *
+              * // The `_.property` iteratee shorthand.
+              * _.sortedLastIndexBy(objects, { 'x': 4 }, 'x');
+              * // => 1
+              */
+
+
+             function sortedLastIndexBy(array, value, iteratee) {
+               return baseSortedIndexBy(array, value, getIteratee(iteratee, 2), true);
+             }
+             /**
+              * This method is like `_.lastIndexOf` except that it performs a binary
+              * search on a sorted `array`.
+              *
+              * @static
+              * @memberOf _
+              * @since 4.0.0
+              * @category Array
+              * @param {Array} array The array to inspect.
+              * @param {*} value The value to search for.
+              * @returns {number} Returns the index of the matched value, else `-1`.
+              * @example
+              *
+              * _.sortedLastIndexOf([4, 5, 5, 5, 6], 5);
+              * // => 3
+              */
+
+
+             function sortedLastIndexOf(array, value) {
+               var length = array == null ? 0 : array.length;
+
+               if (length) {
+                 var index = baseSortedIndex(array, value, true) - 1;
+
+                 if (eq(array[index], value)) {
+                   return index;
+                 }
+               }
+
+               return -1;
+             }
+             /**
+              * This method is like `_.uniq` except that it's designed and optimized
+              * for sorted arrays.
+              *
+              * @static
+              * @memberOf _
+              * @since 4.0.0
+              * @category Array
+              * @param {Array} array The array to inspect.
+              * @returns {Array} Returns the new duplicate free array.
+              * @example
+              *
+              * _.sortedUniq([1, 1, 2]);
+              * // => [1, 2]
+              */
+
+
+             function sortedUniq(array) {
+               return array && array.length ? baseSortedUniq(array) : [];
+             }
+             /**
+              * This method is like `_.uniqBy` except that it's designed and optimized
+              * for sorted arrays.
+              *
+              * @static
+              * @memberOf _
+              * @since 4.0.0
+              * @category Array
+              * @param {Array} array The array to inspect.
+              * @param {Function} [iteratee] The iteratee invoked per element.
+              * @returns {Array} Returns the new duplicate free array.
+              * @example
+              *
+              * _.sortedUniqBy([1.1, 1.2, 2.3, 2.4], Math.floor);
+              * // => [1.1, 2.3]
+              */
+
+
+             function sortedUniqBy(array, iteratee) {
+               return array && array.length ? baseSortedUniq(array, getIteratee(iteratee, 2)) : [];
+             }
+             /**
+              * Gets all but the first element of `array`.
+              *
+              * @static
+              * @memberOf _
+              * @since 4.0.0
+              * @category Array
+              * @param {Array} array The array to query.
+              * @returns {Array} Returns the slice of `array`.
+              * @example
+              *
+              * _.tail([1, 2, 3]);
+              * // => [2, 3]
+              */
+
+
+             function tail(array) {
+               var length = array == null ? 0 : array.length;
+               return length ? baseSlice(array, 1, length) : [];
+             }
+             /**
+              * Creates a slice of `array` with `n` elements taken from the beginning.
+              *
+              * @static
+              * @memberOf _
+              * @since 0.1.0
+              * @category Array
+              * @param {Array} array The array to query.
+              * @param {number} [n=1] The number of elements to take.
+              * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.
+              * @returns {Array} Returns the slice of `array`.
+              * @example
+              *
+              * _.take([1, 2, 3]);
+              * // => [1]
+              *
+              * _.take([1, 2, 3], 2);
+              * // => [1, 2]
+              *
+              * _.take([1, 2, 3], 5);
+              * // => [1, 2, 3]
+              *
+              * _.take([1, 2, 3], 0);
+              * // => []
+              */
+
+
+             function take(array, n, guard) {
+               if (!(array && array.length)) {
+                 return [];
+               }
+
+               n = guard || n === undefined$1 ? 1 : toInteger(n);
+               return baseSlice(array, 0, n < 0 ? 0 : n);
+             }
+             /**
+              * Creates a slice of `array` with `n` elements taken from the end.
+              *
+              * @static
+              * @memberOf _
+              * @since 3.0.0
+              * @category Array
+              * @param {Array} array The array to query.
+              * @param {number} [n=1] The number of elements to take.
+              * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.
+              * @returns {Array} Returns the slice of `array`.
+              * @example
+              *
+              * _.takeRight([1, 2, 3]);
+              * // => [3]
+              *
+              * _.takeRight([1, 2, 3], 2);
+              * // => [2, 3]
+              *
+              * _.takeRight([1, 2, 3], 5);
+              * // => [1, 2, 3]
+              *
+              * _.takeRight([1, 2, 3], 0);
+              * // => []
+              */
+
+
+             function takeRight(array, n, guard) {
+               var length = array == null ? 0 : array.length;
+
+               if (!length) {
+                 return [];
+               }
+
+               n = guard || n === undefined$1 ? 1 : toInteger(n);
+               n = length - n;
+               return baseSlice(array, n < 0 ? 0 : n, length);
+             }
+             /**
+              * Creates a slice of `array` with elements taken from the end. Elements are
+              * taken until `predicate` returns falsey. The predicate is invoked with
+              * three arguments: (value, index, array).
+              *
+              * @static
+              * @memberOf _
+              * @since 3.0.0
+              * @category Array
+              * @param {Array} array The array to query.
+              * @param {Function} [predicate=_.identity] The function invoked per iteration.
+              * @returns {Array} Returns the slice of `array`.
+              * @example
+              *
+              * var users = [
+              *   { 'user': 'barney',  'active': true },
+              *   { 'user': 'fred',    'active': false },
+              *   { 'user': 'pebbles', 'active': false }
+              * ];
+              *
+              * _.takeRightWhile(users, function(o) { return !o.active; });
+              * // => objects for ['fred', 'pebbles']
+              *
+              * // The `_.matches` iteratee shorthand.
+              * _.takeRightWhile(users, { 'user': 'pebbles', 'active': false });
+              * // => objects for ['pebbles']
+              *
+              * // The `_.matchesProperty` iteratee shorthand.
+              * _.takeRightWhile(users, ['active', false]);
+              * // => objects for ['fred', 'pebbles']
+              *
+              * // The `_.property` iteratee shorthand.
+              * _.takeRightWhile(users, 'active');
+              * // => []
+              */
+
+
+             function takeRightWhile(array, predicate) {
+               return array && array.length ? baseWhile(array, getIteratee(predicate, 3), false, true) : [];
+             }
+             /**
+              * Creates a slice of `array` with elements taken from the beginning. Elements
+              * are taken until `predicate` returns falsey. The predicate is invoked with
+              * three arguments: (value, index, array).
+              *
+              * @static
+              * @memberOf _
+              * @since 3.0.0
+              * @category Array
+              * @param {Array} array The array to query.
+              * @param {Function} [predicate=_.identity] The function invoked per iteration.
+              * @returns {Array} Returns the slice of `array`.
+              * @example
+              *
+              * var users = [
+              *   { 'user': 'barney',  'active': false },
+              *   { 'user': 'fred',    'active': false },
+              *   { 'user': 'pebbles', 'active': true }
+              * ];
+              *
+              * _.takeWhile(users, function(o) { return !o.active; });
+              * // => objects for ['barney', 'fred']
+              *
+              * // The `_.matches` iteratee shorthand.
+              * _.takeWhile(users, { 'user': 'barney', 'active': false });
+              * // => objects for ['barney']
+              *
+              * // The `_.matchesProperty` iteratee shorthand.
+              * _.takeWhile(users, ['active', false]);
+              * // => objects for ['barney', 'fred']
+              *
+              * // The `_.property` iteratee shorthand.
+              * _.takeWhile(users, 'active');
+              * // => []
+              */
+
+
+             function takeWhile(array, predicate) {
+               return array && array.length ? baseWhile(array, getIteratee(predicate, 3)) : [];
+             }
+             /**
+              * Creates an array of unique values, in order, from all given arrays using
+              * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)
+              * for equality comparisons.
+              *
+              * @static
+              * @memberOf _
+              * @since 0.1.0
+              * @category Array
+              * @param {...Array} [arrays] The arrays to inspect.
+              * @returns {Array} Returns the new array of combined values.
+              * @example
+              *
+              * _.union([2], [1, 2]);
+              * // => [2, 1]
+              */
+
+
+             var union = baseRest(function (arrays) {
+               return baseUniq(baseFlatten(arrays, 1, isArrayLikeObject, true));
+             });
+             /**
+              * This method is like `_.union` except that it accepts `iteratee` which is
+              * invoked for each element of each `arrays` to generate the criterion by
+              * which uniqueness is computed. Result values are chosen from the first
+              * array in which the value occurs. The iteratee is invoked with one argument:
+              * (value).
+              *
+              * @static
+              * @memberOf _
+              * @since 4.0.0
+              * @category Array
+              * @param {...Array} [arrays] The arrays to inspect.
+              * @param {Function} [iteratee=_.identity] The iteratee invoked per element.
+              * @returns {Array} Returns the new array of combined values.
+              * @example
+              *
+              * _.unionBy([2.1], [1.2, 2.3], Math.floor);
+              * // => [2.1, 1.2]
+              *
+              * // The `_.property` iteratee shorthand.
+              * _.unionBy([{ 'x': 1 }], [{ 'x': 2 }, { 'x': 1 }], 'x');
+              * // => [{ 'x': 1 }, { 'x': 2 }]
+              */
+
+             var unionBy = baseRest(function (arrays) {
+               var iteratee = last(arrays);
+
+               if (isArrayLikeObject(iteratee)) {
+                 iteratee = undefined$1;
+               }
+
+               return baseUniq(baseFlatten(arrays, 1, isArrayLikeObject, true), getIteratee(iteratee, 2));
+             });
+             /**
+              * This method is like `_.union` except that it accepts `comparator` which
+              * is invoked to compare elements of `arrays`. Result values are chosen from
+              * the first array in which the value occurs. The comparator is invoked
+              * with two arguments: (arrVal, othVal).
+              *
+              * @static
+              * @memberOf _
+              * @since 4.0.0
+              * @category Array
+              * @param {...Array} [arrays] The arrays to inspect.
+              * @param {Function} [comparator] The comparator invoked per element.
+              * @returns {Array} Returns the new array of combined values.
+              * @example
+              *
+              * var objects = [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }];
+              * var others = [{ 'x': 1, 'y': 1 }, { 'x': 1, 'y': 2 }];
+              *
+              * _.unionWith(objects, others, _.isEqual);
+              * // => [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }, { 'x': 1, 'y': 1 }]
+              */
+
+             var unionWith = baseRest(function (arrays) {
+               var comparator = last(arrays);
+               comparator = typeof comparator == 'function' ? comparator : undefined$1;
+               return baseUniq(baseFlatten(arrays, 1, isArrayLikeObject, true), undefined$1, comparator);
+             });
+             /**
+              * Creates a duplicate-free version of an array, using
+              * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)
+              * for equality comparisons, in which only the first occurrence of each element
+              * is kept. The order of result values is determined by the order they occur
+              * in the array.
+              *
+              * @static
+              * @memberOf _
+              * @since 0.1.0
+              * @category Array
+              * @param {Array} array The array to inspect.
+              * @returns {Array} Returns the new duplicate free array.
+              * @example
+              *
+              * _.uniq([2, 1, 2]);
+              * // => [2, 1]
+              */
+
+             function uniq(array) {
+               return array && array.length ? baseUniq(array) : [];
+             }
+             /**
+              * This method is like `_.uniq` except that it accepts `iteratee` which is
+              * invoked for each element in `array` to generate the criterion by which
+              * uniqueness is computed. The order of result values is determined by the
+              * order they occur in the array. The iteratee is invoked with one argument:
+              * (value).
+              *
+              * @static
+              * @memberOf _
+              * @since 4.0.0
+              * @category Array
+              * @param {Array} array The array to inspect.
+              * @param {Function} [iteratee=_.identity] The iteratee invoked per element.
+              * @returns {Array} Returns the new duplicate free array.
+              * @example
+              *
+              * _.uniqBy([2.1, 1.2, 2.3], Math.floor);
+              * // => [2.1, 1.2]
+              *
+              * // The `_.property` iteratee shorthand.
+              * _.uniqBy([{ 'x': 1 }, { 'x': 2 }, { 'x': 1 }], 'x');
+              * // => [{ 'x': 1 }, { 'x': 2 }]
+              */
+
+
+             function uniqBy(array, iteratee) {
+               return array && array.length ? baseUniq(array, getIteratee(iteratee, 2)) : [];
+             }
+             /**
+              * This method is like `_.uniq` except that it accepts `comparator` which
+              * is invoked to compare elements of `array`. The order of result values is
+              * determined by the order they occur in the array.The comparator is invoked
+              * with two arguments: (arrVal, othVal).
+              *
+              * @static
+              * @memberOf _
+              * @since 4.0.0
+              * @category Array
+              * @param {Array} array The array to inspect.
+              * @param {Function} [comparator] The comparator invoked per element.
+              * @returns {Array} Returns the new duplicate free array.
+              * @example
+              *
+              * var objects = [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }, { 'x': 1, 'y': 2 }];
+              *
+              * _.uniqWith(objects, _.isEqual);
+              * // => [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }]
+              */
+
+
+             function uniqWith(array, comparator) {
+               comparator = typeof comparator == 'function' ? comparator : undefined$1;
+               return array && array.length ? baseUniq(array, undefined$1, comparator) : [];
+             }
+             /**
+              * This method is like `_.zip` except that it accepts an array of grouped
+              * elements and creates an array regrouping the elements to their pre-zip
+              * configuration.
+              *
+              * @static
+              * @memberOf _
+              * @since 1.2.0
+              * @category Array
+              * @param {Array} array The array of grouped elements to process.
+              * @returns {Array} Returns the new array of regrouped elements.
+              * @example
+              *
+              * var zipped = _.zip(['a', 'b'], [1, 2], [true, false]);
+              * // => [['a', 1, true], ['b', 2, false]]
+              *
+              * _.unzip(zipped);
+              * // => [['a', 'b'], [1, 2], [true, false]]
+              */
+
+
+             function unzip(array) {
+               if (!(array && array.length)) {
+                 return [];
+               }
+
+               var length = 0;
+               array = arrayFilter(array, function (group) {
+                 if (isArrayLikeObject(group)) {
+                   length = nativeMax(group.length, length);
+                   return true;
+                 }
+               });
+               return baseTimes(length, function (index) {
+                 return arrayMap(array, baseProperty(index));
+               });
+             }
+             /**
+              * This method is like `_.unzip` except that it accepts `iteratee` to specify
+              * how regrouped values should be combined. The iteratee is invoked with the
+              * elements of each group: (...group).
+              *
+              * @static
+              * @memberOf _
+              * @since 3.8.0
+              * @category Array
+              * @param {Array} array The array of grouped elements to process.
+              * @param {Function} [iteratee=_.identity] The function to combine
+              *  regrouped values.
+              * @returns {Array} Returns the new array of regrouped elements.
+              * @example
+              *
+              * var zipped = _.zip([1, 2], [10, 20], [100, 200]);
+              * // => [[1, 10, 100], [2, 20, 200]]
+              *
+              * _.unzipWith(zipped, _.add);
+              * // => [3, 30, 300]
+              */
+
+
+             function unzipWith(array, iteratee) {
+               if (!(array && array.length)) {
+                 return [];
+               }
+
+               var result = unzip(array);
+
+               if (iteratee == null) {
+                 return result;
+               }
+
+               return arrayMap(result, function (group) {
+                 return apply(iteratee, undefined$1, group);
+               });
+             }
+             /**
+              * Creates an array excluding all given values using
+              * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)
+              * for equality comparisons.
+              *
+              * **Note:** Unlike `_.pull`, this method returns a new array.
+              *
+              * @static
+              * @memberOf _
+              * @since 0.1.0
+              * @category Array
+              * @param {Array} array The array to inspect.
+              * @param {...*} [values] The values to exclude.
+              * @returns {Array} Returns the new array of filtered values.
+              * @see _.difference, _.xor
+              * @example
+              *
+              * _.without([2, 1, 2, 3], 1, 2);
+              * // => [3]
+              */
+
+
+             var without = baseRest(function (array, values) {
+               return isArrayLikeObject(array) ? baseDifference(array, values) : [];
+             });
+             /**
+              * Creates an array of unique values that is the
+              * [symmetric difference](https://en.wikipedia.org/wiki/Symmetric_difference)
+              * of the given arrays. The order of result values is determined by the order
+              * they occur in the arrays.
+              *
+              * @static
+              * @memberOf _
+              * @since 2.4.0
+              * @category Array
+              * @param {...Array} [arrays] The arrays to inspect.
+              * @returns {Array} Returns the new array of filtered values.
+              * @see _.difference, _.without
+              * @example
+              *
+              * _.xor([2, 1], [2, 3]);
+              * // => [1, 3]
+              */
+
+             var xor = baseRest(function (arrays) {
+               return baseXor(arrayFilter(arrays, isArrayLikeObject));
+             });
+             /**
+              * This method is like `_.xor` except that it accepts `iteratee` which is
+              * invoked for each element of each `arrays` to generate the criterion by
+              * which by which they're compared. The order of result values is determined
+              * by the order they occur in the arrays. The iteratee is invoked with one
+              * argument: (value).
+              *
+              * @static
+              * @memberOf _
+              * @since 4.0.0
+              * @category Array
+              * @param {...Array} [arrays] The arrays to inspect.
+              * @param {Function} [iteratee=_.identity] The iteratee invoked per element.
+              * @returns {Array} Returns the new array of filtered values.
+              * @example
+              *
+              * _.xorBy([2.1, 1.2], [2.3, 3.4], Math.floor);
+              * // => [1.2, 3.4]
+              *
+              * // The `_.property` iteratee shorthand.
+              * _.xorBy([{ 'x': 1 }], [{ 'x': 2 }, { 'x': 1 }], 'x');
+              * // => [{ 'x': 2 }]
+              */
+
+             var xorBy = baseRest(function (arrays) {
+               var iteratee = last(arrays);
+
+               if (isArrayLikeObject(iteratee)) {
+                 iteratee = undefined$1;
+               }
+
+               return baseXor(arrayFilter(arrays, isArrayLikeObject), getIteratee(iteratee, 2));
+             });
+             /**
+              * This method is like `_.xor` except that it accepts `comparator` which is
+              * invoked to compare elements of `arrays`. The order of result values is
+              * determined by the order they occur in the arrays. The comparator is invoked
+              * with two arguments: (arrVal, othVal).
+              *
+              * @static
+              * @memberOf _
+              * @since 4.0.0
+              * @category Array
+              * @param {...Array} [arrays] The arrays to inspect.
+              * @param {Function} [comparator] The comparator invoked per element.
+              * @returns {Array} Returns the new array of filtered values.
+              * @example
+              *
+              * var objects = [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }];
+              * var others = [{ 'x': 1, 'y': 1 }, { 'x': 1, 'y': 2 }];
+              *
+              * _.xorWith(objects, others, _.isEqual);
+              * // => [{ 'x': 2, 'y': 1 }, { 'x': 1, 'y': 1 }]
+              */
+
+             var xorWith = baseRest(function (arrays) {
+               var comparator = last(arrays);
+               comparator = typeof comparator == 'function' ? comparator : undefined$1;
+               return baseXor(arrayFilter(arrays, isArrayLikeObject), undefined$1, comparator);
+             });
+             /**
+              * Creates an array of grouped elements, the first of which contains the
+              * first elements of the given arrays, the second of which contains the
+              * second elements of the given arrays, and so on.
+              *
+              * @static
+              * @memberOf _
+              * @since 0.1.0
+              * @category Array
+              * @param {...Array} [arrays] The arrays to process.
+              * @returns {Array} Returns the new array of grouped elements.
+              * @example
+              *
+              * _.zip(['a', 'b'], [1, 2], [true, false]);
+              * // => [['a', 1, true], ['b', 2, false]]
+              */
+
+             var zip = baseRest(unzip);
+             /**
+              * This method is like `_.fromPairs` except that it accepts two arrays,
+              * one of property identifiers and one of corresponding values.
+              *
+              * @static
+              * @memberOf _
+              * @since 0.4.0
+              * @category Array
+              * @param {Array} [props=[]] The property identifiers.
+              * @param {Array} [values=[]] The property values.
+              * @returns {Object} Returns the new object.
+              * @example
+              *
+              * _.zipObject(['a', 'b'], [1, 2]);
+              * // => { 'a': 1, 'b': 2 }
+              */
+
+             function zipObject(props, values) {
+               return baseZipObject(props || [], values || [], assignValue);
+             }
+             /**
+              * This method is like `_.zipObject` except that it supports property paths.
+              *
+              * @static
+              * @memberOf _
+              * @since 4.1.0
+              * @category Array
+              * @param {Array} [props=[]] The property identifiers.
+              * @param {Array} [values=[]] The property values.
+              * @returns {Object} Returns the new object.
+              * @example
+              *
+              * _.zipObjectDeep(['a.b[0].c', 'a.b[1].d'], [1, 2]);
+              * // => { 'a': { 'b': [{ 'c': 1 }, { 'd': 2 }] } }
+              */
+
+
+             function zipObjectDeep(props, values) {
+               return baseZipObject(props || [], values || [], baseSet);
+             }
+             /**
+              * This method is like `_.zip` except that it accepts `iteratee` to specify
+              * how grouped values should be combined. The iteratee is invoked with the
+              * elements of each group: (...group).
+              *
+              * @static
+              * @memberOf _
+              * @since 3.8.0
+              * @category Array
+              * @param {...Array} [arrays] The arrays to process.
+              * @param {Function} [iteratee=_.identity] The function to combine
+              *  grouped values.
+              * @returns {Array} Returns the new array of grouped elements.
+              * @example
+              *
+              * _.zipWith([1, 2], [10, 20], [100, 200], function(a, b, c) {
+              *   return a + b + c;
+              * });
+              * // => [111, 222]
+              */
+
+
+             var zipWith = baseRest(function (arrays) {
+               var length = arrays.length,
+                   iteratee = length > 1 ? arrays[length - 1] : undefined$1;
+               iteratee = typeof iteratee == 'function' ? (arrays.pop(), iteratee) : undefined$1;
+               return unzipWith(arrays, iteratee);
+             });
+             /*------------------------------------------------------------------------*/
+
+             /**
+              * Creates a `lodash` wrapper instance that wraps `value` with explicit method
+              * chain sequences enabled. The result of such sequences must be unwrapped
+              * with `_#value`.
+              *
+              * @static
+              * @memberOf _
+              * @since 1.3.0
+              * @category Seq
+              * @param {*} value The value to wrap.
+              * @returns {Object} Returns the new `lodash` wrapper instance.
+              * @example
+              *
+              * var users = [
+              *   { 'user': 'barney',  'age': 36 },
+              *   { 'user': 'fred',    'age': 40 },
+              *   { 'user': 'pebbles', 'age': 1 }
+              * ];
+              *
+              * var youngest = _
+              *   .chain(users)
+              *   .sortBy('age')
+              *   .map(function(o) {
+              *     return o.user + ' is ' + o.age;
+              *   })
+              *   .head()
+              *   .value();
+              * // => 'pebbles is 1'
+              */
+
+             function chain(value) {
+               var result = lodash(value);
+               result.__chain__ = true;
+               return result;
+             }
+             /**
+              * This method invokes `interceptor` and returns `value`. The interceptor
+              * is invoked with one argument; (value). The purpose of this method is to
+              * "tap into" a method chain sequence in order to modify intermediate results.
+              *
+              * @static
+              * @memberOf _
+              * @since 0.1.0
+              * @category Seq
+              * @param {*} value The value to provide to `interceptor`.
+              * @param {Function} interceptor The function to invoke.
+              * @returns {*} Returns `value`.
+              * @example
+              *
+              * _([1, 2, 3])
+              *  .tap(function(array) {
+              *    // Mutate input array.
+              *    array.pop();
+              *  })
+              *  .reverse()
+              *  .value();
+              * // => [2, 1]
+              */
+
+
+             function tap(value, interceptor) {
+               interceptor(value);
+               return value;
+             }
+             /**
+              * This method is like `_.tap` except that it returns the result of `interceptor`.
+              * The purpose of this method is to "pass thru" values replacing intermediate
+              * results in a method chain sequence.
+              *
+              * @static
+              * @memberOf _
+              * @since 3.0.0
+              * @category Seq
+              * @param {*} value The value to provide to `interceptor`.
+              * @param {Function} interceptor The function to invoke.
+              * @returns {*} Returns the result of `interceptor`.
+              * @example
+              *
+              * _('  abc  ')
+              *  .chain()
+              *  .trim()
+              *  .thru(function(value) {
+              *    return [value];
+              *  })
+              *  .value();
+              * // => ['abc']
+              */
+
+
+             function thru(value, interceptor) {
+               return interceptor(value);
+             }
+             /**
+              * This method is the wrapper version of `_.at`.
+              *
+              * @name at
+              * @memberOf _
+              * @since 1.0.0
+              * @category Seq
+              * @param {...(string|string[])} [paths] The property paths to pick.
+              * @returns {Object} Returns the new `lodash` wrapper instance.
+              * @example
+              *
+              * var object = { 'a': [{ 'b': { 'c': 3 } }, 4] };
+              *
+              * _(object).at(['a[0].b.c', 'a[1]']).value();
+              * // => [3, 4]
+              */
+
+
+             var wrapperAt = flatRest(function (paths) {
+               var length = paths.length,
+                   start = length ? paths[0] : 0,
+                   value = this.__wrapped__,
+                   interceptor = function interceptor(object) {
+                 return baseAt(object, paths);
+               };
+
+               if (length > 1 || this.__actions__.length || !(value instanceof LazyWrapper) || !isIndex(start)) {
+                 return this.thru(interceptor);
+               }
+
+               value = value.slice(start, +start + (length ? 1 : 0));
+
+               value.__actions__.push({
+                 'func': thru,
+                 'args': [interceptor],
+                 'thisArg': undefined$1
+               });
+
+               return new LodashWrapper(value, this.__chain__).thru(function (array) {
+                 if (length && !array.length) {
+                   array.push(undefined$1);
+                 }
+
+                 return array;
+               });
+             });
+             /**
+              * Creates a `lodash` wrapper instance with explicit method chain sequences enabled.
+              *
+              * @name chain
+              * @memberOf _
+              * @since 0.1.0
+              * @category Seq
+              * @returns {Object} Returns the new `lodash` wrapper instance.
+              * @example
+              *
+              * var users = [
+              *   { 'user': 'barney', 'age': 36 },
+              *   { 'user': 'fred',   'age': 40 }
+              * ];
+              *
+              * // A sequence without explicit chaining.
+              * _(users).head();
+              * // => { 'user': 'barney', 'age': 36 }
+              *
+              * // A sequence with explicit chaining.
+              * _(users)
+              *   .chain()
+              *   .head()
+              *   .pick('user')
+              *   .value();
+              * // => { 'user': 'barney' }
+              */
+
+             function wrapperChain() {
+               return chain(this);
+             }
+             /**
+              * Executes the chain sequence and returns the wrapped result.
+              *
+              * @name commit
+              * @memberOf _
+              * @since 3.2.0
+              * @category Seq
+              * @returns {Object} Returns the new `lodash` wrapper instance.
+              * @example
+              *
+              * var array = [1, 2];
+              * var wrapped = _(array).push(3);
+              *
+              * console.log(array);
+              * // => [1, 2]
+              *
+              * wrapped = wrapped.commit();
+              * console.log(array);
+              * // => [1, 2, 3]
+              *
+              * wrapped.last();
+              * // => 3
+              *
+              * console.log(array);
+              * // => [1, 2, 3]
+              */
+
+
+             function wrapperCommit() {
+               return new LodashWrapper(this.value(), this.__chain__);
+             }
+             /**
+              * Gets the next value on a wrapped object following the
+              * [iterator protocol](https://mdn.io/iteration_protocols#iterator).
+              *
+              * @name next
+              * @memberOf _
+              * @since 4.0.0
+              * @category Seq
+              * @returns {Object} Returns the next iterator value.
+              * @example
+              *
+              * var wrapped = _([1, 2]);
+              *
+              * wrapped.next();
+              * // => { 'done': false, 'value': 1 }
+              *
+              * wrapped.next();
+              * // => { 'done': false, 'value': 2 }
+              *
+              * wrapped.next();
+              * // => { 'done': true, 'value': undefined }
+              */
+
+
+             function wrapperNext() {
+               if (this.__values__ === undefined$1) {
+                 this.__values__ = toArray(this.value());
+               }
+
+               var done = this.__index__ >= this.__values__.length,
+                   value = done ? undefined$1 : this.__values__[this.__index__++];
+               return {
+                 'done': done,
+                 'value': value
+               };
+             }
+             /**
+              * Enables the wrapper to be iterable.
+              *
+              * @name Symbol.iterator
+              * @memberOf _
+              * @since 4.0.0
+              * @category Seq
+              * @returns {Object} Returns the wrapper object.
+              * @example
+              *
+              * var wrapped = _([1, 2]);
+              *
+              * wrapped[Symbol.iterator]() === wrapped;
+              * // => true
+              *
+              * Array.from(wrapped);
+              * // => [1, 2]
+              */
+
+
+             function wrapperToIterator() {
+               return this;
+             }
+             /**
+              * Creates a clone of the chain sequence planting `value` as the wrapped value.
+              *
+              * @name plant
+              * @memberOf _
+              * @since 3.2.0
+              * @category Seq
+              * @param {*} value The value to plant.
+              * @returns {Object} Returns the new `lodash` wrapper instance.
+              * @example
+              *
+              * function square(n) {
+              *   return n * n;
+              * }
+              *
+              * var wrapped = _([1, 2]).map(square);
+              * var other = wrapped.plant([3, 4]);
+              *
+              * other.value();
+              * // => [9, 16]
+              *
+              * wrapped.value();
+              * // => [1, 4]
+              */
+
+
+             function wrapperPlant(value) {
+               var result,
+                   parent = this;
+
+               while (parent instanceof baseLodash) {
+                 var clone = wrapperClone(parent);
+                 clone.__index__ = 0;
+                 clone.__values__ = undefined$1;
+
+                 if (result) {
+                   previous.__wrapped__ = clone;
+                 } else {
+                   result = clone;
+                 }
+
+                 var previous = clone;
+                 parent = parent.__wrapped__;
+               }
+
+               previous.__wrapped__ = value;
+               return result;
+             }
+             /**
+              * This method is the wrapper version of `_.reverse`.
+              *
+              * **Note:** This method mutates the wrapped array.
+              *
+              * @name reverse
+              * @memberOf _
+              * @since 0.1.0
+              * @category Seq
+              * @returns {Object} Returns the new `lodash` wrapper instance.
+              * @example
+              *
+              * var array = [1, 2, 3];
+              *
+              * _(array).reverse().value()
+              * // => [3, 2, 1]
+              *
+              * console.log(array);
+              * // => [3, 2, 1]
+              */
+
+
+             function wrapperReverse() {
+               var value = this.__wrapped__;
+
+               if (value instanceof LazyWrapper) {
+                 var wrapped = value;
+
+                 if (this.__actions__.length) {
+                   wrapped = new LazyWrapper(this);
+                 }
+
+                 wrapped = wrapped.reverse();
+
+                 wrapped.__actions__.push({
+                   'func': thru,
+                   'args': [reverse],
+                   'thisArg': undefined$1
+                 });
+
+                 return new LodashWrapper(wrapped, this.__chain__);
+               }
+
+               return this.thru(reverse);
+             }
+             /**
+              * Executes the chain sequence to resolve the unwrapped value.
+              *
+              * @name value
+              * @memberOf _
+              * @since 0.1.0
+              * @alias toJSON, valueOf
+              * @category Seq
+              * @returns {*} Returns the resolved unwrapped value.
+              * @example
+              *
+              * _([1, 2, 3]).value();
+              * // => [1, 2, 3]
+              */
+
+
+             function wrapperValue() {
+               return baseWrapperValue(this.__wrapped__, this.__actions__);
+             }
+             /*------------------------------------------------------------------------*/
+
+             /**
+              * Creates an object composed of keys generated from the results of running
+              * each element of `collection` thru `iteratee`. The corresponding value of
+              * each key is the number of times the key was returned by `iteratee`. The
+              * iteratee is invoked with one argument: (value).
+              *
+              * @static
+              * @memberOf _
+              * @since 0.5.0
+              * @category Collection
+              * @param {Array|Object} collection The collection to iterate over.
+              * @param {Function} [iteratee=_.identity] The iteratee to transform keys.
+              * @returns {Object} Returns the composed aggregate object.
+              * @example
+              *
+              * _.countBy([6.1, 4.2, 6.3], Math.floor);
+              * // => { '4': 1, '6': 2 }
+              *
+              * // The `_.property` iteratee shorthand.
+              * _.countBy(['one', 'two', 'three'], 'length');
+              * // => { '3': 2, '5': 1 }
+              */
+
+
+             var countBy = createAggregator(function (result, value, key) {
+               if (hasOwnProperty.call(result, key)) {
+                 ++result[key];
+               } else {
+                 baseAssignValue(result, key, 1);
+               }
+             });
+             /**
+              * Checks if `predicate` returns truthy for **all** elements of `collection`.
+              * Iteration is stopped once `predicate` returns falsey. The predicate is
+              * invoked with three arguments: (value, index|key, collection).
+              *
+              * **Note:** This method returns `true` for
+              * [empty collections](https://en.wikipedia.org/wiki/Empty_set) because
+              * [everything is true](https://en.wikipedia.org/wiki/Vacuous_truth) of
+              * elements of empty collections.
+              *
+              * @static
+              * @memberOf _
+              * @since 0.1.0
+              * @category Collection
+              * @param {Array|Object} collection The collection to iterate over.
+              * @param {Function} [predicate=_.identity] The function invoked per iteration.
+              * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.
+              * @returns {boolean} Returns `true` if all elements pass the predicate check,
+              *  else `false`.
+              * @example
+              *
+              * _.every([true, 1, null, 'yes'], Boolean);
+              * // => false
+              *
+              * var users = [
+              *   { 'user': 'barney', 'age': 36, 'active': false },
+              *   { 'user': 'fred',   'age': 40, 'active': false }
+              * ];
+              *
+              * // The `_.matches` iteratee shorthand.
+              * _.every(users, { 'user': 'barney', 'active': false });
+              * // => false
+              *
+              * // The `_.matchesProperty` iteratee shorthand.
+              * _.every(users, ['active', false]);
+              * // => true
+              *
+              * // The `_.property` iteratee shorthand.
+              * _.every(users, 'active');
+              * // => false
+              */
+
+             function every(collection, predicate, guard) {
+               var func = isArray(collection) ? arrayEvery : baseEvery;
+
+               if (guard && isIterateeCall(collection, predicate, guard)) {
+                 predicate = undefined$1;
+               }
+
+               return func(collection, getIteratee(predicate, 3));
+             }
+             /**
+              * Iterates over elements of `collection`, returning an array of all elements
+              * `predicate` returns truthy for. The predicate is invoked with three
+              * arguments: (value, index|key, collection).
+              *
+              * **Note:** Unlike `_.remove`, this method returns a new array.
+              *
+              * @static
+              * @memberOf _
+              * @since 0.1.0
+              * @category Collection
+              * @param {Array|Object} collection The collection to iterate over.
+              * @param {Function} [predicate=_.identity] The function invoked per iteration.
+              * @returns {Array} Returns the new filtered array.
+              * @see _.reject
+              * @example
+              *
+              * var users = [
+              *   { 'user': 'barney', 'age': 36, 'active': true },
+              *   { 'user': 'fred',   'age': 40, 'active': false }
+              * ];
+              *
+              * _.filter(users, function(o) { return !o.active; });
+              * // => objects for ['fred']
+              *
+              * // The `_.matches` iteratee shorthand.
+              * _.filter(users, { 'age': 36, 'active': true });
+              * // => objects for ['barney']
+              *
+              * // The `_.matchesProperty` iteratee shorthand.
+              * _.filter(users, ['active', false]);
+              * // => objects for ['fred']
+              *
+              * // The `_.property` iteratee shorthand.
+              * _.filter(users, 'active');
+              * // => objects for ['barney']
+              *
+              * // Combining several predicates using `_.overEvery` or `_.overSome`.
+              * _.filter(users, _.overSome([{ 'age': 36 }, ['age', 40]]));
+              * // => objects for ['fred', 'barney']
+              */
+
+
+             function filter(collection, predicate) {
+               var func = isArray(collection) ? arrayFilter : baseFilter;
+               return func(collection, getIteratee(predicate, 3));
+             }
+             /**
+              * Iterates over elements of `collection`, returning the first element
+              * `predicate` returns truthy for. The predicate is invoked with three
+              * arguments: (value, index|key, collection).
+              *
+              * @static
+              * @memberOf _
+              * @since 0.1.0
+              * @category Collection
+              * @param {Array|Object} collection The collection to inspect.
+              * @param {Function} [predicate=_.identity] The function invoked per iteration.
+              * @param {number} [fromIndex=0] The index to search from.
+              * @returns {*} Returns the matched element, else `undefined`.
+              * @example
+              *
+              * var users = [
+              *   { 'user': 'barney',  'age': 36, 'active': true },
+              *   { 'user': 'fred',    'age': 40, 'active': false },
+              *   { 'user': 'pebbles', 'age': 1,  'active': true }
+              * ];
+              *
+              * _.find(users, function(o) { return o.age < 40; });
+              * // => object for 'barney'
+              *
+              * // The `_.matches` iteratee shorthand.
+              * _.find(users, { 'age': 1, 'active': true });
+              * // => object for 'pebbles'
+              *
+              * // The `_.matchesProperty` iteratee shorthand.
+              * _.find(users, ['active', false]);
+              * // => object for 'fred'
+              *
+              * // The `_.property` iteratee shorthand.
+              * _.find(users, 'active');
+              * // => object for 'barney'
+              */
+
+
+             var find = createFind(findIndex);
+             /**
+              * This method is like `_.find` except that it iterates over elements of
+              * `collection` from right to left.
+              *
+              * @static
+              * @memberOf _
+              * @since 2.0.0
+              * @category Collection
+              * @param {Array|Object} collection The collection to inspect.
+              * @param {Function} [predicate=_.identity] The function invoked per iteration.
+              * @param {number} [fromIndex=collection.length-1] The index to search from.
+              * @returns {*} Returns the matched element, else `undefined`.
+              * @example
+              *
+              * _.findLast([1, 2, 3, 4], function(n) {
+              *   return n % 2 == 1;
+              * });
+              * // => 3
+              */
+
+             var findLast = createFind(findLastIndex);
+             /**
+              * Creates a flattened array of values by running each element in `collection`
+              * thru `iteratee` and flattening the mapped results. The iteratee is invoked
+              * with three arguments: (value, index|key, collection).
+              *
+              * @static
+              * @memberOf _
+              * @since 4.0.0
+              * @category Collection
+              * @param {Array|Object} collection The collection to iterate over.
+              * @param {Function} [iteratee=_.identity] The function invoked per iteration.
+              * @returns {Array} Returns the new flattened array.
+              * @example
+              *
+              * function duplicate(n) {
+              *   return [n, n];
+              * }
+              *
+              * _.flatMap([1, 2], duplicate);
+              * // => [1, 1, 2, 2]
+              */
+
+             function flatMap(collection, iteratee) {
+               return baseFlatten(map(collection, iteratee), 1);
+             }
+             /**
+              * This method is like `_.flatMap` except that it recursively flattens the
+              * mapped results.
+              *
+              * @static
+              * @memberOf _
+              * @since 4.7.0
+              * @category Collection
+              * @param {Array|Object} collection The collection to iterate over.
+              * @param {Function} [iteratee=_.identity] The function invoked per iteration.
+              * @returns {Array} Returns the new flattened array.
+              * @example
+              *
+              * function duplicate(n) {
+              *   return [[[n, n]]];
+              * }
+              *
+              * _.flatMapDeep([1, 2], duplicate);
+              * // => [1, 1, 2, 2]
+              */
+
+
+             function flatMapDeep(collection, iteratee) {
+               return baseFlatten(map(collection, iteratee), INFINITY);
+             }
+             /**
+              * This method is like `_.flatMap` except that it recursively flattens the
+              * mapped results up to `depth` times.
+              *
+              * @static
+              * @memberOf _
+              * @since 4.7.0
+              * @category Collection
+              * @param {Array|Object} collection The collection to iterate over.
+              * @param {Function} [iteratee=_.identity] The function invoked per iteration.
+              * @param {number} [depth=1] The maximum recursion depth.
+              * @returns {Array} Returns the new flattened array.
+              * @example
+              *
+              * function duplicate(n) {
+              *   return [[[n, n]]];
+              * }
+              *
+              * _.flatMapDepth([1, 2], duplicate, 2);
+              * // => [[1, 1], [2, 2]]
+              */
+
+
+             function flatMapDepth(collection, iteratee, depth) {
+               depth = depth === undefined$1 ? 1 : toInteger(depth);
+               return baseFlatten(map(collection, iteratee), depth);
+             }
+             /**
+              * Iterates over elements of `collection` and invokes `iteratee` for each element.
+              * The iteratee is invoked with three arguments: (value, index|key, collection).
+              * Iteratee functions may exit iteration early by explicitly returning `false`.
+              *
+              * **Note:** As with other "Collections" methods, objects with a "length"
+              * property are iterated like arrays. To avoid this behavior use `_.forIn`
+              * or `_.forOwn` for object iteration.
+              *
+              * @static
+              * @memberOf _
+              * @since 0.1.0
+              * @alias each
+              * @category Collection
+              * @param {Array|Object} collection The collection to iterate over.
+              * @param {Function} [iteratee=_.identity] The function invoked per iteration.
+              * @returns {Array|Object} Returns `collection`.
+              * @see _.forEachRight
+              * @example
+              *
+              * _.forEach([1, 2], function(value) {
+              *   console.log(value);
+              * });
+              * // => Logs `1` then `2`.
+              *
+              * _.forEach({ 'a': 1, 'b': 2 }, function(value, key) {
+              *   console.log(key);
+              * });
+              * // => Logs 'a' then 'b' (iteration order is not guaranteed).
+              */
+
+
+             function forEach(collection, iteratee) {
+               var func = isArray(collection) ? arrayEach : baseEach;
+               return func(collection, getIteratee(iteratee, 3));
+             }
+             /**
+              * This method is like `_.forEach` except that it iterates over elements of
+              * `collection` from right to left.
+              *
+              * @static
+              * @memberOf _
+              * @since 2.0.0
+              * @alias eachRight
+              * @category Collection
+              * @param {Array|Object} collection The collection to iterate over.
+              * @param {Function} [iteratee=_.identity] The function invoked per iteration.
+              * @returns {Array|Object} Returns `collection`.
+              * @see _.forEach
+              * @example
+              *
+              * _.forEachRight([1, 2], function(value) {
+              *   console.log(value);
+              * });
+              * // => Logs `2` then `1`.
+              */
+
+
+             function forEachRight(collection, iteratee) {
+               var func = isArray(collection) ? arrayEachRight : baseEachRight;
+               return func(collection, getIteratee(iteratee, 3));
+             }
+             /**
+              * Creates an object composed of keys generated from the results of running
+              * each element of `collection` thru `iteratee`. The order of grouped values
+              * is determined by the order they occur in `collection`. The corresponding
+              * value of each key is an array of elements responsible for generating the
+              * key. The iteratee is invoked with one argument: (value).
+              *
+              * @static
+              * @memberOf _
+              * @since 0.1.0
+              * @category Collection
+              * @param {Array|Object} collection The collection to iterate over.
+              * @param {Function} [iteratee=_.identity] The iteratee to transform keys.
+              * @returns {Object} Returns the composed aggregate object.
+              * @example
+              *
+              * _.groupBy([6.1, 4.2, 6.3], Math.floor);
+              * // => { '4': [4.2], '6': [6.1, 6.3] }
+              *
+              * // The `_.property` iteratee shorthand.
+              * _.groupBy(['one', 'two', 'three'], 'length');
+              * // => { '3': ['one', 'two'], '5': ['three'] }
+              */
+
+
+             var groupBy = createAggregator(function (result, value, key) {
+               if (hasOwnProperty.call(result, key)) {
+                 result[key].push(value);
+               } else {
+                 baseAssignValue(result, key, [value]);
+               }
+             });
+             /**
+              * Checks if `value` is in `collection`. If `collection` is a string, it's
+              * checked for a substring of `value`, otherwise
+              * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)
+              * is used for equality comparisons. If `fromIndex` is negative, it's used as
+              * the offset from the end of `collection`.
+              *
+              * @static
+              * @memberOf _
+              * @since 0.1.0
+              * @category Collection
+              * @param {Array|Object|string} collection The collection to inspect.
+              * @param {*} value The value to search for.
+              * @param {number} [fromIndex=0] The index to search from.
+              * @param- {Object} [guard] Enables use as an iteratee for methods like `_.reduce`.
+              * @returns {boolean} Returns `true` if `value` is found, else `false`.
+              * @example
+              *
+              * _.includes([1, 2, 3], 1);
+              * // => true
+              *
+              * _.includes([1, 2, 3], 1, 2);
+              * // => false
+              *
+              * _.includes({ 'a': 1, 'b': 2 }, 1);
+              * // => true
+              *
+              * _.includes('abcd', 'bc');
+              * // => true
+              */
+
+             function includes(collection, value, fromIndex, guard) {
+               collection = isArrayLike(collection) ? collection : values(collection);
+               fromIndex = fromIndex && !guard ? toInteger(fromIndex) : 0;
+               var length = collection.length;
+
+               if (fromIndex < 0) {
+                 fromIndex = nativeMax(length + fromIndex, 0);
+               }
+
+               return isString(collection) ? fromIndex <= length && collection.indexOf(value, fromIndex) > -1 : !!length && baseIndexOf(collection, value, fromIndex) > -1;
+             }
+             /**
+              * Invokes the method at `path` of each element in `collection`, returning
+              * an array of the results of each invoked method. Any additional arguments
+              * are provided to each invoked method. If `path` is a function, it's invoked
+              * for, and `this` bound to, each element in `collection`.
+              *
+              * @static
+              * @memberOf _
+              * @since 4.0.0
+              * @category Collection
+              * @param {Array|Object} collection The collection to iterate over.
+              * @param {Array|Function|string} path The path of the method to invoke or
+              *  the function invoked per iteration.
+              * @param {...*} [args] The arguments to invoke each method with.
+              * @returns {Array} Returns the array of results.
+              * @example
+              *
+              * _.invokeMap([[5, 1, 7], [3, 2, 1]], 'sort');
+              * // => [[1, 5, 7], [1, 2, 3]]
+              *
+              * _.invokeMap([123, 456], String.prototype.split, '');
+              * // => [['1', '2', '3'], ['4', '5', '6']]
+              */
+
+
+             var invokeMap = baseRest(function (collection, path, args) {
+               var index = -1,
+                   isFunc = typeof path == 'function',
+                   result = isArrayLike(collection) ? Array(collection.length) : [];
+               baseEach(collection, function (value) {
+                 result[++index] = isFunc ? apply(path, value, args) : baseInvoke(value, path, args);
+               });
+               return result;
+             });
+             /**
+              * Creates an object composed of keys generated from the results of running
+              * each element of `collection` thru `iteratee`. The corresponding value of
+              * each key is the last element responsible for generating the key. The
+              * iteratee is invoked with one argument: (value).
+              *
+              * @static
+              * @memberOf _
+              * @since 4.0.0
+              * @category Collection
+              * @param {Array|Object} collection The collection to iterate over.
+              * @param {Function} [iteratee=_.identity] The iteratee to transform keys.
+              * @returns {Object} Returns the composed aggregate object.
+              * @example
+              *
+              * var array = [
+              *   { 'dir': 'left', 'code': 97 },
+              *   { 'dir': 'right', 'code': 100 }
+              * ];
+              *
+              * _.keyBy(array, function(o) {
+              *   return String.fromCharCode(o.code);
+              * });
+              * // => { 'a': { 'dir': 'left', 'code': 97 }, 'd': { 'dir': 'right', 'code': 100 } }
+              *
+              * _.keyBy(array, 'dir');
+              * // => { 'left': { 'dir': 'left', 'code': 97 }, 'right': { 'dir': 'right', 'code': 100 } }
+              */
+
+             var keyBy = createAggregator(function (result, value, key) {
+               baseAssignValue(result, key, value);
+             });
+             /**
+              * Creates an array of values by running each element in `collection` thru
+              * `iteratee`. The iteratee is invoked with three arguments:
+              * (value, index|key, collection).
+              *
+              * Many lodash methods are guarded to work as iteratees for methods like
+              * `_.every`, `_.filter`, `_.map`, `_.mapValues`, `_.reject`, and `_.some`.
+              *
+              * The guarded methods are:
+              * `ary`, `chunk`, `curry`, `curryRight`, `drop`, `dropRight`, `every`,
+              * `fill`, `invert`, `parseInt`, `random`, `range`, `rangeRight`, `repeat`,
+              * `sampleSize`, `slice`, `some`, `sortBy`, `split`, `take`, `takeRight`,
+              * `template`, `trim`, `trimEnd`, `trimStart`, and `words`
+              *
+              * @static
+              * @memberOf _
+              * @since 0.1.0
+              * @category Collection
+              * @param {Array|Object} collection The collection to iterate over.
+              * @param {Function} [iteratee=_.identity] The function invoked per iteration.
+              * @returns {Array} Returns the new mapped array.
+              * @example
+              *
+              * function square(n) {
+              *   return n * n;
+              * }
+              *
+              * _.map([4, 8], square);
+              * // => [16, 64]
+              *
+              * _.map({ 'a': 4, 'b': 8 }, square);
+              * // => [16, 64] (iteration order is not guaranteed)
+              *
+              * var users = [
+              *   { 'user': 'barney' },
+              *   { 'user': 'fred' }
+              * ];
+              *
+              * // The `_.property` iteratee shorthand.
+              * _.map(users, 'user');
+              * // => ['barney', 'fred']
+              */
+
+             function map(collection, iteratee) {
+               var func = isArray(collection) ? arrayMap : baseMap;
+               return func(collection, getIteratee(iteratee, 3));
+             }
+             /**
+              * This method is like `_.sortBy` except that it allows specifying the sort
+              * orders of the iteratees to sort by. If `orders` is unspecified, all values
+              * are sorted in ascending order. Otherwise, specify an order of "desc" for
+              * descending or "asc" for ascending sort order of corresponding values.
+              *
+              * @static
+              * @memberOf _
+              * @since 4.0.0
+              * @category Collection
+              * @param {Array|Object} collection The collection to iterate over.
+              * @param {Array[]|Function[]|Object[]|string[]} [iteratees=[_.identity]]
+              *  The iteratees to sort by.
+              * @param {string[]} [orders] The sort orders of `iteratees`.
+              * @param- {Object} [guard] Enables use as an iteratee for methods like `_.reduce`.
+              * @returns {Array} Returns the new sorted array.
+              * @example
+              *
+              * var users = [
+              *   { 'user': 'fred',   'age': 48 },
+              *   { 'user': 'barney', 'age': 34 },
+              *   { 'user': 'fred',   'age': 40 },
+              *   { 'user': 'barney', 'age': 36 }
+              * ];
+              *
+              * // Sort by `user` in ascending order and by `age` in descending order.
+              * _.orderBy(users, ['user', 'age'], ['asc', 'desc']);
+              * // => objects for [['barney', 36], ['barney', 34], ['fred', 48], ['fred', 40]]
+              */
+
+
+             function orderBy(collection, iteratees, orders, guard) {
+               if (collection == null) {
+                 return [];
+               }
+
+               if (!isArray(iteratees)) {
+                 iteratees = iteratees == null ? [] : [iteratees];
+               }
+
+               orders = guard ? undefined$1 : orders;
+
+               if (!isArray(orders)) {
+                 orders = orders == null ? [] : [orders];
+               }
+
+               return baseOrderBy(collection, iteratees, orders);
+             }
+             /**
+              * Creates an array of elements split into two groups, the first of which
+              * contains elements `predicate` returns truthy for, the second of which
+              * contains elements `predicate` returns falsey for. The predicate is
+              * invoked with one argument: (value).
+              *
+              * @static
+              * @memberOf _
+              * @since 3.0.0
+              * @category Collection
+              * @param {Array|Object} collection The collection to iterate over.
+              * @param {Function} [predicate=_.identity] The function invoked per iteration.
+              * @returns {Array} Returns the array of grouped elements.
+              * @example
+              *
+              * var users = [
+              *   { 'user': 'barney',  'age': 36, 'active': false },
+              *   { 'user': 'fred',    'age': 40, 'active': true },
+              *   { 'user': 'pebbles', 'age': 1,  'active': false }
+              * ];
+              *
+              * _.partition(users, function(o) { return o.active; });
+              * // => objects for [['fred'], ['barney', 'pebbles']]
+              *
+              * // The `_.matches` iteratee shorthand.
+              * _.partition(users, { 'age': 1, 'active': false });
+              * // => objects for [['pebbles'], ['barney', 'fred']]
+              *
+              * // The `_.matchesProperty` iteratee shorthand.
+              * _.partition(users, ['active', false]);
+              * // => objects for [['barney', 'pebbles'], ['fred']]
+              *
+              * // The `_.property` iteratee shorthand.
+              * _.partition(users, 'active');
+              * // => objects for [['fred'], ['barney', 'pebbles']]
+              */
+
+
+             var partition = createAggregator(function (result, value, key) {
+               result[key ? 0 : 1].push(value);
+             }, function () {
+               return [[], []];
+             });
+             /**
+              * Reduces `collection` to a value which is the accumulated result of running
+              * each element in `collection` thru `iteratee`, where each successive
+              * invocation is supplied the return value of the previous. If `accumulator`
+              * is not given, the first element of `collection` is used as the initial
+              * value. The iteratee is invoked with four arguments:
+              * (accumulator, value, index|key, collection).
+              *
+              * Many lodash methods are guarded to work as iteratees for methods like
+              * `_.reduce`, `_.reduceRight`, and `_.transform`.
+              *
+              * The guarded methods are:
+              * `assign`, `defaults`, `defaultsDeep`, `includes`, `merge`, `orderBy`,
+              * and `sortBy`
+              *
+              * @static
+              * @memberOf _
+              * @since 0.1.0
+              * @category Collection
+              * @param {Array|Object} collection The collection to iterate over.
+              * @param {Function} [iteratee=_.identity] The function invoked per iteration.
+              * @param {*} [accumulator] The initial value.
+              * @returns {*} Returns the accumulated value.
+              * @see _.reduceRight
+              * @example
+              *
+              * _.reduce([1, 2], function(sum, n) {
+              *   return sum + n;
+              * }, 0);
+              * // => 3
+              *
+              * _.reduce({ 'a': 1, 'b': 2, 'c': 1 }, function(result, value, key) {
+              *   (result[value] || (result[value] = [])).push(key);
+              *   return result;
+              * }, {});
+              * // => { '1': ['a', 'c'], '2': ['b'] } (iteration order is not guaranteed)
+              */
+
+             function reduce(collection, iteratee, accumulator) {
+               var func = isArray(collection) ? arrayReduce : baseReduce,
+                   initAccum = arguments.length < 3;
+               return func(collection, getIteratee(iteratee, 4), accumulator, initAccum, baseEach);
+             }
+             /**
+              * This method is like `_.reduce` except that it iterates over elements of
+              * `collection` from right to left.
+              *
+              * @static
+              * @memberOf _
+              * @since 0.1.0
+              * @category Collection
+              * @param {Array|Object} collection The collection to iterate over.
+              * @param {Function} [iteratee=_.identity] The function invoked per iteration.
+              * @param {*} [accumulator] The initial value.
+              * @returns {*} Returns the accumulated value.
+              * @see _.reduce
+              * @example
+              *
+              * var array = [[0, 1], [2, 3], [4, 5]];
+              *
+              * _.reduceRight(array, function(flattened, other) {
+              *   return flattened.concat(other);
+              * }, []);
+              * // => [4, 5, 2, 3, 0, 1]
+              */
+
+
+             function reduceRight(collection, iteratee, accumulator) {
+               var func = isArray(collection) ? arrayReduceRight : baseReduce,
+                   initAccum = arguments.length < 3;
+               return func(collection, getIteratee(iteratee, 4), accumulator, initAccum, baseEachRight);
+             }
+             /**
+              * The opposite of `_.filter`; this method returns the elements of `collection`
+              * that `predicate` does **not** return truthy for.
+              *
+              * @static
+              * @memberOf _
+              * @since 0.1.0
+              * @category Collection
+              * @param {Array|Object} collection The collection to iterate over.
+              * @param {Function} [predicate=_.identity] The function invoked per iteration.
+              * @returns {Array} Returns the new filtered array.
+              * @see _.filter
+              * @example
+              *
+              * var users = [
+              *   { 'user': 'barney', 'age': 36, 'active': false },
+              *   { 'user': 'fred',   'age': 40, 'active': true }
+              * ];
+              *
+              * _.reject(users, function(o) { return !o.active; });
+              * // => objects for ['fred']
+              *
+              * // The `_.matches` iteratee shorthand.
+              * _.reject(users, { 'age': 40, 'active': true });
+              * // => objects for ['barney']
+              *
+              * // The `_.matchesProperty` iteratee shorthand.
+              * _.reject(users, ['active', false]);
+              * // => objects for ['fred']
+              *
+              * // The `_.property` iteratee shorthand.
+              * _.reject(users, 'active');
+              * // => objects for ['barney']
+              */
+
+
+             function reject(collection, predicate) {
+               var func = isArray(collection) ? arrayFilter : baseFilter;
+               return func(collection, negate(getIteratee(predicate, 3)));
+             }
+             /**
+              * Gets a random element from `collection`.
+              *
+              * @static
+              * @memberOf _
+              * @since 2.0.0
+              * @category Collection
+              * @param {Array|Object} collection The collection to sample.
+              * @returns {*} Returns the random element.
+              * @example
+              *
+              * _.sample([1, 2, 3, 4]);
+              * // => 2
+              */
+
+
+             function sample(collection) {
+               var func = isArray(collection) ? arraySample : baseSample;
+               return func(collection);
+             }
+             /**
+              * Gets `n` random elements at unique keys from `collection` up to the
+              * size of `collection`.
+              *
+              * @static
+              * @memberOf _
+              * @since 4.0.0
+              * @category Collection
+              * @param {Array|Object} collection The collection to sample.
+              * @param {number} [n=1] The number of elements to sample.
+              * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.
+              * @returns {Array} Returns the random elements.
+              * @example
+              *
+              * _.sampleSize([1, 2, 3], 2);
+              * // => [3, 1]
+              *
+              * _.sampleSize([1, 2, 3], 4);
+              * // => [2, 3, 1]
+              */
+
+
+             function sampleSize(collection, n, guard) {
+               if (guard ? isIterateeCall(collection, n, guard) : n === undefined$1) {
+                 n = 1;
+               } else {
+                 n = toInteger(n);
+               }
+
+               var func = isArray(collection) ? arraySampleSize : baseSampleSize;
+               return func(collection, n);
+             }
+             /**
+              * Creates an array of shuffled values, using a version of the
+              * [Fisher-Yates shuffle](https://en.wikipedia.org/wiki/Fisher-Yates_shuffle).
+              *
+              * @static
+              * @memberOf _
+              * @since 0.1.0
+              * @category Collection
+              * @param {Array|Object} collection The collection to shuffle.
+              * @returns {Array} Returns the new shuffled array.
+              * @example
+              *
+              * _.shuffle([1, 2, 3, 4]);
+              * // => [4, 1, 3, 2]
+              */
+
+
+             function shuffle(collection) {
+               var func = isArray(collection) ? arrayShuffle : baseShuffle;
+               return func(collection);
+             }
+             /**
+              * Gets the size of `collection` by returning its length for array-like
+              * values or the number of own enumerable string keyed properties for objects.
+              *
+              * @static
+              * @memberOf _
+              * @since 0.1.0
+              * @category Collection
+              * @param {Array|Object|string} collection The collection to inspect.
+              * @returns {number} Returns the collection size.
+              * @example
+              *
+              * _.size([1, 2, 3]);
+              * // => 3
+              *
+              * _.size({ 'a': 1, 'b': 2 });
+              * // => 2
+              *
+              * _.size('pebbles');
+              * // => 7
+              */
+
+
+             function size(collection) {
+               if (collection == null) {
+                 return 0;
+               }
+
+               if (isArrayLike(collection)) {
+                 return isString(collection) ? stringSize(collection) : collection.length;
+               }
+
+               var tag = getTag(collection);
+
+               if (tag == mapTag || tag == setTag) {
+                 return collection.size;
+               }
+
+               return baseKeys(collection).length;
+             }
+             /**
+              * Checks if `predicate` returns truthy for **any** element of `collection`.
+              * Iteration is stopped once `predicate` returns truthy. The predicate is
+              * invoked with three arguments: (value, index|key, collection).
+              *
+              * @static
+              * @memberOf _
+              * @since 0.1.0
+              * @category Collection
+              * @param {Array|Object} collection The collection to iterate over.
+              * @param {Function} [predicate=_.identity] The function invoked per iteration.
+              * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.
+              * @returns {boolean} Returns `true` if any element passes the predicate check,
+              *  else `false`.
+              * @example
+              *
+              * _.some([null, 0, 'yes', false], Boolean);
+              * // => true
+              *
+              * var users = [
+              *   { 'user': 'barney', 'active': true },
+              *   { 'user': 'fred',   'active': false }
+              * ];
+              *
+              * // The `_.matches` iteratee shorthand.
+              * _.some(users, { 'user': 'barney', 'active': false });
+              * // => false
+              *
+              * // The `_.matchesProperty` iteratee shorthand.
+              * _.some(users, ['active', false]);
+              * // => true
+              *
+              * // The `_.property` iteratee shorthand.
+              * _.some(users, 'active');
+              * // => true
+              */
+
+
+             function some(collection, predicate, guard) {
+               var func = isArray(collection) ? arraySome : baseSome;
+
+               if (guard && isIterateeCall(collection, predicate, guard)) {
+                 predicate = undefined$1;
+               }
+
+               return func(collection, getIteratee(predicate, 3));
+             }
+             /**
+              * Creates an array of elements, sorted in ascending order by the results of
+              * running each element in a collection thru each iteratee. This method
+              * performs a stable sort, that is, it preserves the original sort order of
+              * equal elements. The iteratees are invoked with one argument: (value).
+              *
+              * @static
+              * @memberOf _
+              * @since 0.1.0
+              * @category Collection
+              * @param {Array|Object} collection The collection to iterate over.
+              * @param {...(Function|Function[])} [iteratees=[_.identity]]
+              *  The iteratees to sort by.
+              * @returns {Array} Returns the new sorted array.
+              * @example
+              *
+              * var users = [
+              *   { 'user': 'fred',   'age': 48 },
+              *   { 'user': 'barney', 'age': 36 },
+              *   { 'user': 'fred',   'age': 30 },
+              *   { 'user': 'barney', 'age': 34 }
+              * ];
+              *
+              * _.sortBy(users, [function(o) { return o.user; }]);
+              * // => objects for [['barney', 36], ['barney', 34], ['fred', 48], ['fred', 30]]
+              *
+              * _.sortBy(users, ['user', 'age']);
+              * // => objects for [['barney', 34], ['barney', 36], ['fred', 30], ['fred', 48]]
+              */
+
+
+             var sortBy = baseRest(function (collection, iteratees) {
+               if (collection == null) {
+                 return [];
+               }
+
+               var length = iteratees.length;
+
+               if (length > 1 && isIterateeCall(collection, iteratees[0], iteratees[1])) {
+                 iteratees = [];
+               } else if (length > 2 && isIterateeCall(iteratees[0], iteratees[1], iteratees[2])) {
+                 iteratees = [iteratees[0]];
+               }
+
+               return baseOrderBy(collection, baseFlatten(iteratees, 1), []);
+             });
+             /*------------------------------------------------------------------------*/
+
+             /**
+              * Gets the timestamp of the number of milliseconds that have elapsed since
+              * the Unix epoch (1 January 1970 00:00:00 UTC).
+              *
+              * @static
+              * @memberOf _
+              * @since 2.4.0
+              * @category Date
+              * @returns {number} Returns the timestamp.
+              * @example
+              *
+              * _.defer(function(stamp) {
+              *   console.log(_.now() - stamp);
+              * }, _.now());
+              * // => Logs the number of milliseconds it took for the deferred invocation.
+              */
+
+             var now = ctxNow || function () {
+               return root.Date.now();
+             };
+             /*------------------------------------------------------------------------*/
+
+             /**
+              * The opposite of `_.before`; this method creates a function that invokes
+              * `func` once it's called `n` or more times.
+              *
+              * @static
+              * @memberOf _
+              * @since 0.1.0
+              * @category Function
+              * @param {number} n The number of calls before `func` is invoked.
+              * @param {Function} func The function to restrict.
+              * @returns {Function} Returns the new restricted function.
+              * @example
+              *
+              * var saves = ['profile', 'settings'];
+              *
+              * var done = _.after(saves.length, function() {
+              *   console.log('done saving!');
+              * });
+              *
+              * _.forEach(saves, function(type) {
+              *   asyncSave({ 'type': type, 'complete': done });
+              * });
+              * // => Logs 'done saving!' after the two async saves have completed.
+              */
+
+
+             function after(n, func) {
+               if (typeof func != 'function') {
+                 throw new TypeError(FUNC_ERROR_TEXT);
+               }
+
+               n = toInteger(n);
+               return function () {
+                 if (--n < 1) {
+                   return func.apply(this, arguments);
+                 }
+               };
+             }
+             /**
+              * Creates a function that invokes `func`, with up to `n` arguments,
+              * ignoring any additional arguments.
+              *
+              * @static
+              * @memberOf _
+              * @since 3.0.0
+              * @category Function
+              * @param {Function} func The function to cap arguments for.
+              * @param {number} [n=func.length] The arity cap.
+              * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.
+              * @returns {Function} Returns the new capped function.
+              * @example
+              *
+              * _.map(['6', '8', '10'], _.ary(parseInt, 1));
+              * // => [6, 8, 10]
+              */
+
+
+             function ary(func, n, guard) {
+               n = guard ? undefined$1 : n;
+               n = func && n == null ? func.length : n;
+               return createWrap(func, WRAP_ARY_FLAG, undefined$1, undefined$1, undefined$1, undefined$1, n);
+             }
+             /**
+              * Creates a function that invokes `func`, with the `this` binding and arguments
+              * of the created function, while it's called less than `n` times. Subsequent
+              * calls to the created function return the result of the last `func` invocation.
+              *
+              * @static
+              * @memberOf _
+              * @since 3.0.0
+              * @category Function
+              * @param {number} n The number of calls at which `func` is no longer invoked.
+              * @param {Function} func The function to restrict.
+              * @returns {Function} Returns the new restricted function.
+              * @example
+              *
+              * jQuery(element).on('click', _.before(5, addContactToList));
+              * // => Allows adding up to 4 contacts to the list.
+              */
+
+
+             function before(n, func) {
+               var result;
+
+               if (typeof func != 'function') {
+                 throw new TypeError(FUNC_ERROR_TEXT);
+               }
+
+               n = toInteger(n);
+               return function () {
+                 if (--n > 0) {
+                   result = func.apply(this, arguments);
+                 }
+
+                 if (n <= 1) {
+                   func = undefined$1;
+                 }
+
+                 return result;
+               };
+             }
+             /**
+              * Creates a function that invokes `func` with the `this` binding of `thisArg`
+              * and `partials` prepended to the arguments it receives.
+              *
+              * The `_.bind.placeholder` value, which defaults to `_` in monolithic builds,
+              * may be used as a placeholder for partially applied arguments.
+              *
+              * **Note:** Unlike native `Function#bind`, this method doesn't set the "length"
+              * property of bound functions.
+              *
+              * @static
+              * @memberOf _
+              * @since 0.1.0
+              * @category Function
+              * @param {Function} func The function to bind.
+              * @param {*} thisArg The `this` binding of `func`.
+              * @param {...*} [partials] The arguments to be partially applied.
+              * @returns {Function} Returns the new bound function.
+              * @example
+              *
+              * function greet(greeting, punctuation) {
+              *   return greeting + ' ' + this.user + punctuation;
+              * }
+              *
+              * var object = { 'user': 'fred' };
+              *
+              * var bound = _.bind(greet, object, 'hi');
+              * bound('!');
+              * // => 'hi fred!'
+              *
+              * // Bound with placeholders.
+              * var bound = _.bind(greet, object, _, '!');
+              * bound('hi');
+              * // => 'hi fred!'
+              */
+
+
+             var bind = baseRest(function (func, thisArg, partials) {
+               var bitmask = WRAP_BIND_FLAG;
+
+               if (partials.length) {
+                 var holders = replaceHolders(partials, getHolder(bind));
+                 bitmask |= WRAP_PARTIAL_FLAG;
+               }
+
+               return createWrap(func, bitmask, thisArg, partials, holders);
+             });
+             /**
+              * Creates a function that invokes the method at `object[key]` with `partials`
+              * prepended to the arguments it receives.
+              *
+              * This method differs from `_.bind` by allowing bound functions to reference
+              * methods that may be redefined or don't yet exist. See
+              * [Peter Michaux's article](http://peter.michaux.ca/articles/lazy-function-definition-pattern)
+              * for more details.
+              *
+              * The `_.bindKey.placeholder` value, which defaults to `_` in monolithic
+              * builds, may be used as a placeholder for partially applied arguments.
+              *
+              * @static
+              * @memberOf _
+              * @since 0.10.0
+              * @category Function
+              * @param {Object} object The object to invoke the method on.
+              * @param {string} key The key of the method.
+              * @param {...*} [partials] The arguments to be partially applied.
+              * @returns {Function} Returns the new bound function.
+              * @example
+              *
+              * var object = {
+              *   'user': 'fred',
+              *   'greet': function(greeting, punctuation) {
+              *     return greeting + ' ' + this.user + punctuation;
+              *   }
+              * };
+              *
+              * var bound = _.bindKey(object, 'greet', 'hi');
+              * bound('!');
+              * // => 'hi fred!'
+              *
+              * object.greet = function(greeting, punctuation) {
+              *   return greeting + 'ya ' + this.user + punctuation;
+              * };
+              *
+              * bound('!');
+              * // => 'hiya fred!'
+              *
+              * // Bound with placeholders.
+              * var bound = _.bindKey(object, 'greet', _, '!');
+              * bound('hi');
+              * // => 'hiya fred!'
+              */
+
+             var bindKey = baseRest(function (object, key, partials) {
+               var bitmask = WRAP_BIND_FLAG | WRAP_BIND_KEY_FLAG;
+
+               if (partials.length) {
+                 var holders = replaceHolders(partials, getHolder(bindKey));
+                 bitmask |= WRAP_PARTIAL_FLAG;
+               }
+
+               return createWrap(key, bitmask, object, partials, holders);
+             });
+             /**
+              * Creates a function that accepts arguments of `func` and either invokes
+              * `func` returning its result, if at least `arity` number of arguments have
+              * been provided, or returns a function that accepts the remaining `func`
+              * arguments, and so on. The arity of `func` may be specified if `func.length`
+              * is not sufficient.
+              *
+              * The `_.curry.placeholder` value, which defaults to `_` in monolithic builds,
+              * may be used as a placeholder for provided arguments.
+              *
+              * **Note:** This method doesn't set the "length" property of curried functions.
+              *
+              * @static
+              * @memberOf _
+              * @since 2.0.0
+              * @category Function
+              * @param {Function} func The function to curry.
+              * @param {number} [arity=func.length] The arity of `func`.
+              * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.
+              * @returns {Function} Returns the new curried function.
+              * @example
+              *
+              * var abc = function(a, b, c) {
+              *   return [a, b, c];
+              * };
+              *
+              * var curried = _.curry(abc);
+              *
+              * curried(1)(2)(3);
+              * // => [1, 2, 3]
+              *
+              * curried(1, 2)(3);
+              * // => [1, 2, 3]
+              *
+              * curried(1, 2, 3);
+              * // => [1, 2, 3]
+              *
+              * // Curried with placeholders.
+              * curried(1)(_, 3)(2);
+              * // => [1, 2, 3]
+              */
+
+             function curry(func, arity, guard) {
+               arity = guard ? undefined$1 : arity;
+               var result = createWrap(func, WRAP_CURRY_FLAG, undefined$1, undefined$1, undefined$1, undefined$1, undefined$1, arity);
+               result.placeholder = curry.placeholder;
+               return result;
+             }
+             /**
+              * This method is like `_.curry` except that arguments are applied to `func`
+              * in the manner of `_.partialRight` instead of `_.partial`.
+              *
+              * The `_.curryRight.placeholder` value, which defaults to `_` in monolithic
+              * builds, may be used as a placeholder for provided arguments.
+              *
+              * **Note:** This method doesn't set the "length" property of curried functions.
+              *
+              * @static
+              * @memberOf _
+              * @since 3.0.0
+              * @category Function
+              * @param {Function} func The function to curry.
+              * @param {number} [arity=func.length] The arity of `func`.
+              * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.
+              * @returns {Function} Returns the new curried function.
+              * @example
+              *
+              * var abc = function(a, b, c) {
+              *   return [a, b, c];
+              * };
+              *
+              * var curried = _.curryRight(abc);
+              *
+              * curried(3)(2)(1);
+              * // => [1, 2, 3]
+              *
+              * curried(2, 3)(1);
+              * // => [1, 2, 3]
+              *
+              * curried(1, 2, 3);
+              * // => [1, 2, 3]
+              *
+              * // Curried with placeholders.
+              * curried(3)(1, _)(2);
+              * // => [1, 2, 3]
+              */
+
+
+             function curryRight(func, arity, guard) {
+               arity = guard ? undefined$1 : arity;
+               var result = createWrap(func, WRAP_CURRY_RIGHT_FLAG, undefined$1, undefined$1, undefined$1, undefined$1, undefined$1, arity);
+               result.placeholder = curryRight.placeholder;
+               return result;
+             }
+             /**
+              * Creates a debounced function that delays invoking `func` until after `wait`
+              * milliseconds have elapsed since the last time the debounced function was
+              * invoked. The debounced function comes with a `cancel` method to cancel
+              * delayed `func` invocations and a `flush` method to immediately invoke them.
+              * Provide `options` to indicate whether `func` should be invoked on the
+              * leading and/or trailing edge of the `wait` timeout. The `func` is invoked
+              * with the last arguments provided to the debounced function. Subsequent
+              * calls to the debounced function return the result of the last `func`
+              * invocation.
+              *
+              * **Note:** If `leading` and `trailing` options are `true`, `func` is
+              * invoked on the trailing edge of the timeout only if the debounced function
+              * is invoked more than once during the `wait` timeout.
+              *
+              * If `wait` is `0` and `leading` is `false`, `func` invocation is deferred
+              * until to the next tick, similar to `setTimeout` with a timeout of `0`.
+              *
+              * See [David Corbacho's article](https://css-tricks.com/debouncing-throttling-explained-examples/)
+              * for details over the differences between `_.debounce` and `_.throttle`.
+              *
+              * @static
+              * @memberOf _
+              * @since 0.1.0
+              * @category Function
+              * @param {Function} func The function to debounce.
+              * @param {number} [wait=0] The number of milliseconds to delay.
+              * @param {Object} [options={}] The options object.
+              * @param {boolean} [options.leading=false]
+              *  Specify invoking on the leading edge of the timeout.
+              * @param {number} [options.maxWait]
+              *  The maximum time `func` is allowed to be delayed before it's invoked.
+              * @param {boolean} [options.trailing=true]
+              *  Specify invoking on the trailing edge of the timeout.
+              * @returns {Function} Returns the new debounced function.
+              * @example
+              *
+              * // Avoid costly calculations while the window size is in flux.
+              * jQuery(window).on('resize', _.debounce(calculateLayout, 150));
+              *
+              * // Invoke `sendMail` when clicked, debouncing subsequent calls.
+              * jQuery(element).on('click', _.debounce(sendMail, 300, {
+              *   'leading': true,
+              *   'trailing': false
+              * }));
+              *
+              * // Ensure `batchLog` is invoked once after 1 second of debounced calls.
+              * var debounced = _.debounce(batchLog, 250, { 'maxWait': 1000 });
+              * var source = new EventSource('/stream');
+              * jQuery(source).on('message', debounced);
+              *
+              * // Cancel the trailing debounced invocation.
+              * jQuery(window).on('popstate', debounced.cancel);
+              */
+
+
+             function debounce(func, wait, options) {
+               var lastArgs,
+                   lastThis,
+                   maxWait,
+                   result,
+                   timerId,
+                   lastCallTime,
+                   lastInvokeTime = 0,
+                   leading = false,
+                   maxing = false,
+                   trailing = true;
+
+               if (typeof func != 'function') {
+                 throw new TypeError(FUNC_ERROR_TEXT);
+               }
+
+               wait = toNumber(wait) || 0;
+
+               if (isObject(options)) {
+                 leading = !!options.leading;
+                 maxing = 'maxWait' in options;
+                 maxWait = maxing ? nativeMax(toNumber(options.maxWait) || 0, wait) : maxWait;
+                 trailing = 'trailing' in options ? !!options.trailing : trailing;
+               }
+
+               function invokeFunc(time) {
+                 var args = lastArgs,
+                     thisArg = lastThis;
+                 lastArgs = lastThis = undefined$1;
+                 lastInvokeTime = time;
+                 result = func.apply(thisArg, args);
+                 return result;
+               }
+
+               function leadingEdge(time) {
+                 // Reset any `maxWait` timer.
+                 lastInvokeTime = time; // Start the timer for the trailing edge.
+
+                 timerId = setTimeout(timerExpired, wait); // Invoke the leading edge.
+
+                 return leading ? invokeFunc(time) : result;
+               }
+
+               function remainingWait(time) {
+                 var timeSinceLastCall = time - lastCallTime,
+                     timeSinceLastInvoke = time - lastInvokeTime,
+                     timeWaiting = wait - timeSinceLastCall;
+                 return maxing ? nativeMin(timeWaiting, maxWait - timeSinceLastInvoke) : timeWaiting;
+               }
+
+               function shouldInvoke(time) {
+                 var timeSinceLastCall = time - lastCallTime,
+                     timeSinceLastInvoke = time - lastInvokeTime; // Either this is the first call, activity has stopped and we're at the
+                 // trailing edge, the system time has gone backwards and we're treating
+                 // it as the trailing edge, or we've hit the `maxWait` limit.
+
+                 return lastCallTime === undefined$1 || timeSinceLastCall >= wait || timeSinceLastCall < 0 || maxing && timeSinceLastInvoke >= maxWait;
+               }
+
+               function timerExpired() {
+                 var time = now();
+
+                 if (shouldInvoke(time)) {
+                   return trailingEdge(time);
+                 } // Restart the timer.
+
+
+                 timerId = setTimeout(timerExpired, remainingWait(time));
+               }
+
+               function trailingEdge(time) {
+                 timerId = undefined$1; // Only invoke if we have `lastArgs` which means `func` has been
+                 // debounced at least once.
+
+                 if (trailing && lastArgs) {
+                   return invokeFunc(time);
+                 }
+
+                 lastArgs = lastThis = undefined$1;
+                 return result;
+               }
+
+               function cancel() {
+                 if (timerId !== undefined$1) {
+                   clearTimeout(timerId);
+                 }
+
+                 lastInvokeTime = 0;
+                 lastArgs = lastCallTime = lastThis = timerId = undefined$1;
+               }
+
+               function flush() {
+                 return timerId === undefined$1 ? result : trailingEdge(now());
+               }
+
+               function debounced() {
+                 var time = now(),
+                     isInvoking = shouldInvoke(time);
+                 lastArgs = arguments;
+                 lastThis = this;
+                 lastCallTime = time;
+
+                 if (isInvoking) {
+                   if (timerId === undefined$1) {
+                     return leadingEdge(lastCallTime);
+                   }
+
+                   if (maxing) {
+                     // Handle invocations in a tight loop.
+                     clearTimeout(timerId);
+                     timerId = setTimeout(timerExpired, wait);
+                     return invokeFunc(lastCallTime);
+                   }
+                 }
+
+                 if (timerId === undefined$1) {
+                   timerId = setTimeout(timerExpired, wait);
+                 }
+
+                 return result;
+               }
+
+               debounced.cancel = cancel;
+               debounced.flush = flush;
+               return debounced;
+             }
+             /**
+              * Defers invoking the `func` until the current call stack has cleared. Any
+              * additional arguments are provided to `func` when it's invoked.
+              *
+              * @static
+              * @memberOf _
+              * @since 0.1.0
+              * @category Function
+              * @param {Function} func The function to defer.
+              * @param {...*} [args] The arguments to invoke `func` with.
+              * @returns {number} Returns the timer id.
+              * @example
+              *
+              * _.defer(function(text) {
+              *   console.log(text);
+              * }, 'deferred');
+              * // => Logs 'deferred' after one millisecond.
+              */
+
+
+             var defer = baseRest(function (func, args) {
+               return baseDelay(func, 1, args);
+             });
+             /**
+              * Invokes `func` after `wait` milliseconds. Any additional arguments are
+              * provided to `func` when it's invoked.
+              *
+              * @static
+              * @memberOf _
+              * @since 0.1.0
+              * @category Function
+              * @param {Function} func The function to delay.
+              * @param {number} wait The number of milliseconds to delay invocation.
+              * @param {...*} [args] The arguments to invoke `func` with.
+              * @returns {number} Returns the timer id.
+              * @example
+              *
+              * _.delay(function(text) {
+              *   console.log(text);
+              * }, 1000, 'later');
+              * // => Logs 'later' after one second.
+              */
+
+             var delay = baseRest(function (func, wait, args) {
+               return baseDelay(func, toNumber(wait) || 0, args);
+             });
+             /**
+              * Creates a function that invokes `func` with arguments reversed.
+              *
+              * @static
+              * @memberOf _
+              * @since 4.0.0
+              * @category Function
+              * @param {Function} func The function to flip arguments for.
+              * @returns {Function} Returns the new flipped function.
+              * @example
+              *
+              * var flipped = _.flip(function() {
+              *   return _.toArray(arguments);
+              * });
+              *
+              * flipped('a', 'b', 'c', 'd');
+              * // => ['d', 'c', 'b', 'a']
+              */
+
+             function flip(func) {
+               return createWrap(func, WRAP_FLIP_FLAG);
+             }
+             /**
+              * Creates a function that memoizes the result of `func`. If `resolver` is
+              * provided, it determines the cache key for storing the result based on the
+              * arguments provided to the memoized function. By default, the first argument
+              * provided to the memoized function is used as the map cache key. The `func`
+              * is invoked with the `this` binding of the memoized function.
+              *
+              * **Note:** The cache is exposed as the `cache` property on the memoized
+              * function. Its creation may be customized by replacing the `_.memoize.Cache`
+              * constructor with one whose instances implement the
+              * [`Map`](http://ecma-international.org/ecma-262/7.0/#sec-properties-of-the-map-prototype-object)
+              * method interface of `clear`, `delete`, `get`, `has`, and `set`.
+              *
+              * @static
+              * @memberOf _
+              * @since 0.1.0
+              * @category Function
+              * @param {Function} func The function to have its output memoized.
+              * @param {Function} [resolver] The function to resolve the cache key.
+              * @returns {Function} Returns the new memoized function.
+              * @example
+              *
+              * var object = { 'a': 1, 'b': 2 };
+              * var other = { 'c': 3, 'd': 4 };
+              *
+              * var values = _.memoize(_.values);
+              * values(object);
+              * // => [1, 2]
+              *
+              * values(other);
+              * // => [3, 4]
+              *
+              * object.a = 2;
+              * values(object);
+              * // => [1, 2]
+              *
+              * // Modify the result cache.
+              * values.cache.set(object, ['a', 'b']);
+              * values(object);
+              * // => ['a', 'b']
+              *
+              * // Replace `_.memoize.Cache`.
+              * _.memoize.Cache = WeakMap;
+              */
+
+
+             function memoize(func, resolver) {
+               if (typeof func != 'function' || resolver != null && typeof resolver != 'function') {
+                 throw new TypeError(FUNC_ERROR_TEXT);
+               }
+
+               var memoized = function memoized() {
+                 var args = arguments,
+                     key = resolver ? resolver.apply(this, args) : args[0],
+                     cache = memoized.cache;
+
+                 if (cache.has(key)) {
+                   return cache.get(key);
+                 }
+
+                 var result = func.apply(this, args);
+                 memoized.cache = cache.set(key, result) || cache;
+                 return result;
+               };
+
+               memoized.cache = new (memoize.Cache || MapCache)();
+               return memoized;
+             } // Expose `MapCache`.
+
+
+             memoize.Cache = MapCache;
+             /**
+              * Creates a function that negates the result of the predicate `func`. The
+              * `func` predicate is invoked with the `this` binding and arguments of the
+              * created function.
+              *
+              * @static
+              * @memberOf _
+              * @since 3.0.0
+              * @category Function
+              * @param {Function} predicate The predicate to negate.
+              * @returns {Function} Returns the new negated function.
+              * @example
+              *
+              * function isEven(n) {
+              *   return n % 2 == 0;
+              * }
+              *
+              * _.filter([1, 2, 3, 4, 5, 6], _.negate(isEven));
+              * // => [1, 3, 5]
+              */
+
+             function negate(predicate) {
+               if (typeof predicate != 'function') {
+                 throw new TypeError(FUNC_ERROR_TEXT);
+               }
+
+               return function () {
+                 var args = arguments;
+
+                 switch (args.length) {
+                   case 0:
+                     return !predicate.call(this);
+
+                   case 1:
+                     return !predicate.call(this, args[0]);
+
+                   case 2:
+                     return !predicate.call(this, args[0], args[1]);
+
+                   case 3:
+                     return !predicate.call(this, args[0], args[1], args[2]);
+                 }
+
+                 return !predicate.apply(this, args);
+               };
+             }
+             /**
+              * Creates a function that is restricted to invoking `func` once. Repeat calls
+              * to the function return the value of the first invocation. The `func` is
+              * invoked with the `this` binding and arguments of the created function.
+              *
+              * @static
+              * @memberOf _
+              * @since 0.1.0
+              * @category Function
+              * @param {Function} func The function to restrict.
+              * @returns {Function} Returns the new restricted function.
+              * @example
+              *
+              * var initialize = _.once(createApplication);
+              * initialize();
+              * initialize();
+              * // => `createApplication` is invoked once
+              */
+
+
+             function once(func) {
+               return before(2, func);
+             }
+             /**
+              * Creates a function that invokes `func` with its arguments transformed.
+              *
+              * @static
+              * @since 4.0.0
+              * @memberOf _
+              * @category Function
+              * @param {Function} func The function to wrap.
+              * @param {...(Function|Function[])} [transforms=[_.identity]]
+              *  The argument transforms.
+              * @returns {Function} Returns the new function.
+              * @example
+              *
+              * function doubled(n) {
+              *   return n * 2;
+              * }
+              *
+              * function square(n) {
+              *   return n * n;
+              * }
+              *
+              * var func = _.overArgs(function(x, y) {
+              *   return [x, y];
+              * }, [square, doubled]);
+              *
+              * func(9, 3);
+              * // => [81, 6]
+              *
+              * func(10, 5);
+              * // => [100, 10]
+              */
+
+
+             var overArgs = castRest(function (func, transforms) {
+               transforms = transforms.length == 1 && isArray(transforms[0]) ? arrayMap(transforms[0], baseUnary(getIteratee())) : arrayMap(baseFlatten(transforms, 1), baseUnary(getIteratee()));
+               var funcsLength = transforms.length;
+               return baseRest(function (args) {
+                 var index = -1,
+                     length = nativeMin(args.length, funcsLength);
+
+                 while (++index < length) {
+                   args[index] = transforms[index].call(this, args[index]);
+                 }
+
+                 return apply(func, this, args);
+               });
+             });
+             /**
+              * Creates a function that invokes `func` with `partials` prepended to the
+              * arguments it receives. This method is like `_.bind` except it does **not**
+              * alter the `this` binding.
+              *
+              * The `_.partial.placeholder` value, which defaults to `_` in monolithic
+              * builds, may be used as a placeholder for partially applied arguments.
+              *
+              * **Note:** This method doesn't set the "length" property of partially
+              * applied functions.
+              *
+              * @static
+              * @memberOf _
+              * @since 0.2.0
+              * @category Function
+              * @param {Function} func The function to partially apply arguments to.
+              * @param {...*} [partials] The arguments to be partially applied.
+              * @returns {Function} Returns the new partially applied function.
+              * @example
+              *
+              * function greet(greeting, name) {
+              *   return greeting + ' ' + name;
+              * }
+              *
+              * var sayHelloTo = _.partial(greet, 'hello');
+              * sayHelloTo('fred');
+              * // => 'hello fred'
+              *
+              * // Partially applied with placeholders.
+              * var greetFred = _.partial(greet, _, 'fred');
+              * greetFred('hi');
+              * // => 'hi fred'
+              */
+
+             var partial = baseRest(function (func, partials) {
+               var holders = replaceHolders(partials, getHolder(partial));
+               return createWrap(func, WRAP_PARTIAL_FLAG, undefined$1, partials, holders);
+             });
+             /**
+              * This method is like `_.partial` except that partially applied arguments
+              * are appended to the arguments it receives.
+              *
+              * The `_.partialRight.placeholder` value, which defaults to `_` in monolithic
+              * builds, may be used as a placeholder for partially applied arguments.
+              *
+              * **Note:** This method doesn't set the "length" property of partially
+              * applied functions.
+              *
+              * @static
+              * @memberOf _
+              * @since 1.0.0
+              * @category Function
+              * @param {Function} func The function to partially apply arguments to.
+              * @param {...*} [partials] The arguments to be partially applied.
+              * @returns {Function} Returns the new partially applied function.
+              * @example
+              *
+              * function greet(greeting, name) {
+              *   return greeting + ' ' + name;
+              * }
+              *
+              * var greetFred = _.partialRight(greet, 'fred');
+              * greetFred('hi');
+              * // => 'hi fred'
+              *
+              * // Partially applied with placeholders.
+              * var sayHelloTo = _.partialRight(greet, 'hello', _);
+              * sayHelloTo('fred');
+              * // => 'hello fred'
+              */
+
+             var partialRight = baseRest(function (func, partials) {
+               var holders = replaceHolders(partials, getHolder(partialRight));
+               return createWrap(func, WRAP_PARTIAL_RIGHT_FLAG, undefined$1, partials, holders);
+             });
+             /**
+              * Creates a function that invokes `func` with arguments arranged according
+              * to the specified `indexes` where the argument value at the first index is
+              * provided as the first argument, the argument value at the second index is
+              * provided as the second argument, and so on.
+              *
+              * @static
+              * @memberOf _
+              * @since 3.0.0
+              * @category Function
+              * @param {Function} func The function to rearrange arguments for.
+              * @param {...(number|number[])} indexes The arranged argument indexes.
+              * @returns {Function} Returns the new function.
+              * @example
+              *
+              * var rearged = _.rearg(function(a, b, c) {
+              *   return [a, b, c];
+              * }, [2, 0, 1]);
+              *
+              * rearged('b', 'c', 'a')
+              * // => ['a', 'b', 'c']
+              */
+
+             var rearg = flatRest(function (func, indexes) {
+               return createWrap(func, WRAP_REARG_FLAG, undefined$1, undefined$1, undefined$1, indexes);
+             });
+             /**
+              * Creates a function that invokes `func` with the `this` binding of the
+              * created function and arguments from `start` and beyond provided as
+              * an array.
+              *
+              * **Note:** This method is based on the
+              * [rest parameter](https://mdn.io/rest_parameters).
+              *
+              * @static
+              * @memberOf _
+              * @since 4.0.0
+              * @category Function
+              * @param {Function} func The function to apply a rest parameter to.
+              * @param {number} [start=func.length-1] The start position of the rest parameter.
+              * @returns {Function} Returns the new function.
+              * @example
+              *
+              * var say = _.rest(function(what, names) {
+              *   return what + ' ' + _.initial(names).join(', ') +
+              *     (_.size(names) > 1 ? ', & ' : '') + _.last(names);
+              * });
+              *
+              * say('hello', 'fred', 'barney', 'pebbles');
+              * // => 'hello fred, barney, & pebbles'
+              */
+
+             function rest(func, start) {
+               if (typeof func != 'function') {
+                 throw new TypeError(FUNC_ERROR_TEXT);
+               }
+
+               start = start === undefined$1 ? start : toInteger(start);
+               return baseRest(func, start);
+             }
+             /**
+              * Creates a function that invokes `func` with the `this` binding of the
+              * create function and an array of arguments much like
+              * [`Function#apply`](http://www.ecma-international.org/ecma-262/7.0/#sec-function.prototype.apply).
+              *
+              * **Note:** This method is based on the
+              * [spread operator](https://mdn.io/spread_operator).
+              *
+              * @static
+              * @memberOf _
+              * @since 3.2.0
+              * @category Function
+              * @param {Function} func The function to spread arguments over.
+              * @param {number} [start=0] The start position of the spread.
+              * @returns {Function} Returns the new function.
+              * @example
+              *
+              * var say = _.spread(function(who, what) {
+              *   return who + ' says ' + what;
+              * });
+              *
+              * say(['fred', 'hello']);
+              * // => 'fred says hello'
+              *
+              * var numbers = Promise.all([
+              *   Promise.resolve(40),
+              *   Promise.resolve(36)
+              * ]);
+              *
+              * numbers.then(_.spread(function(x, y) {
+              *   return x + y;
+              * }));
+              * // => a Promise of 76
+              */
+
+
+             function spread(func, start) {
+               if (typeof func != 'function') {
+                 throw new TypeError(FUNC_ERROR_TEXT);
+               }
+
+               start = start == null ? 0 : nativeMax(toInteger(start), 0);
+               return baseRest(function (args) {
+                 var array = args[start],
+                     otherArgs = castSlice(args, 0, start);
+
+                 if (array) {
+                   arrayPush(otherArgs, array);
+                 }
+
+                 return apply(func, this, otherArgs);
+               });
+             }
+             /**
+              * Creates a throttled function that only invokes `func` at most once per
+              * every `wait` milliseconds. The throttled function comes with a `cancel`
+              * method to cancel delayed `func` invocations and a `flush` method to
+              * immediately invoke them. Provide `options` to indicate whether `func`
+              * should be invoked on the leading and/or trailing edge of the `wait`
+              * timeout. The `func` is invoked with the last arguments provided to the
+              * throttled function. Subsequent calls to the throttled function return the
+              * result of the last `func` invocation.
+              *
+              * **Note:** If `leading` and `trailing` options are `true`, `func` is
+              * invoked on the trailing edge of the timeout only if the throttled function
+              * is invoked more than once during the `wait` timeout.
+              *
+              * If `wait` is `0` and `leading` is `false`, `func` invocation is deferred
+              * until to the next tick, similar to `setTimeout` with a timeout of `0`.
+              *
+              * See [David Corbacho's article](https://css-tricks.com/debouncing-throttling-explained-examples/)
+              * for details over the differences between `_.throttle` and `_.debounce`.
+              *
+              * @static
+              * @memberOf _
+              * @since 0.1.0
+              * @category Function
+              * @param {Function} func The function to throttle.
+              * @param {number} [wait=0] The number of milliseconds to throttle invocations to.
+              * @param {Object} [options={}] The options object.
+              * @param {boolean} [options.leading=true]
+              *  Specify invoking on the leading edge of the timeout.
+              * @param {boolean} [options.trailing=true]
+              *  Specify invoking on the trailing edge of the timeout.
+              * @returns {Function} Returns the new throttled function.
+              * @example
+              *
+              * // Avoid excessively updating the position while scrolling.
+              * jQuery(window).on('scroll', _.throttle(updatePosition, 100));
+              *
+              * // Invoke `renewToken` when the click event is fired, but not more than once every 5 minutes.
+              * var throttled = _.throttle(renewToken, 300000, { 'trailing': false });
+              * jQuery(element).on('click', throttled);
+              *
+              * // Cancel the trailing throttled invocation.
+              * jQuery(window).on('popstate', throttled.cancel);
+              */
+
+
+             function throttle(func, wait, options) {
+               var leading = true,
+                   trailing = true;
+
+               if (typeof func != 'function') {
+                 throw new TypeError(FUNC_ERROR_TEXT);
+               }
+
+               if (isObject(options)) {
+                 leading = 'leading' in options ? !!options.leading : leading;
+                 trailing = 'trailing' in options ? !!options.trailing : trailing;
+               }
+
+               return debounce(func, wait, {
+                 'leading': leading,
+                 'maxWait': wait,
+                 'trailing': trailing
+               });
+             }
+             /**
+              * Creates a function that accepts up to one argument, ignoring any
+              * additional arguments.
+              *
+              * @static
+              * @memberOf _
+              * @since 4.0.0
+              * @category Function
+              * @param {Function} func The function to cap arguments for.
+              * @returns {Function} Returns the new capped function.
+              * @example
+              *
+              * _.map(['6', '8', '10'], _.unary(parseInt));
+              * // => [6, 8, 10]
+              */
+
+
+             function unary(func) {
+               return ary(func, 1);
+             }
+             /**
+              * Creates a function that provides `value` to `wrapper` as its first
+              * argument. Any additional arguments provided to the function are appended
+              * to those provided to the `wrapper`. The wrapper is invoked with the `this`
+              * binding of the created function.
+              *
+              * @static
+              * @memberOf _
+              * @since 0.1.0
+              * @category Function
+              * @param {*} value The value to wrap.
+              * @param {Function} [wrapper=identity] The wrapper function.
+              * @returns {Function} Returns the new function.
+              * @example
+              *
+              * var p = _.wrap(_.escape, function(func, text) {
+              *   return '<p>' + func(text) + '</p>';
+              * });
+              *
+              * p('fred, barney, & pebbles');
+              * // => '<p>fred, barney, &amp; pebbles</p>'
+              */
+
+
+             function wrap(value, wrapper) {
+               return partial(castFunction(wrapper), value);
+             }
+             /*------------------------------------------------------------------------*/
+
+             /**
+              * Casts `value` as an array if it's not one.
+              *
+              * @static
+              * @memberOf _
+              * @since 4.4.0
+              * @category Lang
+              * @param {*} value The value to inspect.
+              * @returns {Array} Returns the cast array.
+              * @example
+              *
+              * _.castArray(1);
+              * // => [1]
+              *
+              * _.castArray({ 'a': 1 });
+              * // => [{ 'a': 1 }]
+              *
+              * _.castArray('abc');
+              * // => ['abc']
+              *
+              * _.castArray(null);
+              * // => [null]
+              *
+              * _.castArray(undefined);
+              * // => [undefined]
+              *
+              * _.castArray();
+              * // => []
+              *
+              * var array = [1, 2, 3];
+              * console.log(_.castArray(array) === array);
+              * // => true
+              */
+
+
+             function castArray() {
+               if (!arguments.length) {
+                 return [];
+               }
+
+               var value = arguments[0];
+               return isArray(value) ? value : [value];
+             }
+             /**
+              * Creates a shallow clone of `value`.
+              *
+              * **Note:** This method is loosely based on the
+              * [structured clone algorithm](https://mdn.io/Structured_clone_algorithm)
+              * and supports cloning arrays, array buffers, booleans, date objects, maps,
+              * numbers, `Object` objects, regexes, sets, strings, symbols, and typed
+              * arrays. The own enumerable properties of `arguments` objects are cloned
+              * as plain objects. An empty object is returned for uncloneable values such
+              * as error objects, functions, DOM nodes, and WeakMaps.
+              *
+              * @static
+              * @memberOf _
+              * @since 0.1.0
+              * @category Lang
+              * @param {*} value The value to clone.
+              * @returns {*} Returns the cloned value.
+              * @see _.cloneDeep
+              * @example
+              *
+              * var objects = [{ 'a': 1 }, { 'b': 2 }];
+              *
+              * var shallow = _.clone(objects);
+              * console.log(shallow[0] === objects[0]);
+              * // => true
+              */
+
+
+             function clone(value) {
+               return baseClone(value, CLONE_SYMBOLS_FLAG);
+             }
+             /**
+              * This method is like `_.clone` except that it accepts `customizer` which
+              * is invoked to produce the cloned value. If `customizer` returns `undefined`,
+              * cloning is handled by the method instead. The `customizer` is invoked with
+              * up to four arguments; (value [, index|key, object, stack]).
+              *
+              * @static
+              * @memberOf _
+              * @since 4.0.0
+              * @category Lang
+              * @param {*} value The value to clone.
+              * @param {Function} [customizer] The function to customize cloning.
+              * @returns {*} Returns the cloned value.
+              * @see _.cloneDeepWith
+              * @example
+              *
+              * function customizer(value) {
+              *   if (_.isElement(value)) {
+              *     return value.cloneNode(false);
+              *   }
+              * }
+              *
+              * var el = _.cloneWith(document.body, customizer);
+              *
+              * console.log(el === document.body);
+              * // => false
+              * console.log(el.nodeName);
+              * // => 'BODY'
+              * console.log(el.childNodes.length);
+              * // => 0
+              */
+
+
+             function cloneWith(value, customizer) {
+               customizer = typeof customizer == 'function' ? customizer : undefined$1;
+               return baseClone(value, CLONE_SYMBOLS_FLAG, customizer);
+             }
+             /**
+              * This method is like `_.clone` except that it recursively clones `value`.
+              *
+              * @static
+              * @memberOf _
+              * @since 1.0.0
+              * @category Lang
+              * @param {*} value The value to recursively clone.
+              * @returns {*} Returns the deep cloned value.
+              * @see _.clone
+              * @example
+              *
+              * var objects = [{ 'a': 1 }, { 'b': 2 }];
+              *
+              * var deep = _.cloneDeep(objects);
+              * console.log(deep[0] === objects[0]);
+              * // => false
+              */
+
+
+             function cloneDeep(value) {
+               return baseClone(value, CLONE_DEEP_FLAG | CLONE_SYMBOLS_FLAG);
+             }
+             /**
+              * This method is like `_.cloneWith` except that it recursively clones `value`.
+              *
+              * @static
+              * @memberOf _
+              * @since 4.0.0
+              * @category Lang
+              * @param {*} value The value to recursively clone.
+              * @param {Function} [customizer] The function to customize cloning.
+              * @returns {*} Returns the deep cloned value.
+              * @see _.cloneWith
+              * @example
+              *
+              * function customizer(value) {
+              *   if (_.isElement(value)) {
+              *     return value.cloneNode(true);
+              *   }
+              * }
+              *
+              * var el = _.cloneDeepWith(document.body, customizer);
+              *
+              * console.log(el === document.body);
+              * // => false
+              * console.log(el.nodeName);
+              * // => 'BODY'
+              * console.log(el.childNodes.length);
+              * // => 20
+              */
+
+
+             function cloneDeepWith(value, customizer) {
+               customizer = typeof customizer == 'function' ? customizer : undefined$1;
+               return baseClone(value, CLONE_DEEP_FLAG | CLONE_SYMBOLS_FLAG, customizer);
+             }
+             /**
+              * Checks if `object` conforms to `source` by invoking the predicate
+              * properties of `source` with the corresponding property values of `object`.
+              *
+              * **Note:** This method is equivalent to `_.conforms` when `source` is
+              * partially applied.
+              *
+              * @static
+              * @memberOf _
+              * @since 4.14.0
+              * @category Lang
+              * @param {Object} object The object to inspect.
+              * @param {Object} source The object of property predicates to conform to.
+              * @returns {boolean} Returns `true` if `object` conforms, else `false`.
+              * @example
+              *
+              * var object = { 'a': 1, 'b': 2 };
+              *
+              * _.conformsTo(object, { 'b': function(n) { return n > 1; } });
+              * // => true
+              *
+              * _.conformsTo(object, { 'b': function(n) { return n > 2; } });
+              * // => false
+              */
+
+
+             function conformsTo(object, source) {
+               return source == null || baseConformsTo(object, source, keys(source));
+             }
+             /**
+              * Performs a
+              * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)
+              * comparison between two values to determine if they are equivalent.
+              *
+              * @static
+              * @memberOf _
+              * @since 4.0.0
+              * @category Lang
+              * @param {*} value The value to compare.
+              * @param {*} other The other value to compare.
+              * @returns {boolean} Returns `true` if the values are equivalent, else `false`.
+              * @example
+              *
+              * var object = { 'a': 1 };
+              * var other = { 'a': 1 };
+              *
+              * _.eq(object, object);
+              * // => true
+              *
+              * _.eq(object, other);
+              * // => false
+              *
+              * _.eq('a', 'a');
+              * // => true
+              *
+              * _.eq('a', Object('a'));
+              * // => false
+              *
+              * _.eq(NaN, NaN);
+              * // => true
+              */
+
+
+             function eq(value, other) {
+               return value === other || value !== value && other !== other;
+             }
+             /**
+              * Checks if `value` is greater than `other`.
+              *
+              * @static
+              * @memberOf _
+              * @since 3.9.0
+              * @category Lang
+              * @param {*} value The value to compare.
+              * @param {*} other The other value to compare.
+              * @returns {boolean} Returns `true` if `value` is greater than `other`,
+              *  else `false`.
+              * @see _.lt
+              * @example
+              *
+              * _.gt(3, 1);
+              * // => true
+              *
+              * _.gt(3, 3);
+              * // => false
+              *
+              * _.gt(1, 3);
+              * // => false
+              */
+
+
+             var gt = createRelationalOperation(baseGt);
+             /**
+              * Checks if `value` is greater than or equal to `other`.
+              *
+              * @static
+              * @memberOf _
+              * @since 3.9.0
+              * @category Lang
+              * @param {*} value The value to compare.
+              * @param {*} other The other value to compare.
+              * @returns {boolean} Returns `true` if `value` is greater than or equal to
+              *  `other`, else `false`.
+              * @see _.lte
+              * @example
+              *
+              * _.gte(3, 1);
+              * // => true
+              *
+              * _.gte(3, 3);
+              * // => true
+              *
+              * _.gte(1, 3);
+              * // => false
+              */
+
+             var gte = createRelationalOperation(function (value, other) {
+               return value >= other;
+             });
+             /**
+              * Checks if `value` is likely an `arguments` object.
+              *
+              * @static
+              * @memberOf _
+              * @since 0.1.0
+              * @category Lang
+              * @param {*} value The value to check.
+              * @returns {boolean} Returns `true` if `value` is an `arguments` object,
+              *  else `false`.
+              * @example
+              *
+              * _.isArguments(function() { return arguments; }());
+              * // => true
+              *
+              * _.isArguments([1, 2, 3]);
+              * // => false
+              */
+
+             var isArguments = baseIsArguments(function () {
+               return arguments;
+             }()) ? baseIsArguments : function (value) {
+               return isObjectLike(value) && hasOwnProperty.call(value, 'callee') && !propertyIsEnumerable.call(value, 'callee');
+             };
+             /**
+              * Checks if `value` is classified as an `Array` object.
+              *
+              * @static
+              * @memberOf _
+              * @since 0.1.0
+              * @category Lang
+              * @param {*} value The value to check.
+              * @returns {boolean} Returns `true` if `value` is an array, else `false`.
+              * @example
+              *
+              * _.isArray([1, 2, 3]);
+              * // => true
+              *
+              * _.isArray(document.body.children);
+              * // => false
+              *
+              * _.isArray('abc');
+              * // => false
+              *
+              * _.isArray(_.noop);
+              * // => false
+              */
+
+             var isArray = Array.isArray;
+             /**
+              * Checks if `value` is classified as an `ArrayBuffer` object.
+              *
+              * @static
+              * @memberOf _
+              * @since 4.3.0
+              * @category Lang
+              * @param {*} value The value to check.
+              * @returns {boolean} Returns `true` if `value` is an array buffer, else `false`.
+              * @example
+              *
+              * _.isArrayBuffer(new ArrayBuffer(2));
+              * // => true
+              *
+              * _.isArrayBuffer(new Array(2));
+              * // => false
+              */
+
+             var isArrayBuffer = nodeIsArrayBuffer ? baseUnary(nodeIsArrayBuffer) : baseIsArrayBuffer;
+             /**
+              * Checks if `value` is array-like. A value is considered array-like if it's
+              * not a function and has a `value.length` that's an integer greater than or
+              * equal to `0` and less than or equal to `Number.MAX_SAFE_INTEGER`.
+              *
+              * @static
+              * @memberOf _
+              * @since 4.0.0
+              * @category Lang
+              * @param {*} value The value to check.
+              * @returns {boolean} Returns `true` if `value` is array-like, else `false`.
+              * @example
+              *
+              * _.isArrayLike([1, 2, 3]);
+              * // => true
+              *
+              * _.isArrayLike(document.body.children);
+              * // => true
+              *
+              * _.isArrayLike('abc');
+              * // => true
+              *
+              * _.isArrayLike(_.noop);
+              * // => false
+              */
+
+             function isArrayLike(value) {
+               return value != null && isLength(value.length) && !isFunction(value);
+             }
+             /**
+              * This method is like `_.isArrayLike` except that it also checks if `value`
+              * is an object.
+              *
+              * @static
+              * @memberOf _
+              * @since 4.0.0
+              * @category Lang
+              * @param {*} value The value to check.
+              * @returns {boolean} Returns `true` if `value` is an array-like object,
+              *  else `false`.
+              * @example
+              *
+              * _.isArrayLikeObject([1, 2, 3]);
+              * // => true
+              *
+              * _.isArrayLikeObject(document.body.children);
+              * // => true
+              *
+              * _.isArrayLikeObject('abc');
+              * // => false
+              *
+              * _.isArrayLikeObject(_.noop);
+              * // => false
+              */
+
+
+             function isArrayLikeObject(value) {
+               return isObjectLike(value) && isArrayLike(value);
+             }
+             /**
+              * Checks if `value` is classified as a boolean primitive or object.
+              *
+              * @static
+              * @memberOf _
+              * @since 0.1.0
+              * @category Lang
+              * @param {*} value The value to check.
+              * @returns {boolean} Returns `true` if `value` is a boolean, else `false`.
+              * @example
+              *
+              * _.isBoolean(false);
+              * // => true
+              *
+              * _.isBoolean(null);
+              * // => false
+              */
+
+
+             function isBoolean(value) {
+               return value === true || value === false || isObjectLike(value) && baseGetTag(value) == boolTag;
+             }
+             /**
+              * Checks if `value` is a buffer.
+              *
+              * @static
+              * @memberOf _
+              * @since 4.3.0
+              * @category Lang
+              * @param {*} value The value to check.
+              * @returns {boolean} Returns `true` if `value` is a buffer, else `false`.
+              * @example
+              *
+              * _.isBuffer(new Buffer(2));
+              * // => true
+              *
+              * _.isBuffer(new Uint8Array(2));
+              * // => false
+              */
+
+
+             var isBuffer = nativeIsBuffer || stubFalse;
+             /**
+              * Checks if `value` is classified as a `Date` object.
+              *
+              * @static
+              * @memberOf _
+              * @since 0.1.0
+              * @category Lang
+              * @param {*} value The value to check.
+              * @returns {boolean} Returns `true` if `value` is a date object, else `false`.
+              * @example
+              *
+              * _.isDate(new Date);
+              * // => true
+              *
+              * _.isDate('Mon April 23 2012');
+              * // => false
+              */
+
+             var isDate = nodeIsDate ? baseUnary(nodeIsDate) : baseIsDate;
+             /**
+              * Checks if `value` is likely a DOM element.
+              *
+              * @static
+              * @memberOf _
+              * @since 0.1.0
+              * @category Lang
+              * @param {*} value The value to check.
+              * @returns {boolean} Returns `true` if `value` is a DOM element, else `false`.
+              * @example
+              *
+              * _.isElement(document.body);
+              * // => true
+              *
+              * _.isElement('<body>');
+              * // => false
+              */
+
+             function isElement(value) {
+               return isObjectLike(value) && value.nodeType === 1 && !isPlainObject(value);
+             }
+             /**
+              * Checks if `value` is an empty object, collection, map, or set.
+              *
+              * Objects are considered empty if they have no own enumerable string keyed
+              * properties.
+              *
+              * Array-like values such as `arguments` objects, arrays, buffers, strings, or
+              * jQuery-like collections are considered empty if they have a `length` of `0`.
+              * Similarly, maps and sets are considered empty if they have a `size` of `0`.
+              *
+              * @static
+              * @memberOf _
+              * @since 0.1.0
+              * @category Lang
+              * @param {*} value The value to check.
+              * @returns {boolean} Returns `true` if `value` is empty, else `false`.
+              * @example
+              *
+              * _.isEmpty(null);
+              * // => true
+              *
+              * _.isEmpty(true);
+              * // => true
+              *
+              * _.isEmpty(1);
+              * // => true
+              *
+              * _.isEmpty([1, 2, 3]);
+              * // => false
+              *
+              * _.isEmpty({ 'a': 1 });
+              * // => false
+              */
+
+
+             function isEmpty(value) {
+               if (value == null) {
+                 return true;
+               }
+
+               if (isArrayLike(value) && (isArray(value) || typeof value == 'string' || typeof value.splice == 'function' || isBuffer(value) || isTypedArray(value) || isArguments(value))) {
+                 return !value.length;
+               }
+
+               var tag = getTag(value);
+
+               if (tag == mapTag || tag == setTag) {
+                 return !value.size;
+               }
+
+               if (isPrototype(value)) {
+                 return !baseKeys(value).length;
+               }
+
+               for (var key in value) {
+                 if (hasOwnProperty.call(value, key)) {
+                   return false;
+                 }
+               }
+
+               return true;
+             }
+             /**
+              * Performs a deep comparison between two values to determine if they are
+              * equivalent.
+              *
+              * **Note:** This method supports comparing arrays, array buffers, booleans,
+              * date objects, error objects, maps, numbers, `Object` objects, regexes,
+              * sets, strings, symbols, and typed arrays. `Object` objects are compared
+              * by their own, not inherited, enumerable properties. Functions and DOM
+              * nodes are compared by strict equality, i.e. `===`.
+              *
+              * @static
+              * @memberOf _
+              * @since 0.1.0
+              * @category Lang
+              * @param {*} value The value to compare.
+              * @param {*} other The other value to compare.
+              * @returns {boolean} Returns `true` if the values are equivalent, else `false`.
+              * @example
+              *
+              * var object = { 'a': 1 };
+              * var other = { 'a': 1 };
+              *
+              * _.isEqual(object, other);
+              * // => true
+              *
+              * object === other;
+              * // => false
+              */
+
+
+             function isEqual(value, other) {
+               return baseIsEqual(value, other);
+             }
+             /**
+              * This method is like `_.isEqual` except that it accepts `customizer` which
+              * is invoked to compare values. If `customizer` returns `undefined`, comparisons
+              * are handled by the method instead. The `customizer` is invoked with up to
+              * six arguments: (objValue, othValue [, index|key, object, other, stack]).
+              *
+              * @static
+              * @memberOf _
+              * @since 4.0.0
+              * @category Lang
+              * @param {*} value The value to compare.
+              * @param {*} other The other value to compare.
+              * @param {Function} [customizer] The function to customize comparisons.
+              * @returns {boolean} Returns `true` if the values are equivalent, else `false`.
+              * @example
+              *
+              * function isGreeting(value) {
+              *   return /^h(?:i|ello)$/.test(value);
+              * }
+              *
+              * function customizer(objValue, othValue) {
+              *   if (isGreeting(objValue) && isGreeting(othValue)) {
+              *     return true;
+              *   }
+              * }
+              *
+              * var array = ['hello', 'goodbye'];
+              * var other = ['hi', 'goodbye'];
+              *
+              * _.isEqualWith(array, other, customizer);
+              * // => true
+              */
+
+
+             function isEqualWith(value, other, customizer) {
+               customizer = typeof customizer == 'function' ? customizer : undefined$1;
+               var result = customizer ? customizer(value, other) : undefined$1;
+               return result === undefined$1 ? baseIsEqual(value, other, undefined$1, customizer) : !!result;
+             }
+             /**
+              * Checks if `value` is an `Error`, `EvalError`, `RangeError`, `ReferenceError`,
+              * `SyntaxError`, `TypeError`, or `URIError` object.
+              *
+              * @static
+              * @memberOf _
+              * @since 3.0.0
+              * @category Lang
+              * @param {*} value The value to check.
+              * @returns {boolean} Returns `true` if `value` is an error object, else `false`.
+              * @example
+              *
+              * _.isError(new Error);
+              * // => true
+              *
+              * _.isError(Error);
+              * // => false
+              */
+
+
+             function isError(value) {
+               if (!isObjectLike(value)) {
+                 return false;
+               }
+
+               var tag = baseGetTag(value);
+               return tag == errorTag || tag == domExcTag || typeof value.message == 'string' && typeof value.name == 'string' && !isPlainObject(value);
+             }
+             /**
+              * Checks if `value` is a finite primitive number.
+              *
+              * **Note:** This method is based on
+              * [`Number.isFinite`](https://mdn.io/Number/isFinite).
+              *
+              * @static
+              * @memberOf _
+              * @since 0.1.0
+              * @category Lang
+              * @param {*} value The value to check.
+              * @returns {boolean} Returns `true` if `value` is a finite number, else `false`.
+              * @example
+              *
+              * _.isFinite(3);
+              * // => true
+              *
+              * _.isFinite(Number.MIN_VALUE);
+              * // => true
+              *
+              * _.isFinite(Infinity);
+              * // => false
+              *
+              * _.isFinite('3');
+              * // => false
+              */
+
+
+             function isFinite(value) {
+               return typeof value == 'number' && nativeIsFinite(value);
+             }
+             /**
+              * Checks if `value` is classified as a `Function` object.
+              *
+              * @static
+              * @memberOf _
+              * @since 0.1.0
+              * @category Lang
+              * @param {*} value The value to check.
+              * @returns {boolean} Returns `true` if `value` is a function, else `false`.
+              * @example
+              *
+              * _.isFunction(_);
+              * // => true
+              *
+              * _.isFunction(/abc/);
+              * // => false
+              */
+
+
+             function isFunction(value) {
+               if (!isObject(value)) {
+                 return false;
+               } // The use of `Object#toString` avoids issues with the `typeof` operator
+               // in Safari 9 which returns 'object' for typed arrays and other constructors.
+
+
+               var tag = baseGetTag(value);
+               return tag == funcTag || tag == genTag || tag == asyncTag || tag == proxyTag;
+             }
+             /**
+              * Checks if `value` is an integer.
+              *
+              * **Note:** This method is based on
+              * [`Number.isInteger`](https://mdn.io/Number/isInteger).
+              *
+              * @static
+              * @memberOf _
+              * @since 4.0.0
+              * @category Lang
+              * @param {*} value The value to check.
+              * @returns {boolean} Returns `true` if `value` is an integer, else `false`.
+              * @example
+              *
+              * _.isInteger(3);
+              * // => true
+              *
+              * _.isInteger(Number.MIN_VALUE);
+              * // => false
+              *
+              * _.isInteger(Infinity);
+              * // => false
+              *
+              * _.isInteger('3');
+              * // => false
+              */
+
+
+             function isInteger(value) {
+               return typeof value == 'number' && value == toInteger(value);
+             }
+             /**
+              * Checks if `value` is a valid array-like length.
+              *
+              * **Note:** This method is loosely based on
+              * [`ToLength`](http://ecma-international.org/ecma-262/7.0/#sec-tolength).
+              *
+              * @static
+              * @memberOf _
+              * @since 4.0.0
+              * @category Lang
+              * @param {*} value The value to check.
+              * @returns {boolean} Returns `true` if `value` is a valid length, else `false`.
+              * @example
+              *
+              * _.isLength(3);
+              * // => true
+              *
+              * _.isLength(Number.MIN_VALUE);
+              * // => false
+              *
+              * _.isLength(Infinity);
+              * // => false
+              *
+              * _.isLength('3');
+              * // => false
+              */
+
+
+             function isLength(value) {
+               return typeof value == 'number' && value > -1 && value % 1 == 0 && value <= MAX_SAFE_INTEGER;
+             }
+             /**
+              * Checks if `value` is the
+              * [language type](http://www.ecma-international.org/ecma-262/7.0/#sec-ecmascript-language-types)
+              * of `Object`. (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)
+              *
+              * @static
+              * @memberOf _
+              * @since 0.1.0
+              * @category Lang
+              * @param {*} value The value to check.
+              * @returns {boolean} Returns `true` if `value` is an object, else `false`.
+              * @example
+              *
+              * _.isObject({});
+              * // => true
+              *
+              * _.isObject([1, 2, 3]);
+              * // => true
+              *
+              * _.isObject(_.noop);
+              * // => true
+              *
+              * _.isObject(null);
+              * // => false
+              */
+
+
+             function isObject(value) {
+               var type = _typeof(value);
+
+               return value != null && (type == 'object' || type == 'function');
+             }
+             /**
+              * Checks if `value` is object-like. A value is object-like if it's not `null`
+              * and has a `typeof` result of "object".
+              *
+              * @static
+              * @memberOf _
+              * @since 4.0.0
+              * @category Lang
+              * @param {*} value The value to check.
+              * @returns {boolean} Returns `true` if `value` is object-like, else `false`.
+              * @example
+              *
+              * _.isObjectLike({});
+              * // => true
+              *
+              * _.isObjectLike([1, 2, 3]);
+              * // => true
+              *
+              * _.isObjectLike(_.noop);
+              * // => false
+              *
+              * _.isObjectLike(null);
+              * // => false
+              */
+
+
+             function isObjectLike(value) {
+               return value != null && _typeof(value) == 'object';
+             }
+             /**
+              * Checks if `value` is classified as a `Map` object.
+              *
+              * @static
+              * @memberOf _
+              * @since 4.3.0
+              * @category Lang
+              * @param {*} value The value to check.
+              * @returns {boolean} Returns `true` if `value` is a map, else `false`.
+              * @example
+              *
+              * _.isMap(new Map);
+              * // => true
+              *
+              * _.isMap(new WeakMap);
+              * // => false
+              */
+
+
+             var isMap = nodeIsMap ? baseUnary(nodeIsMap) : baseIsMap;
+             /**
+              * Performs a partial deep comparison between `object` and `source` to
+              * determine if `object` contains equivalent property values.
+              *
+              * **Note:** This method is equivalent to `_.matches` when `source` is
+              * partially applied.
+              *
+              * Partial comparisons will match empty array and empty object `source`
+              * values against any array or object value, respectively. See `_.isEqual`
+              * for a list of supported value comparisons.
+              *
+              * @static
+              * @memberOf _
+              * @since 3.0.0
+              * @category Lang
+              * @param {Object} object The object to inspect.
+              * @param {Object} source The object of property values to match.
+              * @returns {boolean} Returns `true` if `object` is a match, else `false`.
+              * @example
+              *
+              * var object = { 'a': 1, 'b': 2 };
+              *
+              * _.isMatch(object, { 'b': 2 });
+              * // => true
+              *
+              * _.isMatch(object, { 'b': 1 });
+              * // => false
+              */
+
+             function isMatch(object, source) {
+               return object === source || baseIsMatch(object, source, getMatchData(source));
+             }
+             /**
+              * This method is like `_.isMatch` except that it accepts `customizer` which
+              * is invoked to compare values. If `customizer` returns `undefined`, comparisons
+              * are handled by the method instead. The `customizer` is invoked with five
+              * arguments: (objValue, srcValue, index|key, object, source).
+              *
+              * @static
+              * @memberOf _
+              * @since 4.0.0
+              * @category Lang
+              * @param {Object} object The object to inspect.
+              * @param {Object} source The object of property values to match.
+              * @param {Function} [customizer] The function to customize comparisons.
+              * @returns {boolean} Returns `true` if `object` is a match, else `false`.
+              * @example
+              *
+              * function isGreeting(value) {
+              *   return /^h(?:i|ello)$/.test(value);
+              * }
+              *
+              * function customizer(objValue, srcValue) {
+              *   if (isGreeting(objValue) && isGreeting(srcValue)) {
+              *     return true;
+              *   }
+              * }
+              *
+              * var object = { 'greeting': 'hello' };
+              * var source = { 'greeting': 'hi' };
+              *
+              * _.isMatchWith(object, source, customizer);
+              * // => true
+              */
+
+
+             function isMatchWith(object, source, customizer) {
+               customizer = typeof customizer == 'function' ? customizer : undefined$1;
+               return baseIsMatch(object, source, getMatchData(source), customizer);
+             }
+             /**
+              * Checks if `value` is `NaN`.
+              *
+              * **Note:** This method is based on
+              * [`Number.isNaN`](https://mdn.io/Number/isNaN) and is not the same as
+              * global [`isNaN`](https://mdn.io/isNaN) which returns `true` for
+              * `undefined` and other non-number values.
+              *
+              * @static
+              * @memberOf _
+              * @since 0.1.0
+              * @category Lang
+              * @param {*} value The value to check.
+              * @returns {boolean} Returns `true` if `value` is `NaN`, else `false`.
+              * @example
+              *
+              * _.isNaN(NaN);
+              * // => true
+              *
+              * _.isNaN(new Number(NaN));
+              * // => true
+              *
+              * isNaN(undefined);
+              * // => true
+              *
+              * _.isNaN(undefined);
+              * // => false
+              */
+
+
+             function isNaN(value) {
+               // An `NaN` primitive is the only value that is not equal to itself.
+               // Perform the `toStringTag` check first to avoid errors with some
+               // ActiveX objects in IE.
+               return isNumber(value) && value != +value;
+             }
+             /**
+              * Checks if `value` is a pristine native function.
+              *
+              * **Note:** This method can't reliably detect native functions in the presence
+              * of the core-js package because core-js circumvents this kind of detection.
+              * Despite multiple requests, the core-js maintainer has made it clear: any
+              * attempt to fix the detection will be obstructed. As a result, we're left
+              * with little choice but to throw an error. Unfortunately, this also affects
+              * packages, like [babel-polyfill](https://www.npmjs.com/package/babel-polyfill),
+              * which rely on core-js.
+              *
+              * @static
+              * @memberOf _
+              * @since 3.0.0
+              * @category Lang
+              * @param {*} value The value to check.
+              * @returns {boolean} Returns `true` if `value` is a native function,
+              *  else `false`.
+              * @example
+              *
+              * _.isNative(Array.prototype.push);
+              * // => true
+              *
+              * _.isNative(_);
+              * // => false
+              */
+
+
+             function isNative(value) {
+               if (isMaskable(value)) {
+                 throw new Error(CORE_ERROR_TEXT);
+               }
+
+               return baseIsNative(value);
+             }
+             /**
+              * Checks if `value` is `null`.
+              *
+              * @static
+              * @memberOf _
+              * @since 0.1.0
+              * @category Lang
+              * @param {*} value The value to check.
+              * @returns {boolean} Returns `true` if `value` is `null`, else `false`.
+              * @example
+              *
+              * _.isNull(null);
+              * // => true
+              *
+              * _.isNull(void 0);
+              * // => false
+              */
+
+
+             function isNull(value) {
+               return value === null;
+             }
+             /**
+              * Checks if `value` is `null` or `undefined`.
+              *
+              * @static
+              * @memberOf _
+              * @since 4.0.0
+              * @category Lang
+              * @param {*} value The value to check.
+              * @returns {boolean} Returns `true` if `value` is nullish, else `false`.
+              * @example
+              *
+              * _.isNil(null);
+              * // => true
+              *
+              * _.isNil(void 0);
+              * // => true
+              *
+              * _.isNil(NaN);
+              * // => false
+              */
+
+
+             function isNil(value) {
+               return value == null;
+             }
+             /**
+              * Checks if `value` is classified as a `Number` primitive or object.
+              *
+              * **Note:** To exclude `Infinity`, `-Infinity`, and `NaN`, which are
+              * classified as numbers, use the `_.isFinite` method.
+              *
+              * @static
+              * @memberOf _
+              * @since 0.1.0
+              * @category Lang
+              * @param {*} value The value to check.
+              * @returns {boolean} Returns `true` if `value` is a number, else `false`.
+              * @example
+              *
+              * _.isNumber(3);
+              * // => true
+              *
+              * _.isNumber(Number.MIN_VALUE);
+              * // => true
+              *
+              * _.isNumber(Infinity);
+              * // => true
+              *
+              * _.isNumber('3');
+              * // => false
+              */
+
+
+             function isNumber(value) {
+               return typeof value == 'number' || isObjectLike(value) && baseGetTag(value) == numberTag;
+             }
+             /**
+              * Checks if `value` is a plain object, that is, an object created by the
+              * `Object` constructor or one with a `[[Prototype]]` of `null`.
+              *
+              * @static
+              * @memberOf _
+              * @since 0.8.0
+              * @category Lang
+              * @param {*} value The value to check.
+              * @returns {boolean} Returns `true` if `value` is a plain object, else `false`.
+              * @example
+              *
+              * function Foo() {
+              *   this.a = 1;
+              * }
+              *
+              * _.isPlainObject(new Foo);
+              * // => false
+              *
+              * _.isPlainObject([1, 2, 3]);
+              * // => false
+              *
+              * _.isPlainObject({ 'x': 0, 'y': 0 });
+              * // => true
+              *
+              * _.isPlainObject(Object.create(null));
+              * // => true
+              */
+
+
+             function isPlainObject(value) {
+               if (!isObjectLike(value) || baseGetTag(value) != objectTag) {
+                 return false;
+               }
+
+               var proto = getPrototype(value);
+
+               if (proto === null) {
+                 return true;
+               }
+
+               var Ctor = hasOwnProperty.call(proto, 'constructor') && proto.constructor;
+               return typeof Ctor == 'function' && Ctor instanceof Ctor && funcToString.call(Ctor) == objectCtorString;
+             }
+             /**
+              * Checks if `value` is classified as a `RegExp` object.
+              *
+              * @static
+              * @memberOf _
+              * @since 0.1.0
+              * @category Lang
+              * @param {*} value The value to check.
+              * @returns {boolean} Returns `true` if `value` is a regexp, else `false`.
+              * @example
+              *
+              * _.isRegExp(/abc/);
+              * // => true
+              *
+              * _.isRegExp('/abc/');
+              * // => false
+              */
+
+
+             var isRegExp = nodeIsRegExp ? baseUnary(nodeIsRegExp) : baseIsRegExp;
+             /**
+              * Checks if `value` is a safe integer. An integer is safe if it's an IEEE-754
+              * double precision number which isn't the result of a rounded unsafe integer.
+              *
+              * **Note:** This method is based on
+              * [`Number.isSafeInteger`](https://mdn.io/Number/isSafeInteger).
+              *
+              * @static
+              * @memberOf _
+              * @since 4.0.0
+              * @category Lang
+              * @param {*} value The value to check.
+              * @returns {boolean} Returns `true` if `value` is a safe integer, else `false`.
+              * @example
+              *
+              * _.isSafeInteger(3);
+              * // => true
+              *
+              * _.isSafeInteger(Number.MIN_VALUE);
+              * // => false
+              *
+              * _.isSafeInteger(Infinity);
+              * // => false
+              *
+              * _.isSafeInteger('3');
+              * // => false
+              */
+
+             function isSafeInteger(value) {
+               return isInteger(value) && value >= -MAX_SAFE_INTEGER && value <= MAX_SAFE_INTEGER;
+             }
+             /**
+              * Checks if `value` is classified as a `Set` object.
+              *
+              * @static
+              * @memberOf _
+              * @since 4.3.0
+              * @category Lang
+              * @param {*} value The value to check.
+              * @returns {boolean} Returns `true` if `value` is a set, else `false`.
+              * @example
+              *
+              * _.isSet(new Set);
+              * // => true
+              *
+              * _.isSet(new WeakSet);
+              * // => false
+              */
+
+
+             var isSet = nodeIsSet ? baseUnary(nodeIsSet) : baseIsSet;
+             /**
+              * Checks if `value` is classified as a `String` primitive or object.
+              *
+              * @static
+              * @since 0.1.0
+              * @memberOf _
+              * @category Lang
+              * @param {*} value The value to check.
+              * @returns {boolean} Returns `true` if `value` is a string, else `false`.
+              * @example
+              *
+              * _.isString('abc');
+              * // => true
+              *
+              * _.isString(1);
+              * // => false
+              */
+
+             function isString(value) {
+               return typeof value == 'string' || !isArray(value) && isObjectLike(value) && baseGetTag(value) == stringTag;
+             }
+             /**
+              * Checks if `value` is classified as a `Symbol` primitive or object.
+              *
+              * @static
+              * @memberOf _
+              * @since 4.0.0
+              * @category Lang
+              * @param {*} value The value to check.
+              * @returns {boolean} Returns `true` if `value` is a symbol, else `false`.
+              * @example
+              *
+              * _.isSymbol(Symbol.iterator);
+              * // => true
+              *
+              * _.isSymbol('abc');
+              * // => false
+              */
+
+
+             function isSymbol(value) {
+               return _typeof(value) == 'symbol' || isObjectLike(value) && baseGetTag(value) == symbolTag;
+             }
+             /**
+              * Checks if `value` is classified as a typed array.
+              *
+              * @static
+              * @memberOf _
+              * @since 3.0.0
+              * @category Lang
+              * @param {*} value The value to check.
+              * @returns {boolean} Returns `true` if `value` is a typed array, else `false`.
+              * @example
+              *
+              * _.isTypedArray(new Uint8Array);
+              * // => true
+              *
+              * _.isTypedArray([]);
+              * // => false
+              */
+
+
+             var isTypedArray = nodeIsTypedArray ? baseUnary(nodeIsTypedArray) : baseIsTypedArray;
+             /**
+              * Checks if `value` is `undefined`.
+              *
+              * @static
+              * @since 0.1.0
+              * @memberOf _
+              * @category Lang
+              * @param {*} value The value to check.
+              * @returns {boolean} Returns `true` if `value` is `undefined`, else `false`.
+              * @example
+              *
+              * _.isUndefined(void 0);
+              * // => true
+              *
+              * _.isUndefined(null);
+              * // => false
+              */
+
+             function isUndefined(value) {
+               return value === undefined$1;
+             }
+             /**
+              * Checks if `value` is classified as a `WeakMap` object.
+              *
+              * @static
+              * @memberOf _
+              * @since 4.3.0
+              * @category Lang
+              * @param {*} value The value to check.
+              * @returns {boolean} Returns `true` if `value` is a weak map, else `false`.
+              * @example
+              *
+              * _.isWeakMap(new WeakMap);
+              * // => true
+              *
+              * _.isWeakMap(new Map);
+              * // => false
+              */
+
+
+             function isWeakMap(value) {
+               return isObjectLike(value) && getTag(value) == weakMapTag;
+             }
+             /**
+              * Checks if `value` is classified as a `WeakSet` object.
+              *
+              * @static
+              * @memberOf _
+              * @since 4.3.0
+              * @category Lang
+              * @param {*} value The value to check.
+              * @returns {boolean} Returns `true` if `value` is a weak set, else `false`.
+              * @example
+              *
+              * _.isWeakSet(new WeakSet);
+              * // => true
+              *
+              * _.isWeakSet(new Set);
+              * // => false
+              */
+
+
+             function isWeakSet(value) {
+               return isObjectLike(value) && baseGetTag(value) == weakSetTag;
+             }
+             /**
+              * Checks if `value` is less than `other`.
+              *
+              * @static
+              * @memberOf _
+              * @since 3.9.0
+              * @category Lang
+              * @param {*} value The value to compare.
+              * @param {*} other The other value to compare.
+              * @returns {boolean} Returns `true` if `value` is less than `other`,
+              *  else `false`.
+              * @see _.gt
+              * @example
+              *
+              * _.lt(1, 3);
+              * // => true
+              *
+              * _.lt(3, 3);
+              * // => false
+              *
+              * _.lt(3, 1);
+              * // => false
+              */
+
+
+             var lt = createRelationalOperation(baseLt);
+             /**
+              * Checks if `value` is less than or equal to `other`.
+              *
+              * @static
+              * @memberOf _
+              * @since 3.9.0
+              * @category Lang
+              * @param {*} value The value to compare.
+              * @param {*} other The other value to compare.
+              * @returns {boolean} Returns `true` if `value` is less than or equal to
+              *  `other`, else `false`.
+              * @see _.gte
+              * @example
+              *
+              * _.lte(1, 3);
+              * // => true
+              *
+              * _.lte(3, 3);
+              * // => true
+              *
+              * _.lte(3, 1);
+              * // => false
+              */
+
+             var lte = createRelationalOperation(function (value, other) {
+               return value <= other;
+             });
+             /**
+              * Converts `value` to an array.
+              *
+              * @static
+              * @since 0.1.0
+              * @memberOf _
+              * @category Lang
+              * @param {*} value The value to convert.
+              * @returns {Array} Returns the converted array.
+              * @example
+              *
+              * _.toArray({ 'a': 1, 'b': 2 });
+              * // => [1, 2]
+              *
+              * _.toArray('abc');
+              * // => ['a', 'b', 'c']
+              *
+              * _.toArray(1);
+              * // => []
+              *
+              * _.toArray(null);
+              * // => []
+              */
+
+             function toArray(value) {
+               if (!value) {
+                 return [];
+               }
+
+               if (isArrayLike(value)) {
+                 return isString(value) ? stringToArray(value) : copyArray(value);
+               }
+
+               if (symIterator && value[symIterator]) {
+                 return iteratorToArray(value[symIterator]());
+               }
+
+               var tag = getTag(value),
+                   func = tag == mapTag ? mapToArray : tag == setTag ? setToArray : values;
+               return func(value);
+             }
+             /**
+              * Converts `value` to a finite number.
+              *
+              * @static
+              * @memberOf _
+              * @since 4.12.0
+              * @category Lang
+              * @param {*} value The value to convert.
+              * @returns {number} Returns the converted number.
+              * @example
+              *
+              * _.toFinite(3.2);
+              * // => 3.2
+              *
+              * _.toFinite(Number.MIN_VALUE);
+              * // => 5e-324
+              *
+              * _.toFinite(Infinity);
+              * // => 1.7976931348623157e+308
+              *
+              * _.toFinite('3.2');
+              * // => 3.2
+              */
+
+
+             function toFinite(value) {
+               if (!value) {
+                 return value === 0 ? value : 0;
+               }
+
+               value = toNumber(value);
+
+               if (value === INFINITY || value === -INFINITY) {
+                 var sign = value < 0 ? -1 : 1;
+                 return sign * MAX_INTEGER;
+               }
+
+               return value === value ? value : 0;
+             }
+             /**
+              * Converts `value` to an integer.
+              *
+              * **Note:** This method is loosely based on
+              * [`ToInteger`](http://www.ecma-international.org/ecma-262/7.0/#sec-tointeger).
+              *
+              * @static
+              * @memberOf _
+              * @since 4.0.0
+              * @category Lang
+              * @param {*} value The value to convert.
+              * @returns {number} Returns the converted integer.
+              * @example
+              *
+              * _.toInteger(3.2);
+              * // => 3
+              *
+              * _.toInteger(Number.MIN_VALUE);
+              * // => 0
+              *
+              * _.toInteger(Infinity);
+              * // => 1.7976931348623157e+308
+              *
+              * _.toInteger('3.2');
+              * // => 3
+              */
+
+
+             function toInteger(value) {
+               var result = toFinite(value),
+                   remainder = result % 1;
+               return result === result ? remainder ? result - remainder : result : 0;
+             }
+             /**
+              * Converts `value` to an integer suitable for use as the length of an
+              * array-like object.
+              *
+              * **Note:** This method is based on
+              * [`ToLength`](http://ecma-international.org/ecma-262/7.0/#sec-tolength).
+              *
+              * @static
+              * @memberOf _
+              * @since 4.0.0
+              * @category Lang
+              * @param {*} value The value to convert.
+              * @returns {number} Returns the converted integer.
+              * @example
+              *
+              * _.toLength(3.2);
+              * // => 3
+              *
+              * _.toLength(Number.MIN_VALUE);
+              * // => 0
+              *
+              * _.toLength(Infinity);
+              * // => 4294967295
+              *
+              * _.toLength('3.2');
+              * // => 3
+              */
+
+
+             function toLength(value) {
+               return value ? baseClamp(toInteger(value), 0, MAX_ARRAY_LENGTH) : 0;
+             }
+             /**
+              * Converts `value` to a number.
+              *
+              * @static
+              * @memberOf _
+              * @since 4.0.0
+              * @category Lang
+              * @param {*} value The value to process.
+              * @returns {number} Returns the number.
+              * @example
+              *
+              * _.toNumber(3.2);
+              * // => 3.2
+              *
+              * _.toNumber(Number.MIN_VALUE);
+              * // => 5e-324
+              *
+              * _.toNumber(Infinity);
+              * // => Infinity
+              *
+              * _.toNumber('3.2');
+              * // => 3.2
+              */
+
+
+             function toNumber(value) {
+               if (typeof value == 'number') {
+                 return value;
+               }
+
+               if (isSymbol(value)) {
+                 return NAN;
+               }
+
+               if (isObject(value)) {
+                 var other = typeof value.valueOf == 'function' ? value.valueOf() : value;
+                 value = isObject(other) ? other + '' : other;
+               }
+
+               if (typeof value != 'string') {
+                 return value === 0 ? value : +value;
+               }
+
+               value = baseTrim(value);
+               var isBinary = reIsBinary.test(value);
+               return isBinary || reIsOctal.test(value) ? freeParseInt(value.slice(2), isBinary ? 2 : 8) : reIsBadHex.test(value) ? NAN : +value;
+             }
+             /**
+              * Converts `value` to a plain object flattening inherited enumerable string
+              * keyed properties of `value` to own properties of the plain object.
+              *
+              * @static
+              * @memberOf _
+              * @since 3.0.0
+              * @category Lang
+              * @param {*} value The value to convert.
+              * @returns {Object} Returns the converted plain object.
+              * @example
+              *
+              * function Foo() {
+              *   this.b = 2;
+              * }
+              *
+              * Foo.prototype.c = 3;
+              *
+              * _.assign({ 'a': 1 }, new Foo);
+              * // => { 'a': 1, 'b': 2 }
+              *
+              * _.assign({ 'a': 1 }, _.toPlainObject(new Foo));
+              * // => { 'a': 1, 'b': 2, 'c': 3 }
+              */
+
+
+             function toPlainObject(value) {
+               return copyObject(value, keysIn(value));
+             }
+             /**
+              * Converts `value` to a safe integer. A safe integer can be compared and
+              * represented correctly.
+              *
+              * @static
+              * @memberOf _
+              * @since 4.0.0
+              * @category Lang
+              * @param {*} value The value to convert.
+              * @returns {number} Returns the converted integer.
+              * @example
+              *
+              * _.toSafeInteger(3.2);
+              * // => 3
+              *
+              * _.toSafeInteger(Number.MIN_VALUE);
+              * // => 0
+              *
+              * _.toSafeInteger(Infinity);
+              * // => 9007199254740991
+              *
+              * _.toSafeInteger('3.2');
+              * // => 3
+              */
+
+
+             function toSafeInteger(value) {
+               return value ? baseClamp(toInteger(value), -MAX_SAFE_INTEGER, MAX_SAFE_INTEGER) : value === 0 ? value : 0;
+             }
+             /**
+              * Converts `value` to a string. An empty string is returned for `null`
+              * and `undefined` values. The sign of `-0` is preserved.
+              *
+              * @static
+              * @memberOf _
+              * @since 4.0.0
+              * @category Lang
+              * @param {*} value The value to convert.
+              * @returns {string} Returns the converted string.
+              * @example
+              *
+              * _.toString(null);
+              * // => ''
+              *
+              * _.toString(-0);
+              * // => '-0'
+              *
+              * _.toString([1, 2, 3]);
+              * // => '1,2,3'
+              */
+
+
+             function toString(value) {
+               return value == null ? '' : baseToString(value);
+             }
+             /*------------------------------------------------------------------------*/
+
+             /**
+              * Assigns own enumerable string keyed properties of source objects to the
+              * destination object. Source objects are applied from left to right.
+              * Subsequent sources overwrite property assignments of previous sources.
+              *
+              * **Note:** This method mutates `object` and is loosely based on
+              * [`Object.assign`](https://mdn.io/Object/assign).
+              *
+              * @static
+              * @memberOf _
+              * @since 0.10.0
+              * @category Object
+              * @param {Object} object The destination object.
+              * @param {...Object} [sources] The source objects.
+              * @returns {Object} Returns `object`.
+              * @see _.assignIn
+              * @example
+              *
+              * function Foo() {
+              *   this.a = 1;
+              * }
+              *
+              * function Bar() {
+              *   this.c = 3;
+              * }
+              *
+              * Foo.prototype.b = 2;
+              * Bar.prototype.d = 4;
+              *
+              * _.assign({ 'a': 0 }, new Foo, new Bar);
+              * // => { 'a': 1, 'c': 3 }
+              */
+
+
+             var assign = createAssigner(function (object, source) {
+               if (isPrototype(source) || isArrayLike(source)) {
+                 copyObject(source, keys(source), object);
+                 return;
+               }
+
+               for (var key in source) {
+                 if (hasOwnProperty.call(source, key)) {
+                   assignValue(object, key, source[key]);
+                 }
+               }
+             });
+             /**
+              * This method is like `_.assign` except that it iterates over own and
+              * inherited source properties.
+              *
+              * **Note:** This method mutates `object`.
+              *
+              * @static
+              * @memberOf _
+              * @since 4.0.0
+              * @alias extend
+              * @category Object
+              * @param {Object} object The destination object.
+              * @param {...Object} [sources] The source objects.
+              * @returns {Object} Returns `object`.
+              * @see _.assign
+              * @example
+              *
+              * function Foo() {
+              *   this.a = 1;
+              * }
+              *
+              * function Bar() {
+              *   this.c = 3;
+              * }
+              *
+              * Foo.prototype.b = 2;
+              * Bar.prototype.d = 4;
+              *
+              * _.assignIn({ 'a': 0 }, new Foo, new Bar);
+              * // => { 'a': 1, 'b': 2, 'c': 3, 'd': 4 }
+              */
+
+             var assignIn = createAssigner(function (object, source) {
+               copyObject(source, keysIn(source), object);
+             });
+             /**
+              * This method is like `_.assignIn` except that it accepts `customizer`
+              * which is invoked to produce the assigned values. If `customizer` returns
+              * `undefined`, assignment is handled by the method instead. The `customizer`
+              * is invoked with five arguments: (objValue, srcValue, key, object, source).
+              *
+              * **Note:** This method mutates `object`.
+              *
+              * @static
+              * @memberOf _
+              * @since 4.0.0
+              * @alias extendWith
+              * @category Object
+              * @param {Object} object The destination object.
+              * @param {...Object} sources The source objects.
+              * @param {Function} [customizer] The function to customize assigned values.
+              * @returns {Object} Returns `object`.
+              * @see _.assignWith
+              * @example
+              *
+              * function customizer(objValue, srcValue) {
+              *   return _.isUndefined(objValue) ? srcValue : objValue;
+              * }
+              *
+              * var defaults = _.partialRight(_.assignInWith, customizer);
+              *
+              * defaults({ 'a': 1 }, { 'b': 2 }, { 'a': 3 });
+              * // => { 'a': 1, 'b': 2 }
+              */
+
+             var assignInWith = createAssigner(function (object, source, srcIndex, customizer) {
+               copyObject(source, keysIn(source), object, customizer);
+             });
+             /**
+              * This method is like `_.assign` except that it accepts `customizer`
+              * which is invoked to produce the assigned values. If `customizer` returns
+              * `undefined`, assignment is handled by the method instead. The `customizer`
+              * is invoked with five arguments: (objValue, srcValue, key, object, source).
+              *
+              * **Note:** This method mutates `object`.
+              *
+              * @static
+              * @memberOf _
+              * @since 4.0.0
+              * @category Object
+              * @param {Object} object The destination object.
+              * @param {...Object} sources The source objects.
+              * @param {Function} [customizer] The function to customize assigned values.
+              * @returns {Object} Returns `object`.
+              * @see _.assignInWith
+              * @example
+              *
+              * function customizer(objValue, srcValue) {
+              *   return _.isUndefined(objValue) ? srcValue : objValue;
+              * }
+              *
+              * var defaults = _.partialRight(_.assignWith, customizer);
+              *
+              * defaults({ 'a': 1 }, { 'b': 2 }, { 'a': 3 });
+              * // => { 'a': 1, 'b': 2 }
+              */
+
+             var assignWith = createAssigner(function (object, source, srcIndex, customizer) {
+               copyObject(source, keys(source), object, customizer);
+             });
+             /**
+              * Creates an array of values corresponding to `paths` of `object`.
+              *
+              * @static
+              * @memberOf _
+              * @since 1.0.0
+              * @category Object
+              * @param {Object} object The object to iterate over.
+              * @param {...(string|string[])} [paths] The property paths to pick.
+              * @returns {Array} Returns the picked values.
+              * @example
+              *
+              * var object = { 'a': [{ 'b': { 'c': 3 } }, 4] };
+              *
+              * _.at(object, ['a[0].b.c', 'a[1]']);
+              * // => [3, 4]
+              */
+
+             var at = flatRest(baseAt);
+             /**
+              * Creates an object that inherits from the `prototype` object. If a
+              * `properties` object is given, its own enumerable string keyed properties
+              * are assigned to the created object.
+              *
+              * @static
+              * @memberOf _
+              * @since 2.3.0
+              * @category Object
+              * @param {Object} prototype The object to inherit from.
+              * @param {Object} [properties] The properties to assign to the object.
+              * @returns {Object} Returns the new object.
+              * @example
+              *
+              * function Shape() {
+              *   this.x = 0;
+              *   this.y = 0;
+              * }
+              *
+              * function Circle() {
+              *   Shape.call(this);
+              * }
+              *
+              * Circle.prototype = _.create(Shape.prototype, {
+              *   'constructor': Circle
+              * });
+              *
+              * var circle = new Circle;
+              * circle instanceof Circle;
+              * // => true
+              *
+              * circle instanceof Shape;
+              * // => true
+              */
+
+             function create(prototype, properties) {
+               var result = baseCreate(prototype);
+               return properties == null ? result : baseAssign(result, properties);
+             }
+             /**
+              * Assigns own and inherited enumerable string keyed properties of source
+              * objects to the destination object for all destination properties that
+              * resolve to `undefined`. Source objects are applied from left to right.
+              * Once a property is set, additional values of the same property are ignored.
+              *
+              * **Note:** This method mutates `object`.
+              *
+              * @static
+              * @since 0.1.0
+              * @memberOf _
+              * @category Object
+              * @param {Object} object The destination object.
+              * @param {...Object} [sources] The source objects.
+              * @returns {Object} Returns `object`.
+              * @see _.defaultsDeep
+              * @example
+              *
+              * _.defaults({ 'a': 1 }, { 'b': 2 }, { 'a': 3 });
+              * // => { 'a': 1, 'b': 2 }
+              */
+
+
+             var defaults = baseRest(function (object, sources) {
+               object = Object(object);
+               var index = -1;
+               var length = sources.length;
+               var guard = length > 2 ? sources[2] : undefined$1;
+
+               if (guard && isIterateeCall(sources[0], sources[1], guard)) {
+                 length = 1;
+               }
+
+               while (++index < length) {
+                 var source = sources[index];
+                 var props = keysIn(source);
+                 var propsIndex = -1;
+                 var propsLength = props.length;
+
+                 while (++propsIndex < propsLength) {
+                   var key = props[propsIndex];
+                   var value = object[key];
+
+                   if (value === undefined$1 || eq(value, objectProto[key]) && !hasOwnProperty.call(object, key)) {
+                     object[key] = source[key];
+                   }
+                 }
+               }
+
+               return object;
+             });
+             /**
+              * This method is like `_.defaults` except that it recursively assigns
+              * default properties.
+              *
+              * **Note:** This method mutates `object`.
+              *
+              * @static
+              * @memberOf _
+              * @since 3.10.0
+              * @category Object
+              * @param {Object} object The destination object.
+              * @param {...Object} [sources] The source objects.
+              * @returns {Object} Returns `object`.
+              * @see _.defaults
+              * @example
+              *
+              * _.defaultsDeep({ 'a': { 'b': 2 } }, { 'a': { 'b': 1, 'c': 3 } });
+              * // => { 'a': { 'b': 2, 'c': 3 } }
+              */
+
+             var defaultsDeep = baseRest(function (args) {
+               args.push(undefined$1, customDefaultsMerge);
+               return apply(mergeWith, undefined$1, args);
+             });
+             /**
+              * This method is like `_.find` except that it returns the key of the first
+              * element `predicate` returns truthy for instead of the element itself.
+              *
+              * @static
+              * @memberOf _
+              * @since 1.1.0
+              * @category Object
+              * @param {Object} object The object to inspect.
+              * @param {Function} [predicate=_.identity] The function invoked per iteration.
+              * @returns {string|undefined} Returns the key of the matched element,
+              *  else `undefined`.
+              * @example
+              *
+              * var users = {
+              *   'barney':  { 'age': 36, 'active': true },
+              *   'fred':    { 'age': 40, 'active': false },
+              *   'pebbles': { 'age': 1,  'active': true }
+              * };
+              *
+              * _.findKey(users, function(o) { return o.age < 40; });
+              * // => 'barney' (iteration order is not guaranteed)
+              *
+              * // The `_.matches` iteratee shorthand.
+              * _.findKey(users, { 'age': 1, 'active': true });
+              * // => 'pebbles'
+              *
+              * // The `_.matchesProperty` iteratee shorthand.
+              * _.findKey(users, ['active', false]);
+              * // => 'fred'
+              *
+              * // The `_.property` iteratee shorthand.
+              * _.findKey(users, 'active');
+              * // => 'barney'
+              */
+
+             function findKey(object, predicate) {
+               return baseFindKey(object, getIteratee(predicate, 3), baseForOwn);
+             }
+             /**
+              * This method is like `_.findKey` except that it iterates over elements of
+              * a collection in the opposite order.
+              *
+              * @static
+              * @memberOf _
+              * @since 2.0.0
+              * @category Object
+              * @param {Object} object The object to inspect.
+              * @param {Function} [predicate=_.identity] The function invoked per iteration.
+              * @returns {string|undefined} Returns the key of the matched element,
+              *  else `undefined`.
+              * @example
+              *
+              * var users = {
+              *   'barney':  { 'age': 36, 'active': true },
+              *   'fred':    { 'age': 40, 'active': false },
+              *   'pebbles': { 'age': 1,  'active': true }
+              * };
+              *
+              * _.findLastKey(users, function(o) { return o.age < 40; });
+              * // => returns 'pebbles' assuming `_.findKey` returns 'barney'
+              *
+              * // The `_.matches` iteratee shorthand.
+              * _.findLastKey(users, { 'age': 36, 'active': true });
+              * // => 'barney'
+              *
+              * // The `_.matchesProperty` iteratee shorthand.
+              * _.findLastKey(users, ['active', false]);
+              * // => 'fred'
+              *
+              * // The `_.property` iteratee shorthand.
+              * _.findLastKey(users, 'active');
+              * // => 'pebbles'
+              */
+
+
+             function findLastKey(object, predicate) {
+               return baseFindKey(object, getIteratee(predicate, 3), baseForOwnRight);
+             }
+             /**
+              * Iterates over own and inherited enumerable string keyed properties of an
+              * object and invokes `iteratee` for each property. The iteratee is invoked
+              * with three arguments: (value, key, object). Iteratee functions may exit
+              * iteration early by explicitly returning `false`.
+              *
+              * @static
+              * @memberOf _
+              * @since 0.3.0
+              * @category Object
+              * @param {Object} object The object to iterate over.
+              * @param {Function} [iteratee=_.identity] The function invoked per iteration.
+              * @returns {Object} Returns `object`.
+              * @see _.forInRight
+              * @example
+              *
+              * function Foo() {
+              *   this.a = 1;
+              *   this.b = 2;
+              * }
+              *
+              * Foo.prototype.c = 3;
+              *
+              * _.forIn(new Foo, function(value, key) {
+              *   console.log(key);
+              * });
+              * // => Logs 'a', 'b', then 'c' (iteration order is not guaranteed).
+              */
+
+
+             function forIn(object, iteratee) {
+               return object == null ? object : baseFor(object, getIteratee(iteratee, 3), keysIn);
+             }
+             /**
+              * This method is like `_.forIn` except that it iterates over properties of
+              * `object` in the opposite order.
+              *
+              * @static
+              * @memberOf _
+              * @since 2.0.0
+              * @category Object
+              * @param {Object} object The object to iterate over.
+              * @param {Function} [iteratee=_.identity] The function invoked per iteration.
+              * @returns {Object} Returns `object`.
+              * @see _.forIn
+              * @example
+              *
+              * function Foo() {
+              *   this.a = 1;
+              *   this.b = 2;
+              * }
+              *
+              * Foo.prototype.c = 3;
+              *
+              * _.forInRight(new Foo, function(value, key) {
+              *   console.log(key);
+              * });
+              * // => Logs 'c', 'b', then 'a' assuming `_.forIn` logs 'a', 'b', then 'c'.
+              */
+
+
+             function forInRight(object, iteratee) {
+               return object == null ? object : baseForRight(object, getIteratee(iteratee, 3), keysIn);
+             }
+             /**
+              * Iterates over own enumerable string keyed properties of an object and
+              * invokes `iteratee` for each property. The iteratee is invoked with three
+              * arguments: (value, key, object). Iteratee functions may exit iteration
+              * early by explicitly returning `false`.
+              *
+              * @static
+              * @memberOf _
+              * @since 0.3.0
+              * @category Object
+              * @param {Object} object The object to iterate over.
+              * @param {Function} [iteratee=_.identity] The function invoked per iteration.
+              * @returns {Object} Returns `object`.
+              * @see _.forOwnRight
+              * @example
+              *
+              * function Foo() {
+              *   this.a = 1;
+              *   this.b = 2;
+              * }
+              *
+              * Foo.prototype.c = 3;
+              *
+              * _.forOwn(new Foo, function(value, key) {
+              *   console.log(key);
+              * });
+              * // => Logs 'a' then 'b' (iteration order is not guaranteed).
+              */
+
+
+             function forOwn(object, iteratee) {
+               return object && baseForOwn(object, getIteratee(iteratee, 3));
+             }
+             /**
+              * This method is like `_.forOwn` except that it iterates over properties of
+              * `object` in the opposite order.
+              *
+              * @static
+              * @memberOf _
+              * @since 2.0.0
+              * @category Object
+              * @param {Object} object The object to iterate over.
+              * @param {Function} [iteratee=_.identity] The function invoked per iteration.
+              * @returns {Object} Returns `object`.
+              * @see _.forOwn
+              * @example
+              *
+              * function Foo() {
+              *   this.a = 1;
+              *   this.b = 2;
+              * }
+              *
+              * Foo.prototype.c = 3;
+              *
+              * _.forOwnRight(new Foo, function(value, key) {
+              *   console.log(key);
+              * });
+              * // => Logs 'b' then 'a' assuming `_.forOwn` logs 'a' then 'b'.
+              */
+
+
+             function forOwnRight(object, iteratee) {
+               return object && baseForOwnRight(object, getIteratee(iteratee, 3));
+             }
+             /**
+              * Creates an array of function property names from own enumerable properties
+              * of `object`.
+              *
+              * @static
+              * @since 0.1.0
+              * @memberOf _
+              * @category Object
+              * @param {Object} object The object to inspect.
+              * @returns {Array} Returns the function names.
+              * @see _.functionsIn
+              * @example
+              *
+              * function Foo() {
+              *   this.a = _.constant('a');
+              *   this.b = _.constant('b');
+              * }
+              *
+              * Foo.prototype.c = _.constant('c');
+              *
+              * _.functions(new Foo);
+              * // => ['a', 'b']
+              */
+
+
+             function functions(object) {
+               return object == null ? [] : baseFunctions(object, keys(object));
+             }
+             /**
+              * Creates an array of function property names from own and inherited
+              * enumerable properties of `object`.
+              *
+              * @static
+              * @memberOf _
+              * @since 4.0.0
+              * @category Object
+              * @param {Object} object The object to inspect.
+              * @returns {Array} Returns the function names.
+              * @see _.functions
+              * @example
+              *
+              * function Foo() {
+              *   this.a = _.constant('a');
+              *   this.b = _.constant('b');
+              * }
+              *
+              * Foo.prototype.c = _.constant('c');
+              *
+              * _.functionsIn(new Foo);
+              * // => ['a', 'b', 'c']
+              */
+
+
+             function functionsIn(object) {
+               return object == null ? [] : baseFunctions(object, keysIn(object));
+             }
+             /**
+              * Gets the value at `path` of `object`. If the resolved value is
+              * `undefined`, the `defaultValue` is returned in its place.
+              *
+              * @static
+              * @memberOf _
+              * @since 3.7.0
+              * @category Object
+              * @param {Object} object The object to query.
+              * @param {Array|string} path The path of the property to get.
+              * @param {*} [defaultValue] The value returned for `undefined` resolved values.
+              * @returns {*} Returns the resolved value.
+              * @example
+              *
+              * var object = { 'a': [{ 'b': { 'c': 3 } }] };
+              *
+              * _.get(object, 'a[0].b.c');
+              * // => 3
+              *
+              * _.get(object, ['a', '0', 'b', 'c']);
+              * // => 3
+              *
+              * _.get(object, 'a.b.c', 'default');
+              * // => 'default'
+              */
+
+
+             function get(object, path, defaultValue) {
+               var result = object == null ? undefined$1 : baseGet(object, path);
+               return result === undefined$1 ? defaultValue : result;
+             }
+             /**
+              * Checks if `path` is a direct property of `object`.
+              *
+              * @static
+              * @since 0.1.0
+              * @memberOf _
+              * @category Object
+              * @param {Object} object The object to query.
+              * @param {Array|string} path The path to check.
+              * @returns {boolean} Returns `true` if `path` exists, else `false`.
+              * @example
+              *
+              * var object = { 'a': { 'b': 2 } };
+              * var other = _.create({ 'a': _.create({ 'b': 2 }) });
+              *
+              * _.has(object, 'a');
+              * // => true
+              *
+              * _.has(object, 'a.b');
+              * // => true
+              *
+              * _.has(object, ['a', 'b']);
+              * // => true
+              *
+              * _.has(other, 'a');
+              * // => false
+              */
+
+
+             function has(object, path) {
+               return object != null && hasPath(object, path, baseHas);
+             }
+             /**
+              * Checks if `path` is a direct or inherited property of `object`.
+              *
+              * @static
+              * @memberOf _
+              * @since 4.0.0
+              * @category Object
+              * @param {Object} object The object to query.
+              * @param {Array|string} path The path to check.
+              * @returns {boolean} Returns `true` if `path` exists, else `false`.
+              * @example
+              *
+              * var object = _.create({ 'a': _.create({ 'b': 2 }) });
+              *
+              * _.hasIn(object, 'a');
+              * // => true
+              *
+              * _.hasIn(object, 'a.b');
+              * // => true
+              *
+              * _.hasIn(object, ['a', 'b']);
+              * // => true
+              *
+              * _.hasIn(object, 'b');
+              * // => false
+              */
+
+
+             function hasIn(object, path) {
+               return object != null && hasPath(object, path, baseHasIn);
+             }
+             /**
+              * Creates an object composed of the inverted keys and values of `object`.
+              * If `object` contains duplicate values, subsequent values overwrite
+              * property assignments of previous values.
+              *
+              * @static
+              * @memberOf _
+              * @since 0.7.0
+              * @category Object
+              * @param {Object} object The object to invert.
+              * @returns {Object} Returns the new inverted object.
+              * @example
+              *
+              * var object = { 'a': 1, 'b': 2, 'c': 1 };
+              *
+              * _.invert(object);
+              * // => { '1': 'c', '2': 'b' }
+              */
+
+
+             var invert = createInverter(function (result, value, key) {
+               if (value != null && typeof value.toString != 'function') {
+                 value = nativeObjectToString.call(value);
+               }
+
+               result[value] = key;
+             }, constant(identity));
+             /**
+              * This method is like `_.invert` except that the inverted object is generated
+              * from the results of running each element of `object` thru `iteratee`. The
+              * corresponding inverted value of each inverted key is an array of keys
+              * responsible for generating the inverted value. The iteratee is invoked
+              * with one argument: (value).
+              *
+              * @static
+              * @memberOf _
+              * @since 4.1.0
+              * @category Object
+              * @param {Object} object The object to invert.
+              * @param {Function} [iteratee=_.identity] The iteratee invoked per element.
+              * @returns {Object} Returns the new inverted object.
+              * @example
+              *
+              * var object = { 'a': 1, 'b': 2, 'c': 1 };
+              *
+              * _.invertBy(object);
+              * // => { '1': ['a', 'c'], '2': ['b'] }
+              *
+              * _.invertBy(object, function(value) {
+              *   return 'group' + value;
+              * });
+              * // => { 'group1': ['a', 'c'], 'group2': ['b'] }
+              */
+
+             var invertBy = createInverter(function (result, value, key) {
+               if (value != null && typeof value.toString != 'function') {
+                 value = nativeObjectToString.call(value);
+               }
+
+               if (hasOwnProperty.call(result, value)) {
+                 result[value].push(key);
+               } else {
+                 result[value] = [key];
+               }
+             }, getIteratee);
+             /**
+              * Invokes the method at `path` of `object`.
+              *
+              * @static
+              * @memberOf _
+              * @since 4.0.0
+              * @category Object
+              * @param {Object} object The object to query.
+              * @param {Array|string} path The path of the method to invoke.
+              * @param {...*} [args] The arguments to invoke the method with.
+              * @returns {*} Returns the result of the invoked method.
+              * @example
+              *
+              * var object = { 'a': [{ 'b': { 'c': [1, 2, 3, 4] } }] };
+              *
+              * _.invoke(object, 'a[0].b.c.slice', 1, 3);
+              * // => [2, 3]
+              */
+
+             var invoke = baseRest(baseInvoke);
+             /**
+              * Creates an array of the own enumerable property names of `object`.
+              *
+              * **Note:** Non-object values are coerced to objects. See the
+              * [ES spec](http://ecma-international.org/ecma-262/7.0/#sec-object.keys)
+              * for more details.
+              *
+              * @static
+              * @since 0.1.0
+              * @memberOf _
+              * @category Object
+              * @param {Object} object The object to query.
+              * @returns {Array} Returns the array of property names.
+              * @example
+              *
+              * function Foo() {
+              *   this.a = 1;
+              *   this.b = 2;
+              * }
+              *
+              * Foo.prototype.c = 3;
+              *
+              * _.keys(new Foo);
+              * // => ['a', 'b'] (iteration order is not guaranteed)
+              *
+              * _.keys('hi');
+              * // => ['0', '1']
+              */
+
+             function keys(object) {
+               return isArrayLike(object) ? arrayLikeKeys(object) : baseKeys(object);
+             }
+             /**
+              * Creates an array of the own and inherited enumerable property names of `object`.
+              *
+              * **Note:** Non-object values are coerced to objects.
+              *
+              * @static
+              * @memberOf _
+              * @since 3.0.0
+              * @category Object
+              * @param {Object} object The object to query.
+              * @returns {Array} Returns the array of property names.
+              * @example
+              *
+              * function Foo() {
+              *   this.a = 1;
+              *   this.b = 2;
+              * }
+              *
+              * Foo.prototype.c = 3;
+              *
+              * _.keysIn(new Foo);
+              * // => ['a', 'b', 'c'] (iteration order is not guaranteed)
+              */
+
+
+             function keysIn(object) {
+               return isArrayLike(object) ? arrayLikeKeys(object, true) : baseKeysIn(object);
+             }
+             /**
+              * The opposite of `_.mapValues`; this method creates an object with the
+              * same values as `object` and keys generated by running each own enumerable
+              * string keyed property of `object` thru `iteratee`. The iteratee is invoked
+              * with three arguments: (value, key, object).
+              *
+              * @static
+              * @memberOf _
+              * @since 3.8.0
+              * @category Object
+              * @param {Object} object The object to iterate over.
+              * @param {Function} [iteratee=_.identity] The function invoked per iteration.
+              * @returns {Object} Returns the new mapped object.
+              * @see _.mapValues
+              * @example
+              *
+              * _.mapKeys({ 'a': 1, 'b': 2 }, function(value, key) {
+              *   return key + value;
+              * });
+              * // => { 'a1': 1, 'b2': 2 }
+              */
+
+
+             function mapKeys(object, iteratee) {
+               var result = {};
+               iteratee = getIteratee(iteratee, 3);
+               baseForOwn(object, function (value, key, object) {
+                 baseAssignValue(result, iteratee(value, key, object), value);
+               });
+               return result;
+             }
+             /**
+              * Creates an object with the same keys as `object` and values generated
+              * by running each own enumerable string keyed property of `object` thru
+              * `iteratee`. The iteratee is invoked with three arguments:
+              * (value, key, object).
+              *
+              * @static
+              * @memberOf _
+              * @since 2.4.0
+              * @category Object
+              * @param {Object} object The object to iterate over.
+              * @param {Function} [iteratee=_.identity] The function invoked per iteration.
+              * @returns {Object} Returns the new mapped object.
+              * @see _.mapKeys
+              * @example
+              *
+              * var users = {
+              *   'fred':    { 'user': 'fred',    'age': 40 },
+              *   'pebbles': { 'user': 'pebbles', 'age': 1 }
+              * };
+              *
+              * _.mapValues(users, function(o) { return o.age; });
+              * // => { 'fred': 40, 'pebbles': 1 } (iteration order is not guaranteed)
+              *
+              * // The `_.property` iteratee shorthand.
+              * _.mapValues(users, 'age');
+              * // => { 'fred': 40, 'pebbles': 1 } (iteration order is not guaranteed)
+              */
+
+
+             function mapValues(object, iteratee) {
+               var result = {};
+               iteratee = getIteratee(iteratee, 3);
+               baseForOwn(object, function (value, key, object) {
+                 baseAssignValue(result, key, iteratee(value, key, object));
+               });
+               return result;
+             }
+             /**
+              * This method is like `_.assign` except that it recursively merges own and
+              * inherited enumerable string keyed properties of source objects into the
+              * destination object. Source properties that resolve to `undefined` are
+              * skipped if a destination value exists. Array and plain object properties
+              * are merged recursively. Other objects and value types are overridden by
+              * assignment. Source objects are applied from left to right. Subsequent
+              * sources overwrite property assignments of previous sources.
+              *
+              * **Note:** This method mutates `object`.
+              *
+              * @static
+              * @memberOf _
+              * @since 0.5.0
+              * @category Object
+              * @param {Object} object The destination object.
+              * @param {...Object} [sources] The source objects.
+              * @returns {Object} Returns `object`.
+              * @example
+              *
+              * var object = {
+              *   'a': [{ 'b': 2 }, { 'd': 4 }]
+              * };
+              *
+              * var other = {
+              *   'a': [{ 'c': 3 }, { 'e': 5 }]
+              * };
+              *
+              * _.merge(object, other);
+              * // => { 'a': [{ 'b': 2, 'c': 3 }, { 'd': 4, 'e': 5 }] }
+              */
+
+
+             var merge = createAssigner(function (object, source, srcIndex) {
+               baseMerge(object, source, srcIndex);
+             });
+             /**
+              * This method is like `_.merge` except that it accepts `customizer` which
+              * is invoked to produce the merged values of the destination and source
+              * properties. If `customizer` returns `undefined`, merging is handled by the
+              * method instead. The `customizer` is invoked with six arguments:
+              * (objValue, srcValue, key, object, source, stack).
+              *
+              * **Note:** This method mutates `object`.
+              *
+              * @static
+              * @memberOf _
+              * @since 4.0.0
+              * @category Object
+              * @param {Object} object The destination object.
+              * @param {...Object} sources The source objects.
+              * @param {Function} customizer The function to customize assigned values.
+              * @returns {Object} Returns `object`.
+              * @example
+              *
+              * function customizer(objValue, srcValue) {
+              *   if (_.isArray(objValue)) {
+              *     return objValue.concat(srcValue);
+              *   }
+              * }
+              *
+              * var object = { 'a': [1], 'b': [2] };
+              * var other = { 'a': [3], 'b': [4] };
+              *
+              * _.mergeWith(object, other, customizer);
+              * // => { 'a': [1, 3], 'b': [2, 4] }
+              */
+
+             var mergeWith = createAssigner(function (object, source, srcIndex, customizer) {
+               baseMerge(object, source, srcIndex, customizer);
+             });
+             /**
+              * The opposite of `_.pick`; this method creates an object composed of the
+              * own and inherited enumerable property paths of `object` that are not omitted.
+              *
+              * **Note:** This method is considerably slower than `_.pick`.
+              *
+              * @static
+              * @since 0.1.0
+              * @memberOf _
+              * @category Object
+              * @param {Object} object The source object.
+              * @param {...(string|string[])} [paths] The property paths to omit.
+              * @returns {Object} Returns the new object.
+              * @example
+              *
+              * var object = { 'a': 1, 'b': '2', 'c': 3 };
+              *
+              * _.omit(object, ['a', 'c']);
+              * // => { 'b': '2' }
+              */
+
+             var omit = flatRest(function (object, paths) {
+               var result = {};
+
+               if (object == null) {
+                 return result;
+               }
+
+               var isDeep = false;
+               paths = arrayMap(paths, function (path) {
+                 path = castPath(path, object);
+                 isDeep || (isDeep = path.length > 1);
+                 return path;
+               });
+               copyObject(object, getAllKeysIn(object), result);
+
+               if (isDeep) {
+                 result = baseClone(result, CLONE_DEEP_FLAG | CLONE_FLAT_FLAG | CLONE_SYMBOLS_FLAG, customOmitClone);
+               }
+
+               var length = paths.length;
+
+               while (length--) {
+                 baseUnset(result, paths[length]);
+               }
+
+               return result;
+             });
+             /**
+              * The opposite of `_.pickBy`; this method creates an object composed of
+              * the own and inherited enumerable string keyed properties of `object` that
+              * `predicate` doesn't return truthy for. The predicate is invoked with two
+              * arguments: (value, key).
+              *
+              * @static
+              * @memberOf _
+              * @since 4.0.0
+              * @category Object
+              * @param {Object} object The source object.
+              * @param {Function} [predicate=_.identity] The function invoked per property.
+              * @returns {Object} Returns the new object.
+              * @example
+              *
+              * var object = { 'a': 1, 'b': '2', 'c': 3 };
+              *
+              * _.omitBy(object, _.isNumber);
+              * // => { 'b': '2' }
+              */
+
+             function omitBy(object, predicate) {
+               return pickBy(object, negate(getIteratee(predicate)));
+             }
+             /**
+              * Creates an object composed of the picked `object` properties.
+              *
+              * @static
+              * @since 0.1.0
+              * @memberOf _
+              * @category Object
+              * @param {Object} object The source object.
+              * @param {...(string|string[])} [paths] The property paths to pick.
+              * @returns {Object} Returns the new object.
+              * @example
+              *
+              * var object = { 'a': 1, 'b': '2', 'c': 3 };
+              *
+              * _.pick(object, ['a', 'c']);
+              * // => { 'a': 1, 'c': 3 }
+              */
+
+
+             var pick = flatRest(function (object, paths) {
+               return object == null ? {} : basePick(object, paths);
+             });
+             /**
+              * Creates an object composed of the `object` properties `predicate` returns
+              * truthy for. The predicate is invoked with two arguments: (value, key).
+              *
+              * @static
+              * @memberOf _
+              * @since 4.0.0
+              * @category Object
+              * @param {Object} object The source object.
+              * @param {Function} [predicate=_.identity] The function invoked per property.
+              * @returns {Object} Returns the new object.
+              * @example
+              *
+              * var object = { 'a': 1, 'b': '2', 'c': 3 };
+              *
+              * _.pickBy(object, _.isNumber);
+              * // => { 'a': 1, 'c': 3 }
+              */
+
+             function pickBy(object, predicate) {
+               if (object == null) {
+                 return {};
+               }
+
+               var props = arrayMap(getAllKeysIn(object), function (prop) {
+                 return [prop];
+               });
+               predicate = getIteratee(predicate);
+               return basePickBy(object, props, function (value, path) {
+                 return predicate(value, path[0]);
+               });
+             }
+             /**
+              * This method is like `_.get` except that if the resolved value is a
+              * function it's invoked with the `this` binding of its parent object and
+              * its result is returned.
+              *
+              * @static
+              * @since 0.1.0
+              * @memberOf _
+              * @category Object
+              * @param {Object} object The object to query.
+              * @param {Array|string} path The path of the property to resolve.
+              * @param {*} [defaultValue] The value returned for `undefined` resolved values.
+              * @returns {*} Returns the resolved value.
+              * @example
+              *
+              * var object = { 'a': [{ 'b': { 'c1': 3, 'c2': _.constant(4) } }] };
+              *
+              * _.result(object, 'a[0].b.c1');
+              * // => 3
+              *
+              * _.result(object, 'a[0].b.c2');
+              * // => 4
+              *
+              * _.result(object, 'a[0].b.c3', 'default');
+              * // => 'default'
+              *
+              * _.result(object, 'a[0].b.c3', _.constant('default'));
+              * // => 'default'
+              */
+
+
+             function result(object, path, defaultValue) {
+               path = castPath(path, object);
+               var index = -1,
+                   length = path.length; // Ensure the loop is entered when path is empty.
+
+               if (!length) {
+                 length = 1;
+                 object = undefined$1;
+               }
+
+               while (++index < length) {
+                 var value = object == null ? undefined$1 : object[toKey(path[index])];
+
+                 if (value === undefined$1) {
+                   index = length;
+                   value = defaultValue;
+                 }
+
+                 object = isFunction(value) ? value.call(object) : value;
+               }
+
+               return object;
+             }
+             /**
+              * Sets the value at `path` of `object`. If a portion of `path` doesn't exist,
+              * it's created. Arrays are created for missing index properties while objects
+              * are created for all other missing properties. Use `_.setWith` to customize
+              * `path` creation.
+              *
+              * **Note:** This method mutates `object`.
+              *
+              * @static
+              * @memberOf _
+              * @since 3.7.0
+              * @category Object
+              * @param {Object} object The object to modify.
+              * @param {Array|string} path The path of the property to set.
+              * @param {*} value The value to set.
+              * @returns {Object} Returns `object`.
+              * @example
+              *
+              * var object = { 'a': [{ 'b': { 'c': 3 } }] };
+              *
+              * _.set(object, 'a[0].b.c', 4);
+              * console.log(object.a[0].b.c);
+              * // => 4
+              *
+              * _.set(object, ['x', '0', 'y', 'z'], 5);
+              * console.log(object.x[0].y.z);
+              * // => 5
+              */
+
+
+             function set(object, path, value) {
+               return object == null ? object : baseSet(object, path, value);
+             }
+             /**
+              * This method is like `_.set` except that it accepts `customizer` which is
+              * invoked to produce the objects of `path`.  If `customizer` returns `undefined`
+              * path creation is handled by the method instead. The `customizer` is invoked
+              * with three arguments: (nsValue, key, nsObject).
+              *
+              * **Note:** This method mutates `object`.
+              *
+              * @static
+              * @memberOf _
+              * @since 4.0.0
+              * @category Object
+              * @param {Object} object The object to modify.
+              * @param {Array|string} path The path of the property to set.
+              * @param {*} value The value to set.
+              * @param {Function} [customizer] The function to customize assigned values.
+              * @returns {Object} Returns `object`.
+              * @example
+              *
+              * var object = {};
+              *
+              * _.setWith(object, '[0][1]', 'a', Object);
+              * // => { '0': { '1': 'a' } }
+              */
+
+
+             function setWith(object, path, value, customizer) {
+               customizer = typeof customizer == 'function' ? customizer : undefined$1;
+               return object == null ? object : baseSet(object, path, value, customizer);
+             }
+             /**
+              * Creates an array of own enumerable string keyed-value pairs for `object`
+              * which can be consumed by `_.fromPairs`. If `object` is a map or set, its
+              * entries are returned.
+              *
+              * @static
+              * @memberOf _
+              * @since 4.0.0
+              * @alias entries
+              * @category Object
+              * @param {Object} object The object to query.
+              * @returns {Array} Returns the key-value pairs.
+              * @example
+              *
+              * function Foo() {
+              *   this.a = 1;
+              *   this.b = 2;
+              * }
+              *
+              * Foo.prototype.c = 3;
+              *
+              * _.toPairs(new Foo);
+              * // => [['a', 1], ['b', 2]] (iteration order is not guaranteed)
+              */
+
+
+             var toPairs = createToPairs(keys);
+             /**
+              * Creates an array of own and inherited enumerable string keyed-value pairs
+              * for `object` which can be consumed by `_.fromPairs`. If `object` is a map
+              * or set, its entries are returned.
+              *
+              * @static
+              * @memberOf _
+              * @since 4.0.0
+              * @alias entriesIn
+              * @category Object
+              * @param {Object} object The object to query.
+              * @returns {Array} Returns the key-value pairs.
+              * @example
+              *
+              * function Foo() {
+              *   this.a = 1;
+              *   this.b = 2;
+              * }
+              *
+              * Foo.prototype.c = 3;
+              *
+              * _.toPairsIn(new Foo);
+              * // => [['a', 1], ['b', 2], ['c', 3]] (iteration order is not guaranteed)
+              */
+
+             var toPairsIn = createToPairs(keysIn);
+             /**
+              * An alternative to `_.reduce`; this method transforms `object` to a new
+              * `accumulator` object which is the result of running each of its own
+              * enumerable string keyed properties thru `iteratee`, with each invocation
+              * potentially mutating the `accumulator` object. If `accumulator` is not
+              * provided, a new object with the same `[[Prototype]]` will be used. The
+              * iteratee is invoked with four arguments: (accumulator, value, key, object).
+              * Iteratee functions may exit iteration early by explicitly returning `false`.
+              *
+              * @static
+              * @memberOf _
+              * @since 1.3.0
+              * @category Object
+              * @param {Object} object The object to iterate over.
+              * @param {Function} [iteratee=_.identity] The function invoked per iteration.
+              * @param {*} [accumulator] The custom accumulator value.
+              * @returns {*} Returns the accumulated value.
+              * @example
+              *
+              * _.transform([2, 3, 4], function(result, n) {
+              *   result.push(n *= n);
+              *   return n % 2 == 0;
+              * }, []);
+              * // => [4, 9]
+              *
+              * _.transform({ 'a': 1, 'b': 2, 'c': 1 }, function(result, value, key) {
+              *   (result[value] || (result[value] = [])).push(key);
+              * }, {});
+              * // => { '1': ['a', 'c'], '2': ['b'] }
+              */
+
+             function transform(object, iteratee, accumulator) {
+               var isArr = isArray(object),
+                   isArrLike = isArr || isBuffer(object) || isTypedArray(object);
+               iteratee = getIteratee(iteratee, 4);
+
+               if (accumulator == null) {
+                 var Ctor = object && object.constructor;
+
+                 if (isArrLike) {
+                   accumulator = isArr ? new Ctor() : [];
+                 } else if (isObject(object)) {
+                   accumulator = isFunction(Ctor) ? baseCreate(getPrototype(object)) : {};
+                 } else {
+                   accumulator = {};
+                 }
+               }
+
+               (isArrLike ? arrayEach : baseForOwn)(object, function (value, index, object) {
+                 return iteratee(accumulator, value, index, object);
+               });
+               return accumulator;
+             }
+             /**
+              * Removes the property at `path` of `object`.
+              *
+              * **Note:** This method mutates `object`.
+              *
+              * @static
+              * @memberOf _
+              * @since 4.0.0
+              * @category Object
+              * @param {Object} object The object to modify.
+              * @param {Array|string} path The path of the property to unset.
+              * @returns {boolean} Returns `true` if the property is deleted, else `false`.
+              * @example
+              *
+              * var object = { 'a': [{ 'b': { 'c': 7 } }] };
+              * _.unset(object, 'a[0].b.c');
+              * // => true
+              *
+              * console.log(object);
+              * // => { 'a': [{ 'b': {} }] };
+              *
+              * _.unset(object, ['a', '0', 'b', 'c']);
+              * // => true
+              *
+              * console.log(object);
+              * // => { 'a': [{ 'b': {} }] };
+              */
+
+
+             function unset(object, path) {
+               return object == null ? true : baseUnset(object, path);
+             }
+             /**
+              * This method is like `_.set` except that accepts `updater` to produce the
+              * value to set. Use `_.updateWith` to customize `path` creation. The `updater`
+              * is invoked with one argument: (value).
+              *
+              * **Note:** This method mutates `object`.
+              *
+              * @static
+              * @memberOf _
+              * @since 4.6.0
+              * @category Object
+              * @param {Object} object The object to modify.
+              * @param {Array|string} path The path of the property to set.
+              * @param {Function} updater The function to produce the updated value.
+              * @returns {Object} Returns `object`.
+              * @example
+              *
+              * var object = { 'a': [{ 'b': { 'c': 3 } }] };
+              *
+              * _.update(object, 'a[0].b.c', function(n) { return n * n; });
+              * console.log(object.a[0].b.c);
+              * // => 9
+              *
+              * _.update(object, 'x[0].y.z', function(n) { return n ? n + 1 : 0; });
+              * console.log(object.x[0].y.z);
+              * // => 0
+              */
+
+
+             function update(object, path, updater) {
+               return object == null ? object : baseUpdate(object, path, castFunction(updater));
+             }
+             /**
+              * This method is like `_.update` except that it accepts `customizer` which is
+              * invoked to produce the objects of `path`.  If `customizer` returns `undefined`
+              * path creation is handled by the method instead. The `customizer` is invoked
+              * with three arguments: (nsValue, key, nsObject).
+              *
+              * **Note:** This method mutates `object`.
+              *
+              * @static
+              * @memberOf _
+              * @since 4.6.0
+              * @category Object
+              * @param {Object} object The object to modify.
+              * @param {Array|string} path The path of the property to set.
+              * @param {Function} updater The function to produce the updated value.
+              * @param {Function} [customizer] The function to customize assigned values.
+              * @returns {Object} Returns `object`.
+              * @example
+              *
+              * var object = {};
+              *
+              * _.updateWith(object, '[0][1]', _.constant('a'), Object);
+              * // => { '0': { '1': 'a' } }
+              */
+
+
+             function updateWith(object, path, updater, customizer) {
+               customizer = typeof customizer == 'function' ? customizer : undefined$1;
+               return object == null ? object : baseUpdate(object, path, castFunction(updater), customizer);
+             }
+             /**
+              * Creates an array of the own enumerable string keyed property values of `object`.
+              *
+              * **Note:** Non-object values are coerced to objects.
+              *
+              * @static
+              * @since 0.1.0
+              * @memberOf _
+              * @category Object
+              * @param {Object} object The object to query.
+              * @returns {Array} Returns the array of property values.
+              * @example
+              *
+              * function Foo() {
+              *   this.a = 1;
+              *   this.b = 2;
+              * }
+              *
+              * Foo.prototype.c = 3;
+              *
+              * _.values(new Foo);
+              * // => [1, 2] (iteration order is not guaranteed)
+              *
+              * _.values('hi');
+              * // => ['h', 'i']
+              */
+
+
+             function values(object) {
+               return object == null ? [] : baseValues(object, keys(object));
+             }
+             /**
+              * Creates an array of the own and inherited enumerable string keyed property
+              * values of `object`.
+              *
+              * **Note:** Non-object values are coerced to objects.
+              *
+              * @static
+              * @memberOf _
+              * @since 3.0.0
+              * @category Object
+              * @param {Object} object The object to query.
+              * @returns {Array} Returns the array of property values.
+              * @example
+              *
+              * function Foo() {
+              *   this.a = 1;
+              *   this.b = 2;
+              * }
+              *
+              * Foo.prototype.c = 3;
+              *
+              * _.valuesIn(new Foo);
+              * // => [1, 2, 3] (iteration order is not guaranteed)
+              */
+
+
+             function valuesIn(object) {
+               return object == null ? [] : baseValues(object, keysIn(object));
+             }
+             /*------------------------------------------------------------------------*/
+
+             /**
+              * Clamps `number` within the inclusive `lower` and `upper` bounds.
+              *
+              * @static
+              * @memberOf _
+              * @since 4.0.0
+              * @category Number
+              * @param {number} number The number to clamp.
+              * @param {number} [lower] The lower bound.
+              * @param {number} upper The upper bound.
+              * @returns {number} Returns the clamped number.
+              * @example
+              *
+              * _.clamp(-10, -5, 5);
+              * // => -5
+              *
+              * _.clamp(10, -5, 5);
+              * // => 5
+              */
+
+
+             function clamp(number, lower, upper) {
+               if (upper === undefined$1) {
+                 upper = lower;
+                 lower = undefined$1;
+               }
+
+               if (upper !== undefined$1) {
+                 upper = toNumber(upper);
+                 upper = upper === upper ? upper : 0;
+               }
+
+               if (lower !== undefined$1) {
+                 lower = toNumber(lower);
+                 lower = lower === lower ? lower : 0;
+               }
+
+               return baseClamp(toNumber(number), lower, upper);
+             }
+             /**
+              * Checks if `n` is between `start` and up to, but not including, `end`. If
+              * `end` is not specified, it's set to `start` with `start` then set to `0`.
+              * If `start` is greater than `end` the params are swapped to support
+              * negative ranges.
+              *
+              * @static
+              * @memberOf _
+              * @since 3.3.0
+              * @category Number
+              * @param {number} number The number to check.
+              * @param {number} [start=0] The start of the range.
+              * @param {number} end The end of the range.
+              * @returns {boolean} Returns `true` if `number` is in the range, else `false`.
+              * @see _.range, _.rangeRight
+              * @example
+              *
+              * _.inRange(3, 2, 4);
+              * // => true
+              *
+              * _.inRange(4, 8);
+              * // => true
+              *
+              * _.inRange(4, 2);
+              * // => false
+              *
+              * _.inRange(2, 2);
+              * // => false
+              *
+              * _.inRange(1.2, 2);
+              * // => true
+              *
+              * _.inRange(5.2, 4);
+              * // => false
+              *
+              * _.inRange(-3, -2, -6);
+              * // => true
+              */
+
+
+             function inRange(number, start, end) {
+               start = toFinite(start);
+
+               if (end === undefined$1) {
+                 end = start;
+                 start = 0;
+               } else {
+                 end = toFinite(end);
+               }
+
+               number = toNumber(number);
+               return baseInRange(number, start, end);
+             }
+             /**
+              * Produces a random number between the inclusive `lower` and `upper` bounds.
+              * If only one argument is provided a number between `0` and the given number
+              * is returned. If `floating` is `true`, or either `lower` or `upper` are
+              * floats, a floating-point number is returned instead of an integer.
+              *
+              * **Note:** JavaScript follows the IEEE-754 standard for resolving
+              * floating-point values which can produce unexpected results.
+              *
+              * @static
+              * @memberOf _
+              * @since 0.7.0
+              * @category Number
+              * @param {number} [lower=0] The lower bound.
+              * @param {number} [upper=1] The upper bound.
+              * @param {boolean} [floating] Specify returning a floating-point number.
+              * @returns {number} Returns the random number.
+              * @example
+              *
+              * _.random(0, 5);
+              * // => an integer between 0 and 5
+              *
+              * _.random(5);
+              * // => also an integer between 0 and 5
+              *
+              * _.random(5, true);
+              * // => a floating-point number between 0 and 5
+              *
+              * _.random(1.2, 5.2);
+              * // => a floating-point number between 1.2 and 5.2
+              */
+
+
+             function random(lower, upper, floating) {
+               if (floating && typeof floating != 'boolean' && isIterateeCall(lower, upper, floating)) {
+                 upper = floating = undefined$1;
+               }
+
+               if (floating === undefined$1) {
+                 if (typeof upper == 'boolean') {
+                   floating = upper;
+                   upper = undefined$1;
+                 } else if (typeof lower == 'boolean') {
+                   floating = lower;
+                   lower = undefined$1;
+                 }
+               }
+
+               if (lower === undefined$1 && upper === undefined$1) {
+                 lower = 0;
+                 upper = 1;
+               } else {
+                 lower = toFinite(lower);
+
+                 if (upper === undefined$1) {
+                   upper = lower;
+                   lower = 0;
+                 } else {
+                   upper = toFinite(upper);
+                 }
+               }
+
+               if (lower > upper) {
+                 var temp = lower;
+                 lower = upper;
+                 upper = temp;
+               }
+
+               if (floating || lower % 1 || upper % 1) {
+                 var rand = nativeRandom();
+                 return nativeMin(lower + rand * (upper - lower + freeParseFloat('1e-' + ((rand + '').length - 1))), upper);
+               }
+
+               return baseRandom(lower, upper);
+             }
+             /*------------------------------------------------------------------------*/
+
+             /**
+              * Converts `string` to [camel case](https://en.wikipedia.org/wiki/CamelCase).
+              *
+              * @static
+              * @memberOf _
+              * @since 3.0.0
+              * @category String
+              * @param {string} [string=''] The string to convert.
+              * @returns {string} Returns the camel cased string.
+              * @example
+              *
+              * _.camelCase('Foo Bar');
+              * // => 'fooBar'
+              *
+              * _.camelCase('--foo-bar--');
+              * // => 'fooBar'
+              *
+              * _.camelCase('__FOO_BAR__');
+              * // => 'fooBar'
+              */
+
+
+             var camelCase = createCompounder(function (result, word, index) {
+               word = word.toLowerCase();
+               return result + (index ? capitalize(word) : word);
+             });
+             /**
+              * Converts the first character of `string` to upper case and the remaining
+              * to lower case.
+              *
+              * @static
+              * @memberOf _
+              * @since 3.0.0
+              * @category String
+              * @param {string} [string=''] The string to capitalize.
+              * @returns {string} Returns the capitalized string.
+              * @example
+              *
+              * _.capitalize('FRED');
+              * // => 'Fred'
+              */
+
+             function capitalize(string) {
+               return upperFirst(toString(string).toLowerCase());
+             }
+             /**
+              * Deburrs `string` by converting
+              * [Latin-1 Supplement](https://en.wikipedia.org/wiki/Latin-1_Supplement_(Unicode_block)#Character_table)
+              * and [Latin Extended-A](https://en.wikipedia.org/wiki/Latin_Extended-A)
+              * letters to basic Latin letters and removing
+              * [combining diacritical marks](https://en.wikipedia.org/wiki/Combining_Diacritical_Marks).
+              *
+              * @static
+              * @memberOf _
+              * @since 3.0.0
+              * @category String
+              * @param {string} [string=''] The string to deburr.
+              * @returns {string} Returns the deburred string.
+              * @example
+              *
+              * _.deburr('déjà vu');
+              * // => 'deja vu'
+              */
+
+
+             function deburr(string) {
+               string = toString(string);
+               return string && string.replace(reLatin, deburrLetter).replace(reComboMark, '');
+             }
+             /**
+              * Checks if `string` ends with the given target string.
+              *
+              * @static
+              * @memberOf _
+              * @since 3.0.0
+              * @category String
+              * @param {string} [string=''] The string to inspect.
+              * @param {string} [target] The string to search for.
+              * @param {number} [position=string.length] The position to search up to.
+              * @returns {boolean} Returns `true` if `string` ends with `target`,
+              *  else `false`.
+              * @example
+              *
+              * _.endsWith('abc', 'c');
+              * // => true
+              *
+              * _.endsWith('abc', 'b');
+              * // => false
+              *
+              * _.endsWith('abc', 'b', 2);
+              * // => true
+              */
+
+
+             function endsWith(string, target, position) {
+               string = toString(string);
+               target = baseToString(target);
+               var length = string.length;
+               position = position === undefined$1 ? length : baseClamp(toInteger(position), 0, length);
+               var end = position;
+               position -= target.length;
+               return position >= 0 && string.slice(position, end) == target;
+             }
+             /**
+              * Converts the characters "&", "<", ">", '"', and "'" in `string` to their
+              * corresponding HTML entities.
+              *
+              * **Note:** No other characters are escaped. To escape additional
+              * characters use a third-party library like [_he_](https://mths.be/he).
+              *
+              * Though the ">" character is escaped for symmetry, characters like
+              * ">" and "/" don't need escaping in HTML and have no special meaning
+              * unless they're part of a tag or unquoted attribute value. See
+              * [Mathias Bynens's article](https://mathiasbynens.be/notes/ambiguous-ampersands)
+              * (under "semi-related fun fact") for more details.
+              *
+              * When working with HTML you should always
+              * [quote attribute values](http://wonko.com/post/html-escaping) to reduce
+              * XSS vectors.
+              *
+              * @static
+              * @since 0.1.0
+              * @memberOf _
+              * @category String
+              * @param {string} [string=''] The string to escape.
+              * @returns {string} Returns the escaped string.
+              * @example
+              *
+              * _.escape('fred, barney, & pebbles');
+              * // => 'fred, barney, &amp; pebbles'
+              */
+
+
+             function escape(string) {
+               string = toString(string);
+               return string && reHasUnescapedHtml.test(string) ? string.replace(reUnescapedHtml, escapeHtmlChar) : string;
+             }
+             /**
+              * Escapes the `RegExp` special characters "^", "$", "\", ".", "*", "+",
+              * "?", "(", ")", "[", "]", "{", "}", and "|" in `string`.
+              *
+              * @static
+              * @memberOf _
+              * @since 3.0.0
+              * @category String
+              * @param {string} [string=''] The string to escape.
+              * @returns {string} Returns the escaped string.
+              * @example
+              *
+              * _.escapeRegExp('[lodash](https://lodash.com/)');
+              * // => '\[lodash\]\(https://lodash\.com/\)'
+              */
+
+
+             function escapeRegExp(string) {
+               string = toString(string);
+               return string && reHasRegExpChar.test(string) ? string.replace(reRegExpChar, '\\$&') : string;
+             }
+             /**
+              * Converts `string` to
+              * [kebab case](https://en.wikipedia.org/wiki/Letter_case#Special_case_styles).
+              *
+              * @static
+              * @memberOf _
+              * @since 3.0.0
+              * @category String
+              * @param {string} [string=''] The string to convert.
+              * @returns {string} Returns the kebab cased string.
+              * @example
+              *
+              * _.kebabCase('Foo Bar');
+              * // => 'foo-bar'
+              *
+              * _.kebabCase('fooBar');
+              * // => 'foo-bar'
+              *
+              * _.kebabCase('__FOO_BAR__');
+              * // => 'foo-bar'
+              */
+
+
+             var kebabCase = createCompounder(function (result, word, index) {
+               return result + (index ? '-' : '') + word.toLowerCase();
+             });
+             /**
+              * Converts `string`, as space separated words, to lower case.
+              *
+              * @static
+              * @memberOf _
+              * @since 4.0.0
+              * @category String
+              * @param {string} [string=''] The string to convert.
+              * @returns {string} Returns the lower cased string.
+              * @example
+              *
+              * _.lowerCase('--Foo-Bar--');
+              * // => 'foo bar'
+              *
+              * _.lowerCase('fooBar');
+              * // => 'foo bar'
+              *
+              * _.lowerCase('__FOO_BAR__');
+              * // => 'foo bar'
+              */
+
+             var lowerCase = createCompounder(function (result, word, index) {
+               return result + (index ? ' ' : '') + word.toLowerCase();
+             });
+             /**
+              * Converts the first character of `string` to lower case.
+              *
+              * @static
+              * @memberOf _
+              * @since 4.0.0
+              * @category String
+              * @param {string} [string=''] The string to convert.
+              * @returns {string} Returns the converted string.
+              * @example
+              *
+              * _.lowerFirst('Fred');
+              * // => 'fred'
+              *
+              * _.lowerFirst('FRED');
+              * // => 'fRED'
+              */
+
+             var lowerFirst = createCaseFirst('toLowerCase');
+             /**
+              * Pads `string` on the left and right sides if it's shorter than `length`.
+              * Padding characters are truncated if they can't be evenly divided by `length`.
+              *
+              * @static
+              * @memberOf _
+              * @since 3.0.0
+              * @category String
+              * @param {string} [string=''] The string to pad.
+              * @param {number} [length=0] The padding length.
+              * @param {string} [chars=' '] The string used as padding.
+              * @returns {string} Returns the padded string.
+              * @example
+              *
+              * _.pad('abc', 8);
+              * // => '  abc   '
+              *
+              * _.pad('abc', 8, '_-');
+              * // => '_-abc_-_'
+              *
+              * _.pad('abc', 3);
+              * // => 'abc'
+              */
+
+             function pad(string, length, chars) {
+               string = toString(string);
+               length = toInteger(length);
+               var strLength = length ? stringSize(string) : 0;
+
+               if (!length || strLength >= length) {
+                 return string;
+               }
+
+               var mid = (length - strLength) / 2;
+               return createPadding(nativeFloor(mid), chars) + string + createPadding(nativeCeil(mid), chars);
+             }
+             /**
+              * Pads `string` on the right side if it's shorter than `length`. Padding
+              * characters are truncated if they exceed `length`.
+              *
+              * @static
+              * @memberOf _
+              * @since 4.0.0
+              * @category String
+              * @param {string} [string=''] The string to pad.
+              * @param {number} [length=0] The padding length.
+              * @param {string} [chars=' '] The string used as padding.
+              * @returns {string} Returns the padded string.
+              * @example
+              *
+              * _.padEnd('abc', 6);
+              * // => 'abc   '
+              *
+              * _.padEnd('abc', 6, '_-');
+              * // => 'abc_-_'
+              *
+              * _.padEnd('abc', 3);
+              * // => 'abc'
+              */
+
+
+             function padEnd(string, length, chars) {
+               string = toString(string);
+               length = toInteger(length);
+               var strLength = length ? stringSize(string) : 0;
+               return length && strLength < length ? string + createPadding(length - strLength, chars) : string;
+             }
+             /**
+              * Pads `string` on the left side if it's shorter than `length`. Padding
+              * characters are truncated if they exceed `length`.
+              *
+              * @static
+              * @memberOf _
+              * @since 4.0.0
+              * @category String
+              * @param {string} [string=''] The string to pad.
+              * @param {number} [length=0] The padding length.
+              * @param {string} [chars=' '] The string used as padding.
+              * @returns {string} Returns the padded string.
+              * @example
+              *
+              * _.padStart('abc', 6);
+              * // => '   abc'
+              *
+              * _.padStart('abc', 6, '_-');
+              * // => '_-_abc'
+              *
+              * _.padStart('abc', 3);
+              * // => 'abc'
+              */
+
+
+             function padStart(string, length, chars) {
+               string = toString(string);
+               length = toInteger(length);
+               var strLength = length ? stringSize(string) : 0;
+               return length && strLength < length ? createPadding(length - strLength, chars) + string : string;
+             }
+             /**
+              * Converts `string` to an integer of the specified radix. If `radix` is
+              * `undefined` or `0`, a `radix` of `10` is used unless `value` is a
+              * hexadecimal, in which case a `radix` of `16` is used.
+              *
+              * **Note:** This method aligns with the
+              * [ES5 implementation](https://es5.github.io/#x15.1.2.2) of `parseInt`.
+              *
+              * @static
+              * @memberOf _
+              * @since 1.1.0
+              * @category String
+              * @param {string} string The string to convert.
+              * @param {number} [radix=10] The radix to interpret `value` by.
+              * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.
+              * @returns {number} Returns the converted integer.
+              * @example
+              *
+              * _.parseInt('08');
+              * // => 8
+              *
+              * _.map(['6', '08', '10'], _.parseInt);
+              * // => [6, 8, 10]
+              */
+
+
+             function parseInt(string, radix, guard) {
+               if (guard || radix == null) {
+                 radix = 0;
+               } else if (radix) {
+                 radix = +radix;
+               }
+
+               return nativeParseInt(toString(string).replace(reTrimStart, ''), radix || 0);
+             }
+             /**
+              * Repeats the given string `n` times.
+              *
+              * @static
+              * @memberOf _
+              * @since 3.0.0
+              * @category String
+              * @param {string} [string=''] The string to repeat.
+              * @param {number} [n=1] The number of times to repeat the string.
+              * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.
+              * @returns {string} Returns the repeated string.
+              * @example
+              *
+              * _.repeat('*', 3);
+              * // => '***'
+              *
+              * _.repeat('abc', 2);
+              * // => 'abcabc'
+              *
+              * _.repeat('abc', 0);
+              * // => ''
+              */
+
+
+             function repeat(string, n, guard) {
+               if (guard ? isIterateeCall(string, n, guard) : n === undefined$1) {
+                 n = 1;
+               } else {
+                 n = toInteger(n);
+               }
+
+               return baseRepeat(toString(string), n);
+             }
+             /**
+              * Replaces matches for `pattern` in `string` with `replacement`.
+              *
+              * **Note:** This method is based on
+              * [`String#replace`](https://mdn.io/String/replace).
+              *
+              * @static
+              * @memberOf _
+              * @since 4.0.0
+              * @category String
+              * @param {string} [string=''] The string to modify.
+              * @param {RegExp|string} pattern The pattern to replace.
+              * @param {Function|string} replacement The match replacement.
+              * @returns {string} Returns the modified string.
+              * @example
+              *
+              * _.replace('Hi Fred', 'Fred', 'Barney');
+              * // => 'Hi Barney'
+              */
+
+
+             function replace() {
+               var args = arguments,
+                   string = toString(args[0]);
+               return args.length < 3 ? string : string.replace(args[1], args[2]);
+             }
+             /**
+              * Converts `string` to
+              * [snake case](https://en.wikipedia.org/wiki/Snake_case).
+              *
+              * @static
+              * @memberOf _
+              * @since 3.0.0
+              * @category String
+              * @param {string} [string=''] The string to convert.
+              * @returns {string} Returns the snake cased string.
+              * @example
+              *
+              * _.snakeCase('Foo Bar');
+              * // => 'foo_bar'
+              *
+              * _.snakeCase('fooBar');
+              * // => 'foo_bar'
+              *
+              * _.snakeCase('--FOO-BAR--');
+              * // => 'foo_bar'
+              */
+
+
+             var snakeCase = createCompounder(function (result, word, index) {
+               return result + (index ? '_' : '') + word.toLowerCase();
+             });
+             /**
+              * Splits `string` by `separator`.
+              *
+              * **Note:** This method is based on
+              * [`String#split`](https://mdn.io/String/split).
+              *
+              * @static
+              * @memberOf _
+              * @since 4.0.0
+              * @category String
+              * @param {string} [string=''] The string to split.
+              * @param {RegExp|string} separator The separator pattern to split by.
+              * @param {number} [limit] The length to truncate results to.
+              * @returns {Array} Returns the string segments.
+              * @example
+              *
+              * _.split('a-b-c', '-', 2);
+              * // => ['a', 'b']
+              */
+
+             function split(string, separator, limit) {
+               if (limit && typeof limit != 'number' && isIterateeCall(string, separator, limit)) {
+                 separator = limit = undefined$1;
+               }
+
+               limit = limit === undefined$1 ? MAX_ARRAY_LENGTH : limit >>> 0;
+
+               if (!limit) {
+                 return [];
+               }
+
+               string = toString(string);
+
+               if (string && (typeof separator == 'string' || separator != null && !isRegExp(separator))) {
+                 separator = baseToString(separator);
+
+                 if (!separator && hasUnicode(string)) {
+                   return castSlice(stringToArray(string), 0, limit);
+                 }
+               }
+
+               return string.split(separator, limit);
+             }
+             /**
+              * Converts `string` to
+              * [start case](https://en.wikipedia.org/wiki/Letter_case#Stylistic_or_specialised_usage).
+              *
+              * @static
+              * @memberOf _
+              * @since 3.1.0
+              * @category String
+              * @param {string} [string=''] The string to convert.
+              * @returns {string} Returns the start cased string.
+              * @example
+              *
+              * _.startCase('--foo-bar--');
+              * // => 'Foo Bar'
+              *
+              * _.startCase('fooBar');
+              * // => 'Foo Bar'
+              *
+              * _.startCase('__FOO_BAR__');
+              * // => 'FOO BAR'
+              */
+
+
+             var startCase = createCompounder(function (result, word, index) {
+               return result + (index ? ' ' : '') + upperFirst(word);
+             });
+             /**
+              * Checks if `string` starts with the given target string.
+              *
+              * @static
+              * @memberOf _
+              * @since 3.0.0
+              * @category String
+              * @param {string} [string=''] The string to inspect.
+              * @param {string} [target] The string to search for.
+              * @param {number} [position=0] The position to search from.
+              * @returns {boolean} Returns `true` if `string` starts with `target`,
+              *  else `false`.
+              * @example
+              *
+              * _.startsWith('abc', 'a');
+              * // => true
+              *
+              * _.startsWith('abc', 'b');
+              * // => false
+              *
+              * _.startsWith('abc', 'b', 1);
+              * // => true
+              */
+
+             function startsWith(string, target, position) {
+               string = toString(string);
+               position = position == null ? 0 : baseClamp(toInteger(position), 0, string.length);
+               target = baseToString(target);
+               return string.slice(position, position + target.length) == target;
+             }
+             /**
+              * Creates a compiled template function that can interpolate data properties
+              * in "interpolate" delimiters, HTML-escape interpolated data properties in
+              * "escape" delimiters, and execute JavaScript in "evaluate" delimiters. Data
+              * properties may be accessed as free variables in the template. If a setting
+              * object is given, it takes precedence over `_.templateSettings` values.
+              *
+              * **Note:** In the development build `_.template` utilizes
+              * [sourceURLs](http://www.html5rocks.com/en/tutorials/developertools/sourcemaps/#toc-sourceurl)
+              * for easier debugging.
+              *
+              * For more information on precompiling templates see
+              * [lodash's custom builds documentation](https://lodash.com/custom-builds).
+              *
+              * For more information on Chrome extension sandboxes see
+              * [Chrome's extensions documentation](https://developer.chrome.com/extensions/sandboxingEval).
+              *
+              * @static
+              * @since 0.1.0
+              * @memberOf _
+              * @category String
+              * @param {string} [string=''] The template string.
+              * @param {Object} [options={}] The options object.
+              * @param {RegExp} [options.escape=_.templateSettings.escape]
+              *  The HTML "escape" delimiter.
+              * @param {RegExp} [options.evaluate=_.templateSettings.evaluate]
+              *  The "evaluate" delimiter.
+              * @param {Object} [options.imports=_.templateSettings.imports]
+              *  An object to import into the template as free variables.
+              * @param {RegExp} [options.interpolate=_.templateSettings.interpolate]
+              *  The "interpolate" delimiter.
+              * @param {string} [options.sourceURL='lodash.templateSources[n]']
+              *  The sourceURL of the compiled template.
+              * @param {string} [options.variable='obj']
+              *  The data object variable name.
+              * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.
+              * @returns {Function} Returns the compiled template function.
+              * @example
+              *
+              * // Use the "interpolate" delimiter to create a compiled template.
+              * var compiled = _.template('hello <%= user %>!');
+              * compiled({ 'user': 'fred' });
+              * // => 'hello fred!'
+              *
+              * // Use the HTML "escape" delimiter to escape data property values.
+              * var compiled = _.template('<b><%- value %></b>');
+              * compiled({ 'value': '<script>' });
+              * // => '<b>&lt;script&gt;</b>'
+              *
+              * // Use the "evaluate" delimiter to execute JavaScript and generate HTML.
+              * var compiled = _.template('<% _.forEach(users, function(user) { %><li><%- user %></li><% }); %>');
+              * compiled({ 'users': ['fred', 'barney'] });
+              * // => '<li>fred</li><li>barney</li>'
+              *
+              * // Use the internal `print` function in "evaluate" delimiters.
+              * var compiled = _.template('<% print("hello " + user); %>!');
+              * compiled({ 'user': 'barney' });
+              * // => 'hello barney!'
+              *
+              * // Use the ES template literal delimiter as an "interpolate" delimiter.
+              * // Disable support by replacing the "interpolate" delimiter.
+              * var compiled = _.template('hello ${ user }!');
+              * compiled({ 'user': 'pebbles' });
+              * // => 'hello pebbles!'
+              *
+              * // Use backslashes to treat delimiters as plain text.
+              * var compiled = _.template('<%= "\\<%- value %\\>" %>');
+              * compiled({ 'value': 'ignored' });
+              * // => '<%- value %>'
+              *
+              * // Use the `imports` option to import `jQuery` as `jq`.
+              * var text = '<% jq.each(users, function(user) { %><li><%- user %></li><% }); %>';
+              * var compiled = _.template(text, { 'imports': { 'jq': jQuery } });
+              * compiled({ 'users': ['fred', 'barney'] });
+              * // => '<li>fred</li><li>barney</li>'
+              *
+              * // Use the `sourceURL` option to specify a custom sourceURL for the template.
+              * var compiled = _.template('hello <%= user %>!', { 'sourceURL': '/basic/greeting.jst' });
+              * compiled(data);
+              * // => Find the source of "greeting.jst" under the Sources tab or Resources panel of the web inspector.
+              *
+              * // Use the `variable` option to ensure a with-statement isn't used in the compiled template.
+              * var compiled = _.template('hi <%= data.user %>!', { 'variable': 'data' });
+              * compiled.source;
+              * // => function(data) {
+              * //   var __t, __p = '';
+              * //   __p += 'hi ' + ((__t = ( data.user )) == null ? '' : __t) + '!';
+              * //   return __p;
+              * // }
+              *
+              * // Use custom template delimiters.
+              * _.templateSettings.interpolate = /{{([\s\S]+?)}}/g;
+              * var compiled = _.template('hello {{ user }}!');
+              * compiled({ 'user': 'mustache' });
+              * // => 'hello mustache!'
+              *
+              * // Use the `source` property to inline compiled templates for meaningful
+              * // line numbers in error messages and stack traces.
+              * fs.writeFileSync(path.join(process.cwd(), 'jst.js'), '\
+              *   var JST = {\
+              *     "main": ' + _.template(mainText).source + '\
+              *   };\
+              * ');
+              */
+
+
+             function template(string, options, guard) {
+               // Based on John Resig's `tmpl` implementation
+               // (http://ejohn.org/blog/javascript-micro-templating/)
+               // and Laura Doktorova's doT.js (https://github.com/olado/doT).
+               var settings = lodash.templateSettings;
+
+               if (guard && isIterateeCall(string, options, guard)) {
+                 options = undefined$1;
+               }
+
+               string = toString(string);
+               options = assignInWith({}, options, settings, customDefaultsAssignIn);
+               var imports = assignInWith({}, options.imports, settings.imports, customDefaultsAssignIn),
+                   importsKeys = keys(imports),
+                   importsValues = baseValues(imports, importsKeys);
+               var isEscaping,
+                   isEvaluating,
+                   index = 0,
+                   interpolate = options.interpolate || reNoMatch,
+                   source = "__p += '"; // Compile the regexp to match each delimiter.
+
+               var reDelimiters = RegExp((options.escape || reNoMatch).source + '|' + interpolate.source + '|' + (interpolate === reInterpolate ? reEsTemplate : reNoMatch).source + '|' + (options.evaluate || reNoMatch).source + '|$', 'g'); // Use a sourceURL for easier debugging.
+               // The sourceURL gets injected into the source that's eval-ed, so be careful
+               // to normalize all kinds of whitespace, so e.g. newlines (and unicode versions of it) can't sneak in
+               // and escape the comment, thus injecting code that gets evaled.
+
+               var sourceURL = '//# sourceURL=' + (hasOwnProperty.call(options, 'sourceURL') ? (options.sourceURL + '').replace(/\s/g, ' ') : 'lodash.templateSources[' + ++templateCounter + ']') + '\n';
+               string.replace(reDelimiters, function (match, escapeValue, interpolateValue, esTemplateValue, evaluateValue, offset) {
+                 interpolateValue || (interpolateValue = esTemplateValue); // Escape characters that can't be included in string literals.
+
+                 source += string.slice(index, offset).replace(reUnescapedString, escapeStringChar); // Replace delimiters with snippets.
+
+                 if (escapeValue) {
+                   isEscaping = true;
+                   source += "' +\n__e(" + escapeValue + ") +\n'";
+                 }
+
+                 if (evaluateValue) {
+                   isEvaluating = true;
+                   source += "';\n" + evaluateValue + ";\n__p += '";
+                 }
+
+                 if (interpolateValue) {
+                   source += "' +\n((__t = (" + interpolateValue + ")) == null ? '' : __t) +\n'";
+                 }
+
+                 index = offset + match.length; // The JS engine embedded in Adobe products needs `match` returned in
+                 // order to produce the correct `offset` value.
+
+                 return match;
+               });
+               source += "';\n"; // If `variable` is not specified wrap a with-statement around the generated
+               // code to add the data object to the top of the scope chain.
+
+               var variable = hasOwnProperty.call(options, 'variable') && options.variable;
+
+               if (!variable) {
+                 source = 'with (obj) {\n' + source + '\n}\n';
+               } // Throw an error if a forbidden character was found in `variable`, to prevent
+               // potential command injection attacks.
+               else if (reForbiddenIdentifierChars.test(variable)) {
+                 throw new Error(INVALID_TEMPL_VAR_ERROR_TEXT);
+               } // Cleanup code by stripping empty strings.
+
+
+               source = (isEvaluating ? source.replace(reEmptyStringLeading, '') : source).replace(reEmptyStringMiddle, '$1').replace(reEmptyStringTrailing, '$1;'); // Frame code as the function body.
+
+               source = 'function(' + (variable || 'obj') + ') {\n' + (variable ? '' : 'obj || (obj = {});\n') + "var __t, __p = ''" + (isEscaping ? ', __e = _.escape' : '') + (isEvaluating ? ', __j = Array.prototype.join;\n' + "function print() { __p += __j.call(arguments, '') }\n" : ';\n') + source + 'return __p\n}';
+               var result = attempt(function () {
+                 return Function(importsKeys, sourceURL + 'return ' + source).apply(undefined$1, importsValues);
+               }); // Provide the compiled function's source by its `toString` method or
+               // the `source` property as a convenience for inlining compiled templates.
+
+               result.source = source;
+
+               if (isError(result)) {
+                 throw result;
+               }
+
+               return result;
+             }
+             /**
+              * Converts `string`, as a whole, to lower case just like
+              * [String#toLowerCase](https://mdn.io/toLowerCase).
+              *
+              * @static
+              * @memberOf _
+              * @since 4.0.0
+              * @category String
+              * @param {string} [string=''] The string to convert.
+              * @returns {string} Returns the lower cased string.
+              * @example
+              *
+              * _.toLower('--Foo-Bar--');
+              * // => '--foo-bar--'
+              *
+              * _.toLower('fooBar');
+              * // => 'foobar'
+              *
+              * _.toLower('__FOO_BAR__');
+              * // => '__foo_bar__'
+              */
+
+
+             function toLower(value) {
+               return toString(value).toLowerCase();
+             }
+             /**
+              * Converts `string`, as a whole, to upper case just like
+              * [String#toUpperCase](https://mdn.io/toUpperCase).
+              *
+              * @static
+              * @memberOf _
+              * @since 4.0.0
+              * @category String
+              * @param {string} [string=''] The string to convert.
+              * @returns {string} Returns the upper cased string.
+              * @example
+              *
+              * _.toUpper('--foo-bar--');
+              * // => '--FOO-BAR--'
+              *
+              * _.toUpper('fooBar');
+              * // => 'FOOBAR'
+              *
+              * _.toUpper('__foo_bar__');
+              * // => '__FOO_BAR__'
+              */
+
+
+             function toUpper(value) {
+               return toString(value).toUpperCase();
+             }
+             /**
+              * Removes leading and trailing whitespace or specified characters from `string`.
+              *
+              * @static
+              * @memberOf _
+              * @since 3.0.0
+              * @category String
+              * @param {string} [string=''] The string to trim.
+              * @param {string} [chars=whitespace] The characters to trim.
+              * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.
+              * @returns {string} Returns the trimmed string.
+              * @example
+              *
+              * _.trim('  abc  ');
+              * // => 'abc'
+              *
+              * _.trim('-_-abc-_-', '_-');
+              * // => 'abc'
+              *
+              * _.map(['  foo  ', '  bar  '], _.trim);
+              * // => ['foo', 'bar']
+              */
+
+
+             function trim(string, chars, guard) {
+               string = toString(string);
+
+               if (string && (guard || chars === undefined$1)) {
+                 return baseTrim(string);
+               }
+
+               if (!string || !(chars = baseToString(chars))) {
+                 return string;
+               }
+
+               var strSymbols = stringToArray(string),
+                   chrSymbols = stringToArray(chars),
+                   start = charsStartIndex(strSymbols, chrSymbols),
+                   end = charsEndIndex(strSymbols, chrSymbols) + 1;
+               return castSlice(strSymbols, start, end).join('');
+             }
+             /**
+              * Removes trailing whitespace or specified characters from `string`.
+              *
+              * @static
+              * @memberOf _
+              * @since 4.0.0
+              * @category String
+              * @param {string} [string=''] The string to trim.
+              * @param {string} [chars=whitespace] The characters to trim.
+              * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.
+              * @returns {string} Returns the trimmed string.
+              * @example
+              *
+              * _.trimEnd('  abc  ');
+              * // => '  abc'
+              *
+              * _.trimEnd('-_-abc-_-', '_-');
+              * // => '-_-abc'
+              */
+
+
+             function trimEnd(string, chars, guard) {
+               string = toString(string);
+
+               if (string && (guard || chars === undefined$1)) {
+                 return string.slice(0, trimmedEndIndex(string) + 1);
+               }
+
+               if (!string || !(chars = baseToString(chars))) {
+                 return string;
+               }
+
+               var strSymbols = stringToArray(string),
+                   end = charsEndIndex(strSymbols, stringToArray(chars)) + 1;
+               return castSlice(strSymbols, 0, end).join('');
+             }
+             /**
+              * Removes leading whitespace or specified characters from `string`.
+              *
+              * @static
+              * @memberOf _
+              * @since 4.0.0
+              * @category String
+              * @param {string} [string=''] The string to trim.
+              * @param {string} [chars=whitespace] The characters to trim.
+              * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.
+              * @returns {string} Returns the trimmed string.
+              * @example
+              *
+              * _.trimStart('  abc  ');
+              * // => 'abc  '
+              *
+              * _.trimStart('-_-abc-_-', '_-');
+              * // => 'abc-_-'
+              */
+
+
+             function trimStart(string, chars, guard) {
+               string = toString(string);
+
+               if (string && (guard || chars === undefined$1)) {
+                 return string.replace(reTrimStart, '');
+               }
+
+               if (!string || !(chars = baseToString(chars))) {
+                 return string;
+               }
+
+               var strSymbols = stringToArray(string),
+                   start = charsStartIndex(strSymbols, stringToArray(chars));
+               return castSlice(strSymbols, start).join('');
+             }
+             /**
+              * Truncates `string` if it's longer than the given maximum string length.
+              * The last characters of the truncated string are replaced with the omission
+              * string which defaults to "...".
+              *
+              * @static
+              * @memberOf _
+              * @since 4.0.0
+              * @category String
+              * @param {string} [string=''] The string to truncate.
+              * @param {Object} [options={}] The options object.
+              * @param {number} [options.length=30] The maximum string length.
+              * @param {string} [options.omission='...'] The string to indicate text is omitted.
+              * @param {RegExp|string} [options.separator] The separator pattern to truncate to.
+              * @returns {string} Returns the truncated string.
+              * @example
+              *
+              * _.truncate('hi-diddly-ho there, neighborino');
+              * // => 'hi-diddly-ho there, neighbo...'
+              *
+              * _.truncate('hi-diddly-ho there, neighborino', {
+              *   'length': 24,
+              *   'separator': ' '
+              * });
+              * // => 'hi-diddly-ho there,...'
+              *
+              * _.truncate('hi-diddly-ho there, neighborino', {
+              *   'length': 24,
+              *   'separator': /,? +/
+              * });
+              * // => 'hi-diddly-ho there...'
+              *
+              * _.truncate('hi-diddly-ho there, neighborino', {
+              *   'omission': ' [...]'
+              * });
+              * // => 'hi-diddly-ho there, neig [...]'
+              */
+
+
+             function truncate(string, options) {
+               var length = DEFAULT_TRUNC_LENGTH,
+                   omission = DEFAULT_TRUNC_OMISSION;
+
+               if (isObject(options)) {
+                 var separator = 'separator' in options ? options.separator : separator;
+                 length = 'length' in options ? toInteger(options.length) : length;
+                 omission = 'omission' in options ? baseToString(options.omission) : omission;
+               }
+
+               string = toString(string);
+               var strLength = string.length;
+
+               if (hasUnicode(string)) {
+                 var strSymbols = stringToArray(string);
+                 strLength = strSymbols.length;
+               }
+
+               if (length >= strLength) {
+                 return string;
+               }
+
+               var end = length - stringSize(omission);
+
+               if (end < 1) {
+                 return omission;
+               }
+
+               var result = strSymbols ? castSlice(strSymbols, 0, end).join('') : string.slice(0, end);
+
+               if (separator === undefined$1) {
+                 return result + omission;
+               }
+
+               if (strSymbols) {
+                 end += result.length - end;
+               }
+
+               if (isRegExp(separator)) {
+                 if (string.slice(end).search(separator)) {
+                   var match,
+                       substring = result;
+
+                   if (!separator.global) {
+                     separator = RegExp(separator.source, toString(reFlags.exec(separator)) + 'g');
+                   }
+
+                   separator.lastIndex = 0;
+
+                   while (match = separator.exec(substring)) {
+                     var newEnd = match.index;
+                   }
+
+                   result = result.slice(0, newEnd === undefined$1 ? end : newEnd);
+                 }
+               } else if (string.indexOf(baseToString(separator), end) != end) {
+                 var index = result.lastIndexOf(separator);
+
+                 if (index > -1) {
+                   result = result.slice(0, index);
+                 }
+               }
+
+               return result + omission;
+             }
+             /**
+              * The inverse of `_.escape`; this method converts the HTML entities
+              * `&amp;`, `&lt;`, `&gt;`, `&quot;`, and `&#39;` in `string` to
+              * their corresponding characters.
+              *
+              * **Note:** No other HTML entities are unescaped. To unescape additional
+              * HTML entities use a third-party library like [_he_](https://mths.be/he).
+              *
+              * @static
+              * @memberOf _
+              * @since 0.6.0
+              * @category String
+              * @param {string} [string=''] The string to unescape.
+              * @returns {string} Returns the unescaped string.
+              * @example
+              *
+              * _.unescape('fred, barney, &amp; pebbles');
+              * // => 'fred, barney, & pebbles'
+              */
+
+
+             function unescape(string) {
+               string = toString(string);
+               return string && reHasEscapedHtml.test(string) ? string.replace(reEscapedHtml, unescapeHtmlChar) : string;
+             }
+             /**
+              * Converts `string`, as space separated words, to upper case.
+              *
+              * @static
+              * @memberOf _
+              * @since 4.0.0
+              * @category String
+              * @param {string} [string=''] The string to convert.
+              * @returns {string} Returns the upper cased string.
+              * @example
+              *
+              * _.upperCase('--foo-bar');
+              * // => 'FOO BAR'
+              *
+              * _.upperCase('fooBar');
+              * // => 'FOO BAR'
+              *
+              * _.upperCase('__foo_bar__');
+              * // => 'FOO BAR'
+              */
+
+
+             var upperCase = createCompounder(function (result, word, index) {
+               return result + (index ? ' ' : '') + word.toUpperCase();
+             });
+             /**
+              * Converts the first character of `string` to upper case.
+              *
+              * @static
+              * @memberOf _
+              * @since 4.0.0
+              * @category String
+              * @param {string} [string=''] The string to convert.
+              * @returns {string} Returns the converted string.
+              * @example
+              *
+              * _.upperFirst('fred');
+              * // => 'Fred'
+              *
+              * _.upperFirst('FRED');
+              * // => 'FRED'
+              */
+
+             var upperFirst = createCaseFirst('toUpperCase');
+             /**
+              * Splits `string` into an array of its words.
+              *
+              * @static
+              * @memberOf _
+              * @since 3.0.0
+              * @category String
+              * @param {string} [string=''] The string to inspect.
+              * @param {RegExp|string} [pattern] The pattern to match words.
+              * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.
+              * @returns {Array} Returns the words of `string`.
+              * @example
+              *
+              * _.words('fred, barney, & pebbles');
+              * // => ['fred', 'barney', 'pebbles']
+              *
+              * _.words('fred, barney, & pebbles', /[^, ]+/g);
+              * // => ['fred', 'barney', '&', 'pebbles']
+              */
+
+             function words(string, pattern, guard) {
+               string = toString(string);
+               pattern = guard ? undefined$1 : pattern;
+
+               if (pattern === undefined$1) {
+                 return hasUnicodeWord(string) ? unicodeWords(string) : asciiWords(string);
+               }
+
+               return string.match(pattern) || [];
+             }
+             /*------------------------------------------------------------------------*/
+
+             /**
+              * Attempts to invoke `func`, returning either the result or the caught error
+              * object. Any additional arguments are provided to `func` when it's invoked.
+              *
+              * @static
+              * @memberOf _
+              * @since 3.0.0
+              * @category Util
+              * @param {Function} func The function to attempt.
+              * @param {...*} [args] The arguments to invoke `func` with.
+              * @returns {*} Returns the `func` result or error object.
+              * @example
+              *
+              * // Avoid throwing errors for invalid selectors.
+              * var elements = _.attempt(function(selector) {
+              *   return document.querySelectorAll(selector);
+              * }, '>_>');
+              *
+              * if (_.isError(elements)) {
+              *   elements = [];
+              * }
+              */
+
+
+             var attempt = baseRest(function (func, args) {
+               try {
+                 return apply(func, undefined$1, args);
+               } catch (e) {
+                 return isError(e) ? e : new Error(e);
+               }
+             });
+             /**
+              * Binds methods of an object to the object itself, overwriting the existing
+              * method.
+              *
+              * **Note:** This method doesn't set the "length" property of bound functions.
+              *
+              * @static
+              * @since 0.1.0
+              * @memberOf _
+              * @category Util
+              * @param {Object} object The object to bind and assign the bound methods to.
+              * @param {...(string|string[])} methodNames The object method names to bind.
+              * @returns {Object} Returns `object`.
+              * @example
+              *
+              * var view = {
+              *   'label': 'docs',
+              *   'click': function() {
+              *     console.log('clicked ' + this.label);
+              *   }
+              * };
+              *
+              * _.bindAll(view, ['click']);
+              * jQuery(element).on('click', view.click);
+              * // => Logs 'clicked docs' when clicked.
+              */
+
+             var bindAll = flatRest(function (object, methodNames) {
+               arrayEach(methodNames, function (key) {
+                 key = toKey(key);
+                 baseAssignValue(object, key, bind(object[key], object));
+               });
+               return object;
+             });
+             /**
+              * Creates a function that iterates over `pairs` and invokes the corresponding
+              * function of the first predicate to return truthy. The predicate-function
+              * pairs are invoked with the `this` binding and arguments of the created
+              * function.
+              *
+              * @static
+              * @memberOf _
+              * @since 4.0.0
+              * @category Util
+              * @param {Array} pairs The predicate-function pairs.
+              * @returns {Function} Returns the new composite function.
+              * @example
+              *
+              * var func = _.cond([
+              *   [_.matches({ 'a': 1 }),           _.constant('matches A')],
+              *   [_.conforms({ 'b': _.isNumber }), _.constant('matches B')],
+              *   [_.stubTrue,                      _.constant('no match')]
+              * ]);
+              *
+              * func({ 'a': 1, 'b': 2 });
+              * // => 'matches A'
+              *
+              * func({ 'a': 0, 'b': 1 });
+              * // => 'matches B'
+              *
+              * func({ 'a': '1', 'b': '2' });
+              * // => 'no match'
+              */
+
+             function cond(pairs) {
+               var length = pairs == null ? 0 : pairs.length,
+                   toIteratee = getIteratee();
+               pairs = !length ? [] : arrayMap(pairs, function (pair) {
+                 if (typeof pair[1] != 'function') {
+                   throw new TypeError(FUNC_ERROR_TEXT);
+                 }
+
+                 return [toIteratee(pair[0]), pair[1]];
+               });
+               return baseRest(function (args) {
+                 var index = -1;
+
+                 while (++index < length) {
+                   var pair = pairs[index];
+
+                   if (apply(pair[0], this, args)) {
+                     return apply(pair[1], this, args);
+                   }
+                 }
+               });
+             }
+             /**
+              * Creates a function that invokes the predicate properties of `source` with
+              * the corresponding property values of a given object, returning `true` if
+              * all predicates return truthy, else `false`.
+              *
+              * **Note:** The created function is equivalent to `_.conformsTo` with
+              * `source` partially applied.
+              *
+              * @static
+              * @memberOf _
+              * @since 4.0.0
+              * @category Util
+              * @param {Object} source The object of property predicates to conform to.
+              * @returns {Function} Returns the new spec function.
+              * @example
+              *
+              * var objects = [
+              *   { 'a': 2, 'b': 1 },
+              *   { 'a': 1, 'b': 2 }
+              * ];
+              *
+              * _.filter(objects, _.conforms({ 'b': function(n) { return n > 1; } }));
+              * // => [{ 'a': 1, 'b': 2 }]
+              */
+
+
+             function conforms(source) {
+               return baseConforms(baseClone(source, CLONE_DEEP_FLAG));
+             }
+             /**
+              * Creates a function that returns `value`.
+              *
+              * @static
+              * @memberOf _
+              * @since 2.4.0
+              * @category Util
+              * @param {*} value The value to return from the new function.
+              * @returns {Function} Returns the new constant function.
+              * @example
+              *
+              * var objects = _.times(2, _.constant({ 'a': 1 }));
+              *
+              * console.log(objects);
+              * // => [{ 'a': 1 }, { 'a': 1 }]
+              *
+              * console.log(objects[0] === objects[1]);
+              * // => true
+              */
+
+
+             function constant(value) {
+               return function () {
+                 return value;
+               };
+             }
+             /**
+              * Checks `value` to determine whether a default value should be returned in
+              * its place. The `defaultValue` is returned if `value` is `NaN`, `null`,
+              * or `undefined`.
+              *
+              * @static
+              * @memberOf _
+              * @since 4.14.0
+              * @category Util
+              * @param {*} value The value to check.
+              * @param {*} defaultValue The default value.
+              * @returns {*} Returns the resolved value.
+              * @example
+              *
+              * _.defaultTo(1, 10);
+              * // => 1
+              *
+              * _.defaultTo(undefined, 10);
+              * // => 10
+              */
+
+
+             function defaultTo(value, defaultValue) {
+               return value == null || value !== value ? defaultValue : value;
+             }
+             /**
+              * Creates a function that returns the result of invoking the given functions
+              * with the `this` binding of the created function, where each successive
+              * invocation is supplied the return value of the previous.
+              *
+              * @static
+              * @memberOf _
+              * @since 3.0.0
+              * @category Util
+              * @param {...(Function|Function[])} [funcs] The functions to invoke.
+              * @returns {Function} Returns the new composite function.
+              * @see _.flowRight
+              * @example
+              *
+              * function square(n) {
+              *   return n * n;
+              * }
+              *
+              * var addSquare = _.flow([_.add, square]);
+              * addSquare(1, 2);
+              * // => 9
+              */
+
+
+             var flow = createFlow();
+             /**
+              * This method is like `_.flow` except that it creates a function that
+              * invokes the given functions from right to left.
+              *
+              * @static
+              * @since 3.0.0
+              * @memberOf _
+              * @category Util
+              * @param {...(Function|Function[])} [funcs] The functions to invoke.
+              * @returns {Function} Returns the new composite function.
+              * @see _.flow
+              * @example
+              *
+              * function square(n) {
+              *   return n * n;
+              * }
+              *
+              * var addSquare = _.flowRight([square, _.add]);
+              * addSquare(1, 2);
+              * // => 9
+              */
+
+             var flowRight = createFlow(true);
+             /**
+              * This method returns the first argument it receives.
+              *
+              * @static
+              * @since 0.1.0
+              * @memberOf _
+              * @category Util
+              * @param {*} value Any value.
+              * @returns {*} Returns `value`.
+              * @example
+              *
+              * var object = { 'a': 1 };
+              *
+              * console.log(_.identity(object) === object);
+              * // => true
+              */
+
+             function identity(value) {
+               return value;
+             }
+             /**
+              * Creates a function that invokes `func` with the arguments of the created
+              * function. If `func` is a property name, the created function returns the
+              * property value for a given element. If `func` is an array or object, the
+              * created function returns `true` for elements that contain the equivalent
+              * source properties, otherwise it returns `false`.
+              *
+              * @static
+              * @since 4.0.0
+              * @memberOf _
+              * @category Util
+              * @param {*} [func=_.identity] The value to convert to a callback.
+              * @returns {Function} Returns the callback.
+              * @example
+              *
+              * var users = [
+              *   { 'user': 'barney', 'age': 36, 'active': true },
+              *   { 'user': 'fred',   'age': 40, 'active': false }
+              * ];
+              *
+              * // The `_.matches` iteratee shorthand.
+              * _.filter(users, _.iteratee({ 'user': 'barney', 'active': true }));
+              * // => [{ 'user': 'barney', 'age': 36, 'active': true }]
+              *
+              * // The `_.matchesProperty` iteratee shorthand.
+              * _.filter(users, _.iteratee(['user', 'fred']));
+              * // => [{ 'user': 'fred', 'age': 40 }]
+              *
+              * // The `_.property` iteratee shorthand.
+              * _.map(users, _.iteratee('user'));
+              * // => ['barney', 'fred']
+              *
+              * // Create custom iteratee shorthands.
+              * _.iteratee = _.wrap(_.iteratee, function(iteratee, func) {
+              *   return !_.isRegExp(func) ? iteratee(func) : function(string) {
+              *     return func.test(string);
+              *   };
+              * });
+              *
+              * _.filter(['abc', 'def'], /ef/);
+              * // => ['def']
+              */
+
+
+             function iteratee(func) {
+               return baseIteratee(typeof func == 'function' ? func : baseClone(func, CLONE_DEEP_FLAG));
+             }
+             /**
+              * Creates a function that performs a partial deep comparison between a given
+              * object and `source`, returning `true` if the given object has equivalent
+              * property values, else `false`.
+              *
+              * **Note:** The created function is equivalent to `_.isMatch` with `source`
+              * partially applied.
+              *
+              * Partial comparisons will match empty array and empty object `source`
+              * values against any array or object value, respectively. See `_.isEqual`
+              * for a list of supported value comparisons.
+              *
+              * **Note:** Multiple values can be checked by combining several matchers
+              * using `_.overSome`
+              *
+              * @static
+              * @memberOf _
+              * @since 3.0.0
+              * @category Util
+              * @param {Object} source The object of property values to match.
+              * @returns {Function} Returns the new spec function.
+              * @example
+              *
+              * var objects = [
+              *   { 'a': 1, 'b': 2, 'c': 3 },
+              *   { 'a': 4, 'b': 5, 'c': 6 }
+              * ];
+              *
+              * _.filter(objects, _.matches({ 'a': 4, 'c': 6 }));
+              * // => [{ 'a': 4, 'b': 5, 'c': 6 }]
+              *
+              * // Checking for several possible values
+              * _.filter(objects, _.overSome([_.matches({ 'a': 1 }), _.matches({ 'a': 4 })]));
+              * // => [{ 'a': 1, 'b': 2, 'c': 3 }, { 'a': 4, 'b': 5, 'c': 6 }]
+              */
+
+
+             function matches(source) {
+               return baseMatches(baseClone(source, CLONE_DEEP_FLAG));
+             }
+             /**
+              * Creates a function that performs a partial deep comparison between the
+              * value at `path` of a given object to `srcValue`, returning `true` if the
+              * object value is equivalent, else `false`.
+              *
+              * **Note:** Partial comparisons will match empty array and empty object
+              * `srcValue` values against any array or object value, respectively. See
+              * `_.isEqual` for a list of supported value comparisons.
+              *
+              * **Note:** Multiple values can be checked by combining several matchers
+              * using `_.overSome`
+              *
+              * @static
+              * @memberOf _
+              * @since 3.2.0
+              * @category Util
+              * @param {Array|string} path The path of the property to get.
+              * @param {*} srcValue The value to match.
+              * @returns {Function} Returns the new spec function.
+              * @example
+              *
+              * var objects = [
+              *   { 'a': 1, 'b': 2, 'c': 3 },
+              *   { 'a': 4, 'b': 5, 'c': 6 }
+              * ];
+              *
+              * _.find(objects, _.matchesProperty('a', 4));
+              * // => { 'a': 4, 'b': 5, 'c': 6 }
+              *
+              * // Checking for several possible values
+              * _.filter(objects, _.overSome([_.matchesProperty('a', 1), _.matchesProperty('a', 4)]));
+              * // => [{ 'a': 1, 'b': 2, 'c': 3 }, { 'a': 4, 'b': 5, 'c': 6 }]
+              */
+
+
+             function matchesProperty(path, srcValue) {
+               return baseMatchesProperty(path, baseClone(srcValue, CLONE_DEEP_FLAG));
+             }
+             /**
+              * Creates a function that invokes the method at `path` of a given object.
+              * Any additional arguments are provided to the invoked method.
+              *
+              * @static
+              * @memberOf _
+              * @since 3.7.0
+              * @category Util
+              * @param {Array|string} path The path of the method to invoke.
+              * @param {...*} [args] The arguments to invoke the method with.
+              * @returns {Function} Returns the new invoker function.
+              * @example
+              *
+              * var objects = [
+              *   { 'a': { 'b': _.constant(2) } },
+              *   { 'a': { 'b': _.constant(1) } }
+              * ];
+              *
+              * _.map(objects, _.method('a.b'));
+              * // => [2, 1]
+              *
+              * _.map(objects, _.method(['a', 'b']));
+              * // => [2, 1]
+              */
+
+
+             var method = baseRest(function (path, args) {
+               return function (object) {
+                 return baseInvoke(object, path, args);
+               };
+             });
+             /**
+              * The opposite of `_.method`; this method creates a function that invokes
+              * the method at a given path of `object`. Any additional arguments are
+              * provided to the invoked method.
+              *
+              * @static
+              * @memberOf _
+              * @since 3.7.0
+              * @category Util
+              * @param {Object} object The object to query.
+              * @param {...*} [args] The arguments to invoke the method with.
+              * @returns {Function} Returns the new invoker function.
+              * @example
+              *
+              * var array = _.times(3, _.constant),
+              *     object = { 'a': array, 'b': array, 'c': array };
+              *
+              * _.map(['a[2]', 'c[0]'], _.methodOf(object));
+              * // => [2, 0]
+              *
+              * _.map([['a', '2'], ['c', '0']], _.methodOf(object));
+              * // => [2, 0]
+              */
+
+             var methodOf = baseRest(function (object, args) {
+               return function (path) {
+                 return baseInvoke(object, path, args);
+               };
+             });
+             /**
+              * Adds all own enumerable string keyed function properties of a source
+              * object to the destination object. If `object` is a function, then methods
+              * are added to its prototype as well.
+              *
+              * **Note:** Use `_.runInContext` to create a pristine `lodash` function to
+              * avoid conflicts caused by modifying the original.
+              *
+              * @static
+              * @since 0.1.0
+              * @memberOf _
+              * @category Util
+              * @param {Function|Object} [object=lodash] The destination object.
+              * @param {Object} source The object of functions to add.
+              * @param {Object} [options={}] The options object.
+              * @param {boolean} [options.chain=true] Specify whether mixins are chainable.
+              * @returns {Function|Object} Returns `object`.
+              * @example
+              *
+              * function vowels(string) {
+              *   return _.filter(string, function(v) {
+              *     return /[aeiou]/i.test(v);
+              *   });
+              * }
+              *
+              * _.mixin({ 'vowels': vowels });
+              * _.vowels('fred');
+              * // => ['e']
+              *
+              * _('fred').vowels().value();
+              * // => ['e']
+              *
+              * _.mixin({ 'vowels': vowels }, { 'chain': false });
+              * _('fred').vowels();
+              * // => ['e']
+              */
+
+             function mixin(object, source, options) {
+               var props = keys(source),
+                   methodNames = baseFunctions(source, props);
+
+               if (options == null && !(isObject(source) && (methodNames.length || !props.length))) {
+                 options = source;
+                 source = object;
+                 object = this;
+                 methodNames = baseFunctions(source, keys(source));
+               }
+
+               var chain = !(isObject(options) && 'chain' in options) || !!options.chain,
+                   isFunc = isFunction(object);
+               arrayEach(methodNames, function (methodName) {
+                 var func = source[methodName];
+                 object[methodName] = func;
+
+                 if (isFunc) {
+                   object.prototype[methodName] = function () {
+                     var chainAll = this.__chain__;
+
+                     if (chain || chainAll) {
+                       var result = object(this.__wrapped__),
+                           actions = result.__actions__ = copyArray(this.__actions__);
+                       actions.push({
+                         'func': func,
+                         'args': arguments,
+                         'thisArg': object
+                       });
+                       result.__chain__ = chainAll;
+                       return result;
+                     }
+
+                     return func.apply(object, arrayPush([this.value()], arguments));
+                   };
+                 }
+               });
+               return object;
+             }
+             /**
+              * Reverts the `_` variable to its previous value and returns a reference to
+              * the `lodash` function.
+              *
+              * @static
+              * @since 0.1.0
+              * @memberOf _
+              * @category Util
+              * @returns {Function} Returns the `lodash` function.
+              * @example
+              *
+              * var lodash = _.noConflict();
+              */
+
+
+             function noConflict() {
+               if (root._ === this) {
+                 root._ = oldDash;
+               }
+
+               return this;
+             }
+             /**
+              * This method returns `undefined`.
+              *
+              * @static
+              * @memberOf _
+              * @since 2.3.0
+              * @category Util
+              * @example
+              *
+              * _.times(2, _.noop);
+              * // => [undefined, undefined]
+              */
+
+
+             function noop() {// No operation performed.
+             }
+             /**
+              * Creates a function that gets the argument at index `n`. If `n` is negative,
+              * the nth argument from the end is returned.
+              *
+              * @static
+              * @memberOf _
+              * @since 4.0.0
+              * @category Util
+              * @param {number} [n=0] The index of the argument to return.
+              * @returns {Function} Returns the new pass-thru function.
+              * @example
+              *
+              * var func = _.nthArg(1);
+              * func('a', 'b', 'c', 'd');
+              * // => 'b'
+              *
+              * var func = _.nthArg(-2);
+              * func('a', 'b', 'c', 'd');
+              * // => 'c'
+              */
+
+
+             function nthArg(n) {
+               n = toInteger(n);
+               return baseRest(function (args) {
+                 return baseNth(args, n);
+               });
+             }
+             /**
+              * Creates a function that invokes `iteratees` with the arguments it receives
+              * and returns their results.
+              *
+              * @static
+              * @memberOf _
+              * @since 4.0.0
+              * @category Util
+              * @param {...(Function|Function[])} [iteratees=[_.identity]]
+              *  The iteratees to invoke.
+              * @returns {Function} Returns the new function.
+              * @example
+              *
+              * var func = _.over([Math.max, Math.min]);
+              *
+              * func(1, 2, 3, 4);
+              * // => [4, 1]
+              */
+
+
+             var over = createOver(arrayMap);
+             /**
+              * Creates a function that checks if **all** of the `predicates` return
+              * truthy when invoked with the arguments it receives.
+              *
+              * Following shorthands are possible for providing predicates.
+              * Pass an `Object` and it will be used as an parameter for `_.matches` to create the predicate.
+              * Pass an `Array` of parameters for `_.matchesProperty` and the predicate will be created using them.
+              *
+              * @static
+              * @memberOf _
+              * @since 4.0.0
+              * @category Util
+              * @param {...(Function|Function[])} [predicates=[_.identity]]
+              *  The predicates to check.
+              * @returns {Function} Returns the new function.
+              * @example
+              *
+              * var func = _.overEvery([Boolean, isFinite]);
+              *
+              * func('1');
+              * // => true
+              *
+              * func(null);
+              * // => false
+              *
+              * func(NaN);
+              * // => false
+              */
+
+             var overEvery = createOver(arrayEvery);
+             /**
+              * Creates a function that checks if **any** of the `predicates` return
+              * truthy when invoked with the arguments it receives.
+              *
+              * Following shorthands are possible for providing predicates.
+              * Pass an `Object` and it will be used as an parameter for `_.matches` to create the predicate.
+              * Pass an `Array` of parameters for `_.matchesProperty` and the predicate will be created using them.
+              *
+              * @static
+              * @memberOf _
+              * @since 4.0.0
+              * @category Util
+              * @param {...(Function|Function[])} [predicates=[_.identity]]
+              *  The predicates to check.
+              * @returns {Function} Returns the new function.
+              * @example
+              *
+              * var func = _.overSome([Boolean, isFinite]);
+              *
+              * func('1');
+              * // => true
+              *
+              * func(null);
+              * // => true
+              *
+              * func(NaN);
+              * // => false
+              *
+              * var matchesFunc = _.overSome([{ 'a': 1 }, { 'a': 2 }])
+              * var matchesPropertyFunc = _.overSome([['a', 1], ['a', 2]])
+              */
+
+             var overSome = createOver(arraySome);
+             /**
+              * Creates a function that returns the value at `path` of a given object.
+              *
+              * @static
+              * @memberOf _
+              * @since 2.4.0
+              * @category Util
+              * @param {Array|string} path The path of the property to get.
+              * @returns {Function} Returns the new accessor function.
+              * @example
+              *
+              * var objects = [
+              *   { 'a': { 'b': 2 } },
+              *   { 'a': { 'b': 1 } }
+              * ];
+              *
+              * _.map(objects, _.property('a.b'));
+              * // => [2, 1]
+              *
+              * _.map(_.sortBy(objects, _.property(['a', 'b'])), 'a.b');
+              * // => [1, 2]
+              */
+
+             function property(path) {
+               return isKey(path) ? baseProperty(toKey(path)) : basePropertyDeep(path);
+             }
+             /**
+              * The opposite of `_.property`; this method creates a function that returns
+              * the value at a given path of `object`.
+              *
+              * @static
+              * @memberOf _
+              * @since 3.0.0
+              * @category Util
+              * @param {Object} object The object to query.
+              * @returns {Function} Returns the new accessor function.
+              * @example
+              *
+              * var array = [0, 1, 2],
+              *     object = { 'a': array, 'b': array, 'c': array };
+              *
+              * _.map(['a[2]', 'c[0]'], _.propertyOf(object));
+              * // => [2, 0]
+              *
+              * _.map([['a', '2'], ['c', '0']], _.propertyOf(object));
+              * // => [2, 0]
+              */
+
+
+             function propertyOf(object) {
+               return function (path) {
+                 return object == null ? undefined$1 : baseGet(object, path);
+               };
+             }
+             /**
+              * Creates an array of numbers (positive and/or negative) progressing from
+              * `start` up to, but not including, `end`. A step of `-1` is used if a negative
+              * `start` is specified without an `end` or `step`. If `end` is not specified,
+              * it's set to `start` with `start` then set to `0`.
+              *
+              * **Note:** JavaScript follows the IEEE-754 standard for resolving
+              * floating-point values which can produce unexpected results.
+              *
+              * @static
+              * @since 0.1.0
+              * @memberOf _
+              * @category Util
+              * @param {number} [start=0] The start of the range.
+              * @param {number} end The end of the range.
+              * @param {number} [step=1] The value to increment or decrement by.
+              * @returns {Array} Returns the range of numbers.
+              * @see _.inRange, _.rangeRight
+              * @example
+              *
+              * _.range(4);
+              * // => [0, 1, 2, 3]
+              *
+              * _.range(-4);
+              * // => [0, -1, -2, -3]
+              *
+              * _.range(1, 5);
+              * // => [1, 2, 3, 4]
+              *
+              * _.range(0, 20, 5);
+              * // => [0, 5, 10, 15]
+              *
+              * _.range(0, -4, -1);
+              * // => [0, -1, -2, -3]
+              *
+              * _.range(1, 4, 0);
+              * // => [1, 1, 1]
+              *
+              * _.range(0);
+              * // => []
+              */
+
+
+             var range = createRange();
+             /**
+              * This method is like `_.range` except that it populates values in
+              * descending order.
+              *
+              * @static
+              * @memberOf _
+              * @since 4.0.0
+              * @category Util
+              * @param {number} [start=0] The start of the range.
+              * @param {number} end The end of the range.
+              * @param {number} [step=1] The value to increment or decrement by.
+              * @returns {Array} Returns the range of numbers.
+              * @see _.inRange, _.range
+              * @example
+              *
+              * _.rangeRight(4);
+              * // => [3, 2, 1, 0]
+              *
+              * _.rangeRight(-4);
+              * // => [-3, -2, -1, 0]
+              *
+              * _.rangeRight(1, 5);
+              * // => [4, 3, 2, 1]
+              *
+              * _.rangeRight(0, 20, 5);
+              * // => [15, 10, 5, 0]
+              *
+              * _.rangeRight(0, -4, -1);
+              * // => [-3, -2, -1, 0]
+              *
+              * _.rangeRight(1, 4, 0);
+              * // => [1, 1, 1]
+              *
+              * _.rangeRight(0);
+              * // => []
+              */
+
+             var rangeRight = createRange(true);
+             /**
+              * This method returns a new empty array.
+              *
+              * @static
+              * @memberOf _
+              * @since 4.13.0
+              * @category Util
+              * @returns {Array} Returns the new empty array.
+              * @example
+              *
+              * var arrays = _.times(2, _.stubArray);
+              *
+              * console.log(arrays);
+              * // => [[], []]
+              *
+              * console.log(arrays[0] === arrays[1]);
+              * // => false
+              */
+
+             function stubArray() {
+               return [];
+             }
+             /**
+              * This method returns `false`.
+              *
+              * @static
+              * @memberOf _
+              * @since 4.13.0
+              * @category Util
+              * @returns {boolean} Returns `false`.
+              * @example
+              *
+              * _.times(2, _.stubFalse);
+              * // => [false, false]
+              */
+
+
+             function stubFalse() {
+               return false;
+             }
+             /**
+              * This method returns a new empty object.
+              *
+              * @static
+              * @memberOf _
+              * @since 4.13.0
+              * @category Util
+              * @returns {Object} Returns the new empty object.
+              * @example
+              *
+              * var objects = _.times(2, _.stubObject);
+              *
+              * console.log(objects);
+              * // => [{}, {}]
+              *
+              * console.log(objects[0] === objects[1]);
+              * // => false
+              */
+
+
+             function stubObject() {
+               return {};
+             }
+             /**
+              * This method returns an empty string.
+              *
+              * @static
+              * @memberOf _
+              * @since 4.13.0
+              * @category Util
+              * @returns {string} Returns the empty string.
+              * @example
+              *
+              * _.times(2, _.stubString);
+              * // => ['', '']
+              */
+
+
+             function stubString() {
+               return '';
+             }
+             /**
+              * This method returns `true`.
+              *
+              * @static
+              * @memberOf _
+              * @since 4.13.0
+              * @category Util
+              * @returns {boolean} Returns `true`.
+              * @example
+              *
+              * _.times(2, _.stubTrue);
+              * // => [true, true]
+              */
+
+
+             function stubTrue() {
+               return true;
+             }
+             /**
+              * Invokes the iteratee `n` times, returning an array of the results of
+              * each invocation. The iteratee is invoked with one argument; (index).
+              *
+              * @static
+              * @since 0.1.0
+              * @memberOf _
+              * @category Util
+              * @param {number} n The number of times to invoke `iteratee`.
+              * @param {Function} [iteratee=_.identity] The function invoked per iteration.
+              * @returns {Array} Returns the array of results.
+              * @example
+              *
+              * _.times(3, String);
+              * // => ['0', '1', '2']
+              *
+              *  _.times(4, _.constant(0));
+              * // => [0, 0, 0, 0]
+              */
+
+
+             function times(n, iteratee) {
+               n = toInteger(n);
+
+               if (n < 1 || n > MAX_SAFE_INTEGER) {
+                 return [];
+               }
+
+               var index = MAX_ARRAY_LENGTH,
+                   length = nativeMin(n, MAX_ARRAY_LENGTH);
+               iteratee = getIteratee(iteratee);
+               n -= MAX_ARRAY_LENGTH;
+               var result = baseTimes(length, iteratee);
+
+               while (++index < n) {
+                 iteratee(index);
+               }
+
+               return result;
+             }
+             /**
+              * Converts `value` to a property path array.
+              *
+              * @static
+              * @memberOf _
+              * @since 4.0.0
+              * @category Util
+              * @param {*} value The value to convert.
+              * @returns {Array} Returns the new property path array.
+              * @example
+              *
+              * _.toPath('a.b.c');
+              * // => ['a', 'b', 'c']
+              *
+              * _.toPath('a[0].b.c');
+              * // => ['a', '0', 'b', 'c']
+              */
+
+
+             function toPath(value) {
+               if (isArray(value)) {
+                 return arrayMap(value, toKey);
+               }
+
+               return isSymbol(value) ? [value] : copyArray(stringToPath(toString(value)));
+             }
+             /**
+              * Generates a unique ID. If `prefix` is given, the ID is appended to it.
+              *
+              * @static
+              * @since 0.1.0
+              * @memberOf _
+              * @category Util
+              * @param {string} [prefix=''] The value to prefix the ID with.
+              * @returns {string} Returns the unique ID.
+              * @example
+              *
+              * _.uniqueId('contact_');
+              * // => 'contact_104'
+              *
+              * _.uniqueId();
+              * // => '105'
+              */
+
+
+             function uniqueId(prefix) {
+               var id = ++idCounter;
+               return toString(prefix) + id;
+             }
+             /*------------------------------------------------------------------------*/
+
+             /**
+              * Adds two numbers.
+              *
+              * @static
+              * @memberOf _
+              * @since 3.4.0
+              * @category Math
+              * @param {number} augend The first number in an addition.
+              * @param {number} addend The second number in an addition.
+              * @returns {number} Returns the total.
+              * @example
+              *
+              * _.add(6, 4);
+              * // => 10
+              */
+
+
+             var add = createMathOperation(function (augend, addend) {
+               return augend + addend;
+             }, 0);
+             /**
+              * Computes `number` rounded up to `precision`.
+              *
+              * @static
+              * @memberOf _
+              * @since 3.10.0
+              * @category Math
+              * @param {number} number The number to round up.
+              * @param {number} [precision=0] The precision to round up to.
+              * @returns {number} Returns the rounded up number.
+              * @example
+              *
+              * _.ceil(4.006);
+              * // => 5
+              *
+              * _.ceil(6.004, 2);
+              * // => 6.01
+              *
+              * _.ceil(6040, -2);
+              * // => 6100
+              */
+
+             var ceil = createRound('ceil');
+             /**
+              * Divide two numbers.
+              *
+              * @static
+              * @memberOf _
+              * @since 4.7.0
+              * @category Math
+              * @param {number} dividend The first number in a division.
+              * @param {number} divisor The second number in a division.
+              * @returns {number} Returns the quotient.
+              * @example
+              *
+              * _.divide(6, 4);
+              * // => 1.5
+              */
+
+             var divide = createMathOperation(function (dividend, divisor) {
+               return dividend / divisor;
+             }, 1);
+             /**
+              * Computes `number` rounded down to `precision`.
+              *
+              * @static
+              * @memberOf _
+              * @since 3.10.0
+              * @category Math
+              * @param {number} number The number to round down.
+              * @param {number} [precision=0] The precision to round down to.
+              * @returns {number} Returns the rounded down number.
+              * @example
+              *
+              * _.floor(4.006);
+              * // => 4
+              *
+              * _.floor(0.046, 2);
+              * // => 0.04
+              *
+              * _.floor(4060, -2);
+              * // => 4000
+              */
+
+             var floor = createRound('floor');
+             /**
+              * Computes the maximum value of `array`. If `array` is empty or falsey,
+              * `undefined` is returned.
+              *
+              * @static
+              * @since 0.1.0
+              * @memberOf _
+              * @category Math
+              * @param {Array} array The array to iterate over.
+              * @returns {*} Returns the maximum value.
+              * @example
+              *
+              * _.max([4, 2, 8, 6]);
+              * // => 8
+              *
+              * _.max([]);
+              * // => undefined
+              */
+
+             function max(array) {
+               return array && array.length ? baseExtremum(array, identity, baseGt) : undefined$1;
+             }
+             /**
+              * This method is like `_.max` except that it accepts `iteratee` which is
+              * invoked for each element in `array` to generate the criterion by which
+              * the value is ranked. The iteratee is invoked with one argument: (value).
+              *
+              * @static
+              * @memberOf _
+              * @since 4.0.0
+              * @category Math
+              * @param {Array} array The array to iterate over.
+              * @param {Function} [iteratee=_.identity] The iteratee invoked per element.
+              * @returns {*} Returns the maximum value.
+              * @example
+              *
+              * var objects = [{ 'n': 1 }, { 'n': 2 }];
+              *
+              * _.maxBy(objects, function(o) { return o.n; });
+              * // => { 'n': 2 }
+              *
+              * // The `_.property` iteratee shorthand.
+              * _.maxBy(objects, 'n');
+              * // => { 'n': 2 }
+              */
+
+
+             function maxBy(array, iteratee) {
+               return array && array.length ? baseExtremum(array, getIteratee(iteratee, 2), baseGt) : undefined$1;
+             }
+             /**
+              * Computes the mean of the values in `array`.
+              *
+              * @static
+              * @memberOf _
+              * @since 4.0.0
+              * @category Math
+              * @param {Array} array The array to iterate over.
+              * @returns {number} Returns the mean.
+              * @example
+              *
+              * _.mean([4, 2, 8, 6]);
+              * // => 5
+              */
+
+
+             function mean(array) {
+               return baseMean(array, identity);
+             }
+             /**
+              * This method is like `_.mean` except that it accepts `iteratee` which is
+              * invoked for each element in `array` to generate the value to be averaged.
+              * The iteratee is invoked with one argument: (value).
+              *
+              * @static
+              * @memberOf _
+              * @since 4.7.0
+              * @category Math
+              * @param {Array} array The array to iterate over.
+              * @param {Function} [iteratee=_.identity] The iteratee invoked per element.
+              * @returns {number} Returns the mean.
+              * @example
+              *
+              * var objects = [{ 'n': 4 }, { 'n': 2 }, { 'n': 8 }, { 'n': 6 }];
+              *
+              * _.meanBy(objects, function(o) { return o.n; });
+              * // => 5
+              *
+              * // The `_.property` iteratee shorthand.
+              * _.meanBy(objects, 'n');
+              * // => 5
+              */
+
+
+             function meanBy(array, iteratee) {
+               return baseMean(array, getIteratee(iteratee, 2));
+             }
+             /**
+              * Computes the minimum value of `array`. If `array` is empty or falsey,
+              * `undefined` is returned.
+              *
+              * @static
+              * @since 0.1.0
+              * @memberOf _
+              * @category Math
+              * @param {Array} array The array to iterate over.
+              * @returns {*} Returns the minimum value.
+              * @example
+              *
+              * _.min([4, 2, 8, 6]);
+              * // => 2
+              *
+              * _.min([]);
+              * // => undefined
+              */
+
+
+             function min(array) {
+               return array && array.length ? baseExtremum(array, identity, baseLt) : undefined$1;
+             }
+             /**
+              * This method is like `_.min` except that it accepts `iteratee` which is
+              * invoked for each element in `array` to generate the criterion by which
+              * the value is ranked. The iteratee is invoked with one argument: (value).
+              *
+              * @static
+              * @memberOf _
+              * @since 4.0.0
+              * @category Math
+              * @param {Array} array The array to iterate over.
+              * @param {Function} [iteratee=_.identity] The iteratee invoked per element.
+              * @returns {*} Returns the minimum value.
+              * @example
+              *
+              * var objects = [{ 'n': 1 }, { 'n': 2 }];
+              *
+              * _.minBy(objects, function(o) { return o.n; });
+              * // => { 'n': 1 }
+              *
+              * // The `_.property` iteratee shorthand.
+              * _.minBy(objects, 'n');
+              * // => { 'n': 1 }
+              */
+
+
+             function minBy(array, iteratee) {
+               return array && array.length ? baseExtremum(array, getIteratee(iteratee, 2), baseLt) : undefined$1;
+             }
+             /**
+              * Multiply two numbers.
+              *
+              * @static
+              * @memberOf _
+              * @since 4.7.0
+              * @category Math
+              * @param {number} multiplier The first number in a multiplication.
+              * @param {number} multiplicand The second number in a multiplication.
+              * @returns {number} Returns the product.
+              * @example
+              *
+              * _.multiply(6, 4);
+              * // => 24
+              */
+
+
+             var multiply = createMathOperation(function (multiplier, multiplicand) {
+               return multiplier * multiplicand;
+             }, 1);
+             /**
+              * Computes `number` rounded to `precision`.
+              *
+              * @static
+              * @memberOf _
+              * @since 3.10.0
+              * @category Math
+              * @param {number} number The number to round.
+              * @param {number} [precision=0] The precision to round to.
+              * @returns {number} Returns the rounded number.
+              * @example
+              *
+              * _.round(4.006);
+              * // => 4
+              *
+              * _.round(4.006, 2);
+              * // => 4.01
+              *
+              * _.round(4060, -2);
+              * // => 4100
+              */
+
+             var round = createRound('round');
+             /**
+              * Subtract two numbers.
+              *
+              * @static
+              * @memberOf _
+              * @since 4.0.0
+              * @category Math
+              * @param {number} minuend The first number in a subtraction.
+              * @param {number} subtrahend The second number in a subtraction.
+              * @returns {number} Returns the difference.
+              * @example
+              *
+              * _.subtract(6, 4);
+              * // => 2
+              */
+
+             var subtract = createMathOperation(function (minuend, subtrahend) {
+               return minuend - subtrahend;
+             }, 0);
+             /**
+              * Computes the sum of the values in `array`.
+              *
+              * @static
+              * @memberOf _
+              * @since 3.4.0
+              * @category Math
+              * @param {Array} array The array to iterate over.
+              * @returns {number} Returns the sum.
+              * @example
+              *
+              * _.sum([4, 2, 8, 6]);
+              * // => 20
+              */
+
+             function sum(array) {
+               return array && array.length ? baseSum(array, identity) : 0;
+             }
+             /**
+              * This method is like `_.sum` except that it accepts `iteratee` which is
+              * invoked for each element in `array` to generate the value to be summed.
+              * The iteratee is invoked with one argument: (value).
+              *
+              * @static
+              * @memberOf _
+              * @since 4.0.0
+              * @category Math
+              * @param {Array} array The array to iterate over.
+              * @param {Function} [iteratee=_.identity] The iteratee invoked per element.
+              * @returns {number} Returns the sum.
+              * @example
+              *
+              * var objects = [{ 'n': 4 }, { 'n': 2 }, { 'n': 8 }, { 'n': 6 }];
+              *
+              * _.sumBy(objects, function(o) { return o.n; });
+              * // => 20
+              *
+              * // The `_.property` iteratee shorthand.
+              * _.sumBy(objects, 'n');
+              * // => 20
+              */
+
+
+             function sumBy(array, iteratee) {
+               return array && array.length ? baseSum(array, getIteratee(iteratee, 2)) : 0;
+             }
+             /*------------------------------------------------------------------------*/
+             // Add methods that return wrapped values in chain sequences.
+
+
+             lodash.after = after;
+             lodash.ary = ary;
+             lodash.assign = assign;
+             lodash.assignIn = assignIn;
+             lodash.assignInWith = assignInWith;
+             lodash.assignWith = assignWith;
+             lodash.at = at;
+             lodash.before = before;
+             lodash.bind = bind;
+             lodash.bindAll = bindAll;
+             lodash.bindKey = bindKey;
+             lodash.castArray = castArray;
+             lodash.chain = chain;
+             lodash.chunk = chunk;
+             lodash.compact = compact;
+             lodash.concat = concat;
+             lodash.cond = cond;
+             lodash.conforms = conforms;
+             lodash.constant = constant;
+             lodash.countBy = countBy;
+             lodash.create = create;
+             lodash.curry = curry;
+             lodash.curryRight = curryRight;
+             lodash.debounce = debounce;
+             lodash.defaults = defaults;
+             lodash.defaultsDeep = defaultsDeep;
+             lodash.defer = defer;
+             lodash.delay = delay;
+             lodash.difference = difference;
+             lodash.differenceBy = differenceBy;
+             lodash.differenceWith = differenceWith;
+             lodash.drop = drop;
+             lodash.dropRight = dropRight;
+             lodash.dropRightWhile = dropRightWhile;
+             lodash.dropWhile = dropWhile;
+             lodash.fill = fill;
+             lodash.filter = filter;
+             lodash.flatMap = flatMap;
+             lodash.flatMapDeep = flatMapDeep;
+             lodash.flatMapDepth = flatMapDepth;
+             lodash.flatten = flatten;
+             lodash.flattenDeep = flattenDeep;
+             lodash.flattenDepth = flattenDepth;
+             lodash.flip = flip;
+             lodash.flow = flow;
+             lodash.flowRight = flowRight;
+             lodash.fromPairs = fromPairs;
+             lodash.functions = functions;
+             lodash.functionsIn = functionsIn;
+             lodash.groupBy = groupBy;
+             lodash.initial = initial;
+             lodash.intersection = intersection;
+             lodash.intersectionBy = intersectionBy;
+             lodash.intersectionWith = intersectionWith;
+             lodash.invert = invert;
+             lodash.invertBy = invertBy;
+             lodash.invokeMap = invokeMap;
+             lodash.iteratee = iteratee;
+             lodash.keyBy = keyBy;
+             lodash.keys = keys;
+             lodash.keysIn = keysIn;
+             lodash.map = map;
+             lodash.mapKeys = mapKeys;
+             lodash.mapValues = mapValues;
+             lodash.matches = matches;
+             lodash.matchesProperty = matchesProperty;
+             lodash.memoize = memoize;
+             lodash.merge = merge;
+             lodash.mergeWith = mergeWith;
+             lodash.method = method;
+             lodash.methodOf = methodOf;
+             lodash.mixin = mixin;
+             lodash.negate = negate;
+             lodash.nthArg = nthArg;
+             lodash.omit = omit;
+             lodash.omitBy = omitBy;
+             lodash.once = once;
+             lodash.orderBy = orderBy;
+             lodash.over = over;
+             lodash.overArgs = overArgs;
+             lodash.overEvery = overEvery;
+             lodash.overSome = overSome;
+             lodash.partial = partial;
+             lodash.partialRight = partialRight;
+             lodash.partition = partition;
+             lodash.pick = pick;
+             lodash.pickBy = pickBy;
+             lodash.property = property;
+             lodash.propertyOf = propertyOf;
+             lodash.pull = pull;
+             lodash.pullAll = pullAll;
+             lodash.pullAllBy = pullAllBy;
+             lodash.pullAllWith = pullAllWith;
+             lodash.pullAt = pullAt;
+             lodash.range = range;
+             lodash.rangeRight = rangeRight;
+             lodash.rearg = rearg;
+             lodash.reject = reject;
+             lodash.remove = remove;
+             lodash.rest = rest;
+             lodash.reverse = reverse;
+             lodash.sampleSize = sampleSize;
+             lodash.set = set;
+             lodash.setWith = setWith;
+             lodash.shuffle = shuffle;
+             lodash.slice = slice;
+             lodash.sortBy = sortBy;
+             lodash.sortedUniq = sortedUniq;
+             lodash.sortedUniqBy = sortedUniqBy;
+             lodash.split = split;
+             lodash.spread = spread;
+             lodash.tail = tail;
+             lodash.take = take;
+             lodash.takeRight = takeRight;
+             lodash.takeRightWhile = takeRightWhile;
+             lodash.takeWhile = takeWhile;
+             lodash.tap = tap;
+             lodash.throttle = throttle;
+             lodash.thru = thru;
+             lodash.toArray = toArray;
+             lodash.toPairs = toPairs;
+             lodash.toPairsIn = toPairsIn;
+             lodash.toPath = toPath;
+             lodash.toPlainObject = toPlainObject;
+             lodash.transform = transform;
+             lodash.unary = unary;
+             lodash.union = union;
+             lodash.unionBy = unionBy;
+             lodash.unionWith = unionWith;
+             lodash.uniq = uniq;
+             lodash.uniqBy = uniqBy;
+             lodash.uniqWith = uniqWith;
+             lodash.unset = unset;
+             lodash.unzip = unzip;
+             lodash.unzipWith = unzipWith;
+             lodash.update = update;
+             lodash.updateWith = updateWith;
+             lodash.values = values;
+             lodash.valuesIn = valuesIn;
+             lodash.without = without;
+             lodash.words = words;
+             lodash.wrap = wrap;
+             lodash.xor = xor;
+             lodash.xorBy = xorBy;
+             lodash.xorWith = xorWith;
+             lodash.zip = zip;
+             lodash.zipObject = zipObject;
+             lodash.zipObjectDeep = zipObjectDeep;
+             lodash.zipWith = zipWith; // Add aliases.
+
+             lodash.entries = toPairs;
+             lodash.entriesIn = toPairsIn;
+             lodash.extend = assignIn;
+             lodash.extendWith = assignInWith; // Add methods to `lodash.prototype`.
+
+             mixin(lodash, lodash);
+             /*------------------------------------------------------------------------*/
+             // Add methods that return unwrapped values in chain sequences.
+
+             lodash.add = add;
+             lodash.attempt = attempt;
+             lodash.camelCase = camelCase;
+             lodash.capitalize = capitalize;
+             lodash.ceil = ceil;
+             lodash.clamp = clamp;
+             lodash.clone = clone;
+             lodash.cloneDeep = cloneDeep;
+             lodash.cloneDeepWith = cloneDeepWith;
+             lodash.cloneWith = cloneWith;
+             lodash.conformsTo = conformsTo;
+             lodash.deburr = deburr;
+             lodash.defaultTo = defaultTo;
+             lodash.divide = divide;
+             lodash.endsWith = endsWith;
+             lodash.eq = eq;
+             lodash.escape = escape;
+             lodash.escapeRegExp = escapeRegExp;
+             lodash.every = every;
+             lodash.find = find;
+             lodash.findIndex = findIndex;
+             lodash.findKey = findKey;
+             lodash.findLast = findLast;
+             lodash.findLastIndex = findLastIndex;
+             lodash.findLastKey = findLastKey;
+             lodash.floor = floor;
+             lodash.forEach = forEach;
+             lodash.forEachRight = forEachRight;
+             lodash.forIn = forIn;
+             lodash.forInRight = forInRight;
+             lodash.forOwn = forOwn;
+             lodash.forOwnRight = forOwnRight;
+             lodash.get = get;
+             lodash.gt = gt;
+             lodash.gte = gte;
+             lodash.has = has;
+             lodash.hasIn = hasIn;
+             lodash.head = head;
+             lodash.identity = identity;
+             lodash.includes = includes;
+             lodash.indexOf = indexOf;
+             lodash.inRange = inRange;
+             lodash.invoke = invoke;
+             lodash.isArguments = isArguments;
+             lodash.isArray = isArray;
+             lodash.isArrayBuffer = isArrayBuffer;
+             lodash.isArrayLike = isArrayLike;
+             lodash.isArrayLikeObject = isArrayLikeObject;
+             lodash.isBoolean = isBoolean;
+             lodash.isBuffer = isBuffer;
+             lodash.isDate = isDate;
+             lodash.isElement = isElement;
+             lodash.isEmpty = isEmpty;
+             lodash.isEqual = isEqual;
+             lodash.isEqualWith = isEqualWith;
+             lodash.isError = isError;
+             lodash.isFinite = isFinite;
+             lodash.isFunction = isFunction;
+             lodash.isInteger = isInteger;
+             lodash.isLength = isLength;
+             lodash.isMap = isMap;
+             lodash.isMatch = isMatch;
+             lodash.isMatchWith = isMatchWith;
+             lodash.isNaN = isNaN;
+             lodash.isNative = isNative;
+             lodash.isNil = isNil;
+             lodash.isNull = isNull;
+             lodash.isNumber = isNumber;
+             lodash.isObject = isObject;
+             lodash.isObjectLike = isObjectLike;
+             lodash.isPlainObject = isPlainObject;
+             lodash.isRegExp = isRegExp;
+             lodash.isSafeInteger = isSafeInteger;
+             lodash.isSet = isSet;
+             lodash.isString = isString;
+             lodash.isSymbol = isSymbol;
+             lodash.isTypedArray = isTypedArray;
+             lodash.isUndefined = isUndefined;
+             lodash.isWeakMap = isWeakMap;
+             lodash.isWeakSet = isWeakSet;
+             lodash.join = join;
+             lodash.kebabCase = kebabCase;
+             lodash.last = last;
+             lodash.lastIndexOf = lastIndexOf;
+             lodash.lowerCase = lowerCase;
+             lodash.lowerFirst = lowerFirst;
+             lodash.lt = lt;
+             lodash.lte = lte;
+             lodash.max = max;
+             lodash.maxBy = maxBy;
+             lodash.mean = mean;
+             lodash.meanBy = meanBy;
+             lodash.min = min;
+             lodash.minBy = minBy;
+             lodash.stubArray = stubArray;
+             lodash.stubFalse = stubFalse;
+             lodash.stubObject = stubObject;
+             lodash.stubString = stubString;
+             lodash.stubTrue = stubTrue;
+             lodash.multiply = multiply;
+             lodash.nth = nth;
+             lodash.noConflict = noConflict;
+             lodash.noop = noop;
+             lodash.now = now;
+             lodash.pad = pad;
+             lodash.padEnd = padEnd;
+             lodash.padStart = padStart;
+             lodash.parseInt = parseInt;
+             lodash.random = random;
+             lodash.reduce = reduce;
+             lodash.reduceRight = reduceRight;
+             lodash.repeat = repeat;
+             lodash.replace = replace;
+             lodash.result = result;
+             lodash.round = round;
+             lodash.runInContext = runInContext;
+             lodash.sample = sample;
+             lodash.size = size;
+             lodash.snakeCase = snakeCase;
+             lodash.some = some;
+             lodash.sortedIndex = sortedIndex;
+             lodash.sortedIndexBy = sortedIndexBy;
+             lodash.sortedIndexOf = sortedIndexOf;
+             lodash.sortedLastIndex = sortedLastIndex;
+             lodash.sortedLastIndexBy = sortedLastIndexBy;
+             lodash.sortedLastIndexOf = sortedLastIndexOf;
+             lodash.startCase = startCase;
+             lodash.startsWith = startsWith;
+             lodash.subtract = subtract;
+             lodash.sum = sum;
+             lodash.sumBy = sumBy;
+             lodash.template = template;
+             lodash.times = times;
+             lodash.toFinite = toFinite;
+             lodash.toInteger = toInteger;
+             lodash.toLength = toLength;
+             lodash.toLower = toLower;
+             lodash.toNumber = toNumber;
+             lodash.toSafeInteger = toSafeInteger;
+             lodash.toString = toString;
+             lodash.toUpper = toUpper;
+             lodash.trim = trim;
+             lodash.trimEnd = trimEnd;
+             lodash.trimStart = trimStart;
+             lodash.truncate = truncate;
+             lodash.unescape = unescape;
+             lodash.uniqueId = uniqueId;
+             lodash.upperCase = upperCase;
+             lodash.upperFirst = upperFirst; // Add aliases.
+
+             lodash.each = forEach;
+             lodash.eachRight = forEachRight;
+             lodash.first = head;
+             mixin(lodash, function () {
+               var source = {};
+               baseForOwn(lodash, function (func, methodName) {
+                 if (!hasOwnProperty.call(lodash.prototype, methodName)) {
+                   source[methodName] = func;
+                 }
+               });
+               return source;
+             }(), {
+               'chain': false
+             });
+             /*------------------------------------------------------------------------*/
+
+             /**
+              * The semantic version number.
+              *
+              * @static
+              * @memberOf _
+              * @type {string}
+              */
+
+             lodash.VERSION = VERSION; // Assign default placeholders.
+
+             arrayEach(['bind', 'bindKey', 'curry', 'curryRight', 'partial', 'partialRight'], function (methodName) {
+               lodash[methodName].placeholder = lodash;
+             }); // Add `LazyWrapper` methods for `_.drop` and `_.take` variants.
+
+             arrayEach(['drop', 'take'], function (methodName, index) {
+               LazyWrapper.prototype[methodName] = function (n) {
+                 n = n === undefined$1 ? 1 : nativeMax(toInteger(n), 0);
+                 var result = this.__filtered__ && !index ? new LazyWrapper(this) : this.clone();
+
+                 if (result.__filtered__) {
+                   result.__takeCount__ = nativeMin(n, result.__takeCount__);
+                 } else {
+                   result.__views__.push({
+                     'size': nativeMin(n, MAX_ARRAY_LENGTH),
+                     'type': methodName + (result.__dir__ < 0 ? 'Right' : '')
+                   });
+                 }
+
+                 return result;
+               };
+
+               LazyWrapper.prototype[methodName + 'Right'] = function (n) {
+                 return this.reverse()[methodName](n).reverse();
+               };
+             }); // Add `LazyWrapper` methods that accept an `iteratee` value.
+
+             arrayEach(['filter', 'map', 'takeWhile'], function (methodName, index) {
+               var type = index + 1,
+                   isFilter = type == LAZY_FILTER_FLAG || type == LAZY_WHILE_FLAG;
+
+               LazyWrapper.prototype[methodName] = function (iteratee) {
+                 var result = this.clone();
+
+                 result.__iteratees__.push({
+                   'iteratee': getIteratee(iteratee, 3),
+                   'type': type
+                 });
+
+                 result.__filtered__ = result.__filtered__ || isFilter;
+                 return result;
+               };
+             }); // Add `LazyWrapper` methods for `_.head` and `_.last`.
+
+             arrayEach(['head', 'last'], function (methodName, index) {
+               var takeName = 'take' + (index ? 'Right' : '');
+
+               LazyWrapper.prototype[methodName] = function () {
+                 return this[takeName](1).value()[0];
+               };
+             }); // Add `LazyWrapper` methods for `_.initial` and `_.tail`.
+
+             arrayEach(['initial', 'tail'], function (methodName, index) {
+               var dropName = 'drop' + (index ? '' : 'Right');
+
+               LazyWrapper.prototype[methodName] = function () {
+                 return this.__filtered__ ? new LazyWrapper(this) : this[dropName](1);
+               };
+             });
+
+             LazyWrapper.prototype.compact = function () {
+               return this.filter(identity);
+             };
+
+             LazyWrapper.prototype.find = function (predicate) {
+               return this.filter(predicate).head();
+             };
+
+             LazyWrapper.prototype.findLast = function (predicate) {
+               return this.reverse().find(predicate);
+             };
+
+             LazyWrapper.prototype.invokeMap = baseRest(function (path, args) {
+               if (typeof path == 'function') {
+                 return new LazyWrapper(this);
+               }
+
+               return this.map(function (value) {
+                 return baseInvoke(value, path, args);
+               });
+             });
+
+             LazyWrapper.prototype.reject = function (predicate) {
+               return this.filter(negate(getIteratee(predicate)));
+             };
+
+             LazyWrapper.prototype.slice = function (start, end) {
+               start = toInteger(start);
+               var result = this;
+
+               if (result.__filtered__ && (start > 0 || end < 0)) {
+                 return new LazyWrapper(result);
+               }
+
+               if (start < 0) {
+                 result = result.takeRight(-start);
+               } else if (start) {
+                 result = result.drop(start);
+               }
+
+               if (end !== undefined$1) {
+                 end = toInteger(end);
+                 result = end < 0 ? result.dropRight(-end) : result.take(end - start);
+               }
+
+               return result;
+             };
+
+             LazyWrapper.prototype.takeRightWhile = function (predicate) {
+               return this.reverse().takeWhile(predicate).reverse();
+             };
+
+             LazyWrapper.prototype.toArray = function () {
+               return this.take(MAX_ARRAY_LENGTH);
+             }; // Add `LazyWrapper` methods to `lodash.prototype`.
+
+
+             baseForOwn(LazyWrapper.prototype, function (func, methodName) {
+               var checkIteratee = /^(?:filter|find|map|reject)|While$/.test(methodName),
+                   isTaker = /^(?:head|last)$/.test(methodName),
+                   lodashFunc = lodash[isTaker ? 'take' + (methodName == 'last' ? 'Right' : '') : methodName],
+                   retUnwrapped = isTaker || /^find/.test(methodName);
+
+               if (!lodashFunc) {
+                 return;
+               }
+
+               lodash.prototype[methodName] = function () {
+                 var value = this.__wrapped__,
+                     args = isTaker ? [1] : arguments,
+                     isLazy = value instanceof LazyWrapper,
+                     iteratee = args[0],
+                     useLazy = isLazy || isArray(value);
+
+                 var interceptor = function interceptor(value) {
+                   var result = lodashFunc.apply(lodash, arrayPush([value], args));
+                   return isTaker && chainAll ? result[0] : result;
+                 };
+
+                 if (useLazy && checkIteratee && typeof iteratee == 'function' && iteratee.length != 1) {
+                   // Avoid lazy use if the iteratee has a "length" value other than `1`.
+                   isLazy = useLazy = false;
+                 }
+
+                 var chainAll = this.__chain__,
+                     isHybrid = !!this.__actions__.length,
+                     isUnwrapped = retUnwrapped && !chainAll,
+                     onlyLazy = isLazy && !isHybrid;
+
+                 if (!retUnwrapped && useLazy) {
+                   value = onlyLazy ? value : new LazyWrapper(this);
+                   var result = func.apply(value, args);
+
+                   result.__actions__.push({
+                     'func': thru,
+                     'args': [interceptor],
+                     'thisArg': undefined$1
+                   });
+
+                   return new LodashWrapper(result, chainAll);
+                 }
+
+                 if (isUnwrapped && onlyLazy) {
+                   return func.apply(this, args);
+                 }
+
+                 result = this.thru(interceptor);
+                 return isUnwrapped ? isTaker ? result.value()[0] : result.value() : result;
+               };
+             }); // Add `Array` methods to `lodash.prototype`.
+
+             arrayEach(['pop', 'push', 'shift', 'sort', 'splice', 'unshift'], function (methodName) {
+               var func = arrayProto[methodName],
+                   chainName = /^(?:push|sort|unshift)$/.test(methodName) ? 'tap' : 'thru',
+                   retUnwrapped = /^(?:pop|shift)$/.test(methodName);
+
+               lodash.prototype[methodName] = function () {
+                 var args = arguments;
+
+                 if (retUnwrapped && !this.__chain__) {
+                   var value = this.value();
+                   return func.apply(isArray(value) ? value : [], args);
+                 }
+
+                 return this[chainName](function (value) {
+                   return func.apply(isArray(value) ? value : [], args);
+                 });
+               };
+             }); // Map minified method names to their real names.
+
+             baseForOwn(LazyWrapper.prototype, function (func, methodName) {
+               var lodashFunc = lodash[methodName];
+
+               if (lodashFunc) {
+                 var key = lodashFunc.name + '';
+
+                 if (!hasOwnProperty.call(realNames, key)) {
+                   realNames[key] = [];
+                 }
+
+                 realNames[key].push({
+                   'name': methodName,
+                   'func': lodashFunc
+                 });
+               }
+             });
+             realNames[createHybrid(undefined$1, WRAP_BIND_KEY_FLAG).name] = [{
+               'name': 'wrapper',
+               'func': undefined$1
+             }]; // Add methods to `LazyWrapper`.
+
+             LazyWrapper.prototype.clone = lazyClone;
+             LazyWrapper.prototype.reverse = lazyReverse;
+             LazyWrapper.prototype.value = lazyValue; // Add chain sequence methods to the `lodash` wrapper.
+
+             lodash.prototype.at = wrapperAt;
+             lodash.prototype.chain = wrapperChain;
+             lodash.prototype.commit = wrapperCommit;
+             lodash.prototype.next = wrapperNext;
+             lodash.prototype.plant = wrapperPlant;
+             lodash.prototype.reverse = wrapperReverse;
+             lodash.prototype.toJSON = lodash.prototype.valueOf = lodash.prototype.value = wrapperValue; // Add lazy aliases.
+
+             lodash.prototype.first = lodash.prototype.head;
+
+             if (symIterator) {
+               lodash.prototype[symIterator] = wrapperToIterator;
+             }
+
+             return lodash;
+           };
+           /*--------------------------------------------------------------------------*/
+           // Export lodash.
+
+
+           var _ = runInContext(); // Some AMD build optimizers, like r.js, check for condition patterns like:
+
+
+           if (freeModule) {
+             // Export for Node.js.
+             (freeModule.exports = _)._ = _; // Export for CommonJS support.
+
+             freeExports._ = _;
+           } else {
+             // Export to the global object.
+             root._ = _;
+           }
+         }).call(commonjsGlobal);
+       })(lodash, lodash.exports);
+
+       function actionMergeRemoteChanges(id, localGraph, remoteGraph, discardTags, formatUser) {
+         discardTags = discardTags || {};
+         var _option = 'safe'; // 'safe', 'force_local', 'force_remote'
+
+         var _conflicts = [];
+
+         function user(d) {
+           return typeof formatUser === 'function' ? formatUser(d) : lodash.exports.escape(d);
+         }
+
+         function mergeLocation(remote, target) {
+           function pointEqual(a, b) {
+             var epsilon = 1e-6;
+             return Math.abs(a[0] - b[0]) < epsilon && Math.abs(a[1] - b[1]) < epsilon;
+           }
+
+           if (_option === 'force_local' || pointEqual(target.loc, remote.loc)) {
+             return target;
+           }
+
+           if (_option === 'force_remote') {
+             return target.update({
+               loc: remote.loc
+             });
+           }
+
+           _conflicts.push(_t.html('merge_remote_changes.conflict.location', {
+             user: {
+               html: user(remote.user)
+             }
+           }));
+
+           return target;
+         }
+
+         function mergeNodes(base, remote, target) {
+           if (_option === 'force_local' || fastDeepEqual(target.nodes, remote.nodes)) {
+             return target;
+           }
+
+           if (_option === 'force_remote') {
+             return target.update({
+               nodes: remote.nodes
+             });
+           }
+
+           var ccount = _conflicts.length;
+           var o = base.nodes || [];
+           var a = target.nodes || [];
+           var b = remote.nodes || [];
+           var nodes = [];
+           var hunks = diff3Merge(a, o, b, {
+             excludeFalseConflicts: true
+           });
+
+           for (var i = 0; i < hunks.length; i++) {
+             var hunk = hunks[i];
+
+             if (hunk.ok) {
+               nodes.push.apply(nodes, hunk.ok);
+             } else {
+               // for all conflicts, we can assume c.a !== c.b
+               // because `diff3Merge` called with `true` option to exclude false conflicts..
+               var c = hunk.conflict;
+
+               if (fastDeepEqual(c.o, c.a)) {
+                 // only changed remotely
+                 nodes.push.apply(nodes, c.b);
+               } else if (fastDeepEqual(c.o, c.b)) {
+                 // only changed locally
+                 nodes.push.apply(nodes, c.a);
+               } else {
+                 // changed both locally and remotely
+                 _conflicts.push(_t.html('merge_remote_changes.conflict.nodelist', {
+                   user: {
+                     html: user(remote.user)
+                   }
+                 }));
+
+                 break;
+               }
+             }
+           }
+
+           return _conflicts.length === ccount ? target.update({
+             nodes: nodes
+           }) : target;
+         }
+
+         function mergeChildren(targetWay, children, updates, graph) {
+           function isUsed(node, targetWay) {
+             var hasInterestingParent = graph.parentWays(node).some(function (way) {
+               return way.id !== targetWay.id;
+             });
+             return node.hasInterestingTags() || hasInterestingParent || graph.parentRelations(node).length > 0;
+           }
+
+           var ccount = _conflicts.length;
+
+           for (var i = 0; i < children.length; i++) {
+             var id = children[i];
+             var node = graph.hasEntity(id); // remove unused childNodes..
+
+             if (targetWay.nodes.indexOf(id) === -1) {
+               if (node && !isUsed(node, targetWay)) {
+                 updates.removeIds.push(id);
+               }
+
+               continue;
+             } // restore used childNodes..
+
+
+             var local = localGraph.hasEntity(id);
+             var remote = remoteGraph.hasEntity(id);
+             var target;
+
+             if (_option === 'force_remote' && remote && remote.visible) {
+               updates.replacements.push(remote);
+             } else if (_option === 'force_local' && local) {
+               target = osmEntity(local);
+
+               if (remote) {
+                 target = target.update({
+                   version: remote.version
+                 });
+               }
+
+               updates.replacements.push(target);
+             } else if (_option === 'safe' && local && remote && local.version !== remote.version) {
+               target = osmEntity(local, {
+                 version: remote.version
+               });
+
+               if (remote.visible) {
+                 target = mergeLocation(remote, target);
+               } else {
+                 _conflicts.push(_t.html('merge_remote_changes.conflict.deleted', {
+                   user: {
+                     html: user(remote.user)
+                   }
+                 }));
+               }
+
+               if (_conflicts.length !== ccount) break;
+               updates.replacements.push(target);
+             }
+           }
+
+           return targetWay;
+         }
+
+         function updateChildren(updates, graph) {
+           for (var i = 0; i < updates.replacements.length; i++) {
+             graph = graph.replace(updates.replacements[i]);
+           }
+
+           if (updates.removeIds.length) {
+             graph = actionDeleteMultiple(updates.removeIds)(graph);
+           }
+
+           return graph;
+         }
+
+         function mergeMembers(remote, target) {
+           if (_option === 'force_local' || fastDeepEqual(target.members, remote.members)) {
+             return target;
+           }
+
+           if (_option === 'force_remote') {
+             return target.update({
+               members: remote.members
+             });
+           }
+
+           _conflicts.push(_t.html('merge_remote_changes.conflict.memberlist', {
+             user: {
+               html: user(remote.user)
+             }
+           }));
+
+           return target;
+         }
+
+         function mergeTags(base, remote, target) {
+           if (_option === 'force_local' || fastDeepEqual(target.tags, remote.tags)) {
+             return target;
+           }
+
+           if (_option === 'force_remote') {
+             return target.update({
+               tags: remote.tags
+             });
+           }
+
+           var ccount = _conflicts.length;
+           var o = base.tags || {};
+           var a = target.tags || {};
+           var b = remote.tags || {};
+           var keys = utilArrayUnion(utilArrayUnion(Object.keys(o), Object.keys(a)), Object.keys(b)).filter(function (k) {
+             return !discardTags[k];
+           });
+           var tags = Object.assign({}, a); // shallow copy
+
+           var changed = false;
+
+           for (var i = 0; i < keys.length; i++) {
+             var k = keys[i];
+
+             if (o[k] !== b[k] && a[k] !== b[k]) {
+               // changed remotely..
+               if (o[k] !== a[k]) {
+                 // changed locally..
+                 _conflicts.push(_t.html('merge_remote_changes.conflict.tags', {
+                   tag: k,
+                   local: a[k],
+                   remote: b[k],
+                   user: {
+                     html: user(remote.user)
+                   }
+                 }));
+               } else {
+                 // unchanged locally, accept remote change..
+                 if (b.hasOwnProperty(k)) {
+                   tags[k] = b[k];
+                 } else {
+                   delete tags[k];
+                 }
+
+                 changed = true;
+               }
+             }
+           }
+
+           return changed && _conflicts.length === ccount ? target.update({
+             tags: tags
+           }) : target;
+         } //  `graph.base()` is the common ancestor of the two graphs.
+         //  `localGraph` contains user's edits up to saving
+         //  `remoteGraph` contains remote edits to modified nodes
+         //  `graph` must be a descendent of `localGraph` and may include
+         //      some conflict resolution actions performed on it.
+         //
+         //                  --- ... --- `localGraph` -- ... -- `graph`
+         //                 /
+         //  `graph.base()` --- ... --- `remoteGraph`
+         //
+
+
+         var action = function action(graph) {
+           var updates = {
+             replacements: [],
+             removeIds: []
+           };
+           var base = graph.base().entities[id];
+           var local = localGraph.entity(id);
+           var remote = remoteGraph.entity(id);
+           var target = osmEntity(local, {
+             version: remote.version
+           }); // delete/undelete
+
+           if (!remote.visible) {
+             if (_option === 'force_remote') {
+               return actionDeleteMultiple([id])(graph);
+             } else if (_option === 'force_local') {
+               if (target.type === 'way') {
+                 target = mergeChildren(target, utilArrayUniq(local.nodes), updates, graph);
+                 graph = updateChildren(updates, graph);
+               }
+
+               return graph.replace(target);
+             } else {
+               _conflicts.push(_t.html('merge_remote_changes.conflict.deleted', {
+                 user: {
+                   html: user(remote.user)
+                 }
+               }));
+
+               return graph; // do nothing
+             }
+           } // merge
+
+
+           if (target.type === 'node') {
+             target = mergeLocation(remote, target);
+           } else if (target.type === 'way') {
+             // pull in any child nodes that may not be present locally..
+             graph.rebase(remoteGraph.childNodes(remote), [graph], false);
+             target = mergeNodes(base, remote, target);
+             target = mergeChildren(target, utilArrayUnion(local.nodes, remote.nodes), updates, graph);
+           } else if (target.type === 'relation') {
+             target = mergeMembers(remote, target);
+           }
+
+           target = mergeTags(base, remote, target);
+
+           if (!_conflicts.length) {
+             graph = updateChildren(updates, graph).replace(target);
+           }
+
+           return graph;
+         };
+
+         action.withOption = function (opt) {
+           _option = opt;
+           return action;
+         };
+
+         action.conflicts = function () {
+           return _conflicts;
+         };
+
+         return action;
+       }
+
+       // https://github.com/openstreetmap/potlatch2/blob/master/net/systemeD/halcyon/connection/actions/MoveNodeAction.as
+
+       function actionMove(moveIDs, tryDelta, projection, cache) {
+         var _delta = tryDelta;
+
+         function setupCache(graph) {
+           function canMove(nodeID) {
+             // Allow movement of any node that is in the selectedIDs list..
+             if (moveIDs.indexOf(nodeID) !== -1) return true; // Allow movement of a vertex where 2 ways meet..
+
+             var parents = graph.parentWays(graph.entity(nodeID));
+             if (parents.length < 3) return true; // Restrict movement of a vertex where >2 ways meet, unless all parentWays are moving too..
+
+             var parentsMoving = parents.every(function (way) {
+               return cache.moving[way.id];
+             });
+             if (!parentsMoving) delete cache.moving[nodeID];
+             return parentsMoving;
+           }
+
+           function cacheEntities(ids) {
+             for (var i = 0; i < ids.length; i++) {
+               var id = ids[i];
+               if (cache.moving[id]) continue;
+               cache.moving[id] = true;
+               var entity = graph.hasEntity(id);
+               if (!entity) continue;
+
+               if (entity.type === 'node') {
+                 cache.nodes.push(id);
+                 cache.startLoc[id] = entity.loc;
+               } else if (entity.type === 'way') {
+                 cache.ways.push(id);
+                 cacheEntities(entity.nodes);
+               } else {
+                 cacheEntities(entity.members.map(function (member) {
+                   return member.id;
+                 }));
+               }
+             }
+           }
+
+           function cacheIntersections(ids) {
+             function isEndpoint(way, id) {
+               return !way.isClosed() && !!way.affix(id);
+             }
+
+             for (var i = 0; i < ids.length; i++) {
+               var id = ids[i]; // consider only intersections with 1 moved and 1 unmoved way.
+
+               var childNodes = graph.childNodes(graph.entity(id));
+
+               for (var j = 0; j < childNodes.length; j++) {
+                 var node = childNodes[j];
+                 var parents = graph.parentWays(node);
+                 if (parents.length !== 2) continue;
+                 var moved = graph.entity(id);
+                 var unmoved = null;
+
+                 for (var k = 0; k < parents.length; k++) {
+                   var way = parents[k];
+
+                   if (!cache.moving[way.id]) {
+                     unmoved = way;
+                     break;
+                   }
+                 }
+
+                 if (!unmoved) continue; // exclude ways that are overly connected..
+
+                 if (utilArrayIntersection(moved.nodes, unmoved.nodes).length > 2) continue;
+                 if (moved.isArea() || unmoved.isArea()) continue;
+                 cache.intersections.push({
+                   nodeId: node.id,
+                   movedId: moved.id,
+                   unmovedId: unmoved.id,
+                   movedIsEP: isEndpoint(moved, node.id),
+                   unmovedIsEP: isEndpoint(unmoved, node.id)
+                 });
+               }
+             }
+           }
+
+           if (!cache) {
+             cache = {};
+           }
+
+           if (!cache.ok) {
+             cache.moving = {};
+             cache.intersections = [];
+             cache.replacedVertex = {};
+             cache.startLoc = {};
+             cache.nodes = [];
+             cache.ways = [];
+             cacheEntities(moveIDs);
+             cacheIntersections(cache.ways);
+             cache.nodes = cache.nodes.filter(canMove);
+             cache.ok = true;
+           }
+         } // Place a vertex where the moved vertex used to be, to preserve way shape..
+         //
+         //  Start:
+         //      b ---- e
+         //     / \
+         //    /   \
+         //   /     \
+         //  a       c
+         //
+         //      *               node '*' added to preserve shape
+         //     / \
+         //    /   b ---- e      way `b,e` moved here:
+         //   /     \
+         //  a       c
+         //
+         //
+
+
+         function replaceMovedVertex(nodeId, wayId, graph, delta) {
+           var way = graph.entity(wayId);
+           var moved = graph.entity(nodeId);
+           var movedIndex = way.nodes.indexOf(nodeId);
+           var len, prevIndex, nextIndex;
+
+           if (way.isClosed()) {
+             len = way.nodes.length - 1;
+             prevIndex = (movedIndex + len - 1) % len;
+             nextIndex = (movedIndex + len + 1) % len;
+           } else {
+             len = way.nodes.length;
+             prevIndex = movedIndex - 1;
+             nextIndex = movedIndex + 1;
+           }
+
+           var prev = graph.hasEntity(way.nodes[prevIndex]);
+           var next = graph.hasEntity(way.nodes[nextIndex]); // Don't add orig vertex at endpoint..
+
+           if (!prev || !next) return graph;
+           var key = wayId + '_' + nodeId;
+           var orig = cache.replacedVertex[key];
+
+           if (!orig) {
+             orig = osmNode();
+             cache.replacedVertex[key] = orig;
+             cache.startLoc[orig.id] = cache.startLoc[nodeId];
+           }
+
+           var start, end;
+
+           if (delta) {
+             start = projection(cache.startLoc[nodeId]);
+             end = projection.invert(geoVecAdd(start, delta));
+           } else {
+             end = cache.startLoc[nodeId];
+           }
+
+           orig = orig.move(end);
+           var angle = Math.abs(geoAngle(orig, prev, projection) - geoAngle(orig, next, projection)) * 180 / Math.PI; // Don't add orig vertex if it would just make a straight line..
+
+           if (angle > 175 && angle < 185) return graph; // moving forward or backward along way?
+
+           var p1 = [prev.loc, orig.loc, moved.loc, next.loc].map(projection);
+           var p2 = [prev.loc, moved.loc, orig.loc, next.loc].map(projection);
+           var d1 = geoPathLength(p1);
+           var d2 = geoPathLength(p2);
+           var insertAt = d1 <= d2 ? movedIndex : nextIndex; // moving around closed loop?
+
+           if (way.isClosed() && insertAt === 0) insertAt = len;
+           way = way.addNode(orig.id, insertAt);
+           return graph.replace(orig).replace(way);
+         } // Remove duplicate vertex that might have been added by
+         // replaceMovedVertex.  This is done after the unzorro checks.
+
+
+         function removeDuplicateVertices(wayId, graph) {
+           var way = graph.entity(wayId);
+           var epsilon = 1e-6;
+           var prev, curr;
+
+           function isInteresting(node, graph) {
+             return graph.parentWays(node).length > 1 || graph.parentRelations(node).length || node.hasInterestingTags();
+           }
+
+           for (var i = 0; i < way.nodes.length; i++) {
+             curr = graph.entity(way.nodes[i]);
+
+             if (prev && curr && geoVecEqual(prev.loc, curr.loc, epsilon)) {
+               if (!isInteresting(prev, graph)) {
+                 way = way.removeNode(prev.id);
+                 graph = graph.replace(way).remove(prev);
+               } else if (!isInteresting(curr, graph)) {
+                 way = way.removeNode(curr.id);
+                 graph = graph.replace(way).remove(curr);
+               }
+             }
+
+             prev = curr;
+           }
+
+           return graph;
+         } // Reorder nodes around intersections that have moved..
+         //
+         //  Start:                way1.nodes: b,e         (moving)
+         //  a - b - c ----- d     way2.nodes: a,b,c,d     (static)
+         //      |                 vertex: b
+         //      e                 isEP1: true,  isEP2, false
+         //
+         //  way1 `b,e` moved here:
+         //  a ----- c = b - d
+         //              |
+         //              e
+         //
+         //  reorder nodes         way1.nodes: b,e
+         //  a ----- c - b - d     way2.nodes: a,c,b,d
+         //              |
+         //              e
+         //
+
+
+         function unZorroIntersection(intersection, graph) {
+           var vertex = graph.entity(intersection.nodeId);
+           var way1 = graph.entity(intersection.movedId);
+           var way2 = graph.entity(intersection.unmovedId);
+           var isEP1 = intersection.movedIsEP;
+           var isEP2 = intersection.unmovedIsEP; // don't move the vertex if it is the endpoint of both ways.
+
+           if (isEP1 && isEP2) return graph;
+           var nodes1 = graph.childNodes(way1).filter(function (n) {
+             return n !== vertex;
+           });
+           var nodes2 = graph.childNodes(way2).filter(function (n) {
+             return n !== vertex;
+           });
+           if (way1.isClosed() && way1.first() === vertex.id) nodes1.push(nodes1[0]);
+           if (way2.isClosed() && way2.first() === vertex.id) nodes2.push(nodes2[0]);
+           var edge1 = !isEP1 && geoChooseEdge(nodes1, projection(vertex.loc), projection);
+           var edge2 = !isEP2 && geoChooseEdge(nodes2, projection(vertex.loc), projection);
+           var loc; // snap vertex to nearest edge (or some point between them)..
+
+           if (!isEP1 && !isEP2) {
+             var epsilon = 1e-6,
+                 maxIter = 10;
+
+             for (var i = 0; i < maxIter; i++) {
+               loc = geoVecInterp(edge1.loc, edge2.loc, 0.5);
+               edge1 = geoChooseEdge(nodes1, projection(loc), projection);
+               edge2 = geoChooseEdge(nodes2, projection(loc), projection);
+               if (Math.abs(edge1.distance - edge2.distance) < epsilon) break;
+             }
+           } else if (!isEP1) {
+             loc = edge1.loc;
+           } else {
+             loc = edge2.loc;
+           }
+
+           graph = graph.replace(vertex.move(loc)); // if zorro happened, reorder nodes..
+
+           if (!isEP1 && edge1.index !== way1.nodes.indexOf(vertex.id)) {
+             way1 = way1.removeNode(vertex.id).addNode(vertex.id, edge1.index);
+             graph = graph.replace(way1);
+           }
+
+           if (!isEP2 && edge2.index !== way2.nodes.indexOf(vertex.id)) {
+             way2 = way2.removeNode(vertex.id).addNode(vertex.id, edge2.index);
+             graph = graph.replace(way2);
+           }
+
+           return graph;
+         }
+
+         function cleanupIntersections(graph) {
+           for (var i = 0; i < cache.intersections.length; i++) {
+             var obj = cache.intersections[i];
+             graph = replaceMovedVertex(obj.nodeId, obj.movedId, graph, _delta);
+             graph = replaceMovedVertex(obj.nodeId, obj.unmovedId, graph, null);
+             graph = unZorroIntersection(obj, graph);
+             graph = removeDuplicateVertices(obj.movedId, graph);
+             graph = removeDuplicateVertices(obj.unmovedId, graph);
+           }
+
+           return graph;
+         } // check if moving way endpoint can cross an unmoved way, if so limit delta..
+
+
+         function limitDelta(graph) {
+           function moveNode(loc) {
+             return geoVecAdd(projection(loc), _delta);
+           }
+
+           for (var i = 0; i < cache.intersections.length; i++) {
+             var obj = cache.intersections[i]; // Don't limit movement if this is vertex joins 2 endpoints..
+
+             if (obj.movedIsEP && obj.unmovedIsEP) continue; // Don't limit movement if this vertex is not an endpoint anyway..
+
+             if (!obj.movedIsEP) continue;
+             var node = graph.entity(obj.nodeId);
+             var start = projection(node.loc);
+             var end = geoVecAdd(start, _delta);
+             var movedNodes = graph.childNodes(graph.entity(obj.movedId));
+             var movedPath = movedNodes.map(function (n) {
+               return moveNode(n.loc);
+             });
+             var unmovedNodes = graph.childNodes(graph.entity(obj.unmovedId));
+             var unmovedPath = unmovedNodes.map(function (n) {
+               return projection(n.loc);
+             });
+             var hits = geoPathIntersections(movedPath, unmovedPath);
+
+             for (var j = 0; i < hits.length; i++) {
+               if (geoVecEqual(hits[j], end)) continue;
+               var edge = geoChooseEdge(unmovedNodes, end, projection);
+               _delta = geoVecSubtract(projection(edge.loc), start);
+             }
+           }
+         }
+
+         var action = function action(graph) {
+           if (_delta[0] === 0 && _delta[1] === 0) return graph;
+           setupCache(graph);
+
+           if (cache.intersections.length) {
+             limitDelta(graph);
+           }
+
+           for (var i = 0; i < cache.nodes.length; i++) {
+             var node = graph.entity(cache.nodes[i]);
+             var start = projection(node.loc);
+             var end = geoVecAdd(start, _delta);
+             graph = graph.replace(node.move(projection.invert(end)));
+           }
+
+           if (cache.intersections.length) {
+             graph = cleanupIntersections(graph);
+           }
+
+           return graph;
+         };
+
+         action.delta = function () {
+           return _delta;
+         };
+
+         return action;
+       }
+
+       function actionMoveMember(relationId, fromIndex, toIndex) {
+         return function (graph) {
+           return graph.replace(graph.entity(relationId).moveMember(fromIndex, toIndex));
+         };
+       }
+
+       function actionMoveNode(nodeID, toLoc) {
+         var action = function action(graph, t) {
+           if (t === null || !isFinite(t)) t = 1;
+           t = Math.min(Math.max(+t, 0), 1);
+           var node = graph.entity(nodeID);
+           return graph.replace(node.move(geoVecInterp(node.loc, toLoc, t)));
+         };
+
+         action.transitionable = true;
+         return action;
+       }
+
+       function actionNoop() {
+         return function (graph) {
+           return graph;
+         };
+       }
+
+       function actionOrthogonalize(wayID, projection, vertexID, degThresh, ep) {
+         var epsilon = ep || 1e-4;
+         var threshold = degThresh || 13; // degrees within right or straight to alter
+         // We test normalized dot products so we can compare as cos(angle)
+
+         var lowerThreshold = Math.cos((90 - threshold) * Math.PI / 180);
+         var upperThreshold = Math.cos(threshold * Math.PI / 180);
+
+         var action = function action(graph, t) {
+           if (t === null || !isFinite(t)) t = 1;
+           t = Math.min(Math.max(+t, 0), 1);
+           var way = graph.entity(wayID);
+           way = way.removeNode(''); // sanity check - remove any consecutive duplicates
+
+           if (way.tags.nonsquare) {
+             var tags = Object.assign({}, way.tags); // since we're squaring, remove indication that this is physically unsquare
+
+             delete tags.nonsquare;
+             way = way.update({
+               tags: tags
+             });
+           }
+
+           graph = graph.replace(way);
+           var isClosed = way.isClosed();
+           var nodes = graph.childNodes(way).slice(); // shallow copy
+
+           if (isClosed) nodes.pop();
+
+           if (vertexID !== undefined) {
+             nodes = nodeSubset(nodes, vertexID, isClosed);
+             if (nodes.length !== 3) return graph;
+           } // note: all geometry functions here use the unclosed node/point/coord list
+
+
+           var nodeCount = {};
+           var points = [];
+           var corner = {
+             i: 0,
+             dotp: 1
+           };
+           var node, point, loc, score, motions, i, j;
+
+           for (i = 0; i < nodes.length; i++) {
+             node = nodes[i];
+             nodeCount[node.id] = (nodeCount[node.id] || 0) + 1;
+             points.push({
+               id: node.id,
+               coord: projection(node.loc)
+             });
+           }
+
+           if (points.length === 3) {
+             // move only one vertex for right triangle
+             for (i = 0; i < 1000; i++) {
+               motions = points.map(calcMotion);
+               points[corner.i].coord = geoVecAdd(points[corner.i].coord, motions[corner.i]);
+               score = corner.dotp;
+
+               if (score < epsilon) {
+                 break;
+               }
+             }
+
+             node = graph.entity(nodes[corner.i].id);
+             loc = projection.invert(points[corner.i].coord);
+             graph = graph.replace(node.move(geoVecInterp(node.loc, loc, t)));
+           } else {
+             var straights = [];
+             var simplified = []; // Remove points from nearly straight sections..
+             // This produces a simplified shape to orthogonalize
+
+             for (i = 0; i < points.length; i++) {
+               point = points[i];
+               var dotp = 0;
+
+               if (isClosed || i > 0 && i < points.length - 1) {
+                 var a = points[(i - 1 + points.length) % points.length];
+                 var b = points[(i + 1) % points.length];
+                 dotp = Math.abs(geoOrthoNormalizedDotProduct(a.coord, b.coord, point.coord));
+               }
+
+               if (dotp > upperThreshold) {
+                 straights.push(point);
+               } else {
+                 simplified.push(point);
+               }
+             } // Orthogonalize the simplified shape
+
+
+             var bestPoints = clonePoints(simplified);
+             var originalPoints = clonePoints(simplified);
+             score = Infinity;
+
+             for (i = 0; i < 1000; i++) {
+               motions = simplified.map(calcMotion);
+
+               for (j = 0; j < motions.length; j++) {
+                 simplified[j].coord = geoVecAdd(simplified[j].coord, motions[j]);
+               }
+
+               var newScore = geoOrthoCalcScore(simplified, isClosed, epsilon, threshold);
+
+               if (newScore < score) {
+                 bestPoints = clonePoints(simplified);
+                 score = newScore;
+               }
+
+               if (score < epsilon) {
+                 break;
+               }
+             }
+
+             var bestCoords = bestPoints.map(function (p) {
+               return p.coord;
+             });
+             if (isClosed) bestCoords.push(bestCoords[0]); // move the nodes that should move
+
+             for (i = 0; i < bestPoints.length; i++) {
+               point = bestPoints[i];
+
+               if (!geoVecEqual(originalPoints[i].coord, point.coord)) {
+                 node = graph.entity(point.id);
+                 loc = projection.invert(point.coord);
+                 graph = graph.replace(node.move(geoVecInterp(node.loc, loc, t)));
+               }
+             } // move the nodes along straight segments
+
+
+             for (i = 0; i < straights.length; i++) {
+               point = straights[i];
+               if (nodeCount[point.id] > 1) continue; // skip self-intersections
+
+               node = graph.entity(point.id);
+
+               if (t === 1 && graph.parentWays(node).length === 1 && graph.parentRelations(node).length === 0 && !node.hasInterestingTags()) {
+                 // remove uninteresting points..
+                 graph = actionDeleteNode(node.id)(graph);
+               } else {
+                 // move interesting points to the nearest edge..
+                 var choice = geoVecProject(point.coord, bestCoords);
+
+                 if (choice) {
+                   loc = projection.invert(choice.target);
+                   graph = graph.replace(node.move(geoVecInterp(node.loc, loc, t)));
+                 }
+               }
+             }
+           }
+
+           return graph;
+
+           function clonePoints(array) {
+             return array.map(function (p) {
+               return {
+                 id: p.id,
+                 coord: [p.coord[0], p.coord[1]]
+               };
+             });
+           }
+
+           function calcMotion(point, i, array) {
+             // don't try to move the endpoints of a non-closed way.
+             if (!isClosed && (i === 0 || i === array.length - 1)) return [0, 0]; // don't try to move a node that appears more than once (self intersection)
+
+             if (nodeCount[array[i].id] > 1) return [0, 0];
+             var a = array[(i - 1 + array.length) % array.length].coord;
+             var origin = point.coord;
+             var b = array[(i + 1) % array.length].coord;
+             var p = geoVecSubtract(a, origin);
+             var q = geoVecSubtract(b, origin);
+             var scale = 2 * Math.min(geoVecLength(p), geoVecLength(q));
+             p = geoVecNormalize(p);
+             q = geoVecNormalize(q);
+             var dotp = p[0] * q[0] + p[1] * q[1];
+             var val = Math.abs(dotp);
+
+             if (val < lowerThreshold) {
+               // nearly orthogonal
+               corner.i = i;
+               corner.dotp = val;
+               var vec = geoVecNormalize(geoVecAdd(p, q));
+               return geoVecScale(vec, 0.1 * dotp * scale);
+             }
+
+             return [0, 0]; // do nothing
+           }
+         }; // if we are only orthogonalizing one vertex,
+         // get that vertex and the previous and next
+
+
+         function nodeSubset(nodes, vertexID, isClosed) {
+           var first = isClosed ? 0 : 1;
+           var last = isClosed ? nodes.length : nodes.length - 1;
+
+           for (var i = first; i < last; i++) {
+             if (nodes[i].id === vertexID) {
+               return [nodes[(i - 1 + nodes.length) % nodes.length], nodes[i], nodes[(i + 1) % nodes.length]];
+             }
+           }
+
+           return [];
+         }
+
+         action.disabled = function (graph) {
+           var way = graph.entity(wayID);
+           way = way.removeNode(''); // sanity check - remove any consecutive duplicates
+
+           graph = graph.replace(way);
+           var isClosed = way.isClosed();
+           var nodes = graph.childNodes(way).slice(); // shallow copy
+
+           if (isClosed) nodes.pop();
+           var allowStraightAngles = false;
+
+           if (vertexID !== undefined) {
+             allowStraightAngles = true;
+             nodes = nodeSubset(nodes, vertexID, isClosed);
+             if (nodes.length !== 3) return 'end_vertex';
+           }
+
+           var coords = nodes.map(function (n) {
+             return projection(n.loc);
+           });
+           var score = geoOrthoCanOrthogonalize(coords, isClosed, epsilon, threshold, allowStraightAngles);
+
+           if (score === null) {
+             return 'not_squarish';
+           } else if (score === 0) {
+             return 'square_enough';
+           } else {
+             return false;
+           }
+         };
+
+         action.transitionable = true;
+         return action;
+       }
+
+       //
+       // `turn` must be an `osmTurn` object
+       // see osm/intersection.js, pathToTurn()
+       //
+       // This specifies a restriction of type `restriction` when traveling from
+       // `turn.from.way` toward `turn.to.way` via `turn.via.node` OR `turn.via.ways`.
+       // (The action does not check that these entities form a valid intersection.)
+       //
+       // From, to, and via ways should be split before calling this action.
+       // (old versions of the code would split the ways here, but we no longer do it)
+       //
+       // For testing convenience, accepts a restrictionID to assign to the new
+       // relation. Normally, this will be undefined and the relation will
+       // automatically be assigned a new ID.
+       //
+
+       function actionRestrictTurn(turn, restrictionType, restrictionID) {
+         return function (graph) {
+           var fromWay = graph.entity(turn.from.way);
+           var toWay = graph.entity(turn.to.way);
+           var viaNode = turn.via.node && graph.entity(turn.via.node);
+           var viaWays = turn.via.ways && turn.via.ways.map(function (id) {
+             return graph.entity(id);
+           });
+           var members = [];
+           members.push({
+             id: fromWay.id,
+             type: 'way',
+             role: 'from'
+           });
+
+           if (viaNode) {
+             members.push({
+               id: viaNode.id,
+               type: 'node',
+               role: 'via'
+             });
+           } else if (viaWays) {
+             viaWays.forEach(function (viaWay) {
+               members.push({
+                 id: viaWay.id,
+                 type: 'way',
+                 role: 'via'
+               });
+             });
+           }
+
+           members.push({
+             id: toWay.id,
+             type: 'way',
+             role: 'to'
+           });
+           return graph.replace(osmRelation({
+             id: restrictionID,
+             tags: {
+               type: 'restriction',
+               restriction: restrictionType
+             },
+             members: members
+           }));
+         };
+       }
+
+       function actionRevert(id) {
+         var action = function action(graph) {
+           var entity = graph.hasEntity(id),
+               base = graph.base().entities[id];
+
+           if (entity && !base) {
+             // entity will be removed..
+             if (entity.type === 'node') {
+               graph.parentWays(entity).forEach(function (parent) {
+                 parent = parent.removeNode(id);
+                 graph = graph.replace(parent);
+
+                 if (parent.isDegenerate()) {
+                   graph = actionDeleteWay(parent.id)(graph);
+                 }
+               });
+             }
+
+             graph.parentRelations(entity).forEach(function (parent) {
+               parent = parent.removeMembersWithID(id);
+               graph = graph.replace(parent);
+
+               if (parent.isDegenerate()) {
+                 graph = actionDeleteRelation(parent.id)(graph);
+               }
+             });
+           }
+
+           return graph.revert(id);
+         };
+
+         return action;
+       }
+
+       function actionRotate(rotateIds, pivot, angle, projection) {
+         var action = function action(graph) {
+           return graph.update(function (graph) {
+             utilGetAllNodes(rotateIds, graph).forEach(function (node) {
+               var point = geoRotate([projection(node.loc)], angle, pivot)[0];
+               graph = graph.replace(node.move(projection.invert(point)));
+             });
+           });
+         };
+
+         return action;
+       }
+
+       function actionScale(ids, pivotLoc, scaleFactor, projection) {
+         return function (graph) {
+           return graph.update(function (graph) {
+             var point, radial;
+             utilGetAllNodes(ids, graph).forEach(function (node) {
+               point = projection(node.loc);
+               radial = [point[0] - pivotLoc[0], point[1] - pivotLoc[1]];
+               point = [pivotLoc[0] + scaleFactor * radial[0], pivotLoc[1] + scaleFactor * radial[1]];
+               graph = graph.replace(node.move(projection.invert(point)));
+             });
+           });
+         };
+       }
+
+       /* Align nodes along their common axis */
+
+       function actionStraightenNodes(nodeIDs, projection) {
+         function positionAlongWay(a, o, b) {
+           return geoVecDot(a, b, o) / geoVecDot(b, b, o);
+         } // returns the endpoints of the long axis of symmetry of the `points` bounding rect
+
+
+         function getEndpoints(points) {
+           var ssr = geoGetSmallestSurroundingRectangle(points); // Choose line pq = axis of symmetry.
+           // The shape's surrounding rectangle has 2 axes of symmetry.
+           // Snap points to the long axis
+
+           var p1 = [(ssr.poly[0][0] + ssr.poly[1][0]) / 2, (ssr.poly[0][1] + ssr.poly[1][1]) / 2];
+           var q1 = [(ssr.poly[2][0] + ssr.poly[3][0]) / 2, (ssr.poly[2][1] + ssr.poly[3][1]) / 2];
+           var p2 = [(ssr.poly[3][0] + ssr.poly[4][0]) / 2, (ssr.poly[3][1] + ssr.poly[4][1]) / 2];
+           var q2 = [(ssr.poly[1][0] + ssr.poly[2][0]) / 2, (ssr.poly[1][1] + ssr.poly[2][1]) / 2];
+           var isLong = geoVecLength(p1, q1) > geoVecLength(p2, q2);
+
+           if (isLong) {
+             return [p1, q1];
+           }
+
+           return [p2, q2];
+         }
+
+         var action = function action(graph, t) {
+           if (t === null || !isFinite(t)) t = 1;
+           t = Math.min(Math.max(+t, 0), 1);
+           var nodes = nodeIDs.map(function (id) {
+             return graph.entity(id);
+           });
+           var points = nodes.map(function (n) {
+             return projection(n.loc);
+           });
+           var endpoints = getEndpoints(points);
+           var startPoint = endpoints[0];
+           var endPoint = endpoints[1]; // Move points onto the line connecting the endpoints
+
+           for (var i = 0; i < points.length; i++) {
+             var node = nodes[i];
+             var point = points[i];
+             var u = positionAlongWay(point, startPoint, endPoint);
+             var point2 = geoVecInterp(startPoint, endPoint, u);
+             var loc2 = projection.invert(point2);
+             graph = graph.replace(node.move(geoVecInterp(node.loc, loc2, t)));
+           }
+
+           return graph;
+         };
+
+         action.disabled = function (graph) {
+           var nodes = nodeIDs.map(function (id) {
+             return graph.entity(id);
+           });
+           var points = nodes.map(function (n) {
+             return projection(n.loc);
+           });
+           var endpoints = getEndpoints(points);
+           var startPoint = endpoints[0];
+           var endPoint = endpoints[1];
+           var maxDistance = 0;
+
+           for (var i = 0; i < points.length; i++) {
+             var point = points[i];
+             var u = positionAlongWay(point, startPoint, endPoint);
+             var p = geoVecInterp(startPoint, endPoint, u);
+             var dist = geoVecLength(p, point);
+
+             if (!isNaN(dist) && dist > maxDistance) {
+               maxDistance = dist;
+             }
+           }
+
+           if (maxDistance < 0.0001) {
+             return 'straight_enough';
+           }
+         };
+
+         action.transitionable = true;
+         return action;
+       }
+
+       /*
+        * Based on https://github.com/openstreetmap/potlatch2/net/systemeD/potlatch2/tools/Straighten.as
+        */
+
+       function actionStraightenWay(selectedIDs, projection) {
+         function positionAlongWay(a, o, b) {
+           return geoVecDot(a, b, o) / geoVecDot(b, b, o);
+         } // Return all selected ways as a continuous, ordered array of nodes
+
+
+         function allNodes(graph) {
+           var nodes = [];
+           var startNodes = [];
+           var endNodes = [];
+           var remainingWays = [];
+           var selectedWays = selectedIDs.filter(function (w) {
+             return graph.entity(w).type === 'way';
+           });
+           var selectedNodes = selectedIDs.filter(function (n) {
+             return graph.entity(n).type === 'node';
+           });
+
+           for (var i = 0; i < selectedWays.length; i++) {
+             var way = graph.entity(selectedWays[i]);
+             nodes = way.nodes.slice(0);
+             remainingWays.push(nodes);
+             startNodes.push(nodes[0]);
+             endNodes.push(nodes[nodes.length - 1]);
+           } // Remove duplicate end/startNodes (duplicate nodes cannot be at the line end,
+           //   and need to be removed so currNode difference calculation below works)
+           // i.e. ["n-1", "n-1", "n-2"] => ["n-2"]
+
+
+           startNodes = startNodes.filter(function (n) {
+             return startNodes.indexOf(n) === startNodes.lastIndexOf(n);
+           });
+           endNodes = endNodes.filter(function (n) {
+             return endNodes.indexOf(n) === endNodes.lastIndexOf(n);
+           }); // Choose the initial endpoint to start from
+
+           var currNode = utilArrayDifference(startNodes, endNodes).concat(utilArrayDifference(endNodes, startNodes))[0];
+           var nextWay = [];
+           nodes = []; // Create nested function outside of loop to avoid "function in loop" lint error
+
+           var getNextWay = function getNextWay(currNode, remainingWays) {
+             return remainingWays.filter(function (way) {
+               return way[0] === currNode || way[way.length - 1] === currNode;
+             })[0];
+           }; // Add nodes to end of nodes array, until all ways are added
+
+
+           while (remainingWays.length) {
+             nextWay = getNextWay(currNode, remainingWays);
+             remainingWays = utilArrayDifference(remainingWays, [nextWay]);
+
+             if (nextWay[0] !== currNode) {
+               nextWay.reverse();
+             }
+
+             nodes = nodes.concat(nextWay);
+             currNode = nodes[nodes.length - 1];
+           } // If user selected 2 nodes to straighten between, then slice nodes array to those nodes
+
+
+           if (selectedNodes.length === 2) {
+             var startNodeIdx = nodes.indexOf(selectedNodes[0]);
+             var endNodeIdx = nodes.indexOf(selectedNodes[1]);
+             var sortedStartEnd = [startNodeIdx, endNodeIdx];
+             sortedStartEnd.sort(function (a, b) {
+               return a - b;
+             });
+             nodes = nodes.slice(sortedStartEnd[0], sortedStartEnd[1] + 1);
+           }
+
+           return nodes.map(function (n) {
+             return graph.entity(n);
+           });
+         }
+
+         function shouldKeepNode(node, graph) {
+           return graph.parentWays(node).length > 1 || graph.parentRelations(node).length || node.hasInterestingTags();
+         }
+
+         var action = function action(graph, t) {
+           if (t === null || !isFinite(t)) t = 1;
+           t = Math.min(Math.max(+t, 0), 1);
+           var nodes = allNodes(graph);
+           var points = nodes.map(function (n) {
+             return projection(n.loc);
+           });
+           var startPoint = points[0];
+           var endPoint = points[points.length - 1];
+           var toDelete = [];
+           var i;
+
+           for (i = 1; i < points.length - 1; i++) {
+             var node = nodes[i];
+             var point = points[i];
+
+             if (t < 1 || shouldKeepNode(node, graph)) {
+               var u = positionAlongWay(point, startPoint, endPoint);
+               var p = geoVecInterp(startPoint, endPoint, u);
+               var loc2 = projection.invert(p);
+               graph = graph.replace(node.move(geoVecInterp(node.loc, loc2, t)));
+             } else {
+               // safe to delete
+               if (toDelete.indexOf(node) === -1) {
+                 toDelete.push(node);
+               }
+             }
+           }
+
+           for (i = 0; i < toDelete.length; i++) {
+             graph = actionDeleteNode(toDelete[i].id)(graph);
+           }
+
+           return graph;
+         };
+
+         action.disabled = function (graph) {
+           // check way isn't too bendy
+           var nodes = allNodes(graph);
+           var points = nodes.map(function (n) {
+             return projection(n.loc);
+           });
+           var startPoint = points[0];
+           var endPoint = points[points.length - 1];
+           var threshold = 0.2 * geoVecLength(startPoint, endPoint);
+           var i;
+
+           if (threshold === 0) {
+             return 'too_bendy';
+           }
+
+           var maxDistance = 0;
+
+           for (i = 1; i < points.length - 1; i++) {
+             var point = points[i];
+             var u = positionAlongWay(point, startPoint, endPoint);
+             var p = geoVecInterp(startPoint, endPoint, u);
+             var dist = geoVecLength(p, point); // to bendy if point is off by 20% of total start/end distance in projected space
+
+             if (isNaN(dist) || dist > threshold) {
+               return 'too_bendy';
+             } else if (dist > maxDistance) {
+               maxDistance = dist;
+             }
+           }
+
+           var keepingAllNodes = nodes.every(function (node, i) {
+             return i === 0 || i === nodes.length - 1 || shouldKeepNode(node, graph);
+           });
+
+           if (maxDistance < 0.0001 && // Allow straightening even if already straight in order to remove extraneous nodes
+           keepingAllNodes) {
+             return 'straight_enough';
+           }
+         };
+
+         action.transitionable = true;
+         return action;
+       }
+
+       //
+       // `turn` must be an `osmTurn` object with a `restrictionID` property.
+       // see osm/intersection.js, pathToTurn()
+       //
+
+       function actionUnrestrictTurn(turn) {
+         return function (graph) {
+           return actionDeleteRelation(turn.restrictionID)(graph);
+         };
+       }
+
+       /* Reflect the given area around its axis of symmetry */
+
+       function actionReflect(reflectIds, projection) {
+         var _useLongAxis = true;
+
+         var action = function action(graph, t) {
+           if (t === null || !isFinite(t)) t = 1;
+           t = Math.min(Math.max(+t, 0), 1);
+           var nodes = utilGetAllNodes(reflectIds, graph);
+           var points = nodes.map(function (n) {
+             return projection(n.loc);
+           });
+           var ssr = geoGetSmallestSurroundingRectangle(points); // Choose line pq = axis of symmetry.
+           // The shape's surrounding rectangle has 2 axes of symmetry.
+           // Reflect across the longer axis by default.
+
+           var p1 = [(ssr.poly[0][0] + ssr.poly[1][0]) / 2, (ssr.poly[0][1] + ssr.poly[1][1]) / 2];
+           var q1 = [(ssr.poly[2][0] + ssr.poly[3][0]) / 2, (ssr.poly[2][1] + ssr.poly[3][1]) / 2];
+           var p2 = [(ssr.poly[3][0] + ssr.poly[4][0]) / 2, (ssr.poly[3][1] + ssr.poly[4][1]) / 2];
+           var q2 = [(ssr.poly[1][0] + ssr.poly[2][0]) / 2, (ssr.poly[1][1] + ssr.poly[2][1]) / 2];
+           var p, q;
+           var isLong = geoVecLength(p1, q1) > geoVecLength(p2, q2);
+
+           if (_useLongAxis && isLong || !_useLongAxis && !isLong) {
+             p = p1;
+             q = q1;
+           } else {
+             p = p2;
+             q = q2;
+           } // reflect c across pq
+           // http://math.stackexchange.com/questions/65503/point-reflection-over-a-line
+
+
+           var dx = q[0] - p[0];
+           var dy = q[1] - p[1];
+           var a = (dx * dx - dy * dy) / (dx * dx + dy * dy);
+           var b = 2 * dx * dy / (dx * dx + dy * dy);
+
+           for (var i = 0; i < nodes.length; i++) {
+             var node = nodes[i];
+             var c = projection(node.loc);
+             var c2 = [a * (c[0] - p[0]) + b * (c[1] - p[1]) + p[0], b * (c[0] - p[0]) - a * (c[1] - p[1]) + p[1]];
+             var loc2 = projection.invert(c2);
+             node = node.move(geoVecInterp(node.loc, loc2, t));
+             graph = graph.replace(node);
+           }
+
+           return graph;
+         };
+
+         action.useLongAxis = function (val) {
+           if (!arguments.length) return _useLongAxis;
+           _useLongAxis = val;
+           return action;
+         };
+
+         action.transitionable = true;
+         return action;
+       }
+
+       function actionUpgradeTags(entityId, oldTags, replaceTags) {
+         return function (graph) {
+           var entity = graph.entity(entityId);
+           var tags = Object.assign({}, entity.tags); // shallow copy
+
+           var transferValue;
+           var semiIndex;
+
+           for (var oldTagKey in oldTags) {
+             if (!(oldTagKey in tags)) continue; // wildcard match
+
+             if (oldTags[oldTagKey] === '*') {
+               // note the value since we might need to transfer it
+               transferValue = tags[oldTagKey];
+               delete tags[oldTagKey]; // exact match
+             } else if (oldTags[oldTagKey] === tags[oldTagKey]) {
+               delete tags[oldTagKey]; // match is within semicolon-delimited values
+             } else {
+               var vals = tags[oldTagKey].split(';').filter(Boolean);
+               var oldIndex = vals.indexOf(oldTags[oldTagKey]);
+
+               if (vals.length === 1 || oldIndex === -1) {
+                 delete tags[oldTagKey];
+               } else {
+                 if (replaceTags && replaceTags[oldTagKey]) {
+                   // replacing a value within a semicolon-delimited value, note the index
+                   semiIndex = oldIndex;
+                 }
+
+                 vals.splice(oldIndex, 1);
+                 tags[oldTagKey] = vals.join(';');
+               }
+             }
+           }
+
+           if (replaceTags) {
+             for (var replaceKey in replaceTags) {
+               var replaceValue = replaceTags[replaceKey];
+
+               if (replaceValue === '*') {
+                 if (tags[replaceKey] && tags[replaceKey] !== 'no') {
+                   // allow any pre-existing value except `no` (troll tag)
+                   continue;
+                 } else {
+                   // otherwise assume `yes` is okay
+                   tags[replaceKey] = 'yes';
+                 }
+               } else if (replaceValue === '$1') {
+                 tags[replaceKey] = transferValue;
+               } else {
+                 if (tags[replaceKey] && oldTags[replaceKey] && semiIndex !== undefined) {
+                   // don't override preexisting values
+                   var existingVals = tags[replaceKey].split(';').filter(Boolean);
+
+                   if (existingVals.indexOf(replaceValue) === -1) {
+                     existingVals.splice(semiIndex, 0, replaceValue);
+                     tags[replaceKey] = existingVals.join(';');
+                   }
+                 } else {
+                   tags[replaceKey] = replaceValue;
+                 }
+               }
+             }
+           }
+
+           return graph.replace(entity.update({
+             tags: tags
+           }));
+         };
+       }
+
+       function behaviorEdit(context) {
+         function behavior() {
+           context.map().minzoom(context.minEditableZoom());
+         }
+
+         behavior.off = function () {
+           context.map().minzoom(0);
+         };
+
+         return behavior;
+       }
+
+       /*
+          The hover behavior adds the `.hover` class on pointerover to all elements to which
+          the identical datum is bound, and removes it on pointerout.
+
+          The :hover pseudo-class is insufficient for iD's purposes because a datum's visual
+          representation may consist of several elements scattered throughout the DOM hierarchy.
+          Only one of these elements can have the :hover pseudo-class, but all of them will
+          have the .hover class.
+        */
+
+       function behaviorHover(context) {
+         var dispatch = dispatch$8('hover');
+
+         var _selection = select(null);
+
+         var _newNodeId = null;
+         var _initialNodeID = null;
+
+         var _altDisables;
+
+         var _ignoreVertex;
+
+         var _targets = []; // use pointer events on supported platforms; fallback to mouse events
+
+         var _pointerPrefix = 'PointerEvent' in window ? 'pointer' : 'mouse';
+
+         function keydown(d3_event) {
+           if (_altDisables && d3_event.keyCode === utilKeybinding.modifierCodes.alt) {
+             _selection.selectAll('.hover').classed('hover-suppressed', true).classed('hover', false);
+
+             _selection.classed('hover-disabled', true);
+
+             dispatch.call('hover', this, null);
+           }
+         }
+
+         function keyup(d3_event) {
+           if (_altDisables && d3_event.keyCode === utilKeybinding.modifierCodes.alt) {
+             _selection.selectAll('.hover-suppressed').classed('hover-suppressed', false).classed('hover', true);
+
+             _selection.classed('hover-disabled', false);
+
+             dispatch.call('hover', this, _targets);
+           }
+         }
+
+         function behavior(selection) {
+           _selection = selection;
+           _targets = [];
+
+           if (_initialNodeID) {
+             _newNodeId = _initialNodeID;
+             _initialNodeID = null;
+           } else {
+             _newNodeId = null;
+           }
+
+           _selection.on(_pointerPrefix + 'over.hover', pointerover).on(_pointerPrefix + 'out.hover', pointerout) // treat pointerdown as pointerover for touch devices
+           .on(_pointerPrefix + 'down.hover', pointerover);
+
+           select(window).on(_pointerPrefix + 'up.hover pointercancel.hover', pointerout, true).on('keydown.hover', keydown).on('keyup.hover', keyup);
+
+           function eventTarget(d3_event) {
+             var datum = d3_event.target && d3_event.target.__data__;
+             if (_typeof(datum) !== 'object') return null;
+
+             if (!(datum instanceof osmEntity) && datum.properties && datum.properties.entity instanceof osmEntity) {
+               return datum.properties.entity;
+             }
+
+             return datum;
+           }
+
+           function pointerover(d3_event) {
+             // ignore mouse hovers with buttons pressed unless dragging
+             if (context.mode().id.indexOf('drag') === -1 && (!d3_event.pointerType || d3_event.pointerType === 'mouse') && d3_event.buttons) return;
+             var target = eventTarget(d3_event);
+
+             if (target && _targets.indexOf(target) === -1) {
+               _targets.push(target);
+
+               updateHover(d3_event, _targets);
+             }
+           }
+
+           function pointerout(d3_event) {
+             var target = eventTarget(d3_event);
+
+             var index = _targets.indexOf(target);
+
+             if (index !== -1) {
+               _targets.splice(index);
+
+               updateHover(d3_event, _targets);
+             }
+           }
+
+           function allowsVertex(d) {
+             return d.geometry(context.graph()) === 'vertex' || _mainPresetIndex.allowsVertex(d, context.graph());
+           }
+
+           function modeAllowsHover(target) {
+             var mode = context.mode();
+
+             if (mode.id === 'add-point') {
+               return mode.preset.matchGeometry('vertex') || target.type !== 'way' && target.geometry(context.graph()) !== 'vertex';
+             }
+
+             return true;
+           }
+
+           function updateHover(d3_event, targets) {
+             _selection.selectAll('.hover').classed('hover', false);
+
+             _selection.selectAll('.hover-suppressed').classed('hover-suppressed', false);
+
+             var mode = context.mode();
+
+             if (!_newNodeId && (mode.id === 'draw-line' || mode.id === 'draw-area')) {
+               var node = targets.find(function (target) {
+                 return target instanceof osmEntity && target.type === 'node';
+               });
+               _newNodeId = node && node.id;
+             }
+
+             targets = targets.filter(function (datum) {
+               if (datum instanceof osmEntity) {
+                 // If drawing a way, don't hover on a node that was just placed. #3974
+                 return datum.id !== _newNodeId && (datum.type !== 'node' || !_ignoreVertex || allowsVertex(datum)) && modeAllowsHover(datum);
+               }
+
+               return true;
+             });
+             var selector = '';
+
+             for (var i in targets) {
+               var datum = targets[i]; // What are we hovering over?
+
+               if (datum.__featurehash__) {
+                 // hovering custom data
+                 selector += ', .data' + datum.__featurehash__;
+               } else if (datum instanceof QAItem) {
+                 selector += ', .' + datum.service + '.itemId-' + datum.id;
+               } else if (datum instanceof osmNote) {
+                 selector += ', .note-' + datum.id;
+               } else if (datum instanceof osmEntity) {
+                 selector += ', .' + datum.id;
+
+                 if (datum.type === 'relation') {
+                   for (var j in datum.members) {
+                     selector += ', .' + datum.members[j].id;
+                   }
+                 }
+               }
+             }
+
+             var suppressed = _altDisables && d3_event && d3_event.altKey;
+
+             if (selector.trim().length) {
+               // remove the first comma
+               selector = selector.slice(1);
+
+               _selection.selectAll(selector).classed(suppressed ? 'hover-suppressed' : 'hover', true);
+             }
+
+             dispatch.call('hover', this, !suppressed && targets);
+           }
+         }
+
+         behavior.off = function (selection) {
+           selection.selectAll('.hover').classed('hover', false);
+           selection.selectAll('.hover-suppressed').classed('hover-suppressed', false);
+           selection.classed('hover-disabled', false);
+           selection.on(_pointerPrefix + 'over.hover', null).on(_pointerPrefix + 'out.hover', null).on(_pointerPrefix + 'down.hover', null);
+           select(window).on(_pointerPrefix + 'up.hover pointercancel.hover', null, true).on('keydown.hover', null).on('keyup.hover', null);
+         };
+
+         behavior.altDisables = function (val) {
+           if (!arguments.length) return _altDisables;
+           _altDisables = val;
+           return behavior;
+         };
+
+         behavior.ignoreVertex = function (val) {
+           if (!arguments.length) return _ignoreVertex;
+           _ignoreVertex = val;
+           return behavior;
+         };
+
+         behavior.initialNodeID = function (nodeId) {
+           _initialNodeID = nodeId;
+           return behavior;
+         };
+
+         return utilRebind(behavior, dispatch, 'on');
+       }
+
+       var _disableSpace = false;
+       var _lastSpace = null;
+       function behaviorDraw(context) {
+         var dispatch = dispatch$8('move', 'down', 'downcancel', 'click', 'clickWay', 'clickNode', 'undo', 'cancel', 'finish');
+         var keybinding = utilKeybinding('draw');
+
+         var _hover = behaviorHover(context).altDisables(true).ignoreVertex(true).on('hover', context.ui().sidebar.hover);
+
+         var _edit = behaviorEdit(context);
+
+         var _closeTolerance = 4;
+         var _tolerance = 12;
+         var _mouseLeave = false;
+         var _lastMouse = null;
+
+         var _lastPointerUpEvent;
+
+         var _downPointer; // use pointer events on supported platforms; fallback to mouse events
+
+
+         var _pointerPrefix = 'PointerEvent' in window ? 'pointer' : 'mouse'; // related code
+         // - `mode/drag_node.js` `datum()`
+
+
+         function datum(d3_event) {
+           var mode = context.mode();
+           var isNote = mode && mode.id.indexOf('note') !== -1;
+           if (d3_event.altKey || isNote) return {};
+           var element;
+
+           if (d3_event.type === 'keydown') {
+             element = _lastMouse && _lastMouse.target;
+           } else {
+             element = d3_event.target;
+           } // When drawing, snap only to touch targets..
+           // (this excludes area fills and active drawing elements)
+
+
+           var d = element.__data__;
+           return d && d.properties && d.properties.target ? d : {};
+         }
+
+         function pointerdown(d3_event) {
+           if (_downPointer) return;
+           var pointerLocGetter = utilFastMouse(this);
+           _downPointer = {
+             id: d3_event.pointerId || 'mouse',
+             pointerLocGetter: pointerLocGetter,
+             downTime: +new Date(),
+             downLoc: pointerLocGetter(d3_event)
+           };
+           dispatch.call('down', this, d3_event, datum(d3_event));
+         }
+
+         function pointerup(d3_event) {
+           if (!_downPointer || _downPointer.id !== (d3_event.pointerId || 'mouse')) return;
+           var downPointer = _downPointer;
+           _downPointer = null;
+           _lastPointerUpEvent = d3_event;
+           if (downPointer.isCancelled) return;
+           var t2 = +new Date();
+           var p2 = downPointer.pointerLocGetter(d3_event);
+           var dist = geoVecLength(downPointer.downLoc, p2);
+
+           if (dist < _closeTolerance || dist < _tolerance && t2 - downPointer.downTime < 500) {
+             // Prevent a quick second click
+             select(window).on('click.draw-block', function () {
+               d3_event.stopPropagation();
+             }, true);
+             context.map().dblclickZoomEnable(false);
+             window.setTimeout(function () {
+               context.map().dblclickZoomEnable(true);
+               select(window).on('click.draw-block', null);
+             }, 500);
+             click(d3_event, p2);
+           }
+         }
+
+         function pointermove(d3_event) {
+           if (_downPointer && _downPointer.id === (d3_event.pointerId || 'mouse') && !_downPointer.isCancelled) {
+             var p2 = _downPointer.pointerLocGetter(d3_event);
+
+             var dist = geoVecLength(_downPointer.downLoc, p2);
+
+             if (dist >= _closeTolerance) {
+               _downPointer.isCancelled = true;
+               dispatch.call('downcancel', this);
+             }
+           }
+
+           if (d3_event.pointerType && d3_event.pointerType !== 'mouse' || d3_event.buttons || _downPointer) return; // HACK: Mobile Safari likes to send one or more `mouse` type pointermove
+           // events immediately after non-mouse pointerup events; detect and ignore them.
+
+           if (_lastPointerUpEvent && _lastPointerUpEvent.pointerType !== 'mouse' && d3_event.timeStamp - _lastPointerUpEvent.timeStamp < 100) return;
+           _lastMouse = d3_event;
+           dispatch.call('move', this, d3_event, datum(d3_event));
+         }
+
+         function pointercancel(d3_event) {
+           if (_downPointer && _downPointer.id === (d3_event.pointerId || 'mouse')) {
+             if (!_downPointer.isCancelled) {
+               dispatch.call('downcancel', this);
+             }
+
+             _downPointer = null;
+           }
+         }
+
+         function mouseenter() {
+           _mouseLeave = false;
+         }
+
+         function mouseleave() {
+           _mouseLeave = true;
+         }
+
+         function allowsVertex(d) {
+           return d.geometry(context.graph()) === 'vertex' || _mainPresetIndex.allowsVertex(d, context.graph());
+         } // related code
+         // - `mode/drag_node.js`     `doMove()`
+         // - `behavior/draw.js`      `click()`
+         // - `behavior/draw_way.js`  `move()`
+
+
+         function click(d3_event, loc) {
+           var d = datum(d3_event);
+           var target = d && d.properties && d.properties.entity;
+           var mode = context.mode();
+
+           if (target && target.type === 'node' && allowsVertex(target)) {
+             // Snap to a node
+             dispatch.call('clickNode', this, target, d);
+             return;
+           } else if (target && target.type === 'way' && (mode.id !== 'add-point' || mode.preset.matchGeometry('vertex'))) {
+             // Snap to a way
+             var choice = geoChooseEdge(context.graph().childNodes(target), loc, context.projection, context.activeID());
+
+             if (choice) {
+               var edge = [target.nodes[choice.index - 1], target.nodes[choice.index]];
+               dispatch.call('clickWay', this, choice.loc, edge, d);
+               return;
+             }
+           } else if (mode.id !== 'add-point' || mode.preset.matchGeometry('point')) {
+             var locLatLng = context.projection.invert(loc);
+             dispatch.call('click', this, locLatLng, d);
+           }
+         } // treat a spacebar press like a click
+
+
+         function space(d3_event) {
+           d3_event.preventDefault();
+           d3_event.stopPropagation();
+           var currSpace = context.map().mouse();
+
+           if (_disableSpace && _lastSpace) {
+             var dist = geoVecLength(_lastSpace, currSpace);
+
+             if (dist > _tolerance) {
+               _disableSpace = false;
+             }
+           }
+
+           if (_disableSpace || _mouseLeave || !_lastMouse) return; // user must move mouse or release space bar to allow another click
+
+           _lastSpace = currSpace;
+           _disableSpace = true;
+           select(window).on('keyup.space-block', function () {
+             d3_event.preventDefault();
+             d3_event.stopPropagation();
+             _disableSpace = false;
+             select(window).on('keyup.space-block', null);
+           }); // get the current mouse position
+
+           var loc = context.map().mouse() || // or the map center if the mouse has never entered the map
+           context.projection(context.map().center());
+           click(d3_event, loc);
+         }
+
+         function backspace(d3_event) {
+           d3_event.preventDefault();
+           dispatch.call('undo');
+         }
+
+         function del(d3_event) {
+           d3_event.preventDefault();
+           dispatch.call('cancel');
+         }
+
+         function ret(d3_event) {
+           d3_event.preventDefault();
+           dispatch.call('finish');
+         }
+
+         function behavior(selection) {
+           context.install(_hover);
+           context.install(_edit);
+           _downPointer = null;
+           keybinding.on('⌫', backspace).on('⌦', del).on('⎋', ret).on('↩', ret).on('space', space).on('⌥space', space);
+           selection.on('mouseenter.draw', mouseenter).on('mouseleave.draw', mouseleave).on(_pointerPrefix + 'down.draw', pointerdown).on(_pointerPrefix + 'move.draw', pointermove);
+           select(window).on(_pointerPrefix + 'up.draw', pointerup, true).on('pointercancel.draw', pointercancel, true);
+           select(document).call(keybinding);
+           return behavior;
+         }
+
+         behavior.off = function (selection) {
+           context.ui().sidebar.hover.cancel();
+           context.uninstall(_hover);
+           context.uninstall(_edit);
+           selection.on('mouseenter.draw', null).on('mouseleave.draw', null).on(_pointerPrefix + 'down.draw', null).on(_pointerPrefix + 'move.draw', null);
+           select(window).on(_pointerPrefix + 'up.draw', null).on('pointercancel.draw', null); // note: keyup.space-block, click.draw-block should remain
+
+           select(document).call(keybinding.unbind);
+         };
+
+         behavior.hover = function () {
+           return _hover;
+         };
+
+         return utilRebind(behavior, dispatch, 'on');
+       }
+
+       function initRange(domain, range) {
+         switch (arguments.length) {
+           case 0:
+             break;
+
+           case 1:
+             this.range(domain);
+             break;
+
+           default:
+             this.range(range).domain(domain);
+             break;
+         }
+
+         return this;
+       }
+
+       function constants(x) {
+         return function () {
+           return x;
+         };
+       }
+
+       function number(x) {
+         return +x;
+       }
+
+       var unit = [0, 1];
+       function identity$1(x) {
+         return x;
+       }
+
+       function normalize(a, b) {
+         return (b -= a = +a) ? function (x) {
+           return (x - a) / b;
+         } : constants(isNaN(b) ? NaN : 0.5);
+       }
+
+       function clamper(a, b) {
+         var t;
+         if (a > b) t = a, a = b, b = t;
+         return function (x) {
+           return Math.max(a, Math.min(b, x));
+         };
+       } // normalize(a, b)(x) takes a domain value x in [a,b] and returns the corresponding parameter t in [0,1].
+       // interpolate(a, b)(t) takes a parameter t in [0,1] and returns the corresponding range value x in [a,b].
+
+
+       function bimap(domain, range, interpolate) {
+         var d0 = domain[0],
+             d1 = domain[1],
+             r0 = range[0],
+             r1 = range[1];
+         if (d1 < d0) d0 = normalize(d1, d0), r0 = interpolate(r1, r0);else d0 = normalize(d0, d1), r0 = interpolate(r0, r1);
+         return function (x) {
+           return r0(d0(x));
+         };
+       }
+
+       function polymap(domain, range, interpolate) {
+         var j = Math.min(domain.length, range.length) - 1,
+             d = new Array(j),
+             r = new Array(j),
+             i = -1; // Reverse descending domains.
+
+         if (domain[j] < domain[0]) {
+           domain = domain.slice().reverse();
+           range = range.slice().reverse();
+         }
+
+         while (++i < j) {
+           d[i] = normalize(domain[i], domain[i + 1]);
+           r[i] = interpolate(range[i], range[i + 1]);
+         }
+
+         return function (x) {
+           var i = bisectRight(domain, x, 1, j) - 1;
+           return r[i](d[i](x));
+         };
+       }
+
+       function copy(source, target) {
+         return target.domain(source.domain()).range(source.range()).interpolate(source.interpolate()).clamp(source.clamp()).unknown(source.unknown());
+       }
+       function transformer() {
+         var domain = unit,
+             range = unit,
+             interpolate = interpolate$1,
+             transform,
+             untransform,
+             unknown,
+             clamp = identity$1,
+             piecewise,
+             output,
+             input;
+
+         function rescale() {
+           var n = Math.min(domain.length, range.length);
+           if (clamp !== identity$1) clamp = clamper(domain[0], domain[n - 1]);
+           piecewise = n > 2 ? polymap : bimap;
+           output = input = null;
+           return scale;
+         }
+
+         function scale(x) {
+           return x == null || isNaN(x = +x) ? unknown : (output || (output = piecewise(domain.map(transform), range, interpolate)))(transform(clamp(x)));
+         }
+
+         scale.invert = function (y) {
+           return clamp(untransform((input || (input = piecewise(range, domain.map(transform), d3_interpolateNumber)))(y)));
+         };
+
+         scale.domain = function (_) {
+           return arguments.length ? (domain = Array.from(_, number), rescale()) : domain.slice();
+         };
+
+         scale.range = function (_) {
+           return arguments.length ? (range = Array.from(_), rescale()) : range.slice();
+         };
+
+         scale.rangeRound = function (_) {
+           return range = Array.from(_), interpolate = interpolateRound, rescale();
+         };
+
+         scale.clamp = function (_) {
+           return arguments.length ? (clamp = _ ? true : identity$1, rescale()) : clamp !== identity$1;
+         };
+
+         scale.interpolate = function (_) {
+           return arguments.length ? (interpolate = _, rescale()) : interpolate;
+         };
+
+         scale.unknown = function (_) {
+           return arguments.length ? (unknown = _, scale) : unknown;
+         };
+
+         return function (t, u) {
+           transform = t, untransform = u;
+           return rescale();
+         };
+       }
+       function continuous() {
+         return transformer()(identity$1, identity$1);
+       }
+
+       function formatDecimal (x) {
+         return Math.abs(x = Math.round(x)) >= 1e21 ? x.toLocaleString("en").replace(/,/g, "") : x.toString(10);
+       } // Computes the decimal coefficient and exponent of the specified number x with
+       // significant digits p, where x is positive and p is in [1, 21] or undefined.
+       // For example, formatDecimalParts(1.23) returns ["123", 0].
+
+       function formatDecimalParts(x, p) {
+         if ((i = (x = p ? x.toExponential(p - 1) : x.toExponential()).indexOf("e")) < 0) return null; // NaN, ±Infinity
+
+         var i,
+             coefficient = x.slice(0, i); // The string returned by toExponential either has the form \d\.\d+e[-+]\d+
+         // (e.g., 1.2e+3) or the form \de[-+]\d+ (e.g., 1e+3).
+
+         return [coefficient.length > 1 ? coefficient[0] + coefficient.slice(2) : coefficient, +x.slice(i + 1)];
+       }
+
+       function exponent (x) {
+         return x = formatDecimalParts(Math.abs(x)), x ? x[1] : NaN;
+       }
+
+       function formatGroup (grouping, thousands) {
+         return function (value, width) {
+           var i = value.length,
+               t = [],
+               j = 0,
+               g = grouping[0],
+               length = 0;
+
+           while (i > 0 && g > 0) {
+             if (length + g + 1 > width) g = Math.max(1, width - length);
+             t.push(value.substring(i -= g, i + g));
+             if ((length += g + 1) > width) break;
+             g = grouping[j = (j + 1) % grouping.length];
+           }
+
+           return t.reverse().join(thousands);
+         };
+       }
+
+       function formatNumerals (numerals) {
+         return function (value) {
+           return value.replace(/[0-9]/g, function (i) {
+             return numerals[+i];
+           });
+         };
+       }
+
+       // [[fill]align][sign][symbol][0][width][,][.precision][~][type]
+       var re = /^(?:(.)?([<>=^]))?([+\-( ])?([$#])?(0)?(\d+)?(,)?(\.\d+)?(~)?([a-z%])?$/i;
+       function formatSpecifier(specifier) {
+         if (!(match = re.exec(specifier))) throw new Error("invalid format: " + specifier);
+         var match;
+         return new FormatSpecifier({
+           fill: match[1],
+           align: match[2],
+           sign: match[3],
+           symbol: match[4],
+           zero: match[5],
+           width: match[6],
+           comma: match[7],
+           precision: match[8] && match[8].slice(1),
+           trim: match[9],
+           type: match[10]
+         });
+       }
+       formatSpecifier.prototype = FormatSpecifier.prototype; // instanceof
+
+       function FormatSpecifier(specifier) {
+         this.fill = specifier.fill === undefined ? " " : specifier.fill + "";
+         this.align = specifier.align === undefined ? ">" : specifier.align + "";
+         this.sign = specifier.sign === undefined ? "-" : specifier.sign + "";
+         this.symbol = specifier.symbol === undefined ? "" : specifier.symbol + "";
+         this.zero = !!specifier.zero;
+         this.width = specifier.width === undefined ? undefined : +specifier.width;
+         this.comma = !!specifier.comma;
+         this.precision = specifier.precision === undefined ? undefined : +specifier.precision;
+         this.trim = !!specifier.trim;
+         this.type = specifier.type === undefined ? "" : specifier.type + "";
+       }
+
+       FormatSpecifier.prototype.toString = function () {
+         return this.fill + this.align + this.sign + this.symbol + (this.zero ? "0" : "") + (this.width === undefined ? "" : Math.max(1, this.width | 0)) + (this.comma ? "," : "") + (this.precision === undefined ? "" : "." + Math.max(0, this.precision | 0)) + (this.trim ? "~" : "") + this.type;
+       };
+
+       // Trims insignificant zeros, e.g., replaces 1.2000k with 1.2k.
+       function formatTrim (s) {
+         out: for (var n = s.length, i = 1, i0 = -1, i1; i < n; ++i) {
+           switch (s[i]) {
+             case ".":
+               i0 = i1 = i;
+               break;
+
+             case "0":
+               if (i0 === 0) i0 = i;
+               i1 = i;
+               break;
+
+             default:
+               if (!+s[i]) break out;
+               if (i0 > 0) i0 = 0;
+               break;
+           }
+         }
+
+         return i0 > 0 ? s.slice(0, i0) + s.slice(i1 + 1) : s;
+       }
+
+       var $$5 = _export;
+       var uncurryThis$3 = functionUncurryThis;
+       var fails$3 = fails$V;
+       var thisNumberValue = thisNumberValue$3;
+
+       var un$ToPrecision = uncurryThis$3(1.0.toPrecision);
+
+       var FORCED$1 = fails$3(function () {
+         // IE7-
+         return un$ToPrecision(1, undefined) !== '1';
+       }) || !fails$3(function () {
+         // V8 ~ Android 4.3-
+         un$ToPrecision({});
+       });
+
+       // `Number.prototype.toPrecision` method
+       // https://tc39.es/ecma262/#sec-number.prototype.toprecision
+       $$5({ target: 'Number', proto: true, forced: FORCED$1 }, {
+         toPrecision: function toPrecision(precision) {
+           return precision === undefined
+             ? un$ToPrecision(thisNumberValue(this))
+             : un$ToPrecision(thisNumberValue(this), precision);
+         }
+       });
+
+       var prefixExponent;
+       function formatPrefixAuto (x, p) {
+         var d = formatDecimalParts(x, p);
+         if (!d) return x + "";
+         var coefficient = d[0],
+             exponent = d[1],
+             i = exponent - (prefixExponent = Math.max(-8, Math.min(8, Math.floor(exponent / 3))) * 3) + 1,
+             n = coefficient.length;
+         return i === n ? coefficient : i > n ? coefficient + new Array(i - n + 1).join("0") : i > 0 ? coefficient.slice(0, i) + "." + coefficient.slice(i) : "0." + new Array(1 - i).join("0") + formatDecimalParts(x, Math.max(0, p + i - 1))[0]; // less than 1y!
+       }
+
+       function formatRounded (x, p) {
+         var d = formatDecimalParts(x, p);
+         if (!d) return x + "";
+         var coefficient = d[0],
+             exponent = d[1];
+         return exponent < 0 ? "0." + new Array(-exponent).join("0") + coefficient : coefficient.length > exponent + 1 ? coefficient.slice(0, exponent + 1) + "." + coefficient.slice(exponent + 1) : coefficient + new Array(exponent - coefficient.length + 2).join("0");
+       }
+
+       var formatTypes = {
+         "%": function _(x, p) {
+           return (x * 100).toFixed(p);
+         },
+         "b": function b(x) {
+           return Math.round(x).toString(2);
+         },
+         "c": function c(x) {
+           return x + "";
+         },
+         "d": formatDecimal,
+         "e": function e(x, p) {
+           return x.toExponential(p);
+         },
+         "f": function f(x, p) {
+           return x.toFixed(p);
+         },
+         "g": function g(x, p) {
+           return x.toPrecision(p);
+         },
+         "o": function o(x) {
+           return Math.round(x).toString(8);
+         },
+         "p": function p(x, _p) {
+           return formatRounded(x * 100, _p);
+         },
+         "r": formatRounded,
+         "s": formatPrefixAuto,
+         "X": function X(x) {
+           return Math.round(x).toString(16).toUpperCase();
+         },
+         "x": function x(_x) {
+           return Math.round(_x).toString(16);
+         }
+       };
+
+       function identity (x) {
+         return x;
+       }
+
+       var map$1 = Array.prototype.map,
+           prefixes = ["y", "z", "a", "f", "p", "n", "µ", "m", "", "k", "M", "G", "T", "P", "E", "Z", "Y"];
+       function formatLocale (locale) {
+         var group = locale.grouping === undefined || locale.thousands === undefined ? identity : formatGroup(map$1.call(locale.grouping, Number), locale.thousands + ""),
+             currencyPrefix = locale.currency === undefined ? "" : locale.currency[0] + "",
+             currencySuffix = locale.currency === undefined ? "" : locale.currency[1] + "",
+             decimal = locale.decimal === undefined ? "." : locale.decimal + "",
+             numerals = locale.numerals === undefined ? identity : formatNumerals(map$1.call(locale.numerals, String)),
+             percent = locale.percent === undefined ? "%" : locale.percent + "",
+             minus = locale.minus === undefined ? "−" : locale.minus + "",
+             nan = locale.nan === undefined ? "NaN" : locale.nan + "";
+
+         function newFormat(specifier) {
+           specifier = formatSpecifier(specifier);
+           var fill = specifier.fill,
+               align = specifier.align,
+               sign = specifier.sign,
+               symbol = specifier.symbol,
+               zero = specifier.zero,
+               width = specifier.width,
+               comma = specifier.comma,
+               precision = specifier.precision,
+               trim = specifier.trim,
+               type = specifier.type; // The "n" type is an alias for ",g".
+
+           if (type === "n") comma = true, type = "g"; // The "" type, and any invalid type, is an alias for ".12~g".
+           else if (!formatTypes[type]) precision === undefined && (precision = 12), trim = true, type = "g"; // If zero fill is specified, padding goes after sign and before digits.
+
+           if (zero || fill === "0" && align === "=") zero = true, fill = "0", align = "="; // Compute the prefix and suffix.
+           // For SI-prefix, the suffix is lazily computed.
+
+           var prefix = symbol === "$" ? currencyPrefix : symbol === "#" && /[boxX]/.test(type) ? "0" + type.toLowerCase() : "",
+               suffix = symbol === "$" ? currencySuffix : /[%p]/.test(type) ? percent : ""; // What format function should we use?
+           // Is this an integer type?
+           // Can this type generate exponential notation?
+
+           var formatType = formatTypes[type],
+               maybeSuffix = /[defgprs%]/.test(type); // Set the default precision if not specified,
+           // or clamp the specified precision to the supported range.
+           // For significant precision, it must be in [1, 21].
+           // For fixed precision, it must be in [0, 20].
+
+           precision = precision === undefined ? 6 : /[gprs]/.test(type) ? Math.max(1, Math.min(21, precision)) : Math.max(0, Math.min(20, precision));
+
+           function format(value) {
+             var valuePrefix = prefix,
+                 valueSuffix = suffix,
+                 i,
+                 n,
+                 c;
+
+             if (type === "c") {
+               valueSuffix = formatType(value) + valueSuffix;
+               value = "";
+             } else {
+               value = +value; // Determine the sign. -0 is not less than 0, but 1 / -0 is!
+
+               var valueNegative = value < 0 || 1 / value < 0; // Perform the initial formatting.
+
+               value = isNaN(value) ? nan : formatType(Math.abs(value), precision); // Trim insignificant zeros.
+
+               if (trim) value = formatTrim(value); // If a negative value rounds to zero after formatting, and no explicit positive sign is requested, hide the sign.
+
+               if (valueNegative && +value === 0 && sign !== "+") valueNegative = false; // Compute the prefix and suffix.
+
+               valuePrefix = (valueNegative ? sign === "(" ? sign : minus : sign === "-" || sign === "(" ? "" : sign) + valuePrefix;
+               valueSuffix = (type === "s" ? prefixes[8 + prefixExponent / 3] : "") + valueSuffix + (valueNegative && sign === "(" ? ")" : ""); // Break the formatted value into the integer “value” part that can be
+               // grouped, and fractional or exponential “suffix” part that is not.
+
+               if (maybeSuffix) {
+                 i = -1, n = value.length;
+
+                 while (++i < n) {
+                   if (c = value.charCodeAt(i), 48 > c || c > 57) {
+                     valueSuffix = (c === 46 ? decimal + value.slice(i + 1) : value.slice(i)) + valueSuffix;
+                     value = value.slice(0, i);
+                     break;
+                   }
+                 }
+               }
+             } // If the fill character is not "0", grouping is applied before padding.
+
+
+             if (comma && !zero) value = group(value, Infinity); // Compute the padding.
+
+             var length = valuePrefix.length + value.length + valueSuffix.length,
+                 padding = length < width ? new Array(width - length + 1).join(fill) : ""; // If the fill character is "0", grouping is applied after padding.
+
+             if (comma && zero) value = group(padding + value, padding.length ? width - valueSuffix.length : Infinity), padding = ""; // Reconstruct the final output based on the desired alignment.
+
+             switch (align) {
+               case "<":
+                 value = valuePrefix + value + valueSuffix + padding;
+                 break;
+
+               case "=":
+                 value = valuePrefix + padding + value + valueSuffix;
+                 break;
+
+               case "^":
+                 value = padding.slice(0, length = padding.length >> 1) + valuePrefix + value + valueSuffix + padding.slice(length);
+                 break;
+
+               default:
+                 value = padding + valuePrefix + value + valueSuffix;
+                 break;
+             }
+
+             return numerals(value);
+           }
+
+           format.toString = function () {
+             return specifier + "";
+           };
+
+           return format;
+         }
+
+         function formatPrefix(specifier, value) {
+           var f = newFormat((specifier = formatSpecifier(specifier), specifier.type = "f", specifier)),
+               e = Math.max(-8, Math.min(8, Math.floor(exponent(value) / 3))) * 3,
+               k = Math.pow(10, -e),
+               prefix = prefixes[8 + e / 3];
+           return function (value) {
+             return f(k * value) + prefix;
+           };
+         }
+
+         return {
+           format: newFormat,
+           formatPrefix: formatPrefix
+         };
+       }
+
+       var locale;
+       var format$1;
+       var formatPrefix;
+       defaultLocale({
+         thousands: ",",
+         grouping: [3],
+         currency: ["$", ""]
+       });
+       function defaultLocale(definition) {
+         locale = formatLocale(definition);
+         format$1 = locale.format;
+         formatPrefix = locale.formatPrefix;
+         return locale;
+       }
+
+       function precisionFixed (step) {
+         return Math.max(0, -exponent(Math.abs(step)));
+       }
+
+       function precisionPrefix (step, value) {
+         return Math.max(0, Math.max(-8, Math.min(8, Math.floor(exponent(value) / 3))) * 3 - exponent(Math.abs(step)));
+       }
+
+       function precisionRound (step, max) {
+         step = Math.abs(step), max = Math.abs(max) - step;
+         return Math.max(0, exponent(max) - exponent(step)) + 1;
+       }
+
+       function tickFormat(start, stop, count, specifier) {
+         var step = tickStep(start, stop, count),
+             precision;
+         specifier = formatSpecifier(specifier == null ? ",f" : specifier);
+
+         switch (specifier.type) {
+           case "s":
+             {
+               var value = Math.max(Math.abs(start), Math.abs(stop));
+               if (specifier.precision == null && !isNaN(precision = precisionPrefix(step, value))) specifier.precision = precision;
+               return formatPrefix(specifier, value);
+             }
+
+           case "":
+           case "e":
+           case "g":
+           case "p":
+           case "r":
+             {
+               if (specifier.precision == null && !isNaN(precision = precisionRound(step, Math.max(Math.abs(start), Math.abs(stop))))) specifier.precision = precision - (specifier.type === "e");
+               break;
+             }
+
+           case "f":
+           case "%":
+             {
+               if (specifier.precision == null && !isNaN(precision = precisionFixed(step))) specifier.precision = precision - (specifier.type === "%") * 2;
+               break;
+             }
+         }
+
+         return format$1(specifier);
+       }
+
+       function linearish(scale) {
+         var domain = scale.domain;
+
+         scale.ticks = function (count) {
+           var d = domain();
+           return ticks(d[0], d[d.length - 1], count == null ? 10 : count);
+         };
+
+         scale.tickFormat = function (count, specifier) {
+           var d = domain();
+           return tickFormat(d[0], d[d.length - 1], count == null ? 10 : count, specifier);
+         };
+
+         scale.nice = function (count) {
+           if (count == null) count = 10;
+           var d = domain();
+           var i0 = 0;
+           var i1 = d.length - 1;
+           var start = d[i0];
+           var stop = d[i1];
+           var prestep;
+           var step;
+           var maxIter = 10;
+
+           if (stop < start) {
+             step = start, start = stop, stop = step;
+             step = i0, i0 = i1, i1 = step;
+           }
+
+           while (maxIter-- > 0) {
+             step = tickIncrement(start, stop, count);
+
+             if (step === prestep) {
+               d[i0] = start;
+               d[i1] = stop;
+               return domain(d);
+             } else if (step > 0) {
+               start = Math.floor(start / step) * step;
+               stop = Math.ceil(stop / step) * step;
+             } else if (step < 0) {
+               start = Math.ceil(start * step) / step;
+               stop = Math.floor(stop * step) / step;
+             } else {
+               break;
+             }
+
+             prestep = step;
+           }
+
+           return scale;
+         };
+
+         return scale;
+       }
+       function linear() {
+         var scale = continuous();
+
+         scale.copy = function () {
+           return copy(scale, linear());
+         };
+
+         initRange.apply(scale, arguments);
+         return linearish(scale);
+       }
+
+       // eslint-disable-next-line es/no-math-expm1 -- safe
+       var $expm1 = Math.expm1;
+       var exp$1 = Math.exp;
+
+       // `Math.expm1` method implementation
+       // https://tc39.es/ecma262/#sec-math.expm1
+       var mathExpm1 = (!$expm1
+         // Old FF bug
+         || $expm1(10) > 22025.465794806719 || $expm1(10) < 22025.4657948067165168
+         // Tor Browser bug
+         || $expm1(-2e-17) != -2e-17
+       ) ? function expm1(x) {
+         return (x = +x) == 0 ? x : x > -1e-6 && x < 1e-6 ? x + x * x / 2 : exp$1(x) - 1;
+       } : $expm1;
+
+       function quantize() {
+         var x0 = 0,
+             x1 = 1,
+             n = 1,
+             domain = [0.5],
+             range = [0, 1],
+             unknown;
+
+         function scale(x) {
+           return x != null && x <= x ? range[bisectRight(domain, x, 0, n)] : unknown;
+         }
+
+         function rescale() {
+           var i = -1;
+           domain = new Array(n);
+
+           while (++i < n) {
+             domain[i] = ((i + 1) * x1 - (i - n) * x0) / (n + 1);
+           }
+
+           return scale;
+         }
+
+         scale.domain = function (_) {
+           var _ref, _ref2;
+
+           return arguments.length ? ((_ref = _, _ref2 = _slicedToArray(_ref, 2), x0 = _ref2[0], x1 = _ref2[1], _ref), x0 = +x0, x1 = +x1, rescale()) : [x0, x1];
+         };
+
+         scale.range = function (_) {
+           return arguments.length ? (n = (range = Array.from(_)).length - 1, rescale()) : range.slice();
+         };
+
+         scale.invertExtent = function (y) {
+           var i = range.indexOf(y);
+           return i < 0 ? [NaN, NaN] : i < 1 ? [x0, domain[0]] : i >= n ? [domain[n - 1], x1] : [domain[i - 1], domain[i]];
+         };
+
+         scale.unknown = function (_) {
+           return arguments.length ? (unknown = _, scale) : scale;
+         };
+
+         scale.thresholds = function () {
+           return domain.slice();
+         };
+
+         scale.copy = function () {
+           return quantize().domain([x0, x1]).range(range).unknown(unknown);
+         };
+
+         return initRange.apply(linearish(scale), arguments);
+       }
+
+       var global$3 = global$1o;
+       var uncurryThis$2 = functionUncurryThis;
+       var fails$2 = fails$V;
+       var padStart = stringPad.start;
+
+       var RangeError$2 = global$3.RangeError;
+       var abs$1 = Math.abs;
+       var DatePrototype = Date.prototype;
+       var n$DateToISOString = DatePrototype.toISOString;
+       var getTime = uncurryThis$2(DatePrototype.getTime);
+       var getUTCDate = uncurryThis$2(DatePrototype.getUTCDate);
+       var getUTCFullYear = uncurryThis$2(DatePrototype.getUTCFullYear);
+       var getUTCHours = uncurryThis$2(DatePrototype.getUTCHours);
+       var getUTCMilliseconds = uncurryThis$2(DatePrototype.getUTCMilliseconds);
+       var getUTCMinutes = uncurryThis$2(DatePrototype.getUTCMinutes);
+       var getUTCMonth = uncurryThis$2(DatePrototype.getUTCMonth);
+       var getUTCSeconds = uncurryThis$2(DatePrototype.getUTCSeconds);
+
+       // `Date.prototype.toISOString` method implementation
+       // https://tc39.es/ecma262/#sec-date.prototype.toisostring
+       // PhantomJS / old WebKit fails here:
+       var dateToIsoString = (fails$2(function () {
+         return n$DateToISOString.call(new Date(-5e13 - 1)) != '0385-07-25T07:06:39.999Z';
+       }) || !fails$2(function () {
+         n$DateToISOString.call(new Date(NaN));
+       })) ? function toISOString() {
+         if (!isFinite(getTime(this))) throw RangeError$2('Invalid time value');
+         var date = this;
+         var year = getUTCFullYear(date);
+         var milliseconds = getUTCMilliseconds(date);
+         var sign = year < 0 ? '-' : year > 9999 ? '+' : '';
+         return sign + padStart(abs$1(year), sign ? 6 : 4, 0) +
+           '-' + padStart(getUTCMonth(date) + 1, 2, 0) +
+           '-' + padStart(getUTCDate(date), 2, 0) +
+           'T' + padStart(getUTCHours(date), 2, 0) +
+           ':' + padStart(getUTCMinutes(date), 2, 0) +
+           ':' + padStart(getUTCSeconds(date), 2, 0) +
+           '.' + padStart(milliseconds, 3, 0) +
+           'Z';
+       } : n$DateToISOString;
+
+       var $$4 = _export;
+       var toISOString = dateToIsoString;
+
+       // `Date.prototype.toISOString` method
+       // https://tc39.es/ecma262/#sec-date.prototype.toisostring
+       // PhantomJS / old WebKit has a broken implementations
+       $$4({ target: 'Date', proto: true, forced: Date.prototype.toISOString !== toISOString }, {
+         toISOString: toISOString
+       });
+
+       function behaviorBreathe() {
+         var duration = 800;
+         var steps = 4;
+         var selector = '.selected.shadow, .selected .shadow';
+
+         var _selected = select(null);
+
+         var _classed = '';
+         var _params = {};
+         var _done = false;
+
+         var _timer;
+
+         function ratchetyInterpolator(a, b, steps, units) {
+           a = parseFloat(a);
+           b = parseFloat(b);
+           var sample = quantize().domain([0, 1]).range(d3_quantize(d3_interpolateNumber(a, b), steps));
+           return function (t) {
+             return String(sample(t)) + (units || '');
+           };
+         }
+
+         function reset(selection) {
+           selection.style('stroke-opacity', null).style('stroke-width', null).style('fill-opacity', null).style('r', null);
+         }
+
+         function setAnimationParams(transition, fromTo) {
+           var toFrom = fromTo === 'from' ? 'to' : 'from';
+           transition.styleTween('stroke-opacity', function (d) {
+             return ratchetyInterpolator(_params[d.id][toFrom].opacity, _params[d.id][fromTo].opacity, steps);
+           }).styleTween('stroke-width', function (d) {
+             return ratchetyInterpolator(_params[d.id][toFrom].width, _params[d.id][fromTo].width, steps, 'px');
+           }).styleTween('fill-opacity', function (d) {
+             return ratchetyInterpolator(_params[d.id][toFrom].opacity, _params[d.id][fromTo].opacity, steps);
+           }).styleTween('r', function (d) {
+             return ratchetyInterpolator(_params[d.id][toFrom].width, _params[d.id][fromTo].width, steps, 'px');
+           });
+         }
+
+         function calcAnimationParams(selection) {
+           selection.call(reset).each(function (d) {
+             var s = select(this);
+             var tag = s.node().tagName;
+             var p = {
+               'from': {},
+               'to': {}
+             };
+             var opacity;
+             var width; // determine base opacity and width
+
+             if (tag === 'circle') {
+               opacity = parseFloat(s.style('fill-opacity') || 0.5);
+               width = parseFloat(s.style('r') || 15.5);
+             } else {
+               opacity = parseFloat(s.style('stroke-opacity') || 0.7);
+               width = parseFloat(s.style('stroke-width') || 10);
+             } // calculate from/to interpolation params..
+
+
+             p.tag = tag;
+             p.from.opacity = opacity * 0.6;
+             p.to.opacity = opacity * 1.25;
+             p.from.width = width * 0.7;
+             p.to.width = width * (tag === 'circle' ? 1.5 : 1);
+             _params[d.id] = p;
+           });
+         }
+
+         function run(surface, fromTo) {
+           var toFrom = fromTo === 'from' ? 'to' : 'from';
+           var currSelected = surface.selectAll(selector);
+           var currClassed = surface.attr('class');
+
+           if (_done || currSelected.empty()) {
+             _selected.call(reset);
+
+             _selected = select(null);
+             return;
+           }
+
+           if (!fastDeepEqual(currSelected.data(), _selected.data()) || currClassed !== _classed) {
+             _selected.call(reset);
+
+             _classed = currClassed;
+             _selected = currSelected.call(calcAnimationParams);
+           }
+
+           var didCallNextRun = false;
+
+           _selected.transition().duration(duration).call(setAnimationParams, fromTo).on('end', function () {
+             // `end` event is called for each selected element, but we want
+             // it to run only once
+             if (!didCallNextRun) {
+               surface.call(run, toFrom);
+               didCallNextRun = true;
+             } // if entity was deselected, remove breathe styling
+
+
+             if (!select(this).classed('selected')) {
+               reset(select(this));
+             }
+           });
+         }
+
+         function behavior(surface) {
+           _done = false;
+           _timer = timer(function () {
+             // wait for elements to actually become selected
+             if (surface.selectAll(selector).empty()) {
+               return false;
+             }
+
+             surface.call(run, 'from');
+
+             _timer.stop();
+
+             return true;
+           }, 20);
+         }
+
+         behavior.restartIfNeeded = function (surface) {
+           if (_selected.empty()) {
+             surface.call(run, 'from');
+
+             if (_timer) {
+               _timer.stop();
+             }
+           }
+         };
+
+         behavior.off = function () {
+           _done = true;
+
+           if (_timer) {
+             _timer.stop();
+           }
+
+           _selected.interrupt().call(reset);
+         };
+
+         return behavior;
+       }
+
+       /* Creates a keybinding behavior for an operation */
+       function behaviorOperation(context) {
+         var _operation;
+
+         function keypress(d3_event) {
+           // prevent operations during low zoom selection
+           if (!context.map().withinEditableZoom()) return;
+           if (_operation.availableForKeypress && !_operation.availableForKeypress()) return;
+           d3_event.preventDefault();
+
+           var disabled = _operation.disabled();
+
+           if (disabled) {
+             context.ui().flash.duration(4000).iconName('#iD-operation-' + _operation.id).iconClass('operation disabled').label(_operation.tooltip)();
+           } else {
+             context.ui().flash.duration(2000).iconName('#iD-operation-' + _operation.id).iconClass('operation').label(_operation.annotation() || _operation.title)();
+             if (_operation.point) _operation.point(null);
+
+             _operation();
+           }
+         }
+
+         function behavior() {
+           if (_operation && _operation.available()) {
+             context.keybinding().on(_operation.keys, keypress);
+           }
+
+           return behavior;
+         }
+
+         behavior.off = function () {
+           context.keybinding().off(_operation.keys);
+         };
+
+         behavior.which = function (_) {
+           if (!arguments.length) return _operation;
+           _operation = _;
+           return behavior;
+         };
+
+         return behavior;
+       }
+
+       function operationCircularize(context, selectedIDs) {
+         var _extent;
+
+         var _actions = selectedIDs.map(getAction).filter(Boolean);
+
+         var _amount = _actions.length === 1 ? 'single' : 'multiple';
+
+         var _coords = utilGetAllNodes(selectedIDs, context.graph()).map(function (n) {
+           return n.loc;
+         });
+
+         function getAction(entityID) {
+           var entity = context.entity(entityID);
+           if (entity.type !== 'way' || new Set(entity.nodes).size <= 1) return null;
+
+           if (!_extent) {
+             _extent = entity.extent(context.graph());
+           } else {
+             _extent = _extent.extend(entity.extent(context.graph()));
+           }
+
+           return actionCircularize(entityID, context.projection);
+         }
+
+         var operation = function operation() {
+           if (!_actions.length) return;
+
+           var combinedAction = function combinedAction(graph, t) {
+             _actions.forEach(function (action) {
+               if (!action.disabled(graph)) {
+                 graph = action(graph, t);
+               }
+             });
+
+             return graph;
+           };
+
+           combinedAction.transitionable = true;
+           context.perform(combinedAction, operation.annotation());
+           window.setTimeout(function () {
+             context.validator().validate();
+           }, 300); // after any transition
+         };
+
+         operation.available = function () {
+           return _actions.length && selectedIDs.length === _actions.length;
+         }; // don't cache this because the visible extent could change
+
+
+         operation.disabled = function () {
+           if (!_actions.length) return '';
+
+           var actionDisableds = _actions.map(function (action) {
+             return action.disabled(context.graph());
+           }).filter(Boolean);
+
+           if (actionDisableds.length === _actions.length) {
+             // none of the features can be circularized
+             if (new Set(actionDisableds).size > 1) {
+               return 'multiple_blockers';
+             }
+
+             return actionDisableds[0];
+           } else if (_extent.percentContainedIn(context.map().extent()) < 0.8) {
+             return 'too_large';
+           } else if (someMissing()) {
+             return 'not_downloaded';
+           } else if (selectedIDs.some(context.hasHiddenConnections)) {
+             return 'connected_to_hidden';
+           }
+
+           return false;
+
+           function someMissing() {
+             if (context.inIntro()) return false;
+             var osm = context.connection();
+
+             if (osm) {
+               var missing = _coords.filter(function (loc) {
+                 return !osm.isDataLoaded(loc);
+               });
+
+               if (missing.length) {
+                 missing.forEach(function (loc) {
+                   context.loadTileAtLoc(loc);
+                 });
+                 return true;
+               }
+             }
+
+             return false;
+           }
+         };
+
+         operation.tooltip = function () {
+           var disable = operation.disabled();
+           return disable ? _t('operations.circularize.' + disable + '.' + _amount) : _t('operations.circularize.description.' + _amount);
+         };
+
+         operation.annotation = function () {
+           return _t('operations.circularize.annotation.feature', {
+             n: _actions.length
+           });
+         };
+
+         operation.id = 'circularize';
+         operation.keys = [_t('operations.circularize.key')];
+         operation.title = _t('operations.circularize.title');
+         operation.behavior = behaviorOperation(context).which(operation);
+         return operation;
+       }
+
+       // For example, ⌘Z -> Ctrl+Z
+
+       var uiCmd = function uiCmd(code) {
+         var detected = utilDetect();
+
+         if (detected.os === 'mac') {
+           return code;
+         }
+
+         if (detected.os === 'win') {
+           if (code === '⌘⇧Z') return 'Ctrl+Y';
+         }
+
+         var result = '',
+             replacements = {
+           '⌘': 'Ctrl',
+           '⇧': 'Shift',
+           '⌥': 'Alt',
+           '⌫': 'Backspace',
+           '⌦': 'Delete'
+         };
+
+         for (var i = 0; i < code.length; i++) {
+           if (code[i] in replacements) {
+             result += replacements[code[i]] + (i < code.length - 1 ? '+' : '');
+           } else {
+             result += code[i];
+           }
+         }
+
+         return result;
+       }; // return a display-focused string for a given keyboard code
+
+       uiCmd.display = function (code) {
+         if (code.length !== 1) return code;
+         var detected = utilDetect();
+         var mac = detected.os === 'mac';
+         var replacements = {
+           '⌘': mac ? '⌘ ' + _t('shortcuts.key.cmd') : _t('shortcuts.key.ctrl'),
+           '⇧': mac ? '⇧ ' + _t('shortcuts.key.shift') : _t('shortcuts.key.shift'),
+           '⌥': mac ? '⌥ ' + _t('shortcuts.key.option') : _t('shortcuts.key.alt'),
+           '⌃': mac ? '⌃ ' + _t('shortcuts.key.ctrl') : _t('shortcuts.key.ctrl'),
+           '⌫': mac ? '⌫ ' + _t('shortcuts.key.delete') : _t('shortcuts.key.backspace'),
+           '⌦': mac ? '⌦ ' + _t('shortcuts.key.del') : _t('shortcuts.key.del'),
+           '↖': mac ? '↖ ' + _t('shortcuts.key.pgup') : _t('shortcuts.key.pgup'),
+           '↘': mac ? '↘ ' + _t('shortcuts.key.pgdn') : _t('shortcuts.key.pgdn'),
+           '⇞': mac ? '⇞ ' + _t('shortcuts.key.home') : _t('shortcuts.key.home'),
+           '⇟': mac ? '⇟ ' + _t('shortcuts.key.end') : _t('shortcuts.key.end'),
+           '↵': mac ? '⏎ ' + _t('shortcuts.key.return') : _t('shortcuts.key.enter'),
+           '⎋': mac ? '⎋ ' + _t('shortcuts.key.esc') : _t('shortcuts.key.esc'),
+           '☰': mac ? '☰ ' + _t('shortcuts.key.menu') : _t('shortcuts.key.menu')
+         };
+         return replacements[code] || code;
+       };
+
+       function operationDelete(context, selectedIDs) {
+         var multi = selectedIDs.length === 1 ? 'single' : 'multiple';
+         var action = actionDeleteMultiple(selectedIDs);
+         var nodes = utilGetAllNodes(selectedIDs, context.graph());
+         var coords = nodes.map(function (n) {
+           return n.loc;
+         });
+         var extent = utilTotalExtent(selectedIDs, context.graph());
+
+         var operation = function operation() {
+           var nextSelectedID;
+           var nextSelectedLoc;
+
+           if (selectedIDs.length === 1) {
+             var id = selectedIDs[0];
+             var entity = context.entity(id);
+             var geometry = entity.geometry(context.graph());
+             var parents = context.graph().parentWays(entity);
+             var parent = parents[0]; // Select the next closest node in the way.
+
+             if (geometry === 'vertex') {
+               var nodes = parent.nodes;
+               var i = nodes.indexOf(id);
+
+               if (i === 0) {
+                 i++;
+               } else if (i === nodes.length - 1) {
+                 i--;
+               } else {
+                 var a = geoSphericalDistance(entity.loc, context.entity(nodes[i - 1]).loc);
+                 var b = geoSphericalDistance(entity.loc, context.entity(nodes[i + 1]).loc);
+                 i = a < b ? i - 1 : i + 1;
+               }
+
+               nextSelectedID = nodes[i];
+               nextSelectedLoc = context.entity(nextSelectedID).loc;
+             }
+           }
+
+           context.perform(action, operation.annotation());
+           context.validator().validate();
+
+           if (nextSelectedID && nextSelectedLoc) {
+             if (context.hasEntity(nextSelectedID)) {
+               context.enter(modeSelect(context, [nextSelectedID]).follow(true));
+             } else {
+               context.map().centerEase(nextSelectedLoc);
+               context.enter(modeBrowse(context));
+             }
+           } else {
+             context.enter(modeBrowse(context));
+           }
+         };
+
+         operation.available = function () {
+           return true;
+         };
+
+         operation.disabled = function () {
+           if (extent.percentContainedIn(context.map().extent()) < 0.8) {
+             return 'too_large';
+           } else if (someMissing()) {
+             return 'not_downloaded';
+           } else if (selectedIDs.some(context.hasHiddenConnections)) {
+             return 'connected_to_hidden';
+           } else if (selectedIDs.some(protectedMember)) {
+             return 'part_of_relation';
+           } else if (selectedIDs.some(incompleteRelation)) {
+             return 'incomplete_relation';
+           } else if (selectedIDs.some(hasWikidataTag)) {
+             return 'has_wikidata_tag';
+           }
+
+           return false;
+
+           function someMissing() {
+             if (context.inIntro()) return false;
+             var osm = context.connection();
+
+             if (osm) {
+               var missing = coords.filter(function (loc) {
+                 return !osm.isDataLoaded(loc);
+               });
+
+               if (missing.length) {
+                 missing.forEach(function (loc) {
+                   context.loadTileAtLoc(loc);
+                 });
+                 return true;
+               }
+             }
+
+             return false;
+           }
+
+           function hasWikidataTag(id) {
+             var entity = context.entity(id);
+             return entity.tags.wikidata && entity.tags.wikidata.trim().length > 0;
+           }
+
+           function incompleteRelation(id) {
+             var entity = context.entity(id);
+             return entity.type === 'relation' && !entity.isComplete(context.graph());
+           }
+
+           function protectedMember(id) {
+             var entity = context.entity(id);
+             if (entity.type !== 'way') return false;
+             var parents = context.graph().parentRelations(entity);
+
+             for (var i = 0; i < parents.length; i++) {
+               var parent = parents[i];
+               var type = parent.tags.type;
+               var role = parent.memberById(id).role || 'outer';
+
+               if (type === 'route' || type === 'boundary' || type === 'multipolygon' && role === 'outer') {
+                 return true;
+               }
+             }
+
+             return false;
+           }
+         };
+
+         operation.tooltip = function () {
+           var disable = operation.disabled();
+           return disable ? _t('operations.delete.' + disable + '.' + multi) : _t('operations.delete.description.' + multi);
+         };
+
+         operation.annotation = function () {
+           return selectedIDs.length === 1 ? _t('operations.delete.annotation.' + context.graph().geometry(selectedIDs[0])) : _t('operations.delete.annotation.feature', {
+             n: selectedIDs.length
+           });
+         };
+
+         operation.id = 'delete';
+         operation.keys = [uiCmd('⌘⌫'), uiCmd('⌘⌦'), uiCmd('⌦')];
+         operation.title = _t('operations.delete.title');
+         operation.behavior = behaviorOperation(context).which(operation);
+         return operation;
+       }
+
+       function operationOrthogonalize(context, selectedIDs) {
+         var _extent;
+
+         var _type;
+
+         var _actions = selectedIDs.map(chooseAction).filter(Boolean);
+
+         var _amount = _actions.length === 1 ? 'single' : 'multiple';
+
+         var _coords = utilGetAllNodes(selectedIDs, context.graph()).map(function (n) {
+           return n.loc;
+         });
+
+         function chooseAction(entityID) {
+           var entity = context.entity(entityID);
+           var geometry = entity.geometry(context.graph());
+
+           if (!_extent) {
+             _extent = entity.extent(context.graph());
+           } else {
+             _extent = _extent.extend(entity.extent(context.graph()));
+           } // square a line/area
+
+
+           if (entity.type === 'way' && new Set(entity.nodes).size > 2) {
+             if (_type && _type !== 'feature') return null;
+             _type = 'feature';
+             return actionOrthogonalize(entityID, context.projection); // square a single vertex
+           } else if (geometry === 'vertex') {
+             if (_type && _type !== 'corner') return null;
+             _type = 'corner';
+             var graph = context.graph();
+             var parents = graph.parentWays(entity);
+
+             if (parents.length === 1) {
+               var way = parents[0];
+
+               if (way.nodes.indexOf(entityID) !== -1) {
+                 return actionOrthogonalize(way.id, context.projection, entityID);
+               }
+             }
+           }
+
+           return null;
+         }
+
+         var operation = function operation() {
+           if (!_actions.length) return;
+
+           var combinedAction = function combinedAction(graph, t) {
+             _actions.forEach(function (action) {
+               if (!action.disabled(graph)) {
+                 graph = action(graph, t);
+               }
+             });
+
+             return graph;
+           };
+
+           combinedAction.transitionable = true;
+           context.perform(combinedAction, operation.annotation());
+           window.setTimeout(function () {
+             context.validator().validate();
+           }, 300); // after any transition
+         };
+
+         operation.available = function () {
+           return _actions.length && selectedIDs.length === _actions.length;
+         }; // don't cache this because the visible extent could change
+
+
+         operation.disabled = function () {
+           if (!_actions.length) return '';
+
+           var actionDisableds = _actions.map(function (action) {
+             return action.disabled(context.graph());
+           }).filter(Boolean);
+
+           if (actionDisableds.length === _actions.length) {
+             // none of the features can be squared
+             if (new Set(actionDisableds).size > 1) {
+               return 'multiple_blockers';
+             }
+
+             return actionDisableds[0];
+           } else if (_extent && _extent.percentContainedIn(context.map().extent()) < 0.8) {
+             return 'too_large';
+           } else if (someMissing()) {
+             return 'not_downloaded';
+           } else if (selectedIDs.some(context.hasHiddenConnections)) {
+             return 'connected_to_hidden';
+           }
+
+           return false;
+
+           function someMissing() {
+             if (context.inIntro()) return false;
+             var osm = context.connection();
+
+             if (osm) {
+               var missing = _coords.filter(function (loc) {
+                 return !osm.isDataLoaded(loc);
+               });
+
+               if (missing.length) {
+                 missing.forEach(function (loc) {
+                   context.loadTileAtLoc(loc);
+                 });
+                 return true;
+               }
+             }
+
+             return false;
+           }
+         };
+
+         operation.tooltip = function () {
+           var disable = operation.disabled();
+           return disable ? _t('operations.orthogonalize.' + disable + '.' + _amount) : _t('operations.orthogonalize.description.' + _type + '.' + _amount);
+         };
+
+         operation.annotation = function () {
+           return _t('operations.orthogonalize.annotation.' + _type, {
+             n: _actions.length
+           });
+         };
+
+         operation.id = 'orthogonalize';
+         operation.keys = [_t('operations.orthogonalize.key')];
+         operation.title = _t('operations.orthogonalize.title');
+         operation.behavior = behaviorOperation(context).which(operation);
+         return operation;
+       }
+
+       function operationReflectShort(context, selectedIDs) {
+         return operationReflect(context, selectedIDs, 'short');
+       }
+       function operationReflectLong(context, selectedIDs) {
+         return operationReflect(context, selectedIDs, 'long');
+       }
+       function operationReflect(context, selectedIDs, axis) {
+         axis = axis || 'long';
+         var multi = selectedIDs.length === 1 ? 'single' : 'multiple';
+         var nodes = utilGetAllNodes(selectedIDs, context.graph());
+         var coords = nodes.map(function (n) {
+           return n.loc;
+         });
+         var extent = utilTotalExtent(selectedIDs, context.graph());
+
+         var operation = function operation() {
+           var action = actionReflect(selectedIDs, context.projection).useLongAxis(Boolean(axis === 'long'));
+           context.perform(action, operation.annotation());
+           window.setTimeout(function () {
+             context.validator().validate();
+           }, 300); // after any transition
+         };
+
+         operation.available = function () {
+           return nodes.length >= 3;
+         }; // don't cache this because the visible extent could change
+
+
+         operation.disabled = function () {
+           if (extent.percentContainedIn(context.map().extent()) < 0.8) {
+             return 'too_large';
+           } else if (someMissing()) {
+             return 'not_downloaded';
+           } else if (selectedIDs.some(context.hasHiddenConnections)) {
+             return 'connected_to_hidden';
+           } else if (selectedIDs.some(incompleteRelation)) {
+             return 'incomplete_relation';
+           }
+
+           return false;
+
+           function someMissing() {
+             if (context.inIntro()) return false;
+             var osm = context.connection();
+
+             if (osm) {
+               var missing = coords.filter(function (loc) {
+                 return !osm.isDataLoaded(loc);
+               });
+
+               if (missing.length) {
+                 missing.forEach(function (loc) {
+                   context.loadTileAtLoc(loc);
+                 });
+                 return true;
+               }
+             }
+
+             return false;
+           }
+
+           function incompleteRelation(id) {
+             var entity = context.entity(id);
+             return entity.type === 'relation' && !entity.isComplete(context.graph());
+           }
+         };
+
+         operation.tooltip = function () {
+           var disable = operation.disabled();
+           return disable ? _t('operations.reflect.' + disable + '.' + multi) : _t('operations.reflect.description.' + axis + '.' + multi);
+         };
+
+         operation.annotation = function () {
+           return _t('operations.reflect.annotation.' + axis + '.feature', {
+             n: selectedIDs.length
+           });
+         };
+
+         operation.id = 'reflect-' + axis;
+         operation.keys = [_t('operations.reflect.key.' + axis)];
+         operation.title = _t('operations.reflect.title.' + axis);
+         operation.behavior = behaviorOperation(context).which(operation);
+         return operation;
+       }
+
+       function operationMove(context, selectedIDs) {
+         var multi = selectedIDs.length === 1 ? 'single' : 'multiple';
+         var nodes = utilGetAllNodes(selectedIDs, context.graph());
+         var coords = nodes.map(function (n) {
+           return n.loc;
+         });
+         var extent = utilTotalExtent(selectedIDs, context.graph());
+
+         var operation = function operation() {
+           context.enter(modeMove(context, selectedIDs));
+         };
+
+         operation.available = function () {
+           return selectedIDs.length > 0;
+         };
+
+         operation.disabled = function () {
+           if (extent.percentContainedIn(context.map().extent()) < 0.8) {
+             return 'too_large';
+           } else if (someMissing()) {
+             return 'not_downloaded';
+           } else if (selectedIDs.some(context.hasHiddenConnections)) {
+             return 'connected_to_hidden';
+           } else if (selectedIDs.some(incompleteRelation)) {
+             return 'incomplete_relation';
+           }
+
+           return false;
+
+           function someMissing() {
+             if (context.inIntro()) return false;
+             var osm = context.connection();
+
+             if (osm) {
+               var missing = coords.filter(function (loc) {
+                 return !osm.isDataLoaded(loc);
+               });
+
+               if (missing.length) {
+                 missing.forEach(function (loc) {
+                   context.loadTileAtLoc(loc);
+                 });
+                 return true;
+               }
+             }
+
+             return false;
+           }
+
+           function incompleteRelation(id) {
+             var entity = context.entity(id);
+             return entity.type === 'relation' && !entity.isComplete(context.graph());
+           }
+         };
+
+         operation.tooltip = function () {
+           var disable = operation.disabled();
+           return disable ? _t('operations.move.' + disable + '.' + multi) : _t('operations.move.description.' + multi);
+         };
+
+         operation.annotation = function () {
+           return selectedIDs.length === 1 ? _t('operations.move.annotation.' + context.graph().geometry(selectedIDs[0])) : _t('operations.move.annotation.feature', {
+             n: selectedIDs.length
+           });
+         };
+
+         operation.id = 'move';
+         operation.keys = [_t('operations.move.key')];
+         operation.title = _t('operations.move.title');
+         operation.behavior = behaviorOperation(context).which(operation);
+         operation.mouseOnly = true;
+         return operation;
+       }
+
+       function modeRotate(context, entityIDs) {
+         var _tolerancePx = 4; // see also behaviorDrag, behaviorSelect, modeMove
+
+         var mode = {
+           id: 'rotate',
+           button: 'browse'
+         };
+         var keybinding = utilKeybinding('rotate');
+         var behaviors = [behaviorEdit(context), operationCircularize(context, entityIDs).behavior, operationDelete(context, entityIDs).behavior, operationMove(context, entityIDs).behavior, operationOrthogonalize(context, entityIDs).behavior, operationReflectLong(context, entityIDs).behavior, operationReflectShort(context, entityIDs).behavior];
+         var annotation = entityIDs.length === 1 ? _t('operations.rotate.annotation.' + context.graph().geometry(entityIDs[0])) : _t('operations.rotate.annotation.feature', {
+           n: entityIDs.length
+         });
+
+         var _prevGraph;
+
+         var _prevAngle;
+
+         var _prevTransform;
+
+         var _pivot; // use pointer events on supported platforms; fallback to mouse events
+
+
+         var _pointerPrefix = 'PointerEvent' in window ? 'pointer' : 'mouse';
+
+         function doRotate(d3_event) {
+           var fn;
+
+           if (context.graph() !== _prevGraph) {
+             fn = context.perform;
+           } else {
+             fn = context.replace;
+           } // projection changed, recalculate _pivot
+
+
+           var projection = context.projection;
+           var currTransform = projection.transform();
+
+           if (!_prevTransform || currTransform.k !== _prevTransform.k || currTransform.x !== _prevTransform.x || currTransform.y !== _prevTransform.y) {
+             var nodes = utilGetAllNodes(entityIDs, context.graph());
+             var points = nodes.map(function (n) {
+               return projection(n.loc);
+             });
+             _pivot = getPivot(points);
+             _prevAngle = undefined;
+           }
+
+           var currMouse = context.map().mouse(d3_event);
+           var currAngle = Math.atan2(currMouse[1] - _pivot[1], currMouse[0] - _pivot[0]);
+           if (typeof _prevAngle === 'undefined') _prevAngle = currAngle;
+           var delta = currAngle - _prevAngle;
+           fn(actionRotate(entityIDs, _pivot, delta, projection));
+           _prevTransform = currTransform;
+           _prevAngle = currAngle;
+           _prevGraph = context.graph();
+         }
+
+         function getPivot(points) {
+           var _pivot;
+
+           if (points.length === 1) {
+             _pivot = points[0];
+           } else if (points.length === 2) {
+             _pivot = geoVecInterp(points[0], points[1], 0.5);
+           } else {
+             var polygonHull = d3_polygonHull(points);
+
+             if (polygonHull.length === 2) {
+               _pivot = geoVecInterp(points[0], points[1], 0.5);
+             } else {
+               _pivot = d3_polygonCentroid(d3_polygonHull(points));
+             }
+           }
+
+           return _pivot;
+         }
+
+         function finish(d3_event) {
+           d3_event.stopPropagation();
+           context.replace(actionNoop(), annotation);
+           context.enter(modeSelect(context, entityIDs));
+         }
+
+         function cancel() {
+           if (_prevGraph) context.pop(); // remove the rotate
+
+           context.enter(modeSelect(context, entityIDs));
+         }
+
+         function undone() {
+           context.enter(modeBrowse(context));
+         }
+
+         mode.enter = function () {
+           _prevGraph = null;
+           context.features().forceVisible(entityIDs);
+           behaviors.forEach(context.install);
+           var downEvent;
+           context.surface().on(_pointerPrefix + 'down.modeRotate', function (d3_event) {
+             downEvent = d3_event;
+           });
+           select(window).on(_pointerPrefix + 'move.modeRotate', doRotate, true).on(_pointerPrefix + 'up.modeRotate', function (d3_event) {
+             if (!downEvent) return;
+             var mapNode = context.container().select('.main-map').node();
+             var pointGetter = utilFastMouse(mapNode);
+             var p1 = pointGetter(downEvent);
+             var p2 = pointGetter(d3_event);
+             var dist = geoVecLength(p1, p2);
+             if (dist <= _tolerancePx) finish(d3_event);
+             downEvent = null;
+           }, true);
+           context.history().on('undone.modeRotate', undone);
+           keybinding.on('⎋', cancel).on('↩', finish);
+           select(document).call(keybinding);
+         };
+
+         mode.exit = function () {
+           behaviors.forEach(context.uninstall);
+           context.surface().on(_pointerPrefix + 'down.modeRotate', null);
+           select(window).on(_pointerPrefix + 'move.modeRotate', null, true).on(_pointerPrefix + 'up.modeRotate', null, true);
+           context.history().on('undone.modeRotate', null);
+           select(document).call(keybinding.unbind);
+           context.features().forceVisible([]);
+         };
+
+         mode.selectedIDs = function () {
+           if (!arguments.length) return entityIDs; // no assign
+
+           return mode;
+         };
+
+         return mode;
+       }
+
+       function operationRotate(context, selectedIDs) {
+         var multi = selectedIDs.length === 1 ? 'single' : 'multiple';
+         var nodes = utilGetAllNodes(selectedIDs, context.graph());
+         var coords = nodes.map(function (n) {
+           return n.loc;
+         });
+         var extent = utilTotalExtent(selectedIDs, context.graph());
+
+         var operation = function operation() {
+           context.enter(modeRotate(context, selectedIDs));
+         };
+
+         operation.available = function () {
+           return nodes.length >= 2;
+         };
+
+         operation.disabled = function () {
+           if (extent.percentContainedIn(context.map().extent()) < 0.8) {
+             return 'too_large';
+           } else if (someMissing()) {
+             return 'not_downloaded';
+           } else if (selectedIDs.some(context.hasHiddenConnections)) {
+             return 'connected_to_hidden';
+           } else if (selectedIDs.some(incompleteRelation)) {
+             return 'incomplete_relation';
+           }
+
+           return false;
+
+           function someMissing() {
+             if (context.inIntro()) return false;
+             var osm = context.connection();
+
+             if (osm) {
+               var missing = coords.filter(function (loc) {
+                 return !osm.isDataLoaded(loc);
+               });
+
+               if (missing.length) {
+                 missing.forEach(function (loc) {
+                   context.loadTileAtLoc(loc);
+                 });
+                 return true;
+               }
+             }
+
+             return false;
+           }
+
+           function incompleteRelation(id) {
+             var entity = context.entity(id);
+             return entity.type === 'relation' && !entity.isComplete(context.graph());
+           }
+         };
+
+         operation.tooltip = function () {
+           var disable = operation.disabled();
+           return disable ? _t('operations.rotate.' + disable + '.' + multi) : _t('operations.rotate.description.' + multi);
+         };
+
+         operation.annotation = function () {
+           return selectedIDs.length === 1 ? _t('operations.rotate.annotation.' + context.graph().geometry(selectedIDs[0])) : _t('operations.rotate.annotation.feature', {
+             n: selectedIDs.length
+           });
+         };
+
+         operation.id = 'rotate';
+         operation.keys = [_t('operations.rotate.key')];
+         operation.title = _t('operations.rotate.title');
+         operation.behavior = behaviorOperation(context).which(operation);
+         operation.mouseOnly = true;
+         return operation;
+       }
+
+       function modeMove(context, entityIDs, baseGraph) {
+         var _tolerancePx = 4; // see also behaviorDrag, behaviorSelect, modeRotate
+
+         var mode = {
+           id: 'move',
+           button: 'browse'
+         };
+         var keybinding = utilKeybinding('move');
+         var behaviors = [behaviorEdit(context), operationCircularize(context, entityIDs).behavior, operationDelete(context, entityIDs).behavior, operationOrthogonalize(context, entityIDs).behavior, operationReflectLong(context, entityIDs).behavior, operationReflectShort(context, entityIDs).behavior, operationRotate(context, entityIDs).behavior];
+         var annotation = entityIDs.length === 1 ? _t('operations.move.annotation.' + context.graph().geometry(entityIDs[0])) : _t('operations.move.annotation.feature', {
+           n: entityIDs.length
+         });
+
+         var _prevGraph;
+
+         var _cache;
+
+         var _origin;
+
+         var _nudgeInterval; // use pointer events on supported platforms; fallback to mouse events
+
+
+         var _pointerPrefix = 'PointerEvent' in window ? 'pointer' : 'mouse';
+
+         function doMove(nudge) {
+           nudge = nudge || [0, 0];
+           var fn;
+
+           if (_prevGraph !== context.graph()) {
+             _cache = {};
+             _origin = context.map().mouseCoordinates();
+             fn = context.perform;
+           } else {
+             fn = context.overwrite;
+           }
+
+           var currMouse = context.map().mouse();
+           var origMouse = context.projection(_origin);
+           var delta = geoVecSubtract(geoVecSubtract(currMouse, origMouse), nudge);
+           fn(actionMove(entityIDs, delta, context.projection, _cache));
+           _prevGraph = context.graph();
+         }
+
+         function startNudge(nudge) {
+           if (_nudgeInterval) window.clearInterval(_nudgeInterval);
+           _nudgeInterval = window.setInterval(function () {
+             context.map().pan(nudge);
+             doMove(nudge);
+           }, 50);
+         }
+
+         function stopNudge() {
+           if (_nudgeInterval) {
+             window.clearInterval(_nudgeInterval);
+             _nudgeInterval = null;
+           }
+         }
+
+         function move() {
+           doMove();
+           var nudge = geoViewportEdge(context.map().mouse(), context.map().dimensions());
+
+           if (nudge) {
+             startNudge(nudge);
+           } else {
+             stopNudge();
+           }
+         }
+
+         function finish(d3_event) {
+           d3_event.stopPropagation();
+           context.replace(actionNoop(), annotation);
+           context.enter(modeSelect(context, entityIDs));
+           stopNudge();
+         }
+
+         function cancel() {
+           if (baseGraph) {
+             while (context.graph() !== baseGraph) {
+               context.pop();
+             } // reset to baseGraph
+
+
+             context.enter(modeBrowse(context));
+           } else {
+             if (_prevGraph) context.pop(); // remove the move
+
+             context.enter(modeSelect(context, entityIDs));
+           }
+
+           stopNudge();
+         }
+
+         function undone() {
+           context.enter(modeBrowse(context));
+         }
+
+         mode.enter = function () {
+           _origin = context.map().mouseCoordinates();
+           _prevGraph = null;
+           _cache = {};
+           context.features().forceVisible(entityIDs);
+           behaviors.forEach(context.install);
+           var downEvent;
+           context.surface().on(_pointerPrefix + 'down.modeMove', function (d3_event) {
+             downEvent = d3_event;
+           });
+           select(window).on(_pointerPrefix + 'move.modeMove', move, true).on(_pointerPrefix + 'up.modeMove', function (d3_event) {
+             if (!downEvent) return;
+             var mapNode = context.container().select('.main-map').node();
+             var pointGetter = utilFastMouse(mapNode);
+             var p1 = pointGetter(downEvent);
+             var p2 = pointGetter(d3_event);
+             var dist = geoVecLength(p1, p2);
+             if (dist <= _tolerancePx) finish(d3_event);
+             downEvent = null;
+           }, true);
+           context.history().on('undone.modeMove', undone);
+           keybinding.on('⎋', cancel).on('↩', finish);
+           select(document).call(keybinding);
+         };
+
+         mode.exit = function () {
+           stopNudge();
+           behaviors.forEach(function (behavior) {
+             context.uninstall(behavior);
+           });
+           context.surface().on(_pointerPrefix + 'down.modeMove', null);
+           select(window).on(_pointerPrefix + 'move.modeMove', null, true).on(_pointerPrefix + 'up.modeMove', null, true);
+           context.history().on('undone.modeMove', null);
+           select(document).call(keybinding.unbind);
+           context.features().forceVisible([]);
+         };
+
+         mode.selectedIDs = function () {
+           if (!arguments.length) return entityIDs; // no assign
+
+           return mode;
+         };
+
+         return mode;
+       }
+
+       function behaviorPaste(context) {
+         function doPaste(d3_event) {
+           // prevent paste during low zoom selection
+           if (!context.map().withinEditableZoom()) return;
+           d3_event.preventDefault();
+           var baseGraph = context.graph();
+           var mouse = context.map().mouse();
+           var projection = context.projection;
+           var viewport = geoExtent(projection.clipExtent()).polygon();
+           if (!geoPointInPolygon(mouse, viewport)) return;
+           var oldIDs = context.copyIDs();
+           if (!oldIDs.length) return;
+           var extent = geoExtent();
+           var oldGraph = context.copyGraph();
+           var newIDs = [];
+           var action = actionCopyEntities(oldIDs, oldGraph);
+           context.perform(action);
+           var copies = action.copies();
+           var originals = new Set();
+           Object.values(copies).forEach(function (entity) {
+             originals.add(entity.id);
+           });
+
+           for (var id in copies) {
+             var oldEntity = oldGraph.entity(id);
+             var newEntity = copies[id];
+
+             extent._extend(oldEntity.extent(oldGraph)); // Exclude child nodes from newIDs if their parent way was also copied.
+
+
+             var parents = context.graph().parentWays(newEntity);
+             var parentCopied = parents.some(function (parent) {
+               return originals.has(parent.id);
+             });
+
+             if (!parentCopied) {
+               newIDs.push(newEntity.id);
+             }
+           } // Put pasted objects where mouse pointer is..
+
+
+           var copyPoint = context.copyLonLat() && projection(context.copyLonLat()) || projection(extent.center());
+           var delta = geoVecSubtract(mouse, copyPoint);
+           context.perform(actionMove(newIDs, delta, projection));
+           context.enter(modeMove(context, newIDs, baseGraph));
+         }
+
+         function behavior() {
+           context.keybinding().on(uiCmd('⌘V'), doPaste);
+           return behavior;
+         }
+
+         behavior.off = function () {
+           context.keybinding().off(uiCmd('⌘V'));
+         };
+
+         return behavior;
+       }
+
+       /*
+           `behaviorDrag` is like `d3_behavior.drag`, with the following differences:
+
+           * The `origin` function is expected to return an [x, y] tuple rather than an
+             {x, y} object.
+           * The events are `start`, `move`, and `end`.
+             (https://github.com/mbostock/d3/issues/563)
+           * The `start` event is not dispatched until the first cursor movement occurs.
+             (https://github.com/mbostock/d3/pull/368)
+           * The `move` event has a `point` and `delta` [x, y] tuple properties rather
+             than `x`, `y`, `dx`, and `dy` properties.
+           * The `end` event is not dispatched if no movement occurs.
+           * An `off` function is available that unbinds the drag's internal event handlers.
+        */
+
+       function behaviorDrag() {
+         var dispatch = dispatch$8('start', 'move', 'end'); // see also behaviorSelect
+
+         var _tolerancePx = 1; // keep this low to facilitate pixel-perfect micromapping
+
+         var _penTolerancePx = 4; // styluses can be touchy so require greater movement - #1981
+
+         var _origin = null;
+         var _selector = '';
+
+         var _targetNode;
+
+         var _targetEntity;
+
+         var _surface;
+
+         var _pointerId; // use pointer events on supported platforms; fallback to mouse events
+
+
+         var _pointerPrefix = 'PointerEvent' in window ? 'pointer' : 'mouse';
+
+         var d3_event_userSelectProperty = utilPrefixCSSProperty('UserSelect');
+
+         var d3_event_userSelectSuppress = function d3_event_userSelectSuppress() {
+           var selection$1 = selection();
+           var select = selection$1.style(d3_event_userSelectProperty);
+           selection$1.style(d3_event_userSelectProperty, 'none');
+           return function () {
+             selection$1.style(d3_event_userSelectProperty, select);
+           };
+         };
+
+         function pointerdown(d3_event) {
+           if (_pointerId) return;
+           _pointerId = d3_event.pointerId || 'mouse';
+           _targetNode = this; // only force reflow once per drag
+
+           var pointerLocGetter = utilFastMouse(_surface || _targetNode.parentNode);
+           var offset;
+           var startOrigin = pointerLocGetter(d3_event);
+           var started = false;
+           var selectEnable = d3_event_userSelectSuppress();
+           select(window).on(_pointerPrefix + 'move.drag', pointermove).on(_pointerPrefix + 'up.drag pointercancel.drag', pointerup, true);
+
+           if (_origin) {
+             offset = _origin.call(_targetNode, _targetEntity);
+             offset = [offset[0] - startOrigin[0], offset[1] - startOrigin[1]];
+           } else {
+             offset = [0, 0];
+           }
+
+           d3_event.stopPropagation();
+
+           function pointermove(d3_event) {
+             if (_pointerId !== (d3_event.pointerId || 'mouse')) return;
+             var p = pointerLocGetter(d3_event);
+
+             if (!started) {
+               var dist = geoVecLength(startOrigin, p);
+               var tolerance = d3_event.pointerType === 'pen' ? _penTolerancePx : _tolerancePx; // don't start until the drag has actually moved somewhat
+
+               if (dist < tolerance) return;
+               started = true;
+               dispatch.call('start', this, d3_event, _targetEntity); // Don't send a `move` event in the same cycle as `start` since dragging
+               // a midpoint will convert the target to a node.
+             } else {
+               startOrigin = p;
+               d3_event.stopPropagation();
+               d3_event.preventDefault();
+               var dx = p[0] - startOrigin[0];
+               var dy = p[1] - startOrigin[1];
+               dispatch.call('move', this, d3_event, _targetEntity, [p[0] + offset[0], p[1] + offset[1]], [dx, dy]);
+             }
+           }
+
+           function pointerup(d3_event) {
+             if (_pointerId !== (d3_event.pointerId || 'mouse')) return;
+             _pointerId = null;
+
+             if (started) {
+               dispatch.call('end', this, d3_event, _targetEntity);
+               d3_event.preventDefault();
+             }
+
+             select(window).on(_pointerPrefix + 'move.drag', null).on(_pointerPrefix + 'up.drag pointercancel.drag', null);
+             selectEnable();
+           }
+         }
+
+         function behavior(selection) {
+           var matchesSelector = utilPrefixDOMProperty('matchesSelector');
+           var delegate = pointerdown;
+
+           if (_selector) {
+             delegate = function delegate(d3_event) {
+               var root = this;
+               var target = d3_event.target;
+
+               for (; target && target !== root; target = target.parentNode) {
+                 var datum = target.__data__;
+                 _targetEntity = datum instanceof osmNote ? datum : datum && datum.properties && datum.properties.entity;
+
+                 if (_targetEntity && target[matchesSelector](_selector)) {
+                   return pointerdown.call(target, d3_event);
+                 }
+               }
+             };
+           }
+
+           selection.on(_pointerPrefix + 'down.drag' + _selector, delegate);
+         }
+
+         behavior.off = function (selection) {
+           selection.on(_pointerPrefix + 'down.drag' + _selector, null);
+         };
+
+         behavior.selector = function (_) {
+           if (!arguments.length) return _selector;
+           _selector = _;
+           return behavior;
+         };
+
+         behavior.origin = function (_) {
+           if (!arguments.length) return _origin;
+           _origin = _;
+           return behavior;
+         };
+
+         behavior.cancel = function () {
+           select(window).on(_pointerPrefix + 'move.drag', null).on(_pointerPrefix + 'up.drag pointercancel.drag', null);
+           return behavior;
+         };
+
+         behavior.targetNode = function (_) {
+           if (!arguments.length) return _targetNode;
+           _targetNode = _;
+           return behavior;
+         };
+
+         behavior.targetEntity = function (_) {
+           if (!arguments.length) return _targetEntity;
+           _targetEntity = _;
+           return behavior;
+         };
+
+         behavior.surface = function (_) {
+           if (!arguments.length) return _surface;
+           _surface = _;
+           return behavior;
+         };
+
+         return utilRebind(behavior, dispatch, 'on');
+       }
+
+       function modeDragNode(context) {
+         var mode = {
+           id: 'drag-node',
+           button: 'browse'
+         };
+         var hover = behaviorHover(context).altDisables(true).on('hover', context.ui().sidebar.hover);
+         var edit = behaviorEdit(context);
+
+         var _nudgeInterval;
+
+         var _restoreSelectedIDs = [];
+         var _wasMidpoint = false;
+         var _isCancelled = false;
+
+         var _activeEntity;
+
+         var _startLoc;
+
+         var _lastLoc;
+
+         function startNudge(d3_event, entity, nudge) {
+           if (_nudgeInterval) window.clearInterval(_nudgeInterval);
+           _nudgeInterval = window.setInterval(function () {
+             context.map().pan(nudge);
+             doMove(d3_event, entity, nudge);
+           }, 50);
+         }
+
+         function stopNudge() {
+           if (_nudgeInterval) {
+             window.clearInterval(_nudgeInterval);
+             _nudgeInterval = null;
+           }
+         }
+
+         function moveAnnotation(entity) {
+           return _t('operations.move.annotation.' + entity.geometry(context.graph()));
+         }
+
+         function connectAnnotation(nodeEntity, targetEntity) {
+           var nodeGeometry = nodeEntity.geometry(context.graph());
+           var targetGeometry = targetEntity.geometry(context.graph());
+
+           if (nodeGeometry === 'vertex' && targetGeometry === 'vertex') {
+             var nodeParentWayIDs = context.graph().parentWays(nodeEntity);
+             var targetParentWayIDs = context.graph().parentWays(targetEntity);
+             var sharedParentWays = utilArrayIntersection(nodeParentWayIDs, targetParentWayIDs); // if both vertices are part of the same way
+
+             if (sharedParentWays.length !== 0) {
+               // if the nodes are next to each other, they are merged
+               if (sharedParentWays[0].areAdjacent(nodeEntity.id, targetEntity.id)) {
+                 return _t('operations.connect.annotation.from_vertex.to_adjacent_vertex');
+               }
+
+               return _t('operations.connect.annotation.from_vertex.to_sibling_vertex');
+             }
+           }
+
+           return _t('operations.connect.annotation.from_' + nodeGeometry + '.to_' + targetGeometry);
+         }
+
+         function shouldSnapToNode(target) {
+           if (!_activeEntity) return false;
+           return _activeEntity.geometry(context.graph()) !== 'vertex' || target.geometry(context.graph()) === 'vertex' || _mainPresetIndex.allowsVertex(target, context.graph());
+         }
+
+         function origin(entity) {
+           return context.projection(entity.loc);
+         }
+
+         function keydown(d3_event) {
+           if (d3_event.keyCode === utilKeybinding.modifierCodes.alt) {
+             if (context.surface().classed('nope')) {
+               context.surface().classed('nope-suppressed', true);
+             }
+
+             context.surface().classed('nope', false).classed('nope-disabled', true);
+           }
+         }
+
+         function keyup(d3_event) {
+           if (d3_event.keyCode === utilKeybinding.modifierCodes.alt) {
+             if (context.surface().classed('nope-suppressed')) {
+               context.surface().classed('nope', true);
+             }
+
+             context.surface().classed('nope-suppressed', false).classed('nope-disabled', false);
+           }
+         }
+
+         function start(d3_event, entity) {
+           _wasMidpoint = entity.type === 'midpoint';
+           var hasHidden = context.features().hasHiddenConnections(entity, context.graph());
+           _isCancelled = !context.editable() || d3_event.shiftKey || hasHidden;
+
+           if (_isCancelled) {
+             if (hasHidden) {
+               context.ui().flash.duration(4000).iconName('#iD-icon-no').label(_t('modes.drag_node.connected_to_hidden'))();
+             }
+
+             return drag.cancel();
+           }
+
+           if (_wasMidpoint) {
+             var midpoint = entity;
+             entity = osmNode();
+             context.perform(actionAddMidpoint(midpoint, entity));
+             entity = context.entity(entity.id); // get post-action entity
+
+             var vertex = context.surface().selectAll('.' + entity.id);
+             drag.targetNode(vertex.node()).targetEntity(entity);
+           } else {
+             context.perform(actionNoop());
+           }
+
+           _activeEntity = entity;
+           _startLoc = entity.loc;
+           hover.ignoreVertex(entity.geometry(context.graph()) === 'vertex');
+           context.surface().selectAll('.' + _activeEntity.id).classed('active', true);
+           context.enter(mode);
+         } // related code
+         // - `behavior/draw.js` `datum()`
+
+
+         function datum(d3_event) {
+           if (!d3_event || d3_event.altKey) {
+             return {};
+           } else {
+             // When dragging, snap only to touch targets..
+             // (this excludes area fills and active drawing elements)
+             var d = d3_event.target.__data__;
+             return d && d.properties && d.properties.target ? d : {};
+           }
+         }
+
+         function doMove(d3_event, entity, nudge) {
+           nudge = nudge || [0, 0];
+           var currPoint = d3_event && d3_event.point || context.projection(_lastLoc);
+           var currMouse = geoVecSubtract(currPoint, nudge);
+           var loc = context.projection.invert(currMouse);
+           var target, edge;
+
+           if (!_nudgeInterval) {
+             // If not nudging at the edge of the viewport, try to snap..
+             // related code
+             // - `mode/drag_node.js`     `doMove()`
+             // - `behavior/draw.js`      `click()`
+             // - `behavior/draw_way.js`  `move()`
+             var d = datum(d3_event);
+             target = d && d.properties && d.properties.entity;
+             var targetLoc = target && target.loc;
+             var targetNodes = d && d.properties && d.properties.nodes;
+
+             if (targetLoc) {
+               // snap to node/vertex - a point target with `.loc`
+               if (shouldSnapToNode(target)) {
+                 loc = targetLoc;
+               }
+             } else if (targetNodes) {
+               // snap to way - a line target with `.nodes`
+               edge = geoChooseEdge(targetNodes, context.map().mouse(), context.projection, end.id);
+
+               if (edge) {
+                 loc = edge.loc;
+               }
+             }
+           }
+
+           context.replace(actionMoveNode(entity.id, loc)); // Below here: validations
+
+           var isInvalid = false; // Check if this connection to `target` could cause relations to break..
+
+           if (target) {
+             isInvalid = hasRelationConflict(entity, target, edge, context.graph());
+           } // Check if this drag causes the geometry to break..
+
+
+           if (!isInvalid) {
+             isInvalid = hasInvalidGeometry(entity, context.graph());
+           }
+
+           var nope = context.surface().classed('nope');
+
+           if (isInvalid === 'relation' || isInvalid === 'restriction') {
+             if (!nope) {
+               // about to nope - show hint
+               context.ui().flash.duration(4000).iconName('#iD-icon-no').label(_t.html('operations.connect.' + isInvalid, {
+                 relation: _mainPresetIndex.item('type/restriction').name()
+               }))();
+             }
+           } else if (isInvalid) {
+             var errorID = isInvalid === 'line' ? 'lines' : 'areas';
+             context.ui().flash.duration(3000).iconName('#iD-icon-no').label(_t.html('self_intersection.error.' + errorID))();
+           } else {
+             if (nope) {
+               // about to un-nope, remove hint
+               context.ui().flash.duration(1).label('')();
+             }
+           }
+
+           var nopeDisabled = context.surface().classed('nope-disabled');
+
+           if (nopeDisabled) {
+             context.surface().classed('nope', false).classed('nope-suppressed', isInvalid);
+           } else {
+             context.surface().classed('nope', isInvalid).classed('nope-suppressed', false);
+           }
+
+           _lastLoc = loc;
+         } // Uses `actionConnect.disabled()` to know whether this connection is ok..
+
+
+         function hasRelationConflict(entity, target, edge, graph) {
+           var testGraph = graph.update(); // copy
+           // if snapping to way - add midpoint there and consider that the target..
+
+           if (edge) {
+             var midpoint = osmNode();
+             var action = actionAddMidpoint({
+               loc: edge.loc,
+               edge: [target.nodes[edge.index - 1], target.nodes[edge.index]]
+             }, midpoint);
+             testGraph = action(testGraph);
+             target = midpoint;
+           } // can we connect to it?
+
+
+           var ids = [entity.id, target.id];
+           return actionConnect(ids).disabled(testGraph);
+         }
+
+         function hasInvalidGeometry(entity, graph) {
+           var parents = graph.parentWays(entity);
+           var i, j, k;
+
+           for (i = 0; i < parents.length; i++) {
+             var parent = parents[i];
+             var nodes = [];
+             var activeIndex = null; // which multipolygon ring contains node being dragged
+             // test any parent multipolygons for valid geometry
+
+             var relations = graph.parentRelations(parent);
+
+             for (j = 0; j < relations.length; j++) {
+               if (!relations[j].isMultipolygon()) continue;
+               var rings = osmJoinWays(relations[j].members, graph); // find active ring and test it for self intersections
+
+               for (k = 0; k < rings.length; k++) {
+                 nodes = rings[k].nodes;
+
+                 if (nodes.find(function (n) {
+                   return n.id === entity.id;
+                 })) {
+                   activeIndex = k;
+
+                   if (geoHasSelfIntersections(nodes, entity.id)) {
+                     return 'multipolygonMember';
+                   }
+                 }
+
+                 rings[k].coords = nodes.map(function (n) {
+                   return n.loc;
+                 });
+               } // test active ring for intersections with other rings in the multipolygon
+
+
+               for (k = 0; k < rings.length; k++) {
+                 if (k === activeIndex) continue; // make sure active ring doesn't cross passive rings
+
+                 if (geoHasLineIntersections(rings[activeIndex].nodes, rings[k].nodes, entity.id)) {
+                   return 'multipolygonRing';
+                 }
+               }
+             } // If we still haven't tested this node's parent way for self-intersections.
+             // (because it's not a member of a multipolygon), test it now.
+
+
+             if (activeIndex === null) {
+               nodes = parent.nodes.map(function (nodeID) {
+                 return graph.entity(nodeID);
+               });
+
+               if (nodes.length && geoHasSelfIntersections(nodes, entity.id)) {
+                 return parent.geometry(graph);
+               }
+             }
+           }
+
+           return false;
+         }
+
+         function move(d3_event, entity, point) {
+           if (_isCancelled) return;
+           d3_event.stopPropagation();
+           context.surface().classed('nope-disabled', d3_event.altKey);
+           _lastLoc = context.projection.invert(point);
+           doMove(d3_event, entity);
+           var nudge = geoViewportEdge(point, context.map().dimensions());
+
+           if (nudge) {
+             startNudge(d3_event, entity, nudge);
+           } else {
+             stopNudge();
+           }
+         }
+
+         function end(d3_event, entity) {
+           if (_isCancelled) return;
+           var wasPoint = entity.geometry(context.graph()) === 'point';
+           var d = datum(d3_event);
+           var nope = d && d.properties && d.properties.nope || context.surface().classed('nope');
+           var target = d && d.properties && d.properties.entity; // entity to snap to
+
+           if (nope) {
+             // bounce back
+             context.perform(_actionBounceBack(entity.id, _startLoc));
+           } else if (target && target.type === 'way') {
+             var choice = geoChooseEdge(context.graph().childNodes(target), context.map().mouse(), context.projection, entity.id);
+             context.replace(actionAddMidpoint({
+               loc: choice.loc,
+               edge: [target.nodes[choice.index - 1], target.nodes[choice.index]]
+             }, entity), connectAnnotation(entity, target));
+           } else if (target && target.type === 'node' && shouldSnapToNode(target)) {
+             context.replace(actionConnect([target.id, entity.id]), connectAnnotation(entity, target));
+           } else if (_wasMidpoint) {
+             context.replace(actionNoop(), _t('operations.add.annotation.vertex'));
+           } else {
+             context.replace(actionNoop(), moveAnnotation(entity));
+           }
+
+           if (wasPoint) {
+             context.enter(modeSelect(context, [entity.id]));
+           } else {
+             var reselection = _restoreSelectedIDs.filter(function (id) {
+               return context.graph().hasEntity(id);
+             });
+
+             if (reselection.length) {
+               context.enter(modeSelect(context, reselection));
+             } else {
+               context.enter(modeBrowse(context));
+             }
+           }
+         }
+
+         function _actionBounceBack(nodeID, toLoc) {
+           var moveNode = actionMoveNode(nodeID, toLoc);
+
+           var action = function action(graph, t) {
+             // last time through, pop off the bounceback perform.
+             // it will then overwrite the initial perform with a moveNode that does nothing
+             if (t === 1) context.pop();
+             return moveNode(graph, t);
+           };
+
+           action.transitionable = true;
+           return action;
+         }
+
+         function cancel() {
+           drag.cancel();
+           context.enter(modeBrowse(context));
+         }
+
+         var drag = behaviorDrag().selector('.layer-touch.points .target').surface(context.container().select('.main-map').node()).origin(origin).on('start', start).on('move', move).on('end', end);
+
+         mode.enter = function () {
+           context.install(hover);
+           context.install(edit);
+           select(window).on('keydown.dragNode', keydown).on('keyup.dragNode', keyup);
+           context.history().on('undone.drag-node', cancel);
+         };
+
+         mode.exit = function () {
+           context.ui().sidebar.hover.cancel();
+           context.uninstall(hover);
+           context.uninstall(edit);
+           select(window).on('keydown.dragNode', null).on('keyup.dragNode', null);
+           context.history().on('undone.drag-node', null);
+           _activeEntity = null;
+           context.surface().classed('nope', false).classed('nope-suppressed', false).classed('nope-disabled', false).selectAll('.active').classed('active', false);
+           stopNudge();
+         };
+
+         mode.selectedIDs = function () {
+           if (!arguments.length) return _activeEntity ? [_activeEntity.id] : []; // no assign
+
+           return mode;
+         };
+
+         mode.activeID = function () {
+           if (!arguments.length) return _activeEntity && _activeEntity.id; // no assign
+
+           return mode;
+         };
+
+         mode.restoreSelectedIDs = function (_) {
+           if (!arguments.length) return _restoreSelectedIDs;
+           _restoreSelectedIDs = _;
+           return mode;
+         };
+
+         mode.behavior = drag;
+         return mode;
+       }
+
+       var $$3 = _export;
+       var NativePromise = nativePromiseConstructor;
+       var fails$1 = fails$V;
+       var getBuiltIn = getBuiltIn$b;
+       var isCallable = isCallable$r;
+       var speciesConstructor = speciesConstructor$5;
+       var promiseResolve = promiseResolve$2;
+       var redefine$1 = redefine$h.exports;
+
+       // Safari bug https://bugs.webkit.org/show_bug.cgi?id=200829
+       var NON_GENERIC = !!NativePromise && fails$1(function () {
+         // eslint-disable-next-line unicorn/no-thenable -- required for testing
+         NativePromise.prototype['finally'].call({ then: function () { /* empty */ } }, function () { /* empty */ });
+       });
+
+       // `Promise.prototype.finally` method
+       // https://tc39.es/ecma262/#sec-promise.prototype.finally
+       $$3({ target: 'Promise', proto: true, real: true, forced: NON_GENERIC }, {
+         'finally': function (onFinally) {
+           var C = speciesConstructor(this, getBuiltIn('Promise'));
+           var isFunction = isCallable(onFinally);
+           return this.then(
+             isFunction ? function (x) {
+               return promiseResolve(C, onFinally()).then(function () { return x; });
+             } : onFinally,
+             isFunction ? function (e) {
+               return promiseResolve(C, onFinally()).then(function () { throw e; });
+             } : onFinally
+           );
+         }
+       });
+
+       // makes sure that native promise-based APIs `Promise#finally` properly works with patched `Promise#then`
+       if (isCallable(NativePromise)) {
+         var method = getBuiltIn('Promise').prototype['finally'];
+         if (NativePromise.prototype['finally'] !== method) {
+           redefine$1(NativePromise.prototype, 'finally', method, { unsafe: true });
+         }
+       }
+
+       function quickselect(arr, k, left, right, compare) {
+         quickselectStep(arr, k, left || 0, right || arr.length - 1, compare || defaultCompare);
+       }
+
+       function quickselectStep(arr, k, left, right, compare) {
+         while (right > left) {
+           if (right - left > 600) {
+             var n = right - left + 1;
+             var m = k - left + 1;
+             var z = Math.log(n);
+             var s = 0.5 * Math.exp(2 * z / 3);
+             var sd = 0.5 * Math.sqrt(z * s * (n - s) / n) * (m - n / 2 < 0 ? -1 : 1);
+             var newLeft = Math.max(left, Math.floor(k - m * s / n + sd));
+             var newRight = Math.min(right, Math.floor(k + (n - m) * s / n + sd));
+             quickselectStep(arr, k, newLeft, newRight, compare);
+           }
+
+           var t = arr[k];
+           var i = left;
+           var j = right;
+           swap(arr, left, k);
+           if (compare(arr[right], t) > 0) swap(arr, left, right);
+
+           while (i < j) {
+             swap(arr, i, j);
+             i++;
+             j--;
+
+             while (compare(arr[i], t) < 0) {
+               i++;
+             }
+
+             while (compare(arr[j], t) > 0) {
+               j--;
+             }
+           }
+
+           if (compare(arr[left], t) === 0) swap(arr, left, j);else {
+             j++;
+             swap(arr, j, right);
+           }
+           if (j <= k) left = j + 1;
+           if (k <= j) right = j - 1;
+         }
+       }
+
+       function swap(arr, i, j) {
+         var tmp = arr[i];
+         arr[i] = arr[j];
+         arr[j] = tmp;
+       }
+
+       function defaultCompare(a, b) {
+         return a < b ? -1 : a > b ? 1 : 0;
+       }
+
+       var RBush = /*#__PURE__*/function () {
+         function RBush() {
+           var maxEntries = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 9;
+
+           _classCallCheck$1(this, RBush);
+
+           // max entries in a node is 9 by default; min node fill is 40% for best performance
+           this._maxEntries = Math.max(4, maxEntries);
+           this._minEntries = Math.max(2, Math.ceil(this._maxEntries * 0.4));
+           this.clear();
+         }
+
+         _createClass$1(RBush, [{
+           key: "all",
+           value: function all() {
+             return this._all(this.data, []);
+           }
+         }, {
+           key: "search",
+           value: function search(bbox) {
+             var node = this.data;
+             var result = [];
+             if (!intersects(bbox, node)) return result;
+             var toBBox = this.toBBox;
+             var nodesToSearch = [];
+
+             while (node) {
+               for (var i = 0; i < node.children.length; i++) {
+                 var child = node.children[i];
+                 var childBBox = node.leaf ? toBBox(child) : child;
+
+                 if (intersects(bbox, childBBox)) {
+                   if (node.leaf) result.push(child);else if (contains(bbox, childBBox)) this._all(child, result);else nodesToSearch.push(child);
+                 }
+               }
+
+               node = nodesToSearch.pop();
+             }
+
+             return result;
+           }
+         }, {
+           key: "collides",
+           value: function collides(bbox) {
+             var node = this.data;
+             if (!intersects(bbox, node)) return false;
+             var nodesToSearch = [];
+
+             while (node) {
+               for (var i = 0; i < node.children.length; i++) {
+                 var child = node.children[i];
+                 var childBBox = node.leaf ? this.toBBox(child) : child;
+
+                 if (intersects(bbox, childBBox)) {
+                   if (node.leaf || contains(bbox, childBBox)) return true;
+                   nodesToSearch.push(child);
+                 }
+               }
+
+               node = nodesToSearch.pop();
+             }
+
+             return false;
+           }
+         }, {
+           key: "load",
+           value: function load(data) {
+             if (!(data && data.length)) return this;
+
+             if (data.length < this._minEntries) {
+               for (var i = 0; i < data.length; i++) {
+                 this.insert(data[i]);
+               }
+
+               return this;
+             } // recursively build the tree with the given data from scratch using OMT algorithm
+
+
+             var node = this._build(data.slice(), 0, data.length - 1, 0);
+
+             if (!this.data.children.length) {
+               // save as is if tree is empty
+               this.data = node;
+             } else if (this.data.height === node.height) {
+               // split root if trees have the same height
+               this._splitRoot(this.data, node);
+             } else {
+               if (this.data.height < node.height) {
+                 // swap trees if inserted one is bigger
+                 var tmpNode = this.data;
+                 this.data = node;
+                 node = tmpNode;
+               } // insert the small tree into the large tree at appropriate level
+
+
+               this._insert(node, this.data.height - node.height - 1, true);
+             }
+
+             return this;
+           }
+         }, {
+           key: "insert",
+           value: function insert(item) {
+             if (item) this._insert(item, this.data.height - 1);
+             return this;
+           }
+         }, {
+           key: "clear",
+           value: function clear() {
+             this.data = createNode([]);
+             return this;
+           }
+         }, {
+           key: "remove",
+           value: function remove(item, equalsFn) {
+             if (!item) return this;
+             var node = this.data;
+             var bbox = this.toBBox(item);
+             var path = [];
+             var indexes = [];
+             var i, parent, goingUp; // depth-first iterative tree traversal
+
+             while (node || path.length) {
+               if (!node) {
+                 // go up
+                 node = path.pop();
+                 parent = path[path.length - 1];
+                 i = indexes.pop();
+                 goingUp = true;
+               }
+
+               if (node.leaf) {
+                 // check current node
+                 var index = findItem(item, node.children, equalsFn);
+
+                 if (index !== -1) {
+                   // item found, remove the item and condense tree upwards
+                   node.children.splice(index, 1);
+                   path.push(node);
+
+                   this._condense(path);
+
+                   return this;
+                 }
+               }
+
+               if (!goingUp && !node.leaf && contains(node, bbox)) {
+                 // go down
+                 path.push(node);
+                 indexes.push(i);
+                 i = 0;
+                 parent = node;
+                 node = node.children[0];
+               } else if (parent) {
+                 // go right
+                 i++;
+                 node = parent.children[i];
+                 goingUp = false;
+               } else node = null; // nothing found
+
+             }
+
+             return this;
+           }
+         }, {
+           key: "toBBox",
+           value: function toBBox(item) {
+             return item;
+           }
+         }, {
+           key: "compareMinX",
+           value: function compareMinX(a, b) {
+             return a.minX - b.minX;
+           }
+         }, {
+           key: "compareMinY",
+           value: function compareMinY(a, b) {
+             return a.minY - b.minY;
+           }
+         }, {
+           key: "toJSON",
+           value: function toJSON() {
+             return this.data;
+           }
+         }, {
+           key: "fromJSON",
+           value: function fromJSON(data) {
+             this.data = data;
+             return this;
+           }
+         }, {
+           key: "_all",
+           value: function _all(node, result) {
+             var nodesToSearch = [];
+
+             while (node) {
+               if (node.leaf) result.push.apply(result, _toConsumableArray(node.children));else nodesToSearch.push.apply(nodesToSearch, _toConsumableArray(node.children));
+               node = nodesToSearch.pop();
+             }
+
+             return result;
+           }
+         }, {
+           key: "_build",
+           value: function _build(items, left, right, height) {
+             var N = right - left + 1;
+             var M = this._maxEntries;
+             var node;
+
+             if (N <= M) {
+               // reached leaf level; return leaf
+               node = createNode(items.slice(left, right + 1));
+               calcBBox(node, this.toBBox);
+               return node;
+             }
+
+             if (!height) {
+               // target height of the bulk-loaded tree
+               height = Math.ceil(Math.log(N) / Math.log(M)); // target number of root entries to maximize storage utilization
+
+               M = Math.ceil(N / Math.pow(M, height - 1));
+             }
+
+             node = createNode([]);
+             node.leaf = false;
+             node.height = height; // split the items into M mostly square tiles
+
+             var N2 = Math.ceil(N / M);
+             var N1 = N2 * Math.ceil(Math.sqrt(M));
+             multiSelect(items, left, right, N1, this.compareMinX);
+
+             for (var i = left; i <= right; i += N1) {
+               var right2 = Math.min(i + N1 - 1, right);
+               multiSelect(items, i, right2, N2, this.compareMinY);
+
+               for (var j = i; j <= right2; j += N2) {
+                 var right3 = Math.min(j + N2 - 1, right2); // pack each entry recursively
+
+                 node.children.push(this._build(items, j, right3, height - 1));
+               }
+             }
+
+             calcBBox(node, this.toBBox);
+             return node;
+           }
+         }, {
+           key: "_chooseSubtree",
+           value: function _chooseSubtree(bbox, node, level, path) {
+             while (true) {
+               path.push(node);
+               if (node.leaf || path.length - 1 === level) break;
+               var minArea = Infinity;
+               var minEnlargement = Infinity;
+               var targetNode = void 0;
+
+               for (var i = 0; i < node.children.length; i++) {
+                 var child = node.children[i];
+                 var area = bboxArea(child);
+                 var enlargement = enlargedArea(bbox, child) - area; // choose entry with the least area enlargement
+
+                 if (enlargement < minEnlargement) {
+                   minEnlargement = enlargement;
+                   minArea = area < minArea ? area : minArea;
+                   targetNode = child;
+                 } else if (enlargement === minEnlargement) {
+                   // otherwise choose one with the smallest area
+                   if (area < minArea) {
+                     minArea = area;
+                     targetNode = child;
+                   }
+                 }
+               }
+
+               node = targetNode || node.children[0];
+             }
+
+             return node;
+           }
+         }, {
+           key: "_insert",
+           value: function _insert(item, level, isNode) {
+             var bbox = isNode ? item : this.toBBox(item);
+             var insertPath = []; // find the best node for accommodating the item, saving all nodes along the path too
+
+             var node = this._chooseSubtree(bbox, this.data, level, insertPath); // put the item into the node
+
+
+             node.children.push(item);
+             extend$1(node, bbox); // split on node overflow; propagate upwards if necessary
+
+             while (level >= 0) {
+               if (insertPath[level].children.length > this._maxEntries) {
+                 this._split(insertPath, level);
+
+                 level--;
+               } else break;
+             } // adjust bboxes along the insertion path
+
+
+             this._adjustParentBBoxes(bbox, insertPath, level);
+           } // split overflowed node into two
+
+         }, {
+           key: "_split",
+           value: function _split(insertPath, level) {
+             var node = insertPath[level];
+             var M = node.children.length;
+             var m = this._minEntries;
+
+             this._chooseSplitAxis(node, m, M);
+
+             var splitIndex = this._chooseSplitIndex(node, m, M);
+
+             var newNode = createNode(node.children.splice(splitIndex, node.children.length - splitIndex));
+             newNode.height = node.height;
+             newNode.leaf = node.leaf;
+             calcBBox(node, this.toBBox);
+             calcBBox(newNode, this.toBBox);
+             if (level) insertPath[level - 1].children.push(newNode);else this._splitRoot(node, newNode);
+           }
+         }, {
+           key: "_splitRoot",
+           value: function _splitRoot(node, newNode) {
+             // split root node
+             this.data = createNode([node, newNode]);
+             this.data.height = node.height + 1;
+             this.data.leaf = false;
+             calcBBox(this.data, this.toBBox);
+           }
+         }, {
+           key: "_chooseSplitIndex",
+           value: function _chooseSplitIndex(node, m, M) {
+             var index;
+             var minOverlap = Infinity;
+             var minArea = Infinity;
+
+             for (var i = m; i <= M - m; i++) {
+               var bbox1 = distBBox(node, 0, i, this.toBBox);
+               var bbox2 = distBBox(node, i, M, this.toBBox);
+               var overlap = intersectionArea(bbox1, bbox2);
+               var area = bboxArea(bbox1) + bboxArea(bbox2); // choose distribution with minimum overlap
+
+               if (overlap < minOverlap) {
+                 minOverlap = overlap;
+                 index = i;
+                 minArea = area < minArea ? area : minArea;
+               } else if (overlap === minOverlap) {
+                 // otherwise choose distribution with minimum area
+                 if (area < minArea) {
+                   minArea = area;
+                   index = i;
+                 }
+               }
+             }
+
+             return index || M - m;
+           } // sorts node children by the best axis for split
+
+         }, {
+           key: "_chooseSplitAxis",
+           value: function _chooseSplitAxis(node, m, M) {
+             var compareMinX = node.leaf ? this.compareMinX : compareNodeMinX;
+             var compareMinY = node.leaf ? this.compareMinY : compareNodeMinY;
+
+             var xMargin = this._allDistMargin(node, m, M, compareMinX);
+
+             var yMargin = this._allDistMargin(node, m, M, compareMinY); // if total distributions margin value is minimal for x, sort by minX,
+             // otherwise it's already sorted by minY
+
+
+             if (xMargin < yMargin) node.children.sort(compareMinX);
+           } // total margin of all possible split distributions where each node is at least m full
+
+         }, {
+           key: "_allDistMargin",
+           value: function _allDistMargin(node, m, M, compare) {
+             node.children.sort(compare);
+             var toBBox = this.toBBox;
+             var leftBBox = distBBox(node, 0, m, toBBox);
+             var rightBBox = distBBox(node, M - m, M, toBBox);
+             var margin = bboxMargin(leftBBox) + bboxMargin(rightBBox);
+
+             for (var i = m; i < M - m; i++) {
+               var child = node.children[i];
+               extend$1(leftBBox, node.leaf ? toBBox(child) : child);
+               margin += bboxMargin(leftBBox);
+             }
+
+             for (var _i = M - m - 1; _i >= m; _i--) {
+               var _child = node.children[_i];
+               extend$1(rightBBox, node.leaf ? toBBox(_child) : _child);
+               margin += bboxMargin(rightBBox);
+             }
+
+             return margin;
+           }
+         }, {
+           key: "_adjustParentBBoxes",
+           value: function _adjustParentBBoxes(bbox, path, level) {
+             // adjust bboxes along the given tree path
+             for (var i = level; i >= 0; i--) {
+               extend$1(path[i], bbox);
+             }
+           }
+         }, {
+           key: "_condense",
+           value: function _condense(path) {
+             // go through the path, removing empty nodes and updating bboxes
+             for (var i = path.length - 1, siblings; i >= 0; i--) {
+               if (path[i].children.length === 0) {
+                 if (i > 0) {
+                   siblings = path[i - 1].children;
+                   siblings.splice(siblings.indexOf(path[i]), 1);
+                 } else this.clear();
+               } else calcBBox(path[i], this.toBBox);
+             }
+           }
+         }]);
+
+         return RBush;
+       }();
+
+       function findItem(item, items, equalsFn) {
+         if (!equalsFn) return items.indexOf(item);
+
+         for (var i = 0; i < items.length; i++) {
+           if (equalsFn(item, items[i])) return i;
+         }
+
+         return -1;
+       } // calculate node's bbox from bboxes of its children
+
+
+       function calcBBox(node, toBBox) {
+         distBBox(node, 0, node.children.length, toBBox, node);
+       } // min bounding rectangle of node children from k to p-1
+
+
+       function distBBox(node, k, p, toBBox, destNode) {
+         if (!destNode) destNode = createNode(null);
+         destNode.minX = Infinity;
+         destNode.minY = Infinity;
+         destNode.maxX = -Infinity;
+         destNode.maxY = -Infinity;
+
+         for (var i = k; i < p; i++) {
+           var child = node.children[i];
+           extend$1(destNode, node.leaf ? toBBox(child) : child);
+         }
+
+         return destNode;
+       }
+
+       function extend$1(a, b) {
+         a.minX = Math.min(a.minX, b.minX);
+         a.minY = Math.min(a.minY, b.minY);
+         a.maxX = Math.max(a.maxX, b.maxX);
+         a.maxY = Math.max(a.maxY, b.maxY);
+         return a;
+       }
+
+       function compareNodeMinX(a, b) {
+         return a.minX - b.minX;
+       }
+
+       function compareNodeMinY(a, b) {
+         return a.minY - b.minY;
+       }
+
+       function bboxArea(a) {
+         return (a.maxX - a.minX) * (a.maxY - a.minY);
+       }
+
+       function bboxMargin(a) {
+         return a.maxX - a.minX + (a.maxY - a.minY);
+       }
+
+       function enlargedArea(a, b) {
+         return (Math.max(b.maxX, a.maxX) - Math.min(b.minX, a.minX)) * (Math.max(b.maxY, a.maxY) - Math.min(b.minY, a.minY));
+       }
+
+       function intersectionArea(a, b) {
+         var minX = Math.max(a.minX, b.minX);
+         var minY = Math.max(a.minY, b.minY);
+         var maxX = Math.min(a.maxX, b.maxX);
+         var maxY = Math.min(a.maxY, b.maxY);
+         return Math.max(0, maxX - minX) * Math.max(0, maxY - minY);
+       }
+
+       function contains(a, b) {
+         return a.minX <= b.minX && a.minY <= b.minY && b.maxX <= a.maxX && b.maxY <= a.maxY;
+       }
+
+       function intersects(a, b) {
+         return b.minX <= a.maxX && b.minY <= a.maxY && b.maxX >= a.minX && b.maxY >= a.minY;
+       }
+
+       function createNode(children) {
+         return {
+           children: children,
+           height: 1,
+           leaf: true,
+           minX: Infinity,
+           minY: Infinity,
+           maxX: -Infinity,
+           maxY: -Infinity
+         };
+       } // sort an array so that items come in groups of n unsorted items, with groups sorted between each other;
+       // combines selection algorithm with binary divide & conquer approach
+
+
+       function multiSelect(arr, left, right, n, compare) {
+         var stack = [left, right];
+
+         while (stack.length) {
+           right = stack.pop();
+           left = stack.pop();
+           if (right - left <= n) continue;
+           var mid = left + Math.ceil((right - left) / n / 2) * n;
+           quickselect(arr, mid, left, right, compare);
+           stack.push(left, mid, mid, right);
+         }
+       }
+
+       function responseText(response) {
+         if (!response.ok) throw new Error(response.status + " " + response.statusText);
+         return response.text();
+       }
+
+       function d3_text (input, init) {
+         return fetch(input, init).then(responseText);
+       }
+
+       function responseJson(response) {
+         if (!response.ok) throw new Error(response.status + " " + response.statusText);
+         if (response.status === 204 || response.status === 205) return;
+         return response.json();
+       }
+
+       function d3_json (input, init) {
+         return fetch(input, init).then(responseJson);
+       }
+
+       function parser(type) {
+         return function (input, init) {
+           return d3_text(input, init).then(function (text) {
+             return new DOMParser().parseFromString(text, type);
+           });
+         };
+       }
+
+       var d3_xml = parser("application/xml");
+       var svg = parser("image/svg+xml");
+
+       var tiler$6 = utilTiler();
+       var dispatch$7 = dispatch$8('loaded');
+       var _tileZoom$3 = 14;
+       var _krUrlRoot = 'https://www.keepright.at';
+       var _krData = {
+         errorTypes: {},
+         localizeStrings: {}
+       }; // This gets reassigned if reset
+
+       var _cache$2;
+
+       var _krRuleset = [// no 20 - multiple node on same spot - these are mostly boundaries overlapping roads
+       30, 40, 50, 60, 70, 90, 100, 110, 120, 130, 150, 160, 170, 180, 190, 191, 192, 193, 194, 195, 196, 197, 198, 200, 201, 202, 203, 204, 205, 206, 207, 208, 210, 220, 230, 231, 232, 270, 280, 281, 282, 283, 284, 285, 290, 291, 292, 293, 294, 295, 296, 297, 298, 300, 310, 311, 312, 313, 320, 350, 360, 370, 380, 390, 400, 401, 402, 410, 411, 412, 413];
+
+       function abortRequest$6(controller) {
+         if (controller) {
+           controller.abort();
+         }
+       }
+
+       function abortUnwantedRequests$3(cache, tiles) {
+         Object.keys(cache.inflightTile).forEach(function (k) {
+           var wanted = tiles.find(function (tile) {
+             return k === tile.id;
+           });
+
+           if (!wanted) {
+             abortRequest$6(cache.inflightTile[k]);
+             delete cache.inflightTile[k];
+           }
+         });
+       }
+
+       function encodeIssueRtree$2(d) {
+         return {
+           minX: d.loc[0],
+           minY: d.loc[1],
+           maxX: d.loc[0],
+           maxY: d.loc[1],
+           data: d
+         };
+       } // Replace or remove QAItem from rtree
+
+
+       function updateRtree$3(item, replace) {
+         _cache$2.rtree.remove(item, function (a, b) {
+           return a.data.id === b.data.id;
+         });
+
+         if (replace) {
+           _cache$2.rtree.insert(item);
+         }
+       }
+
+       function tokenReplacements(d) {
+         if (!(d instanceof QAItem)) return;
+         var replacements = {};
+         var issueTemplate = _krData.errorTypes[d.whichType];
+
+         if (!issueTemplate) {
+           /* eslint-disable no-console */
+           console.log('No Template: ', d.whichType);
+           console.log('  ', d.description);
+           /* eslint-enable no-console */
+
+           return;
+         } // some descriptions are just fixed text
+
+
+         if (!issueTemplate.regex) return; // regex pattern should match description with variable details captured
+
+         var errorRegex = new RegExp(issueTemplate.regex, 'i');
+         var errorMatch = errorRegex.exec(d.description);
+
+         if (!errorMatch) {
+           /* eslint-disable no-console */
+           console.log('Unmatched: ', d.whichType);
+           console.log('  ', d.description);
+           console.log('  ', errorRegex);
+           /* eslint-enable no-console */
+
+           return;
+         }
+
+         for (var i = 1; i < errorMatch.length; i++) {
+           // skip first
+           var capture = errorMatch[i];
+           var idType = void 0;
+           idType = 'IDs' in issueTemplate ? issueTemplate.IDs[i - 1] : '';
+
+           if (idType && capture) {
+             // link IDs if present in the capture
+             capture = parseError(capture, idType);
+           } else {
+             var compare = capture.toLowerCase();
+
+             if (_krData.localizeStrings[compare]) {
+               // some replacement strings can be localized
+               capture = _t('QA.keepRight.error_parts.' + _krData.localizeStrings[compare]);
+             } else {
+               capture = unescape$3(capture);
+             }
+           }
+
+           replacements['var' + i] = capture;
+         }
+
+         return replacements;
+       }
+
+       function parseError(capture, idType) {
+         var compare = capture.toLowerCase();
+
+         if (_krData.localizeStrings[compare]) {
+           // some replacement strings can be localized
+           capture = _t('QA.keepRight.error_parts.' + _krData.localizeStrings[compare]);
+         }
+
+         switch (idType) {
+           // link a string like "this node"
+           case 'this':
+             capture = linkErrorObject(capture);
+             break;
+
+           case 'url':
+             capture = linkURL(capture);
+             break;
+           // link an entity ID
+
+           case 'n':
+           case 'w':
+           case 'r':
+             capture = linkEntity(idType + capture);
+             break;
+           // some errors have more complex ID lists/variance
+
+           case '20':
+             capture = parse20(capture);
+             break;
+
+           case '211':
+             capture = parse211(capture);
+             break;
+
+           case '231':
+             capture = parse231(capture);
+             break;
+
+           case '294':
+             capture = parse294(capture);
+             break;
+
+           case '370':
+             capture = parse370(capture);
+             break;
+         }
+
+         return capture;
+
+         function linkErrorObject(d) {
+           return {
+             html: "<a class=\"error_object_link\">".concat(d, "</a>")
+           };
+         }
+
+         function linkEntity(d) {
+           return {
+             html: "<a class=\"error_entity_link\">".concat(d, "</a>")
+           };
+         }
+
+         function linkURL(d) {
+           return {
+             html: "<a class=\"kr_external_link\" target=\"_blank\" href=\"".concat(d, "\">").concat(d, "</a>")
+           };
+         } // arbitrary node list of form: #ID, #ID, #ID...
+
+
+         function parse211(capture) {
+           var newList = [];
+           var items = capture.split(', ');
+           items.forEach(function (item) {
+             // ID has # at the front
+             var id = linkEntity('n' + item.slice(1));
+             newList.push(id);
+           });
+           return newList.join(', ');
+         } // arbitrary way list of form: #ID(layer),#ID(layer),#ID(layer)...
+
+
+         function parse231(capture) {
+           var newList = []; // unfortunately 'layer' can itself contain commas, so we split on '),'
+
+           var items = capture.split('),');
+           items.forEach(function (item) {
+             var match = item.match(/\#(\d+)\((.+)\)?/);
+
+             if (match !== null && match.length > 2) {
+               newList.push(linkEntity('w' + match[1]) + ' ' + _t('QA.keepRight.errorTypes.231.layer', {
+                 layer: match[2]
+               }));
+             }
+           });
+           return newList.join(', ');
+         } // arbitrary node/relation list of form: from node #ID,to relation #ID,to node #ID...
+
+
+         function parse294(capture) {
+           var newList = [];
+           var items = capture.split(',');
+           items.forEach(function (item) {
+             // item of form "from/to node/relation #ID"
+             item = item.split(' '); // to/from role is more clear in quotes
+
+             var role = "\"".concat(item[0], "\""); // first letter of node/relation provides the type
+
+             var idType = item[1].slice(0, 1); // ID has # at the front
+
+             var id = item[2].slice(1);
+             id = linkEntity(idType + id);
+             newList.push("".concat(role, " ").concat(item[1], " ").concat(id));
+           });
+           return newList.join(', ');
+         } // may or may not include the string "(including the name 'name')"
+
+
+         function parse370(capture) {
+           if (!capture) return '';
+           var match = capture.match(/\(including the name (\'.+\')\)/);
+
+           if (match && match.length) {
+             return _t('QA.keepRight.errorTypes.370.including_the_name', {
+               name: match[1]
+             });
+           }
+
+           return '';
+         } // arbitrary node list of form: #ID,#ID,#ID...
+
+
+         function parse20(capture) {
+           var newList = [];
+           var items = capture.split(',');
+           items.forEach(function (item) {
+             // ID has # at the front
+             var id = linkEntity('n' + item.slice(1));
+             newList.push(id);
+           });
+           return newList.join(', ');
+         }
+       }
+
+       var serviceKeepRight = {
+         title: 'keepRight',
+         init: function init() {
+           _mainFileFetcher.get('keepRight').then(function (d) {
+             return _krData = d;
+           });
+
+           if (!_cache$2) {
+             this.reset();
+           }
+
+           this.event = utilRebind(this, dispatch$7, 'on');
+         },
+         reset: function reset() {
+           if (_cache$2) {
+             Object.values(_cache$2.inflightTile).forEach(abortRequest$6);
+           }
+
+           _cache$2 = {
+             data: {},
+             loadedTile: {},
+             inflightTile: {},
+             inflightPost: {},
+             closed: {},
+             rtree: new RBush()
+           };
+         },
+         // KeepRight API:  http://osm.mueschelsoft.de/keepright/interfacing.php
+         loadIssues: function loadIssues(projection) {
+           var _this = this;
+
+           var options = {
+             format: 'geojson',
+             ch: _krRuleset
+           }; // determine the needed tiles to cover the view
+
+           var tiles = tiler$6.zoomExtent([_tileZoom$3, _tileZoom$3]).getTiles(projection); // abort inflight requests that are no longer needed
+
+           abortUnwantedRequests$3(_cache$2, tiles); // issue new requests..
+
+           tiles.forEach(function (tile) {
+             if (_cache$2.loadedTile[tile.id] || _cache$2.inflightTile[tile.id]) return;
+
+             var _tile$extent$rectangl = tile.extent.rectangle(),
+                 _tile$extent$rectangl2 = _slicedToArray(_tile$extent$rectangl, 4),
+                 left = _tile$extent$rectangl2[0],
+                 top = _tile$extent$rectangl2[1],
+                 right = _tile$extent$rectangl2[2],
+                 bottom = _tile$extent$rectangl2[3];
+
+             var params = Object.assign({}, options, {
+               left: left,
+               bottom: bottom,
+               right: right,
+               top: top
+             });
+             var url = "".concat(_krUrlRoot, "/export.php?") + utilQsString(params);
+             var controller = new AbortController();
+             _cache$2.inflightTile[tile.id] = controller;
+             d3_json(url, {
+               signal: controller.signal
+             }).then(function (data) {
+               delete _cache$2.inflightTile[tile.id];
+               _cache$2.loadedTile[tile.id] = true;
+
+               if (!data || !data.features || !data.features.length) {
+                 throw new Error('No Data');
+               }
+
+               data.features.forEach(function (feature) {
+                 var _feature$properties = feature.properties,
+                     itemType = _feature$properties.error_type,
+                     id = _feature$properties.error_id,
+                     _feature$properties$c = _feature$properties.comment,
+                     comment = _feature$properties$c === void 0 ? null : _feature$properties$c,
+                     objectId = _feature$properties.object_id,
+                     objectType = _feature$properties.object_type,
+                     schema = _feature$properties.schema,
+                     title = _feature$properties.title;
+                 var loc = feature.geometry.coordinates,
+                     _feature$properties$d = feature.properties.description,
+                     description = _feature$properties$d === void 0 ? '' : _feature$properties$d; // if there is a parent, save its error type e.g.:
+                 //  Error 191 = "highway-highway"
+                 //  Error 190 = "intersections without junctions"  (parent)
+
+                 var issueTemplate = _krData.errorTypes[itemType];
+                 var parentIssueType = (Math.floor(itemType / 10) * 10).toString(); // try to handle error type directly, fallback to parent error type.
+
+                 var whichType = issueTemplate ? itemType : parentIssueType;
+                 var whichTemplate = _krData.errorTypes[whichType]; // Rewrite a few of the errors at this point..
+                 // This is done to make them easier to linkify and translate.
+
+                 switch (whichType) {
+                   case '170':
+                     description = "This feature has a FIXME tag: ".concat(description);
+                     break;
+
+                   case '292':
+                   case '293':
+                     description = description.replace('A turn-', 'This turn-');
+                     break;
+
+                   case '294':
+                   case '295':
+                   case '296':
+                   case '297':
+                   case '298':
+                     description = "This turn-restriction~".concat(description);
+                     break;
+
+                   case '300':
+                     description = 'This highway is missing a maxspeed tag';
+                     break;
+
+                   case '411':
+                   case '412':
+                   case '413':
+                     description = "This feature~".concat(description);
+                     break;
+                 } // move markers slightly so it doesn't obscure the geometry,
+                 // then move markers away from other coincident markers
+
+
+                 var coincident = false;
+
+                 do {
+                   // first time, move marker up. after that, move marker right.
+                   var delta = coincident ? [0.00001, 0] : [0, 0.00001];
+                   loc = geoVecAdd(loc, delta);
+                   var bbox = geoExtent(loc).bbox();
+                   coincident = _cache$2.rtree.search(bbox).length;
+                 } while (coincident);
+
+                 var d = new QAItem(loc, _this, itemType, id, {
+                   comment: comment,
+                   description: description,
+                   whichType: whichType,
+                   parentIssueType: parentIssueType,
+                   severity: whichTemplate.severity || 'error',
+                   objectId: objectId,
+                   objectType: objectType,
+                   schema: schema,
+                   title: title
+                 });
+                 d.replacements = tokenReplacements(d);
+                 _cache$2.data[id] = d;
+
+                 _cache$2.rtree.insert(encodeIssueRtree$2(d));
+               });
+               dispatch$7.call('loaded');
+             })["catch"](function () {
+               delete _cache$2.inflightTile[tile.id];
+               _cache$2.loadedTile[tile.id] = true;
+             });
+           });
+         },
+         postUpdate: function postUpdate(d, callback) {
+           var _this2 = this;
+
+           if (_cache$2.inflightPost[d.id]) {
+             return callback({
+               message: 'Error update already inflight',
+               status: -2
+             }, d);
+           }
+
+           var params = {
+             schema: d.schema,
+             id: d.id
+           };
+
+           if (d.newStatus) {
+             params.st = d.newStatus;
+           }
+
+           if (d.newComment !== undefined) {
+             params.co = d.newComment;
+           } // NOTE: This throws a CORS err, but it seems successful.
+           // We don't care too much about the response, so this is fine.
+
+
+           var url = "".concat(_krUrlRoot, "/comment.php?") + utilQsString(params);
+           var controller = new AbortController();
+           _cache$2.inflightPost[d.id] = controller; // Since this is expected to throw an error just continue as if it worked
+           // (worst case scenario the request truly fails and issue will show up if iD restarts)
+
+           d3_json(url, {
+             signal: controller.signal
+           })["finally"](function () {
+             delete _cache$2.inflightPost[d.id];
+
+             if (d.newStatus === 'ignore') {
+               // ignore permanently (false positive)
+               _this2.removeItem(d);
+             } else if (d.newStatus === 'ignore_t') {
+               // ignore temporarily (error fixed)
+               _this2.removeItem(d);
+
+               _cache$2.closed["".concat(d.schema, ":").concat(d.id)] = true;
+             } else {
+               d = _this2.replaceItem(d.update({
+                 comment: d.newComment,
+                 newComment: undefined,
+                 newState: undefined
+               }));
+             }
+
+             if (callback) callback(null, d);
+           });
+         },
+         // Get all cached QAItems covering the viewport
+         getItems: function getItems(projection) {
+           var viewport = projection.clipExtent();
+           var min = [viewport[0][0], viewport[1][1]];
+           var max = [viewport[1][0], viewport[0][1]];
+           var bbox = geoExtent(projection.invert(min), projection.invert(max)).bbox();
+           return _cache$2.rtree.search(bbox).map(function (d) {
+             return d.data;
+           });
+         },
+         // Get a QAItem from cache
+         // NOTE: Don't change method name until UI v3 is merged
+         getError: function getError(id) {
+           return _cache$2.data[id];
+         },
+         // Replace a single QAItem in the cache
+         replaceItem: function replaceItem(item) {
+           if (!(item instanceof QAItem) || !item.id) return;
+           _cache$2.data[item.id] = item;
+           updateRtree$3(encodeIssueRtree$2(item), true); // true = replace
+
+           return item;
+         },
+         // Remove a single QAItem from the cache
+         removeItem: function removeItem(item) {
+           if (!(item instanceof QAItem) || !item.id) return;
+           delete _cache$2.data[item.id];
+           updateRtree$3(encodeIssueRtree$2(item), false); // false = remove
+         },
+         issueURL: function issueURL(item) {
+           return "".concat(_krUrlRoot, "/report_map.php?schema=").concat(item.schema, "&error=").concat(item.id);
+         },
+         // Get an array of issues closed during this session.
+         // Used to populate `closed:keepright` changeset tag
+         getClosedIDs: function getClosedIDs() {
+           return Object.keys(_cache$2.closed).sort();
+         }
+       };
+
+       var tiler$5 = utilTiler();
+       var dispatch$6 = dispatch$8('loaded');
+       var _tileZoom$2 = 14;
+       var _impOsmUrls = {
+         ow: 'https://grab.community.improve-osm.org/directionOfFlowService',
+         mr: 'https://grab.community.improve-osm.org/missingGeoService',
+         tr: 'https://grab.community.improve-osm.org/turnRestrictionService'
+       };
+       var _impOsmData = {
+         icons: {}
+       }; // This gets reassigned if reset
+
+       var _cache$1;
+
+       function abortRequest$5(i) {
+         Object.values(i).forEach(function (controller) {
+           if (controller) {
+             controller.abort();
+           }
+         });
+       }
+
+       function abortUnwantedRequests$2(cache, tiles) {
+         Object.keys(cache.inflightTile).forEach(function (k) {
+           var wanted = tiles.find(function (tile) {
+             return k === tile.id;
+           });
+
+           if (!wanted) {
+             abortRequest$5(cache.inflightTile[k]);
+             delete cache.inflightTile[k];
+           }
+         });
+       }
+
+       function encodeIssueRtree$1(d) {
+         return {
+           minX: d.loc[0],
+           minY: d.loc[1],
+           maxX: d.loc[0],
+           maxY: d.loc[1],
+           data: d
+         };
+       } // Replace or remove QAItem from rtree
+
+
+       function updateRtree$2(item, replace) {
+         _cache$1.rtree.remove(item, function (a, b) {
+           return a.data.id === b.data.id;
+         });
+
+         if (replace) {
+           _cache$1.rtree.insert(item);
+         }
+       }
+
+       function linkErrorObject(d) {
+         return {
+           html: "<a class=\"error_object_link\">".concat(d, "</a>")
+         };
+       }
+
+       function linkEntity(d) {
+         return {
+           html: "<a class=\"error_entity_link\">".concat(d, "</a>")
+         };
+       }
+
+       function pointAverage(points) {
+         if (points.length) {
+           var sum = points.reduce(function (acc, point) {
+             return geoVecAdd(acc, [point.lon, point.lat]);
+           }, [0, 0]);
+           return geoVecScale(sum, 1 / points.length);
+         } else {
+           return [0, 0];
+         }
+       }
+
+       function relativeBearing(p1, p2) {
+         var angle = Math.atan2(p2.lon - p1.lon, p2.lat - p1.lat);
+
+         if (angle < 0) {
+           angle += 2 * Math.PI;
+         } // Return degrees
+
+
+         return angle * 180 / Math.PI;
+       } // Assuming range [0,360)
+
+
+       function cardinalDirection(bearing) {
+         var dir = 45 * Math.round(bearing / 45);
+         var compass = {
+           0: 'north',
+           45: 'northeast',
+           90: 'east',
+           135: 'southeast',
+           180: 'south',
+           225: 'southwest',
+           270: 'west',
+           315: 'northwest',
+           360: 'north'
+         };
+         return _t("QA.improveOSM.directions.".concat(compass[dir]));
+       } // Errors shouldn't obscure each other
+
+
+       function preventCoincident$1(loc, bumpUp) {
+         var coincident = false;
+
+         do {
+           // first time, move marker up. after that, move marker right.
+           var delta = coincident ? [0.00001, 0] : bumpUp ? [0, 0.00001] : [0, 0];
+           loc = geoVecAdd(loc, delta);
+           var bbox = geoExtent(loc).bbox();
+           coincident = _cache$1.rtree.search(bbox).length;
+         } while (coincident);
+
+         return loc;
+       }
+
+       var serviceImproveOSM = {
+         title: 'improveOSM',
+         init: function init() {
+           _mainFileFetcher.get('qa_data').then(function (d) {
+             return _impOsmData = d.improveOSM;
+           });
+
+           if (!_cache$1) {
+             this.reset();
+           }
+
+           this.event = utilRebind(this, dispatch$6, 'on');
+         },
+         reset: function reset() {
+           if (_cache$1) {
+             Object.values(_cache$1.inflightTile).forEach(abortRequest$5);
+           }
+
+           _cache$1 = {
+             data: {},
+             loadedTile: {},
+             inflightTile: {},
+             inflightPost: {},
+             closed: {},
+             rtree: new RBush()
+           };
+         },
+         loadIssues: function loadIssues(projection) {
+           var _this = this;
+
+           var options = {
+             client: 'iD',
+             status: 'OPEN',
+             zoom: '19' // Use a high zoom so that clusters aren't returned
+
+           }; // determine the needed tiles to cover the view
+
+           var tiles = tiler$5.zoomExtent([_tileZoom$2, _tileZoom$2]).getTiles(projection); // abort inflight requests that are no longer needed
+
+           abortUnwantedRequests$2(_cache$1, tiles); // issue new requests..
+
+           tiles.forEach(function (tile) {
+             if (_cache$1.loadedTile[tile.id] || _cache$1.inflightTile[tile.id]) return;
+
+             var _tile$extent$rectangl = tile.extent.rectangle(),
+                 _tile$extent$rectangl2 = _slicedToArray(_tile$extent$rectangl, 4),
+                 east = _tile$extent$rectangl2[0],
+                 north = _tile$extent$rectangl2[1],
+                 west = _tile$extent$rectangl2[2],
+                 south = _tile$extent$rectangl2[3];
+
+             var params = Object.assign({}, options, {
+               east: east,
+               south: south,
+               west: west,
+               north: north
+             }); // 3 separate requests to store for each tile
+
+             var requests = {};
+             Object.keys(_impOsmUrls).forEach(function (k) {
+               // We exclude WATER from missing geometry as it doesn't seem useful
+               // We use most confident one-way and turn restrictions only, still have false positives
+               var kParams = Object.assign({}, params, k === 'mr' ? {
+                 type: 'PARKING,ROAD,BOTH,PATH'
+               } : {
+                 confidenceLevel: 'C1'
+               });
+               var url = "".concat(_impOsmUrls[k], "/search?") + utilQsString(kParams);
+               var controller = new AbortController();
+               requests[k] = controller;
+               d3_json(url, {
+                 signal: controller.signal
+               }).then(function (data) {
+                 delete _cache$1.inflightTile[tile.id][k];
+
+                 if (!Object.keys(_cache$1.inflightTile[tile.id]).length) {
+                   delete _cache$1.inflightTile[tile.id];
+                   _cache$1.loadedTile[tile.id] = true;
+                 } // Road segments at high zoom == oneways
+
+
+                 if (data.roadSegments) {
+                   data.roadSegments.forEach(function (feature) {
+                     // Position error at the approximate middle of the segment
+                     var points = feature.points,
+                         wayId = feature.wayId,
+                         fromNodeId = feature.fromNodeId,
+                         toNodeId = feature.toNodeId;
+                     var itemId = "".concat(wayId).concat(fromNodeId).concat(toNodeId);
+                     var mid = points.length / 2;
+                     var loc; // Even number of points, find midpoint of the middle two
+                     // Odd number of points, use position of very middle point
+
+                     if (mid % 1 === 0) {
+                       loc = pointAverage([points[mid - 1], points[mid]]);
+                     } else {
+                       mid = points[Math.floor(mid)];
+                       loc = [mid.lon, mid.lat];
+                     } // One-ways can land on same segment in opposite direction
+
+
+                     loc = preventCoincident$1(loc, false);
+                     var d = new QAItem(loc, _this, k, itemId, {
+                       issueKey: k,
+                       // used as a category
+                       identifier: {
+                         // used to post changes
+                         wayId: wayId,
+                         fromNodeId: fromNodeId,
+                         toNodeId: toNodeId
+                       },
+                       objectId: wayId,
+                       objectType: 'way'
+                     }); // Variables used in the description
+
+                     d.replacements = {
+                       percentage: feature.percentOfTrips,
+                       num_trips: feature.numberOfTrips,
+                       highway: linkErrorObject(_t('QA.keepRight.error_parts.highway')),
+                       from_node: linkEntity('n' + feature.fromNodeId),
+                       to_node: linkEntity('n' + feature.toNodeId)
+                     };
+                     _cache$1.data[d.id] = d;
+
+                     _cache$1.rtree.insert(encodeIssueRtree$1(d));
+                   });
+                 } // Tiles at high zoom == missing roads
+
+
+                 if (data.tiles) {
+                   data.tiles.forEach(function (feature) {
+                     var type = feature.type,
+                         x = feature.x,
+                         y = feature.y,
+                         numberOfTrips = feature.numberOfTrips;
+                     var geoType = type.toLowerCase();
+                     var itemId = "".concat(geoType).concat(x).concat(y).concat(numberOfTrips); // Average of recorded points should land on the missing geometry
+                     // Missing geometry could happen to land on another error
+
+                     var loc = pointAverage(feature.points);
+                     loc = preventCoincident$1(loc, false);
+                     var d = new QAItem(loc, _this, "".concat(k, "-").concat(geoType), itemId, {
+                       issueKey: k,
+                       identifier: {
+                         x: x,
+                         y: y
+                       }
+                     });
+                     d.replacements = {
+                       num_trips: numberOfTrips,
+                       geometry_type: _t("QA.improveOSM.geometry_types.".concat(geoType))
+                     }; // -1 trips indicates data came from a 3rd party
+
+                     if (numberOfTrips === -1) {
+                       d.desc = _t('QA.improveOSM.error_types.mr.description_alt', d.replacements);
+                     }
+
+                     _cache$1.data[d.id] = d;
+
+                     _cache$1.rtree.insert(encodeIssueRtree$1(d));
+                   });
+                 } // Entities at high zoom == turn restrictions
+
+
+                 if (data.entities) {
+                   data.entities.forEach(function (feature) {
+                     var point = feature.point,
+                         id = feature.id,
+                         segments = feature.segments,
+                         numberOfPasses = feature.numberOfPasses,
+                         turnType = feature.turnType;
+                     var itemId = "".concat(id.replace(/[,:+#]/g, '_')); // Turn restrictions could be missing at same junction
+                     // We also want to bump the error up so node is accessible
+
+                     var loc = preventCoincident$1([point.lon, point.lat], true); // Elements are presented in a strange way
+
+                     var ids = id.split(',');
+                     var from_way = ids[0];
+                     var via_node = ids[3];
+                     var to_way = ids[2].split(':')[1];
+                     var d = new QAItem(loc, _this, k, itemId, {
+                       issueKey: k,
+                       identifier: id,
+                       objectId: via_node,
+                       objectType: 'node'
+                     }); // Travel direction along from_way clarifies the turn restriction
+
+                     var _segments$0$points = _slicedToArray(segments[0].points, 2),
+                         p1 = _segments$0$points[0],
+                         p2 = _segments$0$points[1];
+
+                     var dir_of_travel = cardinalDirection(relativeBearing(p1, p2)); // Variables used in the description
+
+                     d.replacements = {
+                       num_passed: numberOfPasses,
+                       num_trips: segments[0].numberOfTrips,
+                       turn_restriction: turnType.toLowerCase(),
+                       from_way: linkEntity('w' + from_way),
+                       to_way: linkEntity('w' + to_way),
+                       travel_direction: dir_of_travel,
+                       junction: linkErrorObject(_t('QA.keepRight.error_parts.this_node'))
+                     };
+                     _cache$1.data[d.id] = d;
+
+                     _cache$1.rtree.insert(encodeIssueRtree$1(d));
+
+                     dispatch$6.call('loaded');
+                   });
+                 }
+               })["catch"](function () {
+                 delete _cache$1.inflightTile[tile.id][k];
+
+                 if (!Object.keys(_cache$1.inflightTile[tile.id]).length) {
+                   delete _cache$1.inflightTile[tile.id];
+                   _cache$1.loadedTile[tile.id] = true;
+                 }
+               });
+             });
+             _cache$1.inflightTile[tile.id] = requests;
+           });
+         },
+         getComments: function getComments(item) {
+           var _this2 = this;
+
+           // If comments already retrieved no need to do so again
+           if (item.comments) {
+             return Promise.resolve(item);
+           }
+
+           var key = item.issueKey;
+           var qParams = {};
+
+           if (key === 'ow') {
+             qParams = item.identifier;
+           } else if (key === 'mr') {
+             qParams.tileX = item.identifier.x;
+             qParams.tileY = item.identifier.y;
+           } else if (key === 'tr') {
+             qParams.targetId = item.identifier;
+           }
+
+           var url = "".concat(_impOsmUrls[key], "/retrieveComments?") + utilQsString(qParams);
+
+           var cacheComments = function cacheComments(data) {
+             // Assign directly for immediate use afterwards
+             // comments are served newest to oldest
+             item.comments = data.comments ? data.comments.reverse() : [];
+
+             _this2.replaceItem(item);
+           };
+
+           return d3_json(url).then(cacheComments).then(function () {
+             return item;
+           });
+         },
+         postUpdate: function postUpdate(d, callback) {
+           if (!serviceOsm.authenticated()) {
+             // Username required in payload
+             return callback({
+               message: 'Not Authenticated',
+               status: -3
+             }, d);
+           }
+
+           if (_cache$1.inflightPost[d.id]) {
+             return callback({
+               message: 'Error update already inflight',
+               status: -2
+             }, d);
+           } // Payload can only be sent once username is established
+
+
+           serviceOsm.userDetails(sendPayload.bind(this));
+
+           function sendPayload(err, user) {
+             var _this3 = this;
+
+             if (err) {
+               return callback(err, d);
+             }
+
+             var key = d.issueKey;
+             var url = "".concat(_impOsmUrls[key], "/comment");
+             var payload = {
+               username: user.display_name,
+               targetIds: [d.identifier]
+             };
+
+             if (d.newStatus) {
+               payload.status = d.newStatus;
+               payload.text = 'status changed';
+             } // Comment take place of default text
+
+
+             if (d.newComment) {
+               payload.text = d.newComment;
+             }
+
+             var controller = new AbortController();
+             _cache$1.inflightPost[d.id] = controller;
+             var options = {
+               method: 'POST',
+               signal: controller.signal,
+               body: JSON.stringify(payload)
+             };
+             d3_json(url, options).then(function () {
+               delete _cache$1.inflightPost[d.id]; // Just a comment, update error in cache
+
+               if (!d.newStatus) {
+                 var now = new Date();
+                 var comments = d.comments ? d.comments : [];
+                 comments.push({
+                   username: payload.username,
+                   text: payload.text,
+                   timestamp: now.getTime() / 1000
+                 });
+
+                 _this3.replaceItem(d.update({
+                   comments: comments,
+                   newComment: undefined
+                 }));
+               } else {
+                 _this3.removeItem(d);
+
+                 if (d.newStatus === 'SOLVED') {
+                   // Keep track of the number of issues closed per type to tag the changeset
+                   if (!(d.issueKey in _cache$1.closed)) {
+                     _cache$1.closed[d.issueKey] = 0;
+                   }
+
+                   _cache$1.closed[d.issueKey] += 1;
+                 }
+               }
+
+               if (callback) callback(null, d);
+             })["catch"](function (err) {
+               delete _cache$1.inflightPost[d.id];
+               if (callback) callback(err.message);
+             });
+           }
+         },
+         // Get all cached QAItems covering the viewport
+         getItems: function getItems(projection) {
+           var viewport = projection.clipExtent();
+           var min = [viewport[0][0], viewport[1][1]];
+           var max = [viewport[1][0], viewport[0][1]];
+           var bbox = geoExtent(projection.invert(min), projection.invert(max)).bbox();
+           return _cache$1.rtree.search(bbox).map(function (d) {
+             return d.data;
+           });
+         },
+         // Get a QAItem from cache
+         // NOTE: Don't change method name until UI v3 is merged
+         getError: function getError(id) {
+           return _cache$1.data[id];
+         },
+         // get the name of the icon to display for this item
+         getIcon: function getIcon(itemType) {
+           return _impOsmData.icons[itemType];
+         },
+         // Replace a single QAItem in the cache
+         replaceItem: function replaceItem(issue) {
+           if (!(issue instanceof QAItem) || !issue.id) return;
+           _cache$1.data[issue.id] = issue;
+           updateRtree$2(encodeIssueRtree$1(issue), true); // true = replace
+
+           return issue;
+         },
+         // Remove a single QAItem from the cache
+         removeItem: function removeItem(issue) {
+           if (!(issue instanceof QAItem) || !issue.id) return;
+           delete _cache$1.data[issue.id];
+           updateRtree$2(encodeIssueRtree$1(issue), false); // false = remove
+         },
+         // Used to populate `closed:improveosm:*` changeset tags
+         getClosedCounts: function getClosedCounts() {
+           return _cache$1.closed;
+         }
+       };
+
+       var defaults$5 = {exports: {}};
+
+       function getDefaults$1() {
+         return {
+           baseUrl: null,
+           breaks: false,
+           gfm: true,
+           headerIds: true,
+           headerPrefix: '',
+           highlight: null,
+           langPrefix: 'language-',
+           mangle: true,
+           pedantic: false,
+           renderer: null,
+           sanitize: false,
+           sanitizer: null,
+           silent: false,
+           smartLists: false,
+           smartypants: false,
+           tokenizer: null,
+           walkTokens: null,
+           xhtml: false
+         };
+       }
+
+       function changeDefaults$1(newDefaults) {
+         defaults$5.exports.defaults = newDefaults;
+       }
+
+       defaults$5.exports = {
+         defaults: getDefaults$1(),
+         getDefaults: getDefaults$1,
+         changeDefaults: changeDefaults$1
+       };
+
+       var escapeTest = /[&<>"']/;
+       var escapeReplace = /[&<>"']/g;
+       var escapeTestNoEncode = /[<>"']|&(?!#?\w+;)/;
+       var escapeReplaceNoEncode = /[<>"']|&(?!#?\w+;)/g;
+       var escapeReplacements = {
+         '&': '&amp;',
+         '<': '&lt;',
+         '>': '&gt;',
+         '"': '&quot;',
+         "'": '&#39;'
+       };
+
+       var getEscapeReplacement = function getEscapeReplacement(ch) {
+         return escapeReplacements[ch];
+       };
+
+       function escape$3(html, encode) {
+         if (encode) {
+           if (escapeTest.test(html)) {
+             return html.replace(escapeReplace, getEscapeReplacement);
+           }
+         } else {
+           if (escapeTestNoEncode.test(html)) {
+             return html.replace(escapeReplaceNoEncode, getEscapeReplacement);
+           }
+         }
+
+         return html;
+       }
+
+       var unescapeTest = /&(#(?:\d+)|(?:#x[0-9A-Fa-f]+)|(?:\w+));?/ig;
+
+       function unescape$2(html) {
+         // explicitly match decimal, hex, and named HTML entities
+         return html.replace(unescapeTest, function (_, n) {
+           n = n.toLowerCase();
+           if (n === 'colon') return ':';
+
+           if (n.charAt(0) === '#') {
+             return n.charAt(1) === 'x' ? String.fromCharCode(parseInt(n.substring(2), 16)) : String.fromCharCode(+n.substring(1));
+           }
+
+           return '';
+         });
+       }
+
+       var caret = /(^|[^\[])\^/g;
+
+       function edit$1(regex, opt) {
+         regex = regex.source || regex;
+         opt = opt || '';
+         var obj = {
+           replace: function replace(name, val) {
+             val = val.source || val;
+             val = val.replace(caret, '$1');
+             regex = regex.replace(name, val);
+             return obj;
+           },
+           getRegex: function getRegex() {
+             return new RegExp(regex, opt);
+           }
+         };
+         return obj;
+       }
+
+       var nonWordAndColonTest = /[^\w:]/g;
+       var originIndependentUrl = /^$|^[a-z][a-z0-9+.-]*:|^[?#]/i;
+
+       function cleanUrl$1(sanitize, base, href) {
+         if (sanitize) {
+           var prot;
+
+           try {
+             prot = decodeURIComponent(unescape$2(href)).replace(nonWordAndColonTest, '').toLowerCase();
+           } catch (e) {
+             return null;
+           }
+
+           if (prot.indexOf('javascript:') === 0 || prot.indexOf('vbscript:') === 0 || prot.indexOf('data:') === 0) {
+             return null;
+           }
+         }
+
+         if (base && !originIndependentUrl.test(href)) {
+           href = resolveUrl$2(base, href);
+         }
+
+         try {
+           href = encodeURI(href).replace(/%25/g, '%');
+         } catch (e) {
+           return null;
+         }
+
+         return href;
+       }
+
+       var baseUrls = {};
+       var justDomain = /^[^:]+:\/*[^/]*$/;
+       var protocol = /^([^:]+:)[\s\S]*$/;
+       var domain = /^([^:]+:\/*[^/]*)[\s\S]*$/;
+
+       function resolveUrl$2(base, href) {
+         if (!baseUrls[' ' + base]) {
+           // we can ignore everything in base after the last slash of its path component,
+           // but we might need to add _that_
+           // https://tools.ietf.org/html/rfc3986#section-3
+           if (justDomain.test(base)) {
+             baseUrls[' ' + base] = base + '/';
+           } else {
+             baseUrls[' ' + base] = rtrim$1(base, '/', true);
+           }
+         }
+
+         base = baseUrls[' ' + base];
+         var relativeBase = base.indexOf(':') === -1;
+
+         if (href.substring(0, 2) === '//') {
+           if (relativeBase) {
+             return href;
+           }
+
+           return base.replace(protocol, '$1') + href;
+         } else if (href.charAt(0) === '/') {
+           if (relativeBase) {
+             return href;
+           }
+
+           return base.replace(domain, '$1') + href;
+         } else {
+           return base + href;
+         }
+       }
+
+       var noopTest$1 = {
+         exec: function noopTest() {}
+       };
+
+       function merge$2(obj) {
+         var i = 1,
+             target,
+             key;
+
+         for (; i < arguments.length; i++) {
+           target = arguments[i];
+
+           for (key in target) {
+             if (Object.prototype.hasOwnProperty.call(target, key)) {
+               obj[key] = target[key];
+             }
+           }
+         }
+
+         return obj;
+       }
+
+       function splitCells$1(tableRow, count) {
+         // ensure that every cell-delimiting pipe has a space
+         // before it to distinguish it from an escaped pipe
+         var row = tableRow.replace(/\|/g, function (match, offset, str) {
+           var escaped = false,
+               curr = offset;
+
+           while (--curr >= 0 && str[curr] === '\\') {
+             escaped = !escaped;
+           }
+
+           if (escaped) {
+             // odd number of slashes means | is escaped
+             // so we leave it alone
+             return '|';
+           } else {
+             // add space before unescaped |
+             return ' |';
+           }
+         }),
+             cells = row.split(/ \|/);
+         var i = 0;
+
+         if (cells.length > count) {
+           cells.splice(count);
+         } else {
+           while (cells.length < count) {
+             cells.push('');
+           }
+         }
+
+         for (; i < cells.length; i++) {
+           // leading or trailing whitespace is ignored per the gfm spec
+           cells[i] = cells[i].trim().replace(/\\\|/g, '|');
+         }
+
+         return cells;
+       } // Remove trailing 'c's. Equivalent to str.replace(/c*$/, '').
+       // /c*$/ is vulnerable to REDOS.
+       // invert: Remove suffix of non-c chars instead. Default falsey.
+
+
+       function rtrim$1(str, c, invert) {
+         var l = str.length;
+
+         if (l === 0) {
+           return '';
+         } // Length of suffix matching the invert condition.
+
+
+         var suffLen = 0; // Step left until we fail to match the invert condition.
+
+         while (suffLen < l) {
+           var currChar = str.charAt(l - suffLen - 1);
+
+           if (currChar === c && !invert) {
+             suffLen++;
+           } else if (currChar !== c && invert) {
+             suffLen++;
+           } else {
+             break;
+           }
+         }
+
+         return str.substr(0, l - suffLen);
+       }
+
+       function findClosingBracket$1(str, b) {
+         if (str.indexOf(b[1]) === -1) {
+           return -1;
+         }
+
+         var l = str.length;
+         var level = 0,
+             i = 0;
+
+         for (; i < l; i++) {
+           if (str[i] === '\\') {
+             i++;
+           } else if (str[i] === b[0]) {
+             level++;
+           } else if (str[i] === b[1]) {
+             level--;
+
+             if (level < 0) {
+               return i;
+             }
+           }
+         }
+
+         return -1;
+       }
+
+       function checkSanitizeDeprecation$1(opt) {
+         if (opt && opt.sanitize && !opt.silent) {
+           console.warn('marked(): sanitize and sanitizer parameters are deprecated since version 0.7.0, should not be used and will be removed in the future. Read more here: https://marked.js.org/#/USING_ADVANCED.md#options');
+         }
+       } // copied from https://stackoverflow.com/a/5450113/806777
+
+
+       function repeatString$1(pattern, count) {
+         if (count < 1) {
+           return '';
+         }
+
+         var result = '';
+
+         while (count > 1) {
+           if (count & 1) {
+             result += pattern;
+           }
+
+           count >>= 1;
+           pattern += pattern;
+         }
+
+         return result + pattern;
+       }
+
+       var helpers = {
+         escape: escape$3,
+         unescape: unescape$2,
+         edit: edit$1,
+         cleanUrl: cleanUrl$1,
+         resolveUrl: resolveUrl$2,
+         noopTest: noopTest$1,
+         merge: merge$2,
+         splitCells: splitCells$1,
+         rtrim: rtrim$1,
+         findClosingBracket: findClosingBracket$1,
+         checkSanitizeDeprecation: checkSanitizeDeprecation$1,
+         repeatString: repeatString$1
+       };
+
+       var defaults$4 = defaults$5.exports.defaults;
+       var rtrim = helpers.rtrim,
+           splitCells = helpers.splitCells,
+           _escape = helpers.escape,
+           findClosingBracket = helpers.findClosingBracket;
+
+       function outputLink(cap, link, raw) {
+         var href = link.href;
+         var title = link.title ? _escape(link.title) : null;
+         var text = cap[1].replace(/\\([\[\]])/g, '$1');
+
+         if (cap[0].charAt(0) !== '!') {
+           return {
+             type: 'link',
+             raw: raw,
+             href: href,
+             title: title,
+             text: text
+           };
+         } else {
+           return {
+             type: 'image',
+             raw: raw,
+             href: href,
+             title: title,
+             text: _escape(text)
+           };
+         }
+       }
+
+       function indentCodeCompensation(raw, text) {
+         var matchIndentToCode = raw.match(/^(\s+)(?:```)/);
+
+         if (matchIndentToCode === null) {
+           return text;
+         }
+
+         var indentToCode = matchIndentToCode[1];
+         return text.split('\n').map(function (node) {
+           var matchIndentInNode = node.match(/^\s+/);
+
+           if (matchIndentInNode === null) {
+             return node;
+           }
+
+           var _matchIndentInNode = _slicedToArray(matchIndentInNode, 1),
+               indentInNode = _matchIndentInNode[0];
+
+           if (indentInNode.length >= indentToCode.length) {
+             return node.slice(indentToCode.length);
+           }
+
+           return node;
+         }).join('\n');
+       }
+       /**
+        * Tokenizer
+        */
+
+
+       var Tokenizer_1 = /*#__PURE__*/function () {
+         function Tokenizer(options) {
+           _classCallCheck$1(this, Tokenizer);
+
+           this.options = options || defaults$4;
+         }
+
+         _createClass$1(Tokenizer, [{
+           key: "space",
+           value: function space(src) {
+             var cap = this.rules.block.newline.exec(src);
+
+             if (cap) {
+               if (cap[0].length > 1) {
+                 return {
+                   type: 'space',
+                   raw: cap[0]
+                 };
+               }
+
+               return {
+                 raw: '\n'
+               };
+             }
+           }
+         }, {
+           key: "code",
+           value: function code(src) {
+             var cap = this.rules.block.code.exec(src);
+
+             if (cap) {
+               var text = cap[0].replace(/^ {1,4}/gm, '');
+               return {
+                 type: 'code',
+                 raw: cap[0],
+                 codeBlockStyle: 'indented',
+                 text: !this.options.pedantic ? rtrim(text, '\n') : text
+               };
+             }
+           }
+         }, {
+           key: "fences",
+           value: function fences(src) {
+             var cap = this.rules.block.fences.exec(src);
+
+             if (cap) {
+               var raw = cap[0];
+               var text = indentCodeCompensation(raw, cap[3] || '');
+               return {
+                 type: 'code',
+                 raw: raw,
+                 lang: cap[2] ? cap[2].trim() : cap[2],
+                 text: text
+               };
+             }
+           }
+         }, {
+           key: "heading",
+           value: function heading(src) {
+             var cap = this.rules.block.heading.exec(src);
+
+             if (cap) {
+               var text = cap[2].trim(); // remove trailing #s
+
+               if (/#$/.test(text)) {
+                 var trimmed = rtrim(text, '#');
+
+                 if (this.options.pedantic) {
+                   text = trimmed.trim();
+                 } else if (!trimmed || / $/.test(trimmed)) {
+                   // CommonMark requires space before trailing #s
+                   text = trimmed.trim();
+                 }
+               }
+
+               return {
+                 type: 'heading',
+                 raw: cap[0],
+                 depth: cap[1].length,
+                 text: text
+               };
+             }
+           }
+         }, {
+           key: "nptable",
+           value: function nptable(src) {
+             var cap = this.rules.block.nptable.exec(src);
+
+             if (cap) {
+               var item = {
+                 type: 'table',
+                 header: splitCells(cap[1].replace(/^ *| *\| *$/g, '')),
+                 align: cap[2].replace(/^ *|\| *$/g, '').split(/ *\| */),
+                 cells: cap[3] ? cap[3].replace(/\n$/, '').split('\n') : [],
+                 raw: cap[0]
+               };
+
+               if (item.header.length === item.align.length) {
+                 var l = item.align.length;
+                 var i;
+
+                 for (i = 0; i < l; i++) {
+                   if (/^ *-+: *$/.test(item.align[i])) {
+                     item.align[i] = 'right';
+                   } else if (/^ *:-+: *$/.test(item.align[i])) {
+                     item.align[i] = 'center';
+                   } else if (/^ *:-+ *$/.test(item.align[i])) {
+                     item.align[i] = 'left';
+                   } else {
+                     item.align[i] = null;
+                   }
+                 }
+
+                 l = item.cells.length;
+
+                 for (i = 0; i < l; i++) {
+                   item.cells[i] = splitCells(item.cells[i], item.header.length);
+                 }
+
+                 return item;
+               }
+             }
+           }
+         }, {
+           key: "hr",
+           value: function hr(src) {
+             var cap = this.rules.block.hr.exec(src);
+
+             if (cap) {
+               return {
+                 type: 'hr',
+                 raw: cap[0]
+               };
+             }
+           }
+         }, {
+           key: "blockquote",
+           value: function blockquote(src) {
+             var cap = this.rules.block.blockquote.exec(src);
+
+             if (cap) {
+               var text = cap[0].replace(/^ *> ?/gm, '');
+               return {
+                 type: 'blockquote',
+                 raw: cap[0],
+                 text: text
+               };
+             }
+           }
+         }, {
+           key: "list",
+           value: function list(src) {
+             var cap = this.rules.block.list.exec(src);
+
+             if (cap) {
+               var raw = cap[0];
+               var bull = cap[2];
+               var isordered = bull.length > 1;
+               var list = {
+                 type: 'list',
+                 raw: raw,
+                 ordered: isordered,
+                 start: isordered ? +bull.slice(0, -1) : '',
+                 loose: false,
+                 items: []
+               }; // Get each top-level item.
+
+               var itemMatch = cap[0].match(this.rules.block.item);
+               var next = false,
+                   item,
+                   space,
+                   bcurr,
+                   bnext,
+                   addBack,
+                   loose,
+                   istask,
+                   ischecked,
+                   endMatch;
+               var l = itemMatch.length;
+               bcurr = this.rules.block.listItemStart.exec(itemMatch[0]);
+
+               for (var i = 0; i < l; i++) {
+                 item = itemMatch[i];
+                 raw = item;
+
+                 if (!this.options.pedantic) {
+                   // Determine if current item contains the end of the list
+                   endMatch = item.match(new RegExp('\\n\\s*\\n {0,' + (bcurr[0].length - 1) + '}\\S'));
+
+                   if (endMatch) {
+                     addBack = item.length - endMatch.index + itemMatch.slice(i + 1).join('\n').length;
+                     list.raw = list.raw.substring(0, list.raw.length - addBack);
+                     item = item.substring(0, endMatch.index);
+                     raw = item;
+                     l = i + 1;
+                   }
+                 } // Determine whether the next list item belongs here.
+                 // Backpedal if it does not belong in this list.
+
+
+                 if (i !== l - 1) {
+                   bnext = this.rules.block.listItemStart.exec(itemMatch[i + 1]);
+
+                   if (!this.options.pedantic ? bnext[1].length >= bcurr[0].length || bnext[1].length > 3 : bnext[1].length > bcurr[1].length) {
+                     // nested list or continuation
+                     itemMatch.splice(i, 2, itemMatch[i] + (!this.options.pedantic && bnext[1].length < bcurr[0].length && !itemMatch[i].match(/\n$/) ? '' : '\n') + itemMatch[i + 1]);
+                     i--;
+                     l--;
+                     continue;
+                   } else if ( // different bullet style
+                   !this.options.pedantic || this.options.smartLists ? bnext[2][bnext[2].length - 1] !== bull[bull.length - 1] : isordered === (bnext[2].length === 1)) {
+                     addBack = itemMatch.slice(i + 1).join('\n').length;
+                     list.raw = list.raw.substring(0, list.raw.length - addBack);
+                     i = l - 1;
+                   }
+
+                   bcurr = bnext;
+                 } // Remove the list item's bullet
+                 // so it is seen as the next token.
+
+
+                 space = item.length;
+                 item = item.replace(/^ *([*+-]|\d+[.)]) ?/, ''); // Outdent whatever the
+                 // list item contains. Hacky.
+
+                 if (~item.indexOf('\n ')) {
+                   space -= item.length;
+                   item = !this.options.pedantic ? item.replace(new RegExp('^ {1,' + space + '}', 'gm'), '') : item.replace(/^ {1,4}/gm, '');
+                 } // trim item newlines at end
+
+
+                 item = rtrim(item, '\n');
+
+                 if (i !== l - 1) {
+                   raw = raw + '\n';
+                 } // Determine whether item is loose or not.
+                 // Use: /(^|\n)(?! )[^\n]+\n\n(?!\s*$)/
+                 // for discount behavior.
+
+
+                 loose = next || /\n\n(?!\s*$)/.test(raw);
+
+                 if (i !== l - 1) {
+                   next = raw.slice(-2) === '\n\n';
+                   if (!loose) loose = next;
+                 }
+
+                 if (loose) {
+                   list.loose = true;
+                 } // Check for task list items
+
+
+                 if (this.options.gfm) {
+                   istask = /^\[[ xX]\] /.test(item);
+                   ischecked = undefined;
+
+                   if (istask) {
+                     ischecked = item[1] !== ' ';
+                     item = item.replace(/^\[[ xX]\] +/, '');
+                   }
+                 }
+
+                 list.items.push({
+                   type: 'list_item',
+                   raw: raw,
+                   task: istask,
+                   checked: ischecked,
+                   loose: loose,
+                   text: item
+                 });
+               }
+
+               return list;
+             }
+           }
+         }, {
+           key: "html",
+           value: function html(src) {
+             var cap = this.rules.block.html.exec(src);
+
+             if (cap) {
+               return {
+                 type: this.options.sanitize ? 'paragraph' : 'html',
+                 raw: cap[0],
+                 pre: !this.options.sanitizer && (cap[1] === 'pre' || cap[1] === 'script' || cap[1] === 'style'),
+                 text: this.options.sanitize ? this.options.sanitizer ? this.options.sanitizer(cap[0]) : _escape(cap[0]) : cap[0]
+               };
+             }
+           }
+         }, {
+           key: "def",
+           value: function def(src) {
+             var cap = this.rules.block.def.exec(src);
+
+             if (cap) {
+               if (cap[3]) cap[3] = cap[3].substring(1, cap[3].length - 1);
+               var tag = cap[1].toLowerCase().replace(/\s+/g, ' ');
+               return {
+                 type: 'def',
+                 tag: tag,
+                 raw: cap[0],
+                 href: cap[2],
+                 title: cap[3]
+               };
+             }
+           }
+         }, {
+           key: "table",
+           value: function table(src) {
+             var cap = this.rules.block.table.exec(src);
+
+             if (cap) {
+               var item = {
+                 type: 'table',
+                 header: splitCells(cap[1].replace(/^ *| *\| *$/g, '')),
+                 align: cap[2].replace(/^ *|\| *$/g, '').split(/ *\| */),
+                 cells: cap[3] ? cap[3].replace(/\n$/, '').split('\n') : []
+               };
+
+               if (item.header.length === item.align.length) {
+                 item.raw = cap[0];
+                 var l = item.align.length;
+                 var i;
+
+                 for (i = 0; i < l; i++) {
+                   if (/^ *-+: *$/.test(item.align[i])) {
+                     item.align[i] = 'right';
+                   } else if (/^ *:-+: *$/.test(item.align[i])) {
+                     item.align[i] = 'center';
+                   } else if (/^ *:-+ *$/.test(item.align[i])) {
+                     item.align[i] = 'left';
+                   } else {
+                     item.align[i] = null;
+                   }
+                 }
+
+                 l = item.cells.length;
+
+                 for (i = 0; i < l; i++) {
+                   item.cells[i] = splitCells(item.cells[i].replace(/^ *\| *| *\| *$/g, ''), item.header.length);
+                 }
+
+                 return item;
+               }
+             }
+           }
+         }, {
+           key: "lheading",
+           value: function lheading(src) {
+             var cap = this.rules.block.lheading.exec(src);
+
+             if (cap) {
+               return {
+                 type: 'heading',
+                 raw: cap[0],
+                 depth: cap[2].charAt(0) === '=' ? 1 : 2,
+                 text: cap[1]
+               };
+             }
+           }
+         }, {
+           key: "paragraph",
+           value: function paragraph(src) {
+             var cap = this.rules.block.paragraph.exec(src);
+
+             if (cap) {
+               return {
+                 type: 'paragraph',
+                 raw: cap[0],
+                 text: cap[1].charAt(cap[1].length - 1) === '\n' ? cap[1].slice(0, -1) : cap[1]
+               };
+             }
+           }
+         }, {
+           key: "text",
+           value: function text(src) {
+             var cap = this.rules.block.text.exec(src);
+
+             if (cap) {
+               return {
+                 type: 'text',
+                 raw: cap[0],
+                 text: cap[0]
+               };
+             }
+           }
+         }, {
+           key: "escape",
+           value: function escape(src) {
+             var cap = this.rules.inline.escape.exec(src);
+
+             if (cap) {
+               return {
+                 type: 'escape',
+                 raw: cap[0],
+                 text: _escape(cap[1])
+               };
+             }
+           }
+         }, {
+           key: "tag",
+           value: function tag(src, inLink, inRawBlock) {
+             var cap = this.rules.inline.tag.exec(src);
+
+             if (cap) {
+               if (!inLink && /^<a /i.test(cap[0])) {
+                 inLink = true;
+               } else if (inLink && /^<\/a>/i.test(cap[0])) {
+                 inLink = false;
+               }
+
+               if (!inRawBlock && /^<(pre|code|kbd|script)(\s|>)/i.test(cap[0])) {
+                 inRawBlock = true;
+               } else if (inRawBlock && /^<\/(pre|code|kbd|script)(\s|>)/i.test(cap[0])) {
+                 inRawBlock = false;
+               }
+
+               return {
+                 type: this.options.sanitize ? 'text' : 'html',
+                 raw: cap[0],
+                 inLink: inLink,
+                 inRawBlock: inRawBlock,
+                 text: this.options.sanitize ? this.options.sanitizer ? this.options.sanitizer(cap[0]) : _escape(cap[0]) : cap[0]
+               };
+             }
+           }
+         }, {
+           key: "link",
+           value: function link(src) {
+             var cap = this.rules.inline.link.exec(src);
+
+             if (cap) {
+               var trimmedUrl = cap[2].trim();
+
+               if (!this.options.pedantic && /^</.test(trimmedUrl)) {
+                 // commonmark requires matching angle brackets
+                 if (!/>$/.test(trimmedUrl)) {
+                   return;
+                 } // ending angle bracket cannot be escaped
+
+
+                 var rtrimSlash = rtrim(trimmedUrl.slice(0, -1), '\\');
+
+                 if ((trimmedUrl.length - rtrimSlash.length) % 2 === 0) {
+                   return;
+                 }
+               } else {
+                 // find closing parenthesis
+                 var lastParenIndex = findClosingBracket(cap[2], '()');
+
+                 if (lastParenIndex > -1) {
+                   var start = cap[0].indexOf('!') === 0 ? 5 : 4;
+                   var linkLen = start + cap[1].length + lastParenIndex;
+                   cap[2] = cap[2].substring(0, lastParenIndex);
+                   cap[0] = cap[0].substring(0, linkLen).trim();
+                   cap[3] = '';
+                 }
+               }
+
+               var href = cap[2];
+               var title = '';
+
+               if (this.options.pedantic) {
+                 // split pedantic href and title
+                 var link = /^([^'"]*[^\s])\s+(['"])(.*)\2/.exec(href);
+
+                 if (link) {
+                   href = link[1];
+                   title = link[3];
+                 }
+               } else {
+                 title = cap[3] ? cap[3].slice(1, -1) : '';
+               }
+
+               href = href.trim();
+
+               if (/^</.test(href)) {
+                 if (this.options.pedantic && !/>$/.test(trimmedUrl)) {
+                   // pedantic allows starting angle bracket without ending angle bracket
+                   href = href.slice(1);
+                 } else {
+                   href = href.slice(1, -1);
+                 }
+               }
+
+               return outputLink(cap, {
+                 href: href ? href.replace(this.rules.inline._escapes, '$1') : href,
+                 title: title ? title.replace(this.rules.inline._escapes, '$1') : title
+               }, cap[0]);
+             }
+           }
+         }, {
+           key: "reflink",
+           value: function reflink(src, links) {
+             var cap;
+
+             if ((cap = this.rules.inline.reflink.exec(src)) || (cap = this.rules.inline.nolink.exec(src))) {
+               var link = (cap[2] || cap[1]).replace(/\s+/g, ' ');
+               link = links[link.toLowerCase()];
+
+               if (!link || !link.href) {
+                 var text = cap[0].charAt(0);
+                 return {
+                   type: 'text',
+                   raw: text,
+                   text: text
+                 };
+               }
+
+               return outputLink(cap, link, cap[0]);
+             }
+           }
+         }, {
+           key: "emStrong",
+           value: function emStrong(src, maskedSrc) {
+             var prevChar = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : '';
+             var match = this.rules.inline.emStrong.lDelim.exec(src);
+             if (!match) return; // _ can't be between two alphanumerics. \p{L}\p{N} includes non-english alphabet/numbers as well
+
+             if (match[3] && prevChar.match(/(?:[0-9A-Za-z\xAA\xB2\xB3\xB5\xB9\xBA\xBC-\xBE\xC0-\xD6\xD8-\xF6\xF8-\u02C1\u02C6-\u02D1\u02E0-\u02E4\u02EC\u02EE\u0370-\u0374\u0376\u0377\u037A-\u037D\u037F\u0386\u0388-\u038A\u038C\u038E-\u03A1\u03A3-\u03F5\u03F7-\u0481\u048A-\u052F\u0531-\u0556\u0559\u0560-\u0588\u05D0-\u05EA\u05EF-\u05F2\u0620-\u064A\u0660-\u0669\u066E\u066F\u0671-\u06D3\u06D5\u06E5\u06E6\u06EE-\u06FC\u06FF\u0710\u0712-\u072F\u074D-\u07A5\u07B1\u07C0-\u07EA\u07F4\u07F5\u07FA\u0800-\u0815\u081A\u0824\u0828\u0840-\u0858\u0860-\u086A\u0870-\u0887\u0889-\u088E\u08A0-\u08C9\u0904-\u0939\u093D\u0950\u0958-\u0961\u0966-\u096F\u0971-\u0980\u0985-\u098C\u098F\u0990\u0993-\u09A8\u09AA-\u09B0\u09B2\u09B6-\u09B9\u09BD\u09CE\u09DC\u09DD\u09DF-\u09E1\u09E6-\u09F1\u09F4-\u09F9\u09FC\u0A05-\u0A0A\u0A0F\u0A10\u0A13-\u0A28\u0A2A-\u0A30\u0A32\u0A33\u0A35\u0A36\u0A38\u0A39\u0A59-\u0A5C\u0A5E\u0A66-\u0A6F\u0A72-\u0A74\u0A85-\u0A8D\u0A8F-\u0A91\u0A93-\u0AA8\u0AAA-\u0AB0\u0AB2\u0AB3\u0AB5-\u0AB9\u0ABD\u0AD0\u0AE0\u0AE1\u0AE6-\u0AEF\u0AF9\u0B05-\u0B0C\u0B0F\u0B10\u0B13-\u0B28\u0B2A-\u0B30\u0B32\u0B33\u0B35-\u0B39\u0B3D\u0B5C\u0B5D\u0B5F-\u0B61\u0B66-\u0B6F\u0B71-\u0B77\u0B83\u0B85-\u0B8A\u0B8E-\u0B90\u0B92-\u0B95\u0B99\u0B9A\u0B9C\u0B9E\u0B9F\u0BA3\u0BA4\u0BA8-\u0BAA\u0BAE-\u0BB9\u0BD0\u0BE6-\u0BF2\u0C05-\u0C0C\u0C0E-\u0C10\u0C12-\u0C28\u0C2A-\u0C39\u0C3D\u0C58-\u0C5A\u0C5D\u0C60\u0C61\u0C66-\u0C6F\u0C78-\u0C7E\u0C80\u0C85-\u0C8C\u0C8E-\u0C90\u0C92-\u0CA8\u0CAA-\u0CB3\u0CB5-\u0CB9\u0CBD\u0CDD\u0CDE\u0CE0\u0CE1\u0CE6-\u0CEF\u0CF1\u0CF2\u0D04-\u0D0C\u0D0E-\u0D10\u0D12-\u0D3A\u0D3D\u0D4E\u0D54-\u0D56\u0D58-\u0D61\u0D66-\u0D78\u0D7A-\u0D7F\u0D85-\u0D96\u0D9A-\u0DB1\u0DB3-\u0DBB\u0DBD\u0DC0-\u0DC6\u0DE6-\u0DEF\u0E01-\u0E30\u0E32\u0E33\u0E40-\u0E46\u0E50-\u0E59\u0E81\u0E82\u0E84\u0E86-\u0E8A\u0E8C-\u0EA3\u0EA5\u0EA7-\u0EB0\u0EB2\u0EB3\u0EBD\u0EC0-\u0EC4\u0EC6\u0ED0-\u0ED9\u0EDC-\u0EDF\u0F00\u0F20-\u0F33\u0F40-\u0F47\u0F49-\u0F6C\u0F88-\u0F8C\u1000-\u102A\u103F-\u1049\u1050-\u1055\u105A-\u105D\u1061\u1065\u1066\u106E-\u1070\u1075-\u1081\u108E\u1090-\u1099\u10A0-\u10C5\u10C7\u10CD\u10D0-\u10FA\u10FC-\u1248\u124A-\u124D\u1250-\u1256\u1258\u125A-\u125D\u1260-\u1288\u128A-\u128D\u1290-\u12B0\u12B2-\u12B5\u12B8-\u12BE\u12C0\u12C2-\u12C5\u12C8-\u12D6\u12D8-\u1310\u1312-\u1315\u1318-\u135A\u1369-\u137C\u1380-\u138F\u13A0-\u13F5\u13F8-\u13FD\u1401-\u166C\u166F-\u167F\u1681-\u169A\u16A0-\u16EA\u16EE-\u16F8\u1700-\u1711\u171F-\u1731\u1740-\u1751\u1760-\u176C\u176E-\u1770\u1780-\u17B3\u17D7\u17DC\u17E0-\u17E9\u17F0-\u17F9\u1810-\u1819\u1820-\u1878\u1880-\u1884\u1887-\u18A8\u18AA\u18B0-\u18F5\u1900-\u191E\u1946-\u196D\u1970-\u1974\u1980-\u19AB\u19B0-\u19C9\u19D0-\u19DA\u1A00-\u1A16\u1A20-\u1A54\u1A80-\u1A89\u1A90-\u1A99\u1AA7\u1B05-\u1B33\u1B45-\u1B4C\u1B50-\u1B59\u1B83-\u1BA0\u1BAE-\u1BE5\u1C00-\u1C23\u1C40-\u1C49\u1C4D-\u1C7D\u1C80-\u1C88\u1C90-\u1CBA\u1CBD-\u1CBF\u1CE9-\u1CEC\u1CEE-\u1CF3\u1CF5\u1CF6\u1CFA\u1D00-\u1DBF\u1E00-\u1F15\u1F18-\u1F1D\u1F20-\u1F45\u1F48-\u1F4D\u1F50-\u1F57\u1F59\u1F5B\u1F5D\u1F5F-\u1F7D\u1F80-\u1FB4\u1FB6-\u1FBC\u1FBE\u1FC2-\u1FC4\u1FC6-\u1FCC\u1FD0-\u1FD3\u1FD6-\u1FDB\u1FE0-\u1FEC\u1FF2-\u1FF4\u1FF6-\u1FFC\u2070\u2071\u2074-\u2079\u207F-\u2089\u2090-\u209C\u2102\u2107\u210A-\u2113\u2115\u2119-\u211D\u2124\u2126\u2128\u212A-\u212D\u212F-\u2139\u213C-\u213F\u2145-\u2149\u214E\u2150-\u2189\u2460-\u249B\u24EA-\u24FF\u2776-\u2793\u2C00-\u2CE4\u2CEB-\u2CEE\u2CF2\u2CF3\u2CFD\u2D00-\u2D25\u2D27\u2D2D\u2D30-\u2D67\u2D6F\u2D80-\u2D96\u2DA0-\u2DA6\u2DA8-\u2DAE\u2DB0-\u2DB6\u2DB8-\u2DBE\u2DC0-\u2DC6\u2DC8-\u2DCE\u2DD0-\u2DD6\u2DD8-\u2DDE\u2E2F\u3005-\u3007\u3021-\u3029\u3031-\u3035\u3038-\u303C\u3041-\u3096\u309D-\u309F\u30A1-\u30FA\u30FC-\u30FF\u3105-\u312F\u3131-\u318E\u3192-\u3195\u31A0-\u31BF\u31F0-\u31FF\u3220-\u3229\u3248-\u324F\u3251-\u325F\u3280-\u3289\u32B1-\u32BF\u3400-\u4DBF\u4E00-\uA48C\uA4D0-\uA4FD\uA500-\uA60C\uA610-\uA62B\uA640-\uA66E\uA67F-\uA69D\uA6A0-\uA6EF\uA717-\uA71F\uA722-\uA788\uA78B-\uA7CA\uA7D0\uA7D1\uA7D3\uA7D5-\uA7D9\uA7F2-\uA801\uA803-\uA805\uA807-\uA80A\uA80C-\uA822\uA830-\uA835\uA840-\uA873\uA882-\uA8B3\uA8D0-\uA8D9\uA8F2-\uA8F7\uA8FB\uA8FD\uA8FE\uA900-\uA925\uA930-\uA946\uA960-\uA97C\uA984-\uA9B2\uA9CF-\uA9D9\uA9E0-\uA9E4\uA9E6-\uA9FE\uAA00-\uAA28\uAA40-\uAA42\uAA44-\uAA4B\uAA50-\uAA59\uAA60-\uAA76\uAA7A\uAA7E-\uAAAF\uAAB1\uAAB5\uAAB6\uAAB9-\uAABD\uAAC0\uAAC2\uAADB-\uAADD\uAAE0-\uAAEA\uAAF2-\uAAF4\uAB01-\uAB06\uAB09-\uAB0E\uAB11-\uAB16\uAB20-\uAB26\uAB28-\uAB2E\uAB30-\uAB5A\uAB5C-\uAB69\uAB70-\uABE2\uABF0-\uABF9\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uF900-\uFA6D\uFA70-\uFAD9\uFB00-\uFB06\uFB13-\uFB17\uFB1D\uFB1F-\uFB28\uFB2A-\uFB36\uFB38-\uFB3C\uFB3E\uFB40\uFB41\uFB43\uFB44\uFB46-\uFBB1\uFBD3-\uFD3D\uFD50-\uFD8F\uFD92-\uFDC7\uFDF0-\uFDFB\uFE70-\uFE74\uFE76-\uFEFC\uFF10-\uFF19\uFF21-\uFF3A\uFF41-\uFF5A\uFF66-\uFFBE\uFFC2-\uFFC7\uFFCA-\uFFCF\uFFD2-\uFFD7\uFFDA-\uFFDC]|\uD800[\uDC00-\uDC0B\uDC0D-\uDC26\uDC28-\uDC3A\uDC3C\uDC3D\uDC3F-\uDC4D\uDC50-\uDC5D\uDC80-\uDCFA\uDD07-\uDD33\uDD40-\uDD78\uDD8A\uDD8B\uDE80-\uDE9C\uDEA0-\uDED0\uDEE1-\uDEFB\uDF00-\uDF23\uDF2D-\uDF4A\uDF50-\uDF75\uDF80-\uDF9D\uDFA0-\uDFC3\uDFC8-\uDFCF\uDFD1-\uDFD5]|\uD801[\uDC00-\uDC9D\uDCA0-\uDCA9\uDCB0-\uDCD3\uDCD8-\uDCFB\uDD00-\uDD27\uDD30-\uDD63\uDD70-\uDD7A\uDD7C-\uDD8A\uDD8C-\uDD92\uDD94\uDD95\uDD97-\uDDA1\uDDA3-\uDDB1\uDDB3-\uDDB9\uDDBB\uDDBC\uDE00-\uDF36\uDF40-\uDF55\uDF60-\uDF67\uDF80-\uDF85\uDF87-\uDFB0\uDFB2-\uDFBA]|\uD802[\uDC00-\uDC05\uDC08\uDC0A-\uDC35\uDC37\uDC38\uDC3C\uDC3F-\uDC55\uDC58-\uDC76\uDC79-\uDC9E\uDCA7-\uDCAF\uDCE0-\uDCF2\uDCF4\uDCF5\uDCFB-\uDD1B\uDD20-\uDD39\uDD80-\uDDB7\uDDBC-\uDDCF\uDDD2-\uDE00\uDE10-\uDE13\uDE15-\uDE17\uDE19-\uDE35\uDE40-\uDE48\uDE60-\uDE7E\uDE80-\uDE9F\uDEC0-\uDEC7\uDEC9-\uDEE4\uDEEB-\uDEEF\uDF00-\uDF35\uDF40-\uDF55\uDF58-\uDF72\uDF78-\uDF91\uDFA9-\uDFAF]|\uD803[\uDC00-\uDC48\uDC80-\uDCB2\uDCC0-\uDCF2\uDCFA-\uDD23\uDD30-\uDD39\uDE60-\uDE7E\uDE80-\uDEA9\uDEB0\uDEB1\uDF00-\uDF27\uDF30-\uDF45\uDF51-\uDF54\uDF70-\uDF81\uDFB0-\uDFCB\uDFE0-\uDFF6]|\uD804[\uDC03-\uDC37\uDC52-\uDC6F\uDC71\uDC72\uDC75\uDC83-\uDCAF\uDCD0-\uDCE8\uDCF0-\uDCF9\uDD03-\uDD26\uDD36-\uDD3F\uDD44\uDD47\uDD50-\uDD72\uDD76\uDD83-\uDDB2\uDDC1-\uDDC4\uDDD0-\uDDDA\uDDDC\uDDE1-\uDDF4\uDE00-\uDE11\uDE13-\uDE2B\uDE80-\uDE86\uDE88\uDE8A-\uDE8D\uDE8F-\uDE9D\uDE9F-\uDEA8\uDEB0-\uDEDE\uDEF0-\uDEF9\uDF05-\uDF0C\uDF0F\uDF10\uDF13-\uDF28\uDF2A-\uDF30\uDF32\uDF33\uDF35-\uDF39\uDF3D\uDF50\uDF5D-\uDF61]|\uD805[\uDC00-\uDC34\uDC47-\uDC4A\uDC50-\uDC59\uDC5F-\uDC61\uDC80-\uDCAF\uDCC4\uDCC5\uDCC7\uDCD0-\uDCD9\uDD80-\uDDAE\uDDD8-\uDDDB\uDE00-\uDE2F\uDE44\uDE50-\uDE59\uDE80-\uDEAA\uDEB8\uDEC0-\uDEC9\uDF00-\uDF1A\uDF30-\uDF3B\uDF40-\uDF46]|\uD806[\uDC00-\uDC2B\uDCA0-\uDCF2\uDCFF-\uDD06\uDD09\uDD0C-\uDD13\uDD15\uDD16\uDD18-\uDD2F\uDD3F\uDD41\uDD50-\uDD59\uDDA0-\uDDA7\uDDAA-\uDDD0\uDDE1\uDDE3\uDE00\uDE0B-\uDE32\uDE3A\uDE50\uDE5C-\uDE89\uDE9D\uDEB0-\uDEF8]|\uD807[\uDC00-\uDC08\uDC0A-\uDC2E\uDC40\uDC50-\uDC6C\uDC72-\uDC8F\uDD00-\uDD06\uDD08\uDD09\uDD0B-\uDD30\uDD46\uDD50-\uDD59\uDD60-\uDD65\uDD67\uDD68\uDD6A-\uDD89\uDD98\uDDA0-\uDDA9\uDEE0-\uDEF2\uDFB0\uDFC0-\uDFD4]|\uD808[\uDC00-\uDF99]|\uD809[\uDC00-\uDC6E\uDC80-\uDD43]|\uD80B[\uDF90-\uDFF0]|[\uD80C\uD81C-\uD820\uD822\uD840-\uD868\uD86A-\uD86C\uD86F-\uD872\uD874-\uD879\uD880-\uD883][\uDC00-\uDFFF]|\uD80D[\uDC00-\uDC2E]|\uD811[\uDC00-\uDE46]|\uD81A[\uDC00-\uDE38\uDE40-\uDE5E\uDE60-\uDE69\uDE70-\uDEBE\uDEC0-\uDEC9\uDED0-\uDEED\uDF00-\uDF2F\uDF40-\uDF43\uDF50-\uDF59\uDF5B-\uDF61\uDF63-\uDF77\uDF7D-\uDF8F]|\uD81B[\uDE40-\uDE96\uDF00-\uDF4A\uDF50\uDF93-\uDF9F\uDFE0\uDFE1\uDFE3]|\uD821[\uDC00-\uDFF7]|\uD823[\uDC00-\uDCD5\uDD00-\uDD08]|\uD82B[\uDFF0-\uDFF3\uDFF5-\uDFFB\uDFFD\uDFFE]|\uD82C[\uDC00-\uDD22\uDD50-\uDD52\uDD64-\uDD67\uDD70-\uDEFB]|\uD82F[\uDC00-\uDC6A\uDC70-\uDC7C\uDC80-\uDC88\uDC90-\uDC99]|\uD834[\uDEE0-\uDEF3\uDF60-\uDF78]|\uD835[\uDC00-\uDC54\uDC56-\uDC9C\uDC9E\uDC9F\uDCA2\uDCA5\uDCA6\uDCA9-\uDCAC\uDCAE-\uDCB9\uDCBB\uDCBD-\uDCC3\uDCC5-\uDD05\uDD07-\uDD0A\uDD0D-\uDD14\uDD16-\uDD1C\uDD1E-\uDD39\uDD3B-\uDD3E\uDD40-\uDD44\uDD46\uDD4A-\uDD50\uDD52-\uDEA5\uDEA8-\uDEC0\uDEC2-\uDEDA\uDEDC-\uDEFA\uDEFC-\uDF14\uDF16-\uDF34\uDF36-\uDF4E\uDF50-\uDF6E\uDF70-\uDF88\uDF8A-\uDFA8\uDFAA-\uDFC2\uDFC4-\uDFCB\uDFCE-\uDFFF]|\uD837[\uDF00-\uDF1E]|\uD838[\uDD00-\uDD2C\uDD37-\uDD3D\uDD40-\uDD49\uDD4E\uDE90-\uDEAD\uDEC0-\uDEEB\uDEF0-\uDEF9]|\uD839[\uDFE0-\uDFE6\uDFE8-\uDFEB\uDFED\uDFEE\uDFF0-\uDFFE]|\uD83A[\uDC00-\uDCC4\uDCC7-\uDCCF\uDD00-\uDD43\uDD4B\uDD50-\uDD59]|\uD83B[\uDC71-\uDCAB\uDCAD-\uDCAF\uDCB1-\uDCB4\uDD01-\uDD2D\uDD2F-\uDD3D\uDE00-\uDE03\uDE05-\uDE1F\uDE21\uDE22\uDE24\uDE27\uDE29-\uDE32\uDE34-\uDE37\uDE39\uDE3B\uDE42\uDE47\uDE49\uDE4B\uDE4D-\uDE4F\uDE51\uDE52\uDE54\uDE57\uDE59\uDE5B\uDE5D\uDE5F\uDE61\uDE62\uDE64\uDE67-\uDE6A\uDE6C-\uDE72\uDE74-\uDE77\uDE79-\uDE7C\uDE7E\uDE80-\uDE89\uDE8B-\uDE9B\uDEA1-\uDEA3\uDEA5-\uDEA9\uDEAB-\uDEBB]|\uD83C[\uDD00-\uDD0C]|\uD83E[\uDFF0-\uDFF9]|\uD869[\uDC00-\uDEDF\uDF00-\uDFFF]|\uD86D[\uDC00-\uDF38\uDF40-\uDFFF]|\uD86E[\uDC00-\uDC1D\uDC20-\uDFFF]|\uD873[\uDC00-\uDEA1\uDEB0-\uDFFF]|\uD87A[\uDC00-\uDFE0]|\uD87E[\uDC00-\uDE1D]|\uD884[\uDC00-\uDF4A])/)) return;
+             var nextChar = match[1] || match[2] || '';
+
+             if (!nextChar || nextChar && (prevChar === '' || this.rules.inline.punctuation.exec(prevChar))) {
+               var lLength = match[0].length - 1;
+               var rDelim,
+                   rLength,
+                   delimTotal = lLength,
+                   midDelimTotal = 0;
+               var endReg = match[0][0] === '*' ? this.rules.inline.emStrong.rDelimAst : this.rules.inline.emStrong.rDelimUnd;
+               endReg.lastIndex = 0; // Clip maskedSrc to same section of string as src (move to lexer?)
+
+               maskedSrc = maskedSrc.slice(-1 * src.length + lLength);
+
+               while ((match = endReg.exec(maskedSrc)) != null) {
+                 rDelim = match[1] || match[2] || match[3] || match[4] || match[5] || match[6];
+                 if (!rDelim) continue; // skip single * in __abc*abc__
+
+                 rLength = rDelim.length;
+
+                 if (match[3] || match[4]) {
+                   // found another Left Delim
+                   delimTotal += rLength;
+                   continue;
+                 } else if (match[5] || match[6]) {
+                   // either Left or Right Delim
+                   if (lLength % 3 && !((lLength + rLength) % 3)) {
+                     midDelimTotal += rLength;
+                     continue; // CommonMark Emphasis Rules 9-10
+                   }
+                 }
+
+                 delimTotal -= rLength;
+                 if (delimTotal > 0) continue; // Haven't found enough closing delimiters
+                 // Remove extra characters. *a*** -> *a*
+
+                 rLength = Math.min(rLength, rLength + delimTotal + midDelimTotal); // Create `em` if smallest delimiter has odd char count. *a***
+
+                 if (Math.min(lLength, rLength) % 2) {
+                   return {
+                     type: 'em',
+                     raw: src.slice(0, lLength + match.index + rLength + 1),
+                     text: src.slice(1, lLength + match.index + rLength)
+                   };
+                 } // Create 'strong' if smallest delimiter has even char count. **a***
+
+
+                 return {
+                   type: 'strong',
+                   raw: src.slice(0, lLength + match.index + rLength + 1),
+                   text: src.slice(2, lLength + match.index + rLength - 1)
+                 };
+               }
+             }
+           }
+         }, {
+           key: "codespan",
+           value: function codespan(src) {
+             var cap = this.rules.inline.code.exec(src);
+
+             if (cap) {
+               var text = cap[2].replace(/\n/g, ' ');
+               var hasNonSpaceChars = /[^ ]/.test(text);
+               var hasSpaceCharsOnBothEnds = /^ /.test(text) && / $/.test(text);
+
+               if (hasNonSpaceChars && hasSpaceCharsOnBothEnds) {
+                 text = text.substring(1, text.length - 1);
+               }
+
+               text = _escape(text, true);
+               return {
+                 type: 'codespan',
+                 raw: cap[0],
+                 text: text
+               };
+             }
+           }
+         }, {
+           key: "br",
+           value: function br(src) {
+             var cap = this.rules.inline.br.exec(src);
+
+             if (cap) {
+               return {
+                 type: 'br',
+                 raw: cap[0]
+               };
+             }
+           }
+         }, {
+           key: "del",
+           value: function del(src) {
+             var cap = this.rules.inline.del.exec(src);
+
+             if (cap) {
+               return {
+                 type: 'del',
+                 raw: cap[0],
+                 text: cap[2]
+               };
+             }
+           }
+         }, {
+           key: "autolink",
+           value: function autolink(src, mangle) {
+             var cap = this.rules.inline.autolink.exec(src);
+
+             if (cap) {
+               var text, href;
+
+               if (cap[2] === '@') {
+                 text = _escape(this.options.mangle ? mangle(cap[1]) : cap[1]);
+                 href = 'mailto:' + text;
+               } else {
+                 text = _escape(cap[1]);
+                 href = text;
+               }
+
+               return {
+                 type: 'link',
+                 raw: cap[0],
+                 text: text,
+                 href: href,
+                 tokens: [{
+                   type: 'text',
+                   raw: text,
+                   text: text
+                 }]
+               };
+             }
+           }
+         }, {
+           key: "url",
+           value: function url(src, mangle) {
+             var cap;
+
+             if (cap = this.rules.inline.url.exec(src)) {
+               var text, href;
+
+               if (cap[2] === '@') {
+                 text = _escape(this.options.mangle ? mangle(cap[0]) : cap[0]);
+                 href = 'mailto:' + text;
+               } else {
+                 // do extended autolink path validation
+                 var prevCapZero;
+
+                 do {
+                   prevCapZero = cap[0];
+                   cap[0] = this.rules.inline._backpedal.exec(cap[0])[0];
+                 } while (prevCapZero !== cap[0]);
+
+                 text = _escape(cap[0]);
+
+                 if (cap[1] === 'www.') {
+                   href = 'http://' + text;
+                 } else {
+                   href = text;
+                 }
+               }
+
+               return {
+                 type: 'link',
+                 raw: cap[0],
+                 text: text,
+                 href: href,
+                 tokens: [{
+                   type: 'text',
+                   raw: text,
+                   text: text
+                 }]
+               };
+             }
+           }
+         }, {
+           key: "inlineText",
+           value: function inlineText(src, inRawBlock, smartypants) {
+             var cap = this.rules.inline.text.exec(src);
+
+             if (cap) {
+               var text;
+
+               if (inRawBlock) {
+                 text = this.options.sanitize ? this.options.sanitizer ? this.options.sanitizer(cap[0]) : _escape(cap[0]) : cap[0];
+               } else {
+                 text = _escape(this.options.smartypants ? smartypants(cap[0]) : cap[0]);
+               }
+
+               return {
+                 type: 'text',
+                 raw: cap[0],
+                 text: text
+               };
+             }
+           }
+         }]);
+
+         return Tokenizer;
+       }();
+
+       var noopTest = helpers.noopTest,
+           edit = helpers.edit,
+           merge$1 = helpers.merge;
+       /**
+        * Block-Level Grammar
+        */
+
+       var block$1 = {
+         newline: /^(?: *(?:\n|$))+/,
+         code: /^( {4}[^\n]+(?:\n(?: *(?:\n|$))*)?)+/,
+         fences: /^ {0,3}(`{3,}(?=[^`\n]*\n)|~{3,})([^\n]*)\n(?:|([\s\S]*?)\n)(?: {0,3}\1[~`]* *(?:\n+|$)|$)/,
+         hr: /^ {0,3}((?:- *){3,}|(?:_ *){3,}|(?:\* *){3,})(?:\n+|$)/,
+         heading: /^ {0,3}(#{1,6})(?=\s|$)(.*)(?:\n+|$)/,
+         blockquote: /^( {0,3}> ?(paragraph|[^\n]*)(?:\n|$))+/,
+         list: /^( {0,3})(bull) [\s\S]+?(?:hr|def|\n{2,}(?! )(?! {0,3}bull )\n*|\s*$)/,
+         html: '^ {0,3}(?:' // optional indentation
+         + '<(script|pre|style)[\\s>][\\s\\S]*?(?:</\\1>[^\\n]*\\n+|$)' // (1)
+         + '|comment[^\\n]*(\\n+|$)' // (2)
+         + '|<\\?[\\s\\S]*?(?:\\?>\\n*|$)' // (3)
+         + '|<![A-Z][\\s\\S]*?(?:>\\n*|$)' // (4)
+         + '|<!\\[CDATA\\[[\\s\\S]*?(?:\\]\\]>\\n*|$)' // (5)
+         + '|</?(tag)(?: +|\\n|/?>)[\\s\\S]*?(?:(?:\\n *)+\\n|$)' // (6)
+         + '|<(?!script|pre|style)([a-z][\\w-]*)(?:attribute)*? */?>(?=[ \\t]*(?:\\n|$))[\\s\\S]*?(?:(?:\\n *)+\\n|$)' // (7) open tag
+         + '|</(?!script|pre|style)[a-z][\\w-]*\\s*>(?=[ \\t]*(?:\\n|$))[\\s\\S]*?(?:(?:\\n *)+\\n|$)' // (7) closing tag
+         + ')',
+         def: /^ {0,3}\[(label)\]: *\n? *<?([^\s>]+)>?(?:(?: +\n? *| *\n *)(title))? *(?:\n+|$)/,
+         nptable: noopTest,
+         table: noopTest,
+         lheading: /^([^\n]+)\n {0,3}(=+|-+) *(?:\n+|$)/,
+         // regex template, placeholders will be replaced according to different paragraph
+         // interruption rules of commonmark and the original markdown spec:
+         _paragraph: /^([^\n]+(?:\n(?!hr|heading|lheading|blockquote|fences|list|html| +\n)[^\n]+)*)/,
+         text: /^[^\n]+/
+       };
+       block$1._label = /(?!\s*\])(?:\\[\[\]]|[^\[\]])+/;
+       block$1._title = /(?:"(?:\\"?|[^"\\])*"|'[^'\n]*(?:\n[^'\n]+)*\n?'|\([^()]*\))/;
+       block$1.def = edit(block$1.def).replace('label', block$1._label).replace('title', block$1._title).getRegex();
+       block$1.bullet = /(?:[*+-]|\d{1,9}[.)])/;
+       block$1.item = /^( *)(bull) ?[^\n]*(?:\n(?! *bull ?)[^\n]*)*/;
+       block$1.item = edit(block$1.item, 'gm').replace(/bull/g, block$1.bullet).getRegex();
+       block$1.listItemStart = edit(/^( *)(bull) */).replace('bull', block$1.bullet).getRegex();
+       block$1.list = edit(block$1.list).replace(/bull/g, block$1.bullet).replace('hr', '\\n+(?=\\1?(?:(?:- *){3,}|(?:_ *){3,}|(?:\\* *){3,})(?:\\n+|$))').replace('def', '\\n+(?=' + block$1.def.source + ')').getRegex();
+       block$1._tag = 'address|article|aside|base|basefont|blockquote|body|caption' + '|center|col|colgroup|dd|details|dialog|dir|div|dl|dt|fieldset|figcaption' + '|figure|footer|form|frame|frameset|h[1-6]|head|header|hr|html|iframe' + '|legend|li|link|main|menu|menuitem|meta|nav|noframes|ol|optgroup|option' + '|p|param|section|source|summary|table|tbody|td|tfoot|th|thead|title|tr' + '|track|ul';
+       block$1._comment = /<!--(?!-?>)[\s\S]*?(?:-->|$)/;
+       block$1.html = edit(block$1.html, 'i').replace('comment', block$1._comment).replace('tag', block$1._tag).replace('attribute', / +[a-zA-Z:_][\w.:-]*(?: *= *"[^"\n]*"| *= *'[^'\n]*'| *= *[^\s"'=<>`]+)?/).getRegex();
+       block$1.paragraph = edit(block$1._paragraph).replace('hr', block$1.hr).replace('heading', ' {0,3}#{1,6} ').replace('|lheading', '') // setex headings don't interrupt commonmark paragraphs
+       .replace('blockquote', ' {0,3}>').replace('fences', ' {0,3}(?:`{3,}(?=[^`\\n]*\\n)|~{3,})[^\\n]*\\n').replace('list', ' {0,3}(?:[*+-]|1[.)]) ') // only lists starting from 1 can interrupt
+       .replace('html', '</?(?:tag)(?: +|\\n|/?>)|<(?:script|pre|style|!--)').replace('tag', block$1._tag) // pars can be interrupted by type (6) html blocks
+       .getRegex();
+       block$1.blockquote = edit(block$1.blockquote).replace('paragraph', block$1.paragraph).getRegex();
+       /**
+        * Normal Block Grammar
+        */
+
+       block$1.normal = merge$1({}, block$1);
+       /**
+        * GFM Block Grammar
+        */
+
+       block$1.gfm = merge$1({}, block$1.normal, {
+         nptable: '^ *([^|\\n ].*\\|.*)\\n' // Header
+         + ' {0,3}([-:]+ *\\|[-| :]*)' // Align
+         + '(?:\\n((?:(?!\\n|hr|heading|blockquote|code|fences|list|html).*(?:\\n|$))*)\\n*|$)',
+         // Cells
+         table: '^ *\\|(.+)\\n' // Header
+         + ' {0,3}\\|?( *[-:]+[-| :]*)' // Align
+         + '(?:\\n *((?:(?!\\n|hr|heading|blockquote|code|fences|list|html).*(?:\\n|$))*)\\n*|$)' // Cells
+
+       });
+       block$1.gfm.nptable = edit(block$1.gfm.nptable).replace('hr', block$1.hr).replace('heading', ' {0,3}#{1,6} ').replace('blockquote', ' {0,3}>').replace('code', ' {4}[^\\n]').replace('fences', ' {0,3}(?:`{3,}(?=[^`\\n]*\\n)|~{3,})[^\\n]*\\n').replace('list', ' {0,3}(?:[*+-]|1[.)]) ') // only lists starting from 1 can interrupt
+       .replace('html', '</?(?:tag)(?: +|\\n|/?>)|<(?:script|pre|style|!--)').replace('tag', block$1._tag) // tables can be interrupted by type (6) html blocks
+       .getRegex();
+       block$1.gfm.table = edit(block$1.gfm.table).replace('hr', block$1.hr).replace('heading', ' {0,3}#{1,6} ').replace('blockquote', ' {0,3}>').replace('code', ' {4}[^\\n]').replace('fences', ' {0,3}(?:`{3,}(?=[^`\\n]*\\n)|~{3,})[^\\n]*\\n').replace('list', ' {0,3}(?:[*+-]|1[.)]) ') // only lists starting from 1 can interrupt
+       .replace('html', '</?(?:tag)(?: +|\\n|/?>)|<(?:script|pre|style|!--)').replace('tag', block$1._tag) // tables can be interrupted by type (6) html blocks
+       .getRegex();
+       /**
+        * Pedantic grammar (original John Gruber's loose markdown specification)
+        */
+
+       block$1.pedantic = merge$1({}, block$1.normal, {
+         html: edit('^ *(?:comment *(?:\\n|\\s*$)' + '|<(tag)[\\s\\S]+?</\\1> *(?:\\n{2,}|\\s*$)' // closed tag
+         + '|<tag(?:"[^"]*"|\'[^\']*\'|\\s[^\'"/>\\s]*)*?/?> *(?:\\n{2,}|\\s*$))').replace('comment', block$1._comment).replace(/tag/g, '(?!(?:' + 'a|em|strong|small|s|cite|q|dfn|abbr|data|time|code|var|samp|kbd|sub' + '|sup|i|b|u|mark|ruby|rt|rp|bdi|bdo|span|br|wbr|ins|del|img)' + '\\b)\\w+(?!:|[^\\w\\s@]*@)\\b').getRegex(),
+         def: /^ *\[([^\]]+)\]: *<?([^\s>]+)>?(?: +(["(][^\n]+[")]))? *(?:\n+|$)/,
+         heading: /^(#{1,6})(.*)(?:\n+|$)/,
+         fences: noopTest,
+         // fences not supported
+         paragraph: edit(block$1.normal._paragraph).replace('hr', block$1.hr).replace('heading', ' *#{1,6} *[^\n]').replace('lheading', block$1.lheading).replace('blockquote', ' {0,3}>').replace('|fences', '').replace('|list', '').replace('|html', '').getRegex()
+       });
+       /**
+        * Inline-Level Grammar
+        */
+
+       var inline$1 = {
+         escape: /^\\([!"#$%&'()*+,\-./:;<=>?@\[\]\\^_`{|}~])/,
+         autolink: /^<(scheme:[^\s\x00-\x1f<>]*|email)>/,
+         url: noopTest,
+         tag: '^comment' + '|^</[a-zA-Z][\\w:-]*\\s*>' // self-closing tag
+         + '|^<[a-zA-Z][\\w-]*(?:attribute)*?\\s*/?>' // open tag
+         + '|^<\\?[\\s\\S]*?\\?>' // processing instruction, e.g. <?php ?>
+         + '|^<![a-zA-Z]+\\s[\\s\\S]*?>' // declaration, e.g. <!DOCTYPE html>
+         + '|^<!\\[CDATA\\[[\\s\\S]*?\\]\\]>',
+         // CDATA section
+         link: /^!?\[(label)\]\(\s*(href)(?:\s+(title))?\s*\)/,
+         reflink: /^!?\[(label)\]\[(?!\s*\])((?:\\[\[\]]?|[^\[\]\\])+)\]/,
+         nolink: /^!?\[(?!\s*\])((?:\[[^\[\]]*\]|\\[\[\]]|[^\[\]])*)\](?:\[\])?/,
+         reflinkSearch: 'reflink|nolink(?!\\()',
+         emStrong: {
+           lDelim: /^(?:\*+(?:([punct_])|[^\s*]))|^_+(?:([punct*])|([^\s_]))/,
+           //        (1) and (2) can only be a Right Delimiter. (3) and (4) can only be Left.  (5) and (6) can be either Left or Right.
+           //        () Skip other delimiter (1) #***                   (2) a***#, a***                   (3) #***a, ***a                 (4) ***#              (5) #***#                 (6) a***a
+           rDelimAst: /\_\_[^_*]*?\*[^_*]*?\_\_|[punct_](\*+)(?=[\s]|$)|[^punct*_\s](\*+)(?=[punct_\s]|$)|[punct_\s](\*+)(?=[^punct*_\s])|[\s](\*+)(?=[punct_])|[punct_](\*+)(?=[punct_])|[^punct*_\s](\*+)(?=[^punct*_\s])/,
+           rDelimUnd: /\*\*[^_*]*?\_[^_*]*?\*\*|[punct*](\_+)(?=[\s]|$)|[^punct*_\s](\_+)(?=[punct*\s]|$)|[punct*\s](\_+)(?=[^punct*_\s])|[\s](\_+)(?=[punct*])|[punct*](\_+)(?=[punct*])/ // ^- Not allowed for _
+
+         },
+         code: /^(`+)([^`]|[^`][\s\S]*?[^`])\1(?!`)/,
+         br: /^( {2,}|\\)\n(?!\s*$)/,
+         del: noopTest,
+         text: /^(`+|[^`])(?:(?= {2,}\n)|[\s\S]*?(?:(?=[\\<!\[`*_]|\b_|$)|[^ ](?= {2,}\n)))/,
+         punctuation: /^([\spunctuation])/
+       }; // list of punctuation marks from CommonMark spec
+       // without * and _ to handle the different emphasis markers * and _
+
+       inline$1._punctuation = '!"#$%&\'()+\\-.,/:;<=>?@\\[\\]`^{|}~';
+       inline$1.punctuation = edit(inline$1.punctuation).replace(/punctuation/g, inline$1._punctuation).getRegex(); // sequences em should skip over [title](link), `code`, <html>
+
+       inline$1.blockSkip = /\[[^\]]*?\]\([^\)]*?\)|`[^`]*?`|<[^>]*?>/g;
+       inline$1.escapedEmSt = /\\\*|\\_/g;
+       inline$1._comment = edit(block$1._comment).replace('(?:-->|$)', '-->').getRegex();
+       inline$1.emStrong.lDelim = edit(inline$1.emStrong.lDelim).replace(/punct/g, inline$1._punctuation).getRegex();
+       inline$1.emStrong.rDelimAst = edit(inline$1.emStrong.rDelimAst, 'g').replace(/punct/g, inline$1._punctuation).getRegex();
+       inline$1.emStrong.rDelimUnd = edit(inline$1.emStrong.rDelimUnd, 'g').replace(/punct/g, inline$1._punctuation).getRegex();
+       inline$1._escapes = /\\([!"#$%&'()*+,\-./:;<=>?@\[\]\\^_`{|}~])/g;
+       inline$1._scheme = /[a-zA-Z][a-zA-Z0-9+.-]{1,31}/;
+       inline$1._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])?)+(?![-_])/;
+       inline$1.autolink = edit(inline$1.autolink).replace('scheme', inline$1._scheme).replace('email', inline$1._email).getRegex();
+       inline$1._attribute = /\s+[a-zA-Z:_][\w.:-]*(?:\s*=\s*"[^"]*"|\s*=\s*'[^']*'|\s*=\s*[^\s"'=<>`]+)?/;
+       inline$1.tag = edit(inline$1.tag).replace('comment', inline$1._comment).replace('attribute', inline$1._attribute).getRegex();
+       inline$1._label = /(?:\[(?:\\.|[^\[\]\\])*\]|\\.|`[^`]*`|[^\[\]\\`])*?/;
+       inline$1._href = /<(?:\\.|[^\n<>\\])+>|[^\s\x00-\x1f]*/;
+       inline$1._title = /"(?:\\"?|[^"\\])*"|'(?:\\'?|[^'\\])*'|\((?:\\\)?|[^)\\])*\)/;
+       inline$1.link = edit(inline$1.link).replace('label', inline$1._label).replace('href', inline$1._href).replace('title', inline$1._title).getRegex();
+       inline$1.reflink = edit(inline$1.reflink).replace('label', inline$1._label).getRegex();
+       inline$1.reflinkSearch = edit(inline$1.reflinkSearch, 'g').replace('reflink', inline$1.reflink).replace('nolink', inline$1.nolink).getRegex();
+       /**
+        * Normal Inline Grammar
+        */
+
+       inline$1.normal = merge$1({}, inline$1);
+       /**
+        * Pedantic Inline Grammar
+        */
+
+       inline$1.pedantic = merge$1({}, inline$1.normal, {
+         strong: {
+           start: /^__|\*\*/,
+           middle: /^__(?=\S)([\s\S]*?\S)__(?!_)|^\*\*(?=\S)([\s\S]*?\S)\*\*(?!\*)/,
+           endAst: /\*\*(?!\*)/g,
+           endUnd: /__(?!_)/g
+         },
+         em: {
+           start: /^_|\*/,
+           middle: /^()\*(?=\S)([\s\S]*?\S)\*(?!\*)|^_(?=\S)([\s\S]*?\S)_(?!_)/,
+           endAst: /\*(?!\*)/g,
+           endUnd: /_(?!_)/g
+         },
+         link: edit(/^!?\[(label)\]\((.*?)\)/).replace('label', inline$1._label).getRegex(),
+         reflink: edit(/^!?\[(label)\]\s*\[([^\]]*)\]/).replace('label', inline$1._label).getRegex()
+       });
+       /**
+        * GFM Inline Grammar
+        */
+
+       inline$1.gfm = merge$1({}, inline$1.normal, {
+         escape: edit(inline$1.escape).replace('])', '~|])').getRegex(),
+         _extended_email: /[A-Za-z0-9._+-]+(@)[a-zA-Z0-9-_]+(?:\.[a-zA-Z0-9-_]*[a-zA-Z0-9])+(?![-_])/,
+         url: /^((?:ftp|https?):\/\/|www\.)(?:[a-zA-Z0-9\-]+\.?)+[^\s<]*|^email/,
+         _backpedal: /(?:[^?!.,:;*_~()&]+|\([^)]*\)|&(?![a-zA-Z0-9]+;$)|[?!.,:;*_~)]+(?!$))+/,
+         del: /^(~~?)(?=[^\s~])([\s\S]*?[^\s~])\1(?=[^~]|$)/,
+         text: /^([`~]+|[^`~])(?:(?= {2,}\n)|(?=[a-zA-Z0-9.!#$%&'*+\/=?_`{\|}~-]+@)|[\s\S]*?(?:(?=[\\<!\[`*~_]|\b_|https?:\/\/|ftp:\/\/|www\.|$)|[^ ](?= {2,}\n)|[^a-zA-Z0-9.!#$%&'*+\/=?_`{\|}~-](?=[a-zA-Z0-9.!#$%&'*+\/=?_`{\|}~-]+@)))/
+       });
+       inline$1.gfm.url = edit(inline$1.gfm.url, 'i').replace('email', inline$1.gfm._extended_email).getRegex();
+       /**
+        * GFM + Line Breaks Inline Grammar
+        */
+
+       inline$1.breaks = merge$1({}, inline$1.gfm, {
+         br: edit(inline$1.br).replace('{2,}', '*').getRegex(),
+         text: edit(inline$1.gfm.text).replace('\\b_', '\\b_| {2,}\\n').replace(/\{2,\}/g, '*').getRegex()
+       });
+       var rules = {
+         block: block$1,
+         inline: inline$1
+       };
+
+       var Tokenizer$1 = Tokenizer_1;
+       var defaults$3 = defaults$5.exports.defaults;
+       var block = rules.block,
+           inline = rules.inline;
+       var repeatString = helpers.repeatString;
+       /**
+        * smartypants text replacement
+        */
+
+       function smartypants(text) {
+         return text // em-dashes
+         .replace(/---/g, "\u2014") // en-dashes
+         .replace(/--/g, "\u2013") // opening singles
+         .replace(/(^|[-\u2014/(\[{"\s])'/g, "$1\u2018") // closing singles & apostrophes
+         .replace(/'/g, "\u2019") // opening doubles
+         .replace(/(^|[-\u2014/(\[{\u2018\s])"/g, "$1\u201C") // closing doubles
+         .replace(/"/g, "\u201D") // ellipses
+         .replace(/\.{3}/g, "\u2026");
+       }
+       /**
+        * mangle email addresses
+        */
+
+
+       function mangle(text) {
+         var out = '',
+             i,
+             ch;
+         var l = text.length;
+
+         for (i = 0; i < l; i++) {
+           ch = text.charCodeAt(i);
+
+           if (Math.random() > 0.5) {
+             ch = 'x' + ch.toString(16);
+           }
+
+           out += '&#' + ch + ';';
+         }
+
+         return out;
+       }
+       /**
+        * Block Lexer
+        */
+
+
+       var Lexer_1 = /*#__PURE__*/function () {
+         function Lexer(options) {
+           _classCallCheck$1(this, Lexer);
+
+           this.tokens = [];
+           this.tokens.links = Object.create(null);
+           this.options = options || defaults$3;
+           this.options.tokenizer = this.options.tokenizer || new Tokenizer$1();
+           this.tokenizer = this.options.tokenizer;
+           this.tokenizer.options = this.options;
+           var rules = {
+             block: block.normal,
+             inline: inline.normal
+           };
+
+           if (this.options.pedantic) {
+             rules.block = block.pedantic;
+             rules.inline = inline.pedantic;
+           } else if (this.options.gfm) {
+             rules.block = block.gfm;
+
+             if (this.options.breaks) {
+               rules.inline = inline.breaks;
+             } else {
+               rules.inline = inline.gfm;
+             }
+           }
+
+           this.tokenizer.rules = rules;
+         }
+         /**
+          * Expose Rules
+          */
+
+
+         _createClass$1(Lexer, [{
+           key: "lex",
+           value:
+           /**
+            * Preprocessing
+            */
+           function lex(src) {
+             src = src.replace(/\r\n|\r/g, '\n').replace(/\t/g, '    ');
+             this.blockTokens(src, this.tokens, true);
+             this.inline(this.tokens);
+             return this.tokens;
+           }
+           /**
+            * Lexing
+            */
+
+         }, {
+           key: "blockTokens",
+           value: function blockTokens(src) {
+             var tokens = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : [];
+             var top = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : true;
+
+             if (this.options.pedantic) {
+               src = src.replace(/^ +$/gm, '');
+             }
+
+             var token, i, l, lastToken;
+
+             while (src) {
+               // newline
+               if (token = this.tokenizer.space(src)) {
+                 src = src.substring(token.raw.length);
+
+                 if (token.type) {
+                   tokens.push(token);
+                 }
+
+                 continue;
+               } // code
+
+
+               if (token = this.tokenizer.code(src)) {
+                 src = src.substring(token.raw.length);
+                 lastToken = tokens[tokens.length - 1]; // An indented code block cannot interrupt a paragraph.
+
+                 if (lastToken && lastToken.type === 'paragraph') {
+                   lastToken.raw += '\n' + token.raw;
+                   lastToken.text += '\n' + token.text;
+                 } else {
+                   tokens.push(token);
+                 }
+
+                 continue;
+               } // fences
+
+
+               if (token = this.tokenizer.fences(src)) {
+                 src = src.substring(token.raw.length);
+                 tokens.push(token);
+                 continue;
+               } // heading
+
+
+               if (token = this.tokenizer.heading(src)) {
+                 src = src.substring(token.raw.length);
+                 tokens.push(token);
+                 continue;
+               } // table no leading pipe (gfm)
+
+
+               if (token = this.tokenizer.nptable(src)) {
+                 src = src.substring(token.raw.length);
+                 tokens.push(token);
+                 continue;
+               } // hr
+
+
+               if (token = this.tokenizer.hr(src)) {
+                 src = src.substring(token.raw.length);
+                 tokens.push(token);
+                 continue;
+               } // blockquote
+
+
+               if (token = this.tokenizer.blockquote(src)) {
+                 src = src.substring(token.raw.length);
+                 token.tokens = this.blockTokens(token.text, [], top);
+                 tokens.push(token);
+                 continue;
+               } // list
+
+
+               if (token = this.tokenizer.list(src)) {
+                 src = src.substring(token.raw.length);
+                 l = token.items.length;
+
+                 for (i = 0; i < l; i++) {
+                   token.items[i].tokens = this.blockTokens(token.items[i].text, [], false);
+                 }
+
+                 tokens.push(token);
+                 continue;
+               } // html
+
+
+               if (token = this.tokenizer.html(src)) {
+                 src = src.substring(token.raw.length);
+                 tokens.push(token);
+                 continue;
+               } // def
+
+
+               if (top && (token = this.tokenizer.def(src))) {
+                 src = src.substring(token.raw.length);
+
+                 if (!this.tokens.links[token.tag]) {
+                   this.tokens.links[token.tag] = {
+                     href: token.href,
+                     title: token.title
+                   };
+                 }
+
+                 continue;
+               } // table (gfm)
+
+
+               if (token = this.tokenizer.table(src)) {
+                 src = src.substring(token.raw.length);
+                 tokens.push(token);
+                 continue;
+               } // lheading
+
+
+               if (token = this.tokenizer.lheading(src)) {
+                 src = src.substring(token.raw.length);
+                 tokens.push(token);
+                 continue;
+               } // top-level paragraph
+
+
+               if (top && (token = this.tokenizer.paragraph(src))) {
+                 src = src.substring(token.raw.length);
+                 tokens.push(token);
+                 continue;
+               } // text
+
+
+               if (token = this.tokenizer.text(src)) {
+                 src = src.substring(token.raw.length);
+                 lastToken = tokens[tokens.length - 1];
+
+                 if (lastToken && lastToken.type === 'text') {
+                   lastToken.raw += '\n' + token.raw;
+                   lastToken.text += '\n' + token.text;
+                 } else {
+                   tokens.push(token);
+                 }
+
+                 continue;
+               }
+
+               if (src) {
+                 var errMsg = 'Infinite loop on byte: ' + src.charCodeAt(0);
+
+                 if (this.options.silent) {
+                   console.error(errMsg);
+                   break;
+                 } else {
+                   throw new Error(errMsg);
+                 }
+               }
+             }
+
+             return tokens;
+           }
+         }, {
+           key: "inline",
+           value: function inline(tokens) {
+             var i, j, k, l2, row, token;
+             var l = tokens.length;
+
+             for (i = 0; i < l; i++) {
+               token = tokens[i];
+
+               switch (token.type) {
+                 case 'paragraph':
+                 case 'text':
+                 case 'heading':
+                   {
+                     token.tokens = [];
+                     this.inlineTokens(token.text, token.tokens);
+                     break;
+                   }
+
+                 case 'table':
+                   {
+                     token.tokens = {
+                       header: [],
+                       cells: []
+                     }; // header
+
+                     l2 = token.header.length;
+
+                     for (j = 0; j < l2; j++) {
+                       token.tokens.header[j] = [];
+                       this.inlineTokens(token.header[j], token.tokens.header[j]);
+                     } // cells
+
+
+                     l2 = token.cells.length;
+
+                     for (j = 0; j < l2; j++) {
+                       row = token.cells[j];
+                       token.tokens.cells[j] = [];
+
+                       for (k = 0; k < row.length; k++) {
+                         token.tokens.cells[j][k] = [];
+                         this.inlineTokens(row[k], token.tokens.cells[j][k]);
+                       }
+                     }
+
+                     break;
+                   }
+
+                 case 'blockquote':
+                   {
+                     this.inline(token.tokens);
+                     break;
+                   }
+
+                 case 'list':
+                   {
+                     l2 = token.items.length;
+
+                     for (j = 0; j < l2; j++) {
+                       this.inline(token.items[j].tokens);
+                     }
+
+                     break;
+                   }
+               }
+             }
+
+             return tokens;
+           }
+           /**
+            * Lexing/Compiling
+            */
+
+         }, {
+           key: "inlineTokens",
+           value: function inlineTokens(src) {
+             var tokens = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : [];
+             var inLink = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;
+             var inRawBlock = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : false;
+             var token, lastToken; // String with links masked to avoid interference with em and strong
+
+             var maskedSrc = src;
+             var match;
+             var keepPrevChar, prevChar; // Mask out reflinks
+
+             if (this.tokens.links) {
+               var links = Object.keys(this.tokens.links);
+
+               if (links.length > 0) {
+                 while ((match = this.tokenizer.rules.inline.reflinkSearch.exec(maskedSrc)) != null) {
+                   if (links.includes(match[0].slice(match[0].lastIndexOf('[') + 1, -1))) {
+                     maskedSrc = maskedSrc.slice(0, match.index) + '[' + repeatString('a', match[0].length - 2) + ']' + maskedSrc.slice(this.tokenizer.rules.inline.reflinkSearch.lastIndex);
+                   }
+                 }
+               }
+             } // Mask out other blocks
+
+
+             while ((match = this.tokenizer.rules.inline.blockSkip.exec(maskedSrc)) != null) {
+               maskedSrc = maskedSrc.slice(0, match.index) + '[' + repeatString('a', match[0].length - 2) + ']' + maskedSrc.slice(this.tokenizer.rules.inline.blockSkip.lastIndex);
+             } // Mask out escaped em & strong delimiters
+
+
+             while ((match = this.tokenizer.rules.inline.escapedEmSt.exec(maskedSrc)) != null) {
+               maskedSrc = maskedSrc.slice(0, match.index) + '++' + maskedSrc.slice(this.tokenizer.rules.inline.escapedEmSt.lastIndex);
+             }
+
+             while (src) {
+               if (!keepPrevChar) {
+                 prevChar = '';
+               }
+
+               keepPrevChar = false; // escape
+
+               if (token = this.tokenizer.escape(src)) {
+                 src = src.substring(token.raw.length);
+                 tokens.push(token);
+                 continue;
+               } // tag
+
+
+               if (token = this.tokenizer.tag(src, inLink, inRawBlock)) {
+                 src = src.substring(token.raw.length);
+                 inLink = token.inLink;
+                 inRawBlock = token.inRawBlock;
+                 var _lastToken = tokens[tokens.length - 1];
+
+                 if (_lastToken && token.type === 'text' && _lastToken.type === 'text') {
+                   _lastToken.raw += token.raw;
+                   _lastToken.text += token.text;
+                 } else {
+                   tokens.push(token);
+                 }
+
+                 continue;
+               } // link
+
+
+               if (token = this.tokenizer.link(src)) {
+                 src = src.substring(token.raw.length);
+
+                 if (token.type === 'link') {
+                   token.tokens = this.inlineTokens(token.text, [], true, inRawBlock);
+                 }
+
+                 tokens.push(token);
+                 continue;
+               } // reflink, nolink
+
+
+               if (token = this.tokenizer.reflink(src, this.tokens.links)) {
+                 src = src.substring(token.raw.length);
+                 var _lastToken2 = tokens[tokens.length - 1];
+
+                 if (token.type === 'link') {
+                   token.tokens = this.inlineTokens(token.text, [], true, inRawBlock);
+                   tokens.push(token);
+                 } else if (_lastToken2 && token.type === 'text' && _lastToken2.type === 'text') {
+                   _lastToken2.raw += token.raw;
+                   _lastToken2.text += token.text;
+                 } else {
+                   tokens.push(token);
+                 }
+
+                 continue;
+               } // em & strong
+
+
+               if (token = this.tokenizer.emStrong(src, maskedSrc, prevChar)) {
+                 src = src.substring(token.raw.length);
+                 token.tokens = this.inlineTokens(token.text, [], inLink, inRawBlock);
+                 tokens.push(token);
+                 continue;
+               } // code
+
+
+               if (token = this.tokenizer.codespan(src)) {
+                 src = src.substring(token.raw.length);
+                 tokens.push(token);
+                 continue;
+               } // br
+
+
+               if (token = this.tokenizer.br(src)) {
+                 src = src.substring(token.raw.length);
+                 tokens.push(token);
+                 continue;
+               } // del (gfm)
+
+
+               if (token = this.tokenizer.del(src)) {
+                 src = src.substring(token.raw.length);
+                 token.tokens = this.inlineTokens(token.text, [], inLink, inRawBlock);
+                 tokens.push(token);
+                 continue;
+               } // autolink
+
+
+               if (token = this.tokenizer.autolink(src, mangle)) {
+                 src = src.substring(token.raw.length);
+                 tokens.push(token);
+                 continue;
+               } // url (gfm)
+
+
+               if (!inLink && (token = this.tokenizer.url(src, mangle))) {
+                 src = src.substring(token.raw.length);
+                 tokens.push(token);
+                 continue;
+               } // text
+
+
+               if (token = this.tokenizer.inlineText(src, inRawBlock, smartypants)) {
+                 src = src.substring(token.raw.length);
+
+                 if (token.raw.slice(-1) !== '_') {
+                   // Track prevChar before string of ____ started
+                   prevChar = token.raw.slice(-1);
+                 }
+
+                 keepPrevChar = true;
+                 lastToken = tokens[tokens.length - 1];
+
+                 if (lastToken && lastToken.type === 'text') {
+                   lastToken.raw += token.raw;
+                   lastToken.text += token.text;
+                 } else {
+                   tokens.push(token);
+                 }
+
+                 continue;
+               }
+
+               if (src) {
+                 var errMsg = 'Infinite loop on byte: ' + src.charCodeAt(0);
+
+                 if (this.options.silent) {
+                   console.error(errMsg);
+                   break;
+                 } else {
+                   throw new Error(errMsg);
+                 }
+               }
+             }
+
+             return tokens;
+           }
+         }], [{
+           key: "rules",
+           get: function get() {
+             return {
+               block: block,
+               inline: inline
+             };
+           }
+           /**
+            * Static Lex Method
+            */
+
+         }, {
+           key: "lex",
+           value: function lex(src, options) {
+             var lexer = new Lexer(options);
+             return lexer.lex(src);
+           }
+           /**
+            * Static Lex Inline Method
+            */
+
+         }, {
+           key: "lexInline",
+           value: function lexInline(src, options) {
+             var lexer = new Lexer(options);
+             return lexer.inlineTokens(src);
+           }
+         }]);
+
+         return Lexer;
+       }();
+
+       var defaults$2 = defaults$5.exports.defaults;
+       var cleanUrl = helpers.cleanUrl,
+           escape$2 = helpers.escape;
+       /**
+        * Renderer
+        */
+
+       var Renderer_1 = /*#__PURE__*/function () {
+         function Renderer(options) {
+           _classCallCheck$1(this, Renderer);
+
+           this.options = options || defaults$2;
+         }
+
+         _createClass$1(Renderer, [{
+           key: "code",
+           value: function code(_code, infostring, escaped) {
+             var lang = (infostring || '').match(/\S*/)[0];
+
+             if (this.options.highlight) {
+               var out = this.options.highlight(_code, lang);
+
+               if (out != null && out !== _code) {
+                 escaped = true;
+                 _code = out;
+               }
+             }
+
+             _code = _code.replace(/\n$/, '') + '\n';
+
+             if (!lang) {
+               return '<pre><code>' + (escaped ? _code : escape$2(_code, true)) + '</code></pre>\n';
+             }
+
+             return '<pre><code class="' + this.options.langPrefix + escape$2(lang, true) + '">' + (escaped ? _code : escape$2(_code, true)) + '</code></pre>\n';
+           }
+         }, {
+           key: "blockquote",
+           value: function blockquote(quote) {
+             return '<blockquote>\n' + quote + '</blockquote>\n';
+           }
+         }, {
+           key: "html",
+           value: function html(_html) {
+             return _html;
+           }
+         }, {
+           key: "heading",
+           value: function heading(text, level, raw, slugger) {
+             if (this.options.headerIds) {
+               return '<h' + level + ' id="' + this.options.headerPrefix + slugger.slug(raw) + '">' + text + '</h' + level + '>\n';
+             } // ignore IDs
+
+
+             return '<h' + level + '>' + text + '</h' + level + '>\n';
+           }
+         }, {
+           key: "hr",
+           value: function hr() {
+             return this.options.xhtml ? '<hr/>\n' : '<hr>\n';
+           }
+         }, {
+           key: "list",
+           value: function list(body, ordered, start) {
+             var type = ordered ? 'ol' : 'ul',
+                 startatt = ordered && start !== 1 ? ' start="' + start + '"' : '';
+             return '<' + type + startatt + '>\n' + body + '</' + type + '>\n';
+           }
+         }, {
+           key: "listitem",
+           value: function listitem(text) {
+             return '<li>' + text + '</li>\n';
+           }
+         }, {
+           key: "checkbox",
+           value: function checkbox(checked) {
+             return '<input ' + (checked ? 'checked="" ' : '') + 'disabled="" type="checkbox"' + (this.options.xhtml ? ' /' : '') + '> ';
+           }
+         }, {
+           key: "paragraph",
+           value: function paragraph(text) {
+             return '<p>' + text + '</p>\n';
+           }
+         }, {
+           key: "table",
+           value: function table(header, body) {
+             if (body) body = '<tbody>' + body + '</tbody>';
+             return '<table>\n' + '<thead>\n' + header + '</thead>\n' + body + '</table>\n';
+           }
+         }, {
+           key: "tablerow",
+           value: function tablerow(content) {
+             return '<tr>\n' + content + '</tr>\n';
+           }
+         }, {
+           key: "tablecell",
+           value: function tablecell(content, flags) {
+             var type = flags.header ? 'th' : 'td';
+             var tag = flags.align ? '<' + type + ' align="' + flags.align + '">' : '<' + type + '>';
+             return tag + content + '</' + type + '>\n';
+           } // span level renderer
+
+         }, {
+           key: "strong",
+           value: function strong(text) {
+             return '<strong>' + text + '</strong>';
+           }
+         }, {
+           key: "em",
+           value: function em(text) {
+             return '<em>' + text + '</em>';
+           }
+         }, {
+           key: "codespan",
+           value: function codespan(text) {
+             return '<code>' + text + '</code>';
+           }
+         }, {
+           key: "br",
+           value: function br() {
+             return this.options.xhtml ? '<br/>' : '<br>';
+           }
+         }, {
+           key: "del",
+           value: function del(text) {
+             return '<del>' + text + '</del>';
+           }
+         }, {
+           key: "link",
+           value: function link(href, title, text) {
+             href = cleanUrl(this.options.sanitize, this.options.baseUrl, href);
+
+             if (href === null) {
+               return text;
+             }
+
+             var out = '<a href="' + escape$2(href) + '"';
+
+             if (title) {
+               out += ' title="' + title + '"';
+             }
+
+             out += '>' + text + '</a>';
+             return out;
+           }
+         }, {
+           key: "image",
+           value: function image(href, title, text) {
+             href = cleanUrl(this.options.sanitize, this.options.baseUrl, href);
+
+             if (href === null) {
+               return text;
+             }
+
+             var out = '<img src="' + href + '" alt="' + text + '"';
+
+             if (title) {
+               out += ' title="' + title + '"';
+             }
+
+             out += this.options.xhtml ? '/>' : '>';
+             return out;
+           }
+         }, {
+           key: "text",
+           value: function text(_text) {
+             return _text;
+           }
+         }]);
+
+         return Renderer;
+       }();
+
+       var TextRenderer_1 = /*#__PURE__*/function () {
+         function TextRenderer() {
+           _classCallCheck$1(this, TextRenderer);
+         }
+
+         _createClass$1(TextRenderer, [{
+           key: "strong",
+           value: // no need for block level renderers
+           function strong(text) {
+             return text;
+           }
+         }, {
+           key: "em",
+           value: function em(text) {
+             return text;
+           }
+         }, {
+           key: "codespan",
+           value: function codespan(text) {
+             return text;
+           }
+         }, {
+           key: "del",
+           value: function del(text) {
+             return text;
+           }
+         }, {
+           key: "html",
+           value: function html(text) {
+             return text;
+           }
+         }, {
+           key: "text",
+           value: function text(_text) {
+             return _text;
+           }
+         }, {
+           key: "link",
+           value: function link(href, title, text) {
+             return '' + text;
+           }
+         }, {
+           key: "image",
+           value: function image(href, title, text) {
+             return '' + text;
+           }
+         }, {
+           key: "br",
+           value: function br() {
+             return '';
+           }
+         }]);
+
+         return TextRenderer;
+       }();
+
+       var Slugger_1 = /*#__PURE__*/function () {
+         function Slugger() {
+           _classCallCheck$1(this, Slugger);
+
+           this.seen = {};
+         }
+
+         _createClass$1(Slugger, [{
+           key: "serialize",
+           value: function serialize(value) {
+             return value.toLowerCase().trim() // remove html tags
+             .replace(/<[!\/a-z].*?>/ig, '') // remove unwanted chars
+             .replace(/[\u2000-\u206F\u2E00-\u2E7F\\'!"#$%&()*+,./:;<=>?@[\]^`{|}~]/g, '').replace(/\s/g, '-');
+           }
+           /**
+            * Finds the next safe (unique) slug to use
+            */
+
+         }, {
+           key: "getNextSafeSlug",
+           value: function getNextSafeSlug(originalSlug, isDryRun) {
+             var slug = originalSlug;
+             var occurenceAccumulator = 0;
+
+             if (this.seen.hasOwnProperty(slug)) {
+               occurenceAccumulator = this.seen[originalSlug];
+
+               do {
+                 occurenceAccumulator++;
+                 slug = originalSlug + '-' + occurenceAccumulator;
+               } while (this.seen.hasOwnProperty(slug));
+             }
+
+             if (!isDryRun) {
+               this.seen[originalSlug] = occurenceAccumulator;
+               this.seen[slug] = 0;
+             }
+
+             return slug;
+           }
+           /**
+            * Convert string to unique id
+            * @param {object} options
+            * @param {boolean} options.dryrun Generates the next unique slug without updating the internal accumulator.
+            */
+
+         }, {
+           key: "slug",
+           value: function slug(value) {
+             var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
+             var slug = this.serialize(value);
+             return this.getNextSafeSlug(slug, options.dryrun);
+           }
+         }]);
+
+         return Slugger;
+       }();
+
+       var Renderer$1 = Renderer_1;
+       var TextRenderer$1 = TextRenderer_1;
+       var Slugger$1 = Slugger_1;
+       var defaults$1 = defaults$5.exports.defaults;
+       var unescape$1 = helpers.unescape;
+       /**
+        * Parsing & Compiling
+        */
+
+       var Parser_1 = /*#__PURE__*/function () {
+         function Parser(options) {
+           _classCallCheck$1(this, Parser);
+
+           this.options = options || defaults$1;
+           this.options.renderer = this.options.renderer || new Renderer$1();
+           this.renderer = this.options.renderer;
+           this.renderer.options = this.options;
+           this.textRenderer = new TextRenderer$1();
+           this.slugger = new Slugger$1();
+         }
+         /**
+          * Static Parse Method
+          */
+
+
+         _createClass$1(Parser, [{
+           key: "parse",
+           value:
+           /**
+            * Parse Loop
+            */
+           function parse(tokens) {
+             var top = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;
+             var out = '',
+                 i,
+                 j,
+                 k,
+                 l2,
+                 l3,
+                 row,
+                 cell,
+                 header,
+                 body,
+                 token,
+                 ordered,
+                 start,
+                 loose,
+                 itemBody,
+                 item,
+                 checked,
+                 task,
+                 checkbox;
+             var l = tokens.length;
+
+             for (i = 0; i < l; i++) {
+               token = tokens[i];
+
+               switch (token.type) {
+                 case 'space':
+                   {
+                     continue;
+                   }
+
+                 case 'hr':
+                   {
+                     out += this.renderer.hr();
+                     continue;
+                   }
+
+                 case 'heading':
+                   {
+                     out += this.renderer.heading(this.parseInline(token.tokens), token.depth, unescape$1(this.parseInline(token.tokens, this.textRenderer)), this.slugger);
+                     continue;
+                   }
+
+                 case 'code':
+                   {
+                     out += this.renderer.code(token.text, token.lang, token.escaped);
+                     continue;
+                   }
+
+                 case 'table':
+                   {
+                     header = ''; // header
+
+                     cell = '';
+                     l2 = token.header.length;
+
+                     for (j = 0; j < l2; j++) {
+                       cell += this.renderer.tablecell(this.parseInline(token.tokens.header[j]), {
+                         header: true,
+                         align: token.align[j]
+                       });
+                     }
+
+                     header += this.renderer.tablerow(cell);
+                     body = '';
+                     l2 = token.cells.length;
+
+                     for (j = 0; j < l2; j++) {
+                       row = token.tokens.cells[j];
+                       cell = '';
+                       l3 = row.length;
+
+                       for (k = 0; k < l3; k++) {
+                         cell += this.renderer.tablecell(this.parseInline(row[k]), {
+                           header: false,
+                           align: token.align[k]
+                         });
+                       }
+
+                       body += this.renderer.tablerow(cell);
+                     }
+
+                     out += this.renderer.table(header, body);
+                     continue;
+                   }
+
+                 case 'blockquote':
+                   {
+                     body = this.parse(token.tokens);
+                     out += this.renderer.blockquote(body);
+                     continue;
+                   }
+
+                 case 'list':
+                   {
+                     ordered = token.ordered;
+                     start = token.start;
+                     loose = token.loose;
+                     l2 = token.items.length;
+                     body = '';
+
+                     for (j = 0; j < l2; j++) {
+                       item = token.items[j];
+                       checked = item.checked;
+                       task = item.task;
+                       itemBody = '';
+
+                       if (item.task) {
+                         checkbox = this.renderer.checkbox(checked);
+
+                         if (loose) {
+                           if (item.tokens.length > 0 && item.tokens[0].type === 'text') {
+                             item.tokens[0].text = checkbox + ' ' + item.tokens[0].text;
+
+                             if (item.tokens[0].tokens && item.tokens[0].tokens.length > 0 && item.tokens[0].tokens[0].type === 'text') {
+                               item.tokens[0].tokens[0].text = checkbox + ' ' + item.tokens[0].tokens[0].text;
+                             }
+                           } else {
+                             item.tokens.unshift({
+                               type: 'text',
+                               text: checkbox
+                             });
+                           }
+                         } else {
+                           itemBody += checkbox;
+                         }
+                       }
+
+                       itemBody += this.parse(item.tokens, loose);
+                       body += this.renderer.listitem(itemBody, task, checked);
+                     }
+
+                     out += this.renderer.list(body, ordered, start);
+                     continue;
+                   }
+
+                 case 'html':
+                   {
+                     // TODO parse inline content if parameter markdown=1
+                     out += this.renderer.html(token.text);
+                     continue;
+                   }
+
+                 case 'paragraph':
+                   {
+                     out += this.renderer.paragraph(this.parseInline(token.tokens));
+                     continue;
+                   }
+
+                 case 'text':
+                   {
+                     body = token.tokens ? this.parseInline(token.tokens) : token.text;
+
+                     while (i + 1 < l && tokens[i + 1].type === 'text') {
+                       token = tokens[++i];
+                       body += '\n' + (token.tokens ? this.parseInline(token.tokens) : token.text);
+                     }
+
+                     out += top ? this.renderer.paragraph(body) : body;
+                     continue;
+                   }
+
+                 default:
+                   {
+                     var errMsg = 'Token with "' + token.type + '" type was not found.';
+
+                     if (this.options.silent) {
+                       console.error(errMsg);
+                       return;
+                     } else {
+                       throw new Error(errMsg);
+                     }
+                   }
+               }
+             }
+
+             return out;
+           }
+           /**
+            * Parse Inline Tokens
+            */
+
+         }, {
+           key: "parseInline",
+           value: function parseInline(tokens, renderer) {
+             renderer = renderer || this.renderer;
+             var out = '',
+                 i,
+                 token;
+             var l = tokens.length;
+
+             for (i = 0; i < l; i++) {
+               token = tokens[i];
+
+               switch (token.type) {
+                 case 'escape':
+                   {
+                     out += renderer.text(token.text);
+                     break;
+                   }
+
+                 case 'html':
+                   {
+                     out += renderer.html(token.text);
+                     break;
+                   }
+
+                 case 'link':
+                   {
+                     out += renderer.link(token.href, token.title, this.parseInline(token.tokens, renderer));
+                     break;
+                   }
+
+                 case 'image':
+                   {
+                     out += renderer.image(token.href, token.title, token.text);
+                     break;
+                   }
+
+                 case 'strong':
+                   {
+                     out += renderer.strong(this.parseInline(token.tokens, renderer));
+                     break;
+                   }
+
+                 case 'em':
+                   {
+                     out += renderer.em(this.parseInline(token.tokens, renderer));
+                     break;
+                   }
+
+                 case 'codespan':
+                   {
+                     out += renderer.codespan(token.text);
+                     break;
+                   }
+
+                 case 'br':
+                   {
+                     out += renderer.br();
+                     break;
+                   }
+
+                 case 'del':
+                   {
+                     out += renderer.del(this.parseInline(token.tokens, renderer));
+                     break;
+                   }
+
+                 case 'text':
+                   {
+                     out += renderer.text(token.text);
+                     break;
+                   }
+
+                 default:
+                   {
+                     var errMsg = 'Token with "' + token.type + '" type was not found.';
+
+                     if (this.options.silent) {
+                       console.error(errMsg);
+                       return;
+                     } else {
+                       throw new Error(errMsg);
+                     }
+                   }
+               }
+             }
+
+             return out;
+           }
+         }], [{
+           key: "parse",
+           value: function parse(tokens, options) {
+             var parser = new Parser(options);
+             return parser.parse(tokens);
+           }
+           /**
+            * Static Parse Inline Method
+            */
+
+         }, {
+           key: "parseInline",
+           value: function parseInline(tokens, options) {
+             var parser = new Parser(options);
+             return parser.parseInline(tokens);
+           }
+         }]);
+
+         return Parser;
+       }();
+
+       var Lexer = Lexer_1;
+       var Parser = Parser_1;
+       var Tokenizer = Tokenizer_1;
+       var Renderer = Renderer_1;
+       var TextRenderer = TextRenderer_1;
+       var Slugger = Slugger_1;
+       var merge = helpers.merge,
+           checkSanitizeDeprecation = helpers.checkSanitizeDeprecation,
+           escape$1 = helpers.escape;
+       var getDefaults = defaults$5.exports.getDefaults,
+           changeDefaults = defaults$5.exports.changeDefaults,
+           defaults = defaults$5.exports.defaults;
+       /**
+        * Marked
+        */
+
+       function marked(src, opt, callback) {
+         // throw error in case of non string input
+         if (typeof src === 'undefined' || src === null) {
+           throw new Error('marked(): input parameter is undefined or null');
+         }
+
+         if (typeof src !== 'string') {
+           throw new Error('marked(): input parameter is of type ' + Object.prototype.toString.call(src) + ', string expected');
+         }
+
+         if (typeof opt === 'function') {
+           callback = opt;
+           opt = null;
+         }
+
+         opt = merge({}, marked.defaults, opt || {});
+         checkSanitizeDeprecation(opt);
+
+         if (callback) {
+           var highlight = opt.highlight;
+           var tokens;
+
+           try {
+             tokens = Lexer.lex(src, opt);
+           } catch (e) {
+             return callback(e);
+           }
+
+           var done = function done(err) {
+             var out;
+
+             if (!err) {
+               try {
+                 if (opt.walkTokens) {
+                   marked.walkTokens(tokens, opt.walkTokens);
+                 }
+
+                 out = Parser.parse(tokens, opt);
+               } catch (e) {
+                 err = e;
+               }
+             }
+
+             opt.highlight = highlight;
+             return err ? callback(err) : callback(null, out);
+           };
+
+           if (!highlight || highlight.length < 3) {
+             return done();
+           }
+
+           delete opt.highlight;
+           if (!tokens.length) return done();
+           var pending = 0;
+           marked.walkTokens(tokens, function (token) {
+             if (token.type === 'code') {
+               pending++;
+               setTimeout(function () {
+                 highlight(token.text, token.lang, function (err, code) {
+                   if (err) {
+                     return done(err);
+                   }
+
+                   if (code != null && code !== token.text) {
+                     token.text = code;
+                     token.escaped = true;
+                   }
+
+                   pending--;
+
+                   if (pending === 0) {
+                     done();
+                   }
+                 });
+               }, 0);
+             }
+           });
+
+           if (pending === 0) {
+             done();
+           }
+
+           return;
+         }
+
+         try {
+           var _tokens = Lexer.lex(src, opt);
+
+           if (opt.walkTokens) {
+             marked.walkTokens(_tokens, opt.walkTokens);
+           }
+
+           return Parser.parse(_tokens, opt);
+         } catch (e) {
+           e.message += '\nPlease report this to https://github.com/markedjs/marked.';
+
+           if (opt.silent) {
+             return '<p>An error occurred:</p><pre>' + escape$1(e.message + '', true) + '</pre>';
+           }
+
+           throw e;
+         }
+       }
+       /**
+        * Options
+        */
+
+
+       marked.options = marked.setOptions = function (opt) {
+         merge(marked.defaults, opt);
+         changeDefaults(marked.defaults);
+         return marked;
+       };
+
+       marked.getDefaults = getDefaults;
+       marked.defaults = defaults;
+       /**
+        * Use Extension
+        */
+
+       marked.use = function (extension) {
+         var opts = merge({}, extension);
+
+         if (extension.renderer) {
+           (function () {
+             var renderer = marked.defaults.renderer || new Renderer();
+
+             var _loop = function _loop(prop) {
+               var prevRenderer = renderer[prop];
+
+               renderer[prop] = function () {
+                 for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
+                   args[_key] = arguments[_key];
+                 }
+
+                 var ret = extension.renderer[prop].apply(renderer, args);
+
+                 if (ret === false) {
+                   ret = prevRenderer.apply(renderer, args);
+                 }
+
+                 return ret;
+               };
+             };
+
+             for (var prop in extension.renderer) {
+               _loop(prop);
+             }
+
+             opts.renderer = renderer;
+           })();
+         }
+
+         if (extension.tokenizer) {
+           (function () {
+             var tokenizer = marked.defaults.tokenizer || new Tokenizer();
+
+             var _loop2 = function _loop2(prop) {
+               var prevTokenizer = tokenizer[prop];
+
+               tokenizer[prop] = function () {
+                 for (var _len2 = arguments.length, args = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {
+                   args[_key2] = arguments[_key2];
+                 }
+
+                 var ret = extension.tokenizer[prop].apply(tokenizer, args);
+
+                 if (ret === false) {
+                   ret = prevTokenizer.apply(tokenizer, args);
+                 }
+
+                 return ret;
+               };
+             };
+
+             for (var prop in extension.tokenizer) {
+               _loop2(prop);
+             }
+
+             opts.tokenizer = tokenizer;
+           })();
+         }
+
+         if (extension.walkTokens) {
+           var walkTokens = marked.defaults.walkTokens;
+
+           opts.walkTokens = function (token) {
+             extension.walkTokens(token);
+
+             if (walkTokens) {
+               walkTokens(token);
+             }
+           };
+         }
+
+         marked.setOptions(opts);
+       };
+       /**
+        * Run callback for every token
+        */
+
+
+       marked.walkTokens = function (tokens, callback) {
+         var _iterator = _createForOfIteratorHelper(tokens),
+             _step;
+
+         try {
+           for (_iterator.s(); !(_step = _iterator.n()).done;) {
+             var token = _step.value;
+             callback(token);
+
+             switch (token.type) {
+               case 'table':
+                 {
+                   var _iterator2 = _createForOfIteratorHelper(token.tokens.header),
+                       _step2;
+
+                   try {
+                     for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) {
+                       var cell = _step2.value;
+                       marked.walkTokens(cell, callback);
+                     }
+                   } catch (err) {
+                     _iterator2.e(err);
+                   } finally {
+                     _iterator2.f();
+                   }
+
+                   var _iterator3 = _createForOfIteratorHelper(token.tokens.cells),
+                       _step3;
+
+                   try {
+                     for (_iterator3.s(); !(_step3 = _iterator3.n()).done;) {
+                       var row = _step3.value;
+
+                       var _iterator4 = _createForOfIteratorHelper(row),
+                           _step4;
+
+                       try {
+                         for (_iterator4.s(); !(_step4 = _iterator4.n()).done;) {
+                           var _cell = _step4.value;
+                           marked.walkTokens(_cell, callback);
+                         }
+                       } catch (err) {
+                         _iterator4.e(err);
+                       } finally {
+                         _iterator4.f();
+                       }
+                     }
+                   } catch (err) {
+                     _iterator3.e(err);
+                   } finally {
+                     _iterator3.f();
+                   }
+
+                   break;
+                 }
+
+               case 'list':
+                 {
+                   marked.walkTokens(token.items, callback);
+                   break;
+                 }
+
+               default:
+                 {
+                   if (token.tokens) {
+                     marked.walkTokens(token.tokens, callback);
+                   }
+                 }
+             }
+           }
+         } catch (err) {
+           _iterator.e(err);
+         } finally {
+           _iterator.f();
+         }
+       };
+       /**
+        * Parse Inline
+        */
+
+
+       marked.parseInline = function (src, opt) {
+         // throw error in case of non string input
+         if (typeof src === 'undefined' || src === null) {
+           throw new Error('marked.parseInline(): input parameter is undefined or null');
+         }
+
+         if (typeof src !== 'string') {
+           throw new Error('marked.parseInline(): input parameter is of type ' + Object.prototype.toString.call(src) + ', string expected');
+         }
+
+         opt = merge({}, marked.defaults, opt || {});
+         checkSanitizeDeprecation(opt);
+
+         try {
+           var tokens = Lexer.lexInline(src, opt);
+
+           if (opt.walkTokens) {
+             marked.walkTokens(tokens, opt.walkTokens);
+           }
+
+           return Parser.parseInline(tokens, opt);
+         } catch (e) {
+           e.message += '\nPlease report this to https://github.com/markedjs/marked.';
+
+           if (opt.silent) {
+             return '<p>An error occurred:</p><pre>' + escape$1(e.message + '', true) + '</pre>';
+           }
+
+           throw e;
+         }
+       };
+       /**
+        * Expose
+        */
+
+
+       marked.Parser = Parser;
+       marked.parser = Parser.parse;
+       marked.Renderer = Renderer;
+       marked.TextRenderer = TextRenderer;
+       marked.Lexer = Lexer;
+       marked.lexer = Lexer.lex;
+       marked.Tokenizer = Tokenizer;
+       marked.Slugger = Slugger;
+       marked.parse = marked;
+       var marked_1 = marked;
+
+       var tiler$4 = utilTiler();
+       var dispatch$5 = dispatch$8('loaded');
+       var _tileZoom$1 = 14;
+       var _osmoseUrlRoot = 'https://osmose.openstreetmap.fr/api/0.3';
+       var _osmoseData = {
+         icons: {},
+         items: []
+       }; // This gets reassigned if reset
+
+       var _cache;
+
+       function abortRequest$4(controller) {
+         if (controller) {
+           controller.abort();
+         }
+       }
+
+       function abortUnwantedRequests$1(cache, tiles) {
+         Object.keys(cache.inflightTile).forEach(function (k) {
+           var wanted = tiles.find(function (tile) {
+             return k === tile.id;
+           });
+
+           if (!wanted) {
+             abortRequest$4(cache.inflightTile[k]);
+             delete cache.inflightTile[k];
+           }
+         });
+       }
+
+       function encodeIssueRtree(d) {
+         return {
+           minX: d.loc[0],
+           minY: d.loc[1],
+           maxX: d.loc[0],
+           maxY: d.loc[1],
+           data: d
+         };
+       } // Replace or remove QAItem from rtree
+
+
+       function updateRtree$1(item, replace) {
+         _cache.rtree.remove(item, function (a, b) {
+           return a.data.id === b.data.id;
+         });
+
+         if (replace) {
+           _cache.rtree.insert(item);
+         }
+       } // Issues shouldn't obscure each other
+
+
+       function preventCoincident(loc) {
+         var coincident = false;
+
+         do {
+           // first time, move marker up. after that, move marker right.
+           var delta = coincident ? [0.00001, 0] : [0, 0.00001];
+           loc = geoVecAdd(loc, delta);
+           var bbox = geoExtent(loc).bbox();
+           coincident = _cache.rtree.search(bbox).length;
+         } while (coincident);
+
+         return loc;
+       }
+
+       var serviceOsmose = {
+         title: 'osmose',
+         init: function init() {
+           _mainFileFetcher.get('qa_data').then(function (d) {
+             _osmoseData = d.osmose;
+             _osmoseData.items = Object.keys(d.osmose.icons).map(function (s) {
+               return s.split('-')[0];
+             }).reduce(function (unique, item) {
+               return unique.indexOf(item) !== -1 ? unique : [].concat(_toConsumableArray(unique), [item]);
+             }, []);
+           });
+
+           if (!_cache) {
+             this.reset();
+           }
+
+           this.event = utilRebind(this, dispatch$5, 'on');
+         },
+         reset: function reset() {
+           var _strings = {};
+           var _colors = {};
+
+           if (_cache) {
+             Object.values(_cache.inflightTile).forEach(abortRequest$4); // Strings and colors are static and should not be re-populated
+
+             _strings = _cache.strings;
+             _colors = _cache.colors;
+           }
+
+           _cache = {
+             data: {},
+             loadedTile: {},
+             inflightTile: {},
+             inflightPost: {},
+             closed: {},
+             rtree: new RBush(),
+             strings: _strings,
+             colors: _colors
+           };
+         },
+         loadIssues: function loadIssues(projection) {
+           var _this = this;
+
+           var params = {
+             // Tiles return a maximum # of issues
+             // So we want to filter our request for only types iD supports
+             item: _osmoseData.items
+           }; // determine the needed tiles to cover the view
+
+           var tiles = tiler$4.zoomExtent([_tileZoom$1, _tileZoom$1]).getTiles(projection); // abort inflight requests that are no longer needed
+
+           abortUnwantedRequests$1(_cache, tiles); // issue new requests..
+
+           tiles.forEach(function (tile) {
+             if (_cache.loadedTile[tile.id] || _cache.inflightTile[tile.id]) return;
+
+             var _tile$xyz = _slicedToArray(tile.xyz, 3),
+                 x = _tile$xyz[0],
+                 y = _tile$xyz[1],
+                 z = _tile$xyz[2];
+
+             var url = "".concat(_osmoseUrlRoot, "/issues/").concat(z, "/").concat(x, "/").concat(y, ".json?") + utilQsString(params);
+             var controller = new AbortController();
+             _cache.inflightTile[tile.id] = controller;
+             d3_json(url, {
+               signal: controller.signal
+             }).then(function (data) {
+               delete _cache.inflightTile[tile.id];
+               _cache.loadedTile[tile.id] = true;
+
+               if (data.features) {
+                 data.features.forEach(function (issue) {
+                   var _issue$properties = issue.properties,
+                       item = _issue$properties.item,
+                       cl = _issue$properties["class"],
+                       id = _issue$properties.uuid;
+                   /* Osmose issues are uniquely identified by a unique
+                     `item` and `class` combination (both integer values) */
+
+                   var itemType = "".concat(item, "-").concat(cl); // Filter out unsupported issue types (some are too specific or advanced)
+
+                   if (itemType in _osmoseData.icons) {
+                     var loc = issue.geometry.coordinates; // lon, lat
+
+                     loc = preventCoincident(loc);
+                     var d = new QAItem(loc, _this, itemType, id, {
+                       item: item
+                     }); // Setting elems here prevents UI detail requests
+
+                     if (item === 8300 || item === 8360) {
+                       d.elems = [];
+                     }
+
+                     _cache.data[d.id] = d;
+
+                     _cache.rtree.insert(encodeIssueRtree(d));
+                   }
+                 });
+               }
+
+               dispatch$5.call('loaded');
+             })["catch"](function () {
+               delete _cache.inflightTile[tile.id];
+               _cache.loadedTile[tile.id] = true;
+             });
+           });
+         },
+         loadIssueDetail: function loadIssueDetail(issue) {
+           var _this2 = this;
+
+           // Issue details only need to be fetched once
+           if (issue.elems !== undefined) {
+             return Promise.resolve(issue);
+           }
+
+           var url = "".concat(_osmoseUrlRoot, "/issue/").concat(issue.id, "?langs=").concat(_mainLocalizer.localeCode());
+
+           var cacheDetails = function cacheDetails(data) {
+             // Associated elements used for highlighting
+             // Assign directly for immediate use in the callback
+             issue.elems = data.elems.map(function (e) {
+               return e.type.substring(0, 1) + e.id;
+             }); // Some issues have instance specific detail in a subtitle
+
+             issue.detail = data.subtitle ? marked_1(data.subtitle.auto) : '';
+
+             _this2.replaceItem(issue);
+           };
+
+           return d3_json(url).then(cacheDetails).then(function () {
+             return issue;
+           });
+         },
+         loadStrings: function loadStrings() {
+           var locale = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : _mainLocalizer.localeCode();
+           var items = Object.keys(_osmoseData.icons);
+
+           if (locale in _cache.strings && Object.keys(_cache.strings[locale]).length === items.length) {
+             return Promise.resolve(_cache.strings[locale]);
+           } // May be partially populated already if some requests were successful
+
+
+           if (!(locale in _cache.strings)) {
+             _cache.strings[locale] = {};
+           } // Only need to cache strings for supported issue types
+           // Using multiple individual item + class requests to reduce fetched data size
+
+
+           var allRequests = items.map(function (itemType) {
+             // No need to request data we already have
+             if (itemType in _cache.strings[locale]) return null;
+
+             var cacheData = function cacheData(data) {
+               // Bunch of nested single value arrays of objects
+               var _data$categories = _slicedToArray(data.categories, 1),
+                   _data$categories$ = _data$categories[0],
+                   cat = _data$categories$ === void 0 ? {
+                 items: []
+               } : _data$categories$;
+
+               var _cat$items = _slicedToArray(cat.items, 1),
+                   _cat$items$ = _cat$items[0],
+                   item = _cat$items$ === void 0 ? {
+                 "class": []
+               } : _cat$items$;
+
+               var _item$class = _slicedToArray(item["class"], 1),
+                   _item$class$ = _item$class[0],
+                   cl = _item$class$ === void 0 ? null : _item$class$; // If null default value is reached, data wasn't as expected (or was empty)
+
+
+               if (!cl) {
+                 /* eslint-disable no-console */
+                 console.log("Osmose strings request (".concat(itemType, ") had unexpected data"));
+                 /* eslint-enable no-console */
+
+                 return;
+               } // Cache served item colors to automatically style issue markers later
+
+
+               var itemInt = item.item,
+                   color = item.color;
+
+               if (/^#[A-Fa-f0-9]{6}|[A-Fa-f0-9]{3}/.test(color)) {
+                 _cache.colors[itemInt] = color;
+               } // Value of root key will be null if no string exists
+               // If string exists, value is an object with key 'auto' for string
+
+
+               var title = cl.title,
+                   detail = cl.detail,
+                   fix = cl.fix,
+                   trap = cl.trap; // Osmose titles shouldn't contain markdown
+
+               var issueStrings = {};
+               if (title) issueStrings.title = title.auto;
+               if (detail) issueStrings.detail = marked_1(detail.auto);
+               if (trap) issueStrings.trap = marked_1(trap.auto);
+               if (fix) issueStrings.fix = marked_1(fix.auto);
+               _cache.strings[locale][itemType] = issueStrings;
+             };
+
+             var _itemType$split = itemType.split('-'),
+                 _itemType$split2 = _slicedToArray(_itemType$split, 2),
+                 item = _itemType$split2[0],
+                 cl = _itemType$split2[1]; // Osmose API falls back to English strings where untranslated or if locale doesn't exist
+
+
+             var url = "".concat(_osmoseUrlRoot, "/items/").concat(item, "/class/").concat(cl, "?langs=").concat(locale);
+             return d3_json(url).then(cacheData);
+           }).filter(Boolean);
+           return Promise.all(allRequests).then(function () {
+             return _cache.strings[locale];
+           });
+         },
+         getStrings: function getStrings(itemType) {
+           var locale = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : _mainLocalizer.localeCode();
+           // No need to fallback to English, Osmose API handles this for us
+           return locale in _cache.strings ? _cache.strings[locale][itemType] : {};
+         },
+         getColor: function getColor(itemType) {
+           return itemType in _cache.colors ? _cache.colors[itemType] : '#FFFFFF';
+         },
+         postUpdate: function postUpdate(issue, callback) {
+           var _this3 = this;
+
+           if (_cache.inflightPost[issue.id]) {
+             return callback({
+               message: 'Issue update already inflight',
+               status: -2
+             }, issue);
+           } // UI sets the status to either 'done' or 'false'
+
+
+           var url = "".concat(_osmoseUrlRoot, "/issue/").concat(issue.id, "/").concat(issue.newStatus);
+           var controller = new AbortController();
+
+           var after = function after() {
+             delete _cache.inflightPost[issue.id];
+
+             _this3.removeItem(issue);
+
+             if (issue.newStatus === 'done') {
+               // Keep track of the number of issues closed per `item` to tag the changeset
+               if (!(issue.item in _cache.closed)) {
+                 _cache.closed[issue.item] = 0;
+               }
+
+               _cache.closed[issue.item] += 1;
+             }
+
+             if (callback) callback(null, issue);
+           };
+
+           _cache.inflightPost[issue.id] = controller;
+           fetch(url, {
+             signal: controller.signal
+           }).then(after)["catch"](function (err) {
+             delete _cache.inflightPost[issue.id];
+             if (callback) callback(err.message);
+           });
+         },
+         // Get all cached QAItems covering the viewport
+         getItems: function getItems(projection) {
+           var viewport = projection.clipExtent();
+           var min = [viewport[0][0], viewport[1][1]];
+           var max = [viewport[1][0], viewport[0][1]];
+           var bbox = geoExtent(projection.invert(min), projection.invert(max)).bbox();
+           return _cache.rtree.search(bbox).map(function (d) {
+             return d.data;
+           });
+         },
+         // Get a QAItem from cache
+         // NOTE: Don't change method name until UI v3 is merged
+         getError: function getError(id) {
+           return _cache.data[id];
+         },
+         // get the name of the icon to display for this item
+         getIcon: function getIcon(itemType) {
+           return _osmoseData.icons[itemType];
+         },
+         // Replace a single QAItem in the cache
+         replaceItem: function replaceItem(item) {
+           if (!(item instanceof QAItem) || !item.id) return;
+           _cache.data[item.id] = item;
+           updateRtree$1(encodeIssueRtree(item), true); // true = replace
+
+           return item;
+         },
+         // Remove a single QAItem from the cache
+         removeItem: function removeItem(item) {
+           if (!(item instanceof QAItem) || !item.id) return;
+           delete _cache.data[item.id];
+           updateRtree$1(encodeIssueRtree(item), false); // false = remove
+         },
+         // Used to populate `closed:osmose:*` changeset tags
+         getClosedCounts: function getClosedCounts() {
+           return _cache.closed;
+         },
+         itemURL: function itemURL(item) {
+           return "https://osmose.openstreetmap.fr/en/error/".concat(item.id);
+         }
+       };
+
+       var ieee754$1 = {};
+
+       /*! ieee754. BSD-3-Clause License. Feross Aboukhadijeh <https://feross.org/opensource> */
+
+       ieee754$1.read = function (buffer, offset, isLE, mLen, nBytes) {
+         var e, m;
+         var eLen = nBytes * 8 - mLen - 1;
+         var eMax = (1 << eLen) - 1;
+         var eBias = eMax >> 1;
+         var nBits = -7;
+         var i = isLE ? nBytes - 1 : 0;
+         var d = isLE ? -1 : 1;
+         var s = buffer[offset + i];
+         i += d;
+         e = s & (1 << -nBits) - 1;
+         s >>= -nBits;
+         nBits += eLen;
+
+         for (; nBits > 0; e = e * 256 + buffer[offset + i], i += d, nBits -= 8) {}
+
+         m = e & (1 << -nBits) - 1;
+         e >>= -nBits;
+         nBits += mLen;
+
+         for (; nBits > 0; m = m * 256 + buffer[offset + i], i += d, nBits -= 8) {}
+
+         if (e === 0) {
+           e = 1 - eBias;
+         } else if (e === eMax) {
+           return m ? NaN : (s ? -1 : 1) * Infinity;
+         } else {
+           m = m + Math.pow(2, mLen);
+           e = e - eBias;
+         }
+
+         return (s ? -1 : 1) * m * Math.pow(2, e - mLen);
+       };
+
+       ieee754$1.write = function (buffer, value, offset, isLE, mLen, nBytes) {
+         var e, m, c;
+         var eLen = nBytes * 8 - mLen - 1;
+         var eMax = (1 << eLen) - 1;
+         var eBias = eMax >> 1;
+         var rt = mLen === 23 ? Math.pow(2, -24) - Math.pow(2, -77) : 0;
+         var i = isLE ? 0 : nBytes - 1;
+         var d = isLE ? 1 : -1;
+         var s = value < 0 || value === 0 && 1 / value < 0 ? 1 : 0;
+         value = Math.abs(value);
+
+         if (isNaN(value) || value === Infinity) {
+           m = isNaN(value) ? 1 : 0;
+           e = eMax;
+         } else {
+           e = Math.floor(Math.log(value) / Math.LN2);
+
+           if (value * (c = Math.pow(2, -e)) < 1) {
+             e--;
+             c *= 2;
+           }
+
+           if (e + eBias >= 1) {
+             value += rt / c;
+           } else {
+             value += rt * Math.pow(2, 1 - eBias);
+           }
+
+           if (value * c >= 2) {
+             e++;
+             c /= 2;
+           }
+
+           if (e + eBias >= eMax) {
+             m = 0;
+             e = eMax;
+           } else if (e + eBias >= 1) {
+             m = (value * c - 1) * Math.pow(2, mLen);
+             e = e + eBias;
+           } else {
+             m = value * Math.pow(2, eBias - 1) * Math.pow(2, mLen);
+             e = 0;
+           }
+         }
+
+         for (; mLen >= 8; buffer[offset + i] = m & 0xff, i += d, m /= 256, mLen -= 8) {}
+
+         e = e << mLen | m;
+         eLen += mLen;
+
+         for (; eLen > 0; buffer[offset + i] = e & 0xff, i += d, e /= 256, eLen -= 8) {}
+
+         buffer[offset + i - d] |= s * 128;
+       };
+
+       var pbf = Pbf;
+       var ieee754 = ieee754$1;
+
+       function Pbf(buf) {
+         this.buf = ArrayBuffer.isView && ArrayBuffer.isView(buf) ? buf : new Uint8Array(buf || 0);
+         this.pos = 0;
+         this.type = 0;
+         this.length = this.buf.length;
+       }
+
+       Pbf.Varint = 0; // varint: int32, int64, uint32, uint64, sint32, sint64, bool, enum
+
+       Pbf.Fixed64 = 1; // 64-bit: double, fixed64, sfixed64
+
+       Pbf.Bytes = 2; // length-delimited: string, bytes, embedded messages, packed repeated fields
+
+       Pbf.Fixed32 = 5; // 32-bit: float, fixed32, sfixed32
+
+       var SHIFT_LEFT_32 = (1 << 16) * (1 << 16),
+           SHIFT_RIGHT_32 = 1 / SHIFT_LEFT_32; // Threshold chosen based on both benchmarking and knowledge about browser string
+       // data structures (which currently switch structure types at 12 bytes or more)
+
+       var TEXT_DECODER_MIN_LENGTH = 12;
+       var utf8TextDecoder = typeof TextDecoder === 'undefined' ? null : new TextDecoder('utf8');
+       Pbf.prototype = {
+         destroy: function destroy() {
+           this.buf = null;
+         },
+         // === READING =================================================================
+         readFields: function readFields(readField, result, end) {
+           end = end || this.length;
+
+           while (this.pos < end) {
+             var val = this.readVarint(),
+                 tag = val >> 3,
+                 startPos = this.pos;
+             this.type = val & 0x7;
+             readField(tag, result, this);
+             if (this.pos === startPos) this.skip(val);
+           }
+
+           return result;
+         },
+         readMessage: function readMessage(readField, result) {
+           return this.readFields(readField, result, this.readVarint() + this.pos);
+         },
+         readFixed32: function readFixed32() {
+           var val = readUInt32(this.buf, this.pos);
+           this.pos += 4;
+           return val;
+         },
+         readSFixed32: function readSFixed32() {
+           var val = readInt32(this.buf, this.pos);
+           this.pos += 4;
+           return val;
+         },
+         // 64-bit int handling is based on github.com/dpw/node-buffer-more-ints (MIT-licensed)
+         readFixed64: function readFixed64() {
+           var val = readUInt32(this.buf, this.pos) + readUInt32(this.buf, this.pos + 4) * SHIFT_LEFT_32;
+           this.pos += 8;
+           return val;
+         },
+         readSFixed64: function readSFixed64() {
+           var val = readUInt32(this.buf, this.pos) + readInt32(this.buf, this.pos + 4) * SHIFT_LEFT_32;
+           this.pos += 8;
+           return val;
+         },
+         readFloat: function readFloat() {
+           var val = ieee754.read(this.buf, this.pos, true, 23, 4);
+           this.pos += 4;
+           return val;
+         },
+         readDouble: function readDouble() {
+           var val = ieee754.read(this.buf, this.pos, true, 52, 8);
+           this.pos += 8;
+           return val;
+         },
+         readVarint: function readVarint(isSigned) {
+           var buf = this.buf,
+               val,
+               b;
+           b = buf[this.pos++];
+           val = b & 0x7f;
+           if (b < 0x80) return val;
+           b = buf[this.pos++];
+           val |= (b & 0x7f) << 7;
+           if (b < 0x80) return val;
+           b = buf[this.pos++];
+           val |= (b & 0x7f) << 14;
+           if (b < 0x80) return val;
+           b = buf[this.pos++];
+           val |= (b & 0x7f) << 21;
+           if (b < 0x80) return val;
+           b = buf[this.pos];
+           val |= (b & 0x0f) << 28;
+           return readVarintRemainder(val, isSigned, this);
+         },
+         readVarint64: function readVarint64() {
+           // for compatibility with v2.0.1
+           return this.readVarint(true);
+         },
+         readSVarint: function readSVarint() {
+           var num = this.readVarint();
+           return num % 2 === 1 ? (num + 1) / -2 : num / 2; // zigzag encoding
+         },
+         readBoolean: function readBoolean() {
+           return Boolean(this.readVarint());
+         },
+         readString: function readString() {
+           var end = this.readVarint() + this.pos;
+           var pos = this.pos;
+           this.pos = end;
+
+           if (end - pos >= TEXT_DECODER_MIN_LENGTH && utf8TextDecoder) {
+             // longer strings are fast with the built-in browser TextDecoder API
+             return readUtf8TextDecoder(this.buf, pos, end);
+           } // short strings are fast with our custom implementation
+
+
+           return readUtf8(this.buf, pos, end);
+         },
+         readBytes: function readBytes() {
+           var end = this.readVarint() + this.pos,
+               buffer = this.buf.subarray(this.pos, end);
+           this.pos = end;
+           return buffer;
+         },
+         // verbose for performance reasons; doesn't affect gzipped size
+         readPackedVarint: function readPackedVarint(arr, isSigned) {
+           if (this.type !== Pbf.Bytes) return arr.push(this.readVarint(isSigned));
+           var end = readPackedEnd(this);
+           arr = arr || [];
+
+           while (this.pos < end) {
+             arr.push(this.readVarint(isSigned));
+           }
+
+           return arr;
+         },
+         readPackedSVarint: function readPackedSVarint(arr) {
+           if (this.type !== Pbf.Bytes) return arr.push(this.readSVarint());
+           var end = readPackedEnd(this);
+           arr = arr || [];
+
+           while (this.pos < end) {
+             arr.push(this.readSVarint());
+           }
+
+           return arr;
+         },
+         readPackedBoolean: function readPackedBoolean(arr) {
+           if (this.type !== Pbf.Bytes) return arr.push(this.readBoolean());
+           var end = readPackedEnd(this);
+           arr = arr || [];
+
+           while (this.pos < end) {
+             arr.push(this.readBoolean());
+           }
+
+           return arr;
+         },
+         readPackedFloat: function readPackedFloat(arr) {
+           if (this.type !== Pbf.Bytes) return arr.push(this.readFloat());
+           var end = readPackedEnd(this);
+           arr = arr || [];
+
+           while (this.pos < end) {
+             arr.push(this.readFloat());
+           }
+
+           return arr;
+         },
+         readPackedDouble: function readPackedDouble(arr) {
+           if (this.type !== Pbf.Bytes) return arr.push(this.readDouble());
+           var end = readPackedEnd(this);
+           arr = arr || [];
+
+           while (this.pos < end) {
+             arr.push(this.readDouble());
+           }
+
+           return arr;
+         },
+         readPackedFixed32: function readPackedFixed32(arr) {
+           if (this.type !== Pbf.Bytes) return arr.push(this.readFixed32());
+           var end = readPackedEnd(this);
+           arr = arr || [];
+
+           while (this.pos < end) {
+             arr.push(this.readFixed32());
+           }
+
+           return arr;
+         },
+         readPackedSFixed32: function readPackedSFixed32(arr) {
+           if (this.type !== Pbf.Bytes) return arr.push(this.readSFixed32());
+           var end = readPackedEnd(this);
+           arr = arr || [];
+
+           while (this.pos < end) {
+             arr.push(this.readSFixed32());
+           }
+
+           return arr;
+         },
+         readPackedFixed64: function readPackedFixed64(arr) {
+           if (this.type !== Pbf.Bytes) return arr.push(this.readFixed64());
+           var end = readPackedEnd(this);
+           arr = arr || [];
+
+           while (this.pos < end) {
+             arr.push(this.readFixed64());
+           }
+
+           return arr;
+         },
+         readPackedSFixed64: function readPackedSFixed64(arr) {
+           if (this.type !== Pbf.Bytes) return arr.push(this.readSFixed64());
+           var end = readPackedEnd(this);
+           arr = arr || [];
+
+           while (this.pos < end) {
+             arr.push(this.readSFixed64());
+           }
+
+           return arr;
+         },
+         skip: function skip(val) {
+           var type = val & 0x7;
+           if (type === Pbf.Varint) while (this.buf[this.pos++] > 0x7f) {} else if (type === Pbf.Bytes) this.pos = this.readVarint() + this.pos;else if (type === Pbf.Fixed32) this.pos += 4;else if (type === Pbf.Fixed64) this.pos += 8;else throw new Error('Unimplemented type: ' + type);
+         },
+         // === WRITING =================================================================
+         writeTag: function writeTag(tag, type) {
+           this.writeVarint(tag << 3 | type);
+         },
+         realloc: function realloc(min) {
+           var length = this.length || 16;
+
+           while (length < this.pos + min) {
+             length *= 2;
+           }
+
+           if (length !== this.length) {
+             var buf = new Uint8Array(length);
+             buf.set(this.buf);
+             this.buf = buf;
+             this.length = length;
+           }
+         },
+         finish: function finish() {
+           this.length = this.pos;
+           this.pos = 0;
+           return this.buf.subarray(0, this.length);
+         },
+         writeFixed32: function writeFixed32(val) {
+           this.realloc(4);
+           writeInt32(this.buf, val, this.pos);
+           this.pos += 4;
+         },
+         writeSFixed32: function writeSFixed32(val) {
+           this.realloc(4);
+           writeInt32(this.buf, val, this.pos);
+           this.pos += 4;
+         },
+         writeFixed64: function writeFixed64(val) {
+           this.realloc(8);
+           writeInt32(this.buf, val & -1, this.pos);
+           writeInt32(this.buf, Math.floor(val * SHIFT_RIGHT_32), this.pos + 4);
+           this.pos += 8;
+         },
+         writeSFixed64: function writeSFixed64(val) {
+           this.realloc(8);
+           writeInt32(this.buf, val & -1, this.pos);
+           writeInt32(this.buf, Math.floor(val * SHIFT_RIGHT_32), this.pos + 4);
+           this.pos += 8;
+         },
+         writeVarint: function writeVarint(val) {
+           val = +val || 0;
+
+           if (val > 0xfffffff || val < 0) {
+             writeBigVarint(val, this);
+             return;
+           }
+
+           this.realloc(4);
+           this.buf[this.pos++] = val & 0x7f | (val > 0x7f ? 0x80 : 0);
+           if (val <= 0x7f) return;
+           this.buf[this.pos++] = (val >>>= 7) & 0x7f | (val > 0x7f ? 0x80 : 0);
+           if (val <= 0x7f) return;
+           this.buf[this.pos++] = (val >>>= 7) & 0x7f | (val > 0x7f ? 0x80 : 0);
+           if (val <= 0x7f) return;
+           this.buf[this.pos++] = val >>> 7 & 0x7f;
+         },
+         writeSVarint: function writeSVarint(val) {
+           this.writeVarint(val < 0 ? -val * 2 - 1 : val * 2);
+         },
+         writeBoolean: function writeBoolean(val) {
+           this.writeVarint(Boolean(val));
+         },
+         writeString: function writeString(str) {
+           str = String(str);
+           this.realloc(str.length * 4);
+           this.pos++; // reserve 1 byte for short string length
+
+           var startPos = this.pos; // write the string directly to the buffer and see how much was written
+
+           this.pos = writeUtf8(this.buf, str, this.pos);
+           var len = this.pos - startPos;
+           if (len >= 0x80) makeRoomForExtraLength(startPos, len, this); // finally, write the message length in the reserved place and restore the position
+
+           this.pos = startPos - 1;
+           this.writeVarint(len);
+           this.pos += len;
+         },
+         writeFloat: function writeFloat(val) {
+           this.realloc(4);
+           ieee754.write(this.buf, val, this.pos, true, 23, 4);
+           this.pos += 4;
+         },
+         writeDouble: function writeDouble(val) {
+           this.realloc(8);
+           ieee754.write(this.buf, val, this.pos, true, 52, 8);
+           this.pos += 8;
+         },
+         writeBytes: function writeBytes(buffer) {
+           var len = buffer.length;
+           this.writeVarint(len);
+           this.realloc(len);
+
+           for (var i = 0; i < len; i++) {
+             this.buf[this.pos++] = buffer[i];
+           }
+         },
+         writeRawMessage: function writeRawMessage(fn, obj) {
+           this.pos++; // reserve 1 byte for short message length
+           // write the message directly to the buffer and see how much was written
+
+           var startPos = this.pos;
+           fn(obj, this);
+           var len = this.pos - startPos;
+           if (len >= 0x80) makeRoomForExtraLength(startPos, len, this); // finally, write the message length in the reserved place and restore the position
+
+           this.pos = startPos - 1;
+           this.writeVarint(len);
+           this.pos += len;
+         },
+         writeMessage: function writeMessage(tag, fn, obj) {
+           this.writeTag(tag, Pbf.Bytes);
+           this.writeRawMessage(fn, obj);
+         },
+         writePackedVarint: function writePackedVarint(tag, arr) {
+           if (arr.length) this.writeMessage(tag, _writePackedVarint, arr);
+         },
+         writePackedSVarint: function writePackedSVarint(tag, arr) {
+           if (arr.length) this.writeMessage(tag, _writePackedSVarint, arr);
+         },
+         writePackedBoolean: function writePackedBoolean(tag, arr) {
+           if (arr.length) this.writeMessage(tag, _writePackedBoolean, arr);
+         },
+         writePackedFloat: function writePackedFloat(tag, arr) {
+           if (arr.length) this.writeMessage(tag, _writePackedFloat, arr);
+         },
+         writePackedDouble: function writePackedDouble(tag, arr) {
+           if (arr.length) this.writeMessage(tag, _writePackedDouble, arr);
+         },
+         writePackedFixed32: function writePackedFixed32(tag, arr) {
+           if (arr.length) this.writeMessage(tag, _writePackedFixed, arr);
+         },
+         writePackedSFixed32: function writePackedSFixed32(tag, arr) {
+           if (arr.length) this.writeMessage(tag, _writePackedSFixed, arr);
+         },
+         writePackedFixed64: function writePackedFixed64(tag, arr) {
+           if (arr.length) this.writeMessage(tag, _writePackedFixed2, arr);
+         },
+         writePackedSFixed64: function writePackedSFixed64(tag, arr) {
+           if (arr.length) this.writeMessage(tag, _writePackedSFixed2, arr);
+         },
+         writeBytesField: function writeBytesField(tag, buffer) {
+           this.writeTag(tag, Pbf.Bytes);
+           this.writeBytes(buffer);
+         },
+         writeFixed32Field: function writeFixed32Field(tag, val) {
+           this.writeTag(tag, Pbf.Fixed32);
+           this.writeFixed32(val);
+         },
+         writeSFixed32Field: function writeSFixed32Field(tag, val) {
+           this.writeTag(tag, Pbf.Fixed32);
+           this.writeSFixed32(val);
+         },
+         writeFixed64Field: function writeFixed64Field(tag, val) {
+           this.writeTag(tag, Pbf.Fixed64);
+           this.writeFixed64(val);
+         },
+         writeSFixed64Field: function writeSFixed64Field(tag, val) {
+           this.writeTag(tag, Pbf.Fixed64);
+           this.writeSFixed64(val);
+         },
+         writeVarintField: function writeVarintField(tag, val) {
+           this.writeTag(tag, Pbf.Varint);
+           this.writeVarint(val);
+         },
+         writeSVarintField: function writeSVarintField(tag, val) {
+           this.writeTag(tag, Pbf.Varint);
+           this.writeSVarint(val);
+         },
+         writeStringField: function writeStringField(tag, str) {
+           this.writeTag(tag, Pbf.Bytes);
+           this.writeString(str);
+         },
+         writeFloatField: function writeFloatField(tag, val) {
+           this.writeTag(tag, Pbf.Fixed32);
+           this.writeFloat(val);
+         },
+         writeDoubleField: function writeDoubleField(tag, val) {
+           this.writeTag(tag, Pbf.Fixed64);
+           this.writeDouble(val);
+         },
+         writeBooleanField: function writeBooleanField(tag, val) {
+           this.writeVarintField(tag, Boolean(val));
+         }
+       };
+
+       function readVarintRemainder(l, s, p) {
+         var buf = p.buf,
+             h,
+             b;
+         b = buf[p.pos++];
+         h = (b & 0x70) >> 4;
+         if (b < 0x80) return toNum(l, h, s);
+         b = buf[p.pos++];
+         h |= (b & 0x7f) << 3;
+         if (b < 0x80) return toNum(l, h, s);
+         b = buf[p.pos++];
+         h |= (b & 0x7f) << 10;
+         if (b < 0x80) return toNum(l, h, s);
+         b = buf[p.pos++];
+         h |= (b & 0x7f) << 17;
+         if (b < 0x80) return toNum(l, h, s);
+         b = buf[p.pos++];
+         h |= (b & 0x7f) << 24;
+         if (b < 0x80) return toNum(l, h, s);
+         b = buf[p.pos++];
+         h |= (b & 0x01) << 31;
+         if (b < 0x80) return toNum(l, h, s);
+         throw new Error('Expected varint not more than 10 bytes');
+       }
+
+       function readPackedEnd(pbf) {
+         return pbf.type === Pbf.Bytes ? pbf.readVarint() + pbf.pos : pbf.pos + 1;
+       }
+
+       function toNum(low, high, isSigned) {
+         if (isSigned) {
+           return high * 0x100000000 + (low >>> 0);
+         }
+
+         return (high >>> 0) * 0x100000000 + (low >>> 0);
+       }
+
+       function writeBigVarint(val, pbf) {
+         var low, high;
+
+         if (val >= 0) {
+           low = val % 0x100000000 | 0;
+           high = val / 0x100000000 | 0;
+         } else {
+           low = ~(-val % 0x100000000);
+           high = ~(-val / 0x100000000);
+
+           if (low ^ 0xffffffff) {
+             low = low + 1 | 0;
+           } else {
+             low = 0;
+             high = high + 1 | 0;
+           }
+         }
+
+         if (val >= 0x10000000000000000 || val < -0x10000000000000000) {
+           throw new Error('Given varint doesn\'t fit into 10 bytes');
+         }
+
+         pbf.realloc(10);
+         writeBigVarintLow(low, high, pbf);
+         writeBigVarintHigh(high, pbf);
+       }
+
+       function writeBigVarintLow(low, high, pbf) {
+         pbf.buf[pbf.pos++] = low & 0x7f | 0x80;
+         low >>>= 7;
+         pbf.buf[pbf.pos++] = low & 0x7f | 0x80;
+         low >>>= 7;
+         pbf.buf[pbf.pos++] = low & 0x7f | 0x80;
+         low >>>= 7;
+         pbf.buf[pbf.pos++] = low & 0x7f | 0x80;
+         low >>>= 7;
+         pbf.buf[pbf.pos] = low & 0x7f;
+       }
+
+       function writeBigVarintHigh(high, pbf) {
+         var lsb = (high & 0x07) << 4;
+         pbf.buf[pbf.pos++] |= lsb | ((high >>>= 3) ? 0x80 : 0);
+         if (!high) return;
+         pbf.buf[pbf.pos++] = high & 0x7f | ((high >>>= 7) ? 0x80 : 0);
+         if (!high) return;
+         pbf.buf[pbf.pos++] = high & 0x7f | ((high >>>= 7) ? 0x80 : 0);
+         if (!high) return;
+         pbf.buf[pbf.pos++] = high & 0x7f | ((high >>>= 7) ? 0x80 : 0);
+         if (!high) return;
+         pbf.buf[pbf.pos++] = high & 0x7f | ((high >>>= 7) ? 0x80 : 0);
+         if (!high) return;
+         pbf.buf[pbf.pos++] = high & 0x7f;
+       }
+
+       function makeRoomForExtraLength(startPos, len, pbf) {
+         var extraLen = len <= 0x3fff ? 1 : len <= 0x1fffff ? 2 : len <= 0xfffffff ? 3 : Math.floor(Math.log(len) / (Math.LN2 * 7)); // if 1 byte isn't enough for encoding message length, shift the data to the right
+
+         pbf.realloc(extraLen);
+
+         for (var i = pbf.pos - 1; i >= startPos; i--) {
+           pbf.buf[i + extraLen] = pbf.buf[i];
+         }
+       }
+
+       function _writePackedVarint(arr, pbf) {
+         for (var i = 0; i < arr.length; i++) {
+           pbf.writeVarint(arr[i]);
+         }
+       }
+
+       function _writePackedSVarint(arr, pbf) {
+         for (var i = 0; i < arr.length; i++) {
+           pbf.writeSVarint(arr[i]);
+         }
+       }
+
+       function _writePackedFloat(arr, pbf) {
+         for (var i = 0; i < arr.length; i++) {
+           pbf.writeFloat(arr[i]);
+         }
+       }
+
+       function _writePackedDouble(arr, pbf) {
+         for (var i = 0; i < arr.length; i++) {
+           pbf.writeDouble(arr[i]);
+         }
+       }
+
+       function _writePackedBoolean(arr, pbf) {
+         for (var i = 0; i < arr.length; i++) {
+           pbf.writeBoolean(arr[i]);
+         }
+       }
+
+       function _writePackedFixed(arr, pbf) {
+         for (var i = 0; i < arr.length; i++) {
+           pbf.writeFixed32(arr[i]);
+         }
+       }
+
+       function _writePackedSFixed(arr, pbf) {
+         for (var i = 0; i < arr.length; i++) {
+           pbf.writeSFixed32(arr[i]);
+         }
+       }
+
+       function _writePackedFixed2(arr, pbf) {
+         for (var i = 0; i < arr.length; i++) {
+           pbf.writeFixed64(arr[i]);
+         }
+       }
+
+       function _writePackedSFixed2(arr, pbf) {
+         for (var i = 0; i < arr.length; i++) {
+           pbf.writeSFixed64(arr[i]);
+         }
+       } // Buffer code below from https://github.com/feross/buffer, MIT-licensed
+
+
+       function readUInt32(buf, pos) {
+         return (buf[pos] | buf[pos + 1] << 8 | buf[pos + 2] << 16) + buf[pos + 3] * 0x1000000;
+       }
+
+       function writeInt32(buf, val, pos) {
+         buf[pos] = val;
+         buf[pos + 1] = val >>> 8;
+         buf[pos + 2] = val >>> 16;
+         buf[pos + 3] = val >>> 24;
+       }
+
+       function readInt32(buf, pos) {
+         return (buf[pos] | buf[pos + 1] << 8 | buf[pos + 2] << 16) + (buf[pos + 3] << 24);
+       }
+
+       function readUtf8(buf, pos, end) {
+         var str = '';
+         var i = pos;
+
+         while (i < end) {
+           var b0 = buf[i];
+           var c = null; // codepoint
+
+           var bytesPerSequence = b0 > 0xEF ? 4 : b0 > 0xDF ? 3 : b0 > 0xBF ? 2 : 1;
+           if (i + bytesPerSequence > end) break;
+           var b1, b2, b3;
+
+           if (bytesPerSequence === 1) {
+             if (b0 < 0x80) {
+               c = b0;
+             }
+           } else if (bytesPerSequence === 2) {
+             b1 = buf[i + 1];
+
+             if ((b1 & 0xC0) === 0x80) {
+               c = (b0 & 0x1F) << 0x6 | b1 & 0x3F;
+
+               if (c <= 0x7F) {
+                 c = null;
+               }
+             }
+           } else if (bytesPerSequence === 3) {
+             b1 = buf[i + 1];
+             b2 = buf[i + 2];
+
+             if ((b1 & 0xC0) === 0x80 && (b2 & 0xC0) === 0x80) {
+               c = (b0 & 0xF) << 0xC | (b1 & 0x3F) << 0x6 | b2 & 0x3F;
+
+               if (c <= 0x7FF || c >= 0xD800 && c <= 0xDFFF) {
+                 c = null;
+               }
+             }
+           } else if (bytesPerSequence === 4) {
+             b1 = buf[i + 1];
+             b2 = buf[i + 2];
+             b3 = buf[i + 3];
+
+             if ((b1 & 0xC0) === 0x80 && (b2 & 0xC0) === 0x80 && (b3 & 0xC0) === 0x80) {
+               c = (b0 & 0xF) << 0x12 | (b1 & 0x3F) << 0xC | (b2 & 0x3F) << 0x6 | b3 & 0x3F;
+
+               if (c <= 0xFFFF || c >= 0x110000) {
+                 c = null;
+               }
+             }
+           }
+
+           if (c === null) {
+             c = 0xFFFD;
+             bytesPerSequence = 1;
+           } else if (c > 0xFFFF) {
+             c -= 0x10000;
+             str += String.fromCharCode(c >>> 10 & 0x3FF | 0xD800);
+             c = 0xDC00 | c & 0x3FF;
+           }
+
+           str += String.fromCharCode(c);
+           i += bytesPerSequence;
+         }
+
+         return str;
+       }
+
+       function readUtf8TextDecoder(buf, pos, end) {
+         return utf8TextDecoder.decode(buf.subarray(pos, end));
+       }
+
+       function writeUtf8(buf, str, pos) {
+         for (var i = 0, c, lead; i < str.length; i++) {
+           c = str.charCodeAt(i); // code point
+
+           if (c > 0xD7FF && c < 0xE000) {
+             if (lead) {
+               if (c < 0xDC00) {
+                 buf[pos++] = 0xEF;
+                 buf[pos++] = 0xBF;
+                 buf[pos++] = 0xBD;
+                 lead = c;
+                 continue;
+               } else {
+                 c = lead - 0xD800 << 10 | c - 0xDC00 | 0x10000;
+                 lead = null;
+               }
+             } else {
+               if (c > 0xDBFF || i + 1 === str.length) {
+                 buf[pos++] = 0xEF;
+                 buf[pos++] = 0xBF;
+                 buf[pos++] = 0xBD;
+               } else {
+                 lead = c;
+               }
+
+               continue;
+             }
+           } else if (lead) {
+             buf[pos++] = 0xEF;
+             buf[pos++] = 0xBF;
+             buf[pos++] = 0xBD;
+             lead = null;
+           }
+
+           if (c < 0x80) {
+             buf[pos++] = c;
+           } else {
+             if (c < 0x800) {
+               buf[pos++] = c >> 0x6 | 0xC0;
+             } else {
+               if (c < 0x10000) {
+                 buf[pos++] = c >> 0xC | 0xE0;
+               } else {
+                 buf[pos++] = c >> 0x12 | 0xF0;
+                 buf[pos++] = c >> 0xC & 0x3F | 0x80;
+               }
+
+               buf[pos++] = c >> 0x6 & 0x3F | 0x80;
+             }
+
+             buf[pos++] = c & 0x3F | 0x80;
+           }
+         }
+
+         return pos;
+       }
+
+       var vectorTile = {};
+
+       var pointGeometry = Point$1;
+       /**
+        * A standalone point geometry with useful accessor, comparison, and
+        * modification methods.
+        *
+        * @class Point
+        * @param {Number} x the x-coordinate. this could be longitude or screen
+        * pixels, or any other sort of unit.
+        * @param {Number} y the y-coordinate. this could be latitude or screen
+        * pixels, or any other sort of unit.
+        * @example
+        * var point = new Point(-77, 38);
+        */
+
+       function Point$1(x, y) {
+         this.x = x;
+         this.y = y;
+       }
+
+       Point$1.prototype = {
+         /**
+          * Clone this point, returning a new point that can be modified
+          * without affecting the old one.
+          * @return {Point} the clone
+          */
+         clone: function clone() {
+           return new Point$1(this.x, this.y);
+         },
+
+         /**
+          * Add this point's x & y coordinates to another point,
+          * yielding a new point.
+          * @param {Point} p the other point
+          * @return {Point} output point
+          */
+         add: function add(p) {
+           return this.clone()._add(p);
+         },
+
+         /**
+          * Subtract this point's x & y coordinates to from point,
+          * yielding a new point.
+          * @param {Point} p the other point
+          * @return {Point} output point
+          */
+         sub: function sub(p) {
+           return this.clone()._sub(p);
+         },
+
+         /**
+          * Multiply this point's x & y coordinates by point,
+          * yielding a new point.
+          * @param {Point} p the other point
+          * @return {Point} output point
+          */
+         multByPoint: function multByPoint(p) {
+           return this.clone()._multByPoint(p);
+         },
+
+         /**
+          * Divide this point's x & y coordinates by point,
+          * yielding a new point.
+          * @param {Point} p the other point
+          * @return {Point} output point
+          */
+         divByPoint: function divByPoint(p) {
+           return this.clone()._divByPoint(p);
+         },
+
+         /**
+          * Multiply this point's x & y coordinates by a factor,
+          * yielding a new point.
+          * @param {Point} k factor
+          * @return {Point} output point
+          */
+         mult: function mult(k) {
+           return this.clone()._mult(k);
+         },
+
+         /**
+          * Divide this point's x & y coordinates by a factor,
+          * yielding a new point.
+          * @param {Point} k factor
+          * @return {Point} output point
+          */
+         div: function div(k) {
+           return this.clone()._div(k);
+         },
+
+         /**
+          * Rotate this point around the 0, 0 origin by an angle a,
+          * given in radians
+          * @param {Number} a angle to rotate around, in radians
+          * @return {Point} output point
+          */
+         rotate: function rotate(a) {
+           return this.clone()._rotate(a);
+         },
+
+         /**
+          * Rotate this point around p point by an angle a,
+          * given in radians
+          * @param {Number} a angle to rotate around, in radians
+          * @param {Point} p Point to rotate around
+          * @return {Point} output point
+          */
+         rotateAround: function rotateAround(a, p) {
+           return this.clone()._rotateAround(a, p);
+         },
+
+         /**
+          * Multiply this point by a 4x1 transformation matrix
+          * @param {Array<Number>} m transformation matrix
+          * @return {Point} output point
+          */
+         matMult: function matMult(m) {
+           return this.clone()._matMult(m);
+         },
+
+         /**
+          * Calculate this point but as a unit vector from 0, 0, meaning
+          * that the distance from the resulting point to the 0, 0
+          * coordinate will be equal to 1 and the angle from the resulting
+          * point to the 0, 0 coordinate will be the same as before.
+          * @return {Point} unit vector point
+          */
+         unit: function unit() {
+           return this.clone()._unit();
+         },
+
+         /**
+          * Compute a perpendicular point, where the new y coordinate
+          * is the old x coordinate and the new x coordinate is the old y
+          * coordinate multiplied by -1
+          * @return {Point} perpendicular point
+          */
+         perp: function perp() {
+           return this.clone()._perp();
+         },
+
+         /**
+          * Return a version of this point with the x & y coordinates
+          * rounded to integers.
+          * @return {Point} rounded point
+          */
+         round: function round() {
+           return this.clone()._round();
+         },
+
+         /**
+          * Return the magitude of this point: this is the Euclidean
+          * distance from the 0, 0 coordinate to this point's x and y
+          * coordinates.
+          * @return {Number} magnitude
+          */
+         mag: function mag() {
+           return Math.sqrt(this.x * this.x + this.y * this.y);
+         },
+
+         /**
+          * Judge whether this point is equal to another point, returning
+          * true or false.
+          * @param {Point} other the other point
+          * @return {boolean} whether the points are equal
+          */
+         equals: function equals(other) {
+           return this.x === other.x && this.y === other.y;
+         },
+
+         /**
+          * Calculate the distance from this point to another point
+          * @param {Point} p the other point
+          * @return {Number} distance
+          */
+         dist: function dist(p) {
+           return Math.sqrt(this.distSqr(p));
+         },
+
+         /**
+          * Calculate the distance from this point to another point,
+          * without the square root step. Useful if you're comparing
+          * relative distances.
+          * @param {Point} p the other point
+          * @return {Number} distance
+          */
+         distSqr: function distSqr(p) {
+           var dx = p.x - this.x,
+               dy = p.y - this.y;
+           return dx * dx + dy * dy;
+         },
+
+         /**
+          * Get the angle from the 0, 0 coordinate to this point, in radians
+          * coordinates.
+          * @return {Number} angle
+          */
+         angle: function angle() {
+           return Math.atan2(this.y, this.x);
+         },
+
+         /**
+          * Get the angle from this point to another point, in radians
+          * @param {Point} b the other point
+          * @return {Number} angle
+          */
+         angleTo: function angleTo(b) {
+           return Math.atan2(this.y - b.y, this.x - b.x);
+         },
+
+         /**
+          * Get the angle between this point and another point, in radians
+          * @param {Point} b the other point
+          * @return {Number} angle
+          */
+         angleWith: function angleWith(b) {
+           return this.angleWithSep(b.x, b.y);
+         },
+
+         /*
+          * Find the angle of the two vectors, solving the formula for
+          * the cross product a x b = |a||b|sin(θ) for θ.
+          * @param {Number} x the x-coordinate
+          * @param {Number} y the y-coordinate
+          * @return {Number} the angle in radians
+          */
+         angleWithSep: function angleWithSep(x, y) {
+           return Math.atan2(this.x * y - this.y * x, this.x * x + this.y * y);
+         },
+         _matMult: function _matMult(m) {
+           var x = m[0] * this.x + m[1] * this.y,
+               y = m[2] * this.x + m[3] * this.y;
+           this.x = x;
+           this.y = y;
+           return this;
+         },
+         _add: function _add(p) {
+           this.x += p.x;
+           this.y += p.y;
+           return this;
+         },
+         _sub: function _sub(p) {
+           this.x -= p.x;
+           this.y -= p.y;
+           return this;
+         },
+         _mult: function _mult(k) {
+           this.x *= k;
+           this.y *= k;
+           return this;
+         },
+         _div: function _div(k) {
+           this.x /= k;
+           this.y /= k;
+           return this;
+         },
+         _multByPoint: function _multByPoint(p) {
+           this.x *= p.x;
+           this.y *= p.y;
+           return this;
+         },
+         _divByPoint: function _divByPoint(p) {
+           this.x /= p.x;
+           this.y /= p.y;
+           return this;
+         },
+         _unit: function _unit() {
+           this._div(this.mag());
+
+           return this;
+         },
+         _perp: function _perp() {
+           var y = this.y;
+           this.y = this.x;
+           this.x = -y;
+           return this;
+         },
+         _rotate: function _rotate(angle) {
+           var cos = Math.cos(angle),
+               sin = Math.sin(angle),
+               x = cos * this.x - sin * this.y,
+               y = sin * this.x + cos * this.y;
+           this.x = x;
+           this.y = y;
+           return this;
+         },
+         _rotateAround: function _rotateAround(angle, p) {
+           var cos = Math.cos(angle),
+               sin = Math.sin(angle),
+               x = p.x + cos * (this.x - p.x) - sin * (this.y - p.y),
+               y = p.y + sin * (this.x - p.x) + cos * (this.y - p.y);
+           this.x = x;
+           this.y = y;
+           return this;
+         },
+         _round: function _round() {
+           this.x = Math.round(this.x);
+           this.y = Math.round(this.y);
+           return this;
+         }
+       };
+       /**
+        * Construct a point from an array if necessary, otherwise if the input
+        * is already a Point, or an unknown type, return it unchanged
+        * @param {Array<Number>|Point|*} a any kind of input value
+        * @return {Point} constructed point, or passed-through value.
+        * @example
+        * // this
+        * var point = Point.convert([0, 1]);
+        * // is equivalent to
+        * var point = new Point(0, 1);
+        */
+
+       Point$1.convert = function (a) {
+         if (a instanceof Point$1) {
+           return a;
+         }
+
+         if (Array.isArray(a)) {
+           return new Point$1(a[0], a[1]);
+         }
+
+         return a;
+       };
+
+       var Point = pointGeometry;
+       var vectortilefeature = VectorTileFeature$1;
+
+       function VectorTileFeature$1(pbf, end, extent, keys, values) {
+         // Public
+         this.properties = {};
+         this.extent = extent;
+         this.type = 0; // Private
+
+         this._pbf = pbf;
+         this._geometry = -1;
+         this._keys = keys;
+         this._values = values;
+         pbf.readFields(readFeature, this, end);
+       }
+
+       function readFeature(tag, feature, pbf) {
+         if (tag == 1) feature.id = pbf.readVarint();else if (tag == 2) readTag(pbf, feature);else if (tag == 3) feature.type = pbf.readVarint();else if (tag == 4) feature._geometry = pbf.pos;
+       }
+
+       function readTag(pbf, feature) {
+         var end = pbf.readVarint() + pbf.pos;
+
+         while (pbf.pos < end) {
+           var key = feature._keys[pbf.readVarint()],
+               value = feature._values[pbf.readVarint()];
+
+           feature.properties[key] = value;
+         }
+       }
+
+       VectorTileFeature$1.types = ['Unknown', 'Point', 'LineString', 'Polygon'];
+
+       VectorTileFeature$1.prototype.loadGeometry = function () {
+         var pbf = this._pbf;
+         pbf.pos = this._geometry;
+         var end = pbf.readVarint() + pbf.pos,
+             cmd = 1,
+             length = 0,
+             x = 0,
+             y = 0,
+             lines = [],
+             line;
+
+         while (pbf.pos < end) {
+           if (length <= 0) {
+             var cmdLen = pbf.readVarint();
+             cmd = cmdLen & 0x7;
+             length = cmdLen >> 3;
+           }
+
+           length--;
+
+           if (cmd === 1 || cmd === 2) {
+             x += pbf.readSVarint();
+             y += pbf.readSVarint();
+
+             if (cmd === 1) {
+               // moveTo
+               if (line) lines.push(line);
+               line = [];
+             }
+
+             line.push(new Point(x, y));
+           } else if (cmd === 7) {
+             // Workaround for https://github.com/mapbox/mapnik-vector-tile/issues/90
+             if (line) {
+               line.push(line[0].clone()); // closePolygon
+             }
+           } else {
+             throw new Error('unknown command ' + cmd);
+           }
+         }
+
+         if (line) lines.push(line);
+         return lines;
+       };
+
+       VectorTileFeature$1.prototype.bbox = function () {
+         var pbf = this._pbf;
+         pbf.pos = this._geometry;
+         var end = pbf.readVarint() + pbf.pos,
+             cmd = 1,
+             length = 0,
+             x = 0,
+             y = 0,
+             x1 = Infinity,
+             x2 = -Infinity,
+             y1 = Infinity,
+             y2 = -Infinity;
+
+         while (pbf.pos < end) {
+           if (length <= 0) {
+             var cmdLen = pbf.readVarint();
+             cmd = cmdLen & 0x7;
+             length = cmdLen >> 3;
+           }
+
+           length--;
+
+           if (cmd === 1 || cmd === 2) {
+             x += pbf.readSVarint();
+             y += pbf.readSVarint();
+             if (x < x1) x1 = x;
+             if (x > x2) x2 = x;
+             if (y < y1) y1 = y;
+             if (y > y2) y2 = y;
+           } else if (cmd !== 7) {
+             throw new Error('unknown command ' + cmd);
+           }
+         }
+
+         return [x1, y1, x2, y2];
+       };
+
+       VectorTileFeature$1.prototype.toGeoJSON = function (x, y, z) {
+         var size = this.extent * Math.pow(2, z),
+             x0 = this.extent * x,
+             y0 = this.extent * y,
+             coords = this.loadGeometry(),
+             type = VectorTileFeature$1.types[this.type],
+             i,
+             j;
+
+         function project(line) {
+           for (var j = 0; j < line.length; j++) {
+             var p = line[j],
+                 y2 = 180 - (p.y + y0) * 360 / size;
+             line[j] = [(p.x + x0) * 360 / size - 180, 360 / Math.PI * Math.atan(Math.exp(y2 * Math.PI / 180)) - 90];
+           }
+         }
+
+         switch (this.type) {
+           case 1:
+             var points = [];
+
+             for (i = 0; i < coords.length; i++) {
+               points[i] = coords[i][0];
+             }
+
+             coords = points;
+             project(coords);
+             break;
+
+           case 2:
+             for (i = 0; i < coords.length; i++) {
+               project(coords[i]);
+             }
+
+             break;
+
+           case 3:
+             coords = classifyRings(coords);
+
+             for (i = 0; i < coords.length; i++) {
+               for (j = 0; j < coords[i].length; j++) {
+                 project(coords[i][j]);
+               }
+             }
+
+             break;
+         }
+
+         if (coords.length === 1) {
+           coords = coords[0];
+         } else {
+           type = 'Multi' + type;
+         }
+
+         var result = {
+           type: "Feature",
+           geometry: {
+             type: type,
+             coordinates: coords
+           },
+           properties: this.properties
+         };
+
+         if ('id' in this) {
+           result.id = this.id;
+         }
+
+         return result;
+       }; // classifies an array of rings into polygons with outer rings and holes
+
+
+       function classifyRings(rings) {
+         var len = rings.length;
+         if (len <= 1) return [rings];
+         var polygons = [],
+             polygon,
+             ccw;
+
+         for (var i = 0; i < len; i++) {
+           var area = signedArea(rings[i]);
+           if (area === 0) continue;
+           if (ccw === undefined) ccw = area < 0;
+
+           if (ccw === area < 0) {
+             if (polygon) polygons.push(polygon);
+             polygon = [rings[i]];
+           } else {
+             polygon.push(rings[i]);
+           }
+         }
+
+         if (polygon) polygons.push(polygon);
+         return polygons;
+       }
+
+       function signedArea(ring) {
+         var sum = 0;
+
+         for (var i = 0, len = ring.length, j = len - 1, p1, p2; i < len; j = i++) {
+           p1 = ring[i];
+           p2 = ring[j];
+           sum += (p2.x - p1.x) * (p1.y + p2.y);
+         }
+
+         return sum;
+       }
+
+       var VectorTileFeature = vectortilefeature;
+       var vectortilelayer = VectorTileLayer$1;
+
+       function VectorTileLayer$1(pbf, end) {
+         // Public
+         this.version = 1;
+         this.name = null;
+         this.extent = 4096;
+         this.length = 0; // Private
+
+         this._pbf = pbf;
+         this._keys = [];
+         this._values = [];
+         this._features = [];
+         pbf.readFields(readLayer, this, end);
+         this.length = this._features.length;
+       }
+
+       function readLayer(tag, layer, pbf) {
+         if (tag === 15) layer.version = pbf.readVarint();else if (tag === 1) layer.name = pbf.readString();else if (tag === 5) layer.extent = pbf.readVarint();else if (tag === 2) layer._features.push(pbf.pos);else if (tag === 3) layer._keys.push(pbf.readString());else if (tag === 4) layer._values.push(readValueMessage(pbf));
+       }
+
+       function readValueMessage(pbf) {
+         var value = null,
+             end = pbf.readVarint() + pbf.pos;
+
+         while (pbf.pos < end) {
+           var tag = pbf.readVarint() >> 3;
+           value = tag === 1 ? pbf.readString() : tag === 2 ? pbf.readFloat() : tag === 3 ? pbf.readDouble() : tag === 4 ? pbf.readVarint64() : tag === 5 ? pbf.readVarint() : tag === 6 ? pbf.readSVarint() : tag === 7 ? pbf.readBoolean() : null;
+         }
+
+         return value;
+       } // return feature `i` from this layer as a `VectorTileFeature`
+
+
+       VectorTileLayer$1.prototype.feature = function (i) {
+         if (i < 0 || i >= this._features.length) throw new Error('feature index out of bounds');
+         this._pbf.pos = this._features[i];
+
+         var end = this._pbf.readVarint() + this._pbf.pos;
+
+         return new VectorTileFeature(this._pbf, end, this.extent, this._keys, this._values);
+       };
+
+       var VectorTileLayer = vectortilelayer;
+       var vectortile = VectorTile$1;
+
+       function VectorTile$1(pbf, end) {
+         this.layers = pbf.readFields(readTile, {}, end);
+       }
+
+       function readTile(tag, layers, pbf) {
+         if (tag === 3) {
+           var layer = new VectorTileLayer(pbf, pbf.readVarint() + pbf.pos);
+           if (layer.length) layers[layer.name] = layer;
+         }
+       }
+
+       var VectorTile = vectorTile.VectorTile = vectortile;
+       vectorTile.VectorTileFeature = vectortilefeature;
+       vectorTile.VectorTileLayer = vectortilelayer;
+
+       var accessToken = 'MLY|4100327730013843|5bb78b81720791946a9a7b956c57b7cf';
+       var apiUrl = 'https://graph.mapillary.com/';
+       var baseTileUrl = 'https://tiles.mapillary.com/maps/vtp';
+       var mapFeatureTileUrl = "".concat(baseTileUrl, "/mly_map_feature_point/2/{z}/{x}/{y}?access_token=").concat(accessToken);
+       var tileUrl = "".concat(baseTileUrl, "/mly1_public/2/{z}/{x}/{y}?access_token=").concat(accessToken);
+       var trafficSignTileUrl = "".concat(baseTileUrl, "/mly_map_feature_traffic_sign/2/{z}/{x}/{y}?access_token=").concat(accessToken);
+       var viewercss = 'mapillary-js/mapillary.css';
+       var viewerjs = 'mapillary-js/mapillary.js';
+       var minZoom$1 = 14;
+       var dispatch$4 = dispatch$8('change', 'loadedImages', 'loadedSigns', 'loadedMapFeatures', 'bearingChanged', 'imageChanged');
+
+       var _loadViewerPromise$2;
+
+       var _mlyActiveImage;
+
+       var _mlyCache;
+
+       var _mlyFallback = false;
+
+       var _mlyHighlightedDetection;
+
+       var _mlyShowFeatureDetections = false;
+       var _mlyShowSignDetections = false;
+
+       var _mlyViewer;
+
+       var _mlyViewerFilter = ['all']; // Load all data for the specified type from Mapillary vector tiles
+
+       function loadTiles$2(which, url, maxZoom, projection) {
+         var tiler = utilTiler().zoomExtent([minZoom$1, maxZoom]).skipNullIsland(true);
+         var tiles = tiler.getTiles(projection);
+         tiles.forEach(function (tile) {
+           loadTile$1(which, url, tile);
+         });
+       } // Load all data for the specified type from one vector tile
+
+
+       function loadTile$1(which, url, tile) {
+         var cache = _mlyCache.requests;
+         var tileId = "".concat(tile.id, "-").concat(which);
+         if (cache.loaded[tileId] || cache.inflight[tileId]) return;
+         var controller = new AbortController();
+         cache.inflight[tileId] = controller;
+         var requestUrl = url.replace('{x}', tile.xyz[0]).replace('{y}', tile.xyz[1]).replace('{z}', tile.xyz[2]);
+         fetch(requestUrl, {
+           signal: controller.signal
+         }).then(function (response) {
+           if (!response.ok) {
+             throw new Error(response.status + ' ' + response.statusText);
+           }
+
+           cache.loaded[tileId] = true;
+           delete cache.inflight[tileId];
+           return response.arrayBuffer();
+         }).then(function (data) {
+           if (!data) {
+             throw new Error('No Data');
+           }
+
+           loadTileDataToCache(data, tile, which);
+
+           if (which === 'images') {
+             dispatch$4.call('loadedImages');
+           } else if (which === 'signs') {
+             dispatch$4.call('loadedSigns');
+           } else if (which === 'points') {
+             dispatch$4.call('loadedMapFeatures');
+           }
+         })["catch"](function () {
+           cache.loaded[tileId] = true;
+           delete cache.inflight[tileId];
+         });
+       } // Load the data from the vector tile into cache
+
+
+       function loadTileDataToCache(data, tile, which) {
+         var vectorTile = new VectorTile(new pbf(data));
+         var features, cache, layer, i, feature, loc, d;
+
+         if (vectorTile.layers.hasOwnProperty('image')) {
+           features = [];
+           cache = _mlyCache.images;
+           layer = vectorTile.layers.image;
+
+           for (i = 0; i < layer.length; i++) {
+             feature = layer.feature(i).toGeoJSON(tile.xyz[0], tile.xyz[1], tile.xyz[2]);
+             loc = feature.geometry.coordinates;
+             d = {
+               loc: loc,
+               captured_at: feature.properties.captured_at,
+               ca: feature.properties.compass_angle,
+               id: feature.properties.id,
+               is_pano: feature.properties.is_pano,
+               sequence_id: feature.properties.sequence_id
+             };
+             cache.forImageId[d.id] = d;
+             features.push({
+               minX: loc[0],
+               minY: loc[1],
+               maxX: loc[0],
+               maxY: loc[1],
+               data: d
+             });
+           }
+
+           if (cache.rtree) {
+             cache.rtree.load(features);
+           }
+         }
+
+         if (vectorTile.layers.hasOwnProperty('sequence')) {
+           features = [];
+           cache = _mlyCache.sequences;
+           layer = vectorTile.layers.sequence;
+
+           for (i = 0; i < layer.length; i++) {
+             feature = layer.feature(i).toGeoJSON(tile.xyz[0], tile.xyz[1], tile.xyz[2]);
+
+             if (cache.lineString[feature.properties.id]) {
+               cache.lineString[feature.properties.id].push(feature);
+             } else {
+               cache.lineString[feature.properties.id] = [feature];
+             }
+           }
+         }
+
+         if (vectorTile.layers.hasOwnProperty('point')) {
+           features = [];
+           cache = _mlyCache[which];
+           layer = vectorTile.layers.point;
+
+           for (i = 0; i < layer.length; i++) {
+             feature = layer.feature(i).toGeoJSON(tile.xyz[0], tile.xyz[1], tile.xyz[2]);
+             loc = feature.geometry.coordinates;
+             d = {
+               loc: loc,
+               id: feature.properties.id,
+               first_seen_at: feature.properties.first_seen_at,
+               last_seen_at: feature.properties.last_seen_at,
+               value: feature.properties.value
+             };
+             features.push({
+               minX: loc[0],
+               minY: loc[1],
+               maxX: loc[0],
+               maxY: loc[1],
+               data: d
+             });
+           }
+
+           if (cache.rtree) {
+             cache.rtree.load(features);
+           }
+         }
+
+         if (vectorTile.layers.hasOwnProperty('traffic_sign')) {
+           features = [];
+           cache = _mlyCache[which];
+           layer = vectorTile.layers.traffic_sign;
+
+           for (i = 0; i < layer.length; i++) {
+             feature = layer.feature(i).toGeoJSON(tile.xyz[0], tile.xyz[1], tile.xyz[2]);
+             loc = feature.geometry.coordinates;
+             d = {
+               loc: loc,
+               id: feature.properties.id,
+               first_seen_at: feature.properties.first_seen_at,
+               last_seen_at: feature.properties.last_seen_at,
+               value: feature.properties.value
+             };
+             features.push({
+               minX: loc[0],
+               minY: loc[1],
+               maxX: loc[0],
+               maxY: loc[1],
+               data: d
+             });
+           }
+
+           if (cache.rtree) {
+             cache.rtree.load(features);
+           }
+         }
+       } // Get data from the API
+
+
+       function loadData(url) {
+         return fetch(url).then(function (response) {
+           if (!response.ok) {
+             throw new Error(response.status + ' ' + response.statusText);
+           }
+
+           return response.json();
+         }).then(function (result) {
+           if (!result) {
+             return [];
+           }
+
+           return result.data || [];
+         });
+       } // Partition viewport into higher zoom tiles
+
+
+       function partitionViewport$2(projection) {
+         var z = geoScaleToZoom(projection.scale());
+         var z2 = Math.ceil(z * 2) / 2 + 2.5; // round to next 0.5 and add 2.5
+
+         var tiler = utilTiler().zoomExtent([z2, z2]);
+         return tiler.getTiles(projection).map(function (tile) {
+           return tile.extent;
+         });
+       } // Return no more than `limit` results per partition.
+
+
+       function searchLimited$2(limit, projection, rtree) {
+         limit = limit || 5;
+         return partitionViewport$2(projection).reduce(function (result, extent) {
+           var found = rtree.search(extent.bbox()).slice(0, limit).map(function (d) {
+             return d.data;
+           });
+           return found.length ? result.concat(found) : result;
+         }, []);
+       }
+
+       var serviceMapillary = {
+         // Initialize Mapillary
+         init: function init() {
+           if (!_mlyCache) {
+             this.reset();
+           }
+
+           this.event = utilRebind(this, dispatch$4, 'on');
+         },
+         // Reset cache and state
+         reset: function reset() {
+           if (_mlyCache) {
+             Object.values(_mlyCache.requests.inflight).forEach(function (request) {
+               request.abort();
+             });
+           }
+
+           _mlyCache = {
+             images: {
+               rtree: new RBush(),
+               forImageId: {}
+             },
+             image_detections: {
+               forImageId: {}
+             },
+             signs: {
+               rtree: new RBush()
+             },
+             points: {
+               rtree: new RBush()
+             },
+             sequences: {
+               rtree: new RBush(),
+               lineString: {}
+             },
+             requests: {
+               loaded: {},
+               inflight: {}
+             }
+           };
+           _mlyActiveImage = null;
+         },
+         // Get visible images
+         images: function images(projection) {
+           var limit = 5;
+           return searchLimited$2(limit, projection, _mlyCache.images.rtree);
+         },
+         // Get visible traffic signs
+         signs: function signs(projection) {
+           var limit = 5;
+           return searchLimited$2(limit, projection, _mlyCache.signs.rtree);
+         },
+         // Get visible map (point) features
+         mapFeatures: function mapFeatures(projection) {
+           var limit = 5;
+           return searchLimited$2(limit, projection, _mlyCache.points.rtree);
+         },
+         // Get cached image by id
+         cachedImage: function cachedImage(imageId) {
+           return _mlyCache.images.forImageId[imageId];
+         },
+         // Get visible sequences
+         sequences: function sequences(projection) {
+           var viewport = projection.clipExtent();
+           var min = [viewport[0][0], viewport[1][1]];
+           var max = [viewport[1][0], viewport[0][1]];
+           var bbox = geoExtent(projection.invert(min), projection.invert(max)).bbox();
+           var sequenceIds = {};
+           var lineStrings = [];
+
+           _mlyCache.images.rtree.search(bbox).forEach(function (d) {
+             if (d.data.sequence_id) {
+               sequenceIds[d.data.sequence_id] = true;
+             }
+           });
+
+           Object.keys(sequenceIds).forEach(function (sequenceId) {
+             if (_mlyCache.sequences.lineString[sequenceId]) {
+               lineStrings = lineStrings.concat(_mlyCache.sequences.lineString[sequenceId]);
+             }
+           });
+           return lineStrings;
+         },
+         // Load images in the visible area
+         loadImages: function loadImages(projection) {
+           loadTiles$2('images', tileUrl, 14, projection);
+         },
+         // Load traffic signs in the visible area
+         loadSigns: function loadSigns(projection) {
+           loadTiles$2('signs', trafficSignTileUrl, 14, projection);
+         },
+         // Load map (point) features in the visible area
+         loadMapFeatures: function loadMapFeatures(projection) {
+           loadTiles$2('points', mapFeatureTileUrl, 14, projection);
+         },
+         // Return a promise that resolves when the image viewer (Mapillary JS) library has finished loading
+         ensureViewerLoaded: function ensureViewerLoaded(context) {
+           if (_loadViewerPromise$2) return _loadViewerPromise$2; // add mly-wrapper
+
+           var wrap = context.container().select('.photoviewer').selectAll('.mly-wrapper').data([0]);
+           wrap.enter().append('div').attr('id', 'ideditor-mly').attr('class', 'photo-wrapper mly-wrapper').classed('hide', true);
+           var that = this;
+           _loadViewerPromise$2 = new Promise(function (resolve, reject) {
+             var loadedCount = 0;
+
+             function loaded() {
+               loadedCount += 1; // wait until both files are loaded
+
+               if (loadedCount === 2) resolve();
+             }
+
+             var head = select('head'); // load mapillary-viewercss
+
+             head.selectAll('#ideditor-mapillary-viewercss').data([0]).enter().append('link').attr('id', 'ideditor-mapillary-viewercss').attr('rel', 'stylesheet').attr('crossorigin', 'anonymous').attr('href', context.asset(viewercss)).on('load.serviceMapillary', loaded).on('error.serviceMapillary', function () {
+               reject();
+             }); // load mapillary-viewerjs
+
+             head.selectAll('#ideditor-mapillary-viewerjs').data([0]).enter().append('script').attr('id', 'ideditor-mapillary-viewerjs').attr('crossorigin', 'anonymous').attr('src', context.asset(viewerjs)).on('load.serviceMapillary', loaded).on('error.serviceMapillary', function () {
+               reject();
+             });
+           })["catch"](function () {
+             _loadViewerPromise$2 = null;
+           }).then(function () {
+             that.initViewer(context);
+           });
+           return _loadViewerPromise$2;
+         },
+         // Load traffic sign image sprites
+         loadSignResources: function loadSignResources(context) {
+           context.ui().svgDefs.addSprites(['mapillary-sprite'], false
+           /* don't override colors */
+           );
+           return this;
+         },
+         // Load map (point) feature image sprites
+         loadObjectResources: function loadObjectResources(context) {
+           context.ui().svgDefs.addSprites(['mapillary-object-sprite'], false
+           /* don't override colors */
+           );
+           return this;
+         },
+         // Remove previous detections in image viewer
+         resetTags: function resetTags() {
+           if (_mlyViewer && !_mlyFallback) {
+             _mlyViewer.getComponent('tag').removeAll();
+           }
+         },
+         // Show map feature detections in image viewer
+         showFeatureDetections: function showFeatureDetections(value) {
+           _mlyShowFeatureDetections = value;
+
+           if (!_mlyShowFeatureDetections && !_mlyShowSignDetections) {
+             this.resetTags();
+           }
+         },
+         // Show traffic sign detections in image viewer
+         showSignDetections: function showSignDetections(value) {
+           _mlyShowSignDetections = value;
+
+           if (!_mlyShowFeatureDetections && !_mlyShowSignDetections) {
+             this.resetTags();
+           }
+         },
+         // Apply filter to image viewer
+         filterViewer: function filterViewer(context) {
+           var showsPano = context.photos().showsPanoramic();
+           var showsFlat = context.photos().showsFlat();
+           var fromDate = context.photos().fromDate();
+           var toDate = context.photos().toDate();
+           var filter = ['all'];
+           if (!showsPano) filter.push(['!=', 'cameraType', 'spherical']);
+           if (!showsFlat && showsPano) filter.push(['==', 'pano', true]);
+
+           if (fromDate) {
+             filter.push(['>=', 'capturedAt', new Date(fromDate).getTime()]);
+           }
+
+           if (toDate) {
+             filter.push(['>=', 'capturedAt', new Date(toDate).getTime()]);
+           }
+
+           if (_mlyViewer) {
+             _mlyViewer.setFilter(filter);
+           }
+
+           _mlyViewerFilter = filter;
+           return filter;
+         },
+         // Make the image viewer visible
+         showViewer: function showViewer(context) {
+           var wrap = context.container().select('.photoviewer').classed('hide', false);
+           var isHidden = wrap.selectAll('.photo-wrapper.mly-wrapper.hide').size();
+
+           if (isHidden && _mlyViewer) {
+             wrap.selectAll('.photo-wrapper:not(.mly-wrapper)').classed('hide', true);
+             wrap.selectAll('.photo-wrapper.mly-wrapper').classed('hide', false);
+
+             _mlyViewer.resize();
+           }
+
+           return this;
+         },
+         // Hide the image viewer and resets map markers
+         hideViewer: function hideViewer(context) {
+           _mlyActiveImage = null;
+
+           if (!_mlyFallback && _mlyViewer) {
+             _mlyViewer.getComponent('sequence').stop();
+           }
+
+           var viewer = context.container().select('.photoviewer');
+           if (!viewer.empty()) viewer.datum(null);
+           viewer.classed('hide', true).selectAll('.photo-wrapper').classed('hide', true);
+           this.updateUrlImage(null);
+           dispatch$4.call('imageChanged');
+           dispatch$4.call('loadedMapFeatures');
+           dispatch$4.call('loadedSigns');
+           return this.setStyles(context, null);
+         },
+         // Update the URL with current image id
+         updateUrlImage: function updateUrlImage(imageId) {
+           if (!window.mocha) {
+             var hash = utilStringQs(window.location.hash);
+
+             if (imageId) {
+               hash.photo = 'mapillary/' + imageId;
+             } else {
+               delete hash.photo;
+             }
+
+             window.location.replace('#' + utilQsString(hash, true));
+           }
+         },
+         // Highlight the detection in the viewer that is related to the clicked map feature
+         highlightDetection: function highlightDetection(detection) {
+           if (detection) {
+             _mlyHighlightedDetection = detection.id;
+           }
+
+           return this;
+         },
+         // Initialize image viewer (Mapillar JS)
+         initViewer: function initViewer(context) {
+           var that = this;
+           if (!window.mapillary) return;
+           var opts = {
+             accessToken: accessToken,
+             component: {
+               cover: false,
+               keyboard: false,
+               tag: true
+             },
+             container: 'ideditor-mly'
+           }; // Disable components requiring WebGL support
+
+           if (!mapillary.isSupported() && mapillary.isFallbackSupported()) {
+             _mlyFallback = true;
+             opts.component = {
+               cover: false,
+               direction: false,
+               imagePlane: false,
+               keyboard: false,
+               mouse: false,
+               sequence: false,
+               tag: false,
+               image: true,
+               // fallback
+               navigation: true // fallback
+
+             };
+           }
+
+           _mlyViewer = new mapillary.Viewer(opts);
+
+           _mlyViewer.on('image', imageChanged);
+
+           _mlyViewer.on('bearing', bearingChanged);
+
+           if (_mlyViewerFilter) {
+             _mlyViewer.setFilter(_mlyViewerFilter);
+           } // Register viewer resize handler
+
+
+           context.ui().photoviewer.on('resize.mapillary', function () {
+             if (_mlyViewer) _mlyViewer.resize();
+           }); // imageChanged: called after the viewer has changed images and is ready.
+
+           function imageChanged(node) {
+             that.resetTags();
+             var image = node.image;
+             that.setActiveImage(image);
+             that.setStyles(context, null);
+             var loc = [image.originalLngLat.lng, image.originalLngLat.lat];
+             context.map().centerEase(loc);
+             that.updateUrlImage(image.id);
+
+             if (_mlyShowFeatureDetections || _mlyShowSignDetections) {
+               that.updateDetections(image.id, "".concat(apiUrl, "/").concat(image.id, "/detections?access_token=").concat(accessToken, "&fields=id,image,geometry,value"));
+             }
+
+             dispatch$4.call('imageChanged');
+           } // bearingChanged: called when the bearing changes in the image viewer.
+
+
+           function bearingChanged(e) {
+             dispatch$4.call('bearingChanged', undefined, e);
+           }
+         },
+         // Move to an image
+         selectImage: function selectImage(context, imageId) {
+           if (_mlyViewer && imageId) {
+             _mlyViewer.moveTo(imageId)["catch"](function (e) {
+               console.error('mly3', e); // eslint-disable-line no-console
+             });
+           }
+
+           return this;
+         },
+         // Return the currently displayed image
+         getActiveImage: function getActiveImage() {
+           return _mlyActiveImage;
+         },
+         // Return a list of detection objects for the given id
+         getDetections: function getDetections(id) {
+           return loadData("".concat(apiUrl, "/").concat(id, "/detections?access_token=").concat(accessToken, "&fields=id,value,image"));
+         },
+         // Set the currently visible image
+         setActiveImage: function setActiveImage(image) {
+           if (image) {
+             _mlyActiveImage = {
+               ca: image.originalCompassAngle,
+               id: image.id,
+               loc: [image.originalLngLat.lng, image.originalLngLat.lat],
+               is_pano: image.cameraType === 'spherical',
+               sequence_id: image.sequenceId
+             };
+           } else {
+             _mlyActiveImage = null;
+           }
+         },
+         // Update the currently highlighted sequence and selected bubble.
+         setStyles: function setStyles(context, hovered) {
+           var hoveredImageId = hovered && hovered.id;
+           var hoveredSequenceId = hovered && hovered.sequence_id;
+           var selectedSequenceId = _mlyActiveImage && _mlyActiveImage.sequence_id;
+           context.container().selectAll('.layer-mapillary .viewfield-group').classed('highlighted', function (d) {
+             return d.sequence_id === selectedSequenceId || d.id === hoveredImageId;
+           }).classed('hovered', function (d) {
+             return d.id === hoveredImageId;
+           });
+           context.container().selectAll('.layer-mapillary .sequence').classed('highlighted', function (d) {
+             return d.properties.id === hoveredSequenceId;
+           }).classed('currentView', function (d) {
+             return d.properties.id === selectedSequenceId;
+           });
+           return this;
+         },
+         // Get detections for the current image and shows them in the image viewer
+         updateDetections: function updateDetections(imageId, url) {
+           if (!_mlyViewer || _mlyFallback) return;
+           if (!imageId) return;
+           var cache = _mlyCache.image_detections;
+
+           if (cache.forImageId[imageId]) {
+             showDetections(_mlyCache.image_detections.forImageId[imageId]);
+           } else {
+             loadData(url).then(function (detections) {
+               detections.forEach(function (detection) {
+                 if (!cache.forImageId[imageId]) {
+                   cache.forImageId[imageId] = [];
+                 }
+
+                 cache.forImageId[imageId].push({
+                   geometry: detection.geometry,
+                   id: detection.id,
+                   image_id: imageId,
+                   value: detection.value
+                 });
+               });
+               showDetections(_mlyCache.image_detections.forImageId[imageId] || []);
+             });
+           } // Create a tag for each detection and shows it in the image viewer
+
+
+           function showDetections(detections) {
+             var tagComponent = _mlyViewer.getComponent('tag');
+
+             detections.forEach(function (data) {
+               var tag = makeTag(data);
+
+               if (tag) {
+                 tagComponent.add([tag]);
+               }
+             });
+           } // Create a Mapillary JS tag object
+
+
+           function makeTag(data) {
+             var valueParts = data.value.split('--');
+             if (!valueParts.length) return;
+             var tag;
+             var text;
+             var color = 0xffffff;
+
+             if (_mlyHighlightedDetection === data.id) {
+               color = 0xffff00;
+               text = valueParts[1];
+
+               if (text === 'flat' || text === 'discrete' || text === 'sign') {
+                 text = valueParts[2];
+               }
+
+               text = text.replace(/-/g, ' ');
+               text = text.charAt(0).toUpperCase() + text.slice(1);
+               _mlyHighlightedDetection = null;
+             }
+
+             var decodedGeometry = window.atob(data.geometry);
+             var uintArray = new Uint8Array(decodedGeometry.length);
+
+             for (var i = 0; i < decodedGeometry.length; i++) {
+               uintArray[i] = decodedGeometry.charCodeAt(i);
+             }
+
+             var tile = new VectorTile(new pbf(uintArray.buffer));
+             var layer = tile.layers['mpy-or'];
+             var geometries = layer.feature(0).loadGeometry();
+             var polygon = geometries.map(function (ring) {
+               return ring.map(function (point) {
+                 return [point.x / layer.extent, point.y / layer.extent];
+               });
+             });
+             tag = new mapillary.OutlineTag(data.id, new mapillary.PolygonGeometry(polygon[0]), {
+               text: text,
+               textColor: color,
+               lineColor: color,
+               lineWidth: 2,
+               fillColor: color,
+               fillOpacity: 0.3
+             });
+             return tag;
+           }
+         },
+         // Return the current cache
+         cache: function cache() {
+           return _mlyCache;
+         }
+       };
+
+       function validationIssue(attrs) {
+         this.type = attrs.type; // required - name of rule that created the issue (e.g. 'missing_tag')
+
+         this.subtype = attrs.subtype; // optional - category of the issue within the type (e.g. 'relation_type' under 'missing_tag')
+
+         this.severity = attrs.severity; // required - 'warning' or 'error'
+
+         this.message = attrs.message; // required - function returning localized string
+
+         this.reference = attrs.reference; // optional - function(selection) to render reference information
+
+         this.entityIds = attrs.entityIds; // optional - array of IDs of entities involved in the issue
+
+         this.loc = attrs.loc; // optional - [lon, lat] to zoom in on to see the issue
+
+         this.data = attrs.data; // optional - object containing extra data for the fixes
+
+         this.dynamicFixes = attrs.dynamicFixes; // optional - function(context) returning fixes
+
+         this.hash = attrs.hash; // optional - string to further differentiate the issue
+
+         this.id = generateID.apply(this); // generated - see below
+
+         this.key = generateKey.apply(this); // generated - see below (call after generating this.id)
+
+         this.autoFix = null; // generated - if autofix exists, will be set below
+         // A unique, deterministic string hash.
+         // Issues with identical id values are considered identical.
+
+         function generateID() {
+           var parts = [this.type];
+
+           if (this.hash) {
+             // subclasses can pass in their own differentiator
+             parts.push(this.hash);
+           }
+
+           if (this.subtype) {
+             parts.push(this.subtype);
+           } // include the entities this issue is for
+           // (sort them so the id is deterministic)
+
+
+           if (this.entityIds) {
+             var entityKeys = this.entityIds.slice().sort();
+             parts.push.apply(parts, entityKeys);
+           }
+
+           return parts.join(':');
+         } // An identifier suitable for use as the second argument to d3.selection#data().
+         // (i.e. this should change whenever the data needs to be refreshed)
+
+
+         function generateKey() {
+           return this.id + ':' + Date.now().toString(); // include time of creation
+         }
+
+         this.extent = function (resolver) {
+           if (this.loc) {
+             return geoExtent(this.loc);
+           }
+
+           if (this.entityIds && this.entityIds.length) {
+             return this.entityIds.reduce(function (extent, entityId) {
+               return extent.extend(resolver.entity(entityId).extent(resolver));
+             }, geoExtent());
+           }
+
+           return null;
+         };
+
+         this.fixes = function (context) {
+           var fixes = this.dynamicFixes ? this.dynamicFixes(context) : [];
+           var issue = this;
+
+           if (issue.severity === 'warning') {
+             // allow ignoring any issue that's not an error
+             fixes.push(new validationIssueFix({
+               title: _t.html('issues.fix.ignore_issue.title'),
+               icon: 'iD-icon-close',
+               onClick: function onClick() {
+                 context.validator().ignoreIssue(this.issue.id);
+               }
+             }));
+           }
+
+           fixes.forEach(function (fix) {
+             // the id doesn't matter as long as it's unique to this issue/fix
+             fix.id = fix.title; // add a reference to the issue for use in actions
+
+             fix.issue = issue;
+
+             if (fix.autoArgs) {
+               issue.autoFix = fix;
+             }
+           });
+           return fixes;
+         };
+       }
+       function validationIssueFix(attrs) {
+         this.title = attrs.title; // Required
+
+         this.onClick = attrs.onClick; // Optional - the function to run to apply the fix
+
+         this.disabledReason = attrs.disabledReason; // Optional - a string explaining why the fix is unavailable, if any
+
+         this.icon = attrs.icon; // Optional - shows 'iD-icon-wrench' if not set
+
+         this.entityIds = attrs.entityIds || []; // Optional - used for hover-higlighting.
+
+         this.autoArgs = attrs.autoArgs; // Optional - pass [actions, annotation] arglist if this fix can automatically run
+
+         this.issue = null; // Generated link - added by validationIssue
+       }
+
+       var buildRuleChecks = function buildRuleChecks() {
+         return {
+           equals: function equals(_equals) {
+             return function (tags) {
+               return Object.keys(_equals).every(function (k) {
+                 return _equals[k] === tags[k];
+               });
+             };
+           },
+           notEquals: function notEquals(_notEquals) {
+             return function (tags) {
+               return Object.keys(_notEquals).some(function (k) {
+                 return _notEquals[k] !== tags[k];
+               });
+             };
+           },
+           absence: function absence(_absence) {
+             return function (tags) {
+               return Object.keys(tags).indexOf(_absence) === -1;
+             };
+           },
+           presence: function presence(_presence) {
+             return function (tags) {
+               return Object.keys(tags).indexOf(_presence) > -1;
+             };
+           },
+           greaterThan: function greaterThan(_greaterThan) {
+             var key = Object.keys(_greaterThan)[0];
+             var value = _greaterThan[key];
+             return function (tags) {
+               return tags[key] > value;
+             };
+           },
+           greaterThanEqual: function greaterThanEqual(_greaterThanEqual) {
+             var key = Object.keys(_greaterThanEqual)[0];
+             var value = _greaterThanEqual[key];
+             return function (tags) {
+               return tags[key] >= value;
+             };
+           },
+           lessThan: function lessThan(_lessThan) {
+             var key = Object.keys(_lessThan)[0];
+             var value = _lessThan[key];
+             return function (tags) {
+               return tags[key] < value;
+             };
+           },
+           lessThanEqual: function lessThanEqual(_lessThanEqual) {
+             var key = Object.keys(_lessThanEqual)[0];
+             var value = _lessThanEqual[key];
+             return function (tags) {
+               return tags[key] <= value;
+             };
+           },
+           positiveRegex: function positiveRegex(_positiveRegex) {
+             var tagKey = Object.keys(_positiveRegex)[0];
+
+             var expression = _positiveRegex[tagKey].join('|');
+
+             var regex = new RegExp(expression);
+             return function (tags) {
+               return regex.test(tags[tagKey]);
+             };
+           },
+           negativeRegex: function negativeRegex(_negativeRegex) {
+             var tagKey = Object.keys(_negativeRegex)[0];
+
+             var expression = _negativeRegex[tagKey].join('|');
+
+             var regex = new RegExp(expression);
+             return function (tags) {
+               return !regex.test(tags[tagKey]);
+             };
+           }
+         };
+       };
+
+       var buildLineKeys = function buildLineKeys() {
+         return {
+           highway: {
+             rest_area: true,
+             services: true
+           },
+           railway: {
+             roundhouse: true,
+             station: true,
+             traverser: true,
+             turntable: true,
+             wash: true
+           }
+         };
+       };
+
+       var serviceMapRules = {
+         init: function init() {
+           this._ruleChecks = buildRuleChecks();
+           this._validationRules = [];
+           this._areaKeys = osmAreaKeys;
+           this._lineKeys = buildLineKeys();
+         },
+         // list of rules only relevant to tag checks...
+         filterRuleChecks: function filterRuleChecks(selector) {
+           var _ruleChecks = this._ruleChecks;
+           return Object.keys(selector).reduce(function (rules, key) {
+             if (['geometry', 'error', 'warning'].indexOf(key) === -1) {
+               rules.push(_ruleChecks[key](selector[key]));
+             }
+
+             return rules;
+           }, []);
+         },
+         // builds tagMap from mapcss-parse selector object...
+         buildTagMap: function buildTagMap(selector) {
+           var getRegexValues = function getRegexValues(regexes) {
+             return regexes.map(function (regex) {
+               return regex.replace(/\$|\^/g, '');
+             });
+           };
+
+           var tagMap = Object.keys(selector).reduce(function (expectedTags, key) {
+             var values;
+             var isRegex = /regex/gi.test(key);
+             var isEqual = /equals/gi.test(key);
+
+             if (isRegex || isEqual) {
+               Object.keys(selector[key]).forEach(function (selectorKey) {
+                 values = isEqual ? [selector[key][selectorKey]] : getRegexValues(selector[key][selectorKey]);
+
+                 if (expectedTags.hasOwnProperty(selectorKey)) {
+                   values = values.concat(expectedTags[selectorKey]);
+                 }
+
+                 expectedTags[selectorKey] = values;
+               });
+             } else if (/(greater|less)Than(Equal)?|presence/g.test(key)) {
+               var tagKey = /presence/.test(key) ? selector[key] : Object.keys(selector[key])[0];
+               values = [selector[key][tagKey]];
+
+               if (expectedTags.hasOwnProperty(tagKey)) {
+                 values = values.concat(expectedTags[tagKey]);
+               }
+
+               expectedTags[tagKey] = values;
+             }
+
+             return expectedTags;
+           }, {});
+           return tagMap;
+         },
+         // inspired by osmWay#isArea()
+         inferGeometry: function inferGeometry(tagMap) {
+           var _lineKeys = this._lineKeys;
+           var _areaKeys = this._areaKeys;
+
+           var keyValueDoesNotImplyArea = function keyValueDoesNotImplyArea(key) {
+             return utilArrayIntersection(tagMap[key], Object.keys(_areaKeys[key])).length > 0;
+           };
+
+           var keyValueImpliesLine = function keyValueImpliesLine(key) {
+             return utilArrayIntersection(tagMap[key], Object.keys(_lineKeys[key])).length > 0;
+           };
+
+           if (tagMap.hasOwnProperty('area')) {
+             if (tagMap.area.indexOf('yes') > -1) {
+               return 'area';
+             }
+
+             if (tagMap.area.indexOf('no') > -1) {
+               return 'line';
+             }
+           }
+
+           for (var key in tagMap) {
+             if (key in _areaKeys && !keyValueDoesNotImplyArea(key)) {
+               return 'area';
+             }
+
+             if (key in _lineKeys && keyValueImpliesLine(key)) {
+               return 'area';
+             }
+           }
+
+           return 'line';
+         },
+         // adds from mapcss-parse selector check...
+         addRule: function addRule(selector) {
+           var rule = {
+             // checks relevant to mapcss-selector
+             checks: this.filterRuleChecks(selector),
+             // true if all conditions for a tag error are true..
+             matches: function matches(entity) {
+               return this.checks.every(function (check) {
+                 return check(entity.tags);
+               });
+             },
+             // borrowed from Way#isArea()
+             inferredGeometry: this.inferGeometry(this.buildTagMap(selector), this._areaKeys),
+             geometryMatches: function geometryMatches(entity, graph) {
+               if (entity.type === 'node' || entity.type === 'relation') {
+                 return selector.geometry === entity.type;
+               } else if (entity.type === 'way') {
+                 return this.inferredGeometry === entity.geometry(graph);
+               }
+             },
+             // when geometries match and tag matches are present, return a warning...
+             findIssues: function findIssues(entity, graph, issues) {
+               if (this.geometryMatches(entity, graph) && this.matches(entity)) {
+                 var severity = Object.keys(selector).indexOf('error') > -1 ? 'error' : 'warning';
+                 var _message = selector[severity];
+                 issues.push(new validationIssue({
+                   type: 'maprules',
+                   severity: severity,
+                   message: function message() {
+                     return _message;
+                   },
+                   entityIds: [entity.id]
+                 }));
+               }
+             }
+           };
+
+           this._validationRules.push(rule);
+         },
+         clearRules: function clearRules() {
+           this._validationRules = [];
+         },
+         // returns validationRules...
+         validationRules: function validationRules() {
+           return this._validationRules;
+         },
+         // returns ruleChecks
+         ruleChecks: function ruleChecks() {
+           return this._ruleChecks;
+         }
+       };
+
+       var apibase$2 = 'https://nominatim.openstreetmap.org/';
+       var _inflight$2 = {};
+
+       var _nominatimCache;
+
+       var serviceNominatim = {
+         init: function init() {
+           _inflight$2 = {};
+           _nominatimCache = new RBush();
+         },
+         reset: function reset() {
+           Object.values(_inflight$2).forEach(function (controller) {
+             controller.abort();
+           });
+           _inflight$2 = {};
+           _nominatimCache = new RBush();
+         },
+         countryCode: function countryCode(location, callback) {
+           this.reverse(location, function (err, result) {
+             if (err) {
+               return callback(err);
+             } else if (result.address) {
+               return callback(null, result.address.country_code);
+             } else {
+               return callback('Unable to geocode', null);
+             }
+           });
+         },
+         reverse: function reverse(loc, callback) {
+           var cached = _nominatimCache.search({
+             minX: loc[0],
+             minY: loc[1],
+             maxX: loc[0],
+             maxY: loc[1]
+           });
+
+           if (cached.length > 0) {
+             if (callback) callback(null, cached[0].data);
+             return;
+           }
+
+           var params = {
+             zoom: 13,
+             format: 'json',
+             addressdetails: 1,
+             lat: loc[1],
+             lon: loc[0]
+           };
+           var url = apibase$2 + 'reverse?' + utilQsString(params);
+           if (_inflight$2[url]) return;
+           var controller = new AbortController();
+           _inflight$2[url] = controller;
+           d3_json(url, {
+             signal: controller.signal
+           }).then(function (result) {
+             delete _inflight$2[url];
+
+             if (result && result.error) {
+               throw new Error(result.error);
+             }
+
+             var extent = geoExtent(loc).padByMeters(200);
+
+             _nominatimCache.insert(Object.assign(extent.bbox(), {
+               data: result
+             }));
+
+             if (callback) callback(null, result);
+           })["catch"](function (err) {
+             delete _inflight$2[url];
+             if (err.name === 'AbortError') return;
+             if (callback) callback(err.message);
+           });
+         },
+         search: function search(val, callback) {
+           var searchVal = encodeURIComponent(val);
+           var url = apibase$2 + 'search/' + searchVal + '?limit=10&format=json';
+           if (_inflight$2[url]) return;
+           var controller = new AbortController();
+           _inflight$2[url] = controller;
+           d3_json(url, {
+             signal: controller.signal
+           }).then(function (result) {
+             delete _inflight$2[url];
+
+             if (result && result.error) {
+               throw new Error(result.error);
+             }
+
+             if (callback) callback(null, result);
+           })["catch"](function (err) {
+             delete _inflight$2[url];
+             if (err.name === 'AbortError') return;
+             if (callback) callback(err.message);
+           });
+         }
+       };
+
+       // for punction see https://stackoverflow.com/a/21224179
+
+       function simplify$1(str) {
+         if (typeof str !== 'string') return '';
+         return diacritics.remove(str.replace(/&/g, 'and').replace(/İ/ig, 'i') // for BİM, İşbank - #5017
+         .replace(/[\s\-=_!"#%'*{},.\/:;?\(\)\[\]@\\$\^*+<>«»~`’\u00a1\u00a7\u00b6\u00b7\u00bf\u037e\u0387\u055a-\u055f\u0589\u05c0\u05c3\u05c6\u05f3\u05f4\u0609\u060a\u060c\u060d\u061b\u061e\u061f\u066a-\u066d\u06d4\u0700-\u070d\u07f7-\u07f9\u0830-\u083e\u085e\u0964\u0965\u0970\u0af0\u0df4\u0e4f\u0e5a\u0e5b\u0f04-\u0f12\u0f14\u0f85\u0fd0-\u0fd4\u0fd9\u0fda\u104a-\u104f\u10fb\u1360-\u1368\u166d\u166e\u16eb-\u16ed\u1735\u1736\u17d4-\u17d6\u17d8-\u17da\u1800-\u1805\u1807-\u180a\u1944\u1945\u1a1e\u1a1f\u1aa0-\u1aa6\u1aa8-\u1aad\u1b5a-\u1b60\u1bfc-\u1bff\u1c3b-\u1c3f\u1c7e\u1c7f\u1cc0-\u1cc7\u1cd3\u2000-\u206f\u2cf9-\u2cfc\u2cfe\u2cff\u2d70\u2e00-\u2e7f\u3001-\u3003\u303d\u30fb\ua4fe\ua4ff\ua60d-\ua60f\ua673\ua67e\ua6f2-\ua6f7\ua874-\ua877\ua8ce\ua8cf\ua8f8-\ua8fa\ua92e\ua92f\ua95f\ua9c1-\ua9cd\ua9de\ua9df\uaa5c-\uaa5f\uaade\uaadf\uaaf0\uaaf1\uabeb\ufe10-\ufe16\ufe19\ufe30\ufe45\ufe46\ufe49-\ufe4c\ufe50-\ufe52\ufe54-\ufe57\ufe5f-\ufe61\ufe68\ufe6a\ufe6b\ufeff\uff01-\uff03\uff05-\uff07\uff0a\uff0c\uff0e\uff0f\uff1a\uff1b\uff1f\uff20\uff3c\uff61\uff64\uff65]+/g, '').toLowerCase());
+       }
+
+       var matchGroups$1 = {adult_gaming_centre:["amenity/casino","amenity/gambling","leisure/adult_gaming_centre"],beauty:["shop/beauty","shop/hairdresser_supply"],bed:["shop/bed","shop/furniture"],beverages:["shop/alcohol","shop/beer","shop/beverages","shop/wine"],camping:["leisure/park","tourism/camp_site","tourism/caravan_site"],car_parts:["shop/car_parts","shop/car_repair","shop/tires","shop/tyres"],clinic:["amenity/clinic","amenity/doctors","healthcare/clinic","healthcare/laboratory","healthcare/physiotherapist","healthcare/sample_collection","healthcare/dialysis"],confectionery:["shop/candy","shop/chocolate","shop/confectionery"],convenience:["shop/beauty","shop/chemist","shop/convenience","shop/cosmetics","shop/grocery","shop/newsagent","shop/perfumery"],coworking:["amenity/coworking_space","office/coworking","office/coworking_space"],dentist:["amenity/dentist","amenity/doctors","healthcare/dentist"],electronics:["office/telecommunication","shop/computer","shop/electronics","shop/hifi","shop/mobile","shop/mobile_phone","shop/telecommunication"],fabric:["shop/fabric","shop/haberdashery","shop/sewing"],fashion:["shop/accessories","shop/bag","shop/boutique","shop/clothes","shop/department_store","shop/fashion","shop/fashion_accessories","shop/sports","shop/shoes"],financial:["amenity/bank","office/accountant","office/financial","office/financial_advisor","office/tax_advisor","shop/tax"],fitness:["leisure/fitness_centre","leisure/fitness_center","leisure/sports_centre","leisure/sports_center"],food:["amenity/pub","amenity/bar","amenity/cafe","amenity/fast_food","amenity/ice_cream","amenity/restaurant","shop/bakery","shop/ice_cream","shop/pastry","shop/tea","shop/coffee"],fuel:["amenity/fuel","shop/gas","shop/convenience;gas","shop/gas;convenience"],gift:["shop/gift","shop/card","shop/cards","shop/stationery"],hardware:["shop/bathroom_furnishing","shop/carpet","shop/diy","shop/doityourself","shop/doors","shop/electrical","shop/flooring","shop/hardware","shop/hardware_store","shop/power_tools","shop/tool_hire","shop/tools","shop/trade"],health_food:["shop/health","shop/health_food","shop/herbalist","shop/nutrition_supplements"],hobby:["shop/electronics","shop/hobby","shop/books","shop/games","shop/collector","shop/toys","shop/model","shop/video_games","shop/anime"],hospital:["amenity/doctors","amenity/hospital","healthcare/hospital"],houseware:["shop/houseware","shop/interior_decoration"],lifeboat_station:["amenity/lifeboat_station","emergency/lifeboat_station","emergency/marine_rescue"],lodging:["tourism/hotel","tourism/motel"],money_transfer:["amenity/money_transfer","shop/money_transfer"],office_supplies:["shop/office_supplies","shop/stationary","shop/stationery"],outdoor:["shop/outdoor","shop/sports"],parcel_locker:["amenity/parcel_locker","amenity/vending_machine"],pharmacy:["amenity/doctors","amenity/pharmacy","healthcare/pharmacy"],playground:["amenity/theme_park","leisure/amusement_arcade","leisure/playground"],rental:["amenity/bicycle_rental","amenity/boat_rental","amenity/car_rental","amenity/truck_rental","amenity/vehicle_rental","shop/rental"],school:["amenity/childcare","amenity/college","amenity/kindergarten","amenity/language_school","amenity/prep_school","amenity/school","amenity/university"],storage:["shop/storage_units","shop/storage_rental"],substation:["power/station","power/substation","power/sub_station"],supermarket:["shop/food","shop/frozen_food","shop/greengrocer","shop/grocery","shop/supermarket","shop/wholesale"],variety_store:["shop/variety_store","shop/discount","shop/convenience"],vending:["amenity/vending_machine","shop/vending_machine"],weight_loss:["amenity/clinic","amenity/doctors","amenity/weight_clinic","healthcare/counselling","leisure/fitness_centre","office/therapist","shop/beauty","shop/diet","shop/food","shop/health_food","shop/herbalist","shop/nutrition","shop/nutrition_supplements","shop/weight_loss"],wholesale:["shop/wholesale","shop/supermarket","shop/department_store"]};
+       var matchGroupsJSON = {
+       matchGroups: matchGroups$1
+       };
+
+       var genericWords = ["^(barn|bazaa?r|bench|bou?tique|building|casa|church)$","^(baseball|basketball|football|soccer|softball|tennis(halle)?)\\s?(field|court)?$","^(club|green|out|ware)\\s?house$","^(driveway|el árbol|fountain|golf|government|graveyard)$","^(fixme|n\\s?\\/?\\s?a|name|no\\s?name|none|null|temporary|test|unknown)$","^(hofladen|librairie|magazine?|maison)$","^(mobile home|skate)?\\s?park$","^(obuwie|pond|pool|sale|shops?|sklep|stores?)$","^\\?+$","^private$","^tattoo( studio)?$","^windmill$","^церковная( лавка)?$"];
+       var genericWordsJSON = {
+       genericWords: genericWords
+       };
+
+       var trees$1 = {brands:{emoji:"🍔",mainTag:"brand:wikidata",sourceTags:["brand","name"],nameTags:{primary:"^(name|name:\\w+)$",alternate:"^(brand|brand:\\w+|operator|operator:\\w+|\\w+_name|\\w+_name:\\w+)$"}},flags:{emoji:"🚩",mainTag:"flag:wikidata",nameTags:{primary:"^(flag:name|flag:name:\\w+)$",alternate:"^(country|country:\\w+|flag|flag:\\w+|subject|subject:\\w+)$"}},operators:{emoji:"💼",mainTag:"operator:wikidata",sourceTags:["operator"],nameTags:{primary:"^(name|name:\\w+|operator|operator:\\w+)$",alternate:"^(brand|brand:\\w+|\\w+_name|\\w+_name:\\w+)$"}},transit:{emoji:"🚇",mainTag:"network:wikidata",sourceTags:["network"],nameTags:{primary:"^network$",alternate:"^(operator|operator:\\w+|network:\\w+|\\w+_name|\\w+_name:\\w+)$"}}};
+       var treesJSON = {
+       trees: trees$1
+       };
+
+       var matchGroups = matchGroupsJSON.matchGroups;
+       var trees = treesJSON.trees;
+       var Matcher = /*#__PURE__*/function () {
+         //
+         // `constructor`
+         // initialize the genericWords regexes
+         function Matcher() {
+           var _this = this;
+
+           _classCallCheck$1(this, Matcher);
+
+           // The `matchIndex` is a specialized structure that allows us to quickly answer
+           //   _"Given a [key/value tagpair, name, location], what canonical items (brands etc) can match it?"_
+           //
+           // The index contains all valid combinations of k/v tagpairs and names
+           // matchIndex:
+           // {
+           //   'k/v': {
+           //     'primary':         Map (String 'nsimple' -> Set (itemIDs…),   // matches for tags like `name`, `name:xx`, etc.
+           //     'alternate':       Map (String 'nsimple' -> Set (itemIDs…),   // matches for tags like `alt_name`, `brand`, etc.
+           //     'excludeNamed':    Map (String 'pattern' -> RegExp),
+           //     'excludeGeneric':  Map (String 'pattern' -> RegExp)
+           //   },
+           // }
+           //
+           // {
+           //   'amenity/bank': {
+           //     'primary': {
+           //       'firstbank':              Set ("firstbank-978cca", "firstbank-9794e6", "firstbank-f17495", …),
+           //       …
+           //     },
+           //     'alternate': {
+           //       '1stbank':                Set ("firstbank-f17495"),
+           //       …
+           //     }
+           //   },
+           //   'shop/supermarket': {
+           //     'primary': {
+           //       'coop':                   Set ("coop-76454b", "coop-ebf2d9", "coop-36e991", …),
+           //       'coopfood':               Set ("coopfood-a8278b", …),
+           //       …
+           //     },
+           //     'alternate': {
+           //       'coop':                   Set ("coopfood-a8278b", …),
+           //       'federatedcooperatives':  Set ("coop-76454b", …),
+           //       'thecooperative':         Set ("coopfood-a8278b", …),
+           //       …
+           //     }
+           //   }
+           // }
+           //
+           this.matchIndex = undefined; // The `genericWords` structure matches the contents of genericWords.json to instantiated RegExp objects
+           // Map (String 'pattern' -> RegExp),
+
+           this.genericWords = new Map();
+           (genericWordsJSON.genericWords || []).forEach(function (s) {
+             return _this.genericWords.set(s, new RegExp(s, 'i'));
+           }); // The `itemLocation` structure maps itemIDs to locationSetIDs:
+           // {
+           //   'firstbank-f17495':  '+[first_bank_western_us.geojson]',
+           //   'firstbank-978cca':  '+[first_bank_carolinas.geojson]',
+           //   'coop-76454b':       '+[Q16]',
+           //   'coopfood-a8278b':   '+[Q23666]',
+           //   …
+           // }
+
+           this.itemLocation = undefined; // The `locationSets` structure maps locationSetIDs to *resolved* locationSets:
+           // {
+           //   '+[first_bank_western_us.geojson]':  GeoJSON {…},
+           //   '+[first_bank_carolinas.geojson]':   GeoJSON {…},
+           //   '+[Q16]':                            GeoJSON {…},
+           //   '+[Q23666]':                         GeoJSON {…},
+           //   …
+           // }
+
+           this.locationSets = undefined; // The `locationIndex` is an instance of which-polygon spatial index for the locationSets.
+
+           this.locationIndex = undefined; // Array of match conflict pairs (currently unused)
+
+           this.warnings = [];
+         } //
+         // `buildMatchIndex()`
+         // Call this to prepare the matcher for use
+         //
+         // `data` needs to be an Object indexed on a 'tree/key/value' path.
+         // (e.g. cache filled by `fileTree.read` or data found in `dist/nsi.json`)
+         // {
+         //    'brands/amenity/bank': { properties: {}, items: [ {}, {}, … ] },
+         //    'brands/amenity/bar':  { properties: {}, items: [ {}, {}, … ] },
+         //    …
+         // }
+         //
+
+
+         _createClass$1(Matcher, [{
+           key: "buildMatchIndex",
+           value: function buildMatchIndex(data) {
+             var that = this;
+             if (that.matchIndex) return; // it was built already
+
+             that.matchIndex = new Map();
+             var seenTree = new Map(); // warn if the same [k, v, nsimple] appears in multiple trees - #5625
+
+             Object.keys(data).forEach(function (tkv) {
+               var category = data[tkv];
+               var parts = tkv.split('/', 3); // tkv = "tree/key/value"
+
+               var t = parts[0];
+               var k = parts[1];
+               var v = parts[2];
+               var thiskv = "".concat(k, "/").concat(v);
+               var tree = trees[t];
+               var branch = that.matchIndex.get(thiskv);
+
+               if (!branch) {
+                 branch = {
+                   primary: new Map(),
+                   alternate: new Map(),
+                   excludeGeneric: new Map(),
+                   excludeNamed: new Map()
+                 };
+                 that.matchIndex.set(thiskv, branch);
+               } // ADD EXCLUSIONS
+
+
+               var properties = category.properties || {};
+               var exclude = properties.exclude || {};
+               (exclude.generic || []).forEach(function (s) {
+                 return branch.excludeGeneric.set(s, new RegExp(s, 'i'));
+               });
+               (exclude.named || []).forEach(function (s) {
+                 return branch.excludeNamed.set(s, new RegExp(s, 'i'));
+               });
+               var excludeRegexes = [].concat(_toConsumableArray(branch.excludeGeneric.values()), _toConsumableArray(branch.excludeNamed.values())); // ADD ITEMS
+
+               var items = category.items;
+               if (!Array.isArray(items) || !items.length) return; // Primary name patterns, match tags to take first
+               //  e.g. `name`, `name:ru`
+
+               var primaryName = new RegExp(tree.nameTags.primary, 'i'); // Alternate name patterns, match tags to consider after primary
+               //  e.g. `alt_name`, `short_name`, `brand`, `brand:ru`, etc..
+
+               var alternateName = new RegExp(tree.nameTags.alternate, 'i'); // There are a few exceptions to the name matching regexes.
+               // Usually a tag suffix contains a language code like `name:en`, `name:ru`
+               // but we want to exclude things like `operator:type`, `name:etymology`, etc..
+
+               var notName = /:(colou?r|type|forward|backward|left|right|etymology|pronunciation|wikipedia)$/i; // For certain categories we do not want to match generic KV pairs like `building/yes` or `amenity/yes`
+
+               var skipGenericKV = skipGenericKVMatches(t, k, v); // We will collect the generic KV pairs anyway (for the purpose of filtering them out of matchTags)
+
+               var genericKV = new Set(["".concat(k, "/yes"), "building/yes"]); // Collect alternate tagpairs for this kv category from matchGroups.
+               // We might also pick up a few more generic KVs (like `shop/yes`)
+
+               var matchGroupKV = new Set();
+               Object.values(matchGroups).forEach(function (matchGroup) {
+                 var inGroup = matchGroup.some(function (otherkv) {
+                   return otherkv === thiskv;
+                 });
+                 if (!inGroup) return;
+                 matchGroup.forEach(function (otherkv) {
+                   if (otherkv === thiskv) return; // skip self
+
+                   matchGroupKV.add(otherkv);
+                   var otherk = otherkv.split('/', 2)[0]; // we might pick up a `shop/yes`
+
+                   genericKV.add("".concat(otherk, "/yes"));
+                 });
+               }); // For each item, insert all [key, value, name] combinations into the match index
+
+               items.forEach(function (item) {
+                 if (!item.id) return; // Automatically remove redundant `matchTags` - #3417
+                 // (i.e. This kv is already covered by matchGroups, so it doesn't need to be in `item.matchTags`)
+
+                 if (Array.isArray(item.matchTags) && item.matchTags.length) {
+                   item.matchTags = item.matchTags.filter(function (matchTag) {
+                     return !matchGroupKV.has(matchTag) && !genericKV.has(matchTag);
+                   });
+                   if (!item.matchTags.length) delete item.matchTags;
+                 } // key/value tagpairs to insert into the match index..
+
+
+                 var kvTags = ["".concat(thiskv)].concat(item.matchTags || []);
+
+                 if (!skipGenericKV) {
+                   kvTags = kvTags.concat(Array.from(genericKV)); // #3454 - match some generic tags
+                 } // Index all the namelike tag values
+
+
+                 Object.keys(item.tags).forEach(function (osmkey) {
+                   if (notName.test(osmkey)) return; // osmkey is not a namelike tag, skip
+
+                   var osmvalue = item.tags[osmkey];
+                   if (!osmvalue || excludeRegexes.some(function (regex) {
+                     return regex.test(osmvalue);
+                   })) return; // osmvalue missing or excluded
+
+                   if (primaryName.test(osmkey)) {
+                     kvTags.forEach(function (kv) {
+                       return insertName('primary', t, kv, simplify$1(osmvalue), item.id);
+                     });
+                   } else if (alternateName.test(osmkey)) {
+                     kvTags.forEach(function (kv) {
+                       return insertName('alternate', t, kv, simplify$1(osmvalue), item.id);
+                     });
+                   }
+                 }); // Index `matchNames` after indexing all other names..
+
+                 var keepMatchNames = new Set();
+                 (item.matchNames || []).forEach(function (matchName) {
+                   // If this matchname isn't already indexed, add it to the alternate index
+                   var nsimple = simplify$1(matchName);
+                   kvTags.forEach(function (kv) {
+                     var branch = that.matchIndex.get(kv);
+                     var primaryLeaf = branch && branch.primary.get(nsimple);
+                     var alternateLeaf = branch && branch.alternate.get(nsimple);
+                     var inPrimary = primaryLeaf && primaryLeaf.has(item.id);
+                     var inAlternate = alternateLeaf && alternateLeaf.has(item.id);
+
+                     if (!inPrimary && !inAlternate) {
+                       insertName('alternate', t, kv, nsimple, item.id);
+                       keepMatchNames.add(matchName);
+                     }
+                   });
+                 }); // Automatically remove redundant `matchNames` - #3417
+                 // (i.e. This name got indexed some other way, so it doesn't need to be in `item.matchNames`)
+
+                 if (keepMatchNames.size) {
+                   item.matchNames = Array.from(keepMatchNames);
+                 } else {
+                   delete item.matchNames;
+                 }
+               }); // each item
+             }); // each tkv
+             // Insert this item into the matchIndex
+
+             function insertName(which, t, kv, nsimple, itemID) {
+               if (!nsimple) {
+                 that.warnings.push("Warning: skipping empty ".concat(which, " name for item ").concat(t, "/").concat(kv, ": ").concat(itemID));
+                 return;
+               }
+
+               var branch = that.matchIndex.get(kv);
+
+               if (!branch) {
+                 branch = {
+                   primary: new Map(),
+                   alternate: new Map(),
+                   excludeGeneric: new Map(),
+                   excludeNamed: new Map()
+                 };
+                 that.matchIndex.set(kv, branch);
+               }
+
+               var leaf = branch[which].get(nsimple);
+
+               if (!leaf) {
+                 leaf = new Set();
+                 branch[which].set(nsimple, leaf);
+               }
+
+               leaf.add(itemID); // insert
+               // check for duplicates - #5625
+
+               if (!/yes$/.test(kv)) {
+                 // ignore genericKV like amenity/yes, building/yes, etc
+                 var kvnsimple = "".concat(kv, "/").concat(nsimple);
+                 var existing = seenTree.get(kvnsimple);
+
+                 if (existing && existing !== t) {
+                   var items = Array.from(leaf);
+                   that.warnings.push("Duplicate cache key \"".concat(kvnsimple, "\" in trees \"").concat(t, "\" and \"").concat(existing, "\", check items: ").concat(items));
+                   return;
+                 }
+
+                 seenTree.set(kvnsimple, t);
+               }
+             } // For certain categories we do not want to match generic KV pairs like `building/yes` or `amenity/yes`
+
+
+             function skipGenericKVMatches(t, k, v) {
+               return t === 'flags' || t === 'transit' || k === 'landuse' || v === 'atm' || v === 'bicycle_parking' || v === 'car_sharing' || v === 'caravan_site' || v === 'charging_station' || v === 'dog_park' || v === 'parking' || v === 'phone' || v === 'playground' || v === 'post_box' || v === 'public_bookcase' || v === 'recycling' || v === 'vending_machine';
+             }
+           } //
+           // `buildLocationIndex()`
+           // Call this to prepare a which-polygon location index.
+           // This *resolves* all the locationSets into GeoJSON, which takes some time.
+           // You can skip this step if you don't care about matching within a location.
+           //
+           // `data` needs to be an Object indexed on a 'tree/key/value' path.
+           // (e.g. cache filled by `fileTree.read` or data found in `dist/nsi.json`)
+           // {
+           //    'brands/amenity/bank': { properties: {}, items: [ {}, {}, … ] },
+           //    'brands/amenity/bar':  { properties: {}, items: [ {}, {}, … ] },
+           //    …
+           // }
+           //
+
+         }, {
+           key: "buildLocationIndex",
+           value: function buildLocationIndex(data, loco) {
+             var that = this;
+             if (that.locationIndex) return; // it was built already
+
+             that.itemLocation = new Map();
+             that.locationSets = new Map();
+             Object.keys(data).forEach(function (tkv) {
+               var items = data[tkv].items;
+               if (!Array.isArray(items) || !items.length) return;
+               items.forEach(function (item) {
+                 if (that.itemLocation.has(item.id)) return; // we've seen item id already - shouldn't be possible?
+
+                 var resolved;
+
+                 try {
+                   resolved = loco.resolveLocationSet(item.locationSet); // resolve a feature for this locationSet
+                 } catch (err) {
+                   console.warn("buildLocationIndex: ".concat(err.message)); // couldn't resolve
+                 }
+
+                 if (!resolved || !resolved.id) return;
+                 that.itemLocation.set(item.id, resolved.id); // link it to the item
+
+                 if (that.locationSets.has(resolved.id)) return; // we've seen this locationSet feature before..
+                 // First time seeing this locationSet feature, make a copy and add to locationSet cache..
+
+                 var feature = _cloneDeep(resolved.feature);
+
+                 feature.id = resolved.id; // Important: always use the locationSet `id` (`+[Q30]`), not the feature `id` (`Q30`)
+
+                 feature.properties.id = resolved.id;
+
+                 if (!feature.geometry.coordinates.length || !feature.properties.area) {
+                   console.warn("buildLocationIndex: locationSet ".concat(resolved.id, " for ").concat(item.id, " resolves to an empty feature:"));
+                   console.warn(JSON.stringify(feature));
+                   return;
+                 }
+
+                 that.locationSets.set(resolved.id, feature);
+               });
+             });
+             that.locationIndex = whichPolygon_1({
+               type: 'FeatureCollection',
+               features: _toConsumableArray(that.locationSets.values())
+             });
+
+             function _cloneDeep(obj) {
+               return JSON.parse(JSON.stringify(obj));
+             }
+           } //
+           // `match()`
+           // Pass parts and return an Array of matches.
+           // `k` - key
+           // `v` - value
+           // `n` - namelike
+           // `loc` - optional - [lon,lat] location to search
+           //
+           // 1. If the [k,v,n] tuple matches a canonical item…
+           // Return an Array of match results.
+           // Each result will include the area in km² that the item is valid.
+           //
+           // Order of results:
+           // Primary ordering will be on the "match" column:
+           //   "primary" - where the query matches the `name` tag, followed by
+           //   "alternate" - where the query matches an alternate name tag (e.g. short_name, brand, operator, etc)
+           // Secondary ordering will be on the "area" column:
+           //   "area descending" if no location was provided, (worldwide before local)
+           //   "area ascending" if location was provided (local before worldwide)
+           //
+           // [
+           //   { match: 'primary',   itemID: String,  area: Number,  kv: String,  nsimple: String },
+           //   { match: 'primary',   itemID: String,  area: Number,  kv: String,  nsimple: String },
+           //   { match: 'alternate', itemID: String,  area: Number,  kv: String,  nsimple: String },
+           //   { match: 'alternate', itemID: String,  area: Number,  kv: String,  nsimple: String },
+           //   …
+           // ]
+           //
+           // -or-
+           //
+           // 2. If the [k,v,n] tuple matches an exclude pattern…
+           // Return an Array with a single exclude result, either
+           //
+           // [ { match: 'excludeGeneric', pattern: String,  kv: String } ]  // "generic" e.g. "Food Court"
+           //   or
+           // [ { match: 'excludeNamed', pattern: String,  kv: String } ]    // "named", e.g. "Kebabai"
+           //
+           // About results
+           //   "generic" - a generic word that is probably not really a name.
+           //     For these, iD should warn the user "Hey don't put 'food court' in the name tag".
+           //   "named" - a real name like "Kebabai" that is just common, but not a brand.
+           //     For these, iD should just let it be. We don't include these in NSI, but we don't want to nag users about it either.
+           //
+           // -or-
+           //
+           // 3. If the [k,v,n] tuple matches nothing of any kind, return `null`
+           //
+           //
+
+         }, {
+           key: "match",
+           value: function match(k, v, n, loc) {
+             var that = this;
+
+             if (!that.matchIndex) {
+               throw new Error('match:  matchIndex not built.');
+             } // If we were supplied a location, and a that.locationIndex has been set up,
+             // get the locationSets that are valid there so we can filter results.
+
+
+             var matchLocations;
+
+             if (Array.isArray(loc) && that.locationIndex) {
+               // which-polygon query returns an array of GeoJSON properties, pass true to return all results
+               matchLocations = that.locationIndex([loc[0], loc[1], loc[0], loc[1]], true);
+             }
+
+             var nsimple = simplify$1(n);
+             var seen = new Set();
+             var results = [];
+             gatherResults('primary');
+             gatherResults('alternate');
+             if (results.length) return results;
+             gatherResults('exclude');
+             return results.length ? results : null;
+
+             function gatherResults(which) {
+               // First try an exact match on k/v
+               var kv = "".concat(k, "/").concat(v);
+               var didMatch = tryMatch(which, kv);
+               if (didMatch) return; // If that didn't work, look in match groups for other pairs considered equivalent to k/v..
+
+               for (var mg in matchGroups) {
+                 var matchGroup = matchGroups[mg];
+                 var inGroup = matchGroup.some(function (otherkv) {
+                   return otherkv === kv;
+                 });
+                 if (!inGroup) continue;
+
+                 for (var i = 0; i < matchGroup.length; i++) {
+                   var otherkv = matchGroup[i];
+                   if (otherkv === kv) continue; // skip self
+
+                   didMatch = tryMatch(which, otherkv);
+                   if (didMatch) return;
+                 }
+               } // If finished 'exclude' pass and still haven't matched anything, try the global `genericWords.json` patterns
+
+
+               if (which === 'exclude') {
+                 var regex = _toConsumableArray(that.genericWords.values()).find(function (regex) {
+                   return regex.test(n);
+                 });
+
+                 if (regex) {
+                   results.push({
+                     match: 'excludeGeneric',
+                     pattern: String(regex)
+                   }); // note no `branch`, no `kv`
+
+                   return;
+                 }
+               }
+             }
+
+             function tryMatch(which, kv) {
+               var branch = that.matchIndex.get(kv);
+               if (!branch) return;
+
+               if (which === 'exclude') {
+                 // Test name `n` against named and generic exclude patterns
+                 var regex = _toConsumableArray(branch.excludeNamed.values()).find(function (regex) {
+                   return regex.test(n);
+                 });
+
+                 if (regex) {
+                   results.push({
+                     match: 'excludeNamed',
+                     pattern: String(regex),
+                     kv: kv
+                   });
+                   return;
+                 }
+
+                 regex = _toConsumableArray(branch.excludeGeneric.values()).find(function (regex) {
+                   return regex.test(n);
+                 });
+
+                 if (regex) {
+                   results.push({
+                     match: 'excludeGeneric',
+                     pattern: String(regex),
+                     kv: kv
+                   });
+                   return;
+                 }
+
+                 return;
+               }
+
+               var leaf = branch[which].get(nsimple);
+               if (!leaf || !leaf.size) return; // If we get here, we matched something..
+               // Prepare the results, calculate areas (if location index was set up)
+
+               var hits = Array.from(leaf).map(function (itemID) {
+                 var area = Infinity;
+
+                 if (that.itemLocation && that.locationSets) {
+                   var location = that.locationSets.get(that.itemLocation.get(itemID));
+                   area = location && location.properties.area || Infinity;
+                 }
+
+                 return {
+                   match: which,
+                   itemID: itemID,
+                   area: area,
+                   kv: kv,
+                   nsimple: nsimple
+                 };
+               });
+               var sortFn = byAreaDescending; // Filter the match to include only results valid in the requested `loc`..
+
+               if (matchLocations) {
+                 hits = hits.filter(isValidLocation);
+                 sortFn = byAreaAscending;
+               }
+
+               if (!hits.length) return; // push results
+
+               hits.sort(sortFn).forEach(function (hit) {
+                 if (seen.has(hit.itemID)) return;
+                 seen.add(hit.itemID);
+                 results.push(hit);
+               });
+               return true;
+
+               function isValidLocation(hit) {
+                 if (!that.itemLocation) return true;
+                 return matchLocations.find(function (props) {
+                   return props.id === that.itemLocation.get(hit.itemID);
+                 });
+               } // Sort smaller (more local) locations first.
+
+
+               function byAreaAscending(hitA, hitB) {
+                 return hitA.area - hitB.area;
+               } // Sort larger (more worldwide) locations first.
+
+
+               function byAreaDescending(hitA, hitB) {
+                 return hitB.area - hitA.area;
+               }
+             }
+           } //
+           // `getWarnings()`
+           // Return any warnings discovered when buiding the index.
+           // (currently this does nothing)
+           //
+
+         }, {
+           key: "getWarnings",
+           value: function getWarnings() {
+             return this.warnings;
+           }
+         }]);
+
+         return Matcher;
+       }();
+
+       /*
+           iD.coreDifference represents the difference between two graphs.
+           It knows how to calculate the set of entities that were
+           created, modified, or deleted, and also contains the logic
+           for recursively extending a difference to the complete set
+           of entities that will require a redraw, taking into account
+           child and parent relationships.
+        */
+
+       function coreDifference(base, head) {
+         var _changes = {};
+         var _didChange = {}; // 'addition', 'deletion', 'geometry', 'properties'
+
+         var _diff = {};
+
+         function checkEntityID(id) {
+           var h = head.entities[id];
+           var b = base.entities[id];
+           if (h === b) return;
+           if (_changes[id]) return;
+
+           if (!h && b) {
+             _changes[id] = {
+               base: b,
+               head: h
+             };
+             _didChange.deletion = true;
+             return;
+           }
+
+           if (h && !b) {
+             _changes[id] = {
+               base: b,
+               head: h
+             };
+             _didChange.addition = true;
+             return;
+           }
+
+           if (h && b) {
+             if (h.members && b.members && !fastDeepEqual(h.members, b.members)) {
+               _changes[id] = {
+                 base: b,
+                 head: h
+               };
+               _didChange.geometry = true;
+               _didChange.properties = true;
+               return;
+             }
+
+             if (h.loc && b.loc && !geoVecEqual(h.loc, b.loc)) {
+               _changes[id] = {
+                 base: b,
+                 head: h
+               };
+               _didChange.geometry = true;
+             }
+
+             if (h.nodes && b.nodes && !fastDeepEqual(h.nodes, b.nodes)) {
+               _changes[id] = {
+                 base: b,
+                 head: h
+               };
+               _didChange.geometry = true;
+             }
+
+             if (h.tags && b.tags && !fastDeepEqual(h.tags, b.tags)) {
+               _changes[id] = {
+                 base: b,
+                 head: h
+               };
+               _didChange.properties = true;
+             }
+           }
+         }
+
+         function load() {
+           // HOT CODE: there can be many thousands of downloaded entities, so looping
+           // through them all can become a performance bottleneck. Optimize by
+           // resolving duplicates and using a basic `for` loop
+           var ids = utilArrayUniq(Object.keys(head.entities).concat(Object.keys(base.entities)));
+
+           for (var i = 0; i < ids.length; i++) {
+             checkEntityID(ids[i]);
+           }
+         }
+
+         load();
+
+         _diff.length = function length() {
+           return Object.keys(_changes).length;
+         };
+
+         _diff.changes = function changes() {
+           return _changes;
+         };
+
+         _diff.didChange = _didChange; // pass true to include affected relation members
+
+         _diff.extantIDs = function extantIDs(includeRelMembers) {
+           var result = new Set();
+           Object.keys(_changes).forEach(function (id) {
+             if (_changes[id].head) {
+               result.add(id);
+             }
+
+             var h = _changes[id].head;
+             var b = _changes[id].base;
+             var entity = h || b;
+
+             if (includeRelMembers && entity.type === 'relation') {
+               var mh = h ? h.members.map(function (m) {
+                 return m.id;
+               }) : [];
+               var mb = b ? b.members.map(function (m) {
+                 return m.id;
+               }) : [];
+               utilArrayUnion(mh, mb).forEach(function (memberID) {
+                 if (head.hasEntity(memberID)) {
+                   result.add(memberID);
+                 }
+               });
+             }
+           });
+           return Array.from(result);
+         };
+
+         _diff.modified = function modified() {
+           var result = [];
+           Object.values(_changes).forEach(function (change) {
+             if (change.base && change.head) {
+               result.push(change.head);
+             }
+           });
+           return result;
+         };
+
+         _diff.created = function created() {
+           var result = [];
+           Object.values(_changes).forEach(function (change) {
+             if (!change.base && change.head) {
+               result.push(change.head);
+             }
+           });
+           return result;
+         };
+
+         _diff.deleted = function deleted() {
+           var result = [];
+           Object.values(_changes).forEach(function (change) {
+             if (change.base && !change.head) {
+               result.push(change.base);
+             }
+           });
+           return result;
+         };
+
+         _diff.summary = function summary() {
+           var relevant = {};
+           var keys = Object.keys(_changes);
+
+           for (var i = 0; i < keys.length; i++) {
+             var change = _changes[keys[i]];
+
+             if (change.head && change.head.geometry(head) !== 'vertex') {
+               addEntity(change.head, head, change.base ? 'modified' : 'created');
+             } else if (change.base && change.base.geometry(base) !== 'vertex') {
+               addEntity(change.base, base, 'deleted');
+             } else if (change.base && change.head) {
+               // modified vertex
+               var moved = !fastDeepEqual(change.base.loc, change.head.loc);
+               var retagged = !fastDeepEqual(change.base.tags, change.head.tags);
+
+               if (moved) {
+                 addParents(change.head);
+               }
+
+               if (retagged || moved && change.head.hasInterestingTags()) {
+                 addEntity(change.head, head, 'modified');
+               }
+             } else if (change.head && change.head.hasInterestingTags()) {
+               // created vertex
+               addEntity(change.head, head, 'created');
+             } else if (change.base && change.base.hasInterestingTags()) {
+               // deleted vertex
+               addEntity(change.base, base, 'deleted');
+             }
+           }
+
+           return Object.values(relevant);
+
+           function addEntity(entity, graph, changeType) {
+             relevant[entity.id] = {
+               entity: entity,
+               graph: graph,
+               changeType: changeType
+             };
+           }
+
+           function addParents(entity) {
+             var parents = head.parentWays(entity);
+
+             for (var j = parents.length - 1; j >= 0; j--) {
+               var parent = parents[j];
+
+               if (!(parent.id in relevant)) {
+                 addEntity(parent, head, 'modified');
+               }
+             }
+           }
+         }; // returns complete set of entities that require a redraw
+         //  (optionally within given `extent`)
+
+
+         _diff.complete = function complete(extent) {
+           var result = {};
+           var id, change;
+
+           for (id in _changes) {
+             change = _changes[id];
+             var h = change.head;
+             var b = change.base;
+             var entity = h || b;
+             var i;
+
+             if (extent && (!h || !h.intersects(extent, head)) && (!b || !b.intersects(extent, base))) {
+               continue;
+             }
+
+             result[id] = h;
+
+             if (entity.type === 'way') {
+               var nh = h ? h.nodes : [];
+               var nb = b ? b.nodes : [];
+               var diff;
+               diff = utilArrayDifference(nh, nb);
+
+               for (i = 0; i < diff.length; i++) {
+                 result[diff[i]] = head.hasEntity(diff[i]);
+               }
+
+               diff = utilArrayDifference(nb, nh);
+
+               for (i = 0; i < diff.length; i++) {
+                 result[diff[i]] = head.hasEntity(diff[i]);
+               }
+             }
+
+             if (entity.type === 'relation' && entity.isMultipolygon()) {
+               var mh = h ? h.members.map(function (m) {
+                 return m.id;
+               }) : [];
+               var mb = b ? b.members.map(function (m) {
+                 return m.id;
+               }) : [];
+               var ids = utilArrayUnion(mh, mb);
+
+               for (i = 0; i < ids.length; i++) {
+                 var member = head.hasEntity(ids[i]);
+                 if (!member) continue; // not downloaded
+
+                 if (extent && !member.intersects(extent, head)) continue; // not visible
+
+                 result[ids[i]] = member;
+               }
+             }
+
+             addParents(head.parentWays(entity), result);
+             addParents(head.parentRelations(entity), result);
+           }
+
+           return result;
+
+           function addParents(parents, result) {
+             for (var i = 0; i < parents.length; i++) {
+               var parent = parents[i];
+               if (parent.id in result) continue;
+               result[parent.id] = parent;
+               addParents(head.parentRelations(parent), result);
+             }
+           }
+         };
+
+         return _diff;
+       }
+
+       function coreTree(head) {
+         // tree for entities
+         var _rtree = new RBush();
+
+         var _bboxes = {}; // maintain a separate tree for granular way segments
+
+         var _segmentsRTree = new RBush();
+
+         var _segmentsBBoxes = {};
+         var _segmentsByWayId = {};
+         var tree = {};
+
+         function entityBBox(entity) {
+           var bbox = entity.extent(head).bbox();
+           bbox.id = entity.id;
+           _bboxes[entity.id] = bbox;
+           return bbox;
+         }
+
+         function segmentBBox(segment) {
+           var extent = segment.extent(head); // extent can be null if the node entities aren't in the graph for some reason
+
+           if (!extent) return null;
+           var bbox = extent.bbox();
+           bbox.segment = segment;
+           _segmentsBBoxes[segment.id] = bbox;
+           return bbox;
+         }
+
+         function removeEntity(entity) {
+           _rtree.remove(_bboxes[entity.id]);
+
+           delete _bboxes[entity.id];
+
+           if (_segmentsByWayId[entity.id]) {
+             _segmentsByWayId[entity.id].forEach(function (segment) {
+               _segmentsRTree.remove(_segmentsBBoxes[segment.id]);
+
+               delete _segmentsBBoxes[segment.id];
+             });
+
+             delete _segmentsByWayId[entity.id];
+           }
+         }
+
+         function loadEntities(entities) {
+           _rtree.load(entities.map(entityBBox));
+
+           var segments = [];
+           entities.forEach(function (entity) {
+             if (entity.segments) {
+               var entitySegments = entity.segments(head); // cache these to make them easy to remove later
+
+               _segmentsByWayId[entity.id] = entitySegments;
+               segments = segments.concat(entitySegments);
+             }
+           });
+           if (segments.length) _segmentsRTree.load(segments.map(segmentBBox).filter(Boolean));
+         }
+
+         function updateParents(entity, insertions, memo) {
+           head.parentWays(entity).forEach(function (way) {
+             if (_bboxes[way.id]) {
+               removeEntity(way);
+               insertions[way.id] = way;
+             }
+
+             updateParents(way, insertions, memo);
+           });
+           head.parentRelations(entity).forEach(function (relation) {
+             if (memo[entity.id]) return;
+             memo[entity.id] = true;
+
+             if (_bboxes[relation.id]) {
+               removeEntity(relation);
+               insertions[relation.id] = relation;
+             }
+
+             updateParents(relation, insertions, memo);
+           });
+         }
+
+         tree.rebase = function (entities, force) {
+           var insertions = {};
+
+           for (var i = 0; i < entities.length; i++) {
+             var entity = entities[i];
+             if (!entity.visible) continue;
+
+             if (head.entities.hasOwnProperty(entity.id) || _bboxes[entity.id]) {
+               if (!force) {
+                 continue;
+               } else if (_bboxes[entity.id]) {
+                 removeEntity(entity);
+               }
+             }
+
+             insertions[entity.id] = entity;
+             updateParents(entity, insertions, {});
+           }
+
+           loadEntities(Object.values(insertions));
+           return tree;
+         };
+
+         function updateToGraph(graph) {
+           if (graph === head) return;
+           var diff = coreDifference(head, graph);
+           head = graph;
+           var changed = diff.didChange;
+           if (!changed.addition && !changed.deletion && !changed.geometry) return;
+           var insertions = {};
+
+           if (changed.deletion) {
+             diff.deleted().forEach(function (entity) {
+               removeEntity(entity);
+             });
+           }
+
+           if (changed.geometry) {
+             diff.modified().forEach(function (entity) {
+               removeEntity(entity);
+               insertions[entity.id] = entity;
+               updateParents(entity, insertions, {});
+             });
+           }
+
+           if (changed.addition) {
+             diff.created().forEach(function (entity) {
+               insertions[entity.id] = entity;
+             });
+           }
+
+           loadEntities(Object.values(insertions));
+         } // returns an array of entities with bounding boxes overlapping `extent` for the given `graph`
+
+
+         tree.intersects = function (extent, graph) {
+           updateToGraph(graph);
+           return _rtree.search(extent.bbox()).map(function (bbox) {
+             return graph.entity(bbox.id);
+           });
+         }; // returns an array of segment objects with bounding boxes overlapping `extent` for the given `graph`
+
+
+         tree.waySegments = function (extent, graph) {
+           updateToGraph(graph);
+           return _segmentsRTree.search(extent.bbox()).map(function (bbox) {
+             return bbox.segment;
+           });
+         };
+
+         return tree;
+       }
+
+       function svgIcon(name, svgklass, useklass) {
+         return function drawIcon(selection) {
+           selection.selectAll('svg.icon' + (svgklass ? '.' + svgklass.split(' ')[0] : '')).data([0]).enter().append('svg').attr('class', 'icon ' + (svgklass || '')).append('use').attr('xlink:href', name).attr('class', useklass);
+         };
+       }
+
+       function uiModal(selection, blocking) {
+         var _this = this;
+
+         var keybinding = utilKeybinding('modal');
+         var previous = selection.select('div.modal');
+         var animate = previous.empty();
+         previous.transition().duration(200).style('opacity', 0).remove();
+         var shaded = selection.append('div').attr('class', 'shaded').style('opacity', 0);
+
+         shaded.close = function () {
+           shaded.transition().duration(200).style('opacity', 0).remove();
+           modal.transition().duration(200).style('top', '0px');
+           select(document).call(keybinding.unbind);
+         };
+
+         var modal = shaded.append('div').attr('class', 'modal fillL');
+         modal.append('input').attr('class', 'keytrap keytrap-first').on('focus.keytrap', moveFocusToLast);
+
+         if (!blocking) {
+           shaded.on('click.remove-modal', function (d3_event) {
+             if (d3_event.target === _this) {
+               shaded.close();
+             }
+           });
+           modal.append('button').attr('class', 'close').attr('title', _t('icons.close')).on('click', shaded.close).call(svgIcon('#iD-icon-close'));
+           keybinding.on('⌫', shaded.close).on('⎋', shaded.close);
+           select(document).call(keybinding);
+         }
+
+         modal.append('div').attr('class', 'content');
+         modal.append('input').attr('class', 'keytrap keytrap-last').on('focus.keytrap', moveFocusToFirst);
+
+         if (animate) {
+           shaded.transition().style('opacity', 1);
+         } else {
+           shaded.style('opacity', 1);
+         }
+
+         return shaded;
+
+         function moveFocusToFirst() {
+           var node = modal // there are additional rules about what's focusable, but this suits our purposes
+           .select('a, button, input:not(.keytrap), select, textarea').node();
+
+           if (node) {
+             node.focus();
+           } else {
+             select(this).node().blur();
+           }
+         }
+
+         function moveFocusToLast() {
+           var nodes = modal.selectAll('a, button, input:not(.keytrap), select, textarea').nodes();
+
+           if (nodes.length) {
+             nodes[nodes.length - 1].focus();
+           } else {
+             select(this).node().blur();
+           }
+         }
+       }
+
+       function uiLoading(context) {
+         var _modalSelection = select(null);
+
+         var _message = '';
+         var _blocking = false;
+
+         var loading = function loading(selection) {
+           _modalSelection = uiModal(selection, _blocking);
+
+           var loadertext = _modalSelection.select('.content').classed('loading-modal', true).append('div').attr('class', 'modal-section fillL');
+
+           loadertext.append('img').attr('class', 'loader').attr('src', context.imagePath('loader-white.gif'));
+           loadertext.append('h3').html(_message);
+
+           _modalSelection.select('button.close').attr('class', 'hide');
+
+           return loading;
+         };
+
+         loading.message = function (val) {
+           if (!arguments.length) return _message;
+           _message = val;
+           return loading;
+         };
+
+         loading.blocking = function (val) {
+           if (!arguments.length) return _blocking;
+           _blocking = val;
+           return loading;
+         };
+
+         loading.close = function () {
+           _modalSelection.remove();
+         };
+
+         loading.isShown = function () {
+           return _modalSelection && !_modalSelection.empty() && _modalSelection.node().parentNode;
+         };
+
+         return loading;
+       }
+
+       function coreHistory(context) {
+         var dispatch = dispatch$8('reset', 'change', 'merge', 'restore', 'undone', 'redone', 'storage_error');
+
+         var _lock = utilSessionMutex('lock'); // restorable if iD not open in another window/tab and a saved history exists in localStorage
+
+
+         var _hasUnresolvedRestorableChanges = _lock.lock() && !!corePreferences(getKey('saved_history'));
+
+         var duration = 150;
+         var _imageryUsed = [];
+         var _photoOverlaysUsed = [];
+         var _checkpoints = {};
+
+         var _pausedGraph;
+
+         var _stack;
+
+         var _index;
+
+         var _tree; // internal _act, accepts list of actions and eased time
+
+
+         function _act(actions, t) {
+           actions = Array.prototype.slice.call(actions);
+           var annotation;
+
+           if (typeof actions[actions.length - 1] !== 'function') {
+             annotation = actions.pop();
+           }
+
+           var graph = _stack[_index].graph;
+
+           for (var i = 0; i < actions.length; i++) {
+             graph = actions[i](graph, t);
+           }
+
+           return {
+             graph: graph,
+             annotation: annotation,
+             imageryUsed: _imageryUsed,
+             photoOverlaysUsed: _photoOverlaysUsed,
+             transform: context.projection.transform(),
+             selectedIDs: context.selectedIDs()
+           };
+         } // internal _perform with eased time
+
+
+         function _perform(args, t) {
+           var previous = _stack[_index].graph;
+           _stack = _stack.slice(0, _index + 1);
+
+           var actionResult = _act(args, t);
+
+           _stack.push(actionResult);
+
+           _index++;
+           return change(previous);
+         } // internal _replace with eased time
+
+
+         function _replace(args, t) {
+           var previous = _stack[_index].graph; // assert(_index == _stack.length - 1)
+
+           var actionResult = _act(args, t);
+
+           _stack[_index] = actionResult;
+           return change(previous);
+         } // internal _overwrite with eased time
+
+
+         function _overwrite(args, t) {
+           var previous = _stack[_index].graph;
+
+           if (_index > 0) {
+             _index--;
+
+             _stack.pop();
+           }
+
+           _stack = _stack.slice(0, _index + 1);
+
+           var actionResult = _act(args, t);
+
+           _stack.push(actionResult);
+
+           _index++;
+           return change(previous);
+         } // determine difference and dispatch a change event
+
+
+         function change(previous) {
+           var difference = coreDifference(previous, history.graph());
+
+           if (!_pausedGraph) {
+             dispatch.call('change', this, difference);
+           }
+
+           return difference;
+         } // iD uses namespaced keys so multiple installations do not conflict
+
+
+         function getKey(n) {
+           return 'iD_' + window.location.origin + '_' + n;
+         }
+
+         var history = {
+           graph: function graph() {
+             return _stack[_index].graph;
+           },
+           tree: function tree() {
+             return _tree;
+           },
+           base: function base() {
+             return _stack[0].graph;
+           },
+           merge: function merge(entities
+           /*, extent*/
+           ) {
+             var stack = _stack.map(function (state) {
+               return state.graph;
+             });
+
+             _stack[0].graph.rebase(entities, stack, false);
+
+             _tree.rebase(entities, false);
+
+             dispatch.call('merge', this, entities);
+           },
+           perform: function perform() {
+             // complete any transition already in progress
+             select(document).interrupt('history.perform');
+             var transitionable = false;
+             var action0 = arguments[0];
+
+             if (arguments.length === 1 || arguments.length === 2 && typeof arguments[1] !== 'function') {
+               transitionable = !!action0.transitionable;
+             }
+
+             if (transitionable) {
+               var origArguments = arguments;
+               select(document).transition('history.perform').duration(duration).ease(linear$1).tween('history.tween', function () {
+                 return function (t) {
+                   if (t < 1) _overwrite([action0], t);
+                 };
+               }).on('start', function () {
+                 _perform([action0], 0);
+               }).on('end interrupt', function () {
+                 _overwrite(origArguments, 1);
+               });
+             } else {
+               return _perform(arguments);
+             }
+           },
+           replace: function replace() {
+             select(document).interrupt('history.perform');
+             return _replace(arguments, 1);
+           },
+           // Same as calling pop and then perform
+           overwrite: function overwrite() {
+             select(document).interrupt('history.perform');
+             return _overwrite(arguments, 1);
+           },
+           pop: function pop(n) {
+             select(document).interrupt('history.perform');
+             var previous = _stack[_index].graph;
+
+             if (isNaN(+n) || +n < 0) {
+               n = 1;
+             }
+
+             while (n-- > 0 && _index > 0) {
+               _index--;
+
+               _stack.pop();
+             }
+
+             return change(previous);
+           },
+           // Back to the previous annotated state or _index = 0.
+           undo: function undo() {
+             select(document).interrupt('history.perform');
+             var previousStack = _stack[_index];
+             var previous = previousStack.graph;
+
+             while (_index > 0) {
+               _index--;
+               if (_stack[_index].annotation) break;
+             }
+
+             dispatch.call('undone', this, _stack[_index], previousStack);
+             return change(previous);
+           },
+           // Forward to the next annotated state.
+           redo: function redo() {
+             select(document).interrupt('history.perform');
+             var previousStack = _stack[_index];
+             var previous = previousStack.graph;
+             var tryIndex = _index;
+
+             while (tryIndex < _stack.length - 1) {
+               tryIndex++;
+
+               if (_stack[tryIndex].annotation) {
+                 _index = tryIndex;
+                 dispatch.call('redone', this, _stack[_index], previousStack);
+                 break;
+               }
+             }
+
+             return change(previous);
+           },
+           pauseChangeDispatch: function pauseChangeDispatch() {
+             if (!_pausedGraph) {
+               _pausedGraph = _stack[_index].graph;
+             }
+           },
+           resumeChangeDispatch: function resumeChangeDispatch() {
+             if (_pausedGraph) {
+               var previous = _pausedGraph;
+               _pausedGraph = null;
+               return change(previous);
+             }
+           },
+           undoAnnotation: function undoAnnotation() {
+             var i = _index;
+
+             while (i >= 0) {
+               if (_stack[i].annotation) return _stack[i].annotation;
+               i--;
+             }
+           },
+           redoAnnotation: function redoAnnotation() {
+             var i = _index + 1;
+
+             while (i <= _stack.length - 1) {
+               if (_stack[i].annotation) return _stack[i].annotation;
+               i++;
+             }
+           },
+           // Returns the entities from the active graph with bounding boxes
+           // overlapping the given `extent`.
+           intersects: function intersects(extent) {
+             return _tree.intersects(extent, _stack[_index].graph);
+           },
+           difference: function difference() {
+             var base = _stack[0].graph;
+             var head = _stack[_index].graph;
+             return coreDifference(base, head);
+           },
+           changes: function changes(action) {
+             var base = _stack[0].graph;
+             var head = _stack[_index].graph;
+
+             if (action) {
+               head = action(head);
+             }
+
+             var difference = coreDifference(base, head);
+             return {
+               modified: difference.modified(),
+               created: difference.created(),
+               deleted: difference.deleted()
+             };
+           },
+           hasChanges: function hasChanges() {
+             return this.difference().length() > 0;
+           },
+           imageryUsed: function imageryUsed(sources) {
+             if (sources) {
+               _imageryUsed = sources;
+               return history;
+             } else {
+               var s = new Set();
+
+               _stack.slice(1, _index + 1).forEach(function (state) {
+                 state.imageryUsed.forEach(function (source) {
+                   if (source !== 'Custom') {
+                     s.add(source);
+                   }
+                 });
+               });
+
+               return Array.from(s);
+             }
+           },
+           photoOverlaysUsed: function photoOverlaysUsed(sources) {
+             if (sources) {
+               _photoOverlaysUsed = sources;
+               return history;
+             } else {
+               var s = new Set();
+
+               _stack.slice(1, _index + 1).forEach(function (state) {
+                 if (state.photoOverlaysUsed && Array.isArray(state.photoOverlaysUsed)) {
+                   state.photoOverlaysUsed.forEach(function (photoOverlay) {
+                     s.add(photoOverlay);
+                   });
+                 }
+               });
+
+               return Array.from(s);
+             }
+           },
+           // save the current history state
+           checkpoint: function checkpoint(key) {
+             _checkpoints[key] = {
+               stack: _stack,
+               index: _index
+             };
+             return history;
+           },
+           // restore history state to a given checkpoint or reset completely
+           reset: function reset(key) {
+             if (key !== undefined && _checkpoints.hasOwnProperty(key)) {
+               _stack = _checkpoints[key].stack;
+               _index = _checkpoints[key].index;
+             } else {
+               _stack = [{
+                 graph: coreGraph()
+               }];
+               _index = 0;
+               _tree = coreTree(_stack[0].graph);
+               _checkpoints = {};
+             }
+
+             dispatch.call('reset');
+             dispatch.call('change');
+             return history;
+           },
+           // `toIntroGraph()` is used to export the intro graph used by the walkthrough.
+           //
+           // To use it:
+           //  1. Start the walkthrough.
+           //  2. Get to a "free editing" tutorial step
+           //  3. Make your edits to the walkthrough map
+           //  4. In your browser dev console run:
+           //        `id.history().toIntroGraph()`
+           //  5. This outputs stringified JSON to the browser console
+           //  6. Copy it to `data/intro_graph.json` and prettify it in your code editor
+           toIntroGraph: function toIntroGraph() {
+             var nextID = {
+               n: 0,
+               r: 0,
+               w: 0
+             };
+             var permIDs = {};
+             var graph = this.graph();
+             var baseEntities = {}; // clone base entities..
+
+             Object.values(graph.base().entities).forEach(function (entity) {
+               var copy = copyIntroEntity(entity);
+               baseEntities[copy.id] = copy;
+             }); // replace base entities with head entities..
+
+             Object.keys(graph.entities).forEach(function (id) {
+               var entity = graph.entities[id];
+
+               if (entity) {
+                 var copy = copyIntroEntity(entity);
+                 baseEntities[copy.id] = copy;
+               } else {
+                 delete baseEntities[id];
+               }
+             }); // swap temporary for permanent ids..
+
+             Object.values(baseEntities).forEach(function (entity) {
+               if (Array.isArray(entity.nodes)) {
+                 entity.nodes = entity.nodes.map(function (node) {
+                   return permIDs[node] || node;
+                 });
+               }
+
+               if (Array.isArray(entity.members)) {
+                 entity.members = entity.members.map(function (member) {
+                   member.id = permIDs[member.id] || member.id;
+                   return member;
+                 });
+               }
+             });
+             return JSON.stringify({
+               dataIntroGraph: baseEntities
+             });
+
+             function copyIntroEntity(source) {
+               var copy = utilObjectOmit(source, ['type', 'user', 'v', 'version', 'visible']); // Note: the copy is no longer an osmEntity, so it might not have `tags`
+
+               if (copy.tags && !Object.keys(copy.tags)) {
+                 delete copy.tags;
+               }
+
+               if (Array.isArray(copy.loc)) {
+                 copy.loc[0] = +copy.loc[0].toFixed(6);
+                 copy.loc[1] = +copy.loc[1].toFixed(6);
+               }
+
+               var match = source.id.match(/([nrw])-\d*/); // temporary id
+
+               if (match !== null) {
+                 var nrw = match[1];
+                 var permID;
+
+                 do {
+                   permID = nrw + ++nextID[nrw];
+                 } while (baseEntities.hasOwnProperty(permID));
+
+                 copy.id = permIDs[source.id] = permID;
+               }
+
+               return copy;
+             }
+           },
+           toJSON: function toJSON() {
+             if (!this.hasChanges()) return;
+             var allEntities = {};
+             var baseEntities = {};
+             var base = _stack[0];
+
+             var s = _stack.map(function (i) {
+               var modified = [];
+               var deleted = [];
+               Object.keys(i.graph.entities).forEach(function (id) {
+                 var entity = i.graph.entities[id];
+
+                 if (entity) {
+                   var key = osmEntity.key(entity);
+                   allEntities[key] = entity;
+                   modified.push(key);
+                 } else {
+                   deleted.push(id);
+                 } // make sure that the originals of changed or deleted entities get merged
+                 // into the base of the _stack after restoring the data from JSON.
+
+
+                 if (id in base.graph.entities) {
+                   baseEntities[id] = base.graph.entities[id];
+                 }
+
+                 if (entity && entity.nodes) {
+                   // get originals of pre-existing child nodes
+                   entity.nodes.forEach(function (nodeID) {
+                     if (nodeID in base.graph.entities) {
+                       baseEntities[nodeID] = base.graph.entities[nodeID];
+                     }
+                   });
+                 } // get originals of parent entities too
+
+
+                 var baseParents = base.graph._parentWays[id];
+
+                 if (baseParents) {
+                   baseParents.forEach(function (parentID) {
+                     if (parentID in base.graph.entities) {
+                       baseEntities[parentID] = base.graph.entities[parentID];
+                     }
+                   });
+                 }
+               });
+               var x = {};
+               if (modified.length) x.modified = modified;
+               if (deleted.length) x.deleted = deleted;
+               if (i.imageryUsed) x.imageryUsed = i.imageryUsed;
+               if (i.photoOverlaysUsed) x.photoOverlaysUsed = i.photoOverlaysUsed;
+               if (i.annotation) x.annotation = i.annotation;
+               if (i.transform) x.transform = i.transform;
+               if (i.selectedIDs) x.selectedIDs = i.selectedIDs;
+               return x;
+             });
+
+             return JSON.stringify({
+               version: 3,
+               entities: Object.values(allEntities),
+               baseEntities: Object.values(baseEntities),
+               stack: s,
+               nextIDs: osmEntity.id.next,
+               index: _index,
+               // note the time the changes were saved
+               timestamp: new Date().getTime()
+             });
+           },
+           fromJSON: function fromJSON(json, loadChildNodes) {
+             var h = JSON.parse(json);
+             var loadComplete = true;
+             osmEntity.id.next = h.nextIDs;
+             _index = h.index;
+
+             if (h.version === 2 || h.version === 3) {
+               var allEntities = {};
+               h.entities.forEach(function (entity) {
+                 allEntities[osmEntity.key(entity)] = osmEntity(entity);
+               });
+
+               if (h.version === 3) {
+                 // This merges originals for changed entities into the base of
+                 // the _stack even if the current _stack doesn't have them (for
+                 // example when iD has been restarted in a different region)
+                 var baseEntities = h.baseEntities.map(function (d) {
+                   return osmEntity(d);
+                 });
+
+                 var stack = _stack.map(function (state) {
+                   return state.graph;
+                 });
+
+                 _stack[0].graph.rebase(baseEntities, stack, true);
+
+                 _tree.rebase(baseEntities, true); // When we restore a modified way, we also need to fetch any missing
+                 // childnodes that would normally have been downloaded with it.. #2142
+
+
+                 if (loadChildNodes) {
+                   var osm = context.connection();
+                   var baseWays = baseEntities.filter(function (e) {
+                     return e.type === 'way';
+                   });
+                   var nodeIDs = baseWays.reduce(function (acc, way) {
+                     return utilArrayUnion(acc, way.nodes);
+                   }, []);
+                   var missing = nodeIDs.filter(function (n) {
+                     return !_stack[0].graph.hasEntity(n);
+                   });
+
+                   if (missing.length && osm) {
+                     loadComplete = false;
+                     context.map().redrawEnable(false);
+                     var loading = uiLoading(context).blocking(true);
+                     context.container().call(loading);
+
+                     var childNodesLoaded = function childNodesLoaded(err, result) {
+                       if (!err) {
+                         var visibleGroups = utilArrayGroupBy(result.data, 'visible');
+                         var visibles = visibleGroups["true"] || []; // alive nodes
+
+                         var invisibles = visibleGroups["false"] || []; // deleted nodes
+
+                         if (visibles.length) {
+                           var visibleIDs = visibles.map(function (entity) {
+                             return entity.id;
+                           });
+
+                           var stack = _stack.map(function (state) {
+                             return state.graph;
+                           });
+
+                           missing = utilArrayDifference(missing, visibleIDs);
+
+                           _stack[0].graph.rebase(visibles, stack, true);
+
+                           _tree.rebase(visibles, true);
+                         } // fetch older versions of nodes that were deleted..
+
+
+                         invisibles.forEach(function (entity) {
+                           osm.loadEntityVersion(entity.id, +entity.version - 1, childNodesLoaded);
+                         });
+                       }
+
+                       if (err || !missing.length) {
+                         loading.close();
+                         context.map().redrawEnable(true);
+                         dispatch.call('change');
+                         dispatch.call('restore', this);
+                       }
+                     };
+
+                     osm.loadMultiple(missing, childNodesLoaded);
+                   }
+                 }
+               }
+
+               _stack = h.stack.map(function (d) {
+                 var entities = {},
+                     entity;
+
+                 if (d.modified) {
+                   d.modified.forEach(function (key) {
+                     entity = allEntities[key];
+                     entities[entity.id] = entity;
+                   });
+                 }
+
+                 if (d.deleted) {
+                   d.deleted.forEach(function (id) {
+                     entities[id] = undefined;
+                   });
+                 }
+
+                 return {
+                   graph: coreGraph(_stack[0].graph).load(entities),
+                   annotation: d.annotation,
+                   imageryUsed: d.imageryUsed,
+                   photoOverlaysUsed: d.photoOverlaysUsed,
+                   transform: d.transform,
+                   selectedIDs: d.selectedIDs
+                 };
+               });
+             } else {
+               // original version
+               _stack = h.stack.map(function (d) {
+                 var entities = {};
+
+                 for (var i in d.entities) {
+                   var entity = d.entities[i];
+                   entities[i] = entity === 'undefined' ? undefined : osmEntity(entity);
+                 }
+
+                 d.graph = coreGraph(_stack[0].graph).load(entities);
+                 return d;
+               });
+             }
+
+             var transform = _stack[_index].transform;
+
+             if (transform) {
+               context.map().transformEase(transform, 0); // 0 = immediate, no easing
+             }
+
+             if (loadComplete) {
+               dispatch.call('change');
+               dispatch.call('restore', this);
+             }
+
+             return history;
+           },
+           lock: function lock() {
+             return _lock.lock();
+           },
+           unlock: function unlock() {
+             _lock.unlock();
+           },
+           save: function save() {
+             if (_lock.locked() && // don't overwrite existing, unresolved changes
+             !_hasUnresolvedRestorableChanges) {
+               var success = corePreferences(getKey('saved_history'), history.toJSON() || null);
+               if (!success) dispatch.call('storage_error');
+             }
+
+             return history;
+           },
+           // delete the history version saved in localStorage
+           clearSaved: function clearSaved() {
+             context.debouncedSave.cancel();
+
+             if (_lock.locked()) {
+               _hasUnresolvedRestorableChanges = false;
+               corePreferences(getKey('saved_history'), null); // clear the changeset metadata associated with the saved history
+
+               corePreferences('comment', null);
+               corePreferences('hashtags', null);
+               corePreferences('source', null);
+             }
+
+             return history;
+           },
+           savedHistoryJSON: function savedHistoryJSON() {
+             return corePreferences(getKey('saved_history'));
+           },
+           hasRestorableChanges: function hasRestorableChanges() {
+             return _hasUnresolvedRestorableChanges;
+           },
+           // load history from a version stored in localStorage
+           restore: function restore() {
+             if (_lock.locked()) {
+               _hasUnresolvedRestorableChanges = false;
+               var json = this.savedHistoryJSON();
+               if (json) history.fromJSON(json, true);
+             }
+           },
+           _getKey: getKey
+         };
+         history.reset();
+         return utilRebind(history, dispatch, 'on');
+       }
+
+       /**
+        * Look for roads that can be connected to other roads with a short extension
+        */
+
+       function validationAlmostJunction(context) {
+         var type = 'almost_junction';
+         var EXTEND_TH_METERS = 5;
+         var WELD_TH_METERS = 0.75; // Comes from considering bounding case of parallel ways
+
+         var CLOSE_NODE_TH = EXTEND_TH_METERS - WELD_TH_METERS; // Comes from considering bounding case of perpendicular ways
+
+         var SIG_ANGLE_TH = Math.atan(WELD_TH_METERS / EXTEND_TH_METERS);
+
+         function isHighway(entity) {
+           return entity.type === 'way' && osmRoutableHighwayTagValues[entity.tags.highway];
+         }
+
+         function isTaggedAsNotContinuing(node) {
+           return node.tags.noexit === 'yes' || node.tags.amenity === 'parking_entrance' || node.tags.entrance && node.tags.entrance !== 'no';
+         }
+
+         var validation = function checkAlmostJunction(entity, graph) {
+           if (!isHighway(entity)) return [];
+           if (entity.isDegenerate()) return [];
+           var tree = context.history().tree();
+           var extendableNodeInfos = findConnectableEndNodesByExtension(entity);
+           var issues = [];
+           extendableNodeInfos.forEach(function (extendableNodeInfo) {
+             issues.push(new validationIssue({
+               type: type,
+               subtype: 'highway-highway',
+               severity: 'warning',
+               message: function message(context) {
+                 var entity1 = context.hasEntity(this.entityIds[0]);
+
+                 if (this.entityIds[0] === this.entityIds[2]) {
+                   return entity1 ? _t.html('issues.almost_junction.self.message', {
+                     feature: utilDisplayLabel(entity1, context.graph())
+                   }) : '';
+                 } else {
+                   var entity2 = context.hasEntity(this.entityIds[2]);
+                   return entity1 && entity2 ? _t.html('issues.almost_junction.message', {
+                     feature: utilDisplayLabel(entity1, context.graph()),
+                     feature2: utilDisplayLabel(entity2, context.graph())
+                   }) : '';
+                 }
+               },
+               reference: showReference,
+               entityIds: [entity.id, extendableNodeInfo.node.id, extendableNodeInfo.wid],
+               loc: extendableNodeInfo.node.loc,
+               hash: JSON.stringify(extendableNodeInfo.node.loc),
+               data: {
+                 midId: extendableNodeInfo.mid.id,
+                 edge: extendableNodeInfo.edge,
+                 cross_loc: extendableNodeInfo.cross_loc
+               },
+               dynamicFixes: makeFixes
+             }));
+           });
+           return issues;
+
+           function makeFixes(context) {
+             var fixes = [new validationIssueFix({
+               icon: 'iD-icon-abutment',
+               title: _t.html('issues.fix.connect_features.title'),
+               onClick: function onClick(context) {
+                 var annotation = _t('issues.fix.connect_almost_junction.annotation');
+
+                 var _this$issue$entityIds = _slicedToArray(this.issue.entityIds, 3),
+                     endNodeId = _this$issue$entityIds[1],
+                     crossWayId = _this$issue$entityIds[2];
+
+                 var midNode = context.entity(this.issue.data.midId);
+                 var endNode = context.entity(endNodeId);
+                 var crossWay = context.entity(crossWayId); // When endpoints are close, just join if resulting small change in angle (#7201)
+
+                 var nearEndNodes = findNearbyEndNodes(endNode, crossWay);
+
+                 if (nearEndNodes.length > 0) {
+                   var collinear = findSmallJoinAngle(midNode, endNode, nearEndNodes);
+
+                   if (collinear) {
+                     context.perform(actionMergeNodes([collinear.id, endNode.id], collinear.loc), annotation);
+                     return;
+                   }
+                 }
+
+                 var targetEdge = this.issue.data.edge;
+                 var crossLoc = this.issue.data.cross_loc;
+                 var edgeNodes = [context.entity(targetEdge[0]), context.entity(targetEdge[1])];
+                 var closestNodeInfo = geoSphericalClosestNode(edgeNodes, crossLoc); // already a point nearby, just connect to that
+
+                 if (closestNodeInfo.distance < WELD_TH_METERS) {
+                   context.perform(actionMergeNodes([closestNodeInfo.node.id, endNode.id], closestNodeInfo.node.loc), annotation); // else add the end node to the edge way
+                 } else {
+                   context.perform(actionAddMidpoint({
+                     loc: crossLoc,
+                     edge: targetEdge
+                   }, endNode), annotation);
+                 }
+               }
+             })];
+             var node = context.hasEntity(this.entityIds[1]);
+
+             if (node && !node.hasInterestingTags()) {
+               // node has no descriptive tags, suggest noexit fix
+               fixes.push(new validationIssueFix({
+                 icon: 'maki-barrier',
+                 title: _t.html('issues.fix.tag_as_disconnected.title'),
+                 onClick: function onClick(context) {
+                   var nodeID = this.issue.entityIds[1];
+                   var tags = Object.assign({}, context.entity(nodeID).tags);
+                   tags.noexit = 'yes';
+                   context.perform(actionChangeTags(nodeID, tags), _t('issues.fix.tag_as_disconnected.annotation'));
+                 }
+               }));
+             }
+
+             return fixes;
+           }
+
+           function showReference(selection) {
+             selection.selectAll('.issue-reference').data([0]).enter().append('div').attr('class', 'issue-reference').call(_t.append('issues.almost_junction.highway-highway.reference'));
+           }
+
+           function isExtendableCandidate(node, way) {
+             // can not accurately test vertices on tiles not downloaded from osm - #5938
+             var osm = services.osm;
+
+             if (osm && !osm.isDataLoaded(node.loc)) {
+               return false;
+             }
+
+             if (isTaggedAsNotContinuing(node) || graph.parentWays(node).length !== 1) {
+               return false;
+             }
+
+             var occurrences = 0;
+
+             for (var index in way.nodes) {
+               if (way.nodes[index] === node.id) {
+                 occurrences += 1;
+
+                 if (occurrences > 1) {
+                   return false;
+                 }
+               }
+             }
+
+             return true;
+           }
+
+           function findConnectableEndNodesByExtension(way) {
+             var results = [];
+             if (way.isClosed()) return results;
+             var testNodes;
+             var indices = [0, way.nodes.length - 1];
+             indices.forEach(function (nodeIndex) {
+               var nodeID = way.nodes[nodeIndex];
+               var node = graph.entity(nodeID);
+               if (!isExtendableCandidate(node, way)) return;
+               var connectionInfo = canConnectByExtend(way, nodeIndex);
+               if (!connectionInfo) return;
+               testNodes = graph.childNodes(way).slice(); // shallow copy
+
+               testNodes[nodeIndex] = testNodes[nodeIndex].move(connectionInfo.cross_loc); // don't flag issue if connecting the ways would cause self-intersection
+
+               if (geoHasSelfIntersections(testNodes, nodeID)) return;
+               results.push(connectionInfo);
+             });
+             return results;
+           }
+
+           function findNearbyEndNodes(node, way) {
+             return [way.nodes[0], way.nodes[way.nodes.length - 1]].map(function (d) {
+               return graph.entity(d);
+             }).filter(function (d) {
+               // Node cannot be near to itself, but other endnode of same way could be
+               return d.id !== node.id && geoSphericalDistance(node.loc, d.loc) <= CLOSE_NODE_TH;
+             });
+           }
+
+           function findSmallJoinAngle(midNode, tipNode, endNodes) {
+             // Both nodes could be close, so want to join whichever is closest to collinear
+             var joinTo;
+             var minAngle = Infinity; // Checks midNode -> tipNode -> endNode for collinearity
+
+             endNodes.forEach(function (endNode) {
+               var a1 = geoAngle(midNode, tipNode, context.projection) + Math.PI;
+               var a2 = geoAngle(midNode, endNode, context.projection) + Math.PI;
+               var diff = Math.max(a1, a2) - Math.min(a1, a2);
+
+               if (diff < minAngle) {
+                 joinTo = endNode;
+                 minAngle = diff;
+               }
+             });
+             /* Threshold set by considering right angle triangle
+             based on node joining threshold and extension distance */
+
+             if (minAngle <= SIG_ANGLE_TH) return joinTo;
+             return null;
+           }
+
+           function hasTag(tags, key) {
+             return tags[key] !== undefined && tags[key] !== 'no';
+           }
+
+           function canConnectWays(way, way2) {
+             // allow self-connections
+             if (way.id === way2.id) return true; // if one is bridge or tunnel, both must be bridge or tunnel
+
+             if ((hasTag(way.tags, 'bridge') || hasTag(way2.tags, 'bridge')) && !(hasTag(way.tags, 'bridge') && hasTag(way2.tags, 'bridge'))) return false;
+             if ((hasTag(way.tags, 'tunnel') || hasTag(way2.tags, 'tunnel')) && !(hasTag(way.tags, 'tunnel') && hasTag(way2.tags, 'tunnel'))) return false; // must have equivalent layers and levels
+
+             var layer1 = way.tags.layer || '0',
+                 layer2 = way2.tags.layer || '0';
+             if (layer1 !== layer2) return false;
+             var level1 = way.tags.level || '0',
+                 level2 = way2.tags.level || '0';
+             if (level1 !== level2) return false;
+             return true;
+           }
+
+           function canConnectByExtend(way, endNodeIdx) {
+             var tipNid = way.nodes[endNodeIdx]; // the 'tip' node for extension point
+
+             var midNid = endNodeIdx === 0 ? way.nodes[1] : way.nodes[way.nodes.length - 2]; // the other node of the edge
+
+             var tipNode = graph.entity(tipNid);
+             var midNode = graph.entity(midNid);
+             var lon = tipNode.loc[0];
+             var lat = tipNode.loc[1];
+             var lon_range = geoMetersToLon(EXTEND_TH_METERS, lat) / 2;
+             var lat_range = geoMetersToLat(EXTEND_TH_METERS) / 2;
+             var queryExtent = geoExtent([[lon - lon_range, lat - lat_range], [lon + lon_range, lat + lat_range]]); // first, extend the edge of [midNode -> tipNode] by EXTEND_TH_METERS and find the "extended tip" location
+
+             var edgeLen = geoSphericalDistance(midNode.loc, tipNode.loc);
+             var t = EXTEND_TH_METERS / edgeLen + 1.0;
+             var extTipLoc = geoVecInterp(midNode.loc, tipNode.loc, t); // then, check if the extension part [tipNode.loc -> extTipLoc] intersects any other ways
+
+             var segmentInfos = tree.waySegments(queryExtent, graph);
+
+             for (var i = 0; i < segmentInfos.length; i++) {
+               var segmentInfo = segmentInfos[i];
+               var way2 = graph.entity(segmentInfo.wayId);
+               if (!isHighway(way2)) continue;
+               if (!canConnectWays(way, way2)) continue;
+               var nAid = segmentInfo.nodes[0],
+                   nBid = segmentInfo.nodes[1];
+               if (nAid === tipNid || nBid === tipNid) continue;
+               var nA = graph.entity(nAid),
+                   nB = graph.entity(nBid);
+               var crossLoc = geoLineIntersection([tipNode.loc, extTipLoc], [nA.loc, nB.loc]);
+
+               if (crossLoc) {
+                 return {
+                   mid: midNode,
+                   node: tipNode,
+                   wid: way2.id,
+                   edge: [nA.id, nB.id],
+                   cross_loc: crossLoc
+                 };
+               }
+             }
+
+             return null;
+           }
+         };
+
+         validation.type = type;
+         return validation;
+       }
+
+       function validationCloseNodes(context) {
+         var type = 'close_nodes';
+         var pointThresholdMeters = 0.2;
+
+         var validation = function validation(entity, graph) {
+           if (entity.type === 'node') {
+             return getIssuesForNode(entity);
+           } else if (entity.type === 'way') {
+             return getIssuesForWay(entity);
+           }
+
+           return [];
+
+           function getIssuesForNode(node) {
+             var parentWays = graph.parentWays(node);
+
+             if (parentWays.length) {
+               return getIssuesForVertex(node, parentWays);
+             } else {
+               return getIssuesForDetachedPoint(node);
+             }
+           }
+
+           function wayTypeFor(way) {
+             if (way.tags.boundary && way.tags.boundary !== 'no') return 'boundary';
+             if (way.tags.indoor && way.tags.indoor !== 'no') return 'indoor';
+             if (way.tags.building && way.tags.building !== 'no' || way.tags['building:part'] && way.tags['building:part'] !== 'no') return 'building';
+             if (osmPathHighwayTagValues[way.tags.highway]) return 'path';
+             var parentRelations = graph.parentRelations(way);
+
+             for (var i in parentRelations) {
+               var relation = parentRelations[i];
+               if (relation.tags.type === 'boundary') return 'boundary';
+
+               if (relation.isMultipolygon()) {
+                 if (relation.tags.indoor && relation.tags.indoor !== 'no') return 'indoor';
+                 if (relation.tags.building && relation.tags.building !== 'no' || relation.tags['building:part'] && relation.tags['building:part'] !== 'no') return 'building';
+               }
+             }
+
+             return 'other';
+           }
+
+           function shouldCheckWay(way) {
+             // don't flag issues where merging would create degenerate ways
+             if (way.nodes.length <= 2 || way.isClosed() && way.nodes.length <= 4) return false;
+             var bbox = way.extent(graph).bbox();
+             var hypotenuseMeters = geoSphericalDistance([bbox.minX, bbox.minY], [bbox.maxX, bbox.maxY]); // don't flag close nodes in very small ways
+
+             if (hypotenuseMeters < 1.5) return false;
+             return true;
+           }
+
+           function getIssuesForWay(way) {
+             if (!shouldCheckWay(way)) return [];
+             var issues = [],
+                 nodes = graph.childNodes(way);
+
+             for (var i = 0; i < nodes.length - 1; i++) {
+               var node1 = nodes[i];
+               var node2 = nodes[i + 1];
+               var issue = getWayIssueIfAny(node1, node2, way);
+               if (issue) issues.push(issue);
+             }
+
+             return issues;
+           }
+
+           function getIssuesForVertex(node, parentWays) {
+             var issues = [];
+
+             function checkForCloseness(node1, node2, way) {
+               var issue = getWayIssueIfAny(node1, node2, way);
+               if (issue) issues.push(issue);
+             }
+
+             for (var i = 0; i < parentWays.length; i++) {
+               var parentWay = parentWays[i];
+               if (!shouldCheckWay(parentWay)) continue;
+               var lastIndex = parentWay.nodes.length - 1;
+
+               for (var j = 0; j < parentWay.nodes.length; j++) {
+                 if (j !== 0) {
+                   if (parentWay.nodes[j - 1] === node.id) {
+                     checkForCloseness(node, graph.entity(parentWay.nodes[j]), parentWay);
+                   }
+                 }
+
+                 if (j !== lastIndex) {
+                   if (parentWay.nodes[j + 1] === node.id) {
+                     checkForCloseness(graph.entity(parentWay.nodes[j]), node, parentWay);
+                   }
+                 }
+               }
+             }
+
+             return issues;
+           }
+
+           function thresholdMetersForWay(way) {
+             if (!shouldCheckWay(way)) return 0;
+             var wayType = wayTypeFor(way); // don't flag boundaries since they might be highly detailed and can't be easily verified
+
+             if (wayType === 'boundary') return 0; // expect some features to be mapped with higher levels of detail
+
+             if (wayType === 'indoor') return 0.01;
+             if (wayType === 'building') return 0.05;
+             if (wayType === 'path') return 0.1;
+             return 0.2;
+           }
+
+           function getIssuesForDetachedPoint(node) {
+             var issues = [];
+             var lon = node.loc[0];
+             var lat = node.loc[1];
+             var lon_range = geoMetersToLon(pointThresholdMeters, lat) / 2;
+             var lat_range = geoMetersToLat(pointThresholdMeters) / 2;
+             var queryExtent = geoExtent([[lon - lon_range, lat - lat_range], [lon + lon_range, lat + lat_range]]);
+             var intersected = context.history().tree().intersects(queryExtent, graph);
+
+             for (var j = 0; j < intersected.length; j++) {
+               var nearby = intersected[j];
+               if (nearby.id === node.id) continue;
+               if (nearby.type !== 'node' || nearby.geometry(graph) !== 'point') continue;
+
+               if (nearby.loc === node.loc || geoSphericalDistance(node.loc, nearby.loc) < pointThresholdMeters) {
+                 // allow very close points if tags indicate the z-axis might vary
+                 var zAxisKeys = {
+                   layer: true,
+                   level: true,
+                   'addr:housenumber': true,
+                   'addr:unit': true
+                 };
+                 var zAxisDifferentiates = false;
+
+                 for (var key in zAxisKeys) {
+                   var nodeValue = node.tags[key] || '0';
+                   var nearbyValue = nearby.tags[key] || '0';
+
+                   if (nodeValue !== nearbyValue) {
+                     zAxisDifferentiates = true;
+                     break;
+                   }
+                 }
+
+                 if (zAxisDifferentiates) continue;
+                 issues.push(new validationIssue({
+                   type: type,
+                   subtype: 'detached',
+                   severity: 'warning',
+                   message: function message(context) {
+                     var entity = context.hasEntity(this.entityIds[0]),
+                         entity2 = context.hasEntity(this.entityIds[1]);
+                     return entity && entity2 ? _t.html('issues.close_nodes.detached.message', {
+                       feature: utilDisplayLabel(entity, context.graph()),
+                       feature2: utilDisplayLabel(entity2, context.graph())
+                     }) : '';
+                   },
+                   reference: showReference,
+                   entityIds: [node.id, nearby.id],
+                   dynamicFixes: function dynamicFixes() {
+                     return [new validationIssueFix({
+                       icon: 'iD-operation-disconnect',
+                       title: _t.html('issues.fix.move_points_apart.title')
+                     }), new validationIssueFix({
+                       icon: 'iD-icon-layers',
+                       title: _t.html('issues.fix.use_different_layers_or_levels.title')
+                     })];
+                   }
+                 }));
+               }
+             }
+
+             return issues;
+
+             function showReference(selection) {
+               var referenceText = _t('issues.close_nodes.detached.reference');
+               selection.selectAll('.issue-reference').data([0]).enter().append('div').attr('class', 'issue-reference').html(referenceText);
+             }
+           }
+
+           function getWayIssueIfAny(node1, node2, way) {
+             if (node1.id === node2.id || node1.hasInterestingTags() && node2.hasInterestingTags()) {
+               return null;
+             }
+
+             if (node1.loc !== node2.loc) {
+               var parentWays1 = graph.parentWays(node1);
+               var parentWays2 = new Set(graph.parentWays(node2));
+               var sharedWays = parentWays1.filter(function (parentWay) {
+                 return parentWays2.has(parentWay);
+               });
+               var thresholds = sharedWays.map(function (parentWay) {
+                 return thresholdMetersForWay(parentWay);
+               });
+               var threshold = Math.min.apply(Math, _toConsumableArray(thresholds));
+               var distance = geoSphericalDistance(node1.loc, node2.loc);
+               if (distance > threshold) return null;
+             }
+
+             return new validationIssue({
+               type: type,
+               subtype: 'vertices',
+               severity: 'warning',
+               message: function message(context) {
+                 var entity = context.hasEntity(this.entityIds[0]);
+                 return entity ? _t.html('issues.close_nodes.message', {
+                   way: utilDisplayLabel(entity, context.graph())
+                 }) : '';
+               },
+               reference: showReference,
+               entityIds: [way.id, node1.id, node2.id],
+               loc: node1.loc,
+               dynamicFixes: function dynamicFixes() {
+                 return [new validationIssueFix({
+                   icon: 'iD-icon-plus',
+                   title: _t.html('issues.fix.merge_points.title'),
+                   onClick: function onClick(context) {
+                     var entityIds = this.issue.entityIds;
+                     var action = actionMergeNodes([entityIds[1], entityIds[2]]);
+                     context.perform(action, _t('issues.fix.merge_close_vertices.annotation'));
+                   }
+                 }), new validationIssueFix({
+                   icon: 'iD-operation-disconnect',
+                   title: _t.html('issues.fix.move_points_apart.title')
+                 })];
+               }
+             });
+
+             function showReference(selection) {
+               var referenceText = _t('issues.close_nodes.reference');
+               selection.selectAll('.issue-reference').data([0]).enter().append('div').attr('class', 'issue-reference').html(referenceText);
+             }
+           }
+         };
+
+         validation.type = type;
+         return validation;
+       }
+
+       function validationCrossingWays(context) {
+         var type = 'crossing_ways'; // returns the way or its parent relation, whichever has a useful feature type
+
+         function getFeatureWithFeatureTypeTagsForWay(way, graph) {
+           if (getFeatureType(way, graph) === null) {
+             // if the way doesn't match a feature type, check its parent relations
+             var parentRels = graph.parentRelations(way);
+
+             for (var i = 0; i < parentRels.length; i++) {
+               var rel = parentRels[i];
+
+               if (getFeatureType(rel, graph) !== null) {
+                 return rel;
+               }
+             }
+           }
+
+           return way;
+         }
+
+         function hasTag(tags, key) {
+           return tags[key] !== undefined && tags[key] !== 'no';
+         }
+
+         function taggedAsIndoor(tags) {
+           return hasTag(tags, 'indoor') || hasTag(tags, 'level') || tags.highway === 'corridor';
+         }
+
+         function allowsBridge(featureType) {
+           return featureType === 'highway' || featureType === 'railway' || featureType === 'waterway';
+         }
+
+         function allowsTunnel(featureType) {
+           return featureType === 'highway' || featureType === 'railway' || featureType === 'waterway';
+         } // discard
+
+
+         var ignoredBuildings = {
+           demolished: true,
+           dismantled: true,
+           proposed: true,
+           razed: true
+         };
+
+         function getFeatureType(entity, graph) {
+           var geometry = entity.geometry(graph);
+           if (geometry !== 'line' && geometry !== 'area') return null;
+           var tags = entity.tags;
+           if (hasTag(tags, 'building') && !ignoredBuildings[tags.building]) return 'building';
+           if (hasTag(tags, 'highway') && osmRoutableHighwayTagValues[tags.highway]) return 'highway'; // don't check railway or waterway areas
+
+           if (geometry !== 'line') return null;
+           if (hasTag(tags, 'railway') && osmRailwayTrackTagValues[tags.railway]) return 'railway';
+           if (hasTag(tags, 'waterway') && osmFlowingWaterwayTagValues[tags.waterway]) return 'waterway';
+           return null;
+         }
+
+         function isLegitCrossing(tags1, featureType1, tags2, featureType2) {
+           // assume 0 by default
+           var level1 = tags1.level || '0';
+           var level2 = tags2.level || '0';
+
+           if (taggedAsIndoor(tags1) && taggedAsIndoor(tags2) && level1 !== level2) {
+             // assume features don't interact if they're indoor on different levels
+             return true;
+           } // assume 0 by default; don't use way.layer() since we account for structures here
+
+
+           var layer1 = tags1.layer || '0';
+           var layer2 = tags2.layer || '0';
+
+           if (allowsBridge(featureType1) && allowsBridge(featureType2)) {
+             if (hasTag(tags1, 'bridge') && !hasTag(tags2, 'bridge')) return true;
+             if (!hasTag(tags1, 'bridge') && hasTag(tags2, 'bridge')) return true; // crossing bridges must use different layers
+
+             if (hasTag(tags1, 'bridge') && hasTag(tags2, 'bridge') && layer1 !== layer2) return true;
+           } else if (allowsBridge(featureType1) && hasTag(tags1, 'bridge')) return true;else if (allowsBridge(featureType2) && hasTag(tags2, 'bridge')) return true;
+
+           if (allowsTunnel(featureType1) && allowsTunnel(featureType2)) {
+             if (hasTag(tags1, 'tunnel') && !hasTag(tags2, 'tunnel')) return true;
+             if (!hasTag(tags1, 'tunnel') && hasTag(tags2, 'tunnel')) return true; // crossing tunnels must use different layers
+
+             if (hasTag(tags1, 'tunnel') && hasTag(tags2, 'tunnel') && layer1 !== layer2) return true;
+           } else if (allowsTunnel(featureType1) && hasTag(tags1, 'tunnel')) return true;else if (allowsTunnel(featureType2) && hasTag(tags2, 'tunnel')) return true; // don't flag crossing waterways and pier/highways
+
+
+           if (featureType1 === 'waterway' && featureType2 === 'highway' && tags2.man_made === 'pier') return true;
+           if (featureType2 === 'waterway' && featureType1 === 'highway' && tags1.man_made === 'pier') return true;
+
+           if (featureType1 === 'building' || featureType2 === 'building') {
+             // for building crossings, different layers are enough
+             if (layer1 !== layer2) return true;
+           }
+
+           return false;
+         } // highway values for which we shouldn't recommend connecting to waterways
+
+
+         var highwaysDisallowingFords = {
+           motorway: true,
+           motorway_link: true,
+           trunk: true,
+           trunk_link: true,
+           primary: true,
+           primary_link: true,
+           secondary: true,
+           secondary_link: true
+         };
+         var nonCrossingHighways = {
+           track: true
+         };
+
+         function tagsForConnectionNodeIfAllowed(entity1, entity2, graph) {
+           var featureType1 = getFeatureType(entity1, graph);
+           var featureType2 = getFeatureType(entity2, graph);
+           var geometry1 = entity1.geometry(graph);
+           var geometry2 = entity2.geometry(graph);
+           var bothLines = geometry1 === 'line' && geometry2 === 'line';
+
+           if (featureType1 === featureType2) {
+             if (featureType1 === 'highway') {
+               var entity1IsPath = osmPathHighwayTagValues[entity1.tags.highway];
+               var entity2IsPath = osmPathHighwayTagValues[entity2.tags.highway];
+
+               if ((entity1IsPath || entity2IsPath) && entity1IsPath !== entity2IsPath) {
+                 // one feature is a path but not both
+                 var roadFeature = entity1IsPath ? entity2 : entity1;
+
+                 if (nonCrossingHighways[roadFeature.tags.highway]) {
+                   // don't mark path connections with certain roads as crossings
+                   return {};
+                 }
+
+                 var pathFeature = entity1IsPath ? entity1 : entity2;
+
+                 if (['marked', 'unmarked'].indexOf(pathFeature.tags.crossing) !== -1) {
+                   // if the path is a crossing, match the crossing type
+                   return bothLines ? {
+                     highway: 'crossing',
+                     crossing: pathFeature.tags.crossing
+                   } : {};
+                 } // don't add a `crossing` subtag to ambiguous crossings
+
+
+                 return bothLines ? {
+                   highway: 'crossing'
+                 } : {};
+               }
+
+               return {};
+             }
+
+             if (featureType1 === 'waterway') return {};
+             if (featureType1 === 'railway') return {};
+           } else {
+             var featureTypes = [featureType1, featureType2];
+
+             if (featureTypes.indexOf('highway') !== -1) {
+               if (featureTypes.indexOf('railway') !== -1) {
+                 if (!bothLines) return {};
+                 var isTram = entity1.tags.railway === 'tram' || entity2.tags.railway === 'tram';
+
+                 if (osmPathHighwayTagValues[entity1.tags.highway] || osmPathHighwayTagValues[entity2.tags.highway]) {
+                   // path-tram connections use this tag
+                   if (isTram) return {
+                     railway: 'tram_crossing'
+                   }; // other path-rail connections use this tag
+
+                   return {
+                     railway: 'crossing'
+                   };
+                 } else {
+                   // path-tram connections use this tag
+                   if (isTram) return {
+                     railway: 'tram_level_crossing'
+                   }; // other road-rail connections use this tag
+
+                   return {
+                     railway: 'level_crossing'
+                   };
+                 }
+               }
+
+               if (featureTypes.indexOf('waterway') !== -1) {
+                 // do not allow fords on structures
+                 if (hasTag(entity1.tags, 'tunnel') && hasTag(entity2.tags, 'tunnel')) return null;
+                 if (hasTag(entity1.tags, 'bridge') && hasTag(entity2.tags, 'bridge')) return null;
+
+                 if (highwaysDisallowingFords[entity1.tags.highway] || highwaysDisallowingFords[entity2.tags.highway]) {
+                   // do not allow fords on major highways
+                   return null;
+                 }
+
+                 return bothLines ? {
+                   ford: 'yes'
+                 } : {};
+               }
+             }
+           }
+
+           return null;
+         }
+
+         function findCrossingsByWay(way1, graph, tree) {
+           var edgeCrossInfos = [];
+           if (way1.type !== 'way') return edgeCrossInfos;
+           var taggedFeature1 = getFeatureWithFeatureTypeTagsForWay(way1, graph);
+           var way1FeatureType = getFeatureType(taggedFeature1, graph);
+           if (way1FeatureType === null) return edgeCrossInfos;
+           var checkedSingleCrossingWays = {}; // declare vars ahead of time to reduce garbage collection
+
+           var i, j;
+           var extent;
+           var n1, n2, nA, nB, nAId, nBId;
+           var segment1, segment2;
+           var oneOnly;
+           var segmentInfos, segment2Info, way2, taggedFeature2, way2FeatureType;
+           var way1Nodes = graph.childNodes(way1);
+           var comparedWays = {};
+
+           for (i = 0; i < way1Nodes.length - 1; i++) {
+             n1 = way1Nodes[i];
+             n2 = way1Nodes[i + 1];
+             extent = geoExtent([[Math.min(n1.loc[0], n2.loc[0]), Math.min(n1.loc[1], n2.loc[1])], [Math.max(n1.loc[0], n2.loc[0]), Math.max(n1.loc[1], n2.loc[1])]]); // Optimize by only checking overlapping segments, not every segment
+             // of overlapping ways
+
+             segmentInfos = tree.waySegments(extent, graph);
+
+             for (j = 0; j < segmentInfos.length; j++) {
+               segment2Info = segmentInfos[j]; // don't check for self-intersection in this validation
+
+               if (segment2Info.wayId === way1.id) continue; // skip if this way was already checked and only one issue is needed
+
+               if (checkedSingleCrossingWays[segment2Info.wayId]) continue; // mark this way as checked even if there are no crossings
+
+               comparedWays[segment2Info.wayId] = true;
+               way2 = graph.hasEntity(segment2Info.wayId);
+               if (!way2) continue;
+               taggedFeature2 = getFeatureWithFeatureTypeTagsForWay(way2, graph); // only check crossing highway, waterway, building, and railway
+
+               way2FeatureType = getFeatureType(taggedFeature2, graph);
+
+               if (way2FeatureType === null || isLegitCrossing(taggedFeature1.tags, way1FeatureType, taggedFeature2.tags, way2FeatureType)) {
+                 continue;
+               } // create only one issue for building crossings
+
+
+               oneOnly = way1FeatureType === 'building' || way2FeatureType === 'building';
+               nAId = segment2Info.nodes[0];
+               nBId = segment2Info.nodes[1];
+
+               if (nAId === n1.id || nAId === n2.id || nBId === n1.id || nBId === n2.id) {
+                 // n1 or n2 is a connection node; skip
+                 continue;
+               }
+
+               nA = graph.hasEntity(nAId);
+               if (!nA) continue;
+               nB = graph.hasEntity(nBId);
+               if (!nB) continue;
+               segment1 = [n1.loc, n2.loc];
+               segment2 = [nA.loc, nB.loc];
+               var point = geoLineIntersection(segment1, segment2);
+
+               if (point) {
+                 edgeCrossInfos.push({
+                   wayInfos: [{
+                     way: way1,
+                     featureType: way1FeatureType,
+                     edge: [n1.id, n2.id]
+                   }, {
+                     way: way2,
+                     featureType: way2FeatureType,
+                     edge: [nA.id, nB.id]
+                   }],
+                   crossPoint: point
+                 });
+
+                 if (oneOnly) {
+                   checkedSingleCrossingWays[way2.id] = true;
+                   break;
+                 }
+               }
+             }
+           }
+
+           return edgeCrossInfos;
+         }
+
+         function waysToCheck(entity, graph) {
+           var featureType = getFeatureType(entity, graph);
+           if (!featureType) return [];
+
+           if (entity.type === 'way') {
+             return [entity];
+           } else if (entity.type === 'relation') {
+             return entity.members.reduce(function (array, member) {
+               if (member.type === 'way' && ( // only look at geometry ways
+               !member.role || member.role === 'outer' || member.role === 'inner')) {
+                 var entity = graph.hasEntity(member.id); // don't add duplicates
+
+                 if (entity && array.indexOf(entity) === -1) {
+                   array.push(entity);
+                 }
+               }
+
+               return array;
+             }, []);
+           }
+
+           return [];
+         }
+
+         var validation = function checkCrossingWays(entity, graph) {
+           var tree = context.history().tree();
+           var ways = waysToCheck(entity, graph);
+           var issues = []; // declare these here to reduce garbage collection
+
+           var wayIndex, crossingIndex, crossings;
+
+           for (wayIndex in ways) {
+             crossings = findCrossingsByWay(ways[wayIndex], graph, tree);
+
+             for (crossingIndex in crossings) {
+               issues.push(createIssue(crossings[crossingIndex], graph));
+             }
+           }
+
+           return issues;
+         };
+
+         function createIssue(crossing, graph) {
+           // use the entities with the tags that define the feature type
+           crossing.wayInfos.sort(function (way1Info, way2Info) {
+             var type1 = way1Info.featureType;
+             var type2 = way2Info.featureType;
+
+             if (type1 === type2) {
+               return utilDisplayLabel(way1Info.way, graph) > utilDisplayLabel(way2Info.way, graph);
+             } else if (type1 === 'waterway') {
+               return true;
+             } else if (type2 === 'waterway') {
+               return false;
+             }
+
+             return type1 < type2;
+           });
+           var entities = crossing.wayInfos.map(function (wayInfo) {
+             return getFeatureWithFeatureTypeTagsForWay(wayInfo.way, graph);
+           });
+           var edges = [crossing.wayInfos[0].edge, crossing.wayInfos[1].edge];
+           var featureTypes = [crossing.wayInfos[0].featureType, crossing.wayInfos[1].featureType];
+           var connectionTags = tagsForConnectionNodeIfAllowed(entities[0], entities[1], graph);
+           var featureType1 = crossing.wayInfos[0].featureType;
+           var featureType2 = crossing.wayInfos[1].featureType;
+           var isCrossingIndoors = taggedAsIndoor(entities[0].tags) && taggedAsIndoor(entities[1].tags);
+           var isCrossingTunnels = allowsTunnel(featureType1) && hasTag(entities[0].tags, 'tunnel') && allowsTunnel(featureType2) && hasTag(entities[1].tags, 'tunnel');
+           var isCrossingBridges = allowsBridge(featureType1) && hasTag(entities[0].tags, 'bridge') && allowsBridge(featureType2) && hasTag(entities[1].tags, 'bridge');
+           var subtype = [featureType1, featureType2].sort().join('-');
+           var crossingTypeID = subtype;
+
+           if (isCrossingIndoors) {
+             crossingTypeID = 'indoor-indoor';
+           } else if (isCrossingTunnels) {
+             crossingTypeID = 'tunnel-tunnel';
+           } else if (isCrossingBridges) {
+             crossingTypeID = 'bridge-bridge';
+           }
+
+           if (connectionTags && (isCrossingIndoors || isCrossingTunnels || isCrossingBridges)) {
+             crossingTypeID += '_connectable';
+           } // Differentiate based on the loc rounded to 4 digits, since two ways can cross multiple times.
+
+
+           var uniqueID = crossing.crossPoint[0].toFixed(4) + ',' + crossing.crossPoint[1].toFixed(4);
+           return new validationIssue({
+             type: type,
+             subtype: subtype,
+             severity: 'warning',
+             message: function message(context) {
+               var graph = context.graph();
+               var entity1 = graph.hasEntity(this.entityIds[0]),
+                   entity2 = graph.hasEntity(this.entityIds[1]);
+               return entity1 && entity2 ? _t.html('issues.crossing_ways.message', {
+                 feature: utilDisplayLabel(entity1, graph),
+                 feature2: utilDisplayLabel(entity2, graph)
+               }) : '';
+             },
+             reference: showReference,
+             entityIds: entities.map(function (entity) {
+               return entity.id;
+             }),
+             data: {
+               edges: edges,
+               featureTypes: featureTypes,
+               connectionTags: connectionTags
+             },
+             hash: uniqueID,
+             loc: crossing.crossPoint,
+             dynamicFixes: function dynamicFixes(context) {
+               var mode = context.mode();
+               if (!mode || mode.id !== 'select' || mode.selectedIDs().length !== 1) return [];
+               var selectedIndex = this.entityIds[0] === mode.selectedIDs()[0] ? 0 : 1;
+               var selectedFeatureType = this.data.featureTypes[selectedIndex];
+               var otherFeatureType = this.data.featureTypes[selectedIndex === 0 ? 1 : 0];
+               var fixes = [];
+
+               if (connectionTags) {
+                 fixes.push(makeConnectWaysFix(this.data.connectionTags));
+               }
+
+               if (isCrossingIndoors) {
+                 fixes.push(new validationIssueFix({
+                   icon: 'iD-icon-layers',
+                   title: _t.html('issues.fix.use_different_levels.title')
+                 }));
+               } else if (isCrossingTunnels || isCrossingBridges || featureType1 === 'building' || featureType2 === 'building') {
+                 fixes.push(makeChangeLayerFix('higher'));
+                 fixes.push(makeChangeLayerFix('lower')); // can only add bridge/tunnel if both features are lines
+               } else if (context.graph().geometry(this.entityIds[0]) === 'line' && context.graph().geometry(this.entityIds[1]) === 'line') {
+                 // don't recommend adding bridges to waterways since they're uncommon
+                 if (allowsBridge(selectedFeatureType) && selectedFeatureType !== 'waterway') {
+                   fixes.push(makeAddBridgeOrTunnelFix('add_a_bridge', 'temaki-bridge', 'bridge'));
+                 } // don't recommend adding tunnels under waterways since they're uncommon
+
+
+                 var skipTunnelFix = otherFeatureType === 'waterway' && selectedFeatureType !== 'waterway';
+
+                 if (allowsTunnel(selectedFeatureType) && !skipTunnelFix) {
+                   fixes.push(makeAddBridgeOrTunnelFix('add_a_tunnel', 'temaki-tunnel', 'tunnel'));
+                 }
+               } // repositioning the features is always an option
+
+
+               fixes.push(new validationIssueFix({
+                 icon: 'iD-operation-move',
+                 title: _t.html('issues.fix.reposition_features.title')
+               }));
+               return fixes;
+             }
+           });
+
+           function showReference(selection) {
+             selection.selectAll('.issue-reference').data([0]).enter().append('div').attr('class', 'issue-reference').call(_t.append('issues.crossing_ways.' + crossingTypeID + '.reference'));
+           }
+         }
+
+         function makeAddBridgeOrTunnelFix(fixTitleID, iconName, bridgeOrTunnel) {
+           return new validationIssueFix({
+             icon: iconName,
+             title: _t.html('issues.fix.' + fixTitleID + '.title'),
+             onClick: function onClick(context) {
+               var mode = context.mode();
+               if (!mode || mode.id !== 'select') return;
+               var selectedIDs = mode.selectedIDs();
+               if (selectedIDs.length !== 1) return;
+               var selectedWayID = selectedIDs[0];
+               if (!context.hasEntity(selectedWayID)) return;
+               var resultWayIDs = [selectedWayID];
+               var edge, crossedEdge, crossedWayID;
+
+               if (this.issue.entityIds[0] === selectedWayID) {
+                 edge = this.issue.data.edges[0];
+                 crossedEdge = this.issue.data.edges[1];
+                 crossedWayID = this.issue.entityIds[1];
+               } else {
+                 edge = this.issue.data.edges[1];
+                 crossedEdge = this.issue.data.edges[0];
+                 crossedWayID = this.issue.entityIds[0];
+               }
+
+               var crossingLoc = this.issue.loc;
+               var projection = context.projection;
+
+               var action = function actionAddStructure(graph) {
+                 var edgeNodes = [graph.entity(edge[0]), graph.entity(edge[1])];
+                 var crossedWay = graph.hasEntity(crossedWayID); // use the explicit width of the crossed feature as the structure length, if available
+
+                 var structLengthMeters = crossedWay && crossedWay.tags.width && parseFloat(crossedWay.tags.width);
+
+                 if (!structLengthMeters) {
+                   // if no explicit width is set, approximate the width based on the tags
+                   structLengthMeters = crossedWay && crossedWay.impliedLineWidthMeters();
+                 }
+
+                 if (structLengthMeters) {
+                   if (getFeatureType(crossedWay, graph) === 'railway') {
+                     // bridges over railways are generally much longer than the rail bed itself, compensate
+                     structLengthMeters *= 2;
+                   }
+                 } else {
+                   // should ideally never land here since all rail/water/road tags should have an implied width
+                   structLengthMeters = 8;
+                 }
+
+                 var a1 = geoAngle(edgeNodes[0], edgeNodes[1], projection) + Math.PI;
+                 var a2 = geoAngle(graph.entity(crossedEdge[0]), graph.entity(crossedEdge[1]), projection) + Math.PI;
+                 var crossingAngle = Math.max(a1, a2) - Math.min(a1, a2);
+                 if (crossingAngle > Math.PI) crossingAngle -= Math.PI; // lengthen the structure to account for the angle of the crossing
+
+                 structLengthMeters = structLengthMeters / 2 / Math.sin(crossingAngle) * 2; // add padding since the structure must extend past the edges of the crossed feature
+
+                 structLengthMeters += 4; // clamp the length to a reasonable range
+
+                 structLengthMeters = Math.min(Math.max(structLengthMeters, 4), 50);
+
+                 function geomToProj(geoPoint) {
+                   return [geoLonToMeters(geoPoint[0], geoPoint[1]), geoLatToMeters(geoPoint[1])];
+                 }
+
+                 function projToGeom(projPoint) {
+                   var lat = geoMetersToLat(projPoint[1]);
+                   return [geoMetersToLon(projPoint[0], lat), lat];
+                 }
+
+                 var projEdgeNode1 = geomToProj(edgeNodes[0].loc);
+                 var projEdgeNode2 = geomToProj(edgeNodes[1].loc);
+                 var projectedAngle = geoVecAngle(projEdgeNode1, projEdgeNode2);
+                 var projectedCrossingLoc = geomToProj(crossingLoc);
+                 var linearToSphericalMetersRatio = geoVecLength(projEdgeNode1, projEdgeNode2) / geoSphericalDistance(edgeNodes[0].loc, edgeNodes[1].loc);
+
+                 function locSphericalDistanceFromCrossingLoc(angle, distanceMeters) {
+                   var lengthSphericalMeters = distanceMeters * linearToSphericalMetersRatio;
+                   return projToGeom([projectedCrossingLoc[0] + Math.cos(angle) * lengthSphericalMeters, projectedCrossingLoc[1] + Math.sin(angle) * lengthSphericalMeters]);
+                 }
+
+                 var endpointLocGetter1 = function endpointLocGetter1(lengthMeters) {
+                   return locSphericalDistanceFromCrossingLoc(projectedAngle, lengthMeters);
+                 };
+
+                 var endpointLocGetter2 = function endpointLocGetter2(lengthMeters) {
+                   return locSphericalDistanceFromCrossingLoc(projectedAngle + Math.PI, lengthMeters);
+                 }; // avoid creating very short edges from splitting too close to another node
+
+
+                 var minEdgeLengthMeters = 0.55; // decide where to bound the structure along the way, splitting as necessary
+
+                 function determineEndpoint(edge, endNode, locGetter) {
+                   var newNode;
+                   var idealLengthMeters = structLengthMeters / 2; // distance between the crossing location and the end of the edge,
+                   // the maximum length of this side of the structure
+
+                   var crossingToEdgeEndDistance = geoSphericalDistance(crossingLoc, endNode.loc);
+
+                   if (crossingToEdgeEndDistance - idealLengthMeters > minEdgeLengthMeters) {
+                     // the edge is long enough to insert a new node
+                     // the loc that would result in the full expected length
+                     var idealNodeLoc = locGetter(idealLengthMeters);
+                     newNode = osmNode();
+                     graph = actionAddMidpoint({
+                       loc: idealNodeLoc,
+                       edge: edge
+                     }, newNode)(graph);
+                   } else {
+                     var edgeCount = 0;
+                     endNode.parentIntersectionWays(graph).forEach(function (way) {
+                       way.nodes.forEach(function (nodeID) {
+                         if (nodeID === endNode.id) {
+                           if (endNode.id === way.first() && endNode.id !== way.last() || endNode.id === way.last() && endNode.id !== way.first()) {
+                             edgeCount += 1;
+                           } else {
+                             edgeCount += 2;
+                           }
+                         }
+                       });
+                     });
+
+                     if (edgeCount >= 3) {
+                       // the end node is a junction, try to leave a segment
+                       // between it and the structure - #7202
+                       var insetLength = crossingToEdgeEndDistance - minEdgeLengthMeters;
+
+                       if (insetLength > minEdgeLengthMeters) {
+                         var insetNodeLoc = locGetter(insetLength);
+                         newNode = osmNode();
+                         graph = actionAddMidpoint({
+                           loc: insetNodeLoc,
+                           edge: edge
+                         }, newNode)(graph);
+                       }
+                     }
+                   } // if the edge is too short to subdivide as desired, then
+                   // just bound the structure at the existing end node
+
+
+                   if (!newNode) newNode = endNode;
+                   var splitAction = actionSplit([newNode.id]).limitWays(resultWayIDs); // only split selected or created ways
+                   // do the split
+
+                   graph = splitAction(graph);
+
+                   if (splitAction.getCreatedWayIDs().length) {
+                     resultWayIDs.push(splitAction.getCreatedWayIDs()[0]);
+                   }
+
+                   return newNode;
+                 }
+
+                 var structEndNode1 = determineEndpoint(edge, edgeNodes[1], endpointLocGetter1);
+                 var structEndNode2 = determineEndpoint([edgeNodes[0].id, structEndNode1.id], edgeNodes[0], endpointLocGetter2);
+                 var structureWay = resultWayIDs.map(function (id) {
+                   return graph.entity(id);
+                 }).find(function (way) {
+                   return way.nodes.indexOf(structEndNode1.id) !== -1 && way.nodes.indexOf(structEndNode2.id) !== -1;
+                 });
+                 var tags = Object.assign({}, structureWay.tags); // copy tags
+
+                 if (bridgeOrTunnel === 'bridge') {
+                   tags.bridge = 'yes';
+                   tags.layer = '1';
+                 } else {
+                   var tunnelValue = 'yes';
+
+                   if (getFeatureType(structureWay, graph) === 'waterway') {
+                     // use `tunnel=culvert` for waterways by default
+                     tunnelValue = 'culvert';
+                   }
+
+                   tags.tunnel = tunnelValue;
+                   tags.layer = '-1';
+                 } // apply the structure tags to the way
+
+
+                 graph = actionChangeTags(structureWay.id, tags)(graph);
+                 return graph;
+               };
+
+               context.perform(action, _t('issues.fix.' + fixTitleID + '.annotation'));
+               context.enter(modeSelect(context, resultWayIDs));
+             }
+           });
+         }
+
+         function makeConnectWaysFix(connectionTags) {
+           var fixTitleID = 'connect_features';
+
+           if (connectionTags.ford) {
+             fixTitleID = 'connect_using_ford';
+           }
+
+           return new validationIssueFix({
+             icon: 'iD-icon-crossing',
+             title: _t.html('issues.fix.' + fixTitleID + '.title'),
+             onClick: function onClick(context) {
+               var loc = this.issue.loc;
+               var connectionTags = this.issue.data.connectionTags;
+               var edges = this.issue.data.edges;
+               context.perform(function actionConnectCrossingWays(graph) {
+                 // create the new node for the points
+                 var node = osmNode({
+                   loc: loc,
+                   tags: connectionTags
+                 });
+                 graph = graph.replace(node);
+                 var nodesToMerge = [node.id];
+                 var mergeThresholdInMeters = 0.75;
+                 edges.forEach(function (edge) {
+                   var edgeNodes = [graph.entity(edge[0]), graph.entity(edge[1])];
+                   var nearby = geoSphericalClosestNode(edgeNodes, loc); // if there is already a suitable node nearby, use that
+                   // use the node if node has no interesting tags or if it is a crossing node #8326
+
+                   if ((!nearby.node.hasInterestingTags() || nearby.node.isCrossing()) && nearby.distance < mergeThresholdInMeters) {
+                     nodesToMerge.push(nearby.node.id); // else add the new node to the way
+                   } else {
+                     graph = actionAddMidpoint({
+                       loc: loc,
+                       edge: edge
+                     }, node)(graph);
+                   }
+                 });
+
+                 if (nodesToMerge.length > 1) {
+                   // if we're using nearby nodes, merge them with the new node
+                   graph = actionMergeNodes(nodesToMerge, loc)(graph);
+                 }
+
+                 return graph;
+               }, _t('issues.fix.connect_crossing_features.annotation'));
+             }
+           });
+         }
+
+         function makeChangeLayerFix(higherOrLower) {
+           return new validationIssueFix({
+             icon: 'iD-icon-' + (higherOrLower === 'higher' ? 'up' : 'down'),
+             title: _t.html('issues.fix.tag_this_as_' + higherOrLower + '.title'),
+             onClick: function onClick(context) {
+               var mode = context.mode();
+               if (!mode || mode.id !== 'select') return;
+               var selectedIDs = mode.selectedIDs();
+               if (selectedIDs.length !== 1) return;
+               var selectedID = selectedIDs[0];
+               if (!this.issue.entityIds.some(function (entityId) {
+                 return entityId === selectedID;
+               })) return;
+               var entity = context.hasEntity(selectedID);
+               if (!entity) return;
+               var tags = Object.assign({}, entity.tags); // shallow copy
+
+               var layer = tags.layer && Number(tags.layer);
+
+               if (layer && !isNaN(layer)) {
+                 if (higherOrLower === 'higher') {
+                   layer += 1;
+                 } else {
+                   layer -= 1;
+                 }
+               } else {
+                 if (higherOrLower === 'higher') {
+                   layer = 1;
+                 } else {
+                   layer = -1;
+                 }
+               }
+
+               tags.layer = layer.toString();
+               context.perform(actionChangeTags(entity.id, tags), _t('operations.change_tags.annotation'));
+             }
+           });
+         }
+
+         validation.type = type;
+         return validation;
+       }
+
+       function behaviorDrawWay(context, wayID, mode, startGraph) {
+         var keybinding = utilKeybinding('drawWay');
+         var dispatch = dispatch$8('rejectedSelfIntersection');
+         var behavior = behaviorDraw(context); // Must be set by `drawWay.nodeIndex` before each install of this behavior.
+
+         var _nodeIndex;
+
+         var _origWay;
+
+         var _wayGeometry;
+
+         var _headNodeID;
+
+         var _annotation;
+
+         var _pointerHasMoved = false; // The osmNode to be placed.
+         // This is temporary and just follows the mouse cursor until an "add" event occurs.
+
+         var _drawNode;
+
+         var _didResolveTempEdit = false;
+
+         function createDrawNode(loc) {
+           // don't make the draw node until we actually need it
+           _drawNode = osmNode({
+             loc: loc
+           });
+           context.pauseChangeDispatch();
+           context.replace(function actionAddDrawNode(graph) {
+             // add the draw node to the graph and insert it into the way
+             var way = graph.entity(wayID);
+             return graph.replace(_drawNode).replace(way.addNode(_drawNode.id, _nodeIndex));
+           }, _annotation);
+           context.resumeChangeDispatch();
+           setActiveElements();
+         }
+
+         function removeDrawNode() {
+           context.pauseChangeDispatch();
+           context.replace(function actionDeleteDrawNode(graph) {
+             var way = graph.entity(wayID);
+             return graph.replace(way.removeNode(_drawNode.id)).remove(_drawNode);
+           }, _annotation);
+           _drawNode = undefined;
+           context.resumeChangeDispatch();
+         }
+
+         function keydown(d3_event) {
+           if (d3_event.keyCode === utilKeybinding.modifierCodes.alt) {
+             if (context.surface().classed('nope')) {
+               context.surface().classed('nope-suppressed', true);
+             }
+
+             context.surface().classed('nope', false).classed('nope-disabled', true);
+           }
+         }
+
+         function keyup(d3_event) {
+           if (d3_event.keyCode === utilKeybinding.modifierCodes.alt) {
+             if (context.surface().classed('nope-suppressed')) {
+               context.surface().classed('nope', true);
+             }
+
+             context.surface().classed('nope-suppressed', false).classed('nope-disabled', false);
+           }
+         }
+
+         function allowsVertex(d) {
+           return d.geometry(context.graph()) === 'vertex' || _mainPresetIndex.allowsVertex(d, context.graph());
+         } // related code
+         // - `mode/drag_node.js`     `doMove()`
+         // - `behavior/draw.js`      `click()`
+         // - `behavior/draw_way.js`  `move()`
+
+
+         function move(d3_event, datum) {
+           var loc = context.map().mouseCoordinates();
+           if (!_drawNode) createDrawNode(loc);
+           context.surface().classed('nope-disabled', d3_event.altKey);
+           var targetLoc = datum && datum.properties && datum.properties.entity && allowsVertex(datum.properties.entity) && datum.properties.entity.loc;
+           var targetNodes = datum && datum.properties && datum.properties.nodes;
+
+           if (targetLoc) {
+             // snap to node/vertex - a point target with `.loc`
+             loc = targetLoc;
+           } else if (targetNodes) {
+             // snap to way - a line target with `.nodes`
+             var choice = geoChooseEdge(targetNodes, context.map().mouse(), context.projection, _drawNode.id);
+
+             if (choice) {
+               loc = choice.loc;
+             }
+           }
+
+           context.replace(actionMoveNode(_drawNode.id, loc), _annotation);
+           _drawNode = context.entity(_drawNode.id);
+           checkGeometry(true
+           /* includeDrawNode */
+           );
+         } // Check whether this edit causes the geometry to break.
+         // If so, class the surface with a nope cursor.
+         // `includeDrawNode` - Only check the relevant line segments if finishing drawing
+
+
+         function checkGeometry(includeDrawNode) {
+           var nopeDisabled = context.surface().classed('nope-disabled');
+           var isInvalid = isInvalidGeometry(includeDrawNode);
+
+           if (nopeDisabled) {
+             context.surface().classed('nope', false).classed('nope-suppressed', isInvalid);
+           } else {
+             context.surface().classed('nope', isInvalid).classed('nope-suppressed', false);
+           }
+         }
+
+         function isInvalidGeometry(includeDrawNode) {
+           var testNode = _drawNode; // we only need to test the single way we're drawing
+
+           var parentWay = context.graph().entity(wayID);
+           var nodes = context.graph().childNodes(parentWay).slice(); // shallow copy
+
+           if (includeDrawNode) {
+             if (parentWay.isClosed()) {
+               // don't test the last segment for closed ways - #4655
+               // (still test the first segment)
+               nodes.pop();
+             }
+           } else {
+             // discount the draw node
+             if (parentWay.isClosed()) {
+               if (nodes.length < 3) return false;
+               if (_drawNode) nodes.splice(-2, 1);
+               testNode = nodes[nodes.length - 2];
+             } else {
+               // there's nothing we need to test if we ignore the draw node on open ways
+               return false;
+             }
+           }
+
+           return testNode && geoHasSelfIntersections(nodes, testNode.id);
+         }
+
+         function undone() {
+           // undoing removed the temp edit
+           _didResolveTempEdit = true;
+           context.pauseChangeDispatch();
+           var nextMode;
+
+           if (context.graph() === startGraph) {
+             // We've undone back to the initial state before we started drawing.
+             // Just exit the draw mode without undoing whatever we did before
+             // we entered the draw mode.
+             nextMode = modeSelect(context, [wayID]);
+           } else {
+             // The `undo` only removed the temporary edit, so here we have to
+             // manually undo to actually remove the last node we added. We can't
+             // use the `undo` function since the initial "add" graph doesn't have
+             // an annotation and so cannot be undone to.
+             context.pop(1); // continue drawing
+
+             nextMode = mode;
+           } // clear the redo stack by adding and removing a blank edit
+
+
+           context.perform(actionNoop());
+           context.pop(1);
+           context.resumeChangeDispatch();
+           context.enter(nextMode);
+         }
+
+         function setActiveElements() {
+           if (!_drawNode) return;
+           context.surface().selectAll('.' + _drawNode.id).classed('active', true);
+         }
+
+         function resetToStartGraph() {
+           while (context.graph() !== startGraph) {
+             context.pop();
+           }
+         }
+
+         var drawWay = function drawWay(surface) {
+           _drawNode = undefined;
+           _didResolveTempEdit = false;
+           _origWay = context.entity(wayID);
+
+           if (typeof _nodeIndex === 'number') {
+             _headNodeID = _origWay.nodes[_nodeIndex];
+           } else if (_origWay.isClosed()) {
+             _headNodeID = _origWay.nodes[_origWay.nodes.length - 2];
+           } else {
+             _headNodeID = _origWay.nodes[_origWay.nodes.length - 1];
+           }
+
+           _wayGeometry = _origWay.geometry(context.graph());
+           _annotation = _t((_origWay.nodes.length === (_origWay.isClosed() ? 2 : 1) ? 'operations.start.annotation.' : 'operations.continue.annotation.') + _wayGeometry);
+           _pointerHasMoved = false; // Push an annotated state for undo to return back to.
+           // We must make sure to replace or remove it later.
+
+           context.pauseChangeDispatch();
+           context.perform(actionNoop(), _annotation);
+           context.resumeChangeDispatch();
+           behavior.hover().initialNodeID(_headNodeID);
+           behavior.on('move', function () {
+             _pointerHasMoved = true;
+             move.apply(this, arguments);
+           }).on('down', function () {
+             move.apply(this, arguments);
+           }).on('downcancel', function () {
+             if (_drawNode) removeDrawNode();
+           }).on('click', drawWay.add).on('clickWay', drawWay.addWay).on('clickNode', drawWay.addNode).on('undo', context.undo).on('cancel', drawWay.cancel).on('finish', drawWay.finish);
+           select(window).on('keydown.drawWay', keydown).on('keyup.drawWay', keyup);
+           context.map().dblclickZoomEnable(false).on('drawn.draw', setActiveElements);
+           setActiveElements();
+           surface.call(behavior);
+           context.history().on('undone.draw', undone);
+         };
+
+         drawWay.off = function (surface) {
+           if (!_didResolveTempEdit) {
+             // Drawing was interrupted unexpectedly.
+             // This can happen if the user changes modes,
+             // clicks geolocate button, a hashchange event occurs, etc.
+             context.pauseChangeDispatch();
+             resetToStartGraph();
+             context.resumeChangeDispatch();
+           }
+
+           _drawNode = undefined;
+           _nodeIndex = undefined;
+           context.map().on('drawn.draw', null);
+           surface.call(behavior.off).selectAll('.active').classed('active', false);
+           surface.classed('nope', false).classed('nope-suppressed', false).classed('nope-disabled', false);
+           select(window).on('keydown.drawWay', null).on('keyup.drawWay', null);
+           context.history().on('undone.draw', null);
+         };
+
+         function attemptAdd(d, loc, doAdd) {
+           if (_drawNode) {
+             // move the node to the final loc in case move wasn't called
+             // consistently (e.g. on touch devices)
+             context.replace(actionMoveNode(_drawNode.id, loc), _annotation);
+             _drawNode = context.entity(_drawNode.id);
+           } else {
+             createDrawNode(loc);
+           }
+
+           checkGeometry(true
+           /* includeDrawNode */
+           );
+
+           if (d && d.properties && d.properties.nope || context.surface().classed('nope')) {
+             if (!_pointerHasMoved) {
+               // prevent the temporary draw node from appearing on touch devices
+               removeDrawNode();
+             }
+
+             dispatch.call('rejectedSelfIntersection', this);
+             return; // can't click here
+           }
+
+           context.pauseChangeDispatch();
+           doAdd(); // we just replaced the temporary edit with the real one
+
+           _didResolveTempEdit = true;
+           context.resumeChangeDispatch();
+           context.enter(mode);
+         } // Accept the current position of the drawing node
+
+
+         drawWay.add = function (loc, d) {
+           attemptAdd(d, loc, function () {// don't need to do anything extra
+           });
+         }; // Connect the way to an existing way
+
+
+         drawWay.addWay = function (loc, edge, d) {
+           attemptAdd(d, loc, function () {
+             context.replace(actionAddMidpoint({
+               loc: loc,
+               edge: edge
+             }, _drawNode), _annotation);
+           });
+         }; // Connect the way to an existing node
+
+
+         drawWay.addNode = function (node, d) {
+           // finish drawing if the mapper targets the prior node
+           if (node.id === _headNodeID || // or the first node when drawing an area
+           _origWay.isClosed() && node.id === _origWay.first()) {
+             drawWay.finish();
+             return;
+           }
+
+           attemptAdd(d, node.loc, function () {
+             context.replace(function actionReplaceDrawNode(graph) {
+               // remove the temporary draw node and insert the existing node
+               // at the same index
+               graph = graph.replace(graph.entity(wayID).removeNode(_drawNode.id)).remove(_drawNode);
+               return graph.replace(graph.entity(wayID).addNode(node.id, _nodeIndex));
+             }, _annotation);
+           });
+         };
+         /**
+          * @param {(typeof osmWay)[]} ways
+          * @returns {"line" | "area" | "generic"}
+          */
+
+
+         function getFeatureType(ways) {
+           if (ways.every(function (way) {
+             return way.isClosed();
+           })) return 'area';
+           if (ways.every(function (way) {
+             return !way.isClosed();
+           })) return 'line';
+           return 'generic';
+         }
+         /** see PR #8671 */
+
+
+         function followMode() {
+           if (_didResolveTempEdit) return;
+
+           try {
+             // get the last 2 added nodes.
+             // check if they are both part of only oneway (the same one)
+             // check if the ways that they're part of are the same way
+             // find index of the last two nodes, to determine the direction to travel around the existing way
+             // add the next node to the way we are drawing
+             // if we're drawing an area, the first node = last node.
+             var isDrawingArea = _origWay.nodes[0] === _origWay.nodes.slice(-1)[0];
+
+             var _origWay$nodes$slice = _origWay.nodes.slice(isDrawingArea ? -3 : -2),
+                 _origWay$nodes$slice2 = _slicedToArray(_origWay$nodes$slice, 2),
+                 secondLastNodeId = _origWay$nodes$slice2[0],
+                 lastNodeId = _origWay$nodes$slice2[1]; // Unlike startGraph, the full history graph may contain unsaved vertices to follow.
+             // https://github.com/openstreetmap/iD/issues/8749
+
+
+             var historyGraph = context.history().graph();
+
+             if (!lastNodeId || !secondLastNodeId || !historyGraph.hasEntity(lastNodeId) || !historyGraph.hasEntity(secondLastNodeId)) {
+               context.ui().flash.duration(4000).iconName('#iD-icon-no').label(_t.html('operations.follow.error.needs_more_initial_nodes'))();
+               return;
+             } // If the way has looped over itself, follow some other way.
+
+
+             var lastNodesParents = historyGraph.parentWays(historyGraph.entity(lastNodeId)).filter(function (w) {
+               return w.id !== wayID;
+             });
+             var secondLastNodesParents = historyGraph.parentWays(historyGraph.entity(secondLastNodeId)).filter(function (w) {
+               return w.id !== wayID;
+             });
+             var featureType = getFeatureType(lastNodesParents);
+
+             if (lastNodesParents.length !== 1 || secondLastNodesParents.length === 0) {
+               context.ui().flash.duration(4000).iconName('#iD-icon-no').label(_t.html("operations.follow.error.intersection_of_multiple_ways.".concat(featureType)))();
+               return;
+             } // Check if the last node's parent is also the parent of the second last node.
+             // The last node must only have one parent, but the second last node can have
+             // multiple parents.
+
+
+             if (!secondLastNodesParents.some(function (n) {
+               return n.id === lastNodesParents[0].id;
+             })) {
+               context.ui().flash.duration(4000).iconName('#iD-icon-no').label(_t.html("operations.follow.error.intersection_of_different_ways.".concat(featureType)))();
+               return;
+             }
+
+             var way = lastNodesParents[0];
+             var indexOfLast = way.nodes.indexOf(lastNodeId);
+             var indexOfSecondLast = way.nodes.indexOf(secondLastNodeId); // for a closed way, the first/last node is the same so it appears twice in the array,
+             // but indexOf always finds the first occurrence. This is only an issue when following a way
+             // in descending order
+
+             var isDescendingPastZero = indexOfLast === way.nodes.length - 2 && indexOfSecondLast === 0;
+             var nextNodeIndex = indexOfLast + (indexOfLast > indexOfSecondLast && !isDescendingPastZero ? 1 : -1); // if we're following a closed way and we pass the first/last node, the  next index will be -1
+
+             if (nextNodeIndex === -1) nextNodeIndex = indexOfSecondLast === 1 ? way.nodes.length - 2 : 1;
+             var nextNode = historyGraph.entity(way.nodes[nextNodeIndex]);
+             drawWay.addNode(nextNode, {
+               geometry: {
+                 type: 'Point',
+                 coordinates: nextNode.loc
+               },
+               id: nextNode.id,
+               properties: {
+                 target: true,
+                 entity: nextNode
+               }
+             });
+           } catch (ex) {
+             context.ui().flash.duration(4000).iconName('#iD-icon-no').label(_t.html('operations.follow.error.unknown'))();
+           }
+         }
+
+         keybinding.on(_t('operations.follow.key'), followMode);
+         select(document).call(keybinding); // Finish the draw operation, removing the temporary edit.
+         // If the way has enough nodes to be valid, it's selected.
+         // Otherwise, delete everything and return to browse mode.
+
+         drawWay.finish = function () {
+           checkGeometry(false
+           /* includeDrawNode */
+           );
+
+           if (context.surface().classed('nope')) {
+             dispatch.call('rejectedSelfIntersection', this);
+             return; // can't click here
+           }
+
+           context.pauseChangeDispatch(); // remove the temporary edit
+
+           context.pop(1);
+           _didResolveTempEdit = true;
+           context.resumeChangeDispatch();
+           var way = context.hasEntity(wayID);
+
+           if (!way || way.isDegenerate()) {
+             drawWay.cancel();
+             return;
+           }
+
+           window.setTimeout(function () {
+             context.map().dblclickZoomEnable(true);
+           }, 1000);
+           var isNewFeature = !mode.isContinuing;
+           context.enter(modeSelect(context, [wayID]).newFeature(isNewFeature));
+         }; // Cancel the draw operation, delete everything, and return to browse mode.
+
+
+         drawWay.cancel = function () {
+           context.pauseChangeDispatch();
+           resetToStartGraph();
+           context.resumeChangeDispatch();
+           window.setTimeout(function () {
+             context.map().dblclickZoomEnable(true);
+           }, 1000);
+           context.surface().classed('nope', false).classed('nope-disabled', false).classed('nope-suppressed', false);
+           context.enter(modeBrowse(context));
+         };
+
+         drawWay.nodeIndex = function (val) {
+           if (!arguments.length) return _nodeIndex;
+           _nodeIndex = val;
+           return drawWay;
+         };
+
+         drawWay.activeID = function () {
+           if (!arguments.length) return _drawNode && _drawNode.id; // no assign
+
+           return drawWay;
+         };
+
+         return utilRebind(drawWay, dispatch, 'on');
+       }
+
+       function modeDrawLine(context, wayID, startGraph, button, affix, continuing) {
+         var mode = {
+           button: button,
+           id: 'draw-line'
+         };
+         var behavior = behaviorDrawWay(context, wayID, mode, startGraph).on('rejectedSelfIntersection.modeDrawLine', function () {
+           context.ui().flash.iconName('#iD-icon-no').label(_t.html('self_intersection.error.lines'))();
+         });
+         mode.wayID = wayID;
+         mode.isContinuing = continuing;
+
+         mode.enter = function () {
+           behavior.nodeIndex(affix === 'prefix' ? 0 : undefined);
+           context.install(behavior);
+         };
+
+         mode.exit = function () {
+           context.uninstall(behavior);
+         };
+
+         mode.selectedIDs = function () {
+           return [wayID];
+         };
+
+         mode.activeID = function () {
+           return behavior && behavior.activeID() || [];
+         };
+
+         return mode;
+       }
+
+       function validationDisconnectedWay() {
+         var type = 'disconnected_way';
+
+         function isTaggedAsHighway(entity) {
+           return osmRoutableHighwayTagValues[entity.tags.highway];
+         }
+
+         var validation = function checkDisconnectedWay(entity, graph) {
+           var routingIslandWays = routingIslandForEntity(entity);
+           if (!routingIslandWays) return [];
+           return [new validationIssue({
+             type: type,
+             subtype: 'highway',
+             severity: 'warning',
+             message: function message(context) {
+               var entity = this.entityIds.length && context.hasEntity(this.entityIds[0]);
+               var label = entity && utilDisplayLabel(entity, context.graph());
+               return _t.html('issues.disconnected_way.routable.message', {
+                 count: this.entityIds.length,
+                 highway: label
+               });
+             },
+             reference: showReference,
+             entityIds: Array.from(routingIslandWays).map(function (way) {
+               return way.id;
+             }),
+             dynamicFixes: makeFixes
+           })];
+
+           function makeFixes(context) {
+             var fixes = [];
+             var singleEntity = this.entityIds.length === 1 && context.hasEntity(this.entityIds[0]);
+
+             if (singleEntity) {
+               if (singleEntity.type === 'way' && !singleEntity.isClosed()) {
+                 var textDirection = _mainLocalizer.textDirection();
+                 var startFix = makeContinueDrawingFixIfAllowed(textDirection, singleEntity.first(), 'start');
+                 if (startFix) fixes.push(startFix);
+                 var endFix = makeContinueDrawingFixIfAllowed(textDirection, singleEntity.last(), 'end');
+                 if (endFix) fixes.push(endFix);
+               }
+
+               if (!fixes.length) {
+                 fixes.push(new validationIssueFix({
+                   title: _t.html('issues.fix.connect_feature.title')
+                 }));
+               }
+
+               fixes.push(new validationIssueFix({
+                 icon: 'iD-operation-delete',
+                 title: _t.html('issues.fix.delete_feature.title'),
+                 entityIds: [singleEntity.id],
+                 onClick: function onClick(context) {
+                   var id = this.issue.entityIds[0];
+                   var operation = operationDelete(context, [id]);
+
+                   if (!operation.disabled()) {
+                     operation();
+                   }
+                 }
+               }));
+             } else {
+               fixes.push(new validationIssueFix({
+                 title: _t.html('issues.fix.connect_features.title')
+               }));
+             }
+
+             return fixes;
+           }
+
+           function showReference(selection) {
+             selection.selectAll('.issue-reference').data([0]).enter().append('div').attr('class', 'issue-reference').call(_t.append('issues.disconnected_way.routable.reference'));
+           }
+
+           function routingIslandForEntity(entity) {
+             var routingIsland = new Set(); // the interconnected routable features
+
+             var waysToCheck = []; // the queue of remaining routable ways to traverse
+
+             function queueParentWays(node) {
+               graph.parentWays(node).forEach(function (parentWay) {
+                 if (!routingIsland.has(parentWay) && // only check each feature once
+                 isRoutableWay(parentWay, false)) {
+                   // only check routable features
+                   routingIsland.add(parentWay);
+                   waysToCheck.push(parentWay);
+                 }
+               });
+             }
+
+             if (entity.type === 'way' && isRoutableWay(entity, true)) {
+               routingIsland.add(entity);
+               waysToCheck.push(entity);
+             } else if (entity.type === 'node' && isRoutableNode(entity)) {
+               routingIsland.add(entity);
+               queueParentWays(entity);
+             } else {
+               // this feature isn't routable, cannot be a routing island
+               return null;
+             }
+
+             while (waysToCheck.length) {
+               var wayToCheck = waysToCheck.pop();
+               var childNodes = graph.childNodes(wayToCheck);
+
+               for (var i in childNodes) {
+                 var vertex = childNodes[i];
+
+                 if (isConnectedVertex(vertex)) {
+                   // found a link to the wider network, not a routing island
+                   return null;
+                 }
+
+                 if (isRoutableNode(vertex)) {
+                   routingIsland.add(vertex);
+                 }
+
+                 queueParentWays(vertex);
+               }
+             } // no network link found, this is a routing island, return its members
+
+
+             return routingIsland;
+           }
+
+           function isConnectedVertex(vertex) {
+             // assume ways overlapping unloaded tiles are connected to the wider road network  - #5938
+             var osm = services.osm;
+             if (osm && !osm.isDataLoaded(vertex.loc)) return true; // entrances are considered connected
+
+             if (vertex.tags.entrance && vertex.tags.entrance !== 'no') return true;
+             if (vertex.tags.amenity === 'parking_entrance') return true;
+             return false;
+           }
+
+           function isRoutableNode(node) {
+             // treat elevators as distinct features in the highway network
+             if (node.tags.highway === 'elevator') return true;
+             return false;
+           }
+
+           function isRoutableWay(way, ignoreInnerWays) {
+             if (isTaggedAsHighway(way) || way.tags.route === 'ferry') return true;
+             return graph.parentRelations(way).some(function (parentRelation) {
+               if (parentRelation.tags.type === 'route' && parentRelation.tags.route === 'ferry') return true;
+               if (parentRelation.isMultipolygon() && isTaggedAsHighway(parentRelation) && (!ignoreInnerWays || parentRelation.memberById(way.id).role !== 'inner')) return true;
+               return false;
+             });
+           }
+
+           function makeContinueDrawingFixIfAllowed(textDirection, vertexID, whichEnd) {
+             var vertex = graph.hasEntity(vertexID);
+             if (!vertex || vertex.tags.noexit === 'yes') return null;
+             var useLeftContinue = whichEnd === 'start' && textDirection === 'ltr' || whichEnd === 'end' && textDirection === 'rtl';
+             return new validationIssueFix({
+               icon: 'iD-operation-continue' + (useLeftContinue ? '-left' : ''),
+               title: _t.html('issues.fix.continue_from_' + whichEnd + '.title'),
+               entityIds: [vertexID],
+               onClick: function onClick(context) {
+                 var wayId = this.issue.entityIds[0];
+                 var way = context.hasEntity(wayId);
+                 var vertexId = this.entityIds[0];
+                 var vertex = context.hasEntity(vertexId);
+                 if (!way || !vertex) return; // make sure the vertex is actually visible and editable
+
+                 var map = context.map();
+
+                 if (!context.editable() || !map.trimmedExtent().contains(vertex.loc)) {
+                   map.zoomToEase(vertex);
+                 }
+
+                 context.enter(modeDrawLine(context, wayId, context.graph(), 'line', way.affix(vertexId), true));
+               }
+             });
+           }
+         };
+
+         validation.type = type;
+         return validation;
+       }
+
+       function validationFormatting() {
+         var type = 'invalid_format';
+
+         var validation = function validation(entity) {
+           var issues = [];
+
+           function isValidEmail(email) {
+             // Emails in OSM are going to be official so they should be pretty simple
+             // Using negated lists to better support all possible unicode characters (#6494)
+             var valid_email = /^[^\(\)\\,":;<>@\[\]]+@[^\(\)\\,":;<>@\[\]\.]+(?:\.[a-z0-9-]+)*$/i; // An empty value is also acceptable
+
+             return !email || valid_email.test(email);
+           }
+
+           function showReferenceEmail(selection) {
+             selection.selectAll('.issue-reference').data([0]).enter().append('div').attr('class', 'issue-reference').call(_t.append('issues.invalid_format.email.reference'));
+           }
+           /* see https://github.com/openstreetmap/iD/issues/6831#issuecomment-537121379
+           function isSchemePresent(url) {
+               var valid_scheme = /^https?:\/\//i;
+               return (!url || valid_scheme.test(url));
+           }
+           function showReferenceWebsite(selection) {
+               selection.selectAll('.issue-reference')
+                   .data([0])
+                   .enter()
+                   .append('div')
+                   .attr('class', 'issue-reference')
+                   .call(t.append('issues.invalid_format.website.reference'));
+           }
+            if (entity.tags.website) {
+               // Multiple websites are possible
+               // If ever we support ES6, arrow functions make this nicer
+               var websites = entity.tags.website
+                   .split(';')
+                   .map(function(s) { return s.trim(); })
+                   .filter(function(x) { return !isSchemePresent(x); });
+                if (websites.length) {
+                   issues.push(new validationIssue({
+                       type: type,
+                       subtype: 'website',
+                       severity: 'warning',
+                       message: function(context) {
+                           var entity = context.hasEntity(this.entityIds[0]);
+                           return entity ? t.html('issues.invalid_format.website.message' + this.data,
+                               { feature: utilDisplayLabel(entity, context.graph()), site: websites.join(', ') }) : '';
+                       },
+                       reference: showReferenceWebsite,
+                       entityIds: [entity.id],
+                       hash: websites.join(),
+                       data: (websites.length > 1) ? '_multi' : ''
+                   }));
+               }
+           }*/
+
+
+           if (entity.tags.email) {
+             // Multiple emails are possible
+             var emails = entity.tags.email.split(';').map(function (s) {
+               return s.trim();
+             }).filter(function (x) {
+               return !isValidEmail(x);
+             });
+
+             if (emails.length) {
+               issues.push(new validationIssue({
+                 type: type,
+                 subtype: 'email',
+                 severity: 'warning',
+                 message: function message(context) {
+                   var entity = context.hasEntity(this.entityIds[0]);
+                   return entity ? _t.html('issues.invalid_format.email.message' + this.data, {
+                     feature: utilDisplayLabel(entity, context.graph()),
+                     email: emails.join(', ')
+                   }) : '';
+                 },
+                 reference: showReferenceEmail,
+                 entityIds: [entity.id],
+                 hash: emails.join(),
+                 data: emails.length > 1 ? '_multi' : ''
+               }));
+             }
+           }
+
+           return issues;
+         };
+
+         validation.type = type;
+         return validation;
+       }
+
+       function validationHelpRequest(context) {
+         var type = 'help_request';
+
+         var validation = function checkFixmeTag(entity) {
+           if (!entity.tags.fixme) return []; // don't flag fixmes on features added by the user
+
+           if (entity.version === undefined) return [];
+
+           if (entity.v !== undefined) {
+             var baseEntity = context.history().base().hasEntity(entity.id); // don't flag fixmes added by the user on existing features
+
+             if (!baseEntity || !baseEntity.tags.fixme) return [];
+           }
+
+           return [new validationIssue({
+             type: type,
+             subtype: 'fixme_tag',
+             severity: 'warning',
+             message: function message(context) {
+               var entity = context.hasEntity(this.entityIds[0]);
+               return entity ? _t.html('issues.fixme_tag.message', {
+                 feature: utilDisplayLabel(entity, context.graph(), true
+                 /* verbose */
+                 )
+               }) : '';
+             },
+             dynamicFixes: function dynamicFixes() {
+               return [new validationIssueFix({
+                 title: _t.html('issues.fix.address_the_concern.title')
+               })];
+             },
+             reference: showReference,
+             entityIds: [entity.id]
+           })];
+
+           function showReference(selection) {
+             selection.selectAll('.issue-reference').data([0]).enter().append('div').attr('class', 'issue-reference').call(_t.append('issues.fixme_tag.reference'));
+           }
+         };
+
+         validation.type = type;
+         return validation;
+       }
+
+       function validationImpossibleOneway() {
+         var type = 'impossible_oneway';
+
+         var validation = function checkImpossibleOneway(entity, graph) {
+           if (entity.type !== 'way' || entity.geometry(graph) !== 'line') return [];
+           if (entity.isClosed()) return [];
+           if (!typeForWay(entity)) return [];
+           if (!isOneway(entity)) return [];
+           var firstIssues = issuesForNode(entity, entity.first());
+           var lastIssues = issuesForNode(entity, entity.last());
+           return firstIssues.concat(lastIssues);
+
+           function typeForWay(way) {
+             if (way.geometry(graph) !== 'line') return null;
+             if (osmRoutableHighwayTagValues[way.tags.highway]) return 'highway';
+             if (osmFlowingWaterwayTagValues[way.tags.waterway]) return 'waterway';
+             return null;
+           }
+
+           function isOneway(way) {
+             if (way.tags.oneway === 'yes') return true;
+             if (way.tags.oneway) return false;
+
+             for (var key in way.tags) {
+               if (osmOneWayTags[key] && osmOneWayTags[key][way.tags[key]]) {
+                 return true;
+               }
+             }
+
+             return false;
+           }
+
+           function nodeOccursMoreThanOnce(way, nodeID) {
+             var occurrences = 0;
+
+             for (var index in way.nodes) {
+               if (way.nodes[index] === nodeID) {
+                 occurrences += 1;
+                 if (occurrences > 1) return true;
+               }
+             }
+
+             return false;
+           }
+
+           function isConnectedViaOtherTypes(way, node) {
+             var wayType = typeForWay(way);
+
+             if (wayType === 'highway') {
+               // entrances are considered connected
+               if (node.tags.entrance && node.tags.entrance !== 'no') return true;
+               if (node.tags.amenity === 'parking_entrance') return true;
+             } else if (wayType === 'waterway') {
+               if (node.id === way.first()) {
+                 // multiple waterways may start at the same spring
+                 if (node.tags.natural === 'spring') return true;
+               } else {
+                 // multiple waterways may end at the same drain
+                 if (node.tags.manhole === 'drain') return true;
+               }
+             }
+
+             return graph.parentWays(node).some(function (parentWay) {
+               if (parentWay.id === way.id) return false;
+
+               if (wayType === 'highway') {
+                 // allow connections to highway areas
+                 if (parentWay.geometry(graph) === 'area' && osmRoutableHighwayTagValues[parentWay.tags.highway]) return true; // count connections to ferry routes as connected
+
+                 if (parentWay.tags.route === 'ferry') return true;
+                 return graph.parentRelations(parentWay).some(function (parentRelation) {
+                   if (parentRelation.tags.type === 'route' && parentRelation.tags.route === 'ferry') return true; // allow connections to highway multipolygons
+
+                   return parentRelation.isMultipolygon() && osmRoutableHighwayTagValues[parentRelation.tags.highway];
+                 });
+               } else if (wayType === 'waterway') {
+                 // multiple waterways may start or end at a water body at the same node
+                 if (parentWay.tags.natural === 'water' || parentWay.tags.natural === 'coastline') return true;
+               }
+
+               return false;
+             });
+           }
+
+           function issuesForNode(way, nodeID) {
+             var isFirst = nodeID === way.first();
+             var wayType = typeForWay(way); // ignore if this way is self-connected at this node
+
+             if (nodeOccursMoreThanOnce(way, nodeID)) return [];
+             var osm = services.osm;
+             if (!osm) return [];
+             var node = graph.hasEntity(nodeID); // ignore if this node or its tile are unloaded
+
+             if (!node || !osm.isDataLoaded(node.loc)) return [];
+             if (isConnectedViaOtherTypes(way, node)) return [];
+             var attachedWaysOfSameType = graph.parentWays(node).filter(function (parentWay) {
+               if (parentWay.id === way.id) return false;
+               return typeForWay(parentWay) === wayType;
+             }); // assume it's okay for waterways to start or end disconnected for now
+
+             if (wayType === 'waterway' && attachedWaysOfSameType.length === 0) return [];
+             var attachedOneways = attachedWaysOfSameType.filter(function (attachedWay) {
+               return isOneway(attachedWay);
+             }); // ignore if the way is connected to some non-oneway features
+
+             if (attachedOneways.length < attachedWaysOfSameType.length) return [];
+
+             if (attachedOneways.length) {
+               var connectedEndpointsOkay = attachedOneways.some(function (attachedOneway) {
+                 if ((isFirst ? attachedOneway.first() : attachedOneway.last()) !== nodeID) return true;
+                 if (nodeOccursMoreThanOnce(attachedOneway, nodeID)) return true;
+                 return false;
+               });
+               if (connectedEndpointsOkay) return [];
+             }
+
+             var placement = isFirst ? 'start' : 'end',
+                 messageID = wayType + '.',
+                 referenceID = wayType + '.';
+
+             if (wayType === 'waterway') {
+               messageID += 'connected.' + placement;
+               referenceID += 'connected';
+             } else {
+               messageID += placement;
+               referenceID += placement;
+             }
+
+             return [new validationIssue({
+               type: type,
+               subtype: wayType,
+               severity: 'warning',
+               message: function message(context) {
+                 var entity = context.hasEntity(this.entityIds[0]);
+                 return entity ? _t.html('issues.impossible_oneway.' + messageID + '.message', {
+                   feature: utilDisplayLabel(entity, context.graph())
+                 }) : '';
+               },
+               reference: getReference(referenceID),
+               entityIds: [way.id, node.id],
+               dynamicFixes: function dynamicFixes() {
+                 var fixes = [];
+
+                 if (attachedOneways.length) {
+                   fixes.push(new validationIssueFix({
+                     icon: 'iD-operation-reverse',
+                     title: _t.html('issues.fix.reverse_feature.title'),
+                     entityIds: [way.id],
+                     onClick: function onClick(context) {
+                       var id = this.issue.entityIds[0];
+                       context.perform(actionReverse(id), _t('operations.reverse.annotation.line', {
+                         n: 1
+                       }));
+                     }
+                   }));
+                 }
+
+                 if (node.tags.noexit !== 'yes') {
+                   var textDirection = _mainLocalizer.textDirection();
+                   var useLeftContinue = isFirst && textDirection === 'ltr' || !isFirst && textDirection === 'rtl';
+                   fixes.push(new validationIssueFix({
+                     icon: 'iD-operation-continue' + (useLeftContinue ? '-left' : ''),
+                     title: _t.html('issues.fix.continue_from_' + (isFirst ? 'start' : 'end') + '.title'),
+                     onClick: function onClick(context) {
+                       var entityID = this.issue.entityIds[0];
+                       var vertexID = this.issue.entityIds[1];
+                       var way = context.entity(entityID);
+                       var vertex = context.entity(vertexID);
+                       continueDrawing(way, vertex, context);
+                     }
+                   }));
+                 }
+
+                 return fixes;
+               },
+               loc: node.loc
+             })];
+
+             function getReference(referenceID) {
+               return function showReference(selection) {
+                 selection.selectAll('.issue-reference').data([0]).enter().append('div').attr('class', 'issue-reference').call(_t.append('issues.impossible_oneway.' + referenceID + '.reference'));
+               };
+             }
+           }
+         };
+
+         function continueDrawing(way, vertex, context) {
+           // make sure the vertex is actually visible and editable
+           var map = context.map();
+
+           if (!context.editable() || !map.trimmedExtent().contains(vertex.loc)) {
+             map.zoomToEase(vertex);
+           }
+
+           context.enter(modeDrawLine(context, way.id, context.graph(), 'line', way.affix(vertex.id), true));
+         }
+
+         validation.type = type;
+         return validation;
+       }
+
+       function validationIncompatibleSource() {
+         var type = 'incompatible_source';
+         var incompatibleRules = [{
+           id: 'amap',
+           regex: /(^amap$|^amap\.com|autonavi|mapabc|高德)/i
+         }, {
+           id: 'baidu',
+           regex: /(baidu|mapbar|百度)/i
+         }, {
+           id: 'google',
+           regex: /google/i,
+           exceptRegex: /((books|drive)\.google|google\s?(books|drive|plus))|(esri\/Google_Africa_Buildings)/i
+         }];
+
+         var validation = function checkIncompatibleSource(entity) {
+           var entitySources = entity.tags && entity.tags.source && entity.tags.source.split(';');
+           if (!entitySources) return [];
+           var entityID = entity.id;
+           return entitySources.map(function (source) {
+             var matchRule = incompatibleRules.find(function (rule) {
+               if (!rule.regex.test(source)) return false;
+               if (rule.exceptRegex && rule.exceptRegex.test(source)) return false;
+               return true;
+             });
+             if (!matchRule) return null;
+             return new validationIssue({
+               type: type,
+               severity: 'warning',
+               message: function message(context) {
+                 var entity = context.hasEntity(entityID);
+                 return entity ? _t.html('issues.incompatible_source.feature.message', {
+                   feature: utilDisplayLabel(entity, context.graph(), true
+                   /* verbose */
+                   ),
+                   value: source
+                 }) : '';
+               },
+               reference: getReference(matchRule.id),
+               entityIds: [entityID],
+               hash: source,
+               dynamicFixes: function dynamicFixes() {
+                 return [new validationIssueFix({
+                   title: _t.html('issues.fix.remove_proprietary_data.title')
+                 })];
+               }
+             });
+           }).filter(Boolean);
+
+           function getReference(id) {
+             return function showReference(selection) {
+               selection.selectAll('.issue-reference').data([0]).enter().append('div').attr('class', 'issue-reference').call(_t.append("issues.incompatible_source.reference.".concat(id)));
+             };
+           }
+         };
+
+         validation.type = type;
+         return validation;
+       }
+
+       function validationMaprules() {
+         var type = 'maprules';
+
+         var validation = function checkMaprules(entity, graph) {
+           if (!services.maprules) return [];
+           var rules = services.maprules.validationRules();
+           var issues = [];
+
+           for (var i = 0; i < rules.length; i++) {
+             var rule = rules[i];
+             rule.findIssues(entity, graph, issues);
+           }
+
+           return issues;
+         };
+
+         validation.type = type;
+         return validation;
+       }
+
+       function validationMismatchedGeometry() {
+         var type = 'mismatched_geometry';
+
+         function tagSuggestingLineIsArea(entity) {
+           if (entity.type !== 'way' || entity.isClosed()) return null;
+           var tagSuggestingArea = entity.tagSuggestingArea();
+
+           if (!tagSuggestingArea) {
+             return null;
+           }
+
+           var asLine = _mainPresetIndex.matchTags(tagSuggestingArea, 'line');
+           var asArea = _mainPresetIndex.matchTags(tagSuggestingArea, 'area');
+
+           if (asLine && asArea && asLine === asArea) {
+             // these tags also allow lines and making this an area wouldn't matter
+             return null;
+           }
+
+           return tagSuggestingArea;
+         }
+
+         function makeConnectEndpointsFixOnClick(way, graph) {
+           // must have at least three nodes to close this automatically
+           if (way.nodes.length < 3) return null;
+           var nodes = graph.childNodes(way),
+               testNodes;
+           var firstToLastDistanceMeters = geoSphericalDistance(nodes[0].loc, nodes[nodes.length - 1].loc); // if the distance is very small, attempt to merge the endpoints
+
+           if (firstToLastDistanceMeters < 0.75) {
+             testNodes = nodes.slice(); // shallow copy
+
+             testNodes.pop();
+             testNodes.push(testNodes[0]); // make sure this will not create a self-intersection
+
+             if (!geoHasSelfIntersections(testNodes, testNodes[0].id)) {
+               return function (context) {
+                 var way = context.entity(this.issue.entityIds[0]);
+                 context.perform(actionMergeNodes([way.nodes[0], way.nodes[way.nodes.length - 1]], nodes[0].loc), _t('issues.fix.connect_endpoints.annotation'));
+               };
+             }
+           } // if the points were not merged, attempt to close the way
+
+
+           testNodes = nodes.slice(); // shallow copy
+
+           testNodes.push(testNodes[0]); // make sure this will not create a self-intersection
+
+           if (!geoHasSelfIntersections(testNodes, testNodes[0].id)) {
+             return function (context) {
+               var wayId = this.issue.entityIds[0];
+               var way = context.entity(wayId);
+               var nodeId = way.nodes[0];
+               var index = way.nodes.length;
+               context.perform(actionAddVertex(wayId, nodeId, index), _t('issues.fix.connect_endpoints.annotation'));
+             };
+           }
+         }
+
+         function lineTaggedAsAreaIssue(entity) {
+           var tagSuggestingArea = tagSuggestingLineIsArea(entity);
+           if (!tagSuggestingArea) return null;
+           return new validationIssue({
+             type: type,
+             subtype: 'area_as_line',
+             severity: 'warning',
+             message: function message(context) {
+               var entity = context.hasEntity(this.entityIds[0]);
+               return entity ? _t.html('issues.tag_suggests_area.message', {
+                 feature: utilDisplayLabel(entity, 'area', true
+                 /* verbose */
+                 ),
+                 tag: utilTagText({
+                   tags: tagSuggestingArea
+                 })
+               }) : '';
+             },
+             reference: showReference,
+             entityIds: [entity.id],
+             hash: JSON.stringify(tagSuggestingArea),
+             dynamicFixes: function dynamicFixes(context) {
+               var fixes = [];
+               var entity = context.entity(this.entityIds[0]);
+               var connectEndsOnClick = makeConnectEndpointsFixOnClick(entity, context.graph());
+               fixes.push(new validationIssueFix({
+                 title: _t.html('issues.fix.connect_endpoints.title'),
+                 onClick: connectEndsOnClick
+               }));
+               fixes.push(new validationIssueFix({
+                 icon: 'iD-operation-delete',
+                 title: _t.html('issues.fix.remove_tag.title'),
+                 onClick: function onClick(context) {
+                   var entityId = this.issue.entityIds[0];
+                   var entity = context.entity(entityId);
+                   var tags = Object.assign({}, entity.tags); // shallow copy
+
+                   for (var key in tagSuggestingArea) {
+                     delete tags[key];
+                   }
+
+                   context.perform(actionChangeTags(entityId, tags), _t('issues.fix.remove_tag.annotation'));
+                 }
+               }));
+               return fixes;
+             }
+           });
+
+           function showReference(selection) {
+             selection.selectAll('.issue-reference').data([0]).enter().append('div').attr('class', 'issue-reference').call(_t.append('issues.tag_suggests_area.reference'));
+           }
+         }
+
+         function vertexPointIssue(entity, graph) {
+           // we only care about nodes
+           if (entity.type !== 'node') return null; // ignore tagless points
+
+           if (Object.keys(entity.tags).length === 0) return null; // address lines are special so just ignore them
+
+           if (entity.isOnAddressLine(graph)) return null;
+           var geometry = entity.geometry(graph);
+           var allowedGeometries = osmNodeGeometriesForTags(entity.tags);
+
+           if (geometry === 'point' && !allowedGeometries.point && allowedGeometries.vertex) {
+             return new validationIssue({
+               type: type,
+               subtype: 'vertex_as_point',
+               severity: 'warning',
+               message: function message(context) {
+                 var entity = context.hasEntity(this.entityIds[0]);
+                 return entity ? _t.html('issues.vertex_as_point.message', {
+                   feature: utilDisplayLabel(entity, 'vertex', true
+                   /* verbose */
+                   )
+                 }) : '';
+               },
+               reference: function showReference(selection) {
+                 selection.selectAll('.issue-reference').data([0]).enter().append('div').attr('class', 'issue-reference').call(_t.append('issues.vertex_as_point.reference'));
+               },
+               entityIds: [entity.id]
+             });
+           } else if (geometry === 'vertex' && !allowedGeometries.vertex && allowedGeometries.point) {
+             return new validationIssue({
+               type: type,
+               subtype: 'point_as_vertex',
+               severity: 'warning',
+               message: function message(context) {
+                 var entity = context.hasEntity(this.entityIds[0]);
+                 return entity ? _t.html('issues.point_as_vertex.message', {
+                   feature: utilDisplayLabel(entity, 'point', true
+                   /* verbose */
+                   )
+                 }) : '';
+               },
+               reference: function showReference(selection) {
+                 selection.selectAll('.issue-reference').data([0]).enter().append('div').attr('class', 'issue-reference').call(_t.append('issues.point_as_vertex.reference'));
+               },
+               entityIds: [entity.id],
+               dynamicFixes: extractPointDynamicFixes
+             });
+           }
+
+           return null;
+         }
+
+         function otherMismatchIssue(entity, graph) {
+           // ignore boring features
+           if (!entity.hasInterestingTags()) return null;
+           if (entity.type !== 'node' && entity.type !== 'way') return null; // address lines are special so just ignore them
+
+           if (entity.type === 'node' && entity.isOnAddressLine(graph)) return null;
+           var sourceGeom = entity.geometry(graph);
+           var targetGeoms = entity.type === 'way' ? ['point', 'vertex'] : ['line', 'area'];
+           if (sourceGeom === 'area') targetGeoms.unshift('line');
+           var asSource = _mainPresetIndex.match(entity, graph);
+           var targetGeom = targetGeoms.find(function (nodeGeom) {
+             var asTarget = _mainPresetIndex.matchTags(entity.tags, nodeGeom);
+             if (!asSource || !asTarget || asSource === asTarget || // sometimes there are two presets with the same tags for different geometries
+             fastDeepEqual(asSource.tags, asTarget.tags)) return false;
+             if (asTarget.isFallback()) return false;
+             var primaryKey = Object.keys(asTarget.tags)[0]; // special case: buildings-as-points are discouraged by iD, but common in OSM, so ignore them
+
+             if (primaryKey === 'building') return false;
+             if (asTarget.tags[primaryKey] === '*') return false;
+             return asSource.isFallback() || asSource.tags[primaryKey] === '*';
+           });
+           if (!targetGeom) return null;
+           var subtype = targetGeom + '_as_' + sourceGeom;
+           if (targetGeom === 'vertex') targetGeom = 'point';
+           if (sourceGeom === 'vertex') sourceGeom = 'point';
+           var referenceId = targetGeom + '_as_' + sourceGeom;
+           var dynamicFixes;
+
+           if (targetGeom === 'point') {
+             dynamicFixes = extractPointDynamicFixes;
+           } else if (sourceGeom === 'area' && targetGeom === 'line') {
+             dynamicFixes = lineToAreaDynamicFixes;
+           }
+
+           return new validationIssue({
+             type: type,
+             subtype: subtype,
+             severity: 'warning',
+             message: function message(context) {
+               var entity = context.hasEntity(this.entityIds[0]);
+               return entity ? _t.html('issues.' + referenceId + '.message', {
+                 feature: utilDisplayLabel(entity, targetGeom, true
+                 /* verbose */
+                 )
+               }) : '';
+             },
+             reference: function showReference(selection) {
+               selection.selectAll('.issue-reference').data([0]).enter().append('div').attr('class', 'issue-reference').call(_t.append('issues.mismatched_geometry.reference'));
+             },
+             entityIds: [entity.id],
+             dynamicFixes: dynamicFixes
+           });
+         }
+
+         function lineToAreaDynamicFixes(context) {
+           var convertOnClick;
+           var entityId = this.entityIds[0];
+           var entity = context.entity(entityId);
+           var tags = Object.assign({}, entity.tags); // shallow copy
+
+           delete tags.area;
+
+           if (!osmTagSuggestingArea(tags)) {
+             // if removing the area tag would make this a line, offer that as a quick fix
+             convertOnClick = function convertOnClick(context) {
+               var entityId = this.issue.entityIds[0];
+               var entity = context.entity(entityId);
+               var tags = Object.assign({}, entity.tags); // shallow copy
+
+               if (tags.area) {
+                 delete tags.area;
+               }
+
+               context.perform(actionChangeTags(entityId, tags), _t('issues.fix.convert_to_line.annotation'));
+             };
+           }
+
+           return [new validationIssueFix({
+             icon: 'iD-icon-line',
+             title: _t.html('issues.fix.convert_to_line.title'),
+             onClick: convertOnClick
+           })];
+         }
+
+         function extractPointDynamicFixes(context) {
+           var entityId = this.entityIds[0];
+           var extractOnClick = null;
+
+           if (!context.hasHiddenConnections(entityId)) {
+             extractOnClick = function extractOnClick(context) {
+               var entityId = this.issue.entityIds[0];
+               var action = actionExtract(entityId, context.projection);
+               context.perform(action, _t('operations.extract.annotation', {
+                 n: 1
+               })); // re-enter mode to trigger updates
+
+               context.enter(modeSelect(context, [action.getExtractedNodeID()]));
+             };
+           }
+
+           return [new validationIssueFix({
+             icon: 'iD-operation-extract',
+             title: _t.html('issues.fix.extract_point.title'),
+             onClick: extractOnClick
+           })];
+         }
+
+         function unclosedMultipolygonPartIssues(entity, graph) {
+           if (entity.type !== 'relation' || !entity.isMultipolygon() || entity.isDegenerate() || // cannot determine issues for incompletely-downloaded relations
+           !entity.isComplete(graph)) return [];
+           var sequences = osmJoinWays(entity.members, graph);
+           var issues = [];
+
+           for (var i in sequences) {
+             var sequence = sequences[i];
+             if (!sequence.nodes) continue;
+             var firstNode = sequence.nodes[0];
+             var lastNode = sequence.nodes[sequence.nodes.length - 1]; // part is closed if the first and last nodes are the same
+
+             if (firstNode === lastNode) continue;
+             var issue = new validationIssue({
+               type: type,
+               subtype: 'unclosed_multipolygon_part',
+               severity: 'warning',
+               message: function message(context) {
+                 var entity = context.hasEntity(this.entityIds[0]);
+                 return entity ? _t.html('issues.unclosed_multipolygon_part.message', {
+                   feature: utilDisplayLabel(entity, context.graph(), true
+                   /* verbose */
+                   )
+                 }) : '';
+               },
+               reference: showReference,
+               loc: sequence.nodes[0].loc,
+               entityIds: [entity.id],
+               hash: sequence.map(function (way) {
+                 return way.id;
+               }).join()
+             });
+             issues.push(issue);
+           }
+
+           return issues;
+
+           function showReference(selection) {
+             selection.selectAll('.issue-reference').data([0]).enter().append('div').attr('class', 'issue-reference').call(_t.append('issues.unclosed_multipolygon_part.reference'));
+           }
+         }
+
+         var validation = function checkMismatchedGeometry(entity, graph) {
+           var vertexPoint = vertexPointIssue(entity, graph);
+           if (vertexPoint) return [vertexPoint];
+           var lineAsArea = lineTaggedAsAreaIssue(entity);
+           if (lineAsArea) return [lineAsArea];
+           var mismatch = otherMismatchIssue(entity, graph);
+           if (mismatch) return [mismatch];
+           return unclosedMultipolygonPartIssues(entity, graph);
+         };
+
+         validation.type = type;
+         return validation;
+       }
+
+       function validationMissingRole() {
+         var type = 'missing_role';
+
+         var validation = function checkMissingRole(entity, graph) {
+           var issues = [];
+
+           if (entity.type === 'way') {
+             graph.parentRelations(entity).forEach(function (relation) {
+               if (!relation.isMultipolygon()) return;
+               var member = relation.memberById(entity.id);
+
+               if (member && isMissingRole(member)) {
+                 issues.push(makeIssue(entity, relation, member));
+               }
+             });
+           } else if (entity.type === 'relation' && entity.isMultipolygon()) {
+             entity.indexedMembers().forEach(function (member) {
+               var way = graph.hasEntity(member.id);
+
+               if (way && isMissingRole(member)) {
+                 issues.push(makeIssue(way, entity, member));
+               }
+             });
+           }
+
+           return issues;
+         };
+
+         function isMissingRole(member) {
+           return !member.role || !member.role.trim().length;
+         }
+
+         function makeIssue(way, relation, member) {
+           return new validationIssue({
+             type: type,
+             severity: 'warning',
+             message: function message(context) {
+               var member = context.hasEntity(this.entityIds[1]),
+                   relation = context.hasEntity(this.entityIds[0]);
+               return member && relation ? _t.html('issues.missing_role.message', {
+                 member: utilDisplayLabel(member, context.graph()),
+                 relation: utilDisplayLabel(relation, context.graph())
+               }) : '';
+             },
+             reference: showReference,
+             entityIds: [relation.id, way.id],
+             data: {
+               member: member
+             },
+             hash: member.index.toString(),
+             dynamicFixes: function dynamicFixes() {
+               return [makeAddRoleFix('inner'), makeAddRoleFix('outer'), new validationIssueFix({
+                 icon: 'iD-operation-delete',
+                 title: _t.html('issues.fix.remove_from_relation.title'),
+                 onClick: function onClick(context) {
+                   context.perform(actionDeleteMember(this.issue.entityIds[0], this.issue.data.member.index), _t('operations.delete_member.annotation', {
+                     n: 1
+                   }));
+                 }
+               })];
+             }
+           });
+
+           function showReference(selection) {
+             selection.selectAll('.issue-reference').data([0]).enter().append('div').attr('class', 'issue-reference').call(_t.append('issues.missing_role.multipolygon.reference'));
+           }
+         }
+
+         function makeAddRoleFix(role) {
+           return new validationIssueFix({
+             title: _t.html('issues.fix.set_as_' + role + '.title'),
+             onClick: function onClick(context) {
+               var oldMember = this.issue.data.member;
+               var member = {
+                 id: this.issue.entityIds[1],
+                 type: oldMember.type,
+                 role: role
+               };
+               context.perform(actionChangeMember(this.issue.entityIds[0], member, oldMember.index), _t('operations.change_role.annotation', {
+                 n: 1
+               }));
+             }
+           });
+         }
+
+         validation.type = type;
+         return validation;
+       }
+
+       function validationMissingTag(context) {
+         var type = 'missing_tag';
+
+         function hasDescriptiveTags(entity, graph) {
+           var onlyAttributeKeys = ['description', 'name', 'note', 'start_date'];
+           var entityDescriptiveKeys = Object.keys(entity.tags).filter(function (k) {
+             if (k === 'area' || !osmIsInterestingTag(k)) return false;
+             return !onlyAttributeKeys.some(function (attributeKey) {
+               return k === attributeKey || k.indexOf(attributeKey + ':') === 0;
+             });
+           });
+
+           if (entity.type === 'relation' && entityDescriptiveKeys.length === 1 && entity.tags.type === 'multipolygon') {
+             // this relation's only interesting tag just says its a multipolygon,
+             // which is not descriptive enough
+             // It's okay for a simple multipolygon to have no descriptive tags
+             // if its outer way has them (old model, see `outdated_tags.js`)
+             return osmOldMultipolygonOuterMemberOfRelation(entity, graph);
+           }
+
+           return entityDescriptiveKeys.length > 0;
+         }
+
+         function isUnknownRoad(entity) {
+           return entity.type === 'way' && entity.tags.highway === 'road';
+         }
+
+         function isUntypedRelation(entity) {
+           return entity.type === 'relation' && !entity.tags.type;
+         }
+
+         var validation = function checkMissingTag(entity, graph) {
+           var subtype;
+           var osm = context.connection();
+           var isUnloadedNode = entity.type === 'node' && osm && !osm.isDataLoaded(entity.loc); // we can't know if the node is a vertex if the tile is undownloaded
+
+           if (!isUnloadedNode && // allow untagged nodes that are part of ways
+           entity.geometry(graph) !== 'vertex' && // allow untagged entities that are part of relations
+           !entity.hasParentRelations(graph)) {
+             if (Object.keys(entity.tags).length === 0) {
+               subtype = 'any';
+             } else if (!hasDescriptiveTags(entity, graph)) {
+               subtype = 'descriptive';
+             } else if (isUntypedRelation(entity)) {
+               subtype = 'relation_type';
+             }
+           } // flag an unknown road even if it's a member of a relation
+
+
+           if (!subtype && isUnknownRoad(entity)) {
+             subtype = 'highway_classification';
+           }
+
+           if (!subtype) return [];
+           var messageID = subtype === 'highway_classification' ? 'unknown_road' : 'missing_tag.' + subtype;
+           var referenceID = subtype === 'highway_classification' ? 'unknown_road' : 'missing_tag'; // can always delete if the user created it in the first place..
+
+           var canDelete = entity.version === undefined || entity.v !== undefined;
+           var severity = canDelete && subtype !== 'highway_classification' ? 'error' : 'warning';
+           return [new validationIssue({
+             type: type,
+             subtype: subtype,
+             severity: severity,
+             message: function message(context) {
+               var entity = context.hasEntity(this.entityIds[0]);
+               return entity ? _t.html('issues.' + messageID + '.message', {
+                 feature: utilDisplayLabel(entity, context.graph())
+               }) : '';
+             },
+             reference: showReference,
+             entityIds: [entity.id],
+             dynamicFixes: function dynamicFixes(context) {
+               var fixes = [];
+               var selectFixType = subtype === 'highway_classification' ? 'select_road_type' : 'select_preset';
+               fixes.push(new validationIssueFix({
+                 icon: 'iD-icon-search',
+                 title: _t.html('issues.fix.' + selectFixType + '.title'),
+                 onClick: function onClick(context) {
+                   context.ui().sidebar.showPresetList();
+                 }
+               }));
+               var deleteOnClick;
+               var id = this.entityIds[0];
+               var operation = operationDelete(context, [id]);
+               var disabledReasonID = operation.disabled();
+
+               if (!disabledReasonID) {
+                 deleteOnClick = function deleteOnClick(context) {
+                   var id = this.issue.entityIds[0];
+                   var operation = operationDelete(context, [id]);
+
+                   if (!operation.disabled()) {
+                     operation();
+                   }
+                 };
+               }
+
+               fixes.push(new validationIssueFix({
+                 icon: 'iD-operation-delete',
+                 title: _t.html('issues.fix.delete_feature.title'),
+                 disabledReason: disabledReasonID ? _t('operations.delete.' + disabledReasonID + '.single') : undefined,
+                 onClick: deleteOnClick
+               }));
+               return fixes;
+             }
+           })];
+
+           function showReference(selection) {
+             selection.selectAll('.issue-reference').data([0]).enter().append('div').attr('class', 'issue-reference').call(_t.append('issues.' + referenceID + '.reference'));
+           }
+         };
+
+         validation.type = type;
+         return validation;
+       }
+
+       function validationOutdatedTags() {
+         var type = 'outdated_tags';
+         var _waitingForDeprecated = true;
+
+         var _dataDeprecated; // fetch deprecated tags
+
+
+         _mainFileFetcher.get('deprecated').then(function (d) {
+           return _dataDeprecated = d;
+         })["catch"](function () {
+           /* ignore */
+         })["finally"](function () {
+           return _waitingForDeprecated = false;
+         });
+
+         function oldTagIssues(entity, graph) {
+           var oldTags = Object.assign({}, entity.tags); // shallow copy
+
+           var preset = _mainPresetIndex.match(entity, graph);
+           var subtype = 'deprecated_tags';
+           if (!preset) return [];
+           if (!entity.hasInterestingTags()) return []; // Upgrade preset, if a replacement is available..
+
+           if (preset.replacement) {
+             var newPreset = _mainPresetIndex.item(preset.replacement);
+             graph = actionChangePreset(entity.id, preset, newPreset, true
+             /* skip field defaults */
+             )(graph);
+             entity = graph.entity(entity.id);
+             preset = newPreset;
+           } // Upgrade deprecated tags..
+
+
+           if (_dataDeprecated) {
+             var deprecatedTags = entity.deprecatedTags(_dataDeprecated);
+
+             if (deprecatedTags.length) {
+               deprecatedTags.forEach(function (tag) {
+                 graph = actionUpgradeTags(entity.id, tag.old, tag.replace)(graph);
+               });
+               entity = graph.entity(entity.id);
+             }
+           } // Add missing addTags from the detected preset
+
+
+           var newTags = Object.assign({}, entity.tags); // shallow copy
+
+           if (preset.tags !== preset.addTags) {
+             Object.keys(preset.addTags).forEach(function (k) {
+               if (!newTags[k]) {
+                 if (preset.addTags[k] === '*') {
+                   newTags[k] = 'yes';
+                 } else {
+                   newTags[k] = preset.addTags[k];
+                 }
+               }
+             });
+           } // Attempt to match a canonical record in the name-suggestion-index.
+
+
+           var nsi = services.nsi;
+           var waitingForNsi = false;
+           var nsiResult;
+
+           if (nsi) {
+             waitingForNsi = nsi.status() === 'loading';
+
+             if (!waitingForNsi) {
+               var loc = entity.extent(graph).center();
+               nsiResult = nsi.upgradeTags(newTags, loc);
+
+               if (nsiResult) {
+                 newTags = nsiResult.newTags;
+                 subtype = 'noncanonical_brand';
+               }
+             }
+           }
+
+           var issues = [];
+           issues.provisional = _waitingForDeprecated || waitingForNsi; // determine diff
+
+           var tagDiff = utilTagDiff(oldTags, newTags);
+           if (!tagDiff.length) return issues;
+           var isOnlyAddingTags = tagDiff.every(function (d) {
+             return d.type === '+';
+           });
+           var prefix = '';
+
+           if (nsiResult) {
+             prefix = 'noncanonical_brand.';
+           } else if (subtype === 'deprecated_tags' && isOnlyAddingTags) {
+             subtype = 'incomplete_tags';
+             prefix = 'incomplete.';
+           } // don't allow autofixing brand tags
+
+
+           var autoArgs = subtype !== 'noncanonical_brand' ? [doUpgrade, _t('issues.fix.upgrade_tags.annotation')] : null;
+           issues.push(new validationIssue({
+             type: type,
+             subtype: subtype,
+             severity: 'warning',
+             message: showMessage,
+             reference: showReference,
+             entityIds: [entity.id],
+             hash: utilHashcode(JSON.stringify(tagDiff)),
+             dynamicFixes: function dynamicFixes() {
+               var fixes = [new validationIssueFix({
+                 autoArgs: autoArgs,
+                 title: _t.html('issues.fix.upgrade_tags.title'),
+                 onClick: function onClick(context) {
+                   context.perform(doUpgrade, _t('issues.fix.upgrade_tags.annotation'));
+                 }
+               })];
+               var item = nsiResult && nsiResult.matched;
+
+               if (item) {
+                 fixes.push(new validationIssueFix({
+                   title: _t.html('issues.fix.tag_as_not.title', {
+                     name: item.displayName
+                   }),
+                   onClick: function onClick(context) {
+                     context.perform(addNotTag, _t('issues.fix.tag_as_not.annotation'));
+                   }
+                 }));
+               }
+
+               return fixes;
+             }
+           }));
+           return issues;
+
+           function doUpgrade(graph) {
+             var currEntity = graph.hasEntity(entity.id);
+             if (!currEntity) return graph;
+             var newTags = Object.assign({}, currEntity.tags); // shallow copy
+
+             tagDiff.forEach(function (diff) {
+               if (diff.type === '-') {
+                 delete newTags[diff.key];
+               } else if (diff.type === '+') {
+                 newTags[diff.key] = diff.newVal;
+               }
+             });
+             return actionChangeTags(currEntity.id, newTags)(graph);
+           }
+
+           function addNotTag(graph) {
+             var currEntity = graph.hasEntity(entity.id);
+             if (!currEntity) return graph;
+             var item = nsiResult && nsiResult.matched;
+             if (!item) return graph;
+             var newTags = Object.assign({}, currEntity.tags); // shallow copy
+
+             var wd = item.mainTag; // e.g. `brand:wikidata`
+
+             var notwd = "not:".concat(wd); // e.g. `not:brand:wikidata`
+
+             var qid = item.tags[wd];
+             newTags[notwd] = qid;
+
+             if (newTags[wd] === qid) {
+               // if `brand:wikidata` was set to that qid
+               var wp = item.mainTag.replace('wikidata', 'wikipedia');
+               delete newTags[wd]; // remove `brand:wikidata`
+
+               delete newTags[wp]; // remove `brand:wikipedia`
+             }
+
+             return actionChangeTags(currEntity.id, newTags)(graph);
+           }
+
+           function showMessage(context) {
+             var currEntity = context.hasEntity(entity.id);
+             if (!currEntity) return '';
+             var messageID = "issues.outdated_tags.".concat(prefix, "message");
+
+             if (subtype === 'noncanonical_brand' && isOnlyAddingTags) {
+               messageID += '_incomplete';
+             }
+
+             return _t.html(messageID, {
+               feature: utilDisplayLabel(currEntity, context.graph(), true
+               /* verbose */
+               )
+             });
+           }
+
+           function showReference(selection) {
+             var enter = selection.selectAll('.issue-reference').data([0]).enter();
+             enter.append('div').attr('class', 'issue-reference').call(_t.append("issues.outdated_tags.".concat(prefix, "reference")));
+             enter.append('strong').call(_t.append('issues.suggested'));
+             enter.append('table').attr('class', 'tagDiff-table').selectAll('.tagDiff-row').data(tagDiff).enter().append('tr').attr('class', 'tagDiff-row').append('td').attr('class', function (d) {
+               var klass = d.type === '+' ? 'add' : 'remove';
+               return "tagDiff-cell tagDiff-cell-".concat(klass);
+             }).html(function (d) {
+               return d.display;
+             });
+           }
+         }
+
+         function oldMultipolygonIssues(entity, graph) {
+           var multipolygon, outerWay;
+
+           if (entity.type === 'relation') {
+             outerWay = osmOldMultipolygonOuterMemberOfRelation(entity, graph);
+             multipolygon = entity;
+           } else if (entity.type === 'way') {
+             multipolygon = osmIsOldMultipolygonOuterMember(entity, graph);
+             outerWay = entity;
+           } else {
+             return [];
+           }
+
+           if (!multipolygon || !outerWay) return [];
+           return [new validationIssue({
+             type: type,
+             subtype: 'old_multipolygon',
+             severity: 'warning',
+             message: showMessage,
+             reference: showReference,
+             entityIds: [outerWay.id, multipolygon.id],
+             dynamicFixes: function dynamicFixes() {
+               return [new validationIssueFix({
+                 autoArgs: [doUpgrade, _t('issues.fix.move_tags.annotation')],
+                 title: _t.html('issues.fix.move_tags.title'),
+                 onClick: function onClick(context) {
+                   context.perform(doUpgrade, _t('issues.fix.move_tags.annotation'));
+                 }
+               })];
+             }
+           })];
+
+           function doUpgrade(graph) {
+             var currMultipolygon = graph.hasEntity(multipolygon.id);
+             var currOuterWay = graph.hasEntity(outerWay.id);
+             if (!currMultipolygon || !currOuterWay) return graph;
+             currMultipolygon = currMultipolygon.mergeTags(currOuterWay.tags);
+             graph = graph.replace(currMultipolygon);
+             return actionChangeTags(currOuterWay.id, {})(graph);
+           }
+
+           function showMessage(context) {
+             var currMultipolygon = context.hasEntity(multipolygon.id);
+             if (!currMultipolygon) return '';
+             return _t.html('issues.old_multipolygon.message', {
+               multipolygon: utilDisplayLabel(currMultipolygon, context.graph(), true
+               /* verbose */
+               )
+             });
+           }
+
+           function showReference(selection) {
+             selection.selectAll('.issue-reference').data([0]).enter().append('div').attr('class', 'issue-reference').call(_t.append('issues.old_multipolygon.reference'));
+           }
+         }
+
+         var validation = function checkOutdatedTags(entity, graph) {
+           var issues = oldMultipolygonIssues(entity, graph);
+           if (!issues.length) issues = oldTagIssues(entity, graph);
+           return issues;
+         };
+
+         validation.type = type;
+         return validation;
+       }
+
+       function validationPrivateData() {
+         var type = 'private_data'; // assume that some buildings are private
+
+         var privateBuildingValues = {
+           detached: true,
+           farm: true,
+           house: true,
+           houseboat: true,
+           residential: true,
+           semidetached_house: true,
+           static_caravan: true
+         }; // but they might be public if they have one of these other tags
+
+         var publicKeys = {
+           amenity: true,
+           craft: true,
+           historic: true,
+           leisure: true,
+           office: true,
+           shop: true,
+           tourism: true
+         }; // these tags may contain personally identifying info
+
+         var personalTags = {
+           'contact:email': true,
+           'contact:fax': true,
+           'contact:phone': true,
+           email: true,
+           fax: true,
+           phone: true
+         };
+
+         var validation = function checkPrivateData(entity) {
+           var tags = entity.tags;
+           if (!tags.building || !privateBuildingValues[tags.building]) return [];
+           var keepTags = {};
+
+           for (var k in tags) {
+             if (publicKeys[k]) return []; // probably a public feature
+
+             if (!personalTags[k]) {
+               keepTags[k] = tags[k];
+             }
+           }
+
+           var tagDiff = utilTagDiff(tags, keepTags);
+           if (!tagDiff.length) return [];
+           var fixID = tagDiff.length === 1 ? 'remove_tag' : 'remove_tags';
+           return [new validationIssue({
+             type: type,
+             severity: 'warning',
+             message: showMessage,
+             reference: showReference,
+             entityIds: [entity.id],
+             dynamicFixes: function dynamicFixes() {
+               return [new validationIssueFix({
+                 icon: 'iD-operation-delete',
+                 title: _t.html('issues.fix.' + fixID + '.title'),
+                 onClick: function onClick(context) {
+                   context.perform(doUpgrade, _t('issues.fix.upgrade_tags.annotation'));
+                 }
+               })];
+             }
+           })];
+
+           function doUpgrade(graph) {
+             var currEntity = graph.hasEntity(entity.id);
+             if (!currEntity) return graph;
+             var newTags = Object.assign({}, currEntity.tags); // shallow copy
+
+             tagDiff.forEach(function (diff) {
+               if (diff.type === '-') {
+                 delete newTags[diff.key];
+               } else if (diff.type === '+') {
+                 newTags[diff.key] = diff.newVal;
+               }
+             });
+             return actionChangeTags(currEntity.id, newTags)(graph);
+           }
+
+           function showMessage(context) {
+             var currEntity = context.hasEntity(this.entityIds[0]);
+             if (!currEntity) return '';
+             return _t.html('issues.private_data.contact.message', {
+               feature: utilDisplayLabel(currEntity, context.graph())
+             });
+           }
+
+           function showReference(selection) {
+             var enter = selection.selectAll('.issue-reference').data([0]).enter();
+             enter.append('div').attr('class', 'issue-reference').call(_t.append('issues.private_data.reference'));
+             enter.append('strong').call(_t.append('issues.suggested'));
+             enter.append('table').attr('class', 'tagDiff-table').selectAll('.tagDiff-row').data(tagDiff).enter().append('tr').attr('class', 'tagDiff-row').append('td').attr('class', function (d) {
+               var klass = d.type === '+' ? 'add' : 'remove';
+               return 'tagDiff-cell tagDiff-cell-' + klass;
+             }).html(function (d) {
+               return d.display;
+             });
+           }
+         };
+
+         validation.type = type;
+         return validation;
+       }
+
+       function validationSuspiciousName() {
+         var type = 'suspicious_name';
+         var keysToTestForGenericValues = ['aerialway', 'aeroway', 'amenity', 'building', 'craft', 'highway', 'leisure', 'railway', 'man_made', 'office', 'shop', 'tourism', 'waterway'];
+         var _waitingForNsi = false; // Attempt to match a generic record in the name-suggestion-index.
+
+         function isGenericMatchInNsi(tags) {
+           var nsi = services.nsi;
+
+           if (nsi) {
+             _waitingForNsi = nsi.status() === 'loading';
+
+             if (!_waitingForNsi) {
+               return nsi.isGenericName(tags);
+             }
+           }
+
+           return false;
+         } // Test if the name is just the key or tag value (e.g. "park")
+
+
+         function nameMatchesRawTag(lowercaseName, tags) {
+           for (var i = 0; i < keysToTestForGenericValues.length; i++) {
+             var key = keysToTestForGenericValues[i];
+             var val = tags[key];
+
+             if (val) {
+               val = val.toLowerCase();
+
+               if (key === lowercaseName || val === lowercaseName || key.replace(/\_/g, ' ') === lowercaseName || val.replace(/\_/g, ' ') === lowercaseName) {
+                 return true;
+               }
+             }
+           }
+
+           return false;
+         }
+
+         function isGenericName(name, tags) {
+           name = name.toLowerCase();
+           return nameMatchesRawTag(name, tags) || isGenericMatchInNsi(tags);
+         }
+
+         function makeGenericNameIssue(entityId, nameKey, genericName, langCode) {
+           return new validationIssue({
+             type: type,
+             subtype: 'generic_name',
+             severity: 'warning',
+             message: function message(context) {
+               var entity = context.hasEntity(this.entityIds[0]);
+               if (!entity) return '';
+               var preset = _mainPresetIndex.match(entity, context.graph());
+               var langName = langCode && _mainLocalizer.languageName(langCode);
+               return _t.html('issues.generic_name.message' + (langName ? '_language' : ''), {
+                 feature: preset.name(),
+                 name: genericName,
+                 language: langName
+               });
+             },
+             reference: showReference,
+             entityIds: [entityId],
+             hash: "".concat(nameKey, "=").concat(genericName),
+             dynamicFixes: function dynamicFixes() {
+               return [new validationIssueFix({
+                 icon: 'iD-operation-delete',
+                 title: _t.html('issues.fix.remove_the_name.title'),
+                 onClick: function onClick(context) {
+                   var entityId = this.issue.entityIds[0];
+                   var entity = context.entity(entityId);
+                   var tags = Object.assign({}, entity.tags); // shallow copy
+
+                   delete tags[nameKey];
+                   context.perform(actionChangeTags(entityId, tags), _t('issues.fix.remove_generic_name.annotation'));
+                 }
+               })];
+             }
+           });
+
+           function showReference(selection) {
+             selection.selectAll('.issue-reference').data([0]).enter().append('div').attr('class', 'issue-reference').call(_t.append('issues.generic_name.reference'));
+           }
+         }
+
+         function makeIncorrectNameIssue(entityId, nameKey, incorrectName, langCode) {
+           return new validationIssue({
+             type: type,
+             subtype: 'not_name',
+             severity: 'warning',
+             message: function message(context) {
+               var entity = context.hasEntity(this.entityIds[0]);
+               if (!entity) return '';
+               var preset = _mainPresetIndex.match(entity, context.graph());
+               var langName = langCode && _mainLocalizer.languageName(langCode);
+               return _t.html('issues.incorrect_name.message' + (langName ? '_language' : ''), {
+                 feature: preset.name(),
+                 name: incorrectName,
+                 language: langName
+               });
+             },
+             reference: showReference,
+             entityIds: [entityId],
+             hash: "".concat(nameKey, "=").concat(incorrectName),
+             dynamicFixes: function dynamicFixes() {
+               return [new validationIssueFix({
+                 icon: 'iD-operation-delete',
+                 title: _t.html('issues.fix.remove_the_name.title'),
+                 onClick: function onClick(context) {
+                   var entityId = this.issue.entityIds[0];
+                   var entity = context.entity(entityId);
+                   var tags = Object.assign({}, entity.tags); // shallow copy
+
+                   delete tags[nameKey];
+                   context.perform(actionChangeTags(entityId, tags), _t('issues.fix.remove_mistaken_name.annotation'));
+                 }
+               })];
+             }
+           });
+
+           function showReference(selection) {
+             selection.selectAll('.issue-reference').data([0]).enter().append('div').attr('class', 'issue-reference').call(_t.append('issues.generic_name.reference'));
+           }
+         }
+
+         var validation = function checkGenericName(entity) {
+           var tags = entity.tags; // a generic name is allowed if it's a known brand or entity
+
+           var hasWikidata = !!tags.wikidata || !!tags['brand:wikidata'] || !!tags['operator:wikidata'];
+           if (hasWikidata) return [];
+           var issues = [];
+           var notNames = (tags['not:name'] || '').split(';');
+
+           for (var key in tags) {
+             var m = key.match(/^name(?:(?::)([a-zA-Z_-]+))?$/);
+             if (!m) continue;
+             var langCode = m.length >= 2 ? m[1] : null;
+             var value = tags[key];
+
+             if (notNames.length) {
+               for (var i in notNames) {
+                 var notName = notNames[i];
+
+                 if (notName && value === notName) {
+                   issues.push(makeIncorrectNameIssue(entity.id, key, value, langCode));
+                   continue;
+                 }
+               }
+             }
+
+             if (isGenericName(value, tags)) {
+               issues.provisional = _waitingForNsi; // retry later if we are waiting on NSI to finish loading
+
+               issues.push(makeGenericNameIssue(entity.id, key, value, langCode));
+             }
+           }
+
+           return issues;
+         };
+
+         validation.type = type;
+         return validation;
+       }
+
+       function validationUnsquareWay(context) {
+         var type = 'unsquare_way';
+         var DEFAULT_DEG_THRESHOLD = 5; // see also issues.js
+         // use looser epsilon for detection to reduce warnings of buildings that are essentially square already
+
+         var epsilon = 0.05;
+         var nodeThreshold = 10;
+
+         function isBuilding(entity, graph) {
+           if (entity.type !== 'way' || entity.geometry(graph) !== 'area') return false;
+           return entity.tags.building && entity.tags.building !== 'no';
+         }
+
+         var validation = function checkUnsquareWay(entity, graph) {
+           if (!isBuilding(entity, graph)) return []; // don't flag ways marked as physically unsquare
+
+           if (entity.tags.nonsquare === 'yes') return [];
+           var isClosed = entity.isClosed();
+           if (!isClosed) return []; // this building has bigger problems
+           // don't flag ways with lots of nodes since they are likely detail-mapped
+
+           var nodes = graph.childNodes(entity).slice(); // shallow copy
+
+           if (nodes.length > nodeThreshold + 1) return []; // +1 because closing node appears twice
+           // ignore if not all nodes are fully downloaded
+
+           var osm = services.osm;
+           if (!osm || nodes.some(function (node) {
+             return !osm.isDataLoaded(node.loc);
+           })) return []; // don't flag connected ways to avoid unresolvable unsquare loops
+
+           var hasConnectedSquarableWays = nodes.some(function (node) {
+             return graph.parentWays(node).some(function (way) {
+               if (way.id === entity.id) return false;
+               if (isBuilding(way, graph)) return true;
+               return graph.parentRelations(way).some(function (parentRelation) {
+                 return parentRelation.isMultipolygon() && parentRelation.tags.building && parentRelation.tags.building !== 'no';
+               });
+             });
+           });
+           if (hasConnectedSquarableWays) return []; // user-configurable square threshold
+
+           var storedDegreeThreshold = corePreferences('validate-square-degrees');
+           var degreeThreshold = isNaN(storedDegreeThreshold) ? DEFAULT_DEG_THRESHOLD : parseFloat(storedDegreeThreshold);
+           var points = nodes.map(function (node) {
+             return context.projection(node.loc);
+           });
+           if (!geoOrthoCanOrthogonalize(points, isClosed, epsilon, degreeThreshold, true)) return [];
+           var autoArgs; // don't allow autosquaring features linked to wikidata
+
+           if (!entity.tags.wikidata) {
+             // use same degree threshold as for detection
+             var autoAction = actionOrthogonalize(entity.id, context.projection, undefined, degreeThreshold);
+             autoAction.transitionable = false; // when autofixing, do it instantly
+
+             autoArgs = [autoAction, _t('operations.orthogonalize.annotation.feature', {
+               n: 1
+             })];
+           }
+
+           return [new validationIssue({
+             type: type,
+             subtype: 'building',
+             severity: 'warning',
+             message: function message(context) {
+               var entity = context.hasEntity(this.entityIds[0]);
+               return entity ? _t.html('issues.unsquare_way.message', {
+                 feature: utilDisplayLabel(entity, context.graph())
+               }) : '';
+             },
+             reference: showReference,
+             entityIds: [entity.id],
+             hash: degreeThreshold,
+             dynamicFixes: function dynamicFixes() {
+               return [new validationIssueFix({
+                 icon: 'iD-operation-orthogonalize',
+                 title: _t.html('issues.fix.square_feature.title'),
+                 autoArgs: autoArgs,
+                 onClick: function onClick(context, completionHandler) {
+                   var entityId = this.issue.entityIds[0]; // use same degree threshold as for detection
+
+                   context.perform(actionOrthogonalize(entityId, context.projection, undefined, degreeThreshold), _t('operations.orthogonalize.annotation.feature', {
+                     n: 1
+                   })); // run after the squaring transition (currently 150ms)
+
+                   window.setTimeout(function () {
+                     completionHandler();
+                   }, 175);
+                 }
+               })
+               /*
+               new validationIssueFix({
+                   title: t.html('issues.fix.tag_as_unsquare.title'),
+                   onClick: function(context) {
+                       var entityId = this.issue.entityIds[0];
+                       var entity = context.entity(entityId);
+                       var tags = Object.assign({}, entity.tags);  // shallow copy
+                       tags.nonsquare = 'yes';
+                       context.perform(
+                           actionChangeTags(entityId, tags),
+                           t('issues.fix.tag_as_unsquare.annotation')
+                       );
+                   }
+               })
+               */
+               ];
+             }
+           })];
+
+           function showReference(selection) {
+             selection.selectAll('.issue-reference').data([0]).enter().append('div').attr('class', 'issue-reference').call(_t.append('issues.unsquare_way.buildings.reference'));
+           }
+         };
+
+         validation.type = type;
+         return validation;
+       }
+
+       var Validations = /*#__PURE__*/Object.freeze({
+               __proto__: null,
+               validationAlmostJunction: validationAlmostJunction,
+               validationCloseNodes: validationCloseNodes,
+               validationCrossingWays: validationCrossingWays,
+               validationDisconnectedWay: validationDisconnectedWay,
+               validationFormatting: validationFormatting,
+               validationHelpRequest: validationHelpRequest,
+               validationImpossibleOneway: validationImpossibleOneway,
+               validationIncompatibleSource: validationIncompatibleSource,
+               validationMaprules: validationMaprules,
+               validationMismatchedGeometry: validationMismatchedGeometry,
+               validationMissingRole: validationMissingRole,
+               validationMissingTag: validationMissingTag,
+               validationOutdatedTags: validationOutdatedTags,
+               validationPrivateData: validationPrivateData,
+               validationSuspiciousName: validationSuspiciousName,
+               validationUnsquareWay: validationUnsquareWay
+       });
+
+       function coreValidator(context) {
+         var _this = this;
+
+         var dispatch = dispatch$8('validated', 'focusedIssue');
+         var validator = utilRebind({}, dispatch, 'on');
+         var _rules = {};
+         var _disabledRules = {};
+
+         var _ignoredIssueIDs = new Set();
+
+         var _resolvedIssueIDs = new Set();
+
+         var _baseCache = validationCache('base'); // issues before any user edits
+
+
+         var _headCache = validationCache('head'); // issues after all user edits
+
+
+         var _completeDiff = {}; // complete diff base -> head of what the user changed
+
+         var _headIsCurrent = false;
+
+         var _deferredRIC = new Set(); // Set( RequestIdleCallback handles )
+
+
+         var _deferredST = new Set(); // Set( SetTimeout handles )
+
+
+         var _headPromise; // Promise fulfilled when validation is performed up to headGraph snapshot
+
+
+         var RETRY = 5000; // wait 5sec before revalidating provisional entities
+         // Allow validation severity to be overridden by url queryparams...
+         // See: https://github.com/openstreetmap/iD/pull/8243
+         //
+         // Each param should contain a urlencoded comma separated list of
+         // `type/subtype` rules.  `*` may be used as a wildcard..
+         // Examples:
+         //  `validationError=disconnected_way/*`
+         //  `validationError=disconnected_way/highway`
+         //  `validationError=crossing_ways/bridge*`
+         //  `validationError=crossing_ways/bridge*,crossing_ways/tunnel*`
+
+         var _errorOverrides = parseHashParam(context.initialHashParams.validationError);
+
+         var _warningOverrides = parseHashParam(context.initialHashParams.validationWarning);
+
+         var _disableOverrides = parseHashParam(context.initialHashParams.validationDisable); // `parseHashParam()`   (private)
+         // Checks hash parameters for severity overrides
+         // Arguments
+         //   `param` - a url hash parameter (`validationError`, `validationWarning`, or `validationDisable`)
+         // Returns
+         //   Array of Objects like { type: RegExp, subtype: RegExp }
+         //
+
+
+         function parseHashParam(param) {
+           var result = [];
+           var rules = (param || '').split(',');
+           rules.forEach(function (rule) {
+             rule = rule.trim();
+             var parts = rule.split('/', 2); // "type/subtype"
+
+             var type = parts[0];
+             var subtype = parts[1] || '*';
+             if (!type || !subtype) return;
+             result.push({
+               type: makeRegExp(type),
+               subtype: makeRegExp(subtype)
+             });
+           });
+           return result;
+
+           function makeRegExp(str) {
+             var escaped = str.replace(/[-\/\\^$+?.()|[\]{}]/g, '\\$&') // escape all reserved chars except for the '*'
+             .replace(/\*/g, '.*'); // treat a '*' like '.*'
+
+             return new RegExp('^' + escaped + '$');
+           }
+         } // `init()`
+         // Initialize the validator, called once on iD startup
+         //
+
+
+         validator.init = function () {
+           Object.values(Validations).forEach(function (validation) {
+             if (typeof validation !== 'function') return;
+             var fn = validation(context);
+             var key = fn.type;
+             _rules[key] = fn;
+           });
+           var disabledRules = corePreferences('validate-disabledRules');
+
+           if (disabledRules) {
+             disabledRules.split(',').forEach(function (k) {
+               return _disabledRules[k] = true;
+             });
+           }
+         }; // `reset()`   (private)
+         // Cancels deferred work and resets all caches
+         //
+         // Arguments
+         //   `resetIgnored` - `true` to clear the list of user-ignored issues
+         //
+
+
+         function reset(resetIgnored) {
+           // cancel deferred work
+           _deferredRIC.forEach(window.cancelIdleCallback);
+
+           _deferredRIC.clear();
+
+           _deferredST.forEach(window.clearTimeout);
+
+           _deferredST.clear(); // empty queues and resolve any pending promise
+
+
+           _baseCache.queue = [];
+           _headCache.queue = [];
+           processQueue(_headCache);
+           processQueue(_baseCache); // clear caches
+
+           if (resetIgnored) _ignoredIssueIDs.clear();
+
+           _resolvedIssueIDs.clear();
+
+           _baseCache = validationCache('base');
+           _headCache = validationCache('head');
+           _completeDiff = {};
+           _headIsCurrent = false;
+         } // `reset()`
+         // clear caches, called whenever iD resets after a save or switches sources
+         // (clears out the _ignoredIssueIDs set also)
+         //
+
+
+         validator.reset = function () {
+           reset(true);
+         }; // `resetIgnoredIssues()`
+         // clears out the _ignoredIssueIDs Set
+         //
+
+
+         validator.resetIgnoredIssues = function () {
+           _ignoredIssueIDs.clear();
+
+           dispatch.call('validated'); // redraw UI
+         }; // `revalidateUnsquare()`
+         // Called whenever the user changes the unsquare threshold
+         // It reruns just the "unsquare_way" validation on all buildings.
+         //
+
+
+         validator.revalidateUnsquare = function () {
+           revalidateUnsquare(_headCache);
+           revalidateUnsquare(_baseCache);
+           dispatch.call('validated');
+         };
+
+         function revalidateUnsquare(cache) {
+           var checkUnsquareWay = _rules.unsquare_way;
+           if (!cache.graph || typeof checkUnsquareWay !== 'function') return; // uncache existing
+
+           cache.uncacheIssuesOfType('unsquare_way');
+           var buildings = context.history().tree().intersects(geoExtent([-180, -90], [180, 90]), cache.graph) // everywhere
+           .filter(function (entity) {
+             return entity.type === 'way' && entity.tags.building && entity.tags.building !== 'no';
+           }); // rerun for all buildings
+
+           buildings.forEach(function (entity) {
+             var detected = checkUnsquareWay(entity, cache.graph);
+             if (!detected.length) return;
+             cache.cacheIssues(detected);
+           });
+         } // `getIssues()`
+         // Gets all issues that match the given options
+         // This is called by many other places
+         //
+         // Arguments
+         //   `options` Object like:
+         //   {
+         //     what: 'all',                  // 'all' or 'edited'
+         //     where: 'all',                 // 'all' or 'visible'
+         //     includeIgnored: false,        // true, false, or 'only'
+         //     includeDisabledRules: false   // true, false, or 'only'
+         //   }
+         //
+         // Returns
+         //   An Array containing the issues
+         //
+
+
+         validator.getIssues = function (options) {
+           var opts = Object.assign({
+             what: 'all',
+             where: 'all',
+             includeIgnored: false,
+             includeDisabledRules: false
+           }, options);
+           var view = context.map().extent();
+           var seen = new Set();
+           var results = []; // collect head issues - present in the user edits
+
+           if (_headCache.graph && _headCache.graph !== _baseCache.graph) {
+             Object.values(_headCache.issuesByIssueID).forEach(function (issue) {
+               // In the head cache, only count features that the user is responsible for - #8632
+               // For example, a user can undo some work and an issue will still present in the
+               // head graph, but we don't want to credit the user for causing that issue.
+               var userModified = (issue.entityIds || []).some(function (id) {
+                 return _completeDiff.hasOwnProperty(id);
+               });
+               if (opts.what === 'edited' && !userModified) return; // present in head but user didn't touch it
+
+               if (!filter(issue)) return;
+               seen.add(issue.id);
+               results.push(issue);
+             });
+           } // collect base issues - present before user edits
+
+
+           if (opts.what === 'all') {
+             Object.values(_baseCache.issuesByIssueID).forEach(function (issue) {
+               if (!filter(issue)) return;
+               seen.add(issue.id);
+               results.push(issue);
+             });
+           }
+
+           return results; // Filter the issue set to include only what the calling code wants to see.
+           // Note that we use `context.graph()`/`context.hasEntity()` here, not `cache.graph`,
+           // because that is the graph that the calling code will be using.
+
+           function filter(issue) {
+             if (!issue) return false;
+             if (seen.has(issue.id)) return false;
+             if (_resolvedIssueIDs.has(issue.id)) return false;
+             if (opts.includeDisabledRules === 'only' && !_disabledRules[issue.type]) return false;
+             if (!opts.includeDisabledRules && _disabledRules[issue.type]) return false;
+             if (opts.includeIgnored === 'only' && !_ignoredIssueIDs.has(issue.id)) return false;
+             if (!opts.includeIgnored && _ignoredIssueIDs.has(issue.id)) return false; // This issue may involve an entity that doesn't exist in context.graph()
+             // This can happen because validation is async and rendering the issue lists is async.
+
+             if ((issue.entityIds || []).some(function (id) {
+               return !context.hasEntity(id);
+             })) return false;
+
+             if (opts.where === 'visible') {
+               var extent = issue.extent(context.graph());
+               if (!view.intersects(extent)) return false;
+             }
+
+             return true;
+           }
+         }; // `getResolvedIssues()`
+         // Gets the issues that have been fixed by the user.
+         //
+         // Resolved issues are tracked in the `_resolvedIssueIDs` Set,
+         // and they should all be issues that exist in the _baseCache.
+         //
+         // Returns
+         //   An Array containing the issues
+         //
+
+
+         validator.getResolvedIssues = function () {
+           return Array.from(_resolvedIssueIDs).map(function (issueID) {
+             return _baseCache.issuesByIssueID[issueID];
+           }).filter(Boolean);
+         }; // `focusIssue()`
+         // Adjusts the map to focus on the given issue.
+         // (requires the issue to have a reasonable extent defined)
+         //
+         // Arguments
+         //   `issue` - the issue to focus on
+         //
+
+
+         validator.focusIssue = function (issue) {
+           // Note that we use `context.graph()`/`context.hasEntity()` here, not `cache.graph`,
+           // because that is the graph that the calling code will be using.
+           var graph = context.graph();
+           var selectID;
+           var focusCenter; // Try to focus the map at the center of the issue..
+
+           var issueExtent = issue.extent(graph);
+
+           if (issueExtent) {
+             focusCenter = issueExtent.center();
+           } // Try to select the first entity in the issue..
+
+
+           if (issue.entityIds && issue.entityIds.length) {
+             selectID = issue.entityIds[0]; // If a relation, focus on one of its members instead.
+             // Otherwise we might be focusing on a part of map where the relation is not visible.
+
+             if (selectID && selectID.charAt(0) === 'r') {
+               // relation
+               var ids = utilEntityAndDeepMemberIDs([selectID], graph);
+               var nodeID = ids.find(function (id) {
+                 return id.charAt(0) === 'n' && graph.hasEntity(id);
+               });
+
+               if (!nodeID) {
+                 // relation has no downloaded nodes to focus on
+                 var wayID = ids.find(function (id) {
+                   return id.charAt(0) === 'w' && graph.hasEntity(id);
+                 });
+
+                 if (wayID) {
+                   nodeID = graph.entity(wayID).first(); // focus on the first node of this way
+                 }
+               }
+
+               if (nodeID) {
+                 focusCenter = graph.entity(nodeID).loc;
+               }
+             }
+           }
+
+           if (focusCenter) {
+             // Adjust the view
+             var setZoom = Math.max(context.map().zoom(), 19);
+             context.map().unobscuredCenterZoomEase(focusCenter, setZoom);
+           }
+
+           if (selectID) {
+             // Enter select mode
+             window.setTimeout(function () {
+               context.enter(modeSelect(context, [selectID]));
+               dispatch.call('focusedIssue', _this, issue);
+             }, 250); // after ease
+           }
+         }; // `getIssuesBySeverity()`
+         // Gets the issues then groups them by error/warning
+         // (This just calls getIssues, then puts issues in groups)
+         //
+         // Arguments
+         //   `options` - (see `getIssues`)
+         // Returns
+         //   Object result like:
+         //   {
+         //     error:    Array of errors,
+         //     warning:  Array of warnings
+         //   }
+         //
+
+
+         validator.getIssuesBySeverity = function (options) {
+           var groups = utilArrayGroupBy(validator.getIssues(options), 'severity');
+           groups.error = groups.error || [];
+           groups.warning = groups.warning || [];
+           return groups;
+         }; // `getEntityIssues()`
+         // Gets the issues that the given entity IDs have in common, matching the given options
+         // (This just calls getIssues, then filters for the given entity IDs)
+         // The issues are sorted for relevance
+         //
+         // Arguments
+         //   `entityIDs` - Array or Set of entityIDs to get issues for
+         //   `options` - (see `getIssues`)
+         // Returns
+         //   An Array containing the issues
+         //
+
+
+         validator.getSharedEntityIssues = function (entityIDs, options) {
+           var orderedIssueTypes = [// Show some issue types in a particular order:
+           'missing_tag', 'missing_role', // - missing data first
+           'outdated_tags', 'mismatched_geometry', // - identity issues
+           'crossing_ways', 'almost_junction', // - geometry issues where fixing them might solve connectivity issues
+           'disconnected_way', 'impossible_oneway' // - finally connectivity issues
+           ];
+           var allIssues = validator.getIssues(options);
+           var forEntityIDs = new Set(entityIDs);
+           return allIssues.filter(function (issue) {
+             return (issue.entityIds || []).some(function (entityID) {
+               return forEntityIDs.has(entityID);
+             });
+           }).sort(function (issue1, issue2) {
+             if (issue1.type === issue2.type) {
+               // issues of the same type, sort deterministically
+               return issue1.id < issue2.id ? -1 : 1;
+             }
+
+             var index1 = orderedIssueTypes.indexOf(issue1.type);
+             var index2 = orderedIssueTypes.indexOf(issue2.type);
+
+             if (index1 !== -1 && index2 !== -1) {
+               // both issue types have explicit sort orders
+               return index1 - index2;
+             } else if (index1 === -1 && index2 === -1) {
+               // neither issue type has an explicit sort order, sort by type
+               return issue1.type < issue2.type ? -1 : 1;
+             } else {
+               // order explicit types before everything else
+               return index1 !== -1 ? -1 : 1;
+             }
+           });
+         }; // `getEntityIssues()`
+         // Get an array of detected issues for the given entityID.
+         // (This just calls getSharedEntityIssues for a single entity)
+         //
+         // Arguments
+         //   `entityID` - the entity ID to get the issues for
+         //   `options` - (see `getIssues`)
+         // Returns
+         //   An Array containing the issues
+         //
+
+
+         validator.getEntityIssues = function (entityID, options) {
+           return validator.getSharedEntityIssues([entityID], options);
+         }; // `getRuleKeys()`
+         //
+         // Returns
+         //   An Array containing the rule keys
+         //
+
+
+         validator.getRuleKeys = function () {
+           return Object.keys(_rules);
+         }; // `isRuleEnabled()`
+         //
+         // Arguments
+         //   `key` - the rule to check (e.g. 'crossing_ways')
+         // Returns
+         //   `true`/`false`
+         //
+
+
+         validator.isRuleEnabled = function (key) {
+           return !_disabledRules[key];
+         }; // `toggleRule()`
+         // Toggles a single validation rule,
+         // then reruns the validation so that the user sees something happen in the UI
+         //
+         // Arguments
+         //   `key` - the rule to toggle (e.g. 'crossing_ways')
+         //
+
+
+         validator.toggleRule = function (key) {
+           if (_disabledRules[key]) {
+             delete _disabledRules[key];
+           } else {
+             _disabledRules[key] = true;
+           }
+
+           corePreferences('validate-disabledRules', Object.keys(_disabledRules).join(','));
+           validator.validate();
+         }; // `disableRules()`
+         // Disables given validation rules,
+         // then reruns the validation so that the user sees something happen in the UI
+         //
+         // Arguments
+         //   `keys` - Array or Set containing rule keys to disable
+         //
+
+
+         validator.disableRules = function (keys) {
+           _disabledRules = {};
+           keys.forEach(function (k) {
+             return _disabledRules[k] = true;
+           });
+           corePreferences('validate-disabledRules', Object.keys(_disabledRules).join(','));
+           validator.validate();
+         }; // `ignoreIssue()`
+         // Don't show the given issue in lists
+         //
+         // Arguments
+         //   `issueID` - the issueID
+         //
+
+
+         validator.ignoreIssue = function (issueID) {
+           _ignoredIssueIDs.add(issueID);
+         }; // `validate()`
+         // Validates anything that has changed in the head graph since the last time it was run.
+         // (head graph contains user's edits)
+         //
+         // Returns
+         //   A Promise fulfilled when the validation has completed and then dispatches a `validated` event.
+         //   This may take time but happen in the background during browser idle time.
+         //
+
+
+         validator.validate = function () {
+           // Make sure the caches have graphs assigned to them.
+           // (we don't do this in `reset` because context is still resetting things and `history.base()` is unstable then)
+           var baseGraph = context.history().base();
+           if (!_headCache.graph) _headCache.graph = baseGraph;
+           if (!_baseCache.graph) _baseCache.graph = baseGraph;
+           var prevGraph = _headCache.graph;
+           var currGraph = context.graph();
+
+           if (currGraph === prevGraph) {
+             // _headCache.graph is current - we are caught up
+             _headIsCurrent = true;
+             dispatch.call('validated');
+             return Promise.resolve();
+           }
+
+           if (_headPromise) {
+             // Validation already in process, but we aren't caught up to current
+             _headIsCurrent = false; // We will need to catch up after the validation promise fulfills
+
+             return _headPromise;
+           } // If we get here, its time to start validating stuff.
+
+
+           _headCache.graph = currGraph; // take snapshot
+
+           _completeDiff = context.history().difference().complete();
+           var incrementalDiff = coreDifference(prevGraph, currGraph);
+           var entityIDs = Object.keys(incrementalDiff.complete());
+           entityIDs = _headCache.withAllRelatedEntities(entityIDs); // expand set
+
+           if (!entityIDs.size) {
+             dispatch.call('validated');
+             return Promise.resolve();
+           }
+
+           _headPromise = validateEntitiesAsync(entityIDs, _headCache).then(function () {
+             return updateResolvedIssues(entityIDs);
+           }).then(function () {
+             return dispatch.call('validated');
+           })["catch"](function () {
+             /* ignore */
+           }).then(function () {
+             _headPromise = null;
+
+             if (!_headIsCurrent) {
+               validator.validate(); // run it again to catch up to current graph
+             }
+           });
+           return _headPromise;
+         }; // register event handlers:
+         // WHEN TO RUN VALIDATION:
+         // When history changes:
+
+
+         context.history().on('restore.validator', validator.validate) // on restore saved history
+         .on('undone.validator', validator.validate) // on undo
+         .on('redone.validator', validator.validate) // on redo
+         .on('reset.validator', function () {
+           // on history reset - happens after save, or enter/exit walkthrough
+           reset(false); // cached issues aren't valid any longer if the history has been reset
+
+           validator.validate();
+         }); // but not on 'change' (e.g. while drawing)
+         // When user changes editing modes (to catch recent changes e.g. drawing)
+
+         context.on('exit.validator', validator.validate); // When merging fetched data, validate base graph:
+
+         context.history().on('merge.validator', function (entities) {
+           if (!entities) return; // Make sure the caches have graphs assigned to them.
+           // (we don't do this in `reset` because context is still resetting things and `history.base()` is unstable then)
+
+           var baseGraph = context.history().base();
+           if (!_headCache.graph) _headCache.graph = baseGraph;
+           if (!_baseCache.graph) _baseCache.graph = baseGraph;
+           var entityIDs = entities.map(function (entity) {
+             return entity.id;
+           });
+           entityIDs = _baseCache.withAllRelatedEntities(entityIDs); // expand set
+
+           validateEntitiesAsync(entityIDs, _baseCache);
+         }); // `validateEntity()`   (private)
+         // Runs all validation rules on a single entity.
+         // Some things to note:
+         //  - Graph is passed in from whenever the validation was started.  Validators shouldn't use
+         //   `context.graph()` because this all happens async, and the graph might have changed
+         //   (for example, nodes getting deleted before the validation can run)
+         //  - Validator functions may still be waiting on something and return a "provisional" result.
+         //    In this situation, we will schedule to revalidate the entity sometime later.
+         //
+         // Arguments
+         //   `entity` - The entity
+         //   `graph` - graph containing the entity
+         //
+         // Returns
+         //   Object result like:
+         //   {
+         //     issues:       Array of detected issues
+         //     provisional:  `true` if provisional result, `false` if final result
+         //   }
+         //
+
+         function validateEntity(entity, graph) {
+           var result = {
+             issues: [],
+             provisional: false
+           };
+           Object.keys(_rules).forEach(runValidation); // run all rules
+
+           return result; // runs validation and appends resulting issues
+
+           function runValidation(key) {
+             var fn = _rules[key];
+
+             if (typeof fn !== 'function') {
+               console.error('no such validation rule = ' + key); // eslint-disable-line no-console
+
+               return;
+             }
+
+             var detected = fn(entity, graph);
+
+             if (detected.provisional) {
+               // this validation should be run again later
+               result.provisional = true;
+             }
+
+             detected = detected.filter(applySeverityOverrides);
+             result.issues = result.issues.concat(detected); // If there are any override rules that match the issue type/subtype,
+             // adjust severity (or disable it) and keep/discard as quickly as possible.
+
+             function applySeverityOverrides(issue) {
+               var type = issue.type;
+               var subtype = issue.subtype || '';
+               var i;
+
+               for (i = 0; i < _errorOverrides.length; i++) {
+                 if (_errorOverrides[i].type.test(type) && _errorOverrides[i].subtype.test(subtype)) {
+                   issue.severity = 'error';
+                   return true;
+                 }
+               }
+
+               for (i = 0; i < _warningOverrides.length; i++) {
+                 if (_warningOverrides[i].type.test(type) && _warningOverrides[i].subtype.test(subtype)) {
+                   issue.severity = 'warning';
+                   return true;
+                 }
+               }
+
+               for (i = 0; i < _disableOverrides.length; i++) {
+                 if (_disableOverrides[i].type.test(type) && _disableOverrides[i].subtype.test(subtype)) {
+                   return false;
+                 }
+               }
+
+               return true;
+             }
+           }
+         } // `updateResolvedIssues()`   (private)
+         // Determine if any issues were resolved for the given entities.
+         // This is called by `validate()` after validation of the head graph
+         //
+         // Give the user credit for fixing an issue if:
+         // - the issue is in the base cache
+         // - the issue is not in the head cache
+         // - the user did something to one of the entities involved in the issue
+         //
+         // Arguments
+         //   `entityIDs` - Array or Set containing entity IDs.
+         //
+
+
+         function updateResolvedIssues(entityIDs) {
+           entityIDs.forEach(function (entityID) {
+             var baseIssues = _baseCache.issuesByEntityID[entityID];
+             if (!baseIssues) return;
+             baseIssues.forEach(function (issueID) {
+               // Check if the user did something to one of the entities involved in this issue.
+               // (This issue could involve multiple entities, e.g. disconnected routable features)
+               var issue = _baseCache.issuesByIssueID[issueID];
+               var userModified = (issue.entityIds || []).some(function (id) {
+                 return _completeDiff.hasOwnProperty(id);
+               });
+
+               if (userModified && !_headCache.issuesByIssueID[issueID]) {
+                 // issue seems fixed
+                 _resolvedIssueIDs.add(issueID);
+               } else {
+                 // issue still not resolved
+                 _resolvedIssueIDs["delete"](issueID); // (did undo, or possibly fixed and then re-caused the issue)
+
+               }
+             });
+           });
+         } // `validateEntitiesAsync()`   (private)
+         // Schedule validation for many entities.
+         //
+         // Arguments
+         //   `entityIDs` - Array or Set containing entityIDs.
+         //   `graph` - the graph to validate that contains those entities
+         //   `cache` - the cache to store results in (_headCache or _baseCache)
+         //
+         // Returns
+         //   A Promise fulfilled when the validation has completed.
+         //   This may take time but happen in the background during browser idle time.
+         //
+
+
+         function validateEntitiesAsync(entityIDs, cache) {
+           // Enqueue the work
+           var jobs = Array.from(entityIDs).map(function (entityID) {
+             if (cache.queuedEntityIDs.has(entityID)) return null; // queued already
+
+             cache.queuedEntityIDs.add(entityID); // Clear caches for existing issues related to this entity
+
+             cache.uncacheEntityID(entityID);
+             return function () {
+               cache.queuedEntityIDs["delete"](entityID);
+               var graph = cache.graph;
+               if (!graph) return; // was reset?
+
+               var entity = graph.hasEntity(entityID); // Sanity check: don't validate deleted entities
+
+               if (!entity) return; // detect new issues and update caches
+
+               var result = validateEntity(entity, graph);
+
+               if (result.provisional) {
+                 // provisional result
+                 cache.provisionalEntityIDs.add(entityID); // we'll need to revalidate this entity again later
+               }
+
+               cache.cacheIssues(result.issues); // update cache
+             };
+           }).filter(Boolean); // Perform the work in chunks.
+           // Because this will happen during idle callbacks, we want to choose a chunk size
+           // that won't make the browser stutter too badly.
+
+           cache.queue = cache.queue.concat(utilArrayChunk(jobs, 100)); // Perform the work
+
+           if (cache.queuePromise) return cache.queuePromise;
+           cache.queuePromise = processQueue(cache).then(function () {
+             return revalidateProvisionalEntities(cache);
+           })["catch"](function () {
+             /* ignore */
+           })["finally"](function () {
+             return cache.queuePromise = null;
+           });
+           return cache.queuePromise;
+         } // `revalidateProvisionalEntities()`   (private)
+         // Sometimes a validator will return a "provisional" result.
+         // In this situation, we'll need to revalidate the entity later.
+         // This function waits a delay, then places them back into the validation queue.
+         //
+         // Arguments
+         //   `cache` - The cache (_headCache or _baseCache)
+         //
+
+
+         function revalidateProvisionalEntities(cache) {
+           if (!cache.provisionalEntityIDs.size) return; // nothing to do
+
+           var handle = window.setTimeout(function () {
+             _deferredST["delete"](handle);
+
+             if (!cache.provisionalEntityIDs.size) return; // nothing to do
+
+             validateEntitiesAsync(Array.from(cache.provisionalEntityIDs), cache);
+           }, RETRY);
+
+           _deferredST.add(handle);
+         } // `processQueue(queue)`   (private)
+         // Process the next chunk of deferred validation work
+         //
+         // Arguments
+         //   `cache` - The cache (_headCache or _baseCache)
+         //
+         // Returns
+         //   A Promise fulfilled when the validation has completed.
+         //   This may take time but happen in the background during browser idle time.
+         //
+
+
+         function processQueue(cache) {
+           // console.log(`${cache.which} queue length ${cache.queue.length}`);
+           if (!cache.queue.length) return Promise.resolve(); // we're done
+
+           var chunk = cache.queue.pop();
+           return new Promise(function (resolvePromise) {
+             var handle = window.requestIdleCallback(function () {
+               _deferredRIC["delete"](handle); // const t0 = performance.now();
+
+
+               chunk.forEach(function (job) {
+                 return job();
+               }); // const t1 = performance.now();
+               // console.log('chunk processed in ' + (t1 - t0) + ' ms');
+
+               resolvePromise();
+             });
+
+             _deferredRIC.add(handle);
+           }).then(function () {
+             // dispatch an event sometimes to redraw various UI things
+             if (cache.queue.length % 25 === 0) dispatch.call('validated');
+           }).then(function () {
+             return processQueue(cache);
+           });
+         }
+
+         return validator;
+       } // `validationCache()`   (private)
+       // Creates a cache to store validation state
+       // We create 2 of these:
+       //   `_baseCache` for validation on the base graph (unedited)
+       //   `_headCache` for validation on the head graph (user edits applied)
+       //
+       // Arguments
+       //   `which` - just a String 'base' or 'head' to keep track of it
+       //
+
+       function validationCache(which) {
+         var cache = {
+           which: which,
+           graph: null,
+           queue: [],
+           queuePromise: null,
+           queuedEntityIDs: new Set(),
+           provisionalEntityIDs: new Set(),
+           issuesByIssueID: {},
+           // issue.id -> issue
+           issuesByEntityID: {} // entity.id -> Set(issue.id)
+
+         };
+
+         cache.cacheIssue = function (issue) {
+           (issue.entityIds || []).forEach(function (entityID) {
+             if (!cache.issuesByEntityID[entityID]) {
+               cache.issuesByEntityID[entityID] = new Set();
+             }
+
+             cache.issuesByEntityID[entityID].add(issue.id);
+           });
+           cache.issuesByIssueID[issue.id] = issue;
+         };
+
+         cache.uncacheIssue = function (issue) {
+           (issue.entityIds || []).forEach(function (entityID) {
+             if (cache.issuesByEntityID[entityID]) {
+               cache.issuesByEntityID[entityID]["delete"](issue.id);
+             }
+           });
+           delete cache.issuesByIssueID[issue.id];
+         };
+
+         cache.cacheIssues = function (issues) {
+           issues.forEach(cache.cacheIssue);
+         };
+
+         cache.uncacheIssues = function (issues) {
+           issues.forEach(cache.uncacheIssue);
+         };
+
+         cache.uncacheIssuesOfType = function (type) {
+           var issuesOfType = Object.values(cache.issuesByIssueID).filter(function (issue) {
+             return issue.type === type;
+           });
+           cache.uncacheIssues(issuesOfType);
+         }; // Remove a single entity and all its related issues from the caches
+
+
+         cache.uncacheEntityID = function (entityID) {
+           var entityIssueIDs = cache.issuesByEntityID[entityID];
+
+           if (entityIssueIDs) {
+             entityIssueIDs.forEach(function (issueID) {
+               var issue = cache.issuesByIssueID[issueID];
+
+               if (issue) {
+                 cache.uncacheIssue(issue);
+               } else {
+                 // shouldn't happen, clean up
+                 delete cache.issuesByIssueID[issueID];
+               }
+             });
+           }
+
+           delete cache.issuesByEntityID[entityID];
+           cache.provisionalEntityIDs["delete"](entityID);
+         }; // Return the expandeded set of entityIDs related to issues for the given entityIDs
+         //
+         // Arguments
+         //   `entityIDs` - Array or Set containing entityIDs.
+         //
+
+
+         cache.withAllRelatedEntities = function (entityIDs) {
+           var result = new Set();
+           (entityIDs || []).forEach(function (entityID) {
+             result.add(entityID); // include self
+
+             var entityIssueIDs = cache.issuesByEntityID[entityID];
+
+             if (entityIssueIDs) {
+               entityIssueIDs.forEach(function (issueID) {
+                 var issue = cache.issuesByIssueID[issueID];
+
+                 if (issue) {
+                   (issue.entityIds || []).forEach(function (relatedID) {
+                     return result.add(relatedID);
+                   });
+                 } else {
+                   // shouldn't happen, clean up
+                   delete cache.issuesByIssueID[issueID];
+                 }
+               });
+             }
+           });
+           return result;
+         };
+
+         return cache;
+       }
+
+       function coreUploader(context) {
+         var dispatch = dispatch$8( // Start and end events are dispatched exactly once each per legitimate outside call to `save`
+         'saveStarted', // dispatched as soon as a call to `save` has been deemed legitimate
+         'saveEnded', // dispatched after the result event has been dispatched
+         'willAttemptUpload', // dispatched before the actual upload call occurs, if it will
+         'progressChanged', // Each save results in one of these outcomes:
+         'resultNoChanges', // upload wasn't attempted since there were no edits
+         'resultErrors', // upload failed due to errors
+         'resultConflicts', // upload failed due to data conflicts
+         'resultSuccess' // upload completed without errors
+         );
+         var _isSaving = false;
+         var _conflicts = [];
+         var _errors = [];
+
+         var _origChanges;
+
+         var _discardTags = {};
+         _mainFileFetcher.get('discarded').then(function (d) {
+           _discardTags = d;
+         })["catch"](function () {
+           /* ignore */
+         });
+         var uploader = utilRebind({}, dispatch, 'on');
+
+         uploader.isSaving = function () {
+           return _isSaving;
+         };
+
+         uploader.save = function (changeset, tryAgain, checkConflicts) {
+           // Guard against accidentally entering save code twice - #4641
+           if (_isSaving && !tryAgain) {
+             return;
+           }
+
+           var osm = context.connection();
+           if (!osm) return; // If user somehow got logged out mid-save, try to reauthenticate..
+           // This can happen if they were logged in from before, but the tokens are no longer valid.
+
+           if (!osm.authenticated()) {
+             osm.authenticate(function (err) {
+               if (!err) {
+                 uploader.save(changeset, tryAgain, checkConflicts); // continue where we left off..
+               }
+             });
+             return;
+           }
+
+           if (!_isSaving) {
+             _isSaving = true;
+             dispatch.call('saveStarted', this);
+           }
+
+           var history = context.history();
+           _conflicts = [];
+           _errors = []; // Store original changes, in case user wants to download them as an .osc file
+
+           _origChanges = history.changes(actionDiscardTags(history.difference(), _discardTags)); // First time, `history.perform` a no-op action.
+           // Any conflict resolutions will be done as `history.replace`
+           // Remember to pop this later if needed
+
+           if (!tryAgain) {
+             history.perform(actionNoop());
+           } // Attempt a fast upload.. If there are conflicts, re-enter with `checkConflicts = true`
+
+
+           if (!checkConflicts) {
+             upload(changeset); // Do the full (slow) conflict check..
+           } else {
+             performFullConflictCheck(changeset);
+           }
+         };
+
+         function performFullConflictCheck(changeset) {
+           var osm = context.connection();
+           if (!osm) return;
+           var history = context.history();
+           var localGraph = context.graph();
+           var remoteGraph = coreGraph(history.base(), true);
+           var summary = history.difference().summary();
+           var _toCheck = [];
+
+           for (var i = 0; i < summary.length; i++) {
+             var item = summary[i];
+
+             if (item.changeType === 'modified') {
+               _toCheck.push(item.entity.id);
+             }
+           }
+
+           var _toLoad = withChildNodes(_toCheck, localGraph);
+
+           var _loaded = {};
+           var _toLoadCount = 0;
+           var _toLoadTotal = _toLoad.length;
+
+           if (_toCheck.length) {
+             dispatch.call('progressChanged', this, _toLoadCount, _toLoadTotal);
+
+             _toLoad.forEach(function (id) {
+               _loaded[id] = false;
+             });
+
+             osm.loadMultiple(_toLoad, loaded);
+           } else {
+             upload(changeset);
+           }
+
+           return;
+
+           function withChildNodes(ids, graph) {
+             var s = new Set(ids);
+             ids.forEach(function (id) {
+               var entity = graph.entity(id);
+               if (entity.type !== 'way') return;
+               graph.childNodes(entity).forEach(function (child) {
+                 if (child.version !== undefined) {
+                   s.add(child.id);
+                 }
+               });
+             });
+             return Array.from(s);
+           } // Reload modified entities into an alternate graph and check for conflicts..
+
+
+           function loaded(err, result) {
+             if (_errors.length) return;
+
+             if (err) {
+               _errors.push({
+                 msg: err.message || err.responseText,
+                 details: [_t('save.status_code', {
+                   code: err.status
+                 })]
+               });
+
+               didResultInErrors();
+             } else {
+               var loadMore = [];
+               result.data.forEach(function (entity) {
+                 remoteGraph.replace(entity);
+                 _loaded[entity.id] = true;
+                 _toLoad = _toLoad.filter(function (val) {
+                   return val !== entity.id;
+                 });
+                 if (!entity.visible) return; // Because loadMultiple doesn't download /full like loadEntity,
+                 // need to also load children that aren't already being checked..
+
+                 var i, id;
+
+                 if (entity.type === 'way') {
+                   for (i = 0; i < entity.nodes.length; i++) {
+                     id = entity.nodes[i];
+
+                     if (_loaded[id] === undefined) {
+                       _loaded[id] = false;
+                       loadMore.push(id);
+                     }
+                   }
+                 } else if (entity.type === 'relation' && entity.isMultipolygon()) {
+                   for (i = 0; i < entity.members.length; i++) {
+                     id = entity.members[i].id;
+
+                     if (_loaded[id] === undefined) {
+                       _loaded[id] = false;
+                       loadMore.push(id);
+                     }
+                   }
+                 }
+               });
+               _toLoadCount += result.data.length;
+               _toLoadTotal += loadMore.length;
+               dispatch.call('progressChanged', this, _toLoadCount, _toLoadTotal);
+
+               if (loadMore.length) {
+                 _toLoad.push.apply(_toLoad, loadMore);
+
+                 osm.loadMultiple(loadMore, loaded);
+               }
+
+               if (!_toLoad.length) {
+                 detectConflicts();
+                 upload(changeset);
+               }
+             }
+           }
+
+           function detectConflicts() {
+             function choice(id, text, _action) {
+               return {
+                 id: id,
+                 text: text,
+                 action: function action() {
+                   history.replace(_action);
+                 }
+               };
+             }
+
+             function formatUser(d) {
+               return '<a href="' + osm.userURL(d) + '" target="_blank">' + escape$4(d) + '</a>';
+             }
+
+             function entityName(entity) {
+               return utilDisplayName(entity) || utilDisplayType(entity.id) + ' ' + entity.id;
+             }
+
+             function sameVersions(local, remote) {
+               if (local.version !== remote.version) return false;
+
+               if (local.type === 'way') {
+                 var children = utilArrayUnion(local.nodes, remote.nodes);
+
+                 for (var i = 0; i < children.length; i++) {
+                   var a = localGraph.hasEntity(children[i]);
+                   var b = remoteGraph.hasEntity(children[i]);
+                   if (a && b && a.version !== b.version) return false;
+                 }
+               }
+
+               return true;
+             }
+
+             _toCheck.forEach(function (id) {
+               var local = localGraph.entity(id);
+               var remote = remoteGraph.entity(id);
+               if (sameVersions(local, remote)) return;
+               var merge = actionMergeRemoteChanges(id, localGraph, remoteGraph, _discardTags, formatUser);
+               history.replace(merge);
+               var mergeConflicts = merge.conflicts();
+               if (!mergeConflicts.length) return; // merged safely
+
+               var forceLocal = actionMergeRemoteChanges(id, localGraph, remoteGraph, _discardTags).withOption('force_local');
+               var forceRemote = actionMergeRemoteChanges(id, localGraph, remoteGraph, _discardTags).withOption('force_remote');
+               var keepMine = _t('save.conflict.' + (remote.visible ? 'keep_local' : 'restore'));
+               var keepTheirs = _t('save.conflict.' + (remote.visible ? 'keep_remote' : 'delete'));
+
+               _conflicts.push({
+                 id: id,
+                 name: entityName(local),
+                 details: mergeConflicts,
+                 chosen: 1,
+                 choices: [choice(id, keepMine, forceLocal), choice(id, keepTheirs, forceRemote)]
+               });
+             });
+           }
+         }
+
+         function upload(changeset) {
+           var osm = context.connection();
+
+           if (!osm) {
+             _errors.push({
+               msg: 'No OSM Service'
+             });
+           }
+
+           if (_conflicts.length) {
+             didResultInConflicts(changeset);
+           } else if (_errors.length) {
+             didResultInErrors();
+           } else {
+             var history = context.history();
+             var changes = history.changes(actionDiscardTags(history.difference(), _discardTags));
+
+             if (changes.modified.length || changes.created.length || changes.deleted.length) {
+               dispatch.call('willAttemptUpload', this);
+               osm.putChangeset(changeset, changes, uploadCallback);
+             } else {
+               // changes were insignificant or reverted by user
+               didResultInNoChanges();
+             }
+           }
+         }
+
+         function uploadCallback(err, changeset) {
+           if (err) {
+             if (err.status === 409) {
+               // 409 Conflict
+               uploader.save(changeset, true, true); // tryAgain = true, checkConflicts = true
+             } else {
+               _errors.push({
+                 msg: err.message || err.responseText,
+                 details: [_t('save.status_code', {
+                   code: err.status
+                 })]
+               });
+
+               didResultInErrors();
+             }
+           } else {
+             didResultInSuccess(changeset);
+           }
+         }
+
+         function didResultInNoChanges() {
+           dispatch.call('resultNoChanges', this);
+           endSave();
+           context.flush(); // reset iD
+         }
+
+         function didResultInErrors() {
+           context.history().pop();
+           dispatch.call('resultErrors', this, _errors);
+           endSave();
+         }
+
+         function didResultInConflicts(changeset) {
+           _conflicts.sort(function (a, b) {
+             return b.id.localeCompare(a.id);
+           });
+
+           dispatch.call('resultConflicts', this, changeset, _conflicts, _origChanges);
+           endSave();
+         }
+
+         function didResultInSuccess(changeset) {
+           // delete the edit stack cached to local storage
+           context.history().clearSaved();
+           dispatch.call('resultSuccess', this, changeset); // Add delay to allow for postgres replication #1646 #2678
+
+           window.setTimeout(function () {
+             endSave();
+             context.flush(); // reset iD
+           }, 2500);
+         }
+
+         function endSave() {
+           _isSaving = false;
+           dispatch.call('saveEnded', this);
+         }
+
+         uploader.cancelConflictResolution = function () {
+           context.history().pop();
+         };
+
+         uploader.processResolvedConflicts = function (changeset) {
+           var history = context.history();
+
+           for (var i = 0; i < _conflicts.length; i++) {
+             if (_conflicts[i].chosen === 1) {
+               // user chose "use theirs"
+               var entity = context.hasEntity(_conflicts[i].id);
+
+               if (entity && entity.type === 'way') {
+                 var children = utilArrayUniq(entity.nodes);
+
+                 for (var j = 0; j < children.length; j++) {
+                   history.replace(actionRevert(children[j]));
+                 }
+               }
+
+               history.replace(actionRevert(_conflicts[i].id));
+             }
+           }
+
+           uploader.save(changeset, true, false); // tryAgain = true, checkConflicts = false
+         };
+
+         uploader.reset = function () {};
+
+         return uploader;
+       }
+
+       var $$2 = _export;
+       var fails = fails$V;
+       var expm1 = mathExpm1;
+
+       var abs = Math.abs;
+       var exp = Math.exp;
+       var E = Math.E;
+
+       var FORCED = fails(function () {
+         // eslint-disable-next-line es/no-math-sinh -- required for testing
+         return Math.sinh(-2e-17) != -2e-17;
+       });
+
+       // `Math.sinh` method
+       // https://tc39.es/ecma262/#sec-math.sinh
+       // V8 near Chromium 38 has a problem with very small numbers
+       $$2({ target: 'Math', stat: true, forced: FORCED }, {
+         sinh: function sinh(x) {
+           return abs(x = +x) < 1 ? (expm1(x) - expm1(-x)) / 2 : (exp(x - 1) - exp(-x - 1)) * (E / 2);
+         }
+       });
+
+       var isRetina = window.devicePixelRatio && window.devicePixelRatio >= 2; // listen for DPI change, e.g. when dragging a browser window from a retina to non-retina screen
+
+       window.matchMedia("\n        (-webkit-min-device-pixel-ratio: 2), /* Safari */\n        (min-resolution: 2dppx),             /* standard */\n        (min-resolution: 192dpi)             /* fallback */\n    ").addListener(function () {
+         isRetina = window.devicePixelRatio && window.devicePixelRatio >= 2;
+       });
+
+       function localeDateString(s) {
+         if (!s) return null;
+         var options = {
+           day: 'numeric',
+           month: 'short',
+           year: 'numeric'
+         };
+         var d = new Date(s);
+         if (isNaN(d.getTime())) return null;
+         return d.toLocaleDateString(_mainLocalizer.localeCode(), options);
+       }
+
+       function vintageRange(vintage) {
+         var s;
+
+         if (vintage.start || vintage.end) {
+           s = vintage.start || '?';
+
+           if (vintage.start !== vintage.end) {
+             s += ' - ' + (vintage.end || '?');
+           }
+         }
+
+         return s;
+       }
+
+       function rendererBackgroundSource(data) {
+         var source = Object.assign({}, data); // shallow copy
+
+         var _offset = [0, 0];
+         var _name = source.name;
+         var _description = source.description;
+
+         var _best = !!source.best;
+
+         var _template = source.encrypted ? utilAesDecrypt(source.template) : source.template;
+
+         source.tileSize = data.tileSize || 256;
+         source.zoomExtent = data.zoomExtent || [0, 22];
+         source.overzoom = data.overzoom !== false;
+
+         source.offset = function (val) {
+           if (!arguments.length) return _offset;
+           _offset = val;
+           return source;
+         };
+
+         source.nudge = function (val, zoomlevel) {
+           _offset[0] += val[0] / Math.pow(2, zoomlevel);
+           _offset[1] += val[1] / Math.pow(2, zoomlevel);
+           return source;
+         };
+
+         source.name = function () {
+           var id_safe = source.id.replace(/\./g, '<TX_DOT>');
+           return _t('imagery.' + id_safe + '.name', {
+             "default": lodash.exports.escape(_name)
+           });
+         };
+
+         source.label = function () {
+           var id_safe = source.id.replace(/\./g, '<TX_DOT>');
+           return _t.html('imagery.' + id_safe + '.name', {
+             "default": lodash.exports.escape(_name)
+           });
+         };
+
+         source.description = function () {
+           var id_safe = source.id.replace(/\./g, '<TX_DOT>');
+           return _t.html('imagery.' + id_safe + '.description', {
+             "default": lodash.exports.escape(_description)
+           });
+         };
+
+         source.best = function () {
+           return _best;
+         };
+
+         source.area = function () {
+           if (!data.polygon) return Number.MAX_VALUE; // worldwide
+
+           var area = d3_geoArea({
+             type: 'MultiPolygon',
+             coordinates: [data.polygon]
+           });
+           return isNaN(area) ? 0 : area;
+         };
+
+         source.imageryUsed = function () {
+           return _name || source.id;
+         };
+
+         source.template = function (val) {
+           if (!arguments.length) return _template;
+
+           if (source.id === 'custom' || source.id === 'Bing') {
+             _template = val;
+           }
+
+           return source;
+         };
+
+         source.url = function (coord) {
+           var result = _template;
+           if (result === '') return result; // source 'none'
+           // Guess a type based on the tokens present in the template
+           // (This is for 'custom' source, where we don't know)
+
+           if (!source.type || source.id === 'custom') {
+             if (/SERVICE=WMS|\{(proj|wkid|bbox)\}/.test(_template)) {
+               source.type = 'wms';
+               source.projection = 'EPSG:3857'; // guess
+             } else if (/\{(x|y)\}/.test(_template)) {
+               source.type = 'tms';
+             } else if (/\{u\}/.test(_template)) {
+               source.type = 'bing';
+             }
+           }
+
+           if (source.type === 'wms') {
+             var tileToProjectedCoords = function tileToProjectedCoords(x, y, z) {
+               //polyfill for IE11, PhantomJS
+               var sinh = Math.sinh || function (x) {
+                 var y = Math.exp(x);
+                 return (y - 1 / y) / 2;
+               };
+
+               var zoomSize = Math.pow(2, z);
+               var lon = x / zoomSize * Math.PI * 2 - Math.PI;
+               var lat = Math.atan(sinh(Math.PI * (1 - 2 * y / zoomSize)));
+
+               switch (source.projection) {
+                 case 'EPSG:4326':
+                   return {
+                     x: lon * 180 / Math.PI,
+                     y: lat * 180 / Math.PI
+                   };
+
+                 default:
+                   // EPSG:3857 and synonyms
+                   var mercCoords = mercatorRaw(lon, lat);
+                   return {
+                     x: 20037508.34 / Math.PI * mercCoords[0],
+                     y: 20037508.34 / Math.PI * mercCoords[1]
+                   };
+               }
+             };
+
+             var tileSize = source.tileSize;
+             var projection = source.projection;
+             var minXmaxY = tileToProjectedCoords(coord[0], coord[1], coord[2]);
+             var maxXminY = tileToProjectedCoords(coord[0] + 1, coord[1] + 1, coord[2]);
+             result = result.replace(/\{(\w+)\}/g, function (token, key) {
+               switch (key) {
+                 case 'width':
+                 case 'height':
+                   return tileSize;
+
+                 case 'proj':
+                   return projection;
+
+                 case 'wkid':
+                   return projection.replace(/^EPSG:/, '');
+
+                 case 'bbox':
+                   // WMS 1.3 flips x/y for some coordinate systems including EPSG:4326 - #7557
+                   if (projection === 'EPSG:4326' && // The CRS parameter implies version 1.3 (prior versions use SRS)
+                   /VERSION=1.3|CRS={proj}/.test(source.template().toUpperCase())) {
+                     return maxXminY.y + ',' + minXmaxY.x + ',' + minXmaxY.y + ',' + maxXminY.x;
+                   } else {
+                     return minXmaxY.x + ',' + maxXminY.y + ',' + maxXminY.x + ',' + minXmaxY.y;
+                   }
+
+                 case 'w':
+                   return minXmaxY.x;
+
+                 case 's':
+                   return maxXminY.y;
+
+                 case 'n':
+                   return maxXminY.x;
+
+                 case 'e':
+                   return minXmaxY.y;
+
+                 default:
+                   return token;
+               }
+             });
+           } else if (source.type === 'tms') {
+             result = result.replace('{x}', coord[0]).replace('{y}', coord[1]) // TMS-flipped y coordinate
+             .replace(/\{[t-]y\}/, Math.pow(2, coord[2]) - coord[1] - 1).replace(/\{z(oom)?\}/, coord[2]) // only fetch retina tiles for retina screens
+             .replace(/\{@2x\}|\{r\}/, isRetina ? '@2x' : '');
+           } else if (source.type === 'bing') {
+             result = result.replace('{u}', function () {
+               var u = '';
+
+               for (var zoom = coord[2]; zoom > 0; zoom--) {
+                 var b = 0;
+                 var mask = 1 << zoom - 1;
+                 if ((coord[0] & mask) !== 0) b++;
+                 if ((coord[1] & mask) !== 0) b += 2;
+                 u += b.toString();
+               }
+
+               return u;
+             });
+           } // these apply to any type..
+
+
+           result = result.replace(/\{switch:([^}]+)\}/, function (s, r) {
+             var subdomains = r.split(',');
+             return subdomains[(coord[0] + coord[1]) % subdomains.length];
+           });
+           return result;
+         };
+
+         source.validZoom = function (z) {
+           return source.zoomExtent[0] <= z && (source.overzoom || source.zoomExtent[1] > z);
+         };
+
+         source.isLocatorOverlay = function () {
+           return source.id === 'mapbox_locator_overlay';
+         };
+         /* hides a source from the list, but leaves it available for use */
+
+
+         source.isHidden = function () {
+           return source.id === 'DigitalGlobe-Premium-vintage' || source.id === 'DigitalGlobe-Standard-vintage';
+         };
+
+         source.copyrightNotices = function () {};
+
+         source.getMetadata = function (center, tileCoord, callback) {
+           var vintage = {
+             start: localeDateString(source.startDate),
+             end: localeDateString(source.endDate)
+           };
+           vintage.range = vintageRange(vintage);
+           var metadata = {
+             vintage: vintage
+           };
+           callback(null, metadata);
+         };
+
+         return source;
+       }
+
+       rendererBackgroundSource.Bing = function (data, dispatch) {
+         // https://docs.microsoft.com/en-us/bingmaps/rest-services/imagery/get-imagery-metadata
+         // https://docs.microsoft.com/en-us/bingmaps/rest-services/directly-accessing-the-bing-maps-tiles
+         //fallback url template
+         data.template = 'https://ecn.t{switch:0,1,2,3}.tiles.virtualearth.net/tiles/a{u}.jpeg?g=587&n=z';
+         var bing = rendererBackgroundSource(data); //var key = 'Arzdiw4nlOJzRwOz__qailc8NiR31Tt51dN2D7cm57NrnceZnCpgOkmJhNpGoppU'; // P2, JOSM, etc
+
+         var key = 'Ak5oTE46TUbjRp08OFVcGpkARErDobfpuyNKa-W2mQ8wbt1K1KL8p1bIRwWwcF-Q'; // iD
+
+         /*
+         missing tile image strictness param (n=)
+         •   n=f -> (Fail) returns a 404
+         •   n=z -> (Empty) returns a 200 with 0 bytes (no content)
+         •   n=t -> (Transparent) returns a 200 with a transparent (png) tile
+         */
+
+         var strictParam = 'n';
+         var url = 'https://dev.virtualearth.net/REST/v1/Imagery/Metadata/Aerial?include=ImageryProviders&uriScheme=https&key=' + key;
+         var cache = {};
+         var inflight = {};
+         var providers = [];
+         d3_json(url).then(function (json) {
+           var imageryResource = json.resourceSets[0].resources[0]; //retrieve and prepare up to date imagery template
+
+           var template = imageryResource.imageUrl; //https://ecn.{subdomain}.tiles.virtualearth.net/tiles/a{quadkey}.jpeg?g=10339
+
+           var subDomains = imageryResource.imageUrlSubdomains; //["t0, t1, t2, t3"]
+
+           var subDomainNumbers = subDomains.map(function (subDomain) {
+             return subDomain.substring(1);
+           }).join(',');
+           template = template.replace('{subdomain}', "t{switch:".concat(subDomainNumbers, "}")).replace('{quadkey}', '{u}');
+
+           if (!new URLSearchParams(template).has(strictParam)) {
+             template += "&".concat(strictParam, "=z");
+           }
+
+           bing.template(template);
+           providers = imageryResource.imageryProviders.map(function (provider) {
+             return {
+               attribution: provider.attribution,
+               areas: provider.coverageAreas.map(function (area) {
+                 return {
+                   zoom: [area.zoomMin, area.zoomMax],
+                   extent: geoExtent([area.bbox[1], area.bbox[0]], [area.bbox[3], area.bbox[2]])
+                 };
+               })
+             };
+           });
+           dispatch.call('change');
+         })["catch"](function () {
+           /* ignore */
+         });
+
+         bing.copyrightNotices = function (zoom, extent) {
+           zoom = Math.min(zoom, 21);
+           return providers.filter(function (provider) {
+             return provider.areas.some(function (area) {
+               return extent.intersects(area.extent) && area.zoom[0] <= zoom && area.zoom[1] >= zoom;
+             });
+           }).map(function (provider) {
+             return provider.attribution;
+           }).join(', ');
+         };
+
+         bing.getMetadata = function (center, tileCoord, callback) {
+           var tileID = tileCoord.slice(0, 3).join('/');
+           var zoom = Math.min(tileCoord[2], 21);
+           var centerPoint = center[1] + ',' + center[0]; // lat,lng
+
+           var url = 'https://dev.virtualearth.net/REST/v1/Imagery/Metadata/Aerial/' + centerPoint + '?zl=' + zoom + '&key=' + key;
+           if (inflight[tileID]) return;
+
+           if (!cache[tileID]) {
+             cache[tileID] = {};
+           }
+
+           if (cache[tileID] && cache[tileID].metadata) {
+             return callback(null, cache[tileID].metadata);
+           }
+
+           inflight[tileID] = true;
+           d3_json(url).then(function (result) {
+             delete inflight[tileID];
+
+             if (!result) {
+               throw new Error('Unknown Error');
+             }
+
+             var vintage = {
+               start: localeDateString(result.resourceSets[0].resources[0].vintageStart),
+               end: localeDateString(result.resourceSets[0].resources[0].vintageEnd)
+             };
+             vintage.range = vintageRange(vintage);
+             var metadata = {
+               vintage: vintage
+             };
+             cache[tileID].metadata = metadata;
+             if (callback) callback(null, metadata);
+           })["catch"](function (err) {
+             delete inflight[tileID];
+             if (callback) callback(err.message);
+           });
+         };
+
+         bing.terms_url = 'https://blog.openstreetmap.org/2010/11/30/microsoft-imagery-details';
+         return bing;
+       };
+
+       rendererBackgroundSource.Esri = function (data) {
+         // in addition to using the tilemap at zoom level 20, overzoom real tiles - #4327 (deprecated technique, but it works)
+         if (data.template.match(/blankTile/) === null) {
+           data.template = data.template + '?blankTile=false';
+         }
+
+         var esri = rendererBackgroundSource(data);
+         var cache = {};
+         var inflight = {};
+
+         var _prevCenter; // use a tilemap service to set maximum zoom for esri tiles dynamically
+         // https://developers.arcgis.com/documentation/tiled-elevation-service/
+
+
+         esri.fetchTilemap = function (center) {
+           // skip if we have already fetched a tilemap within 5km
+           if (_prevCenter && geoSphericalDistance(center, _prevCenter) < 5000) return;
+           _prevCenter = center; // tiles are available globally to zoom level 19, afterward they may or may not be present
+
+           var z = 20; // first generate a random url using the template
+
+           var dummyUrl = esri.url([1, 2, 3]); // calculate url z/y/x from the lat/long of the center of the map
+
+           var x = Math.floor((center[0] + 180) / 360 * Math.pow(2, z));
+           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)); // fetch an 8x8 grid to leverage cache
+
+           var tilemapUrl = dummyUrl.replace(/tile\/[0-9]+\/[0-9]+\/[0-9]+\?blankTile=false/, 'tilemap') + '/' + z + '/' + y + '/' + x + '/8/8'; // make the request and introspect the response from the tilemap server
+
+           d3_json(tilemapUrl).then(function (tilemap) {
+             if (!tilemap) {
+               throw new Error('Unknown Error');
+             }
+
+             var hasTiles = true;
+
+             for (var i = 0; i < tilemap.data.length; i++) {
+               // 0 means an individual tile in the grid doesn't exist
+               if (!tilemap.data[i]) {
+                 hasTiles = false;
+                 break;
+               }
+             } // if any tiles are missing at level 20 we restrict maxZoom to 19
+
+
+             esri.zoomExtent[1] = hasTiles ? 22 : 19;
+           })["catch"](function () {
+             /* ignore */
+           });
+         };
+
+         esri.getMetadata = function (center, tileCoord, callback) {
+           if (esri.id !== 'EsriWorldImagery') {
+             // rest endpoint is not available for ESRI's "clarity" imagery
+             return callback(null, {});
+           }
+
+           var tileID = tileCoord.slice(0, 3).join('/');
+           var zoom = Math.min(tileCoord[2], esri.zoomExtent[1]);
+           var centerPoint = center[0] + ',' + center[1]; // long, lat (as it should be)
+
+           var unknown = _t('info_panels.background.unknown');
+           var vintage = {};
+           var metadata = {};
+           if (inflight[tileID]) return; // build up query using the layer appropriate to the current zoom
+
+           var url = 'https://services.arcgisonline.com/arcgis/rest/services/World_Imagery/MapServer/4/query';
+           url += '?returnGeometry=false&geometry=' + centerPoint + '&inSR=4326&geometryType=esriGeometryPoint&outFields=*&f=json';
+
+           if (!cache[tileID]) {
+             cache[tileID] = {};
+           }
+
+           if (cache[tileID] && cache[tileID].metadata) {
+             return callback(null, cache[tileID].metadata);
+           }
+
+           inflight[tileID] = true;
+           d3_json(url).then(function (result) {
+             delete inflight[tileID];
+             result = result.features.map(function (f) {
+               return f.attributes;
+             }).filter(function (a) {
+               return a.MinMapLevel <= zoom && a.MaxMapLevel >= zoom;
+             })[0];
+
+             if (!result) {
+               throw new Error('Unknown Error');
+             } else if (result.features && result.features.length < 1) {
+               throw new Error('No Results');
+             } else if (result.error && result.error.message) {
+               throw new Error(result.error.message);
+             } // pass through the discrete capture date from metadata
+
+
+             var captureDate = localeDateString(result.SRC_DATE2);
+             vintage = {
+               start: captureDate,
+               end: captureDate,
+               range: captureDate
+             };
+             metadata = {
+               vintage: vintage,
+               source: clean(result.NICE_NAME),
+               description: clean(result.NICE_DESC),
+               resolution: clean(+parseFloat(result.SRC_RES).toFixed(4)),
+               accuracy: clean(+parseFloat(result.SRC_ACC).toFixed(4))
+             }; // append units - meters
+
+             if (isFinite(metadata.resolution)) {
+               metadata.resolution += ' m';
+             }
+
+             if (isFinite(metadata.accuracy)) {
+               metadata.accuracy += ' m';
+             }
+
+             cache[tileID].metadata = metadata;
+             if (callback) callback(null, metadata);
+           })["catch"](function (err) {
+             delete inflight[tileID];
+             if (callback) callback(err.message);
+           });
+
+           function clean(val) {
+             return String(val).trim() || unknown;
+           }
+         };
+
+         return esri;
+       };
+
+       rendererBackgroundSource.None = function () {
+         var source = rendererBackgroundSource({
+           id: 'none',
+           template: ''
+         });
+
+         source.name = function () {
+           return _t('background.none');
+         };
+
+         source.label = function () {
+           return _t.html('background.none');
+         };
+
+         source.imageryUsed = function () {
+           return null;
+         };
+
+         source.area = function () {
+           return -1; // sources in background pane are sorted by area
+         };
+
+         return source;
+       };
+
+       rendererBackgroundSource.Custom = function (template) {
+         var source = rendererBackgroundSource({
+           id: 'custom',
+           template: template
+         });
+
+         source.name = function () {
+           return _t('background.custom');
+         };
+
+         source.label = function () {
+           return _t.html('background.custom');
+         };
+
+         source.imageryUsed = function () {
+           // sanitize personal connection tokens - #6801
+           var cleaned = source.template(); // from query string parameters
+
+           if (cleaned.indexOf('?') !== -1) {
+             var parts = cleaned.split('?', 2);
+             var qs = utilStringQs(parts[1]);
+             ['access_token', 'connectId', 'token'].forEach(function (param) {
+               if (qs[param]) {
+                 qs[param] = '{apikey}';
+               }
+             });
+             cleaned = parts[0] + '?' + utilQsString(qs, true); // true = soft encode
+           } // from wms/wmts api path parameters
+
+
+           cleaned = cleaned.replace(/token\/(\w+)/, 'token/{apikey}');
+           return 'Custom (' + cleaned + ' )';
+         };
+
+         source.area = function () {
+           return -2; // sources in background pane are sorted by area
+         };
+
+         return source;
+       };
+
+       function rendererTileLayer(context) {
+         var transformProp = utilPrefixCSSProperty('Transform');
+         var tiler = utilTiler();
+         var _tileSize = 256;
+
+         var _projection;
+
+         var _cache = {};
+
+         var _tileOrigin;
+
+         var _zoom;
+
+         var _source;
+
+         function tileSizeAtZoom(d, z) {
+           var EPSILON = 0.002; // close seams
+
+           return _tileSize * Math.pow(2, z - d[2]) / _tileSize + EPSILON;
+         }
+
+         function atZoom(t, distance) {
+           var power = Math.pow(2, distance);
+           return [Math.floor(t[0] * power), Math.floor(t[1] * power), t[2] + distance];
+         }
+
+         function lookUp(d) {
+           for (var up = -1; up > -d[2]; up--) {
+             var tile = atZoom(d, up);
+
+             if (_cache[_source.url(tile)] !== false) {
+               return tile;
+             }
+           }
+         }
+
+         function uniqueBy(a, n) {
+           var o = [];
+           var seen = {};
+
+           for (var i = 0; i < a.length; i++) {
+             if (seen[a[i][n]] === undefined) {
+               o.push(a[i]);
+               seen[a[i][n]] = true;
+             }
+           }
+
+           return o;
+         }
+
+         function addSource(d) {
+           d.push(_source.url(d));
+           return d;
+         } // Update tiles based on current state of `projection`.
+
+
+         function background(selection) {
+           _zoom = geoScaleToZoom(_projection.scale(), _tileSize);
+           var pixelOffset;
+
+           if (_source) {
+             pixelOffset = [_source.offset()[0] * Math.pow(2, _zoom), _source.offset()[1] * Math.pow(2, _zoom)];
+           } else {
+             pixelOffset = [0, 0];
+           }
+
+           var translate = [_projection.translate()[0] + pixelOffset[0], _projection.translate()[1] + pixelOffset[1]];
+           tiler.scale(_projection.scale() * 2 * Math.PI).translate(translate);
+           _tileOrigin = [_projection.scale() * Math.PI - translate[0], _projection.scale() * Math.PI - translate[1]];
+           render(selection);
+         } // Derive the tiles onscreen, remove those offscreen and position them.
+         // Important that this part not depend on `_projection` because it's
+         // rentered when tiles load/error (see #644).
+
+
+         function render(selection) {
+           if (!_source) return;
+           var requests = [];
+           var showDebug = context.getDebug('tile') && !_source.overlay;
+
+           if (_source.validZoom(_zoom)) {
+             tiler.skipNullIsland(!!_source.overlay);
+             tiler().forEach(function (d) {
+               addSource(d);
+               if (d[3] === '') return;
+               if (typeof d[3] !== 'string') return; // Workaround for #2295
+
+               requests.push(d);
+
+               if (_cache[d[3]] === false && lookUp(d)) {
+                 requests.push(addSource(lookUp(d)));
+               }
+             });
+             requests = uniqueBy(requests, 3).filter(function (r) {
+               // don't re-request tiles which have failed in the past
+               return _cache[r[3]] !== false;
+             });
+           }
+
+           function load(d3_event, d) {
+             _cache[d[3]] = true;
+             select(this).on('error', null).on('load', null).classed('tile-loaded', true);
+             render(selection);
+           }
+
+           function error(d3_event, d) {
+             _cache[d[3]] = false;
+             select(this).on('error', null).on('load', null).remove();
+             render(selection);
+           }
+
+           function imageTransform(d) {
+             var ts = _tileSize * Math.pow(2, _zoom - d[2]);
+
+             var scale = tileSizeAtZoom(d, _zoom);
+             return 'translate(' + (d[0] * ts - _tileOrigin[0]) + 'px,' + (d[1] * ts - _tileOrigin[1]) + 'px) ' + 'scale(' + scale + ',' + scale + ')';
+           }
+
+           function tileCenter(d) {
+             var ts = _tileSize * Math.pow(2, _zoom - d[2]);
+
+             return [d[0] * ts - _tileOrigin[0] + ts / 2, d[1] * ts - _tileOrigin[1] + ts / 2];
+           }
+
+           function debugTransform(d) {
+             var coord = tileCenter(d);
+             return 'translate(' + coord[0] + 'px,' + coord[1] + 'px)';
+           } // Pick a representative tile near the center of the viewport
+           // (This is useful for sampling the imagery vintage)
+
+
+           var dims = tiler.size();
+           var mapCenter = [dims[0] / 2, dims[1] / 2];
+           var minDist = Math.max(dims[0], dims[1]);
+           var nearCenter;
+           requests.forEach(function (d) {
+             var c = tileCenter(d);
+             var dist = geoVecLength(c, mapCenter);
+
+             if (dist < minDist) {
+               minDist = dist;
+               nearCenter = d;
+             }
+           });
+           var image = selection.selectAll('img').data(requests, function (d) {
+             return d[3];
+           });
+           image.exit().style(transformProp, imageTransform).classed('tile-removing', true).classed('tile-center', false).each(function () {
+             var tile = select(this);
+             window.setTimeout(function () {
+               if (tile.classed('tile-removing')) {
+                 tile.remove();
+               }
+             }, 300);
+           });
+           image.enter().append('img').attr('class', 'tile').attr('alt', '').attr('draggable', 'false').style('width', _tileSize + 'px').style('height', _tileSize + 'px').attr('src', function (d) {
+             return d[3];
+           }).on('error', error).on('load', load).merge(image).style(transformProp, imageTransform).classed('tile-debug', showDebug).classed('tile-removing', false).classed('tile-center', function (d) {
+             return d === nearCenter;
+           });
+           var debug = selection.selectAll('.tile-label-debug').data(showDebug ? requests : [], function (d) {
+             return d[3];
+           });
+           debug.exit().remove();
+
+           if (showDebug) {
+             var debugEnter = debug.enter().append('div').attr('class', 'tile-label-debug');
+             debugEnter.append('div').attr('class', 'tile-label-debug-coord');
+             debugEnter.append('div').attr('class', 'tile-label-debug-vintage');
+             debug = debug.merge(debugEnter);
+             debug.style(transformProp, debugTransform);
+             debug.selectAll('.tile-label-debug-coord').text(function (d) {
+               return d[2] + ' / ' + d[0] + ' / ' + d[1];
+             });
+             debug.selectAll('.tile-label-debug-vintage').each(function (d) {
+               var span = select(this);
+               var center = context.projection.invert(tileCenter(d));
+
+               _source.getMetadata(center, d, function (err, result) {
+                 if (result && result.vintage && result.vintage.range) {
+                   span.text(result.vintage.range);
+                 } else {
+                   span.html(_t.html('info_panels.background.vintage') + ': ' + _t.html('info_panels.background.unknown'));
+                 }
+               });
+             });
+           }
+         }
+
+         background.projection = function (val) {
+           if (!arguments.length) return _projection;
+           _projection = val;
+           return background;
+         };
+
+         background.dimensions = function (val) {
+           if (!arguments.length) return tiler.size();
+           tiler.size(val);
+           return background;
+         };
+
+         background.source = function (val) {
+           if (!arguments.length) return _source;
+           _source = val;
+           _tileSize = _source.tileSize;
+           _cache = {};
+           tiler.tileSize(_source.tileSize).zoomExtent(_source.zoomExtent);
+           return background;
+         };
+
+         return background;
+       }
+
+       var _imageryIndex = null;
+       function rendererBackground(context) {
+         var dispatch = dispatch$8('change');
+         var detected = utilDetect();
+         var baseLayer = rendererTileLayer(context).projection(context.projection);
+         var _checkedBlocklists = [];
+         var _isValid = true;
+         var _overlayLayers = [];
+         var _brightness = 1;
+         var _contrast = 1;
+         var _saturation = 1;
+         var _sharpness = 1;
+
+         function ensureImageryIndex() {
+           return _mainFileFetcher.get('imagery').then(function (sources) {
+             if (_imageryIndex) return _imageryIndex;
+             _imageryIndex = {
+               imagery: sources,
+               features: {}
+             }; // use which-polygon to support efficient index and querying for imagery
+
+             var features = sources.map(function (source) {
+               if (!source.polygon) return null; // workaround for editor-layer-index weirdness..
+               // Add an extra array nest to each element in `source.polygon`
+               // so the rings are not treated as a bunch of holes:
+               // what we have: [ [[outer],[hole],[hole]] ]
+               // what we want: [ [[outer]],[[outer]],[[outer]] ]
+
+               var rings = source.polygon.map(function (ring) {
+                 return [ring];
+               });
+               var feature = {
+                 type: 'Feature',
+                 properties: {
+                   id: source.id
+                 },
+                 geometry: {
+                   type: 'MultiPolygon',
+                   coordinates: rings
+                 }
+               };
+               _imageryIndex.features[source.id] = feature;
+               return feature;
+             }).filter(Boolean);
+             _imageryIndex.query = whichPolygon_1({
+               type: 'FeatureCollection',
+               features: features
+             }); // Instantiate `rendererBackgroundSource` objects for each source
+
+             _imageryIndex.backgrounds = sources.map(function (source) {
+               if (source.type === 'bing') {
+                 return rendererBackgroundSource.Bing(source, dispatch);
+               } else if (/^EsriWorldImagery/.test(source.id)) {
+                 return rendererBackgroundSource.Esri(source);
+               } else {
+                 return rendererBackgroundSource(source);
+               }
+             }); // Add 'None'
+
+             _imageryIndex.backgrounds.unshift(rendererBackgroundSource.None()); // Add 'Custom'
+
+
+             var template = corePreferences('background-custom-template') || '';
+             var custom = rendererBackgroundSource.Custom(template);
+
+             _imageryIndex.backgrounds.unshift(custom);
+
+             return _imageryIndex;
+           });
+         }
+
+         function background(selection) {
+           var currSource = baseLayer.source(); // If we are displaying an Esri basemap at high zoom,
+           // check its tilemap to see how high the zoom can go
+
+           if (context.map().zoom() > 18) {
+             if (currSource && /^EsriWorldImagery/.test(currSource.id)) {
+               var center = context.map().center();
+               currSource.fetchTilemap(center);
+             }
+           } // Is the imagery valid here? - #4827
+
+
+           var sources = background.sources(context.map().extent());
+           var wasValid = _isValid;
+           _isValid = !!sources.filter(function (d) {
+             return d === currSource;
+           }).length;
+
+           if (wasValid !== _isValid) {
+             // change in valid status
+             background.updateImagery();
+           }
+
+           var baseFilter = '';
+
+           if (detected.cssfilters) {
+             if (_brightness !== 1) {
+               baseFilter += " brightness(".concat(_brightness, ")");
+             }
+
+             if (_contrast !== 1) {
+               baseFilter += " contrast(".concat(_contrast, ")");
+             }
+
+             if (_saturation !== 1) {
+               baseFilter += " saturate(".concat(_saturation, ")");
+             }
+
+             if (_sharpness < 1) {
+               // gaussian blur
+               var blur = d3_interpolateNumber(0.5, 5)(1 - _sharpness);
+               baseFilter += " blur(".concat(blur, "px)");
+             }
+           }
+
+           var base = selection.selectAll('.layer-background').data([0]);
+           base = base.enter().insert('div', '.layer-data').attr('class', 'layer layer-background').merge(base);
+
+           if (detected.cssfilters) {
+             base.style('filter', baseFilter || null);
+           } else {
+             base.style('opacity', _brightness);
+           }
+
+           var imagery = base.selectAll('.layer-imagery').data([0]);
+           imagery.enter().append('div').attr('class', 'layer layer-imagery').merge(imagery).call(baseLayer);
+           var maskFilter = '';
+           var mixBlendMode = '';
+
+           if (detected.cssfilters && _sharpness > 1) {
+             // apply unsharp mask
+             mixBlendMode = 'overlay';
+             maskFilter = 'saturate(0) blur(3px) invert(1)';
+             var contrast = _sharpness - 1;
+             maskFilter += " contrast(".concat(contrast, ")");
+             var brightness = d3_interpolateNumber(1, 0.85)(_sharpness - 1);
+             maskFilter += " brightness(".concat(brightness, ")");
+           }
+
+           var mask = base.selectAll('.layer-unsharp-mask').data(detected.cssfilters && _sharpness > 1 ? [0] : []);
+           mask.exit().remove();
+           mask.enter().append('div').attr('class', 'layer layer-mask layer-unsharp-mask').merge(mask).call(baseLayer).style('filter', maskFilter || null).style('mix-blend-mode', mixBlendMode || null);
+           var overlays = selection.selectAll('.layer-overlay').data(_overlayLayers, function (d) {
+             return d.source().name();
+           });
+           overlays.exit().remove();
+           overlays.enter().insert('div', '.layer-data').attr('class', 'layer layer-overlay').merge(overlays).each(function (layer, i, nodes) {
+             return select(nodes[i]).call(layer);
+           });
+         }
+
+         background.updateImagery = function () {
+           var currSource = baseLayer.source();
+           if (context.inIntro() || !currSource) return;
+
+           var o = _overlayLayers.filter(function (d) {
+             return !d.source().isLocatorOverlay() && !d.source().isHidden();
+           }).map(function (d) {
+             return d.source().id;
+           }).join(',');
+
+           var meters = geoOffsetToMeters(currSource.offset());
+           var EPSILON = 0.01;
+           var x = +meters[0].toFixed(2);
+           var y = +meters[1].toFixed(2);
+           var hash = utilStringQs(window.location.hash);
+           var id = currSource.id;
+
+           if (id === 'custom') {
+             id = "custom:".concat(currSource.template());
+           }
+
+           if (id) {
+             hash.background = id;
+           } else {
+             delete hash.background;
+           }
+
+           if (o) {
+             hash.overlays = o;
+           } else {
+             delete hash.overlays;
+           }
+
+           if (Math.abs(x) > EPSILON || Math.abs(y) > EPSILON) {
+             hash.offset = "".concat(x, ",").concat(y);
+           } else {
+             delete hash.offset;
+           }
+
+           if (!window.mocha) {
+             window.location.replace('#' + utilQsString(hash, true));
+           }
+
+           var imageryUsed = [];
+           var photoOverlaysUsed = [];
+           var currUsed = currSource.imageryUsed();
+
+           if (currUsed && _isValid) {
+             imageryUsed.push(currUsed);
+           }
+
+           _overlayLayers.filter(function (d) {
+             return !d.source().isLocatorOverlay() && !d.source().isHidden();
+           }).forEach(function (d) {
+             return imageryUsed.push(d.source().imageryUsed());
+           });
+
+           var dataLayer = context.layers().layer('data');
+
+           if (dataLayer && dataLayer.enabled() && dataLayer.hasData()) {
+             imageryUsed.push(dataLayer.getSrc());
+           }
+
+           var photoOverlayLayers = {
+             streetside: 'Bing Streetside',
+             mapillary: 'Mapillary Images',
+             'mapillary-map-features': 'Mapillary Map Features',
+             'mapillary-signs': 'Mapillary Signs',
+             kartaview: 'KartaView Images'
+           };
+
+           for (var layerID in photoOverlayLayers) {
+             var layer = context.layers().layer(layerID);
+
+             if (layer && layer.enabled()) {
+               photoOverlaysUsed.push(layerID);
+               imageryUsed.push(photoOverlayLayers[layerID]);
+             }
+           }
+
+           context.history().imageryUsed(imageryUsed);
+           context.history().photoOverlaysUsed(photoOverlaysUsed);
+         };
+
+         background.sources = function (extent, zoom, includeCurrent) {
+           if (!_imageryIndex) return []; // called before init()?
+
+           var visible = {};
+           (_imageryIndex.query.bbox(extent.rectangle(), true) || []).forEach(function (d) {
+             return visible[d.id] = true;
+           });
+           var currSource = baseLayer.source(); // Recheck blocked sources only if we detect new blocklists pulled from the OSM API.
+
+           var osm = context.connection();
+           var blocklists = osm && osm.imageryBlocklists() || [];
+           var blocklistChanged = blocklists.length !== _checkedBlocklists.length || blocklists.some(function (regex, index) {
+             return String(regex) !== _checkedBlocklists[index];
+           });
+
+           if (blocklistChanged) {
+             _imageryIndex.backgrounds.forEach(function (source) {
+               source.isBlocked = blocklists.some(function (regex) {
+                 return regex.test(source.template());
+               });
+             });
+
+             _checkedBlocklists = blocklists.map(function (regex) {
+               return String(regex);
+             });
+           }
+
+           return _imageryIndex.backgrounds.filter(function (source) {
+             if (includeCurrent && currSource === source) return true; // optionally always include the current imagery
+
+             if (source.isBlocked) return false; // even bundled sources may be blocked - #7905
+
+             if (!source.polygon) return true; // always include imagery with worldwide coverage
+
+             if (zoom && zoom < 6) return false; // optionally exclude local imagery at low zooms
+
+             return visible[source.id]; // include imagery visible in given extent
+           });
+         };
+
+         background.dimensions = function (val) {
+           if (!val) return;
+           baseLayer.dimensions(val);
+
+           _overlayLayers.forEach(function (layer) {
+             return layer.dimensions(val);
+           });
+         };
+
+         background.baseLayerSource = function (d) {
+           if (!arguments.length) return baseLayer.source(); // test source against OSM imagery blocklists..
+
+           var osm = context.connection();
+           if (!osm) return background;
+           var blocklists = osm.imageryBlocklists();
+           var template = d.template();
+           var fail = false;
+           var tested = 0;
+           var regex;
+
+           for (var i = 0; i < blocklists.length; i++) {
+             regex = blocklists[i];
+             fail = regex.test(template);
+             tested++;
+             if (fail) break;
+           } // ensure at least one test was run.
+
+
+           if (!tested) {
+             regex = /.*\.google(apis)?\..*\/(vt|kh)[\?\/].*([xyz]=.*){3}.*/;
+             fail = regex.test(template);
+           }
+
+           baseLayer.source(!fail ? d : background.findSource('none'));
+           dispatch.call('change');
+           background.updateImagery();
+           return background;
+         };
+
+         background.findSource = function (id) {
+           if (!id || !_imageryIndex) return null; // called before init()?
+
+           return _imageryIndex.backgrounds.find(function (d) {
+             return d.id && d.id === id;
+           });
+         };
+
+         background.bing = function () {
+           background.baseLayerSource(background.findSource('Bing'));
+         };
+
+         background.showsLayer = function (d) {
+           var currSource = baseLayer.source();
+           if (!d || !currSource) return false;
+           return d.id === currSource.id || _overlayLayers.some(function (layer) {
+             return d.id === layer.source().id;
+           });
+         };
+
+         background.overlayLayerSources = function () {
+           return _overlayLayers.map(function (layer) {
+             return layer.source();
+           });
+         };
+
+         background.toggleOverlayLayer = function (d) {
+           var layer;
+
+           for (var i = 0; i < _overlayLayers.length; i++) {
+             layer = _overlayLayers[i];
+
+             if (layer.source() === d) {
+               _overlayLayers.splice(i, 1);
+
+               dispatch.call('change');
+               background.updateImagery();
+               return;
+             }
+           }
+
+           layer = rendererTileLayer(context).source(d).projection(context.projection).dimensions(baseLayer.dimensions());
+
+           _overlayLayers.push(layer);
+
+           dispatch.call('change');
+           background.updateImagery();
+         };
+
+         background.nudge = function (d, zoom) {
+           var currSource = baseLayer.source();
+
+           if (currSource) {
+             currSource.nudge(d, zoom);
+             dispatch.call('change');
+             background.updateImagery();
+           }
+
+           return background;
+         };
+
+         background.offset = function (d) {
+           var currSource = baseLayer.source();
+
+           if (!arguments.length) {
+             return currSource && currSource.offset() || [0, 0];
+           }
+
+           if (currSource) {
+             currSource.offset(d);
+             dispatch.call('change');
+             background.updateImagery();
+           }
+
+           return background;
+         };
+
+         background.brightness = function (d) {
+           if (!arguments.length) return _brightness;
+           _brightness = d;
+           if (context.mode()) dispatch.call('change');
+           return background;
+         };
+
+         background.contrast = function (d) {
+           if (!arguments.length) return _contrast;
+           _contrast = d;
+           if (context.mode()) dispatch.call('change');
+           return background;
+         };
+
+         background.saturation = function (d) {
+           if (!arguments.length) return _saturation;
+           _saturation = d;
+           if (context.mode()) dispatch.call('change');
+           return background;
+         };
+
+         background.sharpness = function (d) {
+           if (!arguments.length) return _sharpness;
+           _sharpness = d;
+           if (context.mode()) dispatch.call('change');
+           return background;
+         };
+
+         var _loadPromise;
+
+         background.ensureLoaded = function () {
+           if (_loadPromise) return _loadPromise;
+
+           function parseMapParams(qmap) {
+             if (!qmap) return false;
+             var params = qmap.split('/').map(Number);
+             if (params.length < 3 || params.some(isNaN)) return false;
+             return geoExtent([params[2], params[1]]); // lon,lat
+           }
+
+           var hash = utilStringQs(window.location.hash);
+           var requested = hash.background || hash.layer;
+           var extent = parseMapParams(hash.map);
+           return _loadPromise = ensureImageryIndex().then(function (imageryIndex) {
+             var first = imageryIndex.backgrounds.length && imageryIndex.backgrounds[0];
+             var best;
+
+             if (!requested && extent) {
+               best = background.sources(extent).find(function (s) {
+                 return s.best();
+               });
+             } // Decide which background layer to display
+
+
+             if (requested && requested.indexOf('custom:') === 0) {
+               var template = requested.replace(/^custom:/, '');
+               var custom = background.findSource('custom');
+               background.baseLayerSource(custom.template(template));
+               corePreferences('background-custom-template', template);
+             } else {
+               background.baseLayerSource(background.findSource(requested) || best || background.findSource(corePreferences('background-last-used')) || background.findSource('Bing') || first || background.findSource('none'));
+             }
+
+             var locator = imageryIndex.backgrounds.find(function (d) {
+               return d.overlay && d["default"];
+             });
+
+             if (locator) {
+               background.toggleOverlayLayer(locator);
+             }
+
+             var overlays = (hash.overlays || '').split(',');
+             overlays.forEach(function (overlay) {
+               overlay = background.findSource(overlay);
+
+               if (overlay) {
+                 background.toggleOverlayLayer(overlay);
+               }
+             });
+
+             if (hash.gpx) {
+               var gpx = context.layers().layer('data');
+
+               if (gpx) {
+                 gpx.url(hash.gpx, '.gpx');
+               }
+             }
+
+             if (hash.offset) {
+               var offset = hash.offset.replace(/;/g, ',').split(',').map(function (n) {
+                 return !isNaN(n) && n;
+               });
+
+               if (offset.length === 2) {
+                 background.offset(geoMetersToOffset(offset));
+               }
+             }
+           })["catch"](function () {
+             /* ignore */
+           });
+         };
+
+         return utilRebind(background, dispatch, 'on');
+       }
+
+       function rendererFeatures(context) {
+         var dispatch = dispatch$8('change', 'redraw');
+         var features = utilRebind({}, dispatch, 'on');
+
+         var _deferred = new Set();
+
+         var traffic_roads = {
+           'motorway': true,
+           'motorway_link': true,
+           'trunk': true,
+           'trunk_link': true,
+           'primary': true,
+           'primary_link': true,
+           'secondary': true,
+           'secondary_link': true,
+           'tertiary': true,
+           'tertiary_link': true,
+           'residential': true,
+           'unclassified': true,
+           'living_street': true
+         };
+         var service_roads = {
+           'service': true,
+           'road': true,
+           'track': true
+         };
+         var paths = {
+           'path': true,
+           'footway': true,
+           'cycleway': true,
+           'bridleway': true,
+           'steps': true,
+           'pedestrian': true
+         };
+         var past_futures = {
+           'proposed': true,
+           'construction': true,
+           'abandoned': true,
+           'dismantled': true,
+           'disused': true,
+           'razed': true,
+           'demolished': true,
+           'obliterated': true
+         };
+         var _cullFactor = 1;
+         var _cache = {};
+         var _rules = {};
+         var _stats = {};
+         var _keys = [];
+         var _hidden = [];
+         var _forceVisible = {};
+
+         function update() {
+           if (!window.mocha) {
+             var hash = utilStringQs(window.location.hash);
+             var disabled = features.disabled();
+
+             if (disabled.length) {
+               hash.disable_features = disabled.join(',');
+             } else {
+               delete hash.disable_features;
+             }
+
+             window.location.replace('#' + utilQsString(hash, true));
+             corePreferences('disabled-features', disabled.join(','));
+           }
+
+           _hidden = features.hidden();
+           dispatch.call('change');
+           dispatch.call('redraw');
+         }
+
+         function defineRule(k, filter, max) {
+           var isEnabled = true;
+
+           _keys.push(k);
+
+           _rules[k] = {
+             filter: filter,
+             enabled: isEnabled,
+             // whether the user wants it enabled..
+             count: 0,
+             currentMax: max || Infinity,
+             defaultMax: max || Infinity,
+             enable: function enable() {
+               this.enabled = true;
+               this.currentMax = this.defaultMax;
+             },
+             disable: function disable() {
+               this.enabled = false;
+               this.currentMax = 0;
+             },
+             hidden: function hidden() {
+               return this.count === 0 && !this.enabled || this.count > this.currentMax * _cullFactor;
+             },
+             autoHidden: function autoHidden() {
+               return this.hidden() && this.currentMax > 0;
+             }
+           };
+         }
+
+         defineRule('points', function isPoint(tags, geometry) {
+           return geometry === 'point';
+         }, 200);
+         defineRule('traffic_roads', function isTrafficRoad(tags) {
+           return traffic_roads[tags.highway];
+         });
+         defineRule('service_roads', function isServiceRoad(tags) {
+           return service_roads[tags.highway];
+         });
+         defineRule('paths', function isPath(tags) {
+           return paths[tags.highway];
+         });
+         defineRule('buildings', function isBuilding(tags) {
+           return !!tags.building && tags.building !== 'no' || tags.parking === 'multi-storey' || tags.parking === 'sheds' || tags.parking === 'carports' || tags.parking === 'garage_boxes';
+         }, 250);
+         defineRule('building_parts', function isBuildingPart(tags) {
+           return tags['building:part'];
+         });
+         defineRule('indoor', function isIndoor(tags) {
+           return tags.indoor;
+         });
+         defineRule('landuse', function isLanduse(tags, geometry) {
+           return geometry === 'area' && !_rules.buildings.filter(tags) && !_rules.building_parts.filter(tags) && !_rules.indoor.filter(tags) && !_rules.water.filter(tags) && !_rules.pistes.filter(tags);
+         });
+         defineRule('boundaries', function isBoundary(tags) {
+           return !!tags.boundary && !(traffic_roads[tags.highway] || service_roads[tags.highway] || paths[tags.highway] || tags.waterway || tags.railway || tags.landuse || tags.natural || tags.building || tags.power);
+         });
+         defineRule('water', function isWater(tags) {
+           return !!tags.waterway || tags.natural === 'water' || tags.natural === 'coastline' || tags.natural === 'bay' || tags.landuse === 'pond' || tags.landuse === 'basin' || tags.landuse === 'reservoir' || tags.landuse === 'salt_pond';
+         });
+         defineRule('rail', function isRail(tags) {
+           return (!!tags.railway || tags.landuse === 'railway') && !(traffic_roads[tags.highway] || service_roads[tags.highway] || paths[tags.highway]);
+         });
+         defineRule('pistes', function isPiste(tags) {
+           return tags['piste:type'];
+         });
+         defineRule('aerialways', function isPiste(tags) {
+           return tags.aerialway && tags.aerialway !== 'yes' && tags.aerialway !== 'station';
+         });
+         defineRule('power', function isPower(tags) {
+           return !!tags.power;
+         }); // contains a past/future tag, but not in active use as a road/path/cycleway/etc..
+
+         defineRule('past_future', function isPastFuture(tags) {
+           if (traffic_roads[tags.highway] || service_roads[tags.highway] || paths[tags.highway]) {
+             return false;
+           }
+
+           var strings = Object.keys(tags);
+
+           for (var i = 0; i < strings.length; i++) {
+             var s = strings[i];
+
+             if (past_futures[s] || past_futures[tags[s]]) {
+               return true;
+             }
+           }
+
+           return false;
+         }); // Lines or areas that don't match another feature filter.
+         // IMPORTANT: The 'others' feature must be the last one defined,
+         //   so that code in getMatches can skip this test if `hasMatch = true`
+
+         defineRule('others', function isOther(tags, geometry) {
+           return geometry === 'line' || geometry === 'area';
+         });
+
+         features.features = function () {
+           return _rules;
+         };
+
+         features.keys = function () {
+           return _keys;
+         };
+
+         features.enabled = function (k) {
+           if (!arguments.length) {
+             return _keys.filter(function (k) {
+               return _rules[k].enabled;
+             });
+           }
+
+           return _rules[k] && _rules[k].enabled;
+         };
+
+         features.disabled = function (k) {
+           if (!arguments.length) {
+             return _keys.filter(function (k) {
+               return !_rules[k].enabled;
+             });
+           }
+
+           return _rules[k] && !_rules[k].enabled;
+         };
+
+         features.hidden = function (k) {
+           if (!arguments.length) {
+             return _keys.filter(function (k) {
+               return _rules[k].hidden();
+             });
+           }
+
+           return _rules[k] && _rules[k].hidden();
+         };
+
+         features.autoHidden = function (k) {
+           if (!arguments.length) {
+             return _keys.filter(function (k) {
+               return _rules[k].autoHidden();
+             });
+           }
+
+           return _rules[k] && _rules[k].autoHidden();
+         };
+
+         features.enable = function (k) {
+           if (_rules[k] && !_rules[k].enabled) {
+             _rules[k].enable();
+
+             update();
+           }
+         };
+
+         features.enableAll = function () {
+           var didEnable = false;
+
+           for (var k in _rules) {
+             if (!_rules[k].enabled) {
+               didEnable = true;
+
+               _rules[k].enable();
+             }
+           }
+
+           if (didEnable) update();
+         };
+
+         features.disable = function (k) {
+           if (_rules[k] && _rules[k].enabled) {
+             _rules[k].disable();
+
+             update();
+           }
+         };
+
+         features.disableAll = function () {
+           var didDisable = false;
+
+           for (var k in _rules) {
+             if (_rules[k].enabled) {
+               didDisable = true;
+
+               _rules[k].disable();
+             }
+           }
+
+           if (didDisable) update();
+         };
+
+         features.toggle = function (k) {
+           if (_rules[k]) {
+             (function (f) {
+               return f.enabled ? f.disable() : f.enable();
+             })(_rules[k]);
+
+             update();
+           }
+         };
+
+         features.resetStats = function () {
+           for (var i = 0; i < _keys.length; i++) {
+             _rules[_keys[i]].count = 0;
+           }
+
+           dispatch.call('change');
+         };
+
+         features.gatherStats = function (d, resolver, dimensions) {
+           var needsRedraw = false;
+           var types = utilArrayGroupBy(d, 'type');
+           var entities = [].concat(types.relation || [], types.way || [], types.node || []);
+           var currHidden, geometry, matches, i, j;
+
+           for (i = 0; i < _keys.length; i++) {
+             _rules[_keys[i]].count = 0;
+           } // adjust the threshold for point/building culling based on viewport size..
+           // a _cullFactor of 1 corresponds to a 1000x1000px viewport..
+
+
+           _cullFactor = dimensions[0] * dimensions[1] / 1000000;
+
+           for (i = 0; i < entities.length; i++) {
+             geometry = entities[i].geometry(resolver);
+             matches = Object.keys(features.getMatches(entities[i], resolver, geometry));
+
+             for (j = 0; j < matches.length; j++) {
+               _rules[matches[j]].count++;
+             }
+           }
+
+           currHidden = features.hidden();
+
+           if (currHidden !== _hidden) {
+             _hidden = currHidden;
+             needsRedraw = true;
+             dispatch.call('change');
+           }
+
+           return needsRedraw;
+         };
+
+         features.stats = function () {
+           for (var i = 0; i < _keys.length; i++) {
+             _stats[_keys[i]] = _rules[_keys[i]].count;
+           }
+
+           return _stats;
+         };
+
+         features.clear = function (d) {
+           for (var i = 0; i < d.length; i++) {
+             features.clearEntity(d[i]);
+           }
+         };
+
+         features.clearEntity = function (entity) {
+           delete _cache[osmEntity.key(entity)];
+         };
+
+         features.reset = function () {
+           Array.from(_deferred).forEach(function (handle) {
+             window.cancelIdleCallback(handle);
+
+             _deferred["delete"](handle);
+           });
+           _cache = {};
+         }; // only certain relations are worth checking
+
+
+         function relationShouldBeChecked(relation) {
+           // multipolygon features have `area` geometry and aren't checked here
+           return relation.tags.type === 'boundary';
+         }
+
+         features.getMatches = function (entity, resolver, geometry) {
+           if (geometry === 'vertex' || geometry === 'relation' && !relationShouldBeChecked(entity)) return {};
+           var ent = osmEntity.key(entity);
+
+           if (!_cache[ent]) {
+             _cache[ent] = {};
+           }
+
+           if (!_cache[ent].matches) {
+             var matches = {};
+             var hasMatch = false;
+
+             for (var i = 0; i < _keys.length; i++) {
+               if (_keys[i] === 'others') {
+                 if (hasMatch) continue; // If an entity...
+                 //   1. is a way that hasn't matched other 'interesting' feature rules,
+
+                 if (entity.type === 'way') {
+                   var parents = features.getParents(entity, resolver, geometry); //   2a. belongs only to a single multipolygon relation
+
+                   if (parents.length === 1 && parents[0].isMultipolygon() || // 2b. or belongs only to boundary relations
+                   parents.length > 0 && parents.every(function (parent) {
+                     return parent.tags.type === 'boundary';
+                   })) {
+                     // ...then match whatever feature rules the parent relation has matched.
+                     // see #2548, #2887
+                     //
+                     // IMPORTANT:
+                     // For this to work, getMatches must be called on relations before ways.
+                     //
+                     var pkey = osmEntity.key(parents[0]);
+
+                     if (_cache[pkey] && _cache[pkey].matches) {
+                       matches = Object.assign({}, _cache[pkey].matches); // shallow copy
+
+                       continue;
+                     }
+                   }
+                 }
+               }
+
+               if (_rules[_keys[i]].filter(entity.tags, geometry)) {
+                 matches[_keys[i]] = hasMatch = true;
+               }
+             }
+
+             _cache[ent].matches = matches;
+           }
+
+           return _cache[ent].matches;
+         };
+
+         features.getParents = function (entity, resolver, geometry) {
+           if (geometry === 'point') return [];
+           var ent = osmEntity.key(entity);
+
+           if (!_cache[ent]) {
+             _cache[ent] = {};
+           }
+
+           if (!_cache[ent].parents) {
+             var parents = [];
+
+             if (geometry === 'vertex') {
+               parents = resolver.parentWays(entity);
+             } else {
+               // 'line', 'area', 'relation'
+               parents = resolver.parentRelations(entity);
+             }
+
+             _cache[ent].parents = parents;
+           }
+
+           return _cache[ent].parents;
+         };
+
+         features.isHiddenPreset = function (preset, geometry) {
+           if (!_hidden.length) return false;
+           if (!preset.tags) return false;
+           var test = preset.setTags({}, geometry);
+
+           for (var key in _rules) {
+             if (_rules[key].filter(test, geometry)) {
+               if (_hidden.indexOf(key) !== -1) {
+                 return key;
+               }
+
+               return false;
+             }
+           }
+
+           return false;
+         };
+
+         features.isHiddenFeature = function (entity, resolver, geometry) {
+           if (!_hidden.length) return false;
+           if (!entity.version) return false;
+           if (_forceVisible[entity.id]) return false;
+           var matches = Object.keys(features.getMatches(entity, resolver, geometry));
+           return matches.length && matches.every(function (k) {
+             return features.hidden(k);
+           });
+         };
+
+         features.isHiddenChild = function (entity, resolver, geometry) {
+           if (!_hidden.length) return false;
+           if (!entity.version || geometry === 'point') return false;
+           if (_forceVisible[entity.id]) return false;
+           var parents = features.getParents(entity, resolver, geometry);
+           if (!parents.length) return false;
+
+           for (var i = 0; i < parents.length; i++) {
+             if (!features.isHidden(parents[i], resolver, parents[i].geometry(resolver))) {
+               return false;
+             }
+           }
+
+           return true;
+         };
+
+         features.hasHiddenConnections = function (entity, resolver) {
+           if (!_hidden.length) return false;
+           var childNodes, connections;
+
+           if (entity.type === 'midpoint') {
+             childNodes = [resolver.entity(entity.edge[0]), resolver.entity(entity.edge[1])];
+             connections = [];
+           } else {
+             childNodes = entity.nodes ? resolver.childNodes(entity) : [];
+             connections = features.getParents(entity, resolver, entity.geometry(resolver));
+           } // gather ways connected to child nodes..
+
+
+           connections = childNodes.reduce(function (result, e) {
+             return resolver.isShared(e) ? utilArrayUnion(result, resolver.parentWays(e)) : result;
+           }, connections);
+           return connections.some(function (e) {
+             return features.isHidden(e, resolver, e.geometry(resolver));
+           });
+         };
+
+         features.isHidden = function (entity, resolver, geometry) {
+           if (!_hidden.length) return false;
+           if (!entity.version) return false;
+           var fn = geometry === 'vertex' ? features.isHiddenChild : features.isHiddenFeature;
+           return fn(entity, resolver, geometry);
+         };
+
+         features.filter = function (d, resolver) {
+           if (!_hidden.length) return d;
+           var result = [];
+
+           for (var i = 0; i < d.length; i++) {
+             var entity = d[i];
+
+             if (!features.isHidden(entity, resolver, entity.geometry(resolver))) {
+               result.push(entity);
+             }
+           }
+
+           return result;
+         };
+
+         features.forceVisible = function (entityIDs) {
+           if (!arguments.length) return Object.keys(_forceVisible);
+           _forceVisible = {};
+
+           for (var i = 0; i < entityIDs.length; i++) {
+             _forceVisible[entityIDs[i]] = true;
+             var entity = context.hasEntity(entityIDs[i]);
+
+             if (entity && entity.type === 'relation') {
+               // also show relation members (one level deep)
+               for (var j in entity.members) {
+                 _forceVisible[entity.members[j].id] = true;
+               }
+             }
+           }
+
+           return features;
+         };
+
+         features.init = function () {
+           var storage = corePreferences('disabled-features');
+
+           if (storage) {
+             var storageDisabled = storage.replace(/;/g, ',').split(',');
+             storageDisabled.forEach(features.disable);
+           }
+
+           var hash = utilStringQs(window.location.hash);
+
+           if (hash.disable_features) {
+             var hashDisabled = hash.disable_features.replace(/;/g, ',').split(',');
+             hashDisabled.forEach(features.disable);
+           }
+         }; // warm up the feature matching cache upon merging fetched data
+
+
+         context.history().on('merge.features', function (newEntities) {
+           if (!newEntities) return;
+           var handle = window.requestIdleCallback(function () {
+             var graph = context.graph();
+             var types = utilArrayGroupBy(newEntities, 'type'); // ensure that getMatches is called on relations before ways
+
+             var entities = [].concat(types.relation || [], types.way || [], types.node || []);
+
+             for (var i = 0; i < entities.length; i++) {
+               var geometry = entities[i].geometry(graph);
+               features.getMatches(entities[i], graph, geometry);
+             }
+           });
+
+           _deferred.add(handle);
+         });
+         return features;
+       }
+
+       //
+       // - the activeID - nope
+       // - 1 away (adjacent) to the activeID - yes (vertices will be merged)
+       // - 2 away from the activeID - nope (would create a self intersecting segment)
+       // - all others on a linear way - yes
+       // - all others on a closed way - nope (would create a self intersecting polygon)
+       //
+       // returns
+       // 0 = active vertex - no touch/connect
+       // 1 = passive vertex - yes touch/connect
+       // 2 = adjacent vertex - yes but pay attention segmenting a line here
+       //
+
+       function svgPassiveVertex(node, graph, activeID) {
+         if (!activeID) return 1;
+         if (activeID === node.id) return 0;
+         var parents = graph.parentWays(node);
+         var i, j, nodes, isClosed, ix1, ix2, ix3, ix4, max;
+
+         for (i = 0; i < parents.length; i++) {
+           nodes = parents[i].nodes;
+           isClosed = parents[i].isClosed();
+
+           for (j = 0; j < nodes.length; j++) {
+             // find this vertex, look nearby
+             if (nodes[j] === node.id) {
+               ix1 = j - 2;
+               ix2 = j - 1;
+               ix3 = j + 1;
+               ix4 = j + 2;
+
+               if (isClosed) {
+                 // wraparound if needed
+                 max = nodes.length - 1;
+                 if (ix1 < 0) ix1 = max + ix1;
+                 if (ix2 < 0) ix2 = max + ix2;
+                 if (ix3 > max) ix3 = ix3 - max;
+                 if (ix4 > max) ix4 = ix4 - max;
+               }
+
+               if (nodes[ix1] === activeID) return 0; // no - prevent self intersect
+               else if (nodes[ix2] === activeID) return 2; // ok - adjacent
+               else if (nodes[ix3] === activeID) return 2; // ok - adjacent
+               else if (nodes[ix4] === activeID) return 0; // no - prevent self intersect
+               else if (isClosed && nodes.indexOf(activeID) !== -1) return 0; // no - prevent self intersect
+             }
+           }
+         }
+
+         return 1; // ok
+       }
+       function svgMarkerSegments(projection, graph, dt, shouldReverse, bothDirections) {
+         return function (entity) {
+           var i = 0;
+           var offset = dt;
+           var segments = [];
+           var clip = d3_geoIdentity().clipExtent(projection.clipExtent()).stream;
+           var coordinates = graph.childNodes(entity).map(function (n) {
+             return n.loc;
+           });
+           var a, b;
+
+           if (shouldReverse(entity)) {
+             coordinates.reverse();
+           }
+
+           d3_geoStream({
+             type: 'LineString',
+             coordinates: coordinates
+           }, projection.stream(clip({
+             lineStart: function lineStart() {},
+             lineEnd: function lineEnd() {
+               a = null;
+             },
+             point: function point(x, y) {
+               b = [x, y];
+
+               if (a) {
+                 var span = geoVecLength(a, b) - offset;
+
+                 if (span >= 0) {
+                   var heading = geoVecAngle(a, b);
+                   var dx = dt * Math.cos(heading);
+                   var dy = dt * Math.sin(heading);
+                   var p = [a[0] + offset * Math.cos(heading), a[1] + offset * Math.sin(heading)]; // gather coordinates
+
+                   var coord = [a, p];
+
+                   for (span -= dt; span >= 0; span -= dt) {
+                     p = geoVecAdd(p, [dx, dy]);
+                     coord.push(p);
+                   }
+
+                   coord.push(b); // generate svg paths
+
+                   var segment = '';
+                   var j;
+
+                   for (j = 0; j < coord.length; j++) {
+                     segment += (j === 0 ? 'M' : 'L') + coord[j][0] + ',' + coord[j][1];
+                   }
+
+                   segments.push({
+                     id: entity.id,
+                     index: i++,
+                     d: segment
+                   });
+
+                   if (bothDirections(entity)) {
+                     segment = '';
+
+                     for (j = coord.length - 1; j >= 0; j--) {
+                       segment += (j === coord.length - 1 ? 'M' : 'L') + coord[j][0] + ',' + coord[j][1];
+                     }
+
+                     segments.push({
+                       id: entity.id,
+                       index: i++,
+                       d: segment
+                     });
+                   }
+                 }
+
+                 offset = -span;
+               }
+
+               a = b;
+             }
+           })));
+           return segments;
+         };
+       }
+       function svgPath(projection, graph, isArea) {
+         // Explanation of magic numbers:
+         // "padding" here allows space for strokes to extend beyond the viewport,
+         // so that the stroke isn't drawn along the edge of the viewport when
+         // the shape is clipped.
+         //
+         // When drawing lines, pad viewport by 5px.
+         // When drawing areas, pad viewport by 65px in each direction to allow
+         // for 60px area fill stroke (see ".fill-partial path.fill" css rule)
+         var cache = {};
+         var padding = isArea ? 65 : 5;
+         var viewport = projection.clipExtent();
+         var paddedExtent = [[viewport[0][0] - padding, viewport[0][1] - padding], [viewport[1][0] + padding, viewport[1][1] + padding]];
+         var clip = d3_geoIdentity().clipExtent(paddedExtent).stream;
+         var project = projection.stream;
+         var path = d3_geoPath().projection({
+           stream: function stream(output) {
+             return project(clip(output));
+           }
+         });
+
+         var svgpath = function svgpath(entity) {
+           if (entity.id in cache) {
+             return cache[entity.id];
+           } else {
+             return cache[entity.id] = path(entity.asGeoJSON(graph));
+           }
+         };
+
+         svgpath.geojson = function (d) {
+           if (d.__featurehash__ !== undefined) {
+             if (d.__featurehash__ in cache) {
+               return cache[d.__featurehash__];
+             } else {
+               return cache[d.__featurehash__] = path(d);
+             }
+           } else {
+             return path(d);
+           }
+         };
+
+         return svgpath;
+       }
+       function svgPointTransform(projection) {
+         var svgpoint = function svgpoint(entity) {
+           // http://jsperf.com/short-array-join
+           var pt = projection(entity.loc);
+           return 'translate(' + pt[0] + ',' + pt[1] + ')';
+         };
+
+         svgpoint.geojson = function (d) {
+           return svgpoint(d.properties.entity);
+         };
+
+         return svgpoint;
+       }
+       function svgRelationMemberTags(graph) {
+         return function (entity) {
+           var tags = entity.tags;
+           var shouldCopyMultipolygonTags = !entity.hasInterestingTags();
+           graph.parentRelations(entity).forEach(function (relation) {
+             var type = relation.tags.type;
+
+             if (type === 'multipolygon' && shouldCopyMultipolygonTags || type === 'boundary') {
+               tags = Object.assign({}, relation.tags, tags);
+             }
+           });
+           return tags;
+         };
+       }
+       function svgSegmentWay(way, graph, activeID) {
+         // When there is no activeID, we can memoize this expensive computation
+         if (activeID === undefined) {
+           return graph["transient"](way, 'waySegments', getWaySegments);
+         } else {
+           return getWaySegments();
+         }
+
+         function getWaySegments() {
+           var isActiveWay = way.nodes.indexOf(activeID) !== -1;
+           var features = {
+             passive: [],
+             active: []
+           };
+           var start = {};
+           var end = {};
+           var node, type;
+
+           for (var i = 0; i < way.nodes.length; i++) {
+             node = graph.entity(way.nodes[i]);
+             type = svgPassiveVertex(node, graph, activeID);
+             end = {
+               node: node,
+               type: type
+             };
+
+             if (start.type !== undefined) {
+               if (start.node.id === activeID || end.node.id === activeID) ; else if (isActiveWay && (start.type === 2 || end.type === 2)) {
+                 // one adjacent vertex
+                 pushActive(start, end, i);
+               } else if (start.type === 0 && end.type === 0) {
+                 // both active vertices
+                 pushActive(start, end, i);
+               } else {
+                 pushPassive(start, end, i);
+               }
+             }
+
+             start = end;
+           }
+
+           return features;
+
+           function pushActive(start, end, index) {
+             features.active.push({
+               type: 'Feature',
+               id: way.id + '-' + index + '-nope',
+               properties: {
+                 nope: true,
+                 target: true,
+                 entity: way,
+                 nodes: [start.node, end.node],
+                 index: index
+               },
+               geometry: {
+                 type: 'LineString',
+                 coordinates: [start.node.loc, end.node.loc]
+               }
+             });
+           }
+
+           function pushPassive(start, end, index) {
+             features.passive.push({
+               type: 'Feature',
+               id: way.id + '-' + index,
+               properties: {
+                 target: true,
+                 entity: way,
+                 nodes: [start.node, end.node],
+                 index: index
+               },
+               geometry: {
+                 type: 'LineString',
+                 coordinates: [start.node.loc, end.node.loc]
+               }
+             });
+           }
+         }
+       }
+
+       function svgTagClasses() {
+         var primaries = ['building', 'highway', 'railway', 'waterway', 'aeroway', 'aerialway', 'piste:type', 'boundary', 'power', 'amenity', 'natural', 'landuse', 'leisure', 'military', 'place', 'man_made', 'route', 'attraction', 'building:part', 'indoor'];
+         var statuses = [// nonexistent, might be built
+         'proposed', 'planned', // under maintentance or between groundbreaking and opening
+         'construction', // existent but not functional
+         'disused', // dilapidated to nonexistent
+         'abandoned', // nonexistent, still may appear in imagery
+         'dismantled', 'razed', 'demolished', 'obliterated', // existent occasionally, e.g. stormwater drainage basin
+         'intermittent'];
+         var secondaries = ['oneway', 'bridge', 'tunnel', 'embankment', 'cutting', 'barrier', 'surface', 'tracktype', 'footway', 'crossing', 'service', 'sport', 'public_transport', 'location', 'parking', 'golf', 'type', 'leisure', 'man_made', 'indoor', 'construction', 'proposed'];
+
+         var _tags = function _tags(entity) {
+           return entity.tags;
+         };
+
+         var tagClasses = function tagClasses(selection) {
+           selection.each(function tagClassesEach(entity) {
+             var value = this.className;
+
+             if (value.baseVal !== undefined) {
+               value = value.baseVal;
+             }
+
+             var t = _tags(entity);
+
+             var computed = tagClasses.getClassesString(t, value);
+
+             if (computed !== value) {
+               select(this).attr('class', computed);
+             }
+           });
+         };
+
+         tagClasses.getClassesString = function (t, value) {
+           var primary, status;
+           var i, j, k, v; // in some situations we want to render perimeter strokes a certain way
+
+           var overrideGeometry;
+
+           if (/\bstroke\b/.test(value)) {
+             if (!!t.barrier && t.barrier !== 'no') {
+               overrideGeometry = 'line';
+             }
+           } // preserve base classes (nothing with `tag-`)
+
+
+           var classes = value.trim().split(/\s+/).filter(function (klass) {
+             return klass.length && !/^tag-/.test(klass);
+           }).map(function (klass) {
+             // special overrides for some perimeter strokes
+             return klass === 'line' || klass === 'area' ? overrideGeometry || klass : klass;
+           }); // pick at most one primary classification tag..
+
+           for (i = 0; i < primaries.length; i++) {
+             k = primaries[i];
+             v = t[k];
+             if (!v || v === 'no') continue;
+
+             if (k === 'piste:type') {
+               // avoid a ':' in the class name
+               k = 'piste';
+             } else if (k === 'building:part') {
+               // avoid a ':' in the class name
+               k = 'building_part';
+             }
+
+             primary = k;
+
+             if (statuses.indexOf(v) !== -1) {
+               // e.g. `railway=abandoned`
+               status = v;
+               classes.push('tag-' + k);
+             } else {
+               classes.push('tag-' + k);
+               classes.push('tag-' + k + '-' + v);
+             }
+
+             break;
+           }
+
+           if (!primary) {
+             for (i = 0; i < statuses.length; i++) {
+               for (j = 0; j < primaries.length; j++) {
+                 k = statuses[i] + ':' + primaries[j]; // e.g. `demolished:building=yes`
+
+                 v = t[k];
+                 if (!v || v === 'no') continue;
+                 status = statuses[i];
+                 break;
+               }
+             }
+           } // add at most one status tag, only if relates to primary tag..
+
+
+           if (!status) {
+             for (i = 0; i < statuses.length; i++) {
+               k = statuses[i];
+               v = t[k];
+               if (!v || v === 'no') continue;
+
+               if (v === 'yes') {
+                 // e.g. `railway=rail + abandoned=yes`
+                 status = k;
+               } else if (primary && primary === v) {
+                 // e.g. `railway=rail + abandoned=railway`
+                 status = k;
+               } else if (!primary && primaries.indexOf(v) !== -1) {
+                 // e.g. `abandoned=railway`
+                 status = k;
+                 primary = v;
+                 classes.push('tag-' + v);
+               } // else ignore e.g.  `highway=path + abandoned=railway`
+
+
+               if (status) break;
+             }
+           }
+
+           if (status) {
+             classes.push('tag-status');
+             classes.push('tag-status-' + status);
+           } // add any secondary tags
+
+
+           for (i = 0; i < secondaries.length; i++) {
+             k = secondaries[i];
+             v = t[k];
+             if (!v || v === 'no' || k === primary) continue;
+             classes.push('tag-' + k);
+             classes.push('tag-' + k + '-' + v);
+           } // For highways, look for surface tagging..
+
+
+           if (primary === 'highway' && !osmPathHighwayTagValues[t.highway] || primary === 'aeroway') {
+             var surface = t.highway === 'track' ? 'unpaved' : 'paved';
+
+             for (k in t) {
+               v = t[k];
+
+               if (k in osmPavedTags) {
+                 surface = osmPavedTags[k][v] ? 'paved' : 'unpaved';
+               }
+
+               if (k in osmSemipavedTags && !!osmSemipavedTags[k][v]) {
+                 surface = 'semipaved';
+               }
+             }
+
+             classes.push('tag-' + surface);
+           } // If this is a wikidata-tagged item, add a class for that..
+
+
+           var qid = t.wikidata || t['flag:wikidata'] || t['brand:wikidata'] || t['network:wikidata'] || t['operator:wikidata'];
+
+           if (qid) {
+             classes.push('tag-wikidata');
+           }
+
+           return classes.join(' ').trim();
+         };
+
+         tagClasses.tags = function (val) {
+           if (!arguments.length) return _tags;
+           _tags = val;
+           return tagClasses;
+         };
+
+         return tagClasses;
+       }
+
+       // Patterns only work in Firefox when set directly on element.
+       // (This is not a bug: https://bugzilla.mozilla.org/show_bug.cgi?id=750632)
+       var patterns = {
+         // tag - pattern name
+         // -or-
+         // tag - value - pattern name
+         // -or-
+         // tag - value - rules (optional tag-values, pattern name)
+         // (matches earlier rules first, so fallback should be last entry)
+         amenity: {
+           grave_yard: 'cemetery',
+           fountain: 'water_standing'
+         },
+         landuse: {
+           cemetery: [{
+             religion: 'christian',
+             pattern: 'cemetery_christian'
+           }, {
+             religion: 'buddhist',
+             pattern: 'cemetery_buddhist'
+           }, {
+             religion: 'muslim',
+             pattern: 'cemetery_muslim'
+           }, {
+             religion: 'jewish',
+             pattern: 'cemetery_jewish'
+           }, {
+             pattern: 'cemetery'
+           }],
+           construction: 'construction',
+           farmland: 'farmland',
+           farmyard: 'farmyard',
+           forest: [{
+             leaf_type: 'broadleaved',
+             pattern: 'forest_broadleaved'
+           }, {
+             leaf_type: 'needleleaved',
+             pattern: 'forest_needleleaved'
+           }, {
+             leaf_type: 'leafless',
+             pattern: 'forest_leafless'
+           }, {
+             pattern: 'forest'
+           } // same as 'leaf_type:mixed'
+           ],
+           grave_yard: 'cemetery',
+           grass: [{
+             golf: 'green',
+             pattern: 'golf_green'
+           }, {
+             pattern: 'grass'
+           }],
+           landfill: 'landfill',
+           meadow: 'meadow',
+           military: 'construction',
+           orchard: 'orchard',
+           quarry: 'quarry',
+           vineyard: 'vineyard'
+         },
+         natural: {
+           beach: 'beach',
+           grassland: 'grass',
+           sand: 'beach',
+           scrub: 'scrub',
+           water: [{
+             water: 'pond',
+             pattern: 'pond'
+           }, {
+             water: 'reservoir',
+             pattern: 'water_standing'
+           }, {
+             pattern: 'waves'
+           }],
+           wetland: [{
+             wetland: 'marsh',
+             pattern: 'wetland_marsh'
+           }, {
+             wetland: 'swamp',
+             pattern: 'wetland_swamp'
+           }, {
+             wetland: 'bog',
+             pattern: 'wetland_bog'
+           }, {
+             wetland: 'reedbed',
+             pattern: 'wetland_reedbed'
+           }, {
+             pattern: 'wetland'
+           }],
+           wood: [{
+             leaf_type: 'broadleaved',
+             pattern: 'forest_broadleaved'
+           }, {
+             leaf_type: 'needleleaved',
+             pattern: 'forest_needleleaved'
+           }, {
+             leaf_type: 'leafless',
+             pattern: 'forest_leafless'
+           }, {
+             pattern: 'forest'
+           } // same as 'leaf_type:mixed'
+           ]
+         },
+         traffic_calming: {
+           island: [{
+             surface: 'grass',
+             pattern: 'grass'
+           }],
+           chicane: [{
+             surface: 'grass',
+             pattern: 'grass'
+           }],
+           choker: [{
+             surface: 'grass',
+             pattern: 'grass'
+           }]
+         }
+       };
+       function svgTagPattern(tags) {
+         // Skip pattern filling if this is a building (buildings don't get patterns applied)
+         if (tags.building && tags.building !== 'no') {
+           return null;
+         }
+
+         for (var tag in patterns) {
+           var entityValue = tags[tag];
+           if (!entityValue) continue;
+
+           if (typeof patterns[tag] === 'string') {
+             // extra short syntax (just tag) - pattern name
+             return 'pattern-' + patterns[tag];
+           } else {
+             var values = patterns[tag];
+
+             for (var value in values) {
+               if (entityValue !== value) continue;
+               var rules = values[value];
+
+               if (typeof rules === 'string') {
+                 // short syntax - pattern name
+                 return 'pattern-' + rules;
+               } // long syntax - rule array
+
+
+               for (var ruleKey in rules) {
+                 var rule = rules[ruleKey];
+                 var pass = true;
+
+                 for (var criterion in rule) {
+                   if (criterion !== 'pattern') {
+                     // reserved for pattern name
+                     // The only rule is a required tag-value pair
+                     var v = tags[criterion];
+
+                     if (!v || v !== rule[criterion]) {
+                       pass = false;
+                       break;
+                     }
+                   }
+                 }
+
+                 if (pass) {
+                   return 'pattern-' + rule.pattern;
+                 }
+               }
+             }
+           }
+         }
+
+         return null;
+       }
+
+       function svgAreas(projection, context) {
+         function getPatternStyle(tags) {
+           var imageID = svgTagPattern(tags);
+
+           if (imageID) {
+             return 'url("#ideditor-' + imageID + '")';
+           }
+
+           return '';
+         }
+
+         function drawTargets(selection, graph, entities, filter) {
+           var targetClass = context.getDebug('target') ? 'pink ' : 'nocolor ';
+           var nopeClass = context.getDebug('target') ? 'red ' : 'nocolor ';
+           var getPath = svgPath(projection).geojson;
+           var activeID = context.activeID();
+           var base = context.history().base(); // The targets and nopes will be MultiLineString sub-segments of the ways
+
+           var data = {
+             targets: [],
+             nopes: []
+           };
+           entities.forEach(function (way) {
+             var features = svgSegmentWay(way, graph, activeID);
+             data.targets.push.apply(data.targets, features.passive);
+             data.nopes.push.apply(data.nopes, features.active);
+           }); // Targets allow hover and vertex snapping
+
+           var targetData = data.targets.filter(getPath);
+           var targets = selection.selectAll('.area.target-allowed').filter(function (d) {
+             return filter(d.properties.entity);
+           }).data(targetData, function key(d) {
+             return d.id;
+           }); // exit
+
+           targets.exit().remove();
+
+           var segmentWasEdited = function segmentWasEdited(d) {
+             var wayID = d.properties.entity.id; // if the whole line was edited, don't draw segment changes
+
+             if (!base.entities[wayID] || !fastDeepEqual(graph.entities[wayID].nodes, base.entities[wayID].nodes)) {
+               return false;
+             }
+
+             return d.properties.nodes.some(function (n) {
+               return !base.entities[n.id] || !fastDeepEqual(graph.entities[n.id].loc, base.entities[n.id].loc);
+             });
+           }; // enter/update
+
+
+           targets.enter().append('path').merge(targets).attr('d', getPath).attr('class', function (d) {
+             return 'way area target target-allowed ' + targetClass + d.id;
+           }).classed('segment-edited', segmentWasEdited); // NOPE
+
+           var nopeData = data.nopes.filter(getPath);
+           var nopes = selection.selectAll('.area.target-nope').filter(function (d) {
+             return filter(d.properties.entity);
+           }).data(nopeData, function key(d) {
+             return d.id;
+           }); // exit
+
+           nopes.exit().remove(); // enter/update
+
+           nopes.enter().append('path').merge(nopes).attr('d', getPath).attr('class', function (d) {
+             return 'way area target target-nope ' + nopeClass + d.id;
+           }).classed('segment-edited', segmentWasEdited);
+         }
+
+         function drawAreas(selection, graph, entities, filter) {
+           var path = svgPath(projection, graph, true);
+           var areas = {};
+           var multipolygon;
+           var base = context.history().base();
+
+           for (var i = 0; i < entities.length; i++) {
+             var entity = entities[i];
+             if (entity.geometry(graph) !== 'area') continue;
+             multipolygon = osmIsOldMultipolygonOuterMember(entity, graph);
+
+             if (multipolygon) {
+               areas[multipolygon.id] = {
+                 entity: multipolygon.mergeTags(entity.tags),
+                 area: Math.abs(entity.area(graph))
+               };
+             } else if (!areas[entity.id]) {
+               areas[entity.id] = {
+                 entity: entity,
+                 area: Math.abs(entity.area(graph))
+               };
+             }
+           }
+
+           var fills = Object.values(areas).filter(function hasPath(a) {
+             return path(a.entity);
+           });
+           fills.sort(function areaSort(a, b) {
+             return b.area - a.area;
+           });
+           fills = fills.map(function (a) {
+             return a.entity;
+           });
+           var strokes = fills.filter(function (area) {
+             return area.type === 'way';
+           });
+           var data = {
+             clip: fills,
+             shadow: strokes,
+             stroke: strokes,
+             fill: fills
+           };
+           var clipPaths = context.surface().selectAll('defs').selectAll('.clipPath-osm').filter(filter).data(data.clip, osmEntity.key);
+           clipPaths.exit().remove();
+           var clipPathsEnter = clipPaths.enter().append('clipPath').attr('class', 'clipPath-osm').attr('id', function (entity) {
+             return 'ideditor-' + entity.id + '-clippath';
+           });
+           clipPathsEnter.append('path');
+           clipPaths.merge(clipPathsEnter).selectAll('path').attr('d', path);
+           var drawLayer = selection.selectAll('.layer-osm.areas');
+           var touchLayer = selection.selectAll('.layer-touch.areas'); // Draw areas..
+
+           var areagroup = drawLayer.selectAll('g.areagroup').data(['fill', 'shadow', 'stroke']);
+           areagroup = areagroup.enter().append('g').attr('class', function (d) {
+             return 'areagroup area-' + d;
+           }).merge(areagroup);
+           var paths = areagroup.selectAll('path').filter(filter).data(function (layer) {
+             return data[layer];
+           }, osmEntity.key);
+           paths.exit().remove();
+           var fillpaths = selection.selectAll('.area-fill path.area').nodes();
+           var bisect = d3_bisector(function (node) {
+             return -node.__data__.area(graph);
+           }).left;
+
+           function sortedByArea(entity) {
+             if (this._parent.__data__ === 'fill') {
+               return fillpaths[bisect(fillpaths, -entity.area(graph))];
+             }
+           }
+
+           paths = paths.enter().insert('path', sortedByArea).merge(paths).each(function (entity) {
+             var layer = this.parentNode.__data__;
+             this.setAttribute('class', entity.type + ' area ' + layer + ' ' + entity.id);
+
+             if (layer === 'fill') {
+               this.setAttribute('clip-path', 'url(#ideditor-' + entity.id + '-clippath)');
+               this.style.fill = this.style.stroke = getPatternStyle(entity.tags);
+             }
+           }).classed('added', function (d) {
+             return !base.entities[d.id];
+           }).classed('geometry-edited', function (d) {
+             return graph.entities[d.id] && base.entities[d.id] && !fastDeepEqual(graph.entities[d.id].nodes, base.entities[d.id].nodes);
+           }).classed('retagged', function (d) {
+             return graph.entities[d.id] && base.entities[d.id] && !fastDeepEqual(graph.entities[d.id].tags, base.entities[d.id].tags);
+           }).call(svgTagClasses()).attr('d', path); // Draw touch targets..
+
+           touchLayer.call(drawTargets, graph, data.stroke, filter);
+         }
+
+         return drawAreas;
+       }
+
+       var fastJsonStableStringify = function fastJsonStableStringify(data, opts) {
+         if (!opts) opts = {};
+         if (typeof opts === 'function') opts = {
+           cmp: opts
+         };
+         var cycles = typeof opts.cycles === 'boolean' ? opts.cycles : false;
+
+         var cmp = opts.cmp && function (f) {
+           return function (node) {
+             return function (a, b) {
+               var aobj = {
+                 key: a,
+                 value: node[a]
+               };
+               var bobj = {
+                 key: b,
+                 value: node[b]
+               };
+               return f(aobj, bobj);
+             };
+           };
+         }(opts.cmp);
+
+         var seen = [];
+         return function stringify(node) {
+           if (node && node.toJSON && typeof node.toJSON === 'function') {
+             node = node.toJSON();
+           }
+
+           if (node === undefined) return;
+           if (typeof node == 'number') return isFinite(node) ? '' + node : 'null';
+           if (_typeof(node) !== 'object') return JSON.stringify(node);
+           var i, out;
+
+           if (Array.isArray(node)) {
+             out = '[';
+
+             for (i = 0; i < node.length; i++) {
+               if (i) out += ',';
+               out += stringify(node[i]) || 'null';
+             }
+
+             return out + ']';
+           }
+
+           if (node === null) return 'null';
+
+           if (seen.indexOf(node) !== -1) {
+             if (cycles) return JSON.stringify('__cycle__');
+             throw new TypeError('Converting circular structure to JSON');
+           }
+
+           var seenIndex = seen.push(node) - 1;
+           var keys = Object.keys(node).sort(cmp && cmp(node));
+           out = '';
+
+           for (i = 0; i < keys.length; i++) {
+             var key = keys[i];
+             var value = stringify(node[key]);
+             if (!value) continue;
+             if (out) out += ',';
+             out += JSON.stringify(key) + ':' + value;
+           }
+
+           seen.splice(seenIndex, 1);
+           return '{' + out + '}';
+         }(data);
+       };
+
+       var $$1 = _export;
+       var $entries = objectToArray.entries;
+
+       // `Object.entries` method
+       // https://tc39.es/ecma262/#sec-object.entries
+       $$1({ target: 'Object', stat: true }, {
+         entries: function entries(O) {
+           return $entries(O);
+         }
+       });
+
+       var _marked = /*#__PURE__*/regeneratorRuntime.mark(gpxGen),
+           _marked3 = /*#__PURE__*/regeneratorRuntime.mark(kmlGen);
+
+       // cast array x into numbers
+       // get the content of a text node, if any
+       function nodeVal(x) {
+         if (x && x.normalize) {
+           x.normalize();
+         }
+
+         return x && x.textContent || "";
+       } // one Y child of X, if any, otherwise null
+
+
+       function get1(x, y) {
+         var n = x.getElementsByTagName(y);
+         return n.length ? n[0] : null;
+       }
+
+       function getLineStyle(extensions) {
+         var style = {};
+
+         if (extensions) {
+           var lineStyle = get1(extensions, "line");
+
+           if (lineStyle) {
+             var color = nodeVal(get1(lineStyle, "color")),
+                 opacity = parseFloat(nodeVal(get1(lineStyle, "opacity"))),
+                 width = parseFloat(nodeVal(get1(lineStyle, "width")));
+             if (color) style.stroke = color;
+             if (!isNaN(opacity)) style["stroke-opacity"] = opacity; // GPX width is in mm, convert to px with 96 px per inch
+
+             if (!isNaN(width)) style["stroke-width"] = width * 96 / 25.4;
+           }
+         }
+
+         return style;
+       } // get the contents of multiple text nodes, if present
+
+
+       function getMulti(x, ys) {
+         var o = {};
+         var n;
+         var k;
+
+         for (k = 0; k < ys.length; k++) {
+           n = get1(x, ys[k]);
+           if (n) o[ys[k]] = nodeVal(n);
+         }
+
+         return o;
+       }
+
+       function getProperties$1(node) {
+         var prop = getMulti(node, ["name", "cmt", "desc", "type", "time", "keywords"]); // Parse additional data from our Garmin extension(s)
+
+         var extensions = node.getElementsByTagNameNS("http://www.garmin.com/xmlschemas/GpxExtensions/v3", "*");
+
+         for (var i = 0; i < extensions.length; i++) {
+           var extension = extensions[i]; // Ignore nested extensions, like those on routepoints or trackpoints
+
+           if (extension.parentNode.parentNode === node) {
+             prop[extension.tagName.replace(":", "_")] = nodeVal(extension);
+           }
+         }
+
+         var links = node.getElementsByTagName("link");
+         if (links.length) prop.links = [];
+
+         for (var _i = 0; _i < links.length; _i++) {
+           prop.links.push(Object.assign({
+             href: links[_i].getAttribute("href")
+           }, getMulti(links[_i], ["text", "type"])));
+         }
+
+         return prop;
+       }
+
+       function coordPair$1(x) {
+         var ll = [parseFloat(x.getAttribute("lon")), parseFloat(x.getAttribute("lat"))];
+         var ele = get1(x, "ele"); // handle namespaced attribute in browser
+
+         var heart = get1(x, "gpxtpx:hr") || get1(x, "hr");
+         var time = get1(x, "time");
+         var e;
+
+         if (ele) {
+           e = parseFloat(nodeVal(ele));
+
+           if (!isNaN(e)) {
+             ll.push(e);
+           }
+         }
+
+         var result = {
+           coordinates: ll,
+           time: time ? nodeVal(time) : null,
+           extendedValues: []
+         };
+
+         if (heart) {
+           result.extendedValues.push(["heart", parseFloat(nodeVal(heart))]);
+         }
+
+         var extensions = get1(x, "extensions");
+
+         if (extensions !== null) {
+           for (var _i2 = 0, _arr = ["speed", "course", "hAcc", "vAcc"]; _i2 < _arr.length; _i2++) {
+             var name = _arr[_i2];
+             var v = parseFloat(nodeVal(get1(extensions, name)));
+
+             if (!isNaN(v)) {
+               result.extendedValues.push([name, v]);
+             }
+           }
+         }
+
+         return result;
+       }
+
+       function getRoute(node) {
+         var line = getPoints$1(node, "rtept");
+         if (!line) return;
+         return {
+           type: "Feature",
+           properties: Object.assign(getProperties$1(node), getLineStyle(get1(node, "extensions")), {
+             _gpxType: "rte"
+           }),
+           geometry: {
+             type: "LineString",
+             coordinates: line.line
+           }
+         };
+       }
+
+       function getPoints$1(node, pointname) {
+         var pts = node.getElementsByTagName(pointname);
+         if (pts.length < 2) return; // Invalid line in GeoJSON
+
+         var line = [];
+         var times = [];
+         var extendedValues = {};
+
+         for (var i = 0; i < pts.length; i++) {
+           var c = coordPair$1(pts[i]);
+           line.push(c.coordinates);
+           if (c.time) times.push(c.time);
+
+           for (var j = 0; j < c.extendedValues.length; j++) {
+             var _c$extendedValues$j = _slicedToArray(c.extendedValues[j], 2),
+                 name = _c$extendedValues$j[0],
+                 val = _c$extendedValues$j[1];
+
+             var plural = name === "heart" ? name : name + "s";
+
+             if (!extendedValues[plural]) {
+               extendedValues[plural] = Array(pts.length).fill(null);
+             }
+
+             extendedValues[plural][i] = val;
+           }
+         }
+
+         return {
+           line: line,
+           times: times,
+           extendedValues: extendedValues
+         };
+       }
+
+       function getTrack(node) {
+         var segments = node.getElementsByTagName("trkseg");
+         var track = [];
+         var times = [];
+         var extractedLines = [];
+
+         for (var i = 0; i < segments.length; i++) {
+           var line = getPoints$1(segments[i], "trkpt");
+
+           if (line) {
+             extractedLines.push(line);
+             if (line.times && line.times.length) times.push(line.times);
+           }
+         }
+
+         if (extractedLines.length === 0) return;
+         var multi = extractedLines.length > 1;
+         var properties = Object.assign(getProperties$1(node), getLineStyle(get1(node, "extensions")), {
+           _gpxType: "trk"
+         }, times.length ? {
+           coordinateProperties: {
+             times: multi ? times : times[0]
+           }
+         } : {});
+
+         for (var _i3 = 0; _i3 < extractedLines.length; _i3++) {
+           var _line = extractedLines[_i3];
+           track.push(_line.line);
+
+           for (var _i4 = 0, _Object$entries = Object.entries(_line.extendedValues); _i4 < _Object$entries.length; _i4++) {
+             var _Object$entries$_i = _slicedToArray(_Object$entries[_i4], 2),
+                 name = _Object$entries$_i[0],
+                 val = _Object$entries$_i[1];
+
+             var props = properties;
+
+             if (name === "heart") {
+               if (!properties.coordinateProperties) {
+                 properties.coordinateProperties = {};
+               }
+
+               props = properties.coordinateProperties;
+             }
+
+             if (multi) {
+               if (!props[name]) props[name] = extractedLines.map(function (line) {
+                 return new Array(line.line.length).fill(null);
+               });
+               props[name][_i3] = val;
+             } else {
+               props[name] = val;
+             }
+           }
+         }
+
+         return {
+           type: "Feature",
+           properties: properties,
+           geometry: multi ? {
+             type: "MultiLineString",
+             coordinates: track
+           } : {
+             type: "LineString",
+             coordinates: track[0]
+           }
+         };
+       }
+
+       function getPoint(node) {
+         return {
+           type: "Feature",
+           properties: Object.assign(getProperties$1(node), getMulti(node, ["sym"])),
+           geometry: {
+             type: "Point",
+             coordinates: coordPair$1(node).coordinates
+           }
+         };
+       }
+
+       function gpxGen(doc) {
+         var tracks, routes, waypoints, i, feature, _i5, _feature, _i6;
+
+         return regeneratorRuntime.wrap(function gpxGen$(_context) {
+           while (1) {
+             switch (_context.prev = _context.next) {
+               case 0:
+                 tracks = doc.getElementsByTagName("trk");
+                 routes = doc.getElementsByTagName("rte");
+                 waypoints = doc.getElementsByTagName("wpt");
+                 i = 0;
+
+               case 4:
+                 if (!(i < tracks.length)) {
+                   _context.next = 12;
+                   break;
+                 }
+
+                 feature = getTrack(tracks[i]);
+
+                 if (!feature) {
+                   _context.next = 9;
+                   break;
+                 }
+
+                 _context.next = 9;
+                 return feature;
+
+               case 9:
+                 i++;
+                 _context.next = 4;
+                 break;
+
+               case 12:
+                 _i5 = 0;
+
+               case 13:
+                 if (!(_i5 < routes.length)) {
+                   _context.next = 21;
+                   break;
+                 }
+
+                 _feature = getRoute(routes[_i5]);
+
+                 if (!_feature) {
+                   _context.next = 18;
+                   break;
+                 }
+
+                 _context.next = 18;
+                 return _feature;
+
+               case 18:
+                 _i5++;
+                 _context.next = 13;
+                 break;
+
+               case 21:
+                 _i6 = 0;
+
+               case 22:
+                 if (!(_i6 < waypoints.length)) {
+                   _context.next = 28;
+                   break;
+                 }
+
+                 _context.next = 25;
+                 return getPoint(waypoints[_i6]);
+
+               case 25:
+                 _i6++;
+                 _context.next = 22;
+                 break;
+
+               case 28:
+               case "end":
+                 return _context.stop();
+             }
+           }
+         }, _marked);
+       }
+
+       function gpx(doc) {
+         return {
+           type: "FeatureCollection",
+           features: Array.from(gpxGen(doc))
+         };
+       }
+
+       var removeSpace = /\s*/g;
+       var trimSpace = /^\s*|\s*$/g;
+       var splitSpace = /\s+/; // generate a short, numeric hash of a string
+
+       function okhash(x) {
+         if (!x || !x.length) return 0;
+         var h = 0;
+
+         for (var i = 0; i < x.length; i++) {
+           h = (h << 5) - h + x.charCodeAt(i) | 0;
+         }
+
+         return h;
+       } // get one coordinate from a coordinate array, if any
+
+
+       function coord1(v) {
+         return v.replace(removeSpace, "").split(",").map(parseFloat);
+       } // get all coordinates from a coordinate array as [[],[]]
+
+
+       function coord(v) {
+         return v.replace(trimSpace, "").split(splitSpace).map(coord1);
+       }
+
+       function xml2str(node) {
+         if (node.xml !== undefined) return node.xml;
+
+         if (node.tagName) {
+           var output = node.tagName;
+
+           for (var i = 0; i < node.attributes.length; i++) {
+             output += node.attributes[i].name + node.attributes[i].value;
+           }
+
+           for (var _i9 = 0; _i9 < node.childNodes.length; _i9++) {
+             output += xml2str(node.childNodes[_i9]);
+           }
+
+           return output;
+         }
+
+         if (node.nodeName === "#text") {
+           return (node.nodeValue || node.value || "").trim();
+         }
+
+         if (node.nodeName === "#cdata-section") {
+           return node.nodeValue;
+         }
+
+         return "";
+       }
+
+       var geotypes = ["Polygon", "LineString", "Point", "Track", "gx:Track"];
+
+       function kmlColor(properties, elem, prefix) {
+         var v = nodeVal(get1(elem, "color")) || "";
+         var colorProp = prefix == "stroke" || prefix === "fill" ? prefix : prefix + "-color";
+
+         if (v.substr(0, 1) === "#") {
+           v = v.substr(1);
+         }
+
+         if (v.length === 6 || v.length === 3) {
+           properties[colorProp] = v;
+         } else if (v.length === 8) {
+           properties[prefix + "-opacity"] = parseInt(v.substr(0, 2), 16) / 255;
+           properties[colorProp] = "#" + v.substr(6, 2) + v.substr(4, 2) + v.substr(2, 2);
+         }
+       }
+
+       function numericProperty(properties, elem, source, target) {
+         var val = parseFloat(nodeVal(get1(elem, source)));
+         if (!isNaN(val)) properties[target] = val;
+       }
+
+       function gxCoords(root) {
+         var elems = root.getElementsByTagName("coord");
+         var coords = [];
+         var times = [];
+         if (elems.length === 0) elems = root.getElementsByTagName("gx:coord");
+
+         for (var i = 0; i < elems.length; i++) {
+           coords.push(nodeVal(elems[i]).split(" ").map(parseFloat));
+         }
+
+         var timeElems = root.getElementsByTagName("when");
+
+         for (var j = 0; j < timeElems.length; j++) {
+           times.push(nodeVal(timeElems[j]));
+         }
+
+         return {
+           coords: coords,
+           times: times
+         };
+       }
+
+       function getGeometry(root) {
+         var geomNode;
+         var geomNodes;
+         var i;
+         var j;
+         var k;
+         var geoms = [];
+         var coordTimes = [];
+
+         if (get1(root, "MultiGeometry")) {
+           return getGeometry(get1(root, "MultiGeometry"));
+         }
+
+         if (get1(root, "MultiTrack")) {
+           return getGeometry(get1(root, "MultiTrack"));
+         }
+
+         if (get1(root, "gx:MultiTrack")) {
+           return getGeometry(get1(root, "gx:MultiTrack"));
+         }
+
+         for (i = 0; i < geotypes.length; i++) {
+           geomNodes = root.getElementsByTagName(geotypes[i]);
+
+           if (geomNodes) {
+             for (j = 0; j < geomNodes.length; j++) {
+               geomNode = geomNodes[j];
+
+               if (geotypes[i] === "Point") {
+                 geoms.push({
+                   type: "Point",
+                   coordinates: coord1(nodeVal(get1(geomNode, "coordinates")))
+                 });
+               } else if (geotypes[i] === "LineString") {
+                 geoms.push({
+                   type: "LineString",
+                   coordinates: coord(nodeVal(get1(geomNode, "coordinates")))
+                 });
+               } else if (geotypes[i] === "Polygon") {
+                 var rings = geomNode.getElementsByTagName("LinearRing"),
+                     coords = [];
+
+                 for (k = 0; k < rings.length; k++) {
+                   coords.push(coord(nodeVal(get1(rings[k], "coordinates"))));
+                 }
+
+                 geoms.push({
+                   type: "Polygon",
+                   coordinates: coords
+                 });
+               } else if (geotypes[i] === "Track" || geotypes[i] === "gx:Track") {
+                 var track = gxCoords(geomNode);
+                 geoms.push({
+                   type: "LineString",
+                   coordinates: track.coords
+                 });
+                 if (track.times.length) coordTimes.push(track.times);
+               }
+             }
+           }
+         }
+
+         return {
+           geoms: geoms,
+           coordTimes: coordTimes
+         };
+       }
+
+       function getPlacemark(root, styleIndex, styleMapIndex, styleByHash) {
+         var geomsAndTimes = getGeometry(root);
+         var i;
+         var properties = {};
+         var name = nodeVal(get1(root, "name"));
+         var address = nodeVal(get1(root, "address"));
+         var styleUrl = nodeVal(get1(root, "styleUrl"));
+         var description = nodeVal(get1(root, "description"));
+         var timeSpan = get1(root, "TimeSpan");
+         var timeStamp = get1(root, "TimeStamp");
+         var extendedData = get1(root, "ExtendedData");
+         var iconStyle = get1(root, "IconStyle");
+         var labelStyle = get1(root, "LabelStyle");
+         var lineStyle = get1(root, "LineStyle");
+         var polyStyle = get1(root, "PolyStyle");
+         var visibility = get1(root, "visibility");
+         if (name) properties.name = name;
+         if (address) properties.address = address;
+
+         if (styleUrl) {
+           if (styleUrl[0] !== "#") {
+             styleUrl = "#" + styleUrl;
+           }
+
+           properties.styleUrl = styleUrl;
+
+           if (styleIndex[styleUrl]) {
+             properties.styleHash = styleIndex[styleUrl];
+           }
+
+           if (styleMapIndex[styleUrl]) {
+             properties.styleMapHash = styleMapIndex[styleUrl];
+             properties.styleHash = styleIndex[styleMapIndex[styleUrl].normal];
+           } // Try to populate the lineStyle or polyStyle since we got the style hash
+
+
+           var style = styleByHash[properties.styleHash];
+
+           if (style) {
+             if (!iconStyle) iconStyle = get1(style, "IconStyle");
+             if (!labelStyle) labelStyle = get1(style, "LabelStyle");
+             if (!lineStyle) lineStyle = get1(style, "LineStyle");
+             if (!polyStyle) polyStyle = get1(style, "PolyStyle");
+           }
+         }
+
+         if (description) properties.description = description;
+
+         if (timeSpan) {
+           var begin = nodeVal(get1(timeSpan, "begin"));
+           var end = nodeVal(get1(timeSpan, "end"));
+           properties.timespan = {
+             begin: begin,
+             end: end
+           };
+         }
+
+         if (timeStamp) {
+           properties.timestamp = nodeVal(get1(timeStamp, "when"));
+         }
+
+         if (iconStyle) {
+           kmlColor(properties, iconStyle, "icon");
+           numericProperty(properties, iconStyle, "scale", "icon-scale");
+           numericProperty(properties, iconStyle, "heading", "icon-heading");
+           var hotspot = get1(iconStyle, "hotSpot");
+
+           if (hotspot) {
+             var left = parseFloat(hotspot.getAttribute("x"));
+             var top = parseFloat(hotspot.getAttribute("y"));
+             if (!isNaN(left) && !isNaN(top)) properties["icon-offset"] = [left, top];
+           }
+
+           var icon = get1(iconStyle, "Icon");
+
+           if (icon) {
+             var href = nodeVal(get1(icon, "href"));
+             if (href) properties.icon = href;
+           }
+         }
+
+         if (labelStyle) {
+           kmlColor(properties, labelStyle, "label");
+           numericProperty(properties, labelStyle, "scale", "label-scale");
+         }
+
+         if (lineStyle) {
+           kmlColor(properties, lineStyle, "stroke");
+           numericProperty(properties, lineStyle, "width", "stroke-width");
+         }
+
+         if (polyStyle) {
+           kmlColor(properties, polyStyle, "fill");
+           var fill = nodeVal(get1(polyStyle, "fill"));
+           var outline = nodeVal(get1(polyStyle, "outline"));
+           if (fill) properties["fill-opacity"] = fill === "1" ? properties["fill-opacity"] || 1 : 0;
+           if (outline) properties["stroke-opacity"] = outline === "1" ? properties["stroke-opacity"] || 1 : 0;
+         }
+
+         if (extendedData) {
+           var datas = extendedData.getElementsByTagName("Data"),
+               simpleDatas = extendedData.getElementsByTagName("SimpleData");
+
+           for (i = 0; i < datas.length; i++) {
+             properties[datas[i].getAttribute("name")] = nodeVal(get1(datas[i], "value"));
+           }
+
+           for (i = 0; i < simpleDatas.length; i++) {
+             properties[simpleDatas[i].getAttribute("name")] = nodeVal(simpleDatas[i]);
+           }
+         }
+
+         if (visibility) {
+           properties.visibility = nodeVal(visibility);
+         }
+
+         if (geomsAndTimes.coordTimes.length) {
+           properties.coordinateProperties = {
+             times: geomsAndTimes.coordTimes.length === 1 ? geomsAndTimes.coordTimes[0] : geomsAndTimes.coordTimes
+           };
+         }
+
+         var feature = {
+           type: "Feature",
+           geometry: geomsAndTimes.geoms.length === 0 ? null : geomsAndTimes.geoms.length === 1 ? geomsAndTimes.geoms[0] : {
+             type: "GeometryCollection",
+             geometries: geomsAndTimes.geoms
+           },
+           properties: properties
+         };
+         if (root.getAttribute("id")) feature.id = root.getAttribute("id");
+         return feature;
+       }
+
+       function kmlGen(doc) {
+         var styleIndex, styleByHash, styleMapIndex, placemarks, styles, styleMaps, k, hash, l, pairs, pairsMap, m, j, feature;
+         return regeneratorRuntime.wrap(function kmlGen$(_context3) {
+           while (1) {
+             switch (_context3.prev = _context3.next) {
+               case 0:
+                 // styleindex keeps track of hashed styles in order to match feature
+                 styleIndex = {};
+                 styleByHash = {}; // stylemapindex keeps track of style maps to expose in properties
+
+                 styleMapIndex = {}; // atomic geospatial types supported by KML - MultiGeometry is
+                 // handled separately
+                 // all root placemarks in the file
+
+                 placemarks = doc.getElementsByTagName("Placemark");
+                 styles = doc.getElementsByTagName("Style");
+                 styleMaps = doc.getElementsByTagName("StyleMap");
+
+                 for (k = 0; k < styles.length; k++) {
+                   hash = okhash(xml2str(styles[k])).toString(16);
+                   styleIndex["#" + styles[k].getAttribute("id")] = hash;
+                   styleByHash[hash] = styles[k];
+                 }
+
+                 for (l = 0; l < styleMaps.length; l++) {
+                   styleIndex["#" + styleMaps[l].getAttribute("id")] = okhash(xml2str(styleMaps[l])).toString(16);
+                   pairs = styleMaps[l].getElementsByTagName("Pair");
+                   pairsMap = {};
+
+                   for (m = 0; m < pairs.length; m++) {
+                     pairsMap[nodeVal(get1(pairs[m], "key"))] = nodeVal(get1(pairs[m], "styleUrl"));
+                   }
+
+                   styleMapIndex["#" + styleMaps[l].getAttribute("id")] = pairsMap;
+                 }
+
+                 j = 0;
+
+               case 9:
+                 if (!(j < placemarks.length)) {
+                   _context3.next = 17;
+                   break;
+                 }
+
+                 feature = getPlacemark(placemarks[j], styleIndex, styleMapIndex, styleByHash);
+
+                 if (!feature) {
+                   _context3.next = 14;
+                   break;
+                 }
+
+                 _context3.next = 14;
+                 return feature;
+
+               case 14:
+                 j++;
+                 _context3.next = 9;
+                 break;
+
+               case 17:
+               case "end":
+                 return _context3.stop();
+             }
+           }
+         }, _marked3);
+       }
+
+       function kml(doc) {
+         return {
+           type: "FeatureCollection",
+           features: Array.from(kmlGen(doc))
+         };
+       }
+
+       var _initialized = false;
+       var _enabled = false;
+
+       var _geojson;
+
+       function svgData(projection, context, dispatch) {
+         var throttledRedraw = throttle(function () {
+           dispatch.call('change');
+         }, 1000);
+
+         var _showLabels = true;
+         var detected = utilDetect();
+         var layer = select(null);
+
+         var _vtService;
+
+         var _fileList;
+
+         var _template;
+
+         var _src;
+
+         function init() {
+           if (_initialized) return; // run once
+
+           _geojson = {};
+           _enabled = true;
+
+           function over(d3_event) {
+             d3_event.stopPropagation();
+             d3_event.preventDefault();
+             d3_event.dataTransfer.dropEffect = 'copy';
+           }
+
+           context.container().attr('dropzone', 'copy').on('drop.svgData', function (d3_event) {
+             d3_event.stopPropagation();
+             d3_event.preventDefault();
+             if (!detected.filedrop) return;
+             drawData.fileList(d3_event.dataTransfer.files);
+           }).on('dragenter.svgData', over).on('dragexit.svgData', over).on('dragover.svgData', over);
+           _initialized = true;
+         }
+
+         function getService() {
+           if (services.vectorTile && !_vtService) {
+             _vtService = services.vectorTile;
+
+             _vtService.event.on('loadedData', throttledRedraw);
+           } else if (!services.vectorTile && _vtService) {
+             _vtService = null;
+           }
+
+           return _vtService;
+         }
+
+         function showLayer() {
+           layerOn();
+           layer.style('opacity', 0).transition().duration(250).style('opacity', 1).on('end', function () {
+             dispatch.call('change');
+           });
+         }
+
+         function hideLayer() {
+           throttledRedraw.cancel();
+           layer.transition().duration(250).style('opacity', 0).on('end', layerOff);
+         }
+
+         function layerOn() {
+           layer.style('display', 'block');
+         }
+
+         function layerOff() {
+           layer.selectAll('.viewfield-group').remove();
+           layer.style('display', 'none');
+         } // ensure that all geojson features in a collection have IDs
+
+
+         function ensureIDs(gj) {
+           if (!gj) return null;
+
+           if (gj.type === 'FeatureCollection') {
+             for (var i = 0; i < gj.features.length; i++) {
+               ensureFeatureID(gj.features[i]);
+             }
+           } else {
+             ensureFeatureID(gj);
+           }
+
+           return gj;
+         } // ensure that each single Feature object has a unique ID
+
+
+         function ensureFeatureID(feature) {
+           if (!feature) return;
+           feature.__featurehash__ = utilHashcode(fastJsonStableStringify(feature));
+           return feature;
+         } // Prefer an array of Features instead of a FeatureCollection
+
+
+         function getFeatures(gj) {
+           if (!gj) return [];
+
+           if (gj.type === 'FeatureCollection') {
+             return gj.features;
+           } else {
+             return [gj];
+           }
+         }
+
+         function featureKey(d) {
+           return d.__featurehash__;
+         }
+
+         function isPolygon(d) {
+           return d.geometry.type === 'Polygon' || d.geometry.type === 'MultiPolygon';
+         }
+
+         function clipPathID(d) {
+           return 'ideditor-data-' + d.__featurehash__ + '-clippath';
+         }
+
+         function featureClasses(d) {
+           return ['data' + d.__featurehash__, d.geometry.type, isPolygon(d) ? 'area' : '', d.__layerID__ || ''].filter(Boolean).join(' ');
+         }
+
+         function drawData(selection) {
+           var vtService = getService();
+           var getPath = svgPath(projection).geojson;
+           var getAreaPath = svgPath(projection, null, true).geojson;
+           var hasData = drawData.hasData();
+           layer = selection.selectAll('.layer-mapdata').data(_enabled && hasData ? [0] : []);
+           layer.exit().remove();
+           layer = layer.enter().append('g').attr('class', 'layer-mapdata').merge(layer);
+           var surface = context.surface();
+           if (!surface || surface.empty()) return; // not ready to draw yet, starting up
+           // Gather data
+
+           var geoData, polygonData;
+
+           if (_template && vtService) {
+             // fetch data from vector tile service
+             var sourceID = _template;
+             vtService.loadTiles(sourceID, _template, projection);
+             geoData = vtService.data(sourceID, projection);
+           } else {
+             geoData = getFeatures(_geojson);
+           }
+
+           geoData = geoData.filter(getPath);
+           polygonData = geoData.filter(isPolygon); // Draw clip paths for polygons
+
+           var clipPaths = surface.selectAll('defs').selectAll('.clipPath-data').data(polygonData, featureKey);
+           clipPaths.exit().remove();
+           var clipPathsEnter = clipPaths.enter().append('clipPath').attr('class', 'clipPath-data').attr('id', clipPathID);
+           clipPathsEnter.append('path');
+           clipPaths.merge(clipPathsEnter).selectAll('path').attr('d', getAreaPath); // Draw fill, shadow, stroke layers
+
+           var datagroups = layer.selectAll('g.datagroup').data(['fill', 'shadow', 'stroke']);
+           datagroups = datagroups.enter().append('g').attr('class', function (d) {
+             return 'datagroup datagroup-' + d;
+           }).merge(datagroups); // Draw paths
+
+           var pathData = {
+             fill: polygonData,
+             shadow: geoData,
+             stroke: geoData
+           };
+           var paths = datagroups.selectAll('path').data(function (layer) {
+             return pathData[layer];
+           }, featureKey); // exit
+
+           paths.exit().remove(); // enter/update
+
+           paths = paths.enter().append('path').attr('class', function (d) {
+             var datagroup = this.parentNode.__data__;
+             return 'pathdata ' + datagroup + ' ' + featureClasses(d);
+           }).attr('clip-path', function (d) {
+             var datagroup = this.parentNode.__data__;
+             return datagroup === 'fill' ? 'url(#' + clipPathID(d) + ')' : null;
+           }).merge(paths).attr('d', function (d) {
+             var datagroup = this.parentNode.__data__;
+             return datagroup === 'fill' ? getAreaPath(d) : getPath(d);
+           }); // Draw labels
+
+           layer.call(drawLabels, 'label-halo', geoData).call(drawLabels, 'label', geoData);
+
+           function drawLabels(selection, textClass, data) {
+             var labelPath = d3_geoPath(projection);
+             var labelData = data.filter(function (d) {
+               return _showLabels && d.properties && (d.properties.desc || d.properties.name);
+             });
+             var labels = selection.selectAll('text.' + textClass).data(labelData, featureKey); // exit
+
+             labels.exit().remove(); // enter/update
+
+             labels = labels.enter().append('text').attr('class', function (d) {
+               return textClass + ' ' + featureClasses(d);
+             }).merge(labels).text(function (d) {
+               return d.properties.desc || d.properties.name;
+             }).attr('x', function (d) {
+               var centroid = labelPath.centroid(d);
+               return centroid[0] + 11;
+             }).attr('y', function (d) {
+               var centroid = labelPath.centroid(d);
+               return centroid[1];
+             });
+           }
+         }
+
+         function getExtension(fileName) {
+           if (!fileName) return;
+           var re = /\.(gpx|kml|(geo)?json)$/i;
+           var match = fileName.toLowerCase().match(re);
+           return match && match.length && match[0];
+         }
+
+         function xmlToDom(textdata) {
+           return new DOMParser().parseFromString(textdata, 'text/xml');
+         }
+
+         function stringifyGeojsonProperties(feature) {
+           var properties = feature.properties;
+
+           for (var key in properties) {
+             var property = properties[key];
+
+             if (typeof property === 'number' || typeof property === 'boolean' || Array.isArray(property)) {
+               properties[key] = property.toString();
+             } else if (property === null) {
+               properties[key] = 'null';
+             } else if (_typeof(property) === 'object') {
+               properties[key] = JSON.stringify(property);
+             }
+           }
+         }
+
+         drawData.setFile = function (extension, data) {
+           _template = null;
+           _fileList = null;
+           _geojson = null;
+           _src = null;
+           var gj;
+
+           switch (extension) {
+             case '.gpx':
+               gj = gpx(xmlToDom(data));
+               break;
+
+             case '.kml':
+               gj = kml(xmlToDom(data));
+               break;
+
+             case '.geojson':
+             case '.json':
+               gj = JSON.parse(data);
+
+               if (gj.type === 'FeatureCollection') {
+                 gj.features.forEach(stringifyGeojsonProperties);
+               } else if (gj.type === 'Feature') {
+                 stringifyGeojsonProperties(gj);
+               }
+
+               break;
+           }
+
+           gj = gj || {};
+
+           if (Object.keys(gj).length) {
+             _geojson = ensureIDs(gj);
+             _src = extension + ' data file';
+             this.fitZoom();
+           }
+
+           dispatch.call('change');
+           return this;
+         };
+
+         drawData.showLabels = function (val) {
+           if (!arguments.length) return _showLabels;
+           _showLabels = val;
+           return this;
+         };
+
+         drawData.enabled = function (val) {
+           if (!arguments.length) return _enabled;
+           _enabled = val;
+
+           if (_enabled) {
+             showLayer();
+           } else {
+             hideLayer();
+           }
+
+           dispatch.call('change');
+           return this;
+         };
+
+         drawData.hasData = function () {
+           var gj = _geojson || {};
+           return !!(_template || Object.keys(gj).length);
+         };
+
+         drawData.template = function (val, src) {
+           if (!arguments.length) return _template; // test source against OSM imagery blocklists..
+
+           var osm = context.connection();
+
+           if (osm) {
+             var blocklists = osm.imageryBlocklists();
+             var fail = false;
+             var tested = 0;
+             var regex;
+
+             for (var i = 0; i < blocklists.length; i++) {
+               regex = blocklists[i];
+               fail = regex.test(val);
+               tested++;
+               if (fail) break;
+             } // ensure at least one test was run.
+
+
+             if (!tested) {
+               regex = /.*\.google(apis)?\..*\/(vt|kh)[\?\/].*([xyz]=.*){3}.*/;
+               fail = regex.test(val);
+             }
+           }
+
+           _template = val;
+           _fileList = null;
+           _geojson = null; // strip off the querystring/hash from the template,
+           // it often includes the access token
+
+           _src = src || 'vectortile:' + val.split(/[?#]/)[0];
+           dispatch.call('change');
+           return this;
+         };
+
+         drawData.geojson = function (gj, src) {
+           if (!arguments.length) return _geojson;
+           _template = null;
+           _fileList = null;
+           _geojson = null;
+           _src = null;
+           gj = gj || {};
+
+           if (Object.keys(gj).length) {
+             _geojson = ensureIDs(gj);
+             _src = src || 'unknown.geojson';
+           }
+
+           dispatch.call('change');
+           return this;
+         };
+
+         drawData.fileList = function (fileList) {
+           if (!arguments.length) return _fileList;
+           _template = null;
+           _fileList = fileList;
+           _geojson = null;
+           _src = null;
+           if (!fileList || !fileList.length) return this;
+           var f = fileList[0];
+           var extension = getExtension(f.name);
+           var reader = new FileReader();
+
+           reader.onload = function () {
+             return function (e) {
+               drawData.setFile(extension, e.target.result);
+             };
+           }();
+
+           reader.readAsText(f);
+           return this;
+         };
+
+         drawData.url = function (url, defaultExtension) {
+           _template = null;
+           _fileList = null;
+           _geojson = null;
+           _src = null; // strip off any querystring/hash from the url before checking extension
+
+           var testUrl = url.split(/[?#]/)[0];
+           var extension = getExtension(testUrl) || defaultExtension;
+
+           if (extension) {
+             _template = null;
+             d3_text(url).then(function (data) {
+               drawData.setFile(extension, data);
+             })["catch"](function () {
+               /* ignore */
+             });
+           } else {
+             drawData.template(url);
+           }
+
+           return this;
+         };
+
+         drawData.getSrc = function () {
+           return _src || '';
+         };
+
+         drawData.fitZoom = function () {
+           var features = getFeatures(_geojson);
+           if (!features.length) return;
+           var map = context.map();
+           var viewport = map.trimmedExtent().polygon();
+           var coords = features.reduce(function (coords, feature) {
+             var geom = feature.geometry;
+             if (!geom) return coords;
+             var c = geom.coordinates;
+             /* eslint-disable no-fallthrough */
+
+             switch (geom.type) {
+               case 'Point':
+                 c = [c];
+
+               case 'MultiPoint':
+               case 'LineString':
+                 break;
+
+               case 'MultiPolygon':
+                 c = utilArrayFlatten(c);
+
+               case 'Polygon':
+               case 'MultiLineString':
+                 c = utilArrayFlatten(c);
+                 break;
+             }
+             /* eslint-enable no-fallthrough */
+
+
+             return utilArrayUnion(coords, c);
+           }, []);
+
+           if (!geoPolygonIntersectsPolygon(viewport, coords, true)) {
+             var extent = geoExtent(d3_geoBounds({
+               type: 'LineString',
+               coordinates: coords
+             }));
+             map.centerZoom(extent.center(), map.trimmedExtentZoom(extent));
+           }
+
+           return this;
+         };
+
+         init();
+         return drawData;
+       }
+
+       function svgDebug(projection, context) {
+         function drawDebug(selection) {
+           var showTile = context.getDebug('tile');
+           var showCollision = context.getDebug('collision');
+           var showImagery = context.getDebug('imagery');
+           var showTouchTargets = context.getDebug('target');
+           var showDownloaded = context.getDebug('downloaded');
+           var debugData = [];
+
+           if (showTile) {
+             debugData.push({
+               "class": 'red',
+               label: 'tile'
+             });
+           }
+
+           if (showCollision) {
+             debugData.push({
+               "class": 'yellow',
+               label: 'collision'
+             });
+           }
+
+           if (showImagery) {
+             debugData.push({
+               "class": 'orange',
+               label: 'imagery'
+             });
+           }
+
+           if (showTouchTargets) {
+             debugData.push({
+               "class": 'pink',
+               label: 'touchTargets'
+             });
+           }
+
+           if (showDownloaded) {
+             debugData.push({
+               "class": 'purple',
+               label: 'downloaded'
+             });
+           }
+
+           var legend = context.container().select('.main-content').selectAll('.debug-legend').data(debugData.length ? [0] : []);
+           legend.exit().remove();
+           legend = legend.enter().append('div').attr('class', 'fillD debug-legend').merge(legend);
+           var legendItems = legend.selectAll('.debug-legend-item').data(debugData, function (d) {
+             return d.label;
+           });
+           legendItems.exit().remove();
+           legendItems.enter().append('span').attr('class', function (d) {
+             return "debug-legend-item ".concat(d["class"]);
+           }).text(function (d) {
+             return d.label;
+           });
+           var layer = selection.selectAll('.layer-debug').data(showImagery || showDownloaded ? [0] : []);
+           layer.exit().remove();
+           layer = layer.enter().append('g').attr('class', 'layer-debug').merge(layer); // imagery
+
+           var extent = context.map().extent();
+           _mainFileFetcher.get('imagery').then(function (d) {
+             var hits = showImagery && d.query.bbox(extent.rectangle(), true) || [];
+             var features = hits.map(function (d) {
+               return d.features[d.id];
+             });
+             var imagery = layer.selectAll('path.debug-imagery').data(features);
+             imagery.exit().remove();
+             imagery.enter().append('path').attr('class', 'debug-imagery debug orange');
+           })["catch"](function () {
+             /* ignore */
+           }); // downloaded
+
+           var osm = context.connection();
+           var dataDownloaded = [];
+
+           if (osm && showDownloaded) {
+             var rtree = osm.caches('get').tile.rtree;
+             dataDownloaded = rtree.all().map(function (bbox) {
+               return {
+                 type: 'Feature',
+                 properties: {
+                   id: bbox.id
+                 },
+                 geometry: {
+                   type: 'Polygon',
+                   coordinates: [[[bbox.minX, bbox.minY], [bbox.minX, bbox.maxY], [bbox.maxX, bbox.maxY], [bbox.maxX, bbox.minY], [bbox.minX, bbox.minY]]]
+                 }
+               };
+             });
+           }
+
+           var downloaded = layer.selectAll('path.debug-downloaded').data(showDownloaded ? dataDownloaded : []);
+           downloaded.exit().remove();
+           downloaded.enter().append('path').attr('class', 'debug-downloaded debug purple'); // update
+
+           layer.selectAll('path').attr('d', svgPath(projection).geojson);
+         } // This looks strange because `enabled` methods on other layers are
+         // chainable getter/setters, and this one is just a getter.
+
+
+         drawDebug.enabled = function () {
+           if (!arguments.length) {
+             return context.getDebug('tile') || context.getDebug('collision') || context.getDebug('imagery') || context.getDebug('target') || context.getDebug('downloaded');
+           } else {
+             return this;
+           }
+         };
+
+         return drawDebug;
+       }
+
+       /*
+           A standalone SVG element that contains only a `defs` sub-element. To be
+           used once globally, since defs IDs must be unique within a document.
+       */
+
+       function svgDefs(context) {
+         var _defsSelection = select(null);
+
+         var _spritesheetIds = ['iD-sprite', 'maki-sprite', 'temaki-sprite', 'fa-sprite', 'community-sprite'];
+
+         function drawDefs(selection) {
+           _defsSelection = selection.append('defs'); // add markers
+
+           _defsSelection.append('marker').attr('id', 'ideditor-oneway-marker').attr('viewBox', '0 0 10 5').attr('refX', 2.5).attr('refY', 2.5).attr('markerWidth', 2).attr('markerHeight', 2).attr('markerUnits', 'strokeWidth').attr('orient', 'auto').append('path').attr('class', 'oneway-marker-path').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').attr('stroke', 'none').attr('fill', '#000').attr('opacity', '0.75'); // SVG markers have to be given a colour where they're defined
+           // (they can't inherit it from the line they're attached to),
+           // so we need to manually define markers for each color of tag
+           // (also, it's slightly nicer if we can control the
+           // positioning for different tags)
+
+
+           function addSidedMarker(name, color, offset) {
+             _defsSelection.append('marker').attr('id', 'ideditor-sided-marker-' + name).attr('viewBox', '0 0 2 2').attr('refX', 1).attr('refY', -offset).attr('markerWidth', 1.5).attr('markerHeight', 1.5).attr('markerUnits', 'strokeWidth').attr('orient', 'auto').append('path').attr('class', 'sided-marker-path sided-marker-' + name + '-path').attr('d', 'M 0,0 L 1,1 L 2,0 z').attr('stroke', 'none').attr('fill', color);
+           }
+
+           addSidedMarker('natural', 'rgb(170, 170, 170)', 0); // for a coastline, the arrows are (somewhat unintuitively) on
+           // the water side, so let's color them blue (with a gap) to
+           // give a stronger indication
+
+           addSidedMarker('coastline', '#77dede', 1);
+           addSidedMarker('waterway', '#77dede', 1); // barriers have a dashed line, and separating the triangle
+           // from the line visually suits that
+
+           addSidedMarker('barrier', '#ddd', 1);
+           addSidedMarker('man_made', '#fff', 0);
+
+           _defsSelection.append('marker').attr('id', 'ideditor-viewfield-marker').attr('viewBox', '0 0 16 16').attr('refX', 8).attr('refY', 16).attr('markerWidth', 4).attr('markerHeight', 4).attr('markerUnits', 'strokeWidth').attr('orient', 'auto').append('path').attr('class', 'viewfield-marker-path').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').attr('fill', '#333').attr('fill-opacity', '0.75').attr('stroke', '#fff').attr('stroke-width', '0.5px').attr('stroke-opacity', '0.75');
+
+           _defsSelection.append('marker').attr('id', 'ideditor-viewfield-marker-wireframe').attr('viewBox', '0 0 16 16').attr('refX', 8).attr('refY', 16).attr('markerWidth', 4).attr('markerHeight', 4).attr('markerUnits', 'strokeWidth').attr('orient', 'auto').append('path').attr('class', 'viewfield-marker-path').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').attr('fill', 'none').attr('stroke', '#fff').attr('stroke-width', '0.5px').attr('stroke-opacity', '0.75'); // add patterns
+
+
+           var patterns = _defsSelection.selectAll('pattern').data([// pattern name, pattern image name
+           ['beach', 'dots'], ['construction', 'construction'], ['cemetery', 'cemetery'], ['cemetery_christian', 'cemetery_christian'], ['cemetery_buddhist', 'cemetery_buddhist'], ['cemetery_muslim', 'cemetery_muslim'], ['cemetery_jewish', 'cemetery_jewish'], ['farmland', 'farmland'], ['farmyard', 'farmyard'], ['forest', 'forest'], ['forest_broadleaved', 'forest_broadleaved'], ['forest_needleleaved', 'forest_needleleaved'], ['forest_leafless', 'forest_leafless'], ['golf_green', 'grass'], ['grass', 'grass'], ['landfill', 'landfill'], ['meadow', 'grass'], ['orchard', 'orchard'], ['pond', 'pond'], ['quarry', 'quarry'], ['scrub', 'bushes'], ['vineyard', 'vineyard'], ['water_standing', 'lines'], ['waves', 'waves'], ['wetland', 'wetland'], ['wetland_marsh', 'wetland_marsh'], ['wetland_swamp', 'wetland_swamp'], ['wetland_bog', 'wetland_bog'], ['wetland_reedbed', 'wetland_reedbed']]).enter().append('pattern').attr('id', function (d) {
+             return 'ideditor-pattern-' + d[0];
+           }).attr('width', 32).attr('height', 32).attr('patternUnits', 'userSpaceOnUse');
+
+           patterns.append('rect').attr('x', 0).attr('y', 0).attr('width', 32).attr('height', 32).attr('class', function (d) {
+             return 'pattern-color-' + d[0];
+           });
+           patterns.append('image').attr('x', 0).attr('y', 0).attr('width', 32).attr('height', 32).attr('xlink:href', function (d) {
+             return context.imagePath('pattern/' + d[1] + '.png');
+           }); // add clip paths
+
+           _defsSelection.selectAll('clipPath').data([12, 18, 20, 32, 45]).enter().append('clipPath').attr('id', function (d) {
+             return 'ideditor-clip-square-' + d;
+           }).append('rect').attr('x', 0).attr('y', 0).attr('width', function (d) {
+             return d;
+           }).attr('height', function (d) {
+             return d;
+           }); // add symbol spritesheets
+
+
+           addSprites(_spritesheetIds, true);
+         }
+
+         function addSprites(ids, overrideColors) {
+           _spritesheetIds = utilArrayUniq(_spritesheetIds.concat(ids));
+
+           var spritesheets = _defsSelection.selectAll('.spritesheet').data(_spritesheetIds);
+
+           spritesheets.enter().append('g').attr('class', function (d) {
+             return 'spritesheet spritesheet-' + d;
+           }).each(function (d) {
+             var url = context.imagePath(d + '.svg');
+             var node = select(this).node();
+             svg(url).then(function (svg) {
+               node.appendChild(select(svg.documentElement).attr('id', 'ideditor-' + d).node());
+
+               if (overrideColors && d !== 'iD-sprite') {
+                 // allow icon colors to be overridden..
+                 select(node).selectAll('path').attr('fill', 'currentColor');
+               }
+             })["catch"](function () {
+               /* ignore */
+             });
+           });
+           spritesheets.exit().remove();
+         }
+
+         drawDefs.addSprites = addSprites;
+         return drawDefs;
+       }
+
+       var _layerEnabled$2 = false;
+
+       var _qaService$2;
+
+       function svgKeepRight(projection, context, dispatch) {
+         var throttledRedraw = throttle(function () {
+           return dispatch.call('change');
+         }, 1000);
+
+         var minZoom = 12;
+         var touchLayer = select(null);
+         var drawLayer = select(null);
+         var layerVisible = false;
+
+         function markerPath(selection, klass) {
+           selection.attr('class', klass).attr('transform', 'translate(-4, -24)').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');
+         } // Loosely-coupled keepRight service for fetching issues.
+
+
+         function getService() {
+           if (services.keepRight && !_qaService$2) {
+             _qaService$2 = services.keepRight;
+
+             _qaService$2.on('loaded', throttledRedraw);
+           } else if (!services.keepRight && _qaService$2) {
+             _qaService$2 = null;
+           }
+
+           return _qaService$2;
+         } // Show the markers
+
+
+         function editOn() {
+           if (!layerVisible) {
+             layerVisible = true;
+             drawLayer.style('display', 'block');
+           }
+         } // Immediately remove the markers and their touch targets
+
+
+         function editOff() {
+           if (layerVisible) {
+             layerVisible = false;
+             drawLayer.style('display', 'none');
+             drawLayer.selectAll('.qaItem.keepRight').remove();
+             touchLayer.selectAll('.qaItem.keepRight').remove();
+           }
+         } // Enable the layer.  This shows the markers and transitions them to visible.
+
+
+         function layerOn() {
+           editOn();
+           drawLayer.style('opacity', 0).transition().duration(250).style('opacity', 1).on('end interrupt', function () {
+             return dispatch.call('change');
+           });
+         } // Disable the layer.  This transitions the layer invisible and then hides the markers.
+
+
+         function layerOff() {
+           throttledRedraw.cancel();
+           drawLayer.interrupt();
+           touchLayer.selectAll('.qaItem.keepRight').remove();
+           drawLayer.transition().duration(250).style('opacity', 0).on('end interrupt', function () {
+             editOff();
+             dispatch.call('change');
+           });
+         } // Update the issue markers
+
+
+         function updateMarkers() {
+           if (!layerVisible || !_layerEnabled$2) return;
+           var service = getService();
+           var selectedID = context.selectedErrorID();
+           var data = service ? service.getItems(projection) : [];
+           var getTransform = svgPointTransform(projection); // Draw markers..
+
+           var markers = drawLayer.selectAll('.qaItem.keepRight').data(data, function (d) {
+             return d.id;
+           }); // exit
+
+           markers.exit().remove(); // enter
+
+           var markersEnter = markers.enter().append('g').attr('class', function (d) {
+             return "qaItem ".concat(d.service, " itemId-").concat(d.id, " itemType-").concat(d.parentIssueType);
+           });
+           markersEnter.append('ellipse').attr('cx', 0.5).attr('cy', 1).attr('rx', 6.5).attr('ry', 3).attr('class', 'stroke');
+           markersEnter.append('path').call(markerPath, 'shadow');
+           markersEnter.append('use').attr('class', 'qaItem-fill').attr('width', '20px').attr('height', '20px').attr('x', '-8px').attr('y', '-22px').attr('xlink:href', '#iD-icon-bolt'); // update
+
+           markers.merge(markersEnter).sort(sortY).classed('selected', function (d) {
+             return d.id === selectedID;
+           }).attr('transform', getTransform); // Draw targets..
+
+           if (touchLayer.empty()) return;
+           var fillClass = context.getDebug('target') ? 'pink ' : 'nocolor ';
+           var targets = touchLayer.selectAll('.qaItem.keepRight').data(data, function (d) {
+             return d.id;
+           }); // exit
+
+           targets.exit().remove(); // enter/update
+
+           targets.enter().append('rect').attr('width', '20px').attr('height', '20px').attr('x', '-8px').attr('y', '-22px').merge(targets).sort(sortY).attr('class', function (d) {
+             return "qaItem ".concat(d.service, " target ").concat(fillClass, " itemId-").concat(d.id);
+           }).attr('transform', getTransform);
+
+           function sortY(a, b) {
+             return a.id === selectedID ? 1 : b.id === selectedID ? -1 : a.severity === 'error' && b.severity !== 'error' ? 1 : b.severity === 'error' && a.severity !== 'error' ? -1 : b.loc[1] - a.loc[1];
+           }
+         } // Draw the keepRight layer and schedule loading issues and updating markers.
+
+
+         function drawKeepRight(selection) {
+           var service = getService();
+           var surface = context.surface();
+
+           if (surface && !surface.empty()) {
+             touchLayer = surface.selectAll('.data-layer.touch .layer-touch.markers');
+           }
+
+           drawLayer = selection.selectAll('.layer-keepRight').data(service ? [0] : []);
+           drawLayer.exit().remove();
+           drawLayer = drawLayer.enter().append('g').attr('class', 'layer-keepRight').style('display', _layerEnabled$2 ? 'block' : 'none').merge(drawLayer);
+
+           if (_layerEnabled$2) {
+             if (service && ~~context.map().zoom() >= minZoom) {
+               editOn();
+               service.loadIssues(projection);
+               updateMarkers();
+             } else {
+               editOff();
+             }
+           }
+         } // Toggles the layer on and off
+
+
+         drawKeepRight.enabled = function (val) {
+           if (!arguments.length) return _layerEnabled$2;
+           _layerEnabled$2 = val;
+
+           if (_layerEnabled$2) {
+             layerOn();
+           } else {
+             layerOff();
+
+             if (context.selectedErrorID()) {
+               context.enter(modeBrowse(context));
+             }
+           }
+
+           dispatch.call('change');
+           return this;
+         };
+
+         drawKeepRight.supported = function () {
+           return !!getService();
+         };
+
+         return drawKeepRight;
+       }
+
+       function svgGeolocate(projection) {
+         var layer = select(null);
+
+         var _position;
+
+         function init() {
+           if (svgGeolocate.initialized) return; // run once
+
+           svgGeolocate.enabled = false;
+           svgGeolocate.initialized = true;
+         }
+
+         function showLayer() {
+           layer.style('display', 'block');
+         }
+
+         function hideLayer() {
+           layer.transition().duration(250).style('opacity', 0);
+         }
+
+         function layerOn() {
+           layer.style('opacity', 0).transition().duration(250).style('opacity', 1);
+         }
+
+         function layerOff() {
+           layer.style('display', 'none');
+         }
+
+         function transform(d) {
+           return svgPointTransform(projection)(d);
+         }
+
+         function accuracy(accuracy, loc) {
+           // converts accuracy to pixels...
+           var degreesRadius = geoMetersToLat(accuracy),
+               tangentLoc = [loc[0], loc[1] + degreesRadius],
+               projectedTangent = projection(tangentLoc),
+               projectedLoc = projection([loc[0], loc[1]]); // southern most point will have higher pixel value...
+
+           return Math.round(projectedLoc[1] - projectedTangent[1]).toString();
+         }
+
+         function update() {
+           var geolocation = {
+             loc: [_position.coords.longitude, _position.coords.latitude]
+           };
+           var groups = layer.selectAll('.geolocations').selectAll('.geolocation').data([geolocation]);
+           groups.exit().remove();
+           var pointsEnter = groups.enter().append('g').attr('class', 'geolocation');
+           pointsEnter.append('circle').attr('class', 'geolocate-radius').attr('dx', '0').attr('dy', '0').attr('fill', 'rgb(15,128,225)').attr('fill-opacity', '0.3').attr('r', '0');
+           pointsEnter.append('circle').attr('dx', '0').attr('dy', '0').attr('fill', 'rgb(15,128,225)').attr('stroke', 'white').attr('stroke-width', '1.5').attr('r', '6');
+           groups.merge(pointsEnter).attr('transform', transform);
+           layer.select('.geolocate-radius').attr('r', accuracy(_position.coords.accuracy, geolocation.loc));
+         }
+
+         function drawLocation(selection) {
+           var enabled = svgGeolocate.enabled;
+           layer = selection.selectAll('.layer-geolocate').data([0]);
+           layer.exit().remove();
+           var layerEnter = layer.enter().append('g').attr('class', 'layer-geolocate').style('display', enabled ? 'block' : 'none');
+           layerEnter.append('g').attr('class', 'geolocations');
+           layer = layerEnter.merge(layer);
+
+           if (enabled) {
+             update();
+           } else {
+             layerOff();
+           }
+         }
+
+         drawLocation.enabled = function (position, enabled) {
+           if (!arguments.length) return svgGeolocate.enabled;
+           _position = position;
+           svgGeolocate.enabled = enabled;
+
+           if (svgGeolocate.enabled) {
+             showLayer();
+             layerOn();
+           } else {
+             hideLayer();
+           }
+
+           return this;
+         };
+
+         init();
+         return drawLocation;
+       }
+
+       function svgLabels(projection, context) {
+         var path = d3_geoPath(projection);
+         var detected = utilDetect();
+         var baselineHack = detected.ie || detected.browser.toLowerCase() === 'edge' || detected.browser.toLowerCase() === 'firefox' && detected.version >= 70;
+
+         var _rdrawn = new RBush();
+
+         var _rskipped = new RBush();
+
+         var _textWidthCache = {};
+         var _entitybboxes = {}; // Listed from highest to lowest priority
+
+         var labelStack = [['line', 'aeroway', '*', 12], ['line', 'highway', 'motorway', 12], ['line', 'highway', 'trunk', 12], ['line', 'highway', 'primary', 12], ['line', 'highway', 'secondary', 12], ['line', 'highway', 'tertiary', 12], ['line', 'highway', '*', 12], ['line', 'railway', '*', 12], ['line', 'waterway', '*', 12], ['area', 'aeroway', '*', 12], ['area', 'amenity', '*', 12], ['area', 'building', '*', 12], ['area', 'historic', '*', 12], ['area', 'leisure', '*', 12], ['area', 'man_made', '*', 12], ['area', 'natural', '*', 12], ['area', 'shop', '*', 12], ['area', 'tourism', '*', 12], ['area', 'camp_site', '*', 12], ['point', 'aeroway', '*', 10], ['point', 'amenity', '*', 10], ['point', 'building', '*', 10], ['point', 'historic', '*', 10], ['point', 'leisure', '*', 10], ['point', 'man_made', '*', 10], ['point', 'natural', '*', 10], ['point', 'shop', '*', 10], ['point', 'tourism', '*', 10], ['point', 'camp_site', '*', 10], ['line', 'name', '*', 12], ['area', 'name', '*', 12], ['point', 'name', '*', 10]];
+
+         function shouldSkipIcon(preset) {
+           var noIcons = ['building', 'landuse', 'natural'];
+           return noIcons.some(function (s) {
+             return preset.id.indexOf(s) >= 0;
+           });
+         }
+
+         function get(array, prop) {
+           return function (d, i) {
+             return array[i][prop];
+           };
+         }
+
+         function textWidth(text, size, elem) {
+           var c = _textWidthCache[size];
+           if (!c) c = _textWidthCache[size] = {};
+
+           if (c[text]) {
+             return c[text];
+           } else if (elem) {
+             c[text] = elem.getComputedTextLength();
+             return c[text];
+           } else {
+             var str = encodeURIComponent(text).match(/%[CDEFcdef]/g);
+
+             if (str === null) {
+               return size / 3 * 2 * text.length;
+             } else {
+               return size / 3 * (2 * text.length + str.length);
+             }
+           }
+         }
+
+         function drawLinePaths(selection, entities, filter, classes, labels) {
+           var paths = selection.selectAll('path').filter(filter).data(entities, osmEntity.key); // exit
+
+           paths.exit().remove(); // enter/update
+
+           paths.enter().append('path').style('stroke-width', get(labels, 'font-size')).attr('id', function (d) {
+             return 'ideditor-labelpath-' + d.id;
+           }).attr('class', classes).merge(paths).attr('d', get(labels, 'lineString'));
+         }
+
+         function drawLineLabels(selection, entities, filter, classes, labels) {
+           var texts = selection.selectAll('text.' + classes).filter(filter).data(entities, osmEntity.key); // exit
+
+           texts.exit().remove(); // enter
+
+           texts.enter().append('text').attr('class', function (d, i) {
+             return classes + ' ' + labels[i].classes + ' ' + d.id;
+           }).attr('dy', baselineHack ? '0.35em' : null).append('textPath').attr('class', 'textpath'); // update
+
+           selection.selectAll('text.' + classes).selectAll('.textpath').filter(filter).data(entities, osmEntity.key).attr('startOffset', '50%').attr('xlink:href', function (d) {
+             return '#ideditor-labelpath-' + d.id;
+           }).text(utilDisplayNameForPath);
+         }
+
+         function drawPointLabels(selection, entities, filter, classes, labels) {
+           var texts = selection.selectAll('text.' + classes).filter(filter).data(entities, osmEntity.key); // exit
+
+           texts.exit().remove(); // enter/update
+
+           texts.enter().append('text').attr('class', function (d, i) {
+             return classes + ' ' + labels[i].classes + ' ' + d.id;
+           }).merge(texts).attr('x', get(labels, 'x')).attr('y', get(labels, 'y')).style('text-anchor', get(labels, 'textAnchor')).text(utilDisplayName).each(function (d, i) {
+             textWidth(utilDisplayName(d), labels[i].height, this);
+           });
+         }
+
+         function drawAreaLabels(selection, entities, filter, classes, labels) {
+           entities = entities.filter(hasText);
+           labels = labels.filter(hasText);
+           drawPointLabels(selection, entities, filter, classes, labels);
+
+           function hasText(d, i) {
+             return labels[i].hasOwnProperty('x') && labels[i].hasOwnProperty('y');
+           }
+         }
+
+         function drawAreaIcons(selection, entities, filter, classes, labels) {
+           var icons = selection.selectAll('use.' + classes).filter(filter).data(entities, osmEntity.key); // exit
+
+           icons.exit().remove(); // enter/update
+
+           icons.enter().append('use').attr('class', 'icon ' + classes).attr('width', '17px').attr('height', '17px').merge(icons).attr('transform', get(labels, 'transform')).attr('xlink:href', function (d) {
+             var preset = _mainPresetIndex.match(d, context.graph());
+             var picon = preset && preset.icon;
+
+             if (!picon) {
+               return '';
+             } else {
+               var isMaki = /^maki-/.test(picon);
+               return '#' + picon + (isMaki ? '-15' : '');
+             }
+           });
+         }
+
+         function drawCollisionBoxes(selection, rtree, which) {
+           var classes = 'debug ' + which + ' ' + (which === 'debug-skipped' ? 'orange' : 'yellow');
+           var gj = [];
+
+           if (context.getDebug('collision')) {
+             gj = rtree.all().map(function (d) {
+               return {
+                 type: 'Polygon',
+                 coordinates: [[[d.minX, d.minY], [d.maxX, d.minY], [d.maxX, d.maxY], [d.minX, d.maxY], [d.minX, d.minY]]]
+               };
+             });
+           }
+
+           var boxes = selection.selectAll('.' + which).data(gj); // exit
+
+           boxes.exit().remove(); // enter/update
+
+           boxes.enter().append('path').attr('class', classes).merge(boxes).attr('d', d3_geoPath());
+         }
+
+         function drawLabels(selection, graph, entities, filter, dimensions, fullRedraw) {
+           var wireframe = context.surface().classed('fill-wireframe');
+           var zoom = geoScaleToZoom(projection.scale());
+           var labelable = [];
+           var renderNodeAs = {};
+           var i, j, k, entity, geometry;
+
+           for (i = 0; i < labelStack.length; i++) {
+             labelable.push([]);
+           }
+
+           if (fullRedraw) {
+             _rdrawn.clear();
+
+             _rskipped.clear();
+
+             _entitybboxes = {};
+           } else {
+             for (i = 0; i < entities.length; i++) {
+               entity = entities[i];
+               var toRemove = [].concat(_entitybboxes[entity.id] || []).concat(_entitybboxes[entity.id + 'I'] || []);
+
+               for (j = 0; j < toRemove.length; j++) {
+                 _rdrawn.remove(toRemove[j]);
+
+                 _rskipped.remove(toRemove[j]);
+               }
+             }
+           } // Loop through all the entities to do some preprocessing
+
+
+           for (i = 0; i < entities.length; i++) {
+             entity = entities[i];
+             geometry = entity.geometry(graph); // Insert collision boxes around interesting points/vertices
+
+             if (geometry === 'point' || geometry === 'vertex' && isInterestingVertex(entity)) {
+               var hasDirections = entity.directions(graph, projection).length;
+               var markerPadding;
+
+               if (!wireframe && geometry === 'point' && !(zoom >= 18 && hasDirections)) {
+                 renderNodeAs[entity.id] = 'point';
+                 markerPadding = 20; // extra y for marker height
+               } else {
+                 renderNodeAs[entity.id] = 'vertex';
+                 markerPadding = 0;
+               }
+
+               var coord = projection(entity.loc);
+               var nodePadding = 10;
+               var bbox = {
+                 minX: coord[0] - nodePadding,
+                 minY: coord[1] - nodePadding - markerPadding,
+                 maxX: coord[0] + nodePadding,
+                 maxY: coord[1] + nodePadding
+               };
+               doInsert(bbox, entity.id + 'P');
+             } // From here on, treat vertices like points
+
+
+             if (geometry === 'vertex') {
+               geometry = 'point';
+             } // Determine which entities are label-able
+
+
+             var preset = geometry === 'area' && _mainPresetIndex.match(entity, graph);
+             var icon = preset && !shouldSkipIcon(preset) && preset.icon;
+             if (!icon && !utilDisplayName(entity)) continue;
+
+             for (k = 0; k < labelStack.length; k++) {
+               var matchGeom = labelStack[k][0];
+               var matchKey = labelStack[k][1];
+               var matchVal = labelStack[k][2];
+               var hasVal = entity.tags[matchKey];
+
+               if (geometry === matchGeom && hasVal && (matchVal === '*' || matchVal === hasVal)) {
+                 labelable[k].push(entity);
+                 break;
+               }
+             }
+           }
+
+           var positions = {
+             point: [],
+             line: [],
+             area: []
+           };
+           var labelled = {
+             point: [],
+             line: [],
+             area: []
+           }; // Try and find a valid label for labellable entities
+
+           for (k = 0; k < labelable.length; k++) {
+             var fontSize = labelStack[k][3];
+
+             for (i = 0; i < labelable[k].length; i++) {
+               entity = labelable[k][i];
+               geometry = entity.geometry(graph);
+               var getName = geometry === 'line' ? utilDisplayNameForPath : utilDisplayName;
+               var name = getName(entity);
+               var width = name && textWidth(name, fontSize);
+               var p = null;
+
+               if (geometry === 'point' || geometry === 'vertex') {
+                 // no point or vertex labels in wireframe mode
+                 // no vertex labels at low zooms (vertices have no icons)
+                 if (wireframe) continue;
+                 var renderAs = renderNodeAs[entity.id];
+                 if (renderAs === 'vertex' && zoom < 17) continue;
+                 p = getPointLabel(entity, width, fontSize, renderAs);
+               } else if (geometry === 'line') {
+                 p = getLineLabel(entity, width, fontSize);
+               } else if (geometry === 'area') {
+                 p = getAreaLabel(entity, width, fontSize);
+               }
+
+               if (p) {
+                 if (geometry === 'vertex') {
+                   geometry = 'point';
+                 } // treat vertex like point
+
+
+                 p.classes = geometry + ' tag-' + labelStack[k][1];
+                 positions[geometry].push(p);
+                 labelled[geometry].push(entity);
+               }
+             }
+           }
+
+           function isInterestingVertex(entity) {
+             var selectedIDs = context.selectedIDs();
+             return entity.hasInterestingTags() || entity.isEndpoint(graph) || entity.isConnected(graph) || selectedIDs.indexOf(entity.id) !== -1 || graph.parentWays(entity).some(function (parent) {
+               return selectedIDs.indexOf(parent.id) !== -1;
+             });
+           }
+
+           function getPointLabel(entity, width, height, geometry) {
+             var y = geometry === 'point' ? -12 : 0;
+             var pointOffsets = {
+               ltr: [15, y, 'start'],
+               rtl: [-15, y, 'end']
+             };
+             var textDirection = _mainLocalizer.textDirection();
+             var coord = projection(entity.loc);
+             var textPadding = 2;
+             var offset = pointOffsets[textDirection];
+             var p = {
+               height: height,
+               width: width,
+               x: coord[0] + offset[0],
+               y: coord[1] + offset[1],
+               textAnchor: offset[2]
+             }; // insert a collision box for the text label..
+
+             var bbox;
+
+             if (textDirection === 'rtl') {
+               bbox = {
+                 minX: p.x - width - textPadding,
+                 minY: p.y - height / 2 - textPadding,
+                 maxX: p.x + textPadding,
+                 maxY: p.y + height / 2 + textPadding
+               };
+             } else {
+               bbox = {
+                 minX: p.x - textPadding,
+                 minY: p.y - height / 2 - textPadding,
+                 maxX: p.x + width + textPadding,
+                 maxY: p.y + height / 2 + textPadding
+               };
+             }
+
+             if (tryInsert([bbox], entity.id, true)) {
+               return p;
+             }
+           }
+
+           function getLineLabel(entity, width, height) {
+             var viewport = geoExtent(context.projection.clipExtent()).polygon();
+             var points = graph.childNodes(entity).map(function (node) {
+               return projection(node.loc);
+             });
+             var length = geoPathLength(points);
+             if (length < width + 20) return; // % along the line to attempt to place the label
+
+             var lineOffsets = [50, 45, 55, 40, 60, 35, 65, 30, 70, 25, 75, 20, 80, 15, 95, 10, 90, 5, 95];
+             var padding = 3;
+
+             for (var i = 0; i < lineOffsets.length; i++) {
+               var offset = lineOffsets[i];
+               var middle = offset / 100 * length;
+               var start = middle - width / 2;
+               if (start < 0 || start + width > length) continue; // generate subpath and ignore paths that are invalid or don't cross viewport.
+
+               var sub = subpath(points, start, start + width);
+
+               if (!sub || !geoPolygonIntersectsPolygon(viewport, sub, true)) {
+                 continue;
+               }
+
+               var isReverse = reverse(sub);
+
+               if (isReverse) {
+                 sub = sub.reverse();
+               }
+
+               var bboxes = [];
+               var boxsize = (height + 2) / 2;
+
+               for (var j = 0; j < sub.length - 1; j++) {
+                 var a = sub[j];
+                 var b = sub[j + 1]; // split up the text into small collision boxes
+
+                 var num = Math.max(1, Math.floor(geoVecLength(a, b) / boxsize / 2));
+
+                 for (var box = 0; box < num; box++) {
+                   var p = geoVecInterp(a, b, box / num);
+                   var x0 = p[0] - boxsize - padding;
+                   var y0 = p[1] - boxsize - padding;
+                   var x1 = p[0] + boxsize + padding;
+                   var y1 = p[1] + boxsize + padding;
+                   bboxes.push({
+                     minX: Math.min(x0, x1),
+                     minY: Math.min(y0, y1),
+                     maxX: Math.max(x0, x1),
+                     maxY: Math.max(y0, y1)
+                   });
+                 }
+               }
+
+               if (tryInsert(bboxes, entity.id, false)) {
+                 // accept this one
+                 return {
+                   'font-size': height + 2,
+                   lineString: lineString(sub),
+                   startOffset: offset + '%'
+                 };
+               }
+             }
+
+             function reverse(p) {
+               var angle = Math.atan2(p[1][1] - p[0][1], p[1][0] - p[0][0]);
+               return !(p[0][0] < p[p.length - 1][0] && angle < Math.PI / 2 && angle > -Math.PI / 2);
+             }
+
+             function lineString(points) {
+               return 'M' + points.join('L');
+             }
+
+             function subpath(points, from, to) {
+               var sofar = 0;
+               var start, end, i0, i1;
+
+               for (var i = 0; i < points.length - 1; i++) {
+                 var a = points[i];
+                 var b = points[i + 1];
+                 var current = geoVecLength(a, b);
+                 var portion;
+
+                 if (!start && sofar + current >= from) {
+                   portion = (from - sofar) / current;
+                   start = [a[0] + portion * (b[0] - a[0]), a[1] + portion * (b[1] - a[1])];
+                   i0 = i + 1;
+                 }
+
+                 if (!end && sofar + current >= to) {
+                   portion = (to - sofar) / current;
+                   end = [a[0] + portion * (b[0] - a[0]), a[1] + portion * (b[1] - a[1])];
+                   i1 = i + 1;
+                 }
+
+                 sofar += current;
+               }
+
+               var result = points.slice(i0, i1);
+               result.unshift(start);
+               result.push(end);
+               return result;
+             }
+           }
+
+           function getAreaLabel(entity, width, height) {
+             var centroid = path.centroid(entity.asGeoJSON(graph));
+             var extent = entity.extent(graph);
+             var areaWidth = projection(extent[1])[0] - projection(extent[0])[0];
+             if (isNaN(centroid[0]) || areaWidth < 20) return;
+             var preset = _mainPresetIndex.match(entity, context.graph());
+             var picon = preset && preset.icon;
+             var iconSize = 17;
+             var padding = 2;
+             var p = {};
+
+             if (picon) {
+               // icon and label..
+               if (addIcon()) {
+                 addLabel(iconSize + padding);
+                 return p;
+               }
+             } else {
+               // label only..
+               if (addLabel(0)) {
+                 return p;
+               }
+             }
+
+             function addIcon() {
+               var iconX = centroid[0] - iconSize / 2;
+               var iconY = centroid[1] - iconSize / 2;
+               var bbox = {
+                 minX: iconX,
+                 minY: iconY,
+                 maxX: iconX + iconSize,
+                 maxY: iconY + iconSize
+               };
+
+               if (tryInsert([bbox], entity.id + 'I', true)) {
+                 p.transform = 'translate(' + iconX + ',' + iconY + ')';
+                 return true;
+               }
+
+               return false;
+             }
+
+             function addLabel(yOffset) {
+               if (width && areaWidth >= width + 20) {
+                 var labelX = centroid[0];
+                 var labelY = centroid[1] + yOffset;
+                 var bbox = {
+                   minX: labelX - width / 2 - padding,
+                   minY: labelY - height / 2 - padding,
+                   maxX: labelX + width / 2 + padding,
+                   maxY: labelY + height / 2 + padding
+                 };
+
+                 if (tryInsert([bbox], entity.id, true)) {
+                   p.x = labelX;
+                   p.y = labelY;
+                   p.textAnchor = 'middle';
+                   p.height = height;
+                   return true;
+                 }
+               }
+
+               return false;
+             }
+           } // force insert a singular bounding box
+           // singular box only, no array, id better be unique
+
+
+           function doInsert(bbox, id) {
+             bbox.id = id;
+             var oldbox = _entitybboxes[id];
+
+             if (oldbox) {
+               _rdrawn.remove(oldbox);
+             }
+
+             _entitybboxes[id] = bbox;
+
+             _rdrawn.insert(bbox);
+           }
+
+           function tryInsert(bboxes, id, saveSkipped) {
+             var skipped = false;
+
+             for (var i = 0; i < bboxes.length; i++) {
+               var bbox = bboxes[i];
+               bbox.id = id; // Check that label is visible
+
+               if (bbox.minX < 0 || bbox.minY < 0 || bbox.maxX > dimensions[0] || bbox.maxY > dimensions[1]) {
+                 skipped = true;
+                 break;
+               }
+
+               if (_rdrawn.collides(bbox)) {
+                 skipped = true;
+                 break;
+               }
+             }
+
+             _entitybboxes[id] = bboxes;
+
+             if (skipped) {
+               if (saveSkipped) {
+                 _rskipped.load(bboxes);
+               }
+             } else {
+               _rdrawn.load(bboxes);
+             }
+
+             return !skipped;
+           }
+
+           var layer = selection.selectAll('.layer-osm.labels');
+           layer.selectAll('.labels-group').data(['halo', 'label', 'debug']).enter().append('g').attr('class', function (d) {
+             return 'labels-group ' + d;
+           });
+           var halo = layer.selectAll('.labels-group.halo');
+           var label = layer.selectAll('.labels-group.label');
+           var debug = layer.selectAll('.labels-group.debug'); // points
+
+           drawPointLabels(label, labelled.point, filter, 'pointlabel', positions.point);
+           drawPointLabels(halo, labelled.point, filter, 'pointlabel-halo', positions.point); // lines
+
+           drawLinePaths(layer, labelled.line, filter, '', positions.line);
+           drawLineLabels(label, labelled.line, filter, 'linelabel', positions.line);
+           drawLineLabels(halo, labelled.line, filter, 'linelabel-halo', positions.line); // areas
+
+           drawAreaLabels(label, labelled.area, filter, 'arealabel', positions.area);
+           drawAreaLabels(halo, labelled.area, filter, 'arealabel-halo', positions.area);
+           drawAreaIcons(label, labelled.area, filter, 'areaicon', positions.area);
+           drawAreaIcons(halo, labelled.area, filter, 'areaicon-halo', positions.area); // debug
+
+           drawCollisionBoxes(debug, _rskipped, 'debug-skipped');
+           drawCollisionBoxes(debug, _rdrawn, 'debug-drawn');
+           layer.call(filterLabels);
+         }
+
+         function filterLabels(selection) {
+           var drawLayer = selection.selectAll('.layer-osm.labels');
+           var layers = drawLayer.selectAll('.labels-group.halo, .labels-group.label');
+           layers.selectAll('.nolabel').classed('nolabel', false);
+           var mouse = context.map().mouse();
+           var graph = context.graph();
+           var selectedIDs = context.selectedIDs();
+           var ids = [];
+           var pad, bbox; // hide labels near the mouse
+
+           if (mouse) {
+             pad = 20;
+             bbox = {
+               minX: mouse[0] - pad,
+               minY: mouse[1] - pad,
+               maxX: mouse[0] + pad,
+               maxY: mouse[1] + pad
+             };
+
+             var nearMouse = _rdrawn.search(bbox).map(function (entity) {
+               return entity.id;
+             });
+
+             ids.push.apply(ids, nearMouse);
+           } // hide labels on selected nodes (they look weird when dragging / haloed)
+
+
+           for (var i = 0; i < selectedIDs.length; i++) {
+             var entity = graph.hasEntity(selectedIDs[i]);
+
+             if (entity && entity.type === 'node') {
+               ids.push(selectedIDs[i]);
+             }
+           }
+
+           layers.selectAll(utilEntitySelector(ids)).classed('nolabel', true); // draw the mouse bbox if debugging is on..
+
+           var debug = selection.selectAll('.labels-group.debug');
+           var gj = [];
+
+           if (context.getDebug('collision')) {
+             gj = bbox ? [{
+               type: 'Polygon',
+               coordinates: [[[bbox.minX, bbox.minY], [bbox.maxX, bbox.minY], [bbox.maxX, bbox.maxY], [bbox.minX, bbox.maxY], [bbox.minX, bbox.minY]]]
+             }] : [];
+           }
+
+           var box = debug.selectAll('.debug-mouse').data(gj); // exit
+
+           box.exit().remove(); // enter/update
+
+           box.enter().append('path').attr('class', 'debug debug-mouse yellow').merge(box).attr('d', d3_geoPath());
+         }
+
+         var throttleFilterLabels = throttle(filterLabels, 100);
+
+         drawLabels.observe = function (selection) {
+           var listener = function listener() {
+             throttleFilterLabels(selection);
+           };
+
+           selection.on('mousemove.hidelabels', listener);
+           context.on('enter.hidelabels', listener);
+         };
+
+         drawLabels.off = function (selection) {
+           throttleFilterLabels.cancel();
+           selection.on('mousemove.hidelabels', null);
+           context.on('enter.hidelabels', null);
+         };
+
+         return drawLabels;
+       }
+
+       var _layerEnabled$1 = false;
+
+       var _qaService$1;
+
+       function svgImproveOSM(projection, context, dispatch) {
+         var throttledRedraw = throttle(function () {
+           return dispatch.call('change');
+         }, 1000);
+
+         var minZoom = 12;
+         var touchLayer = select(null);
+         var drawLayer = select(null);
+         var layerVisible = false;
+
+         function markerPath(selection, klass) {
+           selection.attr('class', klass).attr('transform', 'translate(-10, -28)').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');
+         } // Loosely-coupled improveOSM service for fetching issues
+
+
+         function getService() {
+           if (services.improveOSM && !_qaService$1) {
+             _qaService$1 = services.improveOSM;
+
+             _qaService$1.on('loaded', throttledRedraw);
+           } else if (!services.improveOSM && _qaService$1) {
+             _qaService$1 = null;
+           }
+
+           return _qaService$1;
+         } // Show the markers
+
+
+         function editOn() {
+           if (!layerVisible) {
+             layerVisible = true;
+             drawLayer.style('display', 'block');
+           }
+         } // Immediately remove the markers and their touch targets
+
+
+         function editOff() {
+           if (layerVisible) {
+             layerVisible = false;
+             drawLayer.style('display', 'none');
+             drawLayer.selectAll('.qaItem.improveOSM').remove();
+             touchLayer.selectAll('.qaItem.improveOSM').remove();
+           }
+         } // Enable the layer.  This shows the markers and transitions them to visible.
+
+
+         function layerOn() {
+           editOn();
+           drawLayer.style('opacity', 0).transition().duration(250).style('opacity', 1).on('end interrupt', function () {
+             return dispatch.call('change');
+           });
+         } // Disable the layer.  This transitions the layer invisible and then hides the markers.
+
+
+         function layerOff() {
+           throttledRedraw.cancel();
+           drawLayer.interrupt();
+           touchLayer.selectAll('.qaItem.improveOSM').remove();
+           drawLayer.transition().duration(250).style('opacity', 0).on('end interrupt', function () {
+             editOff();
+             dispatch.call('change');
+           });
+         } // Update the issue markers
+
+
+         function updateMarkers() {
+           if (!layerVisible || !_layerEnabled$1) return;
+           var service = getService();
+           var selectedID = context.selectedErrorID();
+           var data = service ? service.getItems(projection) : [];
+           var getTransform = svgPointTransform(projection); // Draw markers..
+
+           var markers = drawLayer.selectAll('.qaItem.improveOSM').data(data, function (d) {
+             return d.id;
+           }); // exit
+
+           markers.exit().remove(); // enter
+
+           var markersEnter = markers.enter().append('g').attr('class', function (d) {
+             return "qaItem ".concat(d.service, " itemId-").concat(d.id, " itemType-").concat(d.itemType);
+           });
+           markersEnter.append('polygon').call(markerPath, 'shadow');
+           markersEnter.append('ellipse').attr('cx', 0).attr('cy', 0).attr('rx', 4.5).attr('ry', 2).attr('class', 'stroke');
+           markersEnter.append('polygon').attr('fill', 'currentColor').call(markerPath, 'qaItem-fill');
+           markersEnter.append('use').attr('transform', 'translate(-6.5, -23)').attr('class', 'icon-annotation').attr('width', '13px').attr('height', '13px').attr('xlink:href', function (d) {
+             var picon = d.icon;
+
+             if (!picon) {
+               return '';
+             } else {
+               var isMaki = /^maki-/.test(picon);
+               return "#".concat(picon).concat(isMaki ? '-11' : '');
+             }
+           }); // update
+
+           markers.merge(markersEnter).sort(sortY).classed('selected', function (d) {
+             return d.id === selectedID;
+           }).attr('transform', getTransform); // Draw targets..
+
+           if (touchLayer.empty()) return;
+           var fillClass = context.getDebug('target') ? 'pink ' : 'nocolor ';
+           var targets = touchLayer.selectAll('.qaItem.improveOSM').data(data, function (d) {
+             return d.id;
+           }); // exit
+
+           targets.exit().remove(); // enter/update
+
+           targets.enter().append('rect').attr('width', '20px').attr('height', '30px').attr('x', '-10px').attr('y', '-28px').merge(targets).sort(sortY).attr('class', function (d) {
+             return "qaItem ".concat(d.service, " target ").concat(fillClass, " itemId-").concat(d.id);
+           }).attr('transform', getTransform);
+
+           function sortY(a, b) {
+             return a.id === selectedID ? 1 : b.id === selectedID ? -1 : b.loc[1] - a.loc[1];
+           }
+         } // Draw the ImproveOSM layer and schedule loading issues and updating markers.
+
+
+         function drawImproveOSM(selection) {
+           var service = getService();
+           var surface = context.surface();
+
+           if (surface && !surface.empty()) {
+             touchLayer = surface.selectAll('.data-layer.touch .layer-touch.markers');
+           }
+
+           drawLayer = selection.selectAll('.layer-improveOSM').data(service ? [0] : []);
+           drawLayer.exit().remove();
+           drawLayer = drawLayer.enter().append('g').attr('class', 'layer-improveOSM').style('display', _layerEnabled$1 ? 'block' : 'none').merge(drawLayer);
+
+           if (_layerEnabled$1) {
+             if (service && ~~context.map().zoom() >= minZoom) {
+               editOn();
+               service.loadIssues(projection);
+               updateMarkers();
+             } else {
+               editOff();
+             }
+           }
+         } // Toggles the layer on and off
+
+
+         drawImproveOSM.enabled = function (val) {
+           if (!arguments.length) return _layerEnabled$1;
+           _layerEnabled$1 = val;
+
+           if (_layerEnabled$1) {
+             layerOn();
+           } else {
+             layerOff();
+
+             if (context.selectedErrorID()) {
+               context.enter(modeBrowse(context));
+             }
+           }
+
+           dispatch.call('change');
+           return this;
+         };
+
+         drawImproveOSM.supported = function () {
+           return !!getService();
+         };
+
+         return drawImproveOSM;
+       }
+
+       var _layerEnabled = false;
+
+       var _qaService;
+
+       function svgOsmose(projection, context, dispatch) {
+         var throttledRedraw = throttle(function () {
+           return dispatch.call('change');
+         }, 1000);
+
+         var minZoom = 12;
+         var touchLayer = select(null);
+         var drawLayer = select(null);
+         var layerVisible = false;
+
+         function markerPath(selection, klass) {
+           selection.attr('class', klass).attr('transform', 'translate(-10, -28)').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');
+         } // Loosely-coupled osmose service for fetching issues
+
+
+         function getService() {
+           if (services.osmose && !_qaService) {
+             _qaService = services.osmose;
+
+             _qaService.on('loaded', throttledRedraw);
+           } else if (!services.osmose && _qaService) {
+             _qaService = null;
+           }
+
+           return _qaService;
+         } // Show the markers
+
+
+         function editOn() {
+           if (!layerVisible) {
+             layerVisible = true;
+             drawLayer.style('display', 'block');
+           }
+         } // Immediately remove the markers and their touch targets
+
+
+         function editOff() {
+           if (layerVisible) {
+             layerVisible = false;
+             drawLayer.style('display', 'none');
+             drawLayer.selectAll('.qaItem.osmose').remove();
+             touchLayer.selectAll('.qaItem.osmose').remove();
+           }
+         } // Enable the layer.  This shows the markers and transitions them to visible.
+
+
+         function layerOn() {
+           editOn();
+           drawLayer.style('opacity', 0).transition().duration(250).style('opacity', 1).on('end interrupt', function () {
+             return dispatch.call('change');
+           });
+         } // Disable the layer.  This transitions the layer invisible and then hides the markers.
+
+
+         function layerOff() {
+           throttledRedraw.cancel();
+           drawLayer.interrupt();
+           touchLayer.selectAll('.qaItem.osmose').remove();
+           drawLayer.transition().duration(250).style('opacity', 0).on('end interrupt', function () {
+             editOff();
+             dispatch.call('change');
+           });
+         } // Update the issue markers
+
+
+         function updateMarkers() {
+           if (!layerVisible || !_layerEnabled) return;
+           var service = getService();
+           var selectedID = context.selectedErrorID();
+           var data = service ? service.getItems(projection) : [];
+           var getTransform = svgPointTransform(projection); // Draw markers..
+
+           var markers = drawLayer.selectAll('.qaItem.osmose').data(data, function (d) {
+             return d.id;
+           }); // exit
+
+           markers.exit().remove(); // enter
+
+           var markersEnter = markers.enter().append('g').attr('class', function (d) {
+             return "qaItem ".concat(d.service, " itemId-").concat(d.id, " itemType-").concat(d.itemType);
+           });
+           markersEnter.append('polygon').call(markerPath, 'shadow');
+           markersEnter.append('ellipse').attr('cx', 0).attr('cy', 0).attr('rx', 4.5).attr('ry', 2).attr('class', 'stroke');
+           markersEnter.append('polygon').attr('fill', function (d) {
+             return service.getColor(d.item);
+           }).call(markerPath, 'qaItem-fill');
+           markersEnter.append('use').attr('transform', 'translate(-6.5, -23)').attr('class', 'icon-annotation').attr('width', '13px').attr('height', '13px').attr('xlink:href', function (d) {
+             var picon = d.icon;
+
+             if (!picon) {
+               return '';
+             } else {
+               var isMaki = /^maki-/.test(picon);
+               return "#".concat(picon).concat(isMaki ? '-11' : '');
+             }
+           }); // update
+
+           markers.merge(markersEnter).sort(sortY).classed('selected', function (d) {
+             return d.id === selectedID;
+           }).attr('transform', getTransform); // Draw targets..
+
+           if (touchLayer.empty()) return;
+           var fillClass = context.getDebug('target') ? 'pink' : 'nocolor';
+           var targets = touchLayer.selectAll('.qaItem.osmose').data(data, function (d) {
+             return d.id;
+           }); // exit
+
+           targets.exit().remove(); // enter/update
+
+           targets.enter().append('rect').attr('width', '20px').attr('height', '30px').attr('x', '-10px').attr('y', '-28px').merge(targets).sort(sortY).attr('class', function (d) {
+             return "qaItem ".concat(d.service, " target ").concat(fillClass, " itemId-").concat(d.id);
+           }).attr('transform', getTransform);
+
+           function sortY(a, b) {
+             return a.id === selectedID ? 1 : b.id === selectedID ? -1 : b.loc[1] - a.loc[1];
+           }
+         } // Draw the Osmose layer and schedule loading issues and updating markers.
+
+
+         function drawOsmose(selection) {
+           var service = getService();
+           var surface = context.surface();
+
+           if (surface && !surface.empty()) {
+             touchLayer = surface.selectAll('.data-layer.touch .layer-touch.markers');
+           }
+
+           drawLayer = selection.selectAll('.layer-osmose').data(service ? [0] : []);
+           drawLayer.exit().remove();
+           drawLayer = drawLayer.enter().append('g').attr('class', 'layer-osmose').style('display', _layerEnabled ? 'block' : 'none').merge(drawLayer);
+
+           if (_layerEnabled) {
+             if (service && ~~context.map().zoom() >= minZoom) {
+               editOn();
+               service.loadIssues(projection);
+               updateMarkers();
+             } else {
+               editOff();
+             }
+           }
+         } // Toggles the layer on and off
+
+
+         drawOsmose.enabled = function (val) {
+           if (!arguments.length) return _layerEnabled;
+           _layerEnabled = val;
+
+           if (_layerEnabled) {
+             // Strings supplied by Osmose fetched before showing layer for first time
+             // NOTE: Currently no way to change locale in iD at runtime, would need to re-call this method if that's ever implemented
+             // Also, If layer is toggled quickly multiple requests are sent
+             getService().loadStrings().then(layerOn)["catch"](function (err) {
+               console.log(err); // eslint-disable-line no-console
+             });
+           } else {
+             layerOff();
+
+             if (context.selectedErrorID()) {
+               context.enter(modeBrowse(context));
+             }
+           }
+
+           dispatch.call('change');
+           return this;
+         };
+
+         drawOsmose.supported = function () {
+           return !!getService();
+         };
+
+         return drawOsmose;
+       }
+
+       function svgStreetside(projection, context, dispatch) {
+         var throttledRedraw = throttle(function () {
+           dispatch.call('change');
+         }, 1000);
+
+         var minZoom = 14;
+         var minMarkerZoom = 16;
+         var minViewfieldZoom = 18;
+         var layer = select(null);
+         var _viewerYaw = 0;
+         var _selectedSequence = null;
+
+         var _streetside;
+         /**
+          * init().
+          */
+
+
+         function init() {
+           if (svgStreetside.initialized) return; // run once
+
+           svgStreetside.enabled = false;
+           svgStreetside.initialized = true;
+         }
+         /**
+          * getService().
+          */
+
+
+         function getService() {
+           if (services.streetside && !_streetside) {
+             _streetside = services.streetside;
+
+             _streetside.event.on('viewerChanged.svgStreetside', viewerChanged).on('loadedImages.svgStreetside', throttledRedraw);
+           } else if (!services.streetside && _streetside) {
+             _streetside = null;
+           }
+
+           return _streetside;
+         }
+         /**
+          * showLayer().
+          */
+
+
+         function showLayer() {
+           var service = getService();
+           if (!service) return;
+           editOn();
+           layer.style('opacity', 0).transition().duration(250).style('opacity', 1).on('end', function () {
+             dispatch.call('change');
+           });
+         }
+         /**
+          * hideLayer().
+          */
+
+
+         function hideLayer() {
+           throttledRedraw.cancel();
+           layer.transition().duration(250).style('opacity', 0).on('end', editOff);
+         }
+         /**
+          * editOn().
+          */
+
+
+         function editOn() {
+           layer.style('display', 'block');
+         }
+         /**
+          * editOff().
+          */
+
+
+         function editOff() {
+           layer.selectAll('.viewfield-group').remove();
+           layer.style('display', 'none');
+         }
+         /**
+          * click() Handles 'bubble' point click event.
+          */
+
+
+         function click(d3_event, d) {
+           var service = getService();
+           if (!service) return; // try to preserve the viewer rotation when staying on the same sequence
+
+           if (d.sequenceKey !== _selectedSequence) {
+             _viewerYaw = 0; // reset
+           }
+
+           _selectedSequence = d.sequenceKey;
+           service.ensureViewerLoaded(context).then(function () {
+             service.selectImage(context, d.key).yaw(_viewerYaw).showViewer(context);
+           });
+           context.map().centerEase(d.loc);
+         }
+         /**
+          * mouseover().
+          */
+
+
+         function mouseover(d3_event, d) {
+           var service = getService();
+           if (service) service.setStyles(context, d);
+         }
+         /**
+          * mouseout().
+          */
+
+
+         function mouseout() {
+           var service = getService();
+           if (service) service.setStyles(context, null);
+         }
+         /**
+          * transform().
+          */
+
+
+         function transform(d) {
+           var t = svgPointTransform(projection)(d);
+           var rot = d.ca + _viewerYaw;
+
+           if (rot) {
+             t += ' rotate(' + Math.floor(rot) + ',0,0)';
+           }
+
+           return t;
+         }
+
+         function viewerChanged() {
+           var service = getService();
+           if (!service) return;
+           var viewer = service.viewer();
+           if (!viewer) return; // update viewfield rotation
+
+           _viewerYaw = viewer.getYaw(); // avoid updating if the map is currently transformed
+           // e.g. during drags or easing.
+
+           if (context.map().isTransformed()) return;
+           layer.selectAll('.viewfield-group.currentView').attr('transform', transform);
+         }
+
+         function filterBubbles(bubbles) {
+           var fromDate = context.photos().fromDate();
+           var toDate = context.photos().toDate();
+           var usernames = context.photos().usernames();
+
+           if (fromDate) {
+             var fromTimestamp = new Date(fromDate).getTime();
+             bubbles = bubbles.filter(function (bubble) {
+               return new Date(bubble.captured_at).getTime() >= fromTimestamp;
+             });
+           }
+
+           if (toDate) {
+             var toTimestamp = new Date(toDate).getTime();
+             bubbles = bubbles.filter(function (bubble) {
+               return new Date(bubble.captured_at).getTime() <= toTimestamp;
+             });
+           }
+
+           if (usernames) {
+             bubbles = bubbles.filter(function (bubble) {
+               return usernames.indexOf(bubble.captured_by) !== -1;
+             });
+           }
+
+           return bubbles;
+         }
+
+         function filterSequences(sequences) {
+           var fromDate = context.photos().fromDate();
+           var toDate = context.photos().toDate();
+           var usernames = context.photos().usernames();
+
+           if (fromDate) {
+             var fromTimestamp = new Date(fromDate).getTime();
+             sequences = sequences.filter(function (sequences) {
+               return new Date(sequences.properties.captured_at).getTime() >= fromTimestamp;
+             });
+           }
+
+           if (toDate) {
+             var toTimestamp = new Date(toDate).getTime();
+             sequences = sequences.filter(function (sequences) {
+               return new Date(sequences.properties.captured_at).getTime() <= toTimestamp;
+             });
+           }
+
+           if (usernames) {
+             sequences = sequences.filter(function (sequences) {
+               return usernames.indexOf(sequences.properties.captured_by) !== -1;
+             });
+           }
+
+           return sequences;
+         }
+         /**
+          * update().
+          */
+
+
+         function update() {
+           var viewer = context.container().select('.photoviewer');
+           var selected = viewer.empty() ? undefined : viewer.datum();
+           var z = ~~context.map().zoom();
+           var showMarkers = z >= minMarkerZoom;
+           var showViewfields = z >= minViewfieldZoom;
+           var service = getService();
+           var sequences = [];
+           var bubbles = [];
+
+           if (context.photos().showsPanoramic()) {
+             sequences = service ? service.sequences(projection) : [];
+             bubbles = service && showMarkers ? service.bubbles(projection) : [];
+             sequences = filterSequences(sequences);
+             bubbles = filterBubbles(bubbles);
+           }
+
+           var traces = layer.selectAll('.sequences').selectAll('.sequence').data(sequences, function (d) {
+             return d.properties.key;
+           }); // exit
+
+           traces.exit().remove(); // enter/update
+
+           traces = traces.enter().append('path').attr('class', 'sequence').merge(traces).attr('d', svgPath(projection).geojson);
+           var groups = layer.selectAll('.markers').selectAll('.viewfield-group').data(bubbles, function (d) {
+             // force reenter once bubbles are attached to a sequence
+             return d.key + (d.sequenceKey ? 'v1' : 'v0');
+           }); // exit
+
+           groups.exit().remove(); // enter
+
+           var groupsEnter = groups.enter().append('g').attr('class', 'viewfield-group').on('mouseenter', mouseover).on('mouseleave', mouseout).on('click', click);
+           groupsEnter.append('g').attr('class', 'viewfield-scale'); // update
+
+           var markers = groups.merge(groupsEnter).sort(function (a, b) {
+             return a === selected ? 1 : b === selected ? -1 : b.loc[1] - a.loc[1];
+           }).attr('transform', transform).select('.viewfield-scale');
+           markers.selectAll('circle').data([0]).enter().append('circle').attr('dx', '0').attr('dy', '0').attr('r', '6');
+           var viewfields = markers.selectAll('.viewfield').data(showViewfields ? [0] : []);
+           viewfields.exit().remove(); // viewfields may or may not be drawn...
+           // but if they are, draw below the circles
+
+           viewfields.enter().insert('path', 'circle').attr('class', 'viewfield').attr('transform', 'scale(1.5,1.5),translate(-8, -13)').attr('d', viewfieldPath);
+
+           function viewfieldPath() {
+             var d = this.parentNode.__data__;
+
+             if (d.pano) {
+               return 'M 8,13 m -10,0 a 10,10 0 1,0 20,0 a 10,10 0 1,0 -20,0';
+             } else {
+               return 'M 6,9 C 8,8.4 8,8.4 10,9 L 16,-2 C 12,-5 4,-5 0,-2 z';
+             }
+           }
+         }
+         /**
+          * drawImages()
+          * drawImages is the method that is returned (and that runs) every time 'svgStreetside()' is called.
+          * 'svgStreetside()' is called from index.js
+          */
+
+
+         function drawImages(selection) {
+           var enabled = svgStreetside.enabled;
+           var service = getService();
+           layer = selection.selectAll('.layer-streetside-images').data(service ? [0] : []);
+           layer.exit().remove();
+           var layerEnter = layer.enter().append('g').attr('class', 'layer-streetside-images').style('display', enabled ? 'block' : 'none');
+           layerEnter.append('g').attr('class', 'sequences');
+           layerEnter.append('g').attr('class', 'markers');
+           layer = layerEnter.merge(layer);
+
+           if (enabled) {
+             if (service && ~~context.map().zoom() >= minZoom) {
+               editOn();
+               update();
+               service.loadBubbles(projection);
+             } else {
+               editOff();
+             }
+           }
+         }
+         /**
+          * drawImages.enabled().
+          */
+
+
+         drawImages.enabled = function (_) {
+           if (!arguments.length) return svgStreetside.enabled;
+           svgStreetside.enabled = _;
+
+           if (svgStreetside.enabled) {
+             showLayer();
+             context.photos().on('change.streetside', update);
+           } else {
+             hideLayer();
+             context.photos().on('change.streetside', null);
+           }
+
+           dispatch.call('change');
+           return this;
+         };
+         /**
+          * drawImages.supported().
+          */
+
+
+         drawImages.supported = function () {
+           return !!getService();
+         };
+
+         init();
+         return drawImages;
+       }
+
+       function svgMapillaryImages(projection, context, dispatch) {
+         var throttledRedraw = throttle(function () {
+           dispatch.call('change');
+         }, 1000);
+
+         var minZoom = 12;
+         var minMarkerZoom = 16;
+         var minViewfieldZoom = 18;
+         var layer = select(null);
+
+         var _mapillary;
+
+         function init() {
+           if (svgMapillaryImages.initialized) return; // run once
+
+           svgMapillaryImages.enabled = false;
+           svgMapillaryImages.initialized = true;
+         }
+
+         function getService() {
+           if (services.mapillary && !_mapillary) {
+             _mapillary = services.mapillary;
+
+             _mapillary.event.on('loadedImages', throttledRedraw);
+           } else if (!services.mapillary && _mapillary) {
+             _mapillary = null;
+           }
+
+           return _mapillary;
+         }
+
+         function showLayer() {
+           var service = getService();
+           if (!service) return;
+           editOn();
+           layer.style('opacity', 0).transition().duration(250).style('opacity', 1).on('end', function () {
+             dispatch.call('change');
+           });
+         }
+
+         function hideLayer() {
+           throttledRedraw.cancel();
+           layer.transition().duration(250).style('opacity', 0).on('end', editOff);
+         }
+
+         function editOn() {
+           layer.style('display', 'block');
+         }
+
+         function editOff() {
+           layer.selectAll('.viewfield-group').remove();
+           layer.style('display', 'none');
+         }
+
+         function click(d3_event, image) {
+           var service = getService();
+           if (!service) return;
+           service.ensureViewerLoaded(context).then(function () {
+             service.selectImage(context, image.id).showViewer(context);
+           });
+           context.map().centerEase(image.loc);
+         }
+
+         function mouseover(d3_event, image) {
+           var service = getService();
+           if (service) service.setStyles(context, image);
+         }
+
+         function mouseout() {
+           var service = getService();
+           if (service) service.setStyles(context, null);
+         }
+
+         function transform(d) {
+           var t = svgPointTransform(projection)(d);
+
+           if (d.ca) {
+             t += ' rotate(' + Math.floor(d.ca) + ',0,0)';
+           }
+
+           return t;
+         }
+
+         function filterImages(images) {
+           var showsPano = context.photos().showsPanoramic();
+           var showsFlat = context.photos().showsFlat();
+           var fromDate = context.photos().fromDate();
+           var toDate = context.photos().toDate();
+
+           if (!showsPano || !showsFlat) {
+             images = images.filter(function (image) {
+               if (image.is_pano) return showsPano;
+               return showsFlat;
+             });
+           }
+
+           if (fromDate) {
+             images = images.filter(function (image) {
+               return new Date(image.captured_at).getTime() >= new Date(fromDate).getTime();
+             });
+           }
+
+           if (toDate) {
+             images = images.filter(function (image) {
+               return new Date(image.captured_at).getTime() <= new Date(toDate).getTime();
+             });
+           }
+
+           return images;
+         }
+
+         function filterSequences(sequences) {
+           var showsPano = context.photos().showsPanoramic();
+           var showsFlat = context.photos().showsFlat();
+           var fromDate = context.photos().fromDate();
+           var toDate = context.photos().toDate();
+
+           if (!showsPano || !showsFlat) {
+             sequences = sequences.filter(function (sequence) {
+               if (sequence.properties.hasOwnProperty('is_pano')) {
+                 if (sequence.properties.is_pano) return showsPano;
+                 return showsFlat;
+               }
+
+               return false;
+             });
+           }
+
+           if (fromDate) {
+             sequences = sequences.filter(function (sequence) {
+               return new Date(sequence.properties.captured_at).getTime() >= new Date(fromDate).getTime().toString();
+             });
+           }
+
+           if (toDate) {
+             sequences = sequences.filter(function (sequence) {
+               return new Date(sequence.properties.captured_at).getTime() <= new Date(toDate).getTime().toString();
+             });
+           }
+
+           return sequences;
+         }
+
+         function update() {
+           var z = ~~context.map().zoom();
+           var showMarkers = z >= minMarkerZoom;
+           var showViewfields = z >= minViewfieldZoom;
+           var service = getService();
+           var sequences = service ? service.sequences(projection) : [];
+           var images = service && showMarkers ? service.images(projection) : [];
+           images = filterImages(images);
+           sequences = filterSequences(sequences);
+           service.filterViewer(context);
+           var traces = layer.selectAll('.sequences').selectAll('.sequence').data(sequences, function (d) {
+             return d.properties.id;
+           }); // exit
+
+           traces.exit().remove(); // enter/update
+
+           traces = traces.enter().append('path').attr('class', 'sequence').merge(traces).attr('d', svgPath(projection).geojson);
+           var groups = layer.selectAll('.markers').selectAll('.viewfield-group').data(images, function (d) {
+             return d.id;
+           }); // exit
+
+           groups.exit().remove(); // enter
+
+           var groupsEnter = groups.enter().append('g').attr('class', 'viewfield-group').on('mouseenter', mouseover).on('mouseleave', mouseout).on('click', click);
+           groupsEnter.append('g').attr('class', 'viewfield-scale'); // update
+
+           var markers = groups.merge(groupsEnter).sort(function (a, b) {
+             return b.loc[1] - a.loc[1]; // sort Y
+           }).attr('transform', transform).select('.viewfield-scale');
+           markers.selectAll('circle').data([0]).enter().append('circle').attr('dx', '0').attr('dy', '0').attr('r', '6');
+           var viewfields = markers.selectAll('.viewfield').data(showViewfields ? [0] : []);
+           viewfields.exit().remove();
+           viewfields.enter() // viewfields may or may not be drawn...
+           .insert('path', 'circle') // but if they are, draw below the circles
+           .attr('class', 'viewfield').classed('pano', function () {
+             return this.parentNode.__data__.is_pano;
+           }).attr('transform', 'scale(1.5,1.5),translate(-8, -13)').attr('d', viewfieldPath);
+
+           function viewfieldPath() {
+             if (this.parentNode.__data__.is_pano) {
+               return 'M 8,13 m -10,0 a 10,10 0 1,0 20,0 a 10,10 0 1,0 -20,0';
+             } else {
+               return 'M 6,9 C 8,8.4 8,8.4 10,9 L 16,-2 C 12,-5 4,-5 0,-2 z';
+             }
+           }
+         }
+
+         function drawImages(selection) {
+           var enabled = svgMapillaryImages.enabled;
+           var service = getService();
+           layer = selection.selectAll('.layer-mapillary').data(service ? [0] : []);
+           layer.exit().remove();
+           var layerEnter = layer.enter().append('g').attr('class', 'layer-mapillary').style('display', enabled ? 'block' : 'none');
+           layerEnter.append('g').attr('class', 'sequences');
+           layerEnter.append('g').attr('class', 'markers');
+           layer = layerEnter.merge(layer);
+
+           if (enabled) {
+             if (service && ~~context.map().zoom() >= minZoom) {
+               editOn();
+               update();
+               service.loadImages(projection);
+             } else {
+               editOff();
+             }
+           }
+         }
+
+         drawImages.enabled = function (_) {
+           if (!arguments.length) return svgMapillaryImages.enabled;
+           svgMapillaryImages.enabled = _;
+
+           if (svgMapillaryImages.enabled) {
+             showLayer();
+             context.photos().on('change.mapillary_images', update);
+           } else {
+             hideLayer();
+             context.photos().on('change.mapillary_images', null);
+           }
+
+           dispatch.call('change');
+           return this;
+         };
+
+         drawImages.supported = function () {
+           return !!getService();
+         };
+
+         init();
+         return drawImages;
+       }
+
+       function svgMapillaryPosition(projection, context) {
+         var throttledRedraw = throttle(function () {
+           update();
+         }, 1000);
+
+         var minZoom = 12;
+         var minViewfieldZoom = 18;
+         var layer = select(null);
+
+         var _mapillary;
+
+         var viewerCompassAngle;
+
+         function init() {
+           if (svgMapillaryPosition.initialized) return; // run once
+
+           svgMapillaryPosition.initialized = true;
+         }
+
+         function getService() {
+           if (services.mapillary && !_mapillary) {
+             _mapillary = services.mapillary;
+
+             _mapillary.event.on('imageChanged', throttledRedraw);
+
+             _mapillary.event.on('bearingChanged', function (e) {
+               viewerCompassAngle = e.bearing;
+               if (context.map().isTransformed()) return;
+               layer.selectAll('.viewfield-group.currentView').filter(function (d) {
+                 return d.is_pano;
+               }).attr('transform', transform);
+             });
+           } else if (!services.mapillary && _mapillary) {
+             _mapillary = null;
+           }
+
+           return _mapillary;
+         }
+
+         function editOn() {
+           layer.style('display', 'block');
+         }
+
+         function editOff() {
+           layer.selectAll('.viewfield-group').remove();
+           layer.style('display', 'none');
+         }
+
+         function transform(d) {
+           var t = svgPointTransform(projection)(d);
+
+           if (d.is_pano && viewerCompassAngle !== null && isFinite(viewerCompassAngle)) {
+             t += ' rotate(' + Math.floor(viewerCompassAngle) + ',0,0)';
+           } else if (d.ca) {
+             t += ' rotate(' + Math.floor(d.ca) + ',0,0)';
+           }
+
+           return t;
+         }
+
+         function update() {
+           var z = ~~context.map().zoom();
+           var showViewfields = z >= minViewfieldZoom;
+           var service = getService();
+           var image = service && service.getActiveImage();
+           var groups = layer.selectAll('.markers').selectAll('.viewfield-group').data(image ? [image] : [], function (d) {
+             return d.id;
+           }); // exit
+
+           groups.exit().remove(); // enter
+
+           var groupsEnter = groups.enter().append('g').attr('class', 'viewfield-group currentView highlighted');
+           groupsEnter.append('g').attr('class', 'viewfield-scale'); // update
+
+           var markers = groups.merge(groupsEnter).attr('transform', transform).select('.viewfield-scale');
+           markers.selectAll('circle').data([0]).enter().append('circle').attr('dx', '0').attr('dy', '0').attr('r', '6');
+           var viewfields = markers.selectAll('.viewfield').data(showViewfields ? [0] : []);
+           viewfields.exit().remove();
+           viewfields.enter().insert('path', 'circle').attr('class', 'viewfield').attr('transform', 'scale(1.5,1.5),translate(-8, -13)').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');
+         }
+
+         function drawImages(selection) {
+           var service = getService();
+           layer = selection.selectAll('.layer-mapillary-position').data(service ? [0] : []);
+           layer.exit().remove();
+           var layerEnter = layer.enter().append('g').attr('class', 'layer-mapillary-position');
+           layerEnter.append('g').attr('class', 'markers');
+           layer = layerEnter.merge(layer);
+
+           if (service && ~~context.map().zoom() >= minZoom) {
+             editOn();
+             update();
+           } else {
+             editOff();
+           }
+         }
+
+         drawImages.enabled = function () {
+           update();
+           return this;
+         };
+
+         drawImages.supported = function () {
+           return !!getService();
+         };
+
+         init();
+         return drawImages;
+       }
+
+       function svgMapillarySigns(projection, context, dispatch) {
+         var throttledRedraw = throttle(function () {
+           dispatch.call('change');
+         }, 1000);
+
+         var minZoom = 12;
+         var layer = select(null);
+
+         var _mapillary;
+
+         function init() {
+           if (svgMapillarySigns.initialized) return; // run once
+
+           svgMapillarySigns.enabled = false;
+           svgMapillarySigns.initialized = true;
+         }
+
+         function getService() {
+           if (services.mapillary && !_mapillary) {
+             _mapillary = services.mapillary;
+
+             _mapillary.event.on('loadedSigns', throttledRedraw);
+           } else if (!services.mapillary && _mapillary) {
+             _mapillary = null;
+           }
+
+           return _mapillary;
+         }
+
+         function showLayer() {
+           var service = getService();
+           if (!service) return;
+           service.loadSignResources(context);
+           editOn();
+         }
+
+         function hideLayer() {
+           throttledRedraw.cancel();
+           editOff();
+         }
+
+         function editOn() {
+           layer.style('display', 'block');
+         }
+
+         function editOff() {
+           layer.selectAll('.icon-sign').remove();
+           layer.style('display', 'none');
+         }
+
+         function click(d3_event, d) {
+           var service = getService();
+           if (!service) return;
+           context.map().centerEase(d.loc);
+           var selectedImageId = service.getActiveImage() && service.getActiveImage().id;
+           service.getDetections(d.id).then(function (detections) {
+             if (detections.length) {
+               var imageId = detections[0].image.id;
+
+               if (imageId === selectedImageId) {
+                 service.highlightDetection(detections[0]).selectImage(context, imageId);
+               } else {
+                 service.ensureViewerLoaded(context).then(function () {
+                   service.highlightDetection(detections[0]).selectImage(context, imageId).showViewer(context);
+                 });
+               }
+             }
+           });
+         }
+
+         function filterData(detectedFeatures) {
+           var fromDate = context.photos().fromDate();
+           var toDate = context.photos().toDate();
+
+           if (fromDate) {
+             var fromTimestamp = new Date(fromDate).getTime();
+             detectedFeatures = detectedFeatures.filter(function (feature) {
+               return new Date(feature.last_seen_at).getTime() >= fromTimestamp;
+             });
+           }
+
+           if (toDate) {
+             var toTimestamp = new Date(toDate).getTime();
+             detectedFeatures = detectedFeatures.filter(function (feature) {
+               return new Date(feature.first_seen_at).getTime() <= toTimestamp;
+             });
+           }
+
+           return detectedFeatures;
+         }
+
+         function update() {
+           var service = getService();
+           var data = service ? service.signs(projection) : [];
+           data = filterData(data);
+           var transform = svgPointTransform(projection);
+           var signs = layer.selectAll('.icon-sign').data(data, function (d) {
+             return d.id;
+           }); // exit
+
+           signs.exit().remove(); // enter
+
+           var enter = signs.enter().append('g').attr('class', 'icon-sign icon-detected').on('click', click);
+           enter.append('use').attr('width', '24px').attr('height', '24px').attr('x', '-12px').attr('y', '-12px').attr('xlink:href', function (d) {
+             return '#' + d.value;
+           });
+           enter.append('rect').attr('width', '24px').attr('height', '24px').attr('x', '-12px').attr('y', '-12px'); // update
+
+           signs.merge(enter).attr('transform', transform);
+         }
+
+         function drawSigns(selection) {
+           var enabled = svgMapillarySigns.enabled;
+           var service = getService();
+           layer = selection.selectAll('.layer-mapillary-signs').data(service ? [0] : []);
+           layer.exit().remove();
+           layer = layer.enter().append('g').attr('class', 'layer-mapillary-signs layer-mapillary-detections').style('display', enabled ? 'block' : 'none').merge(layer);
+
+           if (enabled) {
+             if (service && ~~context.map().zoom() >= minZoom) {
+               editOn();
+               update();
+               service.loadSigns(projection);
+               service.showSignDetections(true);
+             } else {
+               editOff();
+             }
+           } else if (service) {
+             service.showSignDetections(false);
+           }
+         }
+
+         drawSigns.enabled = function (_) {
+           if (!arguments.length) return svgMapillarySigns.enabled;
+           svgMapillarySigns.enabled = _;
+
+           if (svgMapillarySigns.enabled) {
+             showLayer();
+             context.photos().on('change.mapillary_signs', update);
+           } else {
+             hideLayer();
+             context.photos().on('change.mapillary_signs', null);
+           }
+
+           dispatch.call('change');
+           return this;
+         };
+
+         drawSigns.supported = function () {
+           return !!getService();
+         };
+
+         init();
+         return drawSigns;
+       }
+
+       function svgMapillaryMapFeatures(projection, context, dispatch) {
+         var throttledRedraw = throttle(function () {
+           dispatch.call('change');
+         }, 1000);
+
+         var minZoom = 12;
+         var layer = select(null);
+
+         var _mapillary;
+
+         function init() {
+           if (svgMapillaryMapFeatures.initialized) return; // run once
+
+           svgMapillaryMapFeatures.enabled = false;
+           svgMapillaryMapFeatures.initialized = true;
+         }
+
+         function getService() {
+           if (services.mapillary && !_mapillary) {
+             _mapillary = services.mapillary;
+
+             _mapillary.event.on('loadedMapFeatures', throttledRedraw);
+           } else if (!services.mapillary && _mapillary) {
+             _mapillary = null;
+           }
+
+           return _mapillary;
+         }
+
+         function showLayer() {
+           var service = getService();
+           if (!service) return;
+           service.loadObjectResources(context);
+           editOn();
+         }
+
+         function hideLayer() {
+           throttledRedraw.cancel();
+           editOff();
+         }
+
+         function editOn() {
+           layer.style('display', 'block');
+         }
+
+         function editOff() {
+           layer.selectAll('.icon-map-feature').remove();
+           layer.style('display', 'none');
+         }
+
+         function click(d3_event, d) {
+           var service = getService();
+           if (!service) return;
+           context.map().centerEase(d.loc);
+           var selectedImageId = service.getActiveImage() && service.getActiveImage().id;
+           service.getDetections(d.id).then(function (detections) {
+             if (detections.length) {
+               var imageId = detections[0].image.id;
+
+               if (imageId === selectedImageId) {
+                 service.highlightDetection(detections[0]).selectImage(context, imageId);
+               } else {
+                 service.ensureViewerLoaded(context).then(function () {
+                   service.highlightDetection(detections[0]).selectImage(context, imageId).showViewer(context);
+                 });
+               }
+             }
+           });
+         }
+
+         function filterData(detectedFeatures) {
+           var fromDate = context.photos().fromDate();
+           var toDate = context.photos().toDate();
+
+           if (fromDate) {
+             detectedFeatures = detectedFeatures.filter(function (feature) {
+               return new Date(feature.last_seen_at).getTime() >= new Date(fromDate).getTime();
+             });
+           }
+
+           if (toDate) {
+             detectedFeatures = detectedFeatures.filter(function (feature) {
+               return new Date(feature.first_seen_at).getTime() <= new Date(toDate).getTime();
+             });
+           }
+
+           return detectedFeatures;
+         }
+
+         function update() {
+           var service = getService();
+           var data = service ? service.mapFeatures(projection) : [];
+           data = filterData(data);
+           var transform = svgPointTransform(projection);
+           var mapFeatures = layer.selectAll('.icon-map-feature').data(data, function (d) {
+             return d.id;
+           }); // exit
+
+           mapFeatures.exit().remove(); // enter
+
+           var enter = mapFeatures.enter().append('g').attr('class', 'icon-map-feature icon-detected').on('click', click);
+           enter.append('title').text(function (d) {
+             var id = d.value.replace(/--/g, '.').replace(/-/g, '_');
+             return _t('mapillary_map_features.' + id);
+           });
+           enter.append('use').attr('width', '24px').attr('height', '24px').attr('x', '-12px').attr('y', '-12px').attr('xlink:href', function (d) {
+             if (d.value === 'object--billboard') {
+               // no billboard icon right now, so use the advertisement icon
+               return '#object--sign--advertisement';
+             }
+
+             return '#' + d.value;
+           });
+           enter.append('rect').attr('width', '24px').attr('height', '24px').attr('x', '-12px').attr('y', '-12px'); // update
+
+           mapFeatures.merge(enter).attr('transform', transform);
+         }
+
+         function drawMapFeatures(selection) {
+           var enabled = svgMapillaryMapFeatures.enabled;
+           var service = getService();
+           layer = selection.selectAll('.layer-mapillary-map-features').data(service ? [0] : []);
+           layer.exit().remove();
+           layer = layer.enter().append('g').attr('class', 'layer-mapillary-map-features layer-mapillary-detections').style('display', enabled ? 'block' : 'none').merge(layer);
+
+           if (enabled) {
+             if (service && ~~context.map().zoom() >= minZoom) {
+               editOn();
+               update();
+               service.loadMapFeatures(projection);
+               service.showFeatureDetections(true);
+             } else {
+               editOff();
+             }
+           } else if (service) {
+             service.showFeatureDetections(false);
+           }
+         }
+
+         drawMapFeatures.enabled = function (_) {
+           if (!arguments.length) return svgMapillaryMapFeatures.enabled;
+           svgMapillaryMapFeatures.enabled = _;
+
+           if (svgMapillaryMapFeatures.enabled) {
+             showLayer();
+             context.photos().on('change.mapillary_map_features', update);
+           } else {
+             hideLayer();
+             context.photos().on('change.mapillary_map_features', null);
+           }
+
+           dispatch.call('change');
+           return this;
+         };
+
+         drawMapFeatures.supported = function () {
+           return !!getService();
+         };
+
+         init();
+         return drawMapFeatures;
+       }
+
+       function svgKartaviewImages(projection, context, dispatch) {
+         var throttledRedraw = throttle(function () {
+           dispatch.call('change');
+         }, 1000);
+
+         var minZoom = 12;
+         var minMarkerZoom = 16;
+         var minViewfieldZoom = 18;
+         var layer = select(null);
+
+         var _kartaview;
+
+         function init() {
+           if (svgKartaviewImages.initialized) return; // run once
+
+           svgKartaviewImages.enabled = false;
+           svgKartaviewImages.initialized = true;
+         }
+
+         function getService() {
+           if (services.kartaview && !_kartaview) {
+             _kartaview = services.kartaview;
+
+             _kartaview.event.on('loadedImages', throttledRedraw);
+           } else if (!services.kartaview && _kartaview) {
+             _kartaview = null;
+           }
+
+           return _kartaview;
+         }
+
+         function showLayer() {
+           var service = getService();
+           if (!service) return;
+           editOn();
+           layer.style('opacity', 0).transition().duration(250).style('opacity', 1).on('end', function () {
+             dispatch.call('change');
+           });
+         }
+
+         function hideLayer() {
+           throttledRedraw.cancel();
+           layer.transition().duration(250).style('opacity', 0).on('end', editOff);
+         }
+
+         function editOn() {
+           layer.style('display', 'block');
+         }
+
+         function editOff() {
+           layer.selectAll('.viewfield-group').remove();
+           layer.style('display', 'none');
+         }
+
+         function click(d3_event, d) {
+           var service = getService();
+           if (!service) return;
+           service.ensureViewerLoaded(context).then(function () {
+             service.selectImage(context, d.key).showViewer(context);
+           });
+           context.map().centerEase(d.loc);
+         }
+
+         function mouseover(d3_event, d) {
+           var service = getService();
+           if (service) service.setStyles(context, d);
+         }
+
+         function mouseout() {
+           var service = getService();
+           if (service) service.setStyles(context, null);
+         }
+
+         function transform(d) {
+           var t = svgPointTransform(projection)(d);
+
+           if (d.ca) {
+             t += ' rotate(' + Math.floor(d.ca) + ',0,0)';
+           }
+
+           return t;
+         }
+
+         function filterImages(images) {
+           var fromDate = context.photos().fromDate();
+           var toDate = context.photos().toDate();
+           var usernames = context.photos().usernames();
+
+           if (fromDate) {
+             var fromTimestamp = new Date(fromDate).getTime();
+             images = images.filter(function (item) {
+               return new Date(item.captured_at).getTime() >= fromTimestamp;
+             });
+           }
+
+           if (toDate) {
+             var toTimestamp = new Date(toDate).getTime();
+             images = images.filter(function (item) {
+               return new Date(item.captured_at).getTime() <= toTimestamp;
+             });
+           }
+
+           if (usernames) {
+             images = images.filter(function (item) {
+               return usernames.indexOf(item.captured_by) !== -1;
+             });
+           }
+
+           return images;
+         }
+
+         function filterSequences(sequences) {
+           var fromDate = context.photos().fromDate();
+           var toDate = context.photos().toDate();
+           var usernames = context.photos().usernames();
+
+           if (fromDate) {
+             var fromTimestamp = new Date(fromDate).getTime();
+             sequences = sequences.filter(function (image) {
+               return new Date(image.properties.captured_at).getTime() >= fromTimestamp;
+             });
+           }
+
+           if (toDate) {
+             var toTimestamp = new Date(toDate).getTime();
+             sequences = sequences.filter(function (image) {
+               return new Date(image.properties.captured_at).getTime() <= toTimestamp;
+             });
+           }
+
+           if (usernames) {
+             sequences = sequences.filter(function (image) {
+               return usernames.indexOf(image.properties.captured_by) !== -1;
+             });
+           }
+
+           return sequences;
+         }
+
+         function update() {
+           var viewer = context.container().select('.photoviewer');
+           var selected = viewer.empty() ? undefined : viewer.datum();
+           var z = ~~context.map().zoom();
+           var showMarkers = z >= minMarkerZoom;
+           var showViewfields = z >= minViewfieldZoom;
+           var service = getService();
+           var sequences = [];
+           var images = [];
+
+           if (context.photos().showsFlat()) {
+             sequences = service ? service.sequences(projection) : [];
+             images = service && showMarkers ? service.images(projection) : [];
+             sequences = filterSequences(sequences);
+             images = filterImages(images);
+           }
+
+           var traces = layer.selectAll('.sequences').selectAll('.sequence').data(sequences, function (d) {
+             return d.properties.key;
+           }); // exit
+
+           traces.exit().remove(); // enter/update
+
+           traces = traces.enter().append('path').attr('class', 'sequence').merge(traces).attr('d', svgPath(projection).geojson);
+           var groups = layer.selectAll('.markers').selectAll('.viewfield-group').data(images, function (d) {
+             return d.key;
+           }); // exit
+
+           groups.exit().remove(); // enter
+
+           var groupsEnter = groups.enter().append('g').attr('class', 'viewfield-group').on('mouseenter', mouseover).on('mouseleave', mouseout).on('click', click);
+           groupsEnter.append('g').attr('class', 'viewfield-scale'); // update
+
+           var markers = groups.merge(groupsEnter).sort(function (a, b) {
+             return a === selected ? 1 : b === selected ? -1 : b.loc[1] - a.loc[1]; // sort Y
+           }).attr('transform', transform).select('.viewfield-scale');
+           markers.selectAll('circle').data([0]).enter().append('circle').attr('dx', '0').attr('dy', '0').attr('r', '6');
+           var viewfields = markers.selectAll('.viewfield').data(showViewfields ? [0] : []);
+           viewfields.exit().remove();
+           viewfields.enter() // viewfields may or may not be drawn...
+           .insert('path', 'circle') // but if they are, draw below the circles
+           .attr('class', 'viewfield').attr('transform', 'scale(1.5,1.5),translate(-8, -13)').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');
+         }
+
+         function drawImages(selection) {
+           var enabled = svgKartaviewImages.enabled,
+               service = getService();
+           layer = selection.selectAll('.layer-kartaview').data(service ? [0] : []);
+           layer.exit().remove();
+           var layerEnter = layer.enter().append('g').attr('class', 'layer-kartaview').style('display', enabled ? 'block' : 'none');
+           layerEnter.append('g').attr('class', 'sequences');
+           layerEnter.append('g').attr('class', 'markers');
+           layer = layerEnter.merge(layer);
+
+           if (enabled) {
+             if (service && ~~context.map().zoom() >= minZoom) {
+               editOn();
+               update();
+               service.loadImages(projection);
+             } else {
+               editOff();
+             }
+           }
+         }
+
+         drawImages.enabled = function (_) {
+           if (!arguments.length) return svgKartaviewImages.enabled;
+           svgKartaviewImages.enabled = _;
+
+           if (svgKartaviewImages.enabled) {
+             showLayer();
+             context.photos().on('change.kartaview_images', update);
+           } else {
+             hideLayer();
+             context.photos().on('change.kartaview_images', null);
+           }
+
+           dispatch.call('change');
+           return this;
+         };
+
+         drawImages.supported = function () {
+           return !!getService();
+         };
+
+         init();
+         return drawImages;
+       }
+
+       function svgOsm(projection, context, dispatch) {
+         var enabled = true;
+
+         function drawOsm(selection) {
+           selection.selectAll('.layer-osm').data(['covered', 'areas', 'lines', 'points', 'labels']).enter().append('g').attr('class', function (d) {
+             return 'layer-osm ' + d;
+           });
+           selection.selectAll('.layer-osm.points').selectAll('.points-group').data(['points', 'midpoints', 'vertices', 'turns']).enter().append('g').attr('class', function (d) {
+             return 'points-group ' + d;
+           });
+         }
+
+         function showLayer() {
+           var layer = context.surface().selectAll('.data-layer.osm');
+           layer.interrupt();
+           layer.classed('disabled', false).style('opacity', 0).transition().duration(250).style('opacity', 1).on('end interrupt', function () {
+             dispatch.call('change');
+           });
+         }
+
+         function hideLayer() {
+           var layer = context.surface().selectAll('.data-layer.osm');
+           layer.interrupt();
+           layer.transition().duration(250).style('opacity', 0).on('end interrupt', function () {
+             layer.classed('disabled', true);
+             dispatch.call('change');
+           });
+         }
+
+         drawOsm.enabled = function (val) {
+           if (!arguments.length) return enabled;
+           enabled = val;
+
+           if (enabled) {
+             showLayer();
+           } else {
+             hideLayer();
+           }
+
+           dispatch.call('change');
+           return this;
+         };
+
+         return drawOsm;
+       }
+
+       var _notesEnabled = false;
+
+       var _osmService;
+
+       function svgNotes(projection, context, dispatch) {
+         if (!dispatch) {
+           dispatch = dispatch$8('change');
+         }
+
+         var throttledRedraw = throttle(function () {
+           dispatch.call('change');
+         }, 1000);
+
+         var minZoom = 12;
+         var touchLayer = select(null);
+         var drawLayer = select(null);
+         var _notesVisible = false;
+
+         function markerPath(selection, klass) {
+           selection.attr('class', klass).attr('transform', 'translate(-8, -22)').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');
+         } // Loosely-coupled osm service for fetching notes.
+
+
+         function getService() {
+           if (services.osm && !_osmService) {
+             _osmService = services.osm;
+
+             _osmService.on('loadedNotes', throttledRedraw);
+           } else if (!services.osm && _osmService) {
+             _osmService = null;
+           }
+
+           return _osmService;
+         } // Show the notes
+
+
+         function editOn() {
+           if (!_notesVisible) {
+             _notesVisible = true;
+             drawLayer.style('display', 'block');
+           }
+         } // Immediately remove the notes and their touch targets
+
+
+         function editOff() {
+           if (_notesVisible) {
+             _notesVisible = false;
+             drawLayer.style('display', 'none');
+             drawLayer.selectAll('.note').remove();
+             touchLayer.selectAll('.note').remove();
+           }
+         } // Enable the layer.  This shows the notes and transitions them to visible.
+
+
+         function layerOn() {
+           editOn();
+           drawLayer.style('opacity', 0).transition().duration(250).style('opacity', 1).on('end interrupt', function () {
+             dispatch.call('change');
+           });
+         } // Disable the layer.  This transitions the layer invisible and then hides the notes.
+
+
+         function layerOff() {
+           throttledRedraw.cancel();
+           drawLayer.interrupt();
+           touchLayer.selectAll('.note').remove();
+           drawLayer.transition().duration(250).style('opacity', 0).on('end interrupt', function () {
+             editOff();
+             dispatch.call('change');
+           });
+         } // Update the note markers
+
+
+         function updateMarkers() {
+           if (!_notesVisible || !_notesEnabled) return;
+           var service = getService();
+           var selectedID = context.selectedNoteID();
+           var data = service ? service.notes(projection) : [];
+           var getTransform = svgPointTransform(projection); // Draw markers..
+
+           var notes = drawLayer.selectAll('.note').data(data, function (d) {
+             return d.status + d.id;
+           }); // exit
+
+           notes.exit().remove(); // enter
+
+           var notesEnter = notes.enter().append('g').attr('class', function (d) {
+             return 'note note-' + d.id + ' ' + d.status;
+           }).classed('new', function (d) {
+             return d.id < 0;
+           });
+           notesEnter.append('ellipse').attr('cx', 0.5).attr('cy', 1).attr('rx', 6.5).attr('ry', 3).attr('class', 'stroke');
+           notesEnter.append('path').call(markerPath, 'shadow');
+           notesEnter.append('use').attr('class', 'note-fill').attr('width', '20px').attr('height', '20px').attr('x', '-8px').attr('y', '-22px').attr('xlink:href', '#iD-icon-note');
+           notesEnter.selectAll('.icon-annotation').data(function (d) {
+             return [d];
+           }).enter().append('use').attr('class', 'icon-annotation').attr('width', '10px').attr('height', '10px').attr('x', '-3px').attr('y', '-19px').attr('xlink:href', function (d) {
+             if (d.id < 0) return '#iD-icon-plus';
+             if (d.status === 'open') return '#iD-icon-close';
+             return '#iD-icon-apply';
+           }); // update
+
+           notes.merge(notesEnter).sort(sortY).classed('selected', function (d) {
+             var mode = context.mode();
+             var isMoving = mode && mode.id === 'drag-note'; // no shadows when dragging
+
+             return !isMoving && d.id === selectedID;
+           }).attr('transform', getTransform); // Draw targets..
+
+           if (touchLayer.empty()) return;
+           var fillClass = context.getDebug('target') ? 'pink ' : 'nocolor ';
+           var targets = touchLayer.selectAll('.note').data(data, function (d) {
+             return d.id;
+           }); // exit
+
+           targets.exit().remove(); // enter/update
+
+           targets.enter().append('rect').attr('width', '20px').attr('height', '20px').attr('x', '-8px').attr('y', '-22px').merge(targets).sort(sortY).attr('class', function (d) {
+             var newClass = d.id < 0 ? 'new' : '';
+             return 'note target note-' + d.id + ' ' + fillClass + newClass;
+           }).attr('transform', getTransform);
+
+           function sortY(a, b) {
+             if (a.id === selectedID) return 1;
+             if (b.id === selectedID) return -1;
+             return b.loc[1] - a.loc[1];
+           }
+         } // Draw the notes layer and schedule loading notes and updating markers.
+
+
+         function drawNotes(selection) {
+           var service = getService();
+           var surface = context.surface();
+
+           if (surface && !surface.empty()) {
+             touchLayer = surface.selectAll('.data-layer.touch .layer-touch.markers');
+           }
+
+           drawLayer = selection.selectAll('.layer-notes').data(service ? [0] : []);
+           drawLayer.exit().remove();
+           drawLayer = drawLayer.enter().append('g').attr('class', 'layer-notes').style('display', _notesEnabled ? 'block' : 'none').merge(drawLayer);
+
+           if (_notesEnabled) {
+             if (service && ~~context.map().zoom() >= minZoom) {
+               editOn();
+               service.loadNotes(projection);
+               updateMarkers();
+             } else {
+               editOff();
+             }
+           }
+         } // Toggles the layer on and off
+
+
+         drawNotes.enabled = function (val) {
+           if (!arguments.length) return _notesEnabled;
+           _notesEnabled = val;
+
+           if (_notesEnabled) {
+             layerOn();
+           } else {
+             layerOff();
+
+             if (context.selectedNoteID()) {
+               context.enter(modeBrowse(context));
+             }
+           }
+
+           dispatch.call('change');
+           return this;
+         };
+
+         return drawNotes;
+       }
+
+       function svgTouch() {
+         function drawTouch(selection) {
+           selection.selectAll('.layer-touch').data(['areas', 'lines', 'points', 'turns', 'markers']).enter().append('g').attr('class', function (d) {
+             return 'layer-touch ' + d;
+           });
+         }
+
+         return drawTouch;
+       }
+
+       function refresh(selection, node) {
+         var cr = node.getBoundingClientRect();
+         var prop = [cr.width, cr.height];
+         selection.property('__dimensions__', prop);
+         return prop;
+       }
+
+       function utilGetDimensions(selection, force) {
+         if (!selection || selection.empty()) {
+           return [0, 0];
+         }
+
+         var node = selection.node(),
+             cached = selection.property('__dimensions__');
+         return !cached || force ? refresh(selection, node) : cached;
+       }
+       function utilSetDimensions(selection, dimensions) {
+         if (!selection || selection.empty()) {
+           return selection;
+         }
+
+         var node = selection.node();
+
+         if (dimensions === null) {
+           refresh(selection, node);
+           return selection;
+         }
+
+         return selection.property('__dimensions__', [dimensions[0], dimensions[1]]).attr('width', dimensions[0]).attr('height', dimensions[1]);
+       }
+
+       function svgLayers(projection, context) {
+         var dispatch = dispatch$8('change');
+         var svg = select(null);
+         var _layers = [{
+           id: 'osm',
+           layer: svgOsm(projection, context, dispatch)
+         }, {
+           id: 'notes',
+           layer: svgNotes(projection, context, dispatch)
+         }, {
+           id: 'data',
+           layer: svgData(projection, context, dispatch)
+         }, {
+           id: 'keepRight',
+           layer: svgKeepRight(projection, context, dispatch)
+         }, {
+           id: 'improveOSM',
+           layer: svgImproveOSM(projection, context, dispatch)
+         }, {
+           id: 'osmose',
+           layer: svgOsmose(projection, context, dispatch)
+         }, {
+           id: 'streetside',
+           layer: svgStreetside(projection, context, dispatch)
+         }, {
+           id: 'mapillary',
+           layer: svgMapillaryImages(projection, context, dispatch)
+         }, {
+           id: 'mapillary-position',
+           layer: svgMapillaryPosition(projection, context)
+         }, {
+           id: 'mapillary-map-features',
+           layer: svgMapillaryMapFeatures(projection, context, dispatch)
+         }, {
+           id: 'mapillary-signs',
+           layer: svgMapillarySigns(projection, context, dispatch)
+         }, {
+           id: 'kartaview',
+           layer: svgKartaviewImages(projection, context, dispatch)
+         }, {
+           id: 'debug',
+           layer: svgDebug(projection, context)
+         }, {
+           id: 'geolocate',
+           layer: svgGeolocate(projection)
+         }, {
+           id: 'touch',
+           layer: svgTouch()
+         }];
+
+         function drawLayers(selection) {
+           svg = selection.selectAll('.surface').data([0]);
+           svg = svg.enter().append('svg').attr('class', 'surface').merge(svg);
+           var defs = svg.selectAll('.surface-defs').data([0]);
+           defs.enter().append('defs').attr('class', 'surface-defs');
+           var groups = svg.selectAll('.data-layer').data(_layers);
+           groups.exit().remove();
+           groups.enter().append('g').attr('class', function (d) {
+             return 'data-layer ' + d.id;
+           }).merge(groups).each(function (d) {
+             select(this).call(d.layer);
+           });
+         }
+
+         drawLayers.all = function () {
+           return _layers;
+         };
+
+         drawLayers.layer = function (id) {
+           var obj = _layers.find(function (o) {
+             return o.id === id;
+           });
+
+           return obj && obj.layer;
+         };
+
+         drawLayers.only = function (what) {
+           var arr = [].concat(what);
+
+           var all = _layers.map(function (layer) {
+             return layer.id;
+           });
+
+           return drawLayers.remove(utilArrayDifference(all, arr));
+         };
+
+         drawLayers.remove = function (what) {
+           var arr = [].concat(what);
+           arr.forEach(function (id) {
+             _layers = _layers.filter(function (o) {
+               return o.id !== id;
+             });
+           });
+           dispatch.call('change');
+           return this;
+         };
+
+         drawLayers.add = function (what) {
+           var arr = [].concat(what);
+           arr.forEach(function (obj) {
+             if ('id' in obj && 'layer' in obj) {
+               _layers.push(obj);
+             }
+           });
+           dispatch.call('change');
+           return this;
+         };
+
+         drawLayers.dimensions = function (val) {
+           if (!arguments.length) return utilGetDimensions(svg);
+           utilSetDimensions(svg, val);
+           return this;
+         };
+
+         return utilRebind(drawLayers, dispatch, 'on');
+       }
+
+       function svgLines(projection, context) {
+         var detected = utilDetect();
+         var highway_stack = {
+           motorway: 0,
+           motorway_link: 1,
+           trunk: 2,
+           trunk_link: 3,
+           primary: 4,
+           primary_link: 5,
+           secondary: 6,
+           tertiary: 7,
+           unclassified: 8,
+           residential: 9,
+           service: 10,
+           footway: 11
+         };
+
+         function drawTargets(selection, graph, entities, filter) {
+           var targetClass = context.getDebug('target') ? 'pink ' : 'nocolor ';
+           var nopeClass = context.getDebug('target') ? 'red ' : 'nocolor ';
+           var getPath = svgPath(projection).geojson;
+           var activeID = context.activeID();
+           var base = context.history().base(); // The targets and nopes will be MultiLineString sub-segments of the ways
+
+           var data = {
+             targets: [],
+             nopes: []
+           };
+           entities.forEach(function (way) {
+             var features = svgSegmentWay(way, graph, activeID);
+             data.targets.push.apply(data.targets, features.passive);
+             data.nopes.push.apply(data.nopes, features.active);
+           }); // Targets allow hover and vertex snapping
+
+           var targetData = data.targets.filter(getPath);
+           var targets = selection.selectAll('.line.target-allowed').filter(function (d) {
+             return filter(d.properties.entity);
+           }).data(targetData, function key(d) {
+             return d.id;
+           }); // exit
+
+           targets.exit().remove();
+
+           var segmentWasEdited = function segmentWasEdited(d) {
+             var wayID = d.properties.entity.id; // if the whole line was edited, don't draw segment changes
+
+             if (!base.entities[wayID] || !fastDeepEqual(graph.entities[wayID].nodes, base.entities[wayID].nodes)) {
+               return false;
+             }
+
+             return d.properties.nodes.some(function (n) {
+               return !base.entities[n.id] || !fastDeepEqual(graph.entities[n.id].loc, base.entities[n.id].loc);
+             });
+           }; // enter/update
+
+
+           targets.enter().append('path').merge(targets).attr('d', getPath).attr('class', function (d) {
+             return 'way line target target-allowed ' + targetClass + d.id;
+           }).classed('segment-edited', segmentWasEdited); // NOPE
+
+           var nopeData = data.nopes.filter(getPath);
+           var nopes = selection.selectAll('.line.target-nope').filter(function (d) {
+             return filter(d.properties.entity);
+           }).data(nopeData, function key(d) {
+             return d.id;
+           }); // exit
+
+           nopes.exit().remove(); // enter/update
+
+           nopes.enter().append('path').merge(nopes).attr('d', getPath).attr('class', function (d) {
+             return 'way line target target-nope ' + nopeClass + d.id;
+           }).classed('segment-edited', segmentWasEdited);
+         }
+
+         function drawLines(selection, graph, entities, filter) {
+           var base = context.history().base();
+
+           function waystack(a, b) {
+             var selected = context.selectedIDs();
+             var scoreA = selected.indexOf(a.id) !== -1 ? 20 : 0;
+             var scoreB = selected.indexOf(b.id) !== -1 ? 20 : 0;
+
+             if (a.tags.highway) {
+               scoreA -= highway_stack[a.tags.highway];
+             }
+
+             if (b.tags.highway) {
+               scoreB -= highway_stack[b.tags.highway];
+             }
+
+             return scoreA - scoreB;
+           }
+
+           function drawLineGroup(selection, klass, isSelected) {
+             // Note: Don't add `.selected` class in draw modes
+             var mode = context.mode();
+             var isDrawing = mode && /^draw/.test(mode.id);
+             var selectedClass = !isDrawing && isSelected ? 'selected ' : '';
+             var lines = selection.selectAll('path').filter(filter).data(getPathData(isSelected), osmEntity.key);
+             lines.exit().remove(); // Optimization: Call expensive TagClasses only on enter selection. This
+             // works because osmEntity.key is defined to include the entity v attribute.
+
+             lines.enter().append('path').attr('class', function (d) {
+               var prefix = 'way line'; // if this line isn't styled by its own tags
+
+               if (!d.hasInterestingTags()) {
+                 var parentRelations = graph.parentRelations(d);
+                 var parentMultipolygons = parentRelations.filter(function (relation) {
+                   return relation.isMultipolygon();
+                 }); // and if it's a member of at least one multipolygon relation
+
+                 if (parentMultipolygons.length > 0 && // and only multipolygon relations
+                 parentRelations.length === parentMultipolygons.length) {
+                   // then fudge the classes to style this as an area edge
+                   prefix = 'relation area';
+                 }
+               }
+
+               var oldMPClass = oldMultiPolygonOuters[d.id] ? 'old-multipolygon ' : '';
+               return prefix + ' ' + klass + ' ' + selectedClass + oldMPClass + d.id;
+             }).classed('added', function (d) {
+               return !base.entities[d.id];
+             }).classed('geometry-edited', function (d) {
+               return graph.entities[d.id] && base.entities[d.id] && !fastDeepEqual(graph.entities[d.id].nodes, base.entities[d.id].nodes);
+             }).classed('retagged', function (d) {
+               return graph.entities[d.id] && base.entities[d.id] && !fastDeepEqual(graph.entities[d.id].tags, base.entities[d.id].tags);
+             }).call(svgTagClasses()).merge(lines).sort(waystack).attr('d', getPath).call(svgTagClasses().tags(svgRelationMemberTags(graph)));
+             return selection;
+           }
+
+           function getPathData(isSelected) {
+             return function () {
+               var layer = this.parentNode.__data__;
+               var data = pathdata[layer] || [];
+               return data.filter(function (d) {
+                 if (isSelected) {
+                   return context.selectedIDs().indexOf(d.id) !== -1;
+                 } else {
+                   return context.selectedIDs().indexOf(d.id) === -1;
+                 }
+               });
+             };
+           }
+
+           function addMarkers(layergroup, pathclass, groupclass, groupdata, marker) {
+             var markergroup = layergroup.selectAll('g.' + groupclass).data([pathclass]);
+             markergroup = markergroup.enter().append('g').attr('class', groupclass).merge(markergroup);
+             var markers = markergroup.selectAll('path').filter(filter).data(function data() {
+               return groupdata[this.parentNode.__data__] || [];
+             }, function key(d) {
+               return [d.id, d.index];
+             });
+             markers.exit().remove();
+             markers = markers.enter().append('path').attr('class', pathclass).merge(markers).attr('marker-mid', marker).attr('d', function (d) {
+               return d.d;
+             });
+
+             if (detected.ie) {
+               markers.each(function () {
+                 this.parentNode.insertBefore(this, this);
+               });
+             }
+           }
+
+           var getPath = svgPath(projection, graph);
+           var ways = [];
+           var onewaydata = {};
+           var sideddata = {};
+           var oldMultiPolygonOuters = {};
+
+           for (var i = 0; i < entities.length; i++) {
+             var entity = entities[i];
+             var outer = osmOldMultipolygonOuterMember(entity, graph);
+
+             if (outer) {
+               ways.push(entity.mergeTags(outer.tags));
+               oldMultiPolygonOuters[outer.id] = true;
+             } else if (entity.geometry(graph) === 'line') {
+               ways.push(entity);
+             }
+           }
+
+           ways = ways.filter(getPath);
+           var pathdata = utilArrayGroupBy(ways, function (way) {
+             return way.layer();
+           });
+           Object.keys(pathdata).forEach(function (k) {
+             var v = pathdata[k];
+             var onewayArr = v.filter(function (d) {
+               return d.isOneWay();
+             });
+             var onewaySegments = svgMarkerSegments(projection, graph, 35, function shouldReverse(entity) {
+               return entity.tags.oneway === '-1';
+             }, function bothDirections(entity) {
+               return entity.tags.oneway === 'reversible' || entity.tags.oneway === 'alternating';
+             });
+             onewaydata[k] = utilArrayFlatten(onewayArr.map(onewaySegments));
+             var sidedArr = v.filter(function (d) {
+               return d.isSided();
+             });
+             var sidedSegments = svgMarkerSegments(projection, graph, 30, function shouldReverse() {
+               return false;
+             }, function bothDirections() {
+               return false;
+             });
+             sideddata[k] = utilArrayFlatten(sidedArr.map(sidedSegments));
+           });
+           var covered = selection.selectAll('.layer-osm.covered'); // under areas
+
+           var uncovered = selection.selectAll('.layer-osm.lines'); // over areas
+
+           var touchLayer = selection.selectAll('.layer-touch.lines'); // Draw lines..
+
+           [covered, uncovered].forEach(function (selection) {
+             var range = selection === covered ? range$1(-10, 0) : range$1(0, 11);
+             var layergroup = selection.selectAll('g.layergroup').data(range);
+             layergroup = layergroup.enter().append('g').attr('class', function (d) {
+               return 'layergroup layer' + String(d);
+             }).merge(layergroup);
+             layergroup.selectAll('g.linegroup').data(['shadow', 'casing', 'stroke', 'shadow-highlighted', 'casing-highlighted', 'stroke-highlighted']).enter().append('g').attr('class', function (d) {
+               return 'linegroup line-' + d;
+             });
+             layergroup.selectAll('g.line-shadow').call(drawLineGroup, 'shadow', false);
+             layergroup.selectAll('g.line-casing').call(drawLineGroup, 'casing', false);
+             layergroup.selectAll('g.line-stroke').call(drawLineGroup, 'stroke', false);
+             layergroup.selectAll('g.line-shadow-highlighted').call(drawLineGroup, 'shadow', true);
+             layergroup.selectAll('g.line-casing-highlighted').call(drawLineGroup, 'casing', true);
+             layergroup.selectAll('g.line-stroke-highlighted').call(drawLineGroup, 'stroke', true);
+             addMarkers(layergroup, 'oneway', 'onewaygroup', onewaydata, 'url(#ideditor-oneway-marker)');
+             addMarkers(layergroup, 'sided', 'sidedgroup', sideddata, function marker(d) {
+               var category = graph.entity(d.id).sidednessIdentifier();
+               return 'url(#ideditor-sided-marker-' + category + ')';
+             });
+           }); // Draw touch targets..
+
+           touchLayer.call(drawTargets, graph, ways, filter);
+         }
+
+         return drawLines;
+       }
+
+       function svgMidpoints(projection, context) {
+         var targetRadius = 8;
+
+         function drawTargets(selection, graph, entities, filter) {
+           var fillClass = context.getDebug('target') ? 'pink ' : 'nocolor ';
+           var getTransform = svgPointTransform(projection).geojson;
+           var data = entities.map(function (midpoint) {
+             return {
+               type: 'Feature',
+               id: midpoint.id,
+               properties: {
+                 target: true,
+                 entity: midpoint
+               },
+               geometry: {
+                 type: 'Point',
+                 coordinates: midpoint.loc
+               }
+             };
+           });
+           var targets = selection.selectAll('.midpoint.target').filter(function (d) {
+             return filter(d.properties.entity);
+           }).data(data, function key(d) {
+             return d.id;
+           }); // exit
+
+           targets.exit().remove(); // enter/update
+
+           targets.enter().append('circle').attr('r', targetRadius).merge(targets).attr('class', function (d) {
+             return 'node midpoint target ' + fillClass + d.id;
+           }).attr('transform', getTransform);
+         }
+
+         function drawMidpoints(selection, graph, entities, filter, extent) {
+           var drawLayer = selection.selectAll('.layer-osm.points .points-group.midpoints');
+           var touchLayer = selection.selectAll('.layer-touch.points');
+           var mode = context.mode();
+
+           if (mode && mode.id !== 'select' || !context.map().withinEditableZoom()) {
+             drawLayer.selectAll('.midpoint').remove();
+             touchLayer.selectAll('.midpoint.target').remove();
+             return;
+           }
+
+           var poly = extent.polygon();
+           var midpoints = {};
+
+           for (var i = 0; i < entities.length; i++) {
+             var entity = entities[i];
+             if (entity.type !== 'way') continue;
+             if (!filter(entity)) continue;
+             if (context.selectedIDs().indexOf(entity.id) < 0) continue;
+             var nodes = graph.childNodes(entity);
+
+             for (var j = 0; j < nodes.length - 1; j++) {
+               var a = nodes[j];
+               var b = nodes[j + 1];
+               var id = [a.id, b.id].sort().join('-');
+
+               if (midpoints[id]) {
+                 midpoints[id].parents.push(entity);
+               } else if (geoVecLength(projection(a.loc), projection(b.loc)) > 40) {
+                 var point = geoVecInterp(a.loc, b.loc, 0.5);
+                 var loc = null;
+
+                 if (extent.intersects(point)) {
+                   loc = point;
+                 } else {
+                   for (var k = 0; k < 4; k++) {
+                     point = geoLineIntersection([a.loc, b.loc], [poly[k], poly[k + 1]]);
+
+                     if (point && geoVecLength(projection(a.loc), projection(point)) > 20 && geoVecLength(projection(b.loc), projection(point)) > 20) {
+                       loc = point;
+                       break;
+                     }
+                   }
+                 }
+
+                 if (loc) {
+                   midpoints[id] = {
+                     type: 'midpoint',
+                     id: id,
+                     loc: loc,
+                     edge: [a.id, b.id],
+                     parents: [entity]
+                   };
+                 }
+               }
+             }
+           }
+
+           function midpointFilter(d) {
+             if (midpoints[d.id]) return true;
+
+             for (var i = 0; i < d.parents.length; i++) {
+               if (filter(d.parents[i])) {
+                 return true;
+               }
+             }
+
+             return false;
+           }
+
+           var groups = drawLayer.selectAll('.midpoint').filter(midpointFilter).data(Object.values(midpoints), function (d) {
+             return d.id;
+           });
+           groups.exit().remove();
+           var enter = groups.enter().insert('g', ':first-child').attr('class', 'midpoint');
+           enter.append('polygon').attr('points', '-6,8 10,0 -6,-8').attr('class', 'shadow');
+           enter.append('polygon').attr('points', '-3,4 5,0 -3,-4').attr('class', 'fill');
+           groups = groups.merge(enter).attr('transform', function (d) {
+             var translate = svgPointTransform(projection);
+             var a = graph.entity(d.edge[0]);
+             var b = graph.entity(d.edge[1]);
+             var angle = geoAngle(a, b, projection) * (180 / Math.PI);
+             return translate(d) + ' rotate(' + angle + ')';
+           }).call(svgTagClasses().tags(function (d) {
+             return d.parents[0].tags;
+           })); // Propagate data bindings.
+
+           groups.select('polygon.shadow');
+           groups.select('polygon.fill'); // Draw touch targets..
+
+           touchLayer.call(drawTargets, graph, Object.values(midpoints), midpointFilter);
+         }
+
+         return drawMidpoints;
+       }
+
+       function svgPoints(projection, context) {
+         function markerPath(selection, klass) {
+           selection.attr('class', klass).attr('transform', 'translate(-8, -23)').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');
+         }
+
+         function sortY(a, b) {
+           return b.loc[1] - a.loc[1];
+         } // Avoid exit/enter if we're just moving stuff around.
+         // The node will get a new version but we only need to run the update selection.
+
+
+         function fastEntityKey(d) {
+           var mode = context.mode();
+           var isMoving = mode && /^(add|draw|drag|move|rotate)/.test(mode.id);
+           return isMoving ? d.id : osmEntity.key(d);
+         }
+
+         function drawTargets(selection, graph, entities, filter) {
+           var fillClass = context.getDebug('target') ? 'pink ' : 'nocolor ';
+           var getTransform = svgPointTransform(projection).geojson;
+           var activeID = context.activeID();
+           var data = [];
+           entities.forEach(function (node) {
+             if (activeID === node.id) return; // draw no target on the activeID
+
+             data.push({
+               type: 'Feature',
+               id: node.id,
+               properties: {
+                 target: true,
+                 entity: node
+               },
+               geometry: node.asGeoJSON()
+             });
+           });
+           var targets = selection.selectAll('.point.target').filter(function (d) {
+             return filter(d.properties.entity);
+           }).data(data, function key(d) {
+             return d.id;
+           }); // exit
+
+           targets.exit().remove(); // enter/update
+
+           targets.enter().append('rect').attr('x', -10).attr('y', -26).attr('width', 20).attr('height', 30).merge(targets).attr('class', function (d) {
+             return 'node point target ' + fillClass + d.id;
+           }).attr('transform', getTransform);
+         }
+
+         function drawPoints(selection, graph, entities, filter) {
+           var wireframe = context.surface().classed('fill-wireframe');
+           var zoom = geoScaleToZoom(projection.scale());
+           var base = context.history().base(); // Points with a direction will render as vertices at higher zooms..
+
+           function renderAsPoint(entity) {
+             return entity.geometry(graph) === 'point' && !(zoom >= 18 && entity.directions(graph, projection).length);
+           } // All points will render as vertices in wireframe mode too..
+
+
+           var points = wireframe ? [] : entities.filter(renderAsPoint);
+           points.sort(sortY);
+           var drawLayer = selection.selectAll('.layer-osm.points .points-group.points');
+           var touchLayer = selection.selectAll('.layer-touch.points'); // Draw points..
+
+           var groups = drawLayer.selectAll('g.point').filter(filter).data(points, fastEntityKey);
+           groups.exit().remove();
+           var enter = groups.enter().append('g').attr('class', function (d) {
+             return 'node point ' + d.id;
+           }).order();
+           enter.append('path').call(markerPath, 'shadow');
+           enter.append('ellipse').attr('cx', 0.5).attr('cy', 1).attr('rx', 6.5).attr('ry', 3).attr('class', 'stroke');
+           enter.append('path').call(markerPath, 'stroke');
+           enter.append('use').attr('transform', 'translate(-5, -19)').attr('class', 'icon').attr('width', '11px').attr('height', '11px');
+           groups = groups.merge(enter).attr('transform', svgPointTransform(projection)).classed('added', function (d) {
+             return !base.entities[d.id]; // if it doesn't exist in the base graph, it's new
+           }).classed('moved', function (d) {
+             return base.entities[d.id] && !fastDeepEqual(graph.entities[d.id].loc, base.entities[d.id].loc);
+           }).classed('retagged', function (d) {
+             return base.entities[d.id] && !fastDeepEqual(graph.entities[d.id].tags, base.entities[d.id].tags);
+           }).call(svgTagClasses());
+           groups.select('.shadow'); // propagate bound data
+
+           groups.select('.stroke'); // propagate bound data
+
+           groups.select('.icon') // propagate bound data
+           .attr('xlink:href', function (entity) {
+             var preset = _mainPresetIndex.match(entity, graph);
+             var picon = preset && preset.icon;
+
+             if (!picon) {
+               return '';
+             } else {
+               var isMaki = /^maki-/.test(picon);
+               return '#' + picon + (isMaki ? '-11' : '');
+             }
+           }); // Draw touch targets..
+
+           touchLayer.call(drawTargets, graph, points, filter);
+         }
+
+         return drawPoints;
+       }
+
+       function svgTurns(projection, context) {
+         function icon(turn) {
+           var u = turn.u ? '-u' : '';
+           if (turn.no) return '#iD-turn-no' + u;
+           if (turn.only) return '#iD-turn-only' + u;
+           return '#iD-turn-yes' + u;
+         }
+
+         function drawTurns(selection, graph, turns) {
+           function turnTransform(d) {
+             var pxRadius = 50;
+             var toWay = graph.entity(d.to.way);
+             var toPoints = graph.childNodes(toWay).map(function (n) {
+               return n.loc;
+             }).map(projection);
+             var toLength = geoPathLength(toPoints);
+             var mid = toLength / 2; // midpoint of destination way
+
+             var toNode = graph.entity(d.to.node);
+             var toVertex = graph.entity(d.to.vertex);
+             var a = geoAngle(toVertex, toNode, projection);
+             var o = projection(toVertex.loc);
+             var r = d.u ? 0 // u-turn: no radius
+             : !toWay.__via ? pxRadius // leaf way: put marker at pxRadius
+             : Math.min(mid, pxRadius); // via way: prefer pxRadius, fallback to mid for very short ways
+
+             return 'translate(' + (r * Math.cos(a) + o[0]) + ',' + (r * Math.sin(a) + o[1]) + ') ' + 'rotate(' + a * 180 / Math.PI + ')';
+           }
+
+           var drawLayer = selection.selectAll('.layer-osm.points .points-group.turns');
+           var touchLayer = selection.selectAll('.layer-touch.turns'); // Draw turns..
+
+           var groups = drawLayer.selectAll('g.turn').data(turns, function (d) {
+             return d.key;
+           }); // exit
+
+           groups.exit().remove(); // enter
+
+           var groupsEnter = groups.enter().append('g').attr('class', function (d) {
+             return 'turn ' + d.key;
+           });
+           var turnsEnter = groupsEnter.filter(function (d) {
+             return !d.u;
+           });
+           turnsEnter.append('rect').attr('transform', 'translate(-22, -12)').attr('width', '44').attr('height', '24');
+           turnsEnter.append('use').attr('transform', 'translate(-22, -12)').attr('width', '44').attr('height', '24');
+           var uEnter = groupsEnter.filter(function (d) {
+             return d.u;
+           });
+           uEnter.append('circle').attr('r', '16');
+           uEnter.append('use').attr('transform', 'translate(-16, -16)').attr('width', '32').attr('height', '32'); // update
+
+           groups = groups.merge(groupsEnter).attr('opacity', function (d) {
+             return d.direct === false ? '0.7' : null;
+           }).attr('transform', turnTransform);
+           groups.select('use').attr('xlink:href', icon);
+           groups.select('rect'); // propagate bound data
+
+           groups.select('circle'); // propagate bound data
+           // Draw touch targets..
+
+           var fillClass = context.getDebug('target') ? 'pink ' : 'nocolor ';
+           groups = touchLayer.selectAll('g.turn').data(turns, function (d) {
+             return d.key;
+           }); // exit
+
+           groups.exit().remove(); // enter
+
+           groupsEnter = groups.enter().append('g').attr('class', function (d) {
+             return 'turn ' + d.key;
+           });
+           turnsEnter = groupsEnter.filter(function (d) {
+             return !d.u;
+           });
+           turnsEnter.append('rect').attr('class', 'target ' + fillClass).attr('transform', 'translate(-22, -12)').attr('width', '44').attr('height', '24');
+           uEnter = groupsEnter.filter(function (d) {
+             return d.u;
+           });
+           uEnter.append('circle').attr('class', 'target ' + fillClass).attr('r', '16'); // update
+
+           groups = groups.merge(groupsEnter).attr('transform', turnTransform);
+           groups.select('rect'); // propagate bound data
+
+           groups.select('circle'); // propagate bound data
+
+           return this;
+         }
+
+         return drawTurns;
+       }
+
+       function svgVertices(projection, context) {
+         var radiuses = {
+           //       z16-, z17,   z18+,  w/icon
+           shadow: [6, 7.5, 7.5, 12],
+           stroke: [2.5, 3.5, 3.5, 8],
+           fill: [1, 1.5, 1.5, 1.5]
+         };
+
+         var _currHoverTarget;
+
+         var _currPersistent = {};
+         var _currHover = {};
+         var _prevHover = {};
+         var _currSelected = {};
+         var _prevSelected = {};
+         var _radii = {};
+
+         function sortY(a, b) {
+           return b.loc[1] - a.loc[1];
+         } // Avoid exit/enter if we're just moving stuff around.
+         // The node will get a new version but we only need to run the update selection.
+
+
+         function fastEntityKey(d) {
+           var mode = context.mode();
+           var isMoving = mode && /^(add|draw|drag|move|rotate)/.test(mode.id);
+           return isMoving ? d.id : osmEntity.key(d);
+         }
+
+         function draw(selection, graph, vertices, sets, filter) {
+           sets = sets || {
+             selected: {},
+             important: {},
+             hovered: {}
+           };
+           var icons = {};
+           var directions = {};
+           var wireframe = context.surface().classed('fill-wireframe');
+           var zoom = geoScaleToZoom(projection.scale());
+           var z = zoom < 17 ? 0 : zoom < 18 ? 1 : 2;
+           var activeID = context.activeID();
+           var base = context.history().base();
+
+           function getIcon(d) {
+             // always check latest entity, as fastEntityKey avoids enter/exit now
+             var entity = graph.entity(d.id);
+             if (entity.id in icons) return icons[entity.id];
+             icons[entity.id] = entity.hasInterestingTags() && _mainPresetIndex.match(entity, graph).icon;
+             return icons[entity.id];
+           } // memoize directions results, return false for empty arrays (for use in filter)
+
+
+           function getDirections(entity) {
+             if (entity.id in directions) return directions[entity.id];
+             var angles = entity.directions(graph, projection);
+             directions[entity.id] = angles.length ? angles : false;
+             return angles;
+           }
+
+           function updateAttributes(selection) {
+             ['shadow', 'stroke', 'fill'].forEach(function (klass) {
+               var rads = radiuses[klass];
+               selection.selectAll('.' + klass).each(function (entity) {
+                 var i = z && getIcon(entity);
+                 var r = rads[i ? 3 : z]; // slightly increase the size of unconnected endpoints #3775
+
+                 if (entity.id !== activeID && entity.isEndpoint(graph) && !entity.isConnected(graph)) {
+                   r += 1.5;
+                 }
+
+                 if (klass === 'shadow') {
+                   // remember this value, so we don't need to
+                   _radii[entity.id] = r; // recompute it when we draw the touch targets
+                 }
+
+                 select(this).attr('r', r).attr('visibility', i && klass === 'fill' ? 'hidden' : null);
+               });
+             });
+           }
+
+           vertices.sort(sortY);
+           var groups = selection.selectAll('g.vertex').filter(filter).data(vertices, fastEntityKey); // exit
+
+           groups.exit().remove(); // enter
+
+           var enter = groups.enter().append('g').attr('class', function (d) {
+             return 'node vertex ' + d.id;
+           }).order();
+           enter.append('circle').attr('class', 'shadow');
+           enter.append('circle').attr('class', 'stroke'); // Vertices with tags get a fill.
+
+           enter.filter(function (d) {
+             return d.hasInterestingTags();
+           }).append('circle').attr('class', 'fill'); // update
+
+           groups = groups.merge(enter).attr('transform', svgPointTransform(projection)).classed('sibling', function (d) {
+             return d.id in sets.selected;
+           }).classed('shared', function (d) {
+             return graph.isShared(d);
+           }).classed('endpoint', function (d) {
+             return d.isEndpoint(graph);
+           }).classed('added', function (d) {
+             return !base.entities[d.id]; // if it doesn't exist in the base graph, it's new
+           }).classed('moved', function (d) {
+             return base.entities[d.id] && !fastDeepEqual(graph.entities[d.id].loc, base.entities[d.id].loc);
+           }).classed('retagged', function (d) {
+             return base.entities[d.id] && !fastDeepEqual(graph.entities[d.id].tags, base.entities[d.id].tags);
+           }).call(updateAttributes); // Vertices with icons get a `use`.
+
+           var iconUse = groups.selectAll('.icon').data(function data(d) {
+             return zoom >= 17 && getIcon(d) ? [d] : [];
+           }, fastEntityKey); // exit
+
+           iconUse.exit().remove(); // enter
+
+           iconUse.enter().append('use').attr('class', 'icon').attr('width', '11px').attr('height', '11px').attr('transform', 'translate(-5.5, -5.5)').attr('xlink:href', function (d) {
+             var picon = getIcon(d);
+             var isMaki = /^maki-/.test(picon);
+             return '#' + picon + (isMaki ? '-11' : '');
+           }); // Vertices with directions get viewfields
+
+           var dgroups = groups.selectAll('.viewfieldgroup').data(function data(d) {
+             return zoom >= 18 && getDirections(d) ? [d] : [];
+           }, fastEntityKey); // exit
+
+           dgroups.exit().remove(); // enter/update
+
+           dgroups = dgroups.enter().insert('g', '.shadow').attr('class', 'viewfieldgroup').merge(dgroups);
+           var viewfields = dgroups.selectAll('.viewfield').data(getDirections, function key(d) {
+             return osmEntity.key(d);
+           }); // exit
+
+           viewfields.exit().remove(); // enter/update
+
+           viewfields.enter().append('path').attr('class', 'viewfield').attr('d', 'M0,0H0').merge(viewfields).attr('marker-start', 'url(#ideditor-viewfield-marker' + (wireframe ? '-wireframe' : '') + ')').attr('transform', function (d) {
+             return 'rotate(' + d + ')';
+           });
+         }
+
+         function drawTargets(selection, graph, entities, filter) {
+           var targetClass = context.getDebug('target') ? 'pink ' : 'nocolor ';
+           var nopeClass = context.getDebug('target') ? 'red ' : 'nocolor ';
+           var getTransform = svgPointTransform(projection).geojson;
+           var activeID = context.activeID();
+           var data = {
+             targets: [],
+             nopes: []
+           };
+           entities.forEach(function (node) {
+             if (activeID === node.id) return; // draw no target on the activeID
+
+             var vertexType = svgPassiveVertex(node, graph, activeID);
+
+             if (vertexType !== 0) {
+               // passive or adjacent - allow to connect
+               data.targets.push({
+                 type: 'Feature',
+                 id: node.id,
+                 properties: {
+                   target: true,
+                   entity: node
+                 },
+                 geometry: node.asGeoJSON()
+               });
+             } else {
+               data.nopes.push({
+                 type: 'Feature',
+                 id: node.id + '-nope',
+                 properties: {
+                   nope: true,
+                   target: true,
+                   entity: node
+                 },
+                 geometry: node.asGeoJSON()
+               });
+             }
+           }); // Targets allow hover and vertex snapping
+
+           var targets = selection.selectAll('.vertex.target-allowed').filter(function (d) {
+             return filter(d.properties.entity);
+           }).data(data.targets, function key(d) {
+             return d.id;
+           }); // exit
+
+           targets.exit().remove(); // enter/update
+
+           targets.enter().append('circle').attr('r', function (d) {
+             return _radii[d.id] || radiuses.shadow[3];
+           }).merge(targets).attr('class', function (d) {
+             return 'node vertex target target-allowed ' + targetClass + d.id;
+           }).attr('transform', getTransform); // NOPE
+
+           var nopes = selection.selectAll('.vertex.target-nope').filter(function (d) {
+             return filter(d.properties.entity);
+           }).data(data.nopes, function key(d) {
+             return d.id;
+           }); // exit
+
+           nopes.exit().remove(); // enter/update
+
+           nopes.enter().append('circle').attr('r', function (d) {
+             return _radii[d.properties.entity.id] || radiuses.shadow[3];
+           }).merge(nopes).attr('class', function (d) {
+             return 'node vertex target target-nope ' + nopeClass + d.id;
+           }).attr('transform', getTransform);
+         } // Points can also render as vertices:
+         // 1. in wireframe mode or
+         // 2. at higher zooms if they have a direction
+
+
+         function renderAsVertex(entity, graph, wireframe, zoom) {
+           var geometry = entity.geometry(graph);
+           return geometry === 'vertex' || geometry === 'point' && (wireframe || zoom >= 18 && entity.directions(graph, projection).length);
+         }
+
+         function isEditedNode(node, base, head) {
+           var baseNode = base.entities[node.id];
+           var headNode = head.entities[node.id];
+           return !headNode || !baseNode || !fastDeepEqual(headNode.tags, baseNode.tags) || !fastDeepEqual(headNode.loc, baseNode.loc);
+         }
+
+         function getSiblingAndChildVertices(ids, graph, wireframe, zoom) {
+           var results = {};
+           var seenIds = {};
+
+           function addChildVertices(entity) {
+             // avoid redundant work and infinite recursion of circular relations
+             if (seenIds[entity.id]) return;
+             seenIds[entity.id] = true;
+             var geometry = entity.geometry(graph);
+
+             if (!context.features().isHiddenFeature(entity, graph, geometry)) {
+               var i;
+
+               if (entity.type === 'way') {
+                 for (i = 0; i < entity.nodes.length; i++) {
+                   var child = graph.hasEntity(entity.nodes[i]);
+
+                   if (child) {
+                     addChildVertices(child);
+                   }
+                 }
+               } else if (entity.type === 'relation') {
+                 for (i = 0; i < entity.members.length; i++) {
+                   var member = graph.hasEntity(entity.members[i].id);
+
+                   if (member) {
+                     addChildVertices(member);
+                   }
+                 }
+               } else if (renderAsVertex(entity, graph, wireframe, zoom)) {
+                 results[entity.id] = entity;
+               }
+             }
+           }
+
+           ids.forEach(function (id) {
+             var entity = graph.hasEntity(id);
+             if (!entity) return;
+
+             if (entity.type === 'node') {
+               if (renderAsVertex(entity, graph, wireframe, zoom)) {
+                 results[entity.id] = entity;
+                 graph.parentWays(entity).forEach(function (entity) {
+                   addChildVertices(entity);
+                 });
+               }
+             } else {
+               // way, relation
+               addChildVertices(entity);
+             }
+           });
+           return results;
+         }
+
+         function drawVertices(selection, graph, entities, filter, extent, fullRedraw) {
+           var wireframe = context.surface().classed('fill-wireframe');
+           var visualDiff = context.surface().classed('highlight-edited');
+           var zoom = geoScaleToZoom(projection.scale());
+           var mode = context.mode();
+           var isMoving = mode && /^(add|draw|drag|move|rotate)/.test(mode.id);
+           var base = context.history().base();
+           var drawLayer = selection.selectAll('.layer-osm.points .points-group.vertices');
+           var touchLayer = selection.selectAll('.layer-touch.points');
+
+           if (fullRedraw) {
+             _currPersistent = {};
+             _radii = {};
+           } // Collect important vertices from the `entities` list..
+           // (during a partial redraw, it will not contain everything)
+
+
+           for (var i = 0; i < entities.length; i++) {
+             var entity = entities[i];
+             var geometry = entity.geometry(graph);
+             var keep = false; // a point that looks like a vertex..
+
+             if (geometry === 'point' && renderAsVertex(entity, graph, wireframe, zoom)) {
+               _currPersistent[entity.id] = entity;
+               keep = true; // a vertex of some importance..
+             } else if (geometry === 'vertex' && (entity.hasInterestingTags() || entity.isEndpoint(graph) || entity.isConnected(graph) || visualDiff && isEditedNode(entity, base, graph))) {
+               _currPersistent[entity.id] = entity;
+               keep = true;
+             } // whatever this is, it's not a persistent vertex..
+
+
+             if (!keep && !fullRedraw) {
+               delete _currPersistent[entity.id];
+             }
+           } // 3 sets of vertices to consider:
+
+
+           var sets = {
+             persistent: _currPersistent,
+             // persistent = important vertices (render always)
+             selected: _currSelected,
+             // selected + siblings of selected (render always)
+             hovered: _currHover // hovered + siblings of hovered (render only in draw modes)
+
+           };
+           var all = Object.assign({}, isMoving ? _currHover : {}, _currSelected, _currPersistent); // Draw the vertices..
+           // The filter function controls the scope of what objects d3 will touch (exit/enter/update)
+           // Adjust the filter function to expand the scope beyond whatever entities were passed in.
+
+           var filterRendered = function filterRendered(d) {
+             return d.id in _currPersistent || d.id in _currSelected || d.id in _currHover || filter(d);
+           };
+
+           drawLayer.call(draw, graph, currentVisible(all), sets, filterRendered); // Draw touch targets..
+           // When drawing, render all targets (not just those affected by a partial redraw)
+
+           var filterTouch = function filterTouch(d) {
+             return isMoving ? true : filterRendered(d);
+           };
+
+           touchLayer.call(drawTargets, graph, currentVisible(all), filterTouch);
+
+           function currentVisible(which) {
+             return Object.keys(which).map(graph.hasEntity, graph) // the current version of this entity
+             .filter(function (entity) {
+               return entity && entity.intersects(extent, graph);
+             });
+           }
+         } // partial redraw - only update the selected items..
+
+
+         drawVertices.drawSelected = function (selection, graph, extent) {
+           var wireframe = context.surface().classed('fill-wireframe');
+           var zoom = geoScaleToZoom(projection.scale());
+           _prevSelected = _currSelected || {};
+
+           if (context.map().isInWideSelection()) {
+             _currSelected = {};
+             context.selectedIDs().forEach(function (id) {
+               var entity = graph.hasEntity(id);
+               if (!entity) return;
+
+               if (entity.type === 'node') {
+                 if (renderAsVertex(entity, graph, wireframe, zoom)) {
+                   _currSelected[entity.id] = entity;
+                 }
+               }
+             });
+           } else {
+             _currSelected = getSiblingAndChildVertices(context.selectedIDs(), graph, wireframe, zoom);
+           } // note that drawVertices will add `_currSelected` automatically if needed..
+
+
+           var filter = function filter(d) {
+             return d.id in _prevSelected;
+           };
+
+           drawVertices(selection, graph, Object.values(_prevSelected), filter, extent, false);
+         }; // partial redraw - only update the hovered items..
+
+
+         drawVertices.drawHover = function (selection, graph, target, extent) {
+           if (target === _currHoverTarget) return; // continue only if something changed
+
+           var wireframe = context.surface().classed('fill-wireframe');
+           var zoom = geoScaleToZoom(projection.scale());
+           _prevHover = _currHover || {};
+           _currHoverTarget = target;
+           var entity = target && target.properties && target.properties.entity;
+
+           if (entity) {
+             _currHover = getSiblingAndChildVertices([entity.id], graph, wireframe, zoom);
+           } else {
+             _currHover = {};
+           } // note that drawVertices will add `_currHover` automatically if needed..
+
+
+           var filter = function filter(d) {
+             return d.id in _prevHover;
+           };
+
+           drawVertices(selection, graph, Object.values(_prevHover), filter, extent, false);
+         };
+
+         return drawVertices;
+       }
+
+       function utilBindOnce(target, type, listener, capture) {
+         var typeOnce = type + '.once';
+
+         function one() {
+           target.on(typeOnce, null);
+           listener.apply(this, arguments);
+         }
+
+         target.on(typeOnce, one, capture);
+         return this;
+       }
+
+       function defaultFilter(d3_event) {
+         return !d3_event.ctrlKey && !d3_event.button;
+       }
+
+       function defaultExtent() {
+         var e = this;
+
+         if (e instanceof SVGElement) {
+           e = e.ownerSVGElement || e;
+
+           if (e.hasAttribute('viewBox')) {
+             e = e.viewBox.baseVal;
+             return [[e.x, e.y], [e.x + e.width, e.y + e.height]];
+           }
+
+           return [[0, 0], [e.width.baseVal.value, e.height.baseVal.value]];
+         }
+
+         return [[0, 0], [e.clientWidth, e.clientHeight]];
+       }
+
+       function defaultWheelDelta(d3_event) {
+         return -d3_event.deltaY * (d3_event.deltaMode === 1 ? 0.05 : d3_event.deltaMode ? 1 : 0.002);
+       }
+
+       function defaultConstrain(transform, extent, translateExtent) {
+         var dx0 = transform.invertX(extent[0][0]) - translateExtent[0][0],
+             dx1 = transform.invertX(extent[1][0]) - translateExtent[1][0],
+             dy0 = transform.invertY(extent[0][1]) - translateExtent[0][1],
+             dy1 = transform.invertY(extent[1][1]) - translateExtent[1][1];
+         return transform.translate(dx1 > dx0 ? (dx0 + dx1) / 2 : Math.min(0, dx0) || Math.max(0, dx1), dy1 > dy0 ? (dy0 + dy1) / 2 : Math.min(0, dy0) || Math.max(0, dy1));
+       }
+
+       function utilZoomPan() {
+         var filter = defaultFilter,
+             extent = defaultExtent,
+             constrain = defaultConstrain,
+             wheelDelta = defaultWheelDelta,
+             scaleExtent = [0, Infinity],
+             translateExtent = [[-Infinity, -Infinity], [Infinity, Infinity]],
+             interpolate = interpolateZoom,
+             dispatch = dispatch$8('start', 'zoom', 'end'),
+             _wheelDelay = 150,
+             _transform = identity$2,
+             _activeGesture;
+
+         function zoom(selection) {
+           selection.on('pointerdown.zoom', pointerdown).on('wheel.zoom', wheeled).style('touch-action', 'none').style('-webkit-tap-highlight-color', 'rgba(0,0,0,0)');
+           select(window).on('pointermove.zoompan', pointermove).on('pointerup.zoompan pointercancel.zoompan', pointerup);
+         }
+
+         zoom.transform = function (collection, transform, point) {
+           var selection = collection.selection ? collection.selection() : collection;
+
+           if (collection !== selection) {
+             schedule(collection, transform, point);
+           } else {
+             selection.interrupt().each(function () {
+               gesture(this, arguments).start(null).zoom(null, null, typeof transform === 'function' ? transform.apply(this, arguments) : transform).end(null);
+             });
+           }
+         };
+
+         zoom.scaleBy = function (selection, k, p) {
+           zoom.scaleTo(selection, function () {
+             var k0 = _transform.k,
+                 k1 = typeof k === 'function' ? k.apply(this, arguments) : k;
+             return k0 * k1;
+           }, p);
+         };
+
+         zoom.scaleTo = function (selection, k, p) {
+           zoom.transform(selection, function () {
+             var e = extent.apply(this, arguments),
+                 t0 = _transform,
+                 p0 = !p ? centroid(e) : typeof p === 'function' ? p.apply(this, arguments) : p,
+                 p1 = t0.invert(p0),
+                 k1 = typeof k === 'function' ? k.apply(this, arguments) : k;
+             return constrain(translate(scale(t0, k1), p0, p1), e, translateExtent);
+           }, p);
+         };
+
+         zoom.translateBy = function (selection, x, y) {
+           zoom.transform(selection, function () {
+             return constrain(_transform.translate(typeof x === 'function' ? x.apply(this, arguments) : x, typeof y === 'function' ? y.apply(this, arguments) : y), extent.apply(this, arguments), translateExtent);
+           });
+         };
+
+         zoom.translateTo = function (selection, x, y, p) {
+           zoom.transform(selection, function () {
+             var e = extent.apply(this, arguments),
+                 t = _transform,
+                 p0 = !p ? centroid(e) : typeof p === 'function' ? p.apply(this, arguments) : p;
+             return constrain(identity$2.translate(p0[0], p0[1]).scale(t.k).translate(typeof x === 'function' ? -x.apply(this, arguments) : -x, typeof y === 'function' ? -y.apply(this, arguments) : -y), e, translateExtent);
+           }, p);
+         };
+
+         function scale(transform, k) {
+           k = Math.max(scaleExtent[0], Math.min(scaleExtent[1], k));
+           return k === transform.k ? transform : new Transform(k, transform.x, transform.y);
+         }
+
+         function translate(transform, p0, p1) {
+           var x = p0[0] - p1[0] * transform.k,
+               y = p0[1] - p1[1] * transform.k;
+           return x === transform.x && y === transform.y ? transform : new Transform(transform.k, x, y);
+         }
+
+         function centroid(extent) {
+           return [(+extent[0][0] + +extent[1][0]) / 2, (+extent[0][1] + +extent[1][1]) / 2];
+         }
+
+         function schedule(transition, transform, point) {
+           transition.on('start.zoom', function () {
+             gesture(this, arguments).start(null);
+           }).on('interrupt.zoom end.zoom', function () {
+             gesture(this, arguments).end(null);
+           }).tween('zoom', function () {
+             var that = this,
+                 args = arguments,
+                 g = gesture(that, args),
+                 e = extent.apply(that, args),
+                 p = !point ? centroid(e) : typeof point === 'function' ? point.apply(that, args) : point,
+                 w = Math.max(e[1][0] - e[0][0], e[1][1] - e[0][1]),
+                 a = _transform,
+                 b = typeof transform === 'function' ? transform.apply(that, args) : transform,
+                 i = interpolate(a.invert(p).concat(w / a.k), b.invert(p).concat(w / b.k));
+             return function (t) {
+               if (t === 1) {
+                 // Avoid rounding error on end.
+                 t = b;
+               } else {
+                 var l = i(t);
+                 var k = w / l[2];
+                 t = new Transform(k, p[0] - l[0] * k, p[1] - l[1] * k);
+               }
+
+               g.zoom(null, null, t);
+             };
+           });
+         }
+
+         function gesture(that, args, clean) {
+           return !clean && _activeGesture || new Gesture(that, args);
+         }
+
+         function Gesture(that, args) {
+           this.that = that;
+           this.args = args;
+           this.active = 0;
+           this.extent = extent.apply(that, args);
+         }
+
+         Gesture.prototype = {
+           start: function start(d3_event) {
+             if (++this.active === 1) {
+               _activeGesture = this;
+               dispatch.call('start', this, d3_event);
+             }
+
+             return this;
+           },
+           zoom: function zoom(d3_event, key, transform) {
+             if (this.mouse && key !== 'mouse') this.mouse[1] = transform.invert(this.mouse[0]);
+             if (this.pointer0 && key !== 'touch') this.pointer0[1] = transform.invert(this.pointer0[0]);
+             if (this.pointer1 && key !== 'touch') this.pointer1[1] = transform.invert(this.pointer1[0]);
+             _transform = transform;
+             dispatch.call('zoom', this, d3_event, key, transform);
+             return this;
+           },
+           end: function end(d3_event) {
+             if (--this.active === 0) {
+               _activeGesture = null;
+               dispatch.call('end', this, d3_event);
+             }
+
+             return this;
+           }
+         };
+
+         function wheeled(d3_event) {
+           if (!filter.apply(this, arguments)) return;
+           var g = gesture(this, arguments),
+               t = _transform,
+               k = Math.max(scaleExtent[0], Math.min(scaleExtent[1], t.k * Math.pow(2, wheelDelta.apply(this, arguments)))),
+               p = utilFastMouse(this)(d3_event); // If the mouse is in the same location as before, reuse it.
+           // If there were recent wheel events, reset the wheel idle timeout.
+
+           if (g.wheel) {
+             if (g.mouse[0][0] !== p[0] || g.mouse[0][1] !== p[1]) {
+               g.mouse[1] = t.invert(g.mouse[0] = p);
+             }
+
+             clearTimeout(g.wheel); // Otherwise, capture the mouse point and location at the start.
+           } else {
+             g.mouse = [p, t.invert(p)];
+             interrupt(this);
+             g.start(d3_event);
+           }
+
+           d3_event.preventDefault();
+           d3_event.stopImmediatePropagation();
+           g.wheel = setTimeout(wheelidled, _wheelDelay);
+           g.zoom(d3_event, 'mouse', constrain(translate(scale(t, k), g.mouse[0], g.mouse[1]), g.extent, translateExtent));
+
+           function wheelidled() {
+             g.wheel = null;
+             g.end(d3_event);
+           }
+         }
+
+         var _downPointerIDs = new Set();
+
+         var _pointerLocGetter;
+
+         function pointerdown(d3_event) {
+           _downPointerIDs.add(d3_event.pointerId);
+
+           if (!filter.apply(this, arguments)) return;
+           var g = gesture(this, arguments, _downPointerIDs.size === 1);
+           var started;
+           d3_event.stopImmediatePropagation();
+           _pointerLocGetter = utilFastMouse(this);
+
+           var loc = _pointerLocGetter(d3_event);
+
+           var p = [loc, _transform.invert(loc), d3_event.pointerId];
+
+           if (!g.pointer0) {
+             g.pointer0 = p;
+             started = true;
+           } else if (!g.pointer1 && g.pointer0[2] !== p[2]) {
+             g.pointer1 = p;
+           }
+
+           if (started) {
+             interrupt(this);
+             g.start(d3_event);
+           }
+         }
+
+         function pointermove(d3_event) {
+           if (!_downPointerIDs.has(d3_event.pointerId)) return;
+           if (!_activeGesture || !_pointerLocGetter) return;
+           var g = gesture(this, arguments);
+           var isPointer0 = g.pointer0 && g.pointer0[2] === d3_event.pointerId;
+           var isPointer1 = !isPointer0 && g.pointer1 && g.pointer1[2] === d3_event.pointerId;
+
+           if ((isPointer0 || isPointer1) && 'buttons' in d3_event && !d3_event.buttons) {
+             // The pointer went up without ending the gesture somehow, e.g.
+             // a down mouse was moved off the map and released. End it here.
+             if (g.pointer0) _downPointerIDs["delete"](g.pointer0[2]);
+             if (g.pointer1) _downPointerIDs["delete"](g.pointer1[2]);
+             g.end(d3_event);
+             return;
+           }
+
+           d3_event.preventDefault();
+           d3_event.stopImmediatePropagation();
+
+           var loc = _pointerLocGetter(d3_event);
+
+           var t, p, l;
+           if (isPointer0) g.pointer0[0] = loc;else if (isPointer1) g.pointer1[0] = loc;
+           t = _transform;
+
+           if (g.pointer1) {
+             var p0 = g.pointer0[0],
+                 l0 = g.pointer0[1],
+                 p1 = g.pointer1[0],
+                 l1 = g.pointer1[1],
+                 dp = (dp = p1[0] - p0[0]) * dp + (dp = p1[1] - p0[1]) * dp,
+                 dl = (dl = l1[0] - l0[0]) * dl + (dl = l1[1] - l0[1]) * dl;
+             t = scale(t, Math.sqrt(dp / dl));
+             p = [(p0[0] + p1[0]) / 2, (p0[1] + p1[1]) / 2];
+             l = [(l0[0] + l1[0]) / 2, (l0[1] + l1[1]) / 2];
+           } else if (g.pointer0) {
+             p = g.pointer0[0];
+             l = g.pointer0[1];
+           } else {
+             return;
+           }
+
+           g.zoom(d3_event, 'touch', constrain(translate(t, p, l), g.extent, translateExtent));
+         }
+
+         function pointerup(d3_event) {
+           if (!_downPointerIDs.has(d3_event.pointerId)) return;
+
+           _downPointerIDs["delete"](d3_event.pointerId);
+
+           if (!_activeGesture) return;
+           var g = gesture(this, arguments);
+           d3_event.stopImmediatePropagation();
+           if (g.pointer0 && g.pointer0[2] === d3_event.pointerId) delete g.pointer0;else if (g.pointer1 && g.pointer1[2] === d3_event.pointerId) delete g.pointer1;
+
+           if (g.pointer1 && !g.pointer0) {
+             g.pointer0 = g.pointer1;
+             delete g.pointer1;
+           }
+
+           if (g.pointer0) {
+             g.pointer0[1] = _transform.invert(g.pointer0[0]);
+           } else {
+             g.end(d3_event);
+           }
+         }
+
+         zoom.wheelDelta = function (_) {
+           return arguments.length ? (wheelDelta = utilFunctor(+_), zoom) : wheelDelta;
+         };
+
+         zoom.filter = function (_) {
+           return arguments.length ? (filter = utilFunctor(!!_), zoom) : filter;
+         };
+
+         zoom.extent = function (_) {
+           return arguments.length ? (extent = utilFunctor([[+_[0][0], +_[0][1]], [+_[1][0], +_[1][1]]]), zoom) : extent;
+         };
+
+         zoom.scaleExtent = function (_) {
+           return arguments.length ? (scaleExtent[0] = +_[0], scaleExtent[1] = +_[1], zoom) : [scaleExtent[0], scaleExtent[1]];
+         };
+
+         zoom.translateExtent = function (_) {
+           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]]];
+         };
+
+         zoom.constrain = function (_) {
+           return arguments.length ? (constrain = _, zoom) : constrain;
+         };
+
+         zoom.interpolate = function (_) {
+           return arguments.length ? (interpolate = _, zoom) : interpolate;
+         };
+
+         zoom._transform = function (_) {
+           return arguments.length ? (_transform = _, zoom) : _transform;
+         };
+
+         return utilRebind(zoom, dispatch, 'on');
+       }
+
+       // if pointer events are supported. Falls back to default `dblclick` event.
+
+       function utilDoubleUp() {
+         var dispatch = dispatch$8('doubleUp');
+         var _maxTimespan = 500; // milliseconds
+
+         var _maxDistance = 20; // web pixels; be somewhat generous to account for touch devices
+
+         var _pointer; // object representing the pointer that could trigger double up
+
+
+         function pointerIsValidFor(loc) {
+           // second pointerup must occur within a small timeframe after the first pointerdown
+           return new Date().getTime() - _pointer.startTime <= _maxTimespan && // all pointer events must occur within a small distance of the first pointerdown
+           geoVecLength(_pointer.startLoc, loc) <= _maxDistance;
+         }
+
+         function pointerdown(d3_event) {
+           // ignore right-click
+           if (d3_event.ctrlKey || d3_event.button === 2) return;
+           var loc = [d3_event.clientX, d3_event.clientY]; // Don't rely on pointerId here since it can change between pointerdown
+           // events on touch devices
+
+           if (_pointer && !pointerIsValidFor(loc)) {
+             // if this pointer is no longer valid, clear it so another can be started
+             _pointer = undefined;
+           }
+
+           if (!_pointer) {
+             _pointer = {
+               startLoc: loc,
+               startTime: new Date().getTime(),
+               upCount: 0,
+               pointerId: d3_event.pointerId
+             };
+           } else {
+             // double down
+             _pointer.pointerId = d3_event.pointerId;
+           }
+         }
+
+         function pointerup(d3_event) {
+           // ignore right-click
+           if (d3_event.ctrlKey || d3_event.button === 2) return;
+           if (!_pointer || _pointer.pointerId !== d3_event.pointerId) return;
+           _pointer.upCount += 1;
+
+           if (_pointer.upCount === 2) {
+             // double up!
+             var loc = [d3_event.clientX, d3_event.clientY];
+
+             if (pointerIsValidFor(loc)) {
+               var locInThis = utilFastMouse(this)(d3_event);
+               dispatch.call('doubleUp', this, d3_event, locInThis);
+             } // clear the pointer info in any case
+
+
+             _pointer = undefined;
+           }
+         }
+
+         function doubleUp(selection) {
+           if ('PointerEvent' in window) {
+             // dblclick isn't well supported on touch devices so manually use
+             // pointer events if they're available
+             selection.on('pointerdown.doubleUp', pointerdown).on('pointerup.doubleUp', pointerup);
+           } else {
+             // fallback to dblclick
+             selection.on('dblclick.doubleUp', function (d3_event) {
+               dispatch.call('doubleUp', this, d3_event, utilFastMouse(this)(d3_event));
+             });
+           }
+         }
+
+         doubleUp.off = function (selection) {
+           selection.on('pointerdown.doubleUp', null).on('pointerup.doubleUp', null).on('dblclick.doubleUp', null);
+         };
+
+         return utilRebind(doubleUp, dispatch, 'on');
+       }
+
+       var TILESIZE = 256;
+       var minZoom = 2;
+       var maxZoom = 24;
+       var kMin = geoZoomToScale(minZoom, TILESIZE);
+       var kMax = geoZoomToScale(maxZoom, TILESIZE);
+
+       function clamp$1(num, min, max) {
+         return Math.max(min, Math.min(num, max));
+       }
+
+       function rendererMap(context) {
+         var dispatch = dispatch$8('move', 'drawn', 'crossEditableZoom', 'hitMinZoom', 'changeHighlighting', 'changeAreaFill');
+         var projection = context.projection;
+         var curtainProjection = context.curtainProjection;
+         var drawLayers;
+         var drawPoints;
+         var drawVertices;
+         var drawLines;
+         var drawAreas;
+         var drawMidpoints;
+         var drawLabels;
+
+         var _selection = select(null);
+
+         var supersurface = select(null);
+         var wrapper = select(null);
+         var surface = select(null);
+         var _dimensions = [1, 1];
+         var _dblClickZoomEnabled = true;
+         var _redrawEnabled = true;
+
+         var _gestureTransformStart;
+
+         var _transformStart = projection.transform();
+
+         var _transformLast;
+
+         var _isTransformed = false;
+         var _minzoom = 0;
+
+         var _getMouseCoords;
+
+         var _lastPointerEvent;
+
+         var _lastWithinEditableZoom; // whether a pointerdown event started the zoom
+
+
+         var _pointerDown = false; // use pointer events on supported platforms; fallback to mouse events
+
+         var _pointerPrefix = 'PointerEvent' in window ? 'pointer' : 'mouse'; // use pointer event interaction if supported; fallback to touch/mouse events in d3-zoom
+
+
+         var _zoomerPannerFunction = 'PointerEvent' in window ? utilZoomPan : d3_zoom;
+
+         var _zoomerPanner = _zoomerPannerFunction().scaleExtent([kMin, kMax]).interpolate(interpolate$1).filter(zoomEventFilter).on('zoom.map', zoomPan).on('start.map', function (d3_event) {
+           _pointerDown = d3_event && (d3_event.type === 'pointerdown' || d3_event.sourceEvent && d3_event.sourceEvent.type === 'pointerdown');
+         }).on('end.map', function () {
+           _pointerDown = false;
+         });
+
+         var _doubleUpHandler = utilDoubleUp();
+
+         var scheduleRedraw = throttle(redraw, 750); // var isRedrawScheduled = false;
+         // var pendingRedrawCall;
+         // function scheduleRedraw() {
+         //     // Only schedule the redraw if one has not already been set.
+         //     if (isRedrawScheduled) return;
+         //     isRedrawScheduled = true;
+         //     var that = this;
+         //     var args = arguments;
+         //     pendingRedrawCall = window.requestIdleCallback(function () {
+         //         // Reset the boolean so future redraws can be set.
+         //         isRedrawScheduled = false;
+         //         redraw.apply(that, args);
+         //     }, { timeout: 1400 });
+         // }
+
+
+         function cancelPendingRedraw() {
+           scheduleRedraw.cancel(); // isRedrawScheduled = false;
+           // window.cancelIdleCallback(pendingRedrawCall);
+         }
+
+         function map(selection) {
+           _selection = selection;
+           context.on('change.map', immediateRedraw);
+           var osm = context.connection();
+
+           if (osm) {
+             osm.on('change.map', immediateRedraw);
+           }
+
+           function didUndoOrRedo(targetTransform) {
+             var mode = context.mode().id;
+             if (mode !== 'browse' && mode !== 'select') return;
+
+             if (targetTransform) {
+               map.transformEase(targetTransform);
+             }
+           }
+
+           context.history().on('merge.map', function () {
+             scheduleRedraw();
+           }).on('change.map', immediateRedraw).on('undone.map', function (stack, fromStack) {
+             didUndoOrRedo(fromStack.transform);
+           }).on('redone.map', function (stack) {
+             didUndoOrRedo(stack.transform);
+           });
+           context.background().on('change.map', immediateRedraw);
+           context.features().on('redraw.map', immediateRedraw);
+           drawLayers.on('change.map', function () {
+             context.background().updateImagery();
+             immediateRedraw();
+           });
+           selection.on('wheel.map mousewheel.map', function (d3_event) {
+             // disable swipe-to-navigate browser pages on trackpad/magic mouse – #5552
+             d3_event.preventDefault();
+           }).call(_zoomerPanner).call(_zoomerPanner.transform, projection.transform()).on('dblclick.zoom', null); // override d3-zoom dblclick handling
+
+           map.supersurface = supersurface = selection.append('div').attr('class', 'supersurface').call(utilSetTransform, 0, 0); // Need a wrapper div because Opera can't cope with an absolutely positioned
+           // SVG element: http://bl.ocks.org/jfirebaugh/6fbfbd922552bf776c16
+
+           wrapper = supersurface.append('div').attr('class', 'layer layer-data');
+           map.surface = surface = wrapper.call(drawLayers).selectAll('.surface');
+           surface.call(drawLabels.observe).call(_doubleUpHandler).on(_pointerPrefix + 'down.zoom', function (d3_event) {
+             _lastPointerEvent = d3_event;
+
+             if (d3_event.button === 2) {
+               d3_event.stopPropagation();
+             }
+           }, true).on(_pointerPrefix + 'up.zoom', function (d3_event) {
+             _lastPointerEvent = d3_event;
+
+             if (resetTransform()) {
+               immediateRedraw();
+             }
+           }).on(_pointerPrefix + 'move.map', function (d3_event) {
+             _lastPointerEvent = d3_event;
+           }).on(_pointerPrefix + 'over.vertices', function (d3_event) {
+             if (map.editableDataEnabled() && !_isTransformed) {
+               var hover = d3_event.target.__data__;
+               surface.call(drawVertices.drawHover, context.graph(), hover, map.extent());
+               dispatch.call('drawn', this, {
+                 full: false
+               });
+             }
+           }).on(_pointerPrefix + 'out.vertices', function (d3_event) {
+             if (map.editableDataEnabled() && !_isTransformed) {
+               var hover = d3_event.relatedTarget && d3_event.relatedTarget.__data__;
+               surface.call(drawVertices.drawHover, context.graph(), hover, map.extent());
+               dispatch.call('drawn', this, {
+                 full: false
+               });
+             }
+           });
+           var detected = utilDetect(); // only WebKit supports gesture events
+
+           if ('GestureEvent' in window && // Listening for gesture events on iOS 13.4+ breaks double-tapping,
+           // but we only need to do this on desktop Safari anyway. – #7694
+           !detected.isMobileWebKit) {
+             // Desktop Safari sends gesture events for multitouch trackpad pinches.
+             // We can listen for these and translate them into map zooms.
+             surface.on('gesturestart.surface', function (d3_event) {
+               d3_event.preventDefault();
+               _gestureTransformStart = projection.transform();
+             }).on('gesturechange.surface', gestureChange);
+           } // must call after surface init
+
+
+           updateAreaFill();
+
+           _doubleUpHandler.on('doubleUp.map', function (d3_event, p0) {
+             if (!_dblClickZoomEnabled) return; // don't zoom if targeting something other than the map itself
+
+             if (_typeof(d3_event.target.__data__) === 'object' && // or area fills
+             !select(d3_event.target).classed('fill')) return;
+             var zoomOut = d3_event.shiftKey;
+             var t = projection.transform();
+             var p1 = t.invert(p0);
+             t = t.scale(zoomOut ? 0.5 : 2);
+             t.x = p0[0] - p1[0] * t.k;
+             t.y = p0[1] - p1[1] * t.k;
+             map.transformEase(t);
+           });
+
+           context.on('enter.map', function () {
+             if (!map.editableDataEnabled(true
+             /* skip zoom check */
+             )) return;
+             if (_isTransformed) return; // redraw immediately any objects affected by a change in selectedIDs.
+
+             var graph = context.graph();
+             var selectedAndParents = {};
+             context.selectedIDs().forEach(function (id) {
+               var entity = graph.hasEntity(id);
+
+               if (entity) {
+                 selectedAndParents[entity.id] = entity;
+
+                 if (entity.type === 'node') {
+                   graph.parentWays(entity).forEach(function (parent) {
+                     selectedAndParents[parent.id] = parent;
+                   });
+                 }
+               }
+             });
+             var data = Object.values(selectedAndParents);
+
+             var filter = function filter(d) {
+               return d.id in selectedAndParents;
+             };
+
+             data = context.features().filter(data, graph);
+             surface.call(drawVertices.drawSelected, graph, map.extent()).call(drawLines, graph, data, filter).call(drawAreas, graph, data, filter).call(drawMidpoints, graph, data, filter, map.trimmedExtent());
+             dispatch.call('drawn', this, {
+               full: false
+             }); // redraw everything else later
+
+             scheduleRedraw();
+           });
+           map.dimensions(utilGetDimensions(selection));
+         }
+
+         function zoomEventFilter(d3_event) {
+           // Fix for #2151, (see also d3/d3-zoom#60, d3/d3-brush#18)
+           // Intercept `mousedown` and check if there is an orphaned zoom gesture.
+           // This can happen if a previous `mousedown` occurred without a `mouseup`.
+           // If we detect this, dispatch `mouseup` to complete the orphaned gesture,
+           // so that d3-zoom won't stop propagation of new `mousedown` events.
+           if (d3_event.type === 'mousedown') {
+             var hasOrphan = false;
+             var listeners = window.__on;
+
+             for (var i = 0; i < listeners.length; i++) {
+               var listener = listeners[i];
+
+               if (listener.name === 'zoom' && listener.type === 'mouseup') {
+                 hasOrphan = true;
+                 break;
+               }
+             }
+
+             if (hasOrphan) {
+               var event = window.CustomEvent;
+
+               if (event) {
+                 event = new event('mouseup');
+               } else {
+                 event = window.document.createEvent('Event');
+                 event.initEvent('mouseup', false, false);
+               } // Event needs to be dispatched with an event.view property.
+
+
+               event.view = window;
+               window.dispatchEvent(event);
+             }
+           }
+
+           return d3_event.button !== 2; // ignore right clicks
+         }
+
+         function pxCenter() {
+           return [_dimensions[0] / 2, _dimensions[1] / 2];
+         }
+
+         function drawEditable(difference, extent) {
+           var mode = context.mode();
+           var graph = context.graph();
+           var features = context.features();
+           var all = context.history().intersects(map.extent());
+           var fullRedraw = false;
+           var data;
+           var set;
+           var filter;
+           var applyFeatureLayerFilters = true;
+
+           if (map.isInWideSelection()) {
+             data = [];
+             utilEntityAndDeepMemberIDs(mode.selectedIDs(), context.graph()).forEach(function (id) {
+               var entity = context.hasEntity(id);
+               if (entity) data.push(entity);
+             });
+             fullRedraw = true;
+             filter = utilFunctor(true); // selected features should always be visible, so we can skip filtering
+
+             applyFeatureLayerFilters = false;
+           } else if (difference) {
+             var complete = difference.complete(map.extent());
+             data = Object.values(complete).filter(Boolean);
+             set = new Set(Object.keys(complete));
+
+             filter = function filter(d) {
+               return set.has(d.id);
+             };
+
+             features.clear(data);
+           } else {
+             // force a full redraw if gatherStats detects that a feature
+             // should be auto-hidden (e.g. points or buildings)..
+             if (features.gatherStats(all, graph, _dimensions)) {
+               extent = undefined;
+             }
+
+             if (extent) {
+               data = context.history().intersects(map.extent().intersection(extent));
+               set = new Set(data.map(function (entity) {
+                 return entity.id;
+               }));
+
+               filter = function filter(d) {
+                 return set.has(d.id);
+               };
+             } else {
+               data = all;
+               fullRedraw = true;
+               filter = utilFunctor(true);
+             }
+           }
+
+           if (applyFeatureLayerFilters) {
+             data = features.filter(data, graph);
+           } else {
+             context.features().resetStats();
+           }
+
+           if (mode && mode.id === 'select') {
+             // update selected vertices - the user might have just double-clicked a way,
+             // creating a new vertex, triggering a partial redraw without a mode change
+             surface.call(drawVertices.drawSelected, graph, map.extent());
+           }
+
+           surface.call(drawVertices, graph, data, filter, map.extent(), fullRedraw).call(drawLines, graph, data, filter).call(drawAreas, graph, data, filter).call(drawMidpoints, graph, data, filter, map.trimmedExtent()).call(drawLabels, graph, data, filter, _dimensions, fullRedraw).call(drawPoints, graph, data, filter);
+           dispatch.call('drawn', this, {
+             full: true
+           });
+         }
+
+         map.init = function () {
+           drawLayers = svgLayers(projection, context);
+           drawPoints = svgPoints(projection, context);
+           drawVertices = svgVertices(projection, context);
+           drawLines = svgLines(projection, context);
+           drawAreas = svgAreas(projection, context);
+           drawMidpoints = svgMidpoints(projection, context);
+           drawLabels = svgLabels(projection, context);
+         };
+
+         function editOff() {
+           context.features().resetStats();
+           surface.selectAll('.layer-osm *').remove();
+           surface.selectAll('.layer-touch:not(.markers) *').remove();
+           var allowed = {
+             'browse': true,
+             'save': true,
+             'select-note': true,
+             'select-data': true,
+             'select-error': true
+           };
+           var mode = context.mode();
+
+           if (mode && !allowed[mode.id]) {
+             context.enter(modeBrowse(context));
+           }
+
+           dispatch.call('drawn', this, {
+             full: true
+           });
+         }
+
+         function gestureChange(d3_event) {
+           // Remap Safari gesture events to wheel events - #5492
+           // We want these disabled most places, but enabled for zoom/unzoom on map surface
+           // https://developer.mozilla.org/en-US/docs/Web/API/GestureEvent
+           var e = d3_event;
+           e.preventDefault();
+           var props = {
+             deltaMode: 0,
+             // dummy values to ignore in zoomPan
+             deltaY: 1,
+             // dummy values to ignore in zoomPan
+             clientX: e.clientX,
+             clientY: e.clientY,
+             screenX: e.screenX,
+             screenY: e.screenY,
+             x: e.x,
+             y: e.y
+           };
+           var e2 = new WheelEvent('wheel', props);
+           e2._scale = e.scale; // preserve the original scale
+
+           e2._rotation = e.rotation; // preserve the original rotation
+
+           _selection.node().dispatchEvent(e2);
+         }
+
+         function zoomPan(event, key, transform) {
+           var source = event && event.sourceEvent || event;
+           var eventTransform = transform || event && event.transform;
+           var x = eventTransform.x;
+           var y = eventTransform.y;
+           var k = eventTransform.k; // Special handling of 'wheel' events:
+           // They might be triggered by the user scrolling the mouse wheel,
+           // or 2-finger pinch/zoom gestures, the transform may need adjustment.
+
+           if (source && source.type === 'wheel') {
+             // assume that the gesture is already handled by pointer events
+             if (_pointerDown) return;
+             var detected = utilDetect();
+             var dX = source.deltaX;
+             var dY = source.deltaY;
+             var x2 = x;
+             var y2 = y;
+             var k2 = k;
+             var t0, p0, p1; // Normalize mousewheel scroll speed (Firefox) - #3029
+             // If wheel delta is provided in LINE units, recalculate it in PIXEL units
+             // We are essentially redoing the calculations that occur here:
+             //   https://github.com/d3/d3-zoom/blob/78563a8348aa4133b07cac92e2595c2227ca7cd7/src/zoom.js#L203
+             // See this for more info:
+             //   https://github.com/basilfx/normalize-wheel/blob/master/src/normalizeWheel.js
+
+             if (source.deltaMode === 1
+             /* LINE */
+             ) {
+               // Convert from lines to pixels, more if the user is scrolling fast.
+               // (I made up the exp function to roughly match Firefox to what Chrome does)
+               // These numbers should be floats, because integers are treated as pan gesture below.
+               var lines = Math.abs(source.deltaY);
+               var sign = source.deltaY > 0 ? 1 : -1;
+               dY = sign * clamp$1(Math.exp((lines - 1) * 0.75) * 4.000244140625, 4.000244140625, // min
+               350.000244140625 // max
+               ); // On Firefox Windows and Linux we always get +/- the scroll line amount (default 3)
+               // There doesn't seem to be any scroll acceleration.
+               // This multiplier increases the speed a little bit - #5512
+
+               if (detected.os !== 'mac') {
+                 dY *= 5;
+               } // recalculate x2,y2,k2
+
+
+               t0 = _isTransformed ? _transformLast : _transformStart;
+               p0 = _getMouseCoords(source);
+               p1 = t0.invert(p0);
+               k2 = t0.k * Math.pow(2, -dY / 500);
+               k2 = clamp$1(k2, kMin, kMax);
+               x2 = p0[0] - p1[0] * k2;
+               y2 = p0[1] - p1[1] * k2; // 2 finger map pinch zooming (Safari) - #5492
+               // These are fake `wheel` events we made from Safari `gesturechange` events..
+             } else if (source._scale) {
+               // recalculate x2,y2,k2
+               t0 = _gestureTransformStart;
+               p0 = _getMouseCoords(source);
+               p1 = t0.invert(p0);
+               k2 = t0.k * source._scale;
+               k2 = clamp$1(k2, kMin, kMax);
+               x2 = p0[0] - p1[0] * k2;
+               y2 = p0[1] - p1[1] * k2; // 2 finger map pinch zooming (all browsers except Safari) - #5492
+               // Pinch zooming via the `wheel` event will always have:
+               // - `ctrlKey = true`
+               // - `deltaY` is not round integer pixels (ignore `deltaX`)
+             } else if (source.ctrlKey && !isInteger(dY)) {
+               dY *= 6; // slightly scale up whatever the browser gave us
+               // recalculate x2,y2,k2
+
+               t0 = _isTransformed ? _transformLast : _transformStart;
+               p0 = _getMouseCoords(source);
+               p1 = t0.invert(p0);
+               k2 = t0.k * Math.pow(2, -dY / 500);
+               k2 = clamp$1(k2, kMin, kMax);
+               x2 = p0[0] - p1[0] * k2;
+               y2 = p0[1] - p1[1] * k2; // Trackpad scroll zooming with shift or alt/option key down
+             } else if ((source.altKey || source.shiftKey) && isInteger(dY)) {
+               // recalculate x2,y2,k2
+               t0 = _isTransformed ? _transformLast : _transformStart;
+               p0 = _getMouseCoords(source);
+               p1 = t0.invert(p0);
+               k2 = t0.k * Math.pow(2, -dY / 500);
+               k2 = clamp$1(k2, kMin, kMax);
+               x2 = p0[0] - p1[0] * k2;
+               y2 = p0[1] - p1[1] * k2; // 2 finger map panning (Mac only, all browsers except Firefox #8595) - #5492, #5512
+               // Panning via the `wheel` event will always have:
+               // - `ctrlKey = false`
+               // - `deltaX`,`deltaY` are round integer pixels
+             } else if (detected.os === 'mac' && detected.browser !== 'Firefox' && !source.ctrlKey && isInteger(dX) && isInteger(dY)) {
+               p1 = projection.translate();
+               x2 = p1[0] - dX;
+               y2 = p1[1] - dY;
+               k2 = projection.scale();
+               k2 = clamp$1(k2, kMin, kMax);
+             } // something changed - replace the event transform
+
+
+             if (x2 !== x || y2 !== y || k2 !== k) {
+               x = x2;
+               y = y2;
+               k = k2;
+               eventTransform = identity$2.translate(x2, y2).scale(k2);
+
+               if (_zoomerPanner._transform) {
+                 // utilZoomPan interface
+                 _zoomerPanner._transform(eventTransform);
+               } else {
+                 // d3_zoom interface
+                 _selection.node().__zoom = eventTransform;
+               }
+             }
+           }
+
+           if (_transformStart.x === x && _transformStart.y === y && _transformStart.k === k) {
+             return; // no change
+           }
+
+           if (geoScaleToZoom(k, TILESIZE) < _minzoom) {
+             surface.interrupt();
+             dispatch.call('hitMinZoom', this, map);
+             setCenterZoom(map.center(), context.minEditableZoom(), 0, true);
+             scheduleRedraw();
+             dispatch.call('move', this, map);
+             return;
+           }
+
+           projection.transform(eventTransform);
+           var withinEditableZoom = map.withinEditableZoom();
+
+           if (_lastWithinEditableZoom !== withinEditableZoom) {
+             if (_lastWithinEditableZoom !== undefined) {
+               // notify that the map zoomed in or out over the editable zoom threshold
+               dispatch.call('crossEditableZoom', this, withinEditableZoom);
+             }
+
+             _lastWithinEditableZoom = withinEditableZoom;
+           }
+
+           var scale = k / _transformStart.k;
+           var tX = (x / scale - _transformStart.x) * scale;
+           var tY = (y / scale - _transformStart.y) * scale;
+
+           if (context.inIntro()) {
+             curtainProjection.transform({
+               x: x - tX,
+               y: y - tY,
+               k: k
+             });
+           }
+
+           if (source) {
+             _lastPointerEvent = event;
+           }
+
+           _isTransformed = true;
+           _transformLast = eventTransform;
+           utilSetTransform(supersurface, tX, tY, scale);
+           scheduleRedraw();
+           dispatch.call('move', this, map);
+
+           function isInteger(val) {
+             return typeof val === 'number' && isFinite(val) && Math.floor(val) === val;
+           }
+         }
+
+         function resetTransform() {
+           if (!_isTransformed) return false;
+           utilSetTransform(supersurface, 0, 0);
+           _isTransformed = false;
+
+           if (context.inIntro()) {
+             curtainProjection.transform(projection.transform());
+           }
+
+           return true;
+         }
+
+         function redraw(difference, extent) {
+           if (surface.empty() || !_redrawEnabled) return; // If we are in the middle of a zoom/pan, we can't do differenced redraws.
+           // It would result in artifacts where differenced entities are redrawn with
+           // one transform and unchanged entities with another.
+
+           if (resetTransform()) {
+             difference = extent = undefined;
+           }
+
+           var zoom = map.zoom();
+           var z = String(~~zoom);
+
+           if (surface.attr('data-zoom') !== z) {
+             surface.attr('data-zoom', z);
+           } // class surface as `lowzoom` around z17-z18.5 (based on latitude)
+
+
+           var lat = map.center()[1];
+           var lowzoom = linear().domain([-60, 0, 60]).range([17, 18.5, 17]).clamp(true);
+           surface.classed('low-zoom', zoom <= lowzoom(lat));
+
+           if (!difference) {
+             supersurface.call(context.background());
+             wrapper.call(drawLayers);
+           } // OSM
+
+
+           if (map.editableDataEnabled() || map.isInWideSelection()) {
+             context.loadTiles(projection);
+             drawEditable(difference, extent);
+           } else {
+             editOff();
+           }
+
+           _transformStart = projection.transform();
+           return map;
+         }
+
+         var immediateRedraw = function immediateRedraw(difference, extent) {
+           if (!difference && !extent) cancelPendingRedraw();
+           redraw(difference, extent);
+         };
+
+         map.lastPointerEvent = function () {
+           return _lastPointerEvent;
+         };
+
+         map.mouse = function (d3_event) {
+           var event = d3_event || _lastPointerEvent;
+
+           if (event) {
+             var s;
+
+             while (s = event.sourceEvent) {
+               event = s;
+             }
+
+             return _getMouseCoords(event);
+           }
+
+           return null;
+         }; // returns Lng/Lat
+
+
+         map.mouseCoordinates = function () {
+           var coord = map.mouse() || pxCenter();
+           return projection.invert(coord);
+         };
+
+         map.dblclickZoomEnable = function (val) {
+           if (!arguments.length) return _dblClickZoomEnabled;
+           _dblClickZoomEnabled = val;
+           return map;
+         };
+
+         map.redrawEnable = function (val) {
+           if (!arguments.length) return _redrawEnabled;
+           _redrawEnabled = val;
+           return map;
+         };
+
+         map.isTransformed = function () {
+           return _isTransformed;
+         };
+
+         function setTransform(t2, duration, force) {
+           var t = projection.transform();
+           if (!force && t2.k === t.k && t2.x === t.x && t2.y === t.y) return false;
+
+           if (duration) {
+             _selection.transition().duration(duration).on('start', function () {
+               map.startEase();
+             }).call(_zoomerPanner.transform, identity$2.translate(t2.x, t2.y).scale(t2.k));
+           } else {
+             projection.transform(t2);
+             _transformStart = t2;
+
+             _selection.call(_zoomerPanner.transform, _transformStart);
+           }
+
+           return true;
+         }
+
+         function setCenterZoom(loc2, z2, duration, force) {
+           var c = map.center();
+           var z = map.zoom();
+           if (loc2[0] === c[0] && loc2[1] === c[1] && z2 === z && !force) return false;
+           var proj = geoRawMercator().transform(projection.transform()); // copy projection
+
+           var k2 = clamp$1(geoZoomToScale(z2, TILESIZE), kMin, kMax);
+           proj.scale(k2);
+           var t = proj.translate();
+           var point = proj(loc2);
+           var center = pxCenter();
+           t[0] += center[0] - point[0];
+           t[1] += center[1] - point[1];
+           return setTransform(identity$2.translate(t[0], t[1]).scale(k2), duration, force);
+         }
+
+         map.pan = function (delta, duration) {
+           var t = projection.translate();
+           var k = projection.scale();
+           t[0] += delta[0];
+           t[1] += delta[1];
+
+           if (duration) {
+             _selection.transition().duration(duration).on('start', function () {
+               map.startEase();
+             }).call(_zoomerPanner.transform, identity$2.translate(t[0], t[1]).scale(k));
+           } else {
+             projection.translate(t);
+             _transformStart = projection.transform();
+
+             _selection.call(_zoomerPanner.transform, _transformStart);
+
+             dispatch.call('move', this, map);
+             immediateRedraw();
+           }
+
+           return map;
+         };
+
+         map.dimensions = function (val) {
+           if (!arguments.length) return _dimensions;
+           _dimensions = val;
+           drawLayers.dimensions(_dimensions);
+           context.background().dimensions(_dimensions);
+           projection.clipExtent([[0, 0], _dimensions]);
+           _getMouseCoords = utilFastMouse(supersurface.node());
+           scheduleRedraw();
+           return map;
+         };
+
+         function zoomIn(delta) {
+           setCenterZoom(map.center(), ~~map.zoom() + delta, 250, true);
+         }
+
+         function zoomOut(delta) {
+           setCenterZoom(map.center(), ~~map.zoom() - delta, 250, true);
+         }
+
+         map.zoomIn = function () {
+           zoomIn(1);
+         };
+
+         map.zoomInFurther = function () {
+           zoomIn(4);
+         };
+
+         map.canZoomIn = function () {
+           return map.zoom() < maxZoom;
+         };
+
+         map.zoomOut = function () {
+           zoomOut(1);
+         };
+
+         map.zoomOutFurther = function () {
+           zoomOut(4);
+         };
+
+         map.canZoomOut = function () {
+           return map.zoom() > minZoom;
+         };
+
+         map.center = function (loc2) {
+           if (!arguments.length) {
+             return projection.invert(pxCenter());
+           }
+
+           if (setCenterZoom(loc2, map.zoom())) {
+             dispatch.call('move', this, map);
+           }
+
+           scheduleRedraw();
+           return map;
+         };
+
+         map.unobscuredCenterZoomEase = function (loc, zoom) {
+           var offset = map.unobscuredOffsetPx();
+           var proj = geoRawMercator().transform(projection.transform()); // copy projection
+           // use the target zoom to calculate the offset center
+
+           proj.scale(geoZoomToScale(zoom, TILESIZE));
+           var locPx = proj(loc);
+           var offsetLocPx = [locPx[0] + offset[0], locPx[1] + offset[1]];
+           var offsetLoc = proj.invert(offsetLocPx);
+           map.centerZoomEase(offsetLoc, zoom);
+         };
+
+         map.unobscuredOffsetPx = function () {
+           var openPane = context.container().select('.map-panes .map-pane.shown');
+
+           if (!openPane.empty()) {
+             return [openPane.node().offsetWidth / 2, 0];
+           }
+
+           return [0, 0];
+         };
+
+         map.zoom = function (z2) {
+           if (!arguments.length) {
+             return Math.max(geoScaleToZoom(projection.scale(), TILESIZE), 0);
+           }
+
+           if (z2 < _minzoom) {
+             surface.interrupt();
+             dispatch.call('hitMinZoom', this, map);
+             z2 = context.minEditableZoom();
+           }
+
+           if (setCenterZoom(map.center(), z2)) {
+             dispatch.call('move', this, map);
+           }
+
+           scheduleRedraw();
+           return map;
+         };
+
+         map.centerZoom = function (loc2, z2) {
+           if (setCenterZoom(loc2, z2)) {
+             dispatch.call('move', this, map);
+           }
+
+           scheduleRedraw();
+           return map;
+         };
+
+         map.zoomTo = function (entity) {
+           var extent = entity.extent(context.graph());
+           if (!isFinite(extent.area())) return map;
+           var z2 = clamp$1(map.trimmedExtentZoom(extent), 0, 20);
+           return map.centerZoom(extent.center(), z2);
+         };
+
+         map.centerEase = function (loc2, duration) {
+           duration = duration || 250;
+           setCenterZoom(loc2, map.zoom(), duration);
+           return map;
+         };
+
+         map.zoomEase = function (z2, duration) {
+           duration = duration || 250;
+           setCenterZoom(map.center(), z2, duration, false);
+           return map;
+         };
+
+         map.centerZoomEase = function (loc2, z2, duration) {
+           duration = duration || 250;
+           setCenterZoom(loc2, z2, duration, false);
+           return map;
+         };
+
+         map.transformEase = function (t2, duration) {
+           duration = duration || 250;
+           setTransform(t2, duration, false
+           /* don't force */
+           );
+           return map;
+         };
+
+         map.zoomToEase = function (obj, duration) {
+           var extent;
+
+           if (Array.isArray(obj)) {
+             obj.forEach(function (entity) {
+               var entityExtent = entity.extent(context.graph());
+
+               if (!extent) {
+                 extent = entityExtent;
+               } else {
+                 extent = extent.extend(entityExtent);
+               }
+             });
+           } else {
+             extent = obj.extent(context.graph());
+           }
+
+           if (!isFinite(extent.area())) return map;
+           var z2 = clamp$1(map.trimmedExtentZoom(extent), 0, 20);
+           return map.centerZoomEase(extent.center(), z2, duration);
+         };
+
+         map.startEase = function () {
+           utilBindOnce(surface, _pointerPrefix + 'down.ease', function () {
+             map.cancelEase();
+           });
+           return map;
+         };
+
+         map.cancelEase = function () {
+           _selection.interrupt();
+
+           return map;
+         };
+
+         map.extent = function (val) {
+           if (!arguments.length) {
+             return new geoExtent(projection.invert([0, _dimensions[1]]), projection.invert([_dimensions[0], 0]));
+           } else {
+             var extent = geoExtent(val);
+             map.centerZoom(extent.center(), map.extentZoom(extent));
+           }
+         };
+
+         map.trimmedExtent = function (val) {
+           if (!arguments.length) {
+             var headerY = 71;
+             var footerY = 30;
+             var pad = 10;
+             return new geoExtent(projection.invert([pad, _dimensions[1] - footerY - pad]), projection.invert([_dimensions[0] - pad, headerY + pad]));
+           } else {
+             var extent = geoExtent(val);
+             map.centerZoom(extent.center(), map.trimmedExtentZoom(extent));
+           }
+         };
+
+         function calcExtentZoom(extent, dim) {
+           var tl = projection([extent[0][0], extent[1][1]]);
+           var br = projection([extent[1][0], extent[0][1]]); // Calculate maximum zoom that fits extent
+
+           var hFactor = (br[0] - tl[0]) / dim[0];
+           var vFactor = (br[1] - tl[1]) / dim[1];
+           var hZoomDiff = Math.log(Math.abs(hFactor)) / Math.LN2;
+           var vZoomDiff = Math.log(Math.abs(vFactor)) / Math.LN2;
+           var newZoom = map.zoom() - Math.max(hZoomDiff, vZoomDiff);
+           return newZoom;
+         }
+
+         map.extentZoom = function (val) {
+           return calcExtentZoom(geoExtent(val), _dimensions);
+         };
+
+         map.trimmedExtentZoom = function (val) {
+           var trimY = 120;
+           var trimX = 40;
+           var trimmed = [_dimensions[0] - trimX, _dimensions[1] - trimY];
+           return calcExtentZoom(geoExtent(val), trimmed);
+         };
+
+         map.withinEditableZoom = function () {
+           return map.zoom() >= context.minEditableZoom();
+         };
+
+         map.isInWideSelection = function () {
+           return !map.withinEditableZoom() && context.selectedIDs().length;
+         };
+
+         map.editableDataEnabled = function (skipZoomCheck) {
+           var layer = context.layers().layer('osm');
+           if (!layer || !layer.enabled()) return false;
+           return skipZoomCheck || map.withinEditableZoom();
+         };
+
+         map.notesEditable = function () {
+           var layer = context.layers().layer('notes');
+           if (!layer || !layer.enabled()) return false;
+           return map.withinEditableZoom();
+         };
+
+         map.minzoom = function (val) {
+           if (!arguments.length) return _minzoom;
+           _minzoom = val;
+           return map;
+         };
+
+         map.toggleHighlightEdited = function () {
+           surface.classed('highlight-edited', !surface.classed('highlight-edited'));
+           map.pan([0, 0]); // trigger a redraw
+
+           dispatch.call('changeHighlighting', this);
+         };
+
+         map.areaFillOptions = ['wireframe', 'partial', 'full'];
+
+         map.activeAreaFill = function (val) {
+           if (!arguments.length) return corePreferences('area-fill') || 'partial';
+           corePreferences('area-fill', val);
+
+           if (val !== 'wireframe') {
+             corePreferences('area-fill-toggle', val);
+           }
+
+           updateAreaFill();
+           map.pan([0, 0]); // trigger a redraw
+
+           dispatch.call('changeAreaFill', this);
+           return map;
+         };
+
+         map.toggleWireframe = function () {
+           var activeFill = map.activeAreaFill();
+
+           if (activeFill === 'wireframe') {
+             activeFill = corePreferences('area-fill-toggle') || 'partial';
+           } else {
+             activeFill = 'wireframe';
+           }
+
+           map.activeAreaFill(activeFill);
+         };
+
+         function updateAreaFill() {
+           var activeFill = map.activeAreaFill();
+           map.areaFillOptions.forEach(function (opt) {
+             surface.classed('fill-' + opt, Boolean(opt === activeFill));
+           });
+         }
+
+         map.layers = function () {
+           return drawLayers;
+         };
+
+         map.doubleUpHandler = function () {
+           return _doubleUpHandler;
+         };
+
+         return utilRebind(map, dispatch, 'on');
+       }
+
+       function rendererPhotos(context) {
+         var dispatch = dispatch$8('change');
+         var _layerIDs = ['streetside', 'mapillary', 'mapillary-map-features', 'mapillary-signs', 'kartaview'];
+         var _allPhotoTypes = ['flat', 'panoramic'];
+
+         var _shownPhotoTypes = _allPhotoTypes.slice(); // shallow copy
+
+
+         var _dateFilters = ['fromDate', 'toDate'];
+
+         var _fromDate;
+
+         var _toDate;
+
+         var _usernames;
+
+         function photos() {}
+
+         function updateStorage() {
+           if (window.mocha) return;
+           var hash = utilStringQs(window.location.hash);
+           var enabled = context.layers().all().filter(function (d) {
+             return _layerIDs.indexOf(d.id) !== -1 && d.layer && d.layer.supported() && d.layer.enabled();
+           }).map(function (d) {
+             return d.id;
+           });
+
+           if (enabled.length) {
+             hash.photo_overlay = enabled.join(',');
+           } else {
+             delete hash.photo_overlay;
+           }
+
+           window.location.replace('#' + utilQsString(hash, true));
+         }
+
+         photos.overlayLayerIDs = function () {
+           return _layerIDs;
+         };
+
+         photos.allPhotoTypes = function () {
+           return _allPhotoTypes;
+         };
+
+         photos.dateFilters = function () {
+           return _dateFilters;
+         };
+
+         photos.dateFilterValue = function (val) {
+           return val === _dateFilters[0] ? _fromDate : _toDate;
+         };
+
+         photos.setDateFilter = function (type, val, updateUrl) {
+           // validate the date
+           var date = val && new Date(val);
+
+           if (date && !isNaN(date)) {
+             val = date.toISOString().substr(0, 10);
+           } else {
+             val = null;
+           }
+
+           if (type === _dateFilters[0]) {
+             _fromDate = val;
+
+             if (_fromDate && _toDate && new Date(_toDate) < new Date(_fromDate)) {
+               _toDate = _fromDate;
+             }
+           }
+
+           if (type === _dateFilters[1]) {
+             _toDate = val;
+
+             if (_fromDate && _toDate && new Date(_toDate) < new Date(_fromDate)) {
+               _fromDate = _toDate;
+             }
+           }
+
+           dispatch.call('change', this);
+
+           if (updateUrl) {
+             var rangeString;
+
+             if (_fromDate || _toDate) {
+               rangeString = (_fromDate || '') + '_' + (_toDate || '');
+             }
+
+             setUrlFilterValue('photo_dates', rangeString);
+           }
+         };
+
+         photos.setUsernameFilter = function (val, updateUrl) {
+           if (val && typeof val === 'string') val = val.replace(/;/g, ',').split(',');
+
+           if (val) {
+             val = val.map(function (d) {
+               return d.trim();
+             }).filter(Boolean);
+
+             if (!val.length) {
+               val = null;
+             }
+           }
+
+           _usernames = val;
+           dispatch.call('change', this);
+
+           if (updateUrl) {
+             var hashString;
+
+             if (_usernames) {
+               hashString = _usernames.join(',');
+             }
+
+             setUrlFilterValue('photo_username', hashString);
+           }
+         };
+
+         function setUrlFilterValue(property, val) {
+           if (!window.mocha) {
+             var hash = utilStringQs(window.location.hash);
+
+             if (val) {
+               if (hash[property] === val) return;
+               hash[property] = val;
+             } else {
+               if (!(property in hash)) return;
+               delete hash[property];
+             }
+
+             window.location.replace('#' + utilQsString(hash, true));
+           }
+         }
+
+         function showsLayer(id) {
+           var layer = context.layers().layer(id);
+           return layer && layer.supported() && layer.enabled();
+         }
+
+         photos.shouldFilterByDate = function () {
+           return showsLayer('mapillary') || showsLayer('kartaview') || showsLayer('streetside');
+         };
+
+         photos.shouldFilterByPhotoType = function () {
+           return showsLayer('mapillary') || showsLayer('streetside') && showsLayer('kartaview');
+         };
+
+         photos.shouldFilterByUsername = function () {
+           return !showsLayer('mapillary') && showsLayer('kartaview') && !showsLayer('streetside');
+         };
+
+         photos.showsPhotoType = function (val) {
+           if (!photos.shouldFilterByPhotoType()) return true;
+           return _shownPhotoTypes.indexOf(val) !== -1;
+         };
+
+         photos.showsFlat = function () {
+           return photos.showsPhotoType('flat');
+         };
+
+         photos.showsPanoramic = function () {
+           return photos.showsPhotoType('panoramic');
+         };
+
+         photos.fromDate = function () {
+           return _fromDate;
+         };
+
+         photos.toDate = function () {
+           return _toDate;
+         };
+
+         photos.togglePhotoType = function (val) {
+           var index = _shownPhotoTypes.indexOf(val);
+
+           if (index !== -1) {
+             _shownPhotoTypes.splice(index, 1);
+           } else {
+             _shownPhotoTypes.push(val);
+           }
+
+           dispatch.call('change', this);
+           return photos;
+         };
+
+         photos.usernames = function () {
+           return _usernames;
+         };
+
+         photos.init = function () {
+           var hash = utilStringQs(window.location.hash);
+
+           if (hash.photo_dates) {
+             // expect format like `photo_dates=2019-01-01_2020-12-31`, but allow a couple different separators
+             var parts = /^(.*)[–_](.*)$/g.exec(hash.photo_dates.trim());
+             this.setDateFilter('fromDate', parts && parts.length >= 2 && parts[1], false);
+             this.setDateFilter('toDate', parts && parts.length >= 3 && parts[2], false);
+           }
+
+           if (hash.photo_username) {
+             this.setUsernameFilter(hash.photo_username, false);
+           }
+
+           if (hash.photo_overlay) {
+             // support enabling photo layers by default via a URL parameter, e.g. `photo_overlay=kartaview;mapillary;streetside`
+             var hashOverlayIDs = hash.photo_overlay.replace(/;/g, ',').split(',');
+             hashOverlayIDs.forEach(function (id) {
+               if (id === 'openstreetcam') id = 'kartaview'; // legacy alias
+
+               var layer = _layerIDs.indexOf(id) !== -1 && context.layers().layer(id);
+               if (layer && !layer.enabled()) layer.enabled(true);
+             });
+           }
+
+           if (hash.photo) {
+             // support opening a photo via a URL parameter, e.g. `photo=mapillary-fztgSDtLpa08ohPZFZjeRQ`
+             var photoIds = hash.photo.replace(/;/g, ',').split(',');
+             var photoId = photoIds.length && photoIds[0].trim();
+             var results = /(.*)\/(.*)/g.exec(photoId);
+
+             if (results && results.length >= 3) {
+               var serviceId = results[1];
+               if (serviceId === 'openstreetcam') serviceId = 'kartaview'; // legacy alias
+
+               var photoKey = results[2];
+               var service = services[serviceId];
+
+               if (service && service.ensureViewerLoaded) {
+                 // if we're showing a photo then make sure its layer is enabled too
+                 var layer = _layerIDs.indexOf(serviceId) !== -1 && context.layers().layer(serviceId);
+                 if (layer && !layer.enabled()) layer.enabled(true);
+                 var baselineTime = Date.now();
+                 service.on('loadedImages.rendererPhotos', function () {
+                   // don't open the viewer if too much time has elapsed
+                   if (Date.now() - baselineTime > 45000) {
+                     service.on('loadedImages.rendererPhotos', null);
+                     return;
+                   }
+
+                   if (!service.cachedImage(photoKey)) return;
+                   service.on('loadedImages.rendererPhotos', null);
+                   service.ensureViewerLoaded(context).then(function () {
+                     service.selectImage(context, photoKey).showViewer(context);
+                   });
+                 });
+               }
+             }
+           }
+
+           context.layers().on('change.rendererPhotos', updateStorage);
+         };
+
+         return utilRebind(photos, dispatch, 'on');
+       }
+
+       function uiAccount(context) {
+         var osm = context.connection();
+
+         function update(selection) {
+           if (!osm) return;
+
+           if (!osm.authenticated()) {
+             selection.selectAll('.userLink, .logoutLink').classed('hide', true);
+             return;
+           }
+
+           osm.userDetails(function (err, details) {
+             var userLink = selection.select('.userLink'),
+                 logoutLink = selection.select('.logoutLink');
+             userLink.html('');
+             logoutLink.html('');
+             if (err || !details) return;
+             selection.selectAll('.userLink, .logoutLink').classed('hide', false); // Link
+
+             var userLinkA = userLink.append('a').attr('href', osm.userURL(details.display_name)).attr('target', '_blank'); // Add thumbnail or dont
+
+             if (details.image_url) {
+               userLinkA.append('img').attr('class', 'icon pre-text user-icon').attr('src', details.image_url);
+             } else {
+               userLinkA.call(svgIcon('#iD-icon-avatar', 'pre-text light'));
+             } // Add user name
+
+
+             userLinkA.append('span').attr('class', 'label').html(details.display_name);
+             logoutLink.append('a').attr('class', 'logout').attr('href', '#').call(_t.append('logout')).on('click.logout', function (d3_event) {
+               d3_event.preventDefault();
+               osm.logout();
+             });
+           });
+         }
+
+         return function (selection) {
+           selection.append('li').attr('class', 'userLink').classed('hide', true);
+           selection.append('li').attr('class', 'logoutLink').classed('hide', true);
+
+           if (osm) {
+             osm.on('change.account', function () {
+               update(selection);
+             });
+             update(selection);
+           }
+         };
+       }
+
+       function uiAttribution(context) {
+         var _selection = select(null);
+
+         function render(selection, data, klass) {
+           var div = selection.selectAll(".".concat(klass)).data([0]);
+           div = div.enter().append('div').attr('class', klass).merge(div);
+           var attributions = div.selectAll('.attribution').data(data, function (d) {
+             return d.id;
+           });
+           attributions.exit().remove();
+           attributions = attributions.enter().append('span').attr('class', 'attribution').each(function (d, i, nodes) {
+             var attribution = select(nodes[i]);
+
+             if (d.terms_html) {
+               attribution.html(d.terms_html);
+               return;
+             }
+
+             if (d.terms_url) {
+               attribution = attribution.append('a').attr('href', d.terms_url).attr('target', '_blank');
+             }
+
+             var sourceID = d.id.replace(/\./g, '<TX_DOT>');
+             var terms_text = _t("imagery.".concat(sourceID, ".attribution.text"), {
+               "default": d.terms_text || d.id || d.name()
+             });
+
+             if (d.icon && !d.overlay) {
+               attribution.append('img').attr('class', 'source-image').attr('src', d.icon);
+             }
+
+             attribution.append('span').attr('class', 'attribution-text').text(terms_text);
+           }).merge(attributions);
+           var copyright = attributions.selectAll('.copyright-notice').data(function (d) {
+             var notice = d.copyrightNotices(context.map().zoom(), context.map().extent());
+             return notice ? [notice] : [];
+           });
+           copyright.exit().remove();
+           copyright = copyright.enter().append('span').attr('class', 'copyright-notice').merge(copyright);
+           copyright.text(String);
+         }
+
+         function update() {
+           var baselayer = context.background().baseLayerSource();
+
+           _selection.call(render, baselayer ? [baselayer] : [], 'base-layer-attribution');
+
+           var z = context.map().zoom();
+           var overlays = context.background().overlayLayerSources() || [];
+
+           _selection.call(render, overlays.filter(function (s) {
+             return s.validZoom(z);
+           }), 'overlay-layer-attribution');
+         }
+
+         return function (selection) {
+           _selection = selection;
+           context.background().on('change.attribution', update);
+           context.map().on('move.attribution', throttle(update, 400, {
+             leading: false
+           }));
+           update();
+         };
+       }
+
+       function uiContributors(context) {
+         var osm = context.connection(),
+             debouncedUpdate = debounce(function () {
+           update();
+         }, 1000),
+             limit = 4,
+             hidden = false,
+             wrap = select(null);
+
+         function update() {
+           if (!osm) return;
+           var users = {},
+               entities = context.history().intersects(context.map().extent());
+           entities.forEach(function (entity) {
+             if (entity && entity.user) users[entity.user] = true;
+           });
+           var u = Object.keys(users),
+               subset = u.slice(0, u.length > limit ? limit - 1 : limit);
+           wrap.html('').call(svgIcon('#iD-icon-nearby', 'pre-text light'));
+           var userList = select(document.createElement('span'));
+           userList.selectAll().data(subset).enter().append('a').attr('class', 'user-link').attr('href', function (d) {
+             return osm.userURL(d);
+           }).attr('target', '_blank').text(String);
+
+           if (u.length > limit) {
+             var count = select(document.createElement('span'));
+             var othersNum = u.length - limit + 1;
+             count.append('a').attr('target', '_blank').attr('href', function () {
+               return osm.changesetsURL(context.map().center(), context.map().zoom());
+             }).text(othersNum);
+             wrap.append('span').html(_t.html('contributors.truncated_list', {
+               n: othersNum,
+               users: {
+                 html: userList.html()
+               },
+               count: {
+                 html: count.html()
+               }
+             }));
+           } else {
+             wrap.append('span').html(_t.html('contributors.list', {
+               users: {
+                 html: userList.html()
+               }
+             }));
+           }
+
+           if (!u.length) {
+             hidden = true;
+             wrap.transition().style('opacity', 0);
+           } else if (hidden) {
+             wrap.transition().style('opacity', 1);
+           }
+         }
+
+         return function (selection) {
+           if (!osm) return;
+           wrap = selection;
+           update();
+           osm.on('loaded.contributors', debouncedUpdate);
+           context.map().on('move.contributors', debouncedUpdate);
+         };
+       }
+
+       var _popoverID = 0;
+       function uiPopover(klass) {
+         var _id = _popoverID++;
+
+         var _anchorSelection = select(null);
+
+         var popover = function popover(selection) {
+           _anchorSelection = selection;
+           selection.each(setup);
+         };
+
+         var _animation = utilFunctor(false);
+
+         var _placement = utilFunctor('top'); // top, bottom, left, right
+
+
+         var _alignment = utilFunctor('center'); // leading, center, trailing
+
+
+         var _scrollContainer = utilFunctor(select(null));
+
+         var _content;
+
+         var _displayType = utilFunctor('');
+
+         var _hasArrow = utilFunctor(true); // use pointer events on supported platforms; fallback to mouse events
+
+
+         var _pointerPrefix = 'PointerEvent' in window ? 'pointer' : 'mouse';
+
+         popover.displayType = function (val) {
+           if (arguments.length) {
+             _displayType = utilFunctor(val);
+             return popover;
+           } else {
+             return _displayType;
+           }
+         };
+
+         popover.hasArrow = function (val) {
+           if (arguments.length) {
+             _hasArrow = utilFunctor(val);
+             return popover;
+           } else {
+             return _hasArrow;
+           }
+         };
+
+         popover.placement = function (val) {
+           if (arguments.length) {
+             _placement = utilFunctor(val);
+             return popover;
+           } else {
+             return _placement;
+           }
+         };
+
+         popover.alignment = function (val) {
+           if (arguments.length) {
+             _alignment = utilFunctor(val);
+             return popover;
+           } else {
+             return _alignment;
+           }
+         };
+
+         popover.scrollContainer = function (val) {
+           if (arguments.length) {
+             _scrollContainer = utilFunctor(val);
+             return popover;
+           } else {
+             return _scrollContainer;
+           }
+         };
+
+         popover.content = function (val) {
+           if (arguments.length) {
+             _content = val;
+             return popover;
+           } else {
+             return _content;
+           }
+         };
+
+         popover.isShown = function () {
+           var popoverSelection = _anchorSelection.select('.popover-' + _id);
+
+           return !popoverSelection.empty() && popoverSelection.classed('in');
+         };
+
+         popover.show = function () {
+           _anchorSelection.each(show);
+         };
+
+         popover.updateContent = function () {
+           _anchorSelection.each(updateContent);
+         };
+
+         popover.hide = function () {
+           _anchorSelection.each(hide);
+         };
+
+         popover.toggle = function () {
+           _anchorSelection.each(toggle);
+         };
+
+         popover.destroy = function (selection, selector) {
+           // by default, just destroy the current popover
+           selector = selector || '.popover-' + _id;
+           selection.on(_pointerPrefix + 'enter.popover', null).on(_pointerPrefix + 'leave.popover', null).on(_pointerPrefix + 'up.popover', null).on(_pointerPrefix + 'down.popover', null).on('click.popover', null).attr('title', function () {
+             return this.getAttribute('data-original-title') || this.getAttribute('title');
+           }).attr('data-original-title', null).selectAll(selector).remove();
+         };
+
+         popover.destroyAny = function (selection) {
+           selection.call(popover.destroy, '.popover');
+         };
+
+         function setup() {
+           var anchor = select(this);
+
+           var animate = _animation.apply(this, arguments);
+
+           var popoverSelection = anchor.selectAll('.popover-' + _id).data([0]);
+           var enter = popoverSelection.enter().append('div').attr('class', 'popover popover-' + _id + ' ' + (klass ? klass : '')).classed('arrowed', _hasArrow.apply(this, arguments));
+           enter.append('div').attr('class', 'popover-arrow');
+           enter.append('div').attr('class', 'popover-inner');
+           popoverSelection = enter.merge(popoverSelection);
+
+           if (animate) {
+             popoverSelection.classed('fade', true);
+           }
+
+           var display = _displayType.apply(this, arguments);
+
+           if (display === 'hover') {
+             var _lastNonMouseEnterTime;
+
+             anchor.on(_pointerPrefix + 'enter.popover', function (d3_event) {
+               if (d3_event.pointerType) {
+                 if (d3_event.pointerType !== 'mouse') {
+                   _lastNonMouseEnterTime = d3_event.timeStamp; // only allow hover behavior for mouse input
+
+                   return;
+                 } else if (_lastNonMouseEnterTime && d3_event.timeStamp - _lastNonMouseEnterTime < 1500) {
+                   // HACK: iOS 13.4 sends an erroneous `mouse` type pointerenter
+                   // event for non-mouse interactions right after sending
+                   // the correct type pointerenter event. Workaround by discarding
+                   // any mouse event that occurs immediately after a non-mouse event.
+                   return;
+                 }
+               } // don't show if buttons are pressed, e.g. during click and drag of map
+
+
+               if (d3_event.buttons !== 0) return;
+               show.apply(this, arguments);
+             }).on(_pointerPrefix + 'leave.popover', function () {
+               hide.apply(this, arguments);
+             }) // show on focus too for better keyboard navigation support
+             .on('focus.popover', function () {
+               show.apply(this, arguments);
+             }).on('blur.popover', function () {
+               hide.apply(this, arguments);
+             });
+           } else if (display === 'clickFocus') {
+             anchor.on(_pointerPrefix + 'down.popover', function (d3_event) {
+               d3_event.preventDefault();
+               d3_event.stopPropagation();
+             }).on(_pointerPrefix + 'up.popover', function (d3_event) {
+               d3_event.preventDefault();
+               d3_event.stopPropagation();
+             }).on('click.popover', toggle);
+             popoverSelection // This attribute lets the popover take focus
+             .attr('tabindex', 0).on('blur.popover', function () {
+               anchor.each(function () {
+                 hide.apply(this, arguments);
+               });
+             });
+           }
+         }
+
+         function show() {
+           var anchor = select(this);
+           var popoverSelection = anchor.selectAll('.popover-' + _id);
+
+           if (popoverSelection.empty()) {
+             // popover was removed somehow, put it back
+             anchor.call(popover.destroy);
+             anchor.each(setup);
+             popoverSelection = anchor.selectAll('.popover-' + _id);
+           }
+
+           popoverSelection.classed('in', true);
+
+           var displayType = _displayType.apply(this, arguments);
+
+           if (displayType === 'clickFocus') {
+             anchor.classed('active', true);
+             popoverSelection.node().focus();
+           }
+
+           anchor.each(updateContent);
+         }
+
+         function updateContent() {
+           var anchor = select(this);
+
+           if (_content) {
+             anchor.selectAll('.popover-' + _id + ' > .popover-inner').call(_content.apply(this, arguments));
+           }
+
+           updatePosition.apply(this, arguments); // hack: update multiple times to fix instances where the absolute offset is
+           // set before the dynamic popover size is calculated by the browser
+
+           updatePosition.apply(this, arguments);
+           updatePosition.apply(this, arguments);
+         }
+
+         function updatePosition() {
+           var anchor = select(this);
+           var popoverSelection = anchor.selectAll('.popover-' + _id);
+
+           var scrollContainer = _scrollContainer && _scrollContainer.apply(this, arguments);
+
+           var scrollNode = scrollContainer && !scrollContainer.empty() && scrollContainer.node();
+           var scrollLeft = scrollNode ? scrollNode.scrollLeft : 0;
+           var scrollTop = scrollNode ? scrollNode.scrollTop : 0;
+
+           var placement = _placement.apply(this, arguments);
+
+           popoverSelection.classed('left', false).classed('right', false).classed('top', false).classed('bottom', false).classed(placement, true);
+
+           var alignment = _alignment.apply(this, arguments);
+
+           var alignFactor = 0.5;
+
+           if (alignment === 'leading') {
+             alignFactor = 0;
+           } else if (alignment === 'trailing') {
+             alignFactor = 1;
+           }
+
+           var anchorFrame = getFrame(anchor.node());
+           var popoverFrame = getFrame(popoverSelection.node());
+           var position;
+
+           switch (placement) {
+             case 'top':
+               position = {
+                 x: anchorFrame.x + (anchorFrame.w - popoverFrame.w) * alignFactor,
+                 y: anchorFrame.y - popoverFrame.h
+               };
+               break;
+
+             case 'bottom':
+               position = {
+                 x: anchorFrame.x + (anchorFrame.w - popoverFrame.w) * alignFactor,
+                 y: anchorFrame.y + anchorFrame.h
+               };
+               break;
+
+             case 'left':
+               position = {
+                 x: anchorFrame.x - popoverFrame.w,
+                 y: anchorFrame.y + (anchorFrame.h - popoverFrame.h) * alignFactor
+               };
+               break;
+
+             case 'right':
+               position = {
+                 x: anchorFrame.x + anchorFrame.w,
+                 y: anchorFrame.y + (anchorFrame.h - popoverFrame.h) * alignFactor
+               };
+               break;
+           }
+
+           if (position) {
+             if (scrollNode && (placement === 'top' || placement === 'bottom')) {
+               var initialPosX = position.x;
+
+               if (position.x + popoverFrame.w > scrollNode.offsetWidth - 10) {
+                 position.x = scrollNode.offsetWidth - 10 - popoverFrame.w;
+               } else if (position.x < 10) {
+                 position.x = 10;
+               }
+
+               var arrow = anchor.selectAll('.popover-' + _id + ' > .popover-arrow'); // keep the arrow centered on the button, or as close as possible
+
+               var arrowPosX = Math.min(Math.max(popoverFrame.w / 2 - (position.x - initialPosX), 10), popoverFrame.w - 10);
+               arrow.style('left', ~~arrowPosX + 'px');
+             }
+
+             popoverSelection.style('left', ~~position.x + 'px').style('top', ~~position.y + 'px');
+           } else {
+             popoverSelection.style('left', null).style('top', null);
+           }
+
+           function getFrame(node) {
+             var positionStyle = select(node).style('position');
+
+             if (positionStyle === 'absolute' || positionStyle === 'static') {
+               return {
+                 x: node.offsetLeft - scrollLeft,
+                 y: node.offsetTop - scrollTop,
+                 w: node.offsetWidth,
+                 h: node.offsetHeight
+               };
+             } else {
+               return {
+                 x: 0,
+                 y: 0,
+                 w: node.offsetWidth,
+                 h: node.offsetHeight
+               };
+             }
+           }
+         }
+
+         function hide() {
+           var anchor = select(this);
+
+           if (_displayType.apply(this, arguments) === 'clickFocus') {
+             anchor.classed('active', false);
+           }
+
+           anchor.selectAll('.popover-' + _id).classed('in', false);
+         }
+
+         function toggle() {
+           if (select(this).select('.popover-' + _id).classed('in')) {
+             hide.apply(this, arguments);
+           } else {
+             show.apply(this, arguments);
+           }
+         }
+
+         return popover;
+       }
+
+       function uiTooltip(klass) {
+         var tooltip = uiPopover((klass || '') + ' tooltip').displayType('hover');
+
+         var _title = function _title() {
+           var title = this.getAttribute('data-original-title');
+
+           if (title) {
+             return title;
+           } else {
+             title = this.getAttribute('title');
+             this.removeAttribute('title');
+             this.setAttribute('data-original-title', title);
+           }
+
+           return title;
+         };
+
+         var _heading = utilFunctor(null);
+
+         var _keys = utilFunctor(null);
+
+         tooltip.title = function (val) {
+           if (!arguments.length) return _title;
+           _title = utilFunctor(val);
+           return tooltip;
+         };
+
+         tooltip.heading = function (val) {
+           if (!arguments.length) return _heading;
+           _heading = utilFunctor(val);
+           return tooltip;
+         };
+
+         tooltip.keys = function (val) {
+           if (!arguments.length) return _keys;
+           _keys = utilFunctor(val);
+           return tooltip;
+         };
+
+         tooltip.content(function () {
+           var heading = _heading.apply(this, arguments);
+
+           var text = _title.apply(this, arguments);
+
+           var keys = _keys.apply(this, arguments);
+
+           return function (selection) {
+             var headingSelect = selection.selectAll('.tooltip-heading').data(heading ? [heading] : []);
+             headingSelect.exit().remove();
+             headingSelect.enter().append('div').attr('class', 'tooltip-heading').merge(headingSelect).html(heading);
+             var textSelect = selection.selectAll('.tooltip-text').data(text ? [text] : []);
+             textSelect.exit().remove();
+             textSelect.enter().append('div').attr('class', 'tooltip-text').merge(textSelect).html(text);
+             var keyhintWrap = selection.selectAll('.keyhint-wrap').data(keys && keys.length ? [0] : []);
+             keyhintWrap.exit().remove();
+             var keyhintWrapEnter = keyhintWrap.enter().append('div').attr('class', 'keyhint-wrap');
+             keyhintWrapEnter.append('span').call(_t.append('tooltip_keyhint'));
+             keyhintWrap = keyhintWrapEnter.merge(keyhintWrap);
+             keyhintWrap.selectAll('kbd.shortcut').data(keys && keys.length ? keys : []).enter().append('kbd').attr('class', 'shortcut').html(function (d) {
+               return d;
+             });
+           };
+         });
+         return tooltip;
+       }
+
+       function uiEditMenu(context) {
+         var dispatch = dispatch$8('toggled');
+
+         var _menu = select(null);
+
+         var _operations = []; // the position the menu should be displayed relative to
+
+         var _anchorLoc = [0, 0];
+         var _anchorLocLonLat = [0, 0]; // a string indicating how the menu was opened
+
+         var _triggerType = '';
+         var _vpTopMargin = 85; // viewport top margin
+
+         var _vpBottomMargin = 45; // viewport bottom margin
+
+         var _vpSideMargin = 35; // viewport side margin
+
+         var _menuTop = false;
+
+         var _menuHeight;
+
+         var _menuWidth; // hardcode these values to make menu positioning easier
+
+
+         var _verticalPadding = 4; // see also `.edit-menu .tooltip` CSS; include margin
+
+         var _tooltipWidth = 210; // offset the menu slightly from the target location
+
+         var _menuSideMargin = 10;
+         var _tooltips = [];
+
+         var editMenu = function editMenu(selection) {
+           var isTouchMenu = _triggerType.includes('touch') || _triggerType.includes('pen');
+
+           var ops = _operations.filter(function (op) {
+             return !isTouchMenu || !op.mouseOnly;
+           });
+
+           if (!ops.length) return;
+           _tooltips = []; // Position the menu above the anchor for stylus and finger input
+           // since the mapper's hand likely obscures the screen below the anchor
+
+           _menuTop = isTouchMenu; // Show labels for touch input since there aren't hover tooltips
+
+           var showLabels = isTouchMenu;
+           var buttonHeight = showLabels ? 32 : 34;
+
+           if (showLabels) {
+             // Get a general idea of the width based on the length of the label
+             _menuWidth = 52 + Math.min(120, 6 * Math.max.apply(Math, ops.map(function (op) {
+               return op.title.length;
+             })));
+           } else {
+             _menuWidth = 44;
+           }
+
+           _menuHeight = _verticalPadding * 2 + ops.length * buttonHeight;
+           _menu = selection.append('div').attr('class', 'edit-menu').classed('touch-menu', isTouchMenu).style('padding', _verticalPadding + 'px 0');
+
+           var buttons = _menu.selectAll('.edit-menu-item').data(ops); // enter
+
+
+           var buttonsEnter = buttons.enter().append('button').attr('class', function (d) {
+             return 'edit-menu-item edit-menu-item-' + d.id;
+           }).style('height', buttonHeight + 'px').on('click', click) // don't listen for `mouseup` because we only care about non-mouse pointer types
+           .on('pointerup', pointerup).on('pointerdown mousedown', function pointerdown(d3_event) {
+             // don't let button presses also act as map input - #1869
+             d3_event.stopPropagation();
+           }).on('mouseenter.highlight', function (d3_event, d) {
+             if (!d.relatedEntityIds || select(this).classed('disabled')) return;
+             utilHighlightEntities(d.relatedEntityIds(), true, context);
+           }).on('mouseleave.highlight', function (d3_event, d) {
+             if (!d.relatedEntityIds) return;
+             utilHighlightEntities(d.relatedEntityIds(), false, context);
+           });
+           buttonsEnter.each(function (d) {
+             var tooltip = uiTooltip().heading(d.title).title(d.tooltip()).keys([d.keys[0]]);
+
+             _tooltips.push(tooltip);
+
+             select(this).call(tooltip).append('div').attr('class', 'icon-wrap').call(svgIcon(d.icon && d.icon() || '#iD-operation-' + d.id, 'operation'));
+           });
+
+           if (showLabels) {
+             buttonsEnter.append('span').attr('class', 'label').html(function (d) {
+               return d.title;
+             });
+           } // update
+
+
+           buttonsEnter.merge(buttons).classed('disabled', function (d) {
+             return d.disabled();
+           });
+           updatePosition();
+           var initialScale = context.projection.scale();
+           context.map().on('move.edit-menu', function () {
+             if (initialScale !== context.projection.scale()) {
+               editMenu.close();
+             }
+           }).on('drawn.edit-menu', function (info) {
+             if (info.full) updatePosition();
+           });
+           var lastPointerUpType; // `pointerup` is always called before `click`
+
+           function pointerup(d3_event) {
+             lastPointerUpType = d3_event.pointerType;
+           }
+
+           function click(d3_event, operation) {
+             d3_event.stopPropagation();
+
+             if (operation.relatedEntityIds) {
+               utilHighlightEntities(operation.relatedEntityIds(), false, context);
+             }
+
+             if (operation.disabled()) {
+               if (lastPointerUpType === 'touch' || lastPointerUpType === 'pen') {
+                 // there are no tooltips for touch interactions so flash feedback instead
+                 context.ui().flash.duration(4000).iconName('#iD-operation-' + operation.id).iconClass('operation disabled').label(operation.tooltip)();
+               }
+             } else {
+               if (lastPointerUpType === 'touch' || lastPointerUpType === 'pen') {
+                 context.ui().flash.duration(2000).iconName('#iD-operation-' + operation.id).iconClass('operation').label(operation.annotation() || operation.title)();
+               }
+
+               operation();
+               editMenu.close();
+             }
+
+             lastPointerUpType = null;
+           }
+
+           dispatch.call('toggled', this, true);
+         };
+
+         function updatePosition() {
+           if (!_menu || _menu.empty()) return;
+           var anchorLoc = context.projection(_anchorLocLonLat);
+           var viewport = context.surfaceRect();
+
+           if (anchorLoc[0] < 0 || anchorLoc[0] > viewport.width || anchorLoc[1] < 0 || anchorLoc[1] > viewport.height) {
+             // close the menu if it's gone offscreen
+             editMenu.close();
+             return;
+           }
+
+           var menuLeft = displayOnLeft(viewport);
+           var offset = [0, 0];
+           offset[0] = menuLeft ? -1 * (_menuSideMargin + _menuWidth) : _menuSideMargin;
+
+           if (_menuTop) {
+             if (anchorLoc[1] - _menuHeight < _vpTopMargin) {
+               // menu is near top viewport edge, shift downward
+               offset[1] = -anchorLoc[1] + _vpTopMargin;
+             } else {
+               offset[1] = -_menuHeight;
+             }
+           } else {
+             if (anchorLoc[1] + _menuHeight > viewport.height - _vpBottomMargin) {
+               // menu is near bottom viewport edge, shift upwards
+               offset[1] = -anchorLoc[1] - _menuHeight + viewport.height - _vpBottomMargin;
+             } else {
+               offset[1] = 0;
+             }
+           }
+
+           var origin = geoVecAdd(anchorLoc, offset);
+
+           _menu.style('left', origin[0] + 'px').style('top', origin[1] + 'px');
+
+           var tooltipSide = tooltipPosition(viewport, menuLeft);
+
+           _tooltips.forEach(function (tooltip) {
+             tooltip.placement(tooltipSide);
+           });
+
+           function displayOnLeft(viewport) {
+             if (_mainLocalizer.textDirection() === 'ltr') {
+               if (anchorLoc[0] + _menuSideMargin + _menuWidth > viewport.width - _vpSideMargin) {
+                 // right menu would be too close to the right viewport edge, go left
+                 return true;
+               } // prefer right menu
+
+
+               return false;
+             } else {
+               // rtl
+               if (anchorLoc[0] - _menuSideMargin - _menuWidth < _vpSideMargin) {
+                 // left menu would be too close to the left viewport edge, go right
+                 return false;
+               } // prefer left menu
+
+
+               return true;
+             }
+           }
+
+           function tooltipPosition(viewport, menuLeft) {
+             if (_mainLocalizer.textDirection() === 'ltr') {
+               if (menuLeft) {
+                 // if there's not room for a right-side menu then there definitely
+                 // isn't room for right-side tooltips
+                 return 'left';
+               }
+
+               if (anchorLoc[0] + _menuSideMargin + _menuWidth + _tooltipWidth > viewport.width - _vpSideMargin) {
+                 // right tooltips would be too close to the right viewport edge, go left
+                 return 'left';
+               } // prefer right tooltips
+
+
+               return 'right';
+             } else {
+               // rtl
+               if (!menuLeft) {
+                 return 'right';
+               }
+
+               if (anchorLoc[0] - _menuSideMargin - _menuWidth - _tooltipWidth < _vpSideMargin) {
+                 // left tooltips would be too close to the left viewport edge, go right
+                 return 'right';
+               } // prefer left tooltips
+
+
+               return 'left';
+             }
+           }
+         }
+
+         editMenu.close = function () {
+           context.map().on('move.edit-menu', null).on('drawn.edit-menu', null);
+
+           _menu.remove();
+
+           _tooltips = [];
+           dispatch.call('toggled', this, false);
+         };
+
+         editMenu.anchorLoc = function (val) {
+           if (!arguments.length) return _anchorLoc;
+           _anchorLoc = val;
+           _anchorLocLonLat = context.projection.invert(_anchorLoc);
+           return editMenu;
+         };
+
+         editMenu.triggerType = function (val) {
+           if (!arguments.length) return _triggerType;
+           _triggerType = val;
+           return editMenu;
+         };
+
+         editMenu.operations = function (val) {
+           if (!arguments.length) return _operations;
+           _operations = val;
+           return editMenu;
+         };
+
+         return utilRebind(editMenu, dispatch, 'on');
+       }
+
+       function uiFeatureInfo(context) {
+         function update(selection) {
+           var features = context.features();
+           var stats = features.stats();
+           var count = 0;
+           var hiddenList = features.hidden().map(function (k) {
+             if (stats[k]) {
+               count += stats[k];
+               return _t.html('inspector.title_count', {
+                 title: {
+                   html: _t.html('feature.' + k + '.description')
+                 },
+                 count: stats[k]
+               });
+             }
+
+             return null;
+           }).filter(Boolean);
+           selection.html('');
+
+           if (hiddenList.length) {
+             var tooltipBehavior = uiTooltip().placement('top').title(function () {
+               return hiddenList.join('<br/>');
+             });
+             selection.append('a').attr('class', 'chip').attr('href', '#').call(_t.append('feature_info.hidden_warning', {
+               count: count
+             })).call(tooltipBehavior).on('click', function (d3_event) {
+               tooltipBehavior.hide();
+               d3_event.preventDefault(); // open the Map Data pane
+
+               context.ui().togglePanes(context.container().select('.map-panes .map-data-pane'));
+             });
+           }
+
+           selection.classed('hide', !hiddenList.length);
+         }
+
+         return function (selection) {
+           update(selection);
+           context.features().on('change.feature_info', function () {
+             update(selection);
+           });
+         };
+       }
+
+       function uiFlash(context) {
+         var _flashTimer;
+
+         var _duration = 2000;
+         var _iconName = '#iD-icon-no';
+         var _iconClass = 'disabled';
+         var _label = '';
+
+         function flash() {
+           if (_flashTimer) {
+             _flashTimer.stop();
+           }
+
+           context.container().select('.main-footer-wrap').classed('footer-hide', true).classed('footer-show', false);
+           context.container().select('.flash-wrap').classed('footer-hide', false).classed('footer-show', true);
+           var content = context.container().select('.flash-wrap').selectAll('.flash-content').data([0]); // Enter
+
+           var contentEnter = content.enter().append('div').attr('class', 'flash-content');
+           var iconEnter = contentEnter.append('svg').attr('class', 'flash-icon icon').append('g').attr('transform', 'translate(10,10)');
+           iconEnter.append('circle').attr('r', 9);
+           iconEnter.append('use').attr('transform', 'translate(-7,-7)').attr('width', '14').attr('height', '14');
+           contentEnter.append('div').attr('class', 'flash-text'); // Update
+
+           content = content.merge(contentEnter);
+           content.selectAll('.flash-icon').attr('class', 'icon flash-icon ' + (_iconClass || ''));
+           content.selectAll('.flash-icon use').attr('xlink:href', _iconName);
+           content.selectAll('.flash-text').attr('class', 'flash-text').html(_label);
+           _flashTimer = d3_timeout(function () {
+             _flashTimer = null;
+             context.container().select('.main-footer-wrap').classed('footer-hide', false).classed('footer-show', true);
+             context.container().select('.flash-wrap').classed('footer-hide', true).classed('footer-show', false);
+           }, _duration);
+           return content;
+         }
+
+         flash.duration = function (_) {
+           if (!arguments.length) return _duration;
+           _duration = _;
+           return flash;
+         };
+
+         flash.label = function (_) {
+           if (!arguments.length) return _label;
+           _label = _;
+           return flash;
+         };
+
+         flash.iconName = function (_) {
+           if (!arguments.length) return _iconName;
+           _iconName = _;
+           return flash;
+         };
+
+         flash.iconClass = function (_) {
+           if (!arguments.length) return _iconClass;
+           _iconClass = _;
+           return flash;
+         };
+
+         return flash;
+       }
+
+       function uiFullScreen(context) {
+         var element = context.container().node(); // var button = d3_select(null);
+
+         function getFullScreenFn() {
+           if (element.requestFullscreen) {
+             return element.requestFullscreen;
+           } else if (element.msRequestFullscreen) {
+             return element.msRequestFullscreen;
+           } else if (element.mozRequestFullScreen) {
+             return element.mozRequestFullScreen;
+           } else if (element.webkitRequestFullscreen) {
+             return element.webkitRequestFullscreen;
+           }
+         }
+
+         function getExitFullScreenFn() {
+           if (document.exitFullscreen) {
+             return document.exitFullscreen;
+           } else if (document.msExitFullscreen) {
+             return document.msExitFullscreen;
+           } else if (document.mozCancelFullScreen) {
+             return document.mozCancelFullScreen;
+           } else if (document.webkitExitFullscreen) {
+             return document.webkitExitFullscreen;
+           }
+         }
+
+         function isFullScreen() {
+           return document.fullscreenElement || document.mozFullScreenElement || document.webkitFullscreenElement || document.msFullscreenElement;
+         }
+
+         function isSupported() {
+           return !!getFullScreenFn();
+         }
+
+         function fullScreen(d3_event) {
+           d3_event.preventDefault();
+
+           if (!isFullScreen()) {
+             // button.classed('active', true);
+             getFullScreenFn().apply(element);
+           } else {
+             // button.classed('active', false);
+             getExitFullScreenFn().apply(document);
+           }
+         }
+
+         return function () {
+           // selection) {
+           if (!isSupported()) return; // button = selection.append('button')
+           //     .attr('title', t('full_screen'))
+           //     .on('click', fullScreen)
+           //     .call(tooltip);
+           // button.append('span')
+           //     .attr('class', 'icon full-screen');
+
+           var detected = utilDetect();
+           var keys = detected.os === 'mac' ? [uiCmd('⌃⌘F'), 'f11'] : ['f11'];
+           context.keybinding().on(keys, fullScreen);
+         };
+       }
+
+       function uiGeolocate(context) {
+         var _geolocationOptions = {
+           // prioritize speed and power usage over precision
+           enableHighAccuracy: false,
+           // don't hang indefinitely getting the location
+           timeout: 6000 // 6sec
+
+         };
+
+         var _locating = uiLoading(context).message(_t.html('geolocate.locating')).blocking(true);
+
+         var _layer = context.layers().layer('geolocate');
+
+         var _position;
+
+         var _extent;
+
+         var _timeoutID;
+
+         var _button = select(null);
+
+         function click() {
+           if (context.inIntro()) return;
+
+           if (!_layer.enabled() && !_locating.isShown()) {
+             // This timeout ensures that we still call finish() even if
+             // the user declines to share their location in Firefox
+             _timeoutID = setTimeout(error, 10000
+             /* 10sec */
+             );
+             context.container().call(_locating); // get the latest position even if we already have one
+
+             navigator.geolocation.getCurrentPosition(success, error, _geolocationOptions);
+           } else {
+             _locating.close();
+
+             _layer.enabled(null, false);
+
+             updateButtonState();
+           }
+         }
+
+         function zoomTo() {
+           context.enter(modeBrowse(context));
+           var map = context.map();
+
+           _layer.enabled(_position, true);
+
+           updateButtonState();
+           map.centerZoomEase(_extent.center(), Math.min(20, map.extentZoom(_extent)));
+         }
+
+         function success(geolocation) {
+           _position = geolocation;
+           var coords = _position.coords;
+           _extent = geoExtent([coords.longitude, coords.latitude]).padByMeters(coords.accuracy);
+           zoomTo();
+           finish();
+         }
+
+         function error() {
+           if (_position) {
+             // use the position from a previous call if we have one
+             zoomTo();
+           } else {
+             context.ui().flash.label(_t.html('geolocate.location_unavailable')).iconName('#iD-icon-geolocate')();
+           }
+
+           finish();
+         }
+
+         function finish() {
+           _locating.close(); // unblock ui
+
+
+           if (_timeoutID) {
+             clearTimeout(_timeoutID);
+           }
+
+           _timeoutID = undefined;
+         }
+
+         function updateButtonState() {
+           _button.classed('active', _layer.enabled());
+
+           _button.attr('aria-pressed', _layer.enabled());
+         }
+
+         return function (selection) {
+           if (!navigator.geolocation || !navigator.geolocation.getCurrentPosition) return;
+           _button = selection.append('button').on('click', click).attr('aria-pressed', false).call(svgIcon('#iD-icon-geolocate', 'light')).call(uiTooltip().placement(_mainLocalizer.textDirection() === 'rtl' ? 'right' : 'left').title(_t.html('geolocate.title')).keys([_t('geolocate.key')]));
+           context.keybinding().on(_t('geolocate.key'), click);
+         };
+       }
+
+       function uiPanelBackground(context) {
+         var background = context.background();
+         var _currSourceName = null;
+         var _metadata = {};
+         var _metadataKeys = ['zoom', 'vintage', 'source', 'description', 'resolution', 'accuracy'];
+
+         var debouncedRedraw = debounce(redraw, 250);
+
+         function redraw(selection) {
+           var source = background.baseLayerSource();
+           if (!source) return;
+           var isDG = source.id.match(/^DigitalGlobe/i) !== null;
+           var sourceLabel = source.label();
+
+           if (_currSourceName !== sourceLabel) {
+             _currSourceName = sourceLabel;
+             _metadata = {};
+           }
+
+           selection.html('');
+           var list = selection.append('ul').attr('class', 'background-info');
+           list.append('li').html(_currSourceName);
+
+           _metadataKeys.forEach(function (k) {
+             // DigitalGlobe vintage is available in raster layers for now.
+             if (isDG && k === 'vintage') return;
+             list.append('li').attr('class', 'background-info-list-' + k).classed('hide', !_metadata[k]).call(_t.append('info_panels.background.' + k, {
+               suffix: ':'
+             })).append('span').attr('class', 'background-info-span-' + k).text(_metadata[k]);
+           });
+
+           debouncedGetMetadata(selection);
+           var toggleTiles = context.getDebug('tile') ? 'hide_tiles' : 'show_tiles';
+           selection.append('a').call(_t.append('info_panels.background.' + toggleTiles)).attr('href', '#').attr('class', 'button button-toggle-tiles').on('click', function (d3_event) {
+             d3_event.preventDefault();
+             context.setDebug('tile', !context.getDebug('tile'));
+             selection.call(redraw);
+           });
+
+           if (isDG) {
+             var key = source.id + '-vintage';
+             var sourceVintage = context.background().findSource(key);
+             var showsVintage = context.background().showsLayer(sourceVintage);
+             var toggleVintage = showsVintage ? 'hide_vintage' : 'show_vintage';
+             selection.append('a').call(_t.append('info_panels.background.' + toggleVintage)).attr('href', '#').attr('class', 'button button-toggle-vintage').on('click', function (d3_event) {
+               d3_event.preventDefault();
+               context.background().toggleOverlayLayer(sourceVintage);
+               selection.call(redraw);
+             });
+           } // disable if necessary
+
+
+           ['DigitalGlobe-Premium', 'DigitalGlobe-Standard'].forEach(function (layerId) {
+             if (source.id !== layerId) {
+               var key = layerId + '-vintage';
+               var sourceVintage = context.background().findSource(key);
+
+               if (context.background().showsLayer(sourceVintage)) {
+                 context.background().toggleOverlayLayer(sourceVintage);
+               }
+             }
+           });
+         }
+
+         var debouncedGetMetadata = debounce(getMetadata, 250);
+
+         function getMetadata(selection) {
+           var tile = context.container().select('.layer-background img.tile-center'); // tile near viewport center
+
+           if (tile.empty()) return;
+           var sourceName = _currSourceName;
+           var d = tile.datum();
+           var zoom = d && d.length >= 3 && d[2] || Math.floor(context.map().zoom());
+           var center = context.map().center(); // update zoom
+
+           _metadata.zoom = String(zoom);
+           selection.selectAll('.background-info-list-zoom').classed('hide', false).selectAll('.background-info-span-zoom').text(_metadata.zoom);
+           if (!d || !d.length >= 3) return;
+           background.baseLayerSource().getMetadata(center, d, function (err, result) {
+             if (err || _currSourceName !== sourceName) return; // update vintage
+
+             var vintage = result.vintage;
+             _metadata.vintage = vintage && vintage.range || _t('info_panels.background.unknown');
+             selection.selectAll('.background-info-list-vintage').classed('hide', false).selectAll('.background-info-span-vintage').text(_metadata.vintage); // update other _metadata
+
+             _metadataKeys.forEach(function (k) {
+               if (k === 'zoom' || k === 'vintage') return; // done already
+
+               var val = result[k];
+               _metadata[k] = val;
+               selection.selectAll('.background-info-list-' + k).classed('hide', !val).selectAll('.background-info-span-' + k).text(val);
+             });
+           });
+         }
+
+         var panel = function panel(selection) {
+           selection.call(redraw);
+           context.map().on('drawn.info-background', function () {
+             selection.call(debouncedRedraw);
+           }).on('move.info-background', function () {
+             selection.call(debouncedGetMetadata);
+           });
+         };
+
+         panel.off = function () {
+           context.map().on('drawn.info-background', null).on('move.info-background', null);
+         };
+
+         panel.id = 'background';
+         panel.label = _t.html('info_panels.background.title');
+         panel.key = _t('info_panels.background.key');
+         return panel;
+       }
+
+       function uiPanelHistory(context) {
+         var osm;
+
+         function displayTimestamp(timestamp) {
+           if (!timestamp) return _t('info_panels.history.unknown');
+           var options = {
+             day: 'numeric',
+             month: 'short',
+             year: 'numeric',
+             hour: 'numeric',
+             minute: 'numeric',
+             second: 'numeric'
+           };
+           var d = new Date(timestamp);
+           if (isNaN(d.getTime())) return _t('info_panels.history.unknown');
+           return d.toLocaleString(_mainLocalizer.localeCode(), options);
+         }
+
+         function displayUser(selection, userName) {
+           if (!userName) {
+             selection.append('span').call(_t.append('info_panels.history.unknown'));
+             return;
+           }
+
+           selection.append('span').attr('class', 'user-name').text(userName);
+           var links = selection.append('div').attr('class', 'links');
+
+           if (osm) {
+             links.append('a').attr('class', 'user-osm-link').attr('href', osm.userURL(userName)).attr('target', '_blank').call(_t.append('info_panels.history.profile_link'));
+           }
+
+           links.append('a').attr('class', 'user-hdyc-link').attr('href', 'https://hdyc.neis-one.org/?' + userName).attr('target', '_blank').attr('tabindex', -1).text('HDYC');
+         }
+
+         function displayChangeset(selection, changeset) {
+           if (!changeset) {
+             selection.append('span').call(_t.append('info_panels.history.unknown'));
+             return;
+           }
+
+           selection.append('span').attr('class', 'changeset-id').text(changeset);
+           var links = selection.append('div').attr('class', 'links');
+
+           if (osm) {
+             links.append('a').attr('class', 'changeset-osm-link').attr('href', osm.changesetURL(changeset)).attr('target', '_blank').call(_t.append('info_panels.history.changeset_link'));
+           }
+
+           links.append('a').attr('class', 'changeset-osmcha-link').attr('href', 'https://osmcha.org/changesets/' + changeset).attr('target', '_blank').text('OSMCha');
+           links.append('a').attr('class', 'changeset-achavi-link').attr('href', 'https://overpass-api.de/achavi/?changeset=' + changeset).attr('target', '_blank').text('Achavi');
+         }
+
+         function redraw(selection) {
+           var selectedNoteID = context.selectedNoteID();
+           osm = context.connection();
+           var selected, note, entity;
+
+           if (selectedNoteID && osm) {
+             // selected 1 note
+             selected = [_t.html('note.note') + ' ' + selectedNoteID];
+             note = osm.getNote(selectedNoteID);
+           } else {
+             // selected 1..n entities
+             selected = context.selectedIDs().filter(function (e) {
+               return context.hasEntity(e);
+             });
+
+             if (selected.length) {
+               entity = context.entity(selected[0]);
+             }
+           }
+
+           var singular = selected.length === 1 ? selected[0] : null;
+           selection.html('');
+
+           if (singular) {
+             selection.append('h4').attr('class', 'history-heading').html(singular);
+           } else {
+             selection.append('h4').attr('class', 'history-heading').call(_t.append('info_panels.selected', {
+               n: selected.length
+             }));
+           }
+
+           if (!singular) return;
+
+           if (entity) {
+             selection.call(redrawEntity, entity);
+           } else if (note) {
+             selection.call(redrawNote, note);
+           }
+         }
+
+         function redrawNote(selection, note) {
+           if (!note || note.isNew()) {
+             selection.append('div').call(_t.append('info_panels.history.note_no_history'));
+             return;
+           }
+
+           var list = selection.append('ul');
+           list.append('li').call(_t.append('info_panels.history.note_comments', {
+             suffix: ':'
+           })).append('span').text(note.comments.length);
+
+           if (note.comments.length) {
+             list.append('li').call(_t.append('info_panels.history.note_created_date', {
+               suffix: ':'
+             })).append('span').text(displayTimestamp(note.comments[0].date));
+             list.append('li').call(_t.append('info_panels.history.note_created_user', {
+               suffix: ':'
+             })).call(displayUser, note.comments[0].user);
+           }
+
+           if (osm) {
+             selection.append('a').attr('class', 'view-history-on-osm').attr('target', '_blank').attr('href', osm.noteURL(note)).call(svgIcon('#iD-icon-out-link', 'inline')).append('span').call(_t.append('info_panels.history.note_link_text'));
+           }
+         }
+
+         function redrawEntity(selection, entity) {
+           if (!entity || entity.isNew()) {
+             selection.append('div').call(_t.append('info_panels.history.no_history'));
+             return;
+           }
+
+           var links = selection.append('div').attr('class', 'links');
+
+           if (osm) {
+             links.append('a').attr('class', 'view-history-on-osm').attr('href', osm.historyURL(entity)).attr('target', '_blank').call(_t.append('info_panels.history.history_link'));
+           }
+
+           links.append('a').attr('class', 'pewu-history-viewer-link').attr('href', 'https://pewu.github.io/osm-history/#/' + entity.type + '/' + entity.osmId()).attr('target', '_blank').attr('tabindex', -1).text('PeWu');
+           var list = selection.append('ul');
+           list.append('li').call(_t.append('info_panels.history.version', {
+             suffix: ':'
+           })).append('span').text(entity.version);
+           list.append('li').call(_t.append('info_panels.history.last_edit', {
+             suffix: ':'
+           })).append('span').text(displayTimestamp(entity.timestamp));
+           list.append('li').call(_t.append('info_panels.history.edited_by', {
+             suffix: ':'
+           })).call(displayUser, entity.user);
+           list.append('li').call(_t.append('info_panels.history.changeset', {
+             suffix: ':'
+           })).call(displayChangeset, entity.changeset);
+         }
+
+         var panel = function panel(selection) {
+           selection.call(redraw);
+           context.map().on('drawn.info-history', function () {
+             selection.call(redraw);
+           });
+           context.on('enter.info-history', function () {
+             selection.call(redraw);
+           });
+         };
+
+         panel.off = function () {
+           context.map().on('drawn.info-history', null);
+           context.on('enter.info-history', null);
+         };
+
+         panel.id = 'history';
+         panel.label = _t.html('info_panels.history.title');
+         panel.key = _t('info_panels.history.key');
+         return panel;
+       }
+
+       var OSM_PRECISION = 7;
+       /**
+        * Returns a localized representation of the given length measurement.
+        *
+        * @param {Number} m area in meters
+        * @param {Boolean} isImperial true for U.S. customary units; false for metric
+        */
+
+       function displayLength(m, isImperial) {
+         var d = m * (isImperial ? 3.28084 : 1);
+         var unit;
+
+         if (isImperial) {
+           if (d >= 5280) {
+             d /= 5280;
+             unit = 'miles';
+           } else {
+             unit = 'feet';
+           }
+         } else {
+           if (d >= 1000) {
+             d /= 1000;
+             unit = 'kilometers';
+           } else {
+             unit = 'meters';
+           }
+         }
+
+         return _t('units.' + unit, {
+           quantity: d.toLocaleString(_mainLocalizer.localeCode(), {
+             maximumSignificantDigits: 4
+           })
+         });
+       }
+       /**
+        * Returns a localized representation of the given area measurement.
+        *
+        * @param {Number} m2 area in square meters
+        * @param {Boolean} isImperial true for U.S. customary units; false for metric
+        */
+
+       function displayArea(m2, isImperial) {
+         var locale = _mainLocalizer.localeCode();
+         var d = m2 * (isImperial ? 10.7639111056 : 1);
+         var d1, d2, area;
+         var unit1 = '';
+         var unit2 = '';
+
+         if (isImperial) {
+           if (d >= 6969600) {
+             // > 0.25mi² show mi²
+             d1 = d / 27878400;
+             unit1 = 'square_miles';
+           } else {
+             d1 = d;
+             unit1 = 'square_feet';
+           }
+
+           if (d > 4356 && d < 43560000) {
+             // 0.1 - 1000 acres
+             d2 = d / 43560;
+             unit2 = 'acres';
+           }
+         } else {
+           if (d >= 250000) {
+             // > 0.25km² show km²
+             d1 = d / 1000000;
+             unit1 = 'square_kilometers';
+           } else {
+             d1 = d;
+             unit1 = 'square_meters';
+           }
+
+           if (d > 1000 && d < 10000000) {
+             // 0.1 - 1000 hectares
+             d2 = d / 10000;
+             unit2 = 'hectares';
+           }
+         }
+
+         area = _t('units.' + unit1, {
+           quantity: d1.toLocaleString(locale, {
+             maximumSignificantDigits: 4
+           })
+         });
+
+         if (d2) {
+           return _t('units.area_pair', {
+             area1: area,
+             area2: _t('units.' + unit2, {
+               quantity: d2.toLocaleString(locale, {
+                 maximumSignificantDigits: 2
+               })
+             })
+           });
+         } else {
+           return area;
+         }
+       }
+
+       function wrap(x, min, max) {
+         var d = max - min;
+         return ((x - min) % d + d) % d + min;
+       }
+
+       function clamp(x, min, max) {
+         return Math.max(min, Math.min(x, max));
+       }
+
+       function displayCoordinate(deg, pos, neg) {
+         var locale = _mainLocalizer.localeCode();
+         var min = (Math.abs(deg) - Math.floor(Math.abs(deg))) * 60;
+         var sec = (min - Math.floor(min)) * 60;
+         var displayDegrees = _t('units.arcdegrees', {
+           quantity: Math.floor(Math.abs(deg)).toLocaleString(locale)
+         });
+         var displayCoordinate;
+
+         if (Math.floor(sec) > 0) {
+           displayCoordinate = displayDegrees + _t('units.arcminutes', {
+             quantity: Math.floor(min).toLocaleString(locale)
+           }) + _t('units.arcseconds', {
+             quantity: Math.round(sec).toLocaleString(locale)
+           });
+         } else if (Math.floor(min) > 0) {
+           displayCoordinate = displayDegrees + _t('units.arcminutes', {
+             quantity: Math.round(min).toLocaleString(locale)
+           });
+         } else {
+           displayCoordinate = _t('units.arcdegrees', {
+             quantity: Math.round(Math.abs(deg)).toLocaleString(locale)
+           });
+         }
+
+         if (deg === 0) {
+           return displayCoordinate;
+         } else {
+           return _t('units.coordinate', {
+             coordinate: displayCoordinate,
+             direction: _t('units.' + (deg > 0 ? pos : neg))
+           });
+         }
+       }
+       /**
+        * Returns given coordinate pair in degree-minute-second format.
+        *
+        * @param {Array<Number>} coord longitude and latitude
+        */
+
+
+       function dmsCoordinatePair(coord) {
+         return _t('units.coordinate_pair', {
+           latitude: displayCoordinate(clamp(coord[1], -90, 90), 'north', 'south'),
+           longitude: displayCoordinate(wrap(coord[0], -180, 180), 'east', 'west')
+         });
+       }
+       /**
+        * Returns the given coordinate pair in decimal format.
+        * note: unlocalized to avoid comma ambiguity - see #4765
+        *
+        * @param {Array<Number>} coord longitude and latitude
+        */
+
+       function decimalCoordinatePair(coord) {
+         return _t('units.coordinate_pair', {
+           latitude: clamp(coord[1], -90, 90).toFixed(OSM_PRECISION),
+           longitude: wrap(coord[0], -180, 180).toFixed(OSM_PRECISION)
+         });
+       }
+
+       function uiPanelLocation(context) {
+         var currLocation = '';
+
+         function redraw(selection) {
+           selection.html('');
+           var list = selection.append('ul'); // Mouse coordinates
+
+           var coord = context.map().mouseCoordinates();
+
+           if (coord.some(isNaN)) {
+             coord = context.map().center();
+           }
+
+           list.append('li').text(dmsCoordinatePair(coord)).append('li').text(decimalCoordinatePair(coord)); // Location Info
+
+           selection.append('div').attr('class', 'location-info').text(currLocation || ' ');
+           debouncedGetLocation(selection, coord);
+         }
+
+         var debouncedGetLocation = debounce(getLocation, 250);
+
+         function getLocation(selection, coord) {
+           if (!services.geocoder) {
+             currLocation = _t('info_panels.location.unknown_location');
+             selection.selectAll('.location-info').text(currLocation);
+           } else {
+             services.geocoder.reverse(coord, function (err, result) {
+               currLocation = result ? result.display_name : _t('info_panels.location.unknown_location');
+               selection.selectAll('.location-info').text(currLocation);
+             });
+           }
+         }
+
+         var panel = function panel(selection) {
+           selection.call(redraw);
+           context.surface().on(('PointerEvent' in window ? 'pointer' : 'mouse') + 'move.info-location', function () {
+             selection.call(redraw);
+           });
+         };
+
+         panel.off = function () {
+           context.surface().on('.info-location', null);
+         };
+
+         panel.id = 'location';
+         panel.label = _t.html('info_panels.location.title');
+         panel.key = _t('info_panels.location.key');
+         return panel;
+       }
+
+       function uiPanelMeasurement(context) {
+         function radiansToMeters(r) {
+           // using WGS84 authalic radius (6371007.1809 m)
+           return r * 6371007.1809;
+         }
+
+         function steradiansToSqmeters(r) {
+           // http://gis.stackexchange.com/a/124857/40446
+           return r / (4 * Math.PI) * 510065621724000;
+         }
+
+         function toLineString(feature) {
+           if (feature.type === 'LineString') return feature;
+           var result = {
+             type: 'LineString',
+             coordinates: []
+           };
+
+           if (feature.type === 'Polygon') {
+             result.coordinates = feature.coordinates[0];
+           } else if (feature.type === 'MultiPolygon') {
+             result.coordinates = feature.coordinates[0][0];
+           }
+
+           return result;
+         }
+
+         var _isImperial = !_mainLocalizer.usesMetric();
+
+         function redraw(selection) {
+           var graph = context.graph();
+           var selectedNoteID = context.selectedNoteID();
+           var osm = services.osm;
+           var localeCode = _mainLocalizer.localeCode();
+           var heading;
+           var center, location, centroid;
+           var closed, geometry;
+           var totalNodeCount,
+               length = 0,
+               area = 0,
+               distance;
+
+           if (selectedNoteID && osm) {
+             // selected 1 note
+             var note = osm.getNote(selectedNoteID);
+             heading = _t.html('note.note') + ' ' + selectedNoteID;
+             location = note.loc;
+             geometry = 'note';
+           } else {
+             // selected 1..n entities
+             var selectedIDs = context.selectedIDs().filter(function (id) {
+               return context.hasEntity(id);
+             });
+             var selected = selectedIDs.map(function (id) {
+               return context.entity(id);
+             });
+             heading = selected.length === 1 ? selected[0].id : _t.html('info_panels.selected', {
+               n: selected.length
+             });
+
+             if (selected.length) {
+               var extent = geoExtent();
+
+               for (var i in selected) {
+                 var entity = selected[i];
+
+                 extent._extend(entity.extent(graph));
+
+                 geometry = entity.geometry(graph);
+
+                 if (geometry === 'line' || geometry === 'area') {
+                   closed = entity.type === 'relation' || entity.isClosed() && !entity.isDegenerate();
+                   var feature = entity.asGeoJSON(graph);
+                   length += radiansToMeters(d3_geoLength(toLineString(feature)));
+                   centroid = d3_geoPath(context.projection).centroid(entity.asGeoJSON(graph));
+                   centroid = centroid && context.projection.invert(centroid);
+
+                   if (!centroid || !isFinite(centroid[0]) || !isFinite(centroid[1])) {
+                     centroid = entity.extent(graph).center();
+                   }
+
+                   if (closed) {
+                     area += steradiansToSqmeters(entity.area(graph));
+                   }
+                 }
+               }
+
+               if (selected.length > 1) {
+                 geometry = null;
+                 closed = null;
+                 centroid = null;
+               }
+
+               if (selected.length === 2 && selected[0].type === 'node' && selected[1].type === 'node') {
+                 distance = geoSphericalDistance(selected[0].loc, selected[1].loc);
+               }
+
+               if (selected.length === 1 && selected[0].type === 'node') {
+                 location = selected[0].loc;
+               } else {
+                 totalNodeCount = utilGetAllNodes(selectedIDs, context.graph()).length;
+               }
+
+               if (!location && !centroid) {
+                 center = extent.center();
+               }
+             }
+           }
+
+           selection.html('');
+
+           if (heading) {
+             selection.append('h4').attr('class', 'measurement-heading').html(heading);
+           }
+
+           var list = selection.append('ul');
+           var coordItem;
+
+           if (geometry) {
+             list.append('li').call(_t.append('info_panels.measurement.geometry', {
+               suffix: ':'
+             })).append('span').html(closed ? _t.html('info_panels.measurement.closed_' + geometry) : _t.html('geometry.' + geometry));
+           }
+
+           if (totalNodeCount) {
+             list.append('li').call(_t.append('info_panels.measurement.node_count', {
+               suffix: ':'
+             })).append('span').text(totalNodeCount.toLocaleString(localeCode));
+           }
+
+           if (area) {
+             list.append('li').call(_t.append('info_panels.measurement.area', {
+               suffix: ':'
+             })).append('span').text(displayArea(area, _isImperial));
+           }
+
+           if (length) {
+             list.append('li').call(_t.append('info_panels.measurement.' + (closed ? 'perimeter' : 'length'), {
+               suffix: ':'
+             })).append('span').text(displayLength(length, _isImperial));
+           }
+
+           if (typeof distance === 'number') {
+             list.append('li').call(_t.append('info_panels.measurement.distance', {
+               suffix: ':'
+             })).append('span').text(displayLength(distance, _isImperial));
+           }
+
+           if (location) {
+             coordItem = list.append('li').call(_t.append('info_panels.measurement.location', {
+               suffix: ':'
+             }));
+             coordItem.append('span').text(dmsCoordinatePair(location));
+             coordItem.append('span').text(decimalCoordinatePair(location));
+           }
+
+           if (centroid) {
+             coordItem = list.append('li').call(_t.append('info_panels.measurement.centroid', {
+               suffix: ':'
+             }));
+             coordItem.append('span').text(dmsCoordinatePair(centroid));
+             coordItem.append('span').text(decimalCoordinatePair(centroid));
+           }
+
+           if (center) {
+             coordItem = list.append('li').call(_t.append('info_panels.measurement.center', {
+               suffix: ':'
+             }));
+             coordItem.append('span').text(dmsCoordinatePair(center));
+             coordItem.append('span').text(decimalCoordinatePair(center));
+           }
+
+           if (length || area || typeof distance === 'number') {
+             var toggle = _isImperial ? 'imperial' : 'metric';
+             selection.append('a').call(_t.append('info_panels.measurement.' + toggle)).attr('href', '#').attr('class', 'button button-toggle-units').on('click', function (d3_event) {
+               d3_event.preventDefault();
+               _isImperial = !_isImperial;
+               selection.call(redraw);
+             });
+           }
+         }
+
+         var panel = function panel(selection) {
+           selection.call(redraw);
+           context.map().on('drawn.info-measurement', function () {
+             selection.call(redraw);
+           });
+           context.on('enter.info-measurement', function () {
+             selection.call(redraw);
+           });
+         };
+
+         panel.off = function () {
+           context.map().on('drawn.info-measurement', null);
+           context.on('enter.info-measurement', null);
+         };
+
+         panel.id = 'measurement';
+         panel.label = _t.html('info_panels.measurement.title');
+         panel.key = _t('info_panels.measurement.key');
+         return panel;
+       }
+
+       var uiInfoPanels = {
+         background: uiPanelBackground,
+         history: uiPanelHistory,
+         location: uiPanelLocation,
+         measurement: uiPanelMeasurement
+       };
+
+       function uiInfo(context) {
+         var ids = Object.keys(uiInfoPanels);
+         var wasActive = ['measurement'];
+         var panels = {};
+         var active = {}; // create panels
+
+         ids.forEach(function (k) {
+           if (!panels[k]) {
+             panels[k] = uiInfoPanels[k](context);
+             active[k] = false;
+           }
+         });
+
+         function info(selection) {
+           function redraw() {
+             var activeids = ids.filter(function (k) {
+               return active[k];
+             }).sort();
+             var containers = infoPanels.selectAll('.panel-container').data(activeids, function (k) {
+               return k;
+             });
+             containers.exit().style('opacity', 1).transition().duration(200).style('opacity', 0).on('end', function (d) {
+               select(this).call(panels[d].off).remove();
+             });
+             var enter = containers.enter().append('div').attr('class', function (d) {
+               return 'fillD2 panel-container panel-container-' + d;
+             });
+             enter.style('opacity', 0).transition().duration(200).style('opacity', 1);
+             var title = enter.append('div').attr('class', 'panel-title fillD2');
+             title.append('h3').html(function (d) {
+               return panels[d].label;
+             });
+             title.append('button').attr('class', 'close').attr('title', _t('icons.close')).on('click', function (d3_event, d) {
+               d3_event.stopImmediatePropagation();
+               d3_event.preventDefault();
+               info.toggle(d);
+             }).call(svgIcon('#iD-icon-close'));
+             enter.append('div').attr('class', function (d) {
+               return 'panel-content panel-content-' + d;
+             }); // redraw the panels
+
+             infoPanels.selectAll('.panel-content').each(function (d) {
+               select(this).call(panels[d]);
+             });
+           }
+
+           info.toggle = function (which) {
+             var activeids = ids.filter(function (k) {
+               return active[k];
+             });
+
+             if (which) {
+               // toggle one
+               active[which] = !active[which];
+
+               if (activeids.length === 1 && activeids[0] === which) {
+                 // none active anymore
+                 wasActive = [which];
+               }
+
+               context.container().select('.' + which + '-panel-toggle-item').classed('active', active[which]).select('input').property('checked', active[which]);
+             } else {
+               // toggle all
+               if (activeids.length) {
+                 wasActive = activeids;
+                 activeids.forEach(function (k) {
+                   active[k] = false;
+                 });
+               } else {
+                 wasActive.forEach(function (k) {
+                   active[k] = true;
+                 });
+               }
+             }
+
+             redraw();
+           };
+
+           var infoPanels = selection.selectAll('.info-panels').data([0]);
+           infoPanels = infoPanels.enter().append('div').attr('class', 'info-panels').merge(infoPanels);
+           redraw();
+           context.keybinding().on(uiCmd('⌘' + _t('info_panels.key')), function (d3_event) {
+             d3_event.stopImmediatePropagation();
+             d3_event.preventDefault();
+             info.toggle();
+           });
+           ids.forEach(function (k) {
+             var key = _t('info_panels.' + k + '.key', {
+               "default": null
+             });
+             if (!key) return;
+             context.keybinding().on(uiCmd('⌘⇧' + key), function (d3_event) {
+               d3_event.stopImmediatePropagation();
+               d3_event.preventDefault();
+               info.toggle(k);
+             });
+           });
+         }
+
+         return info;
+       }
+
+       function pointBox(loc, context) {
+         var rect = context.surfaceRect();
+         var point = context.curtainProjection(loc);
+         return {
+           left: point[0] + rect.left - 40,
+           top: point[1] + rect.top - 60,
+           width: 80,
+           height: 90
+         };
+       }
+       function pad(locOrBox, padding, context) {
+         var box;
+
+         if (locOrBox instanceof Array) {
+           var rect = context.surfaceRect();
+           var point = context.curtainProjection(locOrBox);
+           box = {
+             left: point[0] + rect.left,
+             top: point[1] + rect.top
+           };
+         } else {
+           box = locOrBox;
+         }
+
+         return {
+           left: box.left - padding,
+           top: box.top - padding,
+           width: (box.width || 0) + 2 * padding,
+           height: (box.width || 0) + 2 * padding
+         };
+       }
+       function icon(name, svgklass, useklass) {
+         return '<svg class="icon ' + (svgklass || '') + '">' + '<use xlink:href="' + name + '"' + (useklass ? ' class="' + useklass + '"' : '') + '></use></svg>';
+       }
+       var helpStringReplacements; // Returns the localized HTML element for `id` with a standardized set of icon, key, and
+       // label replacements suitable for tutorials and documentation. Optionally supplemented
+       // with custom `replacements`
+
+       function helpHtml(id, replacements) {
+         // only load these the first time
+         if (!helpStringReplacements) {
+           helpStringReplacements = {
+             // insert icons corresponding to various UI elements
+             point_icon: icon('#iD-icon-point', 'inline'),
+             line_icon: icon('#iD-icon-line', 'inline'),
+             area_icon: icon('#iD-icon-area', 'inline'),
+             note_icon: icon('#iD-icon-note', 'inline add-note'),
+             plus: icon('#iD-icon-plus', 'inline'),
+             minus: icon('#iD-icon-minus', 'inline'),
+             layers_icon: icon('#iD-icon-layers', 'inline'),
+             data_icon: icon('#iD-icon-data', 'inline'),
+             inspect: icon('#iD-icon-inspect', 'inline'),
+             help_icon: icon('#iD-icon-help', 'inline'),
+             undo_icon: icon(_mainLocalizer.textDirection() === 'rtl' ? '#iD-icon-redo' : '#iD-icon-undo', 'inline'),
+             redo_icon: icon(_mainLocalizer.textDirection() === 'rtl' ? '#iD-icon-undo' : '#iD-icon-redo', 'inline'),
+             save_icon: icon('#iD-icon-save', 'inline'),
+             // operation icons
+             circularize_icon: icon('#iD-operation-circularize', 'inline operation'),
+             continue_icon: icon('#iD-operation-continue', 'inline operation'),
+             copy_icon: icon('#iD-operation-copy', 'inline operation'),
+             delete_icon: icon('#iD-operation-delete', 'inline operation'),
+             disconnect_icon: icon('#iD-operation-disconnect', 'inline operation'),
+             downgrade_icon: icon('#iD-operation-downgrade', 'inline operation'),
+             extract_icon: icon('#iD-operation-extract', 'inline operation'),
+             merge_icon: icon('#iD-operation-merge', 'inline operation'),
+             move_icon: icon('#iD-operation-move', 'inline operation'),
+             orthogonalize_icon: icon('#iD-operation-orthogonalize', 'inline operation'),
+             paste_icon: icon('#iD-operation-paste', 'inline operation'),
+             reflect_long_icon: icon('#iD-operation-reflect-long', 'inline operation'),
+             reflect_short_icon: icon('#iD-operation-reflect-short', 'inline operation'),
+             reverse_icon: icon('#iD-operation-reverse', 'inline operation'),
+             rotate_icon: icon('#iD-operation-rotate', 'inline operation'),
+             split_icon: icon('#iD-operation-split', 'inline operation'),
+             straighten_icon: icon('#iD-operation-straighten', 'inline operation'),
+             // interaction icons
+             leftclick: icon('#iD-walkthrough-mouse-left', 'inline operation'),
+             rightclick: icon('#iD-walkthrough-mouse-right', 'inline operation'),
+             mousewheel_icon: icon('#iD-walkthrough-mousewheel', 'inline operation'),
+             tap_icon: icon('#iD-walkthrough-tap', 'inline operation'),
+             doubletap_icon: icon('#iD-walkthrough-doubletap', 'inline operation'),
+             longpress_icon: icon('#iD-walkthrough-longpress', 'inline operation'),
+             touchdrag_icon: icon('#iD-walkthrough-touchdrag', 'inline operation'),
+             pinch_icon: icon('#iD-walkthrough-pinch-apart', 'inline operation'),
+             // insert keys; may be localized and platform-dependent
+             shift: uiCmd.display('⇧'),
+             alt: uiCmd.display('⌥'),
+             "return": uiCmd.display('↵'),
+             esc: _t.html('shortcuts.key.esc'),
+             space: _t.html('shortcuts.key.space'),
+             add_note_key: _t.html('modes.add_note.key'),
+             help_key: _t.html('help.key'),
+             shortcuts_key: _t.html('shortcuts.toggle.key'),
+             // reference localized UI labels directly so that they'll always match
+             save: _t.html('save.title'),
+             undo: _t.html('undo.title'),
+             redo: _t.html('redo.title'),
+             upload: _t.html('commit.save'),
+             point: _t.html('modes.add_point.title'),
+             line: _t.html('modes.add_line.title'),
+             area: _t.html('modes.add_area.title'),
+             note: _t.html('modes.add_note.label'),
+             circularize: _t.html('operations.circularize.title'),
+             "continue": _t.html('operations.continue.title'),
+             copy: _t.html('operations.copy.title'),
+             "delete": _t.html('operations.delete.title'),
+             disconnect: _t.html('operations.disconnect.title'),
+             downgrade: _t.html('operations.downgrade.title'),
+             extract: _t.html('operations.extract.title'),
+             merge: _t.html('operations.merge.title'),
+             move: _t.html('operations.move.title'),
+             orthogonalize: _t.html('operations.orthogonalize.title'),
+             paste: _t.html('operations.paste.title'),
+             reflect_long: _t.html('operations.reflect.title.long'),
+             reflect_short: _t.html('operations.reflect.title.short'),
+             reverse: _t.html('operations.reverse.title'),
+             rotate: _t.html('operations.rotate.title'),
+             split: _t.html('operations.split.title'),
+             straighten: _t.html('operations.straighten.title'),
+             map_data: _t.html('map_data.title'),
+             osm_notes: _t.html('map_data.layers.notes.title'),
+             fields: _t.html('inspector.fields'),
+             tags: _t.html('inspector.tags'),
+             relations: _t.html('inspector.relations'),
+             new_relation: _t.html('inspector.new_relation'),
+             turn_restrictions: _t.html('_tagging.presets.fields.restrictions.label'),
+             background_settings: _t.html('background.description'),
+             imagery_offset: _t.html('background.fix_misalignment'),
+             start_the_walkthrough: _t.html('splash.walkthrough'),
+             help: _t.html('help.title'),
+             ok: _t.html('intro.ok')
+           };
+
+           for (var key in helpStringReplacements) {
+             helpStringReplacements[key] = {
+               html: helpStringReplacements[key]
+             };
+           }
+         }
+
+         var reps;
+
+         if (replacements) {
+           reps = Object.assign(replacements, helpStringReplacements);
+         } else {
+           reps = helpStringReplacements;
+         }
+
+         return _t.html(id, reps) // use keyboard key styling for shortcuts
+         .replace(/\`(.*?)\`/g, '<kbd>$1</kbd>');
+       }
+
+       function slugify(text) {
+         return text.toString().toLowerCase().replace(/\s+/g, '-') // Replace spaces with -
+         .replace(/[^\w\-]+/g, '') // Remove all non-word chars
+         .replace(/\-\-+/g, '-') // Replace multiple - with single -
+         .replace(/^-+/, '') // Trim - from start of text
+         .replace(/-+$/, ''); // Trim - from end of text
+       } // console warning for missing walkthrough names
+
+
+       var missingStrings = {};
+
+       function checkKey(key, text) {
+         if (_t(key, {
+           "default": undefined
+         }) === undefined) {
+           if (missingStrings.hasOwnProperty(key)) return; // warn once
+
+           missingStrings[key] = text;
+           var missing = key + ': ' + text;
+           if (typeof console !== 'undefined') console.log(missing); // eslint-disable-line
+         }
+       }
+
+       function localize(obj) {
+         var key; // Assign name if entity has one..
+
+         var name = obj.tags && obj.tags.name;
+
+         if (name) {
+           key = 'intro.graph.name.' + slugify(name);
+           obj.tags.name = _t(key, {
+             "default": name
+           });
+           checkKey(key, name);
+         } // Assign street name if entity has one..
+
+
+         var street = obj.tags && obj.tags['addr:street'];
+
+         if (street) {
+           key = 'intro.graph.name.' + slugify(street);
+           obj.tags['addr:street'] = _t(key, {
+             "default": street
+           });
+           checkKey(key, street); // Add address details common across walkthrough..
+
+           var addrTags = ['block_number', 'city', 'county', 'district', 'hamlet', 'neighbourhood', 'postcode', 'province', 'quarter', 'state', 'subdistrict', 'suburb'];
+           addrTags.forEach(function (k) {
+             var key = 'intro.graph.' + k;
+             var tag = 'addr:' + k;
+             var val = obj.tags && obj.tags[tag];
+             var str = _t(key, {
+               "default": val
+             });
+
+             if (str) {
+               if (str.match(/^<.*>$/) !== null) {
+                 delete obj.tags[tag];
+               } else {
+                 obj.tags[tag] = str;
+               }
+             }
+           });
+         }
+
+         return obj;
+       } // Used to detect squareness.. some duplicataion of code from actionOrthogonalize.
+
+       function isMostlySquare(points) {
+         // note: uses 15 here instead of the 12 from actionOrthogonalize because
+         // actionOrthogonalize can actually straighten some larger angles as it iterates
+         var threshold = 15; // degrees within right or straight
+
+         var lowerBound = Math.cos((90 - threshold) * Math.PI / 180); // near right
+
+         var upperBound = Math.cos(threshold * Math.PI / 180); // near straight
+
+         for (var i = 0; i < points.length; i++) {
+           var a = points[(i - 1 + points.length) % points.length];
+           var origin = points[i];
+           var b = points[(i + 1) % points.length];
+           var dotp = geoVecNormalizedDot(a, b, origin);
+           var mag = Math.abs(dotp);
+
+           if (mag > lowerBound && mag < upperBound) {
+             return false;
+           }
+         }
+
+         return true;
+       }
+       function selectMenuItem(context, operation) {
+         return context.container().select('.edit-menu .edit-menu-item-' + operation);
+       }
+       function transitionTime(point1, point2) {
+         var distance = geoSphericalDistance(point1, point2);
+
+         if (distance === 0) {
+           return 0;
+         } else if (distance < 80) {
+           return 500;
+         } else {
+           return 1000;
+         }
+       }
+
+       // hide class, which sets display=none, and a d3 transition for opacity.
+       // this will cause blinking when called repeatedly, so check that the
+       // value actually changes between calls.
+
+       function uiToggle(show, callback) {
+         return function (selection) {
+           selection.style('opacity', show ? 0 : 1).classed('hide', false).transition().style('opacity', show ? 1 : 0).on('end', function () {
+             select(this).classed('hide', !show).style('opacity', null);
+             if (callback) callback.apply(this);
+           });
+         };
+       }
+
+       function uiCurtain(containerNode) {
+         var surface = select(null),
+             tooltip = select(null),
+             darkness = select(null);
+
+         function curtain(selection) {
+           surface = selection.append('svg').attr('class', 'curtain').style('top', 0).style('left', 0);
+           darkness = surface.append('path').attr('x', 0).attr('y', 0).attr('class', 'curtain-darkness');
+           select(window).on('resize.curtain', resize);
+           tooltip = selection.append('div').attr('class', 'tooltip');
+           tooltip.append('div').attr('class', 'popover-arrow');
+           tooltip.append('div').attr('class', 'popover-inner');
+           resize();
+
+           function resize() {
+             surface.attr('width', containerNode.clientWidth).attr('height', containerNode.clientHeight);
+             curtain.cut(darkness.datum());
+           }
+         }
+         /**
+          * Reveal cuts the curtain to highlight the given box,
+          * and shows a tooltip with instructions next to the box.
+          *
+          * @param  {String|ClientRect} [box]   box used to cut the curtain
+          * @param  {String}    [text]          text for a tooltip
+          * @param  {Object}    [options]
+          * @param  {string}    [options.tooltipClass]    optional class to add to the tooltip
+          * @param  {integer}   [options.duration]        transition time in milliseconds
+          * @param  {string}    [options.buttonText]      if set, create a button with this text label
+          * @param  {function}  [options.buttonCallback]  if set, the callback for the button
+          * @param  {function}  [options.padding]         extra margin in px to put around bbox
+          * @param  {String|ClientRect} [options.tooltipBox]  box for tooltip position, if different from box for the curtain
+          */
+
+
+         curtain.reveal = function (box, html, options) {
+           options = options || {};
+
+           if (typeof box === 'string') {
+             box = select(box).node();
+           }
+
+           if (box && box.getBoundingClientRect) {
+             box = copyBox(box.getBoundingClientRect());
+             var containerRect = containerNode.getBoundingClientRect();
+             box.top -= containerRect.top;
+             box.left -= containerRect.left;
+           }
+
+           if (box && options.padding) {
+             box.top -= options.padding;
+             box.left -= options.padding;
+             box.bottom += options.padding;
+             box.right += options.padding;
+             box.height += options.padding * 2;
+             box.width += options.padding * 2;
+           }
+
+           var tooltipBox;
+
+           if (options.tooltipBox) {
+             tooltipBox = options.tooltipBox;
+
+             if (typeof tooltipBox === 'string') {
+               tooltipBox = select(tooltipBox).node();
+             }
+
+             if (tooltipBox && tooltipBox.getBoundingClientRect) {
+               tooltipBox = copyBox(tooltipBox.getBoundingClientRect());
+             }
+           } else {
+             tooltipBox = box;
+           }
+
+           if (tooltipBox && html) {
+             if (html.indexOf('**') !== -1) {
+               if (html.indexOf('<span') === 0) {
+                 html = html.replace(/^(<span.*?>)(.+?)(\*\*)/, '$1<span>$2</span>$3');
+               } else {
+                 html = html.replace(/^(.+?)(\*\*)/, '<span>$1</span>$2');
+               } // pseudo markdown bold text for the instruction section..
+
+
+               html = html.replace(/\*\*(.*?)\*\*/g, '<span class="instruction">$1</span>');
+             }
+
+             html = html.replace(/\*(.*?)\*/g, '<em>$1</em>'); // emphasis
+
+             html = html.replace(/\{br\}/g, '<br/><br/>'); // linebreak
+
+             if (options.buttonText && options.buttonCallback) {
+               html += '<div class="button-section">' + '<button href="#" class="button action">' + options.buttonText + '</button></div>';
+             }
+
+             var classes = 'curtain-tooltip popover tooltip arrowed in ' + (options.tooltipClass || '');
+             tooltip.classed(classes, true).selectAll('.popover-inner').html(html);
+
+             if (options.buttonText && options.buttonCallback) {
+               var button = tooltip.selectAll('.button-section .button.action');
+               button.on('click', function (d3_event) {
+                 d3_event.preventDefault();
+                 options.buttonCallback();
+               });
+             }
+
+             var tip = copyBox(tooltip.node().getBoundingClientRect()),
+                 w = containerNode.clientWidth,
+                 h = containerNode.clientHeight,
+                 tooltipWidth = 200,
+                 tooltipArrow = 5,
+                 side,
+                 pos; // hack: this will have bottom placement,
+             // so need to reserve extra space for the tooltip illustration.
+
+             if (options.tooltipClass === 'intro-mouse') {
+               tip.height += 80;
+             } // trim box dimensions to just the portion that fits in the container..
+
+
+             if (tooltipBox.top + tooltipBox.height > h) {
+               tooltipBox.height -= tooltipBox.top + tooltipBox.height - h;
+             }
+
+             if (tooltipBox.left + tooltipBox.width > w) {
+               tooltipBox.width -= tooltipBox.left + tooltipBox.width - w;
+             } // determine tooltip placement..
+
+
+             if (tooltipBox.top + tooltipBox.height < 100) {
+               // tooltip below box..
+               side = 'bottom';
+               pos = [tooltipBox.left + tooltipBox.width / 2 - tip.width / 2, tooltipBox.top + tooltipBox.height];
+             } else if (tooltipBox.top > h - 140) {
+               // tooltip above box..
+               side = 'top';
+               pos = [tooltipBox.left + tooltipBox.width / 2 - tip.width / 2, tooltipBox.top - tip.height];
+             } else {
+               // tooltip to the side of the tooltipBox..
+               var tipY = tooltipBox.top + tooltipBox.height / 2 - tip.height / 2;
+
+               if (_mainLocalizer.textDirection() === 'rtl') {
+                 if (tooltipBox.left - tooltipWidth - tooltipArrow < 70) {
+                   side = 'right';
+                   pos = [tooltipBox.left + tooltipBox.width + tooltipArrow, tipY];
+                 } else {
+                   side = 'left';
+                   pos = [tooltipBox.left - tooltipWidth - tooltipArrow, tipY];
+                 }
+               } else {
+                 if (tooltipBox.left + tooltipBox.width + tooltipArrow + tooltipWidth > w - 70) {
+                   side = 'left';
+                   pos = [tooltipBox.left - tooltipWidth - tooltipArrow, tipY];
+                 } else {
+                   side = 'right';
+                   pos = [tooltipBox.left + tooltipBox.width + tooltipArrow, tipY];
+                 }
+               }
+             }
+
+             if (options.duration !== 0 || !tooltip.classed(side)) {
+               tooltip.call(uiToggle(true));
+             }
+
+             tooltip.style('top', pos[1] + 'px').style('left', pos[0] + 'px').attr('class', classes + ' ' + side); // shift popover-inner if it is very close to the top or bottom edge
+             // (doesn't affect the placement of the popover-arrow)
+
+             var shiftY = 0;
+
+             if (side === 'left' || side === 'right') {
+               if (pos[1] < 60) {
+                 shiftY = 60 - pos[1];
+               } else if (pos[1] + tip.height > h - 100) {
+                 shiftY = h - pos[1] - tip.height - 100;
+               }
+             }
+
+             tooltip.selectAll('.popover-inner').style('top', shiftY + 'px');
+           } else {
+             tooltip.classed('in', false).call(uiToggle(false));
+           }
+
+           curtain.cut(box, options.duration);
+           return tooltip;
+         };
+
+         curtain.cut = function (datum, duration) {
+           darkness.datum(datum).interrupt();
+           var selection;
+
+           if (duration === 0) {
+             selection = darkness;
+           } else {
+             selection = darkness.transition().duration(duration || 600).ease(linear$1);
+           }
+
+           selection.attr('d', function (d) {
+             var containerWidth = containerNode.clientWidth;
+             var containerHeight = containerNode.clientHeight;
+             var string = 'M 0,0 L 0,' + containerHeight + ' L ' + containerWidth + ',' + containerHeight + 'L' + containerWidth + ',0 Z';
+             if (!d) return string;
+             return string + 'M' + d.left + ',' + d.top + 'L' + d.left + ',' + (d.top + d.height) + 'L' + (d.left + d.width) + ',' + (d.top + d.height) + 'L' + (d.left + d.width) + ',' + d.top + 'Z';
+           });
+         };
+
+         curtain.remove = function () {
+           surface.remove();
+           tooltip.remove();
+           select(window).on('resize.curtain', null);
+         }; // ClientRects are immutable, so copy them to an object,
+         // in case we need to trim the height/width.
+
+
+         function copyBox(src) {
+           return {
+             top: src.top,
+             right: src.right,
+             bottom: src.bottom,
+             left: src.left,
+             width: src.width,
+             height: src.height
+           };
+         }
+
+         return curtain;
+       }
+
+       function uiIntroWelcome(context, reveal) {
+         var dispatch = dispatch$8('done');
+         var chapter = {
+           title: 'intro.welcome.title'
+         };
+
+         function welcome() {
+           context.map().centerZoom([-85.63591, 41.94285], 19);
+           reveal('.intro-nav-wrap .chapter-welcome', helpHtml('intro.welcome.welcome'), {
+             buttonText: _t.html('intro.ok'),
+             buttonCallback: practice
+           });
+         }
+
+         function practice() {
+           reveal('.intro-nav-wrap .chapter-welcome', helpHtml('intro.welcome.practice'), {
+             buttonText: _t.html('intro.ok'),
+             buttonCallback: words
+           });
+         }
+
+         function words() {
+           reveal('.intro-nav-wrap .chapter-welcome', helpHtml('intro.welcome.words'), {
+             buttonText: _t.html('intro.ok'),
+             buttonCallback: chapters
+           });
+         }
+
+         function chapters() {
+           dispatch.call('done');
+           reveal('.intro-nav-wrap .chapter-navigation', helpHtml('intro.welcome.chapters', {
+             next: _t('intro.navigation.title')
+           }));
+         }
+
+         chapter.enter = function () {
+           welcome();
+         };
+
+         chapter.exit = function () {
+           context.container().select('.curtain-tooltip.intro-mouse').selectAll('.counter').remove();
+         };
+
+         chapter.restart = function () {
+           chapter.exit();
+           chapter.enter();
+         };
+
+         return utilRebind(chapter, dispatch, 'on');
+       }
+
+       function uiIntroNavigation(context, reveal) {
+         var dispatch = dispatch$8('done');
+         var timeouts = [];
+         var hallId = 'n2061';
+         var townHall = [-85.63591, 41.94285];
+         var springStreetId = 'w397';
+         var springStreetEndId = 'n1834';
+         var springStreet = [-85.63582, 41.94255];
+         var onewayField = _mainPresetIndex.field('oneway');
+         var maxspeedField = _mainPresetIndex.field('maxspeed');
+         var chapter = {
+           title: 'intro.navigation.title'
+         };
+
+         function timeout(f, t) {
+           timeouts.push(window.setTimeout(f, t));
+         }
+
+         function eventCancel(d3_event) {
+           d3_event.stopPropagation();
+           d3_event.preventDefault();
+         }
+
+         function isTownHallSelected() {
+           var ids = context.selectedIDs();
+           return ids.length === 1 && ids[0] === hallId;
+         }
+
+         function dragMap() {
+           context.enter(modeBrowse(context));
+           context.history().reset('initial');
+           var msec = transitionTime(townHall, context.map().center());
+
+           if (msec) {
+             reveal(null, null, {
+               duration: 0
+             });
+           }
+
+           context.map().centerZoomEase(townHall, 19, msec);
+           timeout(function () {
+             var centerStart = context.map().center();
+             var textId = context.lastPointerType() === 'mouse' ? 'drag' : 'drag_touch';
+             var dragString = helpHtml('intro.navigation.map_info') + '{br}' + helpHtml('intro.navigation.' + textId);
+             reveal('.surface', dragString);
+             context.map().on('drawn.intro', function () {
+               reveal('.surface', dragString, {
+                 duration: 0
+               });
+             });
+             context.map().on('move.intro', function () {
+               var centerNow = context.map().center();
+
+               if (centerStart[0] !== centerNow[0] || centerStart[1] !== centerNow[1]) {
+                 context.map().on('move.intro', null);
+                 timeout(function () {
+                   continueTo(zoomMap);
+                 }, 3000);
+               }
+             });
+           }, msec + 100);
+
+           function continueTo(nextStep) {
+             context.map().on('move.intro drawn.intro', null);
+             nextStep();
+           }
+         }
+
+         function zoomMap() {
+           var zoomStart = context.map().zoom();
+           var textId = context.lastPointerType() === 'mouse' ? 'zoom' : 'zoom_touch';
+           var zoomString = helpHtml('intro.navigation.' + textId);
+           reveal('.surface', zoomString);
+           context.map().on('drawn.intro', function () {
+             reveal('.surface', zoomString, {
+               duration: 0
+             });
+           });
+           context.map().on('move.intro', function () {
+             if (context.map().zoom() !== zoomStart) {
+               context.map().on('move.intro', null);
+               timeout(function () {
+                 continueTo(features);
+               }, 3000);
+             }
+           });
+
+           function continueTo(nextStep) {
+             context.map().on('move.intro drawn.intro', null);
+             nextStep();
+           }
+         }
+
+         function features() {
+           var onClick = function onClick() {
+             continueTo(pointsLinesAreas);
+           };
+
+           reveal('.surface', helpHtml('intro.navigation.features'), {
+             buttonText: _t.html('intro.ok'),
+             buttonCallback: onClick
+           });
+           context.map().on('drawn.intro', function () {
+             reveal('.surface', helpHtml('intro.navigation.features'), {
+               duration: 0,
+               buttonText: _t.html('intro.ok'),
+               buttonCallback: onClick
+             });
+           });
+
+           function continueTo(nextStep) {
+             context.map().on('drawn.intro', null);
+             nextStep();
+           }
+         }
+
+         function pointsLinesAreas() {
+           var onClick = function onClick() {
+             continueTo(nodesWays);
+           };
+
+           reveal('.surface', helpHtml('intro.navigation.points_lines_areas'), {
+             buttonText: _t.html('intro.ok'),
+             buttonCallback: onClick
+           });
+           context.map().on('drawn.intro', function () {
+             reveal('.surface', helpHtml('intro.navigation.points_lines_areas'), {
+               duration: 0,
+               buttonText: _t.html('intro.ok'),
+               buttonCallback: onClick
+             });
+           });
+
+           function continueTo(nextStep) {
+             context.map().on('drawn.intro', null);
+             nextStep();
+           }
+         }
+
+         function nodesWays() {
+           var onClick = function onClick() {
+             continueTo(clickTownHall);
+           };
+
+           reveal('.surface', helpHtml('intro.navigation.nodes_ways'), {
+             buttonText: _t.html('intro.ok'),
+             buttonCallback: onClick
+           });
+           context.map().on('drawn.intro', function () {
+             reveal('.surface', helpHtml('intro.navigation.nodes_ways'), {
+               duration: 0,
+               buttonText: _t.html('intro.ok'),
+               buttonCallback: onClick
+             });
+           });
+
+           function continueTo(nextStep) {
+             context.map().on('drawn.intro', null);
+             nextStep();
+           }
+         }
+
+         function clickTownHall() {
+           context.enter(modeBrowse(context));
+           context.history().reset('initial');
+           var entity = context.hasEntity(hallId);
+           if (!entity) return;
+           reveal(null, null, {
+             duration: 0
+           });
+           context.map().centerZoomEase(entity.loc, 19, 500);
+           timeout(function () {
+             var entity = context.hasEntity(hallId);
+             if (!entity) return;
+             var box = pointBox(entity.loc, context);
+             var textId = context.lastPointerType() === 'mouse' ? 'click_townhall' : 'tap_townhall';
+             reveal(box, helpHtml('intro.navigation.' + textId));
+             context.map().on('move.intro drawn.intro', function () {
+               var entity = context.hasEntity(hallId);
+               if (!entity) return;
+               var box = pointBox(entity.loc, context);
+               reveal(box, helpHtml('intro.navigation.' + textId), {
+                 duration: 0
+               });
+             });
+             context.on('enter.intro', function () {
+               if (isTownHallSelected()) continueTo(selectedTownHall);
+             });
+           }, 550); // after centerZoomEase
+
+           context.history().on('change.intro', function () {
+             if (!context.hasEntity(hallId)) {
+               continueTo(clickTownHall);
+             }
+           });
+
+           function continueTo(nextStep) {
+             context.on('enter.intro', null);
+             context.map().on('move.intro drawn.intro', null);
+             context.history().on('change.intro', null);
+             nextStep();
+           }
+         }
+
+         function selectedTownHall() {
+           if (!isTownHallSelected()) return clickTownHall();
+           var entity = context.hasEntity(hallId);
+           if (!entity) return clickTownHall();
+           var box = pointBox(entity.loc, context);
+
+           var onClick = function onClick() {
+             continueTo(editorTownHall);
+           };
+
+           reveal(box, helpHtml('intro.navigation.selected_townhall'), {
+             buttonText: _t.html('intro.ok'),
+             buttonCallback: onClick
+           });
+           context.map().on('move.intro drawn.intro', function () {
+             var entity = context.hasEntity(hallId);
+             if (!entity) return;
+             var box = pointBox(entity.loc, context);
+             reveal(box, helpHtml('intro.navigation.selected_townhall'), {
+               duration: 0,
+               buttonText: _t.html('intro.ok'),
+               buttonCallback: onClick
+             });
+           });
+           context.history().on('change.intro', function () {
+             if (!context.hasEntity(hallId)) {
+               continueTo(clickTownHall);
+             }
+           });
+
+           function continueTo(nextStep) {
+             context.map().on('move.intro drawn.intro', null);
+             context.history().on('change.intro', null);
+             nextStep();
+           }
+         }
+
+         function editorTownHall() {
+           if (!isTownHallSelected()) return clickTownHall(); // disallow scrolling
+
+           context.container().select('.inspector-wrap').on('wheel.intro', eventCancel);
+
+           var onClick = function onClick() {
+             continueTo(presetTownHall);
+           };
+
+           reveal('.entity-editor-pane', helpHtml('intro.navigation.editor_townhall'), {
+             buttonText: _t.html('intro.ok'),
+             buttonCallback: onClick
+           });
+           context.on('exit.intro', function () {
+             continueTo(clickTownHall);
+           });
+           context.history().on('change.intro', function () {
+             if (!context.hasEntity(hallId)) {
+               continueTo(clickTownHall);
+             }
+           });
+
+           function continueTo(nextStep) {
+             context.on('exit.intro', null);
+             context.history().on('change.intro', null);
+             context.container().select('.inspector-wrap').on('wheel.intro', null);
+             nextStep();
+           }
+         }
+
+         function presetTownHall() {
+           if (!isTownHallSelected()) return clickTownHall(); // reset pane, in case user happened to change it..
+
+           context.container().select('.inspector-wrap .panewrap').style('right', '0%'); // disallow scrolling
+
+           context.container().select('.inspector-wrap').on('wheel.intro', eventCancel); // preset match, in case the user happened to change it.
+
+           var entity = context.entity(context.selectedIDs()[0]);
+           var preset = _mainPresetIndex.match(entity, context.graph());
+
+           var onClick = function onClick() {
+             continueTo(fieldsTownHall);
+           };
+
+           reveal('.entity-editor-pane .section-feature-type', helpHtml('intro.navigation.preset_townhall', {
+             preset: preset.name()
+           }), {
+             buttonText: _t.html('intro.ok'),
+             buttonCallback: onClick
+           });
+           context.on('exit.intro', function () {
+             continueTo(clickTownHall);
+           });
+           context.history().on('change.intro', function () {
+             if (!context.hasEntity(hallId)) {
+               continueTo(clickTownHall);
+             }
+           });
+
+           function continueTo(nextStep) {
+             context.on('exit.intro', null);
+             context.history().on('change.intro', null);
+             context.container().select('.inspector-wrap').on('wheel.intro', null);
+             nextStep();
+           }
+         }
+
+         function fieldsTownHall() {
+           if (!isTownHallSelected()) return clickTownHall(); // reset pane, in case user happened to change it..
+
+           context.container().select('.inspector-wrap .panewrap').style('right', '0%'); // disallow scrolling
+
+           context.container().select('.inspector-wrap').on('wheel.intro', eventCancel);
+
+           var onClick = function onClick() {
+             continueTo(closeTownHall);
+           };
+
+           reveal('.entity-editor-pane .section-preset-fields', helpHtml('intro.navigation.fields_townhall'), {
+             buttonText: _t.html('intro.ok'),
+             buttonCallback: onClick
+           });
+           context.on('exit.intro', function () {
+             continueTo(clickTownHall);
+           });
+           context.history().on('change.intro', function () {
+             if (!context.hasEntity(hallId)) {
+               continueTo(clickTownHall);
+             }
+           });
+
+           function continueTo(nextStep) {
+             context.on('exit.intro', null);
+             context.history().on('change.intro', null);
+             context.container().select('.inspector-wrap').on('wheel.intro', null);
+             nextStep();
+           }
+         }
+
+         function closeTownHall() {
+           if (!isTownHallSelected()) return clickTownHall();
+           var selector = '.entity-editor-pane button.close svg use';
+           var href = select(selector).attr('href') || '#iD-icon-close';
+           reveal('.entity-editor-pane', helpHtml('intro.navigation.close_townhall', {
+             button: {
+               html: icon(href, 'inline')
+             }
+           }));
+           context.on('exit.intro', function () {
+             continueTo(searchStreet);
+           });
+           context.history().on('change.intro', function () {
+             // update the close icon in the tooltip if the user edits something.
+             var selector = '.entity-editor-pane button.close svg use';
+             var href = select(selector).attr('href') || '#iD-icon-close';
+             reveal('.entity-editor-pane', helpHtml('intro.navigation.close_townhall', {
+               button: {
+                 html: icon(href, 'inline')
+               }
+             }), {
+               duration: 0
+             });
+           });
+
+           function continueTo(nextStep) {
+             context.on('exit.intro', null);
+             context.history().on('change.intro', null);
+             nextStep();
+           }
+         }
+
+         function searchStreet() {
+           context.enter(modeBrowse(context));
+           context.history().reset('initial'); // ensure spring street exists
+
+           var msec = transitionTime(springStreet, context.map().center());
+
+           if (msec) {
+             reveal(null, null, {
+               duration: 0
+             });
+           }
+
+           context.map().centerZoomEase(springStreet, 19, msec); // ..and user can see it
+
+           timeout(function () {
+             reveal('.search-header input', helpHtml('intro.navigation.search_street', {
+               name: _t('intro.graph.name.spring-street')
+             }));
+             context.container().select('.search-header input').on('keyup.intro', checkSearchResult);
+           }, msec + 100);
+         }
+
+         function checkSearchResult() {
+           var first = context.container().select('.feature-list-item:nth-child(0n+2)'); // skip "No Results" item
+
+           var firstName = first.select('.entity-name');
+           var name = _t('intro.graph.name.spring-street');
+
+           if (!firstName.empty() && firstName.html() === name) {
+             reveal(first.node(), helpHtml('intro.navigation.choose_street', {
+               name: name
+             }), {
+               duration: 300
+             });
+             context.on('exit.intro', function () {
+               continueTo(selectedStreet);
+             });
+             context.container().select('.search-header input').on('keydown.intro', eventCancel, true).on('keyup.intro', null);
+           }
+
+           function continueTo(nextStep) {
+             context.on('exit.intro', null);
+             context.container().select('.search-header input').on('keydown.intro', null).on('keyup.intro', null);
+             nextStep();
+           }
+         }
+
+         function selectedStreet() {
+           if (!context.hasEntity(springStreetEndId) || !context.hasEntity(springStreetId)) {
+             return searchStreet();
+           }
+
+           var onClick = function onClick() {
+             continueTo(editorStreet);
+           };
+
+           var entity = context.entity(springStreetEndId);
+           var box = pointBox(entity.loc, context);
+           box.height = 500;
+           reveal(box, helpHtml('intro.navigation.selected_street', {
+             name: _t('intro.graph.name.spring-street')
+           }), {
+             duration: 600,
+             buttonText: _t.html('intro.ok'),
+             buttonCallback: onClick
+           });
+           timeout(function () {
+             context.map().on('move.intro drawn.intro', function () {
+               var entity = context.hasEntity(springStreetEndId);
+               if (!entity) return;
+               var box = pointBox(entity.loc, context);
+               box.height = 500;
+               reveal(box, helpHtml('intro.navigation.selected_street', {
+                 name: _t('intro.graph.name.spring-street')
+               }), {
+                 duration: 0,
+                 buttonText: _t.html('intro.ok'),
+                 buttonCallback: onClick
+               });
+             });
+           }, 600); // after reveal.
+
+           context.on('enter.intro', function (mode) {
+             if (!context.hasEntity(springStreetId)) {
+               return continueTo(searchStreet);
+             }
+
+             var ids = context.selectedIDs();
+
+             if (mode.id !== 'select' || !ids.length || ids[0] !== springStreetId) {
+               // keep Spring Street selected..
+               context.enter(modeSelect(context, [springStreetId]));
+             }
+           });
+           context.history().on('change.intro', function () {
+             if (!context.hasEntity(springStreetEndId) || !context.hasEntity(springStreetId)) {
+               timeout(function () {
+                 continueTo(searchStreet);
+               }, 300); // after any transition (e.g. if user deleted intersection)
+             }
+           });
+
+           function continueTo(nextStep) {
+             context.map().on('move.intro drawn.intro', null);
+             context.on('enter.intro', null);
+             context.history().on('change.intro', null);
+             nextStep();
+           }
+         }
+
+         function editorStreet() {
+           var selector = '.entity-editor-pane button.close svg use';
+           var href = select(selector).attr('href') || '#iD-icon-close';
+           reveal('.entity-editor-pane', helpHtml('intro.navigation.street_different_fields') + '{br}' + helpHtml('intro.navigation.editor_street', {
+             button: {
+               html: icon(href, 'inline')
+             },
+             field1: {
+               html: onewayField.label()
+             },
+             field2: {
+               html: maxspeedField.label()
+             }
+           }));
+           context.on('exit.intro', function () {
+             continueTo(play);
+           });
+           context.history().on('change.intro', function () {
+             // update the close icon in the tooltip if the user edits something.
+             var selector = '.entity-editor-pane button.close svg use';
+             var href = select(selector).attr('href') || '#iD-icon-close';
+             reveal('.entity-editor-pane', helpHtml('intro.navigation.street_different_fields') + '{br}' + helpHtml('intro.navigation.editor_street', {
+               button: {
+                 html: icon(href, 'inline')
+               },
+               field1: {
+                 html: onewayField.label()
+               },
+               field2: {
+                 html: maxspeedField.label()
+               }
+             }), {
+               duration: 0
+             });
+           });
+
+           function continueTo(nextStep) {
+             context.on('exit.intro', null);
+             context.history().on('change.intro', null);
+             nextStep();
+           }
+         }
+
+         function play() {
+           dispatch.call('done');
+           reveal('.ideditor', helpHtml('intro.navigation.play', {
+             next: _t('intro.points.title')
+           }), {
+             tooltipBox: '.intro-nav-wrap .chapter-point',
+             buttonText: _t.html('intro.ok'),
+             buttonCallback: function buttonCallback() {
+               reveal('.ideditor');
+             }
+           });
+         }
+
+         chapter.enter = function () {
+           dragMap();
+         };
+
+         chapter.exit = function () {
+           timeouts.forEach(window.clearTimeout);
+           context.on('enter.intro exit.intro', null);
+           context.map().on('move.intro drawn.intro', null);
+           context.history().on('change.intro', null);
+           context.container().select('.inspector-wrap').on('wheel.intro', null);
+           context.container().select('.search-header input').on('keydown.intro keyup.intro', null);
+         };
+
+         chapter.restart = function () {
+           chapter.exit();
+           chapter.enter();
+         };
+
+         return utilRebind(chapter, dispatch, 'on');
+       }
+
+       function uiIntroPoint(context, reveal) {
+         var dispatch = dispatch$8('done');
+         var timeouts = [];
+         var intersection = [-85.63279, 41.94394];
+         var building = [-85.632422, 41.944045];
+         var cafePreset = _mainPresetIndex.item('amenity/cafe');
+         var _pointID = null;
+         var chapter = {
+           title: 'intro.points.title'
+         };
+
+         function timeout(f, t) {
+           timeouts.push(window.setTimeout(f, t));
+         }
+
+         function eventCancel(d3_event) {
+           d3_event.stopPropagation();
+           d3_event.preventDefault();
+         }
+
+         function addPoint() {
+           context.enter(modeBrowse(context));
+           context.history().reset('initial');
+           var msec = transitionTime(intersection, context.map().center());
+
+           if (msec) {
+             reveal(null, null, {
+               duration: 0
+             });
+           }
+
+           context.map().centerZoomEase(intersection, 19, msec);
+           timeout(function () {
+             var tooltip = reveal('button.add-point', helpHtml('intro.points.points_info') + '{br}' + helpHtml('intro.points.add_point'));
+             _pointID = null;
+             tooltip.selectAll('.popover-inner').insert('svg', 'span').attr('class', 'tooltip-illustration').append('use').attr('xlink:href', '#iD-graphic-points');
+             context.on('enter.intro', function (mode) {
+               if (mode.id !== 'add-point') return;
+               continueTo(placePoint);
+             });
+           }, msec + 100);
+
+           function continueTo(nextStep) {
+             context.on('enter.intro', null);
+             nextStep();
+           }
+         }
+
+         function placePoint() {
+           if (context.mode().id !== 'add-point') {
+             return chapter.restart();
+           }
+
+           var pointBox = pad(building, 150, context);
+           var textId = context.lastPointerType() === 'mouse' ? 'place_point' : 'place_point_touch';
+           reveal(pointBox, helpHtml('intro.points.' + textId));
+           context.map().on('move.intro drawn.intro', function () {
+             pointBox = pad(building, 150, context);
+             reveal(pointBox, helpHtml('intro.points.' + textId), {
+               duration: 0
+             });
+           });
+           context.on('enter.intro', function (mode) {
+             if (mode.id !== 'select') return chapter.restart();
+             _pointID = context.mode().selectedIDs()[0];
+             continueTo(searchPreset);
+           });
+
+           function continueTo(nextStep) {
+             context.map().on('move.intro drawn.intro', null);
+             context.on('enter.intro', null);
+             nextStep();
+           }
+         }
+
+         function searchPreset() {
+           if (context.mode().id !== 'select' || !_pointID || !context.hasEntity(_pointID)) {
+             return addPoint();
+           } // disallow scrolling
+
+
+           context.container().select('.inspector-wrap').on('wheel.intro', eventCancel);
+           context.container().select('.preset-search-input').on('keydown.intro', null).on('keyup.intro', checkPresetSearch);
+           reveal('.preset-search-input', helpHtml('intro.points.search_cafe', {
+             preset: cafePreset.name()
+           }));
+           context.on('enter.intro', function (mode) {
+             if (!_pointID || !context.hasEntity(_pointID)) {
+               return continueTo(addPoint);
+             }
+
+             var ids = context.selectedIDs();
+
+             if (mode.id !== 'select' || !ids.length || ids[0] !== _pointID) {
+               // keep the user's point selected..
+               context.enter(modeSelect(context, [_pointID])); // disallow scrolling
+
+               context.container().select('.inspector-wrap').on('wheel.intro', eventCancel);
+               context.container().select('.preset-search-input').on('keydown.intro', null).on('keyup.intro', checkPresetSearch);
+               reveal('.preset-search-input', helpHtml('intro.points.search_cafe', {
+                 preset: cafePreset.name()
+               }));
+               context.history().on('change.intro', null);
+             }
+           });
+
+           function checkPresetSearch() {
+             var first = context.container().select('.preset-list-item:first-child');
+
+             if (first.classed('preset-amenity-cafe')) {
+               context.container().select('.preset-search-input').on('keydown.intro', eventCancel, true).on('keyup.intro', null);
+               reveal(first.select('.preset-list-button').node(), helpHtml('intro.points.choose_cafe', {
+                 preset: cafePreset.name()
+               }), {
+                 duration: 300
+               });
+               context.history().on('change.intro', function () {
+                 continueTo(aboutFeatureEditor);
+               });
+             }
+           }
+
+           function continueTo(nextStep) {
+             context.on('enter.intro', null);
+             context.history().on('change.intro', null);
+             context.container().select('.inspector-wrap').on('wheel.intro', null);
+             context.container().select('.preset-search-input').on('keydown.intro keyup.intro', null);
+             nextStep();
+           }
+         }
+
+         function aboutFeatureEditor() {
+           if (context.mode().id !== 'select' || !_pointID || !context.hasEntity(_pointID)) {
+             return addPoint();
+           }
+
+           timeout(function () {
+             reveal('.entity-editor-pane', helpHtml('intro.points.feature_editor'), {
+               tooltipClass: 'intro-points-describe',
+               buttonText: _t.html('intro.ok'),
+               buttonCallback: function buttonCallback() {
+                 continueTo(addName);
+               }
+             });
+           }, 400);
+           context.on('exit.intro', function () {
+             // if user leaves select mode here, just continue with the tutorial.
+             continueTo(reselectPoint);
+           });
+
+           function continueTo(nextStep) {
+             context.on('exit.intro', null);
+             nextStep();
+           }
+         }
+
+         function addName() {
+           if (context.mode().id !== 'select' || !_pointID || !context.hasEntity(_pointID)) {
+             return addPoint();
+           } // reset pane, in case user happened to change it..
+
+
+           context.container().select('.inspector-wrap .panewrap').style('right', '0%');
+           var addNameString = helpHtml('intro.points.fields_info') + '{br}' + helpHtml('intro.points.add_name');
+           timeout(function () {
+             // It's possible for the user to add a name in a previous step..
+             // If so, don't tell them to add the name in this step.
+             // Give them an OK button instead.
+             var entity = context.entity(_pointID);
+
+             if (entity.tags.name) {
+               var tooltip = reveal('.entity-editor-pane', addNameString, {
+                 tooltipClass: 'intro-points-describe',
+                 buttonText: _t.html('intro.ok'),
+                 buttonCallback: function buttonCallback() {
+                   continueTo(addCloseEditor);
+                 }
+               });
+               tooltip.select('.instruction').style('display', 'none');
+             } else {
+               reveal('.entity-editor-pane', addNameString, {
+                 tooltipClass: 'intro-points-describe'
+               });
+             }
+           }, 400);
+           context.history().on('change.intro', function () {
+             continueTo(addCloseEditor);
+           });
+           context.on('exit.intro', function () {
+             // if user leaves select mode here, just continue with the tutorial.
+             continueTo(reselectPoint);
+           });
+
+           function continueTo(nextStep) {
+             context.on('exit.intro', null);
+             context.history().on('change.intro', null);
+             nextStep();
+           }
+         }
+
+         function addCloseEditor() {
+           // reset pane, in case user happened to change it..
+           context.container().select('.inspector-wrap .panewrap').style('right', '0%');
+           var selector = '.entity-editor-pane button.close svg use';
+           var href = select(selector).attr('href') || '#iD-icon-close';
+           context.on('exit.intro', function () {
+             continueTo(reselectPoint);
+           });
+           reveal('.entity-editor-pane', helpHtml('intro.points.add_close', {
+             button: {
+               html: icon(href, 'inline')
+             }
+           }));
+
+           function continueTo(nextStep) {
+             context.on('exit.intro', null);
+             nextStep();
+           }
+         }
+
+         function reselectPoint() {
+           if (!_pointID) return chapter.restart();
+           var entity = context.hasEntity(_pointID);
+           if (!entity) return chapter.restart(); // make sure it's still a cafe, in case user somehow changed it..
+
+           var oldPreset = _mainPresetIndex.match(entity, context.graph());
+           context.replace(actionChangePreset(_pointID, oldPreset, cafePreset));
+           context.enter(modeBrowse(context));
+           var msec = transitionTime(entity.loc, context.map().center());
+
+           if (msec) {
+             reveal(null, null, {
+               duration: 0
+             });
+           }
+
+           context.map().centerEase(entity.loc, msec);
+           timeout(function () {
+             var box = pointBox(entity.loc, context);
+             reveal(box, helpHtml('intro.points.reselect'), {
+               duration: 600
+             });
+             timeout(function () {
+               context.map().on('move.intro drawn.intro', function () {
+                 var entity = context.hasEntity(_pointID);
+                 if (!entity) return chapter.restart();
+                 var box = pointBox(entity.loc, context);
+                 reveal(box, helpHtml('intro.points.reselect'), {
+                   duration: 0
+                 });
+               });
+             }, 600); // after reveal..
+
+             context.on('enter.intro', function (mode) {
+               if (mode.id !== 'select') return;
+               continueTo(updatePoint);
+             });
+           }, msec + 100);
+
+           function continueTo(nextStep) {
+             context.map().on('move.intro drawn.intro', null);
+             context.on('enter.intro', null);
+             nextStep();
+           }
+         }
+
+         function updatePoint() {
+           if (context.mode().id !== 'select' || !_pointID || !context.hasEntity(_pointID)) {
+             return continueTo(reselectPoint);
+           } // reset pane, in case user happened to untag the point..
+
+
+           context.container().select('.inspector-wrap .panewrap').style('right', '0%');
+           context.on('exit.intro', function () {
+             continueTo(reselectPoint);
+           });
+           context.history().on('change.intro', function () {
+             continueTo(updateCloseEditor);
+           });
+           timeout(function () {
+             reveal('.entity-editor-pane', helpHtml('intro.points.update'), {
+               tooltipClass: 'intro-points-describe'
+             });
+           }, 400);
+
+           function continueTo(nextStep) {
+             context.on('exit.intro', null);
+             context.history().on('change.intro', null);
+             nextStep();
+           }
+         }
+
+         function updateCloseEditor() {
+           if (context.mode().id !== 'select' || !_pointID || !context.hasEntity(_pointID)) {
+             return continueTo(reselectPoint);
+           } // reset pane, in case user happened to change it..
+
+
+           context.container().select('.inspector-wrap .panewrap').style('right', '0%');
+           context.on('exit.intro', function () {
+             continueTo(rightClickPoint);
+           });
+           timeout(function () {
+             reveal('.entity-editor-pane', helpHtml('intro.points.update_close', {
+               button: {
+                 html: icon('#iD-icon-close', 'inline')
+               }
+             }));
+           }, 500);
+
+           function continueTo(nextStep) {
+             context.on('exit.intro', null);
+             nextStep();
+           }
+         }
+
+         function rightClickPoint() {
+           if (!_pointID) return chapter.restart();
+           var entity = context.hasEntity(_pointID);
+           if (!entity) return chapter.restart();
+           context.enter(modeBrowse(context));
+           var box = pointBox(entity.loc, context);
+           var textId = context.lastPointerType() === 'mouse' ? 'rightclick' : 'edit_menu_touch';
+           reveal(box, helpHtml('intro.points.' + textId), {
+             duration: 600
+           });
+           timeout(function () {
+             context.map().on('move.intro', function () {
+               var entity = context.hasEntity(_pointID);
+               if (!entity) return chapter.restart();
+               var box = pointBox(entity.loc, context);
+               reveal(box, helpHtml('intro.points.' + textId), {
+                 duration: 0
+               });
+             });
+           }, 600); // after reveal
+
+           context.on('enter.intro', function (mode) {
+             if (mode.id !== 'select') return;
+             var ids = context.selectedIDs();
+             if (ids.length !== 1 || ids[0] !== _pointID) return;
+             timeout(function () {
+               var node = selectMenuItem(context, 'delete').node();
+               if (!node) return;
+               continueTo(enterDelete);
+             }, 50); // after menu visible
+           });
+
+           function continueTo(nextStep) {
+             context.on('enter.intro', null);
+             context.map().on('move.intro', null);
+             nextStep();
+           }
+         }
+
+         function enterDelete() {
+           if (!_pointID) return chapter.restart();
+           var entity = context.hasEntity(_pointID);
+           if (!entity) return chapter.restart();
+           var node = selectMenuItem(context, 'delete').node();
+
+           if (!node) {
+             return continueTo(rightClickPoint);
+           }
+
+           reveal('.edit-menu', helpHtml('intro.points.delete'), {
+             padding: 50
+           });
+           timeout(function () {
+             context.map().on('move.intro', function () {
+               reveal('.edit-menu', helpHtml('intro.points.delete'), {
+                 duration: 0,
+                 padding: 50
+               });
+             });
+           }, 300); // after menu visible
+
+           context.on('exit.intro', function () {
+             if (!_pointID) return chapter.restart();
+             var entity = context.hasEntity(_pointID);
+             if (entity) return continueTo(rightClickPoint); // point still exists
+           });
+           context.history().on('change.intro', function (changed) {
+             if (changed.deleted().length) {
+               continueTo(undo);
+             }
+           });
+
+           function continueTo(nextStep) {
+             context.map().on('move.intro', null);
+             context.history().on('change.intro', null);
+             context.on('exit.intro', null);
+             nextStep();
+           }
+         }
+
+         function undo() {
+           context.history().on('change.intro', function () {
+             continueTo(play);
+           });
+           reveal('.top-toolbar button.undo-button', helpHtml('intro.points.undo'));
+
+           function continueTo(nextStep) {
+             context.history().on('change.intro', null);
+             nextStep();
+           }
+         }
+
+         function play() {
+           dispatch.call('done');
+           reveal('.ideditor', helpHtml('intro.points.play', {
+             next: _t('intro.areas.title')
+           }), {
+             tooltipBox: '.intro-nav-wrap .chapter-area',
+             buttonText: _t.html('intro.ok'),
+             buttonCallback: function buttonCallback() {
+               reveal('.ideditor');
+             }
+           });
+         }
+
+         chapter.enter = function () {
+           addPoint();
+         };
+
+         chapter.exit = function () {
+           timeouts.forEach(window.clearTimeout);
+           context.on('enter.intro exit.intro', null);
+           context.map().on('move.intro drawn.intro', null);
+           context.history().on('change.intro', null);
+           context.container().select('.inspector-wrap').on('wheel.intro', eventCancel);
+           context.container().select('.preset-search-input').on('keydown.intro keyup.intro', null);
+         };
+
+         chapter.restart = function () {
+           chapter.exit();
+           chapter.enter();
+         };
+
+         return utilRebind(chapter, dispatch, 'on');
+       }
+
+       function uiIntroArea(context, reveal) {
+         var dispatch = dispatch$8('done');
+         var playground = [-85.63552, 41.94159];
+         var playgroundPreset = _mainPresetIndex.item('leisure/playground');
+         var nameField = _mainPresetIndex.field('name');
+         var descriptionField = _mainPresetIndex.field('description');
+         var timeouts = [];
+
+         var _areaID;
+
+         var chapter = {
+           title: 'intro.areas.title'
+         };
+
+         function timeout(f, t) {
+           timeouts.push(window.setTimeout(f, t));
+         }
+
+         function eventCancel(d3_event) {
+           d3_event.stopPropagation();
+           d3_event.preventDefault();
+         }
+
+         function revealPlayground(center, text, options) {
+           var padding = 180 * Math.pow(2, context.map().zoom() - 19.5);
+           var box = pad(center, padding, context);
+           reveal(box, text, options);
+         }
+
+         function addArea() {
+           context.enter(modeBrowse(context));
+           context.history().reset('initial');
+           _areaID = null;
+           var msec = transitionTime(playground, context.map().center());
+
+           if (msec) {
+             reveal(null, null, {
+               duration: 0
+             });
+           }
+
+           context.map().centerZoomEase(playground, 19, msec);
+           timeout(function () {
+             var tooltip = reveal('button.add-area', helpHtml('intro.areas.add_playground'));
+             tooltip.selectAll('.popover-inner').insert('svg', 'span').attr('class', 'tooltip-illustration').append('use').attr('xlink:href', '#iD-graphic-areas');
+             context.on('enter.intro', function (mode) {
+               if (mode.id !== 'add-area') return;
+               continueTo(startPlayground);
+             });
+           }, msec + 100);
+
+           function continueTo(nextStep) {
+             context.on('enter.intro', null);
+             nextStep();
+           }
+         }
+
+         function startPlayground() {
+           if (context.mode().id !== 'add-area') {
+             return chapter.restart();
+           }
+
+           _areaID = null;
+           context.map().zoomEase(19.5, 500);
+           timeout(function () {
+             var textId = context.lastPointerType() === 'mouse' ? 'starting_node_click' : 'starting_node_tap';
+             var startDrawString = helpHtml('intro.areas.start_playground') + helpHtml('intro.areas.' + textId);
+             revealPlayground(playground, startDrawString, {
+               duration: 250
+             });
+             timeout(function () {
+               context.map().on('move.intro drawn.intro', function () {
+                 revealPlayground(playground, startDrawString, {
+                   duration: 0
+                 });
+               });
+               context.on('enter.intro', function (mode) {
+                 if (mode.id !== 'draw-area') return chapter.restart();
+                 continueTo(continuePlayground);
+               });
+             }, 250); // after reveal
+           }, 550); // after easing
+
+           function continueTo(nextStep) {
+             context.map().on('move.intro drawn.intro', null);
+             context.on('enter.intro', null);
+             nextStep();
+           }
+         }
+
+         function continuePlayground() {
+           if (context.mode().id !== 'draw-area') {
+             return chapter.restart();
+           }
+
+           _areaID = null;
+           revealPlayground(playground, helpHtml('intro.areas.continue_playground'), {
+             duration: 250
+           });
+           timeout(function () {
+             context.map().on('move.intro drawn.intro', function () {
+               revealPlayground(playground, helpHtml('intro.areas.continue_playground'), {
+                 duration: 0
+               });
+             });
+           }, 250); // after reveal
+
+           context.on('enter.intro', function (mode) {
+             if (mode.id === 'draw-area') {
+               var entity = context.hasEntity(context.selectedIDs()[0]);
+
+               if (entity && entity.nodes.length >= 6) {
+                 return continueTo(finishPlayground);
+               } else {
+                 return;
+               }
+             } else if (mode.id === 'select') {
+               _areaID = context.selectedIDs()[0];
+               return continueTo(searchPresets);
+             } else {
+               return chapter.restart();
+             }
+           });
+
+           function continueTo(nextStep) {
+             context.map().on('move.intro drawn.intro', null);
+             context.on('enter.intro', null);
+             nextStep();
+           }
+         }
+
+         function finishPlayground() {
+           if (context.mode().id !== 'draw-area') {
+             return chapter.restart();
+           }
+
+           _areaID = null;
+           var finishString = helpHtml('intro.areas.finish_area_' + (context.lastPointerType() === 'mouse' ? 'click' : 'tap')) + helpHtml('intro.areas.finish_playground');
+           revealPlayground(playground, finishString, {
+             duration: 250
+           });
+           timeout(function () {
+             context.map().on('move.intro drawn.intro', function () {
+               revealPlayground(playground, finishString, {
+                 duration: 0
+               });
+             });
+           }, 250); // after reveal
+
+           context.on('enter.intro', function (mode) {
+             if (mode.id === 'draw-area') {
+               return;
+             } else if (mode.id === 'select') {
+               _areaID = context.selectedIDs()[0];
+               return continueTo(searchPresets);
+             } else {
+               return chapter.restart();
+             }
+           });
+
+           function continueTo(nextStep) {
+             context.map().on('move.intro drawn.intro', null);
+             context.on('enter.intro', null);
+             nextStep();
+           }
+         }
+
+         function searchPresets() {
+           if (!_areaID || !context.hasEntity(_areaID)) {
+             return addArea();
+           }
+
+           var ids = context.selectedIDs();
+
+           if (context.mode().id !== 'select' || !ids.length || ids[0] !== _areaID) {
+             context.enter(modeSelect(context, [_areaID]));
+           } // disallow scrolling
+
+
+           context.container().select('.inspector-wrap').on('wheel.intro', eventCancel);
+           timeout(function () {
+             // reset pane, in case user somehow happened to change it..
+             context.container().select('.inspector-wrap .panewrap').style('right', '-100%');
+             context.container().select('.preset-search-input').on('keydown.intro', null).on('keyup.intro', checkPresetSearch);
+             reveal('.preset-search-input', helpHtml('intro.areas.search_playground', {
+               preset: playgroundPreset.name()
+             }));
+           }, 400); // after preset list pane visible..
+
+           context.on('enter.intro', function (mode) {
+             if (!_areaID || !context.hasEntity(_areaID)) {
+               return continueTo(addArea);
+             }
+
+             var ids = context.selectedIDs();
+
+             if (mode.id !== 'select' || !ids.length || ids[0] !== _areaID) {
+               // keep the user's area selected..
+               context.enter(modeSelect(context, [_areaID])); // reset pane, in case user somehow happened to change it..
+
+               context.container().select('.inspector-wrap .panewrap').style('right', '-100%'); // disallow scrolling
+
+               context.container().select('.inspector-wrap').on('wheel.intro', eventCancel);
+               context.container().select('.preset-search-input').on('keydown.intro', null).on('keyup.intro', checkPresetSearch);
+               reveal('.preset-search-input', helpHtml('intro.areas.search_playground', {
+                 preset: playgroundPreset.name()
+               }));
+               context.history().on('change.intro', null);
+             }
+           });
+
+           function checkPresetSearch() {
+             var first = context.container().select('.preset-list-item:first-child');
+
+             if (first.classed('preset-leisure-playground')) {
+               reveal(first.select('.preset-list-button').node(), helpHtml('intro.areas.choose_playground', {
+                 preset: playgroundPreset.name()
+               }), {
+                 duration: 300
+               });
+               context.container().select('.preset-search-input').on('keydown.intro', eventCancel, true).on('keyup.intro', null);
+               context.history().on('change.intro', function () {
+                 continueTo(clickAddField);
+               });
+             }
+           }
+
+           function continueTo(nextStep) {
+             context.container().select('.inspector-wrap').on('wheel.intro', null);
+             context.on('enter.intro', null);
+             context.history().on('change.intro', null);
+             context.container().select('.preset-search-input').on('keydown.intro keyup.intro', null);
+             nextStep();
+           }
+         }
+
+         function clickAddField() {
+           if (!_areaID || !context.hasEntity(_areaID)) {
+             return addArea();
+           }
+
+           var ids = context.selectedIDs();
+
+           if (context.mode().id !== 'select' || !ids.length || ids[0] !== _areaID) {
+             return searchPresets();
+           }
+
+           if (!context.container().select('.form-field-description').empty()) {
+             return continueTo(describePlayground);
+           } // disallow scrolling
+
+
+           context.container().select('.inspector-wrap').on('wheel.intro', eventCancel);
+           timeout(function () {
+             // reset pane, in case user somehow happened to change it..
+             context.container().select('.inspector-wrap .panewrap').style('right', '0%'); // It's possible for the user to add a description in a previous step..
+             // If they did this already, just continue to next step.
+
+             var entity = context.entity(_areaID);
+
+             if (entity.tags.description) {
+               return continueTo(play);
+             } // scroll "Add field" into view
+
+
+             var box = context.container().select('.more-fields').node().getBoundingClientRect();
+
+             if (box.top > 300) {
+               var pane = context.container().select('.entity-editor-pane .inspector-body');
+               var start = pane.node().scrollTop;
+               var end = start + (box.top - 300);
+               pane.transition().duration(250).tween('scroll.inspector', function () {
+                 var node = this;
+                 var i = d3_interpolateNumber(start, end);
+                 return function (t) {
+                   node.scrollTop = i(t);
+                 };
+               });
+             }
+
+             timeout(function () {
+               reveal('.more-fields .combobox-input', helpHtml('intro.areas.add_field', {
+                 name: {
+                   html: nameField.label()
+                 },
+                 description: {
+                   html: descriptionField.label()
+                 }
+               }), {
+                 duration: 300
+               });
+               context.container().select('.more-fields .combobox-input').on('click.intro', function () {
+                 // Watch for the combobox to appear...
+                 var watcher;
+                 watcher = window.setInterval(function () {
+                   if (!context.container().select('div.combobox').empty()) {
+                     window.clearInterval(watcher);
+                     continueTo(chooseDescriptionField);
+                   }
+                 }, 300);
+               });
+             }, 300); // after "Add Field" visible
+           }, 400); // after editor pane visible
+
+           context.on('exit.intro', function () {
+             return continueTo(searchPresets);
+           });
+
+           function continueTo(nextStep) {
+             context.container().select('.inspector-wrap').on('wheel.intro', null);
+             context.container().select('.more-fields .combobox-input').on('click.intro', null);
+             context.on('exit.intro', null);
+             nextStep();
+           }
+         }
+
+         function chooseDescriptionField() {
+           if (!_areaID || !context.hasEntity(_areaID)) {
+             return addArea();
+           }
+
+           var ids = context.selectedIDs();
+
+           if (context.mode().id !== 'select' || !ids.length || ids[0] !== _areaID) {
+             return searchPresets();
+           }
+
+           if (!context.container().select('.form-field-description').empty()) {
+             return continueTo(describePlayground);
+           } // Make sure combobox is ready..
+
+
+           if (context.container().select('div.combobox').empty()) {
+             return continueTo(clickAddField);
+           } // Watch for the combobox to go away..
+
+
+           var watcher;
+           watcher = window.setInterval(function () {
+             if (context.container().select('div.combobox').empty()) {
+               window.clearInterval(watcher);
+               timeout(function () {
+                 if (context.container().select('.form-field-description').empty()) {
+                   continueTo(retryChooseDescription);
+                 } else {
+                   continueTo(describePlayground);
+                 }
+               }, 300); // after description field added.
+             }
+           }, 300);
+           reveal('div.combobox', helpHtml('intro.areas.choose_field', {
+             field: {
+               html: descriptionField.label()
+             }
+           }), {
+             duration: 300
+           });
+           context.on('exit.intro', function () {
+             return continueTo(searchPresets);
+           });
+
+           function continueTo(nextStep) {
+             if (watcher) window.clearInterval(watcher);
+             context.on('exit.intro', null);
+             nextStep();
+           }
+         }
+
+         function describePlayground() {
+           if (!_areaID || !context.hasEntity(_areaID)) {
+             return addArea();
+           }
+
+           var ids = context.selectedIDs();
+
+           if (context.mode().id !== 'select' || !ids.length || ids[0] !== _areaID) {
+             return searchPresets();
+           } // reset pane, in case user happened to change it..
+
+
+           context.container().select('.inspector-wrap .panewrap').style('right', '0%');
+
+           if (context.container().select('.form-field-description').empty()) {
+             return continueTo(retryChooseDescription);
+           }
+
+           context.on('exit.intro', function () {
+             continueTo(play);
+           });
+           reveal('.entity-editor-pane', helpHtml('intro.areas.describe_playground', {
+             button: {
+               html: icon('#iD-icon-close', 'inline')
+             }
+           }), {
+             duration: 300
+           });
+
+           function continueTo(nextStep) {
+             context.on('exit.intro', null);
+             nextStep();
+           }
+         }
+
+         function retryChooseDescription() {
+           if (!_areaID || !context.hasEntity(_areaID)) {
+             return addArea();
+           }
+
+           var ids = context.selectedIDs();
+
+           if (context.mode().id !== 'select' || !ids.length || ids[0] !== _areaID) {
+             return searchPresets();
+           } // reset pane, in case user happened to change it..
+
+
+           context.container().select('.inspector-wrap .panewrap').style('right', '0%');
+           reveal('.entity-editor-pane', helpHtml('intro.areas.retry_add_field', {
+             field: {
+               html: descriptionField.label()
+             }
+           }), {
+             buttonText: _t.html('intro.ok'),
+             buttonCallback: function buttonCallback() {
+               continueTo(clickAddField);
+             }
+           });
+           context.on('exit.intro', function () {
+             return continueTo(searchPresets);
+           });
+
+           function continueTo(nextStep) {
+             context.on('exit.intro', null);
+             nextStep();
+           }
+         }
+
+         function play() {
+           dispatch.call('done');
+           reveal('.ideditor', helpHtml('intro.areas.play', {
+             next: _t('intro.lines.title')
+           }), {
+             tooltipBox: '.intro-nav-wrap .chapter-line',
+             buttonText: _t.html('intro.ok'),
+             buttonCallback: function buttonCallback() {
+               reveal('.ideditor');
+             }
+           });
+         }
+
+         chapter.enter = function () {
+           addArea();
+         };
+
+         chapter.exit = function () {
+           timeouts.forEach(window.clearTimeout);
+           context.on('enter.intro exit.intro', null);
+           context.map().on('move.intro drawn.intro', null);
+           context.history().on('change.intro', null);
+           context.container().select('.inspector-wrap').on('wheel.intro', null);
+           context.container().select('.preset-search-input').on('keydown.intro keyup.intro', null);
+           context.container().select('.more-fields .combobox-input').on('click.intro', null);
+         };
+
+         chapter.restart = function () {
+           chapter.exit();
+           chapter.enter();
+         };
+
+         return utilRebind(chapter, dispatch, 'on');
+       }
+
+       function uiIntroLine(context, reveal) {
+         var dispatch = dispatch$8('done');
+         var timeouts = [];
+         var _tulipRoadID = null;
+         var flowerRoadID = 'w646';
+         var tulipRoadStart = [-85.6297754121684, 41.95805253325314];
+         var tulipRoadMidpoint = [-85.62975395449628, 41.95787501510204];
+         var tulipRoadIntersection = [-85.62974496187628, 41.95742515554585];
+         var roadCategory = _mainPresetIndex.item('category-road_minor');
+         var residentialPreset = _mainPresetIndex.item('highway/residential');
+         var woodRoadID = 'w525';
+         var woodRoadEndID = 'n2862';
+         var woodRoadAddNode = [-85.62390110349587, 41.95397111462291];
+         var woodRoadDragEndpoint = [-85.623867390213, 41.95466987786487];
+         var woodRoadDragMidpoint = [-85.62386254803509, 41.95430395953872];
+         var washingtonStreetID = 'w522';
+         var twelfthAvenueID = 'w1';
+         var eleventhAvenueEndID = 'n3550';
+         var twelfthAvenueEndID = 'n5';
+         var _washingtonSegmentID = null;
+         var eleventhAvenueEnd = context.entity(eleventhAvenueEndID).loc;
+         var twelfthAvenueEnd = context.entity(twelfthAvenueEndID).loc;
+         var deleteLinesLoc = [-85.6219395542764, 41.95228033922477];
+         var twelfthAvenue = [-85.62219310052491, 41.952505413152956];
+         var chapter = {
+           title: 'intro.lines.title'
+         };
+
+         function timeout(f, t) {
+           timeouts.push(window.setTimeout(f, t));
+         }
+
+         function eventCancel(d3_event) {
+           d3_event.stopPropagation();
+           d3_event.preventDefault();
+         }
+
+         function addLine() {
+           context.enter(modeBrowse(context));
+           context.history().reset('initial');
+           var msec = transitionTime(tulipRoadStart, context.map().center());
+
+           if (msec) {
+             reveal(null, null, {
+               duration: 0
+             });
+           }
+
+           context.map().centerZoomEase(tulipRoadStart, 18.5, msec);
+           timeout(function () {
+             var tooltip = reveal('button.add-line', helpHtml('intro.lines.add_line'));
+             tooltip.selectAll('.popover-inner').insert('svg', 'span').attr('class', 'tooltip-illustration').append('use').attr('xlink:href', '#iD-graphic-lines');
+             context.on('enter.intro', function (mode) {
+               if (mode.id !== 'add-line') return;
+               continueTo(startLine);
+             });
+           }, msec + 100);
+
+           function continueTo(nextStep) {
+             context.on('enter.intro', null);
+             nextStep();
+           }
+         }
+
+         function startLine() {
+           if (context.mode().id !== 'add-line') return chapter.restart();
+           _tulipRoadID = null;
+           var padding = 70 * Math.pow(2, context.map().zoom() - 18);
+           var box = pad(tulipRoadStart, padding, context);
+           box.height = box.height + 100;
+           var textId = context.lastPointerType() === 'mouse' ? 'start_line' : 'start_line_tap';
+           var startLineString = helpHtml('intro.lines.missing_road') + '{br}' + helpHtml('intro.lines.line_draw_info') + helpHtml('intro.lines.' + textId);
+           reveal(box, startLineString);
+           context.map().on('move.intro drawn.intro', function () {
+             padding = 70 * Math.pow(2, context.map().zoom() - 18);
+             box = pad(tulipRoadStart, padding, context);
+             box.height = box.height + 100;
+             reveal(box, startLineString, {
+               duration: 0
+             });
+           });
+           context.on('enter.intro', function (mode) {
+             if (mode.id !== 'draw-line') return chapter.restart();
+             continueTo(drawLine);
+           });
+
+           function continueTo(nextStep) {
+             context.map().on('move.intro drawn.intro', null);
+             context.on('enter.intro', null);
+             nextStep();
+           }
+         }
+
+         function drawLine() {
+           if (context.mode().id !== 'draw-line') return chapter.restart();
+           _tulipRoadID = context.mode().selectedIDs()[0];
+           context.map().centerEase(tulipRoadMidpoint, 500);
+           timeout(function () {
+             var padding = 200 * Math.pow(2, context.map().zoom() - 18.5);
+             var box = pad(tulipRoadMidpoint, padding, context);
+             box.height = box.height * 2;
+             reveal(box, helpHtml('intro.lines.intersect', {
+               name: _t('intro.graph.name.flower-street')
+             }));
+             context.map().on('move.intro drawn.intro', function () {
+               padding = 200 * Math.pow(2, context.map().zoom() - 18.5);
+               box = pad(tulipRoadMidpoint, padding, context);
+               box.height = box.height * 2;
+               reveal(box, helpHtml('intro.lines.intersect', {
+                 name: _t('intro.graph.name.flower-street')
+               }), {
+                 duration: 0
+               });
+             });
+           }, 550); // after easing..
+
+           context.history().on('change.intro', function () {
+             if (isLineConnected()) {
+               continueTo(continueLine);
+             }
+           });
+           context.on('enter.intro', function (mode) {
+             if (mode.id === 'draw-line') {
+               return;
+             } else if (mode.id === 'select') {
+               continueTo(retryIntersect);
+               return;
+             } else {
+               return chapter.restart();
+             }
+           });
+
+           function continueTo(nextStep) {
+             context.map().on('move.intro drawn.intro', null);
+             context.history().on('change.intro', null);
+             context.on('enter.intro', null);
+             nextStep();
+           }
+         }
+
+         function isLineConnected() {
+           var entity = _tulipRoadID && context.hasEntity(_tulipRoadID);
+
+           if (!entity) return false;
+           var drawNodes = context.graph().childNodes(entity);
+           return drawNodes.some(function (node) {
+             return context.graph().parentWays(node).some(function (parent) {
+               return parent.id === flowerRoadID;
+             });
+           });
+         }
+
+         function retryIntersect() {
+           select(window).on('pointerdown.intro mousedown.intro', eventCancel, true);
+           var box = pad(tulipRoadIntersection, 80, context);
+           reveal(box, helpHtml('intro.lines.retry_intersect', {
+             name: _t('intro.graph.name.flower-street')
+           }));
+           timeout(chapter.restart, 3000);
+         }
+
+         function continueLine() {
+           if (context.mode().id !== 'draw-line') return chapter.restart();
+
+           var entity = _tulipRoadID && context.hasEntity(_tulipRoadID);
+
+           if (!entity) return chapter.restart();
+           context.map().centerEase(tulipRoadIntersection, 500);
+           var continueLineText = helpHtml('intro.lines.continue_line') + '{br}' + helpHtml('intro.lines.finish_line_' + (context.lastPointerType() === 'mouse' ? 'click' : 'tap')) + helpHtml('intro.lines.finish_road');
+           reveal('.surface', continueLineText);
+           context.on('enter.intro', function (mode) {
+             if (mode.id === 'draw-line') {
+               return;
+             } else if (mode.id === 'select') {
+               return continueTo(chooseCategoryRoad);
+             } else {
+               return chapter.restart();
+             }
+           });
+
+           function continueTo(nextStep) {
+             context.on('enter.intro', null);
+             nextStep();
+           }
+         }
+
+         function chooseCategoryRoad() {
+           if (context.mode().id !== 'select') return chapter.restart();
+           context.on('exit.intro', function () {
+             return chapter.restart();
+           });
+           var button = context.container().select('.preset-category-road_minor .preset-list-button');
+           if (button.empty()) return chapter.restart(); // disallow scrolling
+
+           context.container().select('.inspector-wrap').on('wheel.intro', eventCancel);
+           timeout(function () {
+             // reset pane, in case user somehow happened to change it..
+             context.container().select('.inspector-wrap .panewrap').style('right', '-100%');
+             reveal(button.node(), helpHtml('intro.lines.choose_category_road', {
+               category: roadCategory.name()
+             }));
+             button.on('click.intro', function () {
+               continueTo(choosePresetResidential);
+             });
+           }, 400); // after editor pane visible
+
+           function continueTo(nextStep) {
+             context.container().select('.inspector-wrap').on('wheel.intro', null);
+             context.container().select('.preset-list-button').on('click.intro', null);
+             context.on('exit.intro', null);
+             nextStep();
+           }
+         }
+
+         function choosePresetResidential() {
+           if (context.mode().id !== 'select') return chapter.restart();
+           context.on('exit.intro', function () {
+             return chapter.restart();
+           });
+           var subgrid = context.container().select('.preset-category-road_minor .subgrid');
+           if (subgrid.empty()) return chapter.restart();
+           subgrid.selectAll(':not(.preset-highway-residential) .preset-list-button').on('click.intro', function () {
+             continueTo(retryPresetResidential);
+           });
+           subgrid.selectAll('.preset-highway-residential .preset-list-button').on('click.intro', function () {
+             continueTo(nameRoad);
+           });
+           timeout(function () {
+             reveal(subgrid.node(), helpHtml('intro.lines.choose_preset_residential', {
+               preset: residentialPreset.name()
+             }), {
+               tooltipBox: '.preset-highway-residential .preset-list-button',
+               duration: 300
+             });
+           }, 300);
+
+           function continueTo(nextStep) {
+             context.container().select('.preset-list-button').on('click.intro', null);
+             context.on('exit.intro', null);
+             nextStep();
+           }
+         } // selected wrong road type
+
+
+         function retryPresetResidential() {
+           if (context.mode().id !== 'select') return chapter.restart();
+           context.on('exit.intro', function () {
+             return chapter.restart();
+           }); // disallow scrolling
+
+           context.container().select('.inspector-wrap').on('wheel.intro', eventCancel);
+           timeout(function () {
+             var button = context.container().select('.entity-editor-pane .preset-list-button');
+             reveal(button.node(), helpHtml('intro.lines.retry_preset_residential', {
+               preset: residentialPreset.name()
+             }));
+             button.on('click.intro', function () {
+               continueTo(chooseCategoryRoad);
+             });
+           }, 500);
+
+           function continueTo(nextStep) {
+             context.container().select('.inspector-wrap').on('wheel.intro', null);
+             context.container().select('.preset-list-button').on('click.intro', null);
+             context.on('exit.intro', null);
+             nextStep();
+           }
+         }
+
+         function nameRoad() {
+           context.on('exit.intro', function () {
+             continueTo(didNameRoad);
+           });
+           timeout(function () {
+             reveal('.entity-editor-pane', helpHtml('intro.lines.name_road', {
+               button: {
+                 html: icon('#iD-icon-close', 'inline')
+               }
+             }), {
+               tooltipClass: 'intro-lines-name_road'
+             });
+           }, 500);
+
+           function continueTo(nextStep) {
+             context.on('exit.intro', null);
+             nextStep();
+           }
+         }
+
+         function didNameRoad() {
+           context.history().checkpoint('doneAddLine');
+           timeout(function () {
+             reveal('.surface', helpHtml('intro.lines.did_name_road'), {
+               buttonText: _t.html('intro.ok'),
+               buttonCallback: function buttonCallback() {
+                 continueTo(updateLine);
+               }
+             });
+           }, 500);
+
+           function continueTo(nextStep) {
+             nextStep();
+           }
+         }
+
+         function updateLine() {
+           context.history().reset('doneAddLine');
+
+           if (!context.hasEntity(woodRoadID) || !context.hasEntity(woodRoadEndID)) {
+             return chapter.restart();
+           }
+
+           var msec = transitionTime(woodRoadDragMidpoint, context.map().center());
+
+           if (msec) {
+             reveal(null, null, {
+               duration: 0
+             });
+           }
+
+           context.map().centerZoomEase(woodRoadDragMidpoint, 19, msec);
+           timeout(function () {
+             var padding = 250 * Math.pow(2, context.map().zoom() - 19);
+             var box = pad(woodRoadDragMidpoint, padding, context);
+
+             var advance = function advance() {
+               continueTo(addNode);
+             };
+
+             reveal(box, helpHtml('intro.lines.update_line'), {
+               buttonText: _t.html('intro.ok'),
+               buttonCallback: advance
+             });
+             context.map().on('move.intro drawn.intro', function () {
+               var padding = 250 * Math.pow(2, context.map().zoom() - 19);
+               var box = pad(woodRoadDragMidpoint, padding, context);
+               reveal(box, helpHtml('intro.lines.update_line'), {
+                 duration: 0,
+                 buttonText: _t.html('intro.ok'),
+                 buttonCallback: advance
+               });
+             });
+           }, msec + 100);
+
+           function continueTo(nextStep) {
+             context.map().on('move.intro drawn.intro', null);
+             nextStep();
+           }
+         }
+
+         function addNode() {
+           context.history().reset('doneAddLine');
+
+           if (!context.hasEntity(woodRoadID) || !context.hasEntity(woodRoadEndID)) {
+             return chapter.restart();
+           }
+
+           var padding = 40 * Math.pow(2, context.map().zoom() - 19);
+           var box = pad(woodRoadAddNode, padding, context);
+           var addNodeString = helpHtml('intro.lines.add_node' + (context.lastPointerType() === 'mouse' ? '' : '_touch'));
+           reveal(box, addNodeString);
+           context.map().on('move.intro drawn.intro', function () {
+             var padding = 40 * Math.pow(2, context.map().zoom() - 19);
+             var box = pad(woodRoadAddNode, padding, context);
+             reveal(box, addNodeString, {
+               duration: 0
+             });
+           });
+           context.history().on('change.intro', function (changed) {
+             if (!context.hasEntity(woodRoadID) || !context.hasEntity(woodRoadEndID)) {
+               return continueTo(updateLine);
+             }
+
+             if (changed.created().length === 1) {
+               timeout(function () {
+                 continueTo(startDragEndpoint);
+               }, 500);
+             }
+           });
+           context.on('enter.intro', function (mode) {
+             if (mode.id !== 'select') {
+               continueTo(updateLine);
+             }
+           });
+
+           function continueTo(nextStep) {
+             context.map().on('move.intro drawn.intro', null);
+             context.history().on('change.intro', null);
+             context.on('enter.intro', null);
+             nextStep();
+           }
+         }
+
+         function startDragEndpoint() {
+           if (!context.hasEntity(woodRoadID) || !context.hasEntity(woodRoadEndID)) {
+             return continueTo(updateLine);
+           }
+
+           var padding = 100 * Math.pow(2, context.map().zoom() - 19);
+           var box = pad(woodRoadDragEndpoint, padding, context);
+           var startDragString = helpHtml('intro.lines.start_drag_endpoint' + (context.lastPointerType() === 'mouse' ? '' : '_touch')) + helpHtml('intro.lines.drag_to_intersection');
+           reveal(box, startDragString);
+           context.map().on('move.intro drawn.intro', function () {
+             if (!context.hasEntity(woodRoadID) || !context.hasEntity(woodRoadEndID)) {
+               return continueTo(updateLine);
+             }
+
+             var padding = 100 * Math.pow(2, context.map().zoom() - 19);
+             var box = pad(woodRoadDragEndpoint, padding, context);
+             reveal(box, startDragString, {
+               duration: 0
+             });
+             var entity = context.entity(woodRoadEndID);
+
+             if (geoSphericalDistance(entity.loc, woodRoadDragEndpoint) <= 4) {
+               continueTo(finishDragEndpoint);
+             }
+           });
+
+           function continueTo(nextStep) {
+             context.map().on('move.intro drawn.intro', null);
+             nextStep();
+           }
+         }
+
+         function finishDragEndpoint() {
+           if (!context.hasEntity(woodRoadID) || !context.hasEntity(woodRoadEndID)) {
+             return continueTo(updateLine);
+           }
+
+           var padding = 100 * Math.pow(2, context.map().zoom() - 19);
+           var box = pad(woodRoadDragEndpoint, padding, context);
+           var finishDragString = helpHtml('intro.lines.spot_looks_good') + helpHtml('intro.lines.finish_drag_endpoint' + (context.lastPointerType() === 'mouse' ? '' : '_touch'));
+           reveal(box, finishDragString);
+           context.map().on('move.intro drawn.intro', function () {
+             if (!context.hasEntity(woodRoadID) || !context.hasEntity(woodRoadEndID)) {
+               return continueTo(updateLine);
+             }
+
+             var padding = 100 * Math.pow(2, context.map().zoom() - 19);
+             var box = pad(woodRoadDragEndpoint, padding, context);
+             reveal(box, finishDragString, {
+               duration: 0
+             });
+             var entity = context.entity(woodRoadEndID);
+
+             if (geoSphericalDistance(entity.loc, woodRoadDragEndpoint) > 4) {
+               continueTo(startDragEndpoint);
+             }
+           });
+           context.on('enter.intro', function () {
+             continueTo(startDragMidpoint);
+           });
+
+           function continueTo(nextStep) {
+             context.map().on('move.intro drawn.intro', null);
+             context.on('enter.intro', null);
+             nextStep();
+           }
+         }
+
+         function startDragMidpoint() {
+           if (!context.hasEntity(woodRoadID) || !context.hasEntity(woodRoadEndID)) {
+             return continueTo(updateLine);
+           }
+
+           if (context.selectedIDs().indexOf(woodRoadID) === -1) {
+             context.enter(modeSelect(context, [woodRoadID]));
+           }
+
+           var padding = 80 * Math.pow(2, context.map().zoom() - 19);
+           var box = pad(woodRoadDragMidpoint, padding, context);
+           reveal(box, helpHtml('intro.lines.start_drag_midpoint'));
+           context.map().on('move.intro drawn.intro', function () {
+             if (!context.hasEntity(woodRoadID) || !context.hasEntity(woodRoadEndID)) {
+               return continueTo(updateLine);
+             }
+
+             var padding = 80 * Math.pow(2, context.map().zoom() - 19);
+             var box = pad(woodRoadDragMidpoint, padding, context);
+             reveal(box, helpHtml('intro.lines.start_drag_midpoint'), {
+               duration: 0
+             });
+           });
+           context.history().on('change.intro', function (changed) {
+             if (changed.created().length === 1) {
+               continueTo(continueDragMidpoint);
+             }
+           });
+           context.on('enter.intro', function (mode) {
+             if (mode.id !== 'select') {
+               // keep Wood Road selected so midpoint triangles are drawn..
+               context.enter(modeSelect(context, [woodRoadID]));
+             }
+           });
+
+           function continueTo(nextStep) {
+             context.map().on('move.intro drawn.intro', null);
+             context.history().on('change.intro', null);
+             context.on('enter.intro', null);
+             nextStep();
+           }
+         }
+
+         function continueDragMidpoint() {
+           if (!context.hasEntity(woodRoadID) || !context.hasEntity(woodRoadEndID)) {
+             return continueTo(updateLine);
+           }
+
+           var padding = 100 * Math.pow(2, context.map().zoom() - 19);
+           var box = pad(woodRoadDragEndpoint, padding, context);
+           box.height += 400;
+
+           var advance = function advance() {
+             context.history().checkpoint('doneUpdateLine');
+             continueTo(deleteLines);
+           };
+
+           reveal(box, helpHtml('intro.lines.continue_drag_midpoint'), {
+             buttonText: _t.html('intro.ok'),
+             buttonCallback: advance
+           });
+           context.map().on('move.intro drawn.intro', function () {
+             if (!context.hasEntity(woodRoadID) || !context.hasEntity(woodRoadEndID)) {
+               return continueTo(updateLine);
+             }
+
+             var padding = 100 * Math.pow(2, context.map().zoom() - 19);
+             var box = pad(woodRoadDragEndpoint, padding, context);
+             box.height += 400;
+             reveal(box, helpHtml('intro.lines.continue_drag_midpoint'), {
+               duration: 0,
+               buttonText: _t.html('intro.ok'),
+               buttonCallback: advance
+             });
+           });
+
+           function continueTo(nextStep) {
+             context.map().on('move.intro drawn.intro', null);
+             nextStep();
+           }
+         }
+
+         function deleteLines() {
+           context.history().reset('doneUpdateLine');
+           context.enter(modeBrowse(context));
+
+           if (!context.hasEntity(washingtonStreetID) || !context.hasEntity(twelfthAvenueID) || !context.hasEntity(eleventhAvenueEndID)) {
+             return chapter.restart();
+           }
+
+           var msec = transitionTime(deleteLinesLoc, context.map().center());
+
+           if (msec) {
+             reveal(null, null, {
+               duration: 0
+             });
+           }
+
+           context.map().centerZoomEase(deleteLinesLoc, 18, msec);
+           timeout(function () {
+             var padding = 200 * Math.pow(2, context.map().zoom() - 18);
+             var box = pad(deleteLinesLoc, padding, context);
+             box.top -= 200;
+             box.height += 400;
+
+             var advance = function advance() {
+               continueTo(rightClickIntersection);
+             };
+
+             reveal(box, helpHtml('intro.lines.delete_lines', {
+               street: _t('intro.graph.name.12th-avenue')
+             }), {
+               buttonText: _t.html('intro.ok'),
+               buttonCallback: advance
+             });
+             context.map().on('move.intro drawn.intro', function () {
+               var padding = 200 * Math.pow(2, context.map().zoom() - 18);
+               var box = pad(deleteLinesLoc, padding, context);
+               box.top -= 200;
+               box.height += 400;
+               reveal(box, helpHtml('intro.lines.delete_lines', {
+                 street: _t('intro.graph.name.12th-avenue')
+               }), {
+                 duration: 0,
+                 buttonText: _t.html('intro.ok'),
+                 buttonCallback: advance
+               });
+             });
+             context.history().on('change.intro', function () {
+               timeout(function () {
+                 continueTo(deleteLines);
+               }, 500); // after any transition (e.g. if user deleted intersection)
+             });
+           }, msec + 100);
+
+           function continueTo(nextStep) {
+             context.map().on('move.intro drawn.intro', null);
+             context.history().on('change.intro', null);
+             nextStep();
+           }
+         }
+
+         function rightClickIntersection() {
+           context.history().reset('doneUpdateLine');
+           context.enter(modeBrowse(context));
+           context.map().centerZoomEase(eleventhAvenueEnd, 18, 500);
+           var rightClickString = helpHtml('intro.lines.split_street', {
+             street1: _t('intro.graph.name.11th-avenue'),
+             street2: _t('intro.graph.name.washington-street')
+           }) + helpHtml('intro.lines.' + (context.lastPointerType() === 'mouse' ? 'rightclick_intersection' : 'edit_menu_intersection_touch'));
+           timeout(function () {
+             var padding = 60 * Math.pow(2, context.map().zoom() - 18);
+             var box = pad(eleventhAvenueEnd, padding, context);
+             reveal(box, rightClickString);
+             context.map().on('move.intro drawn.intro', function () {
+               var padding = 60 * Math.pow(2, context.map().zoom() - 18);
+               var box = pad(eleventhAvenueEnd, padding, context);
+               reveal(box, rightClickString, {
+                 duration: 0
+               });
+             });
+             context.on('enter.intro', function (mode) {
+               if (mode.id !== 'select') return;
+               var ids = context.selectedIDs();
+               if (ids.length !== 1 || ids[0] !== eleventhAvenueEndID) return;
+               timeout(function () {
+                 var node = selectMenuItem(context, 'split').node();
+                 if (!node) return;
+                 continueTo(splitIntersection);
+               }, 50); // after menu visible
+             });
+             context.history().on('change.intro', function () {
+               timeout(function () {
+                 continueTo(deleteLines);
+               }, 300); // after any transition (e.g. if user deleted intersection)
+             });
+           }, 600);
+
+           function continueTo(nextStep) {
+             context.map().on('move.intro drawn.intro', null);
+             context.on('enter.intro', null);
+             context.history().on('change.intro', null);
+             nextStep();
+           }
+         }
+
+         function splitIntersection() {
+           if (!context.hasEntity(washingtonStreetID) || !context.hasEntity(twelfthAvenueID) || !context.hasEntity(eleventhAvenueEndID)) {
+             return continueTo(deleteLines);
+           }
+
+           var node = selectMenuItem(context, 'split').node();
+
+           if (!node) {
+             return continueTo(rightClickIntersection);
+           }
+
+           var wasChanged = false;
+           _washingtonSegmentID = null;
+           reveal('.edit-menu', helpHtml('intro.lines.split_intersection', {
+             street: _t('intro.graph.name.washington-street')
+           }), {
+             padding: 50
+           });
+           context.map().on('move.intro drawn.intro', function () {
+             var node = selectMenuItem(context, 'split').node();
+
+             if (!wasChanged && !node) {
+               return continueTo(rightClickIntersection);
+             }
+
+             reveal('.edit-menu', helpHtml('intro.lines.split_intersection', {
+               street: _t('intro.graph.name.washington-street')
+             }), {
+               duration: 0,
+               padding: 50
+             });
+           });
+           context.history().on('change.intro', function (changed) {
+             wasChanged = true;
+             timeout(function () {
+               if (context.history().undoAnnotation() === _t('operations.split.annotation.line', {
+                 n: 1
+               })) {
+                 _washingtonSegmentID = changed.created()[0].id;
+                 continueTo(didSplit);
+               } else {
+                 _washingtonSegmentID = null;
+                 continueTo(retrySplit);
+               }
+             }, 300); // after any transition (e.g. if user deleted intersection)
+           });
+
+           function continueTo(nextStep) {
+             context.map().on('move.intro drawn.intro', null);
+             context.history().on('change.intro', null);
+             nextStep();
+           }
+         }
+
+         function retrySplit() {
+           context.enter(modeBrowse(context));
+           context.map().centerZoomEase(eleventhAvenueEnd, 18, 500);
+
+           var advance = function advance() {
+             continueTo(rightClickIntersection);
+           };
+
+           var padding = 60 * Math.pow(2, context.map().zoom() - 18);
+           var box = pad(eleventhAvenueEnd, padding, context);
+           reveal(box, helpHtml('intro.lines.retry_split'), {
+             buttonText: _t.html('intro.ok'),
+             buttonCallback: advance
+           });
+           context.map().on('move.intro drawn.intro', function () {
+             var padding = 60 * Math.pow(2, context.map().zoom() - 18);
+             var box = pad(eleventhAvenueEnd, padding, context);
+             reveal(box, helpHtml('intro.lines.retry_split'), {
+               duration: 0,
+               buttonText: _t.html('intro.ok'),
+               buttonCallback: advance
+             });
+           });
+
+           function continueTo(nextStep) {
+             context.map().on('move.intro drawn.intro', null);
+             nextStep();
+           }
+         }
+
+         function didSplit() {
+           if (!_washingtonSegmentID || !context.hasEntity(_washingtonSegmentID) || !context.hasEntity(washingtonStreetID) || !context.hasEntity(twelfthAvenueID) || !context.hasEntity(eleventhAvenueEndID)) {
+             return continueTo(rightClickIntersection);
+           }
+
+           var ids = context.selectedIDs();
+           var string = 'intro.lines.did_split_' + (ids.length > 1 ? 'multi' : 'single');
+           var street = _t('intro.graph.name.washington-street');
+           var padding = 200 * Math.pow(2, context.map().zoom() - 18);
+           var box = pad(twelfthAvenue, padding, context);
+           box.width = box.width / 2;
+           reveal(box, helpHtml(string, {
+             street1: street,
+             street2: street
+           }), {
+             duration: 500
+           });
+           timeout(function () {
+             context.map().centerZoomEase(twelfthAvenue, 18, 500);
+             context.map().on('move.intro drawn.intro', function () {
+               var padding = 200 * Math.pow(2, context.map().zoom() - 18);
+               var box = pad(twelfthAvenue, padding, context);
+               box.width = box.width / 2;
+               reveal(box, helpHtml(string, {
+                 street1: street,
+                 street2: street
+               }), {
+                 duration: 0
+               });
+             });
+           }, 600); // after initial reveal and curtain cut
+
+           context.on('enter.intro', function () {
+             var ids = context.selectedIDs();
+
+             if (ids.length === 1 && ids[0] === _washingtonSegmentID) {
+               continueTo(multiSelect);
+             }
+           });
+           context.history().on('change.intro', function () {
+             if (!_washingtonSegmentID || !context.hasEntity(_washingtonSegmentID) || !context.hasEntity(washingtonStreetID) || !context.hasEntity(twelfthAvenueID) || !context.hasEntity(eleventhAvenueEndID)) {
+               return continueTo(rightClickIntersection);
+             }
+           });
+
+           function continueTo(nextStep) {
+             context.map().on('move.intro drawn.intro', null);
+             context.on('enter.intro', null);
+             context.history().on('change.intro', null);
+             nextStep();
+           }
+         }
+
+         function multiSelect() {
+           if (!_washingtonSegmentID || !context.hasEntity(_washingtonSegmentID) || !context.hasEntity(washingtonStreetID) || !context.hasEntity(twelfthAvenueID) || !context.hasEntity(eleventhAvenueEndID)) {
+             return continueTo(rightClickIntersection);
+           }
+
+           var ids = context.selectedIDs();
+           var hasWashington = ids.indexOf(_washingtonSegmentID) !== -1;
+           var hasTwelfth = ids.indexOf(twelfthAvenueID) !== -1;
+
+           if (hasWashington && hasTwelfth) {
+             return continueTo(multiRightClick);
+           } else if (!hasWashington && !hasTwelfth) {
+             return continueTo(didSplit);
+           }
+
+           context.map().centerZoomEase(twelfthAvenue, 18, 500);
+           timeout(function () {
+             var selected, other, padding, box;
+
+             if (hasWashington) {
+               selected = _t('intro.graph.name.washington-street');
+               other = _t('intro.graph.name.12th-avenue');
+               padding = 60 * Math.pow(2, context.map().zoom() - 18);
+               box = pad(twelfthAvenueEnd, padding, context);
+               box.width *= 3;
+             } else {
+               selected = _t('intro.graph.name.12th-avenue');
+               other = _t('intro.graph.name.washington-street');
+               padding = 200 * Math.pow(2, context.map().zoom() - 18);
+               box = pad(twelfthAvenue, padding, context);
+               box.width /= 2;
+             }
+
+             reveal(box, helpHtml('intro.lines.multi_select', {
+               selected: selected,
+               other1: other
+             }) + ' ' + helpHtml('intro.lines.add_to_selection_' + (context.lastPointerType() === 'mouse' ? 'click' : 'touch'), {
+               selected: selected,
+               other2: other
+             }));
+             context.map().on('move.intro drawn.intro', function () {
+               if (hasWashington) {
+                 selected = _t('intro.graph.name.washington-street');
+                 other = _t('intro.graph.name.12th-avenue');
+                 padding = 60 * Math.pow(2, context.map().zoom() - 18);
+                 box = pad(twelfthAvenueEnd, padding, context);
+                 box.width *= 3;
+               } else {
+                 selected = _t('intro.graph.name.12th-avenue');
+                 other = _t('intro.graph.name.washington-street');
+                 padding = 200 * Math.pow(2, context.map().zoom() - 18);
+                 box = pad(twelfthAvenue, padding, context);
+                 box.width /= 2;
+               }
+
+               reveal(box, helpHtml('intro.lines.multi_select', {
+                 selected: selected,
+                 other1: other
+               }) + ' ' + helpHtml('intro.lines.add_to_selection_' + (context.lastPointerType() === 'mouse' ? 'click' : 'touch'), {
+                 selected: selected,
+                 other2: other
+               }), {
+                 duration: 0
+               });
+             });
+             context.on('enter.intro', function () {
+               continueTo(multiSelect);
+             });
+             context.history().on('change.intro', function () {
+               if (!_washingtonSegmentID || !context.hasEntity(_washingtonSegmentID) || !context.hasEntity(washingtonStreetID) || !context.hasEntity(twelfthAvenueID) || !context.hasEntity(eleventhAvenueEndID)) {
+                 return continueTo(rightClickIntersection);
+               }
+             });
+           }, 600);
+
+           function continueTo(nextStep) {
+             context.map().on('move.intro drawn.intro', null);
+             context.on('enter.intro', null);
+             context.history().on('change.intro', null);
+             nextStep();
+           }
+         }
+
+         function multiRightClick() {
+           if (!_washingtonSegmentID || !context.hasEntity(_washingtonSegmentID) || !context.hasEntity(washingtonStreetID) || !context.hasEntity(twelfthAvenueID) || !context.hasEntity(eleventhAvenueEndID)) {
+             return continueTo(rightClickIntersection);
+           }
+
+           var padding = 200 * Math.pow(2, context.map().zoom() - 18);
+           var box = pad(twelfthAvenue, padding, context);
+           var rightClickString = helpHtml('intro.lines.multi_select_success') + helpHtml('intro.lines.multi_' + (context.lastPointerType() === 'mouse' ? 'rightclick' : 'edit_menu_touch'));
+           reveal(box, rightClickString);
+           context.map().on('move.intro drawn.intro', function () {
+             var padding = 200 * Math.pow(2, context.map().zoom() - 18);
+             var box = pad(twelfthAvenue, padding, context);
+             reveal(box, rightClickString, {
+               duration: 0
+             });
+           });
+           context.ui().editMenu().on('toggled.intro', function (open) {
+             if (!open) return;
+             timeout(function () {
+               var ids = context.selectedIDs();
+
+               if (ids.length === 2 && ids.indexOf(twelfthAvenueID) !== -1 && ids.indexOf(_washingtonSegmentID) !== -1) {
+                 var node = selectMenuItem(context, 'delete').node();
+                 if (!node) return;
+                 continueTo(multiDelete);
+               } else if (ids.length === 1 && ids.indexOf(_washingtonSegmentID) !== -1) {
+                 return continueTo(multiSelect);
+               } else {
+                 return continueTo(didSplit);
+               }
+             }, 300); // after edit menu visible
+           });
+           context.history().on('change.intro', function () {
+             if (!_washingtonSegmentID || !context.hasEntity(_washingtonSegmentID) || !context.hasEntity(washingtonStreetID) || !context.hasEntity(twelfthAvenueID) || !context.hasEntity(eleventhAvenueEndID)) {
+               return continueTo(rightClickIntersection);
+             }
+           });
+
+           function continueTo(nextStep) {
+             context.map().on('move.intro drawn.intro', null);
+             context.ui().editMenu().on('toggled.intro', null);
+             context.history().on('change.intro', null);
+             nextStep();
+           }
+         }
+
+         function multiDelete() {
+           if (!_washingtonSegmentID || !context.hasEntity(_washingtonSegmentID) || !context.hasEntity(washingtonStreetID) || !context.hasEntity(twelfthAvenueID) || !context.hasEntity(eleventhAvenueEndID)) {
+             return continueTo(rightClickIntersection);
+           }
+
+           var node = selectMenuItem(context, 'delete').node();
+           if (!node) return continueTo(multiRightClick);
+           reveal('.edit-menu', helpHtml('intro.lines.multi_delete'), {
+             padding: 50
+           });
+           context.map().on('move.intro drawn.intro', function () {
+             reveal('.edit-menu', helpHtml('intro.lines.multi_delete'), {
+               duration: 0,
+               padding: 50
+             });
+           });
+           context.on('exit.intro', function () {
+             if (context.hasEntity(_washingtonSegmentID) || context.hasEntity(twelfthAvenueID)) {
+               return continueTo(multiSelect); // left select mode but roads still exist
+             }
+           });
+           context.history().on('change.intro', function () {
+             if (context.hasEntity(_washingtonSegmentID) || context.hasEntity(twelfthAvenueID)) {
+               continueTo(retryDelete); // changed something but roads still exist
+             } else {
+               continueTo(play);
+             }
+           });
+
+           function continueTo(nextStep) {
+             context.map().on('move.intro drawn.intro', null);
+             context.on('exit.intro', null);
+             context.history().on('change.intro', null);
+             nextStep();
+           }
+         }
+
+         function retryDelete() {
+           context.enter(modeBrowse(context));
+           var padding = 200 * Math.pow(2, context.map().zoom() - 18);
+           var box = pad(twelfthAvenue, padding, context);
+           reveal(box, helpHtml('intro.lines.retry_delete'), {
+             buttonText: _t.html('intro.ok'),
+             buttonCallback: function buttonCallback() {
+               continueTo(multiSelect);
+             }
+           });
+
+           function continueTo(nextStep) {
+             nextStep();
+           }
+         }
+
+         function play() {
+           dispatch.call('done');
+           reveal('.ideditor', helpHtml('intro.lines.play', {
+             next: _t('intro.buildings.title')
+           }), {
+             tooltipBox: '.intro-nav-wrap .chapter-building',
+             buttonText: _t.html('intro.ok'),
+             buttonCallback: function buttonCallback() {
+               reveal('.ideditor');
+             }
+           });
+         }
+
+         chapter.enter = function () {
+           addLine();
+         };
+
+         chapter.exit = function () {
+           timeouts.forEach(window.clearTimeout);
+           select(window).on('pointerdown.intro mousedown.intro', null, true);
+           context.on('enter.intro exit.intro', null);
+           context.map().on('move.intro drawn.intro', null);
+           context.history().on('change.intro', null);
+           context.container().select('.inspector-wrap').on('wheel.intro', null);
+           context.container().select('.preset-list-button').on('click.intro', null);
+         };
+
+         chapter.restart = function () {
+           chapter.exit();
+           chapter.enter();
+         };
+
+         return utilRebind(chapter, dispatch, 'on');
+       }
+
+       function uiIntroBuilding(context, reveal) {
+         var dispatch = dispatch$8('done');
+         var house = [-85.62815, 41.95638];
+         var tank = [-85.62732, 41.95347];
+         var buildingCatetory = _mainPresetIndex.item('category-building');
+         var housePreset = _mainPresetIndex.item('building/house');
+         var tankPreset = _mainPresetIndex.item('man_made/storage_tank');
+         var timeouts = [];
+         var _houseID = null;
+         var _tankID = null;
+         var chapter = {
+           title: 'intro.buildings.title'
+         };
+
+         function timeout(f, t) {
+           timeouts.push(window.setTimeout(f, t));
+         }
+
+         function eventCancel(d3_event) {
+           d3_event.stopPropagation();
+           d3_event.preventDefault();
+         }
+
+         function revealHouse(center, text, options) {
+           var padding = 160 * Math.pow(2, context.map().zoom() - 20);
+           var box = pad(center, padding, context);
+           reveal(box, text, options);
+         }
+
+         function revealTank(center, text, options) {
+           var padding = 190 * Math.pow(2, context.map().zoom() - 19.5);
+           var box = pad(center, padding, context);
+           reveal(box, text, options);
+         }
+
+         function addHouse() {
+           context.enter(modeBrowse(context));
+           context.history().reset('initial');
+           _houseID = null;
+           var msec = transitionTime(house, context.map().center());
+
+           if (msec) {
+             reveal(null, null, {
+               duration: 0
+             });
+           }
+
+           context.map().centerZoomEase(house, 19, msec);
+           timeout(function () {
+             var tooltip = reveal('button.add-area', helpHtml('intro.buildings.add_building'));
+             tooltip.selectAll('.popover-inner').insert('svg', 'span').attr('class', 'tooltip-illustration').append('use').attr('xlink:href', '#iD-graphic-buildings');
+             context.on('enter.intro', function (mode) {
+               if (mode.id !== 'add-area') return;
+               continueTo(startHouse);
+             });
+           }, msec + 100);
+
+           function continueTo(nextStep) {
+             context.on('enter.intro', null);
+             nextStep();
+           }
+         }
+
+         function startHouse() {
+           if (context.mode().id !== 'add-area') {
+             return continueTo(addHouse);
+           }
+
+           _houseID = null;
+           context.map().zoomEase(20, 500);
+           timeout(function () {
+             var startString = helpHtml('intro.buildings.start_building') + helpHtml('intro.buildings.building_corner_' + (context.lastPointerType() === 'mouse' ? 'click' : 'tap'));
+             revealHouse(house, startString);
+             context.map().on('move.intro drawn.intro', function () {
+               revealHouse(house, startString, {
+                 duration: 0
+               });
+             });
+             context.on('enter.intro', function (mode) {
+               if (mode.id !== 'draw-area') return chapter.restart();
+               continueTo(continueHouse);
+             });
+           }, 550); // after easing
+
+           function continueTo(nextStep) {
+             context.map().on('move.intro drawn.intro', null);
+             context.on('enter.intro', null);
+             nextStep();
+           }
+         }
+
+         function continueHouse() {
+           if (context.mode().id !== 'draw-area') {
+             return continueTo(addHouse);
+           }
+
+           _houseID = null;
+           var continueString = helpHtml('intro.buildings.continue_building') + '{br}' + helpHtml('intro.areas.finish_area_' + (context.lastPointerType() === 'mouse' ? 'click' : 'tap')) + helpHtml('intro.buildings.finish_building');
+           revealHouse(house, continueString);
+           context.map().on('move.intro drawn.intro', function () {
+             revealHouse(house, continueString, {
+               duration: 0
+             });
+           });
+           context.on('enter.intro', function (mode) {
+             if (mode.id === 'draw-area') {
+               return;
+             } else if (mode.id === 'select') {
+               var graph = context.graph();
+               var way = context.entity(context.selectedIDs()[0]);
+               var nodes = graph.childNodes(way);
+               var points = utilArrayUniq(nodes).map(function (n) {
+                 return context.projection(n.loc);
+               });
+
+               if (isMostlySquare(points)) {
+                 _houseID = way.id;
+                 return continueTo(chooseCategoryBuilding);
+               } else {
+                 return continueTo(retryHouse);
+               }
+             } else {
+               return chapter.restart();
+             }
+           });
+
+           function continueTo(nextStep) {
+             context.map().on('move.intro drawn.intro', null);
+             context.on('enter.intro', null);
+             nextStep();
+           }
+         }
+
+         function retryHouse() {
+           var onClick = function onClick() {
+             continueTo(addHouse);
+           };
+
+           revealHouse(house, helpHtml('intro.buildings.retry_building'), {
+             buttonText: _t.html('intro.ok'),
+             buttonCallback: onClick
+           });
+           context.map().on('move.intro drawn.intro', function () {
+             revealHouse(house, helpHtml('intro.buildings.retry_building'), {
+               duration: 0,
+               buttonText: _t.html('intro.ok'),
+               buttonCallback: onClick
+             });
+           });
+
+           function continueTo(nextStep) {
+             context.map().on('move.intro drawn.intro', null);
+             nextStep();
+           }
+         }
+
+         function chooseCategoryBuilding() {
+           if (!_houseID || !context.hasEntity(_houseID)) {
+             return addHouse();
+           }
+
+           var ids = context.selectedIDs();
+
+           if (context.mode().id !== 'select' || !ids.length || ids[0] !== _houseID) {
+             context.enter(modeSelect(context, [_houseID]));
+           } // disallow scrolling
+
+
+           context.container().select('.inspector-wrap').on('wheel.intro', eventCancel);
+           timeout(function () {
+             // reset pane, in case user somehow happened to change it..
+             context.container().select('.inspector-wrap .panewrap').style('right', '-100%');
+             var button = context.container().select('.preset-category-building .preset-list-button');
+             reveal(button.node(), helpHtml('intro.buildings.choose_category_building', {
+               category: buildingCatetory.name()
+             }));
+             button.on('click.intro', function () {
+               button.on('click.intro', null);
+               continueTo(choosePresetHouse);
+             });
+           }, 400); // after preset list pane visible..
+
+           context.on('enter.intro', function (mode) {
+             if (!_houseID || !context.hasEntity(_houseID)) {
+               return continueTo(addHouse);
+             }
+
+             var ids = context.selectedIDs();
+
+             if (mode.id !== 'select' || !ids.length || ids[0] !== _houseID) {
+               return continueTo(chooseCategoryBuilding);
+             }
+           });
+
+           function continueTo(nextStep) {
+             context.container().select('.inspector-wrap').on('wheel.intro', null);
+             context.container().select('.preset-list-button').on('click.intro', null);
+             context.on('enter.intro', null);
+             nextStep();
+           }
+         }
+
+         function choosePresetHouse() {
+           if (!_houseID || !context.hasEntity(_houseID)) {
+             return addHouse();
+           }
+
+           var ids = context.selectedIDs();
+
+           if (context.mode().id !== 'select' || !ids.length || ids[0] !== _houseID) {
+             context.enter(modeSelect(context, [_houseID]));
+           } // disallow scrolling
+
+
+           context.container().select('.inspector-wrap').on('wheel.intro', eventCancel);
+           timeout(function () {
+             // reset pane, in case user somehow happened to change it..
+             context.container().select('.inspector-wrap .panewrap').style('right', '-100%');
+             var button = context.container().select('.preset-building-house .preset-list-button');
+             reveal(button.node(), helpHtml('intro.buildings.choose_preset_house', {
+               preset: housePreset.name()
+             }), {
+               duration: 300
+             });
+             button.on('click.intro', function () {
+               button.on('click.intro', null);
+               continueTo(closeEditorHouse);
+             });
+           }, 400); // after preset list pane visible..
+
+           context.on('enter.intro', function (mode) {
+             if (!_houseID || !context.hasEntity(_houseID)) {
+               return continueTo(addHouse);
+             }
+
+             var ids = context.selectedIDs();
+
+             if (mode.id !== 'select' || !ids.length || ids[0] !== _houseID) {
+               return continueTo(chooseCategoryBuilding);
+             }
+           });
+
+           function continueTo(nextStep) {
+             context.container().select('.inspector-wrap').on('wheel.intro', null);
+             context.container().select('.preset-list-button').on('click.intro', null);
+             context.on('enter.intro', null);
+             nextStep();
+           }
+         }
+
+         function closeEditorHouse() {
+           if (!_houseID || !context.hasEntity(_houseID)) {
+             return addHouse();
+           }
+
+           var ids = context.selectedIDs();
+
+           if (context.mode().id !== 'select' || !ids.length || ids[0] !== _houseID) {
+             context.enter(modeSelect(context, [_houseID]));
+           }
+
+           context.history().checkpoint('hasHouse');
+           context.on('exit.intro', function () {
+             continueTo(rightClickHouse);
+           });
+           timeout(function () {
+             reveal('.entity-editor-pane', helpHtml('intro.buildings.close', {
+               button: {
+                 html: icon('#iD-icon-close', 'inline')
+               }
+             }));
+           }, 500);
+
+           function continueTo(nextStep) {
+             context.on('exit.intro', null);
+             nextStep();
+           }
+         }
+
+         function rightClickHouse() {
+           if (!_houseID) return chapter.restart();
+           context.enter(modeBrowse(context));
+           context.history().reset('hasHouse');
+           var zoom = context.map().zoom();
+
+           if (zoom < 20) {
+             zoom = 20;
+           }
+
+           context.map().centerZoomEase(house, zoom, 500);
+           context.on('enter.intro', function (mode) {
+             if (mode.id !== 'select') return;
+             var ids = context.selectedIDs();
+             if (ids.length !== 1 || ids[0] !== _houseID) return;
+             timeout(function () {
+               var node = selectMenuItem(context, 'orthogonalize').node();
+               if (!node) return;
+               continueTo(clickSquare);
+             }, 50); // after menu visible
+           });
+           context.map().on('move.intro drawn.intro', function () {
+             var rightclickString = helpHtml('intro.buildings.' + (context.lastPointerType() === 'mouse' ? 'rightclick_building' : 'edit_menu_building_touch'));
+             revealHouse(house, rightclickString, {
+               duration: 0
+             });
+           });
+           context.history().on('change.intro', function () {
+             continueTo(rightClickHouse);
+           });
+
+           function continueTo(nextStep) {
+             context.on('enter.intro', null);
+             context.map().on('move.intro drawn.intro', null);
+             context.history().on('change.intro', null);
+             nextStep();
+           }
+         }
+
+         function clickSquare() {
+           if (!_houseID) return chapter.restart();
+           var entity = context.hasEntity(_houseID);
+           if (!entity) return continueTo(rightClickHouse);
+           var node = selectMenuItem(context, 'orthogonalize').node();
+
+           if (!node) {
+             return continueTo(rightClickHouse);
+           }
+
+           var wasChanged = false;
+           reveal('.edit-menu', helpHtml('intro.buildings.square_building'), {
+             padding: 50
+           });
+           context.on('enter.intro', function (mode) {
+             if (mode.id === 'browse') {
+               continueTo(rightClickHouse);
+             } else if (mode.id === 'move' || mode.id === 'rotate') {
+               continueTo(retryClickSquare);
+             }
+           });
+           context.map().on('move.intro', function () {
+             var node = selectMenuItem(context, 'orthogonalize').node();
+
+             if (!wasChanged && !node) {
+               return continueTo(rightClickHouse);
+             }
+
+             reveal('.edit-menu', helpHtml('intro.buildings.square_building'), {
+               duration: 0,
+               padding: 50
+             });
+           });
+           context.history().on('change.intro', function () {
+             wasChanged = true;
+             context.history().on('change.intro', null); // Something changed.  Wait for transition to complete and check undo annotation.
+
+             timeout(function () {
+               if (context.history().undoAnnotation() === _t('operations.orthogonalize.annotation.feature', {
+                 n: 1
+               })) {
+                 continueTo(doneSquare);
+               } else {
+                 continueTo(retryClickSquare);
+               }
+             }, 500); // after transitioned actions
+           });
+
+           function continueTo(nextStep) {
+             context.on('enter.intro', null);
+             context.map().on('move.intro', null);
+             context.history().on('change.intro', null);
+             nextStep();
+           }
+         }
+
+         function retryClickSquare() {
+           context.enter(modeBrowse(context));
+           revealHouse(house, helpHtml('intro.buildings.retry_square'), {
+             buttonText: _t.html('intro.ok'),
+             buttonCallback: function buttonCallback() {
+               continueTo(rightClickHouse);
+             }
+           });
+
+           function continueTo(nextStep) {
+             nextStep();
+           }
+         }
+
+         function doneSquare() {
+           context.history().checkpoint('doneSquare');
+           revealHouse(house, helpHtml('intro.buildings.done_square'), {
+             buttonText: _t.html('intro.ok'),
+             buttonCallback: function buttonCallback() {
+               continueTo(addTank);
+             }
+           });
+
+           function continueTo(nextStep) {
+             nextStep();
+           }
+         }
+
+         function addTank() {
+           context.enter(modeBrowse(context));
+           context.history().reset('doneSquare');
+           _tankID = null;
+           var msec = transitionTime(tank, context.map().center());
+
+           if (msec) {
+             reveal(null, null, {
+               duration: 0
+             });
+           }
+
+           context.map().centerZoomEase(tank, 19.5, msec);
+           timeout(function () {
+             reveal('button.add-area', helpHtml('intro.buildings.add_tank'));
+             context.on('enter.intro', function (mode) {
+               if (mode.id !== 'add-area') return;
+               continueTo(startTank);
+             });
+           }, msec + 100);
+
+           function continueTo(nextStep) {
+             context.on('enter.intro', null);
+             nextStep();
+           }
+         }
+
+         function startTank() {
+           if (context.mode().id !== 'add-area') {
+             return continueTo(addTank);
+           }
+
+           _tankID = null;
+           timeout(function () {
+             var startString = helpHtml('intro.buildings.start_tank') + helpHtml('intro.buildings.tank_edge_' + (context.lastPointerType() === 'mouse' ? 'click' : 'tap'));
+             revealTank(tank, startString);
+             context.map().on('move.intro drawn.intro', function () {
+               revealTank(tank, startString, {
+                 duration: 0
+               });
+             });
+             context.on('enter.intro', function (mode) {
+               if (mode.id !== 'draw-area') return chapter.restart();
+               continueTo(continueTank);
+             });
+           }, 550); // after easing
+
+           function continueTo(nextStep) {
+             context.map().on('move.intro drawn.intro', null);
+             context.on('enter.intro', null);
+             nextStep();
+           }
+         }
+
+         function continueTank() {
+           if (context.mode().id !== 'draw-area') {
+             return continueTo(addTank);
+           }
+
+           _tankID = null;
+           var continueString = helpHtml('intro.buildings.continue_tank') + '{br}' + helpHtml('intro.areas.finish_area_' + (context.lastPointerType() === 'mouse' ? 'click' : 'tap')) + helpHtml('intro.buildings.finish_tank');
+           revealTank(tank, continueString);
+           context.map().on('move.intro drawn.intro', function () {
+             revealTank(tank, continueString, {
+               duration: 0
+             });
+           });
+           context.on('enter.intro', function (mode) {
+             if (mode.id === 'draw-area') {
+               return;
+             } else if (mode.id === 'select') {
+               _tankID = context.selectedIDs()[0];
+               return continueTo(searchPresetTank);
+             } else {
+               return continueTo(addTank);
+             }
+           });
+
+           function continueTo(nextStep) {
+             context.map().on('move.intro drawn.intro', null);
+             context.on('enter.intro', null);
+             nextStep();
+           }
+         }
+
+         function searchPresetTank() {
+           if (!_tankID || !context.hasEntity(_tankID)) {
+             return addTank();
+           }
+
+           var ids = context.selectedIDs();
+
+           if (context.mode().id !== 'select' || !ids.length || ids[0] !== _tankID) {
+             context.enter(modeSelect(context, [_tankID]));
+           } // disallow scrolling
+
+
+           context.container().select('.inspector-wrap').on('wheel.intro', eventCancel);
+           timeout(function () {
+             // reset pane, in case user somehow happened to change it..
+             context.container().select('.inspector-wrap .panewrap').style('right', '-100%');
+             context.container().select('.preset-search-input').on('keydown.intro', null).on('keyup.intro', checkPresetSearch);
+             reveal('.preset-search-input', helpHtml('intro.buildings.search_tank', {
+               preset: tankPreset.name()
+             }));
+           }, 400); // after preset list pane visible..
+
+           context.on('enter.intro', function (mode) {
+             if (!_tankID || !context.hasEntity(_tankID)) {
+               return continueTo(addTank);
+             }
+
+             var ids = context.selectedIDs();
+
+             if (mode.id !== 'select' || !ids.length || ids[0] !== _tankID) {
+               // keep the user's area selected..
+               context.enter(modeSelect(context, [_tankID])); // reset pane, in case user somehow happened to change it..
+
+               context.container().select('.inspector-wrap .panewrap').style('right', '-100%'); // disallow scrolling
+
+               context.container().select('.inspector-wrap').on('wheel.intro', eventCancel);
+               context.container().select('.preset-search-input').on('keydown.intro', null).on('keyup.intro', checkPresetSearch);
+               reveal('.preset-search-input', helpHtml('intro.buildings.search_tank', {
+                 preset: tankPreset.name()
+               }));
+               context.history().on('change.intro', null);
+             }
+           });
+
+           function checkPresetSearch() {
+             var first = context.container().select('.preset-list-item:first-child');
+
+             if (first.classed('preset-man_made-storage_tank')) {
+               reveal(first.select('.preset-list-button').node(), helpHtml('intro.buildings.choose_tank', {
+                 preset: tankPreset.name()
+               }), {
+                 duration: 300
+               });
+               context.container().select('.preset-search-input').on('keydown.intro', eventCancel, true).on('keyup.intro', null);
+               context.history().on('change.intro', function () {
+                 continueTo(closeEditorTank);
+               });
+             }
+           }
+
+           function continueTo(nextStep) {
+             context.container().select('.inspector-wrap').on('wheel.intro', null);
+             context.on('enter.intro', null);
+             context.history().on('change.intro', null);
+             context.container().select('.preset-search-input').on('keydown.intro keyup.intro', null);
+             nextStep();
+           }
+         }
+
+         function closeEditorTank() {
+           if (!_tankID || !context.hasEntity(_tankID)) {
+             return addTank();
+           }
+
+           var ids = context.selectedIDs();
+
+           if (context.mode().id !== 'select' || !ids.length || ids[0] !== _tankID) {
+             context.enter(modeSelect(context, [_tankID]));
+           }
+
+           context.history().checkpoint('hasTank');
+           context.on('exit.intro', function () {
+             continueTo(rightClickTank);
+           });
+           timeout(function () {
+             reveal('.entity-editor-pane', helpHtml('intro.buildings.close', {
+               button: {
+                 html: icon('#iD-icon-close', 'inline')
+               }
+             }));
+           }, 500);
+
+           function continueTo(nextStep) {
+             context.on('exit.intro', null);
+             nextStep();
+           }
+         }
+
+         function rightClickTank() {
+           if (!_tankID) return continueTo(addTank);
+           context.enter(modeBrowse(context));
+           context.history().reset('hasTank');
+           context.map().centerEase(tank, 500);
+           timeout(function () {
+             context.on('enter.intro', function (mode) {
+               if (mode.id !== 'select') return;
+               var ids = context.selectedIDs();
+               if (ids.length !== 1 || ids[0] !== _tankID) return;
+               timeout(function () {
+                 var node = selectMenuItem(context, 'circularize').node();
+                 if (!node) return;
+                 continueTo(clickCircle);
+               }, 50); // after menu visible
+             });
+             var rightclickString = helpHtml('intro.buildings.' + (context.lastPointerType() === 'mouse' ? 'rightclick_tank' : 'edit_menu_tank_touch'));
+             revealTank(tank, rightclickString);
+             context.map().on('move.intro drawn.intro', function () {
+               revealTank(tank, rightclickString, {
+                 duration: 0
+               });
+             });
+             context.history().on('change.intro', function () {
+               continueTo(rightClickTank);
+             });
+           }, 600);
+
+           function continueTo(nextStep) {
+             context.on('enter.intro', null);
+             context.map().on('move.intro drawn.intro', null);
+             context.history().on('change.intro', null);
+             nextStep();
+           }
+         }
+
+         function clickCircle() {
+           if (!_tankID) return chapter.restart();
+           var entity = context.hasEntity(_tankID);
+           if (!entity) return continueTo(rightClickTank);
+           var node = selectMenuItem(context, 'circularize').node();
+
+           if (!node) {
+             return continueTo(rightClickTank);
+           }
+
+           var wasChanged = false;
+           reveal('.edit-menu', helpHtml('intro.buildings.circle_tank'), {
+             padding: 50
+           });
+           context.on('enter.intro', function (mode) {
+             if (mode.id === 'browse') {
+               continueTo(rightClickTank);
+             } else if (mode.id === 'move' || mode.id === 'rotate') {
+               continueTo(retryClickCircle);
+             }
+           });
+           context.map().on('move.intro', function () {
+             var node = selectMenuItem(context, 'circularize').node();
+
+             if (!wasChanged && !node) {
+               return continueTo(rightClickTank);
+             }
+
+             reveal('.edit-menu', helpHtml('intro.buildings.circle_tank'), {
+               duration: 0,
+               padding: 50
+             });
+           });
+           context.history().on('change.intro', function () {
+             wasChanged = true;
+             context.history().on('change.intro', null); // Something changed.  Wait for transition to complete and check undo annotation.
+
+             timeout(function () {
+               if (context.history().undoAnnotation() === _t('operations.circularize.annotation.feature', {
+                 n: 1
+               })) {
+                 continueTo(play);
+               } else {
+                 continueTo(retryClickCircle);
+               }
+             }, 500); // after transitioned actions
+           });
+
+           function continueTo(nextStep) {
+             context.on('enter.intro', null);
+             context.map().on('move.intro', null);
+             context.history().on('change.intro', null);
+             nextStep();
+           }
+         }
+
+         function retryClickCircle() {
+           context.enter(modeBrowse(context));
+           revealTank(tank, helpHtml('intro.buildings.retry_circle'), {
+             buttonText: _t.html('intro.ok'),
+             buttonCallback: function buttonCallback() {
+               continueTo(rightClickTank);
+             }
+           });
+
+           function continueTo(nextStep) {
+             nextStep();
+           }
+         }
+
+         function play() {
+           dispatch.call('done');
+           reveal('.ideditor', helpHtml('intro.buildings.play', {
+             next: _t('intro.startediting.title')
+           }), {
+             tooltipBox: '.intro-nav-wrap .chapter-startEditing',
+             buttonText: _t.html('intro.ok'),
+             buttonCallback: function buttonCallback() {
+               reveal('.ideditor');
+             }
+           });
+         }
+
+         chapter.enter = function () {
+           addHouse();
+         };
+
+         chapter.exit = function () {
+           timeouts.forEach(window.clearTimeout);
+           context.on('enter.intro exit.intro', null);
+           context.map().on('move.intro drawn.intro', null);
+           context.history().on('change.intro', null);
+           context.container().select('.inspector-wrap').on('wheel.intro', null);
+           context.container().select('.preset-search-input').on('keydown.intro keyup.intro', null);
+           context.container().select('.more-fields .combobox-input').on('click.intro', null);
+         };
+
+         chapter.restart = function () {
+           chapter.exit();
+           chapter.enter();
+         };
+
+         return utilRebind(chapter, dispatch, 'on');
+       }
+
+       function uiIntroStartEditing(context, reveal) {
+         var dispatch = dispatch$8('done', 'startEditing');
+         var modalSelection = select(null);
+         var chapter = {
+           title: 'intro.startediting.title'
+         };
+
+         function showHelp() {
+           reveal('.map-control.help-control', helpHtml('intro.startediting.help'), {
+             buttonText: _t.html('intro.ok'),
+             buttonCallback: function buttonCallback() {
+               shortcuts();
+             }
+           });
+         }
+
+         function shortcuts() {
+           reveal('.map-control.help-control', helpHtml('intro.startediting.shortcuts'), {
+             buttonText: _t.html('intro.ok'),
+             buttonCallback: function buttonCallback() {
+               showSave();
+             }
+           });
+         }
+
+         function showSave() {
+           context.container().selectAll('.shaded').remove(); // in case user opened keyboard shortcuts
+
+           reveal('.top-toolbar button.save', helpHtml('intro.startediting.save'), {
+             buttonText: _t.html('intro.ok'),
+             buttonCallback: function buttonCallback() {
+               showStart();
+             }
+           });
+         }
+
+         function showStart() {
+           context.container().selectAll('.shaded').remove(); // in case user opened keyboard shortcuts
+
+           modalSelection = uiModal(context.container());
+           modalSelection.select('.modal').attr('class', 'modal-splash modal');
+           modalSelection.selectAll('.close').remove();
+           var startbutton = modalSelection.select('.content').attr('class', 'fillL').append('button').attr('class', 'modal-section huge-modal-button').on('click', function () {
+             modalSelection.remove();
+           });
+           startbutton.append('svg').attr('class', 'illustration').append('use').attr('xlink:href', '#iD-logo-walkthrough');
+           startbutton.append('h2').call(_t.append('intro.startediting.start'));
+           dispatch.call('startEditing');
+         }
+
+         chapter.enter = function () {
+           showHelp();
+         };
+
+         chapter.exit = function () {
+           modalSelection.remove();
+           context.container().selectAll('.shaded').remove(); // in case user opened keyboard shortcuts
+         };
+
+         return utilRebind(chapter, dispatch, 'on');
+       }
+
+       var chapterUi = {
+         welcome: uiIntroWelcome,
+         navigation: uiIntroNavigation,
+         point: uiIntroPoint,
+         area: uiIntroArea,
+         line: uiIntroLine,
+         building: uiIntroBuilding,
+         startEditing: uiIntroStartEditing
+       };
+       var chapterFlow = ['welcome', 'navigation', 'point', 'area', 'line', 'building', 'startEditing'];
+       function uiIntro(context) {
+         var INTRO_IMAGERY = 'EsriWorldImageryClarity';
+         var _introGraph = {};
+
+         var _currChapter;
+
+         function intro(selection) {
+           _mainFileFetcher.get('intro_graph').then(function (dataIntroGraph) {
+             // create entities for intro graph and localize names
+             for (var id in dataIntroGraph) {
+               if (!_introGraph[id]) {
+                 _introGraph[id] = osmEntity(localize(dataIntroGraph[id]));
+               }
+             }
+
+             selection.call(startIntro);
+           })["catch"](function () {
+             /* ignore */
+           });
+         }
+
+         function startIntro(selection) {
+           context.enter(modeBrowse(context)); // Save current map state
+
+           var osm = context.connection();
+           var history = context.history().toJSON();
+           var hash = window.location.hash;
+           var center = context.map().center();
+           var zoom = context.map().zoom();
+           var background = context.background().baseLayerSource();
+           var overlays = context.background().overlayLayerSources();
+           var opacity = context.container().selectAll('.main-map .layer-background').style('opacity');
+           var caches = osm && osm.caches();
+           var baseEntities = context.history().graph().base().entities; // Show sidebar and disable the sidebar resizing button
+           // (this needs to be before `context.inIntro(true)`)
+
+           context.ui().sidebar.expand();
+           context.container().selectAll('button.sidebar-toggle').classed('disabled', true); // Block saving
+
+           context.inIntro(true); // Load semi-real data used in intro
+
+           if (osm) {
+             osm.toggle(false).reset();
+           }
+
+           context.history().reset();
+           context.history().merge(Object.values(coreGraph().load(_introGraph).entities));
+           context.history().checkpoint('initial'); // Setup imagery
+
+           var imagery = context.background().findSource(INTRO_IMAGERY);
+
+           if (imagery) {
+             context.background().baseLayerSource(imagery);
+           } else {
+             context.background().bing();
+           }
+
+           overlays.forEach(function (d) {
+             return context.background().toggleOverlayLayer(d);
+           }); // Setup data layers (only OSM)
+
+           var layers = context.layers();
+           layers.all().forEach(function (item) {
+             // if the layer has the function `enabled`
+             if (typeof item.layer.enabled === 'function') {
+               item.layer.enabled(item.id === 'osm');
+             }
+           });
+           context.container().selectAll('.main-map .layer-background').style('opacity', 1);
+           var curtain = uiCurtain(context.container().node());
+           selection.call(curtain); // Store that the user started the walkthrough..
+
+           corePreferences('walkthrough_started', 'yes'); // Restore previous walkthrough progress..
+
+           var storedProgress = corePreferences('walkthrough_progress') || '';
+           var progress = storedProgress.split(';').filter(Boolean);
+           var chapters = chapterFlow.map(function (chapter, i) {
+             var s = chapterUi[chapter](context, curtain.reveal).on('done', function () {
+               buttons.filter(function (d) {
+                 return d.title === s.title;
+               }).classed('finished', true);
+
+               if (i < chapterFlow.length - 1) {
+                 var next = chapterFlow[i + 1];
+                 context.container().select("button.chapter-".concat(next)).classed('next', true);
+               } // Store walkthrough progress..
+
+
+               progress.push(chapter);
+               corePreferences('walkthrough_progress', utilArrayUniq(progress).join(';'));
+             });
+             return s;
+           });
+           chapters[chapters.length - 1].on('startEditing', function () {
+             // Store walkthrough progress..
+             progress.push('startEditing');
+             corePreferences('walkthrough_progress', utilArrayUniq(progress).join(';')); // Store if walkthrough is completed..
+
+             var incomplete = utilArrayDifference(chapterFlow, progress);
+
+             if (!incomplete.length) {
+               corePreferences('walkthrough_completed', 'yes');
+             }
+
+             curtain.remove();
+             navwrap.remove();
+             context.container().selectAll('.main-map .layer-background').style('opacity', opacity);
+             context.container().selectAll('button.sidebar-toggle').classed('disabled', false);
+
+             if (osm) {
+               osm.toggle(true).reset().caches(caches);
+             }
+
+             context.history().reset().merge(Object.values(baseEntities));
+             context.background().baseLayerSource(background);
+             overlays.forEach(function (d) {
+               return context.background().toggleOverlayLayer(d);
+             });
+
+             if (history) {
+               context.history().fromJSON(history, false);
+             }
+
+             context.map().centerZoom(center, zoom);
+             window.location.replace(hash);
+             context.inIntro(false);
+           });
+           var navwrap = selection.append('div').attr('class', 'intro-nav-wrap fillD');
+           navwrap.append('svg').attr('class', 'intro-nav-wrap-logo').append('use').attr('xlink:href', '#iD-logo-walkthrough');
+           var buttonwrap = navwrap.append('div').attr('class', 'joined').selectAll('button.chapter');
+           var buttons = buttonwrap.data(chapters).enter().append('button').attr('class', function (d, i) {
+             return "chapter chapter-".concat(chapterFlow[i]);
+           }).on('click', enterChapter);
+           buttons.append('span').html(function (d) {
+             return _t.html(d.title);
+           });
+           buttons.append('span').attr('class', 'status').call(svgIcon(_mainLocalizer.textDirection() === 'rtl' ? '#iD-icon-backward' : '#iD-icon-forward', 'inline'));
+           enterChapter(null, chapters[0]);
+
+           function enterChapter(d3_event, newChapter) {
+             if (_currChapter) {
+               _currChapter.exit();
+             }
+
+             context.enter(modeBrowse(context));
+             _currChapter = newChapter;
+
+             _currChapter.enter();
+
+             buttons.classed('next', false).classed('active', function (d) {
+               return d.title === _currChapter.title;
+             });
+           }
+         }
+
+         return intro;
+       }
+
+       function uiIssuesInfo(context) {
+         var warningsItem = {
+           id: 'warnings',
+           count: 0,
+           iconID: 'iD-icon-alert',
+           descriptionID: 'issues.warnings_and_errors'
+         };
+         var resolvedItem = {
+           id: 'resolved',
+           count: 0,
+           iconID: 'iD-icon-apply',
+           descriptionID: 'issues.user_resolved_issues'
+         };
+
+         function update(selection) {
+           var shownItems = [];
+           var liveIssues = context.validator().getIssues({
+             what: corePreferences('validate-what') || 'edited',
+             where: corePreferences('validate-where') || 'all'
+           });
+
+           if (liveIssues.length) {
+             warningsItem.count = liveIssues.length;
+             shownItems.push(warningsItem);
+           }
+
+           if (corePreferences('validate-what') === 'all') {
+             var resolvedIssues = context.validator().getResolvedIssues();
+
+             if (resolvedIssues.length) {
+               resolvedItem.count = resolvedIssues.length;
+               shownItems.push(resolvedItem);
+             }
+           }
+
+           var chips = selection.selectAll('.chip').data(shownItems, function (d) {
+             return d.id;
+           });
+           chips.exit().remove();
+           var enter = chips.enter().append('a').attr('class', function (d) {
+             return 'chip ' + d.id + '-count';
+           }).attr('href', '#').each(function (d) {
+             var chipSelection = select(this);
+             var tooltipBehavior = uiTooltip().placement('top').title(_t.html(d.descriptionID));
+             chipSelection.call(tooltipBehavior).on('click', function (d3_event) {
+               d3_event.preventDefault();
+               tooltipBehavior.hide(select(this)); // open the Issues pane
+
+               context.ui().togglePanes(context.container().select('.map-panes .issues-pane'));
+             });
+             chipSelection.call(svgIcon('#' + d.iconID));
+           });
+           enter.append('span').attr('class', 'count');
+           enter.merge(chips).selectAll('span.count').text(function (d) {
+             return d.count.toString();
+           });
+         }
+
+         return function (selection) {
+           update(selection);
+           context.validator().on('validated.infobox', function () {
+             update(selection);
+           });
+         };
+       }
+
+       function uiMapInMap(context) {
+         function mapInMap(selection) {
+           var backgroundLayer = rendererTileLayer(context);
+           var overlayLayers = {};
+           var projection = geoRawMercator();
+           var dataLayer = svgData(projection, context).showLabels(false);
+           var debugLayer = svgDebug(projection, context);
+           var zoom = d3_zoom().scaleExtent([geoZoomToScale(0.5), geoZoomToScale(24)]).on('start', zoomStarted).on('zoom', zoomed).on('end', zoomEnded);
+           var wrap = select(null);
+           var tiles = select(null);
+           var viewport = select(null);
+           var _isTransformed = false;
+           var _isHidden = true;
+           var _skipEvents = false;
+           var _gesture = null;
+           var _zDiff = 6; // by default, minimap renders at (main zoom - 6)
+
+           var _dMini; // dimensions of minimap
+
+
+           var _cMini; // center pixel of minimap
+
+
+           var _tStart; // transform at start of gesture
+
+
+           var _tCurr; // transform at most recent event
+
+
+           var _timeoutID;
+
+           function zoomStarted() {
+             if (_skipEvents) return;
+             _tStart = _tCurr = projection.transform();
+             _gesture = null;
+           }
+
+           function zoomed(d3_event) {
+             if (_skipEvents) return;
+             var x = d3_event.transform.x;
+             var y = d3_event.transform.y;
+             var k = d3_event.transform.k;
+             var isZooming = k !== _tStart.k;
+             var isPanning = x !== _tStart.x || y !== _tStart.y;
+
+             if (!isZooming && !isPanning) {
+               return; // no change
+             } // lock in either zooming or panning, don't allow both in minimap.
+
+
+             if (!_gesture) {
+               _gesture = isZooming ? 'zoom' : 'pan';
+             }
+
+             var tMini = projection.transform();
+             var tX, tY, scale;
+
+             if (_gesture === 'zoom') {
+               scale = k / tMini.k;
+               tX = (_cMini[0] / scale - _cMini[0]) * scale;
+               tY = (_cMini[1] / scale - _cMini[1]) * scale;
+             } else {
+               k = tMini.k;
+               scale = 1;
+               tX = x - tMini.x;
+               tY = y - tMini.y;
+             }
+
+             utilSetTransform(tiles, tX, tY, scale);
+             utilSetTransform(viewport, 0, 0, scale);
+             _isTransformed = true;
+             _tCurr = identity$2.translate(x, y).scale(k);
+             var zMain = geoScaleToZoom(context.projection.scale());
+             var zMini = geoScaleToZoom(k);
+             _zDiff = zMain - zMini;
+             queueRedraw();
+           }
+
+           function zoomEnded() {
+             if (_skipEvents) return;
+             if (_gesture !== 'pan') return;
+             updateProjection();
+             _gesture = null;
+             context.map().center(projection.invert(_cMini)); // recenter main map..
+           }
+
+           function updateProjection() {
+             var loc = context.map().center();
+             var tMain = context.projection.transform();
+             var zMain = geoScaleToZoom(tMain.k);
+             var zMini = Math.max(zMain - _zDiff, 0.5);
+             var kMini = geoZoomToScale(zMini);
+             projection.translate([tMain.x, tMain.y]).scale(kMini);
+             var point = projection(loc);
+             var mouse = _gesture === 'pan' ? geoVecSubtract([_tCurr.x, _tCurr.y], [_tStart.x, _tStart.y]) : [0, 0];
+             var xMini = _cMini[0] - point[0] + tMain.x + mouse[0];
+             var yMini = _cMini[1] - point[1] + tMain.y + mouse[1];
+             projection.translate([xMini, yMini]).clipExtent([[0, 0], _dMini]);
+             _tCurr = projection.transform();
+
+             if (_isTransformed) {
+               utilSetTransform(tiles, 0, 0);
+               utilSetTransform(viewport, 0, 0);
+               _isTransformed = false;
+             }
+
+             zoom.scaleExtent([geoZoomToScale(0.5), geoZoomToScale(zMain - 3)]);
+             _skipEvents = true;
+             wrap.call(zoom.transform, _tCurr);
+             _skipEvents = false;
+           }
+
+           function redraw() {
+             clearTimeout(_timeoutID);
+             if (_isHidden) return;
+             updateProjection();
+             var zMini = geoScaleToZoom(projection.scale()); // setup tile container
+
+             tiles = wrap.selectAll('.map-in-map-tiles').data([0]);
+             tiles = tiles.enter().append('div').attr('class', 'map-in-map-tiles').merge(tiles); // redraw background
+
+             backgroundLayer.source(context.background().baseLayerSource()).projection(projection).dimensions(_dMini);
+             var background = tiles.selectAll('.map-in-map-background').data([0]);
+             background.enter().append('div').attr('class', 'map-in-map-background').merge(background).call(backgroundLayer); // redraw overlay
+
+             var overlaySources = context.background().overlayLayerSources();
+             var activeOverlayLayers = [];
+
+             for (var i = 0; i < overlaySources.length; i++) {
+               if (overlaySources[i].validZoom(zMini)) {
+                 if (!overlayLayers[i]) overlayLayers[i] = rendererTileLayer(context);
+                 activeOverlayLayers.push(overlayLayers[i].source(overlaySources[i]).projection(projection).dimensions(_dMini));
+               }
+             }
+
+             var overlay = tiles.selectAll('.map-in-map-overlay').data([0]);
+             overlay = overlay.enter().append('div').attr('class', 'map-in-map-overlay').merge(overlay);
+             var overlays = overlay.selectAll('div').data(activeOverlayLayers, function (d) {
+               return d.source().name();
+             });
+             overlays.exit().remove();
+             overlays = overlays.enter().append('div').merge(overlays).each(function (layer) {
+               select(this).call(layer);
+             });
+             var dataLayers = tiles.selectAll('.map-in-map-data').data([0]);
+             dataLayers.exit().remove();
+             dataLayers = dataLayers.enter().append('svg').attr('class', 'map-in-map-data').merge(dataLayers).call(dataLayer).call(debugLayer); // redraw viewport bounding box
+
+             if (_gesture !== 'pan') {
+               var getPath = d3_geoPath(projection);
+               var bbox = {
+                 type: 'Polygon',
+                 coordinates: [context.map().extent().polygon()]
+               };
+               viewport = wrap.selectAll('.map-in-map-viewport').data([0]);
+               viewport = viewport.enter().append('svg').attr('class', 'map-in-map-viewport').merge(viewport);
+               var path = viewport.selectAll('.map-in-map-bbox').data([bbox]);
+               path.enter().append('path').attr('class', 'map-in-map-bbox').merge(path).attr('d', getPath).classed('thick', function (d) {
+                 return getPath.area(d) < 30;
+               });
+             }
+           }
+
+           function queueRedraw() {
+             clearTimeout(_timeoutID);
+             _timeoutID = setTimeout(function () {
+               redraw();
+             }, 750);
+           }
+
+           function toggle(d3_event) {
+             if (d3_event) d3_event.preventDefault();
+             _isHidden = !_isHidden;
+             context.container().select('.minimap-toggle-item').classed('active', !_isHidden).select('input').property('checked', !_isHidden);
+
+             if (_isHidden) {
+               wrap.style('display', 'block').style('opacity', '1').transition().duration(200).style('opacity', '0').on('end', function () {
+                 selection.selectAll('.map-in-map').style('display', 'none');
+               });
+             } else {
+               wrap.style('display', 'block').style('opacity', '0').transition().duration(200).style('opacity', '1').on('end', function () {
+                 redraw();
+               });
+             }
+           }
+
+           uiMapInMap.toggle = toggle;
+           wrap = selection.selectAll('.map-in-map').data([0]);
+           wrap = wrap.enter().append('div').attr('class', 'map-in-map').style('display', _isHidden ? 'none' : 'block').call(zoom).on('dblclick.zoom', null).merge(wrap); // reflow warning: Hardcode dimensions - currently can't resize it anyway..
+
+           _dMini = [200, 150]; //utilGetDimensions(wrap);
+
+           _cMini = geoVecScale(_dMini, 0.5);
+           context.map().on('drawn.map-in-map', function (drawn) {
+             if (drawn.full === true) {
+               redraw();
+             }
+           });
+           redraw();
+           context.keybinding().on(_t('background.minimap.key'), toggle);
+         }
+
+         return mapInMap;
+       }
+
+       function uiNotice(context) {
+         return function (selection) {
+           var div = selection.append('div').attr('class', 'notice');
+           var button = div.append('button').attr('class', 'zoom-to notice fillD').on('click', function () {
+             context.map().zoomEase(context.minEditableZoom());
+           }).on('wheel', function (d3_event) {
+             // let wheel events pass through #4482
+             var e2 = new WheelEvent(d3_event.type, d3_event);
+             context.surface().node().dispatchEvent(e2);
+           });
+           button.call(svgIcon('#iD-icon-plus', 'pre-text')).append('span').attr('class', 'label').call(_t.append('zoom_in_edit'));
+
+           function disableTooHigh() {
+             var canEdit = context.map().zoom() >= context.minEditableZoom();
+             div.style('display', canEdit ? 'none' : 'block');
+           }
+
+           context.map().on('move.notice', debounce(disableTooHigh, 500));
+           disableTooHigh();
+         };
+       }
+
+       function uiPhotoviewer(context) {
+         var dispatch = dispatch$8('resize');
+
+         var _pointerPrefix = 'PointerEvent' in window ? 'pointer' : 'mouse';
+
+         function photoviewer(selection) {
+           selection.append('button').attr('class', 'thumb-hide').attr('title', _t('icons.close')).on('click', function () {
+             if (services.streetside) {
+               services.streetside.hideViewer(context);
+             }
+
+             if (services.mapillary) {
+               services.mapillary.hideViewer(context);
+             }
+
+             if (services.kartaview) {
+               services.kartaview.hideViewer(context);
+             }
+           }).append('div').call(svgIcon('#iD-icon-close'));
+
+           function preventDefault(d3_event) {
+             d3_event.preventDefault();
+           }
+
+           selection.append('button').attr('class', 'resize-handle-xy').on('touchstart touchdown touchend', preventDefault).on(_pointerPrefix + 'down', buildResizeListener(selection, 'resize', dispatch, {
+             resizeOnX: true,
+             resizeOnY: true
+           }));
+           selection.append('button').attr('class', 'resize-handle-x').on('touchstart touchdown touchend', preventDefault).on(_pointerPrefix + 'down', buildResizeListener(selection, 'resize', dispatch, {
+             resizeOnX: true
+           }));
+           selection.append('button').attr('class', 'resize-handle-y').on('touchstart touchdown touchend', preventDefault).on(_pointerPrefix + 'down', buildResizeListener(selection, 'resize', dispatch, {
+             resizeOnY: true
+           }));
+
+           function buildResizeListener(target, eventName, dispatch, options) {
+             var resizeOnX = !!options.resizeOnX;
+             var resizeOnY = !!options.resizeOnY;
+             var minHeight = options.minHeight || 240;
+             var minWidth = options.minWidth || 320;
+             var pointerId;
+             var startX;
+             var startY;
+             var startWidth;
+             var startHeight;
+
+             function startResize(d3_event) {
+               if (pointerId !== (d3_event.pointerId || 'mouse')) return;
+               d3_event.preventDefault();
+               d3_event.stopPropagation();
+               var mapSize = context.map().dimensions();
+
+               if (resizeOnX) {
+                 var maxWidth = mapSize[0];
+                 var newWidth = clamp(startWidth + d3_event.clientX - startX, minWidth, maxWidth);
+                 target.style('width', newWidth + 'px');
+               }
+
+               if (resizeOnY) {
+                 var maxHeight = mapSize[1] - 90; // preserve space at top/bottom of map
+
+                 var newHeight = clamp(startHeight + startY - d3_event.clientY, minHeight, maxHeight);
+                 target.style('height', newHeight + 'px');
+               }
+
+               dispatch.call(eventName, target, utilGetDimensions(target, true));
+             }
+
+             function clamp(num, min, max) {
+               return Math.max(min, Math.min(num, max));
+             }
+
+             function stopResize(d3_event) {
+               if (pointerId !== (d3_event.pointerId || 'mouse')) return;
+               d3_event.preventDefault();
+               d3_event.stopPropagation(); // remove all the listeners we added
+
+               select(window).on('.' + eventName, null);
+             }
+
+             return function initResize(d3_event) {
+               d3_event.preventDefault();
+               d3_event.stopPropagation();
+               pointerId = d3_event.pointerId || 'mouse';
+               startX = d3_event.clientX;
+               startY = d3_event.clientY;
+               var targetRect = target.node().getBoundingClientRect();
+               startWidth = targetRect.width;
+               startHeight = targetRect.height;
+               select(window).on(_pointerPrefix + 'move.' + eventName, startResize, false).on(_pointerPrefix + 'up.' + eventName, stopResize, false);
+
+               if (_pointerPrefix === 'pointer') {
+                 select(window).on('pointercancel.' + eventName, stopResize, false);
+               }
+             };
+           }
+         }
+
+         photoviewer.onMapResize = function () {
+           var photoviewer = context.container().select('.photoviewer');
+           var content = context.container().select('.main-content');
+           var mapDimensions = utilGetDimensions(content, true); // shrink photo viewer if it is too big
+           // (-90 preserves space at top and bottom of map used by menus)
+
+           var photoDimensions = utilGetDimensions(photoviewer, true);
+
+           if (photoDimensions[0] > mapDimensions[0] || photoDimensions[1] > mapDimensions[1] - 90) {
+             var setPhotoDimensions = [Math.min(photoDimensions[0], mapDimensions[0]), Math.min(photoDimensions[1], mapDimensions[1] - 90)];
+             photoviewer.style('width', setPhotoDimensions[0] + 'px').style('height', setPhotoDimensions[1] + 'px');
+             dispatch.call('resize', photoviewer, setPhotoDimensions);
+           }
+         };
+
+         return utilRebind(photoviewer, dispatch, 'on');
+       }
+
+       function uiRestore(context) {
+         return function (selection) {
+           if (!context.history().hasRestorableChanges()) return;
+           var modalSelection = uiModal(selection, true);
+           modalSelection.select('.modal').attr('class', 'modal fillL');
+           var introModal = modalSelection.select('.content');
+           introModal.append('div').attr('class', 'modal-section').append('h3').call(_t.append('restore.heading'));
+           introModal.append('div').attr('class', 'modal-section').append('p').call(_t.append('restore.description'));
+           var buttonWrap = introModal.append('div').attr('class', 'modal-actions');
+           var restore = buttonWrap.append('button').attr('class', 'restore').on('click', function () {
+             context.history().restore();
+             modalSelection.remove();
+           });
+           restore.append('svg').attr('class', 'logo logo-restore').append('use').attr('xlink:href', '#iD-logo-restore');
+           restore.append('div').call(_t.append('restore.restore'));
+           var reset = buttonWrap.append('button').attr('class', 'reset').on('click', function () {
+             context.history().clearSaved();
+             modalSelection.remove();
+           });
+           reset.append('svg').attr('class', 'logo logo-reset').append('use').attr('xlink:href', '#iD-logo-reset');
+           reset.append('div').call(_t.append('restore.reset'));
+           restore.node().focus();
+         };
+       }
+
+       function uiScale(context) {
+         var projection = context.projection,
+             isImperial = !_mainLocalizer.usesMetric(),
+             maxLength = 180,
+             tickHeight = 8;
+
+         function scaleDefs(loc1, loc2) {
+           var lat = (loc2[1] + loc1[1]) / 2,
+               conversion = isImperial ? 3.28084 : 1,
+               dist = geoLonToMeters(loc2[0] - loc1[0], lat) * conversion,
+               scale = {
+             dist: 0,
+             px: 0,
+             text: ''
+           },
+               buckets,
+               i,
+               val,
+               dLon;
+
+           if (isImperial) {
+             buckets = [5280000, 528000, 52800, 5280, 500, 50, 5, 1];
+           } else {
+             buckets = [5000000, 500000, 50000, 5000, 500, 50, 5, 1];
+           } // determine a user-friendly endpoint for the scale
+
+
+           for (i = 0; i < buckets.length; i++) {
+             val = buckets[i];
+
+             if (dist >= val) {
+               scale.dist = Math.floor(dist / val) * val;
+               break;
+             } else {
+               scale.dist = +dist.toFixed(2);
+             }
+           }
+
+           dLon = geoMetersToLon(scale.dist / conversion, lat);
+           scale.px = Math.round(projection([loc1[0] + dLon, loc1[1]])[0]);
+           scale.text = displayLength(scale.dist / conversion, isImperial);
+           return scale;
+         }
+
+         function update(selection) {
+           // choose loc1, loc2 along bottom of viewport (near where the scale will be drawn)
+           var dims = context.map().dimensions(),
+               loc1 = projection.invert([0, dims[1]]),
+               loc2 = projection.invert([maxLength, dims[1]]),
+               scale = scaleDefs(loc1, loc2);
+           selection.select('.scale-path').attr('d', 'M0.5,0.5v' + tickHeight + 'h' + scale.px + 'v-' + tickHeight);
+           selection.select('.scale-text').style(_mainLocalizer.textDirection() === 'ltr' ? 'left' : 'right', scale.px + 16 + 'px').text(scale.text);
+         }
+
+         return function (selection) {
+           function switchUnits() {
+             isImperial = !isImperial;
+             selection.call(update);
+           }
+
+           var scalegroup = selection.append('svg').attr('class', 'scale').on('click', switchUnits).append('g').attr('transform', 'translate(10,11)');
+           scalegroup.append('path').attr('class', 'scale-path');
+           selection.append('div').attr('class', 'scale-text');
+           selection.call(update);
+           context.map().on('move.scale', function () {
+             update(selection);
+           });
+         };
+       }
+
+       function uiShortcuts(context) {
+         var detected = utilDetect();
+         var _activeTab = 0;
+
+         var _modalSelection;
+
+         var _selection = select(null);
+
+         var _dataShortcuts;
+
+         function shortcutsModal(_modalSelection) {
+           _modalSelection.select('.modal').classed('modal-shortcuts', true);
+
+           var content = _modalSelection.select('.content');
+
+           content.append('div').attr('class', 'modal-section header').append('h2').call(_t.append('shortcuts.title'));
+           _mainFileFetcher.get('shortcuts').then(function (data) {
+             _dataShortcuts = data;
+             content.call(render);
+           })["catch"](function () {
+             /* ignore */
+           });
+         }
+
+         function render(selection) {
+           if (!_dataShortcuts) return;
+           var wrapper = selection.selectAll('.wrapper').data([0]);
+           var wrapperEnter = wrapper.enter().append('div').attr('class', 'wrapper modal-section');
+           var tabsBar = wrapperEnter.append('div').attr('class', 'tabs-bar');
+           var shortcutsList = wrapperEnter.append('div').attr('class', 'shortcuts-list');
+           wrapper = wrapper.merge(wrapperEnter);
+           var tabs = tabsBar.selectAll('.tab').data(_dataShortcuts);
+           var tabsEnter = tabs.enter().append('a').attr('class', 'tab').attr('href', '#').on('click', function (d3_event, d) {
+             d3_event.preventDefault();
+
+             var i = _dataShortcuts.indexOf(d);
+
+             _activeTab = i;
+             render(selection);
+           });
+           tabsEnter.append('span').html(function (d) {
+             return _t.html(d.text);
+           }); // Update
+
+           wrapper.selectAll('.tab').classed('active', function (d, i) {
+             return i === _activeTab;
+           });
+           var shortcuts = shortcutsList.selectAll('.shortcut-tab').data(_dataShortcuts);
+           var shortcutsEnter = shortcuts.enter().append('div').attr('class', function (d) {
+             return 'shortcut-tab shortcut-tab-' + d.tab;
+           });
+           var columnsEnter = shortcutsEnter.selectAll('.shortcut-column').data(function (d) {
+             return d.columns;
+           }).enter().append('table').attr('class', 'shortcut-column');
+           var rowsEnter = columnsEnter.selectAll('.shortcut-row').data(function (d) {
+             return d.rows;
+           }).enter().append('tr').attr('class', 'shortcut-row');
+           var sectionRows = rowsEnter.filter(function (d) {
+             return !d.shortcuts;
+           });
+           sectionRows.append('td');
+           sectionRows.append('td').attr('class', 'shortcut-section').append('h3').html(function (d) {
+             return _t.html(d.text);
+           });
+           var shortcutRows = rowsEnter.filter(function (d) {
+             return d.shortcuts;
+           });
+           var shortcutKeys = shortcutRows.append('td').attr('class', 'shortcut-keys');
+           var modifierKeys = shortcutKeys.filter(function (d) {
+             return d.modifiers;
+           });
+           modifierKeys.selectAll('kbd.modifier').data(function (d) {
+             if (detected.os === 'win' && d.text === 'shortcuts.editing.commands.redo') {
+               return ['⌘'];
+             } else if (detected.os !== 'mac' && d.text === 'shortcuts.browsing.display_options.fullscreen') {
+               return [];
+             } else {
+               return d.modifiers;
+             }
+           }).enter().each(function () {
+             var selection = select(this);
+             selection.append('kbd').attr('class', 'modifier').text(function (d) {
+               return uiCmd.display(d);
+             });
+             selection.append('span').text('+');
+           });
+           shortcutKeys.selectAll('kbd.shortcut').data(function (d) {
+             var arr = d.shortcuts;
+
+             if (detected.os === 'win' && d.text === 'shortcuts.editing.commands.redo') {
+               arr = ['Y'];
+             } else if (detected.os !== 'mac' && d.text === 'shortcuts.browsing.display_options.fullscreen') {
+               arr = ['F11'];
+             } // replace translations
+
+
+             arr = arr.map(function (s) {
+               return uiCmd.display(s.indexOf('.') !== -1 ? _t(s) : s);
+             });
+             return utilArrayUniq(arr).map(function (s) {
+               return {
+                 shortcut: s,
+                 separator: d.separator,
+                 suffix: d.suffix
+               };
+             });
+           }).enter().each(function (d, i, nodes) {
+             var selection = select(this);
+             var click = d.shortcut.toLowerCase().match(/(.*).click/);
+
+             if (click && click[1]) {
+               // replace "left_click", "right_click" with mouse icon
+               selection.call(svgIcon('#iD-walkthrough-mouse-' + click[1], 'operation'));
+             } else if (d.shortcut.toLowerCase() === 'long-press') {
+               selection.call(svgIcon('#iD-walkthrough-longpress', 'longpress operation'));
+             } else if (d.shortcut.toLowerCase() === 'tap') {
+               selection.call(svgIcon('#iD-walkthrough-tap', 'tap operation'));
+             } else {
+               selection.append('kbd').attr('class', 'shortcut').text(function (d) {
+                 return d.shortcut;
+               });
+             }
+
+             if (i < nodes.length - 1) {
+               selection.append('span').html(d.separator || "\xA0" + _t.html('shortcuts.or') + "\xA0");
+             } else if (i === nodes.length - 1 && d.suffix) {
+               selection.append('span').text(d.suffix);
+             }
+           });
+           shortcutKeys.filter(function (d) {
+             return d.gesture;
+           }).each(function () {
+             var selection = select(this);
+             selection.append('span').text('+');
+             selection.append('span').attr('class', 'gesture').html(function (d) {
+               return _t.html(d.gesture);
+             });
+           });
+           shortcutRows.append('td').attr('class', 'shortcut-desc').html(function (d) {
+             return d.text ? _t.html(d.text) : "\xA0";
+           }); // Update
+
+           wrapper.selectAll('.shortcut-tab').style('display', function (d, i) {
+             return i === _activeTab ? 'flex' : 'none';
+           });
+         }
+
+         return function (selection, show) {
+           _selection = selection;
+
+           if (show) {
+             _modalSelection = uiModal(selection);
+
+             _modalSelection.call(shortcutsModal);
+           } else {
+             context.keybinding().on([_t('shortcuts.toggle.key'), '?'], function () {
+               if (context.container().selectAll('.modal-shortcuts').size()) {
+                 // already showing
+                 if (_modalSelection) {
+                   _modalSelection.close();
+
+                   _modalSelection = null;
+                 }
+               } else {
+                 _modalSelection = uiModal(_selection);
+
+                 _modalSelection.call(shortcutsModal);
+               }
+             });
+           }
+         };
+       }
+
+       function uiDataHeader() {
+         var _datum;
+
+         function dataHeader(selection) {
+           var header = selection.selectAll('.data-header').data(_datum ? [_datum] : [], function (d) {
+             return d.__featurehash__;
+           });
+           header.exit().remove();
+           var headerEnter = header.enter().append('div').attr('class', 'data-header');
+           var iconEnter = headerEnter.append('div').attr('class', 'data-header-icon');
+           iconEnter.append('div').attr('class', 'preset-icon-28').call(svgIcon('#iD-icon-data', 'note-fill'));
+           headerEnter.append('div').attr('class', 'data-header-label').call(_t.append('map_data.layers.custom.title'));
+         }
+
+         dataHeader.datum = function (val) {
+           if (!arguments.length) return _datum;
+           _datum = val;
+           return this;
+         };
+
+         return dataHeader;
+       }
+
+       // It is keyed on the `value` of the entry. Data should be an array of objects like:
+       //   [{
+       //       value:   'string value',  // required
+       //       display: 'label html'     // optional
+       //       title:   'hover text'     // optional
+       //       terms:   ['search terms'] // optional
+       //   }, ...]
+
+       var _comboHideTimerID;
+
+       function uiCombobox(context, klass) {
+         var dispatch = dispatch$8('accept', 'cancel');
+         var container = context.container();
+         var _suggestions = [];
+         var _data = [];
+         var _fetched = {};
+         var _selected = null;
+         var _canAutocomplete = true;
+         var _caseSensitive = false;
+         var _cancelFetch = false;
+         var _minItems = 2;
+         var _tDown = 0;
+
+         var _mouseEnterHandler, _mouseLeaveHandler;
+
+         var _fetcher = function _fetcher(val, cb) {
+           cb(_data.filter(function (d) {
+             var terms = d.terms || [];
+             terms.push(d.value);
+             return terms.some(function (term) {
+               return term.toString().toLowerCase().indexOf(val.toLowerCase()) !== -1;
+             });
+           }));
+         };
+
+         var combobox = function combobox(input, attachTo) {
+           if (!input || input.empty()) return;
+           input.classed('combobox-input', true).on('focus.combo-input', focus).on('blur.combo-input', blur).on('keydown.combo-input', keydown).on('keyup.combo-input', keyup).on('input.combo-input', change).on('mousedown.combo-input', mousedown).each(function () {
+             var parent = this.parentNode;
+             var sibling = this.nextSibling;
+             select(parent).selectAll('.combobox-caret').filter(function (d) {
+               return d === input.node();
+             }).data([input.node()]).enter().insert('div', function () {
+               return sibling;
+             }).attr('class', 'combobox-caret').on('mousedown.combo-caret', function (d3_event) {
+               d3_event.preventDefault(); // don't steal focus from input
+
+               input.node().focus(); // focus the input as if it was clicked
+
+               mousedown(d3_event);
+             }).on('mouseup.combo-caret', function (d3_event) {
+               d3_event.preventDefault(); // don't steal focus from input
+
+               mouseup(d3_event);
+             });
+           });
+
+           function mousedown(d3_event) {
+             if (d3_event.button !== 0) return; // left click only
+
+             if (input.classed('disabled')) return;
+             _tDown = +new Date(); // clear selection
+
+             var start = input.property('selectionStart');
+             var end = input.property('selectionEnd');
+
+             if (start !== end) {
+               var val = utilGetSetValue(input);
+               input.node().setSelectionRange(val.length, val.length);
+               return;
+             }
+
+             input.on('mouseup.combo-input', mouseup);
+           }
+
+           function mouseup(d3_event) {
+             input.on('mouseup.combo-input', null);
+             if (d3_event.button !== 0) return; // left click only
+
+             if (input.classed('disabled')) return;
+             if (input.node() !== document.activeElement) return; // exit if this input is not focused
+
+             var start = input.property('selectionStart');
+             var end = input.property('selectionEnd');
+             if (start !== end) return; // exit if user is selecting
+             // not showing or showing for a different field - try to show it.
+
+             var combo = container.selectAll('.combobox');
+
+             if (combo.empty() || combo.datum() !== input.node()) {
+               var tOrig = _tDown;
+               window.setTimeout(function () {
+                 if (tOrig !== _tDown) return; // exit if user double clicked
+
+                 fetchComboData('', function () {
+                   show();
+                   render();
+                 });
+               }, 250);
+             } else {
+               hide();
+             }
+           }
+
+           function focus() {
+             fetchComboData(''); // prefetch values (may warm taginfo cache)
+           }
+
+           function blur() {
+             _comboHideTimerID = window.setTimeout(hide, 75);
+           }
+
+           function show() {
+             hide(); // remove any existing
+
+             container.insert('div', ':first-child').datum(input.node()).attr('class', 'combobox' + (klass ? ' combobox-' + klass : '')).style('position', 'absolute').style('display', 'block').style('left', '0px').on('mousedown.combo-container', function (d3_event) {
+               // prevent moving focus out of the input field
+               d3_event.preventDefault();
+             });
+             container.on('scroll.combo-scroll', render, true);
+           }
+
+           function hide() {
+             if (_comboHideTimerID) {
+               window.clearTimeout(_comboHideTimerID);
+               _comboHideTimerID = undefined;
+             }
+
+             container.selectAll('.combobox').remove();
+             container.on('scroll.combo-scroll', null);
+           }
+
+           function keydown(d3_event) {
+             var shown = !container.selectAll('.combobox').empty();
+             var tagName = input.node() ? input.node().tagName.toLowerCase() : '';
+
+             switch (d3_event.keyCode) {
+               case 8: // ⌫ Backspace
+
+               case 46:
+                 // ⌦ Delete
+                 d3_event.stopPropagation();
+                 _selected = null;
+                 render();
+                 input.on('input.combo-input', function () {
+                   var start = input.property('selectionStart');
+                   input.node().setSelectionRange(start, start);
+                   input.on('input.combo-input', change);
+                 });
+                 break;
+
+               case 9:
+                 // ⇥ Tab
+                 accept();
+                 break;
+
+               case 13:
+                 // ↩ Return
+                 d3_event.preventDefault();
+                 d3_event.stopPropagation();
+                 break;
+
+               case 38:
+                 // ↑ Up arrow
+                 if (tagName === 'textarea' && !shown) return;
+                 d3_event.preventDefault();
+
+                 if (tagName === 'input' && !shown) {
+                   show();
+                 }
+
+                 nav(-1);
+                 break;
+
+               case 40:
+                 // ↓ Down arrow
+                 if (tagName === 'textarea' && !shown) return;
+                 d3_event.preventDefault();
+
+                 if (tagName === 'input' && !shown) {
+                   show();
+                 }
+
+                 nav(+1);
+                 break;
+             }
+           }
+
+           function keyup(d3_event) {
+             switch (d3_event.keyCode) {
+               case 27:
+                 // ⎋ Escape
+                 cancel();
+                 break;
+
+               case 13:
+                 // ↩ Return
+                 accept();
+                 break;
+             }
+           } // Called whenever the input value is changed (e.g. on typing)
+
+
+           function change() {
+             fetchComboData(value(), function () {
+               _selected = null;
+               var val = input.property('value');
+
+               if (_suggestions.length) {
+                 if (input.property('selectionEnd') === val.length) {
+                   _selected = tryAutocomplete();
+                 }
+
+                 if (!_selected) {
+                   _selected = val;
+                 }
+               }
+
+               if (val.length) {
+                 var combo = container.selectAll('.combobox');
+
+                 if (combo.empty()) {
+                   show();
+                 }
+               } else {
+                 hide();
+               }
+
+               render();
+             });
+           } // Called when the user presses up/down arrows to navigate the list
+
+
+           function nav(dir) {
+             if (_suggestions.length) {
+               // try to determine previously selected index..
+               var index = -1;
+
+               for (var i = 0; i < _suggestions.length; i++) {
+                 if (_selected && _suggestions[i].value === _selected) {
+                   index = i;
+                   break;
+                 }
+               } // pick new _selected
+
+
+               index = Math.max(Math.min(index + dir, _suggestions.length - 1), 0);
+               _selected = _suggestions[index].value;
+               input.property('value', _selected);
+             }
+
+             render();
+             ensureVisible();
+           }
+
+           function ensureVisible() {
+             var combo = container.selectAll('.combobox');
+             if (combo.empty()) return;
+             var containerRect = container.node().getBoundingClientRect();
+             var comboRect = combo.node().getBoundingClientRect();
+
+             if (comboRect.bottom > containerRect.bottom) {
+               var node = attachTo ? attachTo.node() : input.node();
+               node.scrollIntoView({
+                 behavior: 'instant',
+                 block: 'center'
+               });
+               render();
+             } // https://stackoverflow.com/questions/11039885/scrollintoview-causing-the-whole-page-to-move
+
+
+             var selected = combo.selectAll('.combobox-option.selected').node();
+
+             if (selected) {
+               selected.scrollIntoView({
+                 behavior: 'smooth',
+                 block: 'nearest'
+               });
+             }
+           }
+
+           function value() {
+             var value = input.property('value');
+             var start = input.property('selectionStart');
+             var end = input.property('selectionEnd');
+
+             if (start && end) {
+               value = value.substring(0, start);
+             }
+
+             return value;
+           }
+
+           function fetchComboData(v, cb) {
+             _cancelFetch = false;
+
+             _fetcher.call(input, v, function (results) {
+               // already chose a value, don't overwrite or autocomplete it
+               if (_cancelFetch) return;
+               _suggestions = results;
+               results.forEach(function (d) {
+                 _fetched[d.value] = d;
+               });
+
+               if (cb) {
+                 cb();
+               }
+             });
+           }
+
+           function tryAutocomplete() {
+             if (!_canAutocomplete) return;
+             var val = _caseSensitive ? value() : value().toLowerCase();
+             if (!val) return; // Don't autocomplete if user is typing a number - #4935
+
+             if (!isNaN(parseFloat(val)) && isFinite(val)) return;
+             var bestIndex = -1;
+
+             for (var i = 0; i < _suggestions.length; i++) {
+               var suggestion = _suggestions[i].value;
+               var compare = _caseSensitive ? suggestion : suggestion.toLowerCase(); // if search string matches suggestion exactly, pick it..
+
+               if (compare === val) {
+                 bestIndex = i;
+                 break; // otherwise lock in the first result that starts with the search string..
+               } else if (bestIndex === -1 && compare.indexOf(val) === 0) {
+                 bestIndex = i;
+               }
+             }
+
+             if (bestIndex !== -1) {
+               var bestVal = _suggestions[bestIndex].value;
+               input.property('value', bestVal);
+               input.node().setSelectionRange(val.length, bestVal.length);
+               return bestVal;
+             }
+           }
+
+           function render() {
+             if (_suggestions.length < _minItems || document.activeElement !== input.node()) {
+               hide();
+               return;
+             }
+
+             var shown = !container.selectAll('.combobox').empty();
+             if (!shown) return;
+             var combo = container.selectAll('.combobox');
+             var options = combo.selectAll('.combobox-option').data(_suggestions, function (d) {
+               return d.value;
+             });
+             options.exit().remove(); // enter/update
+
+             options.enter().append('a').attr('class', function (d) {
+               return 'combobox-option ' + (d.klass || '');
+             }).attr('title', function (d) {
+               return d.title;
+             }).html(function (d) {
+               return d.display || d.value;
+             }).on('mouseenter', _mouseEnterHandler).on('mouseleave', _mouseLeaveHandler).merge(options).classed('selected', function (d) {
+               return d.value === _selected;
+             }).on('click.combo-option', accept).order();
+             var node = attachTo ? attachTo.node() : input.node();
+             var containerRect = container.node().getBoundingClientRect();
+             var rect = node.getBoundingClientRect();
+             combo.style('left', rect.left + 5 - containerRect.left + 'px').style('width', rect.width - 10 + 'px').style('top', rect.height + rect.top - containerRect.top + 'px');
+           } // Dispatches an 'accept' event
+           // Then hides the combobox.
+
+
+           function accept(d3_event, d) {
+             _cancelFetch = true;
+             var thiz = input.node();
+
+             if (d) {
+               // user clicked on a suggestion
+               utilGetSetValue(input, d.value); // replace field contents
+
+               utilTriggerEvent(input, 'change');
+             } // clear (and keep) selection
+
+
+             var val = utilGetSetValue(input);
+             thiz.setSelectionRange(val.length, val.length);
+             d = _fetched[val];
+             dispatch.call('accept', thiz, d, val);
+             hide();
+           } // Dispatches an 'cancel' event
+           // Then hides the combobox.
+
+
+           function cancel() {
+             _cancelFetch = true;
+             var thiz = input.node(); // clear (and remove) selection, and replace field contents
+
+             var val = utilGetSetValue(input);
+             var start = input.property('selectionStart');
+             var end = input.property('selectionEnd');
+             val = val.slice(0, start) + val.slice(end);
+             utilGetSetValue(input, val);
+             thiz.setSelectionRange(val.length, val.length);
+             dispatch.call('cancel', thiz);
+             hide();
+           }
+         };
+
+         combobox.canAutocomplete = function (val) {
+           if (!arguments.length) return _canAutocomplete;
+           _canAutocomplete = val;
+           return combobox;
+         };
+
+         combobox.caseSensitive = function (val) {
+           if (!arguments.length) return _caseSensitive;
+           _caseSensitive = val;
+           return combobox;
+         };
+
+         combobox.data = function (val) {
+           if (!arguments.length) return _data;
+           _data = val;
+           return combobox;
+         };
+
+         combobox.fetcher = function (val) {
+           if (!arguments.length) return _fetcher;
+           _fetcher = val;
+           return combobox;
+         };
+
+         combobox.minItems = function (val) {
+           if (!arguments.length) return _minItems;
+           _minItems = val;
+           return combobox;
+         };
+
+         combobox.itemsMouseEnter = function (val) {
+           if (!arguments.length) return _mouseEnterHandler;
+           _mouseEnterHandler = val;
+           return combobox;
+         };
+
+         combobox.itemsMouseLeave = function (val) {
+           if (!arguments.length) return _mouseLeaveHandler;
+           _mouseLeaveHandler = val;
+           return combobox;
+         };
+
+         return utilRebind(combobox, dispatch, 'on');
+       }
+
+       uiCombobox.off = function (input, context) {
+         input.on('focus.combo-input', null).on('blur.combo-input', null).on('keydown.combo-input', null).on('keyup.combo-input', null).on('input.combo-input', null).on('mousedown.combo-input', null).on('mouseup.combo-input', null);
+         context.container().on('scroll.combo-scroll', null);
+       };
+
+       function uiDisclosure(context, key, expandedDefault) {
+         var dispatch = dispatch$8('toggled');
+
+         var _expanded;
+
+         var _label = utilFunctor('');
+
+         var _updatePreference = true;
+
+         var _content = function _content() {};
+
+         var disclosure = function disclosure(selection) {
+           if (_expanded === undefined || _expanded === null) {
+             // loading _expanded here allows it to be reset by calling `disclosure.expanded(null)`
+             var preference = corePreferences('disclosure.' + key + '.expanded');
+             _expanded = preference === null ? !!expandedDefault : preference === 'true';
+           }
+
+           var hideToggle = selection.selectAll('.hide-toggle-' + key).data([0]); // enter
+
+           var hideToggleEnter = hideToggle.enter().append('h3').append('a').attr('role', 'button').attr('href', '#').attr('class', 'hide-toggle hide-toggle-' + key).call(svgIcon('', 'pre-text', 'hide-toggle-icon'));
+           hideToggleEnter.append('span').attr('class', 'hide-toggle-text'); // update
+
+           hideToggle = hideToggleEnter.merge(hideToggle);
+           hideToggle.on('click', toggle).attr('title', _t("icons.".concat(_expanded ? 'collapse' : 'expand'))).attr('aria-expanded', _expanded).classed('expanded', _expanded);
+           hideToggle.selectAll('.hide-toggle-text').html(_label());
+           hideToggle.selectAll('.hide-toggle-icon').attr('xlink:href', _expanded ? '#iD-icon-down' : _mainLocalizer.textDirection() === 'rtl' ? '#iD-icon-backward' : '#iD-icon-forward');
+           var wrap = selection.selectAll('.disclosure-wrap').data([0]); // enter/update
+
+           wrap = wrap.enter().append('div').attr('class', 'disclosure-wrap disclosure-wrap-' + key).merge(wrap).classed('hide', !_expanded);
+
+           if (_expanded) {
+             wrap.call(_content);
+           }
+
+           function toggle(d3_event) {
+             d3_event.preventDefault();
+             _expanded = !_expanded;
+
+             if (_updatePreference) {
+               corePreferences('disclosure.' + key + '.expanded', _expanded);
+             }
+
+             hideToggle.classed('expanded', _expanded).attr('aria-expanded', _expanded).attr('title', _t("icons.".concat(_expanded ? 'collapse' : 'expand')));
+             hideToggle.selectAll('.hide-toggle-icon').attr('xlink:href', _expanded ? '#iD-icon-down' : _mainLocalizer.textDirection() === 'rtl' ? '#iD-icon-backward' : '#iD-icon-forward');
+             wrap.call(uiToggle(_expanded));
+
+             if (_expanded) {
+               wrap.call(_content);
+             }
+
+             dispatch.call('toggled', this, _expanded);
+           }
+         };
+
+         disclosure.label = function (val) {
+           if (!arguments.length) return _label;
+           _label = utilFunctor(val);
+           return disclosure;
+         };
+
+         disclosure.expanded = function (val) {
+           if (!arguments.length) return _expanded;
+           _expanded = val;
+           return disclosure;
+         };
+
+         disclosure.updatePreference = function (val) {
+           if (!arguments.length) return _updatePreference;
+           _updatePreference = val;
+           return disclosure;
+         };
+
+         disclosure.content = function (val) {
+           if (!arguments.length) return _content;
+           _content = val;
+           return disclosure;
+         };
+
+         return utilRebind(disclosure, dispatch, 'on');
+       }
+
+       // Can be labeled and collapsible.
+
+       function uiSection(id, context) {
+         var _classes = utilFunctor('');
+
+         var _shouldDisplay;
+
+         var _content;
+
+         var _disclosure;
+
+         var _label;
+
+         var _expandedByDefault = utilFunctor(true);
+
+         var _disclosureContent;
+
+         var _disclosureExpanded;
+
+         var _containerSelection = select(null);
+
+         var section = {
+           id: id
+         };
+
+         section.classes = function (val) {
+           if (!arguments.length) return _classes;
+           _classes = utilFunctor(val);
+           return section;
+         };
+
+         section.label = function (val) {
+           if (!arguments.length) return _label;
+           _label = utilFunctor(val);
+           return section;
+         };
+
+         section.expandedByDefault = function (val) {
+           if (!arguments.length) return _expandedByDefault;
+           _expandedByDefault = utilFunctor(val);
+           return section;
+         };
+
+         section.shouldDisplay = function (val) {
+           if (!arguments.length) return _shouldDisplay;
+           _shouldDisplay = utilFunctor(val);
+           return section;
+         };
+
+         section.content = function (val) {
+           if (!arguments.length) return _content;
+           _content = val;
+           return section;
+         };
+
+         section.disclosureContent = function (val) {
+           if (!arguments.length) return _disclosureContent;
+           _disclosureContent = val;
+           return section;
+         };
+
+         section.disclosureExpanded = function (val) {
+           if (!arguments.length) return _disclosureExpanded;
+           _disclosureExpanded = val;
+           return section;
+         }; // may be called multiple times
+
+
+         section.render = function (selection) {
+           _containerSelection = selection.selectAll('.section-' + id).data([0]);
+
+           var sectionEnter = _containerSelection.enter().append('div').attr('class', 'section section-' + id + ' ' + (_classes && _classes() || ''));
+
+           _containerSelection = sectionEnter.merge(_containerSelection);
+
+           _containerSelection.call(renderContent);
+         };
+
+         section.reRender = function () {
+           _containerSelection.call(renderContent);
+         };
+
+         section.selection = function () {
+           return _containerSelection;
+         };
+
+         section.disclosure = function () {
+           return _disclosure;
+         }; // may be called multiple times
+
+
+         function renderContent(selection) {
+           if (_shouldDisplay) {
+             var shouldDisplay = _shouldDisplay();
+
+             selection.classed('hide', !shouldDisplay);
+
+             if (!shouldDisplay) {
+               selection.html('');
+               return;
+             }
+           }
+
+           if (_disclosureContent) {
+             if (!_disclosure) {
+               _disclosure = uiDisclosure(context, id.replace(/-/g, '_'), _expandedByDefault()).label(_label || '')
+               /*.on('toggled', function(expanded) {
+                   if (expanded) { selection.node().parentNode.scrollTop += 200; }
+               })*/
+               .content(_disclosureContent);
+             }
+
+             if (_disclosureExpanded !== undefined) {
+               _disclosure.expanded(_disclosureExpanded);
+
+               _disclosureExpanded = undefined;
+             }
+
+             selection.call(_disclosure);
+             return;
+           }
+
+           if (_content) {
+             selection.call(_content);
+           }
+         }
+
+         return section;
+       }
+
+       // {
+       //   key: 'string',     // required
+       //   value: 'string'    // optional
+       // }
+       //   -or-
+       // {
+       //   qid: 'string'      // brand wikidata  (e.g. 'Q37158')
+       // }
+       //
+
+       function uiTagReference(what) {
+         var wikibase = what.qid ? services.wikidata : services.osmWikibase;
+         var tagReference = {};
+
+         var _button = select(null);
+
+         var _body = select(null);
+
+         var _loaded;
+
+         var _showing;
+
+         function load() {
+           if (!wikibase) return;
+
+           _button.classed('tag-reference-loading', true);
+
+           wikibase.getDocs(what, gotDocs);
+         }
+
+         function gotDocs(err, docs) {
+           _body.html('');
+
+           if (!docs || !docs.title) {
+             _body.append('p').attr('class', 'tag-reference-description').call(_t.append('inspector.no_documentation_key'));
+
+             done();
+             return;
+           }
+
+           if (docs.imageURL) {
+             _body.append('img').attr('class', 'tag-reference-wiki-image').attr('alt', docs.description).attr('src', docs.imageURL).on('load', function () {
+               done();
+             }).on('error', function () {
+               select(this).remove();
+               done();
+             });
+           } else {
+             done();
+           }
+
+           var tagReferenceDescription = _body.append('p').attr('class', 'tag-reference-description').append('span');
+
+           if (docs.description) {
+             tagReferenceDescription = tagReferenceDescription.attr('class', 'localized-text').attr('lang', docs.descriptionLocaleCode || 'und').text(docs.description);
+           } else {
+             tagReferenceDescription = tagReferenceDescription.call(_t.append('inspector.no_documentation_key'));
+           }
+
+           tagReferenceDescription.append('a').attr('class', 'tag-reference-edit').attr('target', '_blank').attr('title', _t('inspector.edit_reference')).attr('href', docs.editURL).call(svgIcon('#iD-icon-edit', 'inline'));
+
+           if (docs.wiki) {
+             _body.append('a').attr('class', 'tag-reference-link').attr('target', '_blank').attr('href', docs.wiki.url).call(svgIcon('#iD-icon-out-link', 'inline')).append('span').call(_t.append(docs.wiki.text));
+           } // Add link to info about "good changeset comments" - #2923
+
+
+           if (what.key === 'comment') {
+             _body.append('a').attr('class', 'tag-reference-comment-link').attr('target', '_blank').call(svgIcon('#iD-icon-out-link', 'inline')).attr('href', _t('commit.about_changeset_comments_link')).append('span').call(_t.append('commit.about_changeset_comments'));
+           }
+         }
+
+         function done() {
+           _loaded = true;
+
+           _button.classed('tag-reference-loading', false);
+
+           _body.classed('expanded', true).transition().duration(200).style('max-height', '200px').style('opacity', '1');
+
+           _showing = true;
+
+           _button.selectAll('svg.icon use').each(function () {
+             var iconUse = select(this);
+
+             if (iconUse.attr('href') === '#iD-icon-info') {
+               iconUse.attr('href', '#iD-icon-info-filled');
+             }
+           });
+         }
+
+         function hide() {
+           _body.transition().duration(200).style('max-height', '0px').style('opacity', '0').on('end', function () {
+             _body.classed('expanded', false);
+           });
+
+           _showing = false;
+
+           _button.selectAll('svg.icon use').each(function () {
+             var iconUse = select(this);
+
+             if (iconUse.attr('href') === '#iD-icon-info-filled') {
+               iconUse.attr('href', '#iD-icon-info');
+             }
+           });
+         }
+
+         tagReference.button = function (selection, klass, iconName) {
+           _button = selection.selectAll('.tag-reference-button').data([0]);
+           _button = _button.enter().append('button').attr('class', 'tag-reference-button ' + (klass || '')).attr('title', _t('icons.information')).call(svgIcon('#iD-icon-' + (iconName || 'inspect'))).merge(_button);
+
+           _button.on('click', function (d3_event) {
+             d3_event.stopPropagation();
+             d3_event.preventDefault();
+             this.blur(); // avoid keeping focus on the button - #4641
+
+             if (_showing) {
+               hide();
+             } else if (_loaded) {
+               done();
+             } else {
+               load();
+             }
+           });
+         };
+
+         tagReference.body = function (selection) {
+           var itemID = what.qid || what.key + '-' + (what.value || '');
+           _body = selection.selectAll('.tag-reference-body').data([itemID], function (d) {
+             return d;
+           });
+
+           _body.exit().remove();
+
+           _body = _body.enter().append('div').attr('class', 'tag-reference-body').style('max-height', '0').style('opacity', '0').merge(_body);
+
+           if (_showing === false) {
+             hide();
+           }
+         };
+
+         tagReference.showing = function (val) {
+           if (!arguments.length) return _showing;
+           _showing = val;
+           return tagReference;
+         };
+
+         return tagReference;
+       }
+
+       // It borrows some code from uiHelp
+
+       function uiFieldHelp(context, fieldName) {
+         var fieldHelp = {};
+
+         var _inspector = select(null);
+
+         var _wrap = select(null);
+
+         var _body = select(null);
+
+         var fieldHelpKeys = {
+           restrictions: [['about', ['about', 'from_via_to', 'maxdist', 'maxvia']], ['inspecting', ['about', 'from_shadow', 'allow_shadow', 'restrict_shadow', 'only_shadow', 'restricted', 'only']], ['modifying', ['about', 'indicators', 'allow_turn', 'restrict_turn', 'only_turn']], ['tips', ['simple', 'simple_example', 'indirect', 'indirect_example', 'indirect_noedit']]]
+         };
+         var fieldHelpHeadings = {};
+         var replacements = {
+           distField: {
+             html: _t.html('restriction.controls.distance')
+           },
+           viaField: {
+             html: _t.html('restriction.controls.via')
+           },
+           fromShadow: {
+             html: icon('#iD-turn-shadow', 'inline shadow from')
+           },
+           allowShadow: {
+             html: icon('#iD-turn-shadow', 'inline shadow allow')
+           },
+           restrictShadow: {
+             html: icon('#iD-turn-shadow', 'inline shadow restrict')
+           },
+           onlyShadow: {
+             html: icon('#iD-turn-shadow', 'inline shadow only')
+           },
+           allowTurn: {
+             html: icon('#iD-turn-yes', 'inline turn')
+           },
+           restrictTurn: {
+             html: icon('#iD-turn-no', 'inline turn')
+           },
+           onlyTurn: {
+             html: icon('#iD-turn-only', 'inline turn')
+           }
+         }; // For each section, squash all the texts into a single markdown document
+
+         var docs = fieldHelpKeys[fieldName].map(function (key) {
+           var helpkey = 'help.field.' + fieldName + '.' + key[0];
+           var text = key[1].reduce(function (all, part) {
+             var subkey = helpkey + '.' + part;
+             var depth = fieldHelpHeadings[subkey]; // is this subkey a heading?
+
+             var hhh = depth ? Array(depth + 1).join('#') + ' ' : ''; // if so, prepend with some ##'s
+
+             return all + hhh + _t.html(subkey, replacements) + '\n\n';
+           }, '');
+           return {
+             key: helpkey,
+             title: _t.html(helpkey + '.title'),
+             html: marked_1(text.trim())
+           };
+         });
+
+         function show() {
+           updatePosition();
+
+           _body.classed('hide', false).style('opacity', '0').transition().duration(200).style('opacity', '1');
+         }
+
+         function hide() {
+           _body.classed('hide', true).transition().duration(200).style('opacity', '0').on('end', function () {
+             _body.classed('hide', true);
+           });
+         }
+
+         function clickHelp(index) {
+           var d = docs[index];
+           var tkeys = fieldHelpKeys[fieldName][index][1];
+
+           _body.selectAll('.field-help-nav-item').classed('active', function (d, i) {
+             return i === index;
+           });
+
+           var content = _body.selectAll('.field-help-content').html(d.html); // class the paragraphs so we can find and style them
+
+
+           content.selectAll('p').attr('class', function (d, i) {
+             return tkeys[i];
+           }); // insert special content for certain help sections
+
+           if (d.key === 'help.field.restrictions.inspecting') {
+             content.insert('img', 'p.from_shadow').attr('class', 'field-help-image cf').attr('src', context.imagePath('tr_inspect.gif'));
+           } else if (d.key === 'help.field.restrictions.modifying') {
+             content.insert('img', 'p.allow_turn').attr('class', 'field-help-image cf').attr('src', context.imagePath('tr_modify.gif'));
+           }
+         }
+
+         fieldHelp.button = function (selection) {
+           if (_body.empty()) return;
+           var button = selection.selectAll('.field-help-button').data([0]); // enter/update
+
+           button.enter().append('button').attr('class', 'field-help-button').call(svgIcon('#iD-icon-help')).merge(button).on('click', function (d3_event) {
+             d3_event.stopPropagation();
+             d3_event.preventDefault();
+
+             if (_body.classed('hide')) {
+               show();
+             } else {
+               hide();
+             }
+           });
+         };
+
+         function updatePosition() {
+           var wrap = _wrap.node();
+
+           var inspector = _inspector.node();
+
+           var wRect = wrap.getBoundingClientRect();
+           var iRect = inspector.getBoundingClientRect();
+
+           _body.style('top', wRect.top + inspector.scrollTop - iRect.top + 'px');
+         }
+
+         fieldHelp.body = function (selection) {
+           // This control expects the field to have a form-field-input-wrap div
+           _wrap = selection.selectAll('.form-field-input-wrap');
+           if (_wrap.empty()) return; // absolute position relative to the inspector, so it "floats" above the fields
+
+           _inspector = context.container().select('.sidebar .entity-editor-pane .inspector-body');
+           if (_inspector.empty()) return;
+           _body = _inspector.selectAll('.field-help-body').data([0]);
+
+           var enter = _body.enter().append('div').attr('class', 'field-help-body hide'); // initially hidden
+
+
+           var titleEnter = enter.append('div').attr('class', 'field-help-title cf');
+           titleEnter.append('h2').attr('class', _mainLocalizer.textDirection() === 'rtl' ? 'fr' : 'fl').call(_t.append('help.field.' + fieldName + '.title'));
+           titleEnter.append('button').attr('class', 'fr close').attr('title', _t('icons.close')).on('click', function (d3_event) {
+             d3_event.stopPropagation();
+             d3_event.preventDefault();
+             hide();
+           }).call(svgIcon('#iD-icon-close'));
+           var navEnter = enter.append('div').attr('class', 'field-help-nav cf');
+           var titles = docs.map(function (d) {
+             return d.title;
+           });
+           navEnter.selectAll('.field-help-nav-item').data(titles).enter().append('div').attr('class', 'field-help-nav-item').html(function (d) {
+             return d;
+           }).on('click', function (d3_event, d) {
+             d3_event.stopPropagation();
+             d3_event.preventDefault();
+             clickHelp(titles.indexOf(d));
+           });
+           enter.append('div').attr('class', 'field-help-content');
+           _body = _body.merge(enter);
+           clickHelp(0);
+         };
+
+         return fieldHelp;
+       }
+
+       function uiFieldCheck(field, context) {
+         var dispatch = dispatch$8('change');
+         var options = field.options;
+         var values = [];
+         var texts = [];
+
+         var _tags;
+
+         var input = select(null);
+         var text = select(null);
+         var label = select(null);
+         var reverser = select(null);
+
+         var _impliedYes;
+
+         var _entityIDs = [];
+
+         var _value;
+
+         if (options) {
+           for (var i in options) {
+             var v = options[i];
+             values.push(v === 'undefined' ? undefined : v);
+             texts.push(field.t.html('options.' + v, {
+               'default': v
+             }));
+           }
+         } else {
+           values = [undefined, 'yes'];
+           texts = [_t.html('inspector.unknown'), _t.html('inspector.check.yes')];
+
+           if (field.type !== 'defaultCheck') {
+             values.push('no');
+             texts.push(_t.html('inspector.check.no'));
+           }
+         } // Checks tags to see whether an undefined value is "Assumed to be Yes"
+
+
+         function checkImpliedYes() {
+           _impliedYes = field.id === 'oneway_yes'; // hack: pretend `oneway` field is a `oneway_yes` field
+           // where implied oneway tag exists (e.g. `junction=roundabout`) #2220, #1841
+
+           if (field.id === 'oneway') {
+             var entity = context.entity(_entityIDs[0]);
+
+             for (var key in entity.tags) {
+               if (key in osmOneWayTags && entity.tags[key] in osmOneWayTags[key]) {
+                 _impliedYes = true;
+                 texts[0] = _t.html('_tagging.presets.fields.oneway_yes.options.undefined');
+                 break;
+               }
+             }
+           }
+         }
+
+         function reverserHidden() {
+           if (!context.container().select('div.inspector-hover').empty()) return true;
+           return !(_value === 'yes' || _impliedYes && !_value);
+         }
+
+         function reverserSetText(selection) {
+           var entity = _entityIDs.length && context.hasEntity(_entityIDs[0]);
+           if (reverserHidden() || !entity) return selection;
+           var first = entity.first();
+           var last = entity.isClosed() ? entity.nodes[entity.nodes.length - 2] : entity.last();
+           var pseudoDirection = first < last;
+           var icon = pseudoDirection ? '#iD-icon-forward' : '#iD-icon-backward';
+           selection.selectAll('.reverser-span').html('').call(_t.append('inspector.check.reverser')).call(svgIcon(icon, 'inline'));
+           return selection;
+         }
+
+         var check = function check(selection) {
+           checkImpliedYes();
+           label = selection.selectAll('.form-field-input-wrap').data([0]);
+           var enter = label.enter().append('label').attr('class', 'form-field-input-wrap form-field-input-check');
+           enter.append('input').property('indeterminate', field.type !== 'defaultCheck').attr('type', 'checkbox').attr('id', field.domId);
+           enter.append('span').html(texts[0]).attr('class', 'value');
+
+           if (field.type === 'onewayCheck') {
+             enter.append('button').attr('class', 'reverser' + (reverserHidden() ? ' hide' : '')).append('span').attr('class', 'reverser-span');
+           }
+
+           label = label.merge(enter);
+           input = label.selectAll('input');
+           text = label.selectAll('span.value');
+           input.on('click', function (d3_event) {
+             d3_event.stopPropagation();
+             var t = {};
+
+             if (Array.isArray(_tags[field.key])) {
+               if (values.indexOf('yes') !== -1) {
+                 t[field.key] = 'yes';
+               } else {
+                 t[field.key] = values[0];
+               }
+             } else {
+               t[field.key] = values[(values.indexOf(_value) + 1) % values.length];
+             } // Don't cycle through `alternating` or `reversible` states - #4970
+             // (They are supported as translated strings, but should not toggle with clicks)
+
+
+             if (t[field.key] === 'reversible' || t[field.key] === 'alternating') {
+               t[field.key] = values[0];
+             }
+
+             dispatch.call('change', this, t);
+           });
+
+           if (field.type === 'onewayCheck') {
+             reverser = label.selectAll('.reverser');
+             reverser.call(reverserSetText).on('click', function (d3_event) {
+               d3_event.preventDefault();
+               d3_event.stopPropagation();
+               context.perform(function (graph) {
+                 for (var i in _entityIDs) {
+                   graph = actionReverse(_entityIDs[i])(graph);
+                 }
+
+                 return graph;
+               }, _t('operations.reverse.annotation.line', {
+                 n: 1
+               })); // must manually revalidate since no 'change' event was called
+
+               context.validator().validate();
+               select(this).call(reverserSetText);
+             });
+           }
+         };
+
+         check.entityIDs = function (val) {
+           if (!arguments.length) return _entityIDs;
+           _entityIDs = val;
+           return check;
+         };
+
+         check.tags = function (tags) {
+           _tags = tags;
+
+           function isChecked(val) {
+             return val !== 'no' && val !== '' && val !== undefined && val !== null;
+           }
+
+           function textFor(val) {
+             if (val === '') val = undefined;
+             var index = values.indexOf(val);
+             return index !== -1 ? texts[index] : '"' + val + '"';
+           }
+
+           checkImpliedYes();
+           var isMixed = Array.isArray(tags[field.key]);
+           _value = !isMixed && tags[field.key] && tags[field.key].toLowerCase();
+
+           if (field.type === 'onewayCheck' && (_value === '1' || _value === '-1')) {
+             _value = 'yes';
+           }
+
+           input.property('indeterminate', isMixed || field.type !== 'defaultCheck' && !_value).property('checked', isChecked(_value));
+           text.html(isMixed ? _t.html('inspector.multiple_values') : textFor(_value)).classed('mixed', isMixed);
+           label.classed('set', !!_value);
+
+           if (field.type === 'onewayCheck') {
+             reverser.classed('hide', reverserHidden()).call(reverserSetText);
+           }
+         };
+
+         check.focus = function () {
+           input.node().focus();
+         };
+
+         return utilRebind(check, dispatch, 'on');
+       }
+
+       function uiFieldCombo(field, context) {
+         var dispatch = dispatch$8('change');
+
+         var _isMulti = field.type === 'multiCombo' || field.type === 'manyCombo';
+
+         var _isNetwork = field.type === 'networkCombo';
+
+         var _isSemi = field.type === 'semiCombo';
+
+         var _optarray = field.options;
+
+         var _showTagInfoSuggestions = field.type !== 'manyCombo' && field.autoSuggestions !== false;
+
+         var _allowCustomValues = field.type !== 'manyCombo' && field.customValues !== false;
+
+         var _snake_case = field.snake_case || field.snake_case === undefined;
+
+         var _combobox = uiCombobox(context, 'combo-' + field.safeid).caseSensitive(field.caseSensitive).minItems(_isMulti || _isSemi ? 1 : 2);
+
+         var _container = select(null);
+
+         var _inputWrap = select(null);
+
+         var _input = select(null);
+
+         var _comboData = [];
+         var _multiData = [];
+         var _entityIDs = [];
+
+         var _tags;
+
+         var _countryCode;
+
+         var _staticPlaceholder; // initialize deprecated tags array
+
+
+         var _dataDeprecated = [];
+         _mainFileFetcher.get('deprecated').then(function (d) {
+           _dataDeprecated = d;
+         })["catch"](function () {
+           /* ignore */
+         }); // ensure multiCombo field.key ends with a ':'
+
+         if (_isMulti && field.key && /[^:]$/.test(field.key)) {
+           field.key += ':';
+         }
+
+         function snake(s) {
+           return s.replace(/\s+/g, '_').toLowerCase();
+         }
+
+         function clean(s) {
+           return s.split(';').map(function (s) {
+             return s.trim();
+           }).join(';');
+         } // returns the tag value for a display value
+         // (for multiCombo, dval should be the key suffix, not the entire key)
+
+
+         function tagValue(dval) {
+           dval = clean(dval || '');
+
+           var found = _comboData.find(function (o) {
+             return o.key && clean(o.value) === dval;
+           });
+
+           if (found) return found.key;
+
+           if (field.type === 'typeCombo' && !dval) {
+             return 'yes';
+           }
+
+           return (_snake_case ? snake(dval) : dval) || undefined;
+         } // returns the display value for a tag value
+         // (for multiCombo, tval should be the key suffix, not the entire key)
+
+
+         function displayValue(tval) {
+           tval = tval || '';
+
+           if (field.hasTextForStringId('options.' + tval)) {
+             return field.t('options.' + tval, {
+               "default": tval
+             });
+           }
+
+           if (field.type === 'typeCombo' && tval.toLowerCase() === 'yes') {
+             return '';
+           }
+
+           return tval;
+         } // Compute the difference between arrays of objects by `value` property
+         //
+         // objectDifference([{value:1}, {value:2}, {value:3}], [{value:2}])
+         // > [{value:1}, {value:3}]
+         //
+
+
+         function objectDifference(a, b) {
+           return a.filter(function (d1) {
+             return !b.some(function (d2) {
+               return !d2.isMixed && d1.value === d2.value;
+             });
+           });
+         }
+
+         function initCombo(selection, attachTo) {
+           if (!_allowCustomValues) {
+             selection.attr('readonly', 'readonly');
+           }
+
+           if (_showTagInfoSuggestions && services.taginfo) {
+             selection.call(_combobox.fetcher(setTaginfoValues), attachTo);
+             setTaginfoValues('', setPlaceholder);
+           } else {
+             selection.call(_combobox, attachTo);
+             setStaticValues(setPlaceholder);
+           }
+         }
+
+         function setStaticValues(callback) {
+           if (!_optarray) return;
+           _comboData = _optarray.map(function (v) {
+             return {
+               key: v,
+               value: field.t('options.' + v, {
+                 "default": v
+               }),
+               title: v,
+               display: field.t.html('options.' + v, {
+                 "default": v
+               }),
+               klass: field.hasTextForStringId('options.' + v) ? '' : 'raw-option'
+             };
+           });
+
+           _combobox.data(objectDifference(_comboData, _multiData));
+
+           if (callback) callback(_comboData);
+         }
+
+         function setTaginfoValues(q, callback) {
+           var fn = _isMulti ? 'multikeys' : 'values';
+           var query = (_isMulti ? field.key : '') + q;
+           var hasCountryPrefix = _isNetwork && _countryCode && _countryCode.indexOf(q.toLowerCase()) === 0;
+
+           if (hasCountryPrefix) {
+             query = _countryCode + ':';
+           }
+
+           var params = {
+             debounce: q !== '',
+             key: field.key,
+             query: query
+           };
+
+           if (_entityIDs.length) {
+             params.geometry = context.graph().geometry(_entityIDs[0]);
+           }
+
+           services.taginfo[fn](params, function (err, data) {
+             if (err) return;
+             data = data.filter(function (d) {
+               if (field.type === 'typeCombo' && d.value === 'yes') {
+                 // don't show the fallback value
+                 return false;
+               } // don't show values with very low usage
+
+
+               return !d.count || d.count > 10;
+             });
+             var deprecatedValues = osmEntity.deprecatedTagValuesByKey(_dataDeprecated)[field.key];
+
+             if (deprecatedValues) {
+               // don't suggest deprecated tag values
+               data = data.filter(function (d) {
+                 return deprecatedValues.indexOf(d.value) === -1;
+               });
+             }
+
+             if (hasCountryPrefix) {
+               data = data.filter(function (d) {
+                 return d.value.toLowerCase().indexOf(_countryCode + ':') === 0;
+               });
+             } // hide the caret if there are no suggestions
+
+
+             _container.classed('empty-combobox', data.length === 0);
+
+             _comboData = data.map(function (d) {
+               var k = d.value;
+               if (_isMulti) k = k.replace(field.key, '');
+               var label = field.t('options.' + k, {
+                 "default": k
+               });
+               return {
+                 key: k,
+                 value: label,
+                 display: field.t.html('options.' + k, {
+                   "default": k
+                 }),
+                 title: d.title || label,
+                 klass: field.hasTextForStringId('options.' + k) ? '' : 'raw-option'
+               };
+             });
+             _comboData = objectDifference(_comboData, _multiData);
+             if (callback) callback(_comboData);
+           });
+         }
+
+         function setPlaceholder(values) {
+           if (_isMulti || _isSemi) {
+             _staticPlaceholder = field.placeholder() || _t('inspector.add');
+           } else {
+             var vals = values.map(function (d) {
+               return d.value;
+             }).filter(function (s) {
+               return s.length < 20;
+             });
+             var placeholders = vals.length > 1 ? vals : values.map(function (d) {
+               return d.key;
+             });
+             _staticPlaceholder = field.placeholder() || placeholders.slice(0, 3).join(', ');
+           }
+
+           if (!/(…|\.\.\.)$/.test(_staticPlaceholder)) {
+             _staticPlaceholder += '…';
+           }
+
+           var ph;
+
+           if (!_isMulti && !_isSemi && _tags && Array.isArray(_tags[field.key])) {
+             ph = _t('inspector.multiple_values');
+           } else {
+             ph = _staticPlaceholder;
+           }
+
+           _container.selectAll('input').attr('placeholder', ph);
+         }
+
+         function change() {
+           var t = {};
+           var val;
+
+           if (_isMulti || _isSemi) {
+             val = tagValue(utilGetSetValue(_input).replace(/,/g, ';')) || '';
+
+             _container.classed('active', false);
+
+             utilGetSetValue(_input, '');
+             var vals = val.split(';').filter(Boolean);
+             if (!vals.length) return;
+
+             if (_isMulti) {
+               utilArrayUniq(vals).forEach(function (v) {
+                 var key = (field.key || '') + v;
+
+                 if (_tags) {
+                   // don't set a multicombo value to 'yes' if it already has a non-'no' value
+                   // e.g. `language:de=main`
+                   var old = _tags[key];
+                   if (typeof old === 'string' && old.toLowerCase() !== 'no') return;
+                 }
+
+                 key = context.cleanTagKey(key);
+                 field.keys.push(key);
+                 t[key] = 'yes';
+               });
+             } else if (_isSemi) {
+               var arr = _multiData.map(function (d) {
+                 return d.key;
+               });
+
+               arr = arr.concat(vals);
+               t[field.key] = context.cleanTagValue(utilArrayUniq(arr).filter(Boolean).join(';'));
+             }
+
+             window.setTimeout(function () {
+               _input.node().focus();
+             }, 10);
+           } else {
+             var rawValue = utilGetSetValue(_input); // don't override multiple values with blank string
+
+             if (!rawValue && Array.isArray(_tags[field.key])) return;
+             val = context.cleanTagValue(tagValue(rawValue));
+             t[field.key] = val || undefined;
+           }
+
+           dispatch.call('change', this, t);
+         }
+
+         function removeMultikey(d3_event, d) {
+           d3_event.preventDefault();
+           d3_event.stopPropagation();
+           var t = {};
+
+           if (_isMulti) {
+             t[d.key] = undefined;
+           } else if (_isSemi) {
+             var arr = _multiData.map(function (md) {
+               return md.key === d.key ? null : md.key;
+             }).filter(Boolean);
+
+             arr = utilArrayUniq(arr);
+             t[field.key] = arr.length ? arr.join(';') : undefined;
+           }
+
+           dispatch.call('change', this, t);
+         }
+
+         function combo(selection) {
+           _container = selection.selectAll('.form-field-input-wrap').data([0]);
+           var type = _isMulti || _isSemi ? 'multicombo' : 'combo';
+           _container = _container.enter().append('div').attr('class', 'form-field-input-wrap form-field-input-' + type).merge(_container);
+
+           if (_isMulti || _isSemi) {
+             _container = _container.selectAll('.chiplist').data([0]);
+             var listClass = 'chiplist'; // Use a separate line for each value in the Destinations and Via fields
+             // to mimic highway exit signs
+
+             if (field.key === 'destination' || field.key === 'via') {
+               listClass += ' full-line-chips';
+             }
+
+             _container = _container.enter().append('ul').attr('class', listClass).on('click', function () {
+               window.setTimeout(function () {
+                 _input.node().focus();
+               }, 10);
+             }).merge(_container);
+             _inputWrap = _container.selectAll('.input-wrap').data([0]);
+             _inputWrap = _inputWrap.enter().append('li').attr('class', 'input-wrap').merge(_inputWrap);
+             _input = _inputWrap.selectAll('input').data([0]);
+           } else {
+             _input = _container.selectAll('input').data([0]);
+           }
+
+           _input = _input.enter().append('input').attr('type', 'text').attr('id', field.domId).call(utilNoAuto).call(initCombo, selection).merge(_input);
+
+           if (_isNetwork) {
+             var extent = combinedEntityExtent();
+             var countryCode = extent && iso1A2Code(extent.center());
+             _countryCode = countryCode && countryCode.toLowerCase();
+           }
+
+           _input.on('change', change).on('blur', change);
+
+           _input.on('keydown.field', function (d3_event) {
+             switch (d3_event.keyCode) {
+               case 13:
+                 // ↩ Return
+                 _input.node().blur(); // blurring also enters the value
+
+
+                 d3_event.stopPropagation();
+                 break;
+             }
+           });
+
+           if (_isMulti || _isSemi) {
+             _combobox.on('accept', function () {
+               _input.node().blur();
+
+               _input.node().focus();
+             });
+
+             _input.on('focus', function () {
+               _container.classed('active', true);
+             });
+           }
+         }
+
+         combo.tags = function (tags) {
+           _tags = tags;
+
+           if (_isMulti || _isSemi) {
+             _multiData = [];
+             var maxLength;
+
+             if (_isMulti) {
+               // Build _multiData array containing keys already set..
+               for (var k in tags) {
+                 if (field.key && k.indexOf(field.key) !== 0) continue;
+                 if (!field.key && field.keys.indexOf(k) === -1) continue;
+                 var v = tags[k];
+                 if (!v || typeof v === 'string' && v.toLowerCase() === 'no') continue;
+                 var suffix = field.key ? k.substr(field.key.length) : k;
+
+                 _multiData.push({
+                   key: k,
+                   value: displayValue(suffix),
+                   isMixed: Array.isArray(v)
+                 });
+               }
+
+               if (field.key) {
+                 // Set keys for form-field modified (needed for undo and reset buttons)..
+                 field.keys = _multiData.map(function (d) {
+                   return d.key;
+                 }); // limit the input length so it fits after prepending the key prefix
+
+                 maxLength = context.maxCharsForTagKey() - utilUnicodeCharsCount(field.key);
+               } else {
+                 maxLength = context.maxCharsForTagKey();
+               }
+             } else if (_isSemi) {
+               var allValues = [];
+               var commonValues;
+
+               if (Array.isArray(tags[field.key])) {
+                 tags[field.key].forEach(function (tagVal) {
+                   var thisVals = utilArrayUniq((tagVal || '').split(';')).filter(Boolean);
+                   allValues = allValues.concat(thisVals);
+
+                   if (!commonValues) {
+                     commonValues = thisVals;
+                   } else {
+                     commonValues = commonValues.filter(function (value) {
+                       return thisVals.includes(value);
+                     });
+                   }
+                 });
+                 allValues = utilArrayUniq(allValues).filter(Boolean);
+               } else {
+                 allValues = utilArrayUniq((tags[field.key] || '').split(';')).filter(Boolean);
+                 commonValues = allValues;
+               }
+
+               _multiData = allValues.map(function (v) {
+                 return {
+                   key: v,
+                   value: displayValue(v),
+                   isMixed: !commonValues.includes(v)
+                 };
+               });
+               var currLength = utilUnicodeCharsCount(commonValues.join(';')); // limit the input length to the remaining available characters
+
+               maxLength = context.maxCharsForTagValue() - currLength;
+
+               if (currLength > 0) {
+                 // account for the separator if a new value will be appended to existing
+                 maxLength -= 1;
+               }
+             } // a negative maxlength doesn't make sense
+
+
+             maxLength = Math.max(0, maxLength);
+             var allowDragAndDrop = _isSemi // only semiCombo values are ordered
+             && !Array.isArray(tags[field.key]); // Exclude existing multikeys from combo options..
+
+             var available = objectDifference(_comboData, _multiData);
+
+             _combobox.data(available); // Hide 'Add' button if this field uses fixed set of
+             // options and they're all currently used,
+             // or if the field is already at its character limit
+
+
+             var hideAdd = !_allowCustomValues && !available.length || maxLength <= 0;
+
+             _container.selectAll('.chiplist .input-wrap').style('display', hideAdd ? 'none' : null); // Render chips
+
+
+             var chips = _container.selectAll('.chip').data(_multiData);
+
+             chips.exit().remove();
+             var enter = chips.enter().insert('li', '.input-wrap').attr('class', 'chip');
+             enter.append('span');
+             enter.append('a');
+             chips = chips.merge(enter).order().classed('raw-value', function (d) {
+               var k = d.key;
+               if (_isMulti) k = k.replace(field.key, '');
+               return !field.hasTextForStringId('options.' + k);
+             }).classed('draggable', allowDragAndDrop).classed('mixed', function (d) {
+               return d.isMixed;
+             }).attr('title', function (d) {
+               return d.isMixed ? _t('inspector.unshared_value_tooltip') : null;
+             });
+
+             if (allowDragAndDrop) {
+               registerDragAndDrop(chips);
+             }
+
+             chips.select('span').text(function (d) {
+               return d.value;
+             });
+             chips.select('a').attr('href', '#').on('click', removeMultikey).attr('class', 'remove').text('×');
+           } else {
+             var isMixed = Array.isArray(tags[field.key]);
+             var mixedValues = isMixed && tags[field.key].map(function (val) {
+               return displayValue(val);
+             }).filter(Boolean);
+             var showsValue = !isMixed && tags[field.key] && !(field.type === 'typeCombo' && tags[field.key] === 'yes');
+             var isRawValue = showsValue && !field.hasTextForStringId('options.' + tags[field.key]);
+             var isKnownValue = showsValue && !isRawValue;
+             var isReadOnly = !_allowCustomValues || isKnownValue;
+             utilGetSetValue(_input, !isMixed ? displayValue(tags[field.key]) : '').classed('raw-value', isRawValue).classed('known-value', isKnownValue).attr('readonly', isReadOnly ? 'readonly' : undefined).attr('title', isMixed ? mixedValues.join('\n') : undefined).attr('placeholder', isMixed ? _t('inspector.multiple_values') : _staticPlaceholder || '').classed('mixed', isMixed).on('keydown.deleteCapture', function (d3_event) {
+               if (isReadOnly && isKnownValue && (d3_event.keyCode === utilKeybinding.keyCodes['⌫'] || d3_event.keyCode === utilKeybinding.keyCodes['⌦'])) {
+                 d3_event.preventDefault();
+                 d3_event.stopPropagation();
+                 var t = {};
+                 t[field.key] = undefined;
+                 dispatch.call('change', this, t);
+               }
+             });
+           }
+         };
+
+         function registerDragAndDrop(selection) {
+           // allow drag and drop re-ordering of chips
+           var dragOrigin, targetIndex;
+           selection.call(d3_drag().on('start', function (d3_event) {
+             dragOrigin = {
+               x: d3_event.x,
+               y: d3_event.y
+             };
+             targetIndex = null;
+           }).on('drag', function (d3_event) {
+             var x = d3_event.x - dragOrigin.x,
+                 y = d3_event.y - dragOrigin.y;
+             if (!select(this).classed('dragging') && // don't display drag until dragging beyond a distance threshold
+             Math.sqrt(Math.pow(x, 2) + Math.pow(y, 2)) <= 5) return;
+             var index = selection.nodes().indexOf(this);
+             select(this).classed('dragging', true);
+             targetIndex = null;
+             var targetIndexOffsetTop = null;
+             var draggedTagWidth = select(this).node().offsetWidth;
+
+             if (field.key === 'destination' || field.key === 'via') {
+               // meaning tags are full width
+               _container.selectAll('.chip').style('transform', function (d2, index2) {
+                 var node = select(this).node();
+
+                 if (index === index2) {
+                   return 'translate(' + x + 'px, ' + y + 'px)'; // move the dragged tag up the order
+                 } else if (index2 > index && d3_event.y > node.offsetTop) {
+                   if (targetIndex === null || index2 > targetIndex) {
+                     targetIndex = index2;
+                   }
+
+                   return 'translateY(-100%)'; // move the dragged tag down the order
+                 } else if (index2 < index && d3_event.y < node.offsetTop + node.offsetHeight) {
+                   if (targetIndex === null || index2 < targetIndex) {
+                     targetIndex = index2;
+                   }
+
+                   return 'translateY(100%)';
+                 }
+
+                 return null;
+               });
+             } else {
+               _container.selectAll('.chip').each(function (d2, index2) {
+                 var node = select(this).node(); // check the cursor is in the bounding box
+
+                 if (index !== index2 && d3_event.x < node.offsetLeft + node.offsetWidth + 5 && d3_event.x > node.offsetLeft && d3_event.y < node.offsetTop + node.offsetHeight && d3_event.y > node.offsetTop) {
+                   targetIndex = index2;
+                   targetIndexOffsetTop = node.offsetTop;
+                 }
+               }).style('transform', function (d2, index2) {
+                 var node = select(this).node();
+
+                 if (index === index2) {
+                   return 'translate(' + x + 'px, ' + y + 'px)';
+                 } // only translate tags in the same row
+
+
+                 if (node.offsetTop === targetIndexOffsetTop) {
+                   if (index2 < index && index2 >= targetIndex) {
+                     return 'translateX(' + draggedTagWidth + 'px)';
+                   } else if (index2 > index && index2 <= targetIndex) {
+                     return 'translateX(-' + draggedTagWidth + 'px)';
+                   }
+                 }
+
+                 return null;
+               });
+             }
+           }).on('end', function () {
+             if (!select(this).classed('dragging')) {
+               return;
+             }
+
+             var index = selection.nodes().indexOf(this);
+             select(this).classed('dragging', false);
+
+             _container.selectAll('.chip').style('transform', null);
+
+             if (typeof targetIndex === 'number') {
+               var element = _multiData[index];
+
+               _multiData.splice(index, 1);
+
+               _multiData.splice(targetIndex, 0, element);
+
+               var t = {};
+
+               if (_multiData.length) {
+                 t[field.key] = _multiData.map(function (element) {
+                   return element.key;
+                 }).join(';');
+               } else {
+                 t[field.key] = undefined;
+               }
+
+               dispatch.call('change', this, t);
+             }
+
+             dragOrigin = undefined;
+             targetIndex = undefined;
+           }));
+         }
+
+         combo.focus = function () {
+           _input.node().focus();
+         };
+
+         combo.entityIDs = function (val) {
+           if (!arguments.length) return _entityIDs;
+           _entityIDs = val;
+           return combo;
+         };
+
+         function combinedEntityExtent() {
+           return _entityIDs && _entityIDs.length && utilTotalExtent(_entityIDs, context.graph());
+         }
+
+         return utilRebind(combo, dispatch, 'on');
+       }
+
+       // based on https://github.com/bestiejs/punycode.js/blob/master/punycode.js
+       var global$2 = global$1o;
+       var uncurryThis$1 = functionUncurryThis;
+
+       var maxInt = 2147483647; // aka. 0x7FFFFFFF or 2^31-1
+       var base = 36;
+       var tMin = 1;
+       var tMax = 26;
+       var skew = 38;
+       var damp = 700;
+       var initialBias = 72;
+       var initialN = 128; // 0x80
+       var delimiter = '-'; // '\x2D'
+       var regexNonASCII = /[^\0-\u007E]/; // non-ASCII chars
+       var regexSeparators = /[.\u3002\uFF0E\uFF61]/g; // RFC 3490 separators
+       var OVERFLOW_ERROR = 'Overflow: input needs wider integers to process';
+       var baseMinusTMin = base - tMin;
+
+       var RangeError$1 = global$2.RangeError;
+       var exec$1 = uncurryThis$1(regexSeparators.exec);
+       var floor$1 = Math.floor;
+       var fromCharCode = String.fromCharCode;
+       var charCodeAt = uncurryThis$1(''.charCodeAt);
+       var join$1 = uncurryThis$1([].join);
+       var push$1 = uncurryThis$1([].push);
+       var replace$1 = uncurryThis$1(''.replace);
+       var split$1 = uncurryThis$1(''.split);
+       var toLowerCase$1 = uncurryThis$1(''.toLowerCase);
+
+       /**
+        * Creates an array containing the numeric code points of each Unicode
+        * character in the string. While JavaScript uses UCS-2 internally,
+        * this function will convert a pair of surrogate halves (each of which
+        * UCS-2 exposes as separate characters) into a single code point,
+        * matching UTF-16.
+        */
+       var ucs2decode = function (string) {
+         var output = [];
+         var counter = 0;
+         var length = string.length;
+         while (counter < length) {
+           var value = charCodeAt(string, counter++);
+           if (value >= 0xD800 && value <= 0xDBFF && counter < length) {
+             // It's a high surrogate, and there is a next character.
+             var extra = charCodeAt(string, counter++);
+             if ((extra & 0xFC00) == 0xDC00) { // Low surrogate.
+               push$1(output, ((value & 0x3FF) << 10) + (extra & 0x3FF) + 0x10000);
+             } else {
+               // It's an unmatched surrogate; only append this code unit, in case the
+               // next code unit is the high surrogate of a surrogate pair.
+               push$1(output, value);
+               counter--;
+             }
+           } else {
+             push$1(output, value);
+           }
+         }
+         return output;
+       };
+
+       /**
+        * Converts a digit/integer into a basic code point.
+        */
+       var digitToBasic = function (digit) {
+         //  0..25 map to ASCII a..z or A..Z
+         // 26..35 map to ASCII 0..9
+         return digit + 22 + 75 * (digit < 26);
+       };
+
+       /**
+        * Bias adaptation function as per section 3.4 of RFC 3492.
+        * https://tools.ietf.org/html/rfc3492#section-3.4
+        */
+       var adapt = function (delta, numPoints, firstTime) {
+         var k = 0;
+         delta = firstTime ? floor$1(delta / damp) : delta >> 1;
+         delta += floor$1(delta / numPoints);
+         while (delta > baseMinusTMin * tMax >> 1) {
+           delta = floor$1(delta / baseMinusTMin);
+           k += base;
+         }
+         return floor$1(k + (baseMinusTMin + 1) * delta / (delta + skew));
+       };
+
+       /**
+        * Converts a string of Unicode symbols (e.g. a domain name label) to a
+        * Punycode string of ASCII-only symbols.
+        */
+       var encode = function (input) {
+         var output = [];
+
+         // Convert the input in UCS-2 to an array of Unicode code points.
+         input = ucs2decode(input);
+
+         // Cache the length.
+         var inputLength = input.length;
+
+         // Initialize the state.
+         var n = initialN;
+         var delta = 0;
+         var bias = initialBias;
+         var i, currentValue;
+
+         // Handle the basic code points.
+         for (i = 0; i < input.length; i++) {
+           currentValue = input[i];
+           if (currentValue < 0x80) {
+             push$1(output, fromCharCode(currentValue));
+           }
+         }
+
+         var basicLength = output.length; // number of basic code points.
+         var handledCPCount = basicLength; // number of code points that have been handled;
+
+         // Finish the basic string with a delimiter unless it's empty.
+         if (basicLength) {
+           push$1(output, delimiter);
+         }
+
+         // Main encoding loop:
+         while (handledCPCount < inputLength) {
+           // All non-basic code points < n have been handled already. Find the next larger one:
+           var m = maxInt;
+           for (i = 0; i < input.length; i++) {
+             currentValue = input[i];
+             if (currentValue >= n && currentValue < m) {
+               m = currentValue;
+             }
+           }
+
+           // Increase `delta` enough to advance the decoder's <n,i> state to <m,0>, but guard against overflow.
+           var handledCPCountPlusOne = handledCPCount + 1;
+           if (m - n > floor$1((maxInt - delta) / handledCPCountPlusOne)) {
+             throw RangeError$1(OVERFLOW_ERROR);
+           }
+
+           delta += (m - n) * handledCPCountPlusOne;
+           n = m;
+
+           for (i = 0; i < input.length; i++) {
+             currentValue = input[i];
+             if (currentValue < n && ++delta > maxInt) {
+               throw RangeError$1(OVERFLOW_ERROR);
+             }
+             if (currentValue == n) {
+               // Represent delta as a generalized variable-length integer.
+               var q = delta;
+               var k = base;
+               while (true) {
+                 var t = k <= bias ? tMin : (k >= bias + tMax ? tMax : k - bias);
+                 if (q < t) break;
+                 var qMinusT = q - t;
+                 var baseMinusT = base - t;
+                 push$1(output, fromCharCode(digitToBasic(t + qMinusT % baseMinusT)));
+                 q = floor$1(qMinusT / baseMinusT);
+                 k += base;
+               }
+
+               push$1(output, fromCharCode(digitToBasic(q)));
+               bias = adapt(delta, handledCPCountPlusOne, handledCPCount == basicLength);
+               delta = 0;
+               handledCPCount++;
+             }
+           }
+
+           delta++;
+           n++;
+         }
+         return join$1(output, '');
+       };
+
+       var stringPunycodeToAscii = function (input) {
+         var encoded = [];
+         var labels = split$1(replace$1(toLowerCase$1(input), regexSeparators, '\u002E'), '.');
+         var i, label;
+         for (i = 0; i < labels.length; i++) {
+           label = labels[i];
+           push$1(encoded, exec$1(regexNonASCII, label) ? 'xn--' + encode(label) : label);
+         }
+         return join$1(encoded, '.');
+       };
+
+       // TODO: in core-js@4, move /modules/ dependencies to public entries for better optimization by tools like `preset-env`
+
+       var $ = _export;
+       var DESCRIPTORS = descriptors;
+       var USE_NATIVE_URL = nativeUrl;
+       var global$1 = global$1o;
+       var bind$2 = functionBindContext;
+       var uncurryThis = functionUncurryThis;
+       var defineProperties = objectDefineProperties.f;
+       var redefine = redefine$h.exports;
+       var anInstance = anInstance$7;
+       var hasOwn = hasOwnProperty_1;
+       var assign$1 = objectAssign;
+       var arrayFrom = arrayFrom$1;
+       var arraySlice = arraySliceSimple;
+       var codeAt = stringMultibyte.codeAt;
+       var toASCII = stringPunycodeToAscii;
+       var $toString = toString$k;
+       var setToStringTag = setToStringTag$a;
+       var validateArgumentsLength = validateArgumentsLength$4;
+       var URLSearchParamsModule = web_urlSearchParams;
+       var InternalStateModule = internalState;
+
+       var setInternalState = InternalStateModule.set;
+       var getInternalURLState = InternalStateModule.getterFor('URL');
+       var URLSearchParams$1 = URLSearchParamsModule.URLSearchParams;
+       var getInternalSearchParamsState = URLSearchParamsModule.getState;
+
+       var NativeURL = global$1.URL;
+       var TypeError$1 = global$1.TypeError;
+       var parseInt$1 = global$1.parseInt;
+       var floor = Math.floor;
+       var pow = Math.pow;
+       var charAt = uncurryThis(''.charAt);
+       var exec = uncurryThis(/./.exec);
+       var join = uncurryThis([].join);
+       var numberToString = uncurryThis(1.0.toString);
+       var pop = uncurryThis([].pop);
+       var push = uncurryThis([].push);
+       var replace = uncurryThis(''.replace);
+       var shift = uncurryThis([].shift);
+       var split = uncurryThis(''.split);
+       var stringSlice = uncurryThis(''.slice);
+       var toLowerCase = uncurryThis(''.toLowerCase);
+       var unshift = uncurryThis([].unshift);
+
+       var INVALID_AUTHORITY = 'Invalid authority';
+       var INVALID_SCHEME = 'Invalid scheme';
+       var INVALID_HOST = 'Invalid host';
+       var INVALID_PORT = 'Invalid port';
+
+       var ALPHA = /[a-z]/i;
+       // eslint-disable-next-line regexp/no-obscure-range -- safe
+       var ALPHANUMERIC = /[\d+-.a-z]/i;
+       var DIGIT = /\d/;
+       var HEX_START = /^0x/i;
+       var OCT = /^[0-7]+$/;
+       var DEC = /^\d+$/;
+       var HEX = /^[\da-f]+$/i;
+       /* eslint-disable regexp/no-control-character -- safe */
+       var FORBIDDEN_HOST_CODE_POINT = /[\0\t\n\r #%/:<>?@[\\\]^|]/;
+       var FORBIDDEN_HOST_CODE_POINT_EXCLUDING_PERCENT = /[\0\t\n\r #/:<>?@[\\\]^|]/;
+       var LEADING_AND_TRAILING_C0_CONTROL_OR_SPACE = /^[\u0000-\u0020]+|[\u0000-\u0020]+$/g;
+       var TAB_AND_NEW_LINE = /[\t\n\r]/g;
+       /* eslint-enable regexp/no-control-character -- safe */
+       var EOF;
+
+       // https://url.spec.whatwg.org/#ipv4-number-parser
+       var parseIPv4 = function (input) {
+         var parts = split(input, '.');
+         var partsLength, numbers, index, part, radix, number, ipv4;
+         if (parts.length && parts[parts.length - 1] == '') {
+           parts.length--;
+         }
+         partsLength = parts.length;
+         if (partsLength > 4) return input;
+         numbers = [];
+         for (index = 0; index < partsLength; index++) {
+           part = parts[index];
+           if (part == '') return input;
+           radix = 10;
+           if (part.length > 1 && charAt(part, 0) == '0') {
+             radix = exec(HEX_START, part) ? 16 : 8;
+             part = stringSlice(part, radix == 8 ? 1 : 2);
+           }
+           if (part === '') {
+             number = 0;
+           } else {
+             if (!exec(radix == 10 ? DEC : radix == 8 ? OCT : HEX, part)) return input;
+             number = parseInt$1(part, radix);
+           }
+           push(numbers, number);
+         }
+         for (index = 0; index < partsLength; index++) {
+           number = numbers[index];
+           if (index == partsLength - 1) {
+             if (number >= pow(256, 5 - partsLength)) return null;
+           } else if (number > 255) return null;
+         }
+         ipv4 = pop(numbers);
+         for (index = 0; index < numbers.length; index++) {
+           ipv4 += numbers[index] * pow(256, 3 - index);
+         }
+         return ipv4;
+       };
+
+       // https://url.spec.whatwg.org/#concept-ipv6-parser
+       // eslint-disable-next-line max-statements -- TODO
+       var parseIPv6 = function (input) {
+         var address = [0, 0, 0, 0, 0, 0, 0, 0];
+         var pieceIndex = 0;
+         var compress = null;
+         var pointer = 0;
+         var value, length, numbersSeen, ipv4Piece, number, swaps, swap;
+
+         var chr = function () {
+           return charAt(input, pointer);
+         };
+
+         if (chr() == ':') {
+           if (charAt(input, 1) != ':') return;
+           pointer += 2;
+           pieceIndex++;
+           compress = pieceIndex;
+         }
+         while (chr()) {
+           if (pieceIndex == 8) return;
+           if (chr() == ':') {
+             if (compress !== null) return;
+             pointer++;
+             pieceIndex++;
+             compress = pieceIndex;
+             continue;
+           }
+           value = length = 0;
+           while (length < 4 && exec(HEX, chr())) {
+             value = value * 16 + parseInt$1(chr(), 16);
+             pointer++;
+             length++;
+           }
+           if (chr() == '.') {
+             if (length == 0) return;
+             pointer -= length;
+             if (pieceIndex > 6) return;
+             numbersSeen = 0;
+             while (chr()) {
+               ipv4Piece = null;
+               if (numbersSeen > 0) {
+                 if (chr() == '.' && numbersSeen < 4) pointer++;
+                 else return;
+               }
+               if (!exec(DIGIT, chr())) return;
+               while (exec(DIGIT, chr())) {
+                 number = parseInt$1(chr(), 10);
+                 if (ipv4Piece === null) ipv4Piece = number;
+                 else if (ipv4Piece == 0) return;
+                 else ipv4Piece = ipv4Piece * 10 + number;
+                 if (ipv4Piece > 255) return;
+                 pointer++;
+               }
+               address[pieceIndex] = address[pieceIndex] * 256 + ipv4Piece;
+               numbersSeen++;
+               if (numbersSeen == 2 || numbersSeen == 4) pieceIndex++;
+             }
+             if (numbersSeen != 4) return;
+             break;
+           } else if (chr() == ':') {
+             pointer++;
+             if (!chr()) return;
+           } else if (chr()) return;
+           address[pieceIndex++] = value;
+         }
+         if (compress !== null) {
+           swaps = pieceIndex - compress;
+           pieceIndex = 7;
+           while (pieceIndex != 0 && swaps > 0) {
+             swap = address[pieceIndex];
+             address[pieceIndex--] = address[compress + swaps - 1];
+             address[compress + --swaps] = swap;
+           }
+         } else if (pieceIndex != 8) return;
+         return address;
+       };
+
+       var findLongestZeroSequence = function (ipv6) {
+         var maxIndex = null;
+         var maxLength = 1;
+         var currStart = null;
+         var currLength = 0;
+         var index = 0;
+         for (; index < 8; index++) {
+           if (ipv6[index] !== 0) {
+             if (currLength > maxLength) {
+               maxIndex = currStart;
+               maxLength = currLength;
+             }
+             currStart = null;
+             currLength = 0;
+           } else {
+             if (currStart === null) currStart = index;
+             ++currLength;
+           }
+         }
+         if (currLength > maxLength) {
+           maxIndex = currStart;
+           maxLength = currLength;
+         }
+         return maxIndex;
+       };
+
+       // https://url.spec.whatwg.org/#host-serializing
+       var serializeHost = function (host) {
+         var result, index, compress, ignore0;
+         // ipv4
+         if (typeof host == 'number') {
+           result = [];
+           for (index = 0; index < 4; index++) {
+             unshift(result, host % 256);
+             host = floor(host / 256);
+           } return join(result, '.');
+         // ipv6
+         } else if (typeof host == 'object') {
+           result = '';
+           compress = findLongestZeroSequence(host);
+           for (index = 0; index < 8; index++) {
+             if (ignore0 && host[index] === 0) continue;
+             if (ignore0) ignore0 = false;
+             if (compress === index) {
+               result += index ? ':' : '::';
+               ignore0 = true;
+             } else {
+               result += numberToString(host[index], 16);
+               if (index < 7) result += ':';
+             }
+           }
+           return '[' + result + ']';
+         } return host;
+       };
+
+       var C0ControlPercentEncodeSet = {};
+       var fragmentPercentEncodeSet = assign$1({}, C0ControlPercentEncodeSet, {
+         ' ': 1, '"': 1, '<': 1, '>': 1, '`': 1
+       });
+       var pathPercentEncodeSet = assign$1({}, fragmentPercentEncodeSet, {
+         '#': 1, '?': 1, '{': 1, '}': 1
+       });
+       var userinfoPercentEncodeSet = assign$1({}, pathPercentEncodeSet, {
+         '/': 1, ':': 1, ';': 1, '=': 1, '@': 1, '[': 1, '\\': 1, ']': 1, '^': 1, '|': 1
+       });
+
+       var percentEncode = function (chr, set) {
+         var code = codeAt(chr, 0);
+         return code > 0x20 && code < 0x7F && !hasOwn(set, chr) ? chr : encodeURIComponent(chr);
+       };
+
+       // https://url.spec.whatwg.org/#special-scheme
+       var specialSchemes = {
+         ftp: 21,
+         file: null,
+         http: 80,
+         https: 443,
+         ws: 80,
+         wss: 443
+       };
+
+       // https://url.spec.whatwg.org/#windows-drive-letter
+       var isWindowsDriveLetter = function (string, normalized) {
+         var second;
+         return string.length == 2 && exec(ALPHA, charAt(string, 0))
+           && ((second = charAt(string, 1)) == ':' || (!normalized && second == '|'));
+       };
+
+       // https://url.spec.whatwg.org/#start-with-a-windows-drive-letter
+       var startsWithWindowsDriveLetter = function (string) {
+         var third;
+         return string.length > 1 && isWindowsDriveLetter(stringSlice(string, 0, 2)) && (
+           string.length == 2 ||
+           ((third = charAt(string, 2)) === '/' || third === '\\' || third === '?' || third === '#')
+         );
+       };
+
+       // https://url.spec.whatwg.org/#single-dot-path-segment
+       var isSingleDot = function (segment) {
+         return segment === '.' || toLowerCase(segment) === '%2e';
+       };
+
+       // https://url.spec.whatwg.org/#double-dot-path-segment
+       var isDoubleDot = function (segment) {
+         segment = toLowerCase(segment);
+         return segment === '..' || segment === '%2e.' || segment === '.%2e' || segment === '%2e%2e';
+       };
+
+       // States:
+       var SCHEME_START = {};
+       var SCHEME = {};
+       var NO_SCHEME = {};
+       var SPECIAL_RELATIVE_OR_AUTHORITY = {};
+       var PATH_OR_AUTHORITY = {};
+       var RELATIVE = {};
+       var RELATIVE_SLASH = {};
+       var SPECIAL_AUTHORITY_SLASHES = {};
+       var SPECIAL_AUTHORITY_IGNORE_SLASHES = {};
+       var AUTHORITY = {};
+       var HOST = {};
+       var HOSTNAME = {};
+       var PORT = {};
+       var FILE = {};
+       var FILE_SLASH = {};
+       var FILE_HOST = {};
+       var PATH_START = {};
+       var PATH = {};
+       var CANNOT_BE_A_BASE_URL_PATH = {};
+       var QUERY = {};
+       var FRAGMENT = {};
+
+       var URLState = function (url, isBase, base) {
+         var urlString = $toString(url);
+         var baseState, failure, searchParams;
+         if (isBase) {
+           failure = this.parse(urlString);
+           if (failure) throw TypeError$1(failure);
+           this.searchParams = null;
+         } else {
+           if (base !== undefined) baseState = new URLState(base, true);
+           failure = this.parse(urlString, null, baseState);
+           if (failure) throw TypeError$1(failure);
+           searchParams = getInternalSearchParamsState(new URLSearchParams$1());
+           searchParams.bindURL(this);
+           this.searchParams = searchParams;
+         }
+       };
+
+       URLState.prototype = {
+         type: 'URL',
+         // https://url.spec.whatwg.org/#url-parsing
+         // eslint-disable-next-line max-statements -- TODO
+         parse: function (input, stateOverride, base) {
+           var url = this;
+           var state = stateOverride || SCHEME_START;
+           var pointer = 0;
+           var buffer = '';
+           var seenAt = false;
+           var seenBracket = false;
+           var seenPasswordToken = false;
+           var codePoints, chr, bufferCodePoints, failure;
+
+           input = $toString(input);
+
+           if (!stateOverride) {
+             url.scheme = '';
+             url.username = '';
+             url.password = '';
+             url.host = null;
+             url.port = null;
+             url.path = [];
+             url.query = null;
+             url.fragment = null;
+             url.cannotBeABaseURL = false;
+             input = replace(input, LEADING_AND_TRAILING_C0_CONTROL_OR_SPACE, '');
+           }
+
+           input = replace(input, TAB_AND_NEW_LINE, '');
+
+           codePoints = arrayFrom(input);
+
+           while (pointer <= codePoints.length) {
+             chr = codePoints[pointer];
+             switch (state) {
+               case SCHEME_START:
+                 if (chr && exec(ALPHA, chr)) {
+                   buffer += toLowerCase(chr);
+                   state = SCHEME;
+                 } else if (!stateOverride) {
+                   state = NO_SCHEME;
+                   continue;
+                 } else return INVALID_SCHEME;
+                 break;
+
+               case SCHEME:
+                 if (chr && (exec(ALPHANUMERIC, chr) || chr == '+' || chr == '-' || chr == '.')) {
+                   buffer += toLowerCase(chr);
+                 } else if (chr == ':') {
+                   if (stateOverride && (
+                     (url.isSpecial() != hasOwn(specialSchemes, buffer)) ||
+                     (buffer == 'file' && (url.includesCredentials() || url.port !== null)) ||
+                     (url.scheme == 'file' && !url.host)
+                   )) return;
+                   url.scheme = buffer;
+                   if (stateOverride) {
+                     if (url.isSpecial() && specialSchemes[url.scheme] == url.port) url.port = null;
+                     return;
+                   }
+                   buffer = '';
+                   if (url.scheme == 'file') {
+                     state = FILE;
+                   } else if (url.isSpecial() && base && base.scheme == url.scheme) {
+                     state = SPECIAL_RELATIVE_OR_AUTHORITY;
+                   } else if (url.isSpecial()) {
+                     state = SPECIAL_AUTHORITY_SLASHES;
+                   } else if (codePoints[pointer + 1] == '/') {
+                     state = PATH_OR_AUTHORITY;
+                     pointer++;
+                   } else {
+                     url.cannotBeABaseURL = true;
+                     push(url.path, '');
+                     state = CANNOT_BE_A_BASE_URL_PATH;
+                   }
+                 } else if (!stateOverride) {
+                   buffer = '';
+                   state = NO_SCHEME;
+                   pointer = 0;
+                   continue;
+                 } else return INVALID_SCHEME;
+                 break;
+
+               case NO_SCHEME:
+                 if (!base || (base.cannotBeABaseURL && chr != '#')) return INVALID_SCHEME;
+                 if (base.cannotBeABaseURL && chr == '#') {
+                   url.scheme = base.scheme;
+                   url.path = arraySlice(base.path);
+                   url.query = base.query;
+                   url.fragment = '';
+                   url.cannotBeABaseURL = true;
+                   state = FRAGMENT;
+                   break;
+                 }
+                 state = base.scheme == 'file' ? FILE : RELATIVE;
+                 continue;
+
+               case SPECIAL_RELATIVE_OR_AUTHORITY:
+                 if (chr == '/' && codePoints[pointer + 1] == '/') {
+                   state = SPECIAL_AUTHORITY_IGNORE_SLASHES;
+                   pointer++;
+                 } else {
+                   state = RELATIVE;
+                   continue;
+                 } break;
+
+               case PATH_OR_AUTHORITY:
+                 if (chr == '/') {
+                   state = AUTHORITY;
+                   break;
+                 } else {
+                   state = PATH;
+                   continue;
+                 }
+
+               case RELATIVE:
+                 url.scheme = base.scheme;
+                 if (chr == EOF) {
+                   url.username = base.username;
+                   url.password = base.password;
+                   url.host = base.host;
+                   url.port = base.port;
+                   url.path = arraySlice(base.path);
+                   url.query = base.query;
+                 } else if (chr == '/' || (chr == '\\' && url.isSpecial())) {
+                   state = RELATIVE_SLASH;
+                 } else if (chr == '?') {
+                   url.username = base.username;
+                   url.password = base.password;
+                   url.host = base.host;
+                   url.port = base.port;
+                   url.path = arraySlice(base.path);
+                   url.query = '';
+                   state = QUERY;
+                 } else if (chr == '#') {
+                   url.username = base.username;
+                   url.password = base.password;
+                   url.host = base.host;
+                   url.port = base.port;
+                   url.path = arraySlice(base.path);
+                   url.query = base.query;
+                   url.fragment = '';
+                   state = FRAGMENT;
+                 } else {
+                   url.username = base.username;
+                   url.password = base.password;
+                   url.host = base.host;
+                   url.port = base.port;
+                   url.path = arraySlice(base.path);
+                   url.path.length--;
+                   state = PATH;
+                   continue;
+                 } break;
+
+               case RELATIVE_SLASH:
+                 if (url.isSpecial() && (chr == '/' || chr == '\\')) {
+                   state = SPECIAL_AUTHORITY_IGNORE_SLASHES;
+                 } else if (chr == '/') {
+                   state = AUTHORITY;
+                 } else {
+                   url.username = base.username;
+                   url.password = base.password;
+                   url.host = base.host;
+                   url.port = base.port;
+                   state = PATH;
+                   continue;
+                 } break;
+
+               case SPECIAL_AUTHORITY_SLASHES:
+                 state = SPECIAL_AUTHORITY_IGNORE_SLASHES;
+                 if (chr != '/' || charAt(buffer, pointer + 1) != '/') continue;
+                 pointer++;
+                 break;
+
+               case SPECIAL_AUTHORITY_IGNORE_SLASHES:
+                 if (chr != '/' && chr != '\\') {
+                   state = AUTHORITY;
+                   continue;
+                 } break;
+
+               case AUTHORITY:
+                 if (chr == '@') {
+                   if (seenAt) buffer = '%40' + buffer;
+                   seenAt = true;
+                   bufferCodePoints = arrayFrom(buffer);
+                   for (var i = 0; i < bufferCodePoints.length; i++) {
+                     var codePoint = bufferCodePoints[i];
+                     if (codePoint == ':' && !seenPasswordToken) {
+                       seenPasswordToken = true;
+                       continue;
+                     }
+                     var encodedCodePoints = percentEncode(codePoint, userinfoPercentEncodeSet);
+                     if (seenPasswordToken) url.password += encodedCodePoints;
+                     else url.username += encodedCodePoints;
+                   }
+                   buffer = '';
+                 } else if (
+                   chr == EOF || chr == '/' || chr == '?' || chr == '#' ||
+                   (chr == '\\' && url.isSpecial())
+                 ) {
+                   if (seenAt && buffer == '') return INVALID_AUTHORITY;
+                   pointer -= arrayFrom(buffer).length + 1;
+                   buffer = '';
+                   state = HOST;
+                 } else buffer += chr;
+                 break;
+
+               case HOST:
+               case HOSTNAME:
+                 if (stateOverride && url.scheme == 'file') {
+                   state = FILE_HOST;
+                   continue;
+                 } else if (chr == ':' && !seenBracket) {
+                   if (buffer == '') return INVALID_HOST;
+                   failure = url.parseHost(buffer);
+                   if (failure) return failure;
+                   buffer = '';
+                   state = PORT;
+                   if (stateOverride == HOSTNAME) return;
+                 } else if (
+                   chr == EOF || chr == '/' || chr == '?' || chr == '#' ||
+                   (chr == '\\' && url.isSpecial())
+                 ) {
+                   if (url.isSpecial() && buffer == '') return INVALID_HOST;
+                   if (stateOverride && buffer == '' && (url.includesCredentials() || url.port !== null)) return;
+                   failure = url.parseHost(buffer);
+                   if (failure) return failure;
+                   buffer = '';
+                   state = PATH_START;
+                   if (stateOverride) return;
+                   continue;
+                 } else {
+                   if (chr == '[') seenBracket = true;
+                   else if (chr == ']') seenBracket = false;
+                   buffer += chr;
+                 } break;
+
+               case PORT:
+                 if (exec(DIGIT, chr)) {
+                   buffer += chr;
+                 } else if (
+                   chr == EOF || chr == '/' || chr == '?' || chr == '#' ||
+                   (chr == '\\' && url.isSpecial()) ||
+                   stateOverride
+                 ) {
+                   if (buffer != '') {
+                     var port = parseInt$1(buffer, 10);
+                     if (port > 0xFFFF) return INVALID_PORT;
+                     url.port = (url.isSpecial() && port === specialSchemes[url.scheme]) ? null : port;
+                     buffer = '';
+                   }
+                   if (stateOverride) return;
+                   state = PATH_START;
+                   continue;
+                 } else return INVALID_PORT;
+                 break;
+
+               case FILE:
+                 url.scheme = 'file';
+                 if (chr == '/' || chr == '\\') state = FILE_SLASH;
+                 else if (base && base.scheme == 'file') {
+                   if (chr == EOF) {
+                     url.host = base.host;
+                     url.path = arraySlice(base.path);
+                     url.query = base.query;
+                   } else if (chr == '?') {
+                     url.host = base.host;
+                     url.path = arraySlice(base.path);
+                     url.query = '';
+                     state = QUERY;
+                   } else if (chr == '#') {
+                     url.host = base.host;
+                     url.path = arraySlice(base.path);
+                     url.query = base.query;
+                     url.fragment = '';
+                     state = FRAGMENT;
+                   } else {
+                     if (!startsWithWindowsDriveLetter(join(arraySlice(codePoints, pointer), ''))) {
+                       url.host = base.host;
+                       url.path = arraySlice(base.path);
+                       url.shortenPath();
+                     }
+                     state = PATH;
+                     continue;
+                   }
+                 } else {
+                   state = PATH;
+                   continue;
+                 } break;
+
+               case FILE_SLASH:
+                 if (chr == '/' || chr == '\\') {
+                   state = FILE_HOST;
+                   break;
+                 }
+                 if (base && base.scheme == 'file' && !startsWithWindowsDriveLetter(join(arraySlice(codePoints, pointer), ''))) {
+                   if (isWindowsDriveLetter(base.path[0], true)) push(url.path, base.path[0]);
+                   else url.host = base.host;
+                 }
+                 state = PATH;
+                 continue;
+
+               case FILE_HOST:
+                 if (chr == EOF || chr == '/' || chr == '\\' || chr == '?' || chr == '#') {
+                   if (!stateOverride && isWindowsDriveLetter(buffer)) {
+                     state = PATH;
+                   } else if (buffer == '') {
+                     url.host = '';
+                     if (stateOverride) return;
+                     state = PATH_START;
+                   } else {
+                     failure = url.parseHost(buffer);
+                     if (failure) return failure;
+                     if (url.host == 'localhost') url.host = '';
+                     if (stateOverride) return;
+                     buffer = '';
+                     state = PATH_START;
+                   } continue;
+                 } else buffer += chr;
+                 break;
+
+               case PATH_START:
+                 if (url.isSpecial()) {
+                   state = PATH;
+                   if (chr != '/' && chr != '\\') continue;
+                 } else if (!stateOverride && chr == '?') {
+                   url.query = '';
+                   state = QUERY;
+                 } else if (!stateOverride && chr == '#') {
+                   url.fragment = '';
+                   state = FRAGMENT;
+                 } else if (chr != EOF) {
+                   state = PATH;
+                   if (chr != '/') continue;
+                 } break;
+
+               case PATH:
+                 if (
+                   chr == EOF || chr == '/' ||
+                   (chr == '\\' && url.isSpecial()) ||
+                   (!stateOverride && (chr == '?' || chr == '#'))
+                 ) {
+                   if (isDoubleDot(buffer)) {
+                     url.shortenPath();
+                     if (chr != '/' && !(chr == '\\' && url.isSpecial())) {
+                       push(url.path, '');
+                     }
+                   } else if (isSingleDot(buffer)) {
+                     if (chr != '/' && !(chr == '\\' && url.isSpecial())) {
+                       push(url.path, '');
+                     }
+                   } else {
+                     if (url.scheme == 'file' && !url.path.length && isWindowsDriveLetter(buffer)) {
+                       if (url.host) url.host = '';
+                       buffer = charAt(buffer, 0) + ':'; // normalize windows drive letter
+                     }
+                     push(url.path, buffer);
+                   }
+                   buffer = '';
+                   if (url.scheme == 'file' && (chr == EOF || chr == '?' || chr == '#')) {
+                     while (url.path.length > 1 && url.path[0] === '') {
+                       shift(url.path);
+                     }
+                   }
+                   if (chr == '?') {
+                     url.query = '';
+                     state = QUERY;
+                   } else if (chr == '#') {
+                     url.fragment = '';
+                     state = FRAGMENT;
+                   }
+                 } else {
+                   buffer += percentEncode(chr, pathPercentEncodeSet);
+                 } break;
+
+               case CANNOT_BE_A_BASE_URL_PATH:
+                 if (chr == '?') {
+                   url.query = '';
+                   state = QUERY;
+                 } else if (chr == '#') {
+                   url.fragment = '';
+                   state = FRAGMENT;
+                 } else if (chr != EOF) {
+                   url.path[0] += percentEncode(chr, C0ControlPercentEncodeSet);
+                 } break;
+
+               case QUERY:
+                 if (!stateOverride && chr == '#') {
+                   url.fragment = '';
+                   state = FRAGMENT;
+                 } else if (chr != EOF) {
+                   if (chr == "'" && url.isSpecial()) url.query += '%27';
+                   else if (chr == '#') url.query += '%23';
+                   else url.query += percentEncode(chr, C0ControlPercentEncodeSet);
+                 } break;
+
+               case FRAGMENT:
+                 if (chr != EOF) url.fragment += percentEncode(chr, fragmentPercentEncodeSet);
+                 break;
+             }
+
+             pointer++;
+           }
+         },
+         // https://url.spec.whatwg.org/#host-parsing
+         parseHost: function (input) {
+           var result, codePoints, index;
+           if (charAt(input, 0) == '[') {
+             if (charAt(input, input.length - 1) != ']') return INVALID_HOST;
+             result = parseIPv6(stringSlice(input, 1, -1));
+             if (!result) return INVALID_HOST;
+             this.host = result;
+           // opaque host
+           } else if (!this.isSpecial()) {
+             if (exec(FORBIDDEN_HOST_CODE_POINT_EXCLUDING_PERCENT, input)) return INVALID_HOST;
+             result = '';
+             codePoints = arrayFrom(input);
+             for (index = 0; index < codePoints.length; index++) {
+               result += percentEncode(codePoints[index], C0ControlPercentEncodeSet);
+             }
+             this.host = result;
+           } else {
+             input = toASCII(input);
+             if (exec(FORBIDDEN_HOST_CODE_POINT, input)) return INVALID_HOST;
+             result = parseIPv4(input);
+             if (result === null) return INVALID_HOST;
+             this.host = result;
+           }
+         },
+         // https://url.spec.whatwg.org/#cannot-have-a-username-password-port
+         cannotHaveUsernamePasswordPort: function () {
+           return !this.host || this.cannotBeABaseURL || this.scheme == 'file';
+         },
+         // https://url.spec.whatwg.org/#include-credentials
+         includesCredentials: function () {
+           return this.username != '' || this.password != '';
+         },
+         // https://url.spec.whatwg.org/#is-special
+         isSpecial: function () {
+           return hasOwn(specialSchemes, this.scheme);
+         },
+         // https://url.spec.whatwg.org/#shorten-a-urls-path
+         shortenPath: function () {
+           var path = this.path;
+           var pathSize = path.length;
+           if (pathSize && (this.scheme != 'file' || pathSize != 1 || !isWindowsDriveLetter(path[0], true))) {
+             path.length--;
+           }
+         },
+         // https://url.spec.whatwg.org/#concept-url-serializer
+         serialize: function () {
+           var url = this;
+           var scheme = url.scheme;
+           var username = url.username;
+           var password = url.password;
+           var host = url.host;
+           var port = url.port;
+           var path = url.path;
+           var query = url.query;
+           var fragment = url.fragment;
+           var output = scheme + ':';
+           if (host !== null) {
+             output += '//';
+             if (url.includesCredentials()) {
+               output += username + (password ? ':' + password : '') + '@';
+             }
+             output += serializeHost(host);
+             if (port !== null) output += ':' + port;
+           } else if (scheme == 'file') output += '//';
+           output += url.cannotBeABaseURL ? path[0] : path.length ? '/' + join(path, '/') : '';
+           if (query !== null) output += '?' + query;
+           if (fragment !== null) output += '#' + fragment;
+           return output;
+         },
+         // https://url.spec.whatwg.org/#dom-url-href
+         setHref: function (href) {
+           var failure = this.parse(href);
+           if (failure) throw TypeError$1(failure);
+           this.searchParams.update();
+         },
+         // https://url.spec.whatwg.org/#dom-url-origin
+         getOrigin: function () {
+           var scheme = this.scheme;
+           var port = this.port;
+           if (scheme == 'blob') try {
+             return new URLConstructor(scheme.path[0]).origin;
+           } catch (error) {
+             return 'null';
+           }
+           if (scheme == 'file' || !this.isSpecial()) return 'null';
+           return scheme + '://' + serializeHost(this.host) + (port !== null ? ':' + port : '');
+         },
+         // https://url.spec.whatwg.org/#dom-url-protocol
+         getProtocol: function () {
+           return this.scheme + ':';
+         },
+         setProtocol: function (protocol) {
+           this.parse($toString(protocol) + ':', SCHEME_START);
+         },
+         // https://url.spec.whatwg.org/#dom-url-username
+         getUsername: function () {
+           return this.username;
+         },
+         setUsername: function (username) {
+           var codePoints = arrayFrom($toString(username));
+           if (this.cannotHaveUsernamePasswordPort()) return;
+           this.username = '';
+           for (var i = 0; i < codePoints.length; i++) {
+             this.username += percentEncode(codePoints[i], userinfoPercentEncodeSet);
+           }
+         },
+         // https://url.spec.whatwg.org/#dom-url-password
+         getPassword: function () {
+           return this.password;
+         },
+         setPassword: function (password) {
+           var codePoints = arrayFrom($toString(password));
+           if (this.cannotHaveUsernamePasswordPort()) return;
+           this.password = '';
+           for (var i = 0; i < codePoints.length; i++) {
+             this.password += percentEncode(codePoints[i], userinfoPercentEncodeSet);
+           }
+         },
+         // https://url.spec.whatwg.org/#dom-url-host
+         getHost: function () {
+           var host = this.host;
+           var port = this.port;
+           return host === null ? ''
+             : port === null ? serializeHost(host)
+             : serializeHost(host) + ':' + port;
+         },
+         setHost: function (host) {
+           if (this.cannotBeABaseURL) return;
+           this.parse(host, HOST);
+         },
+         // https://url.spec.whatwg.org/#dom-url-hostname
+         getHostname: function () {
+           var host = this.host;
+           return host === null ? '' : serializeHost(host);
+         },
+         setHostname: function (hostname) {
+           if (this.cannotBeABaseURL) return;
+           this.parse(hostname, HOSTNAME);
+         },
+         // https://url.spec.whatwg.org/#dom-url-port
+         getPort: function () {
+           var port = this.port;
+           return port === null ? '' : $toString(port);
+         },
+         setPort: function (port) {
+           if (this.cannotHaveUsernamePasswordPort()) return;
+           port = $toString(port);
+           if (port == '') this.port = null;
+           else this.parse(port, PORT);
+         },
+         // https://url.spec.whatwg.org/#dom-url-pathname
+         getPathname: function () {
+           var path = this.path;
+           return this.cannotBeABaseURL ? path[0] : path.length ? '/' + join(path, '/') : '';
+         },
+         setPathname: function (pathname) {
+           if (this.cannotBeABaseURL) return;
+           this.path = [];
+           this.parse(pathname, PATH_START);
+         },
+         // https://url.spec.whatwg.org/#dom-url-search
+         getSearch: function () {
+           var query = this.query;
+           return query ? '?' + query : '';
+         },
+         setSearch: function (search) {
+           search = $toString(search);
+           if (search == '') {
+             this.query = null;
+           } else {
+             if ('?' == charAt(search, 0)) search = stringSlice(search, 1);
+             this.query = '';
+             this.parse(search, QUERY);
+           }
+           this.searchParams.update();
+         },
+         // https://url.spec.whatwg.org/#dom-url-searchparams
+         getSearchParams: function () {
+           return this.searchParams.facade;
+         },
+         // https://url.spec.whatwg.org/#dom-url-hash
+         getHash: function () {
+           var fragment = this.fragment;
+           return fragment ? '#' + fragment : '';
+         },
+         setHash: function (hash) {
+           hash = $toString(hash);
+           if (hash == '') {
+             this.fragment = null;
+             return;
+           }
+           if ('#' == charAt(hash, 0)) hash = stringSlice(hash, 1);
+           this.fragment = '';
+           this.parse(hash, FRAGMENT);
+         },
+         update: function () {
+           this.query = this.searchParams.serialize() || null;
+         }
+       };
+
+       // `URL` constructor
+       // https://url.spec.whatwg.org/#url-class
+       var URLConstructor = function URL(url /* , base */) {
+         var that = anInstance(this, URLPrototype);
+         var base = validateArgumentsLength(arguments.length, 1) > 1 ? arguments[1] : undefined;
+         var state = setInternalState(that, new URLState(url, false, base));
+         if (!DESCRIPTORS) {
+           that.href = state.serialize();
+           that.origin = state.getOrigin();
+           that.protocol = state.getProtocol();
+           that.username = state.getUsername();
+           that.password = state.getPassword();
+           that.host = state.getHost();
+           that.hostname = state.getHostname();
+           that.port = state.getPort();
+           that.pathname = state.getPathname();
+           that.search = state.getSearch();
+           that.searchParams = state.getSearchParams();
+           that.hash = state.getHash();
+         }
+       };
+
+       var URLPrototype = URLConstructor.prototype;
+
+       var accessorDescriptor = function (getter, setter) {
+         return {
+           get: function () {
+             return getInternalURLState(this)[getter]();
+           },
+           set: setter && function (value) {
+             return getInternalURLState(this)[setter](value);
+           },
+           configurable: true,
+           enumerable: true
+         };
+       };
+
+       if (DESCRIPTORS) {
+         defineProperties(URLPrototype, {
+           // `URL.prototype.href` accessors pair
+           // https://url.spec.whatwg.org/#dom-url-href
+           href: accessorDescriptor('serialize', 'setHref'),
+           // `URL.prototype.origin` getter
+           // https://url.spec.whatwg.org/#dom-url-origin
+           origin: accessorDescriptor('getOrigin'),
+           // `URL.prototype.protocol` accessors pair
+           // https://url.spec.whatwg.org/#dom-url-protocol
+           protocol: accessorDescriptor('getProtocol', 'setProtocol'),
+           // `URL.prototype.username` accessors pair
+           // https://url.spec.whatwg.org/#dom-url-username
+           username: accessorDescriptor('getUsername', 'setUsername'),
+           // `URL.prototype.password` accessors pair
+           // https://url.spec.whatwg.org/#dom-url-password
+           password: accessorDescriptor('getPassword', 'setPassword'),
+           // `URL.prototype.host` accessors pair
+           // https://url.spec.whatwg.org/#dom-url-host
+           host: accessorDescriptor('getHost', 'setHost'),
+           // `URL.prototype.hostname` accessors pair
+           // https://url.spec.whatwg.org/#dom-url-hostname
+           hostname: accessorDescriptor('getHostname', 'setHostname'),
+           // `URL.prototype.port` accessors pair
+           // https://url.spec.whatwg.org/#dom-url-port
+           port: accessorDescriptor('getPort', 'setPort'),
+           // `URL.prototype.pathname` accessors pair
+           // https://url.spec.whatwg.org/#dom-url-pathname
+           pathname: accessorDescriptor('getPathname', 'setPathname'),
+           // `URL.prototype.search` accessors pair
+           // https://url.spec.whatwg.org/#dom-url-search
+           search: accessorDescriptor('getSearch', 'setSearch'),
+           // `URL.prototype.searchParams` getter
+           // https://url.spec.whatwg.org/#dom-url-searchparams
+           searchParams: accessorDescriptor('getSearchParams'),
+           // `URL.prototype.hash` accessors pair
+           // https://url.spec.whatwg.org/#dom-url-hash
+           hash: accessorDescriptor('getHash', 'setHash')
+         });
+       }
+
+       // `URL.prototype.toJSON` method
+       // https://url.spec.whatwg.org/#dom-url-tojson
+       redefine(URLPrototype, 'toJSON', function toJSON() {
+         return getInternalURLState(this).serialize();
+       }, { enumerable: true });
+
+       // `URL.prototype.toString` method
+       // https://url.spec.whatwg.org/#URL-stringification-behavior
+       redefine(URLPrototype, 'toString', function toString() {
+         return getInternalURLState(this).serialize();
+       }, { enumerable: true });
+
+       if (NativeURL) {
+         var nativeCreateObjectURL = NativeURL.createObjectURL;
+         var nativeRevokeObjectURL = NativeURL.revokeObjectURL;
+         // `URL.createObjectURL` method
+         // https://developer.mozilla.org/en-US/docs/Web/API/URL/createObjectURL
+         if (nativeCreateObjectURL) redefine(URLConstructor, 'createObjectURL', bind$2(nativeCreateObjectURL, NativeURL));
+         // `URL.revokeObjectURL` method
+         // https://developer.mozilla.org/en-US/docs/Web/API/URL/revokeObjectURL
+         if (nativeRevokeObjectURL) redefine(URLConstructor, 'revokeObjectURL', bind$2(nativeRevokeObjectURL, NativeURL));
+       }
+
+       setToStringTag(URLConstructor, 'URL');
+
+       $({ global: true, forced: !USE_NATIVE_URL, sham: !DESCRIPTORS }, {
+         URL: URLConstructor
+       });
+
+       function uiFieldText(field, context) {
+         var dispatch = dispatch$8('change');
+         var input = select(null);
+         var outlinkButton = select(null);
+         var wrap = select(null);
+         var _entityIDs = [];
+
+         var _tags;
+
+         var _phoneFormats = {};
+
+         if (field.type === 'tel') {
+           _mainFileFetcher.get('phone_formats').then(function (d) {
+             _phoneFormats = d;
+             updatePhonePlaceholder();
+           })["catch"](function () {
+             /* ignore */
+           });
+         }
+
+         function calcLocked() {
+           // Protect certain fields that have a companion `*:wikidata` value
+           var isLocked = (field.id === 'brand' || field.id === 'network' || field.id === 'operator' || field.id === 'flag') && _entityIDs.length && _entityIDs.some(function (entityID) {
+             var entity = context.graph().hasEntity(entityID);
+             if (!entity) return false; // Features linked to Wikidata are likely important and should be protected
+
+             if (entity.tags.wikidata) return true;
+             var preset = _mainPresetIndex.match(entity, context.graph());
+             var isSuggestion = preset && preset.suggestion; // Lock the field if there is a value and a companion `*:wikidata` value
+
+             var which = field.id; // 'brand', 'network', 'operator', 'flag'
+
+             return isSuggestion && !!entity.tags[which] && !!entity.tags[which + ':wikidata'];
+           });
+
+           field.locked(isLocked);
+         }
+
+         function i(selection) {
+           calcLocked();
+           var isLocked = field.locked();
+           wrap = selection.selectAll('.form-field-input-wrap').data([0]);
+           wrap = wrap.enter().append('div').attr('class', 'form-field-input-wrap form-field-input-' + field.type).merge(wrap);
+           input = wrap.selectAll('input').data([0]);
+           input = input.enter().append('input').attr('type', field.type === 'identifier' ? 'text' : field.type).attr('id', field.domId).classed(field.type, true).call(utilNoAuto).merge(input);
+           input.classed('disabled', !!isLocked).attr('readonly', isLocked || null).on('input', change(true)).on('blur', change()).on('change', change());
+
+           if (field.type === 'tel') {
+             updatePhonePlaceholder();
+           } else if (field.type === 'number') {
+             var rtl = _mainLocalizer.textDirection() === 'rtl';
+             input.attr('type', 'text');
+             var inc = field.increment;
+             var buttons = wrap.selectAll('.increment, .decrement').data(rtl ? [inc, -inc] : [-inc, inc]);
+             buttons.enter().append('button').attr('class', function (d) {
+               var which = d > 0 ? 'increment' : 'decrement';
+               return 'form-field-button ' + which;
+             }).attr('title', function (d) {
+               var which = d > 0 ? 'increment' : 'decrement';
+               return _t("inspector.".concat(which));
+             }).merge(buttons).on('click', function (d3_event, d) {
+               d3_event.preventDefault();
+               var raw_vals = input.node().value || '0';
+               var vals = raw_vals.split(';');
+               vals = vals.map(function (v) {
+                 var num = parseFloat(v.trim(), 10);
+                 return isFinite(num) ? clamped(num + d) : v.trim();
+               });
+               input.node().value = vals.join(';');
+               change()();
+             });
+           } else if (field.type === 'identifier' && field.urlFormat && field.pattern) {
+             input.attr('type', 'text');
+             outlinkButton = wrap.selectAll('.foreign-id-permalink').data([0]);
+             outlinkButton.enter().append('button').call(svgIcon('#iD-icon-out-link')).attr('class', 'form-field-button foreign-id-permalink').attr('title', function () {
+               var domainResults = /^https?:\/\/(.{1,}?)\//.exec(field.urlFormat);
+
+               if (domainResults.length >= 2 && domainResults[1]) {
+                 var domain = domainResults[1];
+                 return _t('icons.view_on', {
+                   domain: domain
+                 });
+               }
+
+               return '';
+             }).on('click', function (d3_event) {
+               d3_event.preventDefault();
+               var value = validIdentifierValueForLink();
+
+               if (value) {
+                 var url = field.urlFormat.replace(/{value}/, encodeURIComponent(value));
+                 window.open(url, '_blank');
+               }
+             }).merge(outlinkButton);
+           } else if (field.type === 'url') {
+             input.attr('type', 'text');
+             outlinkButton = wrap.selectAll('.foreign-id-permalink').data([0]);
+             outlinkButton.enter().append('button').call(svgIcon('#iD-icon-out-link')).attr('class', 'form-field-button foreign-id-permalink').attr('title', function () {
+               return _t('icons.visit_website');
+             }).on('click', function (d3_event) {
+               d3_event.preventDefault();
+               var value = validIdentifierValueForLink();
+               if (value) window.open(value, '_blank');
+             }).merge(outlinkButton);
+           } else if (field.key.split(':').includes('colour')) {
+             input.attr('type', 'text');
+             updateColourPreview();
+           }
+         }
+
+         function isColourValid(colour) {
+           if (!colour.match(/^(#([0-9a-fA-F]{3}){1,2}|\w+)$/)) {
+             // OSM only supports hex or named colors
+             return false;
+           } else if (!CSS.supports('color', colour) || ['unset', 'inherit', 'initial', 'revert'].includes(colour)) {
+             // see https://stackoverflow.com/a/68217760/1627467
+             return false;
+           }
+
+           return true;
+         }
+
+         function updateColourPreview() {
+           wrap.selectAll('.colour-preview').remove();
+           var colour = utilGetSetValue(input);
+           if (!isColourValid(colour) && colour !== '') return;
+           var colourSelector = wrap.selectAll('.colour-selector').data([0]);
+           outlinkButton = wrap.selectAll('.colour-preview').data([colour]);
+           colourSelector.enter().append('input').attr('type', 'color').attr('class', 'form-field-button colour-selector').attr('value', colour).on('input', debounce(function (d3_event) {
+             d3_event.preventDefault();
+             var colour = this.value;
+             if (!isColourValid(colour)) return;
+             utilGetSetValue(input, this.value);
+             change()();
+             updateColourPreview();
+           }, 100));
+           outlinkButton = outlinkButton.enter().append('div').attr('class', 'form-field-button colour-preview').append('div').style('background-color', function (d) {
+             return d;
+           }).attr('class', 'colour-box');
+
+           if (colour === '') {
+             outlinkButton = outlinkButton.call(svgIcon('#iD-icon-edit'));
+           }
+
+           outlinkButton.on('click', function () {
+             return wrap.select('.colour-selector').node().click();
+           }).merge(outlinkButton);
+         }
+
+         function updatePhonePlaceholder() {
+           if (input.empty() || !Object.keys(_phoneFormats).length) return;
+           var extent = combinedEntityExtent();
+           var countryCode = extent && iso1A2Code(extent.center());
+
+           var format = countryCode && _phoneFormats[countryCode.toLowerCase()];
+
+           if (format) input.attr('placeholder', format);
+         }
+
+         function validIdentifierValueForLink() {
+           var value = utilGetSetValue(input).trim();
+
+           if (field.type === 'url' && value) {
+             try {
+               return new URL(value).href;
+             } catch (e) {
+               return null;
+             }
+           }
+
+           if (field.type === 'identifier' && field.pattern) {
+             return value && value.match(new RegExp(field.pattern))[0];
+           }
+
+           return null;
+         } // clamp number to min/max
+
+
+         function clamped(num) {
+           if (field.minValue !== undefined) {
+             num = Math.max(num, field.minValue);
+           }
+
+           if (field.maxValue !== undefined) {
+             num = Math.min(num, field.maxValue);
+           }
+
+           return num;
+         }
+
+         function change(onInput) {
+           return function () {
+             var t = {};
+             var val = utilGetSetValue(input);
+             if (!onInput) val = context.cleanTagValue(val); // don't override multiple values with blank string
+
+             if (!val && Array.isArray(_tags[field.key])) return;
+
+             if (!onInput) {
+               if (field.type === 'number' && val) {
+                 var vals = val.split(';');
+                 vals = vals.map(function (v) {
+                   var num = parseFloat(v.trim(), 10);
+                   return isFinite(num) ? clamped(num) : v.trim();
+                 });
+                 val = vals.join(';');
+               }
+
+               utilGetSetValue(input, val);
+             }
+
+             t[field.key] = val || undefined;
+             dispatch.call('change', this, t, onInput);
+           };
+         }
+
+         i.entityIDs = function (val) {
+           if (!arguments.length) return _entityIDs;
+           _entityIDs = val;
+           return i;
+         };
+
+         i.tags = function (tags) {
+           _tags = tags;
+           var isMixed = Array.isArray(tags[field.key]);
+           utilGetSetValue(input, !isMixed && tags[field.key] ? tags[field.key] : '').attr('title', isMixed ? tags[field.key].filter(Boolean).join('\n') : undefined).attr('placeholder', isMixed ? _t('inspector.multiple_values') : field.placeholder() || _t('inspector.unknown')).classed('mixed', isMixed);
+           if (field.key.split(':').includes('colour')) updateColourPreview();
+
+           if (outlinkButton && !outlinkButton.empty()) {
+             var disabled = !validIdentifierValueForLink();
+             outlinkButton.classed('disabled', disabled);
+           }
+         };
+
+         i.focus = function () {
+           var node = input.node();
+           if (node) node.focus();
+         };
+
+         function combinedEntityExtent() {
+           return _entityIDs && _entityIDs.length && utilTotalExtent(_entityIDs, context.graph());
+         }
+
+         return utilRebind(i, dispatch, 'on');
+       }
+
+       function uiFieldAccess(field, context) {
+         var dispatch = dispatch$8('change');
+         var items = select(null);
+
+         var _tags;
+
+         function access(selection) {
+           var wrap = selection.selectAll('.form-field-input-wrap').data([0]);
+           wrap = wrap.enter().append('div').attr('class', 'form-field-input-wrap form-field-input-' + field.type).merge(wrap);
+           var list = wrap.selectAll('ul').data([0]);
+           list = list.enter().append('ul').attr('class', 'rows').merge(list);
+           items = list.selectAll('li').data(field.keys); // Enter
+
+           var enter = items.enter().append('li').attr('class', function (d) {
+             return 'labeled-input preset-access-' + d;
+           });
+           enter.append('span').attr('class', 'label preset-label-access').attr('for', function (d) {
+             return 'preset-input-access-' + d;
+           }).html(function (d) {
+             return field.t.html('types.' + d);
+           });
+           enter.append('div').attr('class', 'preset-input-access-wrap').append('input').attr('type', 'text').attr('class', function (d) {
+             return 'preset-input-access preset-input-access-' + d;
+           }).call(utilNoAuto).each(function (d) {
+             select(this).call(uiCombobox(context, 'access-' + d).data(access.options(d)));
+           }); // Update
+
+           items = items.merge(enter);
+           wrap.selectAll('.preset-input-access').on('change', change).on('blur', change);
+         }
+
+         function change(d3_event, d) {
+           var tag = {};
+           var value = context.cleanTagValue(utilGetSetValue(select(this))); // don't override multiple values with blank string
+
+           if (!value && typeof _tags[d] !== 'string') return;
+           tag[d] = value || undefined;
+           dispatch.call('change', this, tag);
+         }
+
+         access.options = function (type) {
+           var options = ['no', 'permissive', 'private', 'permit', 'destination', 'customers', 'unknown'];
+
+           if (type !== 'access') {
+             options.unshift('yes');
+             options.push('designated');
+
+             if (type === 'bicycle') {
+               options.push('dismount');
+             }
+           }
+
+           return options.map(function (option) {
+             return {
+               title: field.t('options.' + option + '.description'),
+               value: option
+             };
+           });
+         };
+
+         var placeholdersByHighway = {
+           footway: {
+             foot: 'designated',
+             motor_vehicle: 'no'
+           },
+           steps: {
+             foot: 'yes',
+             motor_vehicle: 'no',
+             bicycle: 'no',
+             horse: 'no'
+           },
+           pedestrian: {
+             foot: 'yes',
+             motor_vehicle: 'no'
+           },
+           cycleway: {
+             motor_vehicle: 'no',
+             bicycle: 'designated'
+           },
+           bridleway: {
+             motor_vehicle: 'no',
+             horse: 'designated'
+           },
+           path: {
+             foot: 'yes',
+             motor_vehicle: 'no',
+             bicycle: 'yes',
+             horse: 'yes'
+           },
+           motorway: {
+             foot: 'no',
+             motor_vehicle: 'yes',
+             bicycle: 'no',
+             horse: 'no'
+           },
+           trunk: {
+             motor_vehicle: 'yes'
+           },
+           primary: {
+             foot: 'yes',
+             motor_vehicle: 'yes',
+             bicycle: 'yes',
+             horse: 'yes'
+           },
+           secondary: {
+             foot: 'yes',
+             motor_vehicle: 'yes',
+             bicycle: 'yes',
+             horse: 'yes'
+           },
+           tertiary: {
+             foot: 'yes',
+             motor_vehicle: 'yes',
+             bicycle: 'yes',
+             horse: 'yes'
+           },
+           residential: {
+             foot: 'yes',
+             motor_vehicle: 'yes',
+             bicycle: 'yes',
+             horse: 'yes'
+           },
+           unclassified: {
+             foot: 'yes',
+             motor_vehicle: 'yes',
+             bicycle: 'yes',
+             horse: 'yes'
+           },
+           service: {
+             foot: 'yes',
+             motor_vehicle: 'yes',
+             bicycle: 'yes',
+             horse: 'yes'
+           },
+           motorway_link: {
+             foot: 'no',
+             motor_vehicle: 'yes',
+             bicycle: 'no',
+             horse: 'no'
+           },
+           trunk_link: {
+             motor_vehicle: 'yes'
+           },
+           primary_link: {
+             foot: 'yes',
+             motor_vehicle: 'yes',
+             bicycle: 'yes',
+             horse: 'yes'
+           },
+           secondary_link: {
+             foot: 'yes',
+             motor_vehicle: 'yes',
+             bicycle: 'yes',
+             horse: 'yes'
+           },
+           tertiary_link: {
+             foot: 'yes',
+             motor_vehicle: 'yes',
+             bicycle: 'yes',
+             horse: 'yes'
+           }
+         };
+
+         access.tags = function (tags) {
+           _tags = tags;
+           utilGetSetValue(items.selectAll('.preset-input-access'), function (d) {
+             return typeof tags[d] === 'string' ? tags[d] : '';
+           }).classed('mixed', function (d) {
+             return tags[d] && Array.isArray(tags[d]);
+           }).attr('title', function (d) {
+             return tags[d] && Array.isArray(tags[d]) && tags[d].filter(Boolean).join('\n');
+           }).attr('placeholder', function (d) {
+             if (tags[d] && Array.isArray(tags[d])) {
+               return _t('inspector.multiple_values');
+             }
+
+             if (d === 'access') {
+               return 'yes';
+             }
+
+             if (tags.access && typeof tags.access === 'string') {
+               return tags.access;
+             }
+
+             if (tags.highway) {
+               if (typeof tags.highway === 'string') {
+                 if (placeholdersByHighway[tags.highway] && placeholdersByHighway[tags.highway][d]) {
+                   return placeholdersByHighway[tags.highway][d];
+                 }
+               } else {
+                 var impliedAccesses = tags.highway.filter(Boolean).map(function (highwayVal) {
+                   return placeholdersByHighway[highwayVal] && placeholdersByHighway[highwayVal][d];
+                 }).filter(Boolean);
+
+                 if (impliedAccesses.length === tags.highway.length && new Set(impliedAccesses).size === 1) {
+                   // if all the highway values have the same implied access for this type then use that
+                   return impliedAccesses[0];
+                 }
+               }
+             }
+
+             return field.placeholder();
+           });
+         };
+
+         access.focus = function () {
+           items.selectAll('.preset-input-access').node().focus();
+         };
+
+         return utilRebind(access, dispatch, 'on');
+       }
+
+       function uiFieldAddress(field, context) {
+         var dispatch = dispatch$8('change');
+
+         var _selection = select(null);
+
+         var _wrap = select(null);
+
+         var addrField = _mainPresetIndex.field('address'); // needed for placeholder strings
+
+         var _entityIDs = [];
+
+         var _tags;
+
+         var _countryCode;
+
+         var _addressFormats = [{
+           format: [['housenumber', 'street'], ['city', 'postcode']]
+         }];
+         _mainFileFetcher.get('address_formats').then(function (d) {
+           _addressFormats = d;
+
+           if (!_selection.empty()) {
+             _selection.call(address);
+           }
+         })["catch"](function () {
+           /* ignore */
+         });
+
+         function getNearStreets() {
+           var extent = combinedEntityExtent();
+           var l = extent.center();
+           var box = geoExtent(l).padByMeters(200);
+           var streets = context.history().intersects(box).filter(isAddressable).map(function (d) {
+             var loc = context.projection([(extent[0][0] + extent[1][0]) / 2, (extent[0][1] + extent[1][1]) / 2]);
+             var choice = geoChooseEdge(context.graph().childNodes(d), loc, context.projection);
+             return {
+               title: d.tags.name,
+               value: d.tags.name,
+               dist: choice.distance
+             };
+           }).sort(function (a, b) {
+             return a.dist - b.dist;
+           });
+           return utilArrayUniqBy(streets, 'value');
+
+           function isAddressable(d) {
+             return d.tags.highway && d.tags.name && d.type === 'way';
+           }
+         }
+
+         function getNearCities() {
+           var extent = combinedEntityExtent();
+           var l = extent.center();
+           var box = geoExtent(l).padByMeters(200);
+           var cities = context.history().intersects(box).filter(isAddressable).map(function (d) {
+             return {
+               title: d.tags['addr:city'] || d.tags.name,
+               value: d.tags['addr:city'] || d.tags.name,
+               dist: geoSphericalDistance(d.extent(context.graph()).center(), l)
+             };
+           }).sort(function (a, b) {
+             return a.dist - b.dist;
+           });
+           return utilArrayUniqBy(cities, 'value');
+
+           function isAddressable(d) {
+             if (d.tags.name) {
+               if (d.tags.admin_level === '8' && d.tags.boundary === 'administrative') return true;
+               if (d.tags.border_type === 'city') return true;
+               if (d.tags.place === 'city' || d.tags.place === 'town' || d.tags.place === 'village') return true;
+             }
+
+             if (d.tags['addr:city']) return true;
+             return false;
+           }
+         }
+
+         function getNearValues(key) {
+           var extent = combinedEntityExtent();
+           var l = extent.center();
+           var box = geoExtent(l).padByMeters(200);
+           var results = context.history().intersects(box).filter(function hasTag(d) {
+             return _entityIDs.indexOf(d.id) === -1 && d.tags[key];
+           }).map(function (d) {
+             return {
+               title: d.tags[key],
+               value: d.tags[key],
+               dist: geoSphericalDistance(d.extent(context.graph()).center(), l)
+             };
+           }).sort(function (a, b) {
+             return a.dist - b.dist;
+           });
+           return utilArrayUniqBy(results, 'value');
+         }
+
+         function updateForCountryCode() {
+           if (!_countryCode) return;
+           var addressFormat;
+
+           for (var i = 0; i < _addressFormats.length; i++) {
+             var format = _addressFormats[i];
+
+             if (!format.countryCodes) {
+               addressFormat = format; // choose the default format, keep going
+             } else if (format.countryCodes.indexOf(_countryCode) !== -1) {
+               addressFormat = format; // choose the country format, stop here
+
+               break;
+             }
+           }
+
+           var dropdowns = addressFormat.dropdowns || ['city', 'county', 'country', 'district', 'hamlet', 'neighbourhood', 'place', 'postcode', 'province', 'quarter', 'state', 'street', 'subdistrict', 'suburb'];
+           var widths = addressFormat.widths || {
+             housenumber: 1 / 3,
+             street: 2 / 3,
+             city: 2 / 3,
+             state: 1 / 4,
+             postcode: 1 / 3
+           };
+
+           function row(r) {
+             // Normalize widths.
+             var total = r.reduce(function (sum, key) {
+               return sum + (widths[key] || 0.5);
+             }, 0);
+             return r.map(function (key) {
+               return {
+                 id: key,
+                 width: (widths[key] || 0.5) / total
+               };
+             });
+           }
+
+           var rows = _wrap.selectAll('.addr-row').data(addressFormat.format, function (d) {
+             return d.toString();
+           });
+
+           rows.exit().remove();
+           rows.enter().append('div').attr('class', 'addr-row').selectAll('input').data(row).enter().append('input').property('type', 'text').call(updatePlaceholder).attr('class', function (d) {
+             return 'addr-' + d.id;
+           }).call(utilNoAuto).each(addDropdown).style('width', function (d) {
+             return d.width * 100 + '%';
+           });
+
+           function addDropdown(d) {
+             if (dropdowns.indexOf(d.id) === -1) return; // not a dropdown
+
+             var nearValues = d.id === 'street' ? getNearStreets : d.id === 'city' ? getNearCities : getNearValues;
+             select(this).call(uiCombobox(context, 'address-' + d.id).minItems(1).caseSensitive(true).fetcher(function (value, callback) {
+               callback(nearValues('addr:' + d.id));
+             }));
+           }
+
+           _wrap.selectAll('input').on('blur', change()).on('change', change());
+
+           _wrap.selectAll('input:not(.combobox-input)').on('input', change(true));
+
+           if (_tags) updateTags(_tags);
+         }
+
+         function address(selection) {
+           _selection = selection;
+           _wrap = selection.selectAll('.form-field-input-wrap').data([0]);
+           _wrap = _wrap.enter().append('div').attr('class', 'form-field-input-wrap form-field-input-' + field.type).merge(_wrap);
+           var extent = combinedEntityExtent();
+
+           if (extent) {
+             var countryCode;
+
+             if (context.inIntro()) {
+               // localize the address format for the walkthrough
+               countryCode = _t('intro.graph.countrycode');
+             } else {
+               var center = extent.center();
+               countryCode = iso1A2Code(center);
+             }
+
+             if (countryCode) {
+               _countryCode = countryCode.toLowerCase();
+               updateForCountryCode();
+             }
+           }
+         }
+
+         function change(onInput) {
+           return function () {
+             var tags = {};
+
+             _wrap.selectAll('input').each(function (subfield) {
+               var key = field.key + ':' + subfield.id;
+               var value = this.value;
+               if (!onInput) value = context.cleanTagValue(value); // don't override multiple values with blank string
+
+               if (Array.isArray(_tags[key]) && !value) return;
+               tags[key] = value || undefined;
+             });
+
+             dispatch.call('change', this, tags, onInput);
+           };
+         }
+
+         function updatePlaceholder(inputSelection) {
+           return inputSelection.attr('placeholder', function (subfield) {
+             if (_tags && Array.isArray(_tags[field.key + ':' + subfield.id])) {
+               return _t('inspector.multiple_values');
+             }
+
+             if (_countryCode) {
+               var localkey = subfield.id + '!' + _countryCode;
+               var tkey = addrField.hasTextForStringId('placeholders.' + localkey) ? localkey : subfield.id;
+               return addrField.t('placeholders.' + tkey);
+             }
+           });
+         }
+
+         function updateTags(tags) {
+           utilGetSetValue(_wrap.selectAll('input'), function (subfield) {
+             var val = tags[field.key + ':' + subfield.id];
+             return typeof val === 'string' ? val : '';
+           }).attr('title', function (subfield) {
+             var val = tags[field.key + ':' + subfield.id];
+             return val && Array.isArray(val) ? val.filter(Boolean).join('\n') : undefined;
+           }).classed('mixed', function (subfield) {
+             return Array.isArray(tags[field.key + ':' + subfield.id]);
+           }).call(updatePlaceholder);
+         }
+
+         function combinedEntityExtent() {
+           return _entityIDs && _entityIDs.length && utilTotalExtent(_entityIDs, context.graph());
+         }
+
+         address.entityIDs = function (val) {
+           if (!arguments.length) return _entityIDs;
+           _entityIDs = val;
+           return address;
+         };
+
+         address.tags = function (tags) {
+           _tags = tags;
+           updateTags(tags);
+         };
+
+         address.focus = function () {
+           var node = _wrap.selectAll('input').node();
+
+           if (node) node.focus();
+         };
+
+         return utilRebind(address, dispatch, 'on');
+       }
+
+       function uiFieldCycleway(field, context) {
+         var dispatch = dispatch$8('change');
+         var items = select(null);
+         var wrap = select(null);
+
+         var _tags;
+
+         function cycleway(selection) {
+           function stripcolon(s) {
+             return s.replace(':', '');
+           }
+
+           wrap = selection.selectAll('.form-field-input-wrap').data([0]);
+           wrap = wrap.enter().append('div').attr('class', 'form-field-input-wrap form-field-input-' + field.type).merge(wrap);
+           var div = wrap.selectAll('ul').data([0]);
+           div = div.enter().append('ul').attr('class', 'rows').merge(div);
+           var keys = ['cycleway:left', 'cycleway:right'];
+           items = div.selectAll('li').data(keys);
+           var enter = items.enter().append('li').attr('class', function (d) {
+             return 'labeled-input preset-cycleway-' + stripcolon(d);
+           });
+           enter.append('span').attr('class', 'label preset-label-cycleway').attr('for', function (d) {
+             return 'preset-input-cycleway-' + stripcolon(d);
+           }).html(function (d) {
+             return field.t.html('types.' + d);
+           });
+           enter.append('div').attr('class', 'preset-input-cycleway-wrap').append('input').attr('type', 'text').attr('class', function (d) {
+             return 'preset-input-cycleway preset-input-' + stripcolon(d);
+           }).call(utilNoAuto).each(function (d) {
+             select(this).call(uiCombobox(context, 'cycleway-' + stripcolon(d)).data(cycleway.options(d)));
+           });
+           items = items.merge(enter); // Update
+
+           wrap.selectAll('.preset-input-cycleway').on('change', change).on('blur', change);
+         }
+
+         function change(d3_event, key) {
+           var newValue = context.cleanTagValue(utilGetSetValue(select(this))); // don't override multiple values with blank string
+
+           if (!newValue && (Array.isArray(_tags.cycleway) || Array.isArray(_tags[key]))) return;
+
+           if (newValue === 'none' || newValue === '') {
+             newValue = undefined;
+           }
+
+           var otherKey = key === 'cycleway:left' ? 'cycleway:right' : 'cycleway:left';
+           var otherValue = typeof _tags.cycleway === 'string' ? _tags.cycleway : _tags[otherKey];
+
+           if (otherValue && Array.isArray(otherValue)) {
+             // we must always have an explicit value for comparison
+             otherValue = otherValue[0];
+           }
+
+           if (otherValue === 'none' || otherValue === '') {
+             otherValue = undefined;
+           }
+
+           var tag = {}; // If the left and right tags match, use the cycleway tag to tag both
+           // sides the same way
+
+           if (newValue === otherValue) {
+             tag = {
+               cycleway: newValue,
+               'cycleway:left': undefined,
+               'cycleway:right': undefined
+             };
+           } else {
+             // Always set both left and right as changing one can affect the other
+             tag = {
+               cycleway: undefined
+             };
+             tag[key] = newValue;
+             tag[otherKey] = otherValue;
+           }
+
+           dispatch.call('change', this, tag);
+         }
+
+         cycleway.options = function () {
+           return field.options.map(function (option) {
+             return {
+               title: field.t('options.' + option + '.description'),
+               value: option
+             };
+           });
+         };
+
+         cycleway.tags = function (tags) {
+           _tags = tags; // If cycleway is set, use that instead of individual values
+
+           var commonValue = typeof tags.cycleway === 'string' && tags.cycleway;
+           utilGetSetValue(items.selectAll('.preset-input-cycleway'), function (d) {
+             if (commonValue) return commonValue;
+             return !tags.cycleway && typeof tags[d] === 'string' ? tags[d] : '';
+           }).attr('title', function (d) {
+             if (Array.isArray(tags.cycleway) || Array.isArray(tags[d])) {
+               var vals = [];
+
+               if (Array.isArray(tags.cycleway)) {
+                 vals = vals.concat(tags.cycleway);
+               }
+
+               if (Array.isArray(tags[d])) {
+                 vals = vals.concat(tags[d]);
+               }
+
+               return vals.filter(Boolean).join('\n');
+             }
+
+             return null;
+           }).attr('placeholder', function (d) {
+             if (Array.isArray(tags.cycleway) || Array.isArray(tags[d])) {
+               return _t('inspector.multiple_values');
+             }
+
+             return field.placeholder();
+           }).classed('mixed', function (d) {
+             return Array.isArray(tags.cycleway) || Array.isArray(tags[d]);
+           });
+         };
+
+         cycleway.focus = function () {
+           var node = wrap.selectAll('input').node();
+           if (node) node.focus();
+         };
+
+         return utilRebind(cycleway, dispatch, 'on');
+       }
+
+       function uiFieldLanes(field, context) {
+         var dispatch = dispatch$8('change');
+         var LANE_WIDTH = 40;
+         var LANE_HEIGHT = 200;
+         var _entityIDs = [];
+
+         function lanes(selection) {
+           var lanesData = context.entity(_entityIDs[0]).lanes();
+
+           if (!context.container().select('.inspector-wrap.inspector-hidden').empty() || !selection.node().parentNode) {
+             selection.call(lanes.off);
+             return;
+           }
+
+           var wrap = selection.selectAll('.form-field-input-wrap').data([0]);
+           wrap = wrap.enter().append('div').attr('class', 'form-field-input-wrap form-field-input-' + field.type).merge(wrap);
+           var surface = wrap.selectAll('.surface').data([0]);
+           var d = utilGetDimensions(wrap);
+           var freeSpace = d[0] - lanesData.lanes.length * LANE_WIDTH * 1.5 + LANE_WIDTH * 0.5;
+           surface = surface.enter().append('svg').attr('width', d[0]).attr('height', 300).attr('class', 'surface').merge(surface);
+           var lanesSelection = surface.selectAll('.lanes').data([0]);
+           lanesSelection = lanesSelection.enter().append('g').attr('class', 'lanes').merge(lanesSelection);
+           lanesSelection.attr('transform', function () {
+             return 'translate(' + freeSpace / 2 + ', 0)';
+           });
+           var lane = lanesSelection.selectAll('.lane').data(lanesData.lanes);
+           lane.exit().remove();
+           var enter = lane.enter().append('g').attr('class', 'lane');
+           enter.append('g').append('rect').attr('y', 50).attr('width', LANE_WIDTH).attr('height', LANE_HEIGHT);
+           enter.append('g').attr('class', 'forward').append('text').attr('y', 40).attr('x', 14).text('▲');
+           enter.append('g').attr('class', 'bothways').append('text').attr('y', 40).attr('x', 14).text('▲▼');
+           enter.append('g').attr('class', 'backward').append('text').attr('y', 40).attr('x', 14).text('▼');
+           lane = lane.merge(enter);
+           lane.attr('transform', function (d) {
+             return 'translate(' + LANE_WIDTH * d.index * 1.5 + ', 0)';
+           });
+           lane.select('.forward').style('visibility', function (d) {
+             return d.direction === 'forward' ? 'visible' : 'hidden';
+           });
+           lane.select('.bothways').style('visibility', function (d) {
+             return d.direction === 'bothways' ? 'visible' : 'hidden';
+           });
+           lane.select('.backward').style('visibility', function (d) {
+             return d.direction === 'backward' ? 'visible' : 'hidden';
+           });
+         }
+
+         lanes.entityIDs = function (val) {
+           _entityIDs = val;
+         };
+
+         lanes.tags = function () {};
+
+         lanes.focus = function () {};
+
+         lanes.off = function () {};
+
+         return utilRebind(lanes, dispatch, 'on');
+       }
+       uiFieldLanes.supportsMultiselection = false;
+
+       var _languagesArray = [];
+       function uiFieldLocalized(field, context) {
+         var dispatch = dispatch$8('change', 'input');
+         var wikipedia = services.wikipedia;
+         var input = select(null);
+         var localizedInputs = select(null);
+
+         var _countryCode;
+
+         var _tags; // A concern here in switching to async data means that _languagesArray will not
+         // be available the first time through, so things like the fetchers and
+         // the language() function will not work immediately.
+
+
+         _mainFileFetcher.get('languages').then(loadLanguagesArray)["catch"](function () {
+           /* ignore */
+         });
+         var _territoryLanguages = {};
+         _mainFileFetcher.get('territory_languages').then(function (d) {
+           _territoryLanguages = d;
+         })["catch"](function () {
+           /* ignore */
+         }); // reuse these combos
+
+         var langCombo = uiCombobox(context, 'localized-lang').fetcher(fetchLanguages).minItems(0);
+
+         var _selection = select(null);
+
+         var _multilingual = [];
+
+         var _buttonTip = uiTooltip().title(_t.html('translate.translate')).placement('left');
+
+         var _wikiTitles;
+
+         var _entityIDs = [];
+
+         function loadLanguagesArray(dataLanguages) {
+           if (_languagesArray.length !== 0) return; // some conversion is needed to ensure correct OSM tags are used
+
+           var replacements = {
+             sr: 'sr-Cyrl',
+             // in OSM, `sr` implies Cyrillic
+             'sr-Cyrl': false // `sr-Cyrl` isn't used in OSM
+
+           };
+
+           for (var code in dataLanguages) {
+             if (replacements[code] === false) continue;
+             var metaCode = code;
+             if (replacements[code]) metaCode = replacements[code];
+
+             _languagesArray.push({
+               localName: _mainLocalizer.languageName(metaCode, {
+                 localOnly: true
+               }),
+               nativeName: dataLanguages[metaCode].nativeName,
+               code: code,
+               label: _mainLocalizer.languageName(metaCode)
+             });
+           }
+         }
+
+         function calcLocked() {
+           // Protect name field for suggestion presets that don't display a brand/operator field
+           var isLocked = field.id === 'name' && _entityIDs.length && _entityIDs.some(function (entityID) {
+             var entity = context.graph().hasEntity(entityID);
+             if (!entity) return false; // Features linked to Wikidata are likely important and should be protected
+
+             if (entity.tags.wikidata) return true; // Assume the name has already been confirmed if its source has been researched
+
+             if (entity.tags['name:etymology:wikidata']) return true; // Lock the `name` if this is a suggestion preset that assigns the name,
+             // and the preset does not display a `brand` or `operator` field.
+             // (For presets like hotels, car dealerships, post offices, the `name` should remain editable)
+             // see also similar logic in `outdated_tags.js`
+
+             var preset = _mainPresetIndex.match(entity, context.graph());
+
+             if (preset) {
+               var isSuggestion = preset.suggestion;
+               var fields = preset.fields();
+               var showsBrandField = fields.some(function (d) {
+                 return d.id === 'brand';
+               });
+               var showsOperatorField = fields.some(function (d) {
+                 return d.id === 'operator';
+               });
+               var setsName = preset.addTags.name;
+               var setsBrandWikidata = preset.addTags['brand:wikidata'];
+               var setsOperatorWikidata = preset.addTags['operator:wikidata'];
+               return isSuggestion && setsName && (setsBrandWikidata && !showsBrandField || setsOperatorWikidata && !showsOperatorField);
+             }
+
+             return false;
+           });
+
+           field.locked(isLocked);
+         } // update _multilingual, maintaining the existing order
+
+
+         function calcMultilingual(tags) {
+           var existingLangsOrdered = _multilingual.map(function (item) {
+             return item.lang;
+           });
+
+           var existingLangs = new Set(existingLangsOrdered.filter(Boolean));
+
+           for (var k in tags) {
+             var m = k.match(/^(.*):(.*)$/);
+
+             if (m && m[1] === field.key && m[2]) {
+               var item = {
+                 lang: m[2],
+                 value: tags[k]
+               };
+
+               if (existingLangs.has(item.lang)) {
+                 // update the value
+                 _multilingual[existingLangsOrdered.indexOf(item.lang)].value = item.value;
+                 existingLangs["delete"](item.lang);
+               } else {
+                 _multilingual.push(item);
+               }
+             }
+           } // Don't remove items based on deleted tags, since this makes the UI
+           // disappear unexpectedly when clearing values - #8164
+
+
+           _multilingual.forEach(function (item) {
+             if (item.lang && existingLangs.has(item.lang)) {
+               item.value = '';
+             }
+           });
+         }
+
+         function localized(selection) {
+           _selection = selection;
+           calcLocked();
+           var isLocked = field.locked();
+           var wrap = selection.selectAll('.form-field-input-wrap').data([0]); // enter/update
+
+           wrap = wrap.enter().append('div').attr('class', 'form-field-input-wrap form-field-input-' + field.type).merge(wrap);
+           input = wrap.selectAll('.localized-main').data([0]); // enter/update
+
+           input = input.enter().append('input').attr('type', 'text').attr('id', field.domId).attr('class', 'localized-main').call(utilNoAuto).merge(input);
+           input.classed('disabled', !!isLocked).attr('readonly', isLocked || null).on('input', change(true)).on('blur', change()).on('change', change());
+           var translateButton = wrap.selectAll('.localized-add').data([0]);
+           translateButton = translateButton.enter().append('button').attr('class', 'localized-add form-field-button').attr('aria-label', _t('icons.plus')).call(svgIcon('#iD-icon-plus')).merge(translateButton);
+           translateButton.classed('disabled', !!isLocked).call(isLocked ? _buttonTip.destroy : _buttonTip).on('click', addNew);
+
+           if (_tags && !_multilingual.length) {
+             calcMultilingual(_tags);
+           }
+
+           localizedInputs = selection.selectAll('.localized-multilingual').data([0]);
+           localizedInputs = localizedInputs.enter().append('div').attr('class', 'localized-multilingual').merge(localizedInputs);
+           localizedInputs.call(renderMultilingual);
+           localizedInputs.selectAll('button, input').classed('disabled', !!isLocked).attr('readonly', isLocked || null);
+           selection.selectAll('.combobox-caret').classed('nope', true);
+
+           function addNew(d3_event) {
+             d3_event.preventDefault();
+             if (field.locked()) return;
+             var defaultLang = _mainLocalizer.languageCode().toLowerCase();
+
+             var langExists = _multilingual.find(function (datum) {
+               return datum.lang === defaultLang;
+             });
+
+             var isLangEn = defaultLang.indexOf('en') > -1;
+
+             if (isLangEn || langExists) {
+               defaultLang = '';
+               langExists = _multilingual.find(function (datum) {
+                 return datum.lang === defaultLang;
+               });
+             }
+
+             if (!langExists) {
+               // prepend the value so it appears at the top
+               _multilingual.unshift({
+                 lang: defaultLang,
+                 value: ''
+               });
+
+               localizedInputs.call(renderMultilingual);
+             }
+           }
+
+           function change(onInput) {
+             return function (d3_event) {
+               if (field.locked()) {
+                 d3_event.preventDefault();
+                 return;
+               }
+
+               var val = utilGetSetValue(select(this));
+               if (!onInput) val = context.cleanTagValue(val); // don't override multiple values with blank string
+
+               if (!val && Array.isArray(_tags[field.key])) return;
+               var t = {};
+               t[field.key] = val || undefined;
+               dispatch.call('change', this, t, onInput);
+             };
+           }
+         }
+
+         function key(lang) {
+           return field.key + ':' + lang;
+         }
+
+         function changeLang(d3_event, d) {
+           var tags = {}; // make sure unrecognized suffixes are lowercase - #7156
+
+           var lang = utilGetSetValue(select(this)).toLowerCase();
+
+           var language = _languagesArray.find(function (d) {
+             return d.label.toLowerCase() === lang || d.localName && d.localName.toLowerCase() === lang || d.nativeName && d.nativeName.toLowerCase() === lang;
+           });
+
+           if (language) lang = language.code;
+
+           if (d.lang && d.lang !== lang) {
+             tags[key(d.lang)] = undefined;
+           }
+
+           var newKey = lang && context.cleanTagKey(key(lang));
+           var value = utilGetSetValue(select(this.parentNode).selectAll('.localized-value'));
+
+           if (newKey && value) {
+             tags[newKey] = value;
+           } else if (newKey && _wikiTitles && _wikiTitles[d.lang]) {
+             tags[newKey] = _wikiTitles[d.lang];
+           }
+
+           d.lang = lang;
+           dispatch.call('change', this, tags);
+         }
+
+         function changeValue(d3_event, d) {
+           if (!d.lang) return;
+           var value = context.cleanTagValue(utilGetSetValue(select(this))) || undefined; // don't override multiple values with blank string
+
+           if (!value && Array.isArray(d.value)) return;
+           var t = {};
+           t[key(d.lang)] = value;
+           d.value = value;
+           dispatch.call('change', this, t);
+         }
+
+         function fetchLanguages(value, cb) {
+           var v = value.toLowerCase(); // show the user's language first
+
+           var langCodes = [_mainLocalizer.localeCode(), _mainLocalizer.languageCode()];
+
+           if (_countryCode && _territoryLanguages[_countryCode]) {
+             langCodes = langCodes.concat(_territoryLanguages[_countryCode]);
+           }
+
+           var langItems = [];
+           langCodes.forEach(function (code) {
+             var langItem = _languagesArray.find(function (item) {
+               return item.code === code;
+             });
+
+             if (langItem) langItems.push(langItem);
+           });
+           langItems = utilArrayUniq(langItems.concat(_languagesArray));
+           cb(langItems.filter(function (d) {
+             return d.label.toLowerCase().indexOf(v) >= 0 || d.localName && d.localName.toLowerCase().indexOf(v) >= 0 || d.nativeName && d.nativeName.toLowerCase().indexOf(v) >= 0 || d.code.toLowerCase().indexOf(v) >= 0;
+           }).map(function (d) {
+             return {
+               value: d.label
+             };
+           }));
+         }
+
+         function renderMultilingual(selection) {
+           var entries = selection.selectAll('div.entry').data(_multilingual, function (d) {
+             return d.lang;
+           });
+           entries.exit().style('top', '0').style('max-height', '240px').transition().duration(200).style('opacity', '0').style('max-height', '0px').remove();
+           var entriesEnter = entries.enter().append('div').attr('class', 'entry').each(function (_, index) {
+             var wrap = select(this);
+             var domId = utilUniqueDomId(index);
+             var label = wrap.append('label').attr('class', 'field-label').attr('for', domId);
+             var text = label.append('span').attr('class', 'label-text');
+             text.append('span').attr('class', 'label-textvalue').call(_t.append('translate.localized_translation_label'));
+             text.append('span').attr('class', 'label-textannotation');
+             label.append('button').attr('class', 'remove-icon-multilingual').attr('title', _t('icons.remove')).on('click', function (d3_event, d) {
+               if (field.locked()) return;
+               d3_event.preventDefault(); // remove the UI item manually
+
+               _multilingual.splice(_multilingual.indexOf(d), 1);
+
+               var langKey = d.lang && key(d.lang);
+
+               if (langKey && langKey in _tags) {
+                 delete _tags[langKey]; // remove from entity tags
+
+                 var t = {};
+                 t[langKey] = undefined;
+                 dispatch.call('change', this, t);
+                 return;
+               }
+
+               renderMultilingual(selection);
+             }).call(svgIcon('#iD-operation-delete'));
+             wrap.append('input').attr('class', 'localized-lang').attr('id', domId).attr('type', 'text').attr('placeholder', _t('translate.localized_translation_language')).on('blur', changeLang).on('change', changeLang).call(langCombo);
+             wrap.append('input').attr('type', 'text').attr('class', 'localized-value').on('blur', changeValue).on('change', changeValue);
+           });
+           entriesEnter.style('margin-top', '0px').style('max-height', '0px').style('opacity', '0').transition().duration(200).style('margin-top', '10px').style('max-height', '240px').style('opacity', '1').on('end', function () {
+             select(this).style('max-height', '').style('overflow', 'visible');
+           });
+           entries = entries.merge(entriesEnter);
+           entries.order(); // allow removing the entry UIs even if there isn't a tag to remove
+
+           entries.classed('present', true);
+           utilGetSetValue(entries.select('.localized-lang'), function (d) {
+             var langItem = _languagesArray.find(function (item) {
+               return item.code === d.lang;
+             });
+
+             if (langItem) return langItem.label;
+             return d.lang;
+           });
+           utilGetSetValue(entries.select('.localized-value'), function (d) {
+             return typeof d.value === 'string' ? d.value : '';
+           }).attr('title', function (d) {
+             return Array.isArray(d.value) ? d.value.filter(Boolean).join('\n') : null;
+           }).attr('placeholder', function (d) {
+             return Array.isArray(d.value) ? _t('inspector.multiple_values') : _t('translate.localized_translation_name');
+           }).classed('mixed', function (d) {
+             return Array.isArray(d.value);
+           });
+         }
+
+         localized.tags = function (tags) {
+           _tags = tags; // Fetch translations from wikipedia
+
+           if (typeof tags.wikipedia === 'string' && !_wikiTitles) {
+             _wikiTitles = {};
+             var wm = tags.wikipedia.match(/([^:]+):(.+)/);
+
+             if (wm && wm[0] && wm[1]) {
+               wikipedia.translations(wm[1], wm[2], function (err, d) {
+                 if (err || !d) return;
+                 _wikiTitles = d;
+               });
+             }
+           }
+
+           var isMixed = Array.isArray(tags[field.key]);
+           utilGetSetValue(input, typeof tags[field.key] === 'string' ? tags[field.key] : '').attr('title', isMixed ? tags[field.key].filter(Boolean).join('\n') : undefined).attr('placeholder', isMixed ? _t('inspector.multiple_values') : field.placeholder()).classed('mixed', isMixed);
+           calcMultilingual(tags);
+
+           _selection.call(localized);
+         };
+
+         localized.focus = function () {
+           input.node().focus();
+         };
+
+         localized.entityIDs = function (val) {
+           if (!arguments.length) return _entityIDs;
+           _entityIDs = val;
+           _multilingual = [];
+           loadCountryCode();
+           return localized;
+         };
+
+         function loadCountryCode() {
+           var extent = combinedEntityExtent();
+           var countryCode = extent && iso1A2Code(extent.center());
+           _countryCode = countryCode && countryCode.toLowerCase();
+         }
+
+         function combinedEntityExtent() {
+           return _entityIDs && _entityIDs.length && utilTotalExtent(_entityIDs, context.graph());
+         }
+
+         return utilRebind(localized, dispatch, 'on');
+       }
+
+       function uiFieldRoadheight(field, context) {
+         var dispatch = dispatch$8('change');
+         var primaryUnitInput = select(null);
+         var primaryInput = select(null);
+         var secondaryInput = select(null);
+         var secondaryUnitInput = select(null);
+         var _entityIDs = [];
+
+         var _tags;
+
+         var _isImperial;
+
+         var primaryUnits = [{
+           value: 'm',
+           title: _t('inspector.roadheight.meter')
+         }, {
+           value: 'ft',
+           title: _t('inspector.roadheight.foot')
+         }];
+         var unitCombo = uiCombobox(context, 'roadheight-unit').data(primaryUnits);
+
+         function roadheight(selection) {
+           var wrap = selection.selectAll('.form-field-input-wrap').data([0]);
+           wrap = wrap.enter().append('div').attr('class', 'form-field-input-wrap form-field-input-' + field.type).merge(wrap);
+           primaryInput = wrap.selectAll('input.roadheight-number').data([0]);
+           primaryInput = primaryInput.enter().append('input').attr('type', 'text').attr('class', 'roadheight-number').attr('id', field.domId).call(utilNoAuto).merge(primaryInput);
+           primaryInput.on('change', change).on('blur', change);
+           var loc = combinedEntityExtent().center();
+           _isImperial = roadHeightUnit(loc) === 'ft';
+           primaryUnitInput = wrap.selectAll('input.roadheight-unit').data([0]);
+           primaryUnitInput = primaryUnitInput.enter().append('input').attr('type', 'text').attr('class', 'roadheight-unit').call(unitCombo).merge(primaryUnitInput);
+           primaryUnitInput.on('blur', changeUnits).on('change', changeUnits);
+           secondaryInput = wrap.selectAll('input.roadheight-secondary-number').data([0]);
+           secondaryInput = secondaryInput.enter().append('input').attr('type', 'text').attr('class', 'roadheight-secondary-number').call(utilNoAuto).merge(secondaryInput);
+           secondaryInput.on('change', change).on('blur', change);
+           secondaryUnitInput = wrap.selectAll('input.roadheight-secondary-unit').data([0]);
+           secondaryUnitInput = secondaryUnitInput.enter().append('input').attr('type', 'text').call(utilNoAuto).classed('disabled', true).classed('roadheight-secondary-unit', true).attr('readonly', 'readonly').merge(secondaryUnitInput);
+
+           function changeUnits() {
+             _isImperial = utilGetSetValue(primaryUnitInput) === 'ft';
+             utilGetSetValue(primaryUnitInput, _isImperial ? 'ft' : 'm');
+             setUnitSuggestions();
+             change();
+           }
+         }
+
+         function setUnitSuggestions() {
+           utilGetSetValue(primaryUnitInput, _isImperial ? 'ft' : 'm');
+         }
+
+         function change() {
+           var tag = {};
+           var primaryValue = utilGetSetValue(primaryInput).trim();
+           var secondaryValue = utilGetSetValue(secondaryInput).trim(); // don't override multiple values with blank string
+
+           if (!primaryValue && !secondaryValue && Array.isArray(_tags[field.key])) return;
+
+           if (!primaryValue && !secondaryValue) {
+             tag[field.key] = undefined;
+           } else if (isNaN(primaryValue) || isNaN(secondaryValue) || !_isImperial) {
+             tag[field.key] = context.cleanTagValue(primaryValue);
+           } else {
+             if (primaryValue !== '') {
+               primaryValue = context.cleanTagValue(primaryValue + '\'');
+             }
+
+             if (secondaryValue !== '') {
+               secondaryValue = context.cleanTagValue(secondaryValue + '"');
+             }
+
+             tag[field.key] = primaryValue + secondaryValue;
+           }
+
+           dispatch.call('change', this, tag);
+         }
+
+         roadheight.tags = function (tags) {
+           _tags = tags;
+           var primaryValue = tags[field.key];
+           var secondaryValue;
+           var isMixed = Array.isArray(primaryValue);
+
+           if (!isMixed) {
+             if (primaryValue && (primaryValue.indexOf('\'') >= 0 || primaryValue.indexOf('"') >= 0)) {
+               secondaryValue = primaryValue.match(/(-?[\d.]+)"/);
+
+               if (secondaryValue !== null) {
+                 secondaryValue = secondaryValue[1];
+               }
+
+               primaryValue = primaryValue.match(/(-?[\d.]+)'/);
+
+               if (primaryValue !== null) {
+                 primaryValue = primaryValue[1];
+               }
+
+               _isImperial = true;
+             } else if (primaryValue) {
+               _isImperial = false;
+             }
+           }
+
+           setUnitSuggestions();
+           utilGetSetValue(primaryInput, typeof primaryValue === 'string' ? primaryValue : '').attr('title', isMixed ? primaryValue.filter(Boolean).join('\n') : null).attr('placeholder', isMixed ? _t('inspector.multiple_values') : _t('inspector.unknown')).classed('mixed', isMixed);
+           utilGetSetValue(secondaryInput, typeof secondaryValue === 'string' ? secondaryValue : '').attr('placeholder', isMixed ? _t('inspector.multiple_values') : _isImperial ? '0' : null).classed('mixed', isMixed).classed('disabled', !_isImperial).attr('readonly', _isImperial ? null : 'readonly');
+           secondaryUnitInput.attr('value', _isImperial ? _t('inspector.roadheight.inch') : null);
+         };
+
+         roadheight.focus = function () {
+           primaryInput.node().focus();
+         };
+
+         roadheight.entityIDs = function (val) {
+           _entityIDs = val;
+         };
+
+         function combinedEntityExtent() {
+           return _entityIDs && _entityIDs.length && utilTotalExtent(_entityIDs, context.graph());
+         }
+
+         return utilRebind(roadheight, dispatch, 'on');
+       }
+
+       function uiFieldRoadspeed(field, context) {
+         var dispatch = dispatch$8('change');
+         var unitInput = select(null);
+         var input = select(null);
+         var _entityIDs = [];
+
+         var _tags;
+
+         var _isImperial;
+
+         var speedCombo = uiCombobox(context, 'roadspeed');
+         var unitCombo = uiCombobox(context, 'roadspeed-unit').data(['km/h', 'mph'].map(comboValues));
+         var metricValues = [20, 30, 40, 50, 60, 70, 80, 90, 100, 110, 120];
+         var imperialValues = [5, 10, 15, 20, 25, 30, 35, 40, 45, 50, 55, 60, 65, 70, 75, 80];
+
+         function roadspeed(selection) {
+           var wrap = selection.selectAll('.form-field-input-wrap').data([0]);
+           wrap = wrap.enter().append('div').attr('class', 'form-field-input-wrap form-field-input-' + field.type).merge(wrap);
+           input = wrap.selectAll('input.roadspeed-number').data([0]);
+           input = input.enter().append('input').attr('type', 'text').attr('class', 'roadspeed-number').attr('id', field.domId).call(utilNoAuto).call(speedCombo).merge(input);
+           input.on('change', change).on('blur', change);
+           var loc = combinedEntityExtent().center();
+           _isImperial = roadSpeedUnit(loc) === 'mph';
+           unitInput = wrap.selectAll('input.roadspeed-unit').data([0]);
+           unitInput = unitInput.enter().append('input').attr('type', 'text').attr('class', 'roadspeed-unit').attr('aria-label', _t('inspector.speed_unit')).call(unitCombo).merge(unitInput);
+           unitInput.on('blur', changeUnits).on('change', changeUnits);
+
+           function changeUnits() {
+             _isImperial = utilGetSetValue(unitInput) === 'mph';
+             utilGetSetValue(unitInput, _isImperial ? 'mph' : 'km/h');
+             setUnitSuggestions();
+             change();
+           }
+         }
+
+         function setUnitSuggestions() {
+           speedCombo.data((_isImperial ? imperialValues : metricValues).map(comboValues));
+           utilGetSetValue(unitInput, _isImperial ? 'mph' : 'km/h');
+         }
+
+         function comboValues(d) {
+           return {
+             value: d.toString(),
+             title: d.toString()
+           };
+         }
+
+         function change() {
+           var tag = {};
+           var value = utilGetSetValue(input).trim(); // don't override multiple values with blank string
+
+           if (!value && Array.isArray(_tags[field.key])) return;
+
+           if (!value) {
+             tag[field.key] = undefined;
+           } else if (isNaN(value) || !_isImperial) {
+             tag[field.key] = context.cleanTagValue(value);
+           } else {
+             tag[field.key] = context.cleanTagValue(value + ' mph');
+           }
+
+           dispatch.call('change', this, tag);
+         }
+
+         roadspeed.tags = function (tags) {
+           _tags = tags;
+           var value = tags[field.key];
+           var isMixed = Array.isArray(value);
+
+           if (!isMixed) {
+             if (value && value.indexOf('mph') >= 0) {
+               value = parseInt(value, 10).toString();
+               _isImperial = true;
+             } else if (value) {
+               _isImperial = false;
+             }
+           }
+
+           setUnitSuggestions();
+           utilGetSetValue(input, typeof value === 'string' ? value : '').attr('title', isMixed ? value.filter(Boolean).join('\n') : null).attr('placeholder', isMixed ? _t('inspector.multiple_values') : field.placeholder()).classed('mixed', isMixed);
+         };
+
+         roadspeed.focus = function () {
+           input.node().focus();
+         };
+
+         roadspeed.entityIDs = function (val) {
+           _entityIDs = val;
+         };
+
+         function combinedEntityExtent() {
+           return _entityIDs && _entityIDs.length && utilTotalExtent(_entityIDs, context.graph());
+         }
+
+         return utilRebind(roadspeed, dispatch, 'on');
+       }
+
+       function uiFieldRadio(field, context) {
+         var dispatch = dispatch$8('change');
+         var placeholder = select(null);
+         var wrap = select(null);
+         var labels = select(null);
+         var radios = select(null);
+         var radioData = (field.options || field.keys).slice(); // shallow copy
+
+         var typeField;
+         var layerField;
+         var _oldType = {};
+         var _entityIDs = [];
+
+         function selectedKey() {
+           var node = wrap.selectAll('.form-field-input-radio label.active input');
+           return !node.empty() && node.datum();
+         }
+
+         function radio(selection) {
+           selection.classed('preset-radio', true);
+           wrap = selection.selectAll('.form-field-input-wrap').data([0]);
+           var enter = wrap.enter().append('div').attr('class', 'form-field-input-wrap form-field-input-radio');
+           enter.append('span').attr('class', 'placeholder');
+           wrap = wrap.merge(enter);
+           placeholder = wrap.selectAll('.placeholder');
+           labels = wrap.selectAll('label').data(radioData);
+           enter = labels.enter().append('label');
+           enter.append('input').attr('type', 'radio').attr('name', field.id).attr('value', function (d) {
+             return field.t('options.' + d, {
+               'default': d
+             });
+           }).attr('checked', false);
+           enter.append('span').html(function (d) {
+             return field.t.html('options.' + d, {
+               'default': d
+             });
+           });
+           labels = labels.merge(enter);
+           radios = labels.selectAll('input').on('change', changeRadio);
+         }
+
+         function structureExtras(selection, tags) {
+           var selected = selectedKey() || tags.layer !== undefined;
+           var type = _mainPresetIndex.field(selected);
+           var layer = _mainPresetIndex.field('layer');
+           var showLayer = selected === 'bridge' || selected === 'tunnel' || tags.layer !== undefined;
+           var extrasWrap = selection.selectAll('.structure-extras-wrap').data(selected ? [0] : []);
+           extrasWrap.exit().remove();
+           extrasWrap = extrasWrap.enter().append('div').attr('class', 'structure-extras-wrap').merge(extrasWrap);
+           var list = extrasWrap.selectAll('ul').data([0]);
+           list = list.enter().append('ul').attr('class', 'rows').merge(list); // Type
+
+           if (type) {
+             if (!typeField || typeField.id !== selected) {
+               typeField = uiField(context, type, _entityIDs, {
+                 wrap: false
+               }).on('change', changeType);
+             }
+
+             typeField.tags(tags);
+           } else {
+             typeField = null;
+           }
+
+           var typeItem = list.selectAll('.structure-type-item').data(typeField ? [typeField] : [], function (d) {
+             return d.id;
+           }); // Exit
+
+           typeItem.exit().remove(); // Enter
+
+           var typeEnter = typeItem.enter().insert('li', ':first-child').attr('class', 'labeled-input structure-type-item');
+           typeEnter.append('span').attr('class', 'label structure-label-type').attr('for', 'preset-input-' + selected).call(_t.append('inspector.radio.structure.type'));
+           typeEnter.append('div').attr('class', 'structure-input-type-wrap'); // Update
+
+           typeItem = typeItem.merge(typeEnter);
+
+           if (typeField) {
+             typeItem.selectAll('.structure-input-type-wrap').call(typeField.render);
+           } // Layer
+
+
+           if (layer && showLayer) {
+             if (!layerField) {
+               layerField = uiField(context, layer, _entityIDs, {
+                 wrap: false
+               }).on('change', changeLayer);
+             }
+
+             layerField.tags(tags);
+             field.keys = utilArrayUnion(field.keys, ['layer']);
+           } else {
+             layerField = null;
+             field.keys = field.keys.filter(function (k) {
+               return k !== 'layer';
+             });
+           }
+
+           var layerItem = list.selectAll('.structure-layer-item').data(layerField ? [layerField] : []); // Exit
+
+           layerItem.exit().remove(); // Enter
+
+           var layerEnter = layerItem.enter().append('li').attr('class', 'labeled-input structure-layer-item');
+           layerEnter.append('span').attr('class', 'label structure-label-layer').attr('for', 'preset-input-layer').call(_t.append('inspector.radio.structure.layer'));
+           layerEnter.append('div').attr('class', 'structure-input-layer-wrap'); // Update
+
+           layerItem = layerItem.merge(layerEnter);
+
+           if (layerField) {
+             layerItem.selectAll('.structure-input-layer-wrap').call(layerField.render);
+           }
+         }
+
+         function changeType(t, onInput) {
+           var key = selectedKey();
+           if (!key) return;
+           var val = t[key];
+
+           if (val !== 'no') {
+             _oldType[key] = val;
+           }
+
+           if (field.type === 'structureRadio') {
+             // remove layer if it should not be set
+             if (val === 'no' || key !== 'bridge' && key !== 'tunnel' || key === 'tunnel' && val === 'building_passage') {
+               t.layer = undefined;
+             } // add layer if it should be set
+
+
+             if (t.layer === undefined) {
+               if (key === 'bridge' && val !== 'no') {
+                 t.layer = '1';
+               }
+
+               if (key === 'tunnel' && val !== 'no' && val !== 'building_passage') {
+                 t.layer = '-1';
+               }
+             }
+           }
+
+           dispatch.call('change', this, t, onInput);
+         }
+
+         function changeLayer(t, onInput) {
+           if (t.layer === '0') {
+             t.layer = undefined;
+           }
+
+           dispatch.call('change', this, t, onInput);
+         }
+
+         function changeRadio() {
+           var t = {};
+           var activeKey;
+
+           if (field.key) {
+             t[field.key] = undefined;
+           }
+
+           radios.each(function (d) {
+             var active = select(this).property('checked');
+             if (active) activeKey = d;
+
+             if (field.key) {
+               if (active) t[field.key] = d;
+             } else {
+               var val = _oldType[activeKey] || 'yes';
+               t[d] = active ? val : undefined;
+             }
+           });
+
+           if (field.type === 'structureRadio') {
+             if (activeKey === 'bridge') {
+               t.layer = '1';
+             } else if (activeKey === 'tunnel' && t.tunnel !== 'building_passage') {
+               t.layer = '-1';
+             } else {
+               t.layer = undefined;
+             }
+           }
+
+           dispatch.call('change', this, t);
+         }
+
+         radio.tags = function (tags) {
+           function isOptionChecked(d) {
+             if (field.key) {
+               return tags[field.key] === d;
+             }
+
+             return !!(typeof tags[d] === 'string' && tags[d].toLowerCase() !== 'no');
+           }
+
+           function isMixed(d) {
+             if (field.key) {
+               return Array.isArray(tags[field.key]) && tags[field.key].includes(d);
+             }
+
+             return Array.isArray(tags[d]);
+           }
+
+           radios.property('checked', function (d) {
+             return isOptionChecked(d) && (field.key || field.options.filter(isOptionChecked).length === 1);
+           });
+           labels.classed('active', function (d) {
+             if (field.key) {
+               return Array.isArray(tags[field.key]) && tags[field.key].includes(d) || tags[field.key] === d;
+             }
+
+             return Array.isArray(tags[d]) && tags[d].some(function (v) {
+               return typeof v === 'string' && v.toLowerCase() !== 'no';
+             }) || !!(typeof tags[d] === 'string' && tags[d].toLowerCase() !== 'no');
+           }).classed('mixed', isMixed).attr('title', function (d) {
+             return isMixed(d) ? _t('inspector.unshared_value_tooltip') : null;
+           });
+           var selection = radios.filter(function () {
+             return this.checked;
+           });
+
+           if (selection.empty()) {
+             placeholder.call(_t.append('inspector.none'));
+           } else {
+             placeholder.text(selection.attr('value'));
+             _oldType[selection.datum()] = tags[selection.datum()];
+           }
+
+           if (field.type === 'structureRadio') {
+             // For waterways without a tunnel tag, set 'culvert' as
+             // the _oldType to default to if the user picks 'tunnel'
+             if (!!tags.waterway && !_oldType.tunnel) {
+               _oldType.tunnel = 'culvert';
+             }
+
+             wrap.call(structureExtras, tags);
+           }
+         };
+
+         radio.focus = function () {
+           radios.node().focus();
+         };
+
+         radio.entityIDs = function (val) {
+           if (!arguments.length) return _entityIDs;
+           _entityIDs = val;
+           _oldType = {};
+           return radio;
+         };
+
+         radio.isAllowed = function () {
+           return _entityIDs.length === 1;
+         };
+
+         return utilRebind(radio, dispatch, 'on');
+       }
+
+       function uiFieldRestrictions(field, context) {
+         var dispatch = dispatch$8('change');
+         var breathe = behaviorBreathe();
+         corePreferences('turn-restriction-via-way', null); // remove old key
+
+         var storedViaWay = corePreferences('turn-restriction-via-way0'); // use new key #6922
+
+         var storedDistance = corePreferences('turn-restriction-distance');
+
+         var _maxViaWay = storedViaWay !== null ? +storedViaWay : 0;
+
+         var _maxDistance = storedDistance ? +storedDistance : 30;
+
+         var _initialized = false;
+
+         var _parent = select(null); // the entire field
+
+
+         var _container = select(null); // just the map
+
+
+         var _oldTurns;
+
+         var _graph;
+
+         var _vertexID;
+
+         var _intersection;
+
+         var _fromWayID;
+
+         var _lastXPos;
+
+         function restrictions(selection) {
+           _parent = selection; // try to reuse the intersection, but always rebuild it if the graph has changed
+
+           if (_vertexID && (context.graph() !== _graph || !_intersection)) {
+             _graph = context.graph();
+             _intersection = osmIntersection(_graph, _vertexID, _maxDistance);
+           } // It's possible for there to be no actual intersection here.
+           // for example, a vertex of two `highway=path`
+           // In this case, hide the field.
+
+
+           var isOK = _intersection && _intersection.vertices.length && // has vertices
+           _intersection.vertices // has the vertex that the user selected
+           .filter(function (vertex) {
+             return vertex.id === _vertexID;
+           }).length && _intersection.ways.length > 2 && // has more than 2 ways
+           _intersection.ways // has more than 1 TO way
+           .filter(function (way) {
+             return way.__to;
+           }).length > 1; // Also hide in the case where
+
+           select(selection.node().parentNode).classed('hide', !isOK); // if form field is hidden or has detached from dom, clean up.
+
+           if (!isOK || !context.container().select('.inspector-wrap.inspector-hidden').empty() || !selection.node().parentNode || !selection.node().parentNode.parentNode) {
+             selection.call(restrictions.off);
+             return;
+           }
+
+           var wrap = selection.selectAll('.form-field-input-wrap').data([0]);
+           wrap = wrap.enter().append('div').attr('class', 'form-field-input-wrap form-field-input-' + field.type).merge(wrap);
+           var container = wrap.selectAll('.restriction-container').data([0]); // enter
+
+           var containerEnter = container.enter().append('div').attr('class', 'restriction-container');
+           containerEnter.append('div').attr('class', 'restriction-help'); // update
+
+           _container = containerEnter.merge(container).call(renderViewer);
+           var controls = wrap.selectAll('.restriction-controls').data([0]); // enter/update
+
+           controls.enter().append('div').attr('class', 'restriction-controls-container').append('div').attr('class', 'restriction-controls').merge(controls).call(renderControls);
+         }
+
+         function renderControls(selection) {
+           var distControl = selection.selectAll('.restriction-distance').data([0]);
+           distControl.exit().remove();
+           var distControlEnter = distControl.enter().append('div').attr('class', 'restriction-control restriction-distance');
+           distControlEnter.append('span').attr('class', 'restriction-control-label restriction-distance-label').call(_t.append('restriction.controls.distance', {
+             suffix: ':'
+           }));
+           distControlEnter.append('input').attr('class', 'restriction-distance-input').attr('type', 'range').attr('min', '20').attr('max', '50').attr('step', '5');
+           distControlEnter.append('span').attr('class', 'restriction-distance-text'); // update
+
+           selection.selectAll('.restriction-distance-input').property('value', _maxDistance).on('input', function () {
+             var val = select(this).property('value');
+             _maxDistance = +val;
+             _intersection = null;
+
+             _container.selectAll('.layer-osm .layer-turns *').remove();
+
+             corePreferences('turn-restriction-distance', _maxDistance);
+
+             _parent.call(restrictions);
+           });
+           selection.selectAll('.restriction-distance-text').call(displayMaxDistance(_maxDistance));
+           var viaControl = selection.selectAll('.restriction-via-way').data([0]);
+           viaControl.exit().remove();
+           var viaControlEnter = viaControl.enter().append('div').attr('class', 'restriction-control restriction-via-way');
+           viaControlEnter.append('span').attr('class', 'restriction-control-label restriction-via-way-label').call(_t.append('restriction.controls.via', {
+             suffix: ':'
+           }));
+           viaControlEnter.append('input').attr('class', 'restriction-via-way-input').attr('type', 'range').attr('min', '0').attr('max', '2').attr('step', '1');
+           viaControlEnter.append('span').attr('class', 'restriction-via-way-text'); // update
+
+           selection.selectAll('.restriction-via-way-input').property('value', _maxViaWay).on('input', function () {
+             var val = select(this).property('value');
+             _maxViaWay = +val;
+
+             _container.selectAll('.layer-osm .layer-turns *').remove();
+
+             corePreferences('turn-restriction-via-way0', _maxViaWay);
+
+             _parent.call(restrictions);
+           });
+           selection.selectAll('.restriction-via-way-text').call(displayMaxVia(_maxViaWay));
+         }
+
+         function renderViewer(selection) {
+           if (!_intersection) return;
+           var vgraph = _intersection.graph;
+           var filter = utilFunctor(true);
+           var projection = geoRawMercator(); // Reflow warning: `utilGetDimensions` calls `getBoundingClientRect`
+           // Instead of asking the restriction-container for its dimensions,
+           //  we can ask the .sidebar, which can have its dimensions cached.
+           // width: calc as sidebar - padding
+           // height: hardcoded (from `80_app.css`)
+           // var d = utilGetDimensions(selection);
+
+           var sdims = utilGetDimensions(context.container().select('.sidebar'));
+           var d = [sdims[0] - 50, 370];
+           var c = geoVecScale(d, 0.5);
+           var z = 22;
+           projection.scale(geoZoomToScale(z)); // Calculate extent of all key vertices
+
+           var extent = geoExtent();
+
+           for (var i = 0; i < _intersection.vertices.length; i++) {
+             extent._extend(_intersection.vertices[i].extent());
+           }
+
+           var padTop = 35; // reserve top space for hint text
+           // If this is a large intersection, adjust zoom to fit extent
+
+           if (_intersection.vertices.length > 1) {
+             var hPadding = Math.min(160, Math.max(110, d[0] * 0.4));
+             var vPadding = 160;
+             var tl = projection([extent[0][0], extent[1][1]]);
+             var br = projection([extent[1][0], extent[0][1]]);
+             var hFactor = (br[0] - tl[0]) / (d[0] - hPadding);
+             var vFactor = (br[1] - tl[1]) / (d[1] - vPadding - padTop);
+             var hZoomDiff = Math.log(Math.abs(hFactor)) / Math.LN2;
+             var vZoomDiff = Math.log(Math.abs(vFactor)) / Math.LN2;
+             z = z - Math.max(hZoomDiff, vZoomDiff);
+             projection.scale(geoZoomToScale(z));
+           }
+
+           var extentCenter = projection(extent.center());
+           extentCenter[1] = extentCenter[1] - padTop / 2;
+           projection.translate(geoVecSubtract(c, extentCenter)).clipExtent([[0, 0], d]);
+           var drawLayers = svgLayers(projection, context).only(['osm', 'touch']).dimensions(d);
+           var drawVertices = svgVertices(projection, context);
+           var drawLines = svgLines(projection, context);
+           var drawTurns = svgTurns(projection, context);
+           var firstTime = selection.selectAll('.surface').empty();
+           selection.call(drawLayers);
+           var surface = selection.selectAll('.surface').classed('tr', true);
+
+           if (firstTime) {
+             _initialized = true;
+             surface.call(breathe);
+           } // This can happen if we've lowered the detail while a FROM way
+           // is selected, and that way is no longer part of the intersection.
+
+
+           if (_fromWayID && !vgraph.hasEntity(_fromWayID)) {
+             _fromWayID = null;
+             _oldTurns = null;
+           }
+
+           surface.call(utilSetDimensions, d).call(drawVertices, vgraph, _intersection.vertices, filter, extent, z).call(drawLines, vgraph, _intersection.ways, filter).call(drawTurns, vgraph, _intersection.turns(_fromWayID, _maxViaWay));
+           surface.on('click.restrictions', click).on('mouseover.restrictions', mouseover);
+           surface.selectAll('.selected').classed('selected', false);
+           surface.selectAll('.related').classed('related', false);
+           var way;
+
+           if (_fromWayID) {
+             way = vgraph.entity(_fromWayID);
+             surface.selectAll('.' + _fromWayID).classed('selected', true).classed('related', true);
+           }
+
+           document.addEventListener('resizeWindow', function () {
+             utilSetDimensions(_container, null);
+             redraw(1);
+           }, false);
+           updateHints(null);
+
+           function click(d3_event) {
+             surface.call(breathe.off).call(breathe);
+             var datum = d3_event.target.__data__;
+             var entity = datum && datum.properties && datum.properties.entity;
+
+             if (entity) {
+               datum = entity;
+             }
+
+             if (datum instanceof osmWay && (datum.__from || datum.__via)) {
+               _fromWayID = datum.id;
+               _oldTurns = null;
+               redraw();
+             } else if (datum instanceof osmTurn) {
+               var actions, extraActions, turns, i;
+               var restrictionType = osmInferRestriction(vgraph, datum, projection);
+
+               if (datum.restrictionID && !datum.direct) {
+                 return;
+               } else if (datum.restrictionID && !datum.only) {
+                 // NO -> ONLY
+                 var seen = {};
+                 var datumOnly = JSON.parse(JSON.stringify(datum)); // deep clone the datum
+
+                 datumOnly.only = true; // but change this property
+
+                 restrictionType = restrictionType.replace(/^no/, 'only'); // Adding an ONLY restriction should destroy all other direct restrictions from the FROM towards the VIA.
+                 // We will remember them in _oldTurns, and restore them if the user clicks again.
+
+                 turns = _intersection.turns(_fromWayID, 2);
+                 extraActions = [];
+                 _oldTurns = [];
+
+                 for (i = 0; i < turns.length; i++) {
+                   var turn = turns[i];
+                   if (seen[turn.restrictionID]) continue; // avoid deleting the turn twice (#4968, #4928)
+
+                   if (turn.direct && turn.path[1] === datum.path[1]) {
+                     seen[turns[i].restrictionID] = true;
+                     turn.restrictionType = osmInferRestriction(vgraph, turn, projection);
+
+                     _oldTurns.push(turn);
+
+                     extraActions.push(actionUnrestrictTurn(turn));
+                   }
+                 }
+
+                 actions = _intersection.actions.concat(extraActions, [actionRestrictTurn(datumOnly, restrictionType), _t('operations.restriction.annotation.create')]);
+               } else if (datum.restrictionID) {
+                 // ONLY -> Allowed
+                 // Restore whatever restrictions we might have destroyed by cycling thru the ONLY state.
+                 // This relies on the assumption that the intersection was already split up when we
+                 // performed the previous action (NO -> ONLY), so the IDs in _oldTurns shouldn't have changed.
+                 turns = _oldTurns || [];
+                 extraActions = [];
+
+                 for (i = 0; i < turns.length; i++) {
+                   if (turns[i].key !== datum.key) {
+                     extraActions.push(actionRestrictTurn(turns[i], turns[i].restrictionType));
+                   }
+                 }
+
+                 _oldTurns = null;
+                 actions = _intersection.actions.concat(extraActions, [actionUnrestrictTurn(datum), _t('operations.restriction.annotation.delete')]);
+               } else {
+                 // Allowed -> NO
+                 actions = _intersection.actions.concat([actionRestrictTurn(datum, restrictionType), _t('operations.restriction.annotation.create')]);
+               }
+
+               context.perform.apply(context, actions); // At this point the datum will be changed, but will have same key..
+               // Refresh it and update the help..
+
+               var s = surface.selectAll('.' + datum.key);
+               datum = s.empty() ? null : s.datum();
+               updateHints(datum);
+             } else {
+               _fromWayID = null;
+               _oldTurns = null;
+               redraw();
+             }
+           }
+
+           function mouseover(d3_event) {
+             var datum = d3_event.target.__data__;
+             updateHints(datum);
+           }
+
+           _lastXPos = _lastXPos || sdims[0];
+
+           function redraw(minChange) {
+             var xPos = -1;
+
+             if (minChange) {
+               xPos = utilGetDimensions(context.container().select('.sidebar'))[0];
+             }
+
+             if (!minChange || minChange && Math.abs(xPos - _lastXPos) >= minChange) {
+               if (context.hasEntity(_vertexID)) {
+                 _lastXPos = xPos;
+
+                 _container.call(renderViewer);
+               }
+             }
+           }
+
+           function highlightPathsFrom(wayID) {
+             surface.selectAll('.related').classed('related', false).classed('allow', false).classed('restrict', false).classed('only', false);
+             surface.selectAll('.' + wayID).classed('related', true);
+
+             if (wayID) {
+               var turns = _intersection.turns(wayID, _maxViaWay);
+
+               for (var i = 0; i < turns.length; i++) {
+                 var turn = turns[i];
+                 var ids = [turn.to.way];
+                 var klass = turn.no ? 'restrict' : turn.only ? 'only' : 'allow';
+
+                 if (turn.only || turns.length === 1) {
+                   if (turn.via.ways) {
+                     ids = ids.concat(turn.via.ways);
+                   }
+                 } else if (turn.to.way === wayID) {
+                   continue;
+                 }
+
+                 surface.selectAll(utilEntitySelector(ids)).classed('related', true).classed('allow', klass === 'allow').classed('restrict', klass === 'restrict').classed('only', klass === 'only');
+               }
+             }
+           }
+
+           function updateHints(datum) {
+             var help = _container.selectAll('.restriction-help').html('');
+
+             var placeholders = {};
+             ['from', 'via', 'to'].forEach(function (k) {
+               placeholders[k] = {
+                 html: '<span class="qualifier">' + _t('restriction.help.' + k) + '</span>'
+               };
+             });
+             var entity = datum && datum.properties && datum.properties.entity;
+
+             if (entity) {
+               datum = entity;
+             }
+
+             if (_fromWayID) {
+               way = vgraph.entity(_fromWayID);
+               surface.selectAll('.' + _fromWayID).classed('selected', true).classed('related', true);
+             } // Hovering a way
+
+
+             if (datum instanceof osmWay && datum.__from) {
+               way = datum;
+               highlightPathsFrom(_fromWayID ? null : way.id);
+               surface.selectAll('.' + way.id).classed('related', true);
+               var clickSelect = !_fromWayID || _fromWayID !== way.id;
+               help.append('div') // "Click to select FROM {fromName}." / "FROM {fromName}"
+               .html(_t.html('restriction.help.' + (clickSelect ? 'select_from_name' : 'from_name'), {
+                 from: placeholders.from,
+                 fromName: displayName(way.id, vgraph)
+               })); // Hovering a turn arrow
+             } else if (datum instanceof osmTurn) {
+               var restrictionType = osmInferRestriction(vgraph, datum, projection);
+               var turnType = restrictionType.replace(/^(only|no)\_/, '');
+               var indirect = datum.direct === false ? _t.html('restriction.help.indirect') : '';
+               var klass, turnText, nextText;
+
+               if (datum.no) {
+                 klass = 'restrict';
+                 turnText = _t.html('restriction.help.turn.no_' + turnType, {
+                   indirect: indirect
+                 });
+                 nextText = _t.html('restriction.help.turn.only_' + turnType, {
+                   indirect: ''
+                 });
+               } else if (datum.only) {
+                 klass = 'only';
+                 turnText = _t.html('restriction.help.turn.only_' + turnType, {
+                   indirect: indirect
+                 });
+                 nextText = _t.html('restriction.help.turn.allowed_' + turnType, {
+                   indirect: ''
+                 });
+               } else {
+                 klass = 'allow';
+                 turnText = _t.html('restriction.help.turn.allowed_' + turnType, {
+                   indirect: indirect
+                 });
+                 nextText = _t.html('restriction.help.turn.no_' + turnType, {
+                   indirect: ''
+                 });
+               }
+
+               help.append('div') // "NO Right Turn (indirect)"
+               .attr('class', 'qualifier ' + klass).html(turnText);
+               help.append('div') // "FROM {fromName} TO {toName}"
+               .html(_t.html('restriction.help.from_name_to_name', {
+                 from: placeholders.from,
+                 fromName: displayName(datum.from.way, vgraph),
+                 to: placeholders.to,
+                 toName: displayName(datum.to.way, vgraph)
+               }));
+
+               if (datum.via.ways && datum.via.ways.length) {
+                 var names = [];
+
+                 for (var i = 0; i < datum.via.ways.length; i++) {
+                   var prev = names[names.length - 1];
+                   var curr = displayName(datum.via.ways[i], vgraph);
+
+                   if (!prev || curr !== prev) {
+                     // collapse identical names
+                     names.push(curr);
+                   }
+                 }
+
+                 help.append('div') // "VIA {viaNames}"
+                 .html(_t.html('restriction.help.via_names', {
+                   via: placeholders.via,
+                   viaNames: names.join(', ')
+                 }));
+               }
+
+               if (!indirect) {
+                 help.append('div') // Click for "No Right Turn"
+                 .html(_t.html('restriction.help.toggle', {
+                   turn: {
+                     html: nextText.trim()
+                   }
+                 }));
+               }
+
+               highlightPathsFrom(null);
+               var alongIDs = datum.path.slice();
+               surface.selectAll(utilEntitySelector(alongIDs)).classed('related', true).classed('allow', klass === 'allow').classed('restrict', klass === 'restrict').classed('only', klass === 'only'); // Hovering empty surface
+             } else {
+               highlightPathsFrom(null);
+
+               if (_fromWayID) {
+                 help.append('div') // "FROM {fromName}"
+                 .html(_t.html('restriction.help.from_name', {
+                   from: placeholders.from,
+                   fromName: displayName(_fromWayID, vgraph)
+                 }));
+               } else {
+                 help.append('div') // "Click to select a FROM segment."
+                 .html(_t.html('restriction.help.select_from', {
+                   from: placeholders.from
+                 }));
+               }
+             }
+           }
+         }
+
+         function displayMaxDistance(maxDist) {
+           return function (selection) {
+             var isImperial = !_mainLocalizer.usesMetric();
+             var opts;
+
+             if (isImperial) {
+               var distToFeet = {
+                 // imprecise conversion for prettier display
+                 20: 70,
+                 25: 85,
+                 30: 100,
+                 35: 115,
+                 40: 130,
+                 45: 145,
+                 50: 160
+               }[maxDist];
+               opts = {
+                 distance: _t('units.feet', {
+                   quantity: distToFeet
+                 })
+               };
+             } else {
+               opts = {
+                 distance: _t('units.meters', {
+                   quantity: maxDist
+                 })
+               };
+             }
+
+             return selection.html('').call(_t.append('restriction.controls.distance_up_to', opts));
+           };
+         }
+
+         function displayMaxVia(maxVia) {
+           return function (selection) {
+             selection = selection.html('');
+             return maxVia === 0 ? selection.call(_t.append('restriction.controls.via_node_only')) : maxVia === 1 ? selection.call(_t.append('restriction.controls.via_up_to_one')) : selection.call(_t.append('restriction.controls.via_up_to_two'));
+           };
+         }
+
+         function displayName(entityID, graph) {
+           var entity = graph.entity(entityID);
+           var name = utilDisplayName(entity) || '';
+           var matched = _mainPresetIndex.match(entity, graph);
+           var type = matched && matched.name() || utilDisplayType(entity.id);
+           return name || type;
+         }
+
+         restrictions.entityIDs = function (val) {
+           _intersection = null;
+           _fromWayID = null;
+           _oldTurns = null;
+           _vertexID = val[0];
+         };
+
+         restrictions.tags = function () {};
+
+         restrictions.focus = function () {};
+
+         restrictions.off = function (selection) {
+           if (!_initialized) return;
+           selection.selectAll('.surface').call(breathe.off).on('click.restrictions', null).on('mouseover.restrictions', null);
+           select(window).on('resize.restrictions', null);
+         };
+
+         return utilRebind(restrictions, dispatch, 'on');
+       }
+       uiFieldRestrictions.supportsMultiselection = false;
+
+       function uiFieldTextarea(field, context) {
+         var dispatch = dispatch$8('change');
+         var input = select(null);
+
+         var _tags;
+
+         function textarea(selection) {
+           var wrap = selection.selectAll('.form-field-input-wrap').data([0]);
+           wrap = wrap.enter().append('div').attr('class', 'form-field-input-wrap form-field-input-' + field.type).merge(wrap);
+           input = wrap.selectAll('textarea').data([0]);
+           input = input.enter().append('textarea').attr('id', field.domId).call(utilNoAuto).on('input', change(true)).on('blur', change()).on('change', change()).merge(input);
+         }
+
+         function change(onInput) {
+           return function () {
+             var val = utilGetSetValue(input);
+             if (!onInput) val = context.cleanTagValue(val); // don't override multiple values with blank string
+
+             if (!val && Array.isArray(_tags[field.key])) return;
+             var t = {};
+             t[field.key] = val || undefined;
+             dispatch.call('change', this, t, onInput);
+           };
+         }
+
+         textarea.tags = function (tags) {
+           _tags = tags;
+           var isMixed = Array.isArray(tags[field.key]);
+           utilGetSetValue(input, !isMixed && tags[field.key] ? tags[field.key] : '').attr('title', isMixed ? tags[field.key].filter(Boolean).join('\n') : undefined).attr('placeholder', isMixed ? _t('inspector.multiple_values') : field.placeholder() || _t('inspector.unknown')).classed('mixed', isMixed);
+         };
+
+         textarea.focus = function () {
+           input.node().focus();
+         };
+
+         return utilRebind(textarea, dispatch, 'on');
+       }
+
+       function uiFieldWikidata(field, context) {
+         var wikidata = services.wikidata;
+         var dispatch = dispatch$8('change');
+
+         var _selection = select(null);
+
+         var _searchInput = select(null);
+
+         var _qid = null;
+         var _wikidataEntity = null;
+         var _wikiURL = '';
+         var _entityIDs = [];
+
+         var _wikipediaKey = field.keys && field.keys.find(function (key) {
+           return key.includes('wikipedia');
+         }),
+             _hintKey = field.key === 'wikidata' ? 'name' : field.key.split(':')[0];
+
+         var combobox = uiCombobox(context, 'combo-' + field.safeid).caseSensitive(true).minItems(1);
+
+         function wiki(selection) {
+           _selection = selection;
+           var wrap = selection.selectAll('.form-field-input-wrap').data([0]);
+           wrap = wrap.enter().append('div').attr('class', 'form-field-input-wrap form-field-input-' + field.type).merge(wrap);
+           var list = wrap.selectAll('ul').data([0]);
+           list = list.enter().append('ul').attr('class', 'rows').merge(list);
+           var searchRow = list.selectAll('li.wikidata-search').data([0]);
+           var searchRowEnter = searchRow.enter().append('li').attr('class', 'wikidata-search');
+           searchRowEnter.append('input').attr('type', 'text').attr('id', field.domId).style('flex', '1').call(utilNoAuto).on('focus', function () {
+             var node = select(this).node();
+             node.setSelectionRange(0, node.value.length);
+           }).on('blur', function () {
+             setLabelForEntity();
+           }).call(combobox.fetcher(fetchWikidataItems));
+           combobox.on('accept', function (d) {
+             if (d) {
+               _qid = d.id;
+               change();
+             }
+           }).on('cancel', function () {
+             setLabelForEntity();
+           });
+           searchRowEnter.append('button').attr('class', 'form-field-button wiki-link').attr('title', _t('icons.view_on', {
+             domain: 'wikidata.org'
+           })).call(svgIcon('#iD-icon-out-link')).on('click', function (d3_event) {
+             d3_event.preventDefault();
+             if (_wikiURL) window.open(_wikiURL, '_blank');
+           });
+           searchRow = searchRow.merge(searchRowEnter);
+           _searchInput = searchRow.select('input');
+           var wikidataProperties = ['description', 'identifier'];
+           var items = list.selectAll('li.labeled-input').data(wikidataProperties); // Enter
+
+           var enter = items.enter().append('li').attr('class', function (d) {
+             return 'labeled-input preset-wikidata-' + d;
+           });
+           enter.append('span').attr('class', 'label').html(function (d) {
+             return _t.html('wikidata.' + d);
+           });
+           enter.append('input').attr('type', 'text').call(utilNoAuto).classed('disabled', 'true').attr('readonly', 'true');
+           enter.append('button').attr('class', 'form-field-button').attr('title', _t('icons.copy')).call(svgIcon('#iD-operation-copy')).on('click', function (d3_event) {
+             d3_event.preventDefault();
+             select(this.parentNode).select('input').node().select();
+             document.execCommand('copy');
+           });
+         }
+
+         function fetchWikidataItems(q, callback) {
+           if (!q && _hintKey) {
+             // other tags may be good search terms
+             for (var i in _entityIDs) {
+               var entity = context.hasEntity(_entityIDs[i]);
+
+               if (entity.tags[_hintKey]) {
+                 q = entity.tags[_hintKey];
+                 break;
+               }
+             }
+           }
+
+           wikidata.itemsForSearchQuery(q, function (err, data) {
+             if (err) return;
+
+             for (var i in data) {
+               data[i].value = data[i].label + ' (' + data[i].id + ')';
+               data[i].title = data[i].description;
+             }
+
+             if (callback) callback(data);
+           });
+         }
+
+         function change() {
+           var syncTags = {};
+           syncTags[field.key] = _qid;
+           dispatch.call('change', this, syncTags); // attempt asynchronous update of wikidata tag..
+
+           var initGraph = context.graph();
+           var initEntityIDs = _entityIDs;
+           wikidata.entityByQID(_qid, function (err, entity) {
+             if (err) return; // If graph has changed, we can't apply this update.
+
+             if (context.graph() !== initGraph) return;
+             if (!entity.sitelinks) return;
+             var langs = wikidata.languagesToQuery(); // use the label and description languages as fallbacks
+
+             ['labels', 'descriptions'].forEach(function (key) {
+               if (!entity[key]) return;
+               var valueLangs = Object.keys(entity[key]);
+               if (valueLangs.length === 0) return;
+               var valueLang = valueLangs[0];
+
+               if (langs.indexOf(valueLang) === -1) {
+                 langs.push(valueLang);
+               }
+             });
+             var newWikipediaValue;
+
+             if (_wikipediaKey) {
+               var foundPreferred;
+
+               for (var i in langs) {
+                 var lang = langs[i];
+                 var siteID = lang.replace('-', '_') + 'wiki';
+
+                 if (entity.sitelinks[siteID]) {
+                   foundPreferred = true;
+                   newWikipediaValue = lang + ':' + entity.sitelinks[siteID].title; // use the first match
+
+                   break;
+                 }
+               }
+
+               if (!foundPreferred) {
+                 // No wikipedia sites available in the user's language or the fallback languages,
+                 // default to any wikipedia sitelink
+                 var wikiSiteKeys = Object.keys(entity.sitelinks).filter(function (site) {
+                   return site.endsWith('wiki');
+                 });
+
+                 if (wikiSiteKeys.length === 0) {
+                   // if no wikipedia pages are linked to this wikidata entity, delete that tag
+                   newWikipediaValue = null;
+                 } else {
+                   var wikiLang = wikiSiteKeys[0].slice(0, -4).replace('_', '-');
+                   var wikiTitle = entity.sitelinks[wikiSiteKeys[0]].title;
+                   newWikipediaValue = wikiLang + ':' + wikiTitle;
+                 }
+               }
+             }
+
+             if (newWikipediaValue) {
+               newWikipediaValue = context.cleanTagValue(newWikipediaValue);
+             }
+
+             if (typeof newWikipediaValue === 'undefined') return;
+             var actions = initEntityIDs.map(function (entityID) {
+               var entity = context.hasEntity(entityID);
+               if (!entity) return null;
+               var currTags = Object.assign({}, entity.tags); // shallow copy
+
+               if (newWikipediaValue === null) {
+                 if (!currTags[_wikipediaKey]) return null;
+                 delete currTags[_wikipediaKey];
+               } else {
+                 currTags[_wikipediaKey] = newWikipediaValue;
+               }
+
+               return actionChangeTags(entityID, currTags);
+             }).filter(Boolean);
+             if (!actions.length) return; // Coalesce the update of wikidata tag into the previous tag change
+
+             context.overwrite(function actionUpdateWikipediaTags(graph) {
+               actions.forEach(function (action) {
+                 graph = action(graph);
+               });
+               return graph;
+             }, context.history().undoAnnotation()); // do not dispatch.call('change') here, because entity_editor
+             // changeTags() is not intended to be called asynchronously
+           });
+         }
+
+         function setLabelForEntity() {
+           var label = '';
+
+           if (_wikidataEntity) {
+             label = entityPropertyForDisplay(_wikidataEntity, 'labels');
+
+             if (label.length === 0) {
+               label = _wikidataEntity.id.toString();
+             }
+           }
+
+           utilGetSetValue(_searchInput, label);
+         }
+
+         wiki.tags = function (tags) {
+           var isMixed = Array.isArray(tags[field.key]);
+
+           _searchInput.attr('title', isMixed ? tags[field.key].filter(Boolean).join('\n') : null).attr('placeholder', isMixed ? _t('inspector.multiple_values') : '').classed('mixed', isMixed);
+
+           _qid = typeof tags[field.key] === 'string' && tags[field.key] || '';
+
+           if (!/^Q[0-9]*$/.test(_qid)) {
+             // not a proper QID
+             unrecognized();
+             return;
+           } // QID value in correct format
+
+
+           _wikiURL = 'https://wikidata.org/wiki/' + _qid;
+           wikidata.entityByQID(_qid, function (err, entity) {
+             if (err) {
+               unrecognized();
+               return;
+             }
+
+             _wikidataEntity = entity;
+             setLabelForEntity();
+             var description = entityPropertyForDisplay(entity, 'descriptions');
+
+             _selection.select('button.wiki-link').classed('disabled', false);
+
+             _selection.select('.preset-wikidata-description').style('display', function () {
+               return description.length > 0 ? 'flex' : 'none';
+             }).select('input').attr('value', description);
+
+             _selection.select('.preset-wikidata-identifier').style('display', function () {
+               return entity.id ? 'flex' : 'none';
+             }).select('input').attr('value', entity.id);
+           }); // not a proper QID
+
+           function unrecognized() {
+             _wikidataEntity = null;
+             setLabelForEntity();
+
+             _selection.select('.preset-wikidata-description').style('display', 'none');
+
+             _selection.select('.preset-wikidata-identifier').style('display', 'none');
+
+             _selection.select('button.wiki-link').classed('disabled', true);
+
+             if (_qid && _qid !== '') {
+               _wikiURL = 'https://wikidata.org/wiki/Special:Search?search=' + _qid;
+             } else {
+               _wikiURL = '';
+             }
+           }
+         };
+
+         function entityPropertyForDisplay(wikidataEntity, propKey) {
+           if (!wikidataEntity[propKey]) return '';
+           var propObj = wikidataEntity[propKey];
+           var langKeys = Object.keys(propObj);
+           if (langKeys.length === 0) return ''; // sorted by priority, since we want to show the user's language first if possible
+
+           var langs = wikidata.languagesToQuery();
+
+           for (var i in langs) {
+             var lang = langs[i];
+             var valueObj = propObj[lang];
+             if (valueObj && valueObj.value && valueObj.value.length > 0) return valueObj.value;
+           } // default to any available value
+
+
+           return propObj[langKeys[0]].value;
+         }
+
+         wiki.entityIDs = function (val) {
+           if (!arguments.length) return _entityIDs;
+           _entityIDs = val;
+           return wiki;
+         };
+
+         wiki.focus = function () {
+           _searchInput.node().focus();
+         };
+
+         return utilRebind(wiki, dispatch, 'on');
+       }
+
+       function uiFieldWikipedia(field, context) {
+         var _arguments = arguments;
+         var dispatch = dispatch$8('change');
+         var wikipedia = services.wikipedia;
+         var wikidata = services.wikidata;
+
+         var _langInput = select(null);
+
+         var _titleInput = select(null);
+
+         var _wikiURL = '';
+
+         var _entityIDs;
+
+         var _tags;
+
+         var _dataWikipedia = [];
+         _mainFileFetcher.get('wmf_sitematrix').then(function (d) {
+           _dataWikipedia = d;
+           if (_tags) updateForTags(_tags);
+         })["catch"](function () {
+           /* ignore */
+         });
+         var langCombo = uiCombobox(context, 'wikipedia-lang').fetcher(function (value, callback) {
+           var v = value.toLowerCase();
+           callback(_dataWikipedia.filter(function (d) {
+             return d[0].toLowerCase().indexOf(v) >= 0 || d[1].toLowerCase().indexOf(v) >= 0 || d[2].toLowerCase().indexOf(v) >= 0;
+           }).map(function (d) {
+             return {
+               value: d[1]
+             };
+           }));
+         });
+         var titleCombo = uiCombobox(context, 'wikipedia-title').fetcher(function (value, callback) {
+           if (!value) {
+             value = '';
+
+             for (var i in _entityIDs) {
+               var entity = context.hasEntity(_entityIDs[i]);
+
+               if (entity.tags.name) {
+                 value = entity.tags.name;
+                 break;
+               }
+             }
+           }
+
+           var searchfn = value.length > 7 ? wikipedia.search : wikipedia.suggestions;
+           searchfn(language()[2], value, function (query, data) {
+             callback(data.map(function (d) {
+               return {
+                 value: d
+               };
+             }));
+           });
+         });
+
+         function wiki(selection) {
+           var wrap = selection.selectAll('.form-field-input-wrap').data([0]);
+           wrap = wrap.enter().append('div').attr('class', "form-field-input-wrap form-field-input-".concat(field.type)).merge(wrap);
+           var langContainer = wrap.selectAll('.wiki-lang-container').data([0]);
+           langContainer = langContainer.enter().append('div').attr('class', 'wiki-lang-container').merge(langContainer);
+           _langInput = langContainer.selectAll('input.wiki-lang').data([0]);
+           _langInput = _langInput.enter().append('input').attr('type', 'text').attr('class', 'wiki-lang').attr('placeholder', _t('translate.localized_translation_language')).call(utilNoAuto).call(langCombo).merge(_langInput);
+
+           _langInput.on('blur', changeLang).on('change', changeLang);
+
+           var titleContainer = wrap.selectAll('.wiki-title-container').data([0]);
+           titleContainer = titleContainer.enter().append('div').attr('class', 'wiki-title-container').merge(titleContainer);
+           _titleInput = titleContainer.selectAll('input.wiki-title').data([0]);
+           _titleInput = _titleInput.enter().append('input').attr('type', 'text').attr('class', 'wiki-title').attr('id', field.domId).call(utilNoAuto).call(titleCombo).merge(_titleInput);
+
+           _titleInput.on('blur', function () {
+             change(true);
+           }).on('change', function () {
+             change(false);
+           });
+
+           var link = titleContainer.selectAll('.wiki-link').data([0]);
+           link = link.enter().append('button').attr('class', 'form-field-button wiki-link').attr('title', _t('icons.view_on', {
+             domain: 'wikipedia.org'
+           })).call(svgIcon('#iD-icon-out-link')).merge(link);
+           link.on('click', function (d3_event) {
+             d3_event.preventDefault();
+             if (_wikiURL) window.open(_wikiURL, '_blank');
+           });
+         }
+
+         function defaultLanguageInfo(skipEnglishFallback) {
+           var langCode = _mainLocalizer.languageCode().toLowerCase();
+
+           for (var i in _dataWikipedia) {
+             var d = _dataWikipedia[i]; // default to the language of iD's current locale
+
+             if (d[2] === langCode) return d;
+           } // fallback to English
+
+
+           return skipEnglishFallback ? ['', '', ''] : ['English', 'English', 'en'];
+         }
+
+         function language(skipEnglishFallback) {
+           var value = utilGetSetValue(_langInput).toLowerCase();
+
+           for (var i in _dataWikipedia) {
+             var d = _dataWikipedia[i]; // return the language already set in the UI, if supported
+
+             if (d[0].toLowerCase() === value || d[1].toLowerCase() === value || d[2] === value) return d;
+           } // fallback to English
+
+
+           return defaultLanguageInfo(skipEnglishFallback);
+         }
+
+         function changeLang() {
+           utilGetSetValue(_langInput, language()[1]);
+           change(true);
+         }
+
+         function change(skipWikidata) {
+           var value = utilGetSetValue(_titleInput);
+           var m = value.match(/https?:\/\/([-a-z]+)\.wikipedia\.org\/(?:wiki|\1-[-a-z]+)\/([^#]+)(?:#(.+))?/);
+
+           var langInfo = m && _dataWikipedia.find(function (d) {
+             return m[1] === d[2];
+           });
+
+           var syncTags = {};
+
+           if (langInfo) {
+             var nativeLangName = langInfo[1]; // Normalize title http://www.mediawiki.org/wiki/API:Query#Title_normalization
+
+             value = decodeURIComponent(m[2]).replace(/_/g, ' ');
+
+             if (m[3]) {
+               var anchor; // try {
+               // leave this out for now - #6232
+               // Best-effort `anchordecode:` implementation
+               // anchor = decodeURIComponent(m[3].replace(/\.([0-9A-F]{2})/g, '%$1'));
+               // } catch (e) {
+
+               anchor = decodeURIComponent(m[3]); // }
+
+               value += '#' + anchor.replace(/_/g, ' ');
+             }
+
+             value = value.slice(0, 1).toUpperCase() + value.slice(1);
+             utilGetSetValue(_langInput, nativeLangName);
+             utilGetSetValue(_titleInput, value);
+           }
+
+           if (value) {
+             syncTags.wikipedia = context.cleanTagValue(language()[2] + ':' + value);
+           } else {
+             syncTags.wikipedia = undefined;
+           }
+
+           dispatch.call('change', this, syncTags);
+           if (skipWikidata || !value || !language()[2]) return; // attempt asynchronous update of wikidata tag..
+
+           var initGraph = context.graph();
+           var initEntityIDs = _entityIDs;
+           wikidata.itemsByTitle(language()[2], value, function (err, data) {
+             if (err || !data || !Object.keys(data).length) return; // If graph has changed, we can't apply this update.
+
+             if (context.graph() !== initGraph) return;
+             var qids = Object.keys(data);
+             var value = qids && qids.find(function (id) {
+               return id.match(/^Q\d+$/);
+             });
+             var actions = initEntityIDs.map(function (entityID) {
+               var entity = context.entity(entityID).tags;
+               var currTags = Object.assign({}, entity); // shallow copy
+
+               if (currTags.wikidata !== value) {
+                 currTags.wikidata = value;
+                 return actionChangeTags(entityID, currTags);
+               }
+
+               return null;
+             }).filter(Boolean);
+             if (!actions.length) return; // Coalesce the update of wikidata tag into the previous tag change
+
+             context.overwrite(function actionUpdateWikidataTags(graph) {
+               actions.forEach(function (action) {
+                 graph = action(graph);
+               });
+               return graph;
+             }, context.history().undoAnnotation()); // do not dispatch.call('change') here, because entity_editor
+             // changeTags() is not intended to be called asynchronously
+           });
+         }
+
+         wiki.tags = function (tags) {
+           _tags = tags;
+           updateForTags(tags);
+         };
+
+         function updateForTags(tags) {
+           var value = typeof tags[field.key] === 'string' ? tags[field.key] : ''; // Expect tag format of `tagLang:tagArticleTitle`, e.g. `fr:Paris`, with
+           // optional suffix of `#anchor`
+
+           var m = value.match(/([^:]+):([^#]+)(?:#(.+))?/);
+           var tagLang = m && m[1];
+           var tagArticleTitle = m && m[2];
+           var anchor = m && m[3];
+
+           var tagLangInfo = tagLang && _dataWikipedia.find(function (d) {
+             return tagLang === d[2];
+           }); // value in correct format
+
+
+           if (tagLangInfo) {
+             var nativeLangName = tagLangInfo[1];
+             utilGetSetValue(_langInput, nativeLangName);
+             utilGetSetValue(_titleInput, tagArticleTitle + (anchor ? '#' + anchor : ''));
+
+             if (anchor) {
+               try {
+                 // Best-effort `anchorencode:` implementation
+                 anchor = encodeURIComponent(anchor.replace(/ /g, '_')).replace(/%/g, '.');
+               } catch (e) {
+                 anchor = anchor.replace(/ /g, '_');
+               }
+             }
+
+             _wikiURL = 'https://' + tagLang + '.wikipedia.org/wiki/' + tagArticleTitle.replace(/ /g, '_') + (anchor ? '#' + anchor : ''); // unrecognized value format
+           } else {
+             utilGetSetValue(_titleInput, value);
+
+             if (value && value !== '') {
+               utilGetSetValue(_langInput, '');
+               var defaultLangInfo = defaultLanguageInfo();
+               _wikiURL = "https://".concat(defaultLangInfo[2], ".wikipedia.org/w/index.php?fulltext=1&search=").concat(value);
+             } else {
+               var shownOrDefaultLangInfo = language(true
+               /* skipEnglishFallback */
+               );
+               utilGetSetValue(_langInput, shownOrDefaultLangInfo[1]);
+               _wikiURL = '';
+             }
+           }
+         }
+
+         wiki.entityIDs = function (val) {
+           if (!_arguments.length) return _entityIDs;
+           _entityIDs = val;
+           return wiki;
+         };
+
+         wiki.focus = function () {
+           _titleInput.node().focus();
+         };
+
+         return utilRebind(wiki, dispatch, 'on');
+       }
+       uiFieldWikipedia.supportsMultiselection = false;
+
+       var uiFields = {
+         access: uiFieldAccess,
+         address: uiFieldAddress,
+         check: uiFieldCheck,
+         combo: uiFieldCombo,
+         cycleway: uiFieldCycleway,
+         defaultCheck: uiFieldCheck,
+         email: uiFieldText,
+         identifier: uiFieldText,
+         lanes: uiFieldLanes,
+         localized: uiFieldLocalized,
+         roadheight: uiFieldRoadheight,
+         roadspeed: uiFieldRoadspeed,
+         manyCombo: uiFieldCombo,
+         multiCombo: uiFieldCombo,
+         networkCombo: uiFieldCombo,
+         number: uiFieldText,
+         onewayCheck: uiFieldCheck,
+         radio: uiFieldRadio,
+         restrictions: uiFieldRestrictions,
+         semiCombo: uiFieldCombo,
+         structureRadio: uiFieldRadio,
+         tel: uiFieldText,
+         text: uiFieldText,
+         textarea: uiFieldTextarea,
+         typeCombo: uiFieldCombo,
+         url: uiFieldText,
+         wikidata: uiFieldWikidata,
+         wikipedia: uiFieldWikipedia
+       };
+
+       function uiField(context, presetField, entityIDs, options) {
+         options = Object.assign({
+           show: true,
+           wrap: true,
+           remove: true,
+           revert: true,
+           info: true
+         }, options);
+         var dispatch = dispatch$8('change', 'revert');
+         var field = Object.assign({}, presetField); // shallow copy
+
+         field.domId = utilUniqueDomId('form-field-' + field.safeid);
+         var _show = options.show;
+         var _state = '';
+         var _tags = {};
+
+         var _entityExtent;
+
+         if (entityIDs && entityIDs.length) {
+           _entityExtent = entityIDs.reduce(function (extent, entityID) {
+             var entity = context.graph().entity(entityID);
+             return extent.extend(entity.extent(context.graph()));
+           }, geoExtent());
+         }
+
+         var _locked = false;
+
+         var _lockedTip = uiTooltip().title(_t.html('inspector.lock.suggestion', {
+           label: field.label
+         })).placement('bottom');
+
+         field.keys = field.keys || [field.key]; // only create the fields that are actually being shown
+
+         if (_show && !field.impl) {
+           createField();
+         } // Creates the field.. This is done lazily,
+         // once we know that the field will be shown.
+
+
+         function createField() {
+           field.impl = uiFields[field.type](field, context).on('change', function (t, onInput) {
+             dispatch.call('change', field, t, onInput);
+           });
+
+           if (entityIDs) {
+             field.entityIDs = entityIDs; // if this field cares about the entities, pass them along
+
+             if (field.impl.entityIDs) {
+               field.impl.entityIDs(entityIDs);
+             }
+           }
+         }
+
+         function isModified() {
+           if (!entityIDs || !entityIDs.length) return false;
+           return entityIDs.some(function (entityID) {
+             var original = context.graph().base().entities[entityID];
+             var latest = context.graph().entity(entityID);
+             return field.keys.some(function (key) {
+               return original ? latest.tags[key] !== original.tags[key] : latest.tags[key];
+             });
+           });
+         }
+
+         function tagsContainFieldKey() {
+           return field.keys.some(function (key) {
+             if (field.type === 'multiCombo') {
+               for (var tagKey in _tags) {
+                 if (tagKey.indexOf(key) === 0) {
+                   return true;
+                 }
+               }
+
+               return false;
+             }
+
+             return _tags[key] !== undefined;
+           });
+         }
+
+         function revert(d3_event, d) {
+           d3_event.stopPropagation();
+           d3_event.preventDefault();
+           if (!entityIDs || _locked) return;
+           dispatch.call('revert', d, d.keys);
+         }
+
+         function remove(d3_event, d) {
+           d3_event.stopPropagation();
+           d3_event.preventDefault();
+           if (_locked) return;
+           var t = {};
+           d.keys.forEach(function (key) {
+             t[key] = undefined;
+           });
+           dispatch.call('change', d, t);
+         }
+
+         field.render = function (selection) {
+           var container = selection.selectAll('.form-field').data([field]); // Enter
+
+           var enter = container.enter().append('div').attr('class', function (d) {
+             return 'form-field form-field-' + d.safeid;
+           }).classed('nowrap', !options.wrap);
+
+           if (options.wrap) {
+             var labelEnter = enter.append('label').attr('class', 'field-label').attr('for', function (d) {
+               return d.domId;
+             });
+             var textEnter = labelEnter.append('span').attr('class', 'label-text');
+             textEnter.append('span').attr('class', 'label-textvalue').html(function (d) {
+               return d.label();
+             });
+             textEnter.append('span').attr('class', 'label-textannotation');
+
+             if (options.remove) {
+               labelEnter.append('button').attr('class', 'remove-icon').attr('title', _t('icons.remove')).call(svgIcon('#iD-operation-delete'));
+             }
+
+             if (options.revert) {
+               labelEnter.append('button').attr('class', 'modified-icon').attr('title', _t('icons.undo')).call(svgIcon(_mainLocalizer.textDirection() === 'rtl' ? '#iD-icon-redo' : '#iD-icon-undo'));
+             }
+           } // Update
+
+
+           container = container.merge(enter);
+           container.select('.field-label > .remove-icon') // propagate bound data
+           .on('click', remove);
+           container.select('.field-label > .modified-icon') // propagate bound data
+           .on('click', revert);
+           container.each(function (d) {
+             var selection = select(this);
+
+             if (!d.impl) {
+               createField();
+             }
+
+             var reference, help; // instantiate field help
+
+             if (options.wrap && field.type === 'restrictions') {
+               help = uiFieldHelp(context, 'restrictions');
+             } // instantiate tag reference
+
+
+             if (options.wrap && options.info) {
+               var referenceKey = d.key || '';
+
+               if (d.type === 'multiCombo') {
+                 // lookup key without the trailing ':'
+                 referenceKey = referenceKey.replace(/:$/, '');
+               }
+
+               reference = uiTagReference(d.reference || {
+                 key: referenceKey
+               });
+
+               if (_state === 'hover') {
+                 reference.showing(false);
+               }
+             }
+
+             selection.call(d.impl); // add field help components
+
+             if (help) {
+               selection.call(help.body).select('.field-label').call(help.button);
+             } // add tag reference components
+
+
+             if (reference) {
+               selection.call(reference.body).select('.field-label').call(reference.button);
+             }
+
+             d.impl.tags(_tags);
+           });
+           container.classed('locked', _locked).classed('modified', isModified()).classed('present', tagsContainFieldKey()); // show a tip and lock icon if the field is locked
+
+           var annotation = container.selectAll('.field-label .label-textannotation');
+           var icon = annotation.selectAll('.icon').data(_locked ? [0] : []);
+           icon.exit().remove();
+           icon.enter().append('svg').attr('class', 'icon').append('use').attr('xlink:href', '#fas-lock');
+           container.call(_locked ? _lockedTip : _lockedTip.destroy);
+         };
+
+         field.state = function (val) {
+           if (!arguments.length) return _state;
+           _state = val;
+           return field;
+         };
+
+         field.tags = function (val) {
+           if (!arguments.length) return _tags;
+           _tags = val;
+
+           if (tagsContainFieldKey() && !_show) {
+             // always show a field if it has a value to display
+             _show = true;
+
+             if (!field.impl) {
+               createField();
+             }
+           }
+
+           return field;
+         };
+
+         field.locked = function (val) {
+           if (!arguments.length) return _locked;
+           _locked = val;
+           return field;
+         };
+
+         field.show = function () {
+           _show = true;
+
+           if (!field.impl) {
+             createField();
+           }
+
+           if (field["default"] && field.key && _tags[field.key] !== field["default"]) {
+             var t = {};
+             t[field.key] = field["default"];
+             dispatch.call('change', this, t);
+           }
+         }; // A shown field has a visible UI, a non-shown field is in the 'Add field' dropdown
+
+
+         field.isShown = function () {
+           return _show;
+         }; // An allowed field can appear in the UI or in the 'Add field' dropdown.
+         // A non-allowed field is hidden from the user altogether
+
+
+         field.isAllowed = function () {
+           if (entityIDs && entityIDs.length > 1 && uiFields[field.type].supportsMultiselection === false) return false;
+           if (field.geometry && !entityIDs.every(function (entityID) {
+             return field.matchGeometry(context.graph().geometry(entityID));
+           })) return false;
+
+           if (entityIDs && _entityExtent && field.locationSetID) {
+             // is field allowed in this location?
+             var validLocations = _mainLocations.locationsAt(_entityExtent.center());
+             if (!validLocations[field.locationSetID]) return false;
+           }
+
+           var prerequisiteTag = field.prerequisiteTag;
+
+           if (entityIDs && !tagsContainFieldKey() && // ignore tagging prerequisites if a value is already present
+           prerequisiteTag) {
+             if (!entityIDs.every(function (entityID) {
+               var entity = context.graph().entity(entityID);
+
+               if (prerequisiteTag.key) {
+                 var value = entity.tags[prerequisiteTag.key];
+                 if (!value) return false;
+
+                 if (prerequisiteTag.valueNot) {
+                   return prerequisiteTag.valueNot !== value;
+                 }
+
+                 if (prerequisiteTag.value) {
+                   return prerequisiteTag.value === value;
+                 }
+               } else if (prerequisiteTag.keyNot) {
+                 if (entity.tags[prerequisiteTag.keyNot]) return false;
+               }
+
+               return true;
+             })) return false;
+           }
+
+           return true;
+         };
+
+         field.focus = function () {
+           if (field.impl) {
+             field.impl.focus();
+           }
+         };
+
+         return utilRebind(field, dispatch, 'on');
+       }
+
+       function uiFormFields(context) {
+         var moreCombo = uiCombobox(context, 'more-fields').minItems(1);
+         var _fieldsArr = [];
+         var _lastPlaceholder = '';
+         var _state = '';
+         var _klass = '';
+
+         function formFields(selection) {
+           var allowedFields = _fieldsArr.filter(function (field) {
+             return field.isAllowed();
+           });
+
+           var shown = allowedFields.filter(function (field) {
+             return field.isShown();
+           });
+           var notShown = allowedFields.filter(function (field) {
+             return !field.isShown();
+           });
+           var container = selection.selectAll('.form-fields-container').data([0]);
+           container = container.enter().append('div').attr('class', 'form-fields-container ' + (_klass || '')).merge(container);
+           var fields = container.selectAll('.wrap-form-field').data(shown, function (d) {
+             return d.id + (d.entityIDs ? d.entityIDs.join() : '');
+           });
+           fields.exit().remove(); // Enter
+
+           var enter = fields.enter().append('div').attr('class', function (d) {
+             return 'wrap-form-field wrap-form-field-' + d.safeid;
+           }); // Update
+
+           fields = fields.merge(enter);
+           fields.order().each(function (d) {
+             select(this).call(d.render);
+           });
+           var titles = [];
+           var moreFields = notShown.map(function (field) {
+             var title = field.title();
+             titles.push(title);
+             var terms = field.terms();
+             if (field.key) terms.push(field.key);
+             if (field.keys) terms = terms.concat(field.keys);
+             return {
+               display: field.label(),
+               value: title,
+               title: title,
+               field: field,
+               terms: terms
+             };
+           });
+           var placeholder = titles.slice(0, 3).join(', ') + (titles.length > 3 ? '…' : '');
+           var more = selection.selectAll('.more-fields').data(_state === 'hover' || moreFields.length === 0 ? [] : [0]);
+           more.exit().remove();
+           var moreEnter = more.enter().append('div').attr('class', 'more-fields').append('label');
+           moreEnter.append('span').call(_t.append('inspector.add_fields'));
+           more = moreEnter.merge(more);
+           var input = more.selectAll('.value').data([0]);
+           input.exit().remove();
+           input = input.enter().append('input').attr('class', 'value').attr('type', 'text').attr('placeholder', placeholder).call(utilNoAuto).merge(input);
+           input.call(utilGetSetValue, '').call(moreCombo.data(moreFields).on('accept', function (d) {
+             if (!d) return; // user entered something that was not matched
+
+             var field = d.field;
+             field.show();
+             selection.call(formFields); // rerender
+
+             field.focus();
+           })); // avoid updating placeholder excessively (triggers style recalc)
+
+           if (_lastPlaceholder !== placeholder) {
+             input.attr('placeholder', placeholder);
+             _lastPlaceholder = placeholder;
+           }
+         }
+
+         formFields.fieldsArr = function (val) {
+           if (!arguments.length) return _fieldsArr;
+           _fieldsArr = val || [];
+           return formFields;
+         };
+
+         formFields.state = function (val) {
+           if (!arguments.length) return _state;
+           _state = val;
+           return formFields;
+         };
+
+         formFields.klass = function (val) {
+           if (!arguments.length) return _klass;
+           _klass = val;
+           return formFields;
+         };
+
+         return formFields;
+       }
+
+       function uiChangesetEditor(context) {
+         var dispatch = dispatch$8('change');
+         var formFields = uiFormFields(context);
+         var commentCombo = uiCombobox(context, 'comment').caseSensitive(true);
+
+         var _fieldsArr;
+
+         var _tags;
+
+         var _changesetID;
+
+         function changesetEditor(selection) {
+           render(selection);
+         }
+
+         function render(selection) {
+           var initial = false;
+
+           if (!_fieldsArr) {
+             initial = true;
+             var presets = _mainPresetIndex;
+             _fieldsArr = [uiField(context, presets.field('comment'), null, {
+               show: true,
+               revert: false
+             }), uiField(context, presets.field('source'), null, {
+               show: false,
+               revert: false
+             }), uiField(context, presets.field('hashtags'), null, {
+               show: false,
+               revert: false
+             })];
+
+             _fieldsArr.forEach(function (field) {
+               field.on('change', function (t, onInput) {
+                 dispatch.call('change', field, undefined, t, onInput);
+               });
+             });
+           }
+
+           _fieldsArr.forEach(function (field) {
+             field.tags(_tags);
+           });
+
+           selection.call(formFields.fieldsArr(_fieldsArr));
+
+           if (initial) {
+             var commentField = selection.select('.form-field-comment textarea');
+             var commentNode = commentField.node();
+
+             if (commentNode) {
+               commentNode.focus();
+               commentNode.select();
+             } // trigger a 'blur' event so that comment field can be cleaned
+             // and checked for hashtags, even if retrieved from localstorage
+
+
+             utilTriggerEvent(commentField, 'blur');
+             var osm = context.connection();
+
+             if (osm) {
+               osm.userChangesets(function (err, changesets) {
+                 if (err) return;
+                 var comments = changesets.map(function (changeset) {
+                   var comment = changeset.tags.comment;
+                   return comment ? {
+                     title: comment,
+                     value: comment
+                   } : null;
+                 }).filter(Boolean);
+                 commentField.call(commentCombo.data(utilArrayUniqBy(comments, 'title')));
+               });
+             }
+           } // Add warning if comment mentions Google
+
+
+           var hasGoogle = _tags.comment.match(/google/i);
+
+           var commentWarning = selection.select('.form-field-comment').selectAll('.comment-warning').data(hasGoogle ? [0] : []);
+           commentWarning.exit().transition().duration(200).style('opacity', 0).remove();
+           var commentEnter = commentWarning.enter().insert('div', '.tag-reference-body').attr('class', 'field-warning comment-warning').style('opacity', 0);
+           commentEnter.append('a').attr('target', '_blank').call(svgIcon('#iD-icon-alert', 'inline')).attr('href', _t('commit.google_warning_link')).append('span').call(_t.append('commit.google_warning'));
+           commentEnter.transition().duration(200).style('opacity', 1);
+         }
+
+         changesetEditor.tags = function (_) {
+           if (!arguments.length) return _tags;
+           _tags = _; // Don't reset _fieldsArr here.
+
+           return changesetEditor;
+         };
+
+         changesetEditor.changesetID = function (_) {
+           if (!arguments.length) return _changesetID;
+           if (_changesetID === _) return changesetEditor;
+           _changesetID = _;
+           _fieldsArr = null;
+           return changesetEditor;
+         };
+
+         return utilRebind(changesetEditor, dispatch, 'on');
+       }
+
+       var JXON = new function () {
+         var sValueProp = 'keyValue',
+             sAttributesProp = 'keyAttributes',
+             sAttrPref = '@',
+
+         /* you can customize these values */
+         aCache = [],
+             rIsNull = /^\s*$/,
+             rIsBool = /^(?:true|false)$/i;
+
+         function parseText(sValue) {
+           if (rIsNull.test(sValue)) {
+             return null;
+           }
+
+           if (rIsBool.test(sValue)) {
+             return sValue.toLowerCase() === 'true';
+           }
+
+           if (isFinite(sValue)) {
+             return parseFloat(sValue);
+           }
+
+           if (isFinite(Date.parse(sValue))) {
+             return new Date(sValue);
+           }
+
+           return sValue;
+         }
+
+         function EmptyTree() {}
+
+         EmptyTree.prototype.toString = function () {
+           return 'null';
+         };
+
+         EmptyTree.prototype.valueOf = function () {
+           return null;
+         };
+
+         function objectify(vValue) {
+           return vValue === null ? new EmptyTree() : vValue instanceof Object ? vValue : new vValue.constructor(vValue);
+         }
+
+         function createObjTree(oParentNode, nVerb, bFreeze, bNesteAttr) {
+           var nLevelStart = aCache.length,
+               bChildren = oParentNode.hasChildNodes(),
+               bAttributes = oParentNode.hasAttributes(),
+               bHighVerb = Boolean(nVerb & 2);
+           var sProp,
+               vContent,
+               nLength = 0,
+               sCollectedTxt = '',
+               vResult = bHighVerb ? {} :
+           /* put here the default value for empty nodes: */
+           true;
+
+           if (bChildren) {
+             for (var oNode, nItem = 0; nItem < oParentNode.childNodes.length; nItem++) {
+               oNode = oParentNode.childNodes.item(nItem);
+
+               if (oNode.nodeType === 4) {
+                 /* nodeType is 'CDATASection' (4) */
+                 sCollectedTxt += oNode.nodeValue;
+               } else if (oNode.nodeType === 3) {
+                 /* nodeType is 'Text' (3) */
+                 sCollectedTxt += oNode.nodeValue.trim();
+               } else if (oNode.nodeType === 1 && !oNode.prefix) {
+                 /* nodeType is 'Element' (1) */
+                 aCache.push(oNode);
+               }
+             }
+           }
+
+           var nLevelEnd = aCache.length,
+               vBuiltVal = parseText(sCollectedTxt);
+
+           if (!bHighVerb && (bChildren || bAttributes)) {
+             vResult = nVerb === 0 ? objectify(vBuiltVal) : {};
+           }
+
+           for (var nElId = nLevelStart; nElId < nLevelEnd; nElId++) {
+             sProp = aCache[nElId].nodeName.toLowerCase();
+             vContent = createObjTree(aCache[nElId], nVerb, bFreeze, bNesteAttr);
+
+             if (vResult.hasOwnProperty(sProp)) {
+               if (vResult[sProp].constructor !== Array) {
+                 vResult[sProp] = [vResult[sProp]];
+               }
+
+               vResult[sProp].push(vContent);
+             } else {
+               vResult[sProp] = vContent;
+               nLength++;
+             }
+           }
+
+           if (bAttributes) {
+             var nAttrLen = oParentNode.attributes.length,
+                 sAPrefix = bNesteAttr ? '' : sAttrPref,
+                 oAttrParent = bNesteAttr ? {} : vResult;
+
+             for (var oAttrib, nAttrib = 0; nAttrib < nAttrLen; nLength++, nAttrib++) {
+               oAttrib = oParentNode.attributes.item(nAttrib);
+               oAttrParent[sAPrefix + oAttrib.name.toLowerCase()] = parseText(oAttrib.value.trim());
+             }
+
+             if (bNesteAttr) {
+               if (bFreeze) {
+                 Object.freeze(oAttrParent);
+               }
+
+               vResult[sAttributesProp] = oAttrParent;
+               nLength -= nAttrLen - 1;
+             }
+           }
+
+           if (nVerb === 3 || (nVerb === 2 || nVerb === 1 && nLength > 0) && sCollectedTxt) {
+             vResult[sValueProp] = vBuiltVal;
+           } else if (!bHighVerb && nLength === 0 && sCollectedTxt) {
+             vResult = vBuiltVal;
+           }
+
+           if (bFreeze && (bHighVerb || nLength > 0)) {
+             Object.freeze(vResult);
+           }
+
+           aCache.length = nLevelStart;
+           return vResult;
+         }
+
+         function loadObjTree(oXMLDoc, oParentEl, oParentObj) {
+           var vValue, oChild;
+
+           if (oParentObj instanceof String || oParentObj instanceof Number || oParentObj instanceof Boolean) {
+             oParentEl.appendChild(oXMLDoc.createTextNode(oParentObj.toString()));
+             /* verbosity level is 0 */
+           } else if (oParentObj.constructor === Date) {
+             oParentEl.appendChild(oXMLDoc.createTextNode(oParentObj.toGMTString()));
+           }
+
+           for (var sName in oParentObj) {
+             vValue = oParentObj[sName];
+
+             if (isFinite(sName) || vValue instanceof Function) {
+               continue;
+             }
+             /* verbosity level is 0 */
+
+
+             if (sName === sValueProp) {
+               if (vValue !== null && vValue !== true) {
+                 oParentEl.appendChild(oXMLDoc.createTextNode(vValue.constructor === Date ? vValue.toGMTString() : String(vValue)));
+               }
+             } else if (sName === sAttributesProp) {
+               /* verbosity level is 3 */
+               for (var sAttrib in vValue) {
+                 oParentEl.setAttribute(sAttrib, vValue[sAttrib]);
+               }
+             } else if (sName.charAt(0) === sAttrPref) {
+               oParentEl.setAttribute(sName.slice(1), vValue);
+             } else if (vValue.constructor === Array) {
+               for (var nItem = 0; nItem < vValue.length; nItem++) {
+                 oChild = oXMLDoc.createElement(sName);
+                 loadObjTree(oXMLDoc, oChild, vValue[nItem]);
+                 oParentEl.appendChild(oChild);
+               }
+             } else {
+               oChild = oXMLDoc.createElement(sName);
+
+               if (vValue instanceof Object) {
+                 loadObjTree(oXMLDoc, oChild, vValue);
+               } else if (vValue !== null && vValue !== true) {
+                 oChild.appendChild(oXMLDoc.createTextNode(vValue.toString()));
+               }
+
+               oParentEl.appendChild(oChild);
+             }
+           }
+         }
+
+         this.build = function (oXMLParent, nVerbosity
+         /* optional */
+         , bFreeze
+         /* optional */
+         , bNesteAttributes
+         /* optional */
+         ) {
+           var _nVerb = arguments.length > 1 && typeof nVerbosity === 'number' ? nVerbosity & 3 :
+           /* put here the default verbosity level: */
+           1;
+
+           return createObjTree(oXMLParent, _nVerb, bFreeze || false, arguments.length > 3 ? bNesteAttributes : _nVerb === 3);
+         };
+
+         this.unbuild = function (oObjTree) {
+           var oNewDoc = document.implementation.createDocument('', '', null);
+           loadObjTree(oNewDoc, oNewDoc, oObjTree);
+           return oNewDoc;
+         };
+
+         this.stringify = function (oObjTree) {
+           return new XMLSerializer().serializeToString(JXON.unbuild(oObjTree));
+         };
+       }(); // var myObject = JXON.build(doc);
+       // we got our javascript object! try: alert(JSON.stringify(myObject));
+       // var newDoc = JXON.unbuild(myObject);
+       // we got our Document instance! try: alert((new XMLSerializer()).serializeToString(newDoc));
+
+       function uiSectionChanges(context) {
+         var detected = utilDetect();
+         var _discardTags = {};
+         _mainFileFetcher.get('discarded').then(function (d) {
+           _discardTags = d;
+         })["catch"](function () {
+           /* ignore */
+         });
+         var section = uiSection('changes-list', context).label(function () {
+           var history = context.history();
+           var summary = history.difference().summary();
+           return _t.html('inspector.title_count', {
+             title: {
+               html: _t.html('commit.changes')
+             },
+             count: summary.length
+           });
+         }).disclosureContent(renderDisclosureContent);
+
+         function renderDisclosureContent(selection) {
+           var history = context.history();
+           var summary = history.difference().summary();
+           var container = selection.selectAll('.commit-section').data([0]);
+           var containerEnter = container.enter().append('div').attr('class', 'commit-section');
+           containerEnter.append('ul').attr('class', 'changeset-list');
+           container = containerEnter.merge(container);
+           var items = container.select('ul').selectAll('li').data(summary);
+           var itemsEnter = items.enter().append('li').attr('class', 'change-item');
+           var buttons = itemsEnter.append('button').on('mouseover', mouseover).on('mouseout', mouseout).on('click', click);
+           buttons.each(function (d) {
+             select(this).call(svgIcon('#iD-icon-' + d.entity.geometry(d.graph), 'pre-text ' + d.changeType));
+           });
+           buttons.append('span').attr('class', 'change-type').html(function (d) {
+             return _t.html('commit.' + d.changeType) + ' ';
+           });
+           buttons.append('strong').attr('class', 'entity-type').text(function (d) {
+             var matched = _mainPresetIndex.match(d.entity, d.graph);
+             return matched && matched.name() || utilDisplayType(d.entity.id);
+           });
+           buttons.append('span').attr('class', 'entity-name').text(function (d) {
+             var name = utilDisplayName(d.entity) || '',
+                 string = '';
+
+             if (name !== '') {
+               string += ':';
+             }
+
+             return string += ' ' + name;
+           });
+           items = itemsEnter.merge(items); // Download changeset link
+
+           var changeset = new osmChangeset().update({
+             id: undefined
+           });
+           var changes = history.changes(actionDiscardTags(history.difference(), _discardTags));
+           delete changeset.id; // Export without chnageset_id
+
+           var data = JXON.stringify(changeset.osmChangeJXON(changes));
+           var blob = new Blob([data], {
+             type: 'text/xml;charset=utf-8;'
+           });
+           var fileName = 'changes.osc';
+           var linkEnter = container.selectAll('.download-changes').data([0]).enter().append('a').attr('class', 'download-changes');
+
+           if (detected.download) {
+             // All except IE11 and Edge
+             linkEnter // download the data as a file
+             .attr('href', window.URL.createObjectURL(blob)).attr('download', fileName);
+           } else {
+             // IE11 and Edge
+             linkEnter // open data uri in a new tab
+             .attr('target', '_blank').on('click.download', function () {
+               navigator.msSaveBlob(blob, fileName);
+             });
+           }
+
+           linkEnter.call(svgIcon('#iD-icon-load', 'inline')).append('span').call(_t.append('commit.download_changes'));
+
+           function mouseover(d) {
+             if (d.entity) {
+               context.surface().selectAll(utilEntityOrMemberSelector([d.entity.id], context.graph())).classed('hover', true);
+             }
+           }
+
+           function mouseout() {
+             context.surface().selectAll('.hover').classed('hover', false);
+           }
+
+           function click(d3_event, change) {
+             if (change.changeType !== 'deleted') {
+               var entity = change.entity;
+               context.map().zoomToEase(entity);
+               context.surface().selectAll(utilEntityOrMemberSelector([entity.id], context.graph())).classed('hover', true);
+             }
+           }
+         }
+
+         return section;
+       }
+
+       function uiCommitWarnings(context) {
+         function commitWarnings(selection) {
+           var issuesBySeverity = context.validator().getIssuesBySeverity({
+             what: 'edited',
+             where: 'all',
+             includeDisabledRules: true
+           });
+
+           for (var severity in issuesBySeverity) {
+             var issues = issuesBySeverity[severity];
+
+             if (severity !== 'error') {
+               // exclude 'fixme' and similar - #8603
+               issues = issues.filter(function (issue) {
+                 return issue.type !== 'help_request';
+               });
+             }
+
+             var section = severity + '-section';
+             var issueItem = severity + '-item';
+             var container = selection.selectAll('.' + section).data(issues.length ? [0] : []);
+             container.exit().remove();
+             var containerEnter = container.enter().append('div').attr('class', 'modal-section ' + section + ' fillL2');
+             containerEnter.append('h3').html(severity === 'warning' ? _t.html('commit.warnings') : _t.html('commit.errors'));
+             containerEnter.append('ul').attr('class', 'changeset-list');
+             container = containerEnter.merge(container);
+             var items = container.select('ul').selectAll('li').data(issues, function (d) {
+               return d.key;
+             });
+             items.exit().remove();
+             var itemsEnter = items.enter().append('li').attr('class', issueItem);
+             var buttons = itemsEnter.append('button').on('mouseover', function (d3_event, d) {
+               if (d.entityIds) {
+                 context.surface().selectAll(utilEntityOrMemberSelector(d.entityIds, context.graph())).classed('hover', true);
+               }
+             }).on('mouseout', function () {
+               context.surface().selectAll('.hover').classed('hover', false);
+             }).on('click', function (d3_event, d) {
+               context.validator().focusIssue(d);
+             });
+             buttons.call(svgIcon('#iD-icon-alert', 'pre-text'));
+             buttons.append('strong').attr('class', 'issue-message');
+             buttons.filter(function (d) {
+               return d.tooltip;
+             }).call(uiTooltip().title(function (d) {
+               return d.tooltip;
+             }).placement('top'));
+             items = itemsEnter.merge(items);
+             items.selectAll('.issue-message').html(function (d) {
+               return d.message(context);
+             });
+           }
+         }
+
+         return commitWarnings;
+       }
+
+       var readOnlyTags = [/^changesets_count$/, /^created_by$/, /^ideditor:/, /^imagery_used$/, /^host$/, /^locale$/, /^warnings:/, /^resolved:/, /^closed:note$/, /^closed:keepright$/, /^closed:improveosm:/, /^closed:osmose:/]; // treat most punctuation (except -, _, +, &) as hashtag delimiters - #4398
+       // from https://stackoverflow.com/a/25575009
+
+       var hashtagRegex = /(#[^\u2000-\u206F\u2E00-\u2E7F\s\\'!"#$%()*,.\/:;<=>?@\[\]^`{|}~]+)/g;
+       function uiCommit(context) {
+         var dispatch = dispatch$8('cancel');
+
+         var _userDetails;
+
+         var _selection;
+
+         var changesetEditor = uiChangesetEditor(context).on('change', changeTags);
+         var rawTagEditor = uiSectionRawTagEditor('changeset-tag-editor', context).on('change', changeTags).readOnlyTags(readOnlyTags);
+         var commitChanges = uiSectionChanges(context);
+         var commitWarnings = uiCommitWarnings(context);
+
+         function commit(selection) {
+           _selection = selection; // Initialize changeset if one does not exist yet.
+
+           if (!context.changeset) initChangeset();
+           loadDerivedChangesetTags();
+           selection.call(render);
+         }
+
+         function initChangeset() {
+           // expire stored comment, hashtags, source after cutoff datetime - #3947 #4899
+           var commentDate = +corePreferences('commentDate') || 0;
+           var currDate = Date.now();
+           var cutoff = 2 * 86400 * 1000; // 2 days
+
+           if (commentDate > currDate || currDate - commentDate > cutoff) {
+             corePreferences('comment', null);
+             corePreferences('hashtags', null);
+             corePreferences('source', null);
+           } // load in explicitly-set values, if any
+
+
+           if (context.defaultChangesetComment()) {
+             corePreferences('comment', context.defaultChangesetComment());
+             corePreferences('commentDate', Date.now());
+           }
+
+           if (context.defaultChangesetSource()) {
+             corePreferences('source', context.defaultChangesetSource());
+             corePreferences('commentDate', Date.now());
+           }
+
+           if (context.defaultChangesetHashtags()) {
+             corePreferences('hashtags', context.defaultChangesetHashtags());
+             corePreferences('commentDate', Date.now());
+           }
+
+           var detected = utilDetect();
+           var tags = {
+             comment: corePreferences('comment') || '',
+             created_by: context.cleanTagValue('iD ' + context.version),
+             host: context.cleanTagValue(detected.host),
+             locale: context.cleanTagValue(_mainLocalizer.localeCode())
+           }; // call findHashtags initially - this will remove stored
+           // hashtags if any hashtags are found in the comment - #4304
+
+           findHashtags(tags, true);
+           var hashtags = corePreferences('hashtags');
+
+           if (hashtags) {
+             tags.hashtags = hashtags;
+           }
+
+           var source = corePreferences('source');
+
+           if (source) {
+             tags.source = source;
+           }
+
+           var photoOverlaysUsed = context.history().photoOverlaysUsed();
+
+           if (photoOverlaysUsed.length) {
+             var sources = (tags.source || '').split(';'); // include this tag for any photo layer
+
+             if (sources.indexOf('streetlevel imagery') === -1) {
+               sources.push('streetlevel imagery');
+             } // add the photo overlays used during editing as sources
+
+
+             photoOverlaysUsed.forEach(function (photoOverlay) {
+               if (sources.indexOf(photoOverlay) === -1) {
+                 sources.push(photoOverlay);
+               }
+             });
+             tags.source = context.cleanTagValue(sources.join(';'));
+           }
+
+           context.changeset = new osmChangeset({
+             tags: tags
+           });
+         } // Calculates read-only metadata tags based on the user's editing session and applies
+         // them to the changeset.
+
+
+         function loadDerivedChangesetTags() {
+           var osm = context.connection();
+           if (!osm) return;
+           var tags = Object.assign({}, context.changeset.tags); // shallow copy
+           // assign tags for imagery used
+
+           var imageryUsed = context.cleanTagValue(context.history().imageryUsed().join(';'));
+           tags.imagery_used = imageryUsed || 'None'; // assign tags for closed issues and notes
+
+           var osmClosed = osm.getClosedIDs();
+           var itemType;
+
+           if (osmClosed.length) {
+             tags['closed:note'] = context.cleanTagValue(osmClosed.join(';'));
+           }
+
+           if (services.keepRight) {
+             var krClosed = services.keepRight.getClosedIDs();
+
+             if (krClosed.length) {
+               tags['closed:keepright'] = context.cleanTagValue(krClosed.join(';'));
+             }
+           }
+
+           if (services.improveOSM) {
+             var iOsmClosed = services.improveOSM.getClosedCounts();
+
+             for (itemType in iOsmClosed) {
+               tags['closed:improveosm:' + itemType] = context.cleanTagValue(iOsmClosed[itemType].toString());
+             }
+           }
+
+           if (services.osmose) {
+             var osmoseClosed = services.osmose.getClosedCounts();
+
+             for (itemType in osmoseClosed) {
+               tags['closed:osmose:' + itemType] = context.cleanTagValue(osmoseClosed[itemType].toString());
+             }
+           } // remove existing issue counts
+
+
+           for (var key in tags) {
+             if (key.match(/(^warnings:)|(^resolved:)/)) {
+               delete tags[key];
+             }
+           }
+
+           function addIssueCounts(issues, prefix) {
+             var issuesByType = utilArrayGroupBy(issues, 'type');
+
+             for (var issueType in issuesByType) {
+               var issuesOfType = issuesByType[issueType];
+
+               if (issuesOfType[0].subtype) {
+                 var issuesBySubtype = utilArrayGroupBy(issuesOfType, 'subtype');
+
+                 for (var issueSubtype in issuesBySubtype) {
+                   var issuesOfSubtype = issuesBySubtype[issueSubtype];
+                   tags[prefix + ':' + issueType + ':' + issueSubtype] = context.cleanTagValue(issuesOfSubtype.length.toString());
+                 }
+               } else {
+                 tags[prefix + ':' + issueType] = context.cleanTagValue(issuesOfType.length.toString());
+               }
+             }
+           } // add counts of warnings generated by the user's edits
+
+
+           var warnings = context.validator().getIssuesBySeverity({
+             what: 'edited',
+             where: 'all',
+             includeIgnored: true,
+             includeDisabledRules: true
+           }).warning.filter(function (issue) {
+             return issue.type !== 'help_request';
+           }); // exclude 'fixme' and similar - #8603
+
+           addIssueCounts(warnings, 'warnings'); // add counts of issues resolved by the user's edits
+
+           var resolvedIssues = context.validator().getResolvedIssues();
+           addIssueCounts(resolvedIssues, 'resolved');
+           context.changeset = context.changeset.update({
+             tags: tags
+           });
+         }
+
+         function render(selection) {
+           var osm = context.connection();
+           if (!osm) return;
+           var header = selection.selectAll('.header').data([0]);
+           var headerTitle = header.enter().append('div').attr('class', 'header fillL');
+           headerTitle.append('div').append('h2').call(_t.append('commit.title'));
+           headerTitle.append('button').attr('class', 'close').attr('title', _t('icons.close')).on('click', function () {
+             dispatch.call('cancel', this);
+           }).call(svgIcon('#iD-icon-close'));
+           var body = selection.selectAll('.body').data([0]);
+           body = body.enter().append('div').attr('class', 'body').merge(body); // Changeset Section
+
+           var changesetSection = body.selectAll('.changeset-editor').data([0]);
+           changesetSection = changesetSection.enter().append('div').attr('class', 'modal-section changeset-editor').merge(changesetSection);
+           changesetSection.call(changesetEditor.changesetID(context.changeset.id).tags(context.changeset.tags)); // Warnings
+
+           body.call(commitWarnings); // Upload Explanation
+
+           var saveSection = body.selectAll('.save-section').data([0]);
+           saveSection = saveSection.enter().append('div').attr('class', 'modal-section save-section fillL').merge(saveSection);
+           var prose = saveSection.selectAll('.commit-info').data([0]);
+
+           if (prose.enter().size()) {
+             // first time, make sure to update user details in prose
+             _userDetails = null;
+           }
+
+           prose = prose.enter().append('p').attr('class', 'commit-info').call(_t.append('commit.upload_explanation')).merge(prose); // always check if this has changed, but only update prose.html()
+           // if needed, because it can trigger a style recalculation
+
+           osm.userDetails(function (err, user) {
+             if (err) return;
+             if (_userDetails === user) return; // no change
+
+             _userDetails = user;
+             var userLink = select(document.createElement('div'));
+
+             if (user.image_url) {
+               userLink.append('img').attr('src', user.image_url).attr('class', 'icon pre-text user-icon');
+             }
+
+             userLink.append('a').attr('class', 'user-info').text(user.display_name).attr('href', osm.userURL(user.display_name)).attr('target', '_blank');
+             prose.html(_t.html('commit.upload_explanation_with_user', {
+               user: {
+                 html: userLink.html()
+               }
+             }));
+           }); // Request Review
+
+           var requestReview = saveSection.selectAll('.request-review').data([0]); // Enter
+
+           var requestReviewEnter = requestReview.enter().append('div').attr('class', 'request-review');
+           var requestReviewDomId = utilUniqueDomId('commit-input-request-review');
+           var labelEnter = requestReviewEnter.append('label').attr('for', requestReviewDomId);
+
+           if (!labelEnter.empty()) {
+             labelEnter.call(uiTooltip().title(_t.html('commit.request_review_info')).placement('top'));
+           }
+
+           labelEnter.append('input').attr('type', 'checkbox').attr('id', requestReviewDomId);
+           labelEnter.append('span').call(_t.append('commit.request_review')); // Update
+
+           requestReview = requestReview.merge(requestReviewEnter);
+           var requestReviewInput = requestReview.selectAll('input').property('checked', isReviewRequested(context.changeset.tags)).on('change', toggleRequestReview); // Buttons
+
+           var buttonSection = saveSection.selectAll('.buttons').data([0]); // enter
+
+           var buttonEnter = buttonSection.enter().append('div').attr('class', 'buttons fillL');
+           buttonEnter.append('button').attr('class', 'secondary-action button cancel-button').append('span').attr('class', 'label').call(_t.append('commit.cancel'));
+           var uploadButton = buttonEnter.append('button').attr('class', 'action button save-button');
+           uploadButton.append('span').attr('class', 'label').call(_t.append('commit.save'));
+           var uploadBlockerTooltipText = getUploadBlockerMessage(); // update
+
+           buttonSection = buttonSection.merge(buttonEnter);
+           buttonSection.selectAll('.cancel-button').on('click.cancel', function () {
+             dispatch.call('cancel', this);
+           });
+           buttonSection.selectAll('.save-button').classed('disabled', uploadBlockerTooltipText !== null).on('click.save', function () {
+             if (!select(this).classed('disabled')) {
+               this.blur(); // avoid keeping focus on the button - #4641
+
+               for (var key in context.changeset.tags) {
+                 // remove any empty keys before upload
+                 if (!key) delete context.changeset.tags[key];
+               }
+
+               context.uploader().save(context.changeset);
+             }
+           }); // remove any existing tooltip
+
+           uiTooltip().destroyAny(buttonSection.selectAll('.save-button'));
+
+           if (uploadBlockerTooltipText) {
+             buttonSection.selectAll('.save-button').call(uiTooltip().title(uploadBlockerTooltipText).placement('top'));
+           } // Raw Tag Editor
+
+
+           var tagSection = body.selectAll('.tag-section.raw-tag-editor').data([0]);
+           tagSection = tagSection.enter().append('div').attr('class', 'modal-section tag-section raw-tag-editor').merge(tagSection);
+           tagSection.call(rawTagEditor.tags(Object.assign({}, context.changeset.tags)) // shallow copy
+           .render);
+           var changesSection = body.selectAll('.commit-changes-section').data([0]);
+           changesSection = changesSection.enter().append('div').attr('class', 'modal-section commit-changes-section').merge(changesSection); // Change summary
+
+           changesSection.call(commitChanges.render);
+
+           function toggleRequestReview() {
+             var rr = requestReviewInput.property('checked');
+             updateChangeset({
+               review_requested: rr ? 'yes' : undefined
+             });
+             tagSection.call(rawTagEditor.tags(Object.assign({}, context.changeset.tags)) // shallow copy
+             .render);
+           }
+         }
+
+         function getUploadBlockerMessage() {
+           var errors = context.validator().getIssuesBySeverity({
+             what: 'edited',
+             where: 'all'
+           }).error;
+
+           if (errors.length) {
+             return _t('commit.outstanding_errors_message', {
+               count: errors.length
+             });
+           } else {
+             var hasChangesetComment = context.changeset && context.changeset.tags.comment && context.changeset.tags.comment.trim().length;
+
+             if (!hasChangesetComment) {
+               return _t('commit.comment_needed_message');
+             }
+           }
+
+           return null;
+         }
+
+         function changeTags(_, changed, onInput) {
+           if (changed.hasOwnProperty('comment')) {
+             if (changed.comment === undefined) {
+               changed.comment = '';
+             }
+
+             if (!onInput) {
+               corePreferences('comment', changed.comment);
+               corePreferences('commentDate', Date.now());
+             }
+           }
+
+           if (changed.hasOwnProperty('source')) {
+             if (changed.source === undefined) {
+               corePreferences('source', null);
+             } else if (!onInput) {
+               corePreferences('source', changed.source);
+               corePreferences('commentDate', Date.now());
+             }
+           } // no need to update `prefs` for `hashtags` here since it's done in `updateChangeset`
+
+
+           updateChangeset(changed, onInput);
+
+           if (_selection) {
+             _selection.call(render);
+           }
+         }
+
+         function findHashtags(tags, commentOnly) {
+           var detectedHashtags = commentHashtags();
+
+           if (detectedHashtags.length) {
+             // always remove stored hashtags if there are hashtags in the comment - #4304
+             corePreferences('hashtags', null);
+           }
+
+           if (!detectedHashtags.length || !commentOnly) {
+             detectedHashtags = detectedHashtags.concat(hashtagHashtags());
+           }
+
+           var allLowerCase = new Set();
+           return detectedHashtags.filter(function (hashtag) {
+             // Compare tags as lowercase strings, but keep original case tags
+             var lowerCase = hashtag.toLowerCase();
+
+             if (!allLowerCase.has(lowerCase)) {
+               allLowerCase.add(lowerCase);
+               return true;
+             }
+
+             return false;
+           }); // Extract hashtags from `comment`
+
+           function commentHashtags() {
+             var matches = (tags.comment || '').replace(/http\S*/g, '') // drop anything that looks like a URL - #4289
+             .match(hashtagRegex);
+             return matches || [];
+           } // Extract and clean hashtags from `hashtags`
+
+
+           function hashtagHashtags() {
+             var matches = (tags.hashtags || '').split(/[,;\s]+/).map(function (s) {
+               if (s[0] !== '#') {
+                 s = '#' + s;
+               } // prepend '#'
+
+
+               var matched = s.match(hashtagRegex);
+               return matched && matched[0];
+             }).filter(Boolean); // exclude falsy
+
+             return matches || [];
+           }
+         }
+
+         function isReviewRequested(tags) {
+           var rr = tags.review_requested;
+           if (rr === undefined) return false;
+           rr = rr.trim().toLowerCase();
+           return !(rr === '' || rr === 'no');
+         }
+
+         function updateChangeset(changed, onInput) {
+           var tags = Object.assign({}, context.changeset.tags); // shallow copy
+
+           Object.keys(changed).forEach(function (k) {
+             var v = changed[k];
+             k = context.cleanTagKey(k);
+             if (readOnlyTags.indexOf(k) !== -1) return;
+
+             if (v === undefined) {
+               delete tags[k];
+             } else if (onInput) {
+               tags[k] = v;
+             } else {
+               tags[k] = context.cleanTagValue(v);
+             }
+           });
+
+           if (!onInput) {
+             // when changing the comment, override hashtags with any found in comment.
+             var commentOnly = changed.hasOwnProperty('comment') && changed.comment !== '';
+             var arr = findHashtags(tags, commentOnly);
+
+             if (arr.length) {
+               tags.hashtags = context.cleanTagValue(arr.join(';'));
+               corePreferences('hashtags', tags.hashtags);
+             } else {
+               delete tags.hashtags;
+               corePreferences('hashtags', null);
+             }
+           } // always update userdetails, just in case user reauthenticates as someone else
+
+
+           if (_userDetails && _userDetails.changesets_count !== undefined) {
+             var changesetsCount = parseInt(_userDetails.changesets_count, 10) + 1; // #4283
+
+             tags.changesets_count = String(changesetsCount); // first 100 edits - new user
+
+             if (changesetsCount <= 100) {
+               var s;
+               s = corePreferences('walkthrough_completed');
+
+               if (s) {
+                 tags['ideditor:walkthrough_completed'] = s;
+               }
+
+               s = corePreferences('walkthrough_progress');
+
+               if (s) {
+                 tags['ideditor:walkthrough_progress'] = s;
+               }
+
+               s = corePreferences('walkthrough_started');
+
+               if (s) {
+                 tags['ideditor:walkthrough_started'] = s;
+               }
+             }
+           } else {
+             delete tags.changesets_count;
+           }
+
+           if (!fastDeepEqual(context.changeset.tags, tags)) {
+             context.changeset = context.changeset.update({
+               tags: tags
+             });
+           }
+         }
+
+         commit.reset = function () {
+           context.changeset = null;
+         };
+
+         return utilRebind(commit, dispatch, 'on');
+       }
+
+       function uiConfirm(selection) {
+         var modalSelection = uiModal(selection);
+         modalSelection.select('.modal').classed('modal-alert', true);
+         var section = modalSelection.select('.content');
+         section.append('div').attr('class', 'modal-section header');
+         section.append('div').attr('class', 'modal-section message-text');
+         var buttons = section.append('div').attr('class', 'modal-section buttons cf');
+
+         modalSelection.okButton = function () {
+           buttons.append('button').attr('class', 'button ok-button action').on('click.confirm', function () {
+             modalSelection.remove();
+           }).call(_t.append('confirm.okay')).node().focus();
+           return modalSelection;
+         };
+
+         return modalSelection;
+       }
+
+       function uiConflicts(context) {
+         var dispatch = dispatch$8('cancel', 'save');
+         var keybinding = utilKeybinding('conflicts');
+
+         var _origChanges;
+
+         var _conflictList;
+
+         var _shownConflictIndex;
+
+         function keybindingOn() {
+           select(document).call(keybinding.on('⎋', cancel, true));
+         }
+
+         function keybindingOff() {
+           select(document).call(keybinding.unbind);
+         }
+
+         function tryAgain() {
+           keybindingOff();
+           dispatch.call('save');
+         }
+
+         function cancel() {
+           keybindingOff();
+           dispatch.call('cancel');
+         }
+
+         function conflicts(selection) {
+           keybindingOn();
+           var headerEnter = selection.selectAll('.header').data([0]).enter().append('div').attr('class', 'header fillL');
+           headerEnter.append('button').attr('class', 'fr').attr('title', _t('icons.close')).on('click', cancel).call(svgIcon('#iD-icon-close'));
+           headerEnter.append('h2').call(_t.append('save.conflict.header'));
+           var bodyEnter = selection.selectAll('.body').data([0]).enter().append('div').attr('class', 'body fillL');
+           var conflictsHelpEnter = bodyEnter.append('div').attr('class', 'conflicts-help').call(_t.append('save.conflict.help')); // Download changes link
+
+           var detected = utilDetect();
+           var changeset = new osmChangeset();
+           delete changeset.id; // Export without changeset_id
+
+           var data = JXON.stringify(changeset.osmChangeJXON(_origChanges));
+           var blob = new Blob([data], {
+             type: 'text/xml;charset=utf-8;'
+           });
+           var fileName = 'changes.osc';
+           var linkEnter = conflictsHelpEnter.selectAll('.download-changes').append('a').attr('class', 'download-changes');
+
+           if (detected.download) {
+             // All except IE11 and Edge
+             linkEnter // download the data as a file
+             .attr('href', window.URL.createObjectURL(blob)).attr('download', fileName);
+           } else {
+             // IE11 and Edge
+             linkEnter // open data uri in a new tab
+             .attr('target', '_blank').on('click.download', function () {
+               navigator.msSaveBlob(blob, fileName);
+             });
+           }
+
+           linkEnter.call(svgIcon('#iD-icon-load', 'inline')).append('span').call(_t.append('save.conflict.download_changes'));
+           bodyEnter.append('div').attr('class', 'conflict-container fillL3').call(showConflict, 0);
+           bodyEnter.append('div').attr('class', 'conflicts-done').attr('opacity', 0).style('display', 'none').call(_t.append('save.conflict.done'));
+           var buttonsEnter = bodyEnter.append('div').attr('class', 'buttons col12 joined conflicts-buttons');
+           buttonsEnter.append('button').attr('disabled', _conflictList.length > 1).attr('class', 'action conflicts-button col6').call(_t.append('save.title')).on('click.try_again', tryAgain);
+           buttonsEnter.append('button').attr('class', 'secondary-action conflicts-button col6').call(_t.append('confirm.cancel')).on('click.cancel', cancel);
+         }
+
+         function showConflict(selection, index) {
+           index = utilWrap(index, _conflictList.length);
+           _shownConflictIndex = index;
+           var parent = select(selection.node().parentNode); // enable save button if this is the last conflict being reviewed..
+
+           if (index === _conflictList.length - 1) {
+             window.setTimeout(function () {
+               parent.select('.conflicts-button').attr('disabled', null);
+               parent.select('.conflicts-done').transition().attr('opacity', 1).style('display', 'block');
+             }, 250);
+           }
+
+           var conflict = selection.selectAll('.conflict').data([_conflictList[index]]);
+           conflict.exit().remove();
+           var conflictEnter = conflict.enter().append('div').attr('class', 'conflict');
+           conflictEnter.append('h4').attr('class', 'conflict-count').call(_t.append('save.conflict.count', {
+             num: index + 1,
+             total: _conflictList.length
+           }));
+           conflictEnter.append('a').attr('class', 'conflict-description').attr('href', '#').text(function (d) {
+             return d.name;
+           }).on('click', function (d3_event, d) {
+             d3_event.preventDefault();
+             zoomToEntity(d.id);
+           });
+           var details = conflictEnter.append('div').attr('class', 'conflict-detail-container');
+           details.append('ul').attr('class', 'conflict-detail-list').selectAll('li').data(function (d) {
+             return d.details || [];
+           }).enter().append('li').attr('class', 'conflict-detail-item').html(function (d) {
+             return d;
+           });
+           details.append('div').attr('class', 'conflict-choices').call(addChoices);
+           details.append('div').attr('class', 'conflict-nav-buttons joined cf').selectAll('button').data(['previous', 'next']).enter().append('button').html(function (d) {
+             return _t.html('save.conflict.' + d);
+           }).attr('class', 'conflict-nav-button action col6').attr('disabled', function (d, i) {
+             return i === 0 && index === 0 || i === 1 && index === _conflictList.length - 1 || null;
+           }).on('click', function (d3_event, d) {
+             d3_event.preventDefault();
+             var container = parent.selectAll('.conflict-container');
+             var sign = d === 'previous' ? -1 : 1;
+             container.selectAll('.conflict').remove();
+             container.call(showConflict, index + sign);
+           });
+         }
+
+         function addChoices(selection) {
+           var choices = selection.append('ul').attr('class', 'layer-list').selectAll('li').data(function (d) {
+             return d.choices || [];
+           }); // enter
+
+           var choicesEnter = choices.enter().append('li').attr('class', 'layer');
+           var labelEnter = choicesEnter.append('label');
+           labelEnter.append('input').attr('type', 'radio').attr('name', function (d) {
+             return d.id;
+           }).on('change', function (d3_event, d) {
+             var ul = this.parentNode.parentNode.parentNode;
+             ul.__data__.chosen = d.id;
+             choose(d3_event, ul, d);
+           });
+           labelEnter.append('span').text(function (d) {
+             return d.text;
+           }); // update
+
+           choicesEnter.merge(choices).each(function (d) {
+             var ul = this.parentNode;
+
+             if (ul.__data__.chosen === d.id) {
+               choose(null, ul, d);
+             }
+           });
+         }
+
+         function choose(d3_event, ul, datum) {
+           if (d3_event) d3_event.preventDefault();
+           select(ul).selectAll('li').classed('active', function (d) {
+             return d === datum;
+           }).selectAll('input').property('checked', function (d) {
+             return d === datum;
+           });
+           var extent = geoExtent();
+           var entity;
+           entity = context.graph().hasEntity(datum.id);
+           if (entity) extent._extend(entity.extent(context.graph()));
+           datum.action();
+           entity = context.graph().hasEntity(datum.id);
+           if (entity) extent._extend(entity.extent(context.graph()));
+           zoomToEntity(datum.id, extent);
+         }
+
+         function zoomToEntity(id, extent) {
+           context.surface().selectAll('.hover').classed('hover', false);
+           var entity = context.graph().hasEntity(id);
+
+           if (entity) {
+             if (extent) {
+               context.map().trimmedExtent(extent);
+             } else {
+               context.map().zoomToEase(entity);
+             }
+
+             context.surface().selectAll(utilEntityOrMemberSelector([entity.id], context.graph())).classed('hover', true);
+           }
+         } // The conflict list should be an array of objects like:
+         // {
+         //     id: id,
+         //     name: entityName(local),
+         //     details: merge.conflicts(),
+         //     chosen: 1,
+         //     choices: [
+         //         choice(id, keepMine, forceLocal),
+         //         choice(id, keepTheirs, forceRemote)
+         //     ]
+         // }
+
+
+         conflicts.conflictList = function (_) {
+           if (!arguments.length) return _conflictList;
+           _conflictList = _;
+           return conflicts;
+         };
+
+         conflicts.origChanges = function (_) {
+           if (!arguments.length) return _origChanges;
+           _origChanges = _;
+           return conflicts;
+         };
+
+         conflicts.shownEntityIds = function () {
+           if (_conflictList && typeof _shownConflictIndex === 'number') {
+             return [_conflictList[_shownConflictIndex].id];
+           }
+
+           return [];
+         };
+
+         return utilRebind(conflicts, dispatch, 'on');
+       }
+
+       function uiSectionEntityIssues(context) {
+         // Does the user prefer to expand the active issue?  Useful for viewing tag diff.
+         // Expand by default so first timers see it - #6408, #8143
+         var preference = corePreferences('entity-issues.reference.expanded');
+
+         var _expanded = preference === null ? true : preference === 'true';
+
+         var _entityIDs = [];
+         var _issues = [];
+
+         var _activeIssueID;
+
+         var section = uiSection('entity-issues', context).shouldDisplay(function () {
+           return _issues.length > 0;
+         }).label(function () {
+           return _t.html('inspector.title_count', {
+             title: {
+               html: _t.html('issues.list_title')
+             },
+             count: _issues.length
+           });
+         }).disclosureContent(renderDisclosureContent);
+         context.validator().on('validated.entity_issues', function () {
+           // Refresh on validated events
+           reloadIssues();
+           section.reRender();
+         }).on('focusedIssue.entity_issues', function (issue) {
+           makeActiveIssue(issue.id);
+         });
+
+         function reloadIssues() {
+           _issues = context.validator().getSharedEntityIssues(_entityIDs, {
+             includeDisabledRules: true
+           });
+         }
+
+         function makeActiveIssue(issueID) {
+           _activeIssueID = issueID;
+           section.selection().selectAll('.issue-container').classed('active', function (d) {
+             return d.id === _activeIssueID;
+           });
+         }
+
+         function renderDisclosureContent(selection) {
+           selection.classed('grouped-items-area', true);
+           _activeIssueID = _issues.length > 0 ? _issues[0].id : null;
+           var containers = selection.selectAll('.issue-container').data(_issues, function (d) {
+             return d.key;
+           }); // Exit
+
+           containers.exit().remove(); // Enter
+
+           var containersEnter = containers.enter().append('div').attr('class', 'issue-container');
+           var itemsEnter = containersEnter.append('div').attr('class', function (d) {
+             return 'issue severity-' + d.severity;
+           }).on('mouseover.highlight', function (d3_event, d) {
+             // don't hover-highlight the selected entity
+             var ids = d.entityIds.filter(function (e) {
+               return _entityIDs.indexOf(e) === -1;
+             });
+             utilHighlightEntities(ids, true, context);
+           }).on('mouseout.highlight', function (d3_event, d) {
+             var ids = d.entityIds.filter(function (e) {
+               return _entityIDs.indexOf(e) === -1;
+             });
+             utilHighlightEntities(ids, false, context);
+           });
+           var labelsEnter = itemsEnter.append('div').attr('class', 'issue-label');
+           var textEnter = labelsEnter.append('button').attr('class', 'issue-text').on('click', function (d3_event, d) {
+             makeActiveIssue(d.id); // expand only the clicked item
+
+             var extent = d.extent(context.graph());
+
+             if (extent) {
+               var setZoom = Math.max(context.map().zoom(), 19);
+               context.map().unobscuredCenterZoomEase(extent.center(), setZoom);
+             }
+           });
+           textEnter.each(function (d) {
+             var iconName = '#iD-icon-' + (d.severity === 'warning' ? 'alert' : 'error');
+             select(this).call(svgIcon(iconName, 'issue-icon'));
+           });
+           textEnter.append('span').attr('class', 'issue-message');
+           var infoButton = labelsEnter.append('button').attr('class', 'issue-info-button').attr('title', _t('icons.information')).call(svgIcon('#iD-icon-inspect'));
+           infoButton.on('click', function (d3_event) {
+             d3_event.stopPropagation();
+             d3_event.preventDefault();
+             this.blur(); // avoid keeping focus on the button - #4641
+
+             var container = select(this.parentNode.parentNode.parentNode);
+             var info = container.selectAll('.issue-info');
+             var isExpanded = info.classed('expanded');
+             _expanded = !isExpanded;
+             corePreferences('entity-issues.reference.expanded', _expanded); // update preference
+
+             if (isExpanded) {
+               info.transition().duration(200).style('max-height', '0px').style('opacity', '0').on('end', function () {
+                 info.classed('expanded', false);
+               });
+             } else {
+               info.classed('expanded', true).transition().duration(200).style('max-height', '200px').style('opacity', '1').on('end', function () {
+                 info.style('max-height', null);
+               });
+             }
+           });
+           itemsEnter.append('ul').attr('class', 'issue-fix-list');
+           containersEnter.append('div').attr('class', 'issue-info' + (_expanded ? ' expanded' : '')).style('max-height', _expanded ? null : '0').style('opacity', _expanded ? '1' : '0').each(function (d) {
+             if (typeof d.reference === 'function') {
+               select(this).call(d.reference);
+             } else {
+               select(this).call(_t.append('inspector.no_documentation_key'));
+             }
+           }); // Update
+
+           containers = containers.merge(containersEnter).classed('active', function (d) {
+             return d.id === _activeIssueID;
+           });
+           containers.selectAll('.issue-message').html(function (d) {
+             return d.message(context);
+           }); // fixes
+
+           var fixLists = containers.selectAll('.issue-fix-list');
+           var fixes = fixLists.selectAll('.issue-fix-item').data(function (d) {
+             return d.fixes ? d.fixes(context) : [];
+           }, function (fix) {
+             return fix.id;
+           });
+           fixes.exit().remove();
+           var fixesEnter = fixes.enter().append('li').attr('class', 'issue-fix-item');
+           var buttons = fixesEnter.append('button').on('click', function (d3_event, d) {
+             // not all fixes are actionable
+             if (select(this).attr('disabled') || !d.onClick) return; // Don't run another fix for this issue within a second of running one
+             // (Necessary for "Select a feature type" fix. Most fixes should only ever run once)
+
+             if (d.issue.dateLastRanFix && new Date() - d.issue.dateLastRanFix < 1000) return;
+             d.issue.dateLastRanFix = new Date(); // remove hover-highlighting
+
+             utilHighlightEntities(d.issue.entityIds.concat(d.entityIds), false, context);
+             new Promise(function (resolve, reject) {
+               d.onClick(context, resolve, reject);
+
+               if (d.onClick.length <= 1) {
+                 // if the fix doesn't take any completion parameters then consider it resolved
+                 resolve();
+               }
+             }).then(function () {
+               // revalidate whenever the fix has finished running successfully
+               context.validator().validate();
+             });
+           }).on('mouseover.highlight', function (d3_event, d) {
+             utilHighlightEntities(d.entityIds, true, context);
+           }).on('mouseout.highlight', function (d3_event, d) {
+             utilHighlightEntities(d.entityIds, false, context);
+           });
+           buttons.each(function (d) {
+             var iconName = d.icon || 'iD-icon-wrench';
+
+             if (iconName.startsWith('maki')) {
+               iconName += '-15';
+             }
+
+             select(this).call(svgIcon('#' + iconName, 'fix-icon'));
+           });
+           buttons.append('span').attr('class', 'fix-message').html(function (d) {
+             return d.title;
+           });
+           fixesEnter.merge(fixes).selectAll('button').classed('actionable', function (d) {
+             return d.onClick;
+           }).attr('disabled', function (d) {
+             return d.onClick ? null : 'true';
+           }).attr('title', function (d) {
+             if (d.disabledReason) {
+               return d.disabledReason;
+             }
+
+             return null;
+           });
+         }
+
+         section.entityIDs = function (val) {
+           if (!arguments.length) return _entityIDs;
+
+           if (!_entityIDs || !val || !utilArrayIdentical(_entityIDs, val)) {
+             _entityIDs = val;
+             _activeIssueID = null;
+             reloadIssues();
+           }
+
+           return section;
+         };
+
+         return section;
+       }
+
+       function uiPresetIcon() {
+         var _preset;
+
+         var _geometry;
+
+         var _sizeClass = 'medium';
+
+         function isSmall() {
+           return _sizeClass === 'small';
+         }
+
+         function presetIcon(selection) {
+           selection.each(render);
+         }
+
+         function getIcon(p, geom) {
+           if (isSmall() && p.isFallback && p.isFallback()) return 'iD-icon-' + p.id;
+           if (p.icon) return p.icon;
+           if (geom === 'line') return 'iD-other-line';
+           if (geom === 'vertex') return p.isFallback() ? '' : 'temaki-vertex';
+           if (isSmall() && geom === 'point') return '';
+           return 'maki-marker-stroked';
+         }
+
+         function renderPointBorder(container, drawPoint) {
+           var pointBorder = container.selectAll('.preset-icon-point-border').data(drawPoint ? [0] : []);
+           pointBorder.exit().remove();
+           var pointBorderEnter = pointBorder.enter();
+           var w = 40;
+           var h = 40;
+           pointBorderEnter.append('svg').attr('class', 'preset-icon-fill preset-icon-point-border').attr('width', w).attr('height', h).attr('viewBox', "0 0 ".concat(w, " ").concat(h)).append('path').attr('transform', 'translate(11.5, 8)').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');
+           pointBorder = pointBorderEnter.merge(pointBorder);
+         }
+
+         function renderCategoryBorder(container, category) {
+           var categoryBorder = container.selectAll('.preset-icon-category-border').data(category ? [0] : []);
+           categoryBorder.exit().remove();
+           var categoryBorderEnter = categoryBorder.enter();
+           var d = 60;
+           var svgEnter = categoryBorderEnter.append('svg').attr('class', 'preset-icon-fill preset-icon-category-border').attr('width', d).attr('height', d).attr('viewBox', "0 0 ".concat(d, " ").concat(d));
+           svgEnter.append('path').attr('class', 'area').attr('d', 'M9.5,7.5 L25.5,7.5 L28.5,12.5 L49.5,12.5 C51.709139,12.5 53.5,14.290861 53.5,16.5 L53.5,43.5 C53.5,45.709139 51.709139,47.5 49.5,47.5 L10.5,47.5 C8.290861,47.5 6.5,45.709139 6.5,43.5 L6.5,12.5 L9.5,7.5 Z');
+           categoryBorder = categoryBorderEnter.merge(categoryBorder);
+
+           if (category) {
+             categoryBorder.selectAll('path').attr('class', "area ".concat(category.id));
+           }
+         }
+
+         function renderCircleFill(container, drawVertex) {
+           var vertexFill = container.selectAll('.preset-icon-fill-vertex').data(drawVertex ? [0] : []);
+           vertexFill.exit().remove();
+           var vertexFillEnter = vertexFill.enter();
+           var w = 60;
+           var h = 60;
+           var d = 40;
+           vertexFillEnter.append('svg').attr('class', 'preset-icon-fill preset-icon-fill-vertex').attr('width', w).attr('height', h).attr('viewBox', "0 0 ".concat(w, " ").concat(h)).append('circle').attr('cx', w / 2).attr('cy', h / 2).attr('r', d / 2);
+           vertexFill = vertexFillEnter.merge(vertexFill);
+         }
+
+         function renderSquareFill(container, drawArea, tagClasses) {
+           var fill = container.selectAll('.preset-icon-fill-area').data(drawArea ? [0] : []);
+           fill.exit().remove();
+           var fillEnter = fill.enter();
+           var d = isSmall() ? 40 : 60;
+           var w = d;
+           var h = d;
+           var l = d * 2 / 3;
+           var c1 = (w - l) / 2;
+           var c2 = c1 + l;
+           fillEnter = fillEnter.append('svg').attr('class', 'preset-icon-fill preset-icon-fill-area').attr('width', w).attr('height', h).attr('viewBox', "0 0 ".concat(w, " ").concat(h));
+           ['fill', 'stroke'].forEach(function (klass) {
+             fillEnter.append('path').attr('d', "M".concat(c1, " ").concat(c1, " L").concat(c1, " ").concat(c2, " L").concat(c2, " ").concat(c2, " L").concat(c2, " ").concat(c1, " Z")).attr('class', "area ".concat(klass));
+           });
+           var rVertex = 2.5;
+           [[c1, c1], [c1, c2], [c2, c2], [c2, c1]].forEach(function (point) {
+             fillEnter.append('circle').attr('class', 'vertex').attr('cx', point[0]).attr('cy', point[1]).attr('r', rVertex);
+           });
+
+           if (!isSmall()) {
+             var rMidpoint = 1.25;
+             [[c1, w / 2], [c2, w / 2], [h / 2, c1], [h / 2, c2]].forEach(function (point) {
+               fillEnter.append('circle').attr('class', 'midpoint').attr('cx', point[0]).attr('cy', point[1]).attr('r', rMidpoint);
+             });
+           }
+
+           fill = fillEnter.merge(fill);
+           fill.selectAll('path.stroke').attr('class', "area stroke ".concat(tagClasses));
+           fill.selectAll('path.fill').attr('class', "area fill ".concat(tagClasses));
+         }
+
+         function renderLine(container, drawLine, tagClasses) {
+           var line = container.selectAll('.preset-icon-line').data(drawLine ? [0] : []);
+           line.exit().remove();
+           var lineEnter = line.enter();
+           var d = isSmall() ? 40 : 60; // draw the line parametrically
+
+           var w = d;
+           var h = d;
+           var y = Math.round(d * 0.72);
+           var l = Math.round(d * 0.6);
+           var r = 2.5;
+           var x1 = (w - l) / 2;
+           var x2 = x1 + l;
+           lineEnter = lineEnter.append('svg').attr('class', 'preset-icon-line').attr('width', w).attr('height', h).attr('viewBox', "0 0 ".concat(w, " ").concat(h));
+           ['casing', 'stroke'].forEach(function (klass) {
+             lineEnter.append('path').attr('d', "M".concat(x1, " ").concat(y, " L").concat(x2, " ").concat(y)).attr('class', "line ".concat(klass));
+           });
+           [[x1 - 1, y], [x2 + 1, y]].forEach(function (point) {
+             lineEnter.append('circle').attr('class', 'vertex').attr('cx', point[0]).attr('cy', point[1]).attr('r', r);
+           });
+           line = lineEnter.merge(line);
+           line.selectAll('path.stroke').attr('class', "line stroke ".concat(tagClasses));
+           line.selectAll('path.casing').attr('class', "line casing ".concat(tagClasses));
+         }
+
+         function renderRoute(container, drawRoute, p) {
+           var route = container.selectAll('.preset-icon-route').data(drawRoute ? [0] : []);
+           route.exit().remove();
+           var routeEnter = route.enter();
+           var d = isSmall() ? 40 : 60; // draw the route parametrically
+
+           var w = d;
+           var h = d;
+           var y1 = Math.round(d * 0.80);
+           var y2 = Math.round(d * 0.68);
+           var l = Math.round(d * 0.6);
+           var r = 2;
+           var x1 = (w - l) / 2;
+           var x2 = x1 + l / 3;
+           var x3 = x2 + l / 3;
+           var x4 = x3 + l / 3;
+           routeEnter = routeEnter.append('svg').attr('class', 'preset-icon-route').attr('width', w).attr('height', h).attr('viewBox', "0 0 ".concat(w, " ").concat(h));
+           ['casing', 'stroke'].forEach(function (klass) {
+             routeEnter.append('path').attr('d', "M".concat(x1, " ").concat(y1, " L").concat(x2, " ").concat(y2)).attr('class', "segment0 line ".concat(klass));
+             routeEnter.append('path').attr('d', "M".concat(x2, " ").concat(y2, " L").concat(x3, " ").concat(y1)).attr('class', "segment1 line ".concat(klass));
+             routeEnter.append('path').attr('d', "M".concat(x3, " ").concat(y1, " L").concat(x4, " ").concat(y2)).attr('class', "segment2 line ".concat(klass));
+           });
+           [[x1, y1], [x2, y2], [x3, y1], [x4, y2]].forEach(function (point) {
+             routeEnter.append('circle').attr('class', 'vertex').attr('cx', point[0]).attr('cy', point[1]).attr('r', r);
+           });
+           route = routeEnter.merge(route);
+
+           if (drawRoute) {
+             var routeType = p.tags.type === 'waterway' ? 'waterway' : p.tags.route;
+             var segmentPresetIDs = routeSegments[routeType];
+
+             for (var i in segmentPresetIDs) {
+               var segmentPreset = _mainPresetIndex.item(segmentPresetIDs[i]);
+               var segmentTagClasses = svgTagClasses().getClassesString(segmentPreset.tags, '');
+               route.selectAll("path.stroke.segment".concat(i)).attr('class', "segment".concat(i, " line stroke ").concat(segmentTagClasses));
+               route.selectAll("path.casing.segment".concat(i)).attr('class', "segment".concat(i, " line casing ").concat(segmentTagClasses));
+             }
+           }
+         }
+
+         function renderSvgIcon(container, picon, geom, isFramed, category, tagClasses) {
+           var isMaki = picon && /^maki-/.test(picon);
+           var isTemaki = picon && /^temaki-/.test(picon);
+           var isFa = picon && /^fa[srb]-/.test(picon);
+           var isiDIcon = picon && !(isMaki || isTemaki || isFa);
+           var icon = container.selectAll('.preset-icon').data(picon ? [0] : []);
+           icon.exit().remove();
+           icon = icon.enter().append('div').attr('class', 'preset-icon').call(svgIcon('')).merge(icon);
+           icon.attr('class', 'preset-icon ' + (geom ? geom + '-geom' : '')).classed('category', category).classed('framed', isFramed).classed('preset-icon-iD', isiDIcon);
+           icon.selectAll('svg').attr('class', 'icon ' + picon + ' ' + (!isiDIcon && geom !== 'line' ? '' : tagClasses));
+           var suffix = '';
+
+           if (isMaki) {
+             suffix = isSmall() && geom === 'point' ? '-11' : '-15';
+           }
+
+           icon.selectAll('use').attr('href', '#' + picon + suffix);
+         }
+
+         function renderImageIcon(container, imageURL) {
+           var imageIcon = container.selectAll('img.image-icon').data(imageURL ? [0] : []);
+           imageIcon.exit().remove();
+           imageIcon = imageIcon.enter().append('img').attr('class', 'image-icon').on('load', function () {
+             return container.classed('showing-img', true);
+           }).on('error', function () {
+             return container.classed('showing-img', false);
+           }).merge(imageIcon);
+           imageIcon.attr('src', imageURL);
+         } // Route icons are drawn with a zigzag annotation underneath:
+         //     o   o
+         //    / \ /
+         //   o   o
+         // This dataset defines the styles that are used to draw the zigzag segments.
+
+
+         var routeSegments = {
+           bicycle: ['highway/cycleway', 'highway/cycleway', 'highway/cycleway'],
+           bus: ['highway/unclassified', 'highway/secondary', 'highway/primary'],
+           trolleybus: ['highway/unclassified', 'highway/secondary', 'highway/primary'],
+           detour: ['highway/tertiary', 'highway/residential', 'highway/unclassified'],
+           ferry: ['route/ferry', 'route/ferry', 'route/ferry'],
+           foot: ['highway/footway', 'highway/footway', 'highway/footway'],
+           hiking: ['highway/path', 'highway/path', 'highway/path'],
+           horse: ['highway/bridleway', 'highway/bridleway', 'highway/bridleway'],
+           light_rail: ['railway/light_rail', 'railway/light_rail', 'railway/light_rail'],
+           monorail: ['railway/monorail', 'railway/monorail', 'railway/monorail'],
+           mtb: ['highway/path', 'highway/track', 'highway/bridleway'],
+           pipeline: ['man_made/pipeline', 'man_made/pipeline', 'man_made/pipeline'],
+           piste: ['piste/downhill', 'piste/hike', 'piste/nordic'],
+           power: ['power/line', 'power/line', 'power/line'],
+           road: ['highway/secondary', 'highway/primary', 'highway/trunk'],
+           subway: ['railway/subway', 'railway/subway', 'railway/subway'],
+           train: ['railway/rail', 'railway/rail', 'railway/rail'],
+           tram: ['railway/tram', 'railway/tram', 'railway/tram'],
+           waterway: ['waterway/stream', 'waterway/stream', 'waterway/stream']
+         };
+
+         function render() {
+           var p = _preset.apply(this, arguments);
+
+           var geom = _geometry ? _geometry.apply(this, arguments) : null;
+
+           if (geom === 'relation' && p.tags && (p.tags.type === 'route' && p.tags.route && routeSegments[p.tags.route] || p.tags.type === 'waterway')) {
+             geom = 'route';
+           }
+
+           var showThirdPartyIcons = corePreferences('preferences.privacy.thirdpartyicons') || 'true';
+           var isFallback = isSmall() && p.isFallback && p.isFallback();
+           var imageURL = showThirdPartyIcons === 'true' && p.imageURL;
+           var picon = getIcon(p, geom);
+           var isCategory = !p.setTags;
+           var drawPoint = picon && geom === 'point' && isSmall() && !isFallback;
+           var drawVertex = picon !== null && geom === 'vertex' && (!isSmall() || !isFallback);
+           var drawLine = picon && geom === 'line' && !isFallback && !isCategory;
+           var drawArea = picon && geom === 'area' && !isFallback && !isCategory;
+           var drawRoute = picon && geom === 'route';
+           var isFramed = drawVertex || drawArea || drawLine || drawRoute || isCategory;
+           var tags = !isCategory ? p.setTags({}, geom) : {};
+
+           for (var k in tags) {
+             if (tags[k] === '*') {
+               tags[k] = 'yes';
+             }
+           }
+
+           var tagClasses = svgTagClasses().getClassesString(tags, '');
+           var selection = select(this);
+           var container = selection.selectAll('.preset-icon-container').data([0]);
+           container = container.enter().append('div').attr('class', "preset-icon-container ".concat(_sizeClass)).merge(container);
+           container.classed('showing-img', !!imageURL).classed('fallback', isFallback);
+           renderCategoryBorder(container, isCategory && p);
+           renderPointBorder(container, drawPoint);
+           renderCircleFill(container, drawVertex);
+           renderSquareFill(container, drawArea, tagClasses);
+           renderLine(container, drawLine, tagClasses);
+           renderRoute(container, drawRoute, p);
+           renderSvgIcon(container, picon, geom, isFramed, isCategory, tagClasses);
+           renderImageIcon(container, imageURL);
+         }
+
+         presetIcon.preset = function (val) {
+           if (!arguments.length) return _preset;
+           _preset = utilFunctor(val);
+           return presetIcon;
+         };
+
+         presetIcon.geometry = function (val) {
+           if (!arguments.length) return _geometry;
+           _geometry = utilFunctor(val);
+           return presetIcon;
+         };
+
+         presetIcon.sizeClass = function (val) {
+           if (!arguments.length) return _sizeClass;
+           _sizeClass = val;
+           return presetIcon;
+         };
+
+         return presetIcon;
+       }
+
+       function uiSectionFeatureType(context) {
+         var dispatch = dispatch$8('choose');
+         var _entityIDs = [];
+         var _presets = [];
+
+         var _tagReference;
+
+         var section = uiSection('feature-type', context).label(_t.html('inspector.feature_type')).disclosureContent(renderDisclosureContent);
+
+         function renderDisclosureContent(selection) {
+           selection.classed('preset-list-item', true);
+           selection.classed('mixed-types', _presets.length > 1);
+           var presetButtonWrap = selection.selectAll('.preset-list-button-wrap').data([0]).enter().append('div').attr('class', 'preset-list-button-wrap');
+           var presetButton = presetButtonWrap.append('button').attr('class', 'preset-list-button preset-reset').call(uiTooltip().title(_t.html('inspector.back_tooltip')).placement('bottom'));
+           presetButton.append('div').attr('class', 'preset-icon-container');
+           presetButton.append('div').attr('class', 'label').append('div').attr('class', 'label-inner');
+           presetButtonWrap.append('div').attr('class', 'accessory-buttons');
+           var tagReferenceBodyWrap = selection.selectAll('.tag-reference-body-wrap').data([0]);
+           tagReferenceBodyWrap = tagReferenceBodyWrap.enter().append('div').attr('class', 'tag-reference-body-wrap').merge(tagReferenceBodyWrap); // update header
+
+           if (_tagReference) {
+             selection.selectAll('.preset-list-button-wrap .accessory-buttons').style('display', _presets.length === 1 ? null : 'none').call(_tagReference.button);
+             tagReferenceBodyWrap.style('display', _presets.length === 1 ? null : 'none').call(_tagReference.body);
+           }
+
+           selection.selectAll('.preset-reset').on('click', function () {
+             dispatch.call('choose', this, _presets);
+           }).on('pointerdown pointerup mousedown mouseup', function (d3_event) {
+             d3_event.preventDefault();
+             d3_event.stopPropagation();
+           });
+           var geometries = entityGeometries();
+           selection.select('.preset-list-item button').call(uiPresetIcon().geometry(_presets.length === 1 ? geometries.length === 1 && geometries[0] : null).preset(_presets.length === 1 ? _presets[0] : _mainPresetIndex.item('point')));
+           var names = _presets.length === 1 ? [_presets[0].nameLabel(), _presets[0].subtitleLabel()].filter(Boolean) : [_t('inspector.multiple_types')];
+           var label = selection.select('.label-inner');
+           var nameparts = label.selectAll('.namepart').data(names, function (d) {
+             return d;
+           });
+           nameparts.exit().remove();
+           nameparts.enter().append('div').attr('class', 'namepart').html(function (d) {
+             return d;
+           });
+         }
+
+         section.entityIDs = function (val) {
+           if (!arguments.length) return _entityIDs;
+           _entityIDs = val;
+           return section;
+         };
+
+         section.presets = function (val) {
+           if (!arguments.length) return _presets; // don't reload the same preset
+
+           if (!utilArrayIdentical(val, _presets)) {
+             _presets = val;
+
+             if (_presets.length === 1) {
+               _tagReference = uiTagReference(_presets[0].reference()).showing(false);
+             }
+           }
+
+           return section;
+         };
+
+         function entityGeometries() {
+           var counts = {};
+
+           for (var i in _entityIDs) {
+             var geometry = context.graph().geometry(_entityIDs[i]);
+             if (!counts[geometry]) counts[geometry] = 0;
+             counts[geometry] += 1;
+           }
+
+           return Object.keys(counts).sort(function (geom1, geom2) {
+             return counts[geom2] - counts[geom1];
+           });
+         }
+
+         return utilRebind(section, dispatch, 'on');
+       }
+
+       function uiSectionPresetFields(context) {
+         var section = uiSection('preset-fields', context).label(_t.html('inspector.fields')).disclosureContent(renderDisclosureContent);
+         var dispatch = dispatch$8('change', 'revert');
+         var formFields = uiFormFields(context);
+
+         var _state;
+
+         var _fieldsArr;
+
+         var _presets = [];
+
+         var _tags;
+
+         var _entityIDs;
+
+         function renderDisclosureContent(selection) {
+           if (!_fieldsArr) {
+             var graph = context.graph();
+             var geometries = Object.keys(_entityIDs.reduce(function (geoms, entityID) {
+               geoms[graph.entity(entityID).geometry(graph)] = true;
+               return geoms;
+             }, {}));
+             var presetsManager = _mainPresetIndex;
+             var allFields = [];
+             var allMoreFields = [];
+             var sharedTotalFields;
+
+             _presets.forEach(function (preset) {
+               var fields = preset.fields();
+               var moreFields = preset.moreFields();
+               allFields = utilArrayUnion(allFields, fields);
+               allMoreFields = utilArrayUnion(allMoreFields, moreFields);
+
+               if (!sharedTotalFields) {
+                 sharedTotalFields = utilArrayUnion(fields, moreFields);
+               } else {
+                 sharedTotalFields = sharedTotalFields.filter(function (field) {
+                   return fields.indexOf(field) !== -1 || moreFields.indexOf(field) !== -1;
+                 });
+               }
+             });
+
+             var sharedFields = allFields.filter(function (field) {
+               return sharedTotalFields.indexOf(field) !== -1;
+             });
+             var sharedMoreFields = allMoreFields.filter(function (field) {
+               return sharedTotalFields.indexOf(field) !== -1;
+             });
+             _fieldsArr = [];
+             sharedFields.forEach(function (field) {
+               if (field.matchAllGeometry(geometries)) {
+                 _fieldsArr.push(uiField(context, field, _entityIDs));
+               }
+             });
+             var singularEntity = _entityIDs.length === 1 && graph.hasEntity(_entityIDs[0]);
+
+             if (singularEntity && singularEntity.isHighwayIntersection(graph) && presetsManager.field('restrictions')) {
+               _fieldsArr.push(uiField(context, presetsManager.field('restrictions'), _entityIDs));
+             }
+
+             var additionalFields = utilArrayUnion(sharedMoreFields, presetsManager.universal());
+             additionalFields.sort(function (field1, field2) {
+               return field1.label().localeCompare(field2.label(), _mainLocalizer.localeCode());
+             });
+             additionalFields.forEach(function (field) {
+               if (sharedFields.indexOf(field) === -1 && field.matchAllGeometry(geometries)) {
+                 _fieldsArr.push(uiField(context, field, _entityIDs, {
+                   show: false
+                 }));
+               }
+             });
+
+             _fieldsArr.forEach(function (field) {
+               field.on('change', function (t, onInput) {
+                 dispatch.call('change', field, _entityIDs, t, onInput);
+               }).on('revert', function (keys) {
+                 dispatch.call('revert', field, keys);
+               });
+             });
+           }
+
+           _fieldsArr.forEach(function (field) {
+             field.state(_state).tags(_tags);
+           });
+
+           selection.call(formFields.fieldsArr(_fieldsArr).state(_state).klass('grouped-items-area'));
+           selection.selectAll('.wrap-form-field input').on('keydown', function (d3_event) {
+             // if user presses enter, and combobox is not active, accept edits..
+             if (d3_event.keyCode === 13 && // ↩ Return
+             context.container().select('.combobox').empty()) {
+               context.enter(modeBrowse(context));
+             }
+           });
+         }
+
+         section.presets = function (val) {
+           if (!arguments.length) return _presets;
+
+           if (!_presets || !val || !utilArrayIdentical(_presets, val)) {
+             _presets = val;
+             _fieldsArr = null;
+           }
+
+           return section;
+         };
+
+         section.state = function (val) {
+           if (!arguments.length) return _state;
+           _state = val;
+           return section;
+         };
+
+         section.tags = function (val) {
+           if (!arguments.length) return _tags;
+           _tags = val; // Don't reset _fieldsArr here.
+
+           return section;
+         };
+
+         section.entityIDs = function (val) {
+           if (!arguments.length) return _entityIDs;
+
+           if (!val || !_entityIDs || !utilArrayIdentical(_entityIDs, val)) {
+             _entityIDs = val;
+             _fieldsArr = null;
+           }
+
+           return section;
+         };
+
+         return utilRebind(section, dispatch, 'on');
+       }
+
+       function uiSectionRawMemberEditor(context) {
+         var section = uiSection('raw-member-editor', context).shouldDisplay(function () {
+           if (!_entityIDs || _entityIDs.length !== 1) return false;
+           var entity = context.hasEntity(_entityIDs[0]);
+           return entity && entity.type === 'relation';
+         }).label(function () {
+           var entity = context.hasEntity(_entityIDs[0]);
+           if (!entity) return '';
+           var gt = entity.members.length > _maxMembers ? '>' : '';
+           var count = gt + entity.members.slice(0, _maxMembers).length;
+           return _t.html('inspector.title_count', {
+             title: {
+               html: _t.html('inspector.members')
+             },
+             count: count
+           });
+         }).disclosureContent(renderDisclosureContent);
+         var taginfo = services.taginfo;
+
+         var _entityIDs;
+
+         var _maxMembers = 1000;
+
+         function downloadMember(d3_event, d) {
+           d3_event.preventDefault(); // display the loading indicator
+
+           select(this.parentNode).classed('tag-reference-loading', true);
+           context.loadEntity(d.id, function () {
+             section.reRender();
+           });
+         }
+
+         function zoomToMember(d3_event, d) {
+           d3_event.preventDefault();
+           var entity = context.entity(d.id);
+           context.map().zoomToEase(entity); // highlight the feature in case it wasn't previously on-screen
+
+           utilHighlightEntities([d.id], true, context);
+         }
+
+         function selectMember(d3_event, d) {
+           d3_event.preventDefault(); // remove the hover-highlight styling
+
+           utilHighlightEntities([d.id], false, context);
+           var entity = context.entity(d.id);
+           var mapExtent = context.map().extent();
+
+           if (!entity.intersects(mapExtent, context.graph())) {
+             // zoom to the entity if its extent is not visible now
+             context.map().zoomToEase(entity);
+           }
+
+           context.enter(modeSelect(context, [d.id]));
+         }
+
+         function changeRole(d3_event, d) {
+           var oldRole = d.role;
+           var newRole = context.cleanRelationRole(select(this).property('value'));
+
+           if (oldRole !== newRole) {
+             var member = {
+               id: d.id,
+               type: d.type,
+               role: newRole
+             };
+             context.perform(actionChangeMember(d.relation.id, member, d.index), _t('operations.change_role.annotation', {
+               n: 1
+             }));
+             context.validator().validate();
+           }
+         }
+
+         function deleteMember(d3_event, d) {
+           // remove the hover-highlight styling
+           utilHighlightEntities([d.id], false, context);
+           context.perform(actionDeleteMember(d.relation.id, d.index), _t('operations.delete_member.annotation', {
+             n: 1
+           }));
+
+           if (!context.hasEntity(d.relation.id)) {
+             // Removing the last member will also delete the relation.
+             // If this happens we need to exit the selection mode
+             context.enter(modeBrowse(context));
+           } else {
+             // Changing the mode also runs `validate`, but otherwise we need to
+             // rerun it manually
+             context.validator().validate();
+           }
+         }
+
+         function renderDisclosureContent(selection) {
+           var entityID = _entityIDs[0];
+           var memberships = [];
+           var entity = context.entity(entityID);
+           entity.members.slice(0, _maxMembers).forEach(function (member, index) {
+             memberships.push({
+               index: index,
+               id: member.id,
+               type: member.type,
+               role: member.role,
+               relation: entity,
+               member: context.hasEntity(member.id),
+               domId: utilUniqueDomId(entityID + '-member-' + index)
+             });
+           });
+           var list = selection.selectAll('.member-list').data([0]);
+           list = list.enter().append('ul').attr('class', 'member-list').merge(list);
+           var items = list.selectAll('li').data(memberships, function (d) {
+             return osmEntity.key(d.relation) + ',' + d.index + ',' + (d.member ? osmEntity.key(d.member) : 'incomplete');
+           });
+           items.exit().each(unbind).remove();
+           var itemsEnter = items.enter().append('li').attr('class', 'member-row form-field').classed('member-incomplete', function (d) {
+             return !d.member;
+           });
+           itemsEnter.each(function (d) {
+             var item = select(this);
+             var label = item.append('label').attr('class', 'field-label').attr('for', d.domId);
+
+             if (d.member) {
+               // highlight the member feature in the map while hovering on the list item
+               item.on('mouseover', function () {
+                 utilHighlightEntities([d.id], true, context);
+               }).on('mouseout', function () {
+                 utilHighlightEntities([d.id], false, context);
+               });
+               var labelLink = label.append('span').attr('class', 'label-text').append('a').attr('href', '#').on('click', selectMember);
+               labelLink.append('span').attr('class', 'member-entity-type').text(function (d) {
+                 var matched = _mainPresetIndex.match(d.member, context.graph());
+                 return matched && matched.name() || utilDisplayType(d.member.id);
+               });
+               labelLink.append('span').attr('class', 'member-entity-name').text(function (d) {
+                 return utilDisplayName(d.member);
+               });
+               label.append('button').attr('title', _t('icons.remove')).attr('class', 'remove member-delete').call(svgIcon('#iD-operation-delete'));
+               label.append('button').attr('class', 'member-zoom').attr('title', _t('icons.zoom_to')).call(svgIcon('#iD-icon-framed-dot', 'monochrome')).on('click', zoomToMember);
+             } else {
+               var labelText = label.append('span').attr('class', 'label-text');
+               labelText.append('span').attr('class', 'member-entity-type').call(_t.append('inspector.' + d.type, {
+                 id: d.id
+               }));
+               labelText.append('span').attr('class', 'member-entity-name').call(_t.append('inspector.incomplete', {
+                 id: d.id
+               }));
+               label.append('button').attr('class', 'member-download').attr('title', _t('icons.download')).call(svgIcon('#iD-icon-load')).on('click', downloadMember);
+             }
+           });
+           var wrapEnter = itemsEnter.append('div').attr('class', 'form-field-input-wrap form-field-input-member');
+           wrapEnter.append('input').attr('class', 'member-role').attr('id', function (d) {
+             return d.domId;
+           }).property('type', 'text').attr('placeholder', _t('inspector.role')).call(utilNoAuto);
+
+           if (taginfo) {
+             wrapEnter.each(bindTypeahead);
+           } // update
+
+
+           items = items.merge(itemsEnter).order();
+           items.select('input.member-role').property('value', function (d) {
+             return d.role;
+           }).on('blur', changeRole).on('change', changeRole);
+           items.select('button.member-delete').on('click', deleteMember);
+           var dragOrigin, targetIndex;
+           items.call(d3_drag().on('start', function (d3_event) {
+             dragOrigin = {
+               x: d3_event.x,
+               y: d3_event.y
+             };
+             targetIndex = null;
+           }).on('drag', function (d3_event) {
+             var x = d3_event.x - dragOrigin.x,
+                 y = d3_event.y - dragOrigin.y;
+             if (!select(this).classed('dragging') && // don't display drag until dragging beyond a distance threshold
+             Math.sqrt(Math.pow(x, 2) + Math.pow(y, 2)) <= 5) return;
+             var index = items.nodes().indexOf(this);
+             select(this).classed('dragging', true);
+             targetIndex = null;
+             selection.selectAll('li.member-row').style('transform', function (d2, index2) {
+               var node = select(this).node();
+
+               if (index === index2) {
+                 return 'translate(' + x + 'px, ' + y + 'px)';
+               } else if (index2 > index && d3_event.y > node.offsetTop) {
+                 if (targetIndex === null || index2 > targetIndex) {
+                   targetIndex = index2;
+                 }
+
+                 return 'translateY(-100%)';
+               } else if (index2 < index && d3_event.y < node.offsetTop + node.offsetHeight) {
+                 if (targetIndex === null || index2 < targetIndex) {
+                   targetIndex = index2;
+                 }
+
+                 return 'translateY(100%)';
+               }
+
+               return null;
+             });
+           }).on('end', function (d3_event, d) {
+             if (!select(this).classed('dragging')) return;
+             var index = items.nodes().indexOf(this);
+             select(this).classed('dragging', false);
+             selection.selectAll('li.member-row').style('transform', null);
+
+             if (targetIndex !== null) {
+               // dragged to a new position, reorder
+               context.perform(actionMoveMember(d.relation.id, index, targetIndex), _t('operations.reorder_members.annotation'));
+               context.validator().validate();
+             }
+           }));
+
+           function bindTypeahead(d) {
+             var row = select(this);
+             var role = row.selectAll('input.member-role');
+             var origValue = role.property('value');
+
+             function sort(value, data) {
+               var sameletter = [];
+               var other = [];
+
+               for (var i = 0; i < data.length; i++) {
+                 if (data[i].value.substring(0, value.length) === value) {
+                   sameletter.push(data[i]);
+                 } else {
+                   other.push(data[i]);
+                 }
+               }
+
+               return sameletter.concat(other);
+             }
+
+             role.call(uiCombobox(context, 'member-role').fetcher(function (role, callback) {
+               // The `geometry` param is used in the `taginfo.js` interface for
+               // filtering results, as a key into the `tag_members_fractions`
+               // object.  If we don't know the geometry because the member is
+               // not yet downloaded, it's ok to guess based on type.
+               var geometry;
+
+               if (d.member) {
+                 geometry = context.graph().geometry(d.member.id);
+               } else if (d.type === 'relation') {
+                 geometry = 'relation';
+               } else if (d.type === 'way') {
+                 geometry = 'line';
+               } else {
+                 geometry = 'point';
+               }
+
+               var rtype = entity.tags.type;
+               taginfo.roles({
+                 debounce: true,
+                 rtype: rtype || '',
+                 geometry: geometry,
+                 query: role
+               }, function (err, data) {
+                 if (!err) callback(sort(role, data));
+               });
+             }).on('cancel', function () {
+               role.property('value', origValue);
+             }));
+           }
+
+           function unbind() {
+             var row = select(this);
+             row.selectAll('input.member-role').call(uiCombobox.off, context);
+           }
+         }
+
+         section.entityIDs = function (val) {
+           if (!arguments.length) return _entityIDs;
+           _entityIDs = val;
+           return section;
+         };
+
+         return section;
+       }
+
+       function actionDeleteMembers(relationId, memberIndexes) {
+         return function (graph) {
+           // Remove the members in descending order so removals won't shift what members
+           // are at the remaining indexes
+           memberIndexes.sort(function (a, b) {
+             return b - a;
+           });
+
+           for (var i in memberIndexes) {
+             graph = actionDeleteMember(relationId, memberIndexes[i])(graph);
+           }
+
+           return graph;
+         };
+       }
+
+       function uiSectionRawMembershipEditor(context) {
+         var section = uiSection('raw-membership-editor', context).shouldDisplay(function () {
+           return _entityIDs && _entityIDs.length;
+         }).label(function () {
+           var parents = getSharedParentRelations();
+           var gt = parents.length > _maxMemberships ? '>' : '';
+           var count = gt + parents.slice(0, _maxMemberships).length;
+           return _t.html('inspector.title_count', {
+             title: {
+               html: _t.html('inspector.relations')
+             },
+             count: count
+           });
+         }).disclosureContent(renderDisclosureContent);
+         var taginfo = services.taginfo;
+         var nearbyCombo = uiCombobox(context, 'parent-relation').minItems(1).fetcher(fetchNearbyRelations).itemsMouseEnter(function (d3_event, d) {
+           if (d.relation) utilHighlightEntities([d.relation.id], true, context);
+         }).itemsMouseLeave(function (d3_event, d) {
+           if (d.relation) utilHighlightEntities([d.relation.id], false, context);
+         });
+         var _inChange = false;
+         var _entityIDs = [];
+
+         var _showBlank;
+
+         var _maxMemberships = 1000;
+
+         function getSharedParentRelations() {
+           var parents = [];
+
+           for (var i = 0; i < _entityIDs.length; i++) {
+             var entity = context.graph().hasEntity(_entityIDs[i]);
+             if (!entity) continue;
+
+             if (i === 0) {
+               parents = context.graph().parentRelations(entity);
+             } else {
+               parents = utilArrayIntersection(parents, context.graph().parentRelations(entity));
+             }
+
+             if (!parents.length) break;
+           }
+
+           return parents;
+         }
+
+         function getMemberships() {
+           var memberships = [];
+           var relations = getSharedParentRelations().slice(0, _maxMemberships);
+           var isMultiselect = _entityIDs.length > 1;
+           var i, relation, membership, index, member, indexedMember;
+
+           for (i = 0; i < relations.length; i++) {
+             relation = relations[i];
+             membership = {
+               relation: relation,
+               members: [],
+               hash: osmEntity.key(relation)
+             };
+
+             for (index = 0; index < relation.members.length; index++) {
+               member = relation.members[index];
+
+               if (_entityIDs.indexOf(member.id) !== -1) {
+                 indexedMember = Object.assign({}, member, {
+                   index: index
+                 });
+                 membership.members.push(indexedMember);
+                 membership.hash += ',' + index.toString();
+
+                 if (!isMultiselect) {
+                   // For single selections, list one entry per membership per relation.
+                   // For multiselections, list one entry per relation.
+                   memberships.push(membership);
+                   membership = {
+                     relation: relation,
+                     members: [],
+                     hash: osmEntity.key(relation)
+                   };
+                 }
+               }
+             }
+
+             if (membership.members.length) memberships.push(membership);
+           }
+
+           memberships.forEach(function (membership) {
+             membership.domId = utilUniqueDomId('membership-' + membership.relation.id);
+             var roles = [];
+             membership.members.forEach(function (member) {
+               if (roles.indexOf(member.role) === -1) roles.push(member.role);
+             });
+             membership.role = roles.length === 1 ? roles[0] : roles;
+           });
+           return memberships;
+         }
+
+         function selectRelation(d3_event, d) {
+           d3_event.preventDefault(); // remove the hover-highlight styling
+
+           utilHighlightEntities([d.relation.id], false, context);
+           context.enter(modeSelect(context, [d.relation.id]));
+         }
+
+         function zoomToRelation(d3_event, d) {
+           d3_event.preventDefault();
+           var entity = context.entity(d.relation.id);
+           context.map().zoomToEase(entity); // highlight the relation in case it wasn't previously on-screen
+
+           utilHighlightEntities([d.relation.id], true, context);
+         }
+
+         function changeRole(d3_event, d) {
+           if (d === 0) return; // called on newrow (shouldn't happen)
+
+           if (_inChange) return; // avoid accidental recursive call #5731
+
+           var newRole = context.cleanRelationRole(select(this).property('value'));
+           if (!newRole.trim() && typeof d.role !== 'string') return;
+           var membersToUpdate = d.members.filter(function (member) {
+             return member.role !== newRole;
+           });
+
+           if (membersToUpdate.length) {
+             _inChange = true;
+             context.perform(function actionChangeMemberRoles(graph) {
+               membersToUpdate.forEach(function (member) {
+                 var newMember = Object.assign({}, member, {
+                   role: newRole
+                 });
+                 delete newMember.index;
+                 graph = actionChangeMember(d.relation.id, newMember, member.index)(graph);
+               });
+               return graph;
+             }, _t('operations.change_role.annotation', {
+               n: membersToUpdate.length
+             }));
+             context.validator().validate();
+           }
+
+           _inChange = false;
+         }
+
+         function addMembership(d, role) {
+           this.blur(); // avoid keeping focus on the button
+
+           _showBlank = false;
+
+           function actionAddMembers(relationId, ids, role) {
+             return function (graph) {
+               for (var i in ids) {
+                 var member = {
+                   id: ids[i],
+                   type: graph.entity(ids[i]).type,
+                   role: role
+                 };
+                 graph = actionAddMember(relationId, member)(graph);
+               }
+
+               return graph;
+             };
+           }
+
+           if (d.relation) {
+             context.perform(actionAddMembers(d.relation.id, _entityIDs, role), _t('operations.add_member.annotation', {
+               n: _entityIDs.length
+             }));
+             context.validator().validate();
+           } else {
+             var relation = osmRelation();
+             context.perform(actionAddEntity(relation), actionAddMembers(relation.id, _entityIDs, role), _t('operations.add.annotation.relation')); // changing the mode also runs `validate`
+
+             context.enter(modeSelect(context, [relation.id]).newFeature(true));
+           }
+         }
+
+         function deleteMembership(d3_event, d) {
+           this.blur(); // avoid keeping focus on the button
+
+           if (d === 0) return; // called on newrow (shouldn't happen)
+           // remove the hover-highlight styling
+
+           utilHighlightEntities([d.relation.id], false, context);
+           var indexes = d.members.map(function (member) {
+             return member.index;
+           });
+           context.perform(actionDeleteMembers(d.relation.id, indexes), _t('operations.delete_member.annotation', {
+             n: _entityIDs.length
+           }));
+           context.validator().validate();
+         }
+
+         function fetchNearbyRelations(q, callback) {
+           var newRelation = {
+             relation: null,
+             value: _t('inspector.new_relation'),
+             display: _t.html('inspector.new_relation')
+           };
+           var entityID = _entityIDs[0];
+           var result = [];
+           var graph = context.graph();
+
+           function baseDisplayLabel(entity) {
+             var matched = _mainPresetIndex.match(entity, graph);
+             var presetName = matched && matched.name() || _t('inspector.relation');
+             var entityName = utilDisplayName(entity) || '';
+             return presetName + ' ' + entityName;
+           }
+
+           var explicitRelation = q && context.hasEntity(q.toLowerCase());
+
+           if (explicitRelation && explicitRelation.type === 'relation' && explicitRelation.id !== entityID) {
+             // loaded relation is specified explicitly, only show that
+             result.push({
+               relation: explicitRelation,
+               value: baseDisplayLabel(explicitRelation) + ' ' + explicitRelation.id
+             });
+           } else {
+             context.history().intersects(context.map().extent()).forEach(function (entity) {
+               if (entity.type !== 'relation' || entity.id === entityID) return;
+               var value = baseDisplayLabel(entity);
+               if (q && (value + ' ' + entity.id).toLowerCase().indexOf(q.toLowerCase()) === -1) return;
+               result.push({
+                 relation: entity,
+                 value: value
+               });
+             });
+             result.sort(function (a, b) {
+               return osmRelation.creationOrder(a.relation, b.relation);
+             }); // Dedupe identical names by appending relation id - see #2891
+
+             var dupeGroups = Object.values(utilArrayGroupBy(result, 'value')).filter(function (v) {
+               return v.length > 1;
+             });
+             dupeGroups.forEach(function (group) {
+               group.forEach(function (obj) {
+                 obj.value += ' ' + obj.relation.id;
+               });
+             });
+           }
+
+           result.forEach(function (obj) {
+             obj.title = obj.value;
+           });
+           result.unshift(newRelation);
+           callback(result);
+         }
+
+         function renderDisclosureContent(selection) {
+           var memberships = getMemberships();
+           var list = selection.selectAll('.member-list').data([0]);
+           list = list.enter().append('ul').attr('class', 'member-list').merge(list);
+           var items = list.selectAll('li.member-row-normal').data(memberships, function (d) {
+             return d.hash;
+           });
+           items.exit().each(unbind).remove(); // Enter
+
+           var itemsEnter = items.enter().append('li').attr('class', 'member-row member-row-normal form-field'); // highlight the relation in the map while hovering on the list item
+
+           itemsEnter.on('mouseover', function (d3_event, d) {
+             utilHighlightEntities([d.relation.id], true, context);
+           }).on('mouseout', function (d3_event, d) {
+             utilHighlightEntities([d.relation.id], false, context);
+           });
+           var labelEnter = itemsEnter.append('label').attr('class', 'field-label').attr('for', function (d) {
+             return d.domId;
+           });
+           var labelLink = labelEnter.append('span').attr('class', 'label-text').append('a').attr('href', '#').on('click', selectRelation);
+           labelLink.append('span').attr('class', 'member-entity-type').text(function (d) {
+             var matched = _mainPresetIndex.match(d.relation, context.graph());
+             return matched && matched.name() || _t.html('inspector.relation');
+           });
+           labelLink.append('span').attr('class', 'member-entity-name').text(function (d) {
+             return utilDisplayName(d.relation);
+           });
+           labelEnter.append('button').attr('class', 'remove member-delete').attr('title', _t('icons.remove')).call(svgIcon('#iD-operation-delete')).on('click', deleteMembership);
+           labelEnter.append('button').attr('class', 'member-zoom').attr('title', _t('icons.zoom_to')).call(svgIcon('#iD-icon-framed-dot', 'monochrome')).on('click', zoomToRelation);
+           var wrapEnter = itemsEnter.append('div').attr('class', 'form-field-input-wrap form-field-input-member');
+           wrapEnter.append('input').attr('class', 'member-role').attr('id', function (d) {
+             return d.domId;
+           }).property('type', 'text').property('value', function (d) {
+             return typeof d.role === 'string' ? d.role : '';
+           }).attr('title', function (d) {
+             return Array.isArray(d.role) ? d.role.filter(Boolean).join('\n') : d.role;
+           }).attr('placeholder', function (d) {
+             return Array.isArray(d.role) ? _t('inspector.multiple_roles') : _t('inspector.role');
+           }).classed('mixed', function (d) {
+             return Array.isArray(d.role);
+           }).call(utilNoAuto).on('blur', changeRole).on('change', changeRole);
+
+           if (taginfo) {
+             wrapEnter.each(bindTypeahead);
+           }
+
+           var newMembership = list.selectAll('.member-row-new').data(_showBlank ? [0] : []); // Exit
+
+           newMembership.exit().remove(); // Enter
+
+           var newMembershipEnter = newMembership.enter().append('li').attr('class', 'member-row member-row-new form-field');
+           var newLabelEnter = newMembershipEnter.append('label').attr('class', 'field-label');
+           newLabelEnter.append('input').attr('placeholder', _t('inspector.choose_relation')).attr('type', 'text').attr('class', 'member-entity-input').call(utilNoAuto);
+           newLabelEnter.append('button').attr('class', 'remove member-delete').attr('title', _t('icons.remove')).call(svgIcon('#iD-operation-delete')).on('click', function () {
+             list.selectAll('.member-row-new').remove();
+           });
+           var newWrapEnter = newMembershipEnter.append('div').attr('class', 'form-field-input-wrap form-field-input-member');
+           newWrapEnter.append('input').attr('class', 'member-role').property('type', 'text').attr('placeholder', _t('inspector.role')).call(utilNoAuto); // Update
+
+           newMembership = newMembership.merge(newMembershipEnter);
+           newMembership.selectAll('.member-entity-input').on('blur', cancelEntity) // if it wasn't accepted normally, cancel it
+           .call(nearbyCombo.on('accept', acceptEntity).on('cancel', cancelEntity)); // Container for the Add button
+
+           var addRow = selection.selectAll('.add-row').data([0]); // enter
+
+           var addRowEnter = addRow.enter().append('div').attr('class', 'add-row');
+           var addRelationButton = addRowEnter.append('button').attr('class', 'add-relation').attr('aria-label', _t('inspector.add_to_relation'));
+           addRelationButton.call(svgIcon('#iD-icon-plus', 'light'));
+           addRelationButton.call(uiTooltip().title(_t.html('inspector.add_to_relation')).placement(_mainLocalizer.textDirection() === 'ltr' ? 'right' : 'left'));
+           addRowEnter.append('div').attr('class', 'space-value'); // preserve space
+
+           addRowEnter.append('div').attr('class', 'space-buttons'); // preserve space
+           // update
+
+           addRow = addRow.merge(addRowEnter);
+           addRow.select('.add-relation').on('click', function () {
+             _showBlank = true;
+             section.reRender();
+             list.selectAll('.member-entity-input').node().focus();
+           });
+
+           function acceptEntity(d) {
+             if (!d) {
+               cancelEntity();
+               return;
+             } // remove hover-higlighting
+
+
+             if (d.relation) utilHighlightEntities([d.relation.id], false, context);
+             var role = context.cleanRelationRole(list.selectAll('.member-row-new .member-role').property('value'));
+             addMembership(d, role);
+           }
+
+           function cancelEntity() {
+             var input = newMembership.selectAll('.member-entity-input');
+             input.property('value', ''); // remove hover-higlighting
+
+             context.surface().selectAll('.highlighted').classed('highlighted', false);
+           }
+
+           function bindTypeahead(d) {
+             var row = select(this);
+             var role = row.selectAll('input.member-role');
+             var origValue = role.property('value');
+
+             function sort(value, data) {
+               var sameletter = [];
+               var other = [];
+
+               for (var i = 0; i < data.length; i++) {
+                 if (data[i].value.substring(0, value.length) === value) {
+                   sameletter.push(data[i]);
+                 } else {
+                   other.push(data[i]);
+                 }
+               }
+
+               return sameletter.concat(other);
+             }
+
+             role.call(uiCombobox(context, 'member-role').fetcher(function (role, callback) {
+               var rtype = d.relation.tags.type;
+               taginfo.roles({
+                 debounce: true,
+                 rtype: rtype || '',
+                 geometry: context.graph().geometry(_entityIDs[0]),
+                 query: role
+               }, function (err, data) {
+                 if (!err) callback(sort(role, data));
+               });
+             }).on('cancel', function () {
+               role.property('value', origValue);
+             }));
+           }
+
+           function unbind() {
+             var row = select(this);
+             row.selectAll('input.member-role').call(uiCombobox.off, context);
+           }
+         }
+
+         section.entityIDs = function (val) {
+           if (!arguments.length) return _entityIDs;
+           _entityIDs = val;
+           _showBlank = false;
+           return section;
+         };
+
+         return section;
+       }
+
+       function uiSectionSelectionList(context) {
+         var _selectedIDs = [];
+         var section = uiSection('selected-features', context).shouldDisplay(function () {
+           return _selectedIDs.length > 1;
+         }).label(function () {
+           return _t.html('inspector.title_count', {
+             title: {
+               html: _t.html('inspector.features')
+             },
+             count: _selectedIDs.length
+           });
+         }).disclosureContent(renderDisclosureContent);
+         context.history().on('change.selectionList', function (difference) {
+           if (difference) {
+             section.reRender();
+           }
+         });
+
+         section.entityIDs = function (val) {
+           if (!arguments.length) return _selectedIDs;
+           _selectedIDs = val;
+           return section;
+         };
+
+         function selectEntity(d3_event, entity) {
+           context.enter(modeSelect(context, [entity.id]));
+         }
+
+         function deselectEntity(d3_event, entity) {
+           var selectedIDs = _selectedIDs.slice();
+
+           var index = selectedIDs.indexOf(entity.id);
+
+           if (index > -1) {
+             selectedIDs.splice(index, 1);
+             context.enter(modeSelect(context, selectedIDs));
+           }
+         }
+
+         function renderDisclosureContent(selection) {
+           var list = selection.selectAll('.feature-list').data([0]);
+           list = list.enter().append('ul').attr('class', 'feature-list').merge(list);
+
+           var entities = _selectedIDs.map(function (id) {
+             return context.hasEntity(id);
+           }).filter(Boolean);
+
+           var items = list.selectAll('.feature-list-item').data(entities, osmEntity.key);
+           items.exit().remove(); // Enter
+
+           var enter = items.enter().append('li').attr('class', 'feature-list-item').each(function (d) {
+             select(this).on('mouseover', function () {
+               utilHighlightEntities([d.id], true, context);
+             }).on('mouseout', function () {
+               utilHighlightEntities([d.id], false, context);
+             });
+           });
+           var label = enter.append('button').attr('class', 'label').on('click', selectEntity);
+           label.append('span').attr('class', 'entity-geom-icon').call(svgIcon('', 'pre-text'));
+           label.append('span').attr('class', 'entity-type');
+           label.append('span').attr('class', 'entity-name');
+           enter.append('button').attr('class', 'close').attr('title', _t('icons.deselect')).on('click', deselectEntity).call(svgIcon('#iD-icon-close')); // Update
+
+           items = items.merge(enter);
+           items.selectAll('.entity-geom-icon use').attr('href', function () {
+             var entity = this.parentNode.parentNode.__data__;
+             return '#iD-icon-' + entity.geometry(context.graph());
+           });
+           items.selectAll('.entity-type').text(function (entity) {
+             return _mainPresetIndex.match(entity, context.graph()).name();
+           });
+           items.selectAll('.entity-name').text(function (d) {
+             // fetch latest entity
+             var entity = context.entity(d.id);
+             return utilDisplayName(entity);
+           });
+         }
+
+         return section;
+       }
+
+       function uiEntityEditor(context) {
+         var dispatch = dispatch$8('choose');
+         var _state = 'select';
+         var _coalesceChanges = false;
+         var _modified = false;
+
+         var _base;
+
+         var _entityIDs;
+
+         var _activePresets = [];
+
+         var _newFeature;
+
+         var _sections;
+
+         function entityEditor(selection) {
+           var combinedTags = utilCombinedTags(_entityIDs, context.graph()); // Header
+
+           var header = selection.selectAll('.header').data([0]); // Enter
+
+           var headerEnter = header.enter().append('div').attr('class', 'header fillL');
+           var direction = _mainLocalizer.textDirection() === 'rtl' ? 'forward' : 'backward';
+           headerEnter.append('button').attr('class', 'preset-reset preset-choose').attr('title', _t("icons.".concat(direction))).call(svgIcon("#iD-icon-".concat(direction)));
+           headerEnter.append('button').attr('class', 'close').attr('title', _t('icons.close')).on('click', function () {
+             context.enter(modeBrowse(context));
+           }).call(svgIcon(_modified ? '#iD-icon-apply' : '#iD-icon-close'));
+           headerEnter.append('h2'); // Update
+
+           header = header.merge(headerEnter);
+           header.selectAll('h2').html(_entityIDs.length === 1 ? _t.html('inspector.edit') : _t.html('inspector.edit_features'));
+           header.selectAll('.preset-reset').on('click', function () {
+             dispatch.call('choose', this, _activePresets);
+           }); // Body
+
+           var body = selection.selectAll('.inspector-body').data([0]); // Enter
+
+           var bodyEnter = body.enter().append('div').attr('class', 'entity-editor inspector-body sep-top'); // Update
+
+           body = body.merge(bodyEnter);
+
+           if (!_sections) {
+             _sections = [uiSectionSelectionList(context), uiSectionFeatureType(context).on('choose', function (presets) {
+               dispatch.call('choose', this, presets);
+             }), uiSectionEntityIssues(context), uiSectionPresetFields(context).on('change', changeTags).on('revert', revertTags), uiSectionRawTagEditor('raw-tag-editor', context).on('change', changeTags), uiSectionRawMemberEditor(context), uiSectionRawMembershipEditor(context)];
+           }
+
+           _sections.forEach(function (section) {
+             if (section.entityIDs) {
+               section.entityIDs(_entityIDs);
+             }
+
+             if (section.presets) {
+               section.presets(_activePresets);
+             }
+
+             if (section.tags) {
+               section.tags(combinedTags);
+             }
+
+             if (section.state) {
+               section.state(_state);
+             }
+
+             body.call(section.render);
+           });
+
+           context.history().on('change.entity-editor', historyChanged);
+
+           function historyChanged(difference) {
+             if (selection.selectAll('.entity-editor').empty()) return;
+             if (_state === 'hide') return;
+             var significant = !difference || difference.didChange.properties || difference.didChange.addition || difference.didChange.deletion;
+             if (!significant) return;
+             _entityIDs = _entityIDs.filter(context.hasEntity);
+             if (!_entityIDs.length) return;
+             var priorActivePreset = _activePresets.length === 1 && _activePresets[0];
+             loadActivePresets();
+             var graph = context.graph();
+             entityEditor.modified(_base !== graph);
+             entityEditor(selection);
+
+             if (priorActivePreset && _activePresets.length === 1 && priorActivePreset !== _activePresets[0]) {
+               // flash the button to indicate the preset changed
+               context.container().selectAll('.entity-editor button.preset-reset .label').style('background-color', '#fff').transition().duration(750).style('background-color', null);
+             }
+           }
+         } // Tag changes that fire on input can all get coalesced into a single
+         // history operation when the user leaves the field.  #2342
+         // Use explicit entityIDs in case the selection changes before the event is fired.
+
+
+         function changeTags(entityIDs, changed, onInput) {
+           var actions = [];
+
+           for (var i in entityIDs) {
+             var entityID = entityIDs[i];
+             var entity = context.entity(entityID);
+             var tags = Object.assign({}, entity.tags); // shallow copy
+
+             for (var k in changed) {
+               if (!k) continue;
+               var v = changed[k];
+
+               if (_typeof(v) === 'object') {
+                 // a "key only" tag change
+                 tags[k] = tags[v.oldKey];
+               } else if (v !== undefined || tags.hasOwnProperty(k)) {
+                 tags[k] = v;
+               }
+             }
+
+             if (!onInput) {
+               tags = utilCleanTags(tags);
+             }
+
+             if (!fastDeepEqual(entity.tags, tags)) {
+               actions.push(actionChangeTags(entityID, tags));
+             }
+           }
+
+           if (actions.length) {
+             var combinedAction = function combinedAction(graph) {
+               actions.forEach(function (action) {
+                 graph = action(graph);
+               });
+               return graph;
+             };
+
+             var annotation = _t('operations.change_tags.annotation');
+
+             if (_coalesceChanges) {
+               context.overwrite(combinedAction, annotation);
+             } else {
+               context.perform(combinedAction, annotation);
+               _coalesceChanges = !!onInput;
+             }
+           } // if leaving field (blur event), rerun validation
+
+
+           if (!onInput) {
+             context.validator().validate();
+           }
+         }
+
+         function revertTags(keys) {
+           var actions = [];
+
+           for (var i in _entityIDs) {
+             var entityID = _entityIDs[i];
+             var original = context.graph().base().entities[entityID];
+             var changed = {};
+
+             for (var j in keys) {
+               var key = keys[j];
+               changed[key] = original ? original.tags[key] : undefined;
+             }
+
+             var entity = context.entity(entityID);
+             var tags = Object.assign({}, entity.tags); // shallow copy
+
+             for (var k in changed) {
+               if (!k) continue;
+               var v = changed[k];
+
+               if (v !== undefined || tags.hasOwnProperty(k)) {
+                 tags[k] = v;
+               }
+             }
+
+             tags = utilCleanTags(tags);
+
+             if (!fastDeepEqual(entity.tags, tags)) {
+               actions.push(actionChangeTags(entityID, tags));
+             }
+           }
+
+           if (actions.length) {
+             var combinedAction = function combinedAction(graph) {
+               actions.forEach(function (action) {
+                 graph = action(graph);
+               });
+               return graph;
+             };
+
+             var annotation = _t('operations.change_tags.annotation');
+
+             if (_coalesceChanges) {
+               context.overwrite(combinedAction, annotation);
+             } else {
+               context.perform(combinedAction, annotation);
+               _coalesceChanges = false;
+             }
+           }
+
+           context.validator().validate();
+         }
+
+         entityEditor.modified = function (val) {
+           if (!arguments.length) return _modified;
+           _modified = val;
+           return entityEditor;
+         };
+
+         entityEditor.state = function (val) {
+           if (!arguments.length) return _state;
+           _state = val;
+           return entityEditor;
+         };
+
+         entityEditor.entityIDs = function (val) {
+           if (!arguments.length) return _entityIDs; // always reload these even if the entityIDs are unchanged, since we
+           // could be reselecting after something like dragging a node
+
+           _base = context.graph();
+           _coalesceChanges = false;
+           if (val && _entityIDs && utilArrayIdentical(_entityIDs, val)) return entityEditor; // exit early if no change
+
+           _entityIDs = val;
+           loadActivePresets(true);
+           return entityEditor.modified(false);
+         };
+
+         entityEditor.newFeature = function (val) {
+           if (!arguments.length) return _newFeature;
+           _newFeature = val;
+           return entityEditor;
+         };
+
+         function loadActivePresets(isForNewSelection) {
+           var graph = context.graph();
+           var counts = {};
+
+           for (var i in _entityIDs) {
+             var entity = graph.hasEntity(_entityIDs[i]);
+             if (!entity) return;
+             var match = _mainPresetIndex.match(entity, graph);
+             if (!counts[match.id]) counts[match.id] = 0;
+             counts[match.id] += 1;
+           }
+
+           var matches = Object.keys(counts).sort(function (p1, p2) {
+             return counts[p2] - counts[p1];
+           }).map(function (pID) {
+             return _mainPresetIndex.item(pID);
+           });
+
+           if (!isForNewSelection) {
+             // A "weak" preset doesn't set any tags. (e.g. "Address")
+             var weakPreset = _activePresets.length === 1 && !_activePresets[0].isFallback() && Object.keys(_activePresets[0].addTags || {}).length === 0; // Don't replace a weak preset with a fallback preset (e.g. "Point")
+
+             if (weakPreset && matches.length === 1 && matches[0].isFallback()) return;
+           }
+
+           entityEditor.presets(matches);
+         }
+
+         entityEditor.presets = function (val) {
+           if (!arguments.length) return _activePresets; // don't reload the same preset
+
+           if (!utilArrayIdentical(val, _activePresets)) {
+             _activePresets = val;
+           }
+
+           return entityEditor;
+         };
+
+         return utilRebind(entityEditor, dispatch, 'on');
+       }
+
+       var sexagesimal = {exports: {}};
+
+       sexagesimal.exports = element;
+       var pair_1 = sexagesimal.exports.pair = pair;
+       sexagesimal.exports.format = format;
+       sexagesimal.exports.formatPair = formatPair;
+       sexagesimal.exports.coordToDMS = coordToDMS;
+
+       function element(input, dims) {
+         var result = search(input, dims);
+         return result === null ? null : result.val;
+       }
+
+       function formatPair(input) {
+         return format(input.lat, 'lat') + ' ' + format(input.lon, 'lon');
+       } // Is 0 North or South?
+
+
+       function format(input, dim) {
+         var dms = coordToDMS(input, dim);
+         return dms.whole + '° ' + (dms.minutes ? dms.minutes + '\' ' : '') + (dms.seconds ? dms.seconds + '" ' : '') + dms.dir;
+       }
+
+       function coordToDMS(input, dim) {
+         var dirs = {
+           lat: ['N', 'S'],
+           lon: ['E', 'W']
+         }[dim] || '';
+         var dir = dirs[input >= 0 ? 0 : 1];
+         var abs = Math.abs(input);
+         var whole = Math.floor(abs);
+         var fraction = abs - whole;
+         var fractionMinutes = fraction * 60;
+         var minutes = Math.floor(fractionMinutes);
+         var seconds = Math.floor((fractionMinutes - minutes) * 60);
+         return {
+           whole: whole,
+           minutes: minutes,
+           seconds: seconds,
+           dir: dir
+         };
+       }
+
+       function search(input, dims) {
+         if (!dims) dims = 'NSEW';
+         if (typeof input !== 'string') return null;
+         input = input.toUpperCase();
+         var regex = /^[\s\,]*([NSEW])?\s*([\-|\—|\―]?[0-9.]+)[°º˚]?\s*(?:([0-9.]+)['’′‘]\s*)?(?:([0-9.]+)(?:''|"|”|″)\s*)?([NSEW])?/;
+         var m = input.match(regex);
+         if (!m) return null; // no match
+
+         var matched = m[0]; // extract dimension.. m[1] = leading, m[5] = trailing
+
+         var dim;
+
+         if (m[1] && m[5]) {
+           // if matched both..
+           dim = m[1]; // keep leading
+
+           matched = matched.slice(0, -1); // remove trailing dimension from match
+         } else {
+           dim = m[1] || m[5];
+         } // if unrecognized dimension
+
+
+         if (dim && dims.indexOf(dim) === -1) return null; // extract DMS
+
+         var deg = m[2] ? parseFloat(m[2]) : 0;
+         var min = m[3] ? parseFloat(m[3]) / 60 : 0;
+         var sec = m[4] ? parseFloat(m[4]) / 3600 : 0;
+         var sign = deg < 0 ? -1 : 1;
+         if (dim === 'S' || dim === 'W') sign *= -1;
+         return {
+           val: (Math.abs(deg) + min + sec) * sign,
+           dim: dim,
+           matched: matched,
+           remain: input.slice(matched.length)
+         };
+       }
+
+       function pair(input, dims) {
+         input = input.trim();
+         var one = search(input, dims);
+         if (!one) return null;
+         input = one.remain.trim();
+         var two = search(input, dims);
+         if (!two || two.remain) return null;
+
+         if (one.dim) {
+           return swapdim(one.val, two.val, one.dim);
+         } else {
+           return [one.val, two.val];
+         }
+       }
+
+       function swapdim(a, b, dim) {
+         if (dim === 'N' || dim === 'S') return [a, b];
+         if (dim === 'W' || dim === 'E') return [b, a];
+       }
+
+       function uiFeatureList(context) {
+         var _geocodeResults;
+
+         function featureList(selection) {
+           var header = selection.append('div').attr('class', 'header fillL');
+           header.append('h2').call(_t.append('inspector.feature_list'));
+           var searchWrap = selection.append('div').attr('class', 'search-header');
+           searchWrap.call(svgIcon('#iD-icon-search', 'pre-text'));
+           var search = searchWrap.append('input').attr('placeholder', _t('inspector.search')).attr('type', 'search').call(utilNoAuto).on('keypress', keypress).on('keydown', keydown).on('input', inputevent);
+           var listWrap = selection.append('div').attr('class', 'inspector-body');
+           var list = listWrap.append('div').attr('class', 'feature-list');
+           context.on('exit.feature-list', clearSearch);
+           context.map().on('drawn.feature-list', mapDrawn);
+           context.keybinding().on(uiCmd('⌘F'), focusSearch);
+
+           function focusSearch(d3_event) {
+             var mode = context.mode() && context.mode().id;
+             if (mode !== 'browse') return;
+             d3_event.preventDefault();
+             search.node().focus();
+           }
+
+           function keydown(d3_event) {
+             if (d3_event.keyCode === 27) {
+               // escape
+               search.node().blur();
+             }
+           }
+
+           function keypress(d3_event) {
+             var q = search.property('value'),
+                 items = list.selectAll('.feature-list-item');
+
+             if (d3_event.keyCode === 13 && // ↩ Return
+             q.length && items.size()) {
+               click(d3_event, items.datum());
+             }
+           }
+
+           function inputevent() {
+             _geocodeResults = undefined;
+             drawList();
+           }
+
+           function clearSearch() {
+             search.property('value', '');
+             drawList();
+           }
+
+           function mapDrawn(e) {
+             if (e.full) {
+               drawList();
+             }
+           }
+
+           function features() {
+             var result = [];
+             var graph = context.graph();
+             var visibleCenter = context.map().extent().center();
+             var q = search.property('value').toLowerCase();
+             if (!q) return result;
+             var locationMatch = pair_1(q.toUpperCase()) || q.match(/^(-?\d+\.?\d*)\s+(-?\d+\.?\d*)$/);
+
+             if (locationMatch) {
+               var loc = [parseFloat(locationMatch[0]), parseFloat(locationMatch[1])];
+               result.push({
+                 id: -1,
+                 geometry: 'point',
+                 type: _t('inspector.location'),
+                 name: dmsCoordinatePair([loc[1], loc[0]]),
+                 location: loc
+               });
+             } // A location search takes priority over an ID search
+
+
+             var idMatch = !locationMatch && q.match(/(?:^|\W)(node|way|relation|[nwr])\W?0*([1-9]\d*)(?:\W|$)/i);
+
+             if (idMatch) {
+               var elemType = idMatch[1].charAt(0);
+               var elemId = idMatch[2];
+               result.push({
+                 id: elemType + elemId,
+                 geometry: elemType === 'n' ? 'point' : elemType === 'w' ? 'line' : 'relation',
+                 type: elemType === 'n' ? _t('inspector.node') : elemType === 'w' ? _t('inspector.way') : _t('inspector.relation'),
+                 name: elemId
+               });
+             }
+
+             var allEntities = graph.entities;
+             var localResults = [];
+
+             for (var id in allEntities) {
+               var entity = allEntities[id];
+               if (!entity) continue;
+               var name = utilDisplayName(entity) || '';
+               if (name.toLowerCase().indexOf(q) < 0) continue;
+               var matched = _mainPresetIndex.match(entity, graph);
+               var type = matched && matched.name() || utilDisplayType(entity.id);
+               var extent = entity.extent(graph);
+               var distance = extent ? geoSphericalDistance(visibleCenter, extent.center()) : 0;
+               localResults.push({
+                 id: entity.id,
+                 entity: entity,
+                 geometry: entity.geometry(graph),
+                 type: type,
+                 name: name,
+                 distance: distance
+               });
+               if (localResults.length > 100) break;
+             }
+
+             localResults = localResults.sort(function byDistance(a, b) {
+               return a.distance - b.distance;
+             });
+             result = result.concat(localResults);
+
+             (_geocodeResults || []).forEach(function (d) {
+               if (d.osm_type && d.osm_id) {
+                 // some results may be missing these - #1890
+                 // Make a temporary osmEntity so we can preset match
+                 // and better localize the search result - #4725
+                 var id = osmEntity.id.fromOSM(d.osm_type, d.osm_id);
+                 var tags = {};
+                 tags[d["class"]] = d.type;
+                 var attrs = {
+                   id: id,
+                   type: d.osm_type,
+                   tags: tags
+                 };
+
+                 if (d.osm_type === 'way') {
+                   // for ways, add some fake closed nodes
+                   attrs.nodes = ['a', 'a']; // so that geometry area is possible
+                 }
+
+                 var tempEntity = osmEntity(attrs);
+                 var tempGraph = coreGraph([tempEntity]);
+                 var matched = _mainPresetIndex.match(tempEntity, tempGraph);
+                 var type = matched && matched.name() || utilDisplayType(id);
+                 result.push({
+                   id: tempEntity.id,
+                   geometry: tempEntity.geometry(tempGraph),
+                   type: type,
+                   name: d.display_name,
+                   extent: new geoExtent([parseFloat(d.boundingbox[3]), parseFloat(d.boundingbox[0])], [parseFloat(d.boundingbox[2]), parseFloat(d.boundingbox[1])])
+                 });
+               }
+             });
+
+             if (q.match(/^[0-9]+$/)) {
+               // if query is just a number, possibly an OSM ID without a prefix
+               result.push({
+                 id: 'n' + q,
+                 geometry: 'point',
+                 type: _t('inspector.node'),
+                 name: q
+               });
+               result.push({
+                 id: 'w' + q,
+                 geometry: 'line',
+                 type: _t('inspector.way'),
+                 name: q
+               });
+               result.push({
+                 id: 'r' + q,
+                 geometry: 'relation',
+                 type: _t('inspector.relation'),
+                 name: q
+               });
+             }
+
+             return result;
+           }
+
+           function drawList() {
+             var value = search.property('value');
+             var results = features();
+             list.classed('filtered', value.length);
+             var resultsIndicator = list.selectAll('.no-results-item').data([0]).enter().append('button').property('disabled', true).attr('class', 'no-results-item').call(svgIcon('#iD-icon-alert', 'pre-text'));
+             resultsIndicator.append('span').attr('class', 'entity-name');
+             list.selectAll('.no-results-item .entity-name').html('').call(_t.append('geocoder.no_results_worldwide'));
+
+             if (services.geocoder) {
+               list.selectAll('.geocode-item').data([0]).enter().append('button').attr('class', 'geocode-item secondary-action').on('click', geocoderSearch).append('div').attr('class', 'label').append('span').attr('class', 'entity-name').call(_t.append('geocoder.search'));
+             }
+
+             list.selectAll('.no-results-item').style('display', value.length && !results.length ? 'block' : 'none');
+             list.selectAll('.geocode-item').style('display', value && _geocodeResults === undefined ? 'block' : 'none');
+             list.selectAll('.feature-list-item').data([-1]).remove();
+             var items = list.selectAll('.feature-list-item').data(results, function (d) {
+               return d.id;
+             });
+             var enter = items.enter().insert('button', '.geocode-item').attr('class', 'feature-list-item').on('mouseover', mouseover).on('mouseout', mouseout).on('click', click);
+             var label = enter.append('div').attr('class', 'label');
+             label.each(function (d) {
+               select(this).call(svgIcon('#iD-icon-' + d.geometry, 'pre-text'));
+             });
+             label.append('span').attr('class', 'entity-type').text(function (d) {
+               return d.type;
+             });
+             label.append('span').attr('class', 'entity-name').text(function (d) {
+               return d.name;
+             });
+             enter.style('opacity', 0).transition().style('opacity', 1);
+             items.order();
+             items.exit().remove();
+           }
+
+           function mouseover(d3_event, d) {
+             if (d.id === -1) return;
+             utilHighlightEntities([d.id], true, context);
+           }
+
+           function mouseout(d3_event, d) {
+             if (d.id === -1) return;
+             utilHighlightEntities([d.id], false, context);
+           }
+
+           function click(d3_event, d) {
+             d3_event.preventDefault();
+
+             if (d.location) {
+               context.map().centerZoomEase([d.location[1], d.location[0]], 19);
+             } else if (d.entity) {
+               utilHighlightEntities([d.id], false, context);
+               context.enter(modeSelect(context, [d.entity.id]));
+               context.map().zoomToEase(d.entity);
+             } else {
+               // download, zoom to, and select the entity with the given ID
+               context.zoomToEntity(d.id);
+             }
+           }
+
+           function geocoderSearch() {
+             services.geocoder.search(search.property('value'), function (err, resp) {
+               _geocodeResults = resp || [];
+               drawList();
+             });
+           }
+         }
+
+         return featureList;
+       }
+
+       function uiImproveOsmComments() {
+         var _qaItem;
+
+         function issueComments(selection) {
+           // make the div immediately so it appears above the buttons
+           var comments = selection.selectAll('.comments-container').data([0]);
+           comments = comments.enter().append('div').attr('class', 'comments-container').merge(comments); // must retrieve comments from API before they can be displayed
+
+           services.improveOSM.getComments(_qaItem).then(function (d) {
+             if (!d.comments) return; // nothing to do here
+
+             var commentEnter = comments.selectAll('.comment').data(d.comments).enter().append('div').attr('class', 'comment');
+             commentEnter.append('div').attr('class', 'comment-avatar').call(svgIcon('#iD-icon-avatar', 'comment-avatar-icon'));
+             var mainEnter = commentEnter.append('div').attr('class', 'comment-main');
+             var metadataEnter = mainEnter.append('div').attr('class', 'comment-metadata');
+             metadataEnter.append('div').attr('class', 'comment-author').each(function (d) {
+               var osm = services.osm;
+               var selection = select(this);
+
+               if (osm && d.username) {
+                 selection = selection.append('a').attr('class', 'comment-author-link').attr('href', osm.userURL(d.username)).attr('target', '_blank');
+               }
+
+               selection.text(function (d) {
+                 return d.username;
+               });
+             });
+             metadataEnter.append('div').attr('class', 'comment-date').html(function (d) {
+               return _t.html('note.status.commented', {
+                 when: localeDateString(d.timestamp)
+               });
+             });
+             mainEnter.append('div').attr('class', 'comment-text').append('p').text(function (d) {
+               return d.text;
+             });
+           })["catch"](function (err) {
+             console.log(err); // eslint-disable-line no-console
+           });
+         }
+
+         function localeDateString(s) {
+           if (!s) return null;
+           var options = {
+             day: 'numeric',
+             month: 'short',
+             year: 'numeric'
+           };
+           var d = new Date(s * 1000); // timestamp is served in seconds, date takes ms
+
+           if (isNaN(d.getTime())) return null;
+           return d.toLocaleDateString(_mainLocalizer.localeCode(), options);
+         }
+
+         issueComments.issue = function (val) {
+           if (!arguments.length) return _qaItem;
+           _qaItem = val;
+           return issueComments;
+         };
+
+         return issueComments;
+       }
+
+       function uiImproveOsmDetails(context) {
+         var _qaItem;
+
+         function issueDetail(d) {
+           if (d.desc) return d.desc;
+           var issueKey = d.issueKey;
+           d.replacements = d.replacements || {};
+           d.replacements["default"] = {
+             html: _t.html('inspector.unknown')
+           }; // special key `default` works as a fallback string
+
+           return _t.html("QA.improveOSM.error_types.".concat(issueKey, ".description"), d.replacements);
+         }
+
+         function improveOsmDetails(selection) {
+           var details = selection.selectAll('.error-details').data(_qaItem ? [_qaItem] : [], function (d) {
+             return "".concat(d.id, "-").concat(d.status || 0);
+           });
+           details.exit().remove();
+           var detailsEnter = details.enter().append('div').attr('class', 'error-details qa-details-container'); // description
+
+           var descriptionEnter = detailsEnter.append('div').attr('class', 'qa-details-subsection');
+           descriptionEnter.append('h4').call(_t.append('QA.keepRight.detail_description'));
+           descriptionEnter.append('div').attr('class', 'qa-details-description-text').html(issueDetail); // If there are entity links in the error message..
+
+           var relatedEntities = [];
+           descriptionEnter.selectAll('.error_entity_link, .error_object_link').attr('href', '#').each(function () {
+             var link = select(this);
+             var isObjectLink = link.classed('error_object_link');
+             var entityID = isObjectLink ? utilEntityRoot(_qaItem.objectType) + _qaItem.objectId : this.textContent;
+             var entity = context.hasEntity(entityID);
+             relatedEntities.push(entityID); // Add click handler
+
+             link.on('mouseenter', function () {
+               utilHighlightEntities([entityID], true, context);
+             }).on('mouseleave', function () {
+               utilHighlightEntities([entityID], false, context);
+             }).on('click', function (d3_event) {
+               d3_event.preventDefault();
+               utilHighlightEntities([entityID], false, context);
+               var osmlayer = context.layers().layer('osm');
+
+               if (!osmlayer.enabled()) {
+                 osmlayer.enabled(true);
+               }
+
+               context.map().centerZoom(_qaItem.loc, 20);
+
+               if (entity) {
+                 context.enter(modeSelect(context, [entityID]));
+               } else {
+                 context.loadEntity(entityID, function (err, result) {
+                   if (err) return;
+                   var entity = result.data.find(function (e) {
+                     return e.id === entityID;
+                   });
+                   if (entity) context.enter(modeSelect(context, [entityID]));
+                 });
+               }
+             }); // Replace with friendly name if possible
+             // (The entity may not yet be loaded into the graph)
+
+             if (entity) {
+               var name = utilDisplayName(entity); // try to use common name
+
+               if (!name && !isObjectLink) {
+                 var preset = _mainPresetIndex.match(entity, context.graph());
+                 name = preset && !preset.isFallback() && preset.name(); // fallback to preset name
+               }
+
+               if (name) {
+                 this.innerText = name;
+               }
+             }
+           }); // Don't hide entities related to this error - #5880
+
+           context.features().forceVisible(relatedEntities);
+           context.map().pan([0, 0]); // trigger a redraw
+         }
+
+         improveOsmDetails.issue = function (val) {
+           if (!arguments.length) return _qaItem;
+           _qaItem = val;
+           return improveOsmDetails;
+         };
+
+         return improveOsmDetails;
+       }
+
+       function uiImproveOsmHeader() {
+         var _qaItem;
+
+         function issueTitle(d) {
+           var issueKey = d.issueKey;
+           d.replacements = d.replacements || {};
+           d.replacements["default"] = {
+             html: _t.html('inspector.unknown')
+           }; // special key `default` works as a fallback string
+
+           return _t.html("QA.improveOSM.error_types.".concat(issueKey, ".title"), d.replacements);
+         }
+
+         function improveOsmHeader(selection) {
+           var header = selection.selectAll('.qa-header').data(_qaItem ? [_qaItem] : [], function (d) {
+             return "".concat(d.id, "-").concat(d.status || 0);
+           });
+           header.exit().remove();
+           var headerEnter = header.enter().append('div').attr('class', 'qa-header');
+           var svgEnter = headerEnter.append('div').attr('class', 'qa-header-icon').classed('new', function (d) {
+             return d.id < 0;
+           }).append('svg').attr('width', '20px').attr('height', '30px').attr('viewbox', '0 0 20 30').attr('class', function (d) {
+             return "preset-icon-28 qaItem ".concat(d.service, " itemId-").concat(d.id, " itemType-").concat(d.itemType);
+           });
+           svgEnter.append('polygon').attr('fill', 'currentColor').attr('class', 'qaItem-fill').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');
+           svgEnter.append('use').attr('class', 'icon-annotation').attr('width', '13px').attr('height', '13px').attr('transform', 'translate(3.5, 5)').attr('xlink:href', function (d) {
+             var picon = d.icon;
+
+             if (!picon) {
+               return '';
+             } else {
+               var isMaki = /^maki-/.test(picon);
+               return "#".concat(picon).concat(isMaki ? '-11' : '');
+             }
+           });
+           headerEnter.append('div').attr('class', 'qa-header-label').html(issueTitle);
+         }
+
+         improveOsmHeader.issue = function (val) {
+           if (!arguments.length) return _qaItem;
+           _qaItem = val;
+           return improveOsmHeader;
+         };
+
+         return improveOsmHeader;
+       }
+
+       function uiImproveOsmEditor(context) {
+         var dispatch = dispatch$8('change');
+         var qaDetails = uiImproveOsmDetails(context);
+         var qaComments = uiImproveOsmComments();
+         var qaHeader = uiImproveOsmHeader();
+
+         var _qaItem;
+
+         function improveOsmEditor(selection) {
+           var headerEnter = selection.selectAll('.header').data([0]).enter().append('div').attr('class', 'header fillL');
+           headerEnter.append('button').attr('class', 'close').attr('title', _t('icons.close')).on('click', function () {
+             return context.enter(modeBrowse(context));
+           }).call(svgIcon('#iD-icon-close'));
+           headerEnter.append('h2').call(_t.append('QA.improveOSM.title'));
+           var body = selection.selectAll('.body').data([0]);
+           body = body.enter().append('div').attr('class', 'body').merge(body);
+           var editor = body.selectAll('.qa-editor').data([0]);
+           editor.enter().append('div').attr('class', 'modal-section qa-editor').merge(editor).call(qaHeader.issue(_qaItem)).call(qaDetails.issue(_qaItem)).call(qaComments.issue(_qaItem)).call(improveOsmSaveSection);
+         }
+
+         function improveOsmSaveSection(selection) {
+           var isSelected = _qaItem && _qaItem.id === context.selectedErrorID();
+
+           var isShown = _qaItem && (isSelected || _qaItem.newComment || _qaItem.comment);
+           var saveSection = selection.selectAll('.qa-save').data(isShown ? [_qaItem] : [], function (d) {
+             return "".concat(d.id, "-").concat(d.status || 0);
+           }); // exit
+
+           saveSection.exit().remove(); // enter
+
+           var saveSectionEnter = saveSection.enter().append('div').attr('class', 'qa-save save-section cf');
+           saveSectionEnter.append('h4').attr('class', '.qa-save-header').call(_t.append('note.newComment'));
+           saveSectionEnter.append('textarea').attr('class', 'new-comment-input').attr('placeholder', _t('QA.keepRight.comment_placeholder')).attr('maxlength', 1000).property('value', function (d) {
+             return d.newComment;
+           }).call(utilNoAuto).on('input', changeInput).on('blur', changeInput); // update
+
+           saveSection = saveSectionEnter.merge(saveSection).call(qaSaveButtons);
+
+           function changeInput() {
+             var input = select(this);
+             var val = input.property('value').trim();
+
+             if (val === '') {
+               val = undefined;
+             } // store the unsaved comment with the issue itself
+
+
+             _qaItem = _qaItem.update({
+               newComment: val
+             });
+             var qaService = services.improveOSM;
+
+             if (qaService) {
+               qaService.replaceItem(_qaItem);
+             }
+
+             saveSection.call(qaSaveButtons);
+           }
+         }
+
+         function qaSaveButtons(selection) {
+           var isSelected = _qaItem && _qaItem.id === context.selectedErrorID();
+
+           var buttonSection = selection.selectAll('.buttons').data(isSelected ? [_qaItem] : [], function (d) {
+             return d.status + d.id;
+           }); // exit
+
+           buttonSection.exit().remove(); // enter
+
+           var buttonEnter = buttonSection.enter().append('div').attr('class', 'buttons');
+           buttonEnter.append('button').attr('class', 'button comment-button action').call(_t.append('QA.keepRight.save_comment'));
+           buttonEnter.append('button').attr('class', 'button close-button action');
+           buttonEnter.append('button').attr('class', 'button ignore-button action'); // update
+
+           buttonSection = buttonSection.merge(buttonEnter);
+           buttonSection.select('.comment-button').attr('disabled', function (d) {
+             return d.newComment ? null : true;
+           }).on('click.comment', function (d3_event, d) {
+             this.blur(); // avoid keeping focus on the button - #4641
+
+             var qaService = services.improveOSM;
+
+             if (qaService) {
+               qaService.postUpdate(d, function (err, item) {
+                 return dispatch.call('change', item);
+               });
+             }
+           });
+           buttonSection.select('.close-button').html(function (d) {
+             var andComment = d.newComment ? '_comment' : '';
+             return _t.html("QA.keepRight.close".concat(andComment));
+           }).on('click.close', function (d3_event, d) {
+             this.blur(); // avoid keeping focus on the button - #4641
+
+             var qaService = services.improveOSM;
+
+             if (qaService) {
+               d.newStatus = 'SOLVED';
+               qaService.postUpdate(d, function (err, item) {
+                 return dispatch.call('change', item);
+               });
+             }
+           });
+           buttonSection.select('.ignore-button').html(function (d) {
+             var andComment = d.newComment ? '_comment' : '';
+             return _t.html("QA.keepRight.ignore".concat(andComment));
+           }).on('click.ignore', function (d3_event, d) {
+             this.blur(); // avoid keeping focus on the button - #4641
+
+             var qaService = services.improveOSM;
+
+             if (qaService) {
+               d.newStatus = 'INVALID';
+               qaService.postUpdate(d, function (err, item) {
+                 return dispatch.call('change', item);
+               });
+             }
+           });
+         } // NOTE: Don't change method name until UI v3 is merged
+
+
+         improveOsmEditor.error = function (val) {
+           if (!arguments.length) return _qaItem;
+           _qaItem = val;
+           return improveOsmEditor;
+         };
+
+         return utilRebind(improveOsmEditor, dispatch, 'on');
+       }
+
+       function uiPresetList(context) {
+         var dispatch = dispatch$8('cancel', 'choose');
+
+         var _entityIDs;
+
+         var _currLoc;
+
+         var _currentPresets;
+
+         var _autofocus = false;
+
+         function presetList(selection) {
+           if (!_entityIDs) return;
+           var presets = _mainPresetIndex.matchAllGeometry(entityGeometries());
+           selection.html('');
+           var messagewrap = selection.append('div').attr('class', 'header fillL');
+           var message = messagewrap.append('h2').call(_t.append('inspector.choose'));
+           var direction = _mainLocalizer.textDirection() === 'rtl' ? 'backward' : 'forward';
+           messagewrap.append('button').attr('class', 'preset-choose').attr('title', direction).on('click', function () {
+             dispatch.call('cancel', this);
+           }).call(svgIcon("#iD-icon-".concat(direction)));
+
+           function initialKeydown(d3_event) {
+             // hack to let delete shortcut work when search is autofocused
+             if (search.property('value').length === 0 && (d3_event.keyCode === utilKeybinding.keyCodes['⌫'] || d3_event.keyCode === utilKeybinding.keyCodes['⌦'])) {
+               d3_event.preventDefault();
+               d3_event.stopPropagation();
+               operationDelete(context, _entityIDs)(); // hack to let undo work when search is autofocused
+             } else if (search.property('value').length === 0 && (d3_event.ctrlKey || d3_event.metaKey) && d3_event.keyCode === utilKeybinding.keyCodes.z) {
+               d3_event.preventDefault();
+               d3_event.stopPropagation();
+               context.undo();
+             } else if (!d3_event.ctrlKey && !d3_event.metaKey) {
+               // don't check for delete/undo hack on future keydown events
+               select(this).on('keydown', keydown);
+               keydown.call(this, d3_event);
+             }
+           }
+
+           function keydown(d3_event) {
+             // down arrow
+             if (d3_event.keyCode === utilKeybinding.keyCodes['↓'] && // if insertion point is at the end of the string
+             search.node().selectionStart === search.property('value').length) {
+               d3_event.preventDefault();
+               d3_event.stopPropagation(); // move focus to the first item in the preset list
+
+               var buttons = list.selectAll('.preset-list-button');
+               if (!buttons.empty()) buttons.nodes()[0].focus();
+             }
+           }
+
+           function keypress(d3_event) {
+             // enter
+             var value = search.property('value');
+
+             if (d3_event.keyCode === 13 && // ↩ Return
+             value.length) {
+               list.selectAll('.preset-list-item:first-child').each(function (d) {
+                 d.choose.call(this);
+               });
+             }
+           }
+
+           function inputevent() {
+             var value = search.property('value');
+             list.classed('filtered', value.length);
+             var results, messageText;
+
+             if (value.length) {
+               results = presets.search(value, entityGeometries()[0], _currLoc);
+               messageText = _t.html('inspector.results', {
+                 n: results.collection.length,
+                 search: value
+               });
+             } else {
+               results = _mainPresetIndex.defaults(entityGeometries()[0], 36, !context.inIntro(), _currLoc);
+               messageText = _t.html('inspector.choose');
+             }
+
+             list.call(drawList, results);
+             message.html(messageText);
+           }
+
+           var searchWrap = selection.append('div').attr('class', 'search-header');
+           searchWrap.call(svgIcon('#iD-icon-search', 'pre-text'));
+           var search = searchWrap.append('input').attr('class', 'preset-search-input').attr('placeholder', _t('inspector.search')).attr('type', 'search').call(utilNoAuto).on('keydown', initialKeydown).on('keypress', keypress).on('input', debounce(inputevent));
+
+           if (_autofocus) {
+             search.node().focus(); // Safari 14 doesn't always like to focus immediately,
+             // so try again on the next pass
+
+             setTimeout(function () {
+               search.node().focus();
+             }, 0);
+           }
+
+           var listWrap = selection.append('div').attr('class', 'inspector-body');
+           var list = listWrap.append('div').attr('class', 'preset-list').call(drawList, _mainPresetIndex.defaults(entityGeometries()[0], 36, !context.inIntro(), _currLoc));
+           context.features().on('change.preset-list', updateForFeatureHiddenState);
+         }
+
+         function drawList(list, presets) {
+           presets = presets.matchAllGeometry(entityGeometries());
+           var collection = presets.collection.reduce(function (collection, preset) {
+             if (!preset) return collection;
+
+             if (preset.members) {
+               if (preset.members.collection.filter(function (preset) {
+                 return preset.addable();
+               }).length > 1) {
+                 collection.push(CategoryItem(preset));
+               }
+             } else if (preset.addable()) {
+               collection.push(PresetItem(preset));
+             }
+
+             return collection;
+           }, []);
+           var items = list.selectAll('.preset-list-item').data(collection, function (d) {
+             return d.preset.id;
+           });
+           items.order();
+           items.exit().remove();
+           items.enter().append('div').attr('class', function (item) {
+             return 'preset-list-item preset-' + item.preset.id.replace('/', '-');
+           }).classed('current', function (item) {
+             return _currentPresets.indexOf(item.preset) !== -1;
+           }).each(function (item) {
+             select(this).call(item);
+           }).style('opacity', 0).transition().style('opacity', 1);
+           updateForFeatureHiddenState();
+         }
+
+         function itemKeydown(d3_event) {
+           // the actively focused item
+           var item = select(this.closest('.preset-list-item'));
+           var parentItem = select(item.node().parentNode.closest('.preset-list-item')); // arrow down, move focus to the next, lower item
+
+           if (d3_event.keyCode === utilKeybinding.keyCodes['↓']) {
+             d3_event.preventDefault();
+             d3_event.stopPropagation(); // the next item in the list at the same level
+
+             var nextItem = select(item.node().nextElementSibling); // if there is no next item in this list
+
+             if (nextItem.empty()) {
+               // if there is a parent item
+               if (!parentItem.empty()) {
+                 // the item is the last item of a sublist,
+                 // select the next item at the parent level
+                 nextItem = select(parentItem.node().nextElementSibling);
+               } // if the focused item is expanded
+
+             } else if (select(this).classed('expanded')) {
+               // select the first subitem instead
+               nextItem = item.select('.subgrid .preset-list-item:first-child');
+             }
+
+             if (!nextItem.empty()) {
+               // focus on the next item
+               nextItem.select('.preset-list-button').node().focus();
+             } // arrow up, move focus to the previous, higher item
+
+           } else if (d3_event.keyCode === utilKeybinding.keyCodes['↑']) {
+             d3_event.preventDefault();
+             d3_event.stopPropagation(); // the previous item in the list at the same level
+
+             var previousItem = select(item.node().previousElementSibling); // if there is no previous item in this list
+
+             if (previousItem.empty()) {
+               // if there is a parent item
+               if (!parentItem.empty()) {
+                 // the item is the first subitem of a sublist select the parent item
+                 previousItem = parentItem;
+               } // if the previous item is expanded
+
+             } else if (previousItem.select('.preset-list-button').classed('expanded')) {
+               // select the last subitem of the sublist of the previous item
+               previousItem = previousItem.select('.subgrid .preset-list-item:last-child');
+             }
+
+             if (!previousItem.empty()) {
+               // focus on the previous item
+               previousItem.select('.preset-list-button').node().focus();
+             } else {
+               // the focus is at the top of the list, move focus back to the search field
+               var search = select(this.closest('.preset-list-pane')).select('.preset-search-input');
+               search.node().focus();
+             } // arrow left, move focus to the parent item if there is one
+
+           } else if (d3_event.keyCode === utilKeybinding.keyCodes[_mainLocalizer.textDirection() === 'rtl' ? '→' : '←']) {
+             d3_event.preventDefault();
+             d3_event.stopPropagation(); // if there is a parent item, focus on the parent item
+
+             if (!parentItem.empty()) {
+               parentItem.select('.preset-list-button').node().focus();
+             } // arrow right, choose this item
+
+           } else if (d3_event.keyCode === utilKeybinding.keyCodes[_mainLocalizer.textDirection() === 'rtl' ? '←' : '→']) {
+             d3_event.preventDefault();
+             d3_event.stopPropagation();
+             item.datum().choose.call(select(this).node());
+           }
+         }
+
+         function CategoryItem(preset) {
+           var box,
+               sublist,
+               shown = false;
+
+           function item(selection) {
+             var wrap = selection.append('div').attr('class', 'preset-list-button-wrap category');
+
+             function click() {
+               var isExpanded = select(this).classed('expanded');
+               var iconName = isExpanded ? _mainLocalizer.textDirection() === 'rtl' ? '#iD-icon-backward' : '#iD-icon-forward' : '#iD-icon-down';
+               select(this).classed('expanded', !isExpanded).attr('title', !isExpanded ? _t('icons.collapse') : _t('icons.expand'));
+               select(this).selectAll('div.label-inner svg.icon use').attr('href', iconName);
+               item.choose();
+             }
+
+             var geometries = entityGeometries();
+             var button = wrap.append('button').attr('class', 'preset-list-button').attr('title', _t('icons.expand')).classed('expanded', false).call(uiPresetIcon().geometry(geometries.length === 1 && geometries[0]).preset(preset)).on('click', click).on('keydown', function (d3_event) {
+               // right arrow, expand the focused item
+               if (d3_event.keyCode === utilKeybinding.keyCodes[_mainLocalizer.textDirection() === 'rtl' ? '←' : '→']) {
+                 d3_event.preventDefault();
+                 d3_event.stopPropagation(); // if the item isn't expanded
+
+                 if (!select(this).classed('expanded')) {
+                   // toggle expansion (expand the item)
+                   click.call(this, d3_event);
+                 } // left arrow, collapse the focused item
+
+               } else if (d3_event.keyCode === utilKeybinding.keyCodes[_mainLocalizer.textDirection() === 'rtl' ? '→' : '←']) {
+                 d3_event.preventDefault();
+                 d3_event.stopPropagation(); // if the item is expanded
+
+                 if (select(this).classed('expanded')) {
+                   // toggle expansion (collapse the item)
+                   click.call(this, d3_event);
+                 }
+               } else {
+                 itemKeydown.call(this, d3_event);
+               }
+             });
+             var label = button.append('div').attr('class', 'label').append('div').attr('class', 'label-inner');
+             label.append('div').attr('class', 'namepart').call(svgIcon(_mainLocalizer.textDirection() === 'rtl' ? '#iD-icon-backward' : '#iD-icon-forward', 'inline')).append('span').html(function () {
+               return preset.nameLabel() + '&hellip;';
+             });
+             box = selection.append('div').attr('class', 'subgrid').style('max-height', '0px').style('opacity', 0);
+             box.append('div').attr('class', 'arrow');
+             sublist = box.append('div').attr('class', 'preset-list fillL3');
+           }
+
+           item.choose = function () {
+             if (!box || !sublist) return;
+
+             if (shown) {
+               shown = false;
+               box.transition().duration(200).style('opacity', '0').style('max-height', '0px').style('padding-bottom', '0px');
+             } else {
+               shown = true;
+               var members = preset.members.matchAllGeometry(entityGeometries());
+               sublist.call(drawList, members);
+               box.transition().duration(200).style('opacity', '1').style('max-height', 200 + members.collection.length * 190 + 'px').style('padding-bottom', '10px');
+             }
+           };
+
+           item.preset = preset;
+           return item;
+         }
+
+         function PresetItem(preset) {
+           function item(selection) {
+             var wrap = selection.append('div').attr('class', 'preset-list-button-wrap');
+             var geometries = entityGeometries();
+             var button = wrap.append('button').attr('class', 'preset-list-button').call(uiPresetIcon().geometry(geometries.length === 1 && geometries[0]).preset(preset)).on('click', item.choose).on('keydown', itemKeydown);
+             var label = button.append('div').attr('class', 'label').append('div').attr('class', 'label-inner');
+             var nameparts = [preset.nameLabel(), preset.subtitleLabel()].filter(Boolean);
+             label.selectAll('.namepart').data(nameparts).enter().append('div').attr('class', 'namepart').html(function (d) {
+               return d;
+             });
+             wrap.call(item.reference.button);
+             selection.call(item.reference.body);
+           }
+
+           item.choose = function () {
+             if (select(this).classed('disabled')) return;
+
+             if (!context.inIntro()) {
+               _mainPresetIndex.setMostRecent(preset, entityGeometries()[0]);
+             }
+
+             context.perform(function (graph) {
+               for (var i in _entityIDs) {
+                 var entityID = _entityIDs[i];
+                 var oldPreset = _mainPresetIndex.match(graph.entity(entityID), graph);
+                 graph = actionChangePreset(entityID, oldPreset, preset)(graph);
+               }
+
+               return graph;
+             }, _t('operations.change_tags.annotation'));
+             context.validator().validate(); // rerun validation
+
+             dispatch.call('choose', this, preset);
+           };
+
+           item.help = function (d3_event) {
+             d3_event.stopPropagation();
+             item.reference.toggle();
+           };
+
+           item.preset = preset;
+           item.reference = uiTagReference(preset.reference());
+           return item;
+         }
+
+         function updateForFeatureHiddenState() {
+           if (!_entityIDs.every(context.hasEntity)) return;
+           var geometries = entityGeometries();
+           var button = context.container().selectAll('.preset-list .preset-list-button'); // remove existing tooltips
+
+           button.call(uiTooltip().destroyAny);
+           button.each(function (item, index) {
+             var hiddenPresetFeaturesId;
+
+             for (var i in geometries) {
+               hiddenPresetFeaturesId = context.features().isHiddenPreset(item.preset, geometries[i]);
+               if (hiddenPresetFeaturesId) break;
+             }
+
+             var isHiddenPreset = !context.inIntro() && !!hiddenPresetFeaturesId && (_currentPresets.length !== 1 || item.preset !== _currentPresets[0]);
+             select(this).classed('disabled', isHiddenPreset);
+
+             if (isHiddenPreset) {
+               var isAutoHidden = context.features().autoHidden(hiddenPresetFeaturesId);
+               select(this).call(uiTooltip().title(_t.html('inspector.hidden_preset.' + (isAutoHidden ? 'zoom' : 'manual'), {
+                 features: {
+                   html: _t.html('feature.' + hiddenPresetFeaturesId + '.description')
+                 }
+               })).placement(index < 2 ? 'bottom' : 'top'));
+             }
+           });
+         }
+
+         presetList.autofocus = function (val) {
+           if (!arguments.length) return _autofocus;
+           _autofocus = val;
+           return presetList;
+         };
+
+         presetList.entityIDs = function (val) {
+           if (!arguments.length) return _entityIDs;
+           _entityIDs = val;
+           _currLoc = null;
+
+           if (_entityIDs && _entityIDs.length) {
+             // calculate current location
+             var extent = _entityIDs.reduce(function (extent, entityID) {
+               var entity = context.graph().entity(entityID);
+               return extent.extend(entity.extent(context.graph()));
+             }, geoExtent());
+
+             _currLoc = extent.center(); // match presets
+
+             var presets = _entityIDs.map(function (entityID) {
+               return _mainPresetIndex.match(context.entity(entityID), context.graph());
+             });
+
+             presetList.presets(presets);
+           }
+
+           return presetList;
+         };
+
+         presetList.presets = function (val) {
+           if (!arguments.length) return _currentPresets;
+           _currentPresets = val;
+           return presetList;
+         };
+
+         function entityGeometries() {
+           var counts = {};
+
+           for (var i in _entityIDs) {
+             var entityID = _entityIDs[i];
+             var entity = context.entity(entityID);
+             var geometry = entity.geometry(context.graph()); // Treat entities on addr:interpolation lines as points, not vertices (#3241)
+
+             if (geometry === 'vertex' && entity.isOnAddressLine(context.graph())) {
+               geometry = 'point';
+             }
+
+             if (!counts[geometry]) counts[geometry] = 0;
+             counts[geometry] += 1;
+           }
+
+           return Object.keys(counts).sort(function (geom1, geom2) {
+             return counts[geom2] - counts[geom1];
+           });
+         }
+
+         return utilRebind(presetList, dispatch, 'on');
+       }
+
+       function uiViewOnOSM(context) {
+         var _what; // an osmEntity or osmNote
+
+
+         function viewOnOSM(selection) {
+           var url;
+
+           if (_what instanceof osmEntity) {
+             url = context.connection().entityURL(_what);
+           } else if (_what instanceof osmNote) {
+             url = context.connection().noteURL(_what);
+           }
+
+           var data = !_what || _what.isNew() ? [] : [_what];
+           var link = selection.selectAll('.view-on-osm').data(data, function (d) {
+             return d.id;
+           }); // exit
+
+           link.exit().remove(); // enter
+
+           var linkEnter = link.enter().append('a').attr('class', 'view-on-osm').attr('target', '_blank').attr('href', url).call(svgIcon('#iD-icon-out-link', 'inline'));
+           linkEnter.append('span').call(_t.append('inspector.view_on_osm'));
+         }
+
+         viewOnOSM.what = function (_) {
+           if (!arguments.length) return _what;
+           _what = _;
+           return viewOnOSM;
+         };
+
+         return viewOnOSM;
+       }
+
+       function uiInspector(context) {
+         var presetList = uiPresetList(context);
+         var entityEditor = uiEntityEditor(context);
+         var wrap = select(null),
+             presetPane = select(null),
+             editorPane = select(null);
+         var _state = 'select';
+
+         var _entityIDs;
+
+         var _newFeature = false;
+
+         function inspector(selection) {
+           presetList.entityIDs(_entityIDs).autofocus(_newFeature).on('choose', inspector.setPreset).on('cancel', function () {
+             inspector.setPreset();
+           });
+           entityEditor.state(_state).entityIDs(_entityIDs).on('choose', inspector.showList);
+           wrap = selection.selectAll('.panewrap').data([0]);
+           var enter = wrap.enter().append('div').attr('class', 'panewrap');
+           enter.append('div').attr('class', 'preset-list-pane pane');
+           enter.append('div').attr('class', 'entity-editor-pane pane');
+           wrap = wrap.merge(enter);
+           presetPane = wrap.selectAll('.preset-list-pane');
+           editorPane = wrap.selectAll('.entity-editor-pane');
+
+           function shouldDefaultToPresetList() {
+             // always show the inspector on hover
+             if (_state !== 'select') return false; // can only change preset on single selection
+
+             if (_entityIDs.length !== 1) return false;
+             var entityID = _entityIDs[0];
+             var entity = context.hasEntity(entityID);
+             if (!entity) return false; // default to inspector if there are already tags
+
+             if (entity.hasNonGeometryTags()) return false; // prompt to select preset if feature is new and untagged
+
+             if (_newFeature) return true; // all existing features except vertices should default to inspector
+
+             if (entity.geometry(context.graph()) !== 'vertex') return false; // show vertex relations if any
+
+             if (context.graph().parentRelations(entity).length) return false; // show vertex issues if there are any
+
+             if (context.validator().getEntityIssues(entityID).length) return false; // show turn retriction editor for junction vertices
+
+             if (entity.isHighwayIntersection(context.graph())) return false; // otherwise show preset list for uninteresting vertices
+
+             return true;
+           }
+
+           if (shouldDefaultToPresetList()) {
+             wrap.style('right', '-100%');
+             editorPane.classed('hide', true);
+             presetPane.classed('hide', false).call(presetList);
+           } else {
+             wrap.style('right', '0%');
+             presetPane.classed('hide', true);
+             editorPane.classed('hide', false).call(entityEditor);
+           }
+
+           var footer = selection.selectAll('.footer').data([0]);
+           footer = footer.enter().append('div').attr('class', 'footer').merge(footer);
+           footer.call(uiViewOnOSM(context).what(context.hasEntity(_entityIDs.length === 1 && _entityIDs[0])));
+         }
+
+         inspector.showList = function (presets) {
+           presetPane.classed('hide', false);
+           wrap.transition().styleTween('right', function () {
+             return interpolate$1('0%', '-100%');
+           }).on('end', function () {
+             editorPane.classed('hide', true);
+           });
+
+           if (presets) {
+             presetList.presets(presets);
+           }
+
+           presetPane.call(presetList.autofocus(true));
+         };
+
+         inspector.setPreset = function (preset) {
+           // upon setting multipolygon, go to the area preset list instead of the editor
+           if (preset && preset.id === 'type/multipolygon') {
+             presetPane.call(presetList.autofocus(true));
+           } else {
+             editorPane.classed('hide', false);
+             wrap.transition().styleTween('right', function () {
+               return interpolate$1('-100%', '0%');
+             }).on('end', function () {
+               presetPane.classed('hide', true);
+             });
+
+             if (preset) {
+               entityEditor.presets([preset]);
+             }
+
+             editorPane.call(entityEditor);
+           }
+         };
+
+         inspector.state = function (val) {
+           if (!arguments.length) return _state;
+           _state = val;
+           entityEditor.state(_state); // remove any old field help overlay that might have gotten attached to the inspector
+
+           context.container().selectAll('.field-help-body').remove();
+           return inspector;
+         };
+
+         inspector.entityIDs = function (val) {
+           if (!arguments.length) return _entityIDs;
+           _entityIDs = val;
+           return inspector;
+         };
+
+         inspector.newFeature = function (val) {
+           if (!arguments.length) return _newFeature;
+           _newFeature = val;
+           return inspector;
+         };
+
+         return inspector;
+       }
+
+       function uiKeepRightDetails(context) {
+         var _qaItem;
+
+         function issueDetail(d) {
+           var itemType = d.itemType,
+               parentIssueType = d.parentIssueType;
+           var unknown = {
+             html: _t.html('inspector.unknown')
+           };
+           var replacements = d.replacements || {};
+           replacements["default"] = unknown; // special key `default` works as a fallback string
+
+           var detail = _t.html("QA.keepRight.errorTypes.".concat(itemType, ".description"), replacements);
+
+           if (detail === unknown.html) {
+             detail = _t.html("QA.keepRight.errorTypes.".concat(parentIssueType, ".description"), replacements);
+           }
+
+           return detail;
+         }
+
+         function keepRightDetails(selection) {
+           var details = selection.selectAll('.error-details').data(_qaItem ? [_qaItem] : [], function (d) {
+             return "".concat(d.id, "-").concat(d.status || 0);
+           });
+           details.exit().remove();
+           var detailsEnter = details.enter().append('div').attr('class', 'error-details qa-details-container'); // description
+
+           var descriptionEnter = detailsEnter.append('div').attr('class', 'qa-details-subsection');
+           descriptionEnter.append('h4').call(_t.append('QA.keepRight.detail_description'));
+           descriptionEnter.append('div').attr('class', 'qa-details-description-text').html(issueDetail); // If there are entity links in the error message..
+
+           var relatedEntities = [];
+           descriptionEnter.selectAll('.error_entity_link, .error_object_link').attr('href', '#').each(function () {
+             var link = select(this);
+             var isObjectLink = link.classed('error_object_link');
+             var entityID = isObjectLink ? utilEntityRoot(_qaItem.objectType) + _qaItem.objectId : this.textContent;
+             var entity = context.hasEntity(entityID);
+             relatedEntities.push(entityID); // Add click handler
+
+             link.on('mouseenter', function () {
+               utilHighlightEntities([entityID], true, context);
+             }).on('mouseleave', function () {
+               utilHighlightEntities([entityID], false, context);
+             }).on('click', function (d3_event) {
+               d3_event.preventDefault();
+               utilHighlightEntities([entityID], false, context);
+               var osmlayer = context.layers().layer('osm');
+
+               if (!osmlayer.enabled()) {
+                 osmlayer.enabled(true);
+               }
+
+               context.map().centerZoomEase(_qaItem.loc, 20);
+
+               if (entity) {
+                 context.enter(modeSelect(context, [entityID]));
+               } else {
+                 context.loadEntity(entityID, function (err, result) {
+                   if (err) return;
+                   var entity = result.data.find(function (e) {
+                     return e.id === entityID;
+                   });
+                   if (entity) context.enter(modeSelect(context, [entityID]));
+                 });
+               }
+             }); // Replace with friendly name if possible
+             // (The entity may not yet be loaded into the graph)
+
+             if (entity) {
+               var name = utilDisplayName(entity); // try to use common name
+
+               if (!name && !isObjectLink) {
+                 var preset = _mainPresetIndex.match(entity, context.graph());
+                 name = preset && !preset.isFallback() && preset.name(); // fallback to preset name
+               }
+
+               if (name) {
+                 this.innerText = name;
+               }
+             }
+           }); // Don't hide entities related to this issue - #5880
+
+           context.features().forceVisible(relatedEntities);
+           context.map().pan([0, 0]); // trigger a redraw
+         }
+
+         keepRightDetails.issue = function (val) {
+           if (!arguments.length) return _qaItem;
+           _qaItem = val;
+           return keepRightDetails;
+         };
+
+         return keepRightDetails;
+       }
+
+       function uiKeepRightHeader() {
+         var _qaItem;
+
+         function issueTitle(d) {
+           var itemType = d.itemType,
+               parentIssueType = d.parentIssueType;
+           var unknown = _t.html('inspector.unknown');
+           var replacements = d.replacements || {};
+           replacements["default"] = {
+             html: unknown
+           }; // special key `default` works as a fallback string
+
+           var title = _t.html("QA.keepRight.errorTypes.".concat(itemType, ".title"), replacements);
+
+           if (title !== unknown) {
+             return _t.apply("QA.keepRight.errorTypes.".concat(itemType, ".title"), replacements);
+           } else {
+             return _t.apply("QA.keepRight.errorTypes.".concat(parentIssueType, ".title"), replacements);
+           }
+         }
+
+         function keepRightHeader(selection) {
+           var header = selection.selectAll('.qa-header').data(_qaItem ? [_qaItem] : [], function (d) {
+             return "".concat(d.id, "-").concat(d.status || 0);
+           });
+           header.exit().remove();
+           var headerEnter = header.enter().append('div').attr('class', 'qa-header');
+           var iconEnter = headerEnter.append('div').attr('class', 'qa-header-icon').classed('new', function (d) {
+             return d.id < 0;
+           });
+           iconEnter.append('div').attr('class', function (d) {
+             return "preset-icon-28 qaItem ".concat(d.service, " itemId-").concat(d.id, " itemType-").concat(d.parentIssueType);
+           }).call(svgIcon('#iD-icon-bolt', 'qaItem-fill'));
+           headerEnter.append('div').attr('class', 'qa-header-label').html(issueTitle);
+         }
+
+         keepRightHeader.issue = function (val) {
+           if (!arguments.length) return _qaItem;
+           _qaItem = val;
+           return keepRightHeader;
+         };
+
+         return keepRightHeader;
+       }
+
+       function uiViewOnKeepRight() {
+         var _qaItem;
+
+         function viewOnKeepRight(selection) {
+           var url;
+
+           if (services.keepRight && _qaItem instanceof QAItem) {
+             url = services.keepRight.issueURL(_qaItem);
+           }
+
+           var link = selection.selectAll('.view-on-keepRight').data(url ? [url] : []); // exit
+
+           link.exit().remove(); // enter
+
+           var linkEnter = link.enter().append('a').attr('class', 'view-on-keepRight').attr('target', '_blank').attr('rel', 'noopener') // security measure
+           .attr('href', function (d) {
+             return d;
+           }).call(svgIcon('#iD-icon-out-link', 'inline'));
+           linkEnter.append('span').call(_t.append('inspector.view_on_keepRight'));
+         }
+
+         viewOnKeepRight.what = function (val) {
+           if (!arguments.length) return _qaItem;
+           _qaItem = val;
+           return viewOnKeepRight;
+         };
+
+         return viewOnKeepRight;
+       }
+
+       function uiKeepRightEditor(context) {
+         var dispatch = dispatch$8('change');
+         var qaDetails = uiKeepRightDetails(context);
+         var qaHeader = uiKeepRightHeader();
+
+         var _qaItem;
+
+         function keepRightEditor(selection) {
+           var headerEnter = selection.selectAll('.header').data([0]).enter().append('div').attr('class', 'header fillL');
+           headerEnter.append('button').attr('class', 'close').attr('title', _t('icons.close')).on('click', function () {
+             return context.enter(modeBrowse(context));
+           }).call(svgIcon('#iD-icon-close'));
+           headerEnter.append('h2').call(_t.append('QA.keepRight.title'));
+           var body = selection.selectAll('.body').data([0]);
+           body = body.enter().append('div').attr('class', 'body').merge(body);
+           var editor = body.selectAll('.qa-editor').data([0]);
+           editor.enter().append('div').attr('class', 'modal-section qa-editor').merge(editor).call(qaHeader.issue(_qaItem)).call(qaDetails.issue(_qaItem)).call(keepRightSaveSection);
+           var footer = selection.selectAll('.footer').data([0]);
+           footer.enter().append('div').attr('class', 'footer').merge(footer).call(uiViewOnKeepRight().what(_qaItem));
+         }
+
+         function keepRightSaveSection(selection) {
+           var isSelected = _qaItem && _qaItem.id === context.selectedErrorID();
+
+           var isShown = _qaItem && (isSelected || _qaItem.newComment || _qaItem.comment);
+           var saveSection = selection.selectAll('.qa-save').data(isShown ? [_qaItem] : [], function (d) {
+             return "".concat(d.id, "-").concat(d.status || 0);
+           }); // exit
+
+           saveSection.exit().remove(); // enter
+
+           var saveSectionEnter = saveSection.enter().append('div').attr('class', 'qa-save save-section cf');
+           saveSectionEnter.append('h4').attr('class', '.qa-save-header').call(_t.append('QA.keepRight.comment'));
+           saveSectionEnter.append('textarea').attr('class', 'new-comment-input').attr('placeholder', _t('QA.keepRight.comment_placeholder')).attr('maxlength', 1000).property('value', function (d) {
+             return d.newComment || d.comment;
+           }).call(utilNoAuto).on('input', changeInput).on('blur', changeInput); // update
+
+           saveSection = saveSectionEnter.merge(saveSection).call(qaSaveButtons);
+
+           function changeInput() {
+             var input = select(this);
+             var val = input.property('value').trim();
+
+             if (val === _qaItem.comment) {
+               val = undefined;
+             } // store the unsaved comment with the issue itself
+
+
+             _qaItem = _qaItem.update({
+               newComment: val
+             });
+             var qaService = services.keepRight;
+
+             if (qaService) {
+               qaService.replaceItem(_qaItem); // update keepright cache
+             }
+
+             saveSection.call(qaSaveButtons);
+           }
+         }
+
+         function qaSaveButtons(selection) {
+           var isSelected = _qaItem && _qaItem.id === context.selectedErrorID();
+
+           var buttonSection = selection.selectAll('.buttons').data(isSelected ? [_qaItem] : [], function (d) {
+             return d.status + d.id;
+           }); // exit
+
+           buttonSection.exit().remove(); // enter
+
+           var buttonEnter = buttonSection.enter().append('div').attr('class', 'buttons');
+           buttonEnter.append('button').attr('class', 'button comment-button action').call(_t.append('QA.keepRight.save_comment'));
+           buttonEnter.append('button').attr('class', 'button close-button action');
+           buttonEnter.append('button').attr('class', 'button ignore-button action'); // update
+
+           buttonSection = buttonSection.merge(buttonEnter);
+           buttonSection.select('.comment-button') // select and propagate data
+           .attr('disabled', function (d) {
+             return d.newComment ? null : true;
+           }).on('click.comment', function (d3_event, d) {
+             this.blur(); // avoid keeping focus on the button - #4641
+
+             var qaService = services.keepRight;
+
+             if (qaService) {
+               qaService.postUpdate(d, function (err, item) {
+                 return dispatch.call('change', item);
+               });
+             }
+           });
+           buttonSection.select('.close-button') // select and propagate data
+           .html(function (d) {
+             var andComment = d.newComment ? '_comment' : '';
+             return _t.html("QA.keepRight.close".concat(andComment));
+           }).on('click.close', function (d3_event, d) {
+             this.blur(); // avoid keeping focus on the button - #4641
+
+             var qaService = services.keepRight;
+
+             if (qaService) {
+               d.newStatus = 'ignore_t'; // ignore temporarily (item fixed)
+
+               qaService.postUpdate(d, function (err, item) {
+                 return dispatch.call('change', item);
+               });
+             }
+           });
+           buttonSection.select('.ignore-button') // select and propagate data
+           .html(function (d) {
+             var andComment = d.newComment ? '_comment' : '';
+             return _t.html("QA.keepRight.ignore".concat(andComment));
+           }).on('click.ignore', function (d3_event, d) {
+             this.blur(); // avoid keeping focus on the button - #4641
+
+             var qaService = services.keepRight;
+
+             if (qaService) {
+               d.newStatus = 'ignore'; // ignore permanently (false positive)
+
+               qaService.postUpdate(d, function (err, item) {
+                 return dispatch.call('change', item);
+               });
+             }
+           });
+         } // NOTE: Don't change method name until UI v3 is merged
+
+
+         keepRightEditor.error = function (val) {
+           if (!arguments.length) return _qaItem;
+           _qaItem = val;
+           return keepRightEditor;
+         };
+
+         return utilRebind(keepRightEditor, dispatch, 'on');
+       }
+
+       function uiLasso(context) {
+         var group, polygon;
+         lasso.coordinates = [];
+
+         function lasso(selection) {
+           context.container().classed('lasso', true);
+           group = selection.append('g').attr('class', 'lasso hide');
+           polygon = group.append('path').attr('class', 'lasso-path');
+           group.call(uiToggle(true));
+         }
+
+         function draw() {
+           if (polygon) {
+             polygon.data([lasso.coordinates]).attr('d', function (d) {
+               return 'M' + d.join(' L') + ' Z';
+             });
+           }
+         }
+
+         lasso.extent = function () {
+           return lasso.coordinates.reduce(function (extent, point) {
+             return extent.extend(geoExtent(point));
+           }, geoExtent());
+         };
+
+         lasso.p = function (_) {
+           if (!arguments.length) return lasso;
+           lasso.coordinates.push(_);
+           draw();
+           return lasso;
+         };
+
+         lasso.close = function () {
+           if (group) {
+             group.call(uiToggle(false, function () {
+               select(this).remove();
+             }));
+           }
+
+           context.container().classed('lasso', false);
+         };
+
+         return lasso;
+       }
+
+       function uiNoteComments() {
+         var _note;
+
+         function noteComments(selection) {
+           if (_note.isNew()) return; // don't draw .comments-container
+
+           var comments = selection.selectAll('.comments-container').data([0]);
+           comments = comments.enter().append('div').attr('class', 'comments-container').merge(comments);
+           var commentEnter = comments.selectAll('.comment').data(_note.comments).enter().append('div').attr('class', 'comment');
+           commentEnter.append('div').attr('class', function (d) {
+             return 'comment-avatar user-' + d.uid;
+           }).call(svgIcon('#iD-icon-avatar', 'comment-avatar-icon'));
+           var mainEnter = commentEnter.append('div').attr('class', 'comment-main');
+           var metadataEnter = mainEnter.append('div').attr('class', 'comment-metadata');
+           metadataEnter.append('div').attr('class', 'comment-author').each(function (d) {
+             var selection = select(this);
+             var osm = services.osm;
+
+             if (osm && d.user) {
+               selection = selection.append('a').attr('class', 'comment-author-link').attr('href', osm.userURL(d.user)).attr('target', '_blank');
+             }
+
+             if (d.user) {
+               selection.text(d.user);
+             } else {
+               selection.call(_t.append('note.anonymous'));
+             }
+           });
+           metadataEnter.append('div').attr('class', 'comment-date').html(function (d) {
+             return _t.html('note.status.' + d.action, {
+               when: localeDateString(d.date)
+             });
+           });
+           mainEnter.append('div').attr('class', 'comment-text').html(function (d) {
+             return d.html;
+           }).selectAll('a').attr('rel', 'noopener nofollow').attr('target', '_blank');
+           comments.call(replaceAvatars);
+         }
+
+         function replaceAvatars(selection) {
+           var showThirdPartyIcons = corePreferences('preferences.privacy.thirdpartyicons') || 'true';
+           var osm = services.osm;
+           if (showThirdPartyIcons !== 'true' || !osm) return;
+           var uids = {}; // gather uids in the comment thread
+
+           _note.comments.forEach(function (d) {
+             if (d.uid) uids[d.uid] = true;
+           });
+
+           Object.keys(uids).forEach(function (uid) {
+             osm.loadUser(uid, function (err, user) {
+               if (!user || !user.image_url) return;
+               selection.selectAll('.comment-avatar.user-' + uid).html('').append('img').attr('class', 'icon comment-avatar-icon').attr('src', user.image_url).attr('alt', user.display_name);
+             });
+           });
+         }
+
+         function localeDateString(s) {
+           if (!s) return null;
+           var options = {
+             day: 'numeric',
+             month: 'short',
+             year: 'numeric'
+           };
+           s = s.replace(/-/g, '/'); // fix browser-specific Date() issues
+
+           var d = new Date(s);
+           if (isNaN(d.getTime())) return null;
+           return d.toLocaleDateString(_mainLocalizer.localeCode(), options);
+         }
+
+         noteComments.note = function (val) {
+           if (!arguments.length) return _note;
+           _note = val;
+           return noteComments;
+         };
+
+         return noteComments;
+       }
+
+       function uiNoteHeader() {
+         var _note;
+
+         function noteHeader(selection) {
+           var header = selection.selectAll('.note-header').data(_note ? [_note] : [], function (d) {
+             return d.status + d.id;
+           });
+           header.exit().remove();
+           var headerEnter = header.enter().append('div').attr('class', 'note-header');
+           var iconEnter = headerEnter.append('div').attr('class', function (d) {
+             return 'note-header-icon ' + d.status;
+           }).classed('new', function (d) {
+             return d.id < 0;
+           });
+           iconEnter.append('div').attr('class', 'preset-icon-28').call(svgIcon('#iD-icon-note', 'note-fill'));
+           iconEnter.each(function (d) {
+             var statusIcon;
+
+             if (d.id < 0) {
+               statusIcon = '#iD-icon-plus';
+             } else if (d.status === 'open') {
+               statusIcon = '#iD-icon-close';
+             } else {
+               statusIcon = '#iD-icon-apply';
+             }
+
+             iconEnter.append('div').attr('class', 'note-icon-annotation').attr('title', _t('icons.close')).call(svgIcon(statusIcon, 'icon-annotation'));
+           });
+           headerEnter.append('div').attr('class', 'note-header-label').html(function (d) {
+             if (_note.isNew()) {
+               return _t.html('note.new');
+             }
+
+             return _t.html('note.note') + ' ' + d.id + ' ' + (d.status === 'closed' ? _t.html('note.closed') : '');
+           });
+         }
+
+         noteHeader.note = function (val) {
+           if (!arguments.length) return _note;
+           _note = val;
+           return noteHeader;
+         };
+
+         return noteHeader;
+       }
+
+       function uiNoteReport() {
+         var _note;
+
+         function noteReport(selection) {
+           var url;
+
+           if (services.osm && _note instanceof osmNote && !_note.isNew()) {
+             url = services.osm.noteReportURL(_note);
+           }
+
+           var link = selection.selectAll('.note-report').data(url ? [url] : []); // exit
+
+           link.exit().remove(); // enter
+
+           var linkEnter = link.enter().append('a').attr('class', 'note-report').attr('target', '_blank').attr('href', function (d) {
+             return d;
+           }).call(svgIcon('#iD-icon-out-link', 'inline'));
+           linkEnter.append('span').call(_t.append('note.report'));
+         }
+
+         noteReport.note = function (val) {
+           if (!arguments.length) return _note;
+           _note = val;
+           return noteReport;
+         };
+
+         return noteReport;
+       }
+
+       function uiNoteEditor(context) {
+         var dispatch = dispatch$8('change');
+         var noteComments = uiNoteComments();
+         var noteHeader = uiNoteHeader(); // var formFields = uiFormFields(context);
+
+         var _note;
+
+         var _newNote; // var _fieldsArr;
+
+
+         function noteEditor(selection) {
+           var header = selection.selectAll('.header').data([0]);
+           var headerEnter = header.enter().append('div').attr('class', 'header fillL');
+           headerEnter.append('button').attr('class', 'close').attr('title', _t('icons.close')).on('click', function () {
+             context.enter(modeBrowse(context));
+           }).call(svgIcon('#iD-icon-close'));
+           headerEnter.append('h2').call(_t.append('note.title'));
+           var body = selection.selectAll('.body').data([0]);
+           body = body.enter().append('div').attr('class', 'body').merge(body);
+           var editor = body.selectAll('.note-editor').data([0]);
+           editor.enter().append('div').attr('class', 'modal-section note-editor').merge(editor).call(noteHeader.note(_note)).call(noteComments.note(_note)).call(noteSaveSection);
+           var footer = selection.selectAll('.footer').data([0]);
+           footer.enter().append('div').attr('class', 'footer').merge(footer).call(uiViewOnOSM(context).what(_note)).call(uiNoteReport().note(_note)); // rerender the note editor on any auth change
+
+           var osm = services.osm;
+
+           if (osm) {
+             osm.on('change.note-save', function () {
+               selection.call(noteEditor);
+             });
+           }
+         }
+
+         function noteSaveSection(selection) {
+           var isSelected = _note && _note.id === context.selectedNoteID();
+
+           var noteSave = selection.selectAll('.note-save').data(isSelected ? [_note] : [], function (d) {
+             return d.status + d.id;
+           }); // exit
+
+           noteSave.exit().remove(); // enter
+
+           var noteSaveEnter = noteSave.enter().append('div').attr('class', 'note-save save-section cf'); // // if new note, show categories to pick from
+           // if (_note.isNew()) {
+           //     var presets = presetManager;
+           //     // NOTE: this key isn't a age and therefore there is no documentation (yet)
+           //     _fieldsArr = [
+           //         uiField(context, presets.field('category'), null, { show: true, revert: false }),
+           //     ];
+           //     _fieldsArr.forEach(function(field) {
+           //         field
+           //             .on('change', changeCategory);
+           //     });
+           //     noteSaveEnter
+           //         .append('div')
+           //         .attr('class', 'note-category')
+           //         .call(formFields.fieldsArr(_fieldsArr));
+           // }
+           // function changeCategory() {
+           //     // NOTE: perhaps there is a better way to get value
+           //     var val = context.container().select('input[name=\'category\']:checked').property('__data__') || undefined;
+           //     // store the unsaved category with the note itself
+           //     _note = _note.update({ newCategory: val });
+           //     var osm = services.osm;
+           //     if (osm) {
+           //         osm.replaceNote(_note);  // update note cache
+           //     }
+           //     noteSave
+           //         .call(noteSaveButtons);
+           // }
+
+           noteSaveEnter.append('h4').attr('class', '.note-save-header').html(function () {
+             return _note.isNew() ? _t.html('note.newDescription') : _t.html('note.newComment');
+           });
+           var commentTextarea = noteSaveEnter.append('textarea').attr('class', 'new-comment-input').attr('placeholder', _t('note.inputPlaceholder')).attr('maxlength', 1000).property('value', function (d) {
+             return d.newComment;
+           }).call(utilNoAuto).on('keydown.note-input', keydown).on('input.note-input', changeInput).on('blur.note-input', changeInput);
+
+           if (!commentTextarea.empty() && _newNote) {
+             // autofocus the comment field for new notes
+             commentTextarea.node().focus();
+           } // update
+
+
+           noteSave = noteSaveEnter.merge(noteSave).call(userDetails).call(noteSaveButtons); // fast submit if user presses cmd+enter
+
+           function keydown(d3_event) {
+             if (!(d3_event.keyCode === 13 && // ↩ Return
+             d3_event.metaKey)) return;
+             var osm = services.osm;
+             if (!osm) return;
+             var hasAuth = osm.authenticated();
+             if (!hasAuth) return;
+             if (!_note.newComment) return;
+             d3_event.preventDefault();
+             select(this).on('keydown.note-input', null); // focus on button and submit
+
+             window.setTimeout(function () {
+               if (_note.isNew()) {
+                 noteSave.selectAll('.save-button').node().focus();
+                 clickSave();
+               } else {
+                 noteSave.selectAll('.comment-button').node().focus();
+                 clickComment();
+               }
+             }, 10);
+           }
+
+           function changeInput() {
+             var input = select(this);
+             var val = input.property('value').trim() || undefined; // store the unsaved comment with the note itself
+
+             _note = _note.update({
+               newComment: val
+             });
+             var osm = services.osm;
+
+             if (osm) {
+               osm.replaceNote(_note); // update note cache
+             }
+
+             noteSave.call(noteSaveButtons);
+           }
+         }
+
+         function userDetails(selection) {
+           var detailSection = selection.selectAll('.detail-section').data([0]);
+           detailSection = detailSection.enter().append('div').attr('class', 'detail-section').merge(detailSection);
+           var osm = services.osm;
+           if (!osm) return; // Add warning if user is not logged in
+
+           var hasAuth = osm.authenticated();
+           var authWarning = detailSection.selectAll('.auth-warning').data(hasAuth ? [] : [0]);
+           authWarning.exit().transition().duration(200).style('opacity', 0).remove();
+           var authEnter = authWarning.enter().insert('div', '.tag-reference-body').attr('class', 'field-warning auth-warning').style('opacity', 0);
+           authEnter.call(svgIcon('#iD-icon-alert', 'inline'));
+           authEnter.append('span').call(_t.append('note.login'));
+           authEnter.append('a').attr('target', '_blank').call(svgIcon('#iD-icon-out-link', 'inline')).append('span').call(_t.append('login')).on('click.note-login', function (d3_event) {
+             d3_event.preventDefault();
+             osm.authenticate();
+           });
+           authEnter.transition().duration(200).style('opacity', 1);
+           var prose = detailSection.selectAll('.note-save-prose').data(hasAuth ? [0] : []);
+           prose.exit().remove();
+           prose = prose.enter().append('p').attr('class', 'note-save-prose').call(_t.append('note.upload_explanation')).merge(prose);
+           osm.userDetails(function (err, user) {
+             if (err) return;
+             var userLink = select(document.createElement('div'));
+
+             if (user.image_url) {
+               userLink.append('img').attr('src', user.image_url).attr('class', 'icon pre-text user-icon');
+             }
+
+             userLink.append('a').attr('class', 'user-info').text(user.display_name).attr('href', osm.userURL(user.display_name)).attr('target', '_blank');
+             prose.html(_t.html('note.upload_explanation_with_user', {
+               user: {
+                 html: userLink.html()
+               }
+             }));
+           });
+         }
+
+         function noteSaveButtons(selection) {
+           var osm = services.osm;
+           var hasAuth = osm && osm.authenticated();
+
+           var isSelected = _note && _note.id === context.selectedNoteID();
+
+           var buttonSection = selection.selectAll('.buttons').data(isSelected ? [_note] : [], function (d) {
+             return d.status + d.id;
+           }); // exit
+
+           buttonSection.exit().remove(); // enter
+
+           var buttonEnter = buttonSection.enter().append('div').attr('class', 'buttons');
+
+           if (_note.isNew()) {
+             buttonEnter.append('button').attr('class', 'button cancel-button secondary-action').call(_t.append('confirm.cancel'));
+             buttonEnter.append('button').attr('class', 'button save-button action').call(_t.append('note.save'));
+           } else {
+             buttonEnter.append('button').attr('class', 'button status-button action');
+             buttonEnter.append('button').attr('class', 'button comment-button action').call(_t.append('note.comment'));
+           } // update
+
+
+           buttonSection = buttonSection.merge(buttonEnter);
+           buttonSection.select('.cancel-button') // select and propagate data
+           .on('click.cancel', clickCancel);
+           buttonSection.select('.save-button') // select and propagate data
+           .attr('disabled', isSaveDisabled).on('click.save', clickSave);
+           buttonSection.select('.status-button') // select and propagate data
+           .attr('disabled', hasAuth ? null : true).html(function (d) {
+             var action = d.status === 'open' ? 'close' : 'open';
+             var andComment = d.newComment ? '_comment' : '';
+             return _t.html('note.' + action + andComment);
+           }).on('click.status', clickStatus);
+           buttonSection.select('.comment-button') // select and propagate data
+           .attr('disabled', isSaveDisabled).on('click.comment', clickComment);
+
+           function isSaveDisabled(d) {
+             return hasAuth && d.status === 'open' && d.newComment ? null : true;
+           }
+         }
+
+         function clickCancel(d3_event, d) {
+           this.blur(); // avoid keeping focus on the button - #4641
+
+           var osm = services.osm;
+
+           if (osm) {
+             osm.removeNote(d);
+           }
+
+           context.enter(modeBrowse(context));
+           dispatch.call('change');
+         }
+
+         function clickSave(d3_event, d) {
+           this.blur(); // avoid keeping focus on the button - #4641
+
+           var osm = services.osm;
+
+           if (osm) {
+             osm.postNoteCreate(d, function (err, note) {
+               dispatch.call('change', note);
+             });
+           }
+         }
+
+         function clickStatus(d3_event, d) {
+           this.blur(); // avoid keeping focus on the button - #4641
+
+           var osm = services.osm;
+
+           if (osm) {
+             var setStatus = d.status === 'open' ? 'closed' : 'open';
+             osm.postNoteUpdate(d, setStatus, function (err, note) {
+               dispatch.call('change', note);
+             });
+           }
+         }
+
+         function clickComment(d3_event, d) {
+           this.blur(); // avoid keeping focus on the button - #4641
+
+           var osm = services.osm;
+
+           if (osm) {
+             osm.postNoteUpdate(d, d.status, function (err, note) {
+               dispatch.call('change', note);
+             });
+           }
+         }
+
+         noteEditor.note = function (val) {
+           if (!arguments.length) return _note;
+           _note = val;
+           return noteEditor;
+         };
+
+         noteEditor.newNote = function (val) {
+           if (!arguments.length) return _newNote;
+           _newNote = val;
+           return noteEditor;
+         };
+
+         return utilRebind(noteEditor, dispatch, 'on');
+       }
+
+       function uiSourceSwitch(context) {
+         var keys;
+
+         function click(d3_event) {
+           d3_event.preventDefault();
+           var osm = context.connection();
+           if (!osm) return;
+           if (context.inIntro()) return;
+           if (context.history().hasChanges() && !window.confirm(_t('source_switch.lose_changes'))) return;
+           var isLive = select(this).classed('live');
+           isLive = !isLive;
+           context.enter(modeBrowse(context));
+           context.history().clearSaved(); // remove saved history
+
+           context.flush(); // remove stored data
+
+           select(this).html(isLive ? _t.html('source_switch.live') : _t.html('source_switch.dev')).classed('live', isLive).classed('chip', isLive);
+           osm["switch"](isLive ? keys[0] : keys[1]); // switch connection (warning: dispatches 'change' event)
+         }
+
+         var sourceSwitch = function sourceSwitch(selection) {
+           selection.append('a').attr('href', '#').call(_t.append('source_switch.live')).attr('class', 'live chip').on('click', click);
+         };
+
+         sourceSwitch.keys = function (_) {
+           if (!arguments.length) return keys;
+           keys = _;
+           return sourceSwitch;
+         };
+
+         return sourceSwitch;
+       }
+
+       function uiSpinner(context) {
+         var osm = context.connection();
+         return function (selection) {
+           var img = selection.append('img').attr('src', context.imagePath('loader-black.gif')).style('opacity', 0);
+
+           if (osm) {
+             osm.on('loading.spinner', function () {
+               img.transition().style('opacity', 1);
+             }).on('loaded.spinner', function () {
+               img.transition().style('opacity', 0);
+             });
+           }
+         };
+       }
+
+       function uiSectionPrivacy(context) {
+         var section = uiSection('preferences-third-party', context).label(_t.html('preferences.privacy.title')).disclosureContent(renderDisclosureContent);
+
+         function renderDisclosureContent(selection) {
+           // enter
+           selection.selectAll('.privacy-options-list').data([0]).enter().append('ul').attr('class', 'layer-list privacy-options-list');
+           var thirdPartyIconsEnter = selection.select('.privacy-options-list').selectAll('.privacy-third-party-icons-item').data([corePreferences('preferences.privacy.thirdpartyicons') || 'true']).enter().append('li').attr('class', 'privacy-third-party-icons-item').append('label').call(uiTooltip().title(_t.html('preferences.privacy.third_party_icons.tooltip')).placement('bottom'));
+           thirdPartyIconsEnter.append('input').attr('type', 'checkbox').on('change', function (d3_event, d) {
+             d3_event.preventDefault();
+             corePreferences('preferences.privacy.thirdpartyicons', d === 'true' ? 'false' : 'true');
+           });
+           thirdPartyIconsEnter.append('span').call(_t.append('preferences.privacy.third_party_icons.description')); // update
+
+           selection.selectAll('.privacy-third-party-icons-item').classed('active', function (d) {
+             return d === 'true';
+           }).select('input').property('checked', function (d) {
+             return d === 'true';
+           }); // Privacy Policy link
+
+           selection.selectAll('.privacy-link').data([0]).enter().append('div').attr('class', 'privacy-link').append('a').attr('target', '_blank').call(svgIcon('#iD-icon-out-link', 'inline')).attr('href', 'https://github.com/openstreetmap/iD/blob/release/PRIVACY.md').append('span').call(_t.append('preferences.privacy.privacy_link'));
+         }
+
+         corePreferences.onChange('preferences.privacy.thirdpartyicons', section.reRender);
+         return section;
+       }
+
+       function uiSplash(context) {
+         return function (selection) {
+           // Exception - if there are restorable changes, skip this splash screen.
+           // This is because we currently only support one `uiModal` at a time
+           //  and we need to show them `uiRestore`` instead of this one.
+           if (context.history().hasRestorableChanges()) return; // If user has not seen this version of the privacy policy, show the splash again.
+
+           var updateMessage = '';
+           var sawPrivacyVersion = corePreferences('sawPrivacyVersion');
+           var showSplash = !corePreferences('sawSplash');
+
+           if (sawPrivacyVersion !== context.privacyVersion) {
+             updateMessage = _t('splash.privacy_update');
+             showSplash = true;
+           }
+
+           if (!showSplash) return;
+           corePreferences('sawSplash', true);
+           corePreferences('sawPrivacyVersion', context.privacyVersion); // fetch intro graph data now, while user is looking at the splash screen
+
+           _mainFileFetcher.get('intro_graph');
+           var modalSelection = uiModal(selection);
+           modalSelection.select('.modal').attr('class', 'modal-splash modal');
+           var introModal = modalSelection.select('.content').append('div').attr('class', 'fillL');
+           introModal.append('div').attr('class', 'modal-section').append('h3').call(_t.append('splash.welcome'));
+           var modalSection = introModal.append('div').attr('class', 'modal-section');
+           modalSection.append('p').html(_t.html('splash.text', {
+             version: context.version,
+             website: {
+               html: '<a target="_blank" href="https://github.com/openstreetmap/iD/blob/develop/CHANGELOG.md#whats-new">changelog</a>'
+             },
+             github: {
+               html: '<a target="_blank" href="https://github.com/openstreetmap/iD/issues">github.com</a>'
+             }
+           }));
+           modalSection.append('p').html(_t.html('splash.privacy', {
+             updateMessage: updateMessage,
+             privacyLink: {
+               html: '<a target="_blank" href="https://github.com/openstreetmap/iD/blob/release/PRIVACY.md">' + _t('splash.privacy_policy') + '</a>'
+             }
+           }));
+           uiSectionPrivacy(context).label(_t.html('splash.privacy_settings')).render(modalSection);
+           var buttonWrap = introModal.append('div').attr('class', 'modal-actions');
+           var walkthrough = buttonWrap.append('button').attr('class', 'walkthrough').on('click', function () {
+             context.container().call(uiIntro(context));
+             modalSelection.close();
+           });
+           walkthrough.append('svg').attr('class', 'logo logo-walkthrough').append('use').attr('xlink:href', '#iD-logo-walkthrough');
+           walkthrough.append('div').call(_t.append('splash.walkthrough'));
+           var startEditing = buttonWrap.append('button').attr('class', 'start-editing').on('click', modalSelection.close);
+           startEditing.append('svg').attr('class', 'logo logo-features').append('use').attr('xlink:href', '#iD-logo-features');
+           startEditing.append('div').call(_t.append('splash.start'));
+           modalSelection.select('button.close').attr('class', 'hide');
+         };
+       }
+
+       function uiStatus(context) {
+         var osm = context.connection();
+         return function (selection) {
+           if (!osm) return;
+
+           function update(err, apiStatus) {
+             selection.html('');
+
+             if (err) {
+               if (apiStatus === 'connectionSwitched') {
+                 // if the connection was just switched, we can't rely on
+                 // the status (we're getting the status of the previous api)
+                 return;
+               } else if (apiStatus === 'rateLimited') {
+                 selection.call(_t.append('osm_api_status.message.rateLimit')).append('a').attr('href', '#').attr('class', 'api-status-login').attr('target', '_blank').call(svgIcon('#iD-icon-out-link', 'inline')).append('span').call(_t.append('login')).on('click.login', function (d3_event) {
+                   d3_event.preventDefault();
+                   osm.authenticate();
+                 });
+               } else {
+                 // don't allow retrying too rapidly
+                 var throttledRetry = throttle(function () {
+                   // try loading the visible tiles
+                   context.loadTiles(context.projection); // manually reload the status too in case all visible tiles were already loaded
+
+                   osm.reloadApiStatus();
+                 }, 2000); // eslint-disable-next-line no-warning-comments
+                 // TODO: nice messages for different error types
+
+
+                 selection.call(_t.append('osm_api_status.message.error', {
+                   suffix: ' '
+                 })).append('a').attr('href', '#') // let the user manually retry their connection directly
+                 .call(_t.append('osm_api_status.retry')).on('click.retry', function (d3_event) {
+                   d3_event.preventDefault();
+                   throttledRetry();
+                 });
+               }
+             } else if (apiStatus === 'readonly') {
+               selection.call(_t.append('osm_api_status.message.readonly'));
+             } else if (apiStatus === 'offline') {
+               selection.call(_t.append('osm_api_status.message.offline'));
+             }
+
+             selection.attr('class', 'api-status ' + (err ? 'error' : apiStatus));
+           }
+
+           osm.on('apiStatusChange.uiStatus', update);
+           context.history().on('storage_error', function () {
+             selection.selectAll('span.local-storage-full').remove();
+             selection.append('span').attr('class', 'local-storage-full').call(_t.append('osm_api_status.message.local_storage_full'));
+             selection.classed('error', true);
+           }); // reload the status periodically regardless of other factors
+
+           window.setInterval(function () {
+             osm.reloadApiStatus();
+           }, 90000); // load the initial status in case no OSM data was loaded yet
+
+           osm.reloadApiStatus();
+         };
+       }
+
+       // for punction see https://stackoverflow.com/a/21224179
+
+       function simplify(str) {
+         if (typeof str !== 'string') return '';
+         return diacritics.remove(str.replace(/&/g, 'and').replace(/İ/ig, 'i').replace(/[\s\-=_!"#%'*{},.\/:;?\(\)\[\]@\\$\^*+<>«»~`’\u00a1\u00a7\u00b6\u00b7\u00bf\u037e\u0387\u055a-\u055f\u0589\u05c0\u05c3\u05c6\u05f3\u05f4\u0609\u060a\u060c\u060d\u061b\u061e\u061f\u066a-\u066d\u06d4\u0700-\u070d\u07f7-\u07f9\u0830-\u083e\u085e\u0964\u0965\u0970\u0af0\u0df4\u0e4f\u0e5a\u0e5b\u0f04-\u0f12\u0f14\u0f85\u0fd0-\u0fd4\u0fd9\u0fda\u104a-\u104f\u10fb\u1360-\u1368\u166d\u166e\u16eb-\u16ed\u1735\u1736\u17d4-\u17d6\u17d8-\u17da\u1800-\u1805\u1807-\u180a\u1944\u1945\u1a1e\u1a1f\u1aa0-\u1aa6\u1aa8-\u1aad\u1b5a-\u1b60\u1bfc-\u1bff\u1c3b-\u1c3f\u1c7e\u1c7f\u1cc0-\u1cc7\u1cd3\u200b-\u200f\u2016\u2017\u2020-\u2027\u2030-\u2038\u203b-\u203e\u2041-\u2043\u2047-\u2051\u2053\u2055-\u205e\u2cf9-\u2cfc\u2cfe\u2cff\u2d70\u2e00\u2e01\u2e06-\u2e08\u2e0b\u2e0e-\u2e16\u2e18\u2e19\u2e1b\u2e1e\u2e1f\u2e2a-\u2e2e\u2e30-\u2e39\u3001-\u3003\u303d\u30fb\ua4fe\ua4ff\ua60d-\ua60f\ua673\ua67e\ua6f2-\ua6f7\ua874-\ua877\ua8ce\ua8cf\ua8f8-\ua8fa\ua92e\ua92f\ua95f\ua9c1-\ua9cd\ua9de\ua9df\uaa5c-\uaa5f\uaade\uaadf\uaaf0\uaaf1\uabeb\ufe10-\ufe16\ufe19\ufe30\ufe45\ufe46\ufe49-\ufe4c\ufe50-\ufe52\ufe54-\ufe57\ufe5f-\ufe61\ufe68\ufe6a\ufe6b\ufeff\uff01-\uff03\uff05-\uff07\uff0a\uff0c\uff0e\uff0f\uff1a\uff1b\uff1f\uff20\uff3c\uff61\uff64\uff65]+/g, '').toLowerCase());
+       }
+
+       // `resolveStrings`
+       // Resolves the text strings for a given community index item
+       //
+       // Arguments
+       //   `item`:  Object containing the community index item
+       //   `defaults`: Object containing the community index default strings
+       //   `localizerFn?`: optional function we will call to do the localization.
+       //      This function should be like the iD `t()` function that
+       //      accepts a `stringID` and returns a localized string
+       //
+       // Returns
+       //   An Object containing all the resolved strings:
+       //   {
+       //     name:                     'talk-ru Mailing List',
+       //     url:                      'https://lists.openstreetmap.org/listinfo/talk-ru',
+       //     signupUrl:                'https://example.url/signup',
+       //     description:              'A one line description',
+       //     extendedDescription:      'Extended description',
+       //     nameHTML:                 '<a href="the url">the name</a>',
+       //     urlHTML:                  '<a href="the url">the url</a>',
+       //     signupUrlHTML:            '<a href="the signupUrl">the signupUrl</a>',
+       //     descriptionHTML:          the description, with urls and signupUrls linkified,
+       //     extendedDescriptionHTML:  the extendedDescription with urls and signupUrls linkified
+       //   }
+       //
+
+       function resolveStrings(item, defaults, localizerFn) {
+         var itemStrings = Object.assign({}, item.strings); // shallow clone
+
+         var defaultStrings = Object.assign({}, defaults[item.type]); // shallow clone
+
+         var anyToken = new RegExp(/(\{\w+\})/, 'gi'); // Pre-localize the item and default strings
+
+         if (localizerFn) {
+           if (itemStrings.community) {
+             var communityID = simplify(itemStrings.community);
+             itemStrings.community = localizerFn("_communities.".concat(communityID));
+           }
+
+           ['name', 'description', 'extendedDescription'].forEach(function (prop) {
+             if (defaultStrings[prop]) defaultStrings[prop] = localizerFn("_defaults.".concat(item.type, ".").concat(prop));
+             if (itemStrings[prop]) itemStrings[prop] = localizerFn("".concat(item.id, ".").concat(prop));
+           });
+         }
+
+         var replacements = {
+           account: item.account,
+           community: itemStrings.community,
+           signupUrl: itemStrings.signupUrl,
+           url: itemStrings.url
+         }; // Resolve URLs first (which may refer to {account})
+
+         if (!replacements.signupUrl) {
+           replacements.signupUrl = resolve(itemStrings.signupUrl || defaultStrings.signupUrl);
+         }
+
+         if (!replacements.url) {
+           replacements.url = resolve(itemStrings.url || defaultStrings.url);
+         }
+
+         var resolved = {
+           name: resolve(itemStrings.name || defaultStrings.name),
+           url: resolve(itemStrings.url || defaultStrings.url),
+           signupUrl: resolve(itemStrings.signupUrl || defaultStrings.signupUrl),
+           description: resolve(itemStrings.description || defaultStrings.description),
+           extendedDescription: resolve(itemStrings.extendedDescription || defaultStrings.extendedDescription)
+         }; // Generate linkified strings
+
+         resolved.nameHTML = linkify(resolved.url, resolved.name);
+         resolved.urlHTML = linkify(resolved.url);
+         resolved.signupUrlHTML = linkify(resolved.signupUrl);
+         resolved.descriptionHTML = resolve(itemStrings.description || defaultStrings.description, true);
+         resolved.extendedDescriptionHTML = resolve(itemStrings.extendedDescription || defaultStrings.extendedDescription, true);
+         return resolved;
+
+         function resolve(s, addLinks) {
+           if (!s) return undefined;
+           var result = s;
+
+           for (var key in replacements) {
+             var token = "{".concat(key, "}");
+             var regex = new RegExp(token, 'g');
+
+             if (regex.test(result)) {
+               var replacement = replacements[key];
+
+               if (!replacement) {
+                 throw new Error("Cannot resolve token: ".concat(token));
+               } else {
+                 if (addLinks && (key === 'signupUrl' || key === 'url')) {
+                   replacement = linkify(replacement);
+                 }
+
+                 result = result.replace(regex, replacement);
+               }
+             }
+           } // There shouldn't be any leftover tokens in a resolved string
+
+
+           var leftovers = result.match(anyToken);
+
+           if (leftovers) {
+             throw new Error("Cannot resolve tokens: ".concat(leftovers));
+           } // Linkify subreddits like `/r/openstreetmap`
+           // https://github.com/osmlab/osm-community-index/issues/82
+           // https://github.com/openstreetmap/iD/issues/4997
+
+
+           if (addLinks && item.type === 'reddit') {
+             result = result.replace(/(\/r\/\w+\/*)/i, function (match) {
+               return linkify(resolved.url, match);
+             });
+           }
+
+           return result;
+         }
+
+         function linkify(url, text) {
+           if (!url) return undefined;
+           text = text || url;
+           return "<a target=\"_blank\" href=\"".concat(url, "\">").concat(text, "</a>");
+         }
+       }
+
+       var _oci = null;
+       function uiSuccess(context) {
+         var MAXEVENTS = 2;
+         var dispatch = dispatch$8('cancel');
+
+         var _changeset;
+
+         var _location;
+
+         ensureOSMCommunityIndex(); // start fetching the data
+
+         function ensureOSMCommunityIndex() {
+           var data = _mainFileFetcher;
+           return Promise.all([data.get('oci_features'), data.get('oci_resources'), data.get('oci_defaults')]).then(function (vals) {
+             if (_oci) return _oci; // Merge Custom Features
+
+             if (vals[0] && Array.isArray(vals[0].features)) {
+               _mainLocations.mergeCustomGeoJSON(vals[0]);
+             }
+
+             var ociResources = Object.values(vals[1].resources);
+
+             if (ociResources.length) {
+               // Resolve all locationSet features.
+               return _mainLocations.mergeLocationSets(ociResources).then(function () {
+                 _oci = {
+                   resources: ociResources,
+                   defaults: vals[2].defaults
+                 };
+                 return _oci;
+               });
+             } else {
+               _oci = {
+                 resources: [],
+                 // no resources?
+                 defaults: vals[2].defaults
+               };
+               return _oci;
+             }
+           });
+         } // string-to-date parsing in JavaScript is weird
+
+
+         function parseEventDate(when) {
+           if (!when) return;
+           var raw = when.trim();
+           if (!raw) return;
+
+           if (!/Z$/.test(raw)) {
+             // if no trailing 'Z', add one
+             raw += 'Z'; // this forces date to be parsed as a UTC date
+           }
+
+           var parsed = new Date(raw);
+           return new Date(parsed.toUTCString().substr(0, 25)); // convert to local timezone
+         }
+
+         function success(selection) {
+           var header = selection.append('div').attr('class', 'header fillL');
+           header.append('h2').call(_t.append('success.just_edited'));
+           header.append('button').attr('class', 'close').attr('title', _t('icons.close')).on('click', function () {
+             return dispatch.call('cancel');
+           }).call(svgIcon('#iD-icon-close'));
+           var body = selection.append('div').attr('class', 'body save-success fillL');
+           var summary = body.append('div').attr('class', 'save-summary');
+           summary.append('h3').call(_t.append('success.thank_you' + (_location ? '_location' : ''), {
+             where: _location
+           }));
+           summary.append('p').call(_t.append('success.help_html')).append('a').attr('class', 'link-out').attr('target', '_blank').attr('href', _t('success.help_link_url')).call(svgIcon('#iD-icon-out-link', 'inline')).append('span').call(_t.append('success.help_link_text'));
+           var osm = context.connection();
+           if (!osm) return;
+           var changesetURL = osm.changesetURL(_changeset.id);
+           var table = summary.append('table').attr('class', 'summary-table');
+           var row = table.append('tr').attr('class', 'summary-row');
+           row.append('td').attr('class', 'cell-icon summary-icon').append('a').attr('target', '_blank').attr('href', changesetURL).append('svg').attr('class', 'logo-small').append('use').attr('xlink:href', '#iD-logo-osm');
+           var summaryDetail = row.append('td').attr('class', 'cell-detail summary-detail');
+           summaryDetail.append('a').attr('class', 'cell-detail summary-view-on-osm').attr('target', '_blank').attr('href', changesetURL).call(_t.append('success.view_on_osm'));
+           summaryDetail.append('div').html(_t.html('success.changeset_id', {
+             changeset_id: {
+               html: "<a href=\"".concat(changesetURL, "\" target=\"_blank\">").concat(_changeset.id, "</a>")
+             }
+           })); // Get OSM community index features intersecting the map..
+
+           ensureOSMCommunityIndex().then(function (oci) {
+             var loc = context.map().center();
+             var validLocations = _mainLocations.locationsAt(loc); // Gather the communities
+
+             var communities = [];
+             oci.resources.forEach(function (resource) {
+               var area = validLocations[resource.locationSetID];
+               if (!area) return; // Resolve strings
+
+               var localizer = function localizer(stringID) {
+                 return _t.html("community.".concat(stringID));
+               };
+
+               resource.resolved = resolveStrings(resource, oci.defaults, localizer);
+               communities.push({
+                 area: area,
+                 order: resource.order || 0,
+                 resource: resource
+               });
+             }); // sort communities by feature area ascending, community order descending
+
+             communities.sort(function (a, b) {
+               return a.area - b.area || b.order - a.order;
+             });
+             body.call(showCommunityLinks, communities.map(function (c) {
+               return c.resource;
+             }));
+           });
+         }
+
+         function showCommunityLinks(selection, resources) {
+           var communityLinks = selection.append('div').attr('class', 'save-communityLinks');
+           communityLinks.append('h3').call(_t.append('success.like_osm'));
+           var table = communityLinks.append('table').attr('class', 'community-table');
+           var row = table.selectAll('.community-row').data(resources);
+           var rowEnter = row.enter().append('tr').attr('class', 'community-row');
+           rowEnter.append('td').attr('class', 'cell-icon community-icon').append('a').attr('target', '_blank').attr('href', function (d) {
+             return d.resolved.url;
+           }).append('svg').attr('class', 'logo-small').append('use').attr('xlink:href', function (d) {
+             return "#community-".concat(d.type);
+           });
+           var communityDetail = rowEnter.append('td').attr('class', 'cell-detail community-detail');
+           communityDetail.each(showCommunityDetails);
+           communityLinks.append('div').attr('class', 'community-missing').call(_t.append('success.missing')).append('a').attr('class', 'link-out').attr('target', '_blank').call(svgIcon('#iD-icon-out-link', 'inline')).attr('href', 'https://github.com/osmlab/osm-community-index/issues').append('span').call(_t.append('success.tell_us'));
+         }
+
+         function showCommunityDetails(d) {
+           var selection = select(this);
+           var communityID = d.id;
+           selection.append('div').attr('class', 'community-name').html(d.resolved.nameHTML);
+           selection.append('div').attr('class', 'community-description').html(d.resolved.descriptionHTML); // Create an expanding section if any of these are present..
+
+           if (d.resolved.extendedDescriptionHTML || d.languageCodes && d.languageCodes.length) {
+             selection.append('div').call(uiDisclosure(context, "community-more-".concat(d.id), false).expanded(false).updatePreference(false).label(_t.html('success.more')).content(showMore));
+           }
+
+           var nextEvents = (d.events || []).map(function (event) {
+             event.date = parseEventDate(event.when);
+             return event;
+           }).filter(function (event) {
+             // date is valid and future (or today)
+             var t = event.date.getTime();
+             var now = new Date().setHours(0, 0, 0, 0);
+             return !isNaN(t) && t >= now;
+           }).sort(function (a, b) {
+             // sort by date ascending
+             return a.date < b.date ? -1 : a.date > b.date ? 1 : 0;
+           }).slice(0, MAXEVENTS); // limit number of events shown
+
+           if (nextEvents.length) {
+             selection.append('div').call(uiDisclosure(context, "community-events-".concat(d.id), false).expanded(false).updatePreference(false).label(_t.html('success.events')).content(showNextEvents)).select('.hide-toggle').append('span').attr('class', 'badge-text').text(nextEvents.length);
+           }
+
+           function showMore(selection) {
+             var more = selection.selectAll('.community-more').data([0]);
+             var moreEnter = more.enter().append('div').attr('class', 'community-more');
+
+             if (d.resolved.extendedDescriptionHTML) {
+               moreEnter.append('div').attr('class', 'community-extended-description').html(d.resolved.extendedDescriptionHTML);
+             }
+
+             if (d.languageCodes && d.languageCodes.length) {
+               var languageList = d.languageCodes.map(function (code) {
+                 return _mainLocalizer.languageName(code);
+               }).join(', ');
+               moreEnter.append('div').attr('class', 'community-languages').call(_t.append('success.languages', {
+                 languages: languageList
+               }));
+             }
+           }
+
+           function showNextEvents(selection) {
+             var events = selection.append('div').attr('class', 'community-events');
+             var item = events.selectAll('.community-event').data(nextEvents);
+             var itemEnter = item.enter().append('div').attr('class', 'community-event');
+             itemEnter.append('div').attr('class', 'community-event-name').append('a').attr('target', '_blank').attr('href', function (d) {
+               return d.url;
+             }).text(function (d) {
+               var name = d.name;
+
+               if (d.i18n && d.id) {
+                 name = _t("community.".concat(communityID, ".events.").concat(d.id, ".name"), {
+                   "default": name
+                 });
+               }
+
+               return name;
+             });
+             itemEnter.append('div').attr('class', 'community-event-when').text(function (d) {
+               var options = {
+                 weekday: 'short',
+                 day: 'numeric',
+                 month: 'short',
+                 year: 'numeric'
+               };
+
+               if (d.date.getHours() || d.date.getMinutes()) {
+                 // include time if it has one
+                 options.hour = 'numeric';
+                 options.minute = 'numeric';
+               }
+
+               return d.date.toLocaleString(_mainLocalizer.localeCode(), options);
+             });
+             itemEnter.append('div').attr('class', 'community-event-where').text(function (d) {
+               var where = d.where;
+
+               if (d.i18n && d.id) {
+                 where = _t("community.".concat(communityID, ".events.").concat(d.id, ".where"), {
+                   "default": where
+                 });
+               }
+
+               return where;
+             });
+             itemEnter.append('div').attr('class', 'community-event-description').text(function (d) {
+               var description = d.description;
+
+               if (d.i18n && d.id) {
+                 description = _t("community.".concat(communityID, ".events.").concat(d.id, ".description"), {
+                   "default": description
+                 });
+               }
+
+               return description;
+             });
+           }
+         }
+
+         success.changeset = function (val) {
+           if (!arguments.length) return _changeset;
+           _changeset = val;
+           return success;
+         };
+
+         success.location = function (val) {
+           if (!arguments.length) return _location;
+           _location = val;
+           return success;
+         };
+
+         return utilRebind(success, dispatch, 'on');
+       }
+
+       var sawVersion = null;
+       var isNewVersion = false;
+       var isNewUser = false;
+       function uiVersion(context) {
+         var currVersion = context.version;
+         var matchedVersion = currVersion.match(/\d+\.\d+\.\d+.*/);
+
+         if (sawVersion === null && matchedVersion !== null) {
+           if (corePreferences('sawVersion')) {
+             isNewUser = false;
+             isNewVersion = corePreferences('sawVersion') !== currVersion && currVersion.indexOf('-') === -1;
+           } else {
+             isNewUser = true;
+             isNewVersion = true;
+           }
+
+           corePreferences('sawVersion', currVersion);
+           sawVersion = currVersion;
+         }
+
+         return function (selection) {
+           selection.append('a').attr('target', '_blank').attr('href', 'https://github.com/openstreetmap/iD').text(currVersion); // only show new version indicator to users that have used iD before
+
+           if (isNewVersion && !isNewUser) {
+             selection.append('a').attr('class', 'badge').attr('target', '_blank').attr('href', 'https://github.com/openstreetmap/iD/blob/release/CHANGELOG.md#whats-new').call(svgIcon('#maki-gift-11')).call(uiTooltip().title(_t.html('version.whats_new', {
+               version: currVersion
+             })).placement('top').scrollContainer(context.container().select('.main-footer-wrap')));
+           }
+         };
+       }
+
+       function uiZoom(context) {
+         var zooms = [{
+           id: 'zoom-in',
+           icon: 'iD-icon-plus',
+           title: _t.html('zoom.in'),
+           action: zoomIn,
+           disabled: function disabled() {
+             return !context.map().canZoomIn();
+           },
+           disabledTitle: _t.html('zoom.disabled.in'),
+           key: '+'
+         }, {
+           id: 'zoom-out',
+           icon: 'iD-icon-minus',
+           title: _t.html('zoom.out'),
+           action: zoomOut,
+           disabled: function disabled() {
+             return !context.map().canZoomOut();
+           },
+           disabledTitle: _t.html('zoom.disabled.out'),
+           key: '-'
+         }];
+
+         function zoomIn(d3_event) {
+           if (d3_event.shiftKey) return;
+           d3_event.preventDefault();
+           context.map().zoomIn();
+         }
+
+         function zoomOut(d3_event) {
+           if (d3_event.shiftKey) return;
+           d3_event.preventDefault();
+           context.map().zoomOut();
+         }
+
+         function zoomInFurther(d3_event) {
+           if (d3_event.shiftKey) return;
+           d3_event.preventDefault();
+           context.map().zoomInFurther();
+         }
+
+         function zoomOutFurther(d3_event) {
+           if (d3_event.shiftKey) return;
+           d3_event.preventDefault();
+           context.map().zoomOutFurther();
+         }
+
+         return function (selection) {
+           var tooltipBehavior = uiTooltip().placement(_mainLocalizer.textDirection() === 'rtl' ? 'right' : 'left').title(function (d) {
+             if (d.disabled()) {
+               return d.disabledTitle;
+             }
+
+             return d.title;
+           }).keys(function (d) {
+             return [d.key];
+           });
+           var lastPointerUpType;
+           var buttons = selection.selectAll('button').data(zooms).enter().append('button').attr('class', function (d) {
+             return d.id;
+           }).on('pointerup.editor', function (d3_event) {
+             lastPointerUpType = d3_event.pointerType;
+           }).on('click.editor', function (d3_event, d) {
+             if (!d.disabled()) {
+               d.action(d3_event);
+             } else if (lastPointerUpType === 'touch' || lastPointerUpType === 'pen') {
+               context.ui().flash.duration(2000).iconName('#' + d.icon).iconClass('disabled').label(d.disabledTitle)();
+             }
+
+             lastPointerUpType = null;
+           }).call(tooltipBehavior);
+           buttons.each(function (d) {
+             select(this).call(svgIcon('#' + d.icon, 'light'));
+           });
+           utilKeybinding.plusKeys.forEach(function (key) {
+             context.keybinding().on([key], zoomIn);
+             context.keybinding().on([uiCmd('⌥' + key)], zoomInFurther);
+           });
+           utilKeybinding.minusKeys.forEach(function (key) {
+             context.keybinding().on([key], zoomOut);
+             context.keybinding().on([uiCmd('⌥' + key)], zoomOutFurther);
+           });
+
+           function updateButtonStates() {
+             buttons.classed('disabled', function (d) {
+               return d.disabled();
+             }).each(function () {
+               var selection = select(this);
+
+               if (!selection.select('.tooltip.in').empty()) {
+                 selection.call(tooltipBehavior.updateContent);
+               }
+             });
+           }
+
+           updateButtonStates();
+           context.map().on('move.uiZoom', updateButtonStates);
+         };
+       }
+
+       function uiSectionRawTagEditor(id, context) {
+         var section = uiSection(id, context).classes('raw-tag-editor').label(function () {
+           var count = Object.keys(_tags).filter(function (d) {
+             return d;
+           }).length;
+           return _t.html('inspector.title_count', {
+             title: {
+               html: _t.html('inspector.tags')
+             },
+             count: count
+           });
+         }).expandedByDefault(false).disclosureContent(renderDisclosureContent);
+         var taginfo = services.taginfo;
+         var dispatch = dispatch$8('change');
+         var availableViews = [{
+           id: 'list',
+           icon: '#fas-th-list'
+         }, {
+           id: 'text',
+           icon: '#fas-i-cursor'
+         }];
+
+         var _tagView = corePreferences('raw-tag-editor-view') || 'list'; // 'list, 'text'
+
+
+         var _readOnlyTags = []; // the keys in the order we want them to display
+
+         var _orderedKeys = [];
+         var _showBlank = false;
+         var _pendingChange = null;
+
+         var _state;
+
+         var _presets;
+
+         var _tags;
+
+         var _entityIDs;
+
+         var _didInteract = false;
+
+         function interacted() {
+           _didInteract = true;
+         }
+
+         function renderDisclosureContent(wrap) {
+           // remove deleted keys
+           _orderedKeys = _orderedKeys.filter(function (key) {
+             return _tags[key] !== undefined;
+           }); // When switching to a different entity or changing the state (hover/select)
+           // reorder the keys alphabetically.
+           // We trigger this by emptying the `_orderedKeys` array, then it will be rebuilt here.
+           // Otherwise leave their order alone - #5857, #5927
+
+           var all = Object.keys(_tags).sort();
+           var missingKeys = utilArrayDifference(all, _orderedKeys);
+
+           for (var i in missingKeys) {
+             _orderedKeys.push(missingKeys[i]);
+           } // assemble row data
+
+
+           var rowData = _orderedKeys.map(function (key, i) {
+             return {
+               index: i,
+               key: key,
+               value: _tags[key]
+             };
+           }); // append blank row last, if necessary
+
+
+           if (!rowData.length || _showBlank) {
+             _showBlank = false;
+             rowData.push({
+               index: rowData.length,
+               key: '',
+               value: ''
+             });
+           } // View Options
+
+
+           var options = wrap.selectAll('.raw-tag-options').data([0]);
+           options.exit().remove();
+           var optionsEnter = options.enter().insert('div', ':first-child').attr('class', 'raw-tag-options').attr('role', 'tablist');
+           var optionEnter = optionsEnter.selectAll('.raw-tag-option').data(availableViews, function (d) {
+             return d.id;
+           }).enter();
+           optionEnter.append('button').attr('class', function (d) {
+             return 'raw-tag-option raw-tag-option-' + d.id + (_tagView === d.id ? ' selected' : '');
+           }).attr('aria-selected', function (d) {
+             return _tagView === d.id;
+           }).attr('role', 'tab').attr('title', function (d) {
+             return _t('icons.' + d.id);
+           }).on('click', function (d3_event, d) {
+             _tagView = d.id;
+             corePreferences('raw-tag-editor-view', d.id);
+             wrap.selectAll('.raw-tag-option').classed('selected', function (datum) {
+               return datum === d;
+             }).attr('aria-selected', function (datum) {
+               return datum === d;
+             });
+             wrap.selectAll('.tag-text').classed('hide', d.id !== 'text').each(setTextareaHeight);
+             wrap.selectAll('.tag-list, .add-row').classed('hide', d.id !== 'list');
+           }).each(function (d) {
+             select(this).call(svgIcon(d.icon));
+           }); // View as Text
+
+           var textData = rowsToText(rowData);
+           var textarea = wrap.selectAll('.tag-text').data([0]);
+           textarea = textarea.enter().append('textarea').attr('class', 'tag-text' + (_tagView !== 'text' ? ' hide' : '')).call(utilNoAuto).attr('placeholder', _t('inspector.key_value')).attr('spellcheck', 'false').merge(textarea);
+           textarea.call(utilGetSetValue, textData).each(setTextareaHeight).on('input', setTextareaHeight).on('focus', interacted).on('blur', textChanged).on('change', textChanged); // View as List
+
+           var list = wrap.selectAll('.tag-list').data([0]);
+           list = list.enter().append('ul').attr('class', 'tag-list' + (_tagView !== 'list' ? ' hide' : '')).merge(list); // Container for the Add button
+
+           var addRowEnter = wrap.selectAll('.add-row').data([0]).enter().append('div').attr('class', 'add-row' + (_tagView !== 'list' ? ' hide' : ''));
+           addRowEnter.append('button').attr('class', 'add-tag').attr('aria-label', _t('inspector.add_to_tag')).call(svgIcon('#iD-icon-plus', 'light')).call(uiTooltip().title(_t.html('inspector.add_to_tag')).placement(_mainLocalizer.textDirection() === 'ltr' ? 'right' : 'left')).on('click', addTag);
+           addRowEnter.append('div').attr('class', 'space-value'); // preserve space
+
+           addRowEnter.append('div').attr('class', 'space-buttons'); // preserve space
+           // Tag list items
+
+           var items = list.selectAll('.tag-row').data(rowData, function (d) {
+             return d.key;
+           });
+           items.exit().each(unbind).remove(); // Enter
+
+           var itemsEnter = items.enter().append('li').attr('class', 'tag-row').classed('readonly', isReadOnly);
+           var innerWrap = itemsEnter.append('div').attr('class', 'inner-wrap');
+           innerWrap.append('div').attr('class', 'key-wrap').append('input').property('type', 'text').attr('class', 'key').call(utilNoAuto).on('focus', interacted).on('blur', keyChange).on('change', keyChange);
+           innerWrap.append('div').attr('class', 'value-wrap').append('input').property('type', 'text').attr('class', 'value').call(utilNoAuto).on('focus', interacted).on('blur', valueChange).on('change', valueChange).on('keydown.push-more', pushMore);
+           innerWrap.append('button').attr('class', 'form-field-button remove').attr('title', _t('icons.remove')).call(svgIcon('#iD-operation-delete')); // Update
+
+           items = items.merge(itemsEnter).sort(function (a, b) {
+             return a.index - b.index;
+           });
+           items.each(function (d) {
+             var row = select(this);
+             var key = row.select('input.key'); // propagate bound data
+
+             var value = row.select('input.value'); // propagate bound data
+
+             if (_entityIDs && taginfo && _state !== 'hover') {
+               bindTypeahead(key, value);
+             }
+
+             var referenceOptions = {
+               key: d.key
+             };
+
+             if (typeof d.value === 'string') {
+               referenceOptions.value = d.value;
+             }
+
+             var reference = uiTagReference(referenceOptions);
+
+             if (_state === 'hover') {
+               reference.showing(false);
+             }
+
+             row.select('.inner-wrap') // propagate bound data
+             .call(reference.button);
+             row.call(reference.body);
+             row.select('button.remove'); // propagate bound data
+           });
+           items.selectAll('input.key').attr('title', function (d) {
+             return d.key;
+           }).call(utilGetSetValue, function (d) {
+             return d.key;
+           }).attr('readonly', function (d) {
+             return isReadOnly(d) || null;
+           });
+           items.selectAll('input.value').attr('title', function (d) {
+             return Array.isArray(d.value) ? d.value.filter(Boolean).join('\n') : d.value;
+           }).classed('mixed', function (d) {
+             return Array.isArray(d.value);
+           }).attr('placeholder', function (d) {
+             return typeof d.value === 'string' ? null : _t('inspector.multiple_values');
+           }).call(utilGetSetValue, function (d) {
+             return typeof d.value === 'string' ? d.value : '';
+           }).attr('readonly', function (d) {
+             return isReadOnly(d) || null;
+           });
+           items.selectAll('button.remove').on(('PointerEvent' in window ? 'pointer' : 'mouse') + 'down', removeTag); // 'click' fires too late - #5878
+         }
+
+         function isReadOnly(d) {
+           for (var i = 0; i < _readOnlyTags.length; i++) {
+             if (d.key.match(_readOnlyTags[i]) !== null) {
+               return true;
+             }
+           }
+
+           return false;
+         }
+
+         function setTextareaHeight() {
+           if (_tagView !== 'text') return;
+           var selection = select(this);
+           var matches = selection.node().value.match(/\n/g);
+           var lineCount = 2 + Number(matches && matches.length);
+           var lineHeight = 20;
+           selection.style('height', lineCount * lineHeight + 'px');
+         }
+
+         function stringify(s) {
+           return JSON.stringify(s).slice(1, -1); // without leading/trailing "
+         }
+
+         function unstringify(s) {
+           var leading = '';
+           var trailing = '';
+
+           if (s.length < 1 || s.charAt(0) !== '"') {
+             leading = '"';
+           }
+
+           if (s.length < 2 || s.charAt(s.length - 1) !== '"' || s.charAt(s.length - 1) === '"' && s.charAt(s.length - 2) === '\\') {
+             trailing = '"';
+           }
+
+           return JSON.parse(leading + s + trailing);
+         }
+
+         function rowsToText(rows) {
+           var str = rows.filter(function (row) {
+             return row.key && row.key.trim() !== '';
+           }).map(function (row) {
+             var rawVal = row.value;
+             if (typeof rawVal !== 'string') rawVal = '*';
+             var val = rawVal ? stringify(rawVal) : '';
+             return stringify(row.key) + '=' + val;
+           }).join('\n');
+
+           if (_state !== 'hover' && str.length) {
+             return str + '\n';
+           }
+
+           return str;
+         }
+
+         function textChanged() {
+           var newText = this.value.trim();
+           var newTags = {};
+           newText.split('\n').forEach(function (row) {
+             var m = row.match(/^\s*([^=]+)=(.*)$/);
+
+             if (m !== null) {
+               var k = context.cleanTagKey(unstringify(m[1].trim()));
+               var v = context.cleanTagValue(unstringify(m[2].trim()));
+               newTags[k] = v;
+             }
+           });
+           var tagDiff = utilTagDiff(_tags, newTags);
+           if (!tagDiff.length) return;
+           _pendingChange = _pendingChange || {};
+           tagDiff.forEach(function (change) {
+             if (isReadOnly({
+               key: change.key
+             })) return; // skip unchanged multiselection placeholders
+
+             if (change.newVal === '*' && typeof change.oldVal !== 'string') return;
+
+             if (change.type === '-') {
+               _pendingChange[change.key] = undefined;
+             } else if (change.type === '+') {
+               _pendingChange[change.key] = change.newVal || '';
+             }
+           });
+
+           if (Object.keys(_pendingChange).length === 0) {
+             _pendingChange = null;
+             return;
+           }
+
+           scheduleChange();
+         }
+
+         function pushMore(d3_event) {
+           // if pressing Tab on the last value field with content, add a blank row
+           if (d3_event.keyCode === 9 && !d3_event.shiftKey && section.selection().selectAll('.tag-list li:last-child input.value').node() === this && utilGetSetValue(select(this))) {
+             addTag();
+           }
+         }
+
+         function bindTypeahead(key, value) {
+           if (isReadOnly(key.datum())) return;
+
+           if (Array.isArray(value.datum().value)) {
+             value.call(uiCombobox(context, 'tag-value').minItems(1).fetcher(function (value, callback) {
+               var keyString = utilGetSetValue(key);
+               if (!_tags[keyString]) return;
+
+               var data = _tags[keyString].filter(Boolean).map(function (tagValue) {
+                 return {
+                   value: tagValue,
+                   title: tagValue
+                 };
+               });
+
+               callback(data);
+             }));
+             return;
+           }
+
+           var geometry = context.graph().geometry(_entityIDs[0]);
+           key.call(uiCombobox(context, 'tag-key').fetcher(function (value, callback) {
+             taginfo.keys({
+               debounce: true,
+               geometry: geometry,
+               query: value
+             }, function (err, data) {
+               if (!err) {
+                 var filtered = data.filter(function (d) {
+                   return _tags[d.value] === undefined;
+                 });
+                 callback(sort(value, filtered));
+               }
+             });
+           }));
+           value.call(uiCombobox(context, 'tag-value').fetcher(function (value, callback) {
+             taginfo.values({
+               debounce: true,
+               key: utilGetSetValue(key),
+               geometry: geometry,
+               query: value
+             }, function (err, data) {
+               if (!err) callback(sort(value, data));
+             });
+           }));
+
+           function sort(value, data) {
+             var sameletter = [];
+             var other = [];
+
+             for (var i = 0; i < data.length; i++) {
+               if (data[i].value.substring(0, value.length) === value) {
+                 sameletter.push(data[i]);
+               } else {
+                 other.push(data[i]);
+               }
+             }
+
+             return sameletter.concat(other);
+           }
+         }
+
+         function unbind() {
+           var row = select(this);
+           row.selectAll('input.key').call(uiCombobox.off, context);
+           row.selectAll('input.value').call(uiCombobox.off, context);
+         }
+
+         function keyChange(d3_event, d) {
+           if (select(this).attr('readonly')) return;
+           var kOld = d.key; // exit if we are currently about to delete this row anyway - #6366
+
+           if (_pendingChange && _pendingChange.hasOwnProperty(kOld) && _pendingChange[kOld] === undefined) return;
+           var kNew = context.cleanTagKey(this.value.trim()); // allow no change if the key should be readonly
+
+           if (isReadOnly({
+             key: kNew
+           })) {
+             this.value = kOld;
+             return;
+           }
+
+           if (kNew && kNew !== kOld && _tags[kNew] !== undefined) {
+             // new key is already in use, switch focus to the existing row
+             this.value = kOld; // reset the key
+
+             section.selection().selectAll('.tag-list input.value').each(function (d) {
+               if (d.key === kNew) {
+                 // send focus to that other value combo instead
+                 var input = select(this).node();
+                 input.focus();
+                 input.select();
+               }
+             });
+             return;
+           }
+
+           _pendingChange = _pendingChange || {};
+
+           if (kOld) {
+             if (kOld === kNew) return; // a tag key was renamed
+
+             _pendingChange[kNew] = _pendingChange[kOld] || {
+               oldKey: kOld
+             };
+             _pendingChange[kOld] = undefined;
+           } else {
+             // a new tag was added
+             var row = this.parentNode.parentNode;
+             var inputVal = select(row).selectAll('input.value');
+             var vNew = context.cleanTagValue(utilGetSetValue(inputVal));
+             _pendingChange[kNew] = vNew;
+             utilGetSetValue(inputVal, vNew);
+           } // update the ordered key index so this row doesn't change position
+
+
+           var existingKeyIndex = _orderedKeys.indexOf(kOld);
+
+           if (existingKeyIndex !== -1) _orderedKeys[existingKeyIndex] = kNew;
+           d.key = kNew; // update datum to avoid exit/enter on tag update
+
+           this.value = kNew;
+           scheduleChange();
+         }
+
+         function valueChange(d3_event, d) {
+           if (isReadOnly(d)) return; // exit if this is a multiselection and no value was entered
+
+           if (typeof d.value !== 'string' && !this.value) return; // exit if we are currently about to delete this row anyway - #6366
+
+           if (_pendingChange && _pendingChange.hasOwnProperty(d.key) && _pendingChange[d.key] === undefined) return;
+           _pendingChange = _pendingChange || {};
+           _pendingChange[d.key] = context.cleanTagValue(this.value);
+           scheduleChange();
+         }
+
+         function removeTag(d3_event, d) {
+           if (isReadOnly(d)) return;
+
+           if (d.key === '') {
+             // removing the blank row
+             _showBlank = false;
+             section.reRender();
+           } else {
+             // remove the key from the ordered key index
+             _orderedKeys = _orderedKeys.filter(function (key) {
+               return key !== d.key;
+             });
+             _pendingChange = _pendingChange || {};
+             _pendingChange[d.key] = undefined;
+             scheduleChange();
+           }
+         }
+
+         function addTag() {
+           // Delay render in case this click is blurring an edited combo.
+           // Without the setTimeout, the `content` render would wipe out the pending tag change.
+           window.setTimeout(function () {
+             _showBlank = true;
+             section.reRender();
+             section.selection().selectAll('.tag-list li:last-child input.key').node().focus();
+           }, 20);
+         }
+
+         function scheduleChange() {
+           // Cache IDs in case the editor is reloaded before the change event is called. - #6028
+           var entityIDs = _entityIDs; // Delay change in case this change is blurring an edited combo. - #5878
+
+           window.setTimeout(function () {
+             if (!_pendingChange) return;
+             dispatch.call('change', this, entityIDs, _pendingChange);
+             _pendingChange = null;
+           }, 10);
+         }
+
+         section.state = function (val) {
+           if (!arguments.length) return _state;
+
+           if (_state !== val) {
+             _orderedKeys = [];
+             _state = val;
+           }
+
+           return section;
+         };
+
+         section.presets = function (val) {
+           if (!arguments.length) return _presets;
+           _presets = val;
+
+           if (_presets && _presets.length && _presets[0].isFallback()) {
+             section.disclosureExpanded(true); // don't collapse the disclosure if the mapper used the raw tag editor - #1881
+           } else if (!_didInteract) {
+             section.disclosureExpanded(null);
+           }
+
+           return section;
+         };
+
+         section.tags = function (val) {
+           if (!arguments.length) return _tags;
+           _tags = val;
+           return section;
+         };
+
+         section.entityIDs = function (val) {
+           if (!arguments.length) return _entityIDs;
+
+           if (!_entityIDs || !val || !utilArrayIdentical(_entityIDs, val)) {
+             _entityIDs = val;
+             _orderedKeys = [];
+           }
+
+           return section;
+         }; // pass an array of regular expressions to test against the tag key
+
+
+         section.readOnlyTags = function (val) {
+           if (!arguments.length) return _readOnlyTags;
+           _readOnlyTags = val;
+           return section;
+         };
+
+         return utilRebind(section, dispatch, 'on');
+       }
+
+       function uiDataEditor(context) {
+         var dataHeader = uiDataHeader();
+         var rawTagEditor = uiSectionRawTagEditor('custom-data-tag-editor', context).expandedByDefault(true).readOnlyTags([/./]);
+
+         var _datum;
+
+         function dataEditor(selection) {
+           var header = selection.selectAll('.header').data([0]);
+           var headerEnter = header.enter().append('div').attr('class', 'header fillL');
+           headerEnter.append('button').attr('class', 'close').attr('title', _t('icons.close')).on('click', function () {
+             context.enter(modeBrowse(context));
+           }).call(svgIcon('#iD-icon-close'));
+           headerEnter.append('h2').call(_t.append('map_data.title'));
+           var body = selection.selectAll('.body').data([0]);
+           body = body.enter().append('div').attr('class', 'body').merge(body);
+           var editor = body.selectAll('.data-editor').data([0]); // enter/update
+
+           editor.enter().append('div').attr('class', 'modal-section data-editor').merge(editor).call(dataHeader.datum(_datum));
+           var rte = body.selectAll('.raw-tag-editor').data([0]); // enter/update
+
+           rte.enter().append('div').attr('class', 'raw-tag-editor data-editor').merge(rte).call(rawTagEditor.tags(_datum && _datum.properties || {}).state('hover').render).selectAll('textarea.tag-text').attr('readonly', true).classed('readonly', true);
+         }
+
+         dataEditor.datum = function (val) {
+           if (!arguments.length) return _datum;
+           _datum = val;
+           return this;
+         };
+
+         return dataEditor;
+       }
+
+       function uiOsmoseDetails(context) {
+         var _qaItem;
+
+         function issueString(d, type) {
+           if (!d) return ''; // Issue strings are cached from Osmose API
+
+           var s = services.osmose.getStrings(d.itemType);
+           return type in s ? s[type] : '';
+         }
+
+         function osmoseDetails(selection) {
+           var details = selection.selectAll('.error-details').data(_qaItem ? [_qaItem] : [], function (d) {
+             return "".concat(d.id, "-").concat(d.status || 0);
+           });
+           details.exit().remove();
+           var detailsEnter = details.enter().append('div').attr('class', 'error-details qa-details-container'); // Description
+
+           if (issueString(_qaItem, 'detail')) {
+             var div = detailsEnter.append('div').attr('class', 'qa-details-subsection');
+             div.append('h4').call(_t.append('QA.keepRight.detail_description'));
+             div.append('p').attr('class', 'qa-details-description-text').html(function (d) {
+               return issueString(d, 'detail');
+             }).selectAll('a').attr('rel', 'noopener').attr('target', '_blank');
+           } // Elements (populated later as data is requested)
+
+
+           var detailsDiv = detailsEnter.append('div').attr('class', 'qa-details-subsection');
+           var elemsDiv = detailsEnter.append('div').attr('class', 'qa-details-subsection'); // Suggested Fix (mustn't exist for every issue type)
+
+           if (issueString(_qaItem, 'fix')) {
+             var _div = detailsEnter.append('div').attr('class', 'qa-details-subsection');
+
+             _div.append('h4').call(_t.append('QA.osmose.fix_title'));
+
+             _div.append('p').html(function (d) {
+               return issueString(d, 'fix');
+             }).selectAll('a').attr('rel', 'noopener').attr('target', '_blank');
+           } // Common Pitfalls (mustn't exist for every issue type)
+
+
+           if (issueString(_qaItem, 'trap')) {
+             var _div2 = detailsEnter.append('div').attr('class', 'qa-details-subsection');
+
+             _div2.append('h4').call(_t.append('QA.osmose.trap_title'));
+
+             _div2.append('p').html(function (d) {
+               return issueString(d, 'trap');
+             }).selectAll('a').attr('rel', 'noopener').attr('target', '_blank');
+           } // Save current item to check if UI changed by time request resolves
+
+
+           var thisItem = _qaItem;
+           services.osmose.loadIssueDetail(_qaItem).then(function (d) {
+             // No details to add if there are no associated issue elements
+             if (!d.elems || d.elems.length === 0) return; // Do nothing if UI has moved on by the time this resolves
+
+             if (context.selectedErrorID() !== thisItem.id && context.container().selectAll(".qaItem.osmose.hover.itemId-".concat(thisItem.id)).empty()) return; // Things like keys and values are dynamically added to a subtitle string
+
+             if (d.detail) {
+               detailsDiv.append('h4').call(_t.append('QA.osmose.detail_title'));
+               detailsDiv.append('p').html(function (d) {
+                 return d.detail;
+               }).selectAll('a').attr('rel', 'noopener').attr('target', '_blank');
+             } // Create list of linked issue elements
+
+
+             elemsDiv.append('h4').call(_t.append('QA.osmose.elems_title'));
+             elemsDiv.append('ul').selectAll('li').data(d.elems).enter().append('li').append('a').attr('href', '#').attr('class', 'error_entity_link').text(function (d) {
+               return d;
+             }).each(function () {
+               var link = select(this);
+               var entityID = this.textContent;
+               var entity = context.hasEntity(entityID); // Add click handler
+
+               link.on('mouseenter', function () {
+                 utilHighlightEntities([entityID], true, context);
+               }).on('mouseleave', function () {
+                 utilHighlightEntities([entityID], false, context);
+               }).on('click', function (d3_event) {
+                 d3_event.preventDefault();
+                 utilHighlightEntities([entityID], false, context);
+                 var osmlayer = context.layers().layer('osm');
+
+                 if (!osmlayer.enabled()) {
+                   osmlayer.enabled(true);
+                 }
+
+                 context.map().centerZoom(d.loc, 20);
+
+                 if (entity) {
+                   context.enter(modeSelect(context, [entityID]));
+                 } else {
+                   context.loadEntity(entityID, function (err, result) {
+                     if (err) return;
+                     var entity = result.data.find(function (e) {
+                       return e.id === entityID;
+                     });
+                     if (entity) context.enter(modeSelect(context, [entityID]));
+                   });
+                 }
+               }); // Replace with friendly name if possible
+               // (The entity may not yet be loaded into the graph)
+
+               if (entity) {
+                 var name = utilDisplayName(entity); // try to use common name
+
+                 if (!name) {
+                   var preset = _mainPresetIndex.match(entity, context.graph());
+                   name = preset && !preset.isFallback() && preset.name(); // fallback to preset name
+                 }
+
+                 if (name) {
+                   this.innerText = name;
+                 }
+               }
+             }); // Don't hide entities related to this issue - #5880
+
+             context.features().forceVisible(d.elems);
+             context.map().pan([0, 0]); // trigger a redraw
+           })["catch"](function (err) {
+             console.log(err); // eslint-disable-line no-console
+           });
+         }
+
+         osmoseDetails.issue = function (val) {
+           if (!arguments.length) return _qaItem;
+           _qaItem = val;
+           return osmoseDetails;
+         };
+
+         return osmoseDetails;
+       }
+
+       function uiOsmoseHeader() {
+         var _qaItem;
+
+         function issueTitle(d) {
+           var unknown = _t('inspector.unknown');
+           if (!d) return unknown; // Issue titles supplied by Osmose
+
+           var s = services.osmose.getStrings(d.itemType);
+           return 'title' in s ? s.title : unknown;
+         }
+
+         function osmoseHeader(selection) {
+           var header = selection.selectAll('.qa-header').data(_qaItem ? [_qaItem] : [], function (d) {
+             return "".concat(d.id, "-").concat(d.status || 0);
+           });
+           header.exit().remove();
+           var headerEnter = header.enter().append('div').attr('class', 'qa-header');
+           var svgEnter = headerEnter.append('div').attr('class', 'qa-header-icon').classed('new', function (d) {
+             return d.id < 0;
+           }).append('svg').attr('width', '20px').attr('height', '30px').attr('viewbox', '0 0 20 30').attr('class', function (d) {
+             return "preset-icon-28 qaItem ".concat(d.service, " itemId-").concat(d.id, " itemType-").concat(d.itemType);
+           });
+           svgEnter.append('polygon').attr('fill', function (d) {
+             return services.osmose.getColor(d.item);
+           }).attr('class', 'qaItem-fill').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');
+           svgEnter.append('use').attr('class', 'icon-annotation').attr('width', '13px').attr('height', '13px').attr('transform', 'translate(3.5, 5)').attr('xlink:href', function (d) {
+             var picon = d.icon;
+
+             if (!picon) {
+               return '';
+             } else {
+               var isMaki = /^maki-/.test(picon);
+               return "#".concat(picon).concat(isMaki ? '-11' : '');
+             }
+           });
+           headerEnter.append('div').attr('class', 'qa-header-label').text(issueTitle);
+         }
+
+         osmoseHeader.issue = function (val) {
+           if (!arguments.length) return _qaItem;
+           _qaItem = val;
+           return osmoseHeader;
+         };
+
+         return osmoseHeader;
+       }
+
+       function uiViewOnOsmose() {
+         var _qaItem;
+
+         function viewOnOsmose(selection) {
+           var url;
+
+           if (services.osmose && _qaItem instanceof QAItem) {
+             url = services.osmose.itemURL(_qaItem);
+           }
+
+           var link = selection.selectAll('.view-on-osmose').data(url ? [url] : []); // exit
+
+           link.exit().remove(); // enter
+
+           var linkEnter = link.enter().append('a').attr('class', 'view-on-osmose').attr('target', '_blank').attr('rel', 'noopener') // security measure
+           .attr('href', function (d) {
+             return d;
+           }).call(svgIcon('#iD-icon-out-link', 'inline'));
+           linkEnter.append('span').call(_t.append('inspector.view_on_osmose'));
+         }
+
+         viewOnOsmose.what = function (val) {
+           if (!arguments.length) return _qaItem;
+           _qaItem = val;
+           return viewOnOsmose;
+         };
+
+         return viewOnOsmose;
+       }
+
+       function uiOsmoseEditor(context) {
+         var dispatch = dispatch$8('change');
+         var qaDetails = uiOsmoseDetails(context);
+         var qaHeader = uiOsmoseHeader();
+
+         var _qaItem;
+
+         function osmoseEditor(selection) {
+           var header = selection.selectAll('.header').data([0]);
+           var headerEnter = header.enter().append('div').attr('class', 'header fillL');
+           headerEnter.append('button').attr('class', 'close').attr('title', _t('icons.close')).on('click', function () {
+             return context.enter(modeBrowse(context));
+           }).call(svgIcon('#iD-icon-close'));
+           headerEnter.append('h2').call(_t.append('QA.osmose.title'));
+           var body = selection.selectAll('.body').data([0]);
+           body = body.enter().append('div').attr('class', 'body').merge(body);
+           var editor = body.selectAll('.qa-editor').data([0]);
+           editor.enter().append('div').attr('class', 'modal-section qa-editor').merge(editor).call(qaHeader.issue(_qaItem)).call(qaDetails.issue(_qaItem)).call(osmoseSaveSection);
+           var footer = selection.selectAll('.footer').data([0]);
+           footer.enter().append('div').attr('class', 'footer').merge(footer).call(uiViewOnOsmose().what(_qaItem));
+         }
+
+         function osmoseSaveSection(selection) {
+           var isSelected = _qaItem && _qaItem.id === context.selectedErrorID();
+
+           var isShown = _qaItem && isSelected;
+           var saveSection = selection.selectAll('.qa-save').data(isShown ? [_qaItem] : [], function (d) {
+             return "".concat(d.id, "-").concat(d.status || 0);
+           }); // exit
+
+           saveSection.exit().remove(); // enter
+
+           var saveSectionEnter = saveSection.enter().append('div').attr('class', 'qa-save save-section cf'); // update
+
+           saveSection = saveSectionEnter.merge(saveSection).call(qaSaveButtons);
+         }
+
+         function qaSaveButtons(selection) {
+           var isSelected = _qaItem && _qaItem.id === context.selectedErrorID();
+
+           var buttonSection = selection.selectAll('.buttons').data(isSelected ? [_qaItem] : [], function (d) {
+             return d.status + d.id;
+           }); // exit
+
+           buttonSection.exit().remove(); // enter
+
+           var buttonEnter = buttonSection.enter().append('div').attr('class', 'buttons');
+           buttonEnter.append('button').attr('class', 'button close-button action');
+           buttonEnter.append('button').attr('class', 'button ignore-button action'); // update
+
+           buttonSection = buttonSection.merge(buttonEnter);
+           buttonSection.select('.close-button').call(_t.append('QA.keepRight.close')).on('click.close', function (d3_event, d) {
+             this.blur(); // avoid keeping focus on the button - #4641
+
+             var qaService = services.osmose;
+
+             if (qaService) {
+               d.newStatus = 'done';
+               qaService.postUpdate(d, function (err, item) {
+                 return dispatch.call('change', item);
+               });
+             }
+           });
+           buttonSection.select('.ignore-button').call(_t.append('QA.keepRight.ignore')).on('click.ignore', function (d3_event, d) {
+             this.blur(); // avoid keeping focus on the button - #4641
+
+             var qaService = services.osmose;
+
+             if (qaService) {
+               d.newStatus = 'false';
+               qaService.postUpdate(d, function (err, item) {
+                 return dispatch.call('change', item);
+               });
+             }
+           });
+         } // NOTE: Don't change method name until UI v3 is merged
+
+
+         osmoseEditor.error = function (val) {
+           if (!arguments.length) return _qaItem;
+           _qaItem = val;
+           return osmoseEditor;
+         };
+
+         return utilRebind(osmoseEditor, dispatch, 'on');
+       }
+
+       function uiSidebar(context) {
+         var inspector = uiInspector(context);
+         var dataEditor = uiDataEditor(context);
+         var noteEditor = uiNoteEditor(context);
+         var improveOsmEditor = uiImproveOsmEditor(context);
+         var keepRightEditor = uiKeepRightEditor(context);
+         var osmoseEditor = uiOsmoseEditor(context);
+
+         var _current;
+
+         var _wasData = false;
+         var _wasNote = false;
+         var _wasQaItem = false; // use pointer events on supported platforms; fallback to mouse events
+
+         var _pointerPrefix = 'PointerEvent' in window ? 'pointer' : 'mouse';
+
+         function sidebar(selection) {
+           var container = context.container();
+           var minWidth = 240;
+           var sidebarWidth;
+           var containerWidth;
+           var dragOffset; // Set the initial width constraints
+
+           selection.style('min-width', minWidth + 'px').style('max-width', '400px').style('width', '33.3333%');
+           var resizer = selection.append('div').attr('class', 'sidebar-resizer').on(_pointerPrefix + 'down.sidebar-resizer', pointerdown);
+           var downPointerId, lastClientX, containerLocGetter;
+
+           function pointerdown(d3_event) {
+             if (downPointerId) return;
+             if ('button' in d3_event && d3_event.button !== 0) return;
+             downPointerId = d3_event.pointerId || 'mouse';
+             lastClientX = d3_event.clientX;
+             containerLocGetter = utilFastMouse(container.node()); // offset from edge of sidebar-resizer
+
+             dragOffset = utilFastMouse(resizer.node())(d3_event)[0] - 1;
+             sidebarWidth = selection.node().getBoundingClientRect().width;
+             containerWidth = container.node().getBoundingClientRect().width;
+             var widthPct = sidebarWidth / containerWidth * 100;
+             selection.style('width', widthPct + '%') // lock in current width
+             .style('max-width', '85%'); // but allow larger widths
+
+             resizer.classed('dragging', true);
+             select(window).on('touchmove.sidebar-resizer', function (d3_event) {
+               // disable page scrolling while resizing on touch input
+               d3_event.preventDefault();
+             }, {
+               passive: false
+             }).on(_pointerPrefix + 'move.sidebar-resizer', pointermove).on(_pointerPrefix + 'up.sidebar-resizer pointercancel.sidebar-resizer', pointerup);
+           }
+
+           function pointermove(d3_event) {
+             if (downPointerId !== (d3_event.pointerId || 'mouse')) return;
+             d3_event.preventDefault();
+             var dx = d3_event.clientX - lastClientX;
+             lastClientX = d3_event.clientX;
+             var isRTL = _mainLocalizer.textDirection() === 'rtl';
+             var scaleX = isRTL ? 0 : 1;
+             var xMarginProperty = isRTL ? 'margin-right' : 'margin-left';
+             var x = containerLocGetter(d3_event)[0] - dragOffset;
+             sidebarWidth = isRTL ? containerWidth - x : x;
+             var isCollapsed = selection.classed('collapsed');
+             var shouldCollapse = sidebarWidth < minWidth;
+             selection.classed('collapsed', shouldCollapse);
+
+             if (shouldCollapse) {
+               if (!isCollapsed) {
+                 selection.style(xMarginProperty, '-400px').style('width', '400px');
+                 context.ui().onResize([(sidebarWidth - dx) * scaleX, 0]);
+               }
+             } else {
+               var widthPct = sidebarWidth / containerWidth * 100;
+               selection.style(xMarginProperty, null).style('width', widthPct + '%');
+
+               if (isCollapsed) {
+                 context.ui().onResize([-sidebarWidth * scaleX, 0]);
+               } else {
+                 context.ui().onResize([-dx * scaleX, 0]);
+               }
+             }
+           }
+
+           function pointerup(d3_event) {
+             if (downPointerId !== (d3_event.pointerId || 'mouse')) return;
+             downPointerId = null;
+             resizer.classed('dragging', false);
+             select(window).on('touchmove.sidebar-resizer', null).on(_pointerPrefix + 'move.sidebar-resizer', null).on(_pointerPrefix + 'up.sidebar-resizer pointercancel.sidebar-resizer', null);
+           }
+
+           var featureListWrap = selection.append('div').attr('class', 'feature-list-pane').call(uiFeatureList(context));
+           var inspectorWrap = selection.append('div').attr('class', 'inspector-hidden inspector-wrap');
+
+           var hoverModeSelect = function hoverModeSelect(targets) {
+             context.container().selectAll('.feature-list-item button').classed('hover', false);
+
+             if (context.selectedIDs().length > 1 && targets && targets.length) {
+               var elements = context.container().selectAll('.feature-list-item button').filter(function (node) {
+                 return targets.indexOf(node) !== -1;
+               });
+
+               if (!elements.empty()) {
+                 elements.classed('hover', true);
+               }
+             }
+           };
+
+           sidebar.hoverModeSelect = throttle(hoverModeSelect, 200);
+
+           function hover(targets) {
+             var datum = targets && targets.length && targets[0];
+
+             if (datum && datum.__featurehash__) {
+               // hovering on data
+               _wasData = true;
+               sidebar.show(dataEditor.datum(datum));
+               selection.selectAll('.sidebar-component').classed('inspector-hover', true);
+             } else if (datum instanceof osmNote) {
+               if (context.mode().id === 'drag-note') return;
+               _wasNote = true;
+               var osm = services.osm;
+
+               if (osm) {
+                 datum = osm.getNote(datum.id); // marker may contain stale data - get latest
+               }
+
+               sidebar.show(noteEditor.note(datum));
+               selection.selectAll('.sidebar-component').classed('inspector-hover', true);
+             } else if (datum instanceof QAItem) {
+               _wasQaItem = true;
+               var errService = services[datum.service];
+
+               if (errService) {
+                 // marker may contain stale data - get latest
+                 datum = errService.getError(datum.id);
+               } // Currently only three possible services
+
+
+               var errEditor;
+
+               if (datum.service === 'keepRight') {
+                 errEditor = keepRightEditor;
+               } else if (datum.service === 'osmose') {
+                 errEditor = osmoseEditor;
+               } else {
+                 errEditor = improveOsmEditor;
+               }
+
+               context.container().selectAll('.qaItem.' + datum.service).classed('hover', function (d) {
+                 return d.id === datum.id;
+               });
+               sidebar.show(errEditor.error(datum));
+               selection.selectAll('.sidebar-component').classed('inspector-hover', true);
+             } else if (!_current && datum instanceof osmEntity) {
+               featureListWrap.classed('inspector-hidden', true);
+               inspectorWrap.classed('inspector-hidden', false).classed('inspector-hover', true);
+
+               if (!inspector.entityIDs() || !utilArrayIdentical(inspector.entityIDs(), [datum.id]) || inspector.state() !== 'hover') {
+                 inspector.state('hover').entityIDs([datum.id]).newFeature(false);
+                 inspectorWrap.call(inspector);
+               }
+             } else if (!_current) {
+               featureListWrap.classed('inspector-hidden', false);
+               inspectorWrap.classed('inspector-hidden', true);
+               inspector.state('hide');
+             } else if (_wasData || _wasNote || _wasQaItem) {
+               _wasNote = false;
+               _wasData = false;
+               _wasQaItem = false;
+               context.container().selectAll('.note').classed('hover', false);
+               context.container().selectAll('.qaItem').classed('hover', false);
+               sidebar.hide();
+             }
+           }
+
+           sidebar.hover = throttle(hover, 200);
+
+           sidebar.intersects = function (extent) {
+             var rect = selection.node().getBoundingClientRect();
+             return extent.intersects([context.projection.invert([0, rect.height]), context.projection.invert([rect.width, 0])]);
+           };
+
+           sidebar.select = function (ids, newFeature) {
+             sidebar.hide();
+
+             if (ids && ids.length) {
+               var entity = ids.length === 1 && context.entity(ids[0]);
+
+               if (entity && newFeature && selection.classed('collapsed')) {
+                 // uncollapse the sidebar
+                 var extent = entity.extent(context.graph());
+                 sidebar.expand(sidebar.intersects(extent));
+               }
+
+               featureListWrap.classed('inspector-hidden', true);
+               inspectorWrap.classed('inspector-hidden', false).classed('inspector-hover', false); // reload the UI even if the ids are the same since the entities
+               // themselves may have changed
+
+               inspector.state('select').entityIDs(ids).newFeature(newFeature);
+               inspectorWrap.call(inspector);
+             } else {
+               inspector.state('hide');
+             }
+           };
+
+           sidebar.showPresetList = function () {
+             inspector.showList();
+           };
+
+           sidebar.show = function (component, element) {
+             featureListWrap.classed('inspector-hidden', true);
+             inspectorWrap.classed('inspector-hidden', true);
+             if (_current) _current.remove();
+             _current = selection.append('div').attr('class', 'sidebar-component').call(component, element);
+           };
+
+           sidebar.hide = function () {
+             featureListWrap.classed('inspector-hidden', false);
+             inspectorWrap.classed('inspector-hidden', true);
+             if (_current) _current.remove();
+             _current = null;
+           };
+
+           sidebar.expand = function (moveMap) {
+             if (selection.classed('collapsed')) {
+               sidebar.toggle(moveMap);
+             }
+           };
+
+           sidebar.collapse = function (moveMap) {
+             if (!selection.classed('collapsed')) {
+               sidebar.toggle(moveMap);
+             }
+           };
+
+           sidebar.toggle = function (moveMap) {
+             // Don't allow sidebar to toggle when the user is in the walkthrough.
+             if (context.inIntro()) return;
+             var isCollapsed = selection.classed('collapsed');
+             var isCollapsing = !isCollapsed;
+             var isRTL = _mainLocalizer.textDirection() === 'rtl';
+             var scaleX = isRTL ? 0 : 1;
+             var xMarginProperty = isRTL ? 'margin-right' : 'margin-left';
+             sidebarWidth = selection.node().getBoundingClientRect().width; // switch from % to px
+
+             selection.style('width', sidebarWidth + 'px');
+             var startMargin, endMargin, lastMargin;
+
+             if (isCollapsing) {
+               startMargin = lastMargin = 0;
+               endMargin = -sidebarWidth;
+             } else {
+               startMargin = lastMargin = -sidebarWidth;
+               endMargin = 0;
+             }
+
+             if (!isCollapsing) {
+               // unhide the sidebar's content before it transitions onscreen
+               selection.classed('collapsed', isCollapsing);
+             }
+
+             selection.transition().style(xMarginProperty, endMargin + 'px').tween('panner', function () {
+               var i = d3_interpolateNumber(startMargin, endMargin);
+               return function (t) {
+                 var dx = lastMargin - Math.round(i(t));
+                 lastMargin = lastMargin - dx;
+                 context.ui().onResize(moveMap ? undefined : [dx * scaleX, 0]);
+               };
+             }).on('end', function () {
+               if (isCollapsing) {
+                 // hide the sidebar's content after it transitions offscreen
+                 selection.classed('collapsed', isCollapsing);
+               } // switch back from px to %
+
+
+               if (!isCollapsing) {
+                 var containerWidth = container.node().getBoundingClientRect().width;
+                 var widthPct = sidebarWidth / containerWidth * 100;
+                 selection.style(xMarginProperty, null).style('width', widthPct + '%');
+               }
+             });
+           }; // toggle the sidebar collapse when double-clicking the resizer
+
+
+           resizer.on('dblclick', function (d3_event) {
+             d3_event.preventDefault();
+
+             if (d3_event.sourceEvent) {
+               d3_event.sourceEvent.preventDefault();
+             }
+
+             sidebar.toggle();
+           }); // ensure hover sidebar is closed when zooming out beyond editable zoom
+
+           context.map().on('crossEditableZoom.sidebar', function (within) {
+             if (!within && !selection.select('.inspector-hover').empty()) {
+               hover([]);
+             }
+           });
+         }
+
+         sidebar.showPresetList = function () {};
+
+         sidebar.hover = function () {};
+
+         sidebar.hover.cancel = function () {};
+
+         sidebar.intersects = function () {};
+
+         sidebar.select = function () {};
+
+         sidebar.show = function () {};
+
+         sidebar.hide = function () {};
+
+         sidebar.expand = function () {};
+
+         sidebar.collapse = function () {};
+
+         sidebar.toggle = function () {};
+
+         return sidebar;
+       }
+
+       function modeDrawArea(context, wayID, startGraph, button) {
+         var mode = {
+           button: button,
+           id: 'draw-area'
+         };
+         var behavior = behaviorDrawWay(context, wayID, mode, startGraph).on('rejectedSelfIntersection.modeDrawArea', function () {
+           context.ui().flash.iconName('#iD-icon-no').label(_t.html('self_intersection.error.areas'))();
+         });
+         mode.wayID = wayID;
+
+         mode.enter = function () {
+           context.install(behavior);
+         };
+
+         mode.exit = function () {
+           context.uninstall(behavior);
+         };
+
+         mode.selectedIDs = function () {
+           return [wayID];
+         };
+
+         mode.activeID = function () {
+           return behavior && behavior.activeID() || [];
+         };
+
+         return mode;
+       }
+
+       function modeAddArea(context, mode) {
+         mode.id = 'add-area';
+         var behavior = behaviorAddWay(context).on('start', start).on('startFromWay', startFromWay).on('startFromNode', startFromNode);
+         var defaultTags = {
+           area: 'yes'
+         };
+         if (mode.preset) defaultTags = mode.preset.setTags(defaultTags, 'area');
+
+         function actionClose(wayId) {
+           return function (graph) {
+             return graph.replace(graph.entity(wayId).close());
+           };
+         }
+
+         function start(loc) {
+           var startGraph = context.graph();
+           var node = osmNode({
+             loc: loc
+           });
+           var way = osmWay({
+             tags: defaultTags
+           });
+           context.perform(actionAddEntity(node), actionAddEntity(way), actionAddVertex(way.id, node.id), actionClose(way.id));
+           context.enter(modeDrawArea(context, way.id, startGraph, mode.button));
+         }
+
+         function startFromWay(loc, edge) {
+           var startGraph = context.graph();
+           var node = osmNode({
+             loc: loc
+           });
+           var way = osmWay({
+             tags: defaultTags
+           });
+           context.perform(actionAddEntity(node), actionAddEntity(way), actionAddVertex(way.id, node.id), actionClose(way.id), actionAddMidpoint({
+             loc: loc,
+             edge: edge
+           }, node));
+           context.enter(modeDrawArea(context, way.id, startGraph, mode.button));
+         }
+
+         function startFromNode(node) {
+           var startGraph = context.graph();
+           var way = osmWay({
+             tags: defaultTags
+           });
+           context.perform(actionAddEntity(way), actionAddVertex(way.id, node.id), actionClose(way.id));
+           context.enter(modeDrawArea(context, way.id, startGraph, mode.button));
+         }
+
+         mode.enter = function () {
+           context.install(behavior);
+         };
+
+         mode.exit = function () {
+           context.uninstall(behavior);
+         };
+
+         return mode;
+       }
+
+       function modeAddLine(context, mode) {
+         mode.id = 'add-line';
+         var behavior = behaviorAddWay(context).on('start', start).on('startFromWay', startFromWay).on('startFromNode', startFromNode);
+         var defaultTags = {};
+         if (mode.preset) defaultTags = mode.preset.setTags(defaultTags, 'line');
+
+         function start(loc) {
+           var startGraph = context.graph();
+           var node = osmNode({
+             loc: loc
+           });
+           var way = osmWay({
+             tags: defaultTags
+           });
+           context.perform(actionAddEntity(node), actionAddEntity(way), actionAddVertex(way.id, node.id));
+           context.enter(modeDrawLine(context, way.id, startGraph, mode.button));
+         }
+
+         function startFromWay(loc, edge) {
+           var startGraph = context.graph();
+           var node = osmNode({
+             loc: loc
+           });
+           var way = osmWay({
+             tags: defaultTags
+           });
+           context.perform(actionAddEntity(node), actionAddEntity(way), actionAddVertex(way.id, node.id), actionAddMidpoint({
+             loc: loc,
+             edge: edge
+           }, node));
+           context.enter(modeDrawLine(context, way.id, startGraph, mode.button));
+         }
+
+         function startFromNode(node) {
+           var startGraph = context.graph();
+           var way = osmWay({
+             tags: defaultTags
+           });
+           context.perform(actionAddEntity(way), actionAddVertex(way.id, node.id));
+           context.enter(modeDrawLine(context, way.id, startGraph, mode.button));
+         }
+
+         mode.enter = function () {
+           context.install(behavior);
+         };
+
+         mode.exit = function () {
+           context.uninstall(behavior);
+         };
+
+         return mode;
+       }
+
+       function modeAddPoint(context, mode) {
+         mode.id = 'add-point';
+         var behavior = behaviorDraw(context).on('click', add).on('clickWay', addWay).on('clickNode', addNode).on('cancel', cancel).on('finish', cancel);
+         var defaultTags = {};
+         if (mode.preset) defaultTags = mode.preset.setTags(defaultTags, 'point');
+
+         function add(loc) {
+           var node = osmNode({
+             loc: loc,
+             tags: defaultTags
+           });
+           context.perform(actionAddEntity(node), _t('operations.add.annotation.point'));
+           enterSelectMode(node);
+         }
+
+         function addWay(loc, edge) {
+           var node = osmNode({
+             tags: defaultTags
+           });
+           context.perform(actionAddMidpoint({
+             loc: loc,
+             edge: edge
+           }, node), _t('operations.add.annotation.vertex'));
+           enterSelectMode(node);
+         }
+
+         function enterSelectMode(node) {
+           context.enter(modeSelect(context, [node.id]).newFeature(true));
+         }
+
+         function addNode(node) {
+           if (Object.keys(defaultTags).length === 0) {
+             enterSelectMode(node);
+             return;
+           }
+
+           var tags = Object.assign({}, node.tags); // shallow copy
+
+           for (var key in defaultTags) {
+             tags[key] = defaultTags[key];
+           }
+
+           context.perform(actionChangeTags(node.id, tags), _t('operations.add.annotation.point'));
+           enterSelectMode(node);
+         }
+
+         function cancel() {
+           context.enter(modeBrowse(context));
+         }
+
+         mode.enter = function () {
+           context.install(behavior);
+         };
+
+         mode.exit = function () {
+           context.uninstall(behavior);
+         };
+
+         return mode;
+       }
+
+       function modeSelectNote(context, selectedNoteID) {
+         var mode = {
+           id: 'select-note',
+           button: 'browse'
+         };
+
+         var _keybinding = utilKeybinding('select-note');
+
+         var _noteEditor = uiNoteEditor(context).on('change', function () {
+           context.map().pan([0, 0]); // trigger a redraw
+
+           var note = checkSelectedID();
+           if (!note) return;
+           context.ui().sidebar.show(_noteEditor.note(note));
+         });
+
+         var _behaviors = [behaviorBreathe(), behaviorHover(context), behaviorSelect(context), behaviorLasso(context), modeDragNode(context).behavior, modeDragNote(context).behavior];
+         var _newFeature = false;
+
+         function checkSelectedID() {
+           if (!services.osm) return;
+           var note = services.osm.getNote(selectedNoteID);
+
+           if (!note) {
+             context.enter(modeBrowse(context));
+           }
+
+           return note;
+         } // class the note as selected, or return to browse mode if the note is gone
+
+
+         function selectNote(d3_event, drawn) {
+           if (!checkSelectedID()) return;
+           var selection = context.surface().selectAll('.layer-notes .note-' + selectedNoteID);
+
+           if (selection.empty()) {
+             // Return to browse mode if selected DOM elements have
+             // disappeared because the user moved them out of view..
+             var source = d3_event && d3_event.type === 'zoom' && d3_event.sourceEvent;
+
+             if (drawn && source && (source.type === 'pointermove' || source.type === 'mousemove' || source.type === 'touchmove')) {
+               context.enter(modeBrowse(context));
+             }
+           } else {
+             selection.classed('selected', true);
+             context.selectedNoteID(selectedNoteID);
+           }
+         }
+
+         function esc() {
+           if (context.container().select('.combobox').size()) return;
+           context.enter(modeBrowse(context));
+         }
+
+         mode.zoomToSelected = function () {
+           if (!services.osm) return;
+           var note = services.osm.getNote(selectedNoteID);
+
+           if (note) {
+             context.map().centerZoomEase(note.loc, 20);
+           }
+         };
+
+         mode.newFeature = function (val) {
+           if (!arguments.length) return _newFeature;
+           _newFeature = val;
+           return mode;
+         };
+
+         mode.enter = function () {
+           var note = checkSelectedID();
+           if (!note) return;
+
+           _behaviors.forEach(context.install);
+
+           _keybinding.on(_t('inspector.zoom_to.key'), mode.zoomToSelected).on('⎋', esc, true);
+
+           select(document).call(_keybinding);
+           selectNote();
+           var sidebar = context.ui().sidebar;
+           sidebar.show(_noteEditor.note(note).newNote(_newFeature)); // expand the sidebar, avoid obscuring the note if needed
+
+           sidebar.expand(sidebar.intersects(note.extent()));
+           context.map().on('drawn.select', selectNote);
+         };
+
+         mode.exit = function () {
+           _behaviors.forEach(context.uninstall);
+
+           select(document).call(_keybinding.unbind);
+           context.surface().selectAll('.layer-notes .selected').classed('selected hover', false);
+           context.map().on('drawn.select', null);
+           context.ui().sidebar.hide();
+           context.selectedNoteID(null);
+         };
+
+         return mode;
+       }
+
+       function modeAddNote(context) {
+         var mode = {
+           id: 'add-note',
+           button: 'note',
+           description: _t.html('modes.add_note.description'),
+           key: _t('modes.add_note.key')
+         };
+         var behavior = behaviorDraw(context).on('click', add).on('cancel', cancel).on('finish', cancel);
+
+         function add(loc) {
+           var osm = services.osm;
+           if (!osm) return;
+           var note = osmNote({
+             loc: loc,
+             status: 'open',
+             comments: []
+           });
+           osm.replaceNote(note); // force a reraw (there is no history change that would otherwise do this)
+
+           context.map().pan([0, 0]);
+           context.selectedNoteID(note.id).enter(modeSelectNote(context, note.id).newFeature(true));
+         }
+
+         function cancel() {
+           context.enter(modeBrowse(context));
+         }
+
+         mode.enter = function () {
+           context.install(behavior);
+         };
+
+         mode.exit = function () {
+           context.uninstall(behavior);
+         };
+
+         return mode;
+       }
+
+       function modeSave(context) {
+         var mode = {
+           id: 'save'
+         };
+         var keybinding = utilKeybinding('modeSave');
+         var commit = uiCommit(context).on('cancel', cancel);
+
+         var _conflictsUi; // uiConflicts
+
+
+         var _location;
+
+         var _success;
+
+         var uploader = context.uploader().on('saveStarted.modeSave', function () {
+           keybindingOff();
+         }) // fire off some async work that we want to be ready later
+         .on('willAttemptUpload.modeSave', prepareForSuccess).on('progressChanged.modeSave', showProgress).on('resultNoChanges.modeSave', function () {
+           cancel();
+         }).on('resultErrors.modeSave', showErrors).on('resultConflicts.modeSave', showConflicts).on('resultSuccess.modeSave', showSuccess);
+
+         function cancel() {
+           context.enter(modeBrowse(context));
+         }
+
+         function showProgress(num, total) {
+           var modal = context.container().select('.loading-modal .modal-section');
+           var progress = modal.selectAll('.progress').data([0]); // enter/update
+
+           progress.enter().append('div').attr('class', 'progress').merge(progress).text(_t('save.conflict_progress', {
+             num: num,
+             total: total
+           }));
+         }
+
+         function showConflicts(changeset, conflicts, origChanges) {
+           var selection = context.container().select('.sidebar').append('div').attr('class', 'sidebar-component');
+           context.container().selectAll('.main-content').classed('active', true).classed('inactive', false);
+           _conflictsUi = uiConflicts(context).conflictList(conflicts).origChanges(origChanges).on('cancel', function () {
+             context.container().selectAll('.main-content').classed('active', false).classed('inactive', true);
+             selection.remove();
+             keybindingOn();
+             uploader.cancelConflictResolution();
+           }).on('save', function () {
+             context.container().selectAll('.main-content').classed('active', false).classed('inactive', true);
+             selection.remove();
+             uploader.processResolvedConflicts(changeset);
+           });
+           selection.call(_conflictsUi);
+         }
+
+         function showErrors(errors) {
+           keybindingOn();
+           var selection = uiConfirm(context.container());
+           selection.select('.modal-section.header').append('h3').text(_t('save.error'));
+           addErrors(selection, errors);
+           selection.okButton();
+         }
+
+         function addErrors(selection, data) {
+           var message = selection.select('.modal-section.message-text');
+           var items = message.selectAll('.error-container').data(data);
+           var enter = items.enter().append('div').attr('class', 'error-container');
+           enter.append('a').attr('class', 'error-description').attr('href', '#').classed('hide-toggle', true).text(function (d) {
+             return d.msg || _t('save.unknown_error_details');
+           }).on('click', function (d3_event) {
+             d3_event.preventDefault();
+             var error = select(this);
+             var detail = select(this.nextElementSibling);
+             var exp = error.classed('expanded');
+             detail.style('display', exp ? 'none' : 'block');
+             error.classed('expanded', !exp);
+           });
+           var details = enter.append('div').attr('class', 'error-detail-container').style('display', 'none');
+           details.append('ul').attr('class', 'error-detail-list').selectAll('li').data(function (d) {
+             return d.details || [];
+           }).enter().append('li').attr('class', 'error-detail-item').text(function (d) {
+             return d;
+           });
+           items.exit().remove();
+         }
+
+         function showSuccess(changeset) {
+           commit.reset();
+
+           var ui = _success.changeset(changeset).location(_location).on('cancel', function () {
+             context.ui().sidebar.hide();
+           });
+
+           context.enter(modeBrowse(context).sidebar(ui));
+         }
+
+         function keybindingOn() {
+           select(document).call(keybinding.on('⎋', cancel, true));
+         }
+
+         function keybindingOff() {
+           select(document).call(keybinding.unbind);
+         } // Reverse geocode current map location so we can display a message on
+         // the success screen like "Thank you for editing around place, region."
+
+
+         function prepareForSuccess() {
+           _success = uiSuccess(context);
+           _location = null;
+           if (!services.geocoder) return;
+           services.geocoder.reverse(context.map().center(), function (err, result) {
+             if (err || !result || !result.address) return;
+             var addr = result.address;
+             var place = addr && (addr.town || addr.city || addr.county) || '';
+             var region = addr && (addr.state || addr.country) || '';
+             var separator = place && region ? _t('success.thank_you_where.separator') : '';
+             _location = _t('success.thank_you_where.format', {
+               place: place,
+               separator: separator,
+               region: region
+             });
+           });
+         }
+
+         mode.selectedIDs = function () {
+           return _conflictsUi ? _conflictsUi.shownEntityIds() : [];
+         };
+
+         mode.enter = function () {
+           // Show sidebar
+           context.ui().sidebar.expand();
+
+           function done() {
+             context.ui().sidebar.show(commit);
+           }
+
+           keybindingOn();
+           context.container().selectAll('.main-content').classed('active', false).classed('inactive', true);
+           var osm = context.connection();
+
+           if (!osm) {
+             cancel();
+             return;
+           }
+
+           if (osm.authenticated()) {
+             done();
+           } else {
+             osm.authenticate(function (err) {
+               if (err) {
+                 cancel();
+               } else {
+                 done();
+               }
+             });
+           }
+         };
+
+         mode.exit = function () {
+           keybindingOff();
+           context.container().selectAll('.main-content').classed('active', true).classed('inactive', false);
+           context.ui().sidebar.hide();
+         };
+
+         return mode;
+       }
+
+       function modeSelectError(context, selectedErrorID, selectedErrorService) {
+         var mode = {
+           id: 'select-error',
+           button: 'browse'
+         };
+         var keybinding = utilKeybinding('select-error');
+         var errorService = services[selectedErrorService];
+         var errorEditor;
+
+         switch (selectedErrorService) {
+           case 'improveOSM':
+             errorEditor = uiImproveOsmEditor(context).on('change', function () {
+               context.map().pan([0, 0]); // trigger a redraw
+
+               var error = checkSelectedID();
+               if (!error) return;
+               context.ui().sidebar.show(errorEditor.error(error));
+             });
+             break;
+
+           case 'keepRight':
+             errorEditor = uiKeepRightEditor(context).on('change', function () {
+               context.map().pan([0, 0]); // trigger a redraw
+
+               var error = checkSelectedID();
+               if (!error) return;
+               context.ui().sidebar.show(errorEditor.error(error));
+             });
+             break;
+
+           case 'osmose':
+             errorEditor = uiOsmoseEditor(context).on('change', function () {
+               context.map().pan([0, 0]); // trigger a redraw
+
+               var error = checkSelectedID();
+               if (!error) return;
+               context.ui().sidebar.show(errorEditor.error(error));
+             });
+             break;
+         }
+
+         var behaviors = [behaviorBreathe(), behaviorHover(context), behaviorSelect(context), behaviorLasso(context), modeDragNode(context).behavior, modeDragNote(context).behavior];
+
+         function checkSelectedID() {
+           if (!errorService) return;
+           var error = errorService.getError(selectedErrorID);
+
+           if (!error) {
+             context.enter(modeBrowse(context));
+           }
+
+           return error;
+         }
+
+         mode.zoomToSelected = function () {
+           if (!errorService) return;
+           var error = errorService.getError(selectedErrorID);
+
+           if (error) {
+             context.map().centerZoomEase(error.loc, 20);
+           }
+         };
+
+         mode.enter = function () {
+           var error = checkSelectedID();
+           if (!error) return;
+           behaviors.forEach(context.install);
+           keybinding.on(_t('inspector.zoom_to.key'), mode.zoomToSelected).on('⎋', esc, true);
+           select(document).call(keybinding);
+           selectError();
+           var sidebar = context.ui().sidebar;
+           sidebar.show(errorEditor.error(error));
+           context.map().on('drawn.select-error', selectError); // class the error as selected, or return to browse mode if the error is gone
+
+           function selectError(d3_event, drawn) {
+             if (!checkSelectedID()) return;
+             var selection = context.surface().selectAll('.itemId-' + selectedErrorID + '.' + selectedErrorService);
+
+             if (selection.empty()) {
+               // Return to browse mode if selected DOM elements have
+               // disappeared because the user moved them out of view..
+               var source = d3_event && d3_event.type === 'zoom' && d3_event.sourceEvent;
+
+               if (drawn && source && (source.type === 'pointermove' || source.type === 'mousemove' || source.type === 'touchmove')) {
+                 context.enter(modeBrowse(context));
+               }
+             } else {
+               selection.classed('selected', true);
+               context.selectedErrorID(selectedErrorID);
+             }
+           }
+
+           function esc() {
+             if (context.container().select('.combobox').size()) return;
+             context.enter(modeBrowse(context));
+           }
+         };
+
+         mode.exit = function () {
+           behaviors.forEach(context.uninstall);
+           select(document).call(keybinding.unbind);
+           context.surface().selectAll('.qaItem.selected').classed('selected hover', false);
+           context.map().on('drawn.select-error', null);
+           context.ui().sidebar.hide();
+           context.selectedErrorID(null);
+           context.features().forceVisible([]);
+         };
+
+         return mode;
+       }
+
+       function uiToolOldDrawModes(context) {
+         var tool = {
+           id: 'old_modes',
+           label: _t.html('toolbar.add_feature')
+         };
+         var modes = [modeAddPoint(context, {
+           title: _t.html('modes.add_point.title'),
+           button: 'point',
+           description: _t.html('modes.add_point.description'),
+           preset: _mainPresetIndex.item('point'),
+           key: '1'
+         }), modeAddLine(context, {
+           title: _t.html('modes.add_line.title'),
+           button: 'line',
+           description: _t.html('modes.add_line.description'),
+           preset: _mainPresetIndex.item('line'),
+           key: '2'
+         }), modeAddArea(context, {
+           title: _t.html('modes.add_area.title'),
+           button: 'area',
+           description: _t.html('modes.add_area.description'),
+           preset: _mainPresetIndex.item('area'),
+           key: '3'
+         })];
+
+         function enabled() {
+           return osmEditable();
+         }
+
+         function osmEditable() {
+           return context.editable();
+         }
+
+         modes.forEach(function (mode) {
+           context.keybinding().on(mode.key, function () {
+             if (!enabled()) return;
+
+             if (mode.id === context.mode().id) {
+               context.enter(modeBrowse(context));
+             } else {
+               context.enter(mode);
+             }
+           });
+         });
+
+         tool.render = function (selection) {
+           var wrap = selection.append('div').attr('class', 'joined').style('display', 'flex');
+
+           var debouncedUpdate = debounce(update, 500, {
+             leading: true,
+             trailing: true
+           });
+
+           context.map().on('move.modes', debouncedUpdate).on('drawn.modes', debouncedUpdate);
+           context.on('enter.modes', update);
+           update();
+
+           function update() {
+             var buttons = wrap.selectAll('button.add-button').data(modes, function (d) {
+               return d.id;
+             }); // exit
+
+             buttons.exit().remove(); // enter
+
+             var buttonsEnter = buttons.enter().append('button').attr('class', function (d) {
+               return d.id + ' add-button bar-button';
+             }).on('click.mode-buttons', function (d3_event, d) {
+               if (!enabled()) return; // When drawing, ignore accidental clicks on mode buttons - #4042
+
+               var currMode = context.mode().id;
+               if (/^draw/.test(currMode)) return;
+
+               if (d.id === currMode) {
+                 context.enter(modeBrowse(context));
+               } else {
+                 context.enter(d);
+               }
+             }).call(uiTooltip().placement('bottom').title(function (d) {
+               return d.description;
+             }).keys(function (d) {
+               return [d.key];
+             }).scrollContainer(context.container().select('.top-toolbar')));
+             buttonsEnter.each(function (d) {
+               select(this).call(svgIcon('#iD-icon-' + d.button));
+             });
+             buttonsEnter.append('span').attr('class', 'label').html(function (mode) {
+               return mode.title;
+             }); // if we are adding/removing the buttons, check if toolbar has overflowed
+
+             if (buttons.enter().size() || buttons.exit().size()) {
+               context.ui().checkOverflow('.top-toolbar', true);
+             } // update
+
+
+             buttons = buttons.merge(buttonsEnter).attr('aria-disabled', function (d) {
+               return !enabled();
+             }).classed('disabled', function (d) {
+               return !enabled();
+             }).attr('aria-pressed', function (d) {
+               return context.mode() && context.mode().button === d.button;
+             }).classed('active', function (d) {
+               return context.mode() && context.mode().button === d.button;
+             });
+           }
+         };
+
+         return tool;
+       }
+
+       function uiToolNotes(context) {
+         var tool = {
+           id: 'notes',
+           label: _t.html('modes.add_note.label')
+         };
+         var mode = modeAddNote(context);
+
+         function enabled() {
+           return notesEnabled() && notesEditable();
+         }
+
+         function notesEnabled() {
+           var noteLayer = context.layers().layer('notes');
+           return noteLayer && noteLayer.enabled();
+         }
+
+         function notesEditable() {
+           var mode = context.mode();
+           return context.map().notesEditable() && mode && mode.id !== 'save';
+         }
+
+         context.keybinding().on(mode.key, function () {
+           if (!enabled()) return;
+
+           if (mode.id === context.mode().id) {
+             context.enter(modeBrowse(context));
+           } else {
+             context.enter(mode);
+           }
+         });
+
+         tool.render = function (selection) {
+           var debouncedUpdate = debounce(update, 500, {
+             leading: true,
+             trailing: true
+           });
+
+           context.map().on('move.notes', debouncedUpdate).on('drawn.notes', debouncedUpdate);
+           context.on('enter.notes', update);
+           update();
+
+           function update() {
+             var showNotes = notesEnabled();
+             var data = showNotes ? [mode] : [];
+             var buttons = selection.selectAll('button.add-button').data(data, function (d) {
+               return d.id;
+             }); // exit
+
+             buttons.exit().remove(); // enter
+
+             var buttonsEnter = buttons.enter().append('button').attr('class', function (d) {
+               return d.id + ' add-button bar-button';
+             }).on('click.notes', function (d3_event, d) {
+               if (!enabled()) return; // When drawing, ignore accidental clicks on mode buttons - #4042
+
+               var currMode = context.mode().id;
+               if (/^draw/.test(currMode)) return;
+
+               if (d.id === currMode) {
+                 context.enter(modeBrowse(context));
+               } else {
+                 context.enter(d);
+               }
+             }).call(uiTooltip().placement('bottom').title(function (d) {
+               return d.description;
+             }).keys(function (d) {
+               return [d.key];
+             }).scrollContainer(context.container().select('.top-toolbar')));
+             buttonsEnter.each(function (d) {
+               select(this).call(svgIcon(d.icon || '#iD-icon-' + d.button));
+             }); // if we are adding/removing the buttons, check if toolbar has overflowed
+
+             if (buttons.enter().size() || buttons.exit().size()) {
+               context.ui().checkOverflow('.top-toolbar', true);
+             } // update
+
+
+             buttons = buttons.merge(buttonsEnter).classed('disabled', function (d) {
+               return !enabled();
+             }).attr('aria-disabled', function (d) {
+               return !enabled();
+             }).classed('active', function (d) {
+               return context.mode() && context.mode().button === d.button;
+             }).attr('aria-pressed', function (d) {
+               return context.mode() && context.mode().button === d.button;
+             });
+           }
+         };
+
+         tool.uninstall = function () {
+           context.on('enter.editor.notes', null).on('exit.editor.notes', null).on('enter.notes', null);
+           context.map().on('move.notes', null).on('drawn.notes', null);
+         };
+
+         return tool;
+       }
+
+       function uiToolSave(context) {
+         var tool = {
+           id: 'save',
+           label: _t.html('save.title')
+         };
+         var button = null;
+         var tooltipBehavior = null;
+         var history = context.history();
+         var key = uiCmd('⌘S');
+         var _numChanges = 0;
+
+         function isSaving() {
+           var mode = context.mode();
+           return mode && mode.id === 'save';
+         }
+
+         function isDisabled() {
+           return _numChanges === 0 || isSaving();
+         }
+
+         function save(d3_event) {
+           d3_event.preventDefault();
+
+           if (!context.inIntro() && !isSaving() && history.hasChanges()) {
+             context.enter(modeSave(context));
+           }
+         }
+
+         function bgColor() {
+           var step;
+
+           if (_numChanges === 0) {
+             return null;
+           } else if (_numChanges <= 50) {
+             step = _numChanges / 50;
+             return d3_interpolateRgb('#fff', '#ff8')(step); // white -> yellow
+           } else {
+             step = Math.min((_numChanges - 50) / 50, 1.0);
+             return d3_interpolateRgb('#ff8', '#f88')(step); // yellow -> red
+           }
+         }
+
+         function updateCount() {
+           var val = history.difference().summary().length;
+           if (val === _numChanges) return;
+           _numChanges = val;
+
+           if (tooltipBehavior) {
+             tooltipBehavior.title(_t.html(_numChanges > 0 ? 'save.help' : 'save.no_changes')).keys([key]);
+           }
+
+           if (button) {
+             button.classed('disabled', isDisabled()).style('background', bgColor());
+             button.select('span.count').text(_numChanges);
+           }
+         }
+
+         tool.render = function (selection) {
+           tooltipBehavior = uiTooltip().placement('bottom').title(_t.html('save.no_changes')).keys([key]).scrollContainer(context.container().select('.top-toolbar'));
+           var lastPointerUpType;
+           button = selection.append('button').attr('class', 'save disabled bar-button').on('pointerup', function (d3_event) {
+             lastPointerUpType = d3_event.pointerType;
+           }).on('click', function (d3_event) {
+             save(d3_event);
+
+             if (_numChanges === 0 && (lastPointerUpType === 'touch' || lastPointerUpType === 'pen')) {
+               // there are no tooltips for touch interactions so flash feedback instead
+               context.ui().flash.duration(2000).iconName('#iD-icon-save').iconClass('disabled').label(_t.html('save.no_changes'))();
+             }
+
+             lastPointerUpType = null;
+           }).call(tooltipBehavior);
+           button.call(svgIcon('#iD-icon-save'));
+           button.append('span').attr('class', 'count').attr('aria-hidden', 'true').text('0');
+           updateCount();
+           context.keybinding().on(key, save, true);
+           context.history().on('change.save', updateCount);
+           context.on('enter.save', function () {
+             if (button) {
+               button.classed('disabled', isDisabled());
+
+               if (isSaving()) {
+                 button.call(tooltipBehavior.hide);
+               }
+             }
+           });
+         };
+
+         tool.uninstall = function () {
+           context.keybinding().off(key, true);
+           context.history().on('change.save', null);
+           context.on('enter.save', null);
+           button = null;
+           tooltipBehavior = null;
+         };
+
+         return tool;
+       }
+
+       function uiToolSidebarToggle(context) {
+         var tool = {
+           id: 'sidebar_toggle',
+           label: _t.html('toolbar.inspect')
+         };
+
+         tool.render = function (selection) {
+           selection.append('button').attr('class', 'bar-button').attr('aria-label', _t('sidebar.tooltip')).on('click', function () {
+             context.ui().sidebar.toggle();
+           }).call(uiTooltip().placement('bottom').title(_t.html('sidebar.tooltip')).keys([_t('sidebar.key')]).scrollContainer(context.container().select('.top-toolbar'))).call(svgIcon('#iD-icon-sidebar-' + (_mainLocalizer.textDirection() === 'rtl' ? 'right' : 'left')));
+         };
+
+         return tool;
+       }
+
+       function uiToolUndoRedo(context) {
+         var tool = {
+           id: 'undo_redo',
+           label: _t.html('toolbar.undo_redo')
+         };
+         var commands = [{
+           id: 'undo',
+           cmd: uiCmd('⌘Z'),
+           action: function action() {
+             context.undo();
+           },
+           annotation: function annotation() {
+             return context.history().undoAnnotation();
+           },
+           icon: 'iD-icon-' + (_mainLocalizer.textDirection() === 'rtl' ? 'redo' : 'undo')
+         }, {
+           id: 'redo',
+           cmd: uiCmd('⌘⇧Z'),
+           action: function action() {
+             context.redo();
+           },
+           annotation: function annotation() {
+             return context.history().redoAnnotation();
+           },
+           icon: 'iD-icon-' + (_mainLocalizer.textDirection() === 'rtl' ? 'undo' : 'redo')
+         }];
+
+         function editable() {
+           return context.mode() && context.mode().id !== 'save' && context.map().editableDataEnabled(true
+           /* ignore min zoom */
+           );
+         }
+
+         tool.render = function (selection) {
+           var tooltipBehavior = uiTooltip().placement('bottom').title(function (d) {
+             return d.annotation() ? _t.html(d.id + '.tooltip', {
+               action: d.annotation()
+             }) : _t.html(d.id + '.nothing');
+           }).keys(function (d) {
+             return [d.cmd];
+           }).scrollContainer(context.container().select('.top-toolbar'));
+           var lastPointerUpType;
+           var buttons = selection.selectAll('button').data(commands).enter().append('button').attr('class', function (d) {
+             return 'disabled ' + d.id + '-button bar-button';
+           }).on('pointerup', function (d3_event) {
+             // `pointerup` is always called before `click`
+             lastPointerUpType = d3_event.pointerType;
+           }).on('click', function (d3_event, d) {
+             d3_event.preventDefault();
+             var annotation = d.annotation();
+
+             if (editable() && annotation) {
+               d.action();
+             }
+
+             if (editable() && (lastPointerUpType === 'touch' || lastPointerUpType === 'pen')) {
+               // there are no tooltips for touch interactions so flash feedback instead
+               var text = annotation ? _t.html(d.id + '.tooltip', {
+                 action: annotation
+               }) : _t.html(d.id + '.nothing');
+               context.ui().flash.duration(2000).iconName('#' + d.icon).iconClass(annotation ? '' : 'disabled').label(text)();
+             }
+
+             lastPointerUpType = null;
+           }).call(tooltipBehavior);
+           buttons.each(function (d) {
+             select(this).call(svgIcon('#' + d.icon));
+           });
+           context.keybinding().on(commands[0].cmd, function (d3_event) {
+             d3_event.preventDefault();
+             if (editable()) commands[0].action();
+           }).on(commands[1].cmd, function (d3_event) {
+             d3_event.preventDefault();
+             if (editable()) commands[1].action();
+           });
+
+           var debouncedUpdate = debounce(update, 500, {
+             leading: true,
+             trailing: true
+           });
+
+           context.map().on('move.undo_redo', debouncedUpdate).on('drawn.undo_redo', debouncedUpdate);
+           context.history().on('change.undo_redo', function (difference) {
+             if (difference) update();
+           });
+           context.on('enter.undo_redo', update);
+
+           function update() {
+             buttons.classed('disabled', function (d) {
+               return !editable() || !d.annotation();
+             }).each(function () {
+               var selection = select(this);
+
+               if (!selection.select('.tooltip.in').empty()) {
+                 selection.call(tooltipBehavior.updateContent);
+               }
+             });
+           }
+         };
+
+         tool.uninstall = function () {
+           context.keybinding().off(commands[0].cmd).off(commands[1].cmd);
+           context.map().on('move.undo_redo', null).on('drawn.undo_redo', null);
+           context.history().on('change.undo_redo', null);
+           context.on('enter.undo_redo', null);
+         };
+
+         return tool;
+       }
+
+       function uiTopToolbar(context) {
+         var sidebarToggle = uiToolSidebarToggle(context),
+             modes = uiToolOldDrawModes(context),
+             notes = uiToolNotes(context),
+             undoRedo = uiToolUndoRedo(context),
+             save = uiToolSave(context);
+
+         function notesEnabled() {
+           var noteLayer = context.layers().layer('notes');
+           return noteLayer && noteLayer.enabled();
+         }
+
+         function topToolbar(bar) {
+           bar.on('wheel.topToolbar', function (d3_event) {
+             if (!d3_event.deltaX) {
+               // translate vertical scrolling into horizontal scrolling in case
+               // the user doesn't have an input device that can scroll horizontally
+               bar.node().scrollLeft += d3_event.deltaY;
+             }
+           });
+
+           var debouncedUpdate = debounce(update, 500, {
+             leading: true,
+             trailing: true
+           });
+
+           context.layers().on('change.topToolbar', debouncedUpdate);
+           update();
+
+           function update() {
+             var tools = [sidebarToggle, 'spacer', modes];
+             tools.push('spacer');
+
+             if (notesEnabled()) {
+               tools = tools.concat([notes, 'spacer']);
+             }
+
+             tools = tools.concat([undoRedo, save]);
+             var toolbarItems = bar.selectAll('.toolbar-item').data(tools, function (d) {
+               return d.id || d;
+             });
+             toolbarItems.exit().each(function (d) {
+               if (d.uninstall) {
+                 d.uninstall();
+               }
+             }).remove();
+             var itemsEnter = toolbarItems.enter().append('div').attr('class', function (d) {
+               var classes = 'toolbar-item ' + (d.id || d).replace('_', '-');
+               if (d.klass) classes += ' ' + d.klass;
+               return classes;
+             });
+             var actionableItems = itemsEnter.filter(function (d) {
+               return d !== 'spacer';
+             });
+             actionableItems.append('div').attr('class', 'item-content').each(function (d) {
+               select(this).call(d.render, bar);
+             });
+             actionableItems.append('div').attr('class', 'item-label').html(function (d) {
+               return d.label;
+             });
+           }
+         }
+
+         return topToolbar;
+       }
+
+       function uiZoomToSelection(context) {
+         function isDisabled() {
+           var mode = context.mode();
+           return !mode || !mode.zoomToSelected;
+         }
+
+         var _lastPointerUpType;
+
+         function pointerup(d3_event) {
+           _lastPointerUpType = d3_event.pointerType;
+         }
+
+         function click(d3_event) {
+           d3_event.preventDefault();
+
+           if (isDisabled()) {
+             if (_lastPointerUpType === 'touch' || _lastPointerUpType === 'pen') {
+               context.ui().flash.duration(2000).iconName('#iD-icon-framed-dot').iconClass('disabled').label(_t.html('inspector.zoom_to.no_selection'))();
+             }
+           } else {
+             var mode = context.mode();
+
+             if (mode && mode.zoomToSelected) {
+               mode.zoomToSelected();
+             }
+           }
+
+           _lastPointerUpType = null;
+         }
+
+         return function (selection) {
+           var tooltipBehavior = uiTooltip().placement(_mainLocalizer.textDirection() === 'rtl' ? 'right' : 'left').title(function () {
+             if (isDisabled()) {
+               return _t.html('inspector.zoom_to.no_selection');
+             }
+
+             return _t.html('inspector.zoom_to.title');
+           }).keys([_t('inspector.zoom_to.key')]);
+           var button = selection.append('button').on('pointerup', pointerup).on('click', click).call(svgIcon('#iD-icon-framed-dot', 'light')).call(tooltipBehavior);
+
+           function setEnabledState() {
+             button.classed('disabled', isDisabled());
+
+             if (!button.select('.tooltip.in').empty()) {
+               button.call(tooltipBehavior.updateContent);
+             }
+           }
+
+           context.on('enter.uiZoomToSelection', setEnabledState);
+           setEnabledState();
+         };
+       }
+
+       function uiPane(id, context) {
+         var _key;
+
+         var _label = '';
+         var _description = '';
+         var _iconName = '';
+
+         var _sections; // array of uiSection objects
+
+
+         var _paneSelection = select(null);
+
+         var _paneTooltip;
+
+         var pane = {
+           id: id
+         };
+
+         pane.label = function (val) {
+           if (!arguments.length) return _label;
+           _label = val;
+           return pane;
+         };
+
+         pane.key = function (val) {
+           if (!arguments.length) return _key;
+           _key = val;
+           return pane;
+         };
+
+         pane.description = function (val) {
+           if (!arguments.length) return _description;
+           _description = val;
+           return pane;
+         };
+
+         pane.iconName = function (val) {
+           if (!arguments.length) return _iconName;
+           _iconName = val;
+           return pane;
+         };
+
+         pane.sections = function (val) {
+           if (!arguments.length) return _sections;
+           _sections = val;
+           return pane;
+         };
+
+         pane.selection = function () {
+           return _paneSelection;
+         };
+
+         function hidePane() {
+           context.ui().togglePanes();
+         }
+
+         pane.togglePane = function (d3_event) {
+           if (d3_event) d3_event.preventDefault();
+
+           _paneTooltip.hide();
+
+           context.ui().togglePanes(!_paneSelection.classed('shown') ? _paneSelection : undefined);
+         };
+
+         pane.renderToggleButton = function (selection) {
+           if (!_paneTooltip) {
+             _paneTooltip = uiTooltip().placement(_mainLocalizer.textDirection() === 'rtl' ? 'right' : 'left').title(_description).keys([_key]);
+           }
+
+           selection.append('button').on('click', pane.togglePane).call(svgIcon('#' + _iconName, 'light')).call(_paneTooltip);
+         };
+
+         pane.renderContent = function (selection) {
+           // override to fully customize content
+           if (_sections) {
+             _sections.forEach(function (section) {
+               selection.call(section.render);
+             });
+           }
+         };
+
+         pane.renderPane = function (selection) {
+           _paneSelection = selection.append('div').attr('class', 'fillL map-pane hide ' + id + '-pane').attr('pane', id);
+
+           var heading = _paneSelection.append('div').attr('class', 'pane-heading');
+
+           heading.append('h2').html(_label);
+           heading.append('button').attr('title', _t('icons.close')).on('click', hidePane).call(svgIcon('#iD-icon-close'));
+
+           _paneSelection.append('div').attr('class', 'pane-content').call(pane.renderContent);
+
+           if (_key) {
+             context.keybinding().on(_key, pane.togglePane);
+           }
+         };
+
+         return pane;
+       }
+
+       function uiSectionBackgroundDisplayOptions(context) {
+         var section = uiSection('background-display-options', context).label(_t.html('background.display_options')).disclosureContent(renderDisclosureContent);
+
+         var _detected = utilDetect();
+
+         var _storedOpacity = corePreferences('background-opacity');
+
+         var _minVal = 0;
+
+         var _maxVal = _detected.cssfilters ? 3 : 1;
+
+         var _sliders = _detected.cssfilters ? ['brightness', 'contrast', 'saturation', 'sharpness'] : ['brightness'];
+
+         var _options = {
+           brightness: _storedOpacity !== null ? +_storedOpacity : 1,
+           contrast: 1,
+           saturation: 1,
+           sharpness: 1
+         };
+
+         function clamp(x, min, max) {
+           return Math.max(min, Math.min(x, max));
+         }
+
+         function updateValue(d, val) {
+           val = clamp(val, _minVal, _maxVal);
+           _options[d] = val;
+           context.background()[d](val);
+
+           if (d === 'brightness') {
+             corePreferences('background-opacity', val);
+           }
+
+           section.reRender();
+         }
+
+         function renderDisclosureContent(selection) {
+           var container = selection.selectAll('.display-options-container').data([0]);
+           var containerEnter = container.enter().append('div').attr('class', 'display-options-container controls-list'); // add slider controls
+
+           var slidersEnter = containerEnter.selectAll('.display-control').data(_sliders).enter().append('label').attr('class', function (d) {
+             return 'display-control display-control-' + d;
+           });
+           slidersEnter.html(function (d) {
+             return _t.html('background.' + d);
+           }).append('span').attr('class', function (d) {
+             return 'display-option-value display-option-value-' + d;
+           });
+           var sildersControlEnter = slidersEnter.append('div').attr('class', 'control-wrap');
+           sildersControlEnter.append('input').attr('class', function (d) {
+             return 'display-option-input display-option-input-' + d;
+           }).attr('type', 'range').attr('min', _minVal).attr('max', _maxVal).attr('step', '0.05').on('input', function (d3_event, d) {
+             var val = select(this).property('value');
+
+             if (!val && d3_event && d3_event.target) {
+               val = d3_event.target.value;
+             }
+
+             updateValue(d, val);
+           });
+           sildersControlEnter.append('button').attr('title', function (d) {
+             return "".concat(_t('background.reset'), " ").concat(_t('background.' + d));
+           }).attr('class', function (d) {
+             return 'display-option-reset display-option-reset-' + d;
+           }).on('click', function (d3_event, d) {
+             if (d3_event.button !== 0) return;
+             updateValue(d, 1);
+           }).call(svgIcon('#iD-icon-' + (_mainLocalizer.textDirection() === 'rtl' ? 'redo' : 'undo'))); // reset all button
+
+           containerEnter.append('a').attr('class', 'display-option-resetlink').attr('role', 'button').attr('href', '#').call(_t.append('background.reset_all')).on('click', function (d3_event) {
+             d3_event.preventDefault();
+
+             for (var i = 0; i < _sliders.length; i++) {
+               updateValue(_sliders[i], 1);
+             }
+           }); // update
+
+           container = containerEnter.merge(container);
+           container.selectAll('.display-option-input').property('value', function (d) {
+             return _options[d];
+           });
+           container.selectAll('.display-option-value').text(function (d) {
+             return Math.floor(_options[d] * 100) + '%';
+           });
+           container.selectAll('.display-option-reset').classed('disabled', function (d) {
+             return _options[d] === 1;
+           }); // first time only, set brightness if needed
+
+           if (containerEnter.size() && _options.brightness !== 1) {
+             context.background().brightness(_options.brightness);
+           }
+         }
+
+         return section;
+       }
+
+       function uiSettingsCustomBackground() {
+         var dispatch = dispatch$8('change');
+
+         function render(selection) {
+           // keep separate copies of original and current settings
+           var _origSettings = {
+             template: corePreferences('background-custom-template')
+           };
+           var _currSettings = {
+             template: corePreferences('background-custom-template')
+           };
+           var example = 'https://{switch:a,b,c}.tile.openstreetmap.org/{zoom}/{x}/{y}.png';
+           var modal = uiConfirm(selection).okButton();
+           modal.classed('settings-modal settings-custom-background', true);
+           modal.select('.modal-section.header').append('h3').call(_t.append('settings.custom_background.header'));
+           var textSection = modal.select('.modal-section.message-text');
+           var instructions = "".concat(_t.html('settings.custom_background.instructions.info'), "\n") + '\n' + "#### ".concat(_t.html('settings.custom_background.instructions.wms.tokens_label'), "\n") + "* ".concat(_t.html('settings.custom_background.instructions.wms.tokens.proj'), "\n") + "* ".concat(_t.html('settings.custom_background.instructions.wms.tokens.wkid'), "\n") + "* ".concat(_t.html('settings.custom_background.instructions.wms.tokens.dimensions'), "\n") + "* ".concat(_t.html('settings.custom_background.instructions.wms.tokens.bbox'), "\n") + '\n' + "#### ".concat(_t.html('settings.custom_background.instructions.tms.tokens_label'), "\n") + "* ".concat(_t.html('settings.custom_background.instructions.tms.tokens.xyz'), "\n") + "* ".concat(_t.html('settings.custom_background.instructions.tms.tokens.flipped_y'), "\n") + "* ".concat(_t.html('settings.custom_background.instructions.tms.tokens.switch'), "\n") + "* ".concat(_t.html('settings.custom_background.instructions.tms.tokens.quadtile'), "\n") + "* ".concat(_t.html('settings.custom_background.instructions.tms.tokens.scale_factor'), "\n") + '\n' + "#### ".concat(_t.html('settings.custom_background.instructions.example'), "\n") + "`".concat(example, "`");
+           textSection.append('div').attr('class', 'instructions-template').html(marked_1(instructions));
+           textSection.append('textarea').attr('class', 'field-template').attr('placeholder', _t('settings.custom_background.template.placeholder')).call(utilNoAuto).property('value', _currSettings.template); // insert a cancel button
+
+           var buttonSection = modal.select('.modal-section.buttons');
+           buttonSection.insert('button', '.ok-button').attr('class', 'button cancel-button secondary-action').call(_t.append('confirm.cancel'));
+           buttonSection.select('.cancel-button').on('click.cancel', clickCancel);
+           buttonSection.select('.ok-button').attr('disabled', isSaveDisabled).on('click.save', clickSave);
+
+           function isSaveDisabled() {
+             return null;
+           } // restore the original template
+
+
+           function clickCancel() {
+             textSection.select('.field-template').property('value', _origSettings.template);
+             corePreferences('background-custom-template', _origSettings.template);
+             this.blur();
+             modal.close();
+           } // accept the current template
+
+
+           function clickSave() {
+             _currSettings.template = textSection.select('.field-template').property('value');
+             corePreferences('background-custom-template', _currSettings.template);
+             this.blur();
+             modal.close();
+             dispatch.call('change', this, _currSettings);
+           }
+         }
+
+         return utilRebind(render, dispatch, 'on');
+       }
+
+       function uiSectionBackgroundList(context) {
+         var _backgroundList = select(null);
+
+         var _customSource = context.background().findSource('custom');
+
+         var _settingsCustomBackground = uiSettingsCustomBackground().on('change', customChanged);
+
+         var section = uiSection('background-list', context).label(_t.html('background.backgrounds')).disclosureContent(renderDisclosureContent);
+
+         function previousBackgroundID() {
+           return corePreferences('background-last-used-toggle');
+         }
+
+         function renderDisclosureContent(selection) {
+           // the background list
+           var container = selection.selectAll('.layer-background-list').data([0]);
+           _backgroundList = container.enter().append('ul').attr('class', 'layer-list layer-background-list').attr('dir', 'auto').merge(container); // add minimap toggle below list
+
+           var bgExtrasListEnter = selection.selectAll('.bg-extras-list').data([0]).enter().append('ul').attr('class', 'layer-list bg-extras-list');
+           var minimapLabelEnter = bgExtrasListEnter.append('li').attr('class', 'minimap-toggle-item').append('label').call(uiTooltip().title(_t.html('background.minimap.tooltip')).keys([_t('background.minimap.key')]).placement('top'));
+           minimapLabelEnter.append('input').attr('type', 'checkbox').on('change', function (d3_event) {
+             d3_event.preventDefault();
+             uiMapInMap.toggle();
+           });
+           minimapLabelEnter.append('span').call(_t.append('background.minimap.description'));
+           var panelLabelEnter = bgExtrasListEnter.append('li').attr('class', 'background-panel-toggle-item').append('label').call(uiTooltip().title(_t.html('background.panel.tooltip')).keys([uiCmd('⌘⇧' + _t('info_panels.background.key'))]).placement('top'));
+           panelLabelEnter.append('input').attr('type', 'checkbox').on('change', function (d3_event) {
+             d3_event.preventDefault();
+             context.ui().info.toggle('background');
+           });
+           panelLabelEnter.append('span').call(_t.append('background.panel.description'));
+           var locPanelLabelEnter = bgExtrasListEnter.append('li').attr('class', 'location-panel-toggle-item').append('label').call(uiTooltip().title(_t.html('background.location_panel.tooltip')).keys([uiCmd('⌘⇧' + _t('info_panels.location.key'))]).placement('top'));
+           locPanelLabelEnter.append('input').attr('type', 'checkbox').on('change', function (d3_event) {
+             d3_event.preventDefault();
+             context.ui().info.toggle('location');
+           });
+           locPanelLabelEnter.append('span').call(_t.append('background.location_panel.description')); // "Info / Report a Problem" link
+
+           selection.selectAll('.imagery-faq').data([0]).enter().append('div').attr('class', 'imagery-faq').append('a').attr('target', '_blank').call(svgIcon('#iD-icon-out-link', 'inline')).attr('href', 'https://github.com/openstreetmap/iD/blob/develop/FAQ.md#how-can-i-report-an-issue-with-background-imagery').append('span').call(_t.append('background.imagery_problem_faq'));
+
+           _backgroundList.call(drawListItems, 'radio', function (d3_event, d) {
+             chooseBackground(d);
+           }, function (d) {
+             return !d.isHidden() && !d.overlay;
+           });
+         }
+
+         function setTooltips(selection) {
+           selection.each(function (d, i, nodes) {
+             var item = select(this).select('label');
+             var span = item.select('span');
+             var placement = i < nodes.length / 2 ? 'bottom' : 'top';
+             var description = d.description();
+             var isOverflowing = span.property('clientWidth') !== span.property('scrollWidth');
+             item.call(uiTooltip().destroyAny);
+
+             if (d.id === previousBackgroundID()) {
+               item.call(uiTooltip().placement(placement).title('<div>' + _t.html('background.switch') + '</div>').keys([uiCmd('⌘' + _t('background.key'))]));
+             } else if (description || isOverflowing) {
+               item.call(uiTooltip().placement(placement).title(description || d.label()));
+             }
+           });
+         }
+
+         function drawListItems(layerList, type, change, filter) {
+           var sources = context.background().sources(context.map().extent(), context.map().zoom(), true).filter(filter).sort(function (a, b) {
+             return a.best() && !b.best() ? -1 : b.best() && !a.best() ? 1 : d3_descending(a.area(), b.area()) || d3_ascending(a.name(), b.name()) || 0;
+           });
+           var layerLinks = layerList.selectAll('li') // We have to be a bit inefficient about reordering the list since
+           // arrow key navigation of radio values likes to work in the order
+           // they were added, not the display document order.
+           .data(sources, function (d, i) {
+             return d.id + '---' + i;
+           });
+           layerLinks.exit().remove();
+           var enter = layerLinks.enter().append('li').classed('layer-custom', function (d) {
+             return d.id === 'custom';
+           }).classed('best', function (d) {
+             return d.best();
+           });
+           var label = enter.append('label');
+           label.append('input').attr('type', type).attr('name', 'background-layer').attr('value', function (d) {
+             return d.id;
+           }).on('change', change);
+           label.append('span').html(function (d) {
+             return d.label();
+           });
+           enter.filter(function (d) {
+             return d.id === 'custom';
+           }).append('button').attr('class', 'layer-browse').call(uiTooltip().title(_t.html('settings.custom_background.tooltip')).placement(_mainLocalizer.textDirection() === 'rtl' ? 'right' : 'left')).on('click', function (d3_event) {
+             d3_event.preventDefault();
+             editCustom();
+           }).call(svgIcon('#iD-icon-more'));
+           enter.filter(function (d) {
+             return d.best();
+           }).append('div').attr('class', 'best').call(uiTooltip().title(_t.html('background.best_imagery')).placement(_mainLocalizer.textDirection() === 'rtl' ? 'right' : 'left')).append('span').html('&#9733;');
+           layerList.call(updateLayerSelections);
+         }
+
+         function updateLayerSelections(selection) {
+           function active(d) {
+             return context.background().showsLayer(d);
+           }
+
+           selection.selectAll('li').classed('active', active).classed('switch', function (d) {
+             return d.id === previousBackgroundID();
+           }).call(setTooltips).selectAll('input').property('checked', active);
+         }
+
+         function chooseBackground(d) {
+           if (d.id === 'custom' && !d.template()) {
+             return editCustom();
+           }
+
+           var previousBackground = context.background().baseLayerSource();
+           corePreferences('background-last-used-toggle', previousBackground.id);
+           corePreferences('background-last-used', d.id);
+           context.background().baseLayerSource(d);
+         }
+
+         function customChanged(d) {
+           if (d && d.template) {
+             _customSource.template(d.template);
+
+             chooseBackground(_customSource);
+           } else {
+             _customSource.template('');
+
+             chooseBackground(context.background().findSource('none'));
+           }
+         }
+
+         function editCustom() {
+           context.container().call(_settingsCustomBackground);
+         }
+
+         context.background().on('change.background_list', function () {
+           _backgroundList.call(updateLayerSelections);
+         });
+         context.map().on('move.background_list', debounce(function () {
+           // layers in-view may have changed due to map move
+           window.requestIdleCallback(section.reRender);
+         }, 1000));
+         return section;
+       }
+
+       function uiSectionBackgroundOffset(context) {
+         var section = uiSection('background-offset', context).label(_t.html('background.fix_misalignment')).disclosureContent(renderDisclosureContent).expandedByDefault(false);
+
+         var _pointerPrefix = 'PointerEvent' in window ? 'pointer' : 'mouse';
+
+         var _directions = [['top', [0, -0.5]], ['left', [-0.5, 0]], ['right', [0.5, 0]], ['bottom', [0, 0.5]]];
+
+         function updateValue() {
+           var meters = geoOffsetToMeters(context.background().offset());
+           var x = +meters[0].toFixed(2);
+           var y = +meters[1].toFixed(2);
+           context.container().selectAll('.nudge-inner-rect').select('input').classed('error', false).property('value', x + ', ' + y);
+           context.container().selectAll('.nudge-reset').classed('disabled', function () {
+             return x === 0 && y === 0;
+           });
+         }
+
+         function resetOffset() {
+           context.background().offset([0, 0]);
+           updateValue();
+         }
+
+         function nudge(d) {
+           context.background().nudge(d, context.map().zoom());
+           updateValue();
+         }
+
+         function inputOffset() {
+           var input = select(this);
+           var d = input.node().value;
+           if (d === '') return resetOffset();
+           d = d.replace(/;/g, ',').split(',').map(function (n) {
+             // if n is NaN, it will always get mapped to false.
+             return !isNaN(n) && n;
+           });
+
+           if (d.length !== 2 || !d[0] || !d[1]) {
+             input.classed('error', true);
+             return;
+           }
+
+           context.background().offset(geoMetersToOffset(d));
+           updateValue();
+         }
+
+         function dragOffset(d3_event) {
+           if (d3_event.button !== 0) return;
+           var origin = [d3_event.clientX, d3_event.clientY];
+           var pointerId = d3_event.pointerId || 'mouse';
+           context.container().append('div').attr('class', 'nudge-surface');
+           select(window).on(_pointerPrefix + 'move.drag-bg-offset', pointermove).on(_pointerPrefix + 'up.drag-bg-offset', pointerup);
+
+           if (_pointerPrefix === 'pointer') {
+             select(window).on('pointercancel.drag-bg-offset', pointerup);
+           }
+
+           function pointermove(d3_event) {
+             if (pointerId !== (d3_event.pointerId || 'mouse')) return;
+             var latest = [d3_event.clientX, d3_event.clientY];
+             var d = [-(origin[0] - latest[0]) / 4, -(origin[1] - latest[1]) / 4];
+             origin = latest;
+             nudge(d);
+           }
+
+           function pointerup(d3_event) {
+             if (pointerId !== (d3_event.pointerId || 'mouse')) return;
+             if (d3_event.button !== 0) return;
+             context.container().selectAll('.nudge-surface').remove();
+             select(window).on('.drag-bg-offset', null);
+           }
+         }
+
+         function renderDisclosureContent(selection) {
+           var container = selection.selectAll('.nudge-container').data([0]);
+           var containerEnter = container.enter().append('div').attr('class', 'nudge-container');
+           containerEnter.append('div').attr('class', 'nudge-instructions').call(_t.append('background.offset'));
+           var nudgeWrapEnter = containerEnter.append('div').attr('class', 'nudge-controls-wrap');
+           var nudgeEnter = nudgeWrapEnter.append('div').attr('class', 'nudge-outer-rect').on(_pointerPrefix + 'down', dragOffset);
+           nudgeEnter.append('div').attr('class', 'nudge-inner-rect').append('input').attr('type', 'text').attr('aria-label', _t('background.offset_label')).on('change', inputOffset);
+           nudgeWrapEnter.append('div').selectAll('button').data(_directions).enter().append('button').attr('title', function (d) {
+             return _t("background.nudge.".concat(d[0]));
+           }).attr('class', function (d) {
+             return d[0] + ' nudge';
+           }).on('click', function (d3_event, d) {
+             nudge(d[1]);
+           });
+           nudgeWrapEnter.append('button').attr('title', _t('background.reset')).attr('class', 'nudge-reset disabled').on('click', function (d3_event) {
+             d3_event.preventDefault();
+             resetOffset();
+           }).call(svgIcon('#iD-icon-' + (_mainLocalizer.textDirection() === 'rtl' ? 'redo' : 'undo')));
+           updateValue();
+         }
+
+         context.background().on('change.backgroundOffset-update', updateValue);
+         return section;
+       }
+
+       function uiSectionOverlayList(context) {
+         var section = uiSection('overlay-list', context).label(_t.html('background.overlays')).disclosureContent(renderDisclosureContent);
+
+         var _overlayList = select(null);
+
+         function setTooltips(selection) {
+           selection.each(function (d, i, nodes) {
+             var item = select(this).select('label');
+             var span = item.select('span');
+             var placement = i < nodes.length / 2 ? 'bottom' : 'top';
+             var description = d.description();
+             var isOverflowing = span.property('clientWidth') !== span.property('scrollWidth');
+             item.call(uiTooltip().destroyAny);
+
+             if (description || isOverflowing) {
+               item.call(uiTooltip().placement(placement).title(description || d.name()));
+             }
+           });
+         }
+
+         function updateLayerSelections(selection) {
+           function active(d) {
+             return context.background().showsLayer(d);
+           }
+
+           selection.selectAll('li').classed('active', active).call(setTooltips).selectAll('input').property('checked', active);
+         }
+
+         function chooseOverlay(d3_event, d) {
+           d3_event.preventDefault();
+           context.background().toggleOverlayLayer(d);
+
+           _overlayList.call(updateLayerSelections);
+
+           document.activeElement.blur();
+         }
+
+         function drawListItems(layerList, type, change, filter) {
+           var sources = context.background().sources(context.map().extent(), context.map().zoom(), true).filter(filter);
+           var layerLinks = layerList.selectAll('li').data(sources, function (d) {
+             return d.name();
+           });
+           layerLinks.exit().remove();
+           var enter = layerLinks.enter().append('li');
+           var label = enter.append('label');
+           label.append('input').attr('type', type).attr('name', 'layers').on('change', change);
+           label.append('span').html(function (d) {
+             return d.label();
+           });
+           layerList.selectAll('li').sort(sortSources);
+           layerList.call(updateLayerSelections);
+
+           function sortSources(a, b) {
+             return a.best() && !b.best() ? -1 : b.best() && !a.best() ? 1 : d3_descending(a.area(), b.area()) || d3_ascending(a.name(), b.name()) || 0;
+           }
+         }
+
+         function renderDisclosureContent(selection) {
+           var container = selection.selectAll('.layer-overlay-list').data([0]);
+           _overlayList = container.enter().append('ul').attr('class', 'layer-list layer-overlay-list').attr('dir', 'auto').merge(container);
+
+           _overlayList.call(drawListItems, 'checkbox', chooseOverlay, function (d) {
+             return !d.isHidden() && d.overlay;
+           });
+         }
+
+         context.map().on('move.overlay_list', debounce(function () {
+           // layers in-view may have changed due to map move
+           window.requestIdleCallback(section.reRender);
+         }, 1000));
+         return section;
+       }
+
+       function uiPaneBackground(context) {
+         var backgroundPane = uiPane('background', context).key(_t('background.key')).label(_t.html('background.title')).description(_t.html('background.description')).iconName('iD-icon-layers').sections([uiSectionBackgroundList(context), uiSectionOverlayList(context), uiSectionBackgroundDisplayOptions(context), uiSectionBackgroundOffset(context)]);
+         return backgroundPane;
+       }
+
+       function uiPaneHelp(context) {
+         var docKeys = [['help', ['welcome', 'open_data_h', 'open_data', 'before_start_h', 'before_start', 'open_source_h', 'open_source', 'open_source_help']], ['overview', ['navigation_h', 'navigation_drag', 'navigation_zoom', 'features_h', 'features', 'nodes_ways']], ['editing', ['select_h', 'select_left_click', 'select_right_click', 'select_space', 'multiselect_h', 'multiselect', 'multiselect_shift_click', 'multiselect_lasso', 'undo_redo_h', 'undo_redo', 'save_h', 'save', 'save_validation', 'upload_h', 'upload', 'backups_h', 'backups', 'keyboard_h', 'keyboard']], ['feature_editor', ['intro', 'definitions', 'type_h', 'type', 'type_picker', 'fields_h', 'fields_all_fields', 'fields_example', 'fields_add_field', 'tags_h', 'tags_all_tags', 'tags_resources']], ['points', ['intro', 'add_point_h', 'add_point', 'add_point_finish', 'move_point_h', 'move_point', 'delete_point_h', 'delete_point', 'delete_point_command']], ['lines', ['intro', 'add_line_h', 'add_line', 'add_line_draw', 'add_line_continue', 'add_line_finish', 'modify_line_h', 'modify_line_dragnode', 'modify_line_addnode', 'connect_line_h', 'connect_line', 'connect_line_display', 'connect_line_drag', 'connect_line_tag', 'disconnect_line_h', 'disconnect_line_command', 'move_line_h', 'move_line_command', 'move_line_connected', 'delete_line_h', 'delete_line', 'delete_line_command']], ['areas', ['intro', 'point_or_area_h', 'point_or_area', 'add_area_h', 'add_area_command', 'add_area_draw', 'add_area_continue', 'add_area_finish', 'square_area_h', 'square_area_command', 'modify_area_h', 'modify_area_dragnode', 'modify_area_addnode', 'delete_area_h', 'delete_area', 'delete_area_command']], ['relations', ['intro', 'edit_relation_h', 'edit_relation', 'edit_relation_add', 'edit_relation_delete', 'maintain_relation_h', 'maintain_relation', 'relation_types_h', 'multipolygon_h', 'multipolygon', 'multipolygon_create', 'multipolygon_merge', 'turn_restriction_h', 'turn_restriction', 'turn_restriction_field', 'turn_restriction_editing', 'route_h', 'route', 'route_add', 'boundary_h', 'boundary', 'boundary_add']], ['operations', ['intro', 'intro_2', 'straighten', 'orthogonalize', 'circularize', 'move', 'rotate', 'reflect', 'continue', 'reverse', 'disconnect', 'split', 'extract', 'merge', 'delete', 'downgrade', 'copy_paste']], ['notes', ['intro', 'add_note_h', 'add_note', 'place_note', 'move_note', 'update_note_h', 'update_note', 'save_note_h', 'save_note']], ['imagery', ['intro', 'sources_h', 'choosing', 'sources', 'offsets_h', 'offset', 'offset_change']], ['streetlevel', ['intro', 'using_h', 'using', 'photos', 'viewer']], ['gps', ['intro', 'survey', 'using_h', 'using', 'tracing', 'upload']], ['qa', ['intro', 'tools_h', 'tools', 'issues_h', 'issues']]];
+         var headings = {
+           'help.help.open_data_h': 3,
+           'help.help.before_start_h': 3,
+           'help.help.open_source_h': 3,
+           'help.overview.navigation_h': 3,
+           'help.overview.features_h': 3,
+           'help.editing.select_h': 3,
+           'help.editing.multiselect_h': 3,
+           'help.editing.undo_redo_h': 3,
+           'help.editing.save_h': 3,
+           'help.editing.upload_h': 3,
+           'help.editing.backups_h': 3,
+           'help.editing.keyboard_h': 3,
+           'help.feature_editor.type_h': 3,
+           'help.feature_editor.fields_h': 3,
+           'help.feature_editor.tags_h': 3,
+           'help.points.add_point_h': 3,
+           'help.points.move_point_h': 3,
+           'help.points.delete_point_h': 3,
+           'help.lines.add_line_h': 3,
+           'help.lines.modify_line_h': 3,
+           'help.lines.connect_line_h': 3,
+           'help.lines.disconnect_line_h': 3,
+           'help.lines.move_line_h': 3,
+           'help.lines.delete_line_h': 3,
+           'help.areas.point_or_area_h': 3,
+           'help.areas.add_area_h': 3,
+           'help.areas.square_area_h': 3,
+           'help.areas.modify_area_h': 3,
+           'help.areas.delete_area_h': 3,
+           'help.relations.edit_relation_h': 3,
+           'help.relations.maintain_relation_h': 3,
+           'help.relations.relation_types_h': 2,
+           'help.relations.multipolygon_h': 3,
+           'help.relations.turn_restriction_h': 3,
+           'help.relations.route_h': 3,
+           'help.relations.boundary_h': 3,
+           'help.notes.add_note_h': 3,
+           'help.notes.update_note_h': 3,
+           'help.notes.save_note_h': 3,
+           'help.imagery.sources_h': 3,
+           'help.imagery.offsets_h': 3,
+           'help.streetlevel.using_h': 3,
+           'help.gps.using_h': 3,
+           'help.qa.tools_h': 3,
+           'help.qa.issues_h': 3
+         }; // For each section, squash all the texts into a single markdown document
+
+         var docs = docKeys.map(function (key) {
+           var helpkey = 'help.' + key[0];
+           var helpPaneReplacements = {
+             version: context.version
+           };
+           var text = key[1].reduce(function (all, part) {
+             var subkey = helpkey + '.' + part;
+             var depth = headings[subkey]; // is this subkey a heading?
+
+             var hhh = depth ? Array(depth + 1).join('#') + ' ' : ''; // if so, prepend with some ##'s
+
+             return all + hhh + helpHtml(subkey, helpPaneReplacements) + '\n\n';
+           }, '');
+           return {
+             title: _t.html(helpkey + '.title'),
+             content: marked_1(text.trim()) // use keyboard key styling for shortcuts
+             .replace(/<code>/g, '<kbd>').replace(/<\/code>/g, '<\/kbd>')
+           };
+         });
+         var helpPane = uiPane('help', context).key(_t('help.key')).label(_t.html('help.title')).description(_t.html('help.title')).iconName('iD-icon-help');
+
+         helpPane.renderContent = function (content) {
+           function clickHelp(d, i) {
+             var rtl = _mainLocalizer.textDirection() === 'rtl';
+             content.property('scrollTop', 0);
+             helpPane.selection().select('.pane-heading h2').html(d.title);
+             body.html(d.content);
+             body.selectAll('a').attr('target', '_blank');
+             menuItems.classed('selected', function (m) {
+               return m.title === d.title;
+             });
+             nav.html('');
+
+             if (rtl) {
+               nav.call(drawNext).call(drawPrevious);
+             } else {
+               nav.call(drawPrevious).call(drawNext);
+             }
+
+             function drawNext(selection) {
+               if (i < docs.length - 1) {
+                 var nextLink = selection.append('a').attr('href', '#').attr('class', 'next').on('click', function (d3_event) {
+                   d3_event.preventDefault();
+                   clickHelp(docs[i + 1], i + 1);
+                 });
+                 nextLink.append('span').html(docs[i + 1].title).call(svgIcon(rtl ? '#iD-icon-backward' : '#iD-icon-forward', 'inline'));
+               }
+             }
+
+             function drawPrevious(selection) {
+               if (i > 0) {
+                 var prevLink = selection.append('a').attr('href', '#').attr('class', 'previous').on('click', function (d3_event) {
+                   d3_event.preventDefault();
+                   clickHelp(docs[i - 1], i - 1);
+                 });
+                 prevLink.call(svgIcon(rtl ? '#iD-icon-forward' : '#iD-icon-backward', 'inline')).append('span').html(docs[i - 1].title);
+               }
+             }
+           }
+
+           function clickWalkthrough(d3_event) {
+             d3_event.preventDefault();
+             if (context.inIntro()) return;
+             context.container().call(uiIntro(context));
+             context.ui().togglePanes();
+           }
+
+           function clickShortcuts(d3_event) {
+             d3_event.preventDefault();
+             context.container().call(context.ui().shortcuts, true);
+           }
+
+           var toc = content.append('ul').attr('class', 'toc');
+           var menuItems = toc.selectAll('li').data(docs).enter().append('li').append('a').attr('role', 'button').attr('href', '#').html(function (d) {
+             return d.title;
+           }).on('click', function (d3_event, d) {
+             d3_event.preventDefault();
+             clickHelp(d, docs.indexOf(d));
+           });
+           var shortcuts = toc.append('li').attr('class', 'shortcuts').call(uiTooltip().title(_t.html('shortcuts.tooltip')).keys(['?']).placement('top')).append('a').attr('href', '#').on('click', clickShortcuts);
+           shortcuts.append('div').call(_t.append('shortcuts.title'));
+           var walkthrough = toc.append('li').attr('class', 'walkthrough').append('a').attr('href', '#').on('click', clickWalkthrough);
+           walkthrough.append('svg').attr('class', 'logo logo-walkthrough').append('use').attr('xlink:href', '#iD-logo-walkthrough');
+           walkthrough.append('div').call(_t.append('splash.walkthrough'));
+           var helpContent = content.append('div').attr('class', 'left-content');
+           var body = helpContent.append('div').attr('class', 'body');
+           var nav = helpContent.append('div').attr('class', 'nav');
+           clickHelp(docs[0], 0);
+         };
+
+         return helpPane;
+       }
+
+       function uiSectionValidationIssues(id, severity, context) {
+         var _issues = [];
+         var section = uiSection(id, context).label(function () {
+           if (!_issues) return '';
+           var issueCountText = _issues.length > 1000 ? '1000+' : String(_issues.length);
+           return _t.html('inspector.title_count', {
+             title: {
+               html: _t.html('issues.' + severity + 's.list_title')
+             },
+             count: issueCountText
+           });
+         }).disclosureContent(renderDisclosureContent).shouldDisplay(function () {
+           return _issues && _issues.length;
+         });
+
+         function getOptions() {
+           return {
+             what: corePreferences('validate-what') || 'edited',
+             where: corePreferences('validate-where') || 'all'
+           };
+         } // get and cache the issues to display, unordered
+
+
+         function reloadIssues() {
+           _issues = context.validator().getIssuesBySeverity(getOptions())[severity];
+         }
+
+         function renderDisclosureContent(selection) {
+           var center = context.map().center();
+           var graph = context.graph(); // sort issues by distance away from the center of the map
+
+           var issues = _issues.map(function withDistance(issue) {
+             var extent = issue.extent(graph);
+             var dist = extent ? geoSphericalDistance(center, extent.center()) : 0;
+             return Object.assign(issue, {
+               dist: dist
+             });
+           }).sort(function byDistance(a, b) {
+             return a.dist - b.dist;
+           }); // cut off at 1000
+
+
+           issues = issues.slice(0, 1000); //renderIgnoredIssuesReset(_warningsSelection);
+
+           selection.call(drawIssuesList, issues);
+         }
+
+         function drawIssuesList(selection, issues) {
+           var list = selection.selectAll('.issues-list').data([0]);
+           list = list.enter().append('ul').attr('class', 'layer-list issues-list ' + severity + 's-list').merge(list);
+           var items = list.selectAll('li').data(issues, function (d) {
+             return d.key;
+           }); // Exit
+
+           items.exit().remove(); // Enter
+
+           var itemsEnter = items.enter().append('li').attr('class', function (d) {
+             return 'issue severity-' + d.severity;
+           });
+           var labelsEnter = itemsEnter.append('button').attr('class', 'issue-label').on('click', function (d3_event, d) {
+             context.validator().focusIssue(d);
+           }).on('mouseover', function (d3_event, d) {
+             utilHighlightEntities(d.entityIds, true, context);
+           }).on('mouseout', function (d3_event, d) {
+             utilHighlightEntities(d.entityIds, false, context);
+           });
+           var textEnter = labelsEnter.append('span').attr('class', 'issue-text');
+           textEnter.append('span').attr('class', 'issue-icon').each(function (d) {
+             var iconName = '#iD-icon-' + (d.severity === 'warning' ? 'alert' : 'error');
+             select(this).call(svgIcon(iconName));
+           });
+           textEnter.append('span').attr('class', 'issue-message');
+           /*
+           labelsEnter
+               .append('span')
+               .attr('class', 'issue-autofix')
+               .each(function(d) {
+                   if (!d.autoFix) return;
+                    d3_select(this)
+                       .append('button')
+                       .attr('title', t('issues.fix_one.title'))
+                       .datum(d.autoFix)  // set button datum to the autofix
+                       .attr('class', 'autofix action')
+                       .on('click', function(d3_event, d) {
+                           d3_event.preventDefault();
+                           d3_event.stopPropagation();
+                            var issuesEntityIDs = d.issue.entityIds;
+                           utilHighlightEntities(issuesEntityIDs.concat(d.entityIds), false, context);
+                            context.perform.apply(context, d.autoArgs);
+                           context.validator().validate();
+                       })
+                       .call(svgIcon('#iD-icon-wrench'));
+               });
+           */
+           // Update
+
+           items = items.merge(itemsEnter).order();
+           items.selectAll('.issue-message').html(function (d) {
+             return d.message(context);
+           });
+           /*
+           // autofix
+           var canAutoFix = issues.filter(function(issue) { return issue.autoFix; });
+            var autoFixAll = selection.selectAll('.autofix-all')
+               .data(canAutoFix.length ? [0] : []);
+            // exit
+           autoFixAll.exit()
+               .remove();
+            // enter
+           var autoFixAllEnter = autoFixAll.enter()
+               .insert('div', '.issues-list')
+               .attr('class', 'autofix-all');
+            var linkEnter = autoFixAllEnter
+               .append('a')
+               .attr('class', 'autofix-all-link')
+               .attr('href', '#');
+            linkEnter
+               .append('span')
+               .attr('class', 'autofix-all-link-text')
+               .call(t.append('issues.fix_all.title'));
+            linkEnter
+               .append('span')
+               .attr('class', 'autofix-all-link-icon')
+               .call(svgIcon('#iD-icon-wrench'));
+            if (severity === 'warning') {
+               renderIgnoredIssuesReset(selection);
+           }
+            // update
+           autoFixAll = autoFixAll
+               .merge(autoFixAllEnter);
+            autoFixAll.selectAll('.autofix-all-link')
+               .on('click', function() {
+                   context.pauseChangeDispatch();
+                   context.perform(actionNoop());
+                   canAutoFix.forEach(function(issue) {
+                       var args = issue.autoFix.autoArgs.slice();  // copy
+                       if (typeof args[args.length - 1] !== 'function') {
+                           args.pop();
+                       }
+                       args.push(t('issues.fix_all.annotation'));
+                       context.replace.apply(context, args);
+                   });
+                   context.resumeChangeDispatch();
+                   context.validator().validate();
+               });
+           */
+         }
+
+         context.validator().on('validated.uiSectionValidationIssues' + id, function () {
+           window.requestIdleCallback(function () {
+             reloadIssues();
+             section.reRender();
+           });
+         });
+         context.map().on('move.uiSectionValidationIssues' + id, debounce(function () {
+           window.requestIdleCallback(function () {
+             if (getOptions().where === 'visible') {
+               // must refetch issues if they are viewport-dependent
+               reloadIssues();
+             } // always reload list to re-sort-by-distance
+
+
+             section.reRender();
+           });
+         }, 1000));
+         return section;
+       }
+
+       function uiSectionValidationOptions(context) {
+         var section = uiSection('issues-options', context).content(renderContent);
+
+         function renderContent(selection) {
+           var container = selection.selectAll('.issues-options-container').data([0]);
+           container = container.enter().append('div').attr('class', 'issues-options-container').merge(container);
+           var data = [{
+             key: 'what',
+             values: ['edited', 'all']
+           }, {
+             key: 'where',
+             values: ['visible', 'all']
+           }];
+           var options = container.selectAll('.issues-option').data(data, function (d) {
+             return d.key;
+           });
+           var optionsEnter = options.enter().append('div').attr('class', function (d) {
+             return 'issues-option issues-option-' + d.key;
+           });
+           optionsEnter.append('div').attr('class', 'issues-option-title').html(function (d) {
+             return _t.html('issues.options.' + d.key + '.title');
+           });
+           var valuesEnter = optionsEnter.selectAll('label').data(function (d) {
+             return d.values.map(function (val) {
+               return {
+                 value: val,
+                 key: d.key
+               };
+             });
+           }).enter().append('label');
+           valuesEnter.append('input').attr('type', 'radio').attr('name', function (d) {
+             return 'issues-option-' + d.key;
+           }).attr('value', function (d) {
+             return d.value;
+           }).property('checked', function (d) {
+             return getOptions()[d.key] === d.value;
+           }).on('change', function (d3_event, d) {
+             updateOptionValue(d3_event, d.key, d.value);
+           });
+           valuesEnter.append('span').html(function (d) {
+             return _t.html('issues.options.' + d.key + '.' + d.value);
+           });
+         }
+
+         function getOptions() {
+           return {
+             what: corePreferences('validate-what') || 'edited',
+             // 'all', 'edited'
+             where: corePreferences('validate-where') || 'all' // 'all', 'visible'
+
+           };
+         }
+
+         function updateOptionValue(d3_event, d, val) {
+           if (!val && d3_event && d3_event.target) {
+             val = d3_event.target.value;
+           }
+
+           corePreferences('validate-' + d, val);
+           context.validator().validate();
+         }
+
+         return section;
+       }
+
+       function uiSectionValidationRules(context) {
+         var MINSQUARE = 0;
+         var MAXSQUARE = 20;
+         var DEFAULTSQUARE = 5; // see also unsquare_way.js
+
+         var section = uiSection('issues-rules', context).disclosureContent(renderDisclosureContent).label(_t.html('issues.rules.title'));
+
+         var _ruleKeys = context.validator().getRuleKeys().filter(function (key) {
+           return key !== 'maprules';
+         }).sort(function (key1, key2) {
+           // alphabetize by localized title
+           return _t('issues.' + key1 + '.title') < _t('issues.' + key2 + '.title') ? -1 : 1;
+         });
+
+         function renderDisclosureContent(selection) {
+           var container = selection.selectAll('.issues-rulelist-container').data([0]);
+           var containerEnter = container.enter().append('div').attr('class', 'issues-rulelist-container');
+           containerEnter.append('ul').attr('class', 'layer-list issue-rules-list');
+           var ruleLinks = containerEnter.append('div').attr('class', 'issue-rules-links section-footer');
+           ruleLinks.append('a').attr('class', 'issue-rules-link').attr('role', 'button').attr('href', '#').call(_t.append('issues.disable_all')).on('click', function (d3_event) {
+             d3_event.preventDefault();
+             context.validator().disableRules(_ruleKeys);
+           });
+           ruleLinks.append('a').attr('class', 'issue-rules-link').attr('role', 'button').attr('href', '#').call(_t.append('issues.enable_all')).on('click', function (d3_event) {
+             d3_event.preventDefault();
+             context.validator().disableRules([]);
+           }); // Update
+
+           container = container.merge(containerEnter);
+           container.selectAll('.issue-rules-list').call(drawListItems, _ruleKeys, 'checkbox', 'rule', toggleRule, isRuleEnabled);
+         }
+
+         function drawListItems(selection, data, type, name, change, active) {
+           var items = selection.selectAll('li').data(data); // Exit
+
+           items.exit().remove(); // Enter
+
+           var enter = items.enter().append('li');
+
+           if (name === 'rule') {
+             enter.call(uiTooltip().title(function (d) {
+               return _t.html('issues.' + d + '.tip');
+             }).placement('top'));
+           }
+
+           var label = enter.append('label');
+           label.append('input').attr('type', type).attr('name', name).on('change', change);
+           label.append('span').html(function (d) {
+             var params = {};
+
+             if (d === 'unsquare_way') {
+               params.val = {
+                 html: '<span class="square-degrees"></span>'
+               };
+             }
+
+             return _t.html('issues.' + d + '.title', params);
+           }); // Update
+
+           items = items.merge(enter);
+           items.classed('active', active).selectAll('input').property('checked', active).property('indeterminate', false); // user-configurable square threshold
+
+           var degStr = corePreferences('validate-square-degrees');
+
+           if (degStr === null) {
+             degStr = DEFAULTSQUARE.toString();
+           }
+
+           var span = items.selectAll('.square-degrees');
+           var input = span.selectAll('.square-degrees-input').data([0]); // enter / update
+
+           input.enter().append('input').attr('type', 'number').attr('min', MINSQUARE.toString()).attr('max', MAXSQUARE.toString()).attr('step', '0.5').attr('class', 'square-degrees-input').call(utilNoAuto).on('click', function (d3_event) {
+             d3_event.preventDefault();
+             d3_event.stopPropagation();
+             this.select();
+           }).on('keyup', function (d3_event) {
+             if (d3_event.keyCode === 13) {
+               // ↩ Return
+               this.blur();
+               this.select();
+             }
+           }).on('blur', changeSquare).merge(input).property('value', degStr);
+         }
+
+         function changeSquare() {
+           var input = select(this);
+           var degStr = utilGetSetValue(input).trim();
+           var degNum = parseFloat(degStr, 10);
+
+           if (!isFinite(degNum)) {
+             degNum = DEFAULTSQUARE;
+           } else if (degNum > MAXSQUARE) {
+             degNum = MAXSQUARE;
+           } else if (degNum < MINSQUARE) {
+             degNum = MINSQUARE;
+           }
+
+           degNum = Math.round(degNum * 10) / 10; // round to 1 decimal
+
+           degStr = degNum.toString();
+           input.property('value', degStr);
+           corePreferences('validate-square-degrees', degStr);
+           context.validator().revalidateUnsquare();
+         }
+
+         function isRuleEnabled(d) {
+           return context.validator().isRuleEnabled(d);
+         }
+
+         function toggleRule(d3_event, d) {
+           context.validator().toggleRule(d);
+         }
+
+         context.validator().on('validated.uiSectionValidationRules', function () {
+           window.requestIdleCallback(section.reRender);
+         });
+         return section;
+       }
+
+       function uiSectionValidationStatus(context) {
+         var section = uiSection('issues-status', context).content(renderContent).shouldDisplay(function () {
+           var issues = context.validator().getIssues(getOptions());
+           return issues.length === 0;
+         });
+
+         function getOptions() {
+           return {
+             what: corePreferences('validate-what') || 'edited',
+             where: corePreferences('validate-where') || 'all'
+           };
+         }
+
+         function renderContent(selection) {
+           var box = selection.selectAll('.box').data([0]);
+           var boxEnter = box.enter().append('div').attr('class', 'box');
+           boxEnter.append('div').call(svgIcon('#iD-icon-apply', 'pre-text'));
+           var noIssuesMessage = boxEnter.append('span');
+           noIssuesMessage.append('strong').attr('class', 'message');
+           noIssuesMessage.append('br');
+           noIssuesMessage.append('span').attr('class', 'details');
+           renderIgnoredIssuesReset(selection);
+           setNoIssuesText(selection);
+         }
+
+         function renderIgnoredIssuesReset(selection) {
+           var ignoredIssues = context.validator().getIssues({
+             what: 'all',
+             where: 'all',
+             includeDisabledRules: true,
+             includeIgnored: 'only'
+           });
+           var resetIgnored = selection.selectAll('.reset-ignored').data(ignoredIssues.length ? [0] : []); // exit
+
+           resetIgnored.exit().remove(); // enter
+
+           var resetIgnoredEnter = resetIgnored.enter().append('div').attr('class', 'reset-ignored section-footer');
+           resetIgnoredEnter.append('a').attr('href', '#'); // update
+
+           resetIgnored = resetIgnored.merge(resetIgnoredEnter);
+           resetIgnored.select('a').html(_t.html('inspector.title_count', {
+             title: {
+               html: _t.html('issues.reset_ignored')
+             },
+             count: ignoredIssues.length
+           }));
+           resetIgnored.on('click', function (d3_event) {
+             d3_event.preventDefault();
+             context.validator().resetIgnoredIssues();
+           });
+         }
+
+         function setNoIssuesText(selection) {
+           var opts = getOptions();
+
+           function checkForHiddenIssues(cases) {
+             for (var type in cases) {
+               var hiddenOpts = cases[type];
+               var hiddenIssues = context.validator().getIssues(hiddenOpts);
+
+               if (hiddenIssues.length) {
+                 selection.select('.box .details').html('').call(_t.append('issues.no_issues.hidden_issues.' + type, {
+                   count: hiddenIssues.length.toString()
+                 }));
+                 return;
+               }
+             }
+
+             selection.select('.box .details').html('').call(_t.append('issues.no_issues.hidden_issues.none'));
+           }
+
+           var messageType;
+
+           if (opts.what === 'edited' && opts.where === 'visible') {
+             messageType = 'edits_in_view';
+             checkForHiddenIssues({
+               elsewhere: {
+                 what: 'edited',
+                 where: 'all'
+               },
+               everything_else: {
+                 what: 'all',
+                 where: 'visible'
+               },
+               disabled_rules: {
+                 what: 'edited',
+                 where: 'visible',
+                 includeDisabledRules: 'only'
+               },
+               everything_else_elsewhere: {
+                 what: 'all',
+                 where: 'all'
+               },
+               disabled_rules_elsewhere: {
+                 what: 'edited',
+                 where: 'all',
+                 includeDisabledRules: 'only'
+               },
+               ignored_issues: {
+                 what: 'edited',
+                 where: 'visible',
+                 includeIgnored: 'only'
+               },
+               ignored_issues_elsewhere: {
+                 what: 'edited',
+                 where: 'all',
+                 includeIgnored: 'only'
+               }
+             });
+           } else if (opts.what === 'edited' && opts.where === 'all') {
+             messageType = 'edits';
+             checkForHiddenIssues({
+               everything_else: {
+                 what: 'all',
+                 where: 'all'
+               },
+               disabled_rules: {
+                 what: 'edited',
+                 where: 'all',
+                 includeDisabledRules: 'only'
+               },
+               ignored_issues: {
+                 what: 'edited',
+                 where: 'all',
+                 includeIgnored: 'only'
+               }
+             });
+           } else if (opts.what === 'all' && opts.where === 'visible') {
+             messageType = 'everything_in_view';
+             checkForHiddenIssues({
+               elsewhere: {
+                 what: 'all',
+                 where: 'all'
+               },
+               disabled_rules: {
+                 what: 'all',
+                 where: 'visible',
+                 includeDisabledRules: 'only'
+               },
+               disabled_rules_elsewhere: {
+                 what: 'all',
+                 where: 'all',
+                 includeDisabledRules: 'only'
+               },
+               ignored_issues: {
+                 what: 'all',
+                 where: 'visible',
+                 includeIgnored: 'only'
+               },
+               ignored_issues_elsewhere: {
+                 what: 'all',
+                 where: 'all',
+                 includeIgnored: 'only'
+               }
+             });
+           } else if (opts.what === 'all' && opts.where === 'all') {
+             messageType = 'everything';
+             checkForHiddenIssues({
+               disabled_rules: {
+                 what: 'all',
+                 where: 'all',
+                 includeDisabledRules: 'only'
+               },
+               ignored_issues: {
+                 what: 'all',
+                 where: 'all',
+                 includeIgnored: 'only'
+               }
+             });
+           }
+
+           if (opts.what === 'edited' && context.history().difference().summary().length === 0) {
+             messageType = 'no_edits';
+           }
+
+           selection.select('.box .message').html('').call(_t.append('issues.no_issues.message.' + messageType));
+         }
+
+         context.validator().on('validated.uiSectionValidationStatus', function () {
+           window.requestIdleCallback(section.reRender);
+         });
+         context.map().on('move.uiSectionValidationStatus', debounce(function () {
+           window.requestIdleCallback(section.reRender);
+         }, 1000));
+         return section;
+       }
+
+       function uiPaneIssues(context) {
+         var issuesPane = uiPane('issues', context).key(_t('issues.key')).label(_t.html('issues.title')).description(_t.html('issues.title')).iconName('iD-icon-alert').sections([uiSectionValidationOptions(context), uiSectionValidationStatus(context), uiSectionValidationIssues('issues-errors', 'error', context), uiSectionValidationIssues('issues-warnings', 'warning', context), uiSectionValidationRules(context)]);
+         return issuesPane;
+       }
+
+       function uiSettingsCustomData(context) {
+         var dispatch = dispatch$8('change');
+
+         function render(selection) {
+           var dataLayer = context.layers().layer('data'); // keep separate copies of original and current settings
+
+           var _origSettings = {
+             fileList: dataLayer && dataLayer.fileList() || null,
+             url: corePreferences('settings-custom-data-url')
+           };
+           var _currSettings = {
+             fileList: dataLayer && dataLayer.fileList() || null,
+             url: corePreferences('settings-custom-data-url')
+           }; // var example = 'https://{switch:a,b,c}.tile.openstreetmap.org/{zoom}/{x}/{y}.png';
+
+           var modal = uiConfirm(selection).okButton();
+           modal.classed('settings-modal settings-custom-data', true);
+           modal.select('.modal-section.header').append('h3').call(_t.append('settings.custom_data.header'));
+           var textSection = modal.select('.modal-section.message-text');
+           textSection.append('pre').attr('class', 'instructions-file').call(_t.append('settings.custom_data.file.instructions'));
+           textSection.append('input').attr('class', 'field-file').attr('type', 'file').attr('accept', '.gpx,.kml,.geojson,.json,application/gpx+xml,application/vnd.google-earth.kml+xml,application/geo+json,application/json').property('files', _currSettings.fileList) // works for all except IE11
+           .on('change', function (d3_event) {
+             var files = d3_event.target.files;
+
+             if (files && files.length) {
+               _currSettings.url = '';
+               textSection.select('.field-url').property('value', '');
+               _currSettings.fileList = files;
+             } else {
+               _currSettings.fileList = null;
+             }
+           });
+           textSection.append('h4').call(_t.append('settings.custom_data.or'));
+           textSection.append('pre').attr('class', 'instructions-url').call(_t.append('settings.custom_data.url.instructions'));
+           textSection.append('textarea').attr('class', 'field-url').attr('placeholder', _t('settings.custom_data.url.placeholder')).call(utilNoAuto).property('value', _currSettings.url); // insert a cancel button
+
+           var buttonSection = modal.select('.modal-section.buttons');
+           buttonSection.insert('button', '.ok-button').attr('class', 'button cancel-button secondary-action').call(_t.append('confirm.cancel'));
+           buttonSection.select('.cancel-button').on('click.cancel', clickCancel);
+           buttonSection.select('.ok-button').attr('disabled', isSaveDisabled).on('click.save', clickSave);
+
+           function isSaveDisabled() {
+             return null;
+           } // restore the original url
+
+
+           function clickCancel() {
+             textSection.select('.field-url').property('value', _origSettings.url);
+             corePreferences('settings-custom-data-url', _origSettings.url);
+             this.blur();
+             modal.close();
+           } // accept the current url
+
+
+           function clickSave() {
+             _currSettings.url = textSection.select('.field-url').property('value').trim(); // one or the other but not both
+
+             if (_currSettings.url) {
+               _currSettings.fileList = null;
+             }
+
+             if (_currSettings.fileList) {
+               _currSettings.url = '';
+             }
+
+             corePreferences('settings-custom-data-url', _currSettings.url);
+             this.blur();
+             modal.close();
+             dispatch.call('change', this, _currSettings);
+           }
+         }
+
+         return utilRebind(render, dispatch, 'on');
+       }
+
+       function uiSectionDataLayers(context) {
+         var settingsCustomData = uiSettingsCustomData(context).on('change', customChanged);
+         var layers = context.layers();
+         var section = uiSection('data-layers', context).label(_t.html('map_data.data_layers')).disclosureContent(renderDisclosureContent);
+
+         function renderDisclosureContent(selection) {
+           var container = selection.selectAll('.data-layer-container').data([0]);
+           container.enter().append('div').attr('class', 'data-layer-container').merge(container).call(drawOsmItems).call(drawQAItems).call(drawCustomDataItems).call(drawVectorItems) // Beta - Detroit mapping challenge
+           .call(drawPanelItems);
+         }
+
+         function showsLayer(which) {
+           var layer = layers.layer(which);
+
+           if (layer) {
+             return layer.enabled();
+           }
+
+           return false;
+         }
+
+         function setLayer(which, enabled) {
+           // Don't allow layer changes while drawing - #6584
+           var mode = context.mode();
+           if (mode && /^draw/.test(mode.id)) return;
+           var layer = layers.layer(which);
+
+           if (layer) {
+             layer.enabled(enabled);
+
+             if (!enabled && (which === 'osm' || which === 'notes')) {
+               context.enter(modeBrowse(context));
+             }
+           }
+         }
+
+         function toggleLayer(which) {
+           setLayer(which, !showsLayer(which));
+         }
+
+         function drawOsmItems(selection) {
+           var osmKeys = ['osm', 'notes'];
+           var osmLayers = layers.all().filter(function (obj) {
+             return osmKeys.indexOf(obj.id) !== -1;
+           });
+           var ul = selection.selectAll('.layer-list-osm').data([0]);
+           ul = ul.enter().append('ul').attr('class', 'layer-list layer-list-osm').merge(ul);
+           var li = ul.selectAll('.list-item').data(osmLayers);
+           li.exit().remove();
+           var liEnter = li.enter().append('li').attr('class', function (d) {
+             return 'list-item list-item-' + d.id;
+           });
+           var labelEnter = liEnter.append('label').each(function (d) {
+             if (d.id === 'osm') {
+               select(this).call(uiTooltip().title(_t.html('map_data.layers.' + d.id + '.tooltip')).keys([uiCmd('⌥' + _t('area_fill.wireframe.key'))]).placement('bottom'));
+             } else {
+               select(this).call(uiTooltip().title(_t.html('map_data.layers.' + d.id + '.tooltip')).placement('bottom'));
+             }
+           });
+           labelEnter.append('input').attr('type', 'checkbox').on('change', function (d3_event, d) {
+             toggleLayer(d.id);
+           });
+           labelEnter.append('span').html(function (d) {
+             return _t.html('map_data.layers.' + d.id + '.title');
+           }); // Update
+
+           li.merge(liEnter).classed('active', function (d) {
+             return d.layer.enabled();
+           }).selectAll('input').property('checked', function (d) {
+             return d.layer.enabled();
+           });
+         }
+
+         function drawQAItems(selection) {
+           var qaKeys = ['keepRight', 'improveOSM', 'osmose'];
+           var qaLayers = layers.all().filter(function (obj) {
+             return qaKeys.indexOf(obj.id) !== -1;
+           });
+           var ul = selection.selectAll('.layer-list-qa').data([0]);
+           ul = ul.enter().append('ul').attr('class', 'layer-list layer-list-qa').merge(ul);
+           var li = ul.selectAll('.list-item').data(qaLayers);
+           li.exit().remove();
+           var liEnter = li.enter().append('li').attr('class', function (d) {
+             return 'list-item list-item-' + d.id;
+           });
+           var labelEnter = liEnter.append('label').each(function (d) {
+             select(this).call(uiTooltip().title(_t.html('map_data.layers.' + d.id + '.tooltip')).placement('bottom'));
+           });
+           labelEnter.append('input').attr('type', 'checkbox').on('change', function (d3_event, d) {
+             toggleLayer(d.id);
+           });
+           labelEnter.append('span').html(function (d) {
+             return _t.html('map_data.layers.' + d.id + '.title');
+           }); // Update
+
+           li.merge(liEnter).classed('active', function (d) {
+             return d.layer.enabled();
+           }).selectAll('input').property('checked', function (d) {
+             return d.layer.enabled();
+           });
+         } // Beta feature - sample vector layers to support Detroit Mapping Challenge
+         // https://github.com/osmus/detroit-mapping-challenge
+
+
+         function drawVectorItems(selection) {
+           var dataLayer = layers.layer('data');
+           var vtData = [{
+             name: 'Detroit Neighborhoods/Parks',
+             src: 'neighborhoods-parks',
+             tooltip: 'Neighborhood boundaries and parks as compiled by City of Detroit in concert with community groups.',
+             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'
+           }, {
+             name: 'Detroit Composite POIs',
+             src: 'composite-poi',
+             tooltip: 'Fire Inspections, Business Licenses, and other public location data collated from the City of Detroit.',
+             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'
+           }, {
+             name: 'Detroit All-The-Places POIs',
+             src: 'alltheplaces-poi',
+             tooltip: 'Public domain business location data created by web scrapers.',
+             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'
+           }]; // Only show this if the map is around Detroit..
+
+           var detroit = geoExtent([-83.5, 42.1], [-82.8, 42.5]);
+           var showVectorItems = context.map().zoom() > 9 && detroit.contains(context.map().center());
+           var container = selection.selectAll('.vectortile-container').data(showVectorItems ? [0] : []);
+           container.exit().remove();
+           var containerEnter = container.enter().append('div').attr('class', 'vectortile-container');
+           containerEnter.append('h4').attr('class', 'vectortile-header').text('Detroit Vector Tiles (Beta)');
+           containerEnter.append('ul').attr('class', 'layer-list layer-list-vectortile');
+           containerEnter.append('div').attr('class', 'vectortile-footer').append('a').attr('target', '_blank').call(svgIcon('#iD-icon-out-link', 'inline')).attr('href', 'https://github.com/osmus/detroit-mapping-challenge').append('span').text('About these layers');
+           container = container.merge(containerEnter);
+           var ul = container.selectAll('.layer-list-vectortile');
+           var li = ul.selectAll('.list-item').data(vtData);
+           li.exit().remove();
+           var liEnter = li.enter().append('li').attr('class', function (d) {
+             return 'list-item list-item-' + d.src;
+           });
+           var labelEnter = liEnter.append('label').each(function (d) {
+             select(this).call(uiTooltip().title(d.tooltip).placement('top'));
+           });
+           labelEnter.append('input').attr('type', 'radio').attr('name', 'vectortile').on('change', selectVTLayer);
+           labelEnter.append('span').text(function (d) {
+             return d.name;
+           }); // Update
+
+           li.merge(liEnter).classed('active', isVTLayerSelected).selectAll('input').property('checked', isVTLayerSelected);
+
+           function isVTLayerSelected(d) {
+             return dataLayer && dataLayer.template() === d.template;
+           }
+
+           function selectVTLayer(d3_event, d) {
+             corePreferences('settings-custom-data-url', d.template);
+
+             if (dataLayer) {
+               dataLayer.template(d.template, d.src);
+               dataLayer.enabled(true);
+             }
+           }
+         }
+
+         function drawCustomDataItems(selection) {
+           var dataLayer = layers.layer('data');
+           var hasData = dataLayer && dataLayer.hasData();
+           var showsData = hasData && dataLayer.enabled();
+           var ul = selection.selectAll('.layer-list-data').data(dataLayer ? [0] : []); // Exit
+
+           ul.exit().remove(); // Enter
+
+           var ulEnter = ul.enter().append('ul').attr('class', 'layer-list layer-list-data');
+           var liEnter = ulEnter.append('li').attr('class', 'list-item-data');
+           var labelEnter = liEnter.append('label').call(uiTooltip().title(_t.html('map_data.layers.custom.tooltip')).placement('top'));
+           labelEnter.append('input').attr('type', 'checkbox').on('change', function () {
+             toggleLayer('data');
+           });
+           labelEnter.append('span').call(_t.append('map_data.layers.custom.title'));
+           liEnter.append('button').attr('class', 'open-data-options').call(uiTooltip().title(_t.html('settings.custom_data.tooltip')).placement(_mainLocalizer.textDirection() === 'rtl' ? 'right' : 'left')).on('click', function (d3_event) {
+             d3_event.preventDefault();
+             editCustom();
+           }).call(svgIcon('#iD-icon-more'));
+           liEnter.append('button').attr('class', 'zoom-to-data').call(uiTooltip().title(_t.html('map_data.layers.custom.zoom')).placement(_mainLocalizer.textDirection() === 'rtl' ? 'right' : 'left')).on('click', function (d3_event) {
+             if (select(this).classed('disabled')) return;
+             d3_event.preventDefault();
+             d3_event.stopPropagation();
+             dataLayer.fitZoom();
+           }).call(svgIcon('#iD-icon-framed-dot', 'monochrome')); // Update
+
+           ul = ul.merge(ulEnter);
+           ul.selectAll('.list-item-data').classed('active', showsData).selectAll('label').classed('deemphasize', !hasData).selectAll('input').property('disabled', !hasData).property('checked', showsData);
+           ul.selectAll('button.zoom-to-data').classed('disabled', !hasData);
+         }
+
+         function editCustom() {
+           context.container().call(settingsCustomData);
+         }
+
+         function customChanged(d) {
+           var dataLayer = layers.layer('data');
+
+           if (d && d.url) {
+             dataLayer.url(d.url);
+           } else if (d && d.fileList) {
+             dataLayer.fileList(d.fileList);
+           }
+         }
+
+         function drawPanelItems(selection) {
+           var panelsListEnter = selection.selectAll('.md-extras-list').data([0]).enter().append('ul').attr('class', 'layer-list md-extras-list');
+           var historyPanelLabelEnter = panelsListEnter.append('li').attr('class', 'history-panel-toggle-item').append('label').call(uiTooltip().title(_t.html('map_data.history_panel.tooltip')).keys([uiCmd('⌘⇧' + _t('info_panels.history.key'))]).placement('top'));
+           historyPanelLabelEnter.append('input').attr('type', 'checkbox').on('change', function (d3_event) {
+             d3_event.preventDefault();
+             context.ui().info.toggle('history');
+           });
+           historyPanelLabelEnter.append('span').call(_t.append('map_data.history_panel.title'));
+           var measurementPanelLabelEnter = panelsListEnter.append('li').attr('class', 'measurement-panel-toggle-item').append('label').call(uiTooltip().title(_t.html('map_data.measurement_panel.tooltip')).keys([uiCmd('⌘⇧' + _t('info_panels.measurement.key'))]).placement('top'));
+           measurementPanelLabelEnter.append('input').attr('type', 'checkbox').on('change', function (d3_event) {
+             d3_event.preventDefault();
+             context.ui().info.toggle('measurement');
+           });
+           measurementPanelLabelEnter.append('span').call(_t.append('map_data.measurement_panel.title'));
+         }
+
+         context.layers().on('change.uiSectionDataLayers', section.reRender);
+         context.map().on('move.uiSectionDataLayers', debounce(function () {
+           // Detroit layers may have moved in or out of view
+           window.requestIdleCallback(section.reRender);
+         }, 1000));
+         return section;
+       }
+
+       function uiSectionMapFeatures(context) {
+         var _features = context.features().keys();
+
+         var section = uiSection('map-features', context).label(_t.html('map_data.map_features')).disclosureContent(renderDisclosureContent).expandedByDefault(false);
+
+         function renderDisclosureContent(selection) {
+           var container = selection.selectAll('.layer-feature-list-container').data([0]);
+           var containerEnter = container.enter().append('div').attr('class', 'layer-feature-list-container');
+           containerEnter.append('ul').attr('class', 'layer-list layer-feature-list');
+           var footer = containerEnter.append('div').attr('class', 'feature-list-links section-footer');
+           footer.append('a').attr('class', 'feature-list-link').attr('role', 'button').attr('href', '#').call(_t.append('issues.disable_all')).on('click', function (d3_event) {
+             d3_event.preventDefault();
+             context.features().disableAll();
+           });
+           footer.append('a').attr('class', 'feature-list-link').attr('role', 'button').attr('href', '#').call(_t.append('issues.enable_all')).on('click', function (d3_event) {
+             d3_event.preventDefault();
+             context.features().enableAll();
+           }); // Update
+
+           container = container.merge(containerEnter);
+           container.selectAll('.layer-feature-list').call(drawListItems, _features, 'checkbox', 'feature', clickFeature, showsFeature);
+         }
+
+         function drawListItems(selection, data, type, name, change, active) {
+           var items = selection.selectAll('li').data(data); // Exit
+
+           items.exit().remove(); // Enter
+
+           var enter = items.enter().append('li').call(uiTooltip().title(function (d) {
+             var tip = _t.html(name + '.' + d + '.tooltip');
+
+             if (autoHiddenFeature(d)) {
+               var msg = showsLayer('osm') ? _t.html('map_data.autohidden') : _t.html('map_data.osmhidden');
+               tip += '<div>' + msg + '</div>';
+             }
+
+             return tip;
+           }).placement('top'));
+           var label = enter.append('label');
+           label.append('input').attr('type', type).attr('name', name).on('change', change);
+           label.append('span').html(function (d) {
+             return _t.html(name + '.' + d + '.description');
+           }); // Update
+
+           items = items.merge(enter);
+           items.classed('active', active).selectAll('input').property('checked', active).property('indeterminate', autoHiddenFeature);
+         }
+
+         function autoHiddenFeature(d) {
+           return context.features().autoHidden(d);
+         }
+
+         function showsFeature(d) {
+           return context.features().enabled(d);
+         }
+
+         function clickFeature(d3_event, d) {
+           context.features().toggle(d);
+         }
+
+         function showsLayer(id) {
+           var layer = context.layers().layer(id);
+           return layer && layer.enabled();
+         } // add listeners
+
+
+         context.features().on('change.map_features', section.reRender);
+         return section;
+       }
+
+       function uiSectionMapStyleOptions(context) {
+         var section = uiSection('fill-area', context).label(_t.html('map_data.style_options')).disclosureContent(renderDisclosureContent).expandedByDefault(false);
+
+         function renderDisclosureContent(selection) {
+           var container = selection.selectAll('.layer-fill-list').data([0]);
+           container.enter().append('ul').attr('class', 'layer-list layer-fill-list').merge(container).call(drawListItems, context.map().areaFillOptions, 'radio', 'area_fill', setFill, isActiveFill);
+           var container2 = selection.selectAll('.layer-visual-diff-list').data([0]);
+           container2.enter().append('ul').attr('class', 'layer-list layer-visual-diff-list').merge(container2).call(drawListItems, ['highlight_edits'], 'checkbox', 'visual_diff', toggleHighlightEdited, function () {
+             return context.surface().classed('highlight-edited');
+           });
+         }
+
+         function drawListItems(selection, data, type, name, change, active) {
+           var items = selection.selectAll('li').data(data); // Exit
+
+           items.exit().remove(); // Enter
+
+           var enter = items.enter().append('li').call(uiTooltip().title(function (d) {
+             return _t.html(name + '.' + d + '.tooltip');
+           }).keys(function (d) {
+             var key = d === 'wireframe' ? _t('area_fill.wireframe.key') : null;
+             if (d === 'highlight_edits') key = _t('map_data.highlight_edits.key');
+             return key ? [key] : null;
+           }).placement('top'));
+           var label = enter.append('label');
+           label.append('input').attr('type', type).attr('name', name).on('change', change);
+           label.append('span').html(function (d) {
+             return _t.html(name + '.' + d + '.description');
+           }); // Update
+
+           items = items.merge(enter);
+           items.classed('active', active).selectAll('input').property('checked', active).property('indeterminate', false);
+         }
+
+         function isActiveFill(d) {
+           return context.map().activeAreaFill() === d;
+         }
+
+         function toggleHighlightEdited(d3_event) {
+           d3_event.preventDefault();
+           context.map().toggleHighlightEdited();
+         }
+
+         function setFill(d3_event, d) {
+           context.map().activeAreaFill(d);
+         }
+
+         context.map().on('changeHighlighting.ui_style, changeAreaFill.ui_style', section.reRender);
+         return section;
+       }
+
+       function uiSectionPhotoOverlays(context) {
+         var layers = context.layers();
+         var section = uiSection('photo-overlays', context).label(_t.html('photo_overlays.title')).disclosureContent(renderDisclosureContent).expandedByDefault(false);
+
+         function renderDisclosureContent(selection) {
+           var container = selection.selectAll('.photo-overlay-container').data([0]);
+           container.enter().append('div').attr('class', 'photo-overlay-container').merge(container).call(drawPhotoItems).call(drawPhotoTypeItems).call(drawDateFilter).call(drawUsernameFilter);
+         }
+
+         function drawPhotoItems(selection) {
+           var photoKeys = context.photos().overlayLayerIDs();
+           var photoLayers = layers.all().filter(function (obj) {
+             return photoKeys.indexOf(obj.id) !== -1;
+           });
+           var data = photoLayers.filter(function (obj) {
+             return obj.layer.supported();
+           });
+
+           function layerSupported(d) {
+             return d.layer && d.layer.supported();
+           }
+
+           function layerEnabled(d) {
+             return layerSupported(d) && d.layer.enabled();
+           }
+
+           var ul = selection.selectAll('.layer-list-photos').data([0]);
+           ul = ul.enter().append('ul').attr('class', 'layer-list layer-list-photos').merge(ul);
+           var li = ul.selectAll('.list-item-photos').data(data);
+           li.exit().remove();
+           var liEnter = li.enter().append('li').attr('class', function (d) {
+             var classes = 'list-item-photos list-item-' + d.id;
+
+             if (d.id === 'mapillary-signs' || d.id === 'mapillary-map-features') {
+               classes += ' indented';
+             }
+
+             return classes;
+           });
+           var labelEnter = liEnter.append('label').each(function (d) {
+             var titleID;
+             if (d.id === 'mapillary-signs') titleID = 'mapillary.signs.tooltip';else if (d.id === 'mapillary') titleID = 'mapillary_images.tooltip';else if (d.id === 'kartaview') titleID = 'kartaview_images.tooltip';else titleID = d.id.replace(/-/g, '_') + '.tooltip';
+             select(this).call(uiTooltip().title(_t.html(titleID)).placement('top'));
+           });
+           labelEnter.append('input').attr('type', 'checkbox').on('change', function (d3_event, d) {
+             toggleLayer(d.id);
+           });
+           labelEnter.append('span').html(function (d) {
+             var id = d.id;
+             if (id === 'mapillary-signs') id = 'photo_overlays.traffic_signs';
+             return _t.html(id.replace(/-/g, '_') + '.title');
+           }); // Update
+
+           li.merge(liEnter).classed('active', layerEnabled).selectAll('input').property('checked', layerEnabled);
+         }
+
+         function drawPhotoTypeItems(selection) {
+           var data = context.photos().allPhotoTypes();
+
+           function typeEnabled(d) {
+             return context.photos().showsPhotoType(d);
+           }
+
+           var ul = selection.selectAll('.layer-list-photo-types').data([0]);
+           ul.exit().remove();
+           ul = ul.enter().append('ul').attr('class', 'layer-list layer-list-photo-types').merge(ul);
+           var li = ul.selectAll('.list-item-photo-types').data(context.photos().shouldFilterByPhotoType() ? data : []);
+           li.exit().remove();
+           var liEnter = li.enter().append('li').attr('class', function (d) {
+             return 'list-item-photo-types list-item-' + d;
+           });
+           var labelEnter = liEnter.append('label').each(function (d) {
+             select(this).call(uiTooltip().title(_t.html('photo_overlays.photo_type.' + d + '.tooltip')).placement('top'));
+           });
+           labelEnter.append('input').attr('type', 'checkbox').on('change', function (d3_event, d) {
+             context.photos().togglePhotoType(d);
+           });
+           labelEnter.append('span').html(function (d) {
+             return _t.html('photo_overlays.photo_type.' + d + '.title');
+           }); // Update
+
+           li.merge(liEnter).classed('active', typeEnabled).selectAll('input').property('checked', typeEnabled);
+         }
+
+         function drawDateFilter(selection) {
+           var data = context.photos().dateFilters();
+
+           function filterEnabled(d) {
+             return context.photos().dateFilterValue(d);
+           }
+
+           var ul = selection.selectAll('.layer-list-date-filter').data([0]);
+           ul.exit().remove();
+           ul = ul.enter().append('ul').attr('class', 'layer-list layer-list-date-filter').merge(ul);
+           var li = ul.selectAll('.list-item-date-filter').data(context.photos().shouldFilterByDate() ? data : []);
+           li.exit().remove();
+           var liEnter = li.enter().append('li').attr('class', 'list-item-date-filter');
+           var labelEnter = liEnter.append('label').each(function (d) {
+             select(this).call(uiTooltip().title(_t.html('photo_overlays.date_filter.' + d + '.tooltip')).placement('top'));
+           });
+           labelEnter.append('span').html(function (d) {
+             return _t.html('photo_overlays.date_filter.' + d + '.title');
+           });
+           labelEnter.append('input').attr('type', 'date').attr('class', 'list-item-input').attr('placeholder', _t('units.year_month_day')).call(utilNoAuto).each(function (d) {
+             utilGetSetValue(select(this), context.photos().dateFilterValue(d) || '');
+           }).on('change', function (d3_event, d) {
+             var value = utilGetSetValue(select(this)).trim();
+             context.photos().setDateFilter(d, value, true); // reload the displayed dates
+
+             li.selectAll('input').each(function (d) {
+               utilGetSetValue(select(this), context.photos().dateFilterValue(d) || '');
+             });
+           });
+           li = li.merge(liEnter).classed('active', filterEnabled);
+         }
+
+         function drawUsernameFilter(selection) {
+           function filterEnabled() {
+             return context.photos().usernames();
+           }
+
+           var ul = selection.selectAll('.layer-list-username-filter').data([0]);
+           ul.exit().remove();
+           ul = ul.enter().append('ul').attr('class', 'layer-list layer-list-username-filter').merge(ul);
+           var li = ul.selectAll('.list-item-username-filter').data(context.photos().shouldFilterByUsername() ? ['username-filter'] : []);
+           li.exit().remove();
+           var liEnter = li.enter().append('li').attr('class', 'list-item-username-filter');
+           var labelEnter = liEnter.append('label').each(function () {
+             select(this).call(uiTooltip().title(_t.html('photo_overlays.username_filter.tooltip')).placement('top'));
+           });
+           labelEnter.append('span').call(_t.append('photo_overlays.username_filter.title'));
+           labelEnter.append('input').attr('type', 'text').attr('class', 'list-item-input').call(utilNoAuto).property('value', usernameValue).on('change', function () {
+             var value = select(this).property('value');
+             context.photos().setUsernameFilter(value, true);
+             select(this).property('value', usernameValue);
+           });
+           li.merge(liEnter).classed('active', filterEnabled);
+
+           function usernameValue() {
+             var usernames = context.photos().usernames();
+             if (usernames) return usernames.join('; ');
+             return usernames;
+           }
+         }
+
+         function toggleLayer(which) {
+           setLayer(which, !showsLayer(which));
+         }
+
+         function showsLayer(which) {
+           var layer = layers.layer(which);
+
+           if (layer) {
+             return layer.enabled();
+           }
+
+           return false;
+         }
+
+         function setLayer(which, enabled) {
+           var layer = layers.layer(which);
+
+           if (layer) {
+             layer.enabled(enabled);
+           }
+         }
+
+         context.layers().on('change.uiSectionPhotoOverlays', section.reRender);
+         context.photos().on('change.uiSectionPhotoOverlays', section.reRender);
+         return section;
+       }
+
+       function uiPaneMapData(context) {
+         var mapDataPane = uiPane('map-data', context).key(_t('map_data.key')).label(_t.html('map_data.title')).description(_t.html('map_data.description')).iconName('iD-icon-data').sections([uiSectionDataLayers(context), uiSectionPhotoOverlays(context), uiSectionMapStyleOptions(context), uiSectionMapFeatures(context)]);
+         return mapDataPane;
+       }
+
+       function uiPanePreferences(context) {
+         var preferencesPane = uiPane('preferences', context).key(_t('preferences.key')).label(_t.html('preferences.title')).description(_t.html('preferences.description')).iconName('fas-user-cog').sections([uiSectionPrivacy(context)]);
+         return preferencesPane;
+       }
+
+       function uiInit(context) {
+         var _initCounter = 0;
+         var _needWidth = {};
+
+         var _lastPointerType;
+
+         function render(container) {
+           container.on('click.ui', function (d3_event) {
+             // we're only concerned with the primary mouse button
+             if (d3_event.button !== 0) return;
+             if (!d3_event.composedPath) return; // some targets have default click events we don't want to override
+
+             var isOkayTarget = d3_event.composedPath().some(function (node) {
+               // we only care about element nodes
+               return node.nodeType === 1 && ( // clicking <input> focuses it and/or changes a value
+               node.nodeName === 'INPUT' || // clicking <label> affects its <input> by default
+               node.nodeName === 'LABEL' || // clicking <a> opens a hyperlink by default
+               node.nodeName === 'A');
+             });
+             if (isOkayTarget) return; // disable double-tap-to-zoom on touchscreens
+
+             d3_event.preventDefault();
+           });
+           var detected = utilDetect(); // only WebKit supports gesture events
+
+           if ('GestureEvent' in window && // Listening for gesture events on iOS 13.4+ breaks double-tapping,
+           // but we only need to do this on desktop Safari anyway. – #7694
+           !detected.isMobileWebKit) {
+             // On iOS we disable pinch-to-zoom of the UI via the `touch-action`
+             // CSS property, but on desktop Safari we need to manually cancel the
+             // default gesture events.
+             container.on('gesturestart.ui gesturechange.ui gestureend.ui', function (d3_event) {
+               // disable pinch-to-zoom of the UI via multitouch trackpads on macOS Safari
+               d3_event.preventDefault();
+             });
+           }
+
+           if ('PointerEvent' in window) {
+             select(window).on('pointerdown.ui pointerup.ui', function (d3_event) {
+               var pointerType = d3_event.pointerType || 'mouse';
+
+               if (_lastPointerType !== pointerType) {
+                 _lastPointerType = pointerType;
+                 container.attr('pointer', pointerType);
+               }
+             }, true);
+           } else {
+             _lastPointerType = 'mouse';
+             container.attr('pointer', 'mouse');
+           }
+
+           container.attr('lang', _mainLocalizer.localeCode()).attr('dir', _mainLocalizer.textDirection()); // setup fullscreen keybindings (no button shown at this time)
+
+           container.call(uiFullScreen(context));
+           var map = context.map();
+           map.redrawEnable(false); // don't draw until we've set zoom/lat/long
+
+           map.on('hitMinZoom.ui', function () {
+             ui.flash.iconName('#iD-icon-no').label(_t.html('cannot_zoom'))();
+           });
+           container.append('svg').attr('id', 'ideditor-defs').call(ui.svgDefs);
+           container.append('div').attr('class', 'sidebar').call(ui.sidebar);
+           var content = container.append('div').attr('class', 'main-content active'); // Top toolbar
+
+           content.append('div').attr('class', 'top-toolbar-wrap').append('div').attr('class', 'top-toolbar fillD').call(uiTopToolbar(context));
+           content.append('div').attr('class', 'main-map').attr('dir', 'ltr').call(map);
+           var overMap = content.append('div').attr('class', 'over-map'); // HACK: Mobile Safari 14 likes to select anything selectable when long-
+           // pressing, even if it's not targeted. This conflicts with long-pressing
+           // to show the edit menu. We add a selectable offscreen element as the first
+           // child to trick Safari into not showing the selection UI.
+
+           overMap.append('div').attr('class', 'select-trap').text('t');
+           overMap.call(uiMapInMap(context)).call(uiNotice(context));
+           overMap.append('div').attr('class', 'spinner').call(uiSpinner(context)); // Map controls
+
+           var controlsWrap = overMap.append('div').attr('class', 'map-controls-wrap');
+           var controls = controlsWrap.append('div').attr('class', 'map-controls');
+           controls.append('div').attr('class', 'map-control zoombuttons').call(uiZoom(context));
+           controls.append('div').attr('class', 'map-control zoom-to-selection-control').call(uiZoomToSelection(context));
+           controls.append('div').attr('class', 'map-control geolocate-control').call(uiGeolocate(context));
+           controlsWrap.on('wheel.mapControls', function (d3_event) {
+             if (!d3_event.deltaX) {
+               controlsWrap.node().scrollTop += d3_event.deltaY;
+             }
+           }); // Add panes
+           // This should happen after map is initialized, as some require surface()
+
+           var panes = overMap.append('div').attr('class', 'map-panes');
+           var uiPanes = [uiPaneBackground(context), uiPaneMapData(context), uiPaneIssues(context), uiPanePreferences(context), uiPaneHelp(context)];
+           uiPanes.forEach(function (pane) {
+             controls.append('div').attr('class', 'map-control map-pane-control ' + pane.id + '-control').call(pane.renderToggleButton);
+             panes.call(pane.renderPane);
+           });
+           ui.info = uiInfo(context);
+           overMap.call(ui.info);
+           overMap.append('div').attr('class', 'photoviewer').classed('al', true) // 'al'=left,  'ar'=right
+           .classed('hide', true).call(ui.photoviewer);
+           overMap.append('div').attr('class', 'attribution-wrap').attr('dir', 'ltr').call(uiAttribution(context)); // Add footer
+
+           var about = content.append('div').attr('class', 'map-footer');
+           about.append('div').attr('class', 'api-status').call(uiStatus(context));
+           var footer = about.append('div').attr('class', 'map-footer-bar fillD');
+           footer.append('div').attr('class', 'flash-wrap footer-hide');
+           var footerWrap = footer.append('div').attr('class', 'main-footer-wrap footer-show');
+           footerWrap.append('div').attr('class', 'scale-block').call(uiScale(context));
+           var aboutList = footerWrap.append('div').attr('class', 'info-block').append('ul').attr('class', 'map-footer-list');
+           aboutList.append('li').attr('class', 'user-list').call(uiContributors(context));
+           var apiConnections = context.apiConnections();
+
+           if (apiConnections && apiConnections.length > 1) {
+             aboutList.append('li').attr('class', 'source-switch').call(uiSourceSwitch(context).keys(apiConnections));
+           }
+
+           aboutList.append('li').attr('class', 'issues-info').call(uiIssuesInfo(context));
+           aboutList.append('li').attr('class', 'feature-warning').call(uiFeatureInfo(context));
+           var issueLinks = aboutList.append('li');
+           issueLinks.append('a').attr('target', '_blank').attr('href', 'https://github.com/openstreetmap/iD/issues').attr('aria-label', _t('report_a_bug')).call(svgIcon('#iD-icon-bug', 'light')).call(uiTooltip().title(_t.html('report_a_bug')).placement('top'));
+           issueLinks.append('a').attr('target', '_blank').attr('href', 'https://github.com/openstreetmap/iD/blob/develop/CONTRIBUTING.md#translating').attr('aria-label', _t('help_translate')).call(svgIcon('#iD-icon-translate', 'light')).call(uiTooltip().title(_t.html('help_translate')).placement('top'));
+           aboutList.append('li').attr('class', 'version').call(uiVersion(context));
+
+           if (!context.embed()) {
+             aboutList.call(uiAccount(context));
+           } // Setup map dimensions and move map to initial center/zoom.
+           // This should happen after .main-content and toolbars exist.
+
+
+           ui.onResize();
+           map.redrawEnable(true);
+           ui.hash = behaviorHash(context);
+           ui.hash();
+
+           if (!ui.hash.hadHash) {
+             map.centerZoom([0, 0], 2);
+           } // Bind events
+
+
+           window.onbeforeunload = function () {
+             return context.save();
+           };
+
+           window.onunload = function () {
+             context.history().unlock();
+           };
+
+           select(window).on('resize.editor', function () {
+             ui.onResize();
+           });
+           var panPixels = 80;
+           context.keybinding().on('⌫', function (d3_event) {
+             d3_event.preventDefault();
+           }).on([_t('sidebar.key'), '`', '²', '@'], ui.sidebar.toggle) // #5663, #6864 - common QWERTY, AZERTY
+           .on('←', pan([panPixels, 0])).on('↑', pan([0, panPixels])).on('→', pan([-panPixels, 0])).on('↓', pan([0, -panPixels])).on(uiCmd('⌥←'), pan([map.dimensions()[0], 0])).on(uiCmd('⌥↑'), pan([0, map.dimensions()[1]])).on(uiCmd('⌥→'), pan([-map.dimensions()[0], 0])).on(uiCmd('⌥↓'), pan([0, -map.dimensions()[1]])).on(uiCmd('⌘' + _t('background.key')), function quickSwitch(d3_event) {
+             if (d3_event) {
+               d3_event.stopImmediatePropagation();
+               d3_event.preventDefault();
+             }
+
+             var previousBackground = context.background().findSource(corePreferences('background-last-used-toggle'));
+
+             if (previousBackground) {
+               var currentBackground = context.background().baseLayerSource();
+               corePreferences('background-last-used-toggle', currentBackground.id);
+               corePreferences('background-last-used', previousBackground.id);
+               context.background().baseLayerSource(previousBackground);
+             }
+           }).on(_t('area_fill.wireframe.key'), function toggleWireframe(d3_event) {
+             d3_event.preventDefault();
+             d3_event.stopPropagation();
+             context.map().toggleWireframe();
+           }).on(uiCmd('⌥' + _t('area_fill.wireframe.key')), function toggleOsmData(d3_event) {
+             d3_event.preventDefault();
+             d3_event.stopPropagation(); // Don't allow layer changes while drawing - #6584
+
+             var mode = context.mode();
+             if (mode && /^draw/.test(mode.id)) return;
+             var layer = context.layers().layer('osm');
+
+             if (layer) {
+               layer.enabled(!layer.enabled());
+
+               if (!layer.enabled()) {
+                 context.enter(modeBrowse(context));
+               }
+             }
+           }).on(_t('map_data.highlight_edits.key'), function toggleHighlightEdited(d3_event) {
+             d3_event.preventDefault();
+             context.map().toggleHighlightEdited();
+           });
+           context.on('enter.editor', function (entered) {
+             container.classed('mode-' + entered.id, true);
+           }).on('exit.editor', function (exited) {
+             container.classed('mode-' + exited.id, false);
+           });
+           context.enter(modeBrowse(context));
+
+           if (!_initCounter++) {
+             if (!ui.hash.startWalkthrough) {
+               context.container().call(uiSplash(context)).call(uiRestore(context));
+             }
+
+             context.container().call(ui.shortcuts);
+           }
+
+           var osm = context.connection();
+           var auth = uiLoading(context).message(_t.html('loading_auth')).blocking(true);
+
+           if (osm && auth) {
+             osm.on('authLoading.ui', function () {
+               context.container().call(auth);
+             }).on('authDone.ui', function () {
+               auth.close();
+             });
+           }
+
+           _initCounter++;
+
+           if (ui.hash.startWalkthrough) {
+             ui.hash.startWalkthrough = false;
+             context.container().call(uiIntro(context));
+           }
+
+           function pan(d) {
+             return function (d3_event) {
+               if (d3_event.shiftKey) return;
+               if (context.container().select('.combobox').size()) return;
+               d3_event.preventDefault();
+               context.map().pan(d, 100);
+             };
+           }
+         }
+
+         var ui = {};
+
+         var _loadPromise; // renders the iD interface into the container node
+
+
+         ui.ensureLoaded = function () {
+           if (_loadPromise) return _loadPromise;
+           return _loadPromise = Promise.all([// must have strings and presets before loading the UI
+           _mainLocalizer.ensureLoaded(), _mainPresetIndex.ensureLoaded()]).then(function () {
+             if (!context.container().empty()) render(context.container());
+           })["catch"](function (err) {
+             return console.error(err);
+           }); // eslint-disable-line
+         }; // `ui.restart()` will destroy and rebuild the entire iD interface,
+         // for example to switch the locale while iD is running.
+
+
+         ui.restart = function () {
+           context.keybinding().clear();
+           _loadPromise = null;
+           context.container().selectAll('*').remove();
+           ui.ensureLoaded();
+         };
+
+         ui.lastPointerType = function () {
+           return _lastPointerType;
+         };
+
+         ui.svgDefs = svgDefs(context);
+         ui.flash = uiFlash(context);
+         ui.sidebar = uiSidebar(context);
+         ui.photoviewer = uiPhotoviewer(context);
+         ui.shortcuts = uiShortcuts(context);
+
+         ui.onResize = function (withPan) {
+           var map = context.map(); // Recalc dimensions of map and sidebar.. (`true` = force recalc)
+           // This will call `getBoundingClientRect` and trigger reflow,
+           //  but the values will be cached for later use.
+
+           var mapDimensions = utilGetDimensions(context.container().select('.main-content'), true);
+           utilGetDimensions(context.container().select('.sidebar'), true);
+
+           if (withPan !== undefined) {
+             map.redrawEnable(false);
+             map.pan(withPan);
+             map.redrawEnable(true);
+           }
+
+           map.dimensions(mapDimensions);
+           ui.photoviewer.onMapResize(); // check if header or footer have overflowed
+
+           ui.checkOverflow('.top-toolbar');
+           ui.checkOverflow('.map-footer-bar'); // Use outdated code so it works on Explorer
+
+           var resizeWindowEvent = document.createEvent('Event');
+           resizeWindowEvent.initEvent('resizeWindow', true, true);
+           document.dispatchEvent(resizeWindowEvent);
+         }; // Call checkOverflow when resizing or whenever the contents change.
+
+
+         ui.checkOverflow = function (selector, reset) {
+           if (reset) {
+             delete _needWidth[selector];
+           }
+
+           var selection = context.container().select(selector);
+           if (selection.empty()) return;
+           var scrollWidth = selection.property('scrollWidth');
+           var clientWidth = selection.property('clientWidth');
+           var needed = _needWidth[selector] || scrollWidth;
+
+           if (scrollWidth > clientWidth) {
+             // overflow happening
+             selection.classed('narrow', true);
+
+             if (!_needWidth[selector]) {
+               _needWidth[selector] = scrollWidth;
+             }
+           } else if (scrollWidth >= needed) {
+             selection.classed('narrow', false);
+           }
+         };
+
+         ui.togglePanes = function (showPane) {
+           var hidePanes = context.container().selectAll('.map-pane.shown');
+           var side = _mainLocalizer.textDirection() === 'ltr' ? 'right' : 'left';
+           hidePanes.classed('shown', false).classed('hide', true);
+           context.container().selectAll('.map-pane-control button').classed('active', false);
+
+           if (showPane) {
+             hidePanes.classed('shown', false).classed('hide', true).style(side, '-500px');
+             context.container().selectAll('.' + showPane.attr('pane') + '-control button').classed('active', true);
+             showPane.classed('shown', true).classed('hide', false);
+
+             if (hidePanes.empty()) {
+               showPane.style(side, '-500px').transition().duration(200).style(side, '0px');
+             } else {
+               showPane.style(side, '0px');
+             }
+           } else {
+             hidePanes.classed('shown', true).classed('hide', false).style(side, '0px').transition().duration(200).style(side, '-500px').on('end', function () {
+               select(this).classed('shown', false).classed('hide', true);
+             });
+           }
+         };
+
+         var _editMenu = uiEditMenu(context);
+
+         ui.editMenu = function () {
+           return _editMenu;
+         };
+
+         ui.showEditMenu = function (anchorPoint, triggerType, operations) {
+           // remove any displayed menu
+           ui.closeEditMenu();
+           if (!operations && context.mode().operations) operations = context.mode().operations();
+           if (!operations || !operations.length) return; // disable menu if in wide selection, for example
+
+           if (!context.map().editableDataEnabled()) return;
+           var surfaceNode = context.surface().node();
+
+           if (surfaceNode.focus) {
+             // FF doesn't support it
+             // focus the surface or else clicking off the menu may not trigger modeBrowse
+             surfaceNode.focus();
+           }
+
+           operations.forEach(function (operation) {
+             if (operation.point) operation.point(anchorPoint);
+           });
+
+           _editMenu.anchorLoc(anchorPoint).triggerType(triggerType).operations(operations); // render the menu
+
+
+           context.map().supersurface.call(_editMenu);
+         };
+
+         ui.closeEditMenu = function () {
+           // remove any existing menu no matter how it was added
+           context.map().supersurface.select('.edit-menu').remove();
+         };
+
+         var _saveLoading = select(null);
+
+         context.uploader().on('saveStarted.ui', function () {
+           _saveLoading = uiLoading(context).message(_t.html('save.uploading')).blocking(true);
+           context.container().call(_saveLoading); // block input during upload
+         }).on('saveEnded.ui', function () {
+           _saveLoading.close();
+
+           _saveLoading = select(null);
+         });
+         return ui;
+       }
+
+       function coreContext() {
+         var _this = this;
+
+         var dispatch = dispatch$8('enter', 'exit', 'change');
+         var context = utilRebind({}, dispatch, 'on');
+
+         var _deferred = new Set();
+
+         context.version = '2.20.4';
+         context.privacyVersion = '20201202'; // iD will alter the hash so cache the parameters intended to setup the session
+
+         context.initialHashParams = window.location.hash ? utilStringQs(window.location.hash) : {};
+         /* Changeset */
+         // An osmChangeset object. Not loaded until needed.
+
+         context.changeset = null;
+         var _defaultChangesetComment = context.initialHashParams.comment;
+         var _defaultChangesetSource = context.initialHashParams.source;
+         var _defaultChangesetHashtags = context.initialHashParams.hashtags;
+
+         context.defaultChangesetComment = function (val) {
+           if (!arguments.length) return _defaultChangesetComment;
+           _defaultChangesetComment = val;
+           return context;
+         };
+
+         context.defaultChangesetSource = function (val) {
+           if (!arguments.length) return _defaultChangesetSource;
+           _defaultChangesetSource = val;
+           return context;
+         };
+
+         context.defaultChangesetHashtags = function (val) {
+           if (!arguments.length) return _defaultChangesetHashtags;
+           _defaultChangesetHashtags = val;
+           return context;
+         };
+         /* Document title */
+
+         /* (typically shown as the label for the browser window/tab) */
+         // If true, iD will update the title based on what the user is doing
+
+
+         var _setsDocumentTitle = true;
+
+         context.setsDocumentTitle = function (val) {
+           if (!arguments.length) return _setsDocumentTitle;
+           _setsDocumentTitle = val;
+           return context;
+         }; // The part of the title that is always the same
+
+
+         var _documentTitleBase = document.title;
+
+         context.documentTitleBase = function (val) {
+           if (!arguments.length) return _documentTitleBase;
+           _documentTitleBase = val;
+           return context;
+         };
+         /* User interface and keybinding */
+
+
+         var _ui;
+
+         context.ui = function () {
+           return _ui;
+         };
+
+         context.lastPointerType = function () {
+           return _ui.lastPointerType();
+         };
+
+         var _keybinding = utilKeybinding('context');
+
+         context.keybinding = function () {
+           return _keybinding;
+         };
+
+         select(document).call(_keybinding);
+         /* Straight accessors. Avoid using these if you can. */
+         // Instantiate the connection here because it doesn't require passing in
+         // `context` and it's needed for pre-init calls like `preauth`
+
+         var _connection = services.osm;
+
+         var _history;
+
+         var _validator;
+
+         var _uploader;
+
+         context.connection = function () {
+           return _connection;
+         };
+
+         context.history = function () {
+           return _history;
+         };
+
+         context.validator = function () {
+           return _validator;
+         };
+
+         context.uploader = function () {
+           return _uploader;
+         };
+         /* Connection */
+
+
+         context.preauth = function (options) {
+           if (_connection) {
+             _connection["switch"](options);
+           }
+
+           return context;
+         };
+         /* connection options for source switcher (optional) */
+
+
+         var _apiConnections;
+
+         context.apiConnections = function (val) {
+           if (!arguments.length) return _apiConnections;
+           _apiConnections = val;
+           return context;
+         }; // A string or array or locale codes to prefer over the browser's settings
+
+
+         context.locale = function (locale) {
+           if (!arguments.length) return _mainLocalizer.localeCode();
+           _mainLocalizer.preferredLocaleCodes(locale);
+           return context;
+         };
+
+         function afterLoad(cid, callback) {
+           return function (err, result) {
+             if (err) {
+               // 400 Bad Request, 401 Unauthorized, 403 Forbidden..
+               if (err.status === 400 || err.status === 401 || err.status === 403) {
+                 if (_connection) {
+                   _connection.logout();
+                 }
+               }
+
+               if (typeof callback === 'function') {
+                 callback(err);
+               }
+
+               return;
+             } else if (_connection && _connection.getConnectionId() !== cid) {
+               if (typeof callback === 'function') {
+                 callback({
+                   message: 'Connection Switched',
+                   status: -1
+                 });
+               }
+
+               return;
+             } else {
+               _history.merge(result.data, result.extent);
+
+               if (typeof callback === 'function') {
+                 callback(err, result);
+               }
+
+               return;
+             }
+           };
+         }
+
+         context.loadTiles = function (projection, callback) {
+           var handle = window.requestIdleCallback(function () {
+             _deferred["delete"](handle);
+
+             if (_connection && context.editableDataEnabled()) {
+               var cid = _connection.getConnectionId();
+
+               _connection.loadTiles(projection, afterLoad(cid, callback));
+             }
+           });
+
+           _deferred.add(handle);
+         };
+
+         context.loadTileAtLoc = function (loc, callback) {
+           var handle = window.requestIdleCallback(function () {
+             _deferred["delete"](handle);
+
+             if (_connection && context.editableDataEnabled()) {
+               var cid = _connection.getConnectionId();
+
+               _connection.loadTileAtLoc(loc, afterLoad(cid, callback));
+             }
+           });
+
+           _deferred.add(handle);
+         }; // Download the full entity and its parent relations. The callback may be called multiple times.
+
+
+         context.loadEntity = function (entityID, callback) {
+           if (_connection) {
+             var cid = _connection.getConnectionId();
+
+             _connection.loadEntity(entityID, afterLoad(cid, callback)); // We need to fetch the parent relations separately.
+
+
+             _connection.loadEntityRelations(entityID, afterLoad(cid, callback));
+           }
+         };
+
+         context.zoomToEntity = function (entityID, zoomTo) {
+           // be sure to load the entity even if we're not going to zoom to it
+           context.loadEntity(entityID, function (err, result) {
+             if (err) return;
+
+             if (zoomTo !== false) {
+               var entity = result.data.find(function (e) {
+                 return e.id === entityID;
+               });
+
+               if (entity) {
+                 _map.zoomTo(entity);
+               }
+             }
+           });
+
+           _map.on('drawn.zoomToEntity', function () {
+             if (!context.hasEntity(entityID)) return;
+
+             _map.on('drawn.zoomToEntity', null);
+
+             context.on('enter.zoomToEntity', null);
+             context.enter(modeSelect(context, [entityID]));
+           });
+
+           context.on('enter.zoomToEntity', function () {
+             if (_mode.id !== 'browse') {
+               _map.on('drawn.zoomToEntity', null);
+
+               context.on('enter.zoomToEntity', null);
+             }
+           });
+         };
+
+         var _minEditableZoom = 16;
+
+         context.minEditableZoom = function (val) {
+           if (!arguments.length) return _minEditableZoom;
+           _minEditableZoom = val;
+
+           if (_connection) {
+             _connection.tileZoom(val);
+           }
+
+           return context;
+         }; // String length limits in Unicode characters, not JavaScript UTF-16 code units
+
+
+         context.maxCharsForTagKey = function () {
+           return 255;
+         };
+
+         context.maxCharsForTagValue = function () {
+           return 255;
+         };
+
+         context.maxCharsForRelationRole = function () {
+           return 255;
+         };
+
+         function cleanOsmString(val, maxChars) {
+           // be lenient with input
+           if (val === undefined || val === null) {
+             val = '';
+           } else {
+             val = val.toString();
+           } // remove whitespace
+
+
+           val = val.trim(); // use the canonical form of the string
+
+           if (val.normalize) val = val.normalize('NFC'); // trim to the number of allowed characters
+
+           return utilUnicodeCharsTruncated(val, maxChars);
+         }
+
+         context.cleanTagKey = function (val) {
+           return cleanOsmString(val, context.maxCharsForTagKey());
+         };
+
+         context.cleanTagValue = function (val) {
+           return cleanOsmString(val, context.maxCharsForTagValue());
+         };
+
+         context.cleanRelationRole = function (val) {
+           return cleanOsmString(val, context.maxCharsForRelationRole());
+         };
+         /* History */
+
+
+         var _inIntro = false;
+
+         context.inIntro = function (val) {
+           if (!arguments.length) return _inIntro;
+           _inIntro = val;
+           return context;
+         }; // Immediately save the user's history to localstorage, if possible
+         // This is called someteimes, but also on the `window.onbeforeunload` handler
+
+
+         context.save = function () {
+           // no history save, no message onbeforeunload
+           if (_inIntro || context.container().select('.modal').size()) return;
+           var canSave;
+
+           if (_mode && _mode.id === 'save') {
+             canSave = false; // Attempt to prevent user from creating duplicate changes - see #5200
+
+             if (services.osm && services.osm.isChangesetInflight()) {
+               _history.clearSaved();
+
+               return;
+             }
+           } else {
+             canSave = context.selectedIDs().every(function (id) {
+               var entity = context.hasEntity(id);
+               return entity && !entity.isDegenerate();
+             });
+           }
+
+           if (canSave) {
+             _history.save();
+           }
+
+           if (_history.hasChanges()) {
+             return _t('save.unsaved_changes');
+           }
+         }; // Debounce save, since it's a synchronous localStorage write,
+         // and history changes can happen frequently (e.g. when dragging).
+
+
+         context.debouncedSave = debounce(context.save, 350);
+
+         function withDebouncedSave(fn) {
+           return function () {
+             var result = fn.apply(_history, arguments);
+             context.debouncedSave();
+             return result;
+           };
+         }
+         /* Graph */
+
+
+         context.hasEntity = function (id) {
+           return _history.graph().hasEntity(id);
+         };
+
+         context.entity = function (id) {
+           return _history.graph().entity(id);
+         };
+         /* Modes */
+
+
+         var _mode;
+
+         context.mode = function () {
+           return _mode;
+         };
+
+         context.enter = function (newMode) {
+           if (_mode) {
+             _mode.exit();
+
+             dispatch.call('exit', _this, _mode);
+           }
+
+           _mode = newMode;
+
+           _mode.enter();
+
+           dispatch.call('enter', _this, _mode);
+         };
+
+         context.selectedIDs = function () {
+           return _mode && _mode.selectedIDs && _mode.selectedIDs() || [];
+         };
+
+         context.activeID = function () {
+           return _mode && _mode.activeID && _mode.activeID();
+         };
+
+         var _selectedNoteID;
+
+         context.selectedNoteID = function (noteID) {
+           if (!arguments.length) return _selectedNoteID;
+           _selectedNoteID = noteID;
+           return context;
+         }; // NOTE: Don't change the name of this until UI v3 is merged
+
+
+         var _selectedErrorID;
+
+         context.selectedErrorID = function (errorID) {
+           if (!arguments.length) return _selectedErrorID;
+           _selectedErrorID = errorID;
+           return context;
+         };
+         /* Behaviors */
+
+
+         context.install = function (behavior) {
+           return context.surface().call(behavior);
+         };
+
+         context.uninstall = function (behavior) {
+           return context.surface().call(behavior.off);
+         };
+         /* Copy/Paste */
+
+
+         var _copyGraph;
+
+         context.copyGraph = function () {
+           return _copyGraph;
+         };
+
+         var _copyIDs = [];
+
+         context.copyIDs = function (val) {
+           if (!arguments.length) return _copyIDs;
+           _copyIDs = val;
+           _copyGraph = _history.graph();
+           return context;
+         };
+
+         var _copyLonLat;
+
+         context.copyLonLat = function (val) {
+           if (!arguments.length) return _copyLonLat;
+           _copyLonLat = val;
+           return context;
+         };
+         /* Background */
+
+
+         var _background;
+
+         context.background = function () {
+           return _background;
+         };
+         /* Features */
+
+
+         var _features;
+
+         context.features = function () {
+           return _features;
+         };
+
+         context.hasHiddenConnections = function (id) {
+           var graph = _history.graph();
+
+           var entity = graph.entity(id);
+           return _features.hasHiddenConnections(entity, graph);
+         };
+         /* Photos */
+
+
+         var _photos;
+
+         context.photos = function () {
+           return _photos;
+         };
+         /* Map */
+
+
+         var _map;
+
+         context.map = function () {
+           return _map;
+         };
+
+         context.layers = function () {
+           return _map.layers();
+         };
+
+         context.surface = function () {
+           return _map.surface;
+         };
+
+         context.editableDataEnabled = function () {
+           return _map.editableDataEnabled();
+         };
+
+         context.surfaceRect = function () {
+           return _map.surface.node().getBoundingClientRect();
+         };
+
+         context.editable = function () {
+           // don't allow editing during save
+           var mode = context.mode();
+           if (!mode || mode.id === 'save') return false;
+           return _map.editableDataEnabled();
+         };
+         /* Debug */
+
+
+         var _debugFlags = {
+           tile: false,
+           // tile boundaries
+           collision: false,
+           // label collision bounding boxes
+           imagery: false,
+           // imagery bounding polygons
+           target: false,
+           // touch targets
+           downloaded: false // downloaded data from osm
+
+         };
+
+         context.debugFlags = function () {
+           return _debugFlags;
+         };
+
+         context.getDebug = function (flag) {
+           return flag && _debugFlags[flag];
+         };
+
+         context.setDebug = function (flag, val) {
+           if (arguments.length === 1) val = true;
+           _debugFlags[flag] = val;
+           dispatch.call('change');
+           return context;
+         };
+         /* Container */
+
+
+         var _container = select(null);
+
+         context.container = function (val) {
+           if (!arguments.length) return _container;
+           _container = val;
+
+           _container.classed('ideditor', true);
+
+           return context;
+         };
+
+         context.containerNode = function (val) {
+           if (!arguments.length) return context.container().node();
+           context.container(select(val));
+           return context;
+         };
+
+         var _embed;
+
+         context.embed = function (val) {
+           if (!arguments.length) return _embed;
+           _embed = val;
+           return context;
+         };
+         /* Assets */
+
+
+         var _assetPath = '';
+
+         context.assetPath = function (val) {
+           if (!arguments.length) return _assetPath;
+           _assetPath = val;
+           _mainFileFetcher.assetPath(val);
+           return context;
+         };
+
+         var _assetMap = {};
+
+         context.assetMap = function (val) {
+           if (!arguments.length) return _assetMap;
+           _assetMap = val;
+           _mainFileFetcher.assetMap(val);
+           return context;
+         };
+
+         context.asset = function (val) {
+           if (/^http(s)?:\/\//i.test(val)) return val;
+           var filename = _assetPath + val;
+           return _assetMap[filename] || filename;
+         };
+
+         context.imagePath = function (val) {
+           return context.asset("img/".concat(val));
+         };
+         /* reset (aka flush) */
+
+
+         context.reset = context.flush = function () {
+           context.debouncedSave.cancel();
+           Array.from(_deferred).forEach(function (handle) {
+             window.cancelIdleCallback(handle);
+
+             _deferred["delete"](handle);
+           });
+           Object.values(services).forEach(function (service) {
+             if (service && typeof service.reset === 'function') {
+               service.reset(context);
+             }
+           });
+           context.changeset = null;
+
+           _validator.reset();
+
+           _features.reset();
+
+           _history.reset();
+
+           _uploader.reset(); // don't leave stale state in the inspector
+
+
+           context.container().select('.inspector-wrap *').remove();
+           return context;
+         };
+         /* Projections */
+
+
+         context.projection = geoRawMercator();
+         context.curtainProjection = geoRawMercator();
+         /* Init */
+
+         context.init = function () {
+           instantiateInternal();
+           initializeDependents();
+           return context; // Load variables and properties. No property of `context` should be accessed
+           // until this is complete since load statuses are indeterminate. The order
+           // of instantiation shouldn't matter.
+
+           function instantiateInternal() {
+             _history = coreHistory(context);
+             context.graph = _history.graph;
+             context.pauseChangeDispatch = _history.pauseChangeDispatch;
+             context.resumeChangeDispatch = _history.resumeChangeDispatch;
+             context.perform = withDebouncedSave(_history.perform);
+             context.replace = withDebouncedSave(_history.replace);
+             context.pop = withDebouncedSave(_history.pop);
+             context.overwrite = withDebouncedSave(_history.overwrite);
+             context.undo = withDebouncedSave(_history.undo);
+             context.redo = withDebouncedSave(_history.redo);
+             _validator = coreValidator(context);
+             _uploader = coreUploader(context);
+             _background = rendererBackground(context);
+             _features = rendererFeatures(context);
+             _map = rendererMap(context);
+             _photos = rendererPhotos(context);
+             _ui = uiInit(context);
+           } // Set up objects that might need to access properties of `context`. The order
+           // might matter if dependents make calls to each other. Be wary of async calls.
+
+
+           function initializeDependents() {
+             if (context.initialHashParams.presets) {
+               _mainPresetIndex.addablePresetIDs(new Set(context.initialHashParams.presets.split(',')));
+             }
+
+             if (context.initialHashParams.locale) {
+               _mainLocalizer.preferredLocaleCodes(context.initialHashParams.locale);
+             } // kick off some async work
+
+
+             _mainLocalizer.ensureLoaded();
+
+             _background.ensureLoaded();
+
+             _mainPresetIndex.ensureLoaded();
+             Object.values(services).forEach(function (service) {
+               if (service && typeof service.init === 'function') {
+                 service.init();
+               }
+             });
+
+             _map.init();
+
+             _validator.init();
+
+             _features.init();
+
+             if (services.maprules && context.initialHashParams.maprules) {
+               d3_json(context.initialHashParams.maprules).then(function (mapcss) {
+                 services.maprules.init();
+                 mapcss.forEach(function (mapcssSelector) {
+                   return services.maprules.addRule(mapcssSelector);
+                 });
+               })["catch"](function () {
+                 /* ignore */
+               });
+             } // if the container isn't available, e.g. when testing, don't load the UI
+
+
+             if (!context.container().empty()) {
+               _ui.ensureLoaded().then(function () {
+                 _photos.init();
+               });
+             }
+           }
+         };
+
+         return context;
+       }
+
+       // NSI contains the most correct tagging for many commonly mapped features.
+       // See https://github.com/osmlab/name-suggestion-index  and  https://nsi.guide
+       // DATA
+
+       var _nsiStatus = 'loading'; // 'loading', 'ok', 'failed'
+
+       var _nsi = {}; // Sometimes we can upgrade a feature tagged like `building=yes` to a better tag.
+
+       var buildingPreset = {
+         'building/commercial': true,
+         'building/government': true,
+         'building/hotel': true,
+         'building/retail': true,
+         'building/office': true,
+         'building/supermarket': true,
+         'building/yes': true
+       }; // Exceptions to the namelike regexes.
+       // Usually a tag suffix contains a language code like `name:en`, `name:ru`
+       // but we want to exclude things like `operator:type`, `name:etymology`, etc..
+
+       var notNames = /:(colou?r|type|forward|backward|left|right|etymology|pronunciation|wikipedia)$/i; // Exceptions to the branchlike regexes
+
+       var notBranches = /(coop|express|wireless|factory|outlet)/i; // PRIVATE FUNCTIONS
+       // `setNsiSources()`
+       // Adds the sources to iD's filemap so we can start downloading data.
+       //
+
+       function setNsiSources() {
+         var nsiVersion = packageJSON.devDependencies['name-suggestion-index'];
+         var v = parseVersion(nsiVersion);
+         var vMinor = "".concat(v.major, ".").concat(v.minor);
+         var sources = {
+           'nsi_data': "https://cdn.jsdelivr.net/npm/name-suggestion-index@".concat(vMinor, "/dist/nsi.min.json"),
+           'nsi_dissolved': "https://cdn.jsdelivr.net/npm/name-suggestion-index@".concat(vMinor, "/dist/dissolved.min.json"),
+           'nsi_features': "https://cdn.jsdelivr.net/npm/name-suggestion-index@".concat(vMinor, "/dist/featureCollection.min.json"),
+           'nsi_generics': "https://cdn.jsdelivr.net/npm/name-suggestion-index@".concat(vMinor, "/dist/genericWords.min.json"),
+           'nsi_presets': "https://cdn.jsdelivr.net/npm/name-suggestion-index@".concat(vMinor, "/dist/presets/nsi-id-presets.min.json"),
+           'nsi_replacements': "https://cdn.jsdelivr.net/npm/name-suggestion-index@".concat(vMinor, "/dist/replacements.min.json"),
+           'nsi_trees': "https://cdn.jsdelivr.net/npm/name-suggestion-index@".concat(vMinor, "/dist/trees.min.json")
+         };
+         var fileMap = _mainFileFetcher.fileMap();
+
+         for (var k in sources) {
+           if (!fileMap[k]) fileMap[k] = sources[k];
+         }
+       } // `loadNsiPresets()`
+       //  Returns a Promise fulfilled when the presets have been downloaded and merged into iD.
+       //
+
+
+       function loadNsiPresets() {
+         return Promise.all([_mainFileFetcher.get('nsi_presets'), _mainFileFetcher.get('nsi_features')]).then(function (vals) {
+           // Add `suggestion=true` to all the nsi presets
+           // The preset json schema doesn't include it, but the iD code still uses it
+           Object.values(vals[0].presets).forEach(function (preset) {
+             return preset.suggestion = true;
+           });
+           _mainPresetIndex.merge({
+             presets: vals[0].presets,
+             featureCollection: vals[1]
+           });
+         });
+       } // `loadNsiData()`
+       //  Returns a Promise fulfilled when the other data have been downloaded and processed
+       //
+
+
+       function loadNsiData() {
+         return Promise.all([_mainFileFetcher.get('nsi_data'), _mainFileFetcher.get('nsi_dissolved'), _mainFileFetcher.get('nsi_replacements'), _mainFileFetcher.get('nsi_trees')]).then(function (vals) {
+           _nsi = {
+             data: vals[0].nsi,
+             // the raw name-suggestion-index data
+             dissolved: vals[1].dissolved,
+             // list of dissolved items
+             replacements: vals[2].replacements,
+             // trivial old->new qid replacements
+             trees: vals[3].trees,
+             // metadata about trees, main tags
+             kvt: new Map(),
+             // Map (k -> Map (v -> t) )
+             qids: new Map(),
+             // Map (wd/wp tag values -> qids)
+             ids: new Map() // Map (id -> NSI item)
+
+           };
+           _nsi.matcher = new Matcher();
+
+           _nsi.matcher.buildMatchIndex(_nsi.data);
+
+           _nsi.matcher.buildLocationIndex(_nsi.data, _mainLocations.loco());
+
+           Object.keys(_nsi.data).forEach(function (tkv) {
+             var category = _nsi.data[tkv];
+             var parts = tkv.split('/', 3); // tkv = "tree/key/value"
+
+             var t = parts[0];
+             var k = parts[1];
+             var v = parts[2]; // Build a reverse index of keys -> values -> trees present in the name-suggestion-index
+             // Collect primary keys  (e.g. "amenity", "craft", "shop", "man_made", "route", etc)
+             // "amenity": {
+             //   "restaurant": "brands"
+             // }
+
+             var vmap = _nsi.kvt.get(k);
+
+             if (!vmap) {
+               vmap = new Map();
+
+               _nsi.kvt.set(k, vmap);
+             }
+
+             vmap.set(v, t);
+             var tree = _nsi.trees[t]; // e.g. "brands", "operators"
+
+             var mainTag = tree.mainTag; // e.g. "brand:wikidata", "operator:wikidata", etc
+
+             var items = category.items || [];
+             items.forEach(function (item) {
+               // Remember some useful things for later, cache NSI id -> item
+               item.tkv = tkv;
+               item.mainTag = mainTag;
+
+               _nsi.ids.set(item.id, item); // Cache Wikidata/Wikipedia values -> qid, for #6416
+
+
+               var wd = item.tags[mainTag];
+               var wp = item.tags[mainTag.replace('wikidata', 'wikipedia')];
+               if (wd) _nsi.qids.set(wd, wd);
+               if (wp && wd) _nsi.qids.set(wp, wd);
+             });
+           });
+         });
+       } // `gatherKVs()`
+       // Gather all the k/v pairs that we will run through the NSI matcher.
+       // An OSM tags object can contain anything, but only a few tags will be interesting to NSI.
+       //
+       // This function will return the interesting tag pairs like:
+       //   "amenity/restaurant", "man_made/flagpole"
+       // and fallbacks like
+       //   "amenity/yes"
+       // excluding things like
+       //   "tiger:reviewed", "surface", "ref", etc.
+       //
+       // Arguments
+       //   `tags`: `Object` containing the feature's OSM tags
+       // Returns
+       //   `Object` containing kv pairs to test:
+       //   {
+       //     'primary': Set(),
+       //     'alternate': Set()
+       //   }
+       //
+
+
+       function gatherKVs(tags) {
+         var primary = new Set();
+         var alternate = new Set();
+         Object.keys(tags).forEach(function (osmkey) {
+           var osmvalue = tags[osmkey];
+           if (!osmvalue) return; // Match a 'route_master' as if it were a 'route' - name-suggestion-index#5184
+
+           if (osmkey === 'route_master') osmkey = 'route';
+
+           var vmap = _nsi.kvt.get(osmkey);
+
+           if (!vmap) return; // not an interesting key
+
+           if (vmap.get(osmvalue)) {
+             // Matched a category in NSI
+             primary.add("".concat(osmkey, "/").concat(osmvalue)); // interesting key/value
+           } else if (osmvalue === 'yes') {
+             alternate.add("".concat(osmkey, "/").concat(osmvalue)); // fallback key/yes
+           }
+         }); // Can we try a generic building fallback match? - See #6122, #7197
+         // Only try this if we do a preset match and find nothing else remarkable about that building.
+         // For example, a way with `building=yes` + `name=Westfield` may be a Westfield department store.
+         // But a way with `building=yes` + `name=Westfield` + `public_transport=station` is a train station for a town named "Westfield"
+
+         var preset = _mainPresetIndex.matchTags(tags, 'area');
+
+         if (buildingPreset[preset.id]) {
+           alternate.add('building/yes');
+         }
+
+         return {
+           primary: primary,
+           alternate: alternate
+         };
+       } // `identifyTree()`
+       // NSI has a concept of trees: "brands", "operators", "flags", "transit".
+       // The tree determines things like which tags are namelike, and which tags hold important wikidata.
+       // This takes an Object of tags and tries to identify what tree to use.
+       //
+       // Arguments
+       //   `tags`: `Object` containing the feature's OSM tags
+       // Returns
+       //   `string` the name of the tree if known
+       //   or 'unknown' if it could match several trees (e.g. amenity/yes)
+       //   or null if no match
+       //
+
+
+       function identifyTree(tags) {
+         var unknown;
+         var t; // Check all tags
+
+         Object.keys(tags).forEach(function (osmkey) {
+           if (t) return; // found already
+
+           var osmvalue = tags[osmkey];
+           if (!osmvalue) return; // Match a 'route_master' as if it were a 'route' - name-suggestion-index#5184
+
+           if (osmkey === 'route_master') osmkey = 'route';
+
+           var vmap = _nsi.kvt.get(osmkey);
+
+           if (!vmap) return; // this key is not in nsi
+
+           if (osmvalue === 'yes') {
+             unknown = 'unknown';
+           } else {
+             t = vmap.get(osmvalue);
+           }
+         });
+         return t || unknown || null;
+       } // `gatherNames()`
+       // Gather all the namelike values that we will run through the NSI matcher.
+       // It will gather values primarily from tags `name`, `name:ru`, `flag:name`
+       //  and fallback to alternate tags like `brand`, `brand:ru`, `alt_name`
+       //
+       // Arguments
+       //   `tags`: `Object` containing the feature's OSM tags
+       // Returns
+       //   `Object` containing namelike values to test:
+       //   {
+       //     'primary': Set(),
+       //     'fallbacks': Set()
+       //   }
+       //
+
+
+       function gatherNames(tags) {
+         var empty = {
+           primary: new Set(),
+           alternate: new Set()
+         };
+         var primary = new Set();
+         var alternate = new Set();
+         var foundSemi = false;
+         var testNameFragments = false;
+         var patterns; // Patterns for matching OSM keys that might contain namelike values.
+         // These roughly correspond to the "trees" concept in name-suggestion-index,
+
+         var t = identifyTree(tags);
+         if (!t) return empty;
+
+         if (t === 'transit') {
+           patterns = {
+             primary: /^network$/i,
+             alternate: /^(operator|operator:\w+|network:\w+|\w+_name|\w+_name:\w+)$/i
+           };
+         } else if (t === 'flags') {
+           patterns = {
+             primary: /^(flag:name|flag:name:\w+)$/i,
+             alternate: /^(flag|flag:\w+|subject|subject:\w+)$/i // note: no `country`, we special-case it below
+
+           };
+         } else if (t === 'brands') {
+           testNameFragments = true;
+           patterns = {
+             primary: /^(name|name:\w+)$/i,
+             alternate: /^(brand|brand:\w+|operator|operator:\w+|\w+_name|\w+_name:\w+)/i
+           };
+         } else if (t === 'operators') {
+           testNameFragments = true;
+           patterns = {
+             primary: /^(name|name:\w+|operator|operator:\w+)$/i,
+             alternate: /^(brand|brand:\w+|\w+_name|\w+_name:\w+)/i
+           };
+         } else {
+           // unknown/multiple
+           testNameFragments = true;
+           patterns = {
+             primary: /^(name|name:\w+)$/i,
+             alternate: /^(brand|brand:\w+|network|network:\w+|operator|operator:\w+|\w+_name|\w+_name:\w+)/i
+           };
+         } // Test `name` fragments, longest to shortest, to fit them into a "Name Branch" pattern.
+         // e.g. "TUI ReiseCenter - Neuss Innenstadt" -> ["TUI", "ReiseCenter", "Neuss", "Innenstadt"]
+
+
+         if (tags.name && testNameFragments) {
+           var nameParts = tags.name.split(/[\s\-\/,.]/);
+
+           for (var split = nameParts.length; split > 0; split--) {
+             var name = nameParts.slice(0, split).join(' '); // e.g. "TUI ReiseCenter"
+
+             primary.add(name);
+           }
+         } // Check all tags
+
+
+         Object.keys(tags).forEach(function (osmkey) {
+           var osmvalue = tags[osmkey];
+           if (!osmvalue) return;
+
+           if (isNamelike(osmkey, 'primary')) {
+             if (/;/.test(osmvalue)) {
+               foundSemi = true;
+             } else {
+               primary.add(osmvalue);
+               alternate["delete"](osmvalue);
+             }
+           } else if (!primary.has(osmvalue) && isNamelike(osmkey, 'alternate')) {
+             if (/;/.test(osmvalue)) {
+               foundSemi = true;
+             } else {
+               alternate.add(osmvalue);
+             }
+           }
+         }); // For flags only, fallback to `country` tag only if no other namelike values were found.
+         // See https://github.com/openstreetmap/iD/pull/8305#issuecomment-769174070
+
+         if (tags.man_made === 'flagpole' && !primary.size && !alternate.size && !!tags.country) {
+           var osmvalue = tags.country;
+
+           if (/;/.test(osmvalue)) {
+             foundSemi = true;
+           } else {
+             alternate.add(osmvalue);
+           }
+         } // If any namelike value contained a semicolon, return empty set and don't try matching anything.
+
+
+         if (foundSemi) {
+           return empty;
+         } else {
+           return {
+             primary: primary,
+             alternate: alternate
+           };
+         }
+
+         function isNamelike(osmkey, which) {
+           if (osmkey === 'old_name') return false;
+           return patterns[which].test(osmkey) && !notNames.test(osmkey);
+         }
+       } // `gatherTuples()`
+       // Generate all combinations of [key,value,name] that we want to test.
+       // This prioritizes them so that the primary name and k/v pairs go first
+       //
+       // Arguments
+       //   `tryKVs`: `Object` containing primary and alternate k/v pairs to test
+       //   `tryNames`: `Object` containing primary and alternate names to test
+       // Returns
+       //   `Array`: tuple objects ordered by priority
+       //
+
+
+       function gatherTuples(tryKVs, tryNames) {
+         var tuples = [];
+         ['primary', 'alternate'].forEach(function (whichName) {
+           // test names longest to shortest
+           var arr = Array.from(tryNames[whichName]).sort(function (a, b) {
+             return b.length - a.length;
+           });
+           arr.forEach(function (n) {
+             ['primary', 'alternate'].forEach(function (whichKV) {
+               tryKVs[whichKV].forEach(function (kv) {
+                 var parts = kv.split('/', 2);
+                 var k = parts[0];
+                 var v = parts[1];
+                 tuples.push({
+                   k: k,
+                   v: v,
+                   n: n
+                 });
+               });
+             });
+           });
+         });
+         return tuples;
+       } // `_upgradeTags()`
+       // Try to match a feature to a canonical record in name-suggestion-index
+       // and upgrade the tags to match.
+       //
+       // Arguments
+       //   `tags`: `Object` containing the feature's OSM tags
+       //   `loc`: Location where this feature exists, as a [lon, lat]
+       // Returns
+       //   `Object` containing the result, or `null` if no changes needed:
+       //   {
+       //     'newTags': `Object` - The tags the the feature should have
+       //     'matched': `Object` - The matched item
+       //   }
+       //
+
+
+       function _upgradeTags(tags, loc) {
+         var newTags = Object.assign({}, tags); // shallow copy
+
+         var changed = false; // Before anything, perform trivial Wikipedia/Wikidata replacements
+
+         Object.keys(newTags).forEach(function (osmkey) {
+           var matchTag = osmkey.match(/^(\w+:)?wikidata$/);
+
+           if (matchTag) {
+             // Look at '*:wikidata' tags
+             var prefix = matchTag[1] || '';
+             var wd = newTags[osmkey];
+             var replace = _nsi.replacements[wd]; // If it matches a QID in the replacement list...
+
+             if (replace && replace.wikidata !== undefined) {
+               // replace or delete `*:wikidata` tag
+               changed = true;
+
+               if (replace.wikidata) {
+                 newTags[osmkey] = replace.wikidata;
+               } else {
+                 delete newTags[osmkey];
+               }
+             }
+
+             if (replace && replace.wikipedia !== undefined) {
+               // replace or delete `*:wikipedia` tag
+               changed = true;
+               var wpkey = "".concat(prefix, "wikipedia");
+
+               if (replace.wikipedia) {
+                 newTags[wpkey] = replace.wikipedia;
+               } else {
+                 delete newTags[wpkey];
+               }
+             }
+           }
+         }); // Match a 'route_master' as if it were a 'route' - name-suggestion-index#5184
+
+         var isRouteMaster = tags.type === 'route_master'; // Gather key/value tag pairs to try to match
+
+         var tryKVs = gatherKVs(tags);
+
+         if (!tryKVs.primary.size && !tryKVs.alternate.size) {
+           return changed ? {
+             newTags: newTags,
+             matched: null
+           } : null;
+         } // Gather namelike tag values to try to match
+
+
+         var tryNames = gatherNames(tags); // Do `wikidata=*` or `wikipedia=*` tags identify this entity as a chain? - See #6416
+         // If so, these tags can be swapped to e.g. `brand:wikidata`/`brand:wikipedia`.
+
+         var foundQID = _nsi.qids.get(tags.wikidata) || _nsi.qids.get(tags.wikipedia);
+
+         if (foundQID) tryNames.primary.add(foundQID); // matcher will recognize the Wikidata QID as name too
+
+         if (!tryNames.primary.size && !tryNames.alternate.size) {
+           return changed ? {
+             newTags: newTags,
+             matched: null
+           } : null;
+         } // Order the [key,value,name] tuples - test primary names before alternate names
+
+
+         var tuples = gatherTuples(tryKVs, tryNames);
+         var foundPrimary = false;
+         var bestItem; // Test [key,value,name] tuples against the NSI matcher until we get a primary match or exhaust all options.
+
+         for (var i = 0; i < tuples.length && !foundPrimary; i++) {
+           var tuple = tuples[i];
+
+           var hits = _nsi.matcher.match(tuple.k, tuple.v, tuple.n, loc); // Attempt to match an item in NSI
+
+
+           if (!hits || !hits.length) continue; // no match, try next tuple
+
+           if (hits[0].match !== 'primary' && hits[0].match !== 'alternate') break; // a generic match, stop looking
+           // A match may contain multiple results, the first one is likely the best one for this location
+           // e.g. `['pfk-a54c14', 'kfc-1ff19c', 'kfc-658eea']`
+
+           for (var j = 0; j < hits.length; j++) {
+             var hit = hits[j];
+             var isPrimary = hits[j].match === 'primary';
+             var itemID = hit.itemID;
+             if (_nsi.dissolved[itemID]) continue; // Don't upgrade to a dissolved item
+
+             var item = _nsi.ids.get(itemID);
+
+             if (!item) continue;
+             var mainTag = item.mainTag; // e.g. `brand:wikidata`
+
+             var itemQID = item.tags[mainTag]; // e.g. `brand:wikidata` qid
+
+             var notQID = newTags["not:".concat(mainTag)]; // e.g. `not:brand:wikidata` qid
+
+             if ( // Exceptions, skip this hit
+             !itemQID || itemQID === notQID || // No `*:wikidata` or matched a `not:*:wikidata`
+             newTags.office && !item.tags.office // feature may be a corporate office for a brand? - #6416
+             ) {
+               continue; // continue looking
+             } // If we get here, the hit is good..
+
+
+             if (!bestItem || isPrimary) {
+               bestItem = item;
+
+               if (isPrimary) {
+                 foundPrimary = true;
+               }
+
+               break; // can ignore the rest of the hits from this match
+             }
+           }
+         } // At this point we have matched a canonical item and can suggest tag upgrades..
+
+
+         if (bestItem) {
+           var _ret = function () {
+             var itemID = bestItem.id;
+             var item = JSON.parse(JSON.stringify(bestItem)); // deep copy
+
+             var tkv = item.tkv;
+             var parts = tkv.split('/', 3); // tkv = "tree/key/value"
+
+             var k = parts[1];
+             var v = parts[2];
+             var category = _nsi.data[tkv];
+             var properties = category.properties || {}; // Preserve some tags that we specifically don't want NSI to overwrite. ('^name', sometimes)
+
+             var preserveTags = item.preserveTags || properties.preserveTags || []; // These tags can be toplevel tags -or- attributes - so we generally want to preserve existing values - #8615
+             // We'll only _replace_ the tag value if this tag is the toplevel/defining tag for the matched item (`k`)
+
+             ['building', 'emergency', 'internet_access', 'takeaway'].forEach(function (osmkey) {
+               if (k !== osmkey) preserveTags.push("^".concat(osmkey, "$"));
+             });
+             var regexes = preserveTags.map(function (s) {
+               return new RegExp(s, 'i');
+             });
+             var keepTags = {};
+             Object.keys(newTags).forEach(function (osmkey) {
+               if (regexes.some(function (regex) {
+                 return regex.test(osmkey);
+               })) {
+                 keepTags[osmkey] = newTags[osmkey];
+               }
+             }); // Remove any primary tags ("amenity", "craft", "shop", "man_made", "route", etc) that have a
+             // value like `amenity=yes` or `shop=yes` (exceptions have already been added to `keepTags` above)
+
+             _nsi.kvt.forEach(function (vmap, k) {
+               if (newTags[k] === 'yes') delete newTags[k];
+             }); // Replace mistagged `wikidata`/`wikipedia` with e.g. `brand:wikidata`/`brand:wikipedia`
+
+
+             if (foundQID) {
+               delete newTags.wikipedia;
+               delete newTags.wikidata;
+             } // Do the tag upgrade
+
+
+             Object.assign(newTags, item.tags, keepTags); // Swap `route` back to `route_master` - name-suggestion-index#5184
+
+             if (isRouteMaster) {
+               newTags.route_master = newTags.route;
+               delete newTags.route;
+             } // Special `branch` splitting rules - IF..
+             // - NSI is suggesting to replace `name`, AND
+             // - `branch` doesn't already contain something, AND
+             // - original name has not moved to an alternate name (e.g. "Dunkin' Donuts" -> "Dunkin'"), AND
+             // - original name is "some name" + "some stuff", THEN
+             // consider splitting `name` into `name`/`branch`..
+
+
+             var origName = tags.name;
+             var newName = newTags.name;
+
+             if (newName && origName && newName !== origName && !newTags.branch) {
+               var newNames = gatherNames(newTags);
+               var newSet = new Set([].concat(_toConsumableArray(newNames.primary), _toConsumableArray(newNames.alternate)));
+               var isMoved = newSet.has(origName); // another tag holds the original name now
+
+               if (!isMoved) {
+                 // Test name fragments, longest to shortest, to fit them into a "Name Branch" pattern.
+                 // e.g. "TUI ReiseCenter - Neuss Innenstadt" -> ["TUI", "ReiseCenter", "Neuss", "Innenstadt"]
+                 var nameParts = origName.split(/[\s\-\/,.]/);
+
+                 for (var split = nameParts.length; split > 0; split--) {
+                   var name = nameParts.slice(0, split).join(' '); // e.g. "TUI ReiseCenter"
+
+                   var branch = nameParts.slice(split).join(' '); // e.g. "Neuss Innenstadt"
+
+                   var nameHits = _nsi.matcher.match(k, v, name, loc);
+
+                   if (!nameHits || !nameHits.length) continue; // no match, try next name fragment
+
+                   if (nameHits.some(function (hit) {
+                     return hit.itemID === itemID;
+                   })) {
+                     // matched the name fragment to the same itemID above
+                     if (branch) {
+                       if (notBranches.test(branch)) {
+                         // "branch" was detected but is noise ("factory outlet", etc)
+                         newTags.name = origName; // Leave `name` alone, this part of the name may be significant..
+                       } else {
+                         var branchHits = _nsi.matcher.match(k, v, branch, loc);
+
+                         if (branchHits && branchHits.length) {
+                           // if "branch" matched something else in NSI..
+                           if (branchHits[0].match === 'primary' || branchHits[0].match === 'alternate') {
+                             // if another brand! (e.g. "KFC - Taco Bell"?)
+                             return {
+                               v: null
+                             }; //   bail out - can't suggest tags in this case
+                           } // else a generic (e.g. "gas", "cafe") - ignore
+
+                         } else {
+                           // "branch" is not noise and not something in NSI
+                           newTags.branch = branch; // Stick it in the `branch` tag..
+                         }
+                       }
+                     }
+
+                     break;
+                   }
+                 }
+               }
+             }
+
+             return {
+               v: {
+                 newTags: newTags,
+                 matched: item
+               }
+             };
+           }();
+
+           if (_typeof(_ret) === "object") return _ret.v;
+         }
+
+         return changed ? {
+           newTags: newTags,
+           matched: null
+         } : null;
+       } // `_isGenericName()`
+       // Is the `name` tag generic?
+       //
+       // Arguments
+       //   `tags`: `Object` containing the feature's OSM tags
+       // Returns
+       //   `true` if it is generic, `false` if not
+       //
+
+
+       function _isGenericName(tags) {
+         var n = tags.name;
+         if (!n) return false; // tryNames just contains the `name` tag value and nothing else
+
+         var tryNames = {
+           primary: new Set([n]),
+           alternate: new Set()
+         }; // Gather key/value tag pairs to try to match
+
+         var tryKVs = gatherKVs(tags);
+         if (!tryKVs.primary.size && !tryKVs.alternate.size) return false; // Order the [key,value,name] tuples - test primary before alternate
+
+         var tuples = gatherTuples(tryKVs, tryNames);
+
+         for (var i = 0; i < tuples.length; i++) {
+           var tuple = tuples[i];
+
+           var hits = _nsi.matcher.match(tuple.k, tuple.v, tuple.n); // Attempt to match an item in NSI
+           // If we get a `excludeGeneric` hit, this is a generic name.
+
+
+           if (hits && hits.length && hits[0].match === 'excludeGeneric') return true;
+         }
+
+         return false;
+       } // PUBLIC INTERFACE
+
+
+       var serviceNsi = {
+         // `init()`
+         // On init, start preparing the name-suggestion-index
+         //
+         init: function init() {
+           // Note: service.init is called immediately after the presetManager has started loading its data.
+           // We expect to chain onto an unfulfilled promise here.
+           setNsiSources();
+           _mainPresetIndex.ensureLoaded().then(function () {
+             return loadNsiPresets();
+           }).then(function () {
+             return delay(100);
+           }) // wait briefly for locationSets to enter the locationManager queue
+           .then(function () {
+             return _mainLocations.mergeLocationSets([]);
+           }) // wait for locationSets to resolve
+           .then(function () {
+             return loadNsiData();
+           }).then(function () {
+             return _nsiStatus = 'ok';
+           })["catch"](function () {
+             return _nsiStatus = 'failed';
+           });
+
+           function delay(msec) {
+             return new Promise(function (resolve) {
+               window.setTimeout(resolve, msec);
+             });
+           }
+         },
+         // `reset()`
+         // Reset is called when user saves data to OSM (does nothing here)
+         //
+         reset: function reset() {},
+         // `status()`
+         // To let other code know how it's going...
+         //
+         // Returns
+         //   `String`: 'loading', 'ok', 'failed'
+         //
+         status: function status() {
+           return _nsiStatus;
+         },
+         // `isGenericName()`
+         // Is the `name` tag generic?
+         //
+         // Arguments
+         //   `tags`: `Object` containing the feature's OSM tags
+         // Returns
+         //   `true` if it is generic, `false` if not
+         //
+         isGenericName: function isGenericName(tags) {
+           return _isGenericName(tags);
+         },
+         // `upgradeTags()`
+         // Suggest tag upgrades.
+         // This function will not modify the input tags, it makes a copy.
+         //
+         // Arguments
+         //   `tags`: `Object` containing the feature's OSM tags
+         //   `loc`: Location where this feature exists, as a [lon, lat]
+         // Returns
+         //   `Object` containing the result, or `null` if no changes needed:
+         //   {
+         //     'newTags': `Object` - The tags the the feature should have
+         //     'matched': `Object` - The matched item
+         //   }
+         //
+         upgradeTags: function upgradeTags(tags, loc) {
+           return _upgradeTags(tags, loc);
+         },
+         // `cache()`
+         // Direct access to the NSI cache, useful for testing or breaking things
+         //
+         // Returns
+         //   `Object`: the internal NSI cache
+         //
+         cache: function cache() {
+           return _nsi;
+         }
+       };
+
+       var apibase$1 = 'https://kartaview.org';
+       var maxResults$1 = 1000;
+       var tileZoom$1 = 14;
+       var tiler$3 = utilTiler().zoomExtent([tileZoom$1, tileZoom$1]).skipNullIsland(true);
+       var dispatch$3 = dispatch$8('loadedImages');
+       var imgZoom = d3_zoom().extent([[0, 0], [320, 240]]).translateExtent([[0, 0], [320, 240]]).scaleExtent([1, 15]);
+
+       var _oscCache;
+
+       var _oscSelectedImage;
+
+       var _loadViewerPromise$1;
+
+       function abortRequest$3(controller) {
+         controller.abort();
+       }
+
+       function maxPageAtZoom(z) {
+         if (z < 15) return 2;
+         if (z === 15) return 5;
+         if (z === 16) return 10;
+         if (z === 17) return 20;
+         if (z === 18) return 40;
+         if (z > 18) return 80;
+       }
+
+       function loadTiles$1(which, url, projection) {
+         var currZoom = Math.floor(geoScaleToZoom(projection.scale()));
+         var tiles = tiler$3.getTiles(projection); // abort inflight requests that are no longer needed
+
+         var cache = _oscCache[which];
+         Object.keys(cache.inflight).forEach(function (k) {
+           var wanted = tiles.find(function (tile) {
+             return k.indexOf(tile.id + ',') === 0;
+           });
+
+           if (!wanted) {
+             abortRequest$3(cache.inflight[k]);
+             delete cache.inflight[k];
+           }
+         });
+         tiles.forEach(function (tile) {
+           loadNextTilePage$1(which, currZoom, url, tile);
+         });
+       }
+
+       function loadNextTilePage$1(which, currZoom, url, tile) {
+         var cache = _oscCache[which];
+         var bbox = tile.extent.bbox();
+         var maxPages = maxPageAtZoom(currZoom);
+         var nextPage = cache.nextPage[tile.id] || 1;
+         var params = utilQsString({
+           ipp: maxResults$1,
+           page: nextPage,
+           // client_id: clientId,
+           bbTopLeft: [bbox.maxY, bbox.minX].join(','),
+           bbBottomRight: [bbox.minY, bbox.maxX].join(',')
+         }, true);
+         if (nextPage > maxPages) return;
+         var id = tile.id + ',' + String(nextPage);
+         if (cache.loaded[id] || cache.inflight[id]) return;
+         var controller = new AbortController();
+         cache.inflight[id] = controller;
+         var options = {
+           method: 'POST',
+           signal: controller.signal,
+           body: params,
+           headers: {
+             'Content-Type': 'application/x-www-form-urlencoded'
+           }
+         };
+         d3_json(url, options).then(function (data) {
+           cache.loaded[id] = true;
+           delete cache.inflight[id];
+
+           if (!data || !data.currentPageItems || !data.currentPageItems.length) {
+             throw new Error('No Data');
+           }
+
+           var features = data.currentPageItems.map(function (item) {
+             var loc = [+item.lng, +item.lat];
+             var d;
+
+             if (which === 'images') {
+               d = {
+                 loc: loc,
+                 key: item.id,
+                 ca: +item.heading,
+                 captured_at: item.shot_date || item.date_added,
+                 captured_by: item.username,
+                 imagePath: item.lth_name,
+                 sequence_id: item.sequence_id,
+                 sequence_index: +item.sequence_index
+               }; // cache sequence info
+
+               var seq = _oscCache.sequences[d.sequence_id];
+
+               if (!seq) {
+                 seq = {
+                   rotation: 0,
+                   images: []
+                 };
+                 _oscCache.sequences[d.sequence_id] = seq;
+               }
+
+               seq.images[d.sequence_index] = d;
+               _oscCache.images.forImageKey[d.key] = d; // cache imageKey -> image
+             }
+
+             return {
+               minX: loc[0],
+               minY: loc[1],
+               maxX: loc[0],
+               maxY: loc[1],
+               data: d
+             };
+           });
+           cache.rtree.load(features);
+
+           if (data.currentPageItems.length === maxResults$1) {
+             // more pages to load
+             cache.nextPage[tile.id] = nextPage + 1;
+             loadNextTilePage$1(which, currZoom, url, tile);
+           } else {
+             cache.nextPage[tile.id] = Infinity; // no more pages to load
+           }
+
+           if (which === 'images') {
+             dispatch$3.call('loadedImages');
+           }
+         })["catch"](function () {
+           cache.loaded[id] = true;
+           delete cache.inflight[id];
+         });
+       } // partition viewport into higher zoom tiles
+
+
+       function partitionViewport$1(projection) {
+         var z = geoScaleToZoom(projection.scale());
+         var z2 = Math.ceil(z * 2) / 2 + 2.5; // round to next 0.5 and add 2.5
+
+         var tiler = utilTiler().zoomExtent([z2, z2]);
+         return tiler.getTiles(projection).map(function (tile) {
+           return tile.extent;
+         });
+       } // no more than `limit` results per partition.
+
+
+       function searchLimited$1(limit, projection, rtree) {
+         limit = limit || 5;
+         return partitionViewport$1(projection).reduce(function (result, extent) {
+           var found = rtree.search(extent.bbox()).slice(0, limit).map(function (d) {
+             return d.data;
+           });
+           return found.length ? result.concat(found) : result;
+         }, []);
+       }
+
+       var serviceKartaview = {
+         init: function init() {
+           if (!_oscCache) {
+             this.reset();
+           }
+
+           this.event = utilRebind(this, dispatch$3, 'on');
+         },
+         reset: function reset() {
+           if (_oscCache) {
+             Object.values(_oscCache.images.inflight).forEach(abortRequest$3);
+           }
+
+           _oscCache = {
+             images: {
+               inflight: {},
+               loaded: {},
+               nextPage: {},
+               rtree: new RBush(),
+               forImageKey: {}
+             },
+             sequences: {}
+           };
+           _oscSelectedImage = null;
+         },
+         images: function images(projection) {
+           var limit = 5;
+           return searchLimited$1(limit, projection, _oscCache.images.rtree);
+         },
+         sequences: function sequences(projection) {
+           var viewport = projection.clipExtent();
+           var min = [viewport[0][0], viewport[1][1]];
+           var max = [viewport[1][0], viewport[0][1]];
+           var bbox = geoExtent(projection.invert(min), projection.invert(max)).bbox();
+           var sequenceKeys = {}; // all sequences for images in viewport
+
+           _oscCache.images.rtree.search(bbox).forEach(function (d) {
+             sequenceKeys[d.data.sequence_id] = true;
+           }); // make linestrings from those sequences
+
+
+           var lineStrings = [];
+           Object.keys(sequenceKeys).forEach(function (sequenceKey) {
+             var seq = _oscCache.sequences[sequenceKey];
+             var images = seq && seq.images;
+
+             if (images) {
+               lineStrings.push({
+                 type: 'LineString',
+                 coordinates: images.map(function (d) {
+                   return d.loc;
+                 }).filter(Boolean),
+                 properties: {
+                   captured_at: images[0] ? images[0].captured_at : null,
+                   captured_by: images[0] ? images[0].captured_by : null,
+                   key: sequenceKey
+                 }
+               });
+             }
+           });
+           return lineStrings;
+         },
+         cachedImage: function cachedImage(imageKey) {
+           return _oscCache.images.forImageKey[imageKey];
+         },
+         loadImages: function loadImages(projection) {
+           var url = apibase$1 + '/1.0/list/nearby-photos/';
+           loadTiles$1('images', url, projection);
+         },
+         ensureViewerLoaded: function ensureViewerLoaded(context) {
+           if (_loadViewerPromise$1) return _loadViewerPromise$1; // add kartaview-wrapper
+
+           var wrap = context.container().select('.photoviewer').selectAll('.kartaview-wrapper').data([0]);
+           var that = this;
+           var wrapEnter = wrap.enter().append('div').attr('class', 'photo-wrapper kartaview-wrapper').classed('hide', true).call(imgZoom.on('zoom', zoomPan)).on('dblclick.zoom', null);
+           wrapEnter.append('div').attr('class', 'photo-attribution fillD');
+           var controlsEnter = wrapEnter.append('div').attr('class', 'photo-controls-wrap').append('div').attr('class', 'photo-controls');
+           controlsEnter.append('button').on('click.back', step(-1)).text('◄');
+           controlsEnter.append('button').on('click.rotate-ccw', rotate(-90)).text('⤿');
+           controlsEnter.append('button').on('click.rotate-cw', rotate(90)).text('⤾');
+           controlsEnter.append('button').on('click.forward', step(1)).text('►');
+           wrapEnter.append('div').attr('class', 'kartaview-image-wrap'); // Register viewer resize handler
+
+           context.ui().photoviewer.on('resize.kartaview', function (dimensions) {
+             imgZoom = d3_zoom().extent([[0, 0], dimensions]).translateExtent([[0, 0], dimensions]).scaleExtent([1, 15]).on('zoom', zoomPan);
+           });
+
+           function zoomPan(d3_event) {
+             var t = d3_event.transform;
+             context.container().select('.photoviewer .kartaview-image-wrap').call(utilSetTransform, t.x, t.y, t.k);
+           }
+
+           function rotate(deg) {
+             return function () {
+               if (!_oscSelectedImage) return;
+               var sequenceKey = _oscSelectedImage.sequence_id;
+               var sequence = _oscCache.sequences[sequenceKey];
+               if (!sequence) return;
+               var r = sequence.rotation || 0;
+               r += deg;
+               if (r > 180) r -= 360;
+               if (r < -180) r += 360;
+               sequence.rotation = r;
+               var wrap = context.container().select('.photoviewer .kartaview-wrapper');
+               wrap.transition().duration(100).call(imgZoom.transform, identity$2);
+               wrap.selectAll('.kartaview-image').transition().duration(100).style('transform', 'rotate(' + r + 'deg)');
+             };
+           }
+
+           function step(stepBy) {
+             return function () {
+               if (!_oscSelectedImage) return;
+               var sequenceKey = _oscSelectedImage.sequence_id;
+               var sequence = _oscCache.sequences[sequenceKey];
+               if (!sequence) return;
+               var nextIndex = _oscSelectedImage.sequence_index + stepBy;
+               var nextImage = sequence.images[nextIndex];
+               if (!nextImage) return;
+               context.map().centerEase(nextImage.loc);
+               that.selectImage(context, nextImage.key);
+             };
+           } // don't need any async loading so resolve immediately
+
+
+           _loadViewerPromise$1 = Promise.resolve();
+           return _loadViewerPromise$1;
+         },
+         showViewer: function showViewer(context) {
+           var viewer = context.container().select('.photoviewer').classed('hide', false);
+           var isHidden = viewer.selectAll('.photo-wrapper.kartaview-wrapper.hide').size();
+
+           if (isHidden) {
+             viewer.selectAll('.photo-wrapper:not(.kartaview-wrapper)').classed('hide', true);
+             viewer.selectAll('.photo-wrapper.kartaview-wrapper').classed('hide', false);
+           }
+
+           return this;
+         },
+         hideViewer: function hideViewer(context) {
+           _oscSelectedImage = null;
+           this.updateUrlImage(null);
+           var viewer = context.container().select('.photoviewer');
+           if (!viewer.empty()) viewer.datum(null);
+           viewer.classed('hide', true).selectAll('.photo-wrapper').classed('hide', true);
+           context.container().selectAll('.viewfield-group, .sequence, .icon-sign').classed('currentView', false);
+           return this.setStyles(context, null, true);
+         },
+         selectImage: function selectImage(context, imageKey) {
+           var d = this.cachedImage(imageKey);
+           _oscSelectedImage = d;
+           this.updateUrlImage(imageKey);
+           var viewer = context.container().select('.photoviewer');
+           if (!viewer.empty()) viewer.datum(d);
+           this.setStyles(context, null, true);
+           context.container().selectAll('.icon-sign').classed('currentView', false);
+           if (!d) return this;
+           var wrap = context.container().select('.photoviewer .kartaview-wrapper');
+           var imageWrap = wrap.selectAll('.kartaview-image-wrap');
+           var attribution = wrap.selectAll('.photo-attribution').text('');
+           wrap.transition().duration(100).call(imgZoom.transform, identity$2);
+           imageWrap.selectAll('.kartaview-image').remove();
+
+           if (d) {
+             var sequence = _oscCache.sequences[d.sequence_id];
+             var r = sequence && sequence.rotation || 0;
+             imageWrap.append('img').attr('class', 'kartaview-image').attr('src', apibase$1 + '/' + d.imagePath).style('transform', 'rotate(' + r + 'deg)');
+
+             if (d.captured_by) {
+               attribution.append('a').attr('class', 'captured_by').attr('target', '_blank').attr('href', 'https://kartaview.org/user/' + encodeURIComponent(d.captured_by)).text('@' + d.captured_by);
+               attribution.append('span').text('|');
+             }
+
+             if (d.captured_at) {
+               attribution.append('span').attr('class', 'captured_at').text(localeDateString(d.captured_at));
+               attribution.append('span').text('|');
+             }
+
+             attribution.append('a').attr('class', 'image-link').attr('target', '_blank').attr('href', 'https://kartaview.org/details/' + d.sequence_id + '/' + d.sequence_index).text('kartaview.org');
+           }
+
+           return this;
+
+           function localeDateString(s) {
+             if (!s) return null;
+             var options = {
+               day: 'numeric',
+               month: 'short',
+               year: 'numeric'
+             };
+             var d = new Date(s);
+             if (isNaN(d.getTime())) return null;
+             return d.toLocaleDateString(_mainLocalizer.localeCode(), options);
+           }
+         },
+         getSelectedImage: function getSelectedImage() {
+           return _oscSelectedImage;
+         },
+         getSequenceKeyForImage: function getSequenceKeyForImage(d) {
+           return d && d.sequence_id;
+         },
+         // Updates the currently highlighted sequence and selected bubble.
+         // Reset is only necessary when interacting with the viewport because
+         // this implicitly changes the currently selected bubble/sequence
+         setStyles: function setStyles(context, hovered, reset) {
+           if (reset) {
+             // reset all layers
+             context.container().selectAll('.viewfield-group').classed('highlighted', false).classed('hovered', false).classed('currentView', false);
+             context.container().selectAll('.sequence').classed('highlighted', false).classed('currentView', false);
+           }
+
+           var hoveredImageKey = hovered && hovered.key;
+           var hoveredSequenceKey = this.getSequenceKeyForImage(hovered);
+           var hoveredSequence = hoveredSequenceKey && _oscCache.sequences[hoveredSequenceKey];
+           var hoveredImageKeys = hoveredSequence && hoveredSequence.images.map(function (d) {
+             return d.key;
+           }) || [];
+           var viewer = context.container().select('.photoviewer');
+           var selected = viewer.empty() ? undefined : viewer.datum();
+           var selectedImageKey = selected && selected.key;
+           var selectedSequenceKey = this.getSequenceKeyForImage(selected);
+           var selectedSequence = selectedSequenceKey && _oscCache.sequences[selectedSequenceKey];
+           var selectedImageKeys = selectedSequence && selectedSequence.images.map(function (d) {
+             return d.key;
+           }) || []; // highlight sibling viewfields on either the selected or the hovered sequences
+
+           var highlightedImageKeys = utilArrayUnion(hoveredImageKeys, selectedImageKeys);
+           context.container().selectAll('.layer-kartaview .viewfield-group').classed('highlighted', function (d) {
+             return highlightedImageKeys.indexOf(d.key) !== -1;
+           }).classed('hovered', function (d) {
+             return d.key === hoveredImageKey;
+           }).classed('currentView', function (d) {
+             return d.key === selectedImageKey;
+           });
+           context.container().selectAll('.layer-kartaview .sequence').classed('highlighted', function (d) {
+             return d.properties.key === hoveredSequenceKey;
+           }).classed('currentView', function (d) {
+             return d.properties.key === selectedSequenceKey;
+           }); // update viewfields if needed
+
+           context.container().selectAll('.layer-kartaview .viewfield-group .viewfield').attr('d', viewfieldPath);
+
+           function viewfieldPath() {
+             var d = this.parentNode.__data__;
+
+             if (d.pano && d.key !== selectedImageKey) {
+               return 'M 8,13 m -10,0 a 10,10 0 1,0 20,0 a 10,10 0 1,0 -20,0';
+             } else {
+               return 'M 6,9 C 8,8.4 8,8.4 10,9 L 16,-2 C 12,-5 4,-5 0,-2 z';
+             }
+           }
+
+           return this;
+         },
+         updateUrlImage: function updateUrlImage(imageKey) {
+           if (!window.mocha) {
+             var hash = utilStringQs(window.location.hash);
+
+             if (imageKey) {
+               hash.photo = 'kartaview/' + imageKey;
+             } else {
+               delete hash.photo;
+             }
+
+             window.location.replace('#' + utilQsString(hash, true));
+           }
+         },
+         cache: function cache() {
+           return _oscCache;
+         }
+       };
+
+       var hashes$1 = {exports: {}};
+
+       (function (module, exports) {
+         (function () {
+           var Hashes;
+
+           function utf8Encode(str) {
+             var x,
+                 y,
+                 output = '',
+                 i = -1,
+                 l;
+
+             if (str && str.length) {
+               l = str.length;
+
+               while ((i += 1) < l) {
+                 /* Decode utf-16 surrogate pairs */
+                 x = str.charCodeAt(i);
+                 y = i + 1 < l ? str.charCodeAt(i + 1) : 0;
+
+                 if (0xD800 <= x && x <= 0xDBFF && 0xDC00 <= y && y <= 0xDFFF) {
+                   x = 0x10000 + ((x & 0x03FF) << 10) + (y & 0x03FF);
+                   i += 1;
+                 }
+                 /* Encode output as utf-8 */
+
+
+                 if (x <= 0x7F) {
+                   output += String.fromCharCode(x);
+                 } else if (x <= 0x7FF) {
+                   output += String.fromCharCode(0xC0 | x >>> 6 & 0x1F, 0x80 | x & 0x3F);
+                 } else if (x <= 0xFFFF) {
+                   output += String.fromCharCode(0xE0 | x >>> 12 & 0x0F, 0x80 | x >>> 6 & 0x3F, 0x80 | x & 0x3F);
+                 } else if (x <= 0x1FFFFF) {
+                   output += String.fromCharCode(0xF0 | x >>> 18 & 0x07, 0x80 | x >>> 12 & 0x3F, 0x80 | x >>> 6 & 0x3F, 0x80 | x & 0x3F);
+                 }
+               }
+             }
+
+             return output;
+           }
+
+           function utf8Decode(str) {
+             var i,
+                 ac,
+                 c1,
+                 c2,
+                 c3,
+                 arr = [],
+                 l;
+             i = ac = c1 = c2 = c3 = 0;
+
+             if (str && str.length) {
+               l = str.length;
+               str += '';
+
+               while (i < l) {
+                 c1 = str.charCodeAt(i);
+                 ac += 1;
+
+                 if (c1 < 128) {
+                   arr[ac] = String.fromCharCode(c1);
+                   i += 1;
+                 } else if (c1 > 191 && c1 < 224) {
+                   c2 = str.charCodeAt(i + 1);
+                   arr[ac] = String.fromCharCode((c1 & 31) << 6 | c2 & 63);
+                   i += 2;
+                 } else {
+                   c2 = str.charCodeAt(i + 1);
+                   c3 = str.charCodeAt(i + 2);
+                   arr[ac] = String.fromCharCode((c1 & 15) << 12 | (c2 & 63) << 6 | c3 & 63);
+                   i += 3;
+                 }
+               }
+             }
+
+             return arr.join('');
+           }
+           /**
+            * Add integers, wrapping at 2^32. This uses 16-bit operations internally
+            * to work around bugs in some JS interpreters.
+            */
+
+
+           function safe_add(x, y) {
+             var lsw = (x & 0xFFFF) + (y & 0xFFFF),
+                 msw = (x >> 16) + (y >> 16) + (lsw >> 16);
+             return msw << 16 | lsw & 0xFFFF;
+           }
+           /**
+            * Bitwise rotate a 32-bit number to the left.
+            */
+
+
+           function bit_rol(num, cnt) {
+             return num << cnt | num >>> 32 - cnt;
+           }
+           /**
+            * Convert a raw string to a hex string
+            */
+
+
+           function rstr2hex(input, hexcase) {
+             var hex_tab = hexcase ? '0123456789ABCDEF' : '0123456789abcdef',
+                 output = '',
+                 x,
+                 i = 0,
+                 l = input.length;
+
+             for (; i < l; i += 1) {
+               x = input.charCodeAt(i);
+               output += hex_tab.charAt(x >>> 4 & 0x0F) + hex_tab.charAt(x & 0x0F);
+             }
+
+             return output;
+           }
+           /**
+            * Convert an array of big-endian words to a string
+            */
+
+
+           function binb2rstr(input) {
+             var i,
+                 l = input.length * 32,
+                 output = '';
+
+             for (i = 0; i < l; i += 8) {
+               output += String.fromCharCode(input[i >> 5] >>> 24 - i % 32 & 0xFF);
+             }
+
+             return output;
+           }
+           /**
+            * Convert an array of little-endian words to a string
+            */
+
+
+           function binl2rstr(input) {
+             var i,
+                 l = input.length * 32,
+                 output = '';
+
+             for (i = 0; i < l; i += 8) {
+               output += String.fromCharCode(input[i >> 5] >>> i % 32 & 0xFF);
+             }
+
+             return output;
+           }
+           /**
+            * Convert a raw string to an array of little-endian words
+            * Characters >255 have their high-byte silently ignored.
+            */
+
+
+           function rstr2binl(input) {
+             var i,
+                 l = input.length * 8,
+                 output = Array(input.length >> 2),
+                 lo = output.length;
+
+             for (i = 0; i < lo; i += 1) {
+               output[i] = 0;
+             }
+
+             for (i = 0; i < l; i += 8) {
+               output[i >> 5] |= (input.charCodeAt(i / 8) & 0xFF) << i % 32;
+             }
+
+             return output;
+           }
+           /**
+            * Convert a raw string to an array of big-endian words
+            * Characters >255 have their high-byte silently ignored.
+            */
+
+
+           function rstr2binb(input) {
+             var i,
+                 l = input.length * 8,
+                 output = Array(input.length >> 2),
+                 lo = output.length;
+
+             for (i = 0; i < lo; i += 1) {
+               output[i] = 0;
+             }
+
+             for (i = 0; i < l; i += 8) {
+               output[i >> 5] |= (input.charCodeAt(i / 8) & 0xFF) << 24 - i % 32;
+             }
+
+             return output;
+           }
+           /**
+            * Convert a raw string to an arbitrary string encoding
+            */
+
+
+           function rstr2any(input, encoding) {
+             var divisor = encoding.length,
+                 remainders = Array(),
+                 i,
+                 q,
+                 x,
+                 ld,
+                 quotient,
+                 dividend,
+                 output,
+                 full_length;
+             /* Convert to an array of 16-bit big-endian values, forming the dividend */
+
+             dividend = Array(Math.ceil(input.length / 2));
+             ld = dividend.length;
+
+             for (i = 0; i < ld; i += 1) {
+               dividend[i] = input.charCodeAt(i * 2) << 8 | input.charCodeAt(i * 2 + 1);
+             }
+             /**
+              * Repeatedly perform a long division. The binary array forms the dividend,
+              * the length of the encoding is the divisor. Once computed, the quotient
+              * forms the dividend for the next step. We stop when the dividend is zerHashes.
+              * All remainders are stored for later use.
+              */
+
+
+             while (dividend.length > 0) {
+               quotient = Array();
+               x = 0;
+
+               for (i = 0; i < dividend.length; i += 1) {
+                 x = (x << 16) + dividend[i];
+                 q = Math.floor(x / divisor);
+                 x -= q * divisor;
+
+                 if (quotient.length > 0 || q > 0) {
+                   quotient[quotient.length] = q;
+                 }
+               }
+
+               remainders[remainders.length] = x;
+               dividend = quotient;
+             }
+             /* Convert the remainders to the output string */
+
+
+             output = '';
+
+             for (i = remainders.length - 1; i >= 0; i--) {
+               output += encoding.charAt(remainders[i]);
+             }
+             /* Append leading zero equivalents */
+
+
+             full_length = Math.ceil(input.length * 8 / (Math.log(encoding.length) / Math.log(2)));
+
+             for (i = output.length; i < full_length; i += 1) {
+               output = encoding[0] + output;
+             }
+
+             return output;
+           }
+           /**
+            * Convert a raw string to a base-64 string
+            */
+
+
+           function rstr2b64(input, b64pad) {
+             var tab = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/',
+                 output = '',
+                 len = input.length,
+                 i,
+                 j,
+                 triplet;
+             b64pad = b64pad || '=';
+
+             for (i = 0; i < len; i += 3) {
+               triplet = input.charCodeAt(i) << 16 | (i + 1 < len ? input.charCodeAt(i + 1) << 8 : 0) | (i + 2 < len ? input.charCodeAt(i + 2) : 0);
+
+               for (j = 0; j < 4; j += 1) {
+                 if (i * 8 + j * 6 > input.length * 8) {
+                   output += b64pad;
+                 } else {
+                   output += tab.charAt(triplet >>> 6 * (3 - j) & 0x3F);
+                 }
+               }
+             }
+
+             return output;
+           }
+
+           Hashes = {
+             /**
+              * @property {String} version
+              * @readonly
+              */
+             VERSION: '1.0.6',
+
+             /**
+              * @member Hashes
+              * @class Base64
+              * @constructor
+              */
+             Base64: function Base64() {
+               // private properties
+               var tab = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/',
+                   pad = '=',
+                   // URL encoding support @todo
+               utf8 = true; // by default enable UTF-8 support encoding
+               // public method for encoding
+
+               this.encode = function (input) {
+                 var i,
+                     j,
+                     triplet,
+                     output = '',
+                     len = input.length;
+                 pad = pad || '=';
+                 input = utf8 ? utf8Encode(input) : input;
+
+                 for (i = 0; i < len; i += 3) {
+                   triplet = input.charCodeAt(i) << 16 | (i + 1 < len ? input.charCodeAt(i + 1) << 8 : 0) | (i + 2 < len ? input.charCodeAt(i + 2) : 0);
+
+                   for (j = 0; j < 4; j += 1) {
+                     if (i * 8 + j * 6 > len * 8) {
+                       output += pad;
+                     } else {
+                       output += tab.charAt(triplet >>> 6 * (3 - j) & 0x3F);
+                     }
+                   }
+                 }
+
+                 return output;
+               }; // public method for decoding
+
+
+               this.decode = function (input) {
+                 // var b64 = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=';
+                 var i,
+                     o1,
+                     o2,
+                     o3,
+                     h1,
+                     h2,
+                     h3,
+                     h4,
+                     bits,
+                     ac,
+                     dec = '',
+                     arr = [];
+
+                 if (!input) {
+                   return input;
+                 }
+
+                 i = ac = 0;
+                 input = input.replace(new RegExp('\\' + pad, 'gi'), ''); // use '='
+                 //input += '';
+
+                 do {
+                   // unpack four hexets into three octets using index points in b64
+                   h1 = tab.indexOf(input.charAt(i += 1));
+                   h2 = tab.indexOf(input.charAt(i += 1));
+                   h3 = tab.indexOf(input.charAt(i += 1));
+                   h4 = tab.indexOf(input.charAt(i += 1));
+                   bits = h1 << 18 | h2 << 12 | h3 << 6 | h4;
+                   o1 = bits >> 16 & 0xff;
+                   o2 = bits >> 8 & 0xff;
+                   o3 = bits & 0xff;
+                   ac += 1;
+
+                   if (h3 === 64) {
+                     arr[ac] = String.fromCharCode(o1);
+                   } else if (h4 === 64) {
+                     arr[ac] = String.fromCharCode(o1, o2);
+                   } else {
+                     arr[ac] = String.fromCharCode(o1, o2, o3);
+                   }
+                 } while (i < input.length);
+
+                 dec = arr.join('');
+                 dec = utf8 ? utf8Decode(dec) : dec;
+                 return dec;
+               }; // set custom pad string
+
+
+               this.setPad = function (str) {
+                 pad = str || pad;
+                 return this;
+               }; // set custom tab string characters
+
+
+               this.setTab = function (str) {
+                 tab = str || tab;
+                 return this;
+               };
+
+               this.setUTF8 = function (bool) {
+                 if (typeof bool === 'boolean') {
+                   utf8 = bool;
+                 }
+
+                 return this;
+               };
+             },
+
+             /**
+              * CRC-32 calculation
+              * @member Hashes
+              * @method CRC32
+              * @static
+              * @param {String} str Input String
+              * @return {String}
+              */
+             CRC32: function CRC32(str) {
+               var crc = 0,
+                   x = 0,
+                   y = 0,
+                   table,
+                   i,
+                   iTop;
+               str = utf8Encode(str);
+               table = ['00000000 77073096 EE0E612C 990951BA 076DC419 706AF48F E963A535 9E6495A3 0EDB8832 ', '79DCB8A4 E0D5E91E 97D2D988 09B64C2B 7EB17CBD E7B82D07 90BF1D91 1DB71064 6AB020F2 F3B97148 ', '84BE41DE 1ADAD47D 6DDDE4EB F4D4B551 83D385C7 136C9856 646BA8C0 FD62F97A 8A65C9EC 14015C4F ', '63066CD9 FA0F3D63 8D080DF5 3B6E20C8 4C69105E D56041E4 A2677172 3C03E4D1 4B04D447 D20D85FD ', 'A50AB56B 35B5A8FA 42B2986C DBBBC9D6 ACBCF940 32D86CE3 45DF5C75 DCD60DCF ABD13D59 26D930AC ', '51DE003A C8D75180 BFD06116 21B4F4B5 56B3C423 CFBA9599 B8BDA50F 2802B89E 5F058808 C60CD9B2 ', 'B10BE924 2F6F7C87 58684C11 C1611DAB B6662D3D 76DC4190 01DB7106 98D220BC EFD5102A 71B18589 ', '06B6B51F 9FBFE4A5 E8B8D433 7807C9A2 0F00F934 9609A88E E10E9818 7F6A0DBB 086D3D2D 91646C97 ', 'E6635C01 6B6B51F4 1C6C6162 856530D8 F262004E 6C0695ED 1B01A57B 8208F4C1 F50FC457 65B0D9C6 ', '12B7E950 8BBEB8EA FCB9887C 62DD1DDF 15DA2D49 8CD37CF3 FBD44C65 4DB26158 3AB551CE A3BC0074 ', 'D4BB30E2 4ADFA541 3DD895D7 A4D1C46D D3D6F4FB 4369E96A 346ED9FC AD678846 DA60B8D0 44042D73 ', '33031DE5 AA0A4C5F DD0D7CC9 5005713C 270241AA BE0B1010 C90C2086 5768B525 206F85B3 B966D409 ', 'CE61E49F 5EDEF90E 29D9C998 B0D09822 C7D7A8B4 59B33D17 2EB40D81 B7BD5C3B C0BA6CAD EDB88320 ', '9ABFB3B6 03B6E20C 74B1D29A EAD54739 9DD277AF 04DB2615 73DC1683 E3630B12 94643B84 0D6D6A3E ', '7A6A5AA8 E40ECF0B 9309FF9D 0A00AE27 7D079EB1 F00F9344 8708A3D2 1E01F268 6906C2FE F762575D ', '806567CB 196C3671 6E6B06E7 FED41B76 89D32BE0 10DA7A5A 67DD4ACC F9B9DF6F 8EBEEFF9 17B7BE43 ', '60B08ED5 D6D6A3E8 A1D1937E 38D8C2C4 4FDFF252 D1BB67F1 A6BC5767 3FB506DD 48B2364B D80D2BDA ', 'AF0A1B4C 36034AF6 41047A60 DF60EFC3 A867DF55 316E8EEF 4669BE79 CB61B38C BC66831A 256FD2A0 ', '5268E236 CC0C7795 BB0B4703 220216B9 5505262F C5BA3BBE B2BD0B28 2BB45A92 5CB36A04 C2D7FFA7 ', 'B5D0CF31 2CD99E8B 5BDEAE1D 9B64C2B0 EC63F226 756AA39C 026D930A 9C0906A9 EB0E363F 72076785 ', '05005713 95BF4A82 E2B87A14 7BB12BAE 0CB61B38 92D28E9B E5D5BE0D 7CDCEFB7 0BDBDF21 86D3D2D4 ', 'F1D4E242 68DDB3F8 1FDA836E 81BE16CD F6B9265B 6FB077E1 18B74777 88085AE6 FF0F6A70 66063BCA ', '11010B5C 8F659EFF F862AE69 616BFFD3 166CCF45 A00AE278 D70DD2EE 4E048354 3903B3C2 A7672661 ', 'D06016F7 4969474D 3E6E77DB AED16A4A D9D65ADC 40DF0B66 37D83BF0 A9BCAE53 DEBB9EC5 47B2CF7F ', '30B5FFE9 BDBDF21C CABAC28A 53B39330 24B4A3A6 BAD03605 CDD70693 54DE5729 23D967BF B3667A2E ', 'C4614AB8 5D681B02 2A6F2B94 B40BBE37 C30C8EA1 5A05DF1B 2D02EF8D'].join('');
+               crc = crc ^ -1;
+
+               for (i = 0, iTop = str.length; i < iTop; i += 1) {
+                 y = (crc ^ str.charCodeAt(i)) & 0xFF;
+                 x = '0x' + table.substr(y * 9, 8);
+                 crc = crc >>> 8 ^ x;
+               } // always return a positive number (that's what >>> 0 does)
+
+
+               return (crc ^ -1) >>> 0;
+             },
+
+             /**
+              * @member Hashes
+              * @class MD5
+              * @constructor
+              * @param {Object} [config]
+              *
+              * A JavaScript implementation of the RSA Data Security, Inc. MD5 Message
+              * Digest Algorithm, as defined in RFC 1321.
+              * Version 2.2 Copyright (C) Paul Johnston 1999 - 2009
+              * Other contributors: Greg Holt, Andrew Kepert, Ydnar, Lostinet
+              * See <http://pajhome.org.uk/crypt/md5> for more infHashes.
+              */
+             MD5: function MD5(options) {
+               /**
+                * Private config properties. You may need to tweak these to be compatible with
+                * the server-side, but the defaults work in most cases.
+                * See {@link Hashes.MD5#method-setUpperCase} and {@link Hashes.SHA1#method-setUpperCase}
+                */
+               var hexcase = options && typeof options.uppercase === 'boolean' ? options.uppercase : false,
+                   // hexadecimal output case format. false - lowercase; true - uppercase
+               b64pad = options && typeof options.pad === 'string' ? options.pad : '=',
+                   // base-64 pad character. Defaults to '=' for strict RFC compliance
+               utf8 = options && typeof options.utf8 === 'boolean' ? options.utf8 : true; // enable/disable utf8 encoding
+               // privileged (public) methods
+
+               this.hex = function (s) {
+                 return rstr2hex(rstr(s), hexcase);
+               };
+
+               this.b64 = function (s) {
+                 return rstr2b64(rstr(s), b64pad);
+               };
+
+               this.any = function (s, e) {
+                 return rstr2any(rstr(s), e);
+               };
+
+               this.raw = function (s) {
+                 return rstr(s);
+               };
+
+               this.hex_hmac = function (k, d) {
+                 return rstr2hex(rstr_hmac(k, d), hexcase);
+               };
+
+               this.b64_hmac = function (k, d) {
+                 return rstr2b64(rstr_hmac(k, d), b64pad);
+               };
+
+               this.any_hmac = function (k, d, e) {
+                 return rstr2any(rstr_hmac(k, d), e);
+               };
+               /**
+                * Perform a simple self-test to see if the VM is working
+                * @return {String} Hexadecimal hash sample
+                */
+
+
+               this.vm_test = function () {
+                 return hex('abc').toLowerCase() === '900150983cd24fb0d6963f7d28e17f72';
+               };
+               /**
+                * Enable/disable uppercase hexadecimal returned string
+                * @param {Boolean}
+                * @return {Object} this
+                */
+
+
+               this.setUpperCase = function (a) {
+                 if (typeof a === 'boolean') {
+                   hexcase = a;
+                 }
+
+                 return this;
+               };
+               /**
+                * Defines a base64 pad string
+                * @param {String} Pad
+                * @return {Object} this
+                */
+
+
+               this.setPad = function (a) {
+                 b64pad = a || b64pad;
+                 return this;
+               };
+               /**
+                * Defines a base64 pad string
+                * @param {Boolean}
+                * @return {Object} [this]
+                */
+
+
+               this.setUTF8 = function (a) {
+                 if (typeof a === 'boolean') {
+                   utf8 = a;
+                 }
+
+                 return this;
+               }; // private methods
+
+               /**
+                * Calculate the MD5 of a raw string
+                */
+
+
+               function rstr(s) {
+                 s = utf8 ? utf8Encode(s) : s;
+                 return binl2rstr(binl(rstr2binl(s), s.length * 8));
+               }
+               /**
+                * Calculate the HMAC-MD5, of a key and some data (raw strings)
+                */
+
+
+               function rstr_hmac(key, data) {
+                 var bkey, ipad, opad, hash, i;
+                 key = utf8 ? utf8Encode(key) : key;
+                 data = utf8 ? utf8Encode(data) : data;
+                 bkey = rstr2binl(key);
+
+                 if (bkey.length > 16) {
+                   bkey = binl(bkey, key.length * 8);
+                 }
+
+                 ipad = Array(16), opad = Array(16);
+
+                 for (i = 0; i < 16; i += 1) {
+                   ipad[i] = bkey[i] ^ 0x36363636;
+                   opad[i] = bkey[i] ^ 0x5C5C5C5C;
+                 }
+
+                 hash = binl(ipad.concat(rstr2binl(data)), 512 + data.length * 8);
+                 return binl2rstr(binl(opad.concat(hash), 512 + 128));
+               }
+               /**
+                * Calculate the MD5 of an array of little-endian words, and a bit length.
+                */
+
+
+               function binl(x, len) {
+                 var i,
+                     olda,
+                     oldb,
+                     oldc,
+                     oldd,
+                     a = 1732584193,
+                     b = -271733879,
+                     c = -1732584194,
+                     d = 271733878;
+                 /* append padding */
+
+                 x[len >> 5] |= 0x80 << len % 32;
+                 x[(len + 64 >>> 9 << 4) + 14] = len;
+
+                 for (i = 0; i < x.length; i += 16) {
+                   olda = a;
+                   oldb = b;
+                   oldc = c;
+                   oldd = d;
+                   a = md5_ff(a, b, c, d, x[i + 0], 7, -680876936);
+                   d = md5_ff(d, a, b, c, x[i + 1], 12, -389564586);
+                   c = md5_ff(c, d, a, b, x[i + 2], 17, 606105819);
+                   b = md5_ff(b, c, d, a, x[i + 3], 22, -1044525330);
+                   a = md5_ff(a, b, c, d, x[i + 4], 7, -176418897);
+                   d = md5_ff(d, a, b, c, x[i + 5], 12, 1200080426);
+                   c = md5_ff(c, d, a, b, x[i + 6], 17, -1473231341);
+                   b = md5_ff(b, c, d, a, x[i + 7], 22, -45705983);
+                   a = md5_ff(a, b, c, d, x[i + 8], 7, 1770035416);
+                   d = md5_ff(d, a, b, c, x[i + 9], 12, -1958414417);
+                   c = md5_ff(c, d, a, b, x[i + 10], 17, -42063);
+                   b = md5_ff(b, c, d, a, x[i + 11], 22, -1990404162);
+                   a = md5_ff(a, b, c, d, x[i + 12], 7, 1804603682);
+                   d = md5_ff(d, a, b, c, x[i + 13], 12, -40341101);
+                   c = md5_ff(c, d, a, b, x[i + 14], 17, -1502002290);
+                   b = md5_ff(b, c, d, a, x[i + 15], 22, 1236535329);
+                   a = md5_gg(a, b, c, d, x[i + 1], 5, -165796510);
+                   d = md5_gg(d, a, b, c, x[i + 6], 9, -1069501632);
+                   c = md5_gg(c, d, a, b, x[i + 11], 14, 643717713);
+                   b = md5_gg(b, c, d, a, x[i + 0], 20, -373897302);
+                   a = md5_gg(a, b, c, d, x[i + 5], 5, -701558691);
+                   d = md5_gg(d, a, b, c, x[i + 10], 9, 38016083);
+                   c = md5_gg(c, d, a, b, x[i + 15], 14, -660478335);
+                   b = md5_gg(b, c, d, a, x[i + 4], 20, -405537848);
+                   a = md5_gg(a, b, c, d, x[i + 9], 5, 568446438);
+                   d = md5_gg(d, a, b, c, x[i + 14], 9, -1019803690);
+                   c = md5_gg(c, d, a, b, x[i + 3], 14, -187363961);
+                   b = md5_gg(b, c, d, a, x[i + 8], 20, 1163531501);
+                   a = md5_gg(a, b, c, d, x[i + 13], 5, -1444681467);
+                   d = md5_gg(d, a, b, c, x[i + 2], 9, -51403784);
+                   c = md5_gg(c, d, a, b, x[i + 7], 14, 1735328473);
+                   b = md5_gg(b, c, d, a, x[i + 12], 20, -1926607734);
+                   a = md5_hh(a, b, c, d, x[i + 5], 4, -378558);
+                   d = md5_hh(d, a, b, c, x[i + 8], 11, -2022574463);
+                   c = md5_hh(c, d, a, b, x[i + 11], 16, 1839030562);
+                   b = md5_hh(b, c, d, a, x[i + 14], 23, -35309556);
+                   a = md5_hh(a, b, c, d, x[i + 1], 4, -1530992060);
+                   d = md5_hh(d, a, b, c, x[i + 4], 11, 1272893353);
+                   c = md5_hh(c, d, a, b, x[i + 7], 16, -155497632);
+                   b = md5_hh(b, c, d, a, x[i + 10], 23, -1094730640);
+                   a = md5_hh(a, b, c, d, x[i + 13], 4, 681279174);
+                   d = md5_hh(d, a, b, c, x[i + 0], 11, -358537222);
+                   c = md5_hh(c, d, a, b, x[i + 3], 16, -722521979);
+                   b = md5_hh(b, c, d, a, x[i + 6], 23, 76029189);
+                   a = md5_hh(a, b, c, d, x[i + 9], 4, -640364487);
+                   d = md5_hh(d, a, b, c, x[i + 12], 11, -421815835);
+                   c = md5_hh(c, d, a, b, x[i + 15], 16, 530742520);
+                   b = md5_hh(b, c, d, a, x[i + 2], 23, -995338651);
+                   a = md5_ii(a, b, c, d, x[i + 0], 6, -198630844);
+                   d = md5_ii(d, a, b, c, x[i + 7], 10, 1126891415);
+                   c = md5_ii(c, d, a, b, x[i + 14], 15, -1416354905);
+                   b = md5_ii(b, c, d, a, x[i + 5], 21, -57434055);
+                   a = md5_ii(a, b, c, d, x[i + 12], 6, 1700485571);
+                   d = md5_ii(d, a, b, c, x[i + 3], 10, -1894986606);
+                   c = md5_ii(c, d, a, b, x[i + 10], 15, -1051523);
+                   b = md5_ii(b, c, d, a, x[i + 1], 21, -2054922799);
+                   a = md5_ii(a, b, c, d, x[i + 8], 6, 1873313359);
+                   d = md5_ii(d, a, b, c, x[i + 15], 10, -30611744);
+                   c = md5_ii(c, d, a, b, x[i + 6], 15, -1560198380);
+                   b = md5_ii(b, c, d, a, x[i + 13], 21, 1309151649);
+                   a = md5_ii(a, b, c, d, x[i + 4], 6, -145523070);
+                   d = md5_ii(d, a, b, c, x[i + 11], 10, -1120210379);
+                   c = md5_ii(c, d, a, b, x[i + 2], 15, 718787259);
+                   b = md5_ii(b, c, d, a, x[i + 9], 21, -343485551);
+                   a = safe_add(a, olda);
+                   b = safe_add(b, oldb);
+                   c = safe_add(c, oldc);
+                   d = safe_add(d, oldd);
+                 }
+
+                 return Array(a, b, c, d);
+               }
+               /**
+                * These functions implement the four basic operations the algorithm uses.
+                */
+
+
+               function md5_cmn(q, a, b, x, s, t) {
+                 return safe_add(bit_rol(safe_add(safe_add(a, q), safe_add(x, t)), s), b);
+               }
+
+               function md5_ff(a, b, c, d, x, s, t) {
+                 return md5_cmn(b & c | ~b & d, a, b, x, s, t);
+               }
+
+               function md5_gg(a, b, c, d, x, s, t) {
+                 return md5_cmn(b & d | c & ~d, a, b, x, s, t);
+               }
+
+               function md5_hh(a, b, c, d, x, s, t) {
+                 return md5_cmn(b ^ c ^ d, a, b, x, s, t);
+               }
+
+               function md5_ii(a, b, c, d, x, s, t) {
+                 return md5_cmn(c ^ (b | ~d), a, b, x, s, t);
+               }
+             },
+
+             /**
+              * @member Hashes
+              * @class Hashes.SHA1
+              * @param {Object} [config]
+              * @constructor
+              *
+              * A JavaScript implementation of the Secure Hash Algorithm, SHA-1, as defined in FIPS 180-1
+              * Version 2.2 Copyright Paul Johnston 2000 - 2009.
+              * Other contributors: Greg Holt, Andrew Kepert, Ydnar, Lostinet
+              * See http://pajhome.org.uk/crypt/md5 for details.
+              */
+             SHA1: function SHA1(options) {
+               /**
+                * Private config properties. You may need to tweak these to be compatible with
+                * the server-side, but the defaults work in most cases.
+                * See {@link Hashes.MD5#method-setUpperCase} and {@link Hashes.SHA1#method-setUpperCase}
+                */
+               var hexcase = options && typeof options.uppercase === 'boolean' ? options.uppercase : false,
+                   // hexadecimal output case format. false - lowercase; true - uppercase
+               b64pad = options && typeof options.pad === 'string' ? options.pad : '=',
+                   // base-64 pad character. Defaults to '=' for strict RFC compliance
+               utf8 = options && typeof options.utf8 === 'boolean' ? options.utf8 : true; // enable/disable utf8 encoding
+               // public methods
+
+               this.hex = function (s) {
+                 return rstr2hex(rstr(s), hexcase);
+               };
+
+               this.b64 = function (s) {
+                 return rstr2b64(rstr(s), b64pad);
+               };
+
+               this.any = function (s, e) {
+                 return rstr2any(rstr(s), e);
+               };
+
+               this.raw = function (s) {
+                 return rstr(s);
+               };
+
+               this.hex_hmac = function (k, d) {
+                 return rstr2hex(rstr_hmac(k, d));
+               };
+
+               this.b64_hmac = function (k, d) {
+                 return rstr2b64(rstr_hmac(k, d), b64pad);
+               };
+
+               this.any_hmac = function (k, d, e) {
+                 return rstr2any(rstr_hmac(k, d), e);
+               };
+               /**
+                * Perform a simple self-test to see if the VM is working
+                * @return {String} Hexadecimal hash sample
+                * @public
+                */
+
+
+               this.vm_test = function () {
+                 return hex('abc').toLowerCase() === '900150983cd24fb0d6963f7d28e17f72';
+               };
+               /**
+                * @description Enable/disable uppercase hexadecimal returned string
+                * @param {boolean}
+                * @return {Object} this
+                * @public
+                */
+
+
+               this.setUpperCase = function (a) {
+                 if (typeof a === 'boolean') {
+                   hexcase = a;
+                 }
+
+                 return this;
+               };
+               /**
+                * @description Defines a base64 pad string
+                * @param {string} Pad
+                * @return {Object} this
+                * @public
+                */
+
+
+               this.setPad = function (a) {
+                 b64pad = a || b64pad;
+                 return this;
+               };
+               /**
+                * @description Defines a base64 pad string
+                * @param {boolean}
+                * @return {Object} this
+                * @public
+                */
+
+
+               this.setUTF8 = function (a) {
+                 if (typeof a === 'boolean') {
+                   utf8 = a;
+                 }
+
+                 return this;
+               }; // private methods
+
+               /**
+                * Calculate the SHA-512 of a raw string
+                */
+
+
+               function rstr(s) {
+                 s = utf8 ? utf8Encode(s) : s;
+                 return binb2rstr(binb(rstr2binb(s), s.length * 8));
+               }
+               /**
+                * Calculate the HMAC-SHA1 of a key and some data (raw strings)
+                */
+
+
+               function rstr_hmac(key, data) {
+                 var bkey, ipad, opad, i, hash;
+                 key = utf8 ? utf8Encode(key) : key;
+                 data = utf8 ? utf8Encode(data) : data;
+                 bkey = rstr2binb(key);
+
+                 if (bkey.length > 16) {
+                   bkey = binb(bkey, key.length * 8);
+                 }
+
+                 ipad = Array(16), opad = Array(16);
+
+                 for (i = 0; i < 16; i += 1) {
+                   ipad[i] = bkey[i] ^ 0x36363636;
+                   opad[i] = bkey[i] ^ 0x5C5C5C5C;
+                 }
+
+                 hash = binb(ipad.concat(rstr2binb(data)), 512 + data.length * 8);
+                 return binb2rstr(binb(opad.concat(hash), 512 + 160));
+               }
+               /**
+                * Calculate the SHA-1 of an array of big-endian words, and a bit length
+                */
+
+
+               function binb(x, len) {
+                 var i,
+                     j,
+                     t,
+                     olda,
+                     oldb,
+                     oldc,
+                     oldd,
+                     olde,
+                     w = Array(80),
+                     a = 1732584193,
+                     b = -271733879,
+                     c = -1732584194,
+                     d = 271733878,
+                     e = -1009589776;
+                 /* append padding */
+
+                 x[len >> 5] |= 0x80 << 24 - len % 32;
+                 x[(len + 64 >> 9 << 4) + 15] = len;
+
+                 for (i = 0; i < x.length; i += 16) {
+                   olda = a;
+                   oldb = b;
+                   oldc = c;
+                   oldd = d;
+                   olde = e;
+
+                   for (j = 0; j < 80; j += 1) {
+                     if (j < 16) {
+                       w[j] = x[i + j];
+                     } else {
+                       w[j] = bit_rol(w[j - 3] ^ w[j - 8] ^ w[j - 14] ^ w[j - 16], 1);
+                     }
+
+                     t = safe_add(safe_add(bit_rol(a, 5), sha1_ft(j, b, c, d)), safe_add(safe_add(e, w[j]), sha1_kt(j)));
+                     e = d;
+                     d = c;
+                     c = bit_rol(b, 30);
+                     b = a;
+                     a = t;
+                   }
+
+                   a = safe_add(a, olda);
+                   b = safe_add(b, oldb);
+                   c = safe_add(c, oldc);
+                   d = safe_add(d, oldd);
+                   e = safe_add(e, olde);
+                 }
+
+                 return Array(a, b, c, d, e);
+               }
+               /**
+                * Perform the appropriate triplet combination function for the current
+                * iteration
+                */
+
+
+               function sha1_ft(t, b, c, d) {
+                 if (t < 20) {
+                   return b & c | ~b & d;
+                 }
+
+                 if (t < 40) {
+                   return b ^ c ^ d;
+                 }
+
+                 if (t < 60) {
+                   return b & c | b & d | c & d;
+                 }
+
+                 return b ^ c ^ d;
+               }
+               /**
+                * Determine the appropriate additive constant for the current iteration
+                */
+
+
+               function sha1_kt(t) {
+                 return t < 20 ? 1518500249 : t < 40 ? 1859775393 : t < 60 ? -1894007588 : -899497514;
+               }
+             },
+
+             /**
+              * @class Hashes.SHA256
+              * @param {config}
+              *
+              * A JavaScript implementation of the Secure Hash Algorithm, SHA-256, as defined in FIPS 180-2
+              * Version 2.2 Copyright Angel Marin, Paul Johnston 2000 - 2009.
+              * Other contributors: Greg Holt, Andrew Kepert, Ydnar, Lostinet
+              * See http://pajhome.org.uk/crypt/md5 for details.
+              * Also http://anmar.eu.org/projects/jssha2/
+              */
+             SHA256: function SHA256(options) {
+               /**
+                * Private properties configuration variables. You may need to tweak these to be compatible with
+                * the server-side, but the defaults work in most cases.
+                * @see this.setUpperCase() method
+                * @see this.setPad() method
+                */
+               options && typeof options.uppercase === 'boolean' ? options.uppercase : false;
+                   var // hexadecimal output case format. false - lowercase; true - uppercase  */
+               b64pad = options && typeof options.pad === 'string' ? options.pad : '=',
+
+               /* base-64 pad character. Default '=' for strict RFC compliance   */
+               utf8 = options && typeof options.utf8 === 'boolean' ? options.utf8 : true,
+
+               /* enable/disable utf8 encoding */
+               sha256_K;
+               /* privileged (public) methods */
+
+               this.hex = function (s) {
+                 return rstr2hex(rstr(s, utf8));
+               };
+
+               this.b64 = function (s) {
+                 return rstr2b64(rstr(s, utf8), b64pad);
+               };
+
+               this.any = function (s, e) {
+                 return rstr2any(rstr(s, utf8), e);
+               };
+
+               this.raw = function (s) {
+                 return rstr(s, utf8);
+               };
+
+               this.hex_hmac = function (k, d) {
+                 return rstr2hex(rstr_hmac(k, d));
+               };
+
+               this.b64_hmac = function (k, d) {
+                 return rstr2b64(rstr_hmac(k, d), b64pad);
+               };
+
+               this.any_hmac = function (k, d, e) {
+                 return rstr2any(rstr_hmac(k, d), e);
+               };
+               /**
+                * Perform a simple self-test to see if the VM is working
+                * @return {String} Hexadecimal hash sample
+                * @public
+                */
+
+
+               this.vm_test = function () {
+                 return hex('abc').toLowerCase() === '900150983cd24fb0d6963f7d28e17f72';
+               };
+               /**
+                * Enable/disable uppercase hexadecimal returned string
+                * @param {boolean}
+                * @return {Object} this
+                * @public
+                */
+
+
+               this.setUpperCase = function (a) {
+
+                 return this;
+               };
+               /**
+                * @description Defines a base64 pad string
+                * @param {string} Pad
+                * @return {Object} this
+                * @public
+                */
+
+
+               this.setPad = function (a) {
+                 b64pad = a || b64pad;
+                 return this;
+               };
+               /**
+                * Defines a base64 pad string
+                * @param {boolean}
+                * @return {Object} this
+                * @public
+                */
+
+
+               this.setUTF8 = function (a) {
+                 if (typeof a === 'boolean') {
+                   utf8 = a;
+                 }
+
+                 return this;
+               }; // private methods
+
+               /**
+                * Calculate the SHA-512 of a raw string
+                */
+
+
+               function rstr(s, utf8) {
+                 s = utf8 ? utf8Encode(s) : s;
+                 return binb2rstr(binb(rstr2binb(s), s.length * 8));
+               }
+               /**
+                * Calculate the HMAC-sha256 of a key and some data (raw strings)
+                */
+
+
+               function rstr_hmac(key, data) {
+                 key = utf8 ? utf8Encode(key) : key;
+                 data = utf8 ? utf8Encode(data) : data;
+                 var hash,
+                     i = 0,
+                     bkey = rstr2binb(key),
+                     ipad = Array(16),
+                     opad = Array(16);
+
+                 if (bkey.length > 16) {
+                   bkey = binb(bkey, key.length * 8);
+                 }
+
+                 for (; i < 16; i += 1) {
+                   ipad[i] = bkey[i] ^ 0x36363636;
+                   opad[i] = bkey[i] ^ 0x5C5C5C5C;
+                 }
+
+                 hash = binb(ipad.concat(rstr2binb(data)), 512 + data.length * 8);
+                 return binb2rstr(binb(opad.concat(hash), 512 + 256));
+               }
+               /*
+                * Main sha256 function, with its support functions
+                */
+
+
+               function sha256_S(X, n) {
+                 return X >>> n | X << 32 - n;
+               }
+
+               function sha256_R(X, n) {
+                 return X >>> n;
+               }
+
+               function sha256_Ch(x, y, z) {
+                 return x & y ^ ~x & z;
+               }
+
+               function sha256_Maj(x, y, z) {
+                 return x & y ^ x & z ^ y & z;
+               }
+
+               function sha256_Sigma0256(x) {
+                 return sha256_S(x, 2) ^ sha256_S(x, 13) ^ sha256_S(x, 22);
+               }
+
+               function sha256_Sigma1256(x) {
+                 return sha256_S(x, 6) ^ sha256_S(x, 11) ^ sha256_S(x, 25);
+               }
+
+               function sha256_Gamma0256(x) {
+                 return sha256_S(x, 7) ^ sha256_S(x, 18) ^ sha256_R(x, 3);
+               }
+
+               function sha256_Gamma1256(x) {
+                 return sha256_S(x, 17) ^ sha256_S(x, 19) ^ sha256_R(x, 10);
+               }
+
+               sha256_K = [1116352408, 1899447441, -1245643825, -373957723, 961987163, 1508970993, -1841331548, -1424204075, -670586216, 310598401, 607225278, 1426881987, 1925078388, -2132889090, -1680079193, -1046744716, -459576895, -272742522, 264347078, 604807628, 770255983, 1249150122, 1555081692, 1996064986, -1740746414, -1473132947, -1341970488, -1084653625, -958395405, -710438585, 113926993, 338241895, 666307205, 773529912, 1294757372, 1396182291, 1695183700, 1986661051, -2117940946, -1838011259, -1564481375, -1474664885, -1035236496, -949202525, -778901479, -694614492, -200395387, 275423344, 430227734, 506948616, 659060556, 883997877, 958139571, 1322822218, 1537002063, 1747873779, 1955562222, 2024104815, -2067236844, -1933114872, -1866530822, -1538233109, -1090935817, -965641998];
+
+               function binb(m, l) {
+                 var HASH = [1779033703, -1150833019, 1013904242, -1521486534, 1359893119, -1694144372, 528734635, 1541459225];
+                 var W = new Array(64);
+                 var a, b, c, d, e, f, g, h;
+                 var i, j, T1, T2;
+                 /* append padding */
+
+                 m[l >> 5] |= 0x80 << 24 - l % 32;
+                 m[(l + 64 >> 9 << 4) + 15] = l;
+
+                 for (i = 0; i < m.length; i += 16) {
+                   a = HASH[0];
+                   b = HASH[1];
+                   c = HASH[2];
+                   d = HASH[3];
+                   e = HASH[4];
+                   f = HASH[5];
+                   g = HASH[6];
+                   h = HASH[7];
+
+                   for (j = 0; j < 64; j += 1) {
+                     if (j < 16) {
+                       W[j] = m[j + i];
+                     } else {
+                       W[j] = safe_add(safe_add(safe_add(sha256_Gamma1256(W[j - 2]), W[j - 7]), sha256_Gamma0256(W[j - 15])), W[j - 16]);
+                     }
+
+                     T1 = safe_add(safe_add(safe_add(safe_add(h, sha256_Sigma1256(e)), sha256_Ch(e, f, g)), sha256_K[j]), W[j]);
+                     T2 = safe_add(sha256_Sigma0256(a), sha256_Maj(a, b, c));
+                     h = g;
+                     g = f;
+                     f = e;
+                     e = safe_add(d, T1);
+                     d = c;
+                     c = b;
+                     b = a;
+                     a = safe_add(T1, T2);
+                   }
+
+                   HASH[0] = safe_add(a, HASH[0]);
+                   HASH[1] = safe_add(b, HASH[1]);
+                   HASH[2] = safe_add(c, HASH[2]);
+                   HASH[3] = safe_add(d, HASH[3]);
+                   HASH[4] = safe_add(e, HASH[4]);
+                   HASH[5] = safe_add(f, HASH[5]);
+                   HASH[6] = safe_add(g, HASH[6]);
+                   HASH[7] = safe_add(h, HASH[7]);
+                 }
+
+                 return HASH;
+               }
+             },
+
+             /**
+              * @class Hashes.SHA512
+              * @param {config}
+              *
+              * A JavaScript implementation of the Secure Hash Algorithm, SHA-512, as defined in FIPS 180-2
+              * Version 2.2 Copyright Anonymous Contributor, Paul Johnston 2000 - 2009.
+              * Other contributors: Greg Holt, Andrew Kepert, Ydnar, Lostinet
+              * See http://pajhome.org.uk/crypt/md5 for details.
+              */
+             SHA512: function SHA512(options) {
+               /**
+                * Private properties configuration variables. You may need to tweak these to be compatible with
+                * the server-side, but the defaults work in most cases.
+                * @see this.setUpperCase() method
+                * @see this.setPad() method
+                */
+               options && typeof options.uppercase === 'boolean' ? options.uppercase : false;
+
+               var /* hexadecimal output case format. false - lowercase; true - uppercase  */
+               b64pad = options && typeof options.pad === 'string' ? options.pad : '=',
+
+               /* base-64 pad character. Default '=' for strict RFC compliance   */
+               utf8 = options && typeof options.utf8 === 'boolean' ? options.utf8 : true,
+
+               /* enable/disable utf8 encoding */
+               sha512_k;
+               /* privileged (public) methods */
+
+               this.hex = function (s) {
+                 return rstr2hex(rstr(s));
+               };
+
+               this.b64 = function (s) {
+                 return rstr2b64(rstr(s), b64pad);
+               };
+
+               this.any = function (s, e) {
+                 return rstr2any(rstr(s), e);
+               };
+
+               this.raw = function (s) {
+                 return rstr(s);
+               };
+
+               this.hex_hmac = function (k, d) {
+                 return rstr2hex(rstr_hmac(k, d));
+               };
+
+               this.b64_hmac = function (k, d) {
+                 return rstr2b64(rstr_hmac(k, d), b64pad);
+               };
+
+               this.any_hmac = function (k, d, e) {
+                 return rstr2any(rstr_hmac(k, d), e);
+               };
+               /**
+                * Perform a simple self-test to see if the VM is working
+                * @return {String} Hexadecimal hash sample
+                * @public
+                */
+
+
+               this.vm_test = function () {
+                 return hex('abc').toLowerCase() === '900150983cd24fb0d6963f7d28e17f72';
+               };
+               /**
+                * @description Enable/disable uppercase hexadecimal returned string
+                * @param {boolean}
+                * @return {Object} this
+                * @public
+                */
+
+
+               this.setUpperCase = function (a) {
+
+                 return this;
+               };
+               /**
+                * @description Defines a base64 pad string
+                * @param {string} Pad
+                * @return {Object} this
+                * @public
+                */
+
+
+               this.setPad = function (a) {
+                 b64pad = a || b64pad;
+                 return this;
+               };
+               /**
+                * @description Defines a base64 pad string
+                * @param {boolean}
+                * @return {Object} this
+                * @public
+                */
+
+
+               this.setUTF8 = function (a) {
+                 if (typeof a === 'boolean') {
+                   utf8 = a;
+                 }
+
+                 return this;
+               };
+               /* private methods */
+
+               /**
+                * Calculate the SHA-512 of a raw string
+                */
+
+
+               function rstr(s) {
+                 s = utf8 ? utf8Encode(s) : s;
+                 return binb2rstr(binb(rstr2binb(s), s.length * 8));
+               }
+               /*
+                * Calculate the HMAC-SHA-512 of a key and some data (raw strings)
+                */
+
+
+               function rstr_hmac(key, data) {
+                 key = utf8 ? utf8Encode(key) : key;
+                 data = utf8 ? utf8Encode(data) : data;
+                 var hash,
+                     i = 0,
+                     bkey = rstr2binb(key),
+                     ipad = Array(32),
+                     opad = Array(32);
+
+                 if (bkey.length > 32) {
+                   bkey = binb(bkey, key.length * 8);
+                 }
+
+                 for (; i < 32; i += 1) {
+                   ipad[i] = bkey[i] ^ 0x36363636;
+                   opad[i] = bkey[i] ^ 0x5C5C5C5C;
+                 }
+
+                 hash = binb(ipad.concat(rstr2binb(data)), 1024 + data.length * 8);
+                 return binb2rstr(binb(opad.concat(hash), 1024 + 512));
+               }
+               /**
+                * Calculate the SHA-512 of an array of big-endian dwords, and a bit length
+                */
+
+
+               function binb(x, len) {
+                 var j,
+                     i,
+                     l,
+                     W = new Array(80),
+                     hash = new Array(16),
+                     //Initial hash values
+                 H = [new int64(0x6a09e667, -205731576), new int64(-1150833019, -2067093701), new int64(0x3c6ef372, -23791573), new int64(-1521486534, 0x5f1d36f1), new int64(0x510e527f, -1377402159), new int64(-1694144372, 0x2b3e6c1f), new int64(0x1f83d9ab, -79577749), new int64(0x5be0cd19, 0x137e2179)],
+                     T1 = new int64(0, 0),
+                     T2 = new int64(0, 0),
+                     a = new int64(0, 0),
+                     b = new int64(0, 0),
+                     c = new int64(0, 0),
+                     d = new int64(0, 0),
+                     e = new int64(0, 0),
+                     f = new int64(0, 0),
+                     g = new int64(0, 0),
+                     h = new int64(0, 0),
+                     //Temporary variables not specified by the document
+                 s0 = new int64(0, 0),
+                     s1 = new int64(0, 0),
+                     Ch = new int64(0, 0),
+                     Maj = new int64(0, 0),
+                     r1 = new int64(0, 0),
+                     r2 = new int64(0, 0),
+                     r3 = new int64(0, 0);
+
+                 if (sha512_k === undefined) {
+                   //SHA512 constants
+                   sha512_k = [new int64(0x428a2f98, -685199838), new int64(0x71374491, 0x23ef65cd), new int64(-1245643825, -330482897), new int64(-373957723, -2121671748), new int64(0x3956c25b, -213338824), new int64(0x59f111f1, -1241133031), new int64(-1841331548, -1357295717), new int64(-1424204075, -630357736), new int64(-670586216, -1560083902), new int64(0x12835b01, 0x45706fbe), new int64(0x243185be, 0x4ee4b28c), new int64(0x550c7dc3, -704662302), new int64(0x72be5d74, -226784913), new int64(-2132889090, 0x3b1696b1), new int64(-1680079193, 0x25c71235), new int64(-1046744716, -815192428), new int64(-459576895, -1628353838), new int64(-272742522, 0x384f25e3), new int64(0xfc19dc6, -1953704523), new int64(0x240ca1cc, 0x77ac9c65), new int64(0x2de92c6f, 0x592b0275), new int64(0x4a7484aa, 0x6ea6e483), new int64(0x5cb0a9dc, -1119749164), new int64(0x76f988da, -2096016459), new int64(-1740746414, -295247957), new int64(-1473132947, 0x2db43210), new int64(-1341970488, -1728372417), new int64(-1084653625, -1091629340), new int64(-958395405, 0x3da88fc2), new int64(-710438585, -1828018395), new int64(0x6ca6351, -536640913), new int64(0x14292967, 0xa0e6e70), new int64(0x27b70a85, 0x46d22ffc), new int64(0x2e1b2138, 0x5c26c926), new int64(0x4d2c6dfc, 0x5ac42aed), new int64(0x53380d13, -1651133473), new int64(0x650a7354, -1951439906), new int64(0x766a0abb, 0x3c77b2a8), new int64(-2117940946, 0x47edaee6), new int64(-1838011259, 0x1482353b), new int64(-1564481375, 0x4cf10364), new int64(-1474664885, -1136513023), new int64(-1035236496, -789014639), new int64(-949202525, 0x654be30), new int64(-778901479, -688958952), new int64(-694614492, 0x5565a910), new int64(-200395387, 0x5771202a), new int64(0x106aa070, 0x32bbd1b8), new int64(0x19a4c116, -1194143544), new int64(0x1e376c08, 0x5141ab53), new int64(0x2748774c, -544281703), new int64(0x34b0bcb5, -509917016), new int64(0x391c0cb3, -976659869), new int64(0x4ed8aa4a, -482243893), new int64(0x5b9cca4f, 0x7763e373), new int64(0x682e6ff3, -692930397), new int64(0x748f82ee, 0x5defb2fc), new int64(0x78a5636f, 0x43172f60), new int64(-2067236844, -1578062990), new int64(-1933114872, 0x1a6439ec), new int64(-1866530822, 0x23631e28), new int64(-1538233109, -561857047), new int64(-1090935817, -1295615723), new int64(-965641998, -479046869), new int64(-903397682, -366583396), new int64(-779700025, 0x21c0c207), new int64(-354779690, -840897762), new int64(-176337025, -294727304), new int64(0x6f067aa, 0x72176fba), new int64(0xa637dc5, -1563912026), new int64(0x113f9804, -1090974290), new int64(0x1b710b35, 0x131c471b), new int64(0x28db77f5, 0x23047d84), new int64(0x32caab7b, 0x40c72493), new int64(0x3c9ebe0a, 0x15c9bebc), new int64(0x431d67c4, -1676669620), new int64(0x4cc5d4be, -885112138), new int64(0x597f299c, -60457430), new int64(0x5fcb6fab, 0x3ad6faec), new int64(0x6c44198c, 0x4a475817)];
+                 }
+
+                 for (i = 0; i < 80; i += 1) {
+                   W[i] = new int64(0, 0);
+                 } // append padding to the source string. The format is described in the FIPS.
+
+
+                 x[len >> 5] |= 0x80 << 24 - (len & 0x1f);
+                 x[(len + 128 >> 10 << 5) + 31] = len;
+                 l = x.length;
+
+                 for (i = 0; i < l; i += 32) {
+                   //32 dwords is the block size
+                   int64copy(a, H[0]);
+                   int64copy(b, H[1]);
+                   int64copy(c, H[2]);
+                   int64copy(d, H[3]);
+                   int64copy(e, H[4]);
+                   int64copy(f, H[5]);
+                   int64copy(g, H[6]);
+                   int64copy(h, H[7]);
+
+                   for (j = 0; j < 16; j += 1) {
+                     W[j].h = x[i + 2 * j];
+                     W[j].l = x[i + 2 * j + 1];
+                   }
+
+                   for (j = 16; j < 80; j += 1) {
+                     //sigma1
+                     int64rrot(r1, W[j - 2], 19);
+                     int64revrrot(r2, W[j - 2], 29);
+                     int64shr(r3, W[j - 2], 6);
+                     s1.l = r1.l ^ r2.l ^ r3.l;
+                     s1.h = r1.h ^ r2.h ^ r3.h; //sigma0
+
+                     int64rrot(r1, W[j - 15], 1);
+                     int64rrot(r2, W[j - 15], 8);
+                     int64shr(r3, W[j - 15], 7);
+                     s0.l = r1.l ^ r2.l ^ r3.l;
+                     s0.h = r1.h ^ r2.h ^ r3.h;
+                     int64add4(W[j], s1, W[j - 7], s0, W[j - 16]);
+                   }
+
+                   for (j = 0; j < 80; j += 1) {
+                     //Ch
+                     Ch.l = e.l & f.l ^ ~e.l & g.l;
+                     Ch.h = e.h & f.h ^ ~e.h & g.h; //Sigma1
+
+                     int64rrot(r1, e, 14);
+                     int64rrot(r2, e, 18);
+                     int64revrrot(r3, e, 9);
+                     s1.l = r1.l ^ r2.l ^ r3.l;
+                     s1.h = r1.h ^ r2.h ^ r3.h; //Sigma0
+
+                     int64rrot(r1, a, 28);
+                     int64revrrot(r2, a, 2);
+                     int64revrrot(r3, a, 7);
+                     s0.l = r1.l ^ r2.l ^ r3.l;
+                     s0.h = r1.h ^ r2.h ^ r3.h; //Maj
+
+                     Maj.l = a.l & b.l ^ a.l & c.l ^ b.l & c.l;
+                     Maj.h = a.h & b.h ^ a.h & c.h ^ b.h & c.h;
+                     int64add5(T1, h, s1, Ch, sha512_k[j], W[j]);
+                     int64add(T2, s0, Maj);
+                     int64copy(h, g);
+                     int64copy(g, f);
+                     int64copy(f, e);
+                     int64add(e, d, T1);
+                     int64copy(d, c);
+                     int64copy(c, b);
+                     int64copy(b, a);
+                     int64add(a, T1, T2);
+                   }
+
+                   int64add(H[0], H[0], a);
+                   int64add(H[1], H[1], b);
+                   int64add(H[2], H[2], c);
+                   int64add(H[3], H[3], d);
+                   int64add(H[4], H[4], e);
+                   int64add(H[5], H[5], f);
+                   int64add(H[6], H[6], g);
+                   int64add(H[7], H[7], h);
+                 } //represent the hash as an array of 32-bit dwords
+
+
+                 for (i = 0; i < 8; i += 1) {
+                   hash[2 * i] = H[i].h;
+                   hash[2 * i + 1] = H[i].l;
+                 }
+
+                 return hash;
+               } //A constructor for 64-bit numbers
+
+
+               function int64(h, l) {
+                 this.h = h;
+                 this.l = l; //this.toString = int64toString;
+               } //Copies src into dst, assuming both are 64-bit numbers
+
+
+               function int64copy(dst, src) {
+                 dst.h = src.h;
+                 dst.l = src.l;
+               } //Right-rotates a 64-bit number by shift
+               //Won't handle cases of shift>=32
+               //The function revrrot() is for that
+
+
+               function int64rrot(dst, x, shift) {
+                 dst.l = x.l >>> shift | x.h << 32 - shift;
+                 dst.h = x.h >>> shift | x.l << 32 - shift;
+               } //Reverses the dwords of the source and then rotates right by shift.
+               //This is equivalent to rotation by 32+shift
+
+
+               function int64revrrot(dst, x, shift) {
+                 dst.l = x.h >>> shift | x.l << 32 - shift;
+                 dst.h = x.l >>> shift | x.h << 32 - shift;
+               } //Bitwise-shifts right a 64-bit number by shift
+               //Won't handle shift>=32, but it's never needed in SHA512
+
+
+               function int64shr(dst, x, shift) {
+                 dst.l = x.l >>> shift | x.h << 32 - shift;
+                 dst.h = x.h >>> shift;
+               } //Adds two 64-bit numbers
+               //Like the original implementation, does not rely on 32-bit operations
+
+
+               function int64add(dst, x, y) {
+                 var w0 = (x.l & 0xffff) + (y.l & 0xffff);
+                 var w1 = (x.l >>> 16) + (y.l >>> 16) + (w0 >>> 16);
+                 var w2 = (x.h & 0xffff) + (y.h & 0xffff) + (w1 >>> 16);
+                 var w3 = (x.h >>> 16) + (y.h >>> 16) + (w2 >>> 16);
+                 dst.l = w0 & 0xffff | w1 << 16;
+                 dst.h = w2 & 0xffff | w3 << 16;
+               } //Same, except with 4 addends. Works faster than adding them one by one.
+
+
+               function int64add4(dst, a, b, c, d) {
+                 var w0 = (a.l & 0xffff) + (b.l & 0xffff) + (c.l & 0xffff) + (d.l & 0xffff);
+                 var w1 = (a.l >>> 16) + (b.l >>> 16) + (c.l >>> 16) + (d.l >>> 16) + (w0 >>> 16);
+                 var w2 = (a.h & 0xffff) + (b.h & 0xffff) + (c.h & 0xffff) + (d.h & 0xffff) + (w1 >>> 16);
+                 var w3 = (a.h >>> 16) + (b.h >>> 16) + (c.h >>> 16) + (d.h >>> 16) + (w2 >>> 16);
+                 dst.l = w0 & 0xffff | w1 << 16;
+                 dst.h = w2 & 0xffff | w3 << 16;
+               } //Same, except with 5 addends
+
+
+               function int64add5(dst, a, b, c, d, e) {
+                 var w0 = (a.l & 0xffff) + (b.l & 0xffff) + (c.l & 0xffff) + (d.l & 0xffff) + (e.l & 0xffff),
+                     w1 = (a.l >>> 16) + (b.l >>> 16) + (c.l >>> 16) + (d.l >>> 16) + (e.l >>> 16) + (w0 >>> 16),
+                     w2 = (a.h & 0xffff) + (b.h & 0xffff) + (c.h & 0xffff) + (d.h & 0xffff) + (e.h & 0xffff) + (w1 >>> 16),
+                     w3 = (a.h >>> 16) + (b.h >>> 16) + (c.h >>> 16) + (d.h >>> 16) + (e.h >>> 16) + (w2 >>> 16);
+                 dst.l = w0 & 0xffff | w1 << 16;
+                 dst.h = w2 & 0xffff | w3 << 16;
+               }
+             },
+
+             /**
+              * @class Hashes.RMD160
+              * @constructor
+              * @param {Object} [config]
+              *
+              * A JavaScript implementation of the RIPEMD-160 Algorithm
+              * Version 2.2 Copyright Jeremy Lin, Paul Johnston 2000 - 2009.
+              * Other contributors: Greg Holt, Andrew Kepert, Ydnar, Lostinet
+              * See http://pajhome.org.uk/crypt/md5 for details.
+              * Also http://www.ocf.berkeley.edu/~jjlin/jsotp/
+              */
+             RMD160: function RMD160(options) {
+               /**
+                * Private properties configuration variables. You may need to tweak these to be compatible with
+                * the server-side, but the defaults work in most cases.
+                * @see this.setUpperCase() method
+                * @see this.setPad() method
+                */
+               options && typeof options.uppercase === 'boolean' ? options.uppercase : false;
+
+               var /* hexadecimal output case format. false - lowercase; true - uppercase  */
+               b64pad = options && typeof options.pad === 'string' ? options.pa : '=',
+
+               /* base-64 pad character. Default '=' for strict RFC compliance   */
+               utf8 = options && typeof options.utf8 === 'boolean' ? options.utf8 : true,
+
+               /* enable/disable utf8 encoding */
+               rmd160_r1 = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 7, 4, 13, 1, 10, 6, 15, 3, 12, 0, 9, 5, 2, 14, 11, 8, 3, 10, 14, 4, 9, 15, 8, 1, 2, 7, 0, 6, 13, 11, 5, 12, 1, 9, 11, 10, 0, 8, 12, 4, 13, 3, 7, 15, 14, 5, 6, 2, 4, 0, 5, 9, 7, 12, 2, 10, 14, 1, 3, 8, 11, 6, 15, 13],
+                   rmd160_r2 = [5, 14, 7, 0, 9, 2, 11, 4, 13, 6, 15, 8, 1, 10, 3, 12, 6, 11, 3, 7, 0, 13, 5, 10, 14, 15, 8, 12, 4, 9, 1, 2, 15, 5, 1, 3, 7, 14, 6, 9, 11, 8, 12, 2, 10, 0, 4, 13, 8, 6, 4, 1, 3, 11, 15, 0, 5, 12, 2, 13, 9, 7, 10, 14, 12, 15, 10, 4, 1, 5, 8, 7, 6, 2, 13, 14, 0, 3, 9, 11],
+                   rmd160_s1 = [11, 14, 15, 12, 5, 8, 7, 9, 11, 13, 14, 15, 6, 7, 9, 8, 7, 6, 8, 13, 11, 9, 7, 15, 7, 12, 15, 9, 11, 7, 13, 12, 11, 13, 6, 7, 14, 9, 13, 15, 14, 8, 13, 6, 5, 12, 7, 5, 11, 12, 14, 15, 14, 15, 9, 8, 9, 14, 5, 6, 8, 6, 5, 12, 9, 15, 5, 11, 6, 8, 13, 12, 5, 12, 13, 14, 11, 8, 5, 6],
+                   rmd160_s2 = [8, 9, 9, 11, 13, 15, 15, 5, 7, 7, 8, 11, 14, 14, 12, 6, 9, 13, 15, 7, 12, 8, 9, 11, 7, 7, 12, 7, 6, 15, 13, 11, 9, 7, 15, 11, 8, 6, 6, 14, 12, 13, 5, 14, 13, 13, 7, 5, 15, 5, 8, 11, 14, 14, 6, 14, 6, 9, 12, 9, 12, 5, 15, 8, 8, 5, 12, 9, 12, 5, 14, 6, 8, 13, 6, 5, 15, 13, 11, 11];
+               /* privileged (public) methods */
+
+               this.hex = function (s) {
+                 return rstr2hex(rstr(s));
+               };
+
+               this.b64 = function (s) {
+                 return rstr2b64(rstr(s), b64pad);
+               };
+
+               this.any = function (s, e) {
+                 return rstr2any(rstr(s), e);
+               };
+
+               this.raw = function (s) {
+                 return rstr(s);
+               };
+
+               this.hex_hmac = function (k, d) {
+                 return rstr2hex(rstr_hmac(k, d));
+               };
+
+               this.b64_hmac = function (k, d) {
+                 return rstr2b64(rstr_hmac(k, d), b64pad);
+               };
+
+               this.any_hmac = function (k, d, e) {
+                 return rstr2any(rstr_hmac(k, d), e);
+               };
+               /**
+                * Perform a simple self-test to see if the VM is working
+                * @return {String} Hexadecimal hash sample
+                * @public
+                */
+
+
+               this.vm_test = function () {
+                 return hex('abc').toLowerCase() === '900150983cd24fb0d6963f7d28e17f72';
+               };
+               /**
+                * @description Enable/disable uppercase hexadecimal returned string
+                * @param {boolean}
+                * @return {Object} this
+                * @public
+                */
+
+
+               this.setUpperCase = function (a) {
+
+                 return this;
+               };
+               /**
+                * @description Defines a base64 pad string
+                * @param {string} Pad
+                * @return {Object} this
+                * @public
+                */
+
+
+               this.setPad = function (a) {
+                 if (typeof a !== 'undefined') {
+                   b64pad = a;
+                 }
+
+                 return this;
+               };
+               /**
+                * @description Defines a base64 pad string
+                * @param {boolean}
+                * @return {Object} this
+                * @public
+                */
+
+
+               this.setUTF8 = function (a) {
+                 if (typeof a === 'boolean') {
+                   utf8 = a;
+                 }
+
+                 return this;
+               };
+               /* private methods */
+
+               /**
+                * Calculate the rmd160 of a raw string
+                */
+
+
+               function rstr(s) {
+                 s = utf8 ? utf8Encode(s) : s;
+                 return binl2rstr(binl(rstr2binl(s), s.length * 8));
+               }
+               /**
+                * Calculate the HMAC-rmd160 of a key and some data (raw strings)
+                */
+
+
+               function rstr_hmac(key, data) {
+                 key = utf8 ? utf8Encode(key) : key;
+                 data = utf8 ? utf8Encode(data) : data;
+                 var i,
+                     hash,
+                     bkey = rstr2binl(key),
+                     ipad = Array(16),
+                     opad = Array(16);
+
+                 if (bkey.length > 16) {
+                   bkey = binl(bkey, key.length * 8);
+                 }
+
+                 for (i = 0; i < 16; i += 1) {
+                   ipad[i] = bkey[i] ^ 0x36363636;
+                   opad[i] = bkey[i] ^ 0x5C5C5C5C;
+                 }
+
+                 hash = binl(ipad.concat(rstr2binl(data)), 512 + data.length * 8);
+                 return binl2rstr(binl(opad.concat(hash), 512 + 160));
+               }
+               /**
+                * Convert an array of little-endian words to a string
+                */
+
+
+               function binl2rstr(input) {
+                 var i,
+                     output = '',
+                     l = input.length * 32;
+
+                 for (i = 0; i < l; i += 8) {
+                   output += String.fromCharCode(input[i >> 5] >>> i % 32 & 0xFF);
+                 }
+
+                 return output;
+               }
+               /**
+                * Calculate the RIPE-MD160 of an array of little-endian words, and a bit length.
+                */
+
+
+               function binl(x, len) {
+                 var T,
+                     j,
+                     i,
+                     l,
+                     h0 = 0x67452301,
+                     h1 = 0xefcdab89,
+                     h2 = 0x98badcfe,
+                     h3 = 0x10325476,
+                     h4 = 0xc3d2e1f0,
+                     A1,
+                     B1,
+                     C1,
+                     D1,
+                     E1,
+                     A2,
+                     B2,
+                     C2,
+                     D2,
+                     E2;
+                 /* append padding */
+
+                 x[len >> 5] |= 0x80 << len % 32;
+                 x[(len + 64 >>> 9 << 4) + 14] = len;
+                 l = x.length;
+
+                 for (i = 0; i < l; i += 16) {
+                   A1 = A2 = h0;
+                   B1 = B2 = h1;
+                   C1 = C2 = h2;
+                   D1 = D2 = h3;
+                   E1 = E2 = h4;
+
+                   for (j = 0; j <= 79; j += 1) {
+                     T = safe_add(A1, rmd160_f(j, B1, C1, D1));
+                     T = safe_add(T, x[i + rmd160_r1[j]]);
+                     T = safe_add(T, rmd160_K1(j));
+                     T = safe_add(bit_rol(T, rmd160_s1[j]), E1);
+                     A1 = E1;
+                     E1 = D1;
+                     D1 = bit_rol(C1, 10);
+                     C1 = B1;
+                     B1 = T;
+                     T = safe_add(A2, rmd160_f(79 - j, B2, C2, D2));
+                     T = safe_add(T, x[i + rmd160_r2[j]]);
+                     T = safe_add(T, rmd160_K2(j));
+                     T = safe_add(bit_rol(T, rmd160_s2[j]), E2);
+                     A2 = E2;
+                     E2 = D2;
+                     D2 = bit_rol(C2, 10);
+                     C2 = B2;
+                     B2 = T;
+                   }
+
+                   T = safe_add(h1, safe_add(C1, D2));
+                   h1 = safe_add(h2, safe_add(D1, E2));
+                   h2 = safe_add(h3, safe_add(E1, A2));
+                   h3 = safe_add(h4, safe_add(A1, B2));
+                   h4 = safe_add(h0, safe_add(B1, C2));
+                   h0 = T;
+                 }
+
+                 return [h0, h1, h2, h3, h4];
+               } // specific algorithm methods
+
+
+               function rmd160_f(j, x, y, z) {
+                 return 0 <= j && j <= 15 ? x ^ y ^ z : 16 <= j && j <= 31 ? x & y | ~x & z : 32 <= j && j <= 47 ? (x | ~y) ^ z : 48 <= j && j <= 63 ? x & z | y & ~z : 64 <= j && j <= 79 ? x ^ (y | ~z) : 'rmd160_f: j out of range';
+               }
+
+               function rmd160_K1(j) {
+                 return 0 <= j && j <= 15 ? 0x00000000 : 16 <= j && j <= 31 ? 0x5a827999 : 32 <= j && j <= 47 ? 0x6ed9eba1 : 48 <= j && j <= 63 ? 0x8f1bbcdc : 64 <= j && j <= 79 ? 0xa953fd4e : 'rmd160_K1: j out of range';
+               }
+
+               function rmd160_K2(j) {
+                 return 0 <= j && j <= 15 ? 0x50a28be6 : 16 <= j && j <= 31 ? 0x5c4dd124 : 32 <= j && j <= 47 ? 0x6d703ef3 : 48 <= j && j <= 63 ? 0x7a6d76e9 : 64 <= j && j <= 79 ? 0x00000000 : 'rmd160_K2: j out of range';
+               }
+             }
+           }; // exposes Hashes
+
+           (function (window, undefined$1) {
+             var freeExports = false;
+
+             {
+               freeExports = exports;
+
+               if (exports && _typeof(commonjsGlobal) === 'object' && commonjsGlobal && commonjsGlobal === commonjsGlobal.global) {
+                 window = commonjsGlobal;
+               }
+             }
+
+             if (typeof undefined$1 === 'function' && _typeof(undefined$1.amd) === 'object' && undefined$1.amd) {
+               // define as an anonymous module, so, through path mapping, it can be aliased
+               undefined$1(function () {
+                 return Hashes;
+               });
+             } else if (freeExports) {
+               // in Node.js or RingoJS v0.8.0+
+               if (module && module.exports === freeExports) {
+                 module.exports = Hashes;
+               } // in Narwhal or RingoJS v0.7.0-
+               else {
+                 freeExports.Hashes = Hashes;
+               }
+             } else {
+               // in a browser or Rhino
+               window.Hashes = Hashes;
+             }
+           })(this);
+         })(); // IIFE
+
+       })(hashes$1, hashes$1.exports);
+
+       var hashes = hashes$1.exports,
+           sha1 = new hashes.SHA1(); // # xtend
+
+       var hasOwnProperty$1 = Object.prototype.hasOwnProperty;
+
+       function xtend$1() {
+         var target = {};
+
+         for (var i = 0; i < arguments.length; i++) {
+           var source = arguments[i];
+
+           for (var key in source) {
+             if (hasOwnProperty$1.call(source, key)) {
+               target[key] = source[key];
+             }
+           }
+         }
+
+         return target;
+       }
+
+       var ohauth$1 = {};
+
+       ohauth$1.qsString = function (obj) {
+         return Object.keys(obj).sort().map(function (key) {
+           return ohauth$1.percentEncode(key) + '=' + ohauth$1.percentEncode(obj[key]);
+         }).join('&');
+       };
+
+       ohauth$1.stringQs = function (str) {
+         return str.split('&').filter(function (pair) {
+           return pair !== '';
+         }).reduce(function (obj, pair) {
+           var parts = pair.split('=');
+           obj[decodeURIComponent(parts[0])] = null === parts[1] ? '' : decodeURIComponent(parts[1]);
+           return obj;
+         }, {});
+       };
+
+       ohauth$1.rawxhr = function (method, url, data, headers, callback) {
+         var xhr = new XMLHttpRequest(),
+             twoHundred = /^20\d$/;
+
+         xhr.onreadystatechange = function () {
+           if (4 === xhr.readyState && 0 !== xhr.status) {
+             if (twoHundred.test(xhr.status)) callback(null, xhr);else return callback(xhr, null);
+           }
+         };
+
+         xhr.onerror = function (e) {
+           return callback(e, null);
+         };
+
+         xhr.open(method, url, true);
+
+         for (var h in headers) {
+           xhr.setRequestHeader(h, headers[h]);
+         }
+
+         xhr.send(data);
+         return xhr;
+       };
+
+       ohauth$1.xhr = function (method, url, auth, data, options, callback) {
+         var headers = options && options.header || {
+           'Content-Type': 'application/x-www-form-urlencoded'
+         };
+         headers.Authorization = 'OAuth ' + ohauth$1.authHeader(auth);
+         return ohauth$1.rawxhr(method, url, data, headers, callback);
+       };
+
+       ohauth$1.nonce = function () {
+         for (var o = ''; o.length < 6;) {
+           o += '0123456789ABCDEFGHIJKLMNOPQRSTUVWXTZabcdefghiklmnopqrstuvwxyz'[Math.floor(Math.random() * 61)];
+         }
+
+         return o;
+       };
+
+       ohauth$1.authHeader = function (obj) {
+         return Object.keys(obj).sort().map(function (key) {
+           return encodeURIComponent(key) + '="' + encodeURIComponent(obj[key]) + '"';
+         }).join(', ');
+       };
+
+       ohauth$1.timestamp = function () {
+         return ~~(+new Date() / 1000);
+       };
+
+       ohauth$1.percentEncode = function (s) {
+         return encodeURIComponent(s).replace(/\!/g, '%21').replace(/\'/g, '%27').replace(/\*/g, '%2A').replace(/\(/g, '%28').replace(/\)/g, '%29');
+       };
+
+       ohauth$1.baseString = function (method, url, params) {
+         if (params.oauth_signature) delete params.oauth_signature;
+         return [method, ohauth$1.percentEncode(url), ohauth$1.percentEncode(ohauth$1.qsString(params))].join('&');
+       };
+
+       ohauth$1.signature = function (oauth_secret, token_secret, baseString) {
+         return sha1.b64_hmac(ohauth$1.percentEncode(oauth_secret) + '&' + ohauth$1.percentEncode(token_secret), baseString);
+       };
+       /**
+        * Takes an options object for configuration (consumer_key,
+        * consumer_secret, version, signature_method, token, token_secret)
+        * and returns a function that generates the Authorization header
+        * for given data.
+        *
+        * The returned function takes these parameters:
+        * - method: GET/POST/...
+        * - uri: full URI with protocol, port, path and query string
+        * - extra_params: any extra parameters (that are passed in the POST data),
+        *   can be an object or a from-urlencoded string.
+        *
+        * Returned function returns full OAuth header with "OAuth" string in it.
+        */
+
+
+       ohauth$1.headerGenerator = function (options) {
+         options = options || {};
+         var consumer_key = options.consumer_key || '',
+             consumer_secret = options.consumer_secret || '',
+             signature_method = options.signature_method || 'HMAC-SHA1',
+             version = options.version || '1.0',
+             token = options.token || '',
+             token_secret = options.token_secret || '';
+         return function (method, uri, extra_params) {
+           method = method.toUpperCase();
+
+           if (typeof extra_params === 'string' && extra_params.length > 0) {
+             extra_params = ohauth$1.stringQs(extra_params);
+           }
+
+           var uri_parts = uri.split('?', 2),
+               base_uri = uri_parts[0];
+           var query_params = uri_parts.length === 2 ? ohauth$1.stringQs(uri_parts[1]) : {};
+           var oauth_params = {
+             oauth_consumer_key: consumer_key,
+             oauth_signature_method: signature_method,
+             oauth_version: version,
+             oauth_timestamp: ohauth$1.timestamp(),
+             oauth_nonce: ohauth$1.nonce()
+           };
+           if (token) oauth_params.oauth_token = token;
+           var all_params = xtend$1({}, oauth_params, query_params, extra_params),
+               base_str = ohauth$1.baseString(method, base_uri, all_params);
+           oauth_params.oauth_signature = ohauth$1.signature(consumer_secret, token_secret, base_str);
+           return 'OAuth ' + ohauth$1.authHeader(oauth_params);
+         };
+       };
+
+       var ohauth_1 = ohauth$1;
+
+       var resolveUrl$1 = {exports: {}};
+
+       (function (module, exports) {
+         // Copyright 2014 Simon Lydell
+         // X11 (“MIT”) Licensed. (See LICENSE.)
+         void function (root, factory) {
+           {
+             module.exports = factory();
+           }
+         }(commonjsGlobal, function () {
+           function
+             /* ...urls */
+           resolveUrl() {
+             var numUrls = arguments.length;
+
+             if (numUrls === 0) {
+               throw new Error("resolveUrl requires at least one argument; got none.");
+             }
+
+             var base = document.createElement("base");
+             base.href = arguments[0];
+
+             if (numUrls === 1) {
+               return base.href;
+             }
+
+             var head = document.getElementsByTagName("head")[0];
+             head.insertBefore(base, head.firstChild);
+             var a = document.createElement("a");
+             var resolved;
+
+             for (var index = 1; index < numUrls; index++) {
+               a.href = arguments[index];
+               resolved = a.href;
+               base.href = resolved;
+             }
+
+             head.removeChild(base);
+             return resolved;
+           }
+
+           return resolveUrl;
+         });
+       })(resolveUrl$1);
+
+       var assign = make_assign();
+       var create$1 = make_create();
+       var trim$1 = make_trim();
+       var Global$5 = typeof window !== 'undefined' ? window : commonjsGlobal;
+       var util$6 = {
+         assign: assign,
+         create: create$1,
+         trim: trim$1,
+         bind: bind$1,
+         slice: slice$1,
+         each: each$7,
+         map: map,
+         pluck: pluck$1,
+         isList: isList$1,
+         isFunction: isFunction$1,
+         isObject: isObject$1,
+         Global: Global$5
+       };
+
+       function make_assign() {
+         if (Object.assign) {
+           return Object.assign;
+         } else {
+           return function shimAssign(obj, props1, props2, etc) {
+             for (var i = 1; i < arguments.length; i++) {
+               each$7(Object(arguments[i]), function (val, key) {
+                 obj[key] = val;
+               });
+             }
+
+             return obj;
+           };
+         }
+       }
+
+       function make_create() {
+         if (Object.create) {
+           return function create(obj, assignProps1, assignProps2, etc) {
+             var assignArgsList = slice$1(arguments, 1);
+             return assign.apply(this, [Object.create(obj)].concat(assignArgsList));
+           };
+         } else {
+           var F = function F() {}; // eslint-disable-line no-inner-declarations
+
+
+           return function create(obj, assignProps1, assignProps2, etc) {
+             var assignArgsList = slice$1(arguments, 1);
+             F.prototype = obj;
+             return assign.apply(this, [new F()].concat(assignArgsList));
+           };
+         }
+       }
+
+       function make_trim() {
+         if (String.prototype.trim) {
+           return function trim(str) {
+             return String.prototype.trim.call(str);
+           };
+         } else {
+           return function trim(str) {
+             return str.replace(/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g, '');
+           };
+         }
+       }
+
+       function bind$1(obj, fn) {
+         return function () {
+           return fn.apply(obj, Array.prototype.slice.call(arguments, 0));
+         };
+       }
+
+       function slice$1(arr, index) {
+         return Array.prototype.slice.call(arr, index || 0);
+       }
+
+       function each$7(obj, fn) {
+         pluck$1(obj, function (val, key) {
+           fn(val, key);
+           return false;
+         });
+       }
+
+       function map(obj, fn) {
+         var res = isList$1(obj) ? [] : {};
+         pluck$1(obj, function (v, k) {
+           res[k] = fn(v, k);
+           return false;
+         });
+         return res;
+       }
+
+       function pluck$1(obj, fn) {
+         if (isList$1(obj)) {
+           for (var i = 0; i < obj.length; i++) {
+             if (fn(obj[i], i)) {
+               return obj[i];
+             }
+           }
+         } else {
+           for (var key in obj) {
+             if (obj.hasOwnProperty(key)) {
+               if (fn(obj[key], key)) {
+                 return obj[key];
+               }
+             }
+           }
+         }
+       }
+
+       function isList$1(val) {
+         return val != null && typeof val != 'function' && typeof val.length == 'number';
+       }
+
+       function isFunction$1(val) {
+         return val && {}.toString.call(val) === '[object Function]';
+       }
+
+       function isObject$1(val) {
+         return val && {}.toString.call(val) === '[object Object]';
+       }
+
+       var util$5 = util$6;
+       var slice = util$5.slice;
+       var pluck = util$5.pluck;
+       var each$6 = util$5.each;
+       var bind = util$5.bind;
+       var create = util$5.create;
+       var isList = util$5.isList;
+       var isFunction = util$5.isFunction;
+       var isObject = util$5.isObject;
+       var storeEngine = {
+         createStore: _createStore
+       };
+       var storeAPI = {
+         version: '2.0.12',
+         enabled: false,
+         // get returns the value of the given key. If that value
+         // is undefined, it returns optionalDefaultValue instead.
+         get: function get(key, optionalDefaultValue) {
+           var data = this.storage.read(this._namespacePrefix + key);
+           return this._deserialize(data, optionalDefaultValue);
+         },
+         // set will store the given value at key and returns value.
+         // Calling set with value === undefined is equivalent to calling remove.
+         set: function set(key, value) {
+           if (value === undefined) {
+             return this.remove(key);
+           }
+
+           this.storage.write(this._namespacePrefix + key, this._serialize(value));
+           return value;
+         },
+         // remove deletes the key and value stored at the given key.
+         remove: function remove(key) {
+           this.storage.remove(this._namespacePrefix + key);
+         },
+         // each will call the given callback once for each key-value pair
+         // in this store.
+         each: function each(callback) {
+           var self = this;
+           this.storage.each(function (val, namespacedKey) {
+             callback.call(self, self._deserialize(val), (namespacedKey || '').replace(self._namespaceRegexp, ''));
+           });
+         },
+         // clearAll will remove all the stored key-value pairs in this store.
+         clearAll: function clearAll() {
+           this.storage.clearAll();
+         },
+         // additional functionality that can't live in plugins
+         // ---------------------------------------------------
+         // hasNamespace returns true if this store instance has the given namespace.
+         hasNamespace: function hasNamespace(namespace) {
+           return this._namespacePrefix == '__storejs_' + namespace + '_';
+         },
+         // createStore creates a store.js instance with the first
+         // functioning storage in the list of storage candidates,
+         // and applies the the given mixins to the instance.
+         createStore: function createStore() {
+           return _createStore.apply(this, arguments);
+         },
+         addPlugin: function addPlugin(plugin) {
+           this._addPlugin(plugin);
+         },
+         namespace: function namespace(_namespace) {
+           return _createStore(this.storage, this.plugins, _namespace);
+         }
+       };
+
+       function _warn() {
+         var _console = typeof console == 'undefined' ? null : console;
+
+         if (!_console) {
+           return;
+         }
+
+         var fn = _console.warn ? _console.warn : _console.log;
+         fn.apply(_console, arguments);
+       }
+
+       function _createStore(storages, plugins, namespace) {
+         if (!namespace) {
+           namespace = '';
+         }
+
+         if (storages && !isList(storages)) {
+           storages = [storages];
+         }
+
+         if (plugins && !isList(plugins)) {
+           plugins = [plugins];
+         }
+
+         var namespacePrefix = namespace ? '__storejs_' + namespace + '_' : '';
+         var namespaceRegexp = namespace ? new RegExp('^' + namespacePrefix) : null;
+         var legalNamespaces = /^[a-zA-Z0-9_\-]*$/; // alpha-numeric + underscore and dash
+
+         if (!legalNamespaces.test(namespace)) {
+           throw new Error('store.js namespaces can only have alphanumerics + underscores and dashes');
+         }
+
+         var _privateStoreProps = {
+           _namespacePrefix: namespacePrefix,
+           _namespaceRegexp: namespaceRegexp,
+           _testStorage: function _testStorage(storage) {
+             try {
+               var testStr = '__storejs__test__';
+               storage.write(testStr, testStr);
+               var ok = storage.read(testStr) === testStr;
+               storage.remove(testStr);
+               return ok;
+             } catch (e) {
+               return false;
+             }
+           },
+           _assignPluginFnProp: function _assignPluginFnProp(pluginFnProp, propName) {
+             var oldFn = this[propName];
+
+             this[propName] = function pluginFn() {
+               var args = slice(arguments, 0);
+               var self = this; // super_fn calls the old function which was overwritten by
+               // this mixin.
+
+               function super_fn() {
+                 if (!oldFn) {
+                   return;
+                 }
+
+                 each$6(arguments, function (arg, i) {
+                   args[i] = arg;
+                 });
+                 return oldFn.apply(self, args);
+               } // Give mixing function access to super_fn by prefixing all mixin function
+               // arguments with super_fn.
+
+
+               var newFnArgs = [super_fn].concat(args);
+               return pluginFnProp.apply(self, newFnArgs);
+             };
+           },
+           _serialize: function _serialize(obj) {
+             return JSON.stringify(obj);
+           },
+           _deserialize: function _deserialize(strVal, defaultVal) {
+             if (!strVal) {
+               return defaultVal;
+             } // It is possible that a raw string value has been previously stored
+             // in a storage without using store.js, meaning it will be a raw
+             // string value instead of a JSON serialized string. By defaulting
+             // to the raw string value in case of a JSON parse error, we allow
+             // for past stored values to be forwards-compatible with store.js
+
+
+             var val = '';
+
+             try {
+               val = JSON.parse(strVal);
+             } catch (e) {
+               val = strVal;
+             }
+
+             return val !== undefined ? val : defaultVal;
+           },
+           _addStorage: function _addStorage(storage) {
+             if (this.enabled) {
+               return;
+             }
+
+             if (this._testStorage(storage)) {
+               this.storage = storage;
+               this.enabled = true;
+             }
+           },
+           _addPlugin: function _addPlugin(plugin) {
+             var self = this; // If the plugin is an array, then add all plugins in the array.
+             // This allows for a plugin to depend on other plugins.
+
+             if (isList(plugin)) {
+               each$6(plugin, function (plugin) {
+                 self._addPlugin(plugin);
+               });
+               return;
+             } // Keep track of all plugins we've seen so far, so that we
+             // don't add any of them twice.
+
+
+             var seenPlugin = pluck(this.plugins, function (seenPlugin) {
+               return plugin === seenPlugin;
+             });
+
+             if (seenPlugin) {
+               return;
+             }
+
+             this.plugins.push(plugin); // Check that the plugin is properly formed
+
+             if (!isFunction(plugin)) {
+               throw new Error('Plugins must be function values that return objects');
+             }
+
+             var pluginProperties = plugin.call(this);
+
+             if (!isObject(pluginProperties)) {
+               throw new Error('Plugins must return an object of function properties');
+             } // Add the plugin function properties to this store instance.
+
+
+             each$6(pluginProperties, function (pluginFnProp, propName) {
+               if (!isFunction(pluginFnProp)) {
+                 throw new Error('Bad plugin property: ' + propName + ' from plugin ' + plugin.name + '. Plugins should only return functions.');
+               }
+
+               self._assignPluginFnProp(pluginFnProp, propName);
+             });
+           },
+           // Put deprecated properties in the private API, so as to not expose it to accidential
+           // discovery through inspection of the store object.
+           // Deprecated: addStorage
+           addStorage: function addStorage(storage) {
+             _warn('store.addStorage(storage) is deprecated. Use createStore([storages])');
+
+             this._addStorage(storage);
+           }
+         };
+         var store = create(_privateStoreProps, storeAPI, {
+           plugins: []
+         });
+         store.raw = {};
+         each$6(store, function (prop, propName) {
+           if (isFunction(prop)) {
+             store.raw[propName] = bind(store, prop);
+           }
+         });
+         each$6(storages, function (storage) {
+           store._addStorage(storage);
+         });
+         each$6(plugins, function (plugin) {
+           store._addPlugin(plugin);
+         });
+         return store;
+       }
+
+       var util$4 = util$6;
+       var Global$4 = util$4.Global;
+       var localStorage_1 = {
+         name: 'localStorage',
+         read: read$5,
+         write: write$5,
+         each: each$5,
+         remove: remove$5,
+         clearAll: clearAll$5
+       };
+
+       function localStorage$1() {
+         return Global$4.localStorage;
+       }
+
+       function read$5(key) {
+         return localStorage$1().getItem(key);
+       }
+
+       function write$5(key, data) {
+         return localStorage$1().setItem(key, data);
+       }
+
+       function each$5(fn) {
+         for (var i = localStorage$1().length - 1; i >= 0; i--) {
+           var key = localStorage$1().key(i);
+           fn(read$5(key), key);
+         }
+       }
+
+       function remove$5(key) {
+         return localStorage$1().removeItem(key);
+       }
+
+       function clearAll$5() {
+         return localStorage$1().clear();
+       }
+
+       // versions 6 and 7, where no localStorage, etc
+       // is available.
+
+       var util$3 = util$6;
+       var Global$3 = util$3.Global;
+       var oldFFGlobalStorage = {
+         name: 'oldFF-globalStorage',
+         read: read$4,
+         write: write$4,
+         each: each$4,
+         remove: remove$4,
+         clearAll: clearAll$4
+       };
+       var globalStorage = Global$3.globalStorage;
+
+       function read$4(key) {
+         return globalStorage[key];
+       }
+
+       function write$4(key, data) {
+         globalStorage[key] = data;
+       }
+
+       function each$4(fn) {
+         for (var i = globalStorage.length - 1; i >= 0; i--) {
+           var key = globalStorage.key(i);
+           fn(globalStorage[key], key);
+         }
+       }
+
+       function remove$4(key) {
+         return globalStorage.removeItem(key);
+       }
+
+       function clearAll$4() {
+         each$4(function (key, _) {
+           delete globalStorage[key];
+         });
+       }
+
+       // versions 6 and 7, where no localStorage, sessionStorage, etc
+       // is available.
+
+       var util$2 = util$6;
+       var Global$2 = util$2.Global;
+       var oldIEUserDataStorage = {
+         name: 'oldIE-userDataStorage',
+         write: write$3,
+         read: read$3,
+         each: each$3,
+         remove: remove$3,
+         clearAll: clearAll$3
+       };
+       var storageName = 'storejs';
+       var doc$1 = Global$2.document;
+
+       var _withStorageEl = _makeIEStorageElFunction();
+
+       var disable = (Global$2.navigator ? Global$2.navigator.userAgent : '').match(/ (MSIE 8|MSIE 9|MSIE 10)\./); // MSIE 9.x, MSIE 10.x
+
+       function write$3(unfixedKey, data) {
+         if (disable) {
+           return;
+         }
+
+         var fixedKey = fixKey(unfixedKey);
+
+         _withStorageEl(function (storageEl) {
+           storageEl.setAttribute(fixedKey, data);
+           storageEl.save(storageName);
+         });
+       }
+
+       function read$3(unfixedKey) {
+         if (disable) {
+           return;
+         }
+
+         var fixedKey = fixKey(unfixedKey);
+         var res = null;
+
+         _withStorageEl(function (storageEl) {
+           res = storageEl.getAttribute(fixedKey);
+         });
+
+         return res;
+       }
+
+       function each$3(callback) {
+         _withStorageEl(function (storageEl) {
+           var attributes = storageEl.XMLDocument.documentElement.attributes;
+
+           for (var i = attributes.length - 1; i >= 0; i--) {
+             var attr = attributes[i];
+             callback(storageEl.getAttribute(attr.name), attr.name);
+           }
+         });
+       }
+
+       function remove$3(unfixedKey) {
+         var fixedKey = fixKey(unfixedKey);
+
+         _withStorageEl(function (storageEl) {
+           storageEl.removeAttribute(fixedKey);
+           storageEl.save(storageName);
+         });
+       }
+
+       function clearAll$3() {
+         _withStorageEl(function (storageEl) {
+           var attributes = storageEl.XMLDocument.documentElement.attributes;
+           storageEl.load(storageName);
+
+           for (var i = attributes.length - 1; i >= 0; i--) {
+             storageEl.removeAttribute(attributes[i].name);
+           }
+
+           storageEl.save(storageName);
+         });
+       } // Helpers
+       //////////
+       // In IE7, keys cannot start with a digit or contain certain chars.
+       // See https://github.com/marcuswestin/store.js/issues/40
+       // See https://github.com/marcuswestin/store.js/issues/83
+
+
+       var forbiddenCharsRegex = new RegExp("[!\"#$%&'()*+,/\\\\:;<=>?@[\\]^`{|}~]", "g");
+
+       function fixKey(key) {
+         return key.replace(/^\d/, '___$&').replace(forbiddenCharsRegex, '___');
+       }
+
+       function _makeIEStorageElFunction() {
+         if (!doc$1 || !doc$1.documentElement || !doc$1.documentElement.addBehavior) {
+           return null;
+         }
+
+         var scriptTag = 'script',
+             storageOwner,
+             storageContainer,
+             storageEl; // Since #userData storage applies only to specific paths, we need to
+         // somehow link our data to a specific path.  We choose /favicon.ico
+         // as a pretty safe option, since all browsers already make a request to
+         // this URL anyway and being a 404 will not hurt us here.  We wrap an
+         // iframe pointing to the favicon in an ActiveXObject(htmlfile) object
+         // (see: http://msdn.microsoft.com/en-us/library/aa752574(v=VS.85).aspx)
+         // since the iframe access rules appear to allow direct access and
+         // manipulation of the document element, even for a 404 page.  This
+         // document can be used instead of the current document (which would
+         // have been limited to the current path) to perform #userData storage.
+
+         try {
+           /* global ActiveXObject */
+           storageContainer = new ActiveXObject('htmlfile');
+           storageContainer.open();
+           storageContainer.write('<' + scriptTag + '>document.w=window</' + scriptTag + '><iframe src="/favicon.ico"></iframe>');
+           storageContainer.close();
+           storageOwner = storageContainer.w.frames[0].document;
+           storageEl = storageOwner.createElement('div');
+         } catch (e) {
+           // somehow ActiveXObject instantiation failed (perhaps some special
+           // security settings or otherwse), fall back to per-path storage
+           storageEl = doc$1.createElement('div');
+           storageOwner = doc$1.body;
+         }
+
+         return function (storeFunction) {
+           var args = [].slice.call(arguments, 0);
+           args.unshift(storageEl); // See http://msdn.microsoft.com/en-us/library/ms531081(v=VS.85).aspx
+           // and http://msdn.microsoft.com/en-us/library/ms531424(v=VS.85).aspx
+
+           storageOwner.appendChild(storageEl);
+           storageEl.addBehavior('#default#userData');
+           storageEl.load(storageName);
+           storeFunction.apply(this, args);
+           storageOwner.removeChild(storageEl);
+           return;
+         };
+       }
+
+       // doesn't work but cookies do. This implementation is adopted from
+       // https://developer.mozilla.org/en-US/docs/Web/API/Storage/LocalStorage
+
+       var util$1 = util$6;
+       var Global$1 = util$1.Global;
+       var trim = util$1.trim;
+       var cookieStorage = {
+         name: 'cookieStorage',
+         read: read$2,
+         write: write$2,
+         each: each$2,
+         remove: remove$2,
+         clearAll: clearAll$2
+       };
+       var doc = Global$1.document;
+
+       function read$2(key) {
+         if (!key || !_has(key)) {
+           return null;
+         }
+
+         var regexpStr = "(?:^|.*;\\s*)" + escape(key).replace(/[\-\.\+\*]/g, "\\$&") + "\\s*\\=\\s*((?:[^;](?!;))*[^;]?).*";
+         return unescape(doc.cookie.replace(new RegExp(regexpStr), "$1"));
+       }
+
+       function each$2(callback) {
+         var cookies = doc.cookie.split(/; ?/g);
+
+         for (var i = cookies.length - 1; i >= 0; i--) {
+           if (!trim(cookies[i])) {
+             continue;
+           }
+
+           var kvp = cookies[i].split('=');
+           var key = unescape(kvp[0]);
+           var val = unescape(kvp[1]);
+           callback(val, key);
+         }
+       }
+
+       function write$2(key, data) {
+         if (!key) {
+           return;
+         }
+
+         doc.cookie = escape(key) + "=" + escape(data) + "; expires=Tue, 19 Jan 2038 03:14:07 GMT; path=/";
+       }
+
+       function remove$2(key) {
+         if (!key || !_has(key)) {
+           return;
+         }
+
+         doc.cookie = escape(key) + "=; expires=Thu, 01 Jan 1970 00:00:00 GMT; path=/";
+       }
+
+       function clearAll$2() {
+         each$2(function (_, key) {
+           remove$2(key);
+         });
+       }
+
+       function _has(key) {
+         return new RegExp("(?:^|;\\s*)" + escape(key).replace(/[\-\.\+\*]/g, "\\$&") + "\\s*\\=").test(doc.cookie);
+       }
+
+       var util = util$6;
+       var Global = util.Global;
+       var sessionStorage_1 = {
+         name: 'sessionStorage',
+         read: read$1,
+         write: write$1,
+         each: each$1,
+         remove: remove$1,
+         clearAll: clearAll$1
+       };
+
+       function sessionStorage() {
+         return Global.sessionStorage;
+       }
+
+       function read$1(key) {
+         return sessionStorage().getItem(key);
+       }
+
+       function write$1(key, data) {
+         return sessionStorage().setItem(key, data);
+       }
+
+       function each$1(fn) {
+         for (var i = sessionStorage().length - 1; i >= 0; i--) {
+           var key = sessionStorage().key(i);
+           fn(read$1(key), key);
+         }
+       }
+
+       function remove$1(key) {
+         return sessionStorage().removeItem(key);
+       }
+
+       function clearAll$1() {
+         return sessionStorage().clear();
+       }
+
+       // is functions (meaning store.get(), store.set(), etc will all function).
+       // However, stored values will not persist when the browser navigates to
+       // a new page or reloads the current page.
+
+       var memoryStorage_1 = {
+         name: 'memoryStorage',
+         read: read,
+         write: write,
+         each: each,
+         remove: remove,
+         clearAll: clearAll
+       };
+       var memoryStorage = {};
+
+       function read(key) {
+         return memoryStorage[key];
+       }
+
+       function write(key, data) {
+         memoryStorage[key] = data;
+       }
+
+       function each(callback) {
+         for (var key in memoryStorage) {
+           if (memoryStorage.hasOwnProperty(key)) {
+             callback(memoryStorage[key], key);
+           }
+         }
+       }
+
+       function remove(key) {
+         delete memoryStorage[key];
+       }
+
+       function clearAll(key) {
+         memoryStorage = {};
+       }
+
+       var all = [// Listed in order of usage preference
+       localStorage_1, oldFFGlobalStorage, oldIEUserDataStorage, cookieStorage, sessionStorage_1, memoryStorage_1];
+
+       /* eslint-disable */
+       //  json2.js
+       //  2016-10-28
+       //  Public Domain.
+       //  NO WARRANTY EXPRESSED OR IMPLIED. USE AT YOUR OWN RISK.
+       //  See http://www.JSON.org/js.html
+       //  This code should be minified before deployment.
+       //  See http://javascript.crockford.com/jsmin.html
+       //  USE YOUR OWN COPY. IT IS EXTREMELY UNWISE TO LOAD CODE FROM SERVERS YOU DO
+       //  NOT CONTROL.
+       //  This file creates a global JSON object containing two methods: stringify
+       //  and parse. This file provides the ES5 JSON capability to ES3 systems.
+       //  If a project might run on IE8 or earlier, then this file should be included.
+       //  This file does nothing on ES5 systems.
+       //      JSON.stringify(value, replacer, space)
+       //          value       any JavaScript value, usually an object or array.
+       //          replacer    an optional parameter that determines how object
+       //                      values are stringified for objects. It can be a
+       //                      function or an array of strings.
+       //          space       an optional parameter that specifies the indentation
+       //                      of nested structures. If it is omitted, the text will
+       //                      be packed without extra whitespace. If it is a number,
+       //                      it will specify the number of spaces to indent at each
+       //                      level. If it is a string (such as "\t" or "&nbsp;"),
+       //                      it contains the characters used to indent at each level.
+       //          This method produces a JSON text from a JavaScript value.
+       //          When an object value is found, if the object contains a toJSON
+       //          method, its toJSON method will be called and the result will be
+       //          stringified. A toJSON method does not serialize: it returns the
+       //          value represented by the name/value pair that should be serialized,
+       //          or undefined if nothing should be serialized. The toJSON method
+       //          will be passed the key associated with the value, and this will be
+       //          bound to the value.
+       //          For example, this would serialize Dates as ISO strings.
+       //              Date.prototype.toJSON = function (key) {
+       //                  function f(n) {
+       //                      // Format integers to have at least two digits.
+       //                      return (n < 10)
+       //                          ? "0" + n
+       //                          : n;
+       //                  }
+       //                  return this.getUTCFullYear()   + "-" +
+       //                       f(this.getUTCMonth() + 1) + "-" +
+       //                       f(this.getUTCDate())      + "T" +
+       //                       f(this.getUTCHours())     + ":" +
+       //                       f(this.getUTCMinutes())   + ":" +
+       //                       f(this.getUTCSeconds())   + "Z";
+       //              };
+       //          You can provide an optional replacer method. It will be passed the
+       //          key and value of each member, with this bound to the containing
+       //          object. The value that is returned from your method will be
+       //          serialized. If your method returns undefined, then the member will
+       //          be excluded from the serialization.
+       //          If the replacer parameter is an array of strings, then it will be
+       //          used to select the members to be serialized. It filters the results
+       //          such that only members with keys listed in the replacer array are
+       //          stringified.
+       //          Values that do not have JSON representations, such as undefined or
+       //          functions, will not be serialized. Such values in objects will be
+       //          dropped; in arrays they will be replaced with null. You can use
+       //          a replacer function to replace those with JSON values.
+       //          JSON.stringify(undefined) returns undefined.
+       //          The optional space parameter produces a stringification of the
+       //          value that is filled with line breaks and indentation to make it
+       //          easier to read.
+       //          If the space parameter is a non-empty string, then that string will
+       //          be used for indentation. If the space parameter is a number, then
+       //          the indentation will be that many spaces.
+       //          Example:
+       //          text = JSON.stringify(["e", {pluribus: "unum"}]);
+       //          // text is '["e",{"pluribus":"unum"}]'
+       //          text = JSON.stringify(["e", {pluribus: "unum"}], null, "\t");
+       //          // text is '[\n\t"e",\n\t{\n\t\t"pluribus": "unum"\n\t}\n]'
+       //          text = JSON.stringify([new Date()], function (key, value) {
+       //              return this[key] instanceof Date
+       //                  ? "Date(" + this[key] + ")"
+       //                  : value;
+       //          });
+       //          // text is '["Date(---current time---)"]'
+       //      JSON.parse(text, reviver)
+       //          This method parses a JSON text to produce an object or array.
+       //          It can throw a SyntaxError exception.
+       //          The optional reviver parameter is a function that can filter and
+       //          transform the results. It receives each of the keys and values,
+       //          and its return value is used instead of the original value.
+       //          If it returns what it received, then the structure is not modified.
+       //          If it returns undefined then the member is deleted.
+       //          Example:
+       //          // Parse the text. Values that look like ISO date strings will
+       //          // be converted to Date objects.
+       //          myData = JSON.parse(text, function (key, value) {
+       //              var a;
+       //              if (typeof value === "string") {
+       //                  a =
+       //   /^(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2}(?:\.\d*)?)Z$/.exec(value);
+       //                  if (a) {
+       //                      return new Date(Date.UTC(+a[1], +a[2] - 1, +a[3], +a[4],
+       //                          +a[5], +a[6]));
+       //                  }
+       //              }
+       //              return value;
+       //          });
+       //          myData = JSON.parse('["Date(09/09/2001)"]', function (key, value) {
+       //              var d;
+       //              if (typeof value === "string" &&
+       //                      value.slice(0, 5) === "Date(" &&
+       //                      value.slice(-1) === ")") {
+       //                  d = new Date(value.slice(5, -1));
+       //                  if (d) {
+       //                      return d;
+       //                  }
+       //              }
+       //              return value;
+       //          });
+       //  This is a reference implementation. You are free to copy, modify, or
+       //  redistribute.
+
+       /*jslint
+           eval, for, this
+       */
+
+       /*property
+           JSON, apply, call, charCodeAt, getUTCDate, getUTCFullYear, getUTCHours,
+           getUTCMinutes, getUTCMonth, getUTCSeconds, hasOwnProperty, join,
+           lastIndex, length, parse, prototype, push, replace, slice, stringify,
+           test, toJSON, toString, valueOf
+       */
+       // Create a JSON object only if one does not already exist. We create the
+       // methods in a closure to avoid creating global variables.
+       if ((typeof JSON === "undefined" ? "undefined" : _typeof(JSON)) !== "object") {
+         JSON = {};
+       }
+
+       (function () {
+
+         var rx_one = /^[\],:{}\s]*$/;
+         var rx_two = /\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g;
+         var rx_three = /"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g;
+         var rx_four = /(?:^|:|,)(?:\s*\[)+/g;
+         var rx_escapable = /[\\"\u0000-\u001f\u007f-\u009f\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g;
+         var rx_dangerous = /[\u0000\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g;
+
+         function f(n) {
+           // Format integers to have at least two digits.
+           return n < 10 ? "0" + n : n;
+         }
 
-(function () {
-    d3.keybinding.modifierCodes = {
-        // Shift key, ⇧
-        '⇧': 16, shift: 16,
-        // CTRL key, on Mac: ⌃
-        '⌃': 17, ctrl: 17,
-        // ALT key, on Mac: ⌥ (Alt)
-        '⌥': 18, alt: 18, option: 18,
-        // META, on Mac: ⌘ (CMD), on Windows (Win), on Linux (Super)
-        '⌘': 91, meta: 91, cmd: 91, 'super': 91, win: 91
-    };
-
-    d3.keybinding.modifierProperties = {
-        16: 'shiftKey',
-        17: 'ctrlKey',
-        18: 'altKey',
-        91: 'metaKey'
-    };
-
-    d3.keybinding.keyCodes = {
-        // Backspace key, on Mac: ⌫ (Backspace)
-        '⌫': 8, backspace: 8,
-        // Tab Key, on Mac: ⇥ (Tab), on Windows ⇥⇥
-        '⇥': 9, '⇆': 9, tab: 9,
-        // Return key, ↩
-        '↩': 13, 'return': 13, enter: 13, '⌅': 13,
-        // Pause/Break key
-        'pause': 19, 'pause-break': 19,
-        // Caps Lock key, ⇪
-        '⇪': 20, caps: 20, 'caps-lock': 20,
-        // Escape key, on Mac: ⎋, on Windows: Esc
-        '⎋': 27, escape: 27, esc: 27,
-        // Space key
-        space: 32,
-        // Page-Up key, or pgup, on Mac: ↖
-        '↖': 33, pgup: 33, 'page-up': 33,
-        // Page-Down key, or pgdown, on Mac: ↘
-        '↘': 34, pgdown: 34, 'page-down': 34,
-        // END key, on Mac: ⇟
-        '⇟': 35, end: 35,
-        // HOME key, on Mac: ⇞
-        '⇞': 36, home: 36,
-        // Insert key, or ins
-        ins: 45, insert: 45,
-        // Delete key, on Mac: ⌦ (Delete)
-        '⌦': 46, del: 46, 'delete': 46,
-        // Left Arrow Key, or ←
-        '←': 37, left: 37, 'arrow-left': 37,
-        // Up Arrow Key, or ↑
-        '↑': 38, up: 38, 'arrow-up': 38,
-        // Right Arrow Key, or →
-        '→': 39, right: 39, 'arrow-right': 39,
-        // Up Arrow Key, or ↓
-        '↓': 40, down: 40, 'arrow-down': 40,
-        // odities, printing characters that come out wrong:
-        // Firefox Equals
-        'ffequals': 61,
-        // Num-Multiply, or *
-        '*': 106, star: 106, asterisk: 106, multiply: 106,
-        // Num-Plus or +
-        '+': 107, 'plus': 107,
-        // Num-Subtract, or -
-        '-': 109, subtract: 109,
-        // Firefox Minus
-        'ffplus': 171,
-        // Firefox Minus
-        'ffminus': 173,
-        // Semicolon
-        ';': 186, semicolon: 186,
-        // = or equals
-        '=': 187, 'equals': 187,
-        // Comma, or ,
-        ',': 188, comma: 188,
-        'dash': 189, //???
-        // Period, or ., or full-stop
-        '.': 190, period: 190, 'full-stop': 190,
-        // Slash, or /, or forward-slash
-        '/': 191, slash: 191, 'forward-slash': 191,
-        // Tick, or `, or back-quote
-        '`': 192, tick: 192, 'back-quote': 192,
-        // Open bracket, or [
-        '[': 219, 'open-bracket': 219,
-        // Back slash, or \
-        '\\': 220, 'back-slash': 220,
-        // Close backet, or ]
-        ']': 221, 'close-bracket': 221,
-        // Apostrophe, or Quote, or '
-        '\'': 222, quote: 222, apostrophe: 222
-    };
-
-    // NUMPAD 0-9
-    var i = 95, n = 0;
-    while (++i < 106) {
-        d3.keybinding.keyCodes['num-' + n] = i;
-        ++n;
-    }
-
-    // 0-9
-    i = 47; n = 0;
-    while (++i < 58) {
-        d3.keybinding.keyCodes[n] = i;
-        ++n;
-    }
-
-    // F1-F25
-    i = 111; n = 1;
-    while (++i < 136) {
-        d3.keybinding.keyCodes['f' + n] = i;
-        ++n;
-    }
-
-    // a-z
-    i = 64;
-    while (++i < 91) {
-        d3.keybinding.keyCodes[String.fromCharCode(i).toLowerCase()] = i;
-    }
-})();
-d3.selection.prototype.one = function (type, listener, capture) {
-    var target = this, typeOnce = type + ".once";
-    function one() {
-        target.on(typeOnce, null);
-        listener.apply(this, arguments);
-    }
-    target.on(typeOnce, one, capture);
-    return this;
-};
-d3.selection.prototype.dimensions = function (dimensions) {
-    if (!arguments.length) {
-        var node = this.node();
-        return [node.offsetWidth,
-                node.offsetHeight];
-    }
-    return this.attr({width: dimensions[0], height: dimensions[1]});
-};
-d3.selection.prototype.trigger = function (type) {
-    this.each(function() {
-        var evt = document.createEvent('HTMLEvents');
-        evt.initEvent(type, true, true);
-        this.dispatchEvent(evt);
-    });
-};
-d3.typeahead = function() {
-    var event = d3.dispatch('accept'),
-        autohighlight = false,
-        data;
-
-    var typeahead = function(selection) {
-        var container,
-            hidden,
-            idx = autohighlight ? 0 : -1;
-
-        function setup() {
-            var rect = selection.node().getBoundingClientRect();
-            container = d3.select(document.body)
-                .append('div').attr('class', 'typeahead')
-                .style({
-                    position: 'absolute',
-                    left: rect.left + 'px',
-                    top: rect.bottom + 'px'
-                });
-            selection
-                .on('keyup.typeahead', key);
-            hidden = false;
-        }
-
-        function hide() {
-            container.remove();
-            idx = autohighlight ? 0 : -1;
-            hidden = true;
-        }
-
-        function slowHide() {
-            if (autohighlight) {
-                if (container.select('a.selected').node()) {
-                    select(container.select('a.selected').datum());
-                    event.accept();
-                }
-            }
-            window.setTimeout(hide, 150);
-        }
-
-        selection
-            .on('focus.typeahead', setup)
-            .on('blur.typeahead', slowHide);
-
-        function key() {
-           var len = container.selectAll('a').data().length;
-           if (d3.event.keyCode === 40) {
-               idx = Math.min(idx + 1, len - 1);
-               return highlight();
-           } else if (d3.event.keyCode === 38) {
-               idx = Math.max(idx - 1, 0);
-               return highlight();
-           } else if (d3.event.keyCode === 13) {
-               if (container.select('a.selected').node()) {
-                   select(container.select('a.selected').datum());
-               }
-               event.accept();
-               hide();
-           } else {
-               update();
-           }
-        }
-
-        function highlight() {
-            container
-                .selectAll('a')
-                .classed('selected', function(d, i) { return i == idx; });
-        }
-
-        function update() {
-            if (hidden) setup();
-
-            data(selection, function(data) {
-                container.style('display', function() {
-                    return data.length ? 'block' : 'none';
-                });
-
-                var options = container
-                    .selectAll('a')
-                    .data(data, function(d) { return d.value; });
-
-                options.enter()
-                    .append('a')
-                    .text(function(d) { return d.value; })
-                    .attr('title', function(d) { return d.title; })
-                    .on('click', select);
-
-                options.exit().remove();
-
-                options
-                    .classed('selected', function(d, i) { return i == idx; });
-            });
-        }
-
-        function select(d) {
-            selection
-                .property('value', d.value)
-                .trigger('change');
-        }
-
-    };
-
-    typeahead.data = function(_) {
-        if (!arguments.length) return data;
-        data = _;
-        return typeahead;
-    };
-
-    typeahead.autohighlight = function(_) {
-        if (!arguments.length) return autohighlight;
-        autohighlight = _;
-        return typeahead;
-    };
-
-    return d3.rebind(typeahead, event, 'on');
-};
-// Tooltips and svg mask used to highlight certain features
-d3.curtain = function() {
-
-    var event = d3.dispatch(),
-        surface,
-        tooltip,
-        darkness;
-
-    function curtain(selection) {
-
-        surface = selection.append('svg')
-            .attr('id', 'curtain')
-            .style({
-                'z-index': 1000,
-                'pointer-events': 'none',
-                'position': 'absolute',
-                'top': 0,
-                'left': 0
-            });
-
-        darkness = surface.append('path')
-            .attr({
-                x: 0,
-                y: 0,
-                'class': 'curtain-darkness'
-            });
-
-        d3.select(window).on('resize.curtain', resize);
-
-        tooltip = selection.append('div')
-            .attr('class', 'tooltip')
-            .style('z-index', 1002);
-
-        tooltip.append('div').attr('class', 'tooltip-arrow');
-        tooltip.append('div').attr('class', 'tooltip-inner');
-
-        resize();
-
-        function resize() {
-            surface.attr({
-                width: window.innerWidth,
-                height: window.innerHeight
-            });
-            curtain.cut(darkness.datum());
-        }
-    }
-
-    curtain.reveal = function(box, text, tooltipclass, duration) {
-        if (typeof box === 'string') box = d3.select(box).node();
-        if (box.getBoundingClientRect) box = box.getBoundingClientRect();
-
-        curtain.cut(box, duration);
-
-        if (text) {
-            // pseudo markdown bold text hack
-            var parts = text.split('**');
-            var html = parts[0] ? '<span>' + parts[0] + '</span>' : '';
-            if (parts[1]) html += '<span class="bold">' + parts[1] + '</span>';
-
-            var dimensions = tooltip.classed('in', true)
-                .select('.tooltip-inner')
-                    .html(html)
-                    .dimensions();
-
-            var pos;
-
-            var w = window.innerWidth,
-                h = window.innerHeight;
-
-            if (box.top + box.height < Math.min(100, box.width + box.left)) {
-                side = 'bottom';
-                pos = [box.left + box.width / 2 - dimensions[0]/ 2, box.top + box.height];
-
-            } else if (box.left + box.width + 300 < window.innerWidth) {
-                side = 'right';
-                pos = [box.left + box.width, box.top + box.height / 2 - dimensions[1] / 2];
-
-            } else if (box.left > 300) {
-                side = 'left';
-                pos = [box.left - 200, box.top + box.height / 2 - dimensions[1] / 2];
-            } else {
-                side = 'bottom';
-                pos = [box.left, box.top + box.height];
-            }
-
-            pos = [
-                Math.min(Math.max(10, pos[0]), w - dimensions[0] - 10),
-                Math.min(Math.max(10, pos[1]), h - dimensions[1] - 10)
-            ];
-
-
-            if (duration !== 0 || !tooltip.classed(side)) tooltip.call(iD.ui.Toggle(true));
-
-            tooltip
-                .style('top', pos[1] + 'px')
-                .style('left', pos[0] + 'px')
-                .attr('class', 'curtain-tooltip tooltip in ' + side + ' ' + tooltipclass)
-                .select('.tooltip-inner')
-                    .html(html);
-
-        } else {
-            tooltip.call(iD.ui.Toggle(false));
-        }
-    };
-
-    curtain.cut = function(datum, duration) {
-        darkness.datum(datum);
-
-        (duration === 0 ? darkness : darkness.transition().duration(duration || 600))
-            .attr('d', function(d) {
-                var string = "M 0,0 L 0," + window.innerHeight + " L " +
-                    window.innerWidth + "," + window.innerHeight + "L" +
-                    window.innerWidth + ",0 Z";
-
-                if (!d) return string;
-                return string + 'M' +
-                    d.left + ',' + d.top + 'L' +
-                    d.left + ',' + (d.top + d.height) + 'L' +
-                    (d.left + d.width) + ',' + (d.top + d.height) + 'L' +
-                    (d.left + d.width) + ',' + (d.top) + 'Z';
-
-            });
-    };
-
-    curtain.remove = function() {
-        surface.remove();
-        tooltip.remove();
-    };
-
-    return d3.rebind(curtain, event, 'on');
-};
-// Like selection.property('value', ...), but avoids no-op value sets,
-// which can result in layout/repaint thrashing in some situations.
-d3.selection.prototype.value = function(value) {
-    function d3_selection_value(value) {
-      function valueNull() {
-        delete this.value;
-      }
-
-      function valueConstant() {
-        if (this.value !== value) this.value = value;
-      }
-
-      function valueFunction() {
-        var x = value.apply(this, arguments);
-        if (x == null) delete this.value;
-        else if (this.value !== x) this.value = x;
-      }
-
-      return value == null
-          ? valueNull : (typeof value === "function"
-          ? valueFunction : valueConstant);
-    }
-
-    if (!arguments.length) return this.property('value');
-    return this.each(d3_selection_value(value));
-};
-var JXON = new (function () {
-  var
-    sValueProp = "keyValue", sAttributesProp = "keyAttributes", sAttrPref = "@", /* you can customize these values */
-    aCache = [], rIsNull = /^\s*$/, rIsBool = /^(?:true|false)$/i;
-
-  function parseText (sValue) {
-    if (rIsNull.test(sValue)) { return null; }
-    if (rIsBool.test(sValue)) { return sValue.toLowerCase() === "true"; }
-    if (isFinite(sValue)) { return parseFloat(sValue); }
-    if (isFinite(Date.parse(sValue))) { return new Date(sValue); }
-    return sValue;
-  }
-
-  function EmptyTree () { }
-  EmptyTree.prototype.toString = function () { return "null"; };
-  EmptyTree.prototype.valueOf = function () { return null; };
-
-  function objectify (vValue) {
-    return vValue === null ? new EmptyTree() : vValue instanceof Object ? vValue : new vValue.constructor(vValue);
-  }
-
-  function createObjTree (oParentNode, nVerb, bFreeze, bNesteAttr) {
-    var
-      nLevelStart = aCache.length, bChildren = oParentNode.hasChildNodes(),
-      bAttributes = oParentNode.hasAttributes(), bHighVerb = Boolean(nVerb & 2);
-
-    var
-      sProp, vContent, nLength = 0, sCollectedTxt = "",
-      vResult = bHighVerb ? {} : /* put here the default value for empty nodes: */ true;
-
-    if (bChildren) {
-      for (var oNode, nItem = 0; nItem < oParentNode.childNodes.length; nItem++) {
-        oNode = oParentNode.childNodes.item(nItem);
-        if (oNode.nodeType === 4) { sCollectedTxt += oNode.nodeValue; } /* nodeType is "CDATASection" (4) */
-        else if (oNode.nodeType === 3) { sCollectedTxt += oNode.nodeValue.trim(); } /* nodeType is "Text" (3) */
-        else if (oNode.nodeType === 1 && !oNode.prefix) { aCache.push(oNode); } /* nodeType is "Element" (1) */
-      }
-    }
-
-    var nLevelEnd = aCache.length, vBuiltVal = parseText(sCollectedTxt);
-
-    if (!bHighVerb && (bChildren || bAttributes)) { vResult = nVerb === 0 ? objectify(vBuiltVal) : {}; }
-
-    for (var nElId = nLevelStart; nElId < nLevelEnd; nElId++) {
-      sProp = aCache[nElId].nodeName.toLowerCase();
-      vContent = createObjTree(aCache[nElId], nVerb, bFreeze, bNesteAttr);
-      if (vResult.hasOwnProperty(sProp)) {
-        if (vResult[sProp].constructor !== Array) { vResult[sProp] = [vResult[sProp]]; }
-        vResult[sProp].push(vContent);
-      } else {
-        vResult[sProp] = vContent;
-        nLength++;
-      }
-    }
-
-    if (bAttributes) {
-      var
-        nAttrLen = oParentNode.attributes.length,
-        sAPrefix = bNesteAttr ? "" : sAttrPref, oAttrParent = bNesteAttr ? {} : vResult;
-
-      for (var oAttrib, nAttrib = 0; nAttrib < nAttrLen; nLength++, nAttrib++) {
-        oAttrib = oParentNode.attributes.item(nAttrib);
-        oAttrParent[sAPrefix + oAttrib.name.toLowerCase()] = parseText(oAttrib.value.trim());
-      }
-
-      if (bNesteAttr) {
-        if (bFreeze) { Object.freeze(oAttrParent); }
-        vResult[sAttributesProp] = oAttrParent;
-        nLength -= nAttrLen - 1;
-      }
-    }
-
-    if (nVerb === 3 || (nVerb === 2 || nVerb === 1 && nLength > 0) && sCollectedTxt) {
-      vResult[sValueProp] = vBuiltVal;
-    } else if (!bHighVerb && nLength === 0 && sCollectedTxt) {
-      vResult = vBuiltVal;
-    }
-
-    if (bFreeze && (bHighVerb || nLength > 0)) { Object.freeze(vResult); }
-
-    aCache.length = nLevelStart;
-
-    return vResult;
-  }
-
-  function loadObjTree (oXMLDoc, oParentEl, oParentObj) {
-    var vValue, oChild;
-
-    if (oParentObj instanceof String || oParentObj instanceof Number || oParentObj instanceof Boolean) {
-      oParentEl.appendChild(oXMLDoc.createTextNode(oParentObj.toString())); /* verbosity level is 0 */
-    } else if (oParentObj.constructor === Date) {
-      oParentEl.appendChild(oXMLDoc.createTextNode(oParentObj.toGMTString()));    
-    }
-
-    for (var sName in oParentObj) {
-      vValue = oParentObj[sName];
-      if (isFinite(sName) || vValue instanceof Function) { continue; } /* verbosity level is 0 */
-      if (sName === sValueProp) {
-        if (vValue !== null && vValue !== true) { oParentEl.appendChild(oXMLDoc.createTextNode(vValue.constructor === Date ? vValue.toGMTString() : String(vValue))); }
-      } else if (sName === sAttributesProp) { /* verbosity level is 3 */
-        for (var sAttrib in vValue) { oParentEl.setAttribute(sAttrib, vValue[sAttrib]); }
-      } else if (sName.charAt(0) === sAttrPref) {
-        oParentEl.setAttribute(sName.slice(1), vValue);
-      } else if (vValue.constructor === Array) {
-        for (var nItem = 0; nItem < vValue.length; nItem++) {
-          oChild = oXMLDoc.createElement(sName);
-          loadObjTree(oXMLDoc, oChild, vValue[nItem]);
-          oParentEl.appendChild(oChild);
-        }
-      } else {
-        oChild = oXMLDoc.createElement(sName);
-        if (vValue instanceof Object) {
-          loadObjTree(oXMLDoc, oChild, vValue);
-        } else if (vValue !== null && vValue !== true) {
-          oChild.appendChild(oXMLDoc.createTextNode(vValue.toString()));
-        }
-        oParentEl.appendChild(oChild);
-     }
-   }
-  }
-
-  this.build = function (oXMLParent, nVerbosity /* optional */, bFreeze /* optional */, bNesteAttributes /* optional */) {
-    var _nVerb = arguments.length > 1 && typeof nVerbosity === "number" ? nVerbosity & 3 : /* put here the default verbosity level: */ 1;
-    return createObjTree(oXMLParent, _nVerb, bFreeze || false, arguments.length > 3 ? bNesteAttributes : _nVerb === 3);    
-  };
-
-  this.unbuild = function (oObjTree) {    
-    var oNewDoc = document.implementation.createDocument("", "", null);
-    loadObjTree(oNewDoc, oNewDoc, oObjTree);
-    return oNewDoc;
-  };
-
-  this.stringify = function (oObjTree) {
-    return (new XMLSerializer()).serializeToString(JXON.unbuild(oObjTree));
-  };
-})();
-// var myObject = JXON.build(doc);
-// we got our javascript object! try: alert(JSON.stringify(myObject));
-
-// var newDoc = JXON.unbuild(myObject);
-// we got our Document instance! try: alert((new XMLSerializer()).serializeToString(newDoc));
-/**
- * @license
- * Lo-Dash 2.3.0 (Custom Build) <http://lodash.com/>
- * Build: `lodash --debug --output js/lib/lodash.js include="any,assign,bind,clone,compact,contains,debounce,difference,each,every,extend,filter,find,first,forEach,groupBy,indexOf,intersection,isEmpty,isEqual,isFunction,keys,last,map,omit,pairs,pluck,reject,some,throttle,union,uniq,unique,values,without,flatten,value,chain,cloneDeep,merge,pick,reduce" exports="global,node"`
- * Copyright 2012-2013 The Dojo Foundation <http://dojofoundation.org/>
- * Based on Underscore.js 1.5.2 <http://underscorejs.org/LICENSE>
- * Copyright 2009-2013 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors
- * Available under MIT license <http://lodash.com/license>
- */
-;(function() {
-
-  /** Used as a safe reference for `undefined` in pre ES5 environments */
-  var undefined;
-
-  /** Used to pool arrays and objects used internally */
-  var arrayPool = [],
-      objectPool = [];
-
-  /** Used internally to indicate various things */
-  var indicatorObject = {};
-
-  /** Used to prefix keys to avoid issues with `__proto__` and properties on `Object.prototype` */
-  var keyPrefix = +new Date + '';
-
-  /** Used as the size when optimizations are enabled for large arrays */
-  var largeArraySize = 75;
-
-  /** Used as the max size of the `arrayPool` and `objectPool` */
-  var maxPoolSize = 40;
-
-  /** Used to match regexp flags from their coerced string values */
-  var reFlags = /\w*$/;
-
-  /** Used to detected named functions */
-  var reFuncName = /^\s*function[ \n\r\t]+\w/;
-
-  /** Used to detect functions containing a `this` reference */
-  var reThis = /\bthis\b/;
-
-  /** Used to fix the JScript [[DontEnum]] bug */
-  var shadowedProps = [
-    'constructor', 'hasOwnProperty', 'isPrototypeOf', 'propertyIsEnumerable',
-    'toLocaleString', 'toString', 'valueOf'
-  ];
-
-  /** `Object#toString` result shortcuts */
-  var argsClass = '[object Arguments]',
-      arrayClass = '[object Array]',
-      boolClass = '[object Boolean]',
-      dateClass = '[object Date]',
-      errorClass = '[object Error]',
-      funcClass = '[object Function]',
-      numberClass = '[object Number]',
-      objectClass = '[object Object]',
-      regexpClass = '[object RegExp]',
-      stringClass = '[object String]';
-
-  /** Used to identify object classifications that `_.clone` supports */
-  var cloneableClasses = {};
-  cloneableClasses[funcClass] = false;
-  cloneableClasses[argsClass] = cloneableClasses[arrayClass] =
-  cloneableClasses[boolClass] = cloneableClasses[dateClass] =
-  cloneableClasses[numberClass] = cloneableClasses[objectClass] =
-  cloneableClasses[regexpClass] = cloneableClasses[stringClass] = true;
-
-  /** Used as an internal `_.debounce` options object */
-  var debounceOptions = {
-    'leading': false,
-    'maxWait': 0,
-    'trailing': false
-  };
-
-  /** Used as the property descriptor for `__bindData__` */
-  var descriptor = {
-    'configurable': false,
-    'enumerable': false,
-    'value': null,
-    'writable': false
-  };
-
-  /** Used as the data object for `iteratorTemplate` */
-  var iteratorData = {
-    'args': '',
-    'array': null,
-    'bottom': '',
-    'firstArg': '',
-    'init': '',
-    'keys': null,
-    'loop': '',
-    'shadowedProps': null,
-    'support': null,
-    'top': '',
-    'useHas': false
-  };
-
-  /** Used to determine if values are of the language type Object */
-  var objectTypes = {
-    'boolean': false,
-    'function': true,
-    'object': true,
-    'number': false,
-    'string': false,
-    'undefined': false
-  };
-
-  /** Used as a reference to the global object */
-  var root = (objectTypes[typeof window] && window) || this;
-
-  /** Detect free variable `exports` */
-  var freeExports = objectTypes[typeof exports] && exports && !exports.nodeType && exports;
-
-  /** Detect free variable `module` */
-  var freeModule = objectTypes[typeof module] && module && !module.nodeType && module;
-
-  /** Detect the popular CommonJS extension `module.exports` */
-  var moduleExports = freeModule && freeModule.exports === freeExports && freeExports;
-
-  /** Detect free variable `global` from Node.js or Browserified code and use it as `root` */
-  var freeGlobal = objectTypes[typeof global] && global;
-  if (freeGlobal && (freeGlobal.global === freeGlobal || freeGlobal.window === freeGlobal)) {
-    root = freeGlobal;
-  }
-
-  /*--------------------------------------------------------------------------*/
-
-  /**
-   * The base implementation of `_.indexOf` without support for binary searches
-   * or `fromIndex` constraints.
-   *
-   * @private
-   * @param {Array} array The array to search.
-   * @param {*} value The value to search for.
-   * @param {number} [fromIndex=0] The index to search from.
-   * @returns {number} Returns the index of the matched value or `-1`.
-   */
-  function baseIndexOf(array, value, fromIndex) {
-    var index = (fromIndex || 0) - 1,
-        length = array ? array.length : 0;
-
-    while (++index < length) {
-      if (array[index] === value) {
-        return index;
-      }
-    }
-    return -1;
-  }
-
-  /**
-   * An implementation of `_.contains` for cache objects that mimics the return
-   * signature of `_.indexOf` by returning `0` if the value is found, else `-1`.
-   *
-   * @private
-   * @param {Object} cache The cache object to inspect.
-   * @param {*} value The value to search for.
-   * @returns {number} Returns `0` if `value` is found, else `-1`.
-   */
-  function cacheIndexOf(cache, value) {
-    var type = typeof value;
-    cache = cache.cache;
-
-    if (type == 'boolean' || value == null) {
-      return cache[value] ? 0 : -1;
-    }
-    if (type != 'number' && type != 'string') {
-      type = 'object';
-    }
-    var key = type == 'number' ? value : keyPrefix + value;
-    cache = (cache = cache[type]) && cache[key];
-
-    return type == 'object'
-      ? (cache && baseIndexOf(cache, value) > -1 ? 0 : -1)
-      : (cache ? 0 : -1);
-  }
-
-  /**
-   * Adds a given value to the corresponding cache object.
-   *
-   * @private
-   * @param {*} value The value to add to the cache.
-   */
-  function cachePush(value) {
-    var cache = this.cache,
-        type = typeof value;
-
-    if (type == 'boolean' || value == null) {
-      cache[value] = true;
-    } else {
-      if (type != 'number' && type != 'string') {
-        type = 'object';
-      }
-      var key = type == 'number' ? value : keyPrefix + value,
-          typeCache = cache[type] || (cache[type] = {});
-
-      if (type == 'object') {
-        (typeCache[key] || (typeCache[key] = [])).push(value);
-      } else {
-        typeCache[key] = true;
-      }
-    }
-  }
-
-  /**
-   * Creates a cache object to optimize linear searches of large arrays.
-   *
-   * @private
-   * @param {Array} [array=[]] The array to search.
-   * @returns {null|Object} Returns the cache object or `null` if caching should not be used.
-   */
-  function createCache(array) {
-    var index = -1,
-        length = array.length,
-        first = array[0],
-        mid = array[(length / 2) | 0],
-        last = array[length - 1];
-
-    if (first && typeof first == 'object' &&
-        mid && typeof mid == 'object' && last && typeof last == 'object') {
-      return false;
-    }
-    var cache = getObject();
-    cache['false'] = cache['null'] = cache['true'] = cache['undefined'] = false;
-
-    var result = getObject();
-    result.array = array;
-    result.cache = cache;
-    result.push = cachePush;
-
-    while (++index < length) {
-      result.push(array[index]);
-    }
-    return result;
-  }
-
-  /**
-   * Gets an array from the array pool or creates a new one if the pool is empty.
-   *
-   * @private
-   * @returns {Array} The array from the pool.
-   */
-  function getArray() {
-    return arrayPool.pop() || [];
-  }
-
-  /**
-   * Gets an object from the object pool or creates a new one if the pool is empty.
-   *
-   * @private
-   * @returns {Object} The object from the pool.
-   */
-  function getObject() {
-    return objectPool.pop() || {
-      'array': null,
-      'cache': null,
-      'false': false,
-      'null': false,
-      'number': null,
-      'object': null,
-      'push': null,
-      'string': null,
-      'true': false,
-      'undefined': false
-    };
-  }
-
-  /**
-   * Checks if `value` is a DOM node in IE < 9.
-   *
-   * @private
-   * @param {*} value The value to check.
-   * @returns {boolean} Returns `true` if the `value` is a DOM node, else `false`.
-   */
-  function isNode(value) {
-    // IE < 9 presents DOM nodes as `Object` objects except they have `toString`
-    // methods that are `typeof` "string" and still can coerce nodes to strings
-    return typeof value.toString != 'function' && typeof (value + '') == 'string';
-  }
-
-  /**
-   * Releases the given array back to the array pool.
-   *
-   * @private
-   * @param {Array} [array] The array to release.
-   */
-  function releaseArray(array) {
-    array.length = 0;
-    if (arrayPool.length < maxPoolSize) {
-      arrayPool.push(array);
-    }
-  }
-
-  /**
-   * Releases the given object back to the object pool.
-   *
-   * @private
-   * @param {Object} [object] The object to release.
-   */
-  function releaseObject(object) {
-    var cache = object.cache;
-    if (cache) {
-      releaseObject(cache);
-    }
-    object.array = object.cache =object.object = object.number = object.string =null;
-    if (objectPool.length < maxPoolSize) {
-      objectPool.push(object);
-    }
-  }
-
-  /**
-   * Slices the `collection` from the `start` index up to, but not including,
-   * the `end` index.
-   *
-   * Note: This function is used instead of `Array#slice` to support node lists
-   * in IE < 9 and to ensure dense arrays are returned.
-   *
-   * @private
-   * @param {Array|Object|string} collection The collection to slice.
-   * @param {number} start The start index.
-   * @param {number} end The end index.
-   * @returns {Array} Returns the new array.
-   */
-  function slice(array, start, end) {
-    start || (start = 0);
-    if (typeof end == 'undefined') {
-      end = array ? array.length : 0;
-    }
-    var index = -1,
-        length = end - start || 0,
-        result = Array(length < 0 ? 0 : length);
-
-    while (++index < length) {
-      result[index] = array[start + index];
-    }
-    return result;
-  }
-
-  /*--------------------------------------------------------------------------*/
-
-  /**
-   * Used for `Array` method references.
-   *
-   * Normally `Array.prototype` would suffice, however, using an array literal
-   * avoids issues in Narwhal.
-   */
-  var arrayRef = [];
-
-  /** Used for native method references */
-  var errorProto = Error.prototype,
-      objectProto = Object.prototype,
-      stringProto = String.prototype;
-
-  /** Used to resolve the internal [[Class]] of values */
-  var toString = objectProto.toString;
-
-  /** Used to detect if a method is native */
-  var reNative = RegExp('^' +
-    String(toString)
-      .replace(/[.*+?^${}()|[\]\\]/g, '\\$&')
-      .replace(/toString| for [^\]]+/g, '.*?') + '$'
-  );
-
-  /** Native method shortcuts */
-  var fnToString = Function.prototype.toString,
-      getPrototypeOf = reNative.test(getPrototypeOf = Object.getPrototypeOf) && getPrototypeOf,
-      hasOwnProperty = objectProto.hasOwnProperty,
-      now = reNative.test(now = Date.now) && now || function() { return +new Date; },
-      push = arrayRef.push,
-      propertyIsEnumerable = objectProto.propertyIsEnumerable;
-
-  /** Used to set meta data on functions */
-  var defineProperty = (function() {
-    // IE 8 only accepts DOM elements
-    try {
-      var o = {},
-          func = reNative.test(func = Object.defineProperty) && func,
-          result = func(o, o, o) && func;
-    } catch(e) { }
-    return result;
-  }());
-
-  /* Native method shortcuts for methods with the same name as other `lodash` methods */
-  var nativeCreate = reNative.test(nativeCreate = Object.create) && nativeCreate,
-      nativeIsArray = reNative.test(nativeIsArray = Array.isArray) && nativeIsArray,
-      nativeKeys = reNative.test(nativeKeys = Object.keys) && nativeKeys,
-      nativeMax = Math.max,
-      nativeMin = Math.min;
-
-  /** Used to lookup a built-in constructor by [[Class]] */
-  var ctorByClass = {};
-  ctorByClass[arrayClass] = Array;
-  ctorByClass[boolClass] = Boolean;
-  ctorByClass[dateClass] = Date;
-  ctorByClass[funcClass] = Function;
-  ctorByClass[objectClass] = Object;
-  ctorByClass[numberClass] = Number;
-  ctorByClass[regexpClass] = RegExp;
-  ctorByClass[stringClass] = String;
-
-  /** Used to avoid iterating non-enumerable properties in IE < 9 */
-  var nonEnumProps = {};
-  nonEnumProps[arrayClass] = nonEnumProps[dateClass] = nonEnumProps[numberClass] = { 'constructor': true, 'toLocaleString': true, 'toString': true, 'valueOf': true };
-  nonEnumProps[boolClass] = nonEnumProps[stringClass] = { 'constructor': true, 'toString': true, 'valueOf': true };
-  nonEnumProps[errorClass] = nonEnumProps[funcClass] = nonEnumProps[regexpClass] = { 'constructor': true, 'toString': true };
-  nonEnumProps[objectClass] = { 'constructor': true };
-
-  (function() {
-    var length = shadowedProps.length;
-    while (length--) {
-      var key = shadowedProps[length];
-      for (var className in nonEnumProps) {
-        if (hasOwnProperty.call(nonEnumProps, className) && !hasOwnProperty.call(nonEnumProps[className], key)) {
-          nonEnumProps[className][key] = false;
-        }
-      }
-    }
-  }());
-
-  /*--------------------------------------------------------------------------*/
-
-  /**
-   * Creates a `lodash` object which wraps the given value to enable intuitive
-   * method chaining.
-   *
-   * In addition to Lo-Dash methods, wrappers also have the following `Array` methods:
-   * `concat`, `join`, `pop`, `push`, `reverse`, `shift`, `slice`, `sort`, `splice`,
-   * and `unshift`
-   *
-   * Chaining is supported in custom builds as long as the `value` method is
-   * implicitly or explicitly included in the build.
-   *
-   * The chainable wrapper functions are:
-   * `after`, `assign`, `bind`, `bindAll`, `bindKey`, `chain`, `compact`,
-   * `compose`, `concat`, `countBy`, `create`, `createCallback`, `curry`,
-   * `debounce`, `defaults`, `defer`, `delay`, `difference`, `filter`, `flatten`,
-   * `forEach`, `forEachRight`, `forIn`, `forInRight`, `forOwn`, `forOwnRight`,
-   * `functions`, `groupBy`, `indexBy`, `initial`, `intersection`, `invert`,
-   * `invoke`, `keys`, `map`, `max`, `memoize`, `merge`, `min`, `object`, `omit`,
-   * `once`, `pairs`, `partial`, `partialRight`, `pick`, `pluck`, `pull`, `push`,
-   * `range`, `reject`, `remove`, `rest`, `reverse`, `shuffle`, `slice`, `sort`,
-   * `sortBy`, `splice`, `tap`, `throttle`, `times`, `toArray`, `transform`,
-   * `union`, `uniq`, `unshift`, `unzip`, `values`, `where`, `without`, `wrap`,
-   * and `zip`
-   *
-   * The non-chainable wrapper functions are:
-   * `clone`, `cloneDeep`, `contains`, `escape`, `every`, `find`, `findIndex`,
-   * `findKey`, `findLast`, `findLastIndex`, `findLastKey`, `has`, `identity`,
-   * `indexOf`, `isArguments`, `isArray`, `isBoolean`, `isDate`, `isElement`,
-   * `isEmpty`, `isEqual`, `isFinite`, `isFunction`, `isNaN`, `isNull`, `isNumber`,
-   * `isObject`, `isPlainObject`, `isRegExp`, `isString`, `isUndefined`, `join`,
-   * `lastIndexOf`, `mixin`, `noConflict`, `parseInt`, `pop`, `random`, `reduce`,
-   * `reduceRight`, `result`, `shift`, `size`, `some`, `sortedIndex`, `runInContext`,
-   * `template`, `unescape`, `uniqueId`, and `value`
-   *
-   * The wrapper functions `first` and `last` return wrapped values when `n` is
-   * provided, otherwise they return unwrapped values.
-   *
-   * Explicit chaining can be enabled by using the `_.chain` method.
-   *
-   * @name _
-   * @constructor
-   * @category Chaining
-   * @param {*} value The value to wrap in a `lodash` instance.
-   * @returns {Object} Returns a `lodash` instance.
-   * @example
-   *
-   * var wrapped = _([1, 2, 3]);
-   *
-   * // returns an unwrapped value
-   * wrapped.reduce(function(sum, num) {
-   *   return sum + num;
-   * });
-   * // => 6
-   *
-   * // returns a wrapped value
-   * var squares = wrapped.map(function(num) {
-   *   return num * num;
-   * });
-   *
-   * _.isArray(squares);
-   * // => false
-   *
-   * _.isArray(squares.value());
-   * // => true
-   */
-  function lodash(value) {
-    // don't wrap if already wrapped, even if wrapped by a different `lodash` constructor
-    return (value && typeof value == 'object' && !isArray(value) && hasOwnProperty.call(value, '__wrapped__'))
-     ? value
-     : new lodashWrapper(value);
-  }
-
-  /**
-   * A fast path for creating `lodash` wrapper objects.
-   *
-   * @private
-   * @param {*} value The value to wrap in a `lodash` instance.
-   * @param {boolean} chainAll A flag to enable chaining for all methods
-   * @returns {Object} Returns a `lodash` instance.
-   */
-  function lodashWrapper(value, chainAll) {
-    this.__chain__ = !!chainAll;
-    this.__wrapped__ = value;
-  }
-  // ensure `new lodashWrapper` is an instance of `lodash`
-  lodashWrapper.prototype = lodash.prototype;
-
-  /**
-   * An object used to flag environments features.
-   *
-   * @static
-   * @memberOf _
-   * @type Object
-   */
-  var support = lodash.support = {};
-
-  (function() {
-    var ctor = function() { this.x = 1; },
-        object = { '0': 1, 'length': 1 },
-        props = [];
-
-    ctor.prototype = { 'valueOf': 1, 'y': 1 };
-    for (var key in new ctor) { props.push(key); }
-    for (key in arguments) { }
-
-    /**
-     * Detect if an `arguments` object's [[Class]] is resolvable (all but Firefox < 4, IE < 9).
-     *
-     * @memberOf _.support
-     * @type boolean
-     */
-    support.argsClass = toString.call(arguments) == argsClass;
-
-    /**
-     * Detect if `arguments` objects are `Object` objects (all but Narwhal and Opera < 10.5).
-     *
-     * @memberOf _.support
-     * @type boolean
-     */
-    support.argsObject = arguments.constructor == Object && !(arguments instanceof Array);
-
-    /**
-     * Detect if `name` or `message` properties of `Error.prototype` are
-     * enumerable by default. (IE < 9, Safari < 5.1)
-     *
-     * @memberOf _.support
-     * @type boolean
-     */
-    support.enumErrorProps = propertyIsEnumerable.call(errorProto, 'message') || propertyIsEnumerable.call(errorProto, 'name');
-
-    /**
-     * Detect if `prototype` properties are enumerable by default.
-     *
-     * Firefox < 3.6, Opera > 9.50 - Opera < 11.60, and Safari < 5.1
-     * (if the prototype or a property on the prototype has been set)
-     * incorrectly sets a function's `prototype` property [[Enumerable]]
-     * value to `true`.
-     *
-     * @memberOf _.support
-     * @type boolean
-     */
-    support.enumPrototypes = propertyIsEnumerable.call(ctor, 'prototype');
-
-    /**
-     * Detect if functions can be decompiled by `Function#toString`
-     * (all but PS3 and older Opera mobile browsers & avoided in Windows 8 apps).
-     *
-     * @memberOf _.support
-     * @type boolean
-     */
-    support.funcDecomp = !reNative.test(root.WinRTError) && reThis.test(function() { return this; });
-
-    /**
-     * Detect if `Function#name` is supported (all but IE).
-     *
-     * @memberOf _.support
-     * @type boolean
-     */
-    support.funcNames = typeof Function.name == 'string';
-
-    /**
-     * Detect if `arguments` object indexes are non-enumerable
-     * (Firefox < 4, IE < 9, PhantomJS, Safari < 5.1).
-     *
-     * @memberOf _.support
-     * @type boolean
-     */
-    support.nonEnumArgs = key != 0;
-
-    /**
-     * Detect if properties shadowing those on `Object.prototype` are non-enumerable.
-     *
-     * In IE < 9 an objects own properties, shadowing non-enumerable ones, are
-     * made non-enumerable as well (a.k.a the JScript [[DontEnum]] bug).
-     *
-     * @memberOf _.support
-     * @type boolean
-     */
-    support.nonEnumShadows = !/valueOf/.test(props);
-
-    /**
-     * Detect if own properties are iterated after inherited properties (all but IE < 9).
-     *
-     * @memberOf _.support
-     * @type boolean
-     */
-    support.ownLast = props[0] != 'x';
-
-    /**
-     * Detect if `Array#shift` and `Array#splice` augment array-like objects correctly.
-     *
-     * Firefox < 10, IE compatibility mode, and IE < 9 have buggy Array `shift()`
-     * and `splice()` functions that fail to remove the last element, `value[0]`,
-     * of array-like objects even though the `length` property is set to `0`.
-     * The `shift()` method is buggy in IE 8 compatibility mode, while `splice()`
-     * is buggy regardless of mode in IE < 9 and buggy in compatibility mode in IE 9.
-     *
-     * @memberOf _.support
-     * @type boolean
-     */
-    support.spliceObjects = (arrayRef.splice.call(object, 0, 1), !object[0]);
-
-    /**
-     * Detect lack of support for accessing string characters by index.
-     *
-     * IE < 8 can't access characters by index and IE 8 can only access
-     * characters by index on string literals.
-     *
-     * @memberOf _.support
-     * @type boolean
-     */
-    support.unindexedChars = ('x'[0] + Object('x')[0]) != 'xx';
-
-    /**
-     * Detect if a DOM node's [[Class]] is resolvable (all but IE < 9)
-     * and that the JS engine errors when attempting to coerce an object to
-     * a string without a `toString` function.
-     *
-     * @memberOf _.support
-     * @type boolean
-     */
-    try {
-      support.nodeClass = !(toString.call(document) == objectClass && !({ 'toString': 0 } + ''));
-    } catch(e) {
-      support.nodeClass = true;
-    }
-  }(1));
-
-  /*--------------------------------------------------------------------------*/
-
-  /**
-   * The template used to create iterator functions.
-   *
-   * @private
-   * @param {Object} data The data object used to populate the text.
-   * @returns {string} Returns the interpolated text.
-   */
-  var iteratorTemplate = function(obj) {
-
-    var __p = 'var index, iterable = ' +
-    (obj.firstArg) +
-    ', result = ' +
-    (obj.init) +
-    ';\nif (!iterable) return result;\n' +
-    (obj.top) +
-    ';';
-     if (obj.array) {
-    __p += '\nvar length = iterable.length; index = -1;\nif (' +
-    (obj.array) +
-    ') {  ';
-     if (support.unindexedChars) {
-    __p += '\n  if (isString(iterable)) {\n    iterable = iterable.split(\'\')\n  }  ';
-     }
-    __p += '\n  while (++index < length) {\n    ' +
-    (obj.loop) +
-    ';\n  }\n}\nelse {  ';
-     } else if (support.nonEnumArgs) {
-    __p += '\n  var length = iterable.length; index = -1;\n  if (length && isArguments(iterable)) {\n    while (++index < length) {\n      index += \'\';\n      ' +
-    (obj.loop) +
-    ';\n    }\n  } else {  ';
-     }
-
-     if (support.enumPrototypes) {
-    __p += '\n  var skipProto = typeof iterable == \'function\';\n  ';
-     }
-
-     if (support.enumErrorProps) {
-    __p += '\n  var skipErrorProps = iterable === errorProto || iterable instanceof Error;\n  ';
-     }
-
-        var conditions = [];    if (support.enumPrototypes) { conditions.push('!(skipProto && index == "prototype")'); }    if (support.enumErrorProps)  { conditions.push('!(skipErrorProps && (index == "message" || index == "name"))'); }
-
-     if (obj.useHas && obj.keys) {
-    __p += '\n  var ownIndex = -1,\n      ownProps = objectTypes[typeof iterable] && keys(iterable),\n      length = ownProps ? ownProps.length : 0;\n\n  while (++ownIndex < length) {\n    index = ownProps[ownIndex];\n';
-        if (conditions.length) {
-    __p += '    if (' +
-    (conditions.join(' && ')) +
-    ') {\n  ';
-     }
-    __p +=
-    (obj.loop) +
-    ';    ';
-     if (conditions.length) {
-    __p += '\n    }';
-     }
-    __p += '\n  }  ';
-     } else {
-    __p += '\n  for (index in iterable) {\n';
-        if (obj.useHas) { conditions.push("hasOwnProperty.call(iterable, index)"); }    if (conditions.length) {
-    __p += '    if (' +
-    (conditions.join(' && ')) +
-    ') {\n  ';
-     }
-    __p +=
-    (obj.loop) +
-    ';    ';
-     if (conditions.length) {
-    __p += '\n    }';
-     }
-    __p += '\n  }    ';
-     if (support.nonEnumShadows) {
-    __p += '\n\n  if (iterable !== objectProto) {\n    var ctor = iterable.constructor,\n        isProto = iterable === (ctor && ctor.prototype),\n        className = iterable === stringProto ? stringClass : iterable === errorProto ? errorClass : toString.call(iterable),\n        nonEnum = nonEnumProps[className];\n      ';
-     for (k = 0; k < 7; k++) {
-    __p += '\n    index = \'' +
-    (obj.shadowedProps[k]) +
-    '\';\n    if ((!(isProto && nonEnum[index]) && hasOwnProperty.call(iterable, index))';
-            if (!obj.useHas) {
-    __p += ' || (!nonEnum[index] && iterable[index] !== objectProto[index])';
-     }
-    __p += ') {\n      ' +
-    (obj.loop) +
-    ';\n    }      ';
-     }
-    __p += '\n  }    ';
-     }
-
-     }
-
-     if (obj.array || support.nonEnumArgs) {
-    __p += '\n}';
-     }
-    __p +=
-    (obj.bottom) +
-    ';\nreturn result';
-
-    return __p
-  };
-
-  /*--------------------------------------------------------------------------*/
-
-  /**
-   * The base implementation of `_.bind` that creates the bound function and
-   * sets its meta data.
-   *
-   * @private
-   * @param {Array} bindData The bind data array.
-   * @returns {Function} Returns the new bound function.
-   */
-  function baseBind(bindData) {
-    var func = bindData[0],
-        partialArgs = bindData[2],
-        thisArg = bindData[4];
-
-    function bound() {
-      // `Function#bind` spec
-      // http://es5.github.io/#x15.3.4.5
-      if (partialArgs) {
-        var args = partialArgs.slice();
-        push.apply(args, arguments);
-      }
-      // mimic the constructor's `return` behavior
-      // http://es5.github.io/#x13.2.2
-      if (this instanceof bound) {
-        // ensure `new bound` is an instance of `func`
-        var thisBinding = baseCreate(func.prototype),
-            result = func.apply(thisBinding, args || arguments);
-        return isObject(result) ? result : thisBinding;
-      }
-      return func.apply(thisArg, args || arguments);
-    }
-    setBindData(bound, bindData);
-    return bound;
-  }
-
-  /**
-   * The base implementation of `_.clone` without argument juggling or support
-   * for `thisArg` binding.
-   *
-   * @private
-   * @param {*} value The value to clone.
-   * @param {boolean} [isDeep=false] Specify a deep clone.
-   * @param {Function} [callback] The function to customize cloning values.
-   * @param {Array} [stackA=[]] Tracks traversed source objects.
-   * @param {Array} [stackB=[]] Associates clones with source counterparts.
-   * @returns {*} Returns the cloned value.
-   */
-  function baseClone(value, isDeep, callback, stackA, stackB) {
-    if (callback) {
-      var result = callback(value);
-      if (typeof result != 'undefined') {
-        return result;
-      }
-    }
-    // inspect [[Class]]
-    var isObj = isObject(value);
-    if (isObj) {
-      var className = toString.call(value);
-      if (!cloneableClasses[className] || (!support.nodeClass && isNode(value))) {
-        return value;
-      }
-      var ctor = ctorByClass[className];
-      switch (className) {
-        case boolClass:
-        case dateClass:
-          return new ctor(+value);
-
-        case numberClass:
-        case stringClass:
-          return new ctor(value);
-
-        case regexpClass:
-          result = ctor(value.source, reFlags.exec(value));
-          result.lastIndex = value.lastIndex;
-          return result;
-      }
-    } else {
-      return value;
-    }
-    var isArr = isArray(value);
-    if (isDeep) {
-      // check for circular references and return corresponding clone
-      var initedStack = !stackA;
-      stackA || (stackA = getArray());
-      stackB || (stackB = getArray());
-
-      var length = stackA.length;
-      while (length--) {
-        if (stackA[length] == value) {
-          return stackB[length];
-        }
-      }
-      result = isArr ? ctor(value.length) : {};
-    }
-    else {
-      result = isArr ? slice(value) : assign({}, value);
-    }
-    // add array properties assigned by `RegExp#exec`
-    if (isArr) {
-      if (hasOwnProperty.call(value, 'index')) {
-        result.index = value.index;
-      }
-      if (hasOwnProperty.call(value, 'input')) {
-        result.input = value.input;
-      }
-    }
-    // exit for shallow clone
-    if (!isDeep) {
-      return result;
-    }
-    // add the source value to the stack of traversed objects
-    // and associate it with its clone
-    stackA.push(value);
-    stackB.push(result);
-
-    // recursively populate clone (susceptible to call stack limits)
-    (isArr ? baseEach : forOwn)(value, function(objValue, key) {
-      result[key] = baseClone(objValue, isDeep, callback, stackA, stackB);
-    });
-
-    if (initedStack) {
-      releaseArray(stackA);
-      releaseArray(stackB);
-    }
-    return result;
-  }
-
-  /**
-   * The base implementation of `_.create` without support for assigning
-   * properties to the created object.
-   *
-   * @private
-   * @param {Object} prototype The object to inherit from.
-   * @returns {Object} Returns the new object.
-   */
-  function baseCreate(prototype, properties) {
-    return isObject(prototype) ? nativeCreate(prototype) : {};
-  }
-  // fallback for browsers without `Object.create`
-  if (!nativeCreate) {
-    baseCreate = (function() {
-      function Object() {}
-      return function(prototype) {
-        if (isObject(prototype)) {
-          Object.prototype = prototype;
-          var result = new Object;
-          Object.prototype = null;
-        }
-        return result || root.Object();
-      };
-    }());
-  }
-
-  /**
-   * The base implementation of `_.createCallback` without support for creating
-   * "_.pluck" or "_.where" style callbacks.
-   *
-   * @private
-   * @param {*} [func=identity] The value to convert to a callback.
-   * @param {*} [thisArg] The `this` binding of the created callback.
-   * @param {number} [argCount] The number of arguments the callback accepts.
-   * @returns {Function} Returns a callback function.
-   */
-  function baseCreateCallback(func, thisArg, argCount) {
-    if (typeof func != 'function') {
-      return identity;
-    }
-    // exit early for no `thisArg` or already bound by `Function#bind`
-    if (typeof thisArg == 'undefined' || !('prototype' in func)) {
-      return func;
-    }
-    var bindData = func.__bindData__;
-    if (typeof bindData == 'undefined') {
-      if (support.funcNames) {
-        bindData = !func.name;
-      }
-      bindData = bindData || !support.funcDecomp;
-      if (!bindData) {
-        var source = fnToString.call(func);
-        if (!support.funcNames) {
-          bindData = !reFuncName.test(source);
-        }
-        if (!bindData) {
-          // checks if `func` references the `this` keyword and stores the result
-          bindData = reThis.test(source);
-          setBindData(func, bindData);
-        }
-      }
-    }
-    // exit early if there are no `this` references or `func` is bound
-    if (bindData === false || (bindData !== true && bindData[1] & 1)) {
-      return func;
-    }
-    switch (argCount) {
-      case 1: return function(value) {
-        return func.call(thisArg, value);
-      };
-      case 2: return function(a, b) {
-        return func.call(thisArg, a, b);
-      };
-      case 3: return function(value, index, collection) {
-        return func.call(thisArg, value, index, collection);
-      };
-      case 4: return function(accumulator, value, index, collection) {
-        return func.call(thisArg, accumulator, value, index, collection);
-      };
-    }
-    return bind(func, thisArg);
-  }
-
-  /**
-   * The base implementation of `createWrapper` that creates the wrapper and
-   * sets its meta data.
-   *
-   * @private
-   * @param {Array} bindData The bind data array.
-   * @returns {Function} Returns the new function.
-   */
-  function baseCreateWrapper(bindData) {
-    var func = bindData[0],
-        bitmask = bindData[1],
-        partialArgs = bindData[2],
-        partialRightArgs = bindData[3],
-        thisArg = bindData[4],
-        arity = bindData[5];
-
-    var isBind = bitmask & 1,
-        isBindKey = bitmask & 2,
-        isCurry = bitmask & 4,
-        isCurryBound = bitmask & 8,
-        key = func;
-
-    function bound() {
-      var thisBinding = isBind ? thisArg : this;
-      if (partialArgs) {
-        var args = partialArgs.slice();
-        push.apply(args, arguments);
-      }
-      if (partialRightArgs || isCurry) {
-        args || (args = slice(arguments));
-        if (partialRightArgs) {
-          push.apply(args, partialRightArgs);
-        }
-        if (isCurry && args.length < arity) {
-          bitmask |= 16 & ~32;
-          return baseCreateWrapper([func, (isCurryBound ? bitmask : bitmask & ~3), args, null, thisArg, arity]);
-        }
-      }
-      args || (args = arguments);
-      if (isBindKey) {
-        func = thisBinding[key];
-      }
-      if (this instanceof bound) {
-        thisBinding = baseCreate(func.prototype);
-        var result = func.apply(thisBinding, args);
-        return isObject(result) ? result : thisBinding;
-      }
-      return func.apply(thisBinding, args);
-    }
-    setBindData(bound, bindData);
-    return bound;
-  }
-
-  /**
-   * The base implementation of `_.difference` that accepts a single array
-   * of values to exclude.
-   *
-   * @private
-   * @param {Array} array The array to process.
-   * @param {Array} [values] The array of values to exclude.
-   * @returns {Array} Returns a new array of filtered values.
-   */
-  function baseDifference(array, values) {
-    var index = -1,
-        indexOf = getIndexOf(),
-        length = array ? array.length : 0,
-        isLarge = length >= largeArraySize && indexOf === baseIndexOf,
-        result = [];
-
-    if (isLarge) {
-      var cache = createCache(values);
-      if (cache) {
-        indexOf = cacheIndexOf;
-        values = cache;
-      } else {
-        isLarge = false;
-      }
-    }
-    while (++index < length) {
-      var value = array[index];
-      if (indexOf(values, value) < 0) {
-        result.push(value);
-      }
-    }
-    if (isLarge) {
-      releaseObject(values);
-    }
-    return result;
-  }
-
-  /**
-   * The base implementation of `_.flatten` without support for callback
-   * shorthands or `thisArg` binding.
-   *
-   * @private
-   * @param {Array} array The array to flatten.
-   * @param {boolean} [isShallow=false] A flag to restrict flattening to a single level.
-   * @param {boolean} [isStrict=false] A flag to restrict flattening to arrays and `arguments` objects.
-   * @param {number} [fromIndex=0] The index to start from.
-   * @returns {Array} Returns a new flattened array.
-   */
-  function baseFlatten(array, isShallow, isStrict, fromIndex) {
-    var index = (fromIndex || 0) - 1,
-        length = array ? array.length : 0,
-        result = [];
-
-    while (++index < length) {
-      var value = array[index];
-
-      if (value && typeof value == 'object' && typeof value.length == 'number'
-          && (isArray(value) || isArguments(value))) {
-        // recursively flatten arrays (susceptible to call stack limits)
-        if (!isShallow) {
-          value = baseFlatten(value, isShallow, isStrict);
-        }
-        var valIndex = -1,
-            valLength = value.length,
-            resIndex = result.length;
-
-        result.length += valLength;
-        while (++valIndex < valLength) {
-          result[resIndex++] = value[valIndex];
-        }
-      } else if (!isStrict) {
-        result.push(value);
-      }
-    }
-    return result;
-  }
-
-  /**
-   * The base implementation of `_.isEqual`, without support for `thisArg` binding,
-   * that allows partial "_.where" style comparisons.
-   *
-   * @private
-   * @param {*} a The value to compare.
-   * @param {*} b The other value to compare.
-   * @param {Function} [callback] The function to customize comparing values.
-   * @param {Function} [isWhere=false] A flag to indicate performing partial comparisons.
-   * @param {Array} [stackA=[]] Tracks traversed `a` objects.
-   * @param {Array} [stackB=[]] Tracks traversed `b` objects.
-   * @returns {boolean} Returns `true` if the values are equivalent, else `false`.
-   */
-  function baseIsEqual(a, b, callback, isWhere, stackA, stackB) {
-    // used to indicate that when comparing objects, `a` has at least the properties of `b`
-    if (callback) {
-      var result = callback(a, b);
-      if (typeof result != 'undefined') {
-        return !!result;
-      }
-    }
-    // exit early for identical values
-    if (a === b) {
-      // treat `+0` vs. `-0` as not equal
-      return a !== 0 || (1 / a == 1 / b);
-    }
-    var type = typeof a,
-        otherType = typeof b;
-
-    // exit early for unlike primitive values
-    if (a === a &&
-        !(a && objectTypes[type]) &&
-        !(b && objectTypes[otherType])) {
-      return false;
-    }
-    // exit early for `null` and `undefined` avoiding ES3's Function#call behavior
-    // http://es5.github.io/#x15.3.4.4
-    if (a == null || b == null) {
-      return a === b;
-    }
-    // compare [[Class]] names
-    var className = toString.call(a),
-        otherClass = toString.call(b);
-
-    if (className == argsClass) {
-      className = objectClass;
-    }
-    if (otherClass == argsClass) {
-      otherClass = objectClass;
-    }
-    if (className != otherClass) {
-      return false;
-    }
-    switch (className) {
-      case boolClass:
-      case dateClass:
-        // coerce dates and booleans to numbers, dates to milliseconds and booleans
-        // to `1` or `0` treating invalid dates coerced to `NaN` as not equal
-        return +a == +b;
-
-      case numberClass:
-        // treat `NaN` vs. `NaN` as equal
-        return (a != +a)
-          ? b != +b
-          // but treat `+0` vs. `-0` as not equal
-          : (a == 0 ? (1 / a == 1 / b) : a == +b);
-
-      case regexpClass:
-      case stringClass:
-        // coerce regexes to strings (http://es5.github.io/#x15.10.6.4)
-        // treat string primitives and their corresponding object instances as equal
-        return a == String(b);
-    }
-    var isArr = className == arrayClass;
-    if (!isArr) {
-      // unwrap any `lodash` wrapped values
-      var aWrapped = hasOwnProperty.call(a, '__wrapped__'),
-          bWrapped = hasOwnProperty.call(b, '__wrapped__');
-
-      if (aWrapped || bWrapped) {
-        return baseIsEqual(aWrapped ? a.__wrapped__ : a, bWrapped ? b.__wrapped__ : b, callback, isWhere, stackA, stackB);
-      }
-      // exit for functions and DOM nodes
-      if (className != objectClass || (!support.nodeClass && (isNode(a) || isNode(b)))) {
-        return false;
-      }
-      // in older versions of Opera, `arguments` objects have `Array` constructors
-      var ctorA = !support.argsObject && isArguments(a) ? Object : a.constructor,
-          ctorB = !support.argsObject && isArguments(b) ? Object : b.constructor;
-
-      // non `Object` object instances with different constructors are not equal
-      if (ctorA != ctorB &&
-            !(isFunction(ctorA) && ctorA instanceof ctorA && isFunction(ctorB) && ctorB instanceof ctorB) &&
-            ('constructor' in a && 'constructor' in b)
-          ) {
-        return false;
-      }
-    }
-    // assume cyclic structures are equal
-    // the algorithm for detecting cyclic structures is adapted from ES 5.1
-    // section 15.12.3, abstract operation `JO` (http://es5.github.io/#x15.12.3)
-    var initedStack = !stackA;
-    stackA || (stackA = getArray());
-    stackB || (stackB = getArray());
-
-    var length = stackA.length;
-    while (length--) {
-      if (stackA[length] == a) {
-        return stackB[length] == b;
-      }
-    }
-    var size = 0;
-    result = true;
-
-    // add `a` and `b` to the stack of traversed objects
-    stackA.push(a);
-    stackB.push(b);
-
-    // recursively compare objects and arrays (susceptible to call stack limits)
-    if (isArr) {
-      length = a.length;
-      size = b.length;
-
-      // compare lengths to determine if a deep comparison is necessary
-      result = size == a.length;
-      if (!result && !isWhere) {
-        return result;
-      }
-      // deep compare the contents, ignoring non-numeric properties
-      while (size--) {
-        var index = length,
-            value = b[size];
-
-        if (isWhere) {
-          while (index--) {
-            if ((result = baseIsEqual(a[index], value, callback, isWhere, stackA, stackB))) {
-              break;
-            }
-          }
-        } else if (!(result = baseIsEqual(a[size], value, callback, isWhere, stackA, stackB))) {
-          break;
-        }
-      }
-      return result;
-    }
-    // deep compare objects using `forIn`, instead of `forOwn`, to avoid `Object.keys`
-    // which, in this case, is more costly
-    forIn(b, function(value, key, b) {
-      if (hasOwnProperty.call(b, key)) {
-        // count the number of properties.
-        size++;
-        // deep compare each property value.
-        return (result = hasOwnProperty.call(a, key) && baseIsEqual(a[key], value, callback, isWhere, stackA, stackB));
-      }
-    });
-
-    if (result && !isWhere) {
-      // ensure both objects have the same number of properties
-      forIn(a, function(value, key, a) {
-        if (hasOwnProperty.call(a, key)) {
-          // `size` will be `-1` if `a` has more properties than `b`
-          return (result = --size > -1);
-        }
-      });
-    }
-    if (initedStack) {
-      releaseArray(stackA);
-      releaseArray(stackB);
-    }
-    return result;
-  }
-
-  /**
-   * The base implementation of `_.merge` without argument juggling or support
-   * for `thisArg` binding.
-   *
-   * @private
-   * @param {Object} object The destination object.
-   * @param {Object} source The source object.
-   * @param {Function} [callback] The function to customize merging properties.
-   * @param {Array} [stackA=[]] Tracks traversed source objects.
-   * @param {Array} [stackB=[]] Associates values with source counterparts.
-   */
-  function baseMerge(object, source, callback, stackA, stackB) {
-    (isArray(source) ? forEach : forOwn)(source, function(source, key) {
-      var found,
-          isArr,
-          result = source,
-          value = object[key];
-
-      if (source && ((isArr = isArray(source)) || isPlainObject(source))) {
-        // avoid merging previously merged cyclic sources
-        var stackLength = stackA.length;
-        while (stackLength--) {
-          if ((found = stackA[stackLength] == source)) {
-            value = stackB[stackLength];
-            break;
-          }
-        }
-        if (!found) {
-          var isShallow;
-          if (callback) {
-            result = callback(value, source);
-            if ((isShallow = typeof result != 'undefined')) {
-              value = result;
-            }
-          }
-          if (!isShallow) {
-            value = isArr
-              ? (isArray(value) ? value : [])
-              : (isPlainObject(value) ? value : {});
-          }
-          // add `source` and associated `value` to the stack of traversed objects
-          stackA.push(source);
-          stackB.push(value);
-
-          // recursively merge objects and arrays (susceptible to call stack limits)
-          if (!isShallow) {
-            baseMerge(value, source, callback, stackA, stackB);
-          }
-        }
-      }
-      else {
-        if (callback) {
-          result = callback(value, source);
-          if (typeof result == 'undefined') {
-            result = source;
-          }
-        }
-        if (typeof result != 'undefined') {
-          value = result;
-        }
-      }
-      object[key] = value;
-    });
-  }
-
-  /**
-   * The base implementation of `_.uniq` without support for callback shorthands
-   * or `thisArg` binding.
-   *
-   * @private
-   * @param {Array} array The array to process.
-   * @param {boolean} [isSorted=false] A flag to indicate that `array` is sorted.
-   * @param {Function} [callback] The function called per iteration.
-   * @returns {Array} Returns a duplicate-value-free array.
-   */
-  function baseUniq(array, isSorted, callback) {
-    var index = -1,
-        indexOf = getIndexOf(),
-        length = array ? array.length : 0,
-        result = [];
-
-    var isLarge = !isSorted && length >= largeArraySize && indexOf === baseIndexOf,
-        seen = (callback || isLarge) ? getArray() : result;
-
-    if (isLarge) {
-      var cache = createCache(seen);
-      if (cache) {
-        indexOf = cacheIndexOf;
-        seen = cache;
-      } else {
-        isLarge = false;
-        seen = callback ? seen : (releaseArray(seen), result);
-      }
-    }
-    while (++index < length) {
-      var value = array[index],
-          computed = callback ? callback(value, index, array) : value;
-
-      if (isSorted
-            ? !index || seen[seen.length - 1] !== computed
-            : indexOf(seen, computed) < 0
-          ) {
-        if (callback || isLarge) {
-          seen.push(computed);
-        }
-        result.push(value);
-      }
-    }
-    if (isLarge) {
-      releaseArray(seen.array);
-      releaseObject(seen);
-    } else if (callback) {
-      releaseArray(seen);
-    }
-    return result;
-  }
-
-  /**
-   * Creates a function that aggregates a collection, creating an object composed
-   * of keys generated from the results of running each element of the collection
-   * through a callback. The given `setter` function sets the keys and values
-   * of the composed object.
-   *
-   * @private
-   * @param {Function} setter The setter function.
-   * @returns {Function} Returns the new aggregator function.
-   */
-  function createAggregator(setter) {
-    return function(collection, callback, thisArg) {
-      var result = {};
-      callback = lodash.createCallback(callback, thisArg, 3);
-
-      if (isArray(collection)) {
-        var index = -1,
-            length = collection.length;
-
-        while (++index < length) {
-          var value = collection[index];
-          setter(result, value, callback(value, index, collection), collection);
-        }
-      } else {
-        baseEach(collection, function(value, key, collection) {
-          setter(result, value, callback(value, key, collection), collection);
-        });
-      }
-      return result;
-    };
-  }
-
-  /**
-   * Creates a function that, when called, either curries or invokes `func`
-   * with an optional `this` binding and partially applied arguments.
-   *
-   * @private
-   * @param {Function|string} func The function or method name to reference.
-   * @param {number} bitmask The bitmask of method flags to compose.
-   *  The bitmask may be composed of the following flags:
-   *  1 - `_.bind`
-   *  2 - `_.bindKey`
-   *  4 - `_.curry`
-   *  8 - `_.curry` (bound)
-   *  16 - `_.partial`
-   *  32 - `_.partialRight`
-   * @param {Array} [partialArgs] An array of arguments to prepend to those
-   *  provided to the new function.
-   * @param {Array} [partialRightArgs] An array of arguments to append to those
-   *  provided to the new function.
-   * @param {*} [thisArg] The `this` binding of `func`.
-   * @param {number} [arity] The arity of `func`.
-   * @returns {Function} Returns the new function.
-   */
-  function createWrapper(func, bitmask, partialArgs, partialRightArgs, thisArg, arity) {
-    var isBind = bitmask & 1,
-        isBindKey = bitmask & 2,
-        isCurry = bitmask & 4,
-        isCurryBound = bitmask & 8,
-        isPartial = bitmask & 16,
-        isPartialRight = bitmask & 32;
-
-    if (!isBindKey && !isFunction(func)) {
-      throw new TypeError;
-    }
-    if (isPartial && !partialArgs.length) {
-      bitmask &= ~16;
-      isPartial = partialArgs = false;
-    }
-    if (isPartialRight && !partialRightArgs.length) {
-      bitmask &= ~32;
-      isPartialRight = partialRightArgs = false;
-    }
-    var bindData = func && func.__bindData__;
-    if (bindData && bindData !== true) {
-      bindData = bindData.slice();
-
-      // set `thisBinding` is not previously bound
-      if (isBind && !(bindData[1] & 1)) {
-        bindData[4] = thisArg;
-      }
-      // set if previously bound but not currently (subsequent curried functions)
-      if (!isBind && bindData[1] & 1) {
-        bitmask |= 8;
-      }
-      // set curried arity if not yet set
-      if (isCurry && !(bindData[1] & 4)) {
-        bindData[5] = arity;
-      }
-      // append partial left arguments
-      if (isPartial) {
-        push.apply(bindData[2] || (bindData[2] = []), partialArgs);
-      }
-      // append partial right arguments
-      if (isPartialRight) {
-        push.apply(bindData[3] || (bindData[3] = []), partialRightArgs);
-      }
-      // merge flags
-      bindData[1] |= bitmask;
-      return createWrapper.apply(null, bindData);
-    }
-    // fast path for `_.bind`
-    var creater = (bitmask == 1 || bitmask === 17) ? baseBind : baseCreateWrapper;
-    return creater([func, bitmask, partialArgs, partialRightArgs, thisArg, arity]);
-  }
-
-  /**
-   * Creates compiled iteration functions.
-   *
-   * @private
-   * @param {...Object} [options] The compile options object(s).
-   * @param {string} [options.array] Code to determine if the iterable is an array or array-like.
-   * @param {boolean} [options.useHas] Specify using `hasOwnProperty` checks in the object loop.
-   * @param {Function} [options.keys] A reference to `_.keys` for use in own property iteration.
-   * @param {string} [options.args] A comma separated string of iteration function arguments.
-   * @param {string} [options.top] Code to execute before the iteration branches.
-   * @param {string} [options.loop] Code to execute in the object loop.
-   * @param {string} [options.bottom] Code to execute after the iteration branches.
-   * @returns {Function} Returns the compiled function.
-   */
-  function createIterator() {
-    // data properties
-    iteratorData.shadowedProps = shadowedProps;
-
-    // iterator options
-    iteratorData.array = iteratorData.bottom = iteratorData.loop = iteratorData.top = '';
-    iteratorData.init = 'iterable';
-    iteratorData.useHas = true;
-
-    // merge options into a template data object
-    for (var object, index = 0; object = arguments[index]; index++) {
-      for (var key in object) {
-        iteratorData[key] = object[key];
-      }
-    }
-    var args = iteratorData.args;
-    iteratorData.firstArg = /^[^,]+/.exec(args)[0];
-
-    // create the function factory
-    var factory = Function(
-        'baseCreateCallback, errorClass, errorProto, hasOwnProperty, ' +
-        'indicatorObject, isArguments, isArray, isString, keys, objectProto, ' +
-        'objectTypes, nonEnumProps, stringClass, stringProto, toString',
-      'return function(' + args + ') {\n' + iteratorTemplate(iteratorData) + '\n}'
-    );
-
-    // return the compiled function
-    return factory(
-      baseCreateCallback, errorClass, errorProto, hasOwnProperty,
-      indicatorObject, isArguments, isArray, isString, iteratorData.keys, objectProto,
-      objectTypes, nonEnumProps, stringClass, stringProto, toString
-    );
-  }
-
-  /**
-   * Gets the appropriate "indexOf" function. If the `_.indexOf` method is
-   * customized, this method returns the custom method, otherwise it returns
-   * the `baseIndexOf` function.
-   *
-   * @private
-   * @returns {Function} Returns the "indexOf" function.
-   */
-  function getIndexOf() {
-    var result = (result = lodash.indexOf) === indexOf ? baseIndexOf : result;
-    return result;
-  }
-
-  /**
-   * Sets `this` binding data on a given function.
-   *
-   * @private
-   * @param {Function} func The function to set data on.
-   * @param {Array} value The data array to set.
-   */
-  var setBindData = !defineProperty ? noop : function(func, value) {
-    descriptor.value = value;
-    defineProperty(func, '__bindData__', descriptor);
-  };
-
-  /**
-   * A fallback implementation of `isPlainObject` which checks if a given value
-   * is an object created by the `Object` constructor, assuming objects created
-   * by the `Object` constructor have no inherited enumerable properties and that
-   * there are no `Object.prototype` extensions.
-   *
-   * @private
-   * @param {*} value The value to check.
-   * @returns {boolean} Returns `true` if `value` is a plain object, else `false`.
-   */
-  function shimIsPlainObject(value) {
-    var ctor,
-        result;
-
-    // avoid non Object objects, `arguments` objects, and DOM elements
-    if (!(value && toString.call(value) == objectClass) ||
-        (ctor = value.constructor, isFunction(ctor) && !(ctor instanceof ctor)) ||
-        (!support.argsClass && isArguments(value)) ||
-        (!support.nodeClass && isNode(value))) {
-      return false;
-    }
-    // IE < 9 iterates inherited properties before own properties. If the first
-    // iterated property is an object's own property then there are no inherited
-    // enumerable properties.
-    if (support.ownLast) {
-      forIn(value, function(value, key, object) {
-        result = hasOwnProperty.call(object, key);
-        return false;
-      });
-      return result !== false;
-    }
-    // In most environments an object's own properties are iterated before
-    // its inherited properties. If the last iterated property is an object's
-    // own property then there are no inherited enumerable properties.
-    forIn(value, function(value, key) {
-      result = key;
-    });
-    return typeof result == 'undefined' || hasOwnProperty.call(value, result);
-  }
-
-  /*--------------------------------------------------------------------------*/
-
-  /**
-   * Checks if `value` is an `arguments` object.
-   *
-   * @static
-   * @memberOf _
-   * @category Objects
-   * @param {*} value The value to check.
-   * @returns {boolean} Returns `true` if the `value` is an `arguments` object, else `false`.
-   * @example
-   *
-   * (function() { return _.isArguments(arguments); })(1, 2, 3);
-   * // => true
-   *
-   * _.isArguments([1, 2, 3]);
-   * // => false
-   */
-  function isArguments(value) {
-    return value && typeof value == 'object' && typeof value.length == 'number' &&
-      toString.call(value) == argsClass || false;
-  }
-  // fallback for browsers that can't detect `arguments` objects by [[Class]]
-  if (!support.argsClass) {
-    isArguments = function(value) {
-      return value && typeof value == 'object' && typeof value.length == 'number' &&
-        hasOwnProperty.call(value, 'callee') && !propertyIsEnumerable.call(value, 'callee') || false;
-    };
-  }
-
-  /**
-   * Checks if `value` is an array.
-   *
-   * @static
-   * @memberOf _
-   * @type Function
-   * @category Objects
-   * @param {*} value The value to check.
-   * @returns {boolean} Returns `true` if the `value` is an array, else `false`.
-   * @example
-   *
-   * (function() { return _.isArray(arguments); })();
-   * // => false
-   *
-   * _.isArray([1, 2, 3]);
-   * // => true
-   */
-  var isArray = nativeIsArray || function(value) {
-    return value && typeof value == 'object' && typeof value.length == 'number' &&
-      toString.call(value) == arrayClass || false;
-  };
-
-  /**
-   * A fallback implementation of `Object.keys` which produces an array of the
-   * given object's own enumerable property names.
-   *
-   * @private
-   * @type Function
-   * @param {Object} object The object to inspect.
-   * @returns {Array} Returns an array of property names.
-   */
-  var shimKeys = createIterator({
-    'args': 'object',
-    'init': '[]',
-    'top': 'if (!(objectTypes[typeof object])) return result',
-    'loop': 'result.push(index)'
-  });
-
-  /**
-   * Creates an array composed of the own enumerable property names of an object.
-   *
-   * @static
-   * @memberOf _
-   * @category Objects
-   * @param {Object} object The object to inspect.
-   * @returns {Array} Returns an array of property names.
-   * @example
-   *
-   * _.keys({ 'one': 1, 'two': 2, 'three': 3 });
-   * // => ['one', 'two', 'three'] (property order is not guaranteed across environments)
-   */
-  var keys = !nativeKeys ? shimKeys : function(object) {
-    if (!isObject(object)) {
-      return [];
-    }
-    if ((support.enumPrototypes && typeof object == 'function') ||
-        (support.nonEnumArgs && object.length && isArguments(object))) {
-      return shimKeys(object);
-    }
-    return nativeKeys(object);
-  };
-
-  /** Reusable iterator options shared by `each`, `forIn`, and `forOwn` */
-  var eachIteratorOptions = {
-    'args': 'collection, callback, thisArg',
-    'top': "callback = callback && typeof thisArg == 'undefined' ? callback : baseCreateCallback(callback, thisArg, 3)",
-    'array': "typeof length == 'number'",
-    'keys': keys,
-    'loop': 'if (callback(iterable[index], index, collection) === false) return result'
-  };
-
-  /** Reusable iterator options for `assign` and `defaults` */
-  var defaultsIteratorOptions = {
-    'args': 'object, source, guard',
-    'top':
-      'var args = arguments,\n' +
-      '    argsIndex = 0,\n' +
-      "    argsLength = typeof guard == 'number' ? 2 : args.length;\n" +
-      'while (++argsIndex < argsLength) {\n' +
-      '  iterable = args[argsIndex];\n' +
-      '  if (iterable && objectTypes[typeof iterable]) {',
-    'keys': keys,
-    'loop': "if (typeof result[index] == 'undefined') result[index] = iterable[index]",
-    'bottom': '  }\n}'
-  };
-
-  /** Reusable iterator options for `forIn` and `forOwn` */
-  var forOwnIteratorOptions = {
-    'top': 'if (!objectTypes[typeof iterable]) return result;\n' + eachIteratorOptions.top,
-    'array': false
-  };
-
-  /**
-   * A function compiled to iterate `arguments` objects, arrays, objects, and
-   * strings consistenly across environments, executing the callback for each
-   * element in the collection. The callback is bound to `thisArg` and invoked
-   * with three arguments; (value, index|key, collection). Callbacks may exit
-   * iteration early by explicitly returning `false`.
-   *
-   * @private
-   * @type Function
-   * @param {Array|Object|string} collection The collection to iterate over.
-   * @param {Function} [callback=identity] The function called per iteration.
-   * @param {*} [thisArg] The `this` binding of `callback`.
-   * @returns {Array|Object|string} Returns `collection`.
-   */
-  var baseEach = createIterator(eachIteratorOptions);
-
-  /*--------------------------------------------------------------------------*/
-
-  /**
-   * Assigns own enumerable properties of source object(s) to the destination
-   * object. Subsequent sources will overwrite property assignments of previous
-   * sources. If a callback is provided it will be executed to produce the
-   * assigned values. The callback is bound to `thisArg` and invoked with two
-   * arguments; (objectValue, sourceValue).
-   *
-   * @static
-   * @memberOf _
-   * @type Function
-   * @alias extend
-   * @category Objects
-   * @param {Object} object The destination object.
-   * @param {...Object} [source] The source objects.
-   * @param {Function} [callback] The function to customize assigning values.
-   * @param {*} [thisArg] The `this` binding of `callback`.
-   * @returns {Object} Returns the destination object.
-   * @example
-   *
-   * _.assign({ 'name': 'fred' }, { 'employer': 'slate' });
-   * // => { 'name': 'fred', 'employer': 'slate' }
-   *
-   * var defaults = _.partialRight(_.assign, function(a, b) {
-   *   return typeof a == 'undefined' ? b : a;
-   * });
-   *
-   * var object = { 'name': 'barney' };
-   * defaults(object, { 'name': 'fred', 'employer': 'slate' });
-   * // => { 'name': 'barney', 'employer': 'slate' }
-   */
-  var assign = createIterator(defaultsIteratorOptions, {
-    'top':
-      defaultsIteratorOptions.top.replace(';',
-        ';\n' +
-        "if (argsLength > 3 && typeof args[argsLength - 2] == 'function') {\n" +
-        '  var callback = baseCreateCallback(args[--argsLength - 1], args[argsLength--], 2);\n' +
-        "} else if (argsLength > 2 && typeof args[argsLength - 1] == 'function') {\n" +
-        '  callback = args[--argsLength];\n' +
-        '}'
-      ),
-    'loop': 'result[index] = callback ? callback(result[index], iterable[index]) : iterable[index]'
-  });
-
-  /**
-   * Creates a clone of `value`. If `isDeep` is `true` nested objects will also
-   * be cloned, otherwise they will be assigned by reference. If a callback
-   * is provided it will be executed to produce the cloned values. If the
-   * callback returns `undefined` cloning will be handled by the method instead.
-   * The callback is bound to `thisArg` and invoked with one argument; (value).
-   *
-   * @static
-   * @memberOf _
-   * @category Objects
-   * @param {*} value The value to clone.
-   * @param {boolean} [isDeep=false] Specify a deep clone.
-   * @param {Function} [callback] The function to customize cloning values.
-   * @param {*} [thisArg] The `this` binding of `callback`.
-   * @returns {*} Returns the cloned value.
-   * @example
-   *
-   * var characters = [
-   *   { 'name': 'barney', 'age': 36 },
-   *   { 'name': 'fred',   'age': 40 }
-   * ];
-   *
-   * var shallow = _.clone(characters);
-   * shallow[0] === characters[0];
-   * // => true
-   *
-   * var deep = _.clone(characters, true);
-   * deep[0] === characters[0];
-   * // => false
-   *
-   * _.mixin({
-   *   'clone': _.partialRight(_.clone, function(value) {
-   *     return _.isElement(value) ? value.cloneNode(false) : undefined;
-   *   })
-   * });
-   *
-   * var clone = _.clone(document.body);
-   * clone.childNodes.length;
-   * // => 0
-   */
-  function clone(value, isDeep, callback, thisArg) {
-    // allows working with "Collections" methods without using their `index`
-    // and `collection` arguments for `isDeep` and `callback`
-    if (typeof isDeep != 'boolean' && isDeep != null) {
-      thisArg = callback;
-      callback = isDeep;
-      isDeep = false;
-    }
-    return baseClone(value, isDeep, typeof callback == 'function' && baseCreateCallback(callback, thisArg, 1));
-  }
-
-  /**
-   * Creates a deep clone of `value`. If a callback is provided it will be
-   * executed to produce the cloned values. If the callback returns `undefined`
-   * cloning will be handled by the method instead. The callback is bound to
-   * `thisArg` and invoked with one argument; (value).
-   *
-   * Note: This method is loosely based on the structured clone algorithm. Functions
-   * and DOM nodes are **not** cloned. The enumerable properties of `arguments` objects and
-   * objects created by constructors other than `Object` are cloned to plain `Object` objects.
-   * See http://www.w3.org/TR/html5/infrastructure.html#internal-structured-cloning-algorithm.
-   *
-   * @static
-   * @memberOf _
-   * @category Objects
-   * @param {*} value The value to deep clone.
-   * @param {Function} [callback] The function to customize cloning values.
-   * @param {*} [thisArg] The `this` binding of `callback`.
-   * @returns {*} Returns the deep cloned value.
-   * @example
-   *
-   * var characters = [
-   *   { 'name': 'barney', 'age': 36 },
-   *   { 'name': 'fred',   'age': 40 }
-   * ];
-   *
-   * var deep = _.cloneDeep(characters);
-   * deep[0] === characters[0];
-   * // => false
-   *
-   * var view = {
-   *   'label': 'docs',
-   *   'node': element
-   * };
-   *
-   * var clone = _.cloneDeep(view, function(value) {
-   *   return _.isElement(value) ? value.cloneNode(true) : undefined;
-   * });
-   *
-   * clone.node == view.node;
-   * // => false
-   */
-  function cloneDeep(value, callback, thisArg) {
-    return baseClone(value, true, typeof callback == 'function' && baseCreateCallback(callback, thisArg, 1));
-  }
-
-  /**
-   * Iterates over own and inherited enumerable properties of an object,
-   * executing the callback for each property. The callback is bound to `thisArg`
-   * and invoked with three arguments; (value, key, object). Callbacks may exit
-   * iteration early by explicitly returning `false`.
-   *
-   * @static
-   * @memberOf _
-   * @type Function
-   * @category Objects
-   * @param {Object} object The object to iterate over.
-   * @param {Function} [callback=identity] The function called per iteration.
-   * @param {*} [thisArg] The `this` binding of `callback`.
-   * @returns {Object} Returns `object`.
-   * @example
-   *
-   * function Shape() {
-   *   this.x = 0;
-   *   this.y = 0;
-   * }
-   *
-   * Shape.prototype.move = function(x, y) {
-   *   this.x += x;
-   *   this.y += y;
-   * };
-   *
-   * _.forIn(new Shape, function(value, key) {
-   *   console.log(key);
-   * });
-   * // => logs 'x', 'y', and 'move' (property order is not guaranteed across environments)
-   */
-  var forIn = createIterator(eachIteratorOptions, forOwnIteratorOptions, {
-    'useHas': false
-  });
-
-  /**
-   * Iterates over own enumerable properties of an object, executing the callback
-   * for each property. The callback is bound to `thisArg` and invoked with three
-   * arguments; (value, key, object). Callbacks may exit iteration early by
-   * explicitly returning `false`.
-   *
-   * @static
-   * @memberOf _
-   * @type Function
-   * @category Objects
-   * @param {Object} object The object to iterate over.
-   * @param {Function} [callback=identity] The function called per iteration.
-   * @param {*} [thisArg] The `this` binding of `callback`.
-   * @returns {Object} Returns `object`.
-   * @example
-   *
-   * _.forOwn({ '0': 'zero', '1': 'one', 'length': 2 }, function(num, key) {
-   *   console.log(key);
-   * });
-   * // => logs '0', '1', and 'length' (property order is not guaranteed across environments)
-   */
-  var forOwn = createIterator(eachIteratorOptions, forOwnIteratorOptions);
-
-  /**
-   * Creates a sorted array of property names of all enumerable properties,
-   * own and inherited, of `object` that have function values.
-   *
-   * @static
-   * @memberOf _
-   * @alias methods
-   * @category Objects
-   * @param {Object} object The object to inspect.
-   * @returns {Array} Returns an array of property names that have function values.
-   * @example
-   *
-   * _.functions(_);
-   * // => ['all', 'any', 'bind', 'bindAll', 'clone', 'compact', 'compose', ...]
-   */
-  function functions(object) {
-    var result = [];
-    forIn(object, function(value, key) {
-      if (isFunction(value)) {
-        result.push(key);
-      }
-    });
-    return result.sort();
-  }
-
-  /**
-   * Checks if `value` is empty. Arrays, strings, or `arguments` objects with a
-   * length of `0` and objects with no own enumerable properties are considered
-   * "empty".
-   *
-   * @static
-   * @memberOf _
-   * @category Objects
-   * @param {Array|Object|string} value The value to inspect.
-   * @returns {boolean} Returns `true` if the `value` is empty, else `false`.
-   * @example
-   *
-   * _.isEmpty([1, 2, 3]);
-   * // => false
-   *
-   * _.isEmpty({});
-   * // => true
-   *
-   * _.isEmpty('');
-   * // => true
-   */
-  function isEmpty(value) {
-    var result = true;
-    if (!value) {
-      return result;
-    }
-    var className = toString.call(value),
-        length = value.length;
-
-    if ((className == arrayClass || className == stringClass ||
-        (support.argsClass ? className == argsClass : isArguments(value))) ||
-        (className == objectClass && typeof length == 'number' && isFunction(value.splice))) {
-      return !length;
-    }
-    forOwn(value, function() {
-      return (result = false);
-    });
-    return result;
-  }
-
-  /**
-   * Performs a deep comparison between two values to determine if they are
-   * equivalent to each other. If a callback is provided it will be executed
-   * to compare values. If the callback returns `undefined` comparisons will
-   * be handled by the method instead. The callback is bound to `thisArg` and
-   * invoked with two arguments; (a, b).
-   *
-   * @static
-   * @memberOf _
-   * @category Objects
-   * @param {*} a The value to compare.
-   * @param {*} b The other value to compare.
-   * @param {Function} [callback] The function to customize comparing values.
-   * @param {*} [thisArg] The `this` binding of `callback`.
-   * @returns {boolean} Returns `true` if the values are equivalent, else `false`.
-   * @example
-   *
-   * var object = { 'name': 'fred' };
-   * var copy = { 'name': 'fred' };
-   *
-   * object == copy;
-   * // => false
-   *
-   * _.isEqual(object, copy);
-   * // => true
-   *
-   * var words = ['hello', 'goodbye'];
-   * var otherWords = ['hi', 'goodbye'];
-   *
-   * _.isEqual(words, otherWords, function(a, b) {
-   *   var reGreet = /^(?:hello|hi)$/i,
-   *       aGreet = _.isString(a) && reGreet.test(a),
-   *       bGreet = _.isString(b) && reGreet.test(b);
-   *
-   *   return (aGreet || bGreet) ? (aGreet == bGreet) : undefined;
-   * });
-   * // => true
-   */
-  function isEqual(a, b, callback, thisArg) {
-    return baseIsEqual(a, b, typeof callback == 'function' && baseCreateCallback(callback, thisArg, 2));
-  }
-
-  /**
-   * Checks if `value` is a function.
-   *
-   * @static
-   * @memberOf _
-   * @category Objects
-   * @param {*} value The value to check.
-   * @returns {boolean} Returns `true` if the `value` is a function, else `false`.
-   * @example
-   *
-   * _.isFunction(_);
-   * // => true
-   */
-  function isFunction(value) {
-    return typeof value == 'function';
-  }
-  // fallback for older versions of Chrome and Safari
-  if (isFunction(/x/)) {
-    isFunction = function(value) {
-      return typeof value == 'function' && toString.call(value) == funcClass;
-    };
-  }
-
-  /**
-   * Checks if `value` is the language type of Object.
-   * (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)
-   *
-   * @static
-   * @memberOf _
-   * @category Objects
-   * @param {*} value The value to check.
-   * @returns {boolean} Returns `true` if the `value` is an object, else `false`.
-   * @example
-   *
-   * _.isObject({});
-   * // => true
-   *
-   * _.isObject([1, 2, 3]);
-   * // => true
-   *
-   * _.isObject(1);
-   * // => false
-   */
-  function isObject(value) {
-    // check if the value is the ECMAScript language type of Object
-    // http://es5.github.io/#x8
-    // and avoid a V8 bug
-    // http://code.google.com/p/v8/issues/detail?id=2291
-    return !!(value && objectTypes[typeof value]);
-  }
-
-  /**
-   * Checks if `value` is an object created by the `Object` constructor.
-   *
-   * @static
-   * @memberOf _
-   * @category Objects
-   * @param {*} value The value to check.
-   * @returns {boolean} Returns `true` if `value` is a plain object, else `false`.
-   * @example
-   *
-   * function Shape() {
-   *   this.x = 0;
-   *   this.y = 0;
-   * }
-   *
-   * _.isPlainObject(new Shape);
-   * // => false
-   *
-   * _.isPlainObject([1, 2, 3]);
-   * // => false
-   *
-   * _.isPlainObject({ 'x': 0, 'y': 0 });
-   * // => true
-   */
-  var isPlainObject = !getPrototypeOf ? shimIsPlainObject : function(value) {
-    if (!(value && toString.call(value) == objectClass) || (!support.argsClass && isArguments(value))) {
-      return false;
-    }
-    var valueOf = value.valueOf,
-        objProto = typeof valueOf == 'function' && (objProto = getPrototypeOf(valueOf)) && getPrototypeOf(objProto);
-
-    return objProto
-      ? (value == objProto || getPrototypeOf(value) == objProto)
-      : shimIsPlainObject(value);
-  };
-
-  /**
-   * Checks if `value` is a string.
-   *
-   * @static
-   * @memberOf _
-   * @category Objects
-   * @param {*} value The value to check.
-   * @returns {boolean} Returns `true` if the `value` is a string, else `false`.
-   * @example
-   *
-   * _.isString('fred');
-   * // => true
-   */
-  function isString(value) {
-    return typeof value == 'string' ||
-      value && typeof value == 'object' && toString.call(value) == stringClass || false;
-  }
-
-  /**
-   * Recursively merges own enumerable properties of the source object(s), that
-   * don't resolve to `undefined` into the destination object. Subsequent sources
-   * will overwrite property assignments of previous sources. If a callback is
-   * provided it will be executed to produce the merged values of the destination
-   * and source properties. If the callback returns `undefined` merging will
-   * be handled by the method instead. The callback is bound to `thisArg` and
-   * invoked with two arguments; (objectValue, sourceValue).
-   *
-   * @static
-   * @memberOf _
-   * @category Objects
-   * @param {Object} object The destination object.
-   * @param {...Object} [source] The source objects.
-   * @param {Function} [callback] The function to customize merging properties.
-   * @param {*} [thisArg] The `this` binding of `callback`.
-   * @returns {Object} Returns the destination object.
-   * @example
-   *
-   * var names = {
-   *   'characters': [
-   *     { 'name': 'barney' },
-   *     { 'name': 'fred' }
-   *   ]
-   * };
-   *
-   * var ages = {
-   *   'characters': [
-   *     { 'age': 36 },
-   *     { 'age': 40 }
-   *   ]
-   * };
-   *
-   * _.merge(names, ages);
-   * // => { 'characters': [{ 'name': 'barney', 'age': 36 }, { 'name': 'fred', 'age': 40 }] }
-   *
-   * var food = {
-   *   'fruits': ['apple'],
-   *   'vegetables': ['beet']
-   * };
-   *
-   * var otherFood = {
-   *   'fruits': ['banana'],
-   *   'vegetables': ['carrot']
-   * };
-   *
-   * _.merge(food, otherFood, function(a, b) {
-   *   return _.isArray(a) ? a.concat(b) : undefined;
-   * });
-   * // => { 'fruits': ['apple', 'banana'], 'vegetables': ['beet', 'carrot] }
-   */
-  function merge(object) {
-    var args = arguments,
-        length = 2;
-
-    if (!isObject(object)) {
-      return object;
-    }
-
-    // allows working with `_.reduce` and `_.reduceRight` without using
-    // their `index` and `collection` arguments
-    if (typeof args[2] != 'number') {
-      length = args.length;
-    }
-    if (length > 3 && typeof args[length - 2] == 'function') {
-      var callback = baseCreateCallback(args[--length - 1], args[length--], 2);
-    } else if (length > 2 && typeof args[length - 1] == 'function') {
-      callback = args[--length];
-    }
-    var sources = slice(arguments, 1, length),
-        index = -1,
-        stackA = getArray(),
-        stackB = getArray();
-
-    while (++index < length) {
-      baseMerge(object, sources[index], callback, stackA, stackB);
-    }
-    releaseArray(stackA);
-    releaseArray(stackB);
-    return object;
-  }
-
-  /**
-   * Creates a shallow clone of `object` excluding the specified properties.
-   * Property names may be specified as individual arguments or as arrays of
-   * property names. If a callback is provided it will be executed for each
-   * property of `object` omitting the properties the callback returns truey
-   * for. The callback is bound to `thisArg` and invoked with three arguments;
-   * (value, key, object).
-   *
-   * @static
-   * @memberOf _
-   * @category Objects
-   * @param {Object} object The source object.
-   * @param {Function|...string|string[]} [callback] The properties to omit or the
-   *  function called per iteration.
-   * @param {*} [thisArg] The `this` binding of `callback`.
-   * @returns {Object} Returns an object without the omitted properties.
-   * @example
-   *
-   * _.omit({ 'name': 'fred', 'age': 40 }, 'age');
-   * // => { 'name': 'fred' }
-   *
-   * _.omit({ 'name': 'fred', 'age': 40 }, function(value) {
-   *   return typeof value == 'number';
-   * });
-   * // => { 'name': 'fred' }
-   */
-  function omit(object, callback, thisArg) {
-    var result = {};
-    if (typeof callback != 'function') {
-      var props = [];
-      forIn(object, function(value, key) {
-        props.push(key);
-      });
-      props = baseDifference(props, baseFlatten(arguments, true, false, 1));
-
-      var index = -1,
-          length = props.length;
-
-      while (++index < length) {
-        var key = props[index];
-        result[key] = object[key];
-      }
-    } else {
-      callback = lodash.createCallback(callback, thisArg, 3);
-      forIn(object, function(value, key, object) {
-        if (!callback(value, key, object)) {
-          result[key] = value;
-        }
-      });
-    }
-    return result;
-  }
-
-  /**
-   * Creates a two dimensional array of an object's key-value pairs,
-   * i.e. `[[key1, value1], [key2, value2]]`.
-   *
-   * @static
-   * @memberOf _
-   * @category Objects
-   * @param {Object} object The object to inspect.
-   * @returns {Array} Returns new array of key-value pairs.
-   * @example
-   *
-   * _.pairs({ 'barney': 36, 'fred': 40 });
-   * // => [['barney', 36], ['fred', 40]] (property order is not guaranteed across environments)
-   */
-  function pairs(object) {
-    var index = -1,
-        props = keys(object),
-        length = props.length,
-        result = Array(length);
-
-    while (++index < length) {
-      var key = props[index];
-      result[index] = [key, object[key]];
-    }
-    return result;
-  }
-
-  /**
-   * Creates a shallow clone of `object` composed of the specified properties.
-   * Property names may be specified as individual arguments or as arrays of
-   * property names. If a callback is provided it will be executed for each
-   * property of `object` picking the properties the callback returns truey
-   * for. The callback is bound to `thisArg` and invoked with three arguments;
-   * (value, key, object).
-   *
-   * @static
-   * @memberOf _
-   * @category Objects
-   * @param {Object} object The source object.
-   * @param {Function|...string|string[]} [callback] The function called per
-   *  iteration or property names to pick, specified as individual property
-   *  names or arrays of property names.
-   * @param {*} [thisArg] The `this` binding of `callback`.
-   * @returns {Object} Returns an object composed of the picked properties.
-   * @example
-   *
-   * _.pick({ 'name': 'fred', '_userid': 'fred1' }, 'name');
-   * // => { 'name': 'fred' }
-   *
-   * _.pick({ 'name': 'fred', '_userid': 'fred1' }, function(value, key) {
-   *   return key.charAt(0) != '_';
-   * });
-   * // => { 'name': 'fred' }
-   */
-  function pick(object, callback, thisArg) {
-    var result = {};
-    if (typeof callback != 'function') {
-      var index = -1,
-          props = baseFlatten(arguments, true, false, 1),
-          length = isObject(object) ? props.length : 0;
-
-      while (++index < length) {
-        var key = props[index];
-        if (key in object) {
-          result[key] = object[key];
-        }
-      }
-    } else {
-      callback = lodash.createCallback(callback, thisArg, 3);
-      forIn(object, function(value, key, object) {
-        if (callback(value, key, object)) {
-          result[key] = value;
-        }
-      });
-    }
-    return result;
-  }
-
-  /**
-   * Creates an array composed of the own enumerable property values of `object`.
-   *
-   * @static
-   * @memberOf _
-   * @category Objects
-   * @param {Object} object The object to inspect.
-   * @returns {Array} Returns an array of property values.
-   * @example
-   *
-   * _.values({ 'one': 1, 'two': 2, 'three': 3 });
-   * // => [1, 2, 3] (property order is not guaranteed across environments)
-   */
-  function values(object) {
-    var index = -1,
-        props = keys(object),
-        length = props.length,
-        result = Array(length);
-
-    while (++index < length) {
-      result[index] = object[props[index]];
-    }
-    return result;
-  }
-
-  /*--------------------------------------------------------------------------*/
-
-  /**
-   * Checks if a given value is present in a collection using strict equality
-   * for comparisons, i.e. `===`. If `fromIndex` is negative, it is used as the
-   * offset from the end of the collection.
-   *
-   * @static
-   * @memberOf _
-   * @alias include
-   * @category Collections
-   * @param {Array|Object|string} collection The collection to iterate over.
-   * @param {*} target The value to check for.
-   * @param {number} [fromIndex=0] The index to search from.
-   * @returns {boolean} Returns `true` if the `target` element is found, else `false`.
-   * @example
-   *
-   * _.contains([1, 2, 3], 1);
-   * // => true
-   *
-   * _.contains([1, 2, 3], 1, 2);
-   * // => false
-   *
-   * _.contains({ 'name': 'fred', 'age': 40 }, 'fred');
-   * // => true
-   *
-   * _.contains('pebbles', 'eb');
-   * // => true
-   */
-  function contains(collection, target, fromIndex) {
-    var index = -1,
-        indexOf = getIndexOf(),
-        length = collection ? collection.length : 0,
-        result = false;
-
-    fromIndex = (fromIndex < 0 ? nativeMax(0, length + fromIndex) : fromIndex) || 0;
-    if (isArray(collection)) {
-      result = indexOf(collection, target, fromIndex) > -1;
-    } else if (typeof length == 'number') {
-      result = (isString(collection) ? collection.indexOf(target, fromIndex) : indexOf(collection, target, fromIndex)) > -1;
-    } else {
-      baseEach(collection, function(value) {
-        if (++index >= fromIndex) {
-          return !(result = value === target);
-        }
-      });
-    }
-    return result;
-  }
-
-  /**
-   * Checks if the given callback returns truey value for **all** elements of
-   * a collection. The callback is bound to `thisArg` and invoked with three
-   * arguments; (value, index|key, collection).
-   *
-   * If a property name is provided for `callback` the created "_.pluck" style
-   * callback will return the property value of the given element.
-   *
-   * If an object is provided for `callback` the created "_.where" style callback
-   * will return `true` for elements that have the properties of the given object,
-   * else `false`.
-   *
-   * @static
-   * @memberOf _
-   * @alias all
-   * @category Collections
-   * @param {Array|Object|string} collection The collection to iterate over.
-   * @param {Function|Object|string} [callback=identity] The function called
-   *  per iteration. If a property name or object is provided it will be used
-   *  to create a "_.pluck" or "_.where" style callback, respectively.
-   * @param {*} [thisArg] The `this` binding of `callback`.
-   * @returns {boolean} Returns `true` if all elements passed the callback check,
-   *  else `false`.
-   * @example
-   *
-   * _.every([true, 1, null, 'yes']);
-   * // => false
-   *
-   * var characters = [
-   *   { 'name': 'barney', 'age': 36 },
-   *   { 'name': 'fred',   'age': 40 }
-   * ];
-   *
-   * // using "_.pluck" callback shorthand
-   * _.every(characters, 'age');
-   * // => true
-   *
-   * // using "_.where" callback shorthand
-   * _.every(characters, { 'age': 36 });
-   * // => false
-   */
-  function every(collection, callback, thisArg) {
-    var result = true;
-    callback = lodash.createCallback(callback, thisArg, 3);
-
-    if (isArray(collection)) {
-      var index = -1,
-          length = collection.length;
-
-      while (++index < length) {
-        if (!(result = !!callback(collection[index], index, collection))) {
-          break;
-        }
-      }
-    } else {
-      baseEach(collection, function(value, index, collection) {
-        return (result = !!callback(value, index, collection));
-      });
-    }
-    return result;
-  }
-
-  /**
-   * Iterates over elements of a collection, returning an array of all elements
-   * the callback returns truey for. The callback is bound to `thisArg` and
-   * invoked with three arguments; (value, index|key, collection).
-   *
-   * If a property name is provided for `callback` the created "_.pluck" style
-   * callback will return the property value of the given element.
-   *
-   * If an object is provided for `callback` the created "_.where" style callback
-   * will return `true` for elements that have the properties of the given object,
-   * else `false`.
-   *
-   * @static
-   * @memberOf _
-   * @alias select
-   * @category Collections
-   * @param {Array|Object|string} collection The collection to iterate over.
-   * @param {Function|Object|string} [callback=identity] The function called
-   *  per iteration. If a property name or object is provided it will be used
-   *  to create a "_.pluck" or "_.where" style callback, respectively.
-   * @param {*} [thisArg] The `this` binding of `callback`.
-   * @returns {Array} Returns a new array of elements that passed the callback check.
-   * @example
-   *
-   * var evens = _.filter([1, 2, 3, 4, 5, 6], function(num) { return num % 2 == 0; });
-   * // => [2, 4, 6]
-   *
-   * var characters = [
-   *   { 'name': 'barney', 'age': 36, 'blocked': false },
-   *   { 'name': 'fred',   'age': 40, 'blocked': true }
-   * ];
-   *
-   * // using "_.pluck" callback shorthand
-   * _.filter(characters, 'blocked');
-   * // => [{ 'name': 'fred', 'age': 40, 'blocked': true }]
-   *
-   * // using "_.where" callback shorthand
-   * _.filter(characters, { 'age': 36 });
-   * // => [{ 'name': 'barney', 'age': 36, 'blocked': false }]
-   */
-  function filter(collection, callback, thisArg) {
-    var result = [];
-    callback = lodash.createCallback(callback, thisArg, 3);
-
-    if (isArray(collection)) {
-      var index = -1,
-          length = collection.length;
-
-      while (++index < length) {
-        var value = collection[index];
-        if (callback(value, index, collection)) {
-          result.push(value);
-        }
-      }
-    } else {
-      baseEach(collection, function(value, index, collection) {
-        if (callback(value, index, collection)) {
-          result.push(value);
-        }
-      });
-    }
-    return result;
-  }
-
-  /**
-   * Iterates over elements of a collection, returning the first element that
-   * the callback returns truey for. The callback is bound to `thisArg` and
-   * invoked with three arguments; (value, index|key, collection).
-   *
-   * If a property name is provided for `callback` the created "_.pluck" style
-   * callback will return the property value of the given element.
-   *
-   * If an object is provided for `callback` the created "_.where" style callback
-   * will return `true` for elements that have the properties of the given object,
-   * else `false`.
-   *
-   * @static
-   * @memberOf _
-   * @alias detect, findWhere
-   * @category Collections
-   * @param {Array|Object|string} collection The collection to iterate over.
-   * @param {Function|Object|string} [callback=identity] The function called
-   *  per iteration. If a property name or object is provided it will be used
-   *  to create a "_.pluck" or "_.where" style callback, respectively.
-   * @param {*} [thisArg] The `this` binding of `callback`.
-   * @returns {*} Returns the found element, else `undefined`.
-   * @example
-   *
-   * var characters = [
-   *   { 'name': 'barney',  'age': 36, 'blocked': false },
-   *   { 'name': 'fred',    'age': 40, 'blocked': true },
-   *   { 'name': 'pebbles', 'age': 1,  'blocked': false }
-   * ];
-   *
-   * _.find(characters, function(chr) {
-   *   return chr.age < 40;
-   * });
-   * // => { 'name': 'barney', 'age': 36, 'blocked': false }
-   *
-   * // using "_.where" callback shorthand
-   * _.find(characters, { 'age': 1 });
-   * // =>  { 'name': 'pebbles', 'age': 1, 'blocked': false }
-   *
-   * // using "_.pluck" callback shorthand
-   * _.find(characters, 'blocked');
-   * // => { 'name': 'fred', 'age': 40, 'blocked': true }
-   */
-  function find(collection, callback, thisArg) {
-    callback = lodash.createCallback(callback, thisArg, 3);
-
-    if (isArray(collection)) {
-      var index = -1,
-          length = collection.length;
-
-      while (++index < length) {
-        var value = collection[index];
-        if (callback(value, index, collection)) {
-          return value;
-        }
-      }
-    } else {
-      var result;
-      baseEach(collection, function(value, index, collection) {
-        if (callback(value, index, collection)) {
-          result = value;
-          return false;
-        }
-      });
-      return result;
-    }
-  }
-
-  /**
-   * Iterates over elements of a collection, executing the callback for each
-   * element. The callback is bound to `thisArg` and invoked with three arguments;
-   * (value, index|key, collection). Callbacks may exit iteration early by
-   * explicitly returning `false`.
-   *
-   * Note: As with other "Collections" methods, objects with a `length` property
-   * are iterated like arrays. To avoid this behavior `_.forIn` or `_.forOwn`
-   * may be used for object iteration.
-   *
-   * @static
-   * @memberOf _
-   * @alias each
-   * @category Collections
-   * @param {Array|Object|string} collection The collection to iterate over.
-   * @param {Function} [callback=identity] The function called per iteration.
-   * @param {*} [thisArg] The `this` binding of `callback`.
-   * @returns {Array|Object|string} Returns `collection`.
-   * @example
-   *
-   * _([1, 2, 3]).forEach(function(num) { console.log(num); }).join(',');
-   * // => logs each number and returns '1,2,3'
-   *
-   * _.forEach({ 'one': 1, 'two': 2, 'three': 3 }, function(num) { console.log(num); });
-   * // => logs each number and returns the object (property order is not guaranteed across environments)
-   */
-  function forEach(collection, callback, thisArg) {
-    if (callback && typeof thisArg == 'undefined' && isArray(collection)) {
-      var index = -1,
-          length = collection.length;
-
-      while (++index < length) {
-        if (callback(collection[index], index, collection) === false) {
-          break;
-        }
-      }
-    } else {
-      baseEach(collection, callback, thisArg);
-    }
-    return collection;
-  }
-
-  /**
-   * Creates an object composed of keys generated from the results of running
-   * each element of a collection through the callback. The corresponding value
-   * of each key is an array of the elements responsible for generating the key.
-   * The callback is bound to `thisArg` and invoked with three arguments;
-   * (value, index|key, collection).
-   *
-   * If a property name is provided for `callback` the created "_.pluck" style
-   * callback will return the property value of the given element.
-   *
-   * If an object is provided for `callback` the created "_.where" style callback
-   * will return `true` for elements that have the properties of the given object,
-   * else `false`
-   *
-   * @static
-   * @memberOf _
-   * @category Collections
-   * @param {Array|Object|string} collection The collection to iterate over.
-   * @param {Function|Object|string} [callback=identity] The function called
-   *  per iteration. If a property name or object is provided it will be used
-   *  to create a "_.pluck" or "_.where" style callback, respectively.
-   * @param {*} [thisArg] The `this` binding of `callback`.
-   * @returns {Object} Returns the composed aggregate object.
-   * @example
-   *
-   * _.groupBy([4.2, 6.1, 6.4], function(num) { return Math.floor(num); });
-   * // => { '4': [4.2], '6': [6.1, 6.4] }
-   *
-   * _.groupBy([4.2, 6.1, 6.4], function(num) { return this.floor(num); }, Math);
-   * // => { '4': [4.2], '6': [6.1, 6.4] }
-   *
-   * // using "_.pluck" callback shorthand
-   * _.groupBy(['one', 'two', 'three'], 'length');
-   * // => { '3': ['one', 'two'], '5': ['three'] }
-   */
-  var groupBy = createAggregator(function(result, value, key) {
-    (hasOwnProperty.call(result, key) ? result[key] : result[key] = []).push(value);
-  });
-
-  /**
-   * Creates an array of values by running each element in the collection
-   * through the callback. The callback is bound to `thisArg` and invoked with
-   * three arguments; (value, index|key, collection).
-   *
-   * If a property name is provided for `callback` the created "_.pluck" style
-   * callback will return the property value of the given element.
-   *
-   * If an object is provided for `callback` the created "_.where" style callback
-   * will return `true` for elements that have the properties of the given object,
-   * else `false`.
-   *
-   * @static
-   * @memberOf _
-   * @alias collect
-   * @category Collections
-   * @param {Array|Object|string} collection The collection to iterate over.
-   * @param {Function|Object|string} [callback=identity] The function called
-   *  per iteration. If a property name or object is provided it will be used
-   *  to create a "_.pluck" or "_.where" style callback, respectively.
-   * @param {*} [thisArg] The `this` binding of `callback`.
-   * @returns {Array} Returns a new array of the results of each `callback` execution.
-   * @example
-   *
-   * _.map([1, 2, 3], function(num) { return num * 3; });
-   * // => [3, 6, 9]
-   *
-   * _.map({ 'one': 1, 'two': 2, 'three': 3 }, function(num) { return num * 3; });
-   * // => [3, 6, 9] (property order is not guaranteed across environments)
-   *
-   * var characters = [
-   *   { 'name': 'barney', 'age': 36 },
-   *   { 'name': 'fred',   'age': 40 }
-   * ];
-   *
-   * // using "_.pluck" callback shorthand
-   * _.map(characters, 'name');
-   * // => ['barney', 'fred']
-   */
-  function map(collection, callback, thisArg) {
-    var index = -1,
-        length = collection ? collection.length : 0,
-        result = Array(typeof length == 'number' ? length : 0);
-
-    callback = lodash.createCallback(callback, thisArg, 3);
-    if (isArray(collection)) {
-      while (++index < length) {
-        result[index] = callback(collection[index], index, collection);
-      }
-    } else {
-      baseEach(collection, function(value, key, collection) {
-        result[++index] = callback(value, key, collection);
-      });
-    }
-    return result;
-  }
-
-  /**
-   * Retrieves the value of a specified property from all elements in the collection.
-   *
-   * @static
-   * @memberOf _
-   * @type Function
-   * @category Collections
-   * @param {Array|Object|string} collection The collection to iterate over.
-   * @param {string} property The property to pluck.
-   * @returns {Array} Returns a new array of property values.
-   * @example
-   *
-   * var characters = [
-   *   { 'name': 'barney', 'age': 36 },
-   *   { 'name': 'fred',   'age': 40 }
-   * ];
-   *
-   * _.pluck(characters, 'name');
-   * // => ['barney', 'fred']
-   */
-  var pluck = map;
-
-  /**
-   * Reduces a collection to a value which is the accumulated result of running
-   * each element in the collection through the callback, where each successive
-   * callback execution consumes the return value of the previous execution. If
-   * `accumulator` is not provided the first element of the collection will be
-   * used as the initial `accumulator` value. The callback is bound to `thisArg`
-   * and invoked with four arguments; (accumulator, value, index|key, collection).
-   *
-   * @static
-   * @memberOf _
-   * @alias foldl, inject
-   * @category Collections
-   * @param {Array|Object|string} collection The collection to iterate over.
-   * @param {Function} [callback=identity] The function called per iteration.
-   * @param {*} [accumulator] Initial value of the accumulator.
-   * @param {*} [thisArg] The `this` binding of `callback`.
-   * @returns {*} Returns the accumulated value.
-   * @example
-   *
-   * var sum = _.reduce([1, 2, 3], function(sum, num) {
-   *   return sum + num;
-   * });
-   * // => 6
-   *
-   * var mapped = _.reduce({ 'a': 1, 'b': 2, 'c': 3 }, function(result, num, key) {
-   *   result[key] = num * 3;
-   *   return result;
-   * }, {});
-   * // => { 'a': 3, 'b': 6, 'c': 9 }
-   */
-  function reduce(collection, callback, accumulator, thisArg) {
-    var noaccum = arguments.length < 3;
-    callback = lodash.createCallback(callback, thisArg, 4);
-
-    if (isArray(collection)) {
-      var index = -1,
-          length = collection.length;
-
-      if (noaccum) {
-        accumulator = collection[++index];
-      }
-      while (++index < length) {
-        accumulator = callback(accumulator, collection[index], index, collection);
-      }
-    } else {
-      baseEach(collection, function(value, index, collection) {
-        accumulator = noaccum
-          ? (noaccum = false, value)
-          : callback(accumulator, value, index, collection)
-      });
-    }
-    return accumulator;
-  }
-
-  /**
-   * The opposite of `_.filter` this method returns the elements of a
-   * collection that the callback does **not** return truey for.
-   *
-   * If a property name is provided for `callback` the created "_.pluck" style
-   * callback will return the property value of the given element.
-   *
-   * If an object is provided for `callback` the created "_.where" style callback
-   * will return `true` for elements that have the properties of the given object,
-   * else `false`.
-   *
-   * @static
-   * @memberOf _
-   * @category Collections
-   * @param {Array|Object|string} collection The collection to iterate over.
-   * @param {Function|Object|string} [callback=identity] The function called
-   *  per iteration. If a property name or object is provided it will be used
-   *  to create a "_.pluck" or "_.where" style callback, respectively.
-   * @param {*} [thisArg] The `this` binding of `callback`.
-   * @returns {Array} Returns a new array of elements that failed the callback check.
-   * @example
-   *
-   * var odds = _.reject([1, 2, 3, 4, 5, 6], function(num) { return num % 2 == 0; });
-   * // => [1, 3, 5]
-   *
-   * var characters = [
-   *   { 'name': 'barney', 'age': 36, 'blocked': false },
-   *   { 'name': 'fred',   'age': 40, 'blocked': true }
-   * ];
-   *
-   * // using "_.pluck" callback shorthand
-   * _.reject(characters, 'blocked');
-   * // => [{ 'name': 'barney', 'age': 36, 'blocked': false }]
-   *
-   * // using "_.where" callback shorthand
-   * _.reject(characters, { 'age': 36 });
-   * // => [{ 'name': 'fred', 'age': 40, 'blocked': true }]
-   */
-  function reject(collection, callback, thisArg) {
-    callback = lodash.createCallback(callback, thisArg, 3);
-    return filter(collection, function(value, index, collection) {
-      return !callback(value, index, collection);
-    });
-  }
-
-  /**
-   * Checks if the callback returns a truey value for **any** element of a
-   * collection. The function returns as soon as it finds a passing value and
-   * does not iterate over the entire collection. The callback is bound to
-   * `thisArg` and invoked with three arguments; (value, index|key, collection).
-   *
-   * If a property name is provided for `callback` the created "_.pluck" style
-   * callback will return the property value of the given element.
-   *
-   * If an object is provided for `callback` the created "_.where" style callback
-   * will return `true` for elements that have the properties of the given object,
-   * else `false`.
-   *
-   * @static
-   * @memberOf _
-   * @alias any
-   * @category Collections
-   * @param {Array|Object|string} collection The collection to iterate over.
-   * @param {Function|Object|string} [callback=identity] The function called
-   *  per iteration. If a property name or object is provided it will be used
-   *  to create a "_.pluck" or "_.where" style callback, respectively.
-   * @param {*} [thisArg] The `this` binding of `callback`.
-   * @returns {boolean} Returns `true` if any element passed the callback check,
-   *  else `false`.
-   * @example
-   *
-   * _.some([null, 0, 'yes', false], Boolean);
-   * // => true
-   *
-   * var characters = [
-   *   { 'name': 'barney', 'age': 36, 'blocked': false },
-   *   { 'name': 'fred',   'age': 40, 'blocked': true }
-   * ];
-   *
-   * // using "_.pluck" callback shorthand
-   * _.some(characters, 'blocked');
-   * // => true
-   *
-   * // using "_.where" callback shorthand
-   * _.some(characters, { 'age': 1 });
-   * // => false
-   */
-  function some(collection, callback, thisArg) {
-    var result;
-    callback = lodash.createCallback(callback, thisArg, 3);
-
-    if (isArray(collection)) {
-      var index = -1,
-          length = collection.length;
-
-      while (++index < length) {
-        if ((result = callback(collection[index], index, collection))) {
-          break;
-        }
-      }
-    } else {
-      baseEach(collection, function(value, index, collection) {
-        return !(result = callback(value, index, collection));
-      });
-    }
-    return !!result;
-  }
-
-  /*--------------------------------------------------------------------------*/
-
-  /**
-   * Creates an array with all falsey values removed. The values `false`, `null`,
-   * `0`, `""`, `undefined`, and `NaN` are all falsey.
-   *
-   * @static
-   * @memberOf _
-   * @category Arrays
-   * @param {Array} array The array to compact.
-   * @returns {Array} Returns a new array of filtered values.
-   * @example
-   *
-   * _.compact([0, 1, false, 2, '', 3]);
-   * // => [1, 2, 3]
-   */
-  function compact(array) {
-    var index = -1,
-        length = array ? array.length : 0,
-        result = [];
-
-    while (++index < length) {
-      var value = array[index];
-      if (value) {
-        result.push(value);
-      }
-    }
-    return result;
-  }
-
-  /**
-   * Creates an array excluding all values of the provided arrays using strict
-   * equality for comparisons, i.e. `===`.
-   *
-   * @static
-   * @memberOf _
-   * @category Arrays
-   * @param {Array} array The array to process.
-   * @param {...Array} [values] The arrays of values to exclude.
-   * @returns {Array} Returns a new array of filtered values.
-   * @example
-   *
-   * _.difference([1, 2, 3, 4, 5], [5, 2, 10]);
-   * // => [1, 3, 4]
-   */
-  function difference(array) {
-    return baseDifference(array, baseFlatten(arguments, true, true, 1));
-  }
-
-  /**
-   * Gets the first element or first `n` elements of an array. If a callback
-   * is provided elements at the beginning of the array are returned as long
-   * as the callback returns truey. The callback is bound to `thisArg` and
-   * invoked with three arguments; (value, index, array).
-   *
-   * If a property name is provided for `callback` the created "_.pluck" style
-   * callback will return the property value of the given element.
-   *
-   * If an object is provided for `callback` the created "_.where" style callback
-   * will return `true` for elements that have the properties of the given object,
-   * else `false`.
-   *
-   * @static
-   * @memberOf _
-   * @alias head, take
-   * @category Arrays
-   * @param {Array} array The array to query.
-   * @param {Function|Object|number|string} [callback] The function called
-   *  per element or the number of elements to return. If a property name or
-   *  object is provided it will be used to create a "_.pluck" or "_.where"
-   *  style callback, respectively.
-   * @param {*} [thisArg] The `this` binding of `callback`.
-   * @returns {*} Returns the first element(s) of `array`.
-   * @example
-   *
-   * _.first([1, 2, 3]);
-   * // => 1
-   *
-   * _.first([1, 2, 3], 2);
-   * // => [1, 2]
-   *
-   * _.first([1, 2, 3], function(num) {
-   *   return num < 3;
-   * });
-   * // => [1, 2]
-   *
-   * var characters = [
-   *   { 'name': 'barney',  'blocked': true,  'employer': 'slate' },
-   *   { 'name': 'fred',    'blocked': false, 'employer': 'slate' },
-   *   { 'name': 'pebbles', 'blocked': true,  'employer': 'na' }
-   * ];
-   *
-   * // using "_.pluck" callback shorthand
-   * _.first(characters, 'blocked');
-   * // => [{ 'name': 'barney', 'blocked': true, 'employer': 'slate' }]
-   *
-   * // using "_.where" callback shorthand
-   * _.pluck(_.first(characters, { 'employer': 'slate' }), 'name');
-   * // => ['barney', 'fred']
-   */
-  function first(array, callback, thisArg) {
-    var n = 0,
-        length = array ? array.length : 0;
-
-    if (typeof callback != 'number' && callback != null) {
-      var index = -1;
-      callback = lodash.createCallback(callback, thisArg, 3);
-      while (++index < length && callback(array[index], index, array)) {
-        n++;
-      }
-    } else {
-      n = callback;
-      if (n == null || thisArg) {
-        return array ? array[0] : undefined;
-      }
-    }
-    return slice(array, 0, nativeMin(nativeMax(0, n), length));
-  }
-
-  /**
-   * Flattens a nested array (the nesting can be to any depth). If `isShallow`
-   * is truey, the array will only be flattened a single level. If a callback
-   * is provided each element of the array is passed through the callback before
-   * flattening. The callback is bound to `thisArg` and invoked with three
-   * arguments; (value, index, array).
-   *
-   * If a property name is provided for `callback` the created "_.pluck" style
-   * callback will return the property value of the given element.
-   *
-   * If an object is provided for `callback` the created "_.where" style callback
-   * will return `true` for elements that have the properties of the given object,
-   * else `false`.
-   *
-   * @static
-   * @memberOf _
-   * @category Arrays
-   * @param {Array} array The array to flatten.
-   * @param {boolean} [isShallow=false] A flag to restrict flattening to a single level.
-   * @param {Function|Object|string} [callback=identity] The function called
-   *  per iteration. If a property name or object is provided it will be used
-   *  to create a "_.pluck" or "_.where" style callback, respectively.
-   * @param {*} [thisArg] The `this` binding of `callback`.
-   * @returns {Array} Returns a new flattened array.
-   * @example
-   *
-   * _.flatten([1, [2], [3, [[4]]]]);
-   * // => [1, 2, 3, 4];
-   *
-   * _.flatten([1, [2], [3, [[4]]]], true);
-   * // => [1, 2, 3, [[4]]];
-   *
-   * var characters = [
-   *   { 'name': 'barney', 'age': 30, 'pets': ['hoppy'] },
-   *   { 'name': 'fred',   'age': 40, 'pets': ['baby puss', 'dino'] }
-   * ];
-   *
-   * // using "_.pluck" callback shorthand
-   * _.flatten(characters, 'pets');
-   * // => ['hoppy', 'baby puss', 'dino']
-   */
-  function flatten(array, isShallow, callback, thisArg) {
-    // juggle arguments
-    if (typeof isShallow != 'boolean' && isShallow != null) {
-      thisArg = callback;
-      callback = (typeof isShallow != 'function' && thisArg && thisArg[isShallow] === array) ? null : isShallow;
-      isShallow = false;
-    }
-    if (callback != null) {
-      array = map(array, callback, thisArg);
-    }
-    return baseFlatten(array, isShallow);
-  }
-
-  /**
-   * Gets the index at which the first occurrence of `value` is found using
-   * strict equality for comparisons, i.e. `===`. If the array is already sorted
-   * providing `true` for `fromIndex` will run a faster binary search.
-   *
-   * @static
-   * @memberOf _
-   * @category Arrays
-   * @param {Array} array The array to search.
-   * @param {*} value The value to search for.
-   * @param {boolean|number} [fromIndex=0] The index to search from or `true`
-   *  to perform a binary search on a sorted array.
-   * @returns {number} Returns the index of the matched value or `-1`.
-   * @example
-   *
-   * _.indexOf([1, 2, 3, 1, 2, 3], 2);
-   * // => 1
-   *
-   * _.indexOf([1, 2, 3, 1, 2, 3], 2, 3);
-   * // => 4
-   *
-   * _.indexOf([1, 1, 2, 2, 3, 3], 2, true);
-   * // => 2
-   */
-  function indexOf(array, value, fromIndex) {
-    if (typeof fromIndex == 'number') {
-      var length = array ? array.length : 0;
-      fromIndex = (fromIndex < 0 ? nativeMax(0, length + fromIndex) : fromIndex || 0);
-    } else if (fromIndex) {
-      var index = sortedIndex(array, value);
-      return array[index] === value ? index : -1;
-    }
-    return baseIndexOf(array, value, fromIndex);
-  }
-
-  /**
-   * Creates an array of unique values present in all provided arrays using
-   * strict equality for comparisons, i.e. `===`.
-   *
-   * @static
-   * @memberOf _
-   * @category Arrays
-   * @param {...Array} [array] The arrays to inspect.
-   * @returns {Array} Returns an array of composite values.
-   * @example
-   *
-   * _.intersection([1, 2, 3], [101, 2, 1, 10], [2, 1]);
-   * // => [1, 2]
-   */
-  function intersection(array) {
-    var args = arguments,
-        argsLength = args.length,
-        argsIndex = -1,
-        caches = getArray(),
-        index = -1,
-        indexOf = getIndexOf(),
-        length = array ? array.length : 0,
-        result = [],
-        seen = getArray();
-
-    while (++argsIndex < argsLength) {
-      var value = args[argsIndex];
-      caches[argsIndex] = indexOf === baseIndexOf &&
-        (value ? value.length : 0) >= largeArraySize &&
-        createCache(argsIndex ? args[argsIndex] : seen);
-    }
-    outer:
-    while (++index < length) {
-      var cache = caches[0];
-      value = array[index];
-
-      if ((cache ? cacheIndexOf(cache, value) : indexOf(seen, value)) < 0) {
-        argsIndex = argsLength;
-        (cache || seen).push(value);
-        while (--argsIndex) {
-          cache = caches[argsIndex];
-          if ((cache ? cacheIndexOf(cache, value) : indexOf(args[argsIndex], value)) < 0) {
-            continue outer;
-          }
-        }
-        result.push(value);
-      }
-    }
-    while (argsLength--) {
-      cache = caches[argsLength];
-      if (cache) {
-        releaseObject(cache);
-      }
-    }
-    releaseArray(caches);
-    releaseArray(seen);
-    return result;
-  }
-
-  /**
-   * Gets the last element or last `n` elements of an array. If a callback is
-   * provided elements at the end of the array are returned as long as the
-   * callback returns truey. The callback is bound to `thisArg` and invoked
-   * with three arguments; (value, index, array).
-   *
-   * If a property name is provided for `callback` the created "_.pluck" style
-   * callback will return the property value of the given element.
-   *
-   * If an object is provided for `callback` the created "_.where" style callback
-   * will return `true` for elements that have the properties of the given object,
-   * else `false`.
-   *
-   * @static
-   * @memberOf _
-   * @category Arrays
-   * @param {Array} array The array to query.
-   * @param {Function|Object|number|string} [callback] The function called
-   *  per element or the number of elements to return. If a property name or
-   *  object is provided it will be used to create a "_.pluck" or "_.where"
-   *  style callback, respectively.
-   * @param {*} [thisArg] The `this` binding of `callback`.
-   * @returns {*} Returns the last element(s) of `array`.
-   * @example
-   *
-   * _.last([1, 2, 3]);
-   * // => 3
-   *
-   * _.last([1, 2, 3], 2);
-   * // => [2, 3]
-   *
-   * _.last([1, 2, 3], function(num) {
-   *   return num > 1;
-   * });
-   * // => [2, 3]
-   *
-   * var characters = [
-   *   { 'name': 'barney',  'blocked': false, 'employer': 'slate' },
-   *   { 'name': 'fred',    'blocked': true,  'employer': 'slate' },
-   *   { 'name': 'pebbles', 'blocked': true,  'employer': 'na' }
-   * ];
-   *
-   * // using "_.pluck" callback shorthand
-   * _.pluck(_.last(characters, 'blocked'), 'name');
-   * // => ['fred', 'pebbles']
-   *
-   * // using "_.where" callback shorthand
-   * _.last(characters, { 'employer': 'na' });
-   * // => [{ 'name': 'pebbles', 'blocked': true, 'employer': 'na' }]
-   */
-  function last(array, callback, thisArg) {
-    var n = 0,
-        length = array ? array.length : 0;
-
-    if (typeof callback != 'number' && callback != null) {
-      var index = length;
-      callback = lodash.createCallback(callback, thisArg, 3);
-      while (index-- && callback(array[index], index, array)) {
-        n++;
-      }
-    } else {
-      n = callback;
-      if (n == null || thisArg) {
-        return array ? array[length - 1] : undefined;
-      }
-    }
-    return slice(array, nativeMax(0, length - n));
-  }
-
-  /**
-   * Uses a binary search to determine the smallest index at which a value
-   * should be inserted into a given sorted array in order to maintain the sort
-   * order of the array. If a callback is provided it will be executed for
-   * `value` and each element of `array` to compute their sort ranking. The
-   * callback is bound to `thisArg` and invoked with one argument; (value).
-   *
-   * If a property name is provided for `callback` the created "_.pluck" style
-   * callback will return the property value of the given element.
-   *
-   * If an object is provided for `callback` the created "_.where" style callback
-   * will return `true` for elements that have the properties of the given object,
-   * else `false`.
-   *
-   * @static
-   * @memberOf _
-   * @category Arrays
-   * @param {Array} array The array to inspect.
-   * @param {*} value The value to evaluate.
-   * @param {Function|Object|string} [callback=identity] The function called
-   *  per iteration. If a property name or object is provided it will be used
-   *  to create a "_.pluck" or "_.where" style callback, respectively.
-   * @param {*} [thisArg] The `this` binding of `callback`.
-   * @returns {number} Returns the index at which `value` should be inserted
-   *  into `array`.
-   * @example
-   *
-   * _.sortedIndex([20, 30, 50], 40);
-   * // => 2
-   *
-   * // using "_.pluck" callback shorthand
-   * _.sortedIndex([{ 'x': 20 }, { 'x': 30 }, { 'x': 50 }], { 'x': 40 }, 'x');
-   * // => 2
-   *
-   * var dict = {
-   *   'wordToNumber': { 'twenty': 20, 'thirty': 30, 'fourty': 40, 'fifty': 50 }
-   * };
-   *
-   * _.sortedIndex(['twenty', 'thirty', 'fifty'], 'fourty', function(word) {
-   *   return dict.wordToNumber[word];
-   * });
-   * // => 2
-   *
-   * _.sortedIndex(['twenty', 'thirty', 'fifty'], 'fourty', function(word) {
-   *   return this.wordToNumber[word];
-   * }, dict);
-   * // => 2
-   */
-  function sortedIndex(array, value, callback, thisArg) {
-    var low = 0,
-        high = array ? array.length : low;
-
-    // explicitly reference `identity` for better inlining in Firefox
-    callback = callback ? lodash.createCallback(callback, thisArg, 1) : identity;
-    value = callback(value);
-
-    while (low < high) {
-      var mid = (low + high) >>> 1;
-      (callback(array[mid]) < value)
-        ? low = mid + 1
-        : high = mid;
-    }
-    return low;
-  }
-
-  /**
-   * Creates an array of unique values, in order, of the provided arrays using
-   * strict equality for comparisons, i.e. `===`.
-   *
-   * @static
-   * @memberOf _
-   * @category Arrays
-   * @param {...Array} [array] The arrays to inspect.
-   * @returns {Array} Returns an array of composite values.
-   * @example
-   *
-   * _.union([1, 2, 3], [101, 2, 1, 10], [2, 1]);
-   * // => [1, 2, 3, 101, 10]
-   */
-  function union(array) {
-    return baseUniq(baseFlatten(arguments, true, true));
-  }
-
-  /**
-   * Creates a duplicate-value-free version of an array using strict equality
-   * for comparisons, i.e. `===`. If the array is sorted, providing
-   * `true` for `isSorted` will use a faster algorithm. If a callback is provided
-   * each element of `array` is passed through the callback before uniqueness
-   * is computed. The callback is bound to `thisArg` and invoked with three
-   * arguments; (value, index, array).
-   *
-   * If a property name is provided for `callback` the created "_.pluck" style
-   * callback will return the property value of the given element.
-   *
-   * If an object is provided for `callback` the created "_.where" style callback
-   * will return `true` for elements that have the properties of the given object,
-   * else `false`.
-   *
-   * @static
-   * @memberOf _
-   * @alias unique
-   * @category Arrays
-   * @param {Array} array The array to process.
-   * @param {boolean} [isSorted=false] A flag to indicate that `array` is sorted.
-   * @param {Function|Object|string} [callback=identity] The function called
-   *  per iteration. If a property name or object is provided it will be used
-   *  to create a "_.pluck" or "_.where" style callback, respectively.
-   * @param {*} [thisArg] The `this` binding of `callback`.
-   * @returns {Array} Returns a duplicate-value-free array.
-   * @example
-   *
-   * _.uniq([1, 2, 1, 3, 1]);
-   * // => [1, 2, 3]
-   *
-   * _.uniq([1, 1, 2, 2, 3], true);
-   * // => [1, 2, 3]
-   *
-   * _.uniq(['A', 'b', 'C', 'a', 'B', 'c'], function(letter) { return letter.toLowerCase(); });
-   * // => ['A', 'b', 'C']
-   *
-   * _.uniq([1, 2.5, 3, 1.5, 2, 3.5], function(num) { return this.floor(num); }, Math);
-   * // => [1, 2.5, 3]
-   *
-   * // using "_.pluck" callback shorthand
-   * _.uniq([{ 'x': 1 }, { 'x': 2 }, { 'x': 1 }], 'x');
-   * // => [{ 'x': 1 }, { 'x': 2 }]
-   */
-  function uniq(array, isSorted, callback, thisArg) {
-    // juggle arguments
-    if (typeof isSorted != 'boolean' && isSorted != null) {
-      thisArg = callback;
-      callback = (typeof isSorted != 'function' && thisArg && thisArg[isSorted] === array) ? null : isSorted;
-      isSorted = false;
-    }
-    if (callback != null) {
-      callback = lodash.createCallback(callback, thisArg, 3);
-    }
-    return baseUniq(array, isSorted, callback);
-  }
-
-  /**
-   * Creates an array excluding all provided values using strict equality for
-   * comparisons, i.e. `===`.
-   *
-   * @static
-   * @memberOf _
-   * @category Arrays
-   * @param {Array} array The array to filter.
-   * @param {...*} [value] The values to exclude.
-   * @returns {Array} Returns a new array of filtered values.
-   * @example
-   *
-   * _.without([1, 2, 1, 0, 3, 1, 4], 0, 1);
-   * // => [2, 3, 4]
-   */
-  function without(array) {
-    return baseDifference(array, slice(arguments, 1));
-  }
-
-  /*--------------------------------------------------------------------------*/
-
-  /**
-   * Creates a function that, when called, invokes `func` with the `this`
-   * binding of `thisArg` and prepends any additional `bind` arguments to those
-   * provided to the bound function.
-   *
-   * @static
-   * @memberOf _
-   * @category Functions
-   * @param {Function} func The function to bind.
-   * @param {*} [thisArg] The `this` binding of `func`.
-   * @param {...*} [arg] Arguments to be partially applied.
-   * @returns {Function} Returns the new bound function.
-   * @example
-   *
-   * var func = function(greeting) {
-   *   return greeting + ' ' + this.name;
-   * };
-   *
-   * func = _.bind(func, { 'name': 'fred' }, 'hi');
-   * func();
-   * // => 'hi fred'
-   */
-  function bind(func, thisArg) {
-    return arguments.length > 2
-      ? createWrapper(func, 17, slice(arguments, 2), null, thisArg)
-      : createWrapper(func, 1, null, null, thisArg);
-  }
-
-  /**
-   * Produces a callback bound to an optional `thisArg`. If `func` is a property
-   * name the created callback will return the property value for a given element.
-   * If `func` is an object the created callback will return `true` for elements
-   * that contain the equivalent object properties, otherwise it will return `false`.
-   *
-   * @static
-   * @memberOf _
-   * @category Functions
-   * @param {*} [func=identity] The value to convert to a callback.
-   * @param {*} [thisArg] The `this` binding of the created callback.
-   * @param {number} [argCount] The number of arguments the callback accepts.
-   * @returns {Function} Returns a callback function.
-   * @example
-   *
-   * var characters = [
-   *   { 'name': 'barney', 'age': 36 },
-   *   { 'name': 'fred',   'age': 40 }
-   * ];
-   *
-   * // wrap to create custom callback shorthands
-   * _.createCallback = _.wrap(_.createCallback, function(func, callback, thisArg) {
-   *   var match = /^(.+?)__([gl]t)(.+)$/.exec(callback);
-   *   return !match ? func(callback, thisArg) : function(object) {
-   *     return match[2] == 'gt' ? object[match[1]] > match[3] : object[match[1]] < match[3];
-   *   };
-   * });
-   *
-   * _.filter(characters, 'age__gt38');
-   * // => [{ 'name': 'fred', 'age': 40 }]
-   */
-  function createCallback(func, thisArg, argCount) {
-    var type = typeof func;
-    if (func == null || type == 'function') {
-      return baseCreateCallback(func, thisArg, argCount);
-    }
-    // handle "_.pluck" style callback shorthands
-    if (type != 'object') {
-      return function(object) {
-        return object[func];
-      };
-    }
-    var props = keys(func),
-        key = props[0],
-        a = func[key];
-
-    // handle "_.where" style callback shorthands
-    if (props.length == 1 && a === a && !isObject(a)) {
-      // fast path the common case of providing an object with a single
-      // property containing a primitive value
-      return function(object) {
-        var b = object[key];
-        return a === b && (a !== 0 || (1 / a == 1 / b));
-      };
-    }
-    return function(object) {
-      var length = props.length,
-          result = false;
-
-      while (length--) {
-        if (!(result = baseIsEqual(object[props[length]], func[props[length]], null, true))) {
-          break;
-        }
-      }
-      return result;
-    };
-  }
-
-  /**
-   * Creates a function that will delay the execution of `func` until after
-   * `wait` milliseconds have elapsed since the last time it was invoked.
-   * Provide an options object to indicate that `func` should be invoked on
-   * the leading and/or trailing edge of the `wait` timeout. Subsequent calls
-   * to the debounced function will return the result of the last `func` call.
-   *
-   * Note: If `leading` and `trailing` options are `true` `func` will be called
-   * on the trailing edge of the timeout only if the the debounced function is
-   * invoked more than once during the `wait` timeout.
-   *
-   * @static
-   * @memberOf _
-   * @category Functions
-   * @param {Function} func The function to debounce.
-   * @param {number} wait The number of milliseconds to delay.
-   * @param {Object} [options] The options object.
-   * @param {boolean} [options.leading=false] Specify execution on the leading edge of the timeout.
-   * @param {number} [options.maxWait] The maximum time `func` is allowed to be delayed before it's called.
-   * @param {boolean} [options.trailing=true] Specify execution on the trailing edge of the timeout.
-   * @returns {Function} Returns the new debounced function.
-   * @example
-   *
-   * // avoid costly calculations while the window size is in flux
-   * var lazyLayout = _.debounce(calculateLayout, 150);
-   * jQuery(window).on('resize', lazyLayout);
-   *
-   * // execute `sendMail` when the click event is fired, debouncing subsequent calls
-   * jQuery('#postbox').on('click', _.debounce(sendMail, 300, {
-   *   'leading': true,
-   *   'trailing': false
-   * });
-   *
-   * // ensure `batchLog` is executed once after 1 second of debounced calls
-   * var source = new EventSource('/stream');
-   * source.addEventListener('message', _.debounce(batchLog, 250, {
-   *   'maxWait': 1000
-   * }, false);
-   */
-  function debounce(func, wait, options) {
-    var args,
-        maxTimeoutId,
-        result,
-        stamp,
-        thisArg,
-        timeoutId,
-        trailingCall,
-        lastCalled = 0,
-        maxWait = false,
-        trailing = true;
-
-    if (!isFunction(func)) {
-      throw new TypeError;
-    }
-    wait = nativeMax(0, wait) || 0;
-    if (options === true) {
-      var leading = true;
-      trailing = false;
-    } else if (isObject(options)) {
-      leading = options.leading;
-      maxWait = 'maxWait' in options && (nativeMax(wait, options.maxWait) || 0);
-      trailing = 'trailing' in options ? options.trailing : trailing;
-    }
-    var delayed = function() {
-      var remaining = wait - (now() - stamp);
-      if (remaining <= 0) {
-        if (maxTimeoutId) {
-          clearTimeout(maxTimeoutId);
-        }
-        var isCalled = trailingCall;
-        maxTimeoutId = timeoutId = trailingCall = undefined;
-        if (isCalled) {
-          lastCalled = now();
-          result = func.apply(thisArg, args);
-          if (!timeoutId && !maxTimeoutId) {
-            args = thisArg = null;
-          }
-        }
-      } else {
-        timeoutId = setTimeout(delayed, remaining);
-      }
-    };
-
-    var maxDelayed = function() {
-      if (timeoutId) {
-        clearTimeout(timeoutId);
-      }
-      maxTimeoutId = timeoutId = trailingCall = undefined;
-      if (trailing || (maxWait !== wait)) {
-        lastCalled = now();
-        result = func.apply(thisArg, args);
-        if (!timeoutId && !maxTimeoutId) {
-          args = thisArg = null;
-        }
-      }
-    };
-
-    return function() {
-      args = arguments;
-      stamp = now();
-      thisArg = this;
-      trailingCall = trailing && (timeoutId || !leading);
-
-      if (maxWait === false) {
-        var leadingCall = leading && !timeoutId;
-      } else {
-        if (!maxTimeoutId && !leading) {
-          lastCalled = stamp;
-        }
-        var remaining = maxWait - (stamp - lastCalled),
-            isCalled = remaining <= 0;
-
-        if (isCalled) {
-          if (maxTimeoutId) {
-            maxTimeoutId = clearTimeout(maxTimeoutId);
-          }
-          lastCalled = stamp;
-          result = func.apply(thisArg, args);
-        }
-        else if (!maxTimeoutId) {
-          maxTimeoutId = setTimeout(maxDelayed, remaining);
-        }
-      }
-      if (isCalled && timeoutId) {
-        timeoutId = clearTimeout(timeoutId);
-      }
-      else if (!timeoutId && wait !== maxWait) {
-        timeoutId = setTimeout(delayed, wait);
-      }
-      if (leadingCall) {
-        isCalled = true;
-        result = func.apply(thisArg, args);
-      }
-      if (isCalled && !timeoutId && !maxTimeoutId) {
-        args = thisArg = null;
-      }
-      return result;
-    };
-  }
-
-  /**
-   * Creates a function that, when executed, will only call the `func` function
-   * at most once per every `wait` milliseconds. Provide an options object to
-   * indicate that `func` should be invoked on the leading and/or trailing edge
-   * of the `wait` timeout. Subsequent calls to the throttled function will
-   * return the result of the last `func` call.
-   *
-   * Note: If `leading` and `trailing` options are `true` `func` will be called
-   * on the trailing edge of the timeout only if the the throttled function is
-   * invoked more than once during the `wait` timeout.
-   *
-   * @static
-   * @memberOf _
-   * @category Functions
-   * @param {Function} func The function to throttle.
-   * @param {number} wait The number of milliseconds to throttle executions to.
-   * @param {Object} [options] The options object.
-   * @param {boolean} [options.leading=true] Specify execution on the leading edge of the timeout.
-   * @param {boolean} [options.trailing=true] Specify execution on the trailing edge of the timeout.
-   * @returns {Function} Returns the new throttled function.
-   * @example
-   *
-   * // avoid excessively updating the position while scrolling
-   * var throttled = _.throttle(updatePosition, 100);
-   * jQuery(window).on('scroll', throttled);
-   *
-   * // execute `renewToken` when the click event is fired, but not more than once every 5 minutes
-   * jQuery('.interactive').on('click', _.throttle(renewToken, 300000, {
-   *   'trailing': false
-   * }));
-   */
-  function throttle(func, wait, options) {
-    var leading = true,
-        trailing = true;
-
-    if (!isFunction(func)) {
-      throw new TypeError;
-    }
-    if (options === false) {
-      leading = false;
-    } else if (isObject(options)) {
-      leading = 'leading' in options ? options.leading : leading;
-      trailing = 'trailing' in options ? options.trailing : trailing;
-    }
-    debounceOptions.leading = leading;
-    debounceOptions.maxWait = wait;
-    debounceOptions.trailing = trailing;
-
-    return debounce(func, wait, debounceOptions);
-  }
-
-  /*--------------------------------------------------------------------------*/
-
-  /**
-   * This method returns the first argument provided to it.
-   *
-   * @static
-   * @memberOf _
-   * @category Utilities
-   * @param {*} value Any value.
-   * @returns {*} Returns `value`.
-   * @example
-   *
-   * var object = { 'name': 'fred' };
-   * _.identity(object) === object;
-   * // => true
-   */
-  function identity(value) {
-    return value;
-  }
-
-  /**
-   * Adds function properties of a source object to the `lodash` function and
-   * chainable wrapper.
-   *
-   * @static
-   * @memberOf _
-   * @category Utilities
-   * @param {Object} object The object of function properties to add to `lodash`.
-   * @param {Object} object The object of function properties to add to `lodash`.
-   * @example
-   *
-   * _.mixin({
-   *   'capitalize': function(string) {
-   *     return string.charAt(0).toUpperCase() + string.slice(1).toLowerCase();
-   *   }
-   * });
-   *
-   * _.capitalize('fred');
-   * // => 'Fred'
-   *
-   * _('fred').capitalize();
-   * // => 'Fred'
-   */
-  function mixin(object, source) {
-    var ctor = object,
-        isFunc = !source || isFunction(ctor);
-
-    if (!source) {
-      ctor = lodashWrapper;
-      source = object;
-      object = lodash;
-    }
-    forEach(functions(source), function(methodName) {
-      var func = object[methodName] = source[methodName];
-      if (isFunc) {
-        ctor.prototype[methodName] = function() {
-          var value = this.__wrapped__,
-              args = [value];
-
-          push.apply(args, arguments);
-          var result = func.apply(object, args);
-          if (value && typeof value == 'object' && value === result) {
-            return this;
-          }
-          result = new ctor(result);
-          result.__chain__ = this.__chain__;
-          return result;
-        };
-      }
-    });
-  }
-
-  /**
-   * A no-operation function.
-   *
-   * @static
-   * @memberOf _
-   * @category Utilities
-   * @example
-   *
-   * var object = { 'name': 'fred' };
-   * _.noop(object) === undefined;
-   * // => true
-   */
-  function noop() {
-    // no operation performed
-  }
-
-  /*--------------------------------------------------------------------------*/
-
-  /**
-   * Creates a `lodash` object that wraps the given value with explicit
-   * method chaining enabled.
-   *
-   * @static
-   * @memberOf _
-   * @category Chaining
-   * @param {*} value The value to wrap.
-   * @returns {Object} Returns the wrapper object.
-   * @example
-   *
-   * var characters = [
-   *   { 'name': 'barney',  'age': 36 },
-   *   { 'name': 'fred',    'age': 40 },
-   *   { 'name': 'pebbles', 'age': 1 }
-   * ];
-   *
-   * var youngest = _.chain(characters)
-   *     .sortBy('age')
-   *     .map(function(chr) { return chr.name + ' is ' + chr.age; })
-   *     .first()
-   *     .value();
-   * // => 'pebbles is 1'
-   */
-  function chain(value) {
-    value = new lodashWrapper(value);
-    value.__chain__ = true;
-    return value;
-  }
-
-  /**
-   * Enables explicit method chaining on the wrapper object.
-   *
-   * @name chain
-   * @memberOf _
-   * @category Chaining
-   * @returns {*} Returns the wrapper object.
-   * @example
-   *
-   * var characters = [
-   *   { 'name': 'barney', 'age': 36 },
-   *   { 'name': 'fred',   'age': 40 }
-   * ];
-   *
-   * // without explicit chaining
-   * _(characters).first();
-   * // => { 'name': 'barney', 'age': 36 }
-   *
-   * // with explicit chaining
-   * _(characters).chain()
-   *   .first()
-   *   .pick('age')
-   *   .value()
-   * // => { 'age': 36 }
-   */
-  function wrapperChain() {
-    this.__chain__ = true;
-    return this;
-  }
-
-  /**
-   * Produces the `toString` result of the wrapped value.
-   *
-   * @name toString
-   * @memberOf _
-   * @category Chaining
-   * @returns {string} Returns the string result.
-   * @example
-   *
-   * _([1, 2, 3]).toString();
-   * // => '1,2,3'
-   */
-  function wrapperToString() {
-    return String(this.__wrapped__);
-  }
-
-  /**
-   * Extracts the wrapped value.
-   *
-   * @name valueOf
-   * @memberOf _
-   * @alias value
-   * @category Chaining
-   * @returns {*} Returns the wrapped value.
-   * @example
-   *
-   * _([1, 2, 3]).valueOf();
-   * // => [1, 2, 3]
-   */
-  function wrapperValueOf() {
-    return this.__wrapped__;
-  }
-
-  /*--------------------------------------------------------------------------*/
-
-  lodash.assign = assign;
-  lodash.bind = bind;
-  lodash.chain = chain;
-  lodash.compact = compact;
-  lodash.createCallback = createCallback;
-  lodash.debounce = debounce;
-  lodash.difference = difference;
-  lodash.filter = filter;
-  lodash.flatten = flatten;
-  lodash.forEach = forEach;
-  lodash.forIn = forIn;
-  lodash.forOwn = forOwn;
-  lodash.functions = functions;
-  lodash.groupBy = groupBy;
-  lodash.intersection = intersection;
-  lodash.keys = keys;
-  lodash.map = map;
-  lodash.merge = merge;
-  lodash.omit = omit;
-  lodash.pairs = pairs;
-  lodash.pick = pick;
-  lodash.pluck = pluck;
-  lodash.reject = reject;
-  lodash.throttle = throttle;
-  lodash.union = union;
-  lodash.uniq = uniq;
-  lodash.values = values;
-  lodash.without = without;
-
-  // add aliases
-  lodash.collect = map;
-  lodash.each = forEach;
-  lodash.extend = assign;
-  lodash.methods = functions;
-  lodash.select = filter;
-  lodash.unique = uniq;
-
-  // add functions to `lodash.prototype`
-  mixin(lodash);
-
-  /*--------------------------------------------------------------------------*/
-
-  // add functions that return unwrapped values when chaining
-  lodash.clone = clone;
-  lodash.cloneDeep = cloneDeep;
-  lodash.contains = contains;
-  lodash.every = every;
-  lodash.find = find;
-  lodash.identity = identity;
-  lodash.indexOf = indexOf;
-  lodash.isArguments = isArguments;
-  lodash.isArray = isArray;
-  lodash.isEmpty = isEmpty;
-  lodash.isEqual = isEqual;
-  lodash.isFunction = isFunction;
-  lodash.isObject = isObject;
-  lodash.isPlainObject = isPlainObject;
-  lodash.isString = isString;
-  lodash.mixin = mixin;
-  lodash.noop = noop;
-  lodash.reduce = reduce;
-  lodash.some = some;
-  lodash.sortedIndex = sortedIndex;
-
-  // add aliases
-  lodash.all = every;
-  lodash.any = some;
-  lodash.detect = find;
-  lodash.findWhere = find;
-  lodash.foldl = reduce;
-  lodash.include = contains;
-  lodash.inject = reduce;
-
-  forOwn(lodash, function(func, methodName) {
-    if (!lodash.prototype[methodName]) {
-      lodash.prototype[methodName] = function() {
-        var args = [this.__wrapped__],
-            chainAll = this.__chain__;
-
-        push.apply(args, arguments);
-        var result = func.apply(lodash, args);
-        return chainAll
-          ? new lodashWrapper(result, chainAll)
-          : result;
-      };
-    }
-  });
-
-  /*--------------------------------------------------------------------------*/
-
-  // add functions capable of returning wrapped and unwrapped values when chaining
-  lodash.first = first;
-  lodash.last = last;
-
-  // add aliases
-  lodash.take = first;
-  lodash.head = first;
-
-  forOwn(lodash, function(func, methodName) {
-    var callbackable = methodName !== 'sample';
-    if (!lodash.prototype[methodName]) {
-      lodash.prototype[methodName]= function(n, guard) {
-        var chainAll = this.__chain__,
-            result = func(this.__wrapped__, n, guard);
-
-        return !chainAll && (n == null || (guard && !(callbackable && typeof n == 'function')))
-          ? result
-          : new lodashWrapper(result, chainAll);
-      };
-    }
-  });
-
-  /*--------------------------------------------------------------------------*/
-
-  /**
-   * The semantic version number.
-   *
-   * @static
-   * @memberOf _
-   * @type string
-   */
-  lodash.VERSION = '2.3.0';
-
-  // add "Chaining" functions to the wrapper
-  lodash.prototype.chain = wrapperChain;
-  lodash.prototype.toString = wrapperToString;
-  lodash.prototype.value = wrapperValueOf;
-  lodash.prototype.valueOf = wrapperValueOf;
-
-  // add `Array` functions that return unwrapped values
-  baseEach(['join', 'pop', 'shift'], function(methodName) {
-    var func = arrayRef[methodName];
-    lodash.prototype[methodName] = function() {
-      var chainAll = this.__chain__,
-          result = func.apply(this.__wrapped__, arguments);
-
-      return chainAll
-        ? new lodashWrapper(result, chainAll)
-        : result;
-    };
-  });
-
-  // add `Array` functions that return the wrapped value
-  baseEach(['push', 'reverse', 'sort', 'unshift'], function(methodName) {
-    var func = arrayRef[methodName];
-    lodash.prototype[methodName] = function() {
-      func.apply(this.__wrapped__, arguments);
-      return this;
-    };
-  });
-
-  // add `Array` functions that return new wrapped values
-  baseEach(['concat', 'slice', 'splice'], function(methodName) {
-    var func = arrayRef[methodName];
-    lodash.prototype[methodName] = function() {
-      return new lodashWrapper(func.apply(this.__wrapped__, arguments), this.__chain__);
-    };
-  });
-
-  // avoid array-like object bugs with `Array#shift` and `Array#splice`
-  // in IE < 9, Firefox < 10, Narwhal, and RingoJS
-  if (!support.spliceObjects) {
-    baseEach(['pop', 'shift', 'splice'], function(methodName) {
-      var func = arrayRef[methodName],
-          isSplice = methodName == 'splice';
-
-      lodash.prototype[methodName] = function() {
-        var chainAll = this.__chain__,
-            value = this.__wrapped__,
-            result = func.apply(value, arguments);
-
-        if (value.length === 0) {
-          delete value[0];
-        }
-        return (chainAll || isSplice)
-          ? new lodashWrapper(result, chainAll)
-          : result;
-      };
-    });
-  }
-
-  /*--------------------------------------------------------------------------*/
-
-  if (freeExports && freeModule) {
-    // in Node.js or RingoJS
-    if (moduleExports) {
-      (freeModule.exports = lodash)._ = lodash;
-    }
-
-  }
-  else {
-    // in a browser or Rhino
-    root._ = lodash;
-  }
-}.call(this));
-(function(e){if("function"==typeof bootstrap)bootstrap("osmauth",e);else if("object"==typeof exports)module.exports=e();else if("function"==typeof define&&define.amd)define(e);else if("undefined"!=typeof ses){if(!ses.ok())return;ses.makeOsmAuth=e}else"undefined"!=typeof window?window.osmAuth=e():global.osmAuth=e()})(function(){var define,ses,bootstrap,module,exports;
-return (function(e,t,n){function i(n,s){if(!t[n]){if(!e[n]){var o=typeof require=="function"&&require;if(!s&&o)return o(n,!0);if(r)return r(n,!0);throw new Error("Cannot find module '"+n+"'")}var u=t[n]={exports:{}};e[n][0].call(u.exports,function(t){var r=e[n][1][t];return i(r?r:t)},u,u.exports)}return t[n].exports}var r=typeof require=="function"&&require;for(var s=0;s<n.length;s++)i(n[s]);return i})({1:[function(require,module,exports){
-'use strict';
-
-var ohauth = require('ohauth'),
-    xtend = require('xtend'),
-    store = require('store');
-
-// # osm-auth
-//
-// This code is only compatible with IE10+ because the [XDomainRequest](http://bit.ly/LfO7xo)
-// object, IE<10's idea of [CORS](http://en.wikipedia.org/wiki/Cross-origin_resource_sharing),
-// does not support custom headers, which this uses everywhere.
-module.exports = function(o) {
-
-    var oauth = {};
-
-    // authenticated users will also have a request token secret, but it's
-    // not used in transactions with the server
-    oauth.authenticated = function() {
-        return !!(token('oauth_token') && token('oauth_token_secret'));
-    };
-
-    oauth.logout = function() {
-        token('oauth_token', '');
-        token('oauth_token_secret', '');
-        token('oauth_request_token_secret', '');
-        return oauth;
-    };
-
-    // TODO: detect lack of click event
-    oauth.authenticate = function(callback) {
-        if (oauth.authenticated()) return callback();
-
-        oauth.logout();
-
-        // ## Getting a request token
-        var params = timenonce(getAuth(o)),
-            url = o.url + '/oauth/request_token';
-
-        params.oauth_signature = ohauth.signature(
-            o.oauth_secret, '',
-            ohauth.baseString('POST', url, params));
-
-        if (!o.singlepage) {
-            // Create a 600x550 popup window in the center of the screen
-            var w = 600, h = 550,
-                settings = [
-                    ['width', w], ['height', h],
-                    ['left', screen.width / 2 - w / 2],
-                    ['top', screen.height / 2 - h / 2]].map(function(x) {
-                        return x.join('=');
-                    }).join(','),
-                popup = window.open('about:blank', 'oauth_window', settings);
-        }
-
-        // Request a request token. When this is complete, the popup
-        // window is redirected to OSM's authorization page.
-        ohauth.xhr('POST', url, params, null, {}, reqTokenDone);
-        o.loading();
-
-        function reqTokenDone(err, xhr) {
-            o.done();
-            if (err) return callback(err);
-            var resp = ohauth.stringQs(xhr.response);
-            token('oauth_request_token_secret', resp.oauth_token_secret);
-            var authorize_url = o.url + '/oauth/authorize?' + ohauth.qsString({
-                oauth_token: resp.oauth_token,
-                oauth_callback: location.href.replace('index.html', '')
-                    .replace(/#.*/, '') + o.landing
-            });
-
-            if (o.singlepage) {
-                location.href = authorize_url;
-            } else {
-                popup.location = authorize_url;
-            }
-        }
-
-        // Called by a function in a landing page, in the popup window. The
-        // window closes itself.
-        window.authComplete = function(token) {
-            var oauth_token = ohauth.stringQs(token.split('?')[1]);
-            get_access_token(oauth_token.oauth_token);
-            delete window.authComplete;
-        };
-
-        // ## Getting an request token
-        //
-        // At this point we have an `oauth_token`, brought in from a function
-        // call on a landing page popup.
-        function get_access_token(oauth_token) {
-            var url = o.url + '/oauth/access_token',
-                params = timenonce(getAuth(o)),
-                request_token_secret = token('oauth_request_token_secret');
-            params.oauth_token = oauth_token;
-            params.oauth_signature = ohauth.signature(
-                o.oauth_secret,
-                request_token_secret,
-                ohauth.baseString('POST', url, params));
-
-            // ## Getting an access token
-            //
-            // The final token required for authentication. At this point
-            // we have a `request token secret`
-            ohauth.xhr('POST', url, params, null, {}, accessTokenDone);
-            o.loading();
-        }
-
-        function accessTokenDone(err, xhr) {
-            o.done();
-            if (err) return callback(err);
-            var access_token = ohauth.stringQs(xhr.response);
-            token('oauth_token', access_token.oauth_token);
-            token('oauth_token_secret', access_token.oauth_token_secret);
-            callback(null, oauth);
-        }
-    };
-
-    oauth.bootstrapToken = function(oauth_token, callback) {
-        // ## Getting an request token
-        // At this point we have an `oauth_token`, brought in from a function
-        // call on a landing page popup.
-        function get_access_token(oauth_token) {
-            var url = o.url + '/oauth/access_token',
-                params = timenonce(getAuth(o)),
-                request_token_secret = token('oauth_request_token_secret');
-            params.oauth_token = oauth_token;
-            params.oauth_signature = ohauth.signature(
-                o.oauth_secret,
-                request_token_secret,
-                ohauth.baseString('POST', url, params));
-
-            // ## Getting an access token
-            // The final token required for authentication. At this point
-            // we have a `request token secret`
-            ohauth.xhr('POST', url, params, null, {}, accessTokenDone);
-            o.loading();
-        }
-
-        function accessTokenDone(err, xhr) {
-            o.done();
-            if (err) return callback(err);
-            var access_token = ohauth.stringQs(xhr.response);
-            token('oauth_token', access_token.oauth_token);
-            token('oauth_token_secret', access_token.oauth_token_secret);
-            callback(null, oauth);
-        }
-
-        get_access_token(oauth_token);
-    };
-
-    // # xhr
-    //
-    // A single XMLHttpRequest wrapper that does authenticated calls if the
-    // user has logged in.
-    oauth.xhr = function(options, callback) {
-        if (!oauth.authenticated()) {
-            if (o.auto) return oauth.authenticate(run);
-            else return callback('not authenticated', null);
-        } else return run();
-
-        function run() {
-            var params = timenonce(getAuth(o)),
-                url = o.url + options.path,
-                oauth_token_secret = token('oauth_token_secret');
-
-            // https://tools.ietf.org/html/rfc5849#section-3.4.1.3.1
-            if ((!options.options || !options.options.header ||
-                options.options.header['Content-Type'] === 'application/x-www-form-urlencoded') &&
-                options.content) {
-                params = xtend(params, ohauth.stringQs(options.content));
-            }
-
-            params.oauth_token = token('oauth_token');
-            params.oauth_signature = ohauth.signature(
-                o.oauth_secret,
-                oauth_token_secret,
-                ohauth.baseString(options.method, url, params));
-
-            ohauth.xhr(options.method,
-                url, params, options.content, options.options, done);
-        }
-
-        function done(err, xhr) {
-            if (err) return callback(err);
-            else if (xhr.responseXML) return callback(err, xhr.responseXML);
-            else return callback(err, xhr.response);
-        }
-    };
-
-    // pre-authorize this object, if we can just get a token and token_secret
-    // from the start
-    oauth.preauth = function(c) {
-        if (!c) return;
-        if (c.oauth_token) token('oauth_token', c.oauth_token);
-        if (c.oauth_token_secret) token('oauth_token_secret', c.oauth_token_secret);
-        return oauth;
-    };
-
-    oauth.options = function(_) {
-        if (!arguments.length) return o;
-
-        o = _;
-
-        o.url = o.url || 'http://www.openstreetmap.org';
-        o.landing = o.landing || 'land.html';
-
-        o.singlepage = o.singlepage || false;
-
-        // Optional loading and loading-done functions for nice UI feedback.
-        // by default, no-ops
-        o.loading = o.loading || function() {};
-        o.done = o.done || function() {};
-
-        return oauth.preauth(o);
-    };
-
-    // 'stamp' an authentication object from `getAuth()`
-    // with a [nonce](http://en.wikipedia.org/wiki/Cryptographic_nonce)
-    // and timestamp
-    function timenonce(o) {
-        o.oauth_timestamp = ohauth.timestamp();
-        o.oauth_nonce = ohauth.nonce();
-        return o;
-    }
-
-    // get/set tokens. These are prefixed with the base URL so that `osm-auth`
-    // can be used with multiple APIs and the keys in `localStorage`
-    // will not clash
-    var token;
-
-    if (store.enabled) {
-        token = function (x, y) {
-            if (arguments.length === 1) return store.get(o.url + x);
-            else if (arguments.length === 2) return store.set(o.url + x, y);
-        };
-    } else {
-        var storage = {};
-        token = function (x, y) {
-            if (arguments.length === 1) return storage[o.url + x];
-            else if (arguments.length === 2) return storage[o.url + x] = y;
-        };
-    }
-
-    // Get an authentication object. If you just add and remove properties
-    // from a single object, you'll need to use `delete` to make sure that
-    // it doesn't contain undesired properties for authentication
-    function getAuth(o) {
-        return {
-            oauth_consumer_key: o.oauth_consumer_key,
-            oauth_signature_method: "HMAC-SHA1"
-        };
-    }
-
-    // potentially pre-authorize
-    oauth.options(o);
-
-    return oauth;
-};
-
-},{"ohauth":2,"store":3,"xtend":4}],3:[function(require,module,exports){
-(function(global){;(function(win){
-       var store = {},
-               doc = win.document,
-               localStorageName = 'localStorage',
-               storage
-
-       store.disabled = false
-       store.set = function(key, value) {}
-       store.get = function(key) {}
-       store.remove = function(key) {}
-       store.clear = function() {}
-       store.transact = function(key, defaultVal, transactionFn) {
-               var val = store.get(key)
-               if (transactionFn == null) {
-                       transactionFn = defaultVal
-                       defaultVal = null
-               }
-               if (typeof val == 'undefined') { val = defaultVal || {} }
-               transactionFn(val)
-               store.set(key, val)
-       }
-       store.getAll = function() {}
-       store.forEach = function() {}
-
-       store.serialize = function(value) {
-               return JSON.stringify(value)
-       }
-       store.deserialize = function(value) {
-               if (typeof value != 'string') { return undefined }
-               try { return JSON.parse(value) }
-               catch(e) { return value || undefined }
-       }
-
-       // Functions to encapsulate questionable FireFox 3.6.13 behavior
-       // when about.config::dom.storage.enabled === false
-       // See https://github.com/marcuswestin/store.js/issues#issue/13
-       function isLocalStorageNameSupported() {
-               try { return (localStorageName in win && win[localStorageName]) }
-               catch(err) { return false }
-       }
-
-       if (isLocalStorageNameSupported()) {
-               storage = win[localStorageName]
-               store.set = function(key, val) {
-                       if (val === undefined) { return store.remove(key) }
-                       storage.setItem(key, store.serialize(val))
-                       return val
-               }
-               store.get = function(key) { return store.deserialize(storage.getItem(key)) }
-               store.remove = function(key) { storage.removeItem(key) }
-               store.clear = function() { storage.clear() }
-               store.getAll = function() {
-                       var ret = {}
-                       store.forEach(function(key, val) {
-                               ret[key] = val
-                       })
-                       return ret
-               }
-               store.forEach = function(callback) {
-                       for (var i=0; i<storage.length; i++) {
-                               var key = storage.key(i)
-                               callback(key, store.get(key))
-                       }
-               }
-       } else if (doc.documentElement.addBehavior) {
-               var storageOwner,
-                       storageContainer
-               // Since #userData storage applies only to specific paths, we need to
-               // somehow link our data to a specific path.  We choose /favicon.ico
-               // as a pretty safe option, since all browsers already make a request to
-               // this URL anyway and being a 404 will not hurt us here.  We wrap an
-               // iframe pointing to the favicon in an ActiveXObject(htmlfile) object
-               // (see: http://msdn.microsoft.com/en-us/library/aa752574(v=VS.85).aspx)
-               // since the iframe access rules appear to allow direct access and
-               // manipulation of the document element, even for a 404 page.  This
-               // document can be used instead of the current document (which would
-               // have been limited to the current path) to perform #userData storage.
-               try {
-                       storageContainer = new ActiveXObject('htmlfile')
-                       storageContainer.open()
-                       storageContainer.write('<s' + 'cript>document.w=window</s' + 'cript><iframe src="/favicon.ico"></iframe>')
-                       storageContainer.close()
-                       storageOwner = storageContainer.w.frames[0].document
-                       storage = storageOwner.createElement('div')
-               } catch(e) {
-                       // somehow ActiveXObject instantiation failed (perhaps some special
-                       // security settings or otherwse), fall back to per-path storage
-                       storage = doc.createElement('div')
-                       storageOwner = doc.body
-               }
-               function withIEStorage(storeFunction) {
-                       return function() {
-                               var args = Array.prototype.slice.call(arguments, 0)
-                               args.unshift(storage)
-                               // See http://msdn.microsoft.com/en-us/library/ms531081(v=VS.85).aspx
-                               // and http://msdn.microsoft.com/en-us/library/ms531424(v=VS.85).aspx
-                               storageOwner.appendChild(storage)
-                               storage.addBehavior('#default#userData')
-                               storage.load(localStorageName)
-                               var result = storeFunction.apply(store, args)
-                               storageOwner.removeChild(storage)
-                               return result
-                       }
-               }
-
-               // In IE7, keys may not contain special chars. See all of https://github.com/marcuswestin/store.js/issues/40
-               var forbiddenCharsRegex = new RegExp("[!\"#$%&'()*+,/\\\\:;<=>?@[\\]^`{|}~]", "g")
-               function ieKeyFix(key) {
-                       return key.replace(forbiddenCharsRegex, '___')
-               }
-               store.set = withIEStorage(function(storage, key, val) {
-                       key = ieKeyFix(key)
-                       if (val === undefined) { return store.remove(key) }
-                       storage.setAttribute(key, store.serialize(val))
-                       storage.save(localStorageName)
-                       return val
-               })
-               store.get = withIEStorage(function(storage, key) {
-                       key = ieKeyFix(key)
-                       return store.deserialize(storage.getAttribute(key))
-               })
-               store.remove = withIEStorage(function(storage, key) {
-                       key = ieKeyFix(key)
-                       storage.removeAttribute(key)
-                       storage.save(localStorageName)
-               })
-               store.clear = withIEStorage(function(storage) {
-                       var attributes = storage.XMLDocument.documentElement.attributes
-                       storage.load(localStorageName)
-                       for (var i=0, attr; attr=attributes[i]; i++) {
-                               storage.removeAttribute(attr.name)
-                       }
-                       storage.save(localStorageName)
-               })
-               store.getAll = function(storage) {
-                       var ret = {}
-                       store.forEach(function(key, val) {
-                               ret[key] = val
-                       })
-                       return ret
-               }
-               store.forEach = withIEStorage(function(storage, callback) {
-                       var attributes = storage.XMLDocument.documentElement.attributes
-                       for (var i=0, attr; attr=attributes[i]; ++i) {
-                               callback(attr.name, store.deserialize(storage.getAttribute(attr.name)))
-                       }
-               })
+         function this_value() {
+           return this.valueOf();
+         }
+
+         if (typeof Date.prototype.toJSON !== "function") {
+           Date.prototype.toJSON = function () {
+             return isFinite(this.valueOf()) ? this.getUTCFullYear() + "-" + f(this.getUTCMonth() + 1) + "-" + f(this.getUTCDate()) + "T" + f(this.getUTCHours()) + ":" + f(this.getUTCMinutes()) + ":" + f(this.getUTCSeconds()) + "Z" : null;
+           };
+
+           Boolean.prototype.toJSON = this_value;
+           Number.prototype.toJSON = this_value;
+           String.prototype.toJSON = this_value;
+         }
+
+         var gap;
+         var indent;
+         var meta;
+         var rep;
+
+         function quote(string) {
+           // If the string contains no control characters, no quote characters, and no
+           // backslash characters, then we can safely slap some quotes around it.
+           // Otherwise we must also replace the offending characters with safe escape
+           // sequences.
+           rx_escapable.lastIndex = 0;
+           return rx_escapable.test(string) ? "\"" + string.replace(rx_escapable, function (a) {
+             var c = meta[a];
+             return typeof c === "string" ? c : "\\u" + ("0000" + a.charCodeAt(0).toString(16)).slice(-4);
+           }) + "\"" : "\"" + string + "\"";
+         }
+
+         function str(key, holder) {
+           // Produce a string from holder[key].
+           var i; // The loop counter.
+
+           var k; // The member key.
+
+           var v; // The member value.
+
+           var length;
+           var mind = gap;
+           var partial;
+           var value = holder[key]; // If the value has a toJSON method, call it to obtain a replacement value.
+
+           if (value && _typeof(value) === "object" && typeof value.toJSON === "function") {
+             value = value.toJSON(key);
+           } // If we were called with a replacer function, then call the replacer to
+           // obtain a replacement value.
+
+
+           if (typeof rep === "function") {
+             value = rep.call(holder, key, value);
+           } // What happens next depends on the value's type.
+
+
+           switch (_typeof(value)) {
+             case "string":
+               return quote(value);
+
+             case "number":
+               // JSON numbers must be finite. Encode non-finite numbers as null.
+               return isFinite(value) ? String(value) : "null";
+
+             case "boolean":
+             case "null":
+               // If the value is a boolean or null, convert it to a string. Note:
+               // typeof null does not produce "null". The case is included here in
+               // the remote chance that this gets fixed someday.
+               return String(value);
+             // If the type is "object", we might be dealing with an object or an array or
+             // null.
+
+             case "object":
+               // Due to a specification blunder in ECMAScript, typeof null is "object",
+               // so watch out for that case.
+               if (!value) {
+                 return "null";
+               } // Make an array to hold the partial results of stringifying this object value.
+
+
+               gap += indent;
+               partial = []; // Is the value an array?
+
+               if (Object.prototype.toString.apply(value) === "[object Array]") {
+                 // The value is an array. Stringify every element. Use null as a placeholder
+                 // for non-JSON values.
+                 length = value.length;
+
+                 for (i = 0; i < length; i += 1) {
+                   partial[i] = str(i, value) || "null";
+                 } // Join all of the elements together, separated with commas, and wrap them in
+                 // brackets.
+
+
+                 v = partial.length === 0 ? "[]" : gap ? "[\n" + gap + partial.join(",\n" + gap) + "\n" + mind + "]" : "[" + partial.join(",") + "]";
+                 gap = mind;
+                 return v;
+               } // If the replacer is an array, use it to select the members to be stringified.
+
+
+               if (rep && _typeof(rep) === "object") {
+                 length = rep.length;
+
+                 for (i = 0; i < length; i += 1) {
+                   if (typeof rep[i] === "string") {
+                     k = rep[i];
+                     v = str(k, value);
+
+                     if (v) {
+                       partial.push(quote(k) + (gap ? ": " : ":") + v);
+                     }
+                   }
+                 }
+               } else {
+                 // Otherwise, iterate through all of the keys in the object.
+                 for (k in value) {
+                   if (Object.prototype.hasOwnProperty.call(value, k)) {
+                     v = str(k, value);
+
+                     if (v) {
+                       partial.push(quote(k) + (gap ? ": " : ":") + v);
+                     }
+                   }
+                 }
+               } // Join all of the member texts together, separated with commas,
+               // and wrap them in braces.
+
+
+               v = partial.length === 0 ? "{}" : gap ? "{\n" + gap + partial.join(",\n" + gap) + "\n" + mind + "}" : "{" + partial.join(",") + "}";
+               gap = mind;
+               return v;
+           }
+         } // If the JSON object does not yet have a stringify method, give it one.
+
+
+         if (typeof JSON.stringify !== "function") {
+           meta = {
+             // table of character substitutions
+             "\b": "\\b",
+             "\t": "\\t",
+             "\n": "\\n",
+             "\f": "\\f",
+             "\r": "\\r",
+             "\"": "\\\"",
+             "\\": "\\\\"
+           };
+
+           JSON.stringify = function (value, replacer, space) {
+             // The stringify method takes a value and an optional replacer, and an optional
+             // space parameter, and returns a JSON text. The replacer can be a function
+             // that can replace values, or an array of strings that will select the keys.
+             // A default replacer method can be provided. Use of the space parameter can
+             // produce text that is more easily readable.
+             var i;
+             gap = "";
+             indent = ""; // If the space parameter is a number, make an indent string containing that
+             // many spaces.
+
+             if (typeof space === "number") {
+               for (i = 0; i < space; i += 1) {
+                 indent += " ";
+               } // If the space parameter is a string, it will be used as the indent string.
+
+             } else if (typeof space === "string") {
+               indent = space;
+             } // If there is a replacer, it must be a function or an array.
+             // Otherwise, throw an error.
+
+
+             rep = replacer;
+
+             if (replacer && typeof replacer !== "function" && (_typeof(replacer) !== "object" || typeof replacer.length !== "number")) {
+               throw new Error("JSON.stringify");
+             } // Make a fake root object containing our value under the key of "".
+             // Return the result of stringifying the value.
+
+
+             return str("", {
+               "": value
+             });
+           };
+         } // If the JSON object does not yet have a parse method, give it one.
+
+
+         if (typeof JSON.parse !== "function") {
+           JSON.parse = function (text, reviver) {
+             // The parse method takes a text and an optional reviver function, and returns
+             // a JavaScript value if the text is a valid JSON text.
+             var j;
+
+             function walk(holder, key) {
+               // The walk method is used to recursively walk the resulting structure so
+               // that modifications can be made.
+               var k;
+               var v;
+               var value = holder[key];
+
+               if (value && _typeof(value) === "object") {
+                 for (k in value) {
+                   if (Object.prototype.hasOwnProperty.call(value, k)) {
+                     v = walk(value, k);
+
+                     if (v !== undefined) {
+                       value[k] = v;
+                     } else {
+                       delete value[k];
+                     }
+                   }
+                 }
+               }
+
+               return reviver.call(holder, key, value);
+             } // Parsing happens in four stages. In the first stage, we replace certain
+             // Unicode characters with escape sequences. JavaScript handles many characters
+             // incorrectly, either silently deleting them, or treating them as line endings.
+
+
+             text = String(text);
+             rx_dangerous.lastIndex = 0;
+
+             if (rx_dangerous.test(text)) {
+               text = text.replace(rx_dangerous, function (a) {
+                 return "\\u" + ("0000" + a.charCodeAt(0).toString(16)).slice(-4);
+               });
+             } // In the second stage, we run the text against regular expressions that look
+             // for non-JSON patterns. We are especially concerned with "()" and "new"
+             // because they can cause invocation, and "=" because it can cause mutation.
+             // But just to be safe, we want to reject all unexpected forms.
+             // We split the second stage into 4 regexp operations in order to work around
+             // crippling inefficiencies in IE's and Safari's regexp engines. First we
+             // replace the JSON backslash pairs with "@" (a non-JSON character). Second, we
+             // replace all simple value tokens with "]" characters. Third, we delete all
+             // open brackets that follow a colon or comma or that begin the text. Finally,
+             // we look to see that the remaining characters are only whitespace or "]" or
+             // "," or ":" or "{" or "}". If that is so, then the text is safe for eval.
+
+
+             if (rx_one.test(text.replace(rx_two, "@").replace(rx_three, "]").replace(rx_four, ""))) {
+               // In the third stage we use the eval function to compile the text into a
+               // JavaScript structure. The "{" operator is subject to a syntactic ambiguity
+               // in JavaScript: it can begin a block or an object literal. We wrap the text
+               // in parens to eliminate the ambiguity.
+               j = eval("(" + text + ")"); // In the optional fourth stage, we recursively walk the new structure, passing
+               // each name/value pair to a reviver function for possible transformation.
+
+               return typeof reviver === "function" ? walk({
+                 "": j
+               }, "") : j;
+             } // If the text is not JSON parseable, then a SyntaxError is thrown.
+
+
+             throw new SyntaxError("JSON.parse");
+           };
+         }
+       })();
+
+       var json2 = json2Plugin;
+
+       function json2Plugin() {
+         return {};
        }
 
-       try {
-               var testKey = '__storejs__'
-               store.set(testKey, testKey)
-               if (store.get(testKey) != testKey) { store.disabled = true }
-               store.remove(testKey)
-       } catch(e) {
-               store.disabled = true
-       }
-       store.enabled = !store.disabled
-       
-       if (typeof module != 'undefined' && module.exports) { module.exports = store }
-       else if (typeof define === 'function' && define.amd) { define(store) }
-       else { win.store = store }
-       
-})(this.window || global);
-
-})(window)
-},{}],5:[function(require,module,exports){
-module.exports = hasKeys
-
-function hasKeys(source) {
-    return source !== null &&
-        (typeof source === "object" ||
-        typeof source === "function")
-}
-
-},{}],4:[function(require,module,exports){
-var Keys = require("object-keys")
-var hasKeys = require("./has-keys")
-
-module.exports = extend
-
-function extend() {
-    var target = {}
-
-    for (var i = 0; i < arguments.length; i++) {
-        var source = arguments[i]
-
-        if (!hasKeys(source)) {
-            continue
-        }
-
-        var keys = Keys(source)
-
-        for (var j = 0; j < keys.length; j++) {
-            var name = keys[j]
-            target[name] = source[name]
-        }
-    }
-
-    return target
-}
-
-},{"./has-keys":5,"object-keys":6}],7:[function(require,module,exports){
-(function(global){/**
- * jsHashes - A fast and independent hashing library pure JavaScript implemented (ES3 compliant) for both server and client side
- * 
- * @class Hashes
- * @author Tomas Aparicio <tomas@rijndael-project.com>
- * @license New BSD (see LICENSE file)
- * @version 1.0.4
- *
- * Algorithms specification:
- *
- * MD5 <http://www.ietf.org/rfc/rfc1321.txt>
- * RIPEMD-160 <http://homes.esat.kuleuven.be/~bosselae/ripemd160.html>
- * SHA1   <http://csrc.nist.gov/publications/fips/fips180-4/fips-180-4.pdf>
- * SHA256 <http://csrc.nist.gov/publications/fips/fips180-4/fips-180-4.pdf>
- * SHA512 <http://csrc.nist.gov/publications/fips/fips180-4/fips-180-4.pdf>
- * HMAC <http://www.ietf.org/rfc/rfc2104.txt>
- *
- */
-(function(){
-  var Hashes;
-  
-  // private helper methods
-  function utf8Encode(str) {
-    var  x, y, output = '', i = -1, l;
-    
-    if (str && str.length) {
-      l = str.length;
-      while ((i+=1) < l) {
-        /* Decode utf-16 surrogate pairs */
-        x = str.charCodeAt(i);
-        y = i + 1 < l ? str.charCodeAt(i + 1) : 0;
-        if (0xD800 <= x && x <= 0xDBFF && 0xDC00 <= y && y <= 0xDFFF) {
-            x = 0x10000 + ((x & 0x03FF) << 10) + (y & 0x03FF);
-            i += 1;
-        }
-        /* Encode output as utf-8 */
-        if (x <= 0x7F) {
-            output += String.fromCharCode(x);
-        } else if (x <= 0x7FF) {
-            output += String.fromCharCode(0xC0 | ((x >>> 6 ) & 0x1F),
-                        0x80 | ( x & 0x3F));
-        } else if (x <= 0xFFFF) {
-            output += String.fromCharCode(0xE0 | ((x >>> 12) & 0x0F),
-                        0x80 | ((x >>> 6 ) & 0x3F),
-                        0x80 | ( x & 0x3F));
-        } else if (x <= 0x1FFFFF) {
-            output += String.fromCharCode(0xF0 | ((x >>> 18) & 0x07),
-                        0x80 | ((x >>> 12) & 0x3F),
-                        0x80 | ((x >>> 6 ) & 0x3F),
-                        0x80 | ( x & 0x3F));
-        }
-      }
-    }
-    return output;
-  }
-  
-  function utf8Decode(str) {
-    var i, ac, c1, c2, c3, arr = [], l;
-    i = ac = c1 = c2 = c3 = 0;
-    
-    if (str && str.length) {
-      l = str.length;
-      str += '';
-    
-      while (i < l) {
-          c1 = str.charCodeAt(i);
-          ac += 1;
-          if (c1 < 128) {
-              arr[ac] = String.fromCharCode(c1);
-              i+=1;
-          } else if (c1 > 191 && c1 < 224) {
-              c2 = str.charCodeAt(i + 1);
-              arr[ac] = String.fromCharCode(((c1 & 31) << 6) | (c2 & 63));
-              i += 2;
-          } else {
-              c2 = str.charCodeAt(i + 1);
-              c3 = str.charCodeAt(i + 2);
-              arr[ac] = String.fromCharCode(((c1 & 15) << 12) | ((c2 & 63) << 6) | (c3 & 63));
-              i += 3;
-          }
-      }
-    }
-    return arr.join('');
-  }
-
-  /**
-   * Add integers, wrapping at 2^32. This uses 16-bit operations internally
-   * to work around bugs in some JS interpreters.
-   */
-  function safe_add(x, y) {
-    var lsw = (x & 0xFFFF) + (y & 0xFFFF),
-        msw = (x >> 16) + (y >> 16) + (lsw >> 16);
-    return (msw << 16) | (lsw & 0xFFFF);
-  }
-
-  /**
-   * Bitwise rotate a 32-bit number to the left.
-   */
-  function bit_rol(num, cnt) {
-    return (num << cnt) | (num >>> (32 - cnt));
-  }
-
-  /**
-   * Convert a raw string to a hex string
-   */
-  function rstr2hex(input, hexcase) {
-    var hex_tab = hexcase ? '0123456789ABCDEF' : '0123456789abcdef',
-        output = '', x, i = 0, l = input.length;
-    for (; i < l; i+=1) {
-      x = input.charCodeAt(i);
-      output += hex_tab.charAt((x >>> 4) & 0x0F) + hex_tab.charAt(x & 0x0F);
-    }
-    return output;
-  }
-
-  /**
-   * Encode a string as utf-16
-   */
-  function str2rstr_utf16le(input) {
-    var i, l = input.length, output = '';
-    for (i = 0; i < l; i+=1) {
-      output += String.fromCharCode( input.charCodeAt(i) & 0xFF, (input.charCodeAt(i) >>> 8) & 0xFF);
-    }
-    return output;
-  }
-
-  function str2rstr_utf16be(input) {
-    var i, l = input.length, output = '';
-    for (i = 0; i < l; i+=1) {
-      output += String.fromCharCode((input.charCodeAt(i) >>> 8) & 0xFF, input.charCodeAt(i) & 0xFF);
-    }
-    return output;
-  }
-
-  /**
-   * Convert an array of big-endian words to a string
-   */
-  function binb2rstr(input) {
-    var i, l = input.length * 32, output = '';
-    for (i = 0; i < l; i += 8) {
-        output += String.fromCharCode((input[i>>5] >>> (24 - i % 32)) & 0xFF);
-    }
-    return output;
-  }
-
-  /**
-   * Convert an array of little-endian words to a string
-   */
-  function binl2rstr(input) {
-    var i, l = input.length * 32, output = '';
-    for (i = 0;i < l; i += 8) {
-      output += String.fromCharCode((input[i>>5] >>> (i % 32)) & 0xFF);
-    }
-    return output;
-  }
-
-  /**
-   * Convert a raw string to an array of little-endian words
-   * Characters >255 have their high-byte silently ignored.
-   */
-  function rstr2binl(input) {
-    var i, l = input.length * 8, output = Array(input.length >> 2), lo = output.length;
-    for (i = 0; i < lo; i+=1) {
-      output[i] = 0;
-    }
-    for (i = 0; i < l; i += 8) {
-      output[i>>5] |= (input.charCodeAt(i / 8) & 0xFF) << (i%32);
-    }
-    return output;
-  }
-  
-  /**
-   * Convert a raw string to an array of big-endian words 
-   * Characters >255 have their high-byte silently ignored.
-   */
-   function rstr2binb(input) {
-      var i, l = input.length * 8, output = Array(input.length >> 2), lo = output.length;
-      for (i = 0; i < lo; i+=1) {
-            output[i] = 0;
-        }
-      for (i = 0; i < l; i += 8) {
-            output[i>>5] |= (input.charCodeAt(i / 8) & 0xFF) << (24 - i % 32);
-        }
-      return output;
-   }
-
-  /**
-   * Convert a raw string to an arbitrary string encoding
-   */
-  function rstr2any(input, encoding) {
-    var divisor = encoding.length,
-        remainders = Array(),
-        i, q, x, ld, quotient, dividend, output, full_length;
-  
-    /* Convert to an array of 16-bit big-endian values, forming the dividend */
-    dividend = Array(Math.ceil(input.length / 2));
-    ld = dividend.length;
-    for (i = 0; i < ld; i+=1) {
-      dividend[i] = (input.charCodeAt(i * 2) << 8) | input.charCodeAt(i * 2 + 1);
-    }
-  
-    /**
-     * Repeatedly perform a long division. The binary array forms the dividend,
-     * the length of the encoding is the divisor. Once computed, the quotient
-     * forms the dividend for the next step. We stop when the dividend is zerHashes.
-     * All remainders are stored for later use.
-     */
-    while(dividend.length > 0) {
-      quotient = Array();
-      x = 0;
-      for (i = 0; i < dividend.length; i+=1) {
-        x = (x << 16) + dividend[i];
-        q = Math.floor(x / divisor);
-        x -= q * divisor;
-        if (quotient.length > 0 || q > 0) {
-          quotient[quotient.length] = q;
-        }
-      }
-      remainders[remainders.length] = x;
-      dividend = quotient;
-    }
-  
-    /* Convert the remainders to the output string */
-    output = '';
-    for (i = remainders.length - 1; i >= 0; i--) {
-      output += encoding.charAt(remainders[i]);
-    }
-  
-    /* Append leading zero equivalents */
-    full_length = Math.ceil(input.length * 8 / (Math.log(encoding.length) / Math.log(2)));
-    for (i = output.length; i < full_length; i+=1) {
-      output = encoding[0] + output;
-    }
-    return output;
-  }
-
-  /**
-   * Convert a raw string to a base-64 string
-   */
-  function rstr2b64(input, b64pad) {
-    var tab = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/',
-        output = '',
-        len = input.length, i, j, triplet;
-    b64pad= b64pad || '=';
-    for (i = 0; i < len; i += 3) {
-      triplet = (input.charCodeAt(i) << 16)
-            | (i + 1 < len ? input.charCodeAt(i+1) << 8 : 0)
-            | (i + 2 < len ? input.charCodeAt(i+2)      : 0);
-      for (j = 0; j < 4; j+=1) {
-        if (i * 8 + j * 6 > input.length * 8) { 
-          output += b64pad; 
-        } else { 
-          output += tab.charAt((triplet >>> 6*(3-j)) & 0x3F); 
-        }
-       }
-    }
-    return output;
-  }
-
-  Hashes = {
-  /**  
-   * @property {String} version
-   * @readonly
-   */
-  VERSION : '1.0.3',
-  /**
-   * @member Hashes
-   * @class Base64
-   * @constructor
-   */
-  Base64 : function () {
-    // private properties
-    var tab = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/',
-        pad = '=', // default pad according with the RFC standard
-        url = false, // URL encoding support @todo
-        utf8 = true; // by default enable UTF-8 support encoding
-
-    // public method for encoding
-    this.encode = function (input) {
-      var i, j, triplet,
-          output = '', 
-          len = input.length;
-
-      pad = pad || '=';
-      input = (utf8) ? utf8Encode(input) : input;
-
-      for (i = 0; i < len; i += 3) {
-        triplet = (input.charCodeAt(i) << 16)
-              | (i + 1 < len ? input.charCodeAt(i+1) << 8 : 0)
-              | (i + 2 < len ? input.charCodeAt(i+2) : 0);
-        for (j = 0; j < 4; j+=1) {
-          if (i * 8 + j * 6 > len * 8) {
-              output += pad;
-          } else {
-              output += tab.charAt((triplet >>> 6*(3-j)) & 0x3F);
-          }
-        }
-      }
-      return output;    
-    };
-
-    // public method for decoding
-    this.decode = function (input) {
-      // var b64 = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=';
-      var i, o1, o2, o3, h1, h2, h3, h4, bits, ac,
-        dec = '',
-        arr = [];
-      if (!input) { return input; }
-
-      i = ac = 0;
-      input = input.replace(new RegExp('\\'+pad,'gi'),''); // use '='
-      //input += '';
-
-      do { // unpack four hexets into three octets using index points in b64
-        h1 = tab.indexOf(input.charAt(i+=1));
-        h2 = tab.indexOf(input.charAt(i+=1));
-        h3 = tab.indexOf(input.charAt(i+=1));
-        h4 = tab.indexOf(input.charAt(i+=1));
-
-        bits = h1 << 18 | h2 << 12 | h3 << 6 | h4;
-
-        o1 = bits >> 16 & 0xff;
-        o2 = bits >> 8 & 0xff;
-        o3 = bits & 0xff;
-        ac += 1;
-
-        if (h3 === 64) {
-          arr[ac] = String.fromCharCode(o1);
-        } else if (h4 === 64) {
-          arr[ac] = String.fromCharCode(o1, o2);
-        } else {
-          arr[ac] = String.fromCharCode(o1, o2, o3);
-        }
-      } while (i < input.length);
-
-      dec = arr.join('');
-      dec = (utf8) ? utf8Decode(dec) : dec;
-
-      return dec;
-    };
-
-    // set custom pad string
-    this.setPad = function (str) {
-        pad = str || pad;
-        return this;
-    };
-    // set custom tab string characters
-    this.setTab = function (str) {
-        tab = str || tab;
-        return this;
-    };
-    this.setUTF8 = function (bool) {
-        if (typeof bool === 'boolean') {
-          utf8 = bool;
-        }
-        return this;
-    };
-  },
-
-  /**
-   * CRC-32 calculation
-   * @member Hashes
-   * @method CRC32
-   * @static
-   * @param {String} str Input String
-   * @return {String}
-   */
-  CRC32 : function (str) {
-    var crc = 0, x = 0, y = 0, table, i, iTop;
-    str = utf8Encode(str);
-        
-    table = [ 
-        '00000000 77073096 EE0E612C 990951BA 076DC419 706AF48F E963A535 9E6495A3 0EDB8832 ',
-        '79DCB8A4 E0D5E91E 97D2D988 09B64C2B 7EB17CBD E7B82D07 90BF1D91 1DB71064 6AB020F2 F3B97148 ',
-        '84BE41DE 1ADAD47D 6DDDE4EB F4D4B551 83D385C7 136C9856 646BA8C0 FD62F97A 8A65C9EC 14015C4F ',
-        '63066CD9 FA0F3D63 8D080DF5 3B6E20C8 4C69105E D56041E4 A2677172 3C03E4D1 4B04D447 D20D85FD ',
-        'A50AB56B 35B5A8FA 42B2986C DBBBC9D6 ACBCF940 32D86CE3 45DF5C75 DCD60DCF ABD13D59 26D930AC ',
-        '51DE003A C8D75180 BFD06116 21B4F4B5 56B3C423 CFBA9599 B8BDA50F 2802B89E 5F058808 C60CD9B2 ',
-        'B10BE924 2F6F7C87 58684C11 C1611DAB B6662D3D 76DC4190 01DB7106 98D220BC EFD5102A 71B18589 ',
-        '06B6B51F 9FBFE4A5 E8B8D433 7807C9A2 0F00F934 9609A88E E10E9818 7F6A0DBB 086D3D2D 91646C97 ',
-        'E6635C01 6B6B51F4 1C6C6162 856530D8 F262004E 6C0695ED 1B01A57B 8208F4C1 F50FC457 65B0D9C6 ',
-        '12B7E950 8BBEB8EA FCB9887C 62DD1DDF 15DA2D49 8CD37CF3 FBD44C65 4DB26158 3AB551CE A3BC0074 ',
-        'D4BB30E2 4ADFA541 3DD895D7 A4D1C46D D3D6F4FB 4369E96A 346ED9FC AD678846 DA60B8D0 44042D73 ',
-        '33031DE5 AA0A4C5F DD0D7CC9 5005713C 270241AA BE0B1010 C90C2086 5768B525 206F85B3 B966D409 ',
-        'CE61E49F 5EDEF90E 29D9C998 B0D09822 C7D7A8B4 59B33D17 2EB40D81 B7BD5C3B C0BA6CAD EDB88320 ',
-        '9ABFB3B6 03B6E20C 74B1D29A EAD54739 9DD277AF 04DB2615 73DC1683 E3630B12 94643B84 0D6D6A3E ',
-        '7A6A5AA8 E40ECF0B 9309FF9D 0A00AE27 7D079EB1 F00F9344 8708A3D2 1E01F268 6906C2FE F762575D ',
-        '806567CB 196C3671 6E6B06E7 FED41B76 89D32BE0 10DA7A5A 67DD4ACC F9B9DF6F 8EBEEFF9 17B7BE43 ',
-        '60B08ED5 D6D6A3E8 A1D1937E 38D8C2C4 4FDFF252 D1BB67F1 A6BC5767 3FB506DD 48B2364B D80D2BDA ',
-        'AF0A1B4C 36034AF6 41047A60 DF60EFC3 A867DF55 316E8EEF 4669BE79 CB61B38C BC66831A 256FD2A0 ', 
-        '5268E236 CC0C7795 BB0B4703 220216B9 5505262F C5BA3BBE B2BD0B28 2BB45A92 5CB36A04 C2D7FFA7 ',
-        'B5D0CF31 2CD99E8B 5BDEAE1D 9B64C2B0 EC63F226 756AA39C 026D930A 9C0906A9 EB0E363F 72076785 ',
-        '05005713 95BF4A82 E2B87A14 7BB12BAE 0CB61B38 92D28E9B E5D5BE0D 7CDCEFB7 0BDBDF21 86D3D2D4 ',
-        'F1D4E242 68DDB3F8 1FDA836E 81BE16CD F6B9265B 6FB077E1 18B74777 88085AE6 FF0F6A70 66063BCA ',
-        '11010B5C 8F659EFF F862AE69 616BFFD3 166CCF45 A00AE278 D70DD2EE 4E048354 3903B3C2 A7672661 ',
-        'D06016F7 4969474D 3E6E77DB AED16A4A D9D65ADC 40DF0B66 37D83BF0 A9BCAE53 DEBB9EC5 47B2CF7F ',
-        '30B5FFE9 BDBDF21C CABAC28A 53B39330 24B4A3A6 BAD03605 CDD70693 54DE5729 23D967BF B3667A2E ',
-        'C4614AB8 5D681B02 2A6F2B94 B40BBE37 C30C8EA1 5A05DF1B 2D02EF8D'
-    ].join('');
-
-    crc = crc ^ (-1);
-    for (i = 0, iTop = str.length; i < iTop; i+=1 ) {
-        y = ( crc ^ str.charCodeAt( i ) ) & 0xFF;
-        x = '0x' + table.substr( y * 9, 8 );
-        crc = ( crc >>> 8 ) ^ x;
-    }
-    // always return a positive number (that's what >>> 0 does)
-    return (crc ^ (-1)) >>> 0;
-  },
-  /**
-   * @member Hashes
-   * @class MD5
-   * @constructor
-   * @param {Object} [config]
-   * 
-   * A JavaScript implementation of the RSA Data Security, Inc. MD5 Message
-   * Digest Algorithm, as defined in RFC 1321.
-   * Version 2.2 Copyright (C) Paul Johnston 1999 - 2009
-   * Other contributors: Greg Holt, Andrew Kepert, Ydnar, Lostinet
-   * See <http://pajhome.org.uk/crypt/md5> for more infHashes.
-   */
-  MD5 : function (options) {  
-    /**
-     * Private config properties. You may need to tweak these to be compatible with
-     * the server-side, but the defaults work in most cases.
-     * See {@link Hashes.MD5#method-setUpperCase} and {@link Hashes.SHA1#method-setUpperCase}
-     */
-    var hexcase = (options && typeof options.uppercase === 'boolean') ? options.uppercase : false, // hexadecimal output case format. false - lowercase; true - uppercase
-        b64pad = (options && typeof options.pad === 'string') ? options.pda : '=', // base-64 pad character. Defaults to '=' for strict RFC compliance
-        utf8 = (options && typeof options.utf8 === 'boolean') ? options.utf8 : true; // enable/disable utf8 encoding
-
-    // privileged (public) methods 
-    this.hex = function (s) { 
-      return rstr2hex(rstr(s, utf8), hexcase);
-    };
-    this.b64 = function (s) { 
-      return rstr2b64(rstr(s), b64pad);
-    };
-    this.any = function(s, e) { 
-      return rstr2any(rstr(s, utf8), e); 
-    };
-    this.hex_hmac = function (k, d) { 
-      return rstr2hex(rstr_hmac(k, d), hexcase); 
-    };
-    this.b64_hmac = function (k, d) { 
-      return rstr2b64(rstr_hmac(k,d), b64pad); 
-    };
-    this.any_hmac = function (k, d, e) { 
-      return rstr2any(rstr_hmac(k, d), e); 
-    };
-    /**
-     * Perform a simple self-test to see if the VM is working
-     * @return {String} Hexadecimal hash sample
-     */
-    this.vm_test = function () {
-      return hex('abc').toLowerCase() === '900150983cd24fb0d6963f7d28e17f72';
-    };
-    /** 
-     * Enable/disable uppercase hexadecimal returned string 
-     * @param {Boolean} 
-     * @return {Object} this
-     */ 
-    this.setUpperCase = function (a) {
-      if (typeof a === 'boolean' ) {
-        hexcase = a;
-      }
-      return this;
-    };
-    /** 
-     * Defines a base64 pad string 
-     * @param {String} Pad
-     * @return {Object} this
-     */ 
-    this.setPad = function (a) {
-      b64pad = a || b64pad;
-      return this;
-    };
-    /** 
-     * Defines a base64 pad string 
-     * @param {Boolean} 
-     * @return {Object} [this]
-     */ 
-    this.setUTF8 = function (a) {
-      if (typeof a === 'boolean') { 
-        utf8 = a;
-      }
-      return this;
-    };
-
-    // private methods
-
-    /**
-     * Calculate the MD5 of a raw string
-     */
-    function rstr(s) {
-      s = (utf8) ? utf8Encode(s): s;
-      return binl2rstr(binl(rstr2binl(s), s.length * 8));
-    }
-    
-    /**
-     * Calculate the HMAC-MD5, of a key and some data (raw strings)
-     */
-    function rstr_hmac(key, data) {
-      var bkey, ipad, opad, hash, i;
-
-      key = (utf8) ? utf8Encode(key) : key;
-      data = (utf8) ? utf8Encode(data) : data;
-      bkey = rstr2binl(key);
-      if (bkey.length > 16) { 
-        bkey = binl(bkey, key.length * 8); 
-      }
-
-      ipad = Array(16), opad = Array(16); 
-      for (i = 0; i < 16; i+=1) {
-          ipad[i] = bkey[i] ^ 0x36363636;
-          opad[i] = bkey[i] ^ 0x5C5C5C5C;
-      }
-      hash = binl(ipad.concat(rstr2binl(data)), 512 + data.length * 8);
-      return binl2rstr(binl(opad.concat(hash), 512 + 128));
-    }
-
-    /**
-     * Calculate the MD5 of an array of little-endian words, and a bit length.
-     */
-    function binl(x, len) {
-      var i, olda, oldb, oldc, oldd,
-          a =  1732584193,
-          b = -271733879,
-          c = -1732584194,
-          d =  271733878;
-        
-      /* append padding */
-      x[len >> 5] |= 0x80 << ((len) % 32);
-      x[(((len + 64) >>> 9) << 4) + 14] = len;
-
-      for (i = 0; i < x.length; i += 16) {
-        olda = a;
-        oldb = b;
-        oldc = c;
-        oldd = d;
-
-        a = md5_ff(a, b, c, d, x[i+ 0], 7 , -680876936);
-        d = md5_ff(d, a, b, c, x[i+ 1], 12, -389564586);
-        c = md5_ff(c, d, a, b, x[i+ 2], 17,  606105819);
-        b = md5_ff(b, c, d, a, x[i+ 3], 22, -1044525330);
-        a = md5_ff(a, b, c, d, x[i+ 4], 7 , -176418897);
-        d = md5_ff(d, a, b, c, x[i+ 5], 12,  1200080426);
-        c = md5_ff(c, d, a, b, x[i+ 6], 17, -1473231341);
-        b = md5_ff(b, c, d, a, x[i+ 7], 22, -45705983);
-        a = md5_ff(a, b, c, d, x[i+ 8], 7 ,  1770035416);
-        d = md5_ff(d, a, b, c, x[i+ 9], 12, -1958414417);
-        c = md5_ff(c, d, a, b, x[i+10], 17, -42063);
-        b = md5_ff(b, c, d, a, x[i+11], 22, -1990404162);
-        a = md5_ff(a, b, c, d, x[i+12], 7 ,  1804603682);
-        d = md5_ff(d, a, b, c, x[i+13], 12, -40341101);
-        c = md5_ff(c, d, a, b, x[i+14], 17, -1502002290);
-        b = md5_ff(b, c, d, a, x[i+15], 22,  1236535329);
-
-        a = md5_gg(a, b, c, d, x[i+ 1], 5 , -165796510);
-        d = md5_gg(d, a, b, c, x[i+ 6], 9 , -1069501632);
-        c = md5_gg(c, d, a, b, x[i+11], 14,  643717713);
-        b = md5_gg(b, c, d, a, x[i+ 0], 20, -373897302);
-        a = md5_gg(a, b, c, d, x[i+ 5], 5 , -701558691);
-        d = md5_gg(d, a, b, c, x[i+10], 9 ,  38016083);
-        c = md5_gg(c, d, a, b, x[i+15], 14, -660478335);
-        b = md5_gg(b, c, d, a, x[i+ 4], 20, -405537848);
-        a = md5_gg(a, b, c, d, x[i+ 9], 5 ,  568446438);
-        d = md5_gg(d, a, b, c, x[i+14], 9 , -1019803690);
-        c = md5_gg(c, d, a, b, x[i+ 3], 14, -187363961);
-        b = md5_gg(b, c, d, a, x[i+ 8], 20,  1163531501);
-        a = md5_gg(a, b, c, d, x[i+13], 5 , -1444681467);
-        d = md5_gg(d, a, b, c, x[i+ 2], 9 , -51403784);
-        c = md5_gg(c, d, a, b, x[i+ 7], 14,  1735328473);
-        b = md5_gg(b, c, d, a, x[i+12], 20, -1926607734);
-
-        a = md5_hh(a, b, c, d, x[i+ 5], 4 , -378558);
-        d = md5_hh(d, a, b, c, x[i+ 8], 11, -2022574463);
-        c = md5_hh(c, d, a, b, x[i+11], 16,  1839030562);
-        b = md5_hh(b, c, d, a, x[i+14], 23, -35309556);
-        a = md5_hh(a, b, c, d, x[i+ 1], 4 , -1530992060);
-        d = md5_hh(d, a, b, c, x[i+ 4], 11,  1272893353);
-        c = md5_hh(c, d, a, b, x[i+ 7], 16, -155497632);
-        b = md5_hh(b, c, d, a, x[i+10], 23, -1094730640);
-        a = md5_hh(a, b, c, d, x[i+13], 4 ,  681279174);
-        d = md5_hh(d, a, b, c, x[i+ 0], 11, -358537222);
-        c = md5_hh(c, d, a, b, x[i+ 3], 16, -722521979);
-        b = md5_hh(b, c, d, a, x[i+ 6], 23,  76029189);
-        a = md5_hh(a, b, c, d, x[i+ 9], 4 , -640364487);
-        d = md5_hh(d, a, b, c, x[i+12], 11, -421815835);
-        c = md5_hh(c, d, a, b, x[i+15], 16,  530742520);
-        b = md5_hh(b, c, d, a, x[i+ 2], 23, -995338651);
-
-        a = md5_ii(a, b, c, d, x[i+ 0], 6 , -198630844);
-        d = md5_ii(d, a, b, c, x[i+ 7], 10,  1126891415);
-        c = md5_ii(c, d, a, b, x[i+14], 15, -1416354905);
-        b = md5_ii(b, c, d, a, x[i+ 5], 21, -57434055);
-        a = md5_ii(a, b, c, d, x[i+12], 6 ,  1700485571);
-        d = md5_ii(d, a, b, c, x[i+ 3], 10, -1894986606);
-        c = md5_ii(c, d, a, b, x[i+10], 15, -1051523);
-        b = md5_ii(b, c, d, a, x[i+ 1], 21, -2054922799);
-        a = md5_ii(a, b, c, d, x[i+ 8], 6 ,  1873313359);
-        d = md5_ii(d, a, b, c, x[i+15], 10, -30611744);
-        c = md5_ii(c, d, a, b, x[i+ 6], 15, -1560198380);
-        b = md5_ii(b, c, d, a, x[i+13], 21,  1309151649);
-        a = md5_ii(a, b, c, d, x[i+ 4], 6 , -145523070);
-        d = md5_ii(d, a, b, c, x[i+11], 10, -1120210379);
-        c = md5_ii(c, d, a, b, x[i+ 2], 15,  718787259);
-        b = md5_ii(b, c, d, a, x[i+ 9], 21, -343485551);
-
-        a = safe_add(a, olda);
-        b = safe_add(b, oldb);
-        c = safe_add(c, oldc);
-        d = safe_add(d, oldd);
-      }
-      return Array(a, b, c, d);
-    }
-
-    /**
-     * These functions implement the four basic operations the algorithm uses.
-     */
-    function md5_cmn(q, a, b, x, s, t) {
-      return safe_add(bit_rol(safe_add(safe_add(a, q), safe_add(x, t)), s),b);
-    }
-    function md5_ff(a, b, c, d, x, s, t) {
-      return md5_cmn((b & c) | ((~b) & d), a, b, x, s, t);
-    }
-    function md5_gg(a, b, c, d, x, s, t) {
-      return md5_cmn((b & d) | (c & (~d)), a, b, x, s, t);
-    }
-    function md5_hh(a, b, c, d, x, s, t) {
-      return md5_cmn(b ^ c ^ d, a, b, x, s, t);
-    }
-    function md5_ii(a, b, c, d, x, s, t) {
-      return md5_cmn(c ^ (b | (~d)), a, b, x, s, t);
-    }
-  },
-  /**
-   * @member Hashes
-   * @class Hashes.SHA1
-   * @param {Object} [config]
-   * @constructor
-   * 
-   * A JavaScript implementation of the Secure Hash Algorithm, SHA-1, as defined in FIPS 180-1
-   * Version 2.2 Copyright Paul Johnston 2000 - 2009.
-   * Other contributors: Greg Holt, Andrew Kepert, Ydnar, Lostinet
-   * See http://pajhome.org.uk/crypt/md5 for details.
-   */
-  SHA1 : function (options) {
-   /**
-     * Private config properties. You may need to tweak these to be compatible with
-     * the server-side, but the defaults work in most cases.
-     * See {@link Hashes.MD5#method-setUpperCase} and {@link Hashes.SHA1#method-setUpperCase}
-     */
-    var hexcase = (options && typeof options.uppercase === 'boolean') ? options.uppercase : false, // hexadecimal output case format. false - lowercase; true - uppercase
-        b64pad = (options && typeof options.pad === 'string') ? options.pda : '=', // base-64 pad character. Defaults to '=' for strict RFC compliance
-        utf8 = (options && typeof options.utf8 === 'boolean') ? options.utf8 : true; // enable/disable utf8 encoding
-
-    // public methods
-    this.hex = function (s) { 
-       return rstr2hex(rstr(s, utf8), hexcase); 
-    };
-    this.b64 = function (s) { 
-       return rstr2b64(rstr(s, utf8), b64pad);
-    };
-    this.any = function (s, e) { 
-       return rstr2any(rstr(s, utf8), e);
-    };
-    this.hex_hmac = function (k, d) {
-       return rstr2hex(rstr_hmac(k, d));
-    };
-    this.b64_hmac = function (k, d) { 
-       return rstr2b64(rstr_hmac(k, d), b64pad); 
-    };
-    this.any_hmac = function (k, d, e) { 
-       return rstr2any(rstr_hmac(k, d), e);
-    };
-    /**
-     * Perform a simple self-test to see if the VM is working
-     * @return {String} Hexadecimal hash sample
-     * @public
-     */
-    this.vm_test = function () {
-      return hex('abc').toLowerCase() === '900150983cd24fb0d6963f7d28e17f72';
-    };
-    /** 
-     * @description Enable/disable uppercase hexadecimal returned string 
-     * @param {boolean} 
-     * @return {Object} this
-     * @public
-     */ 
-    this.setUpperCase = function (a) {
-       if (typeof a === 'boolean') {
-        hexcase = a;
-      }
-       return this;
-    };
-    /** 
-     * @description Defines a base64 pad string 
-     * @param {string} Pad
-     * @return {Object} this
-     * @public
-     */ 
-    this.setPad = function (a) {
-      b64pad = a || b64pad;
-       return this;
-    };
-    /** 
-     * @description Defines a base64 pad string 
-     * @param {boolean} 
-     * @return {Object} this
-     * @public
-     */ 
-    this.setUTF8 = function (a) {
-       if (typeof a === 'boolean') {
-        utf8 = a;
-      }
-       return this;
-    };
-
-    // private methods
-
-    /**
-        * Calculate the SHA-512 of a raw string
-        */
-       function rstr(s) {
-      s = (utf8) ? utf8Encode(s) : s;
-      return binb2rstr(binb(rstr2binb(s), s.length * 8));
-       }
-
-    /**
-     * Calculate the HMAC-SHA1 of a key and some data (raw strings)
-     */
-    function rstr_hmac(key, data) {
-       var bkey, ipad, opad, i, hash;
-       key = (utf8) ? utf8Encode(key) : key;
-       data = (utf8) ? utf8Encode(data) : data;
-       bkey = rstr2binb(key);
-
-       if (bkey.length > 16) {
-        bkey = binb(bkey, key.length * 8);
-      }
-       ipad = Array(16), opad = Array(16);
-       for (i = 0; i < 16; i+=1) {
-               ipad[i] = bkey[i] ^ 0x36363636;
-               opad[i] = bkey[i] ^ 0x5C5C5C5C;
-       }
-       hash = binb(ipad.concat(rstr2binb(data)), 512 + data.length * 8);
-       return binb2rstr(binb(opad.concat(hash), 512 + 160));
-    }
-
-    /**
-     * Calculate the SHA-1 of an array of big-endian words, and a bit length
-     */
-    function binb(x, len) {
-      var i, j, t, olda, oldb, oldc, oldd, olde,
-          w = Array(80),
-          a =  1732584193,
-          b = -271733879,
-          c = -1732584194,
-          d =  271733878,
-          e = -1009589776;
-
-      /* append padding */
-      x[len >> 5] |= 0x80 << (24 - len % 32);
-      x[((len + 64 >> 9) << 4) + 15] = len;
-
-      for (i = 0; i < x.length; i += 16) {
-        olda = a,
-        oldb = b;
-        oldc = c;
-        oldd = d;
-        olde = e;
-      
-       for (j = 0; j < 80; j+=1)       {
-         if (j < 16) { 
-            w[j] = x[i + j]; 
-          } else { 
-            w[j] = bit_rol(w[j-3] ^ w[j-8] ^ w[j-14] ^ w[j-16], 1); 
-          }
-         t = safe_add(safe_add(bit_rol(a, 5), sha1_ft(j, b, c, d)),
-                                          safe_add(safe_add(e, w[j]), sha1_kt(j)));
-         e = d;
-         d = c;
-         c = bit_rol(b, 30);
-         b = a;
-         a = t;
-       }
-
-       a = safe_add(a, olda);
-       b = safe_add(b, oldb);
-       c = safe_add(c, oldc);
-       d = safe_add(d, oldd);
-       e = safe_add(e, olde);
-      }
-      return Array(a, b, c, d, e);
-    }
-
-    /**
-     * Perform the appropriate triplet combination function for the current
-     * iteration
-     */
-    function sha1_ft(t, b, c, d) {
-      if (t < 20) { return (b & c) | ((~b) & d); }
-      if (t < 40) { return b ^ c ^ d; }
-      if (t < 60) { return (b & c) | (b & d) | (c & d); }
-      return b ^ c ^ d;
-    }
-
-    /**
-     * Determine the appropriate additive constant for the current iteration
-     */
-    function sha1_kt(t) {
-      return (t < 20) ?  1518500249 : (t < 40) ?  1859775393 :
-                (t < 60) ? -1894007588 : -899497514;
-    }
-  },
-  /**
-   * @class Hashes.SHA256
-   * @param {config}
-   * 
-   * A JavaScript implementation of the Secure Hash Algorithm, SHA-256, as defined in FIPS 180-2
-   * Version 2.2 Copyright Angel Marin, Paul Johnston 2000 - 2009.
-   * Other contributors: Greg Holt, Andrew Kepert, Ydnar, Lostinet
-   * See http://pajhome.org.uk/crypt/md5 for details.
-   * Also http://anmar.eu.org/projects/jssha2/
-   */
-  SHA256 : function (options) {
-    /**
-     * Private properties configuration variables. You may need to tweak these to be compatible with
-     * the server-side, but the defaults work in most cases.
-     * @see this.setUpperCase() method
-     * @see this.setPad() method
-     */
-    var hexcase = (options && typeof options.uppercase === 'boolean') ? options.uppercase : false, // hexadecimal output case format. false - lowercase; true - uppercase  */
-              b64pad = (options && typeof options.pad === 'string') ? options.pda : '=', /* base-64 pad character. Default '=' for strict RFC compliance   */
-              utf8 = (options && typeof options.utf8 === 'boolean') ? options.utf8 : true, /* enable/disable utf8 encoding */
-              sha256_K;
-
-    /* privileged (public) methods */
-    this.hex = function (s) { 
-      return rstr2hex(rstr(s, utf8)); 
-    };
-    this.b64 = function (s) { 
-      return rstr2b64(rstr(s, utf8), b64pad);
-    };
-    this.any = function (s, e) { 
-      return rstr2any(rstr(s, utf8), e); 
-    };
-    this.hex_hmac = function (k, d) { 
-      return rstr2hex(rstr_hmac(k, d)); 
-    };
-    this.b64_hmac = function (k, d) { 
-      return rstr2b64(rstr_hmac(k, d), b64pad);
-    };
-    this.any_hmac = function (k, d, e) { 
-      return rstr2any(rstr_hmac(k, d), e); 
-    };
-    /**
-     * Perform a simple self-test to see if the VM is working
-     * @return {String} Hexadecimal hash sample
-     * @public
-     */
-    this.vm_test = function () {
-      return hex('abc').toLowerCase() === '900150983cd24fb0d6963f7d28e17f72';
-    };
-    /** 
-     * Enable/disable uppercase hexadecimal returned string 
-     * @param {boolean} 
-     * @return {Object} this
-     * @public
-     */ 
-    this.setUpperCase = function (a) {
-      if (typeof a === 'boolean') { 
-        hexcase = a;
-      }
-      return this;
-    };
-    /** 
-     * @description Defines a base64 pad string 
-     * @param {string} Pad
-     * @return {Object} this
-     * @public
-     */ 
-    this.setPad = function (a) {
-      b64pad = a || b64pad;
-      return this;
-    };
-    /** 
-     * Defines a base64 pad string 
-     * @param {boolean} 
-     * @return {Object} this
-     * @public
-     */ 
-    this.setUTF8 = function (a) {
-      if (typeof a === 'boolean') {
-        utf8 = a;
-      }
-      return this;
-    };
-    
-    // private methods
-
-    /**
-     * Calculate the SHA-512 of a raw string
-     */
-    function rstr(s, utf8) {
-      s = (utf8) ? utf8Encode(s) : s;
-      return binb2rstr(binb(rstr2binb(s), s.length * 8));
-    }
-
-    /**
-     * Calculate the HMAC-sha256 of a key and some data (raw strings)
-     */
-    function rstr_hmac(key, data) {
-      key = (utf8) ? utf8Encode(key) : key;
-      data = (utf8) ? utf8Encode(data) : data;
-      var hash, i = 0,
-          bkey = rstr2binb(key), 
-          ipad = Array(16), 
-          opad = Array(16);
-
-      if (bkey.length > 16) { bkey = binb(bkey, key.length * 8); }
-      
-      for (; i < 16; i+=1) {
-        ipad[i] = bkey[i] ^ 0x36363636;
-        opad[i] = bkey[i] ^ 0x5C5C5C5C;
-      }
-      
-      hash = binb(ipad.concat(rstr2binb(data)), 512 + data.length * 8);
-      return binb2rstr(binb(opad.concat(hash), 512 + 256));
-    }
-    
-    /*
-     * Main sha256 function, with its support functions
-     */
-    function sha256_S (X, n) {return ( X >>> n ) | (X << (32 - n));}
-    function sha256_R (X, n) {return ( X >>> n );}
-    function sha256_Ch(x, y, z) {return ((x & y) ^ ((~x) & z));}
-    function sha256_Maj(x, y, z) {return ((x & y) ^ (x & z) ^ (y & z));}
-    function sha256_Sigma0256(x) {return (sha256_S(x, 2) ^ sha256_S(x, 13) ^ sha256_S(x, 22));}
-    function sha256_Sigma1256(x) {return (sha256_S(x, 6) ^ sha256_S(x, 11) ^ sha256_S(x, 25));}
-    function sha256_Gamma0256(x) {return (sha256_S(x, 7) ^ sha256_S(x, 18) ^ sha256_R(x, 3));}
-    function sha256_Gamma1256(x) {return (sha256_S(x, 17) ^ sha256_S(x, 19) ^ sha256_R(x, 10));}
-    function sha256_Sigma0512(x) {return (sha256_S(x, 28) ^ sha256_S(x, 34) ^ sha256_S(x, 39));}
-    function sha256_Sigma1512(x) {return (sha256_S(x, 14) ^ sha256_S(x, 18) ^ sha256_S(x, 41));}
-    function sha256_Gamma0512(x) {return (sha256_S(x, 1)  ^ sha256_S(x, 8) ^ sha256_R(x, 7));}
-    function sha256_Gamma1512(x) {return (sha256_S(x, 19) ^ sha256_S(x, 61) ^ sha256_R(x, 6));}
-    
-    sha256_K = [
-      1116352408, 1899447441, -1245643825, -373957723, 961987163, 1508970993,
-      -1841331548, -1424204075, -670586216, 310598401, 607225278, 1426881987,
-      1925078388, -2132889090, -1680079193, -1046744716, -459576895, -272742522,
-      264347078, 604807628, 770255983, 1249150122, 1555081692, 1996064986,
-      -1740746414, -1473132947, -1341970488, -1084653625, -958395405, -710438585,
-      113926993, 338241895, 666307205, 773529912, 1294757372, 1396182291,
-      1695183700, 1986661051, -2117940946, -1838011259, -1564481375, -1474664885,
-      -1035236496, -949202525, -778901479, -694614492, -200395387, 275423344,
-      430227734, 506948616, 659060556, 883997877, 958139571, 1322822218,
-      1537002063, 1747873779, 1955562222, 2024104815, -2067236844, -1933114872,
-      -1866530822, -1538233109, -1090935817, -965641998
-    ];
-    
-    function binb(m, l) {
-      var HASH = [1779033703, -1150833019, 1013904242, -1521486534,
-                 1359893119, -1694144372, 528734635, 1541459225];
-      var W = new Array(64);
-      var a, b, c, d, e, f, g, h;
-      var i, j, T1, T2;
-    
-      /* append padding */
-      m[l >> 5] |= 0x80 << (24 - l % 32);
-      m[((l + 64 >> 9) << 4) + 15] = l;
-    
-      for (i = 0; i < m.length; i += 16)
-      {
-      a = HASH[0];
-      b = HASH[1];
-      c = HASH[2];
-      d = HASH[3];
-      e = HASH[4];
-      f = HASH[5];
-      g = HASH[6];
-      h = HASH[7];
-    
-      for (j = 0; j < 64; j+=1)
-      {
-        if (j < 16) { 
-          W[j] = m[j + i];
-        } else { 
-          W[j] = safe_add(safe_add(safe_add(sha256_Gamma1256(W[j - 2]), W[j - 7]),
-                          sha256_Gamma0256(W[j - 15])), W[j - 16]);
-        }
-    
-        T1 = safe_add(safe_add(safe_add(safe_add(h, sha256_Sigma1256(e)), sha256_Ch(e, f, g)),
-                                  sha256_K[j]), W[j]);
-        T2 = safe_add(sha256_Sigma0256(a), sha256_Maj(a, b, c));
-        h = g;
-        g = f;
-        f = e;
-        e = safe_add(d, T1);
-        d = c;
-        c = b;
-        b = a;
-        a = safe_add(T1, T2);
-      }
-    
-      HASH[0] = safe_add(a, HASH[0]);
-      HASH[1] = safe_add(b, HASH[1]);
-      HASH[2] = safe_add(c, HASH[2]);
-      HASH[3] = safe_add(d, HASH[3]);
-      HASH[4] = safe_add(e, HASH[4]);
-      HASH[5] = safe_add(f, HASH[5]);
-      HASH[6] = safe_add(g, HASH[6]);
-      HASH[7] = safe_add(h, HASH[7]);
-      }
-      return HASH;
-    }
-
-  },
-
-  /**
-   * @class Hashes.SHA512
-   * @param {config}
-   * 
-   * A JavaScript implementation of the Secure Hash Algorithm, SHA-512, as defined in FIPS 180-2
-   * Version 2.2 Copyright Anonymous Contributor, Paul Johnston 2000 - 2009.
-   * Other contributors: Greg Holt, Andrew Kepert, Ydnar, Lostinet
-   * See http://pajhome.org.uk/crypt/md5 for details. 
-   */
-  SHA512 : function (options) {
-    /**
-     * Private properties configuration variables. You may need to tweak these to be compatible with
-     * the server-side, but the defaults work in most cases.
-     * @see this.setUpperCase() method
-     * @see this.setPad() method
-     */
-    var hexcase = (options && typeof options.uppercase === 'boolean') ? options.uppercase : false , /* hexadecimal output case format. false - lowercase; true - uppercase  */
-        b64pad = (options && typeof options.pad === 'string') ? options.pda : '=',  /* base-64 pad character. Default '=' for strict RFC compliance   */
-        utf8 = (options && typeof options.utf8 === 'boolean') ? options.utf8 : true, /* enable/disable utf8 encoding */
-        sha512_k;
-
-    /* privileged (public) methods */
-    this.hex = function (s) { 
-      return rstr2hex(rstr(s)); 
-    };
-    this.b64 = function (s) { 
-      return rstr2b64(rstr(s), b64pad);  
-    };
-    this.any = function (s, e) { 
-      return rstr2any(rstr(s), e);
-    };
-    this.hex_hmac = function (k, d) {
-      return rstr2hex(rstr_hmac(k, d));
-    };
-    this.b64_hmac = function (k, d) { 
-      return rstr2b64(rstr_hmac(k, d), b64pad);
-    };
-    this.any_hmac = function (k, d, e) { 
-      return rstr2any(rstr_hmac(k, d), e);
-    };
-    /**
-     * Perform a simple self-test to see if the VM is working
-     * @return {String} Hexadecimal hash sample
-     * @public
-     */
-    this.vm_test = function () {
-      return hex('abc').toLowerCase() === '900150983cd24fb0d6963f7d28e17f72';
-    };
-    /** 
-     * @description Enable/disable uppercase hexadecimal returned string 
-     * @param {boolean} 
-     * @return {Object} this
-     * @public
-     */ 
-    this.setUpperCase = function (a) {
-      if (typeof a === 'boolean') {
-        hexcase = a;
-      }
-      return this;
-    };
-    /** 
-     * @description Defines a base64 pad string 
-     * @param {string} Pad
-     * @return {Object} this
-     * @public
-     */ 
-    this.setPad = function (a) {
-      b64pad = a || b64pad;
-      return this;
-    };
-    /** 
-     * @description Defines a base64 pad string 
-     * @param {boolean} 
-     * @return {Object} this
-     * @public
-     */ 
-    this.setUTF8 = function (a) {
-      if (typeof a === 'boolean') {
-        utf8 = a;
-      }
-      return this;
-    };
-
-    /* private methods */
-    
-    /**
-     * Calculate the SHA-512 of a raw string
-     */
-    function rstr(s) {
-      s = (utf8) ? utf8Encode(s) : s;
-      return binb2rstr(binb(rstr2binb(s), s.length * 8));
-    }
-    /*
-     * Calculate the HMAC-SHA-512 of a key and some data (raw strings)
-     */
-    function rstr_hmac(key, data) {
-      key = (utf8) ? utf8Encode(key) : key;
-      data = (utf8) ? utf8Encode(data) : data;
-      
-      var hash, i = 0, 
-          bkey = rstr2binb(key),
-          ipad = Array(32), opad = Array(32);
-
-      if (bkey.length > 32) { bkey = binb(bkey, key.length * 8); }
-      
-      for (; i < 32; i+=1) {
-        ipad[i] = bkey[i] ^ 0x36363636;
-        opad[i] = bkey[i] ^ 0x5C5C5C5C;
-      }
-      
-      hash = binb(ipad.concat(rstr2binb(data)), 1024 + data.length * 8);
-      return binb2rstr(binb(opad.concat(hash), 1024 + 512));
-    }
-            
-    /**
-     * Calculate the SHA-512 of an array of big-endian dwords, and a bit length
-     */
-    function binb(x, len) {
-      var j, i, l,
-          W = new Array(80),
-          hash = new Array(16),
-          //Initial hash values
-          H = [
-            new int64(0x6a09e667, -205731576),
-            new int64(-1150833019, -2067093701),
-            new int64(0x3c6ef372, -23791573),
-            new int64(-1521486534, 0x5f1d36f1),
-            new int64(0x510e527f, -1377402159),
-            new int64(-1694144372, 0x2b3e6c1f),
-            new int64(0x1f83d9ab, -79577749),
-            new int64(0x5be0cd19, 0x137e2179)
-          ],
-          T1 = new int64(0, 0),
-          T2 = new int64(0, 0),
-          a = new int64(0,0),
-          b = new int64(0,0),
-          c = new int64(0,0),
-          d = new int64(0,0),
-          e = new int64(0,0),
-          f = new int64(0,0),
-          g = new int64(0,0),
-          h = new int64(0,0),
-          //Temporary variables not specified by the document
-          s0 = new int64(0, 0),
-          s1 = new int64(0, 0),
-          Ch = new int64(0, 0),
-          Maj = new int64(0, 0),
-          r1 = new int64(0, 0),
-          r2 = new int64(0, 0),
-          r3 = new int64(0, 0);
-
-      if (sha512_k === undefined) {
-          //SHA512 constants
-          sha512_k = [
-            new int64(0x428a2f98, -685199838), new int64(0x71374491, 0x23ef65cd),
-            new int64(-1245643825, -330482897), new int64(-373957723, -2121671748),
-            new int64(0x3956c25b, -213338824), new int64(0x59f111f1, -1241133031),
-            new int64(-1841331548, -1357295717), new int64(-1424204075, -630357736),
-            new int64(-670586216, -1560083902), new int64(0x12835b01, 0x45706fbe),
-            new int64(0x243185be, 0x4ee4b28c), new int64(0x550c7dc3, -704662302),
-            new int64(0x72be5d74, -226784913), new int64(-2132889090, 0x3b1696b1),
-            new int64(-1680079193, 0x25c71235), new int64(-1046744716, -815192428),
-            new int64(-459576895, -1628353838), new int64(-272742522, 0x384f25e3),
-            new int64(0xfc19dc6, -1953704523), new int64(0x240ca1cc, 0x77ac9c65),
-            new int64(0x2de92c6f, 0x592b0275), new int64(0x4a7484aa, 0x6ea6e483),
-            new int64(0x5cb0a9dc, -1119749164), new int64(0x76f988da, -2096016459),
-            new int64(-1740746414, -295247957), new int64(-1473132947, 0x2db43210),
-            new int64(-1341970488, -1728372417), new int64(-1084653625, -1091629340),
-            new int64(-958395405, 0x3da88fc2), new int64(-710438585, -1828018395),
-            new int64(0x6ca6351, -536640913), new int64(0x14292967, 0xa0e6e70),
-            new int64(0x27b70a85, 0x46d22ffc), new int64(0x2e1b2138, 0x5c26c926),
-            new int64(0x4d2c6dfc, 0x5ac42aed), new int64(0x53380d13, -1651133473),
-            new int64(0x650a7354, -1951439906), new int64(0x766a0abb, 0x3c77b2a8),
-            new int64(-2117940946, 0x47edaee6), new int64(-1838011259, 0x1482353b),
-            new int64(-1564481375, 0x4cf10364), new int64(-1474664885, -1136513023),
-            new int64(-1035236496, -789014639), new int64(-949202525, 0x654be30),
-            new int64(-778901479, -688958952), new int64(-694614492, 0x5565a910),
-            new int64(-200395387, 0x5771202a), new int64(0x106aa070, 0x32bbd1b8),
-            new int64(0x19a4c116, -1194143544), new int64(0x1e376c08, 0x5141ab53),
-            new int64(0x2748774c, -544281703), new int64(0x34b0bcb5, -509917016),
-            new int64(0x391c0cb3, -976659869), new int64(0x4ed8aa4a, -482243893),
-            new int64(0x5b9cca4f, 0x7763e373), new int64(0x682e6ff3, -692930397),
-            new int64(0x748f82ee, 0x5defb2fc), new int64(0x78a5636f, 0x43172f60),
-            new int64(-2067236844, -1578062990), new int64(-1933114872, 0x1a6439ec),
-            new int64(-1866530822, 0x23631e28), new int64(-1538233109, -561857047),
-            new int64(-1090935817, -1295615723), new int64(-965641998, -479046869),
-            new int64(-903397682, -366583396), new int64(-779700025, 0x21c0c207),
-            new int64(-354779690, -840897762), new int64(-176337025, -294727304),
-            new int64(0x6f067aa, 0x72176fba), new int64(0xa637dc5, -1563912026),
-            new int64(0x113f9804, -1090974290), new int64(0x1b710b35, 0x131c471b),
-            new int64(0x28db77f5, 0x23047d84), new int64(0x32caab7b, 0x40c72493),
-            new int64(0x3c9ebe0a, 0x15c9bebc), new int64(0x431d67c4, -1676669620),
-            new int64(0x4cc5d4be, -885112138), new int64(0x597f299c, -60457430),
-            new int64(0x5fcb6fab, 0x3ad6faec), new int64(0x6c44198c, 0x4a475817)
-          ];
-      }
-  
-      for (i=0; i<80; i+=1) {
-        W[i] = new int64(0, 0);
-      }
-    
-      // append padding to the source string. The format is described in the FIPS.
-      x[len >> 5] |= 0x80 << (24 - (len & 0x1f));
-      x[((len + 128 >> 10)<< 5) + 31] = len;
-      l = x.length;
-      for (i = 0; i<l; i+=32) { //32 dwords is the block size
-        int64copy(a, H[0]);
-        int64copy(b, H[1]);
-        int64copy(c, H[2]);
-        int64copy(d, H[3]);
-        int64copy(e, H[4]);
-        int64copy(f, H[5]);
-        int64copy(g, H[6]);
-        int64copy(h, H[7]);
-      
-        for (j=0; j<16; j+=1) {
-          W[j].h = x[i + 2*j];
-          W[j].l = x[i + 2*j + 1];
-        }
-      
-        for (j=16; j<80; j+=1) {
-          //sigma1
-          int64rrot(r1, W[j-2], 19);
-          int64revrrot(r2, W[j-2], 29);
-          int64shr(r3, W[j-2], 6);
-          s1.l = r1.l ^ r2.l ^ r3.l;
-          s1.h = r1.h ^ r2.h ^ r3.h;
-          //sigma0
-          int64rrot(r1, W[j-15], 1);
-          int64rrot(r2, W[j-15], 8);
-          int64shr(r3, W[j-15], 7);
-          s0.l = r1.l ^ r2.l ^ r3.l;
-          s0.h = r1.h ^ r2.h ^ r3.h;
-      
-          int64add4(W[j], s1, W[j-7], s0, W[j-16]);
-        }
-      
-        for (j = 0; j < 80; j+=1) {
-          //Ch
-          Ch.l = (e.l & f.l) ^ (~e.l & g.l);
-          Ch.h = (e.h & f.h) ^ (~e.h & g.h);
-      
-          //Sigma1
-          int64rrot(r1, e, 14);
-          int64rrot(r2, e, 18);
-          int64revrrot(r3, e, 9);
-          s1.l = r1.l ^ r2.l ^ r3.l;
-          s1.h = r1.h ^ r2.h ^ r3.h;
-      
-          //Sigma0
-          int64rrot(r1, a, 28);
-          int64revrrot(r2, a, 2);
-          int64revrrot(r3, a, 7);
-          s0.l = r1.l ^ r2.l ^ r3.l;
-          s0.h = r1.h ^ r2.h ^ r3.h;
-      
-          //Maj
-          Maj.l = (a.l & b.l) ^ (a.l & c.l) ^ (b.l & c.l);
-          Maj.h = (a.h & b.h) ^ (a.h & c.h) ^ (b.h & c.h);
-      
-          int64add5(T1, h, s1, Ch, sha512_k[j], W[j]);
-          int64add(T2, s0, Maj);
-      
-          int64copy(h, g);
-          int64copy(g, f);
-          int64copy(f, e);
-          int64add(e, d, T1);
-          int64copy(d, c);
-          int64copy(c, b);
-          int64copy(b, a);
-          int64add(a, T1, T2);
-        }
-        int64add(H[0], H[0], a);
-        int64add(H[1], H[1], b);
-        int64add(H[2], H[2], c);
-        int64add(H[3], H[3], d);
-        int64add(H[4], H[4], e);
-        int64add(H[5], H[5], f);
-        int64add(H[6], H[6], g);
-        int64add(H[7], H[7], h);
-      }
-    
-      //represent the hash as an array of 32-bit dwords
-      for (i=0; i<8; i+=1) {
-        hash[2*i] = H[i].h;
-        hash[2*i + 1] = H[i].l;
-      }
-      return hash;
-    }
-    
-    //A constructor for 64-bit numbers
-    function int64(h, l) {
-      this.h = h;
-      this.l = l;
-      //this.toString = int64toString;
-    }
-    
-    //Copies src into dst, assuming both are 64-bit numbers
-    function int64copy(dst, src) {
-      dst.h = src.h;
-      dst.l = src.l;
-    }
-    
-    //Right-rotates a 64-bit number by shift
-    //Won't handle cases of shift>=32
-    //The function revrrot() is for that
-    function int64rrot(dst, x, shift) {
-      dst.l = (x.l >>> shift) | (x.h << (32-shift));
-      dst.h = (x.h >>> shift) | (x.l << (32-shift));
-    }
-    
-    //Reverses the dwords of the source and then rotates right by shift.
-    //This is equivalent to rotation by 32+shift
-    function int64revrrot(dst, x, shift) {
-      dst.l = (x.h >>> shift) | (x.l << (32-shift));
-      dst.h = (x.l >>> shift) | (x.h << (32-shift));
-    }
-    
-    //Bitwise-shifts right a 64-bit number by shift
-    //Won't handle shift>=32, but it's never needed in SHA512
-    function int64shr(dst, x, shift) {
-      dst.l = (x.l >>> shift) | (x.h << (32-shift));
-      dst.h = (x.h >>> shift);
-    }
-    
-    //Adds two 64-bit numbers
-    //Like the original implementation, does not rely on 32-bit operations
-    function int64add(dst, x, y) {
-       var w0 = (x.l & 0xffff) + (y.l & 0xffff);
-       var w1 = (x.l >>> 16) + (y.l >>> 16) + (w0 >>> 16);
-       var w2 = (x.h & 0xffff) + (y.h & 0xffff) + (w1 >>> 16);
-       var w3 = (x.h >>> 16) + (y.h >>> 16) + (w2 >>> 16);
-       dst.l = (w0 & 0xffff) | (w1 << 16);
-       dst.h = (w2 & 0xffff) | (w3 << 16);
-    }
-    
-    //Same, except with 4 addends. Works faster than adding them one by one.
-    function int64add4(dst, a, b, c, d) {
-       var w0 = (a.l & 0xffff) + (b.l & 0xffff) + (c.l & 0xffff) + (d.l & 0xffff);
-       var w1 = (a.l >>> 16) + (b.l >>> 16) + (c.l >>> 16) + (d.l >>> 16) + (w0 >>> 16);
-       var w2 = (a.h & 0xffff) + (b.h & 0xffff) + (c.h & 0xffff) + (d.h & 0xffff) + (w1 >>> 16);
-       var w3 = (a.h >>> 16) + (b.h >>> 16) + (c.h >>> 16) + (d.h >>> 16) + (w2 >>> 16);
-       dst.l = (w0 & 0xffff) | (w1 << 16);
-       dst.h = (w2 & 0xffff) | (w3 << 16);
-    }
-    
-    //Same, except with 5 addends
-    function int64add5(dst, a, b, c, d, e) {
-      var w0 = (a.l & 0xffff) + (b.l & 0xffff) + (c.l & 0xffff) + (d.l & 0xffff) + (e.l & 0xffff),
-          w1 = (a.l >>> 16) + (b.l >>> 16) + (c.l >>> 16) + (d.l >>> 16) + (e.l >>> 16) + (w0 >>> 16),
-          w2 = (a.h & 0xffff) + (b.h & 0xffff) + (c.h & 0xffff) + (d.h & 0xffff) + (e.h & 0xffff) + (w1 >>> 16),
-          w3 = (a.h >>> 16) + (b.h >>> 16) + (c.h >>> 16) + (d.h >>> 16) + (e.h >>> 16) + (w2 >>> 16);
-       dst.l = (w0 & 0xffff) | (w1 << 16);
-       dst.h = (w2 & 0xffff) | (w3 << 16);
-    }
-  },
-  /**
-   * @class Hashes.RMD160
-   * @constructor
-   * @param {Object} [config]
-   * 
-   * A JavaScript implementation of the RIPEMD-160 Algorithm
-   * Version 2.2 Copyright Jeremy Lin, Paul Johnston 2000 - 2009.
-   * Other contributors: Greg Holt, Andrew Kepert, Ydnar, Lostinet
-   * See http://pajhome.org.uk/crypt/md5 for details.
-   * Also http://www.ocf.berkeley.edu/~jjlin/jsotp/
-   */
-  RMD160 : function (options) {
-    /**
-     * Private properties configuration variables. You may need to tweak these to be compatible with
-     * the server-side, but the defaults work in most cases.
-     * @see this.setUpperCase() method
-     * @see this.setPad() method
-     */
-    var hexcase = (options && typeof options.uppercase === 'boolean') ? options.uppercase : false,   /* hexadecimal output case format. false - lowercase; true - uppercase  */
-        b64pad = (options && typeof options.pad === 'string') ? options.pda : '=',  /* base-64 pad character. Default '=' for strict RFC compliance   */
-        utf8 = (options && typeof options.utf8 === 'boolean') ? options.utf8 : true, /* enable/disable utf8 encoding */
-        rmd160_r1 = [
-           0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15,
-           7,  4, 13,  1, 10,  6, 15,  3, 12,  0,  9,  5,  2, 14, 11,  8,
-           3, 10, 14,  4,  9, 15,  8,  1,  2,  7,  0,  6, 13, 11,  5, 12,
-           1,  9, 11, 10,  0,  8, 12,  4, 13,  3,  7, 15, 14,  5,  6,  2,
-           4,  0,  5,  9,  7, 12,  2, 10, 14,  1,  3,  8, 11,  6, 15, 13
-        ],
-        rmd160_r2 = [
-           5, 14,  7,  0,  9,  2, 11,  4, 13,  6, 15,  8,  1, 10,  3, 12,
-           6, 11,  3,  7,  0, 13,  5, 10, 14, 15,  8, 12,  4,  9,  1,  2,
-          15,  5,  1,  3,  7, 14,  6,  9, 11,  8, 12,  2, 10,  0,  4, 13,
-           8,  6,  4,  1,  3, 11, 15,  0,  5, 12,  2, 13,  9,  7, 10, 14,
-          12, 15, 10,  4,  1,  5,  8,  7,  6,  2, 13, 14,  0,  3,  9, 11
-        ],
-        rmd160_s1 = [
-          11, 14, 15, 12,  5,  8,  7,  9, 11, 13, 14, 15,  6,  7,  9,  8,
-           7,  6,  8, 13, 11,  9,  7, 15,  7, 12, 15,  9, 11,  7, 13, 12,
-          11, 13,  6,  7, 14,  9, 13, 15, 14,  8, 13,  6,  5, 12,  7,  5,
-          11, 12, 14, 15, 14, 15,  9,  8,  9, 14,  5,  6,  8,  6,  5, 12,
-           9, 15,  5, 11,  6,  8, 13, 12,  5, 12, 13, 14, 11,  8,  5,  6
-        ],
-        rmd160_s2 = [
-           8,  9,  9, 11, 13, 15, 15,  5,  7,  7,  8, 11, 14, 14, 12,  6,
-           9, 13, 15,  7, 12,  8,  9, 11,  7,  7, 12,  7,  6, 15, 13, 11,
-           9,  7, 15, 11,  8,  6,  6, 14, 12, 13,  5, 14, 13, 13,  7,  5,
-          15,  5,  8, 11, 14, 14,  6, 14,  6,  9, 12,  9, 12,  5, 15,  8,
-           8,  5, 12,  9, 12,  5, 14,  6,  8, 13,  6,  5, 15, 13, 11, 11
-        ];
-
-    /* privileged (public) methods */
-    this.hex = function (s) {
-      return rstr2hex(rstr(s, utf8)); 
-    };
-    this.b64 = function (s) {
-      return rstr2b64(rstr(s, utf8), b64pad);
-    };
-    this.any = function (s, e) { 
-      return rstr2any(rstr(s, utf8), e);
-    };
-    this.hex_hmac = function (k, d) { 
-      return rstr2hex(rstr_hmac(k, d));
-    };
-    this.b64_hmac = function (k, d) { 
-      return rstr2b64(rstr_hmac(k, d), b64pad);
-    };
-    this.any_hmac = function (k, d, e) { 
-      return rstr2any(rstr_hmac(k, d), e); 
-    };
-    /**
-     * Perform a simple self-test to see if the VM is working
-     * @return {String} Hexadecimal hash sample
-     * @public
-     */
-    this.vm_test = function () {
-      return hex('abc').toLowerCase() === '900150983cd24fb0d6963f7d28e17f72';
-    };
-    /** 
-     * @description Enable/disable uppercase hexadecimal returned string 
-     * @param {boolean} 
-     * @return {Object} this
-     * @public
-     */ 
-    this.setUpperCase = function (a) {
-      if (typeof a === 'boolean' ) { hexcase = a; }
-      return this;
-    };
-    /** 
-     * @description Defines a base64 pad string 
-     * @param {string} Pad
-     * @return {Object} this
-     * @public
-     */ 
-    this.setPad = function (a) {
-      if (typeof a !== 'undefined' ) { b64pad = a; }
-      return this;
-    };
-    /** 
-     * @description Defines a base64 pad string 
-     * @param {boolean} 
-     * @return {Object} this
-     * @public
-     */ 
-    this.setUTF8 = function (a) {
-      if (typeof a === 'boolean') { utf8 = a; }
-      return this;
-    };
-
-    /* private methods */
-
-    /**
-     * Calculate the rmd160 of a raw string
-     */
-    function rstr(s) {
-      s = (utf8) ? utf8Encode(s) : s;
-      return binl2rstr(binl(rstr2binl(s), s.length * 8));
-    }
-
-    /**
-     * Calculate the HMAC-rmd160 of a key and some data (raw strings)
-     */
-    function rstr_hmac(key, data) {
-      key = (utf8) ? utf8Encode(key) : key;
-      data = (utf8) ? utf8Encode(data) : data;
-      var i, hash,
-          bkey = rstr2binl(key),
-          ipad = Array(16), opad = Array(16);
-
-      if (bkey.length > 16) { 
-        bkey = binl(bkey, key.length * 8); 
-      }
-      
-      for (i = 0; i < 16; i+=1) {
-        ipad[i] = bkey[i] ^ 0x36363636;
-        opad[i] = bkey[i] ^ 0x5C5C5C5C;
-      }
-      hash = binl(ipad.concat(rstr2binl(data)), 512 + data.length * 8);
-      return binl2rstr(binl(opad.concat(hash), 512 + 160));
-    }
-
-    /**
-     * Convert an array of little-endian words to a string
-     */
-    function binl2rstr(input) {
-      var i, output = '', l = input.length * 32;
-      for (i = 0; i < l; i += 8) {
-        output += String.fromCharCode((input[i>>5] >>> (i % 32)) & 0xFF);
-      }
-      return output;
-    }
-
-    /**
-     * Calculate the RIPE-MD160 of an array of little-endian words, and a bit length.
-     */
-    function binl(x, len) {
-      var T, j, i, l,
-          h0 = 0x67452301,
-          h1 = 0xefcdab89,
-          h2 = 0x98badcfe,
-          h3 = 0x10325476,
-          h4 = 0xc3d2e1f0,
-          A1, B1, C1, D1, E1,
-          A2, B2, C2, D2, E2;
-
-      /* append padding */
-      x[len >> 5] |= 0x80 << (len % 32);
-      x[(((len + 64) >>> 9) << 4) + 14] = len;
-      l = x.length;
-      
-      for (i = 0; i < l; i+=16) {
-        A1 = A2 = h0; B1 = B2 = h1; C1 = C2 = h2; D1 = D2 = h3; E1 = E2 = h4;
-        for (j = 0; j <= 79; j+=1) {
-          T = safe_add(A1, rmd160_f(j, B1, C1, D1));
-          T = safe_add(T, x[i + rmd160_r1[j]]);
-          T = safe_add(T, rmd160_K1(j));
-          T = safe_add(bit_rol(T, rmd160_s1[j]), E1);
-          A1 = E1; E1 = D1; D1 = bit_rol(C1, 10); C1 = B1; B1 = T;
-          T = safe_add(A2, rmd160_f(79-j, B2, C2, D2));
-          T = safe_add(T, x[i + rmd160_r2[j]]);
-          T = safe_add(T, rmd160_K2(j));
-          T = safe_add(bit_rol(T, rmd160_s2[j]), E2);
-          A2 = E2; E2 = D2; D2 = bit_rol(C2, 10); C2 = B2; B2 = T;
-        }
-
-        T = safe_add(h1, safe_add(C1, D2));
-        h1 = safe_add(h2, safe_add(D1, E2));
-        h2 = safe_add(h3, safe_add(E1, A2));
-        h3 = safe_add(h4, safe_add(A1, B2));
-        h4 = safe_add(h0, safe_add(B1, C2));
-        h0 = T;
-      }
-      return [h0, h1, h2, h3, h4];
-    }
-
-    // specific algorithm methods 
-    function rmd160_f(j, x, y, z) {
-      return ( 0 <= j && j <= 15) ? (x ^ y ^ z) :
-         (16 <= j && j <= 31) ? (x & y) | (~x & z) :
-         (32 <= j && j <= 47) ? (x | ~y) ^ z :
-         (48 <= j && j <= 63) ? (x & z) | (y & ~z) :
-         (64 <= j && j <= 79) ? x ^ (y | ~z) :
-         'rmd160_f: j out of range';
-    }
-
-    function rmd160_K1(j) {
-      return ( 0 <= j && j <= 15) ? 0x00000000 :
-         (16 <= j && j <= 31) ? 0x5a827999 :
-         (32 <= j && j <= 47) ? 0x6ed9eba1 :
-         (48 <= j && j <= 63) ? 0x8f1bbcdc :
-         (64 <= j && j <= 79) ? 0xa953fd4e :
-         'rmd160_K1: j out of range';
-    }
-
-    function rmd160_K2(j){
-      return ( 0 <= j && j <= 15) ? 0x50a28be6 :
-         (16 <= j && j <= 31) ? 0x5c4dd124 :
-         (32 <= j && j <= 47) ? 0x6d703ef3 :
-         (48 <= j && j <= 63) ? 0x7a6d76e9 :
-         (64 <= j && j <= 79) ? 0x00000000 :
-         'rmd160_K2: j out of range';
-    }
-  }
-};
-
-  // exposes Hashes
-  (function( window, undefined ) {
-    var freeExports = false;
-    if (typeof exports === 'object' ) {
-      freeExports = exports;
-      if (exports && typeof global === 'object' && global && global === global.global ) { window = global; }
-    }
-
-    if (typeof define === 'function' && typeof define.amd === 'object' && define.amd) {
-      // define as an anonymous module, so, through path mapping, it can be aliased
-      define(function () { return Hashes; });
-    }
-    else if ( freeExports ) {
-      // in Node.js or RingoJS v0.8.0+
-      if ( typeof module === 'object' && module && module.exports === freeExports ) {
-        module.exports = Hashes;
-      }
-      // in Narwhal or RingoJS v0.7.0-
-      else {
-        freeExports.Hashes = Hashes;
-      }
-    }
-    else {
-      // in a browser or Rhino
-      window.Hashes = Hashes;
-    }
-  }( this ));
-}()); // IIFE
-
-})(window)
-},{}],2:[function(require,module,exports){
-'use strict';
-
-var hashes = require('jshashes'),
-    xtend = require('xtend'),
-    sha1 = new hashes.SHA1();
-
-var ohauth = {};
-
-ohauth.qsString = function(obj) {
-    return Object.keys(obj).sort().map(function(key) {
-        return ohauth.percentEncode(key) + '=' +
-            ohauth.percentEncode(obj[key]);
-    }).join('&');
-};
-
-ohauth.stringQs = function(str) {
-    return str.split('&').reduce(function(obj, pair){
-        var parts = pair.split('=');
-        obj[decodeURIComponent(parts[0])] = (null === parts[1]) ?
-            '' : decodeURIComponent(parts[1]);
-        return obj;
-    }, {});
-};
-
-ohauth.rawxhr = function(method, url, data, headers, callback) {
-    var xhr = new XMLHttpRequest(),
-        twoHundred = /^20\d$/;
-    xhr.onreadystatechange = function() {
-        if (4 == xhr.readyState && 0 !== xhr.status) {
-            if (twoHundred.test(xhr.status)) callback(null, xhr);
-            else return callback(xhr, null);
-        }
-    };
-    xhr.onerror = function(e) { return callback(e, null); };
-    xhr.open(method, url, true);
-    for (var h in headers) xhr.setRequestHeader(h, headers[h]);
-    xhr.send(data);
-};
-
-ohauth.xhr = function(method, url, auth, data, options, callback) {
-    var headers = (options && options.header) || {
-        'Content-Type': 'application/x-www-form-urlencoded'
-    };
-    headers.Authorization = 'OAuth ' + ohauth.authHeader(auth);
-    ohauth.rawxhr(method, url, data, headers, callback);
-};
-
-ohauth.nonce = function() {
-    for (var o = ''; o.length < 6;) {
-        o += '0123456789ABCDEFGHIJKLMNOPQRSTUVWXTZabcdefghiklmnopqrstuvwxyz'[Math.floor(Math.random() * 61)];
-    }
-    return o;
-};
-
-ohauth.authHeader = function(obj) {
-    return Object.keys(obj).sort().map(function(key) {
-        return encodeURIComponent(key) + '="' + encodeURIComponent(obj[key]) + '"';
-    }).join(', ');
-};
-
-ohauth.timestamp = function() { return ~~((+new Date()) / 1000); };
-
-ohauth.percentEncode = function(s) {
-    return encodeURIComponent(s)
-        .replace(/\!/g, '%21').replace(/\'/g, '%27')
-        .replace(/\*/g, '%2A').replace(/\(/g, '%28').replace(/\)/g, '%29');
-};
-
-ohauth.baseString = function(method, url, params) {
-    if (params.oauth_signature) delete params.oauth_signature;
-    return [
-        method,
-        ohauth.percentEncode(url),
-        ohauth.percentEncode(ohauth.qsString(params))].join('&');
-};
-
-ohauth.signature = function(oauth_secret, token_secret, baseString) {
-    return sha1.b64_hmac(
-        ohauth.percentEncode(oauth_secret) + '&' +
-        ohauth.percentEncode(token_secret),
-        baseString);
-};
-
-/**
- * Takes an options object for configuration (consumer_key,
- * consumer_secret, version, signature_method, token) and returns a
- * function that generates the Authorization header for given data.
- *
- * The returned function takes these parameters:
- * - method: GET/POST/...
- * - uri: full URI with protocol, port, path and query string
- * - extra_params: any extra parameters (that are passed in the POST data),
- *   can be an object or a from-urlencoded string.
- *
- * Returned function returns full OAuth header with "OAuth" string in it.
- */
-
-ohauth.headerGenerator = function(options) {
-    options = options || {};
-    var consumer_key = options.consumer_key || '',
-        consumer_secret = options.consumer_secret || '',
-        signature_method = options.signature_method || 'HMAC-SHA1',
-        version = options.version || '1.0',
-        token = options.token || '';
-
-    return function(method, uri, extra_params) {
-        method = method.toUpperCase();
-        if (typeof extra_params === 'string' && extra_params.length > 0) {
-            extra_params = ohauth.stringQs(extra_params);
-        }
-
-        var uri_parts = uri.split('?', 2),
-        base_uri = uri_parts[0];
-
-        var query_params = uri_parts.length === 2 ?
-            ohauth.stringQs(uri_parts[1]) : {};
-
-        var oauth_params = {
-            oauth_consumer_key: consumer_key,
-            oauth_signature_method: signature_method,
-            oauth_version: version,
-            oauth_timestamp: ohauth.timestamp(),
-            oauth_nonce: ohauth.nonce()
-        };
-
-        if (token) oauth_params.oauth_token = token;
-
-        var all_params = xtend({}, oauth_params, query_params, extra_params),
-            base_str = ohauth.baseString(method, base_uri, all_params);
-
-        oauth_params.oauth_signature = ohauth.signature(consumer_secret, token, base_str);
-
-        return 'OAuth ' + ohauth.authHeader(oauth_params);
-    };
-};
-
-module.exports = ohauth;
-
-},{"jshashes":7,"xtend":4}],6:[function(require,module,exports){
-module.exports = Object.keys || require('./shim');
-
-
-},{"./shim":8}],8:[function(require,module,exports){
-(function () {
-       "use strict";
-
-       // modified from https://github.com/kriskowal/es5-shim
-       var has = Object.prototype.hasOwnProperty,
-               is = require('is'),
-               forEach = require('foreach'),
-               hasDontEnumBug = !({'toString': null}).propertyIsEnumerable('toString'),
-               dontEnums = [
-                       "toString",
-                       "toLocaleString",
-                       "valueOf",
-                       "hasOwnProperty",
-                       "isPrototypeOf",
-                       "propertyIsEnumerable",
-                       "constructor"
-               ],
-               keysShim;
-
-       keysShim = function keys(object) {
-               if (!is.object(object) && !is.array(object)) {
-                       throw new TypeError("Object.keys called on a non-object");
-               }
-
-               var name, theKeys = [];
-               for (name in object) {
-                       if (has.call(object, name)) {
-                               theKeys.push(name);
-                       }
-               }
-
-               if (hasDontEnumBug) {
-                       forEach(dontEnums, function (dontEnum) {
-                               if (has.call(object, dontEnum)) {
-                                       theKeys.push(dontEnum);
-                               }
-                       });
-               }
-               return theKeys;
+       var engine = storeEngine;
+       var storages = all;
+       var plugins = [json2];
+       var store_legacy = engine.createStore(storages, plugins);
+
+       var immutable = extend;
+       var hasOwnProperty = Object.prototype.hasOwnProperty;
+
+       function extend() {
+         var target = {};
+
+         for (var i = 0; i < arguments.length; i++) {
+           var source = arguments[i];
+
+           for (var key in source) {
+             if (hasOwnProperty.call(source, key)) {
+               target[key] = source[key];
+             }
+           }
+         }
+
+         return target;
+       }
+
+       var ohauth = ohauth_1;
+       var resolveUrl = resolveUrl$1.exports;
+       var store = store_legacy;
+       var xtend = immutable; // # osm-auth
+       //
+       // This code is only compatible with IE10+ because the [XDomainRequest](http://bit.ly/LfO7xo)
+       // object, IE<10's idea of [CORS](http://en.wikipedia.org/wiki/Cross-origin_resource_sharing),
+       // does not support custom headers, which this uses everywhere.
+
+       var osmAuth = function osmAuth(o) {
+         var oauth = {}; // authenticated users will also have a request token secret, but it's
+         // not used in transactions with the server
+
+         oauth.authenticated = function () {
+           return !!(token('oauth_token') && token('oauth_token_secret'));
+         };
+
+         oauth.logout = function () {
+           token('oauth_token', '');
+           token('oauth_token_secret', '');
+           token('oauth_request_token_secret', '');
+           return oauth;
+         }; // TODO: detect lack of click event
+
+
+         oauth.authenticate = function (callback) {
+           if (oauth.authenticated()) return callback();
+           oauth.logout(); // ## Getting a request token
+
+           var params = timenonce(getAuth(o)),
+               url = o.url + '/oauth/request_token';
+           params.oauth_signature = ohauth.signature(o.oauth_secret, '', ohauth.baseString('POST', url, params));
+
+           if (!o.singlepage) {
+             // Create a 600x550 popup window in the center of the screen
+             var w = 600,
+                 h = 550,
+                 settings = [['width', w], ['height', h], ['left', screen.width / 2 - w / 2], ['top', screen.height / 2 - h / 2]].map(function (x) {
+               return x.join('=');
+             }).join(','),
+                 popup = window.open('about:blank', 'oauth_window', settings);
+             oauth.popupWindow = popup;
+
+             if (!popup) {
+               var error = new Error('Popup was blocked');
+               error.status = 'popup-blocked';
+               throw error;
+             }
+           } // Request a request token. When this is complete, the popup
+           // window is redirected to OSM's authorization page.
+
+
+           ohauth.xhr('POST', url, params, null, {}, reqTokenDone);
+           o.loading();
+
+           function reqTokenDone(err, xhr) {
+             o.done();
+             if (err) return callback(err);
+             var resp = ohauth.stringQs(xhr.response);
+             token('oauth_request_token_secret', resp.oauth_token_secret);
+             var authorize_url = o.url + '/oauth/authorize?' + ohauth.qsString({
+               oauth_token: resp.oauth_token,
+               oauth_callback: resolveUrl(o.landing)
+             });
+
+             if (o.singlepage) {
+               location.href = authorize_url;
+             } else {
+               popup.location = authorize_url;
+             }
+           } // Called by a function in a landing page, in the popup window. The
+           // window closes itself.
+
+
+           window.authComplete = function (token) {
+             var oauth_token = ohauth.stringQs(token.split('?')[1]);
+             get_access_token(oauth_token.oauth_token);
+             delete window.authComplete;
+           }; // ## Getting an request token
+           //
+           // At this point we have an `oauth_token`, brought in from a function
+           // call on a landing page popup.
+
+
+           function get_access_token(oauth_token) {
+             var url = o.url + '/oauth/access_token',
+                 params = timenonce(getAuth(o)),
+                 request_token_secret = token('oauth_request_token_secret');
+             params.oauth_token = oauth_token;
+             params.oauth_signature = ohauth.signature(o.oauth_secret, request_token_secret, ohauth.baseString('POST', url, params)); // ## Getting an access token
+             //
+             // The final token required for authentication. At this point
+             // we have a `request token secret`
+
+             ohauth.xhr('POST', url, params, null, {}, accessTokenDone);
+             o.loading();
+           }
+
+           function accessTokenDone(err, xhr) {
+             o.done();
+             if (err) return callback(err);
+             var access_token = ohauth.stringQs(xhr.response);
+             token('oauth_token', access_token.oauth_token);
+             token('oauth_token_secret', access_token.oauth_token_secret);
+             callback(null, oauth);
+           }
+         };
+
+         oauth.bringPopupWindowToFront = function () {
+           var brougtPopupToFront = false;
+
+           try {
+             // This may cause a cross-origin error:
+             // `DOMException: Blocked a frame with origin "..." from accessing a cross-origin frame.`
+             if (oauth.popupWindow && !oauth.popupWindow.closed) {
+               oauth.popupWindow.focus();
+               brougtPopupToFront = true;
+             }
+           } catch (err) {// Bringing popup window to front failed (probably because of the cross-origin error mentioned above)
+           }
+
+           return brougtPopupToFront;
+         };
+
+         oauth.bootstrapToken = function (oauth_token, callback) {
+           // ## Getting an request token
+           // At this point we have an `oauth_token`, brought in from a function
+           // call on a landing page popup.
+           function get_access_token(oauth_token) {
+             var url = o.url + '/oauth/access_token',
+                 params = timenonce(getAuth(o)),
+                 request_token_secret = token('oauth_request_token_secret');
+             params.oauth_token = oauth_token;
+             params.oauth_signature = ohauth.signature(o.oauth_secret, request_token_secret, ohauth.baseString('POST', url, params)); // ## Getting an access token
+             // The final token required for authentication. At this point
+             // we have a `request token secret`
+
+             ohauth.xhr('POST', url, params, null, {}, accessTokenDone);
+             o.loading();
+           }
+
+           function accessTokenDone(err, xhr) {
+             o.done();
+             if (err) return callback(err);
+             var access_token = ohauth.stringQs(xhr.response);
+             token('oauth_token', access_token.oauth_token);
+             token('oauth_token_secret', access_token.oauth_token_secret);
+             callback(null, oauth);
+           }
+
+           get_access_token(oauth_token);
+         }; // # xhr
+         //
+         // A single XMLHttpRequest wrapper that does authenticated calls if the
+         // user has logged in.
+
+
+         oauth.xhr = function (options, callback) {
+           if (!oauth.authenticated()) {
+             if (o.auto) {
+               return oauth.authenticate(run);
+             } else {
+               callback('not authenticated', null);
+               return;
+             }
+           } else {
+             return run();
+           }
+
+           function run() {
+             var params = timenonce(getAuth(o)),
+                 oauth_token_secret = token('oauth_token_secret'),
+                 url = options.prefix !== false ? o.url + options.path : options.path,
+                 url_parts = url.replace(/#.*$/, '').split('?', 2),
+                 base_url = url_parts[0],
+                 query = url_parts.length === 2 ? url_parts[1] : ''; // https://tools.ietf.org/html/rfc5849#section-3.4.1.3.1
+
+             if ((!options.options || !options.options.header || options.options.header['Content-Type'] === 'application/x-www-form-urlencoded') && options.content) {
+               params = xtend(params, ohauth.stringQs(options.content));
+             }
+
+             params.oauth_token = token('oauth_token');
+             params.oauth_signature = ohauth.signature(o.oauth_secret, oauth_token_secret, ohauth.baseString(options.method, base_url, xtend(params, ohauth.stringQs(query))));
+             return ohauth.xhr(options.method, url, params, options.content, options.options, done);
+           }
+
+           function done(err, xhr) {
+             if (err) return callback(err);else if (xhr.responseXML) return callback(err, xhr.responseXML);else return callback(err, xhr.response);
+           }
+         }; // pre-authorize this object, if we can just get a token and token_secret
+         // from the start
+
+
+         oauth.preauth = function (c) {
+           if (!c) return;
+           if (c.oauth_token) token('oauth_token', c.oauth_token);
+           if (c.oauth_token_secret) token('oauth_token_secret', c.oauth_token_secret);
+           return oauth;
+         };
+
+         oauth.options = function (_) {
+           if (!arguments.length) return o;
+           o = _;
+           o.url = o.url || 'https://www.openstreetmap.org';
+           o.landing = o.landing || 'land.html';
+           o.singlepage = o.singlepage || false; // Optional loading and loading-done functions for nice UI feedback.
+           // by default, no-ops
+
+           o.loading = o.loading || function () {};
+
+           o.done = o.done || function () {};
+
+           return oauth.preauth(o);
+         }; // 'stamp' an authentication object from `getAuth()`
+         // with a [nonce](http://en.wikipedia.org/wiki/Cryptographic_nonce)
+         // and timestamp
+
+
+         function timenonce(o) {
+           o.oauth_timestamp = ohauth.timestamp();
+           o.oauth_nonce = ohauth.nonce();
+           return o;
+         } // get/set tokens. These are prefixed with the base URL so that `osm-auth`
+         // can be used with multiple APIs and the keys in `localStorage`
+         // will not clash
+
+
+         var token;
+
+         if (store.enabled) {
+           token = function token(x, y) {
+             if (arguments.length === 1) return store.get(o.url + x);else if (arguments.length === 2) return store.set(o.url + x, y);
+           };
+         } else {
+           var storage = {};
+
+           token = function token(x, y) {
+             if (arguments.length === 1) return storage[o.url + x];else if (arguments.length === 2) return storage[o.url + x] = y;
+           };
+         } // Get an authentication object. If you just add and remove properties
+         // from a single object, you'll need to use `delete` to make sure that
+         // it doesn't contain undesired properties for authentication
+
+
+         function getAuth(o) {
+           return {
+             oauth_consumer_key: o.oauth_consumer_key,
+             oauth_signature_method: 'HMAC-SHA1'
+           };
+         } // potentially pre-authorize
+
+
+         oauth.options(o);
+         return oauth;
        };
 
-       module.exports = keysShim;
-}());
+       var tiler$2 = utilTiler();
+       var dispatch$2 = dispatch$8('apiStatusChange', 'authLoading', 'authDone', 'change', 'loading', 'loaded', 'loadedNotes');
+       var urlroot = 'https://www.openstreetmap.org';
+       var oauth = osmAuth({
+         url: urlroot,
+         oauth_consumer_key: '5A043yRSEugj4DJ5TljuapfnrflWDte8jTOcWLlT',
+         oauth_secret: 'aB3jKq1TRsCOUrfOIZ6oQMEDmv2ptV76PA54NGLL',
+         loading: authLoading,
+         done: authDone
+       }); // hardcode default block of Google Maps
+
+       var _imageryBlocklists = [/.*\.google(apis)?\..*\/(vt|kh)[\?\/].*([xyz]=.*){3}.*/];
+       var _tileCache = {
+         toLoad: {},
+         loaded: {},
+         inflight: {},
+         seen: {},
+         rtree: new RBush()
+       };
+       var _noteCache = {
+         toLoad: {},
+         loaded: {},
+         inflight: {},
+         inflightPost: {},
+         note: {},
+         closed: {},
+         rtree: new RBush()
+       };
+       var _userCache = {
+         toLoad: {},
+         user: {}
+       };
+
+       var _cachedApiStatus;
 
+       var _changeset = {};
 
-},{"is":9,"foreach":10}],9:[function(require,module,exports){
-
-/**!
- * is
- * the definitive JavaScript type testing library
- * 
- * @copyright 2013 Enrico Marino
- * @license MIT
- */
-
-var objProto = Object.prototype;
-var owns = objProto.hasOwnProperty;
-var toString = objProto.toString;
-var isActualNaN = function (value) {
-  return value !== value;
-};
-var NON_HOST_TYPES = {
-  "boolean": 1,
-  "number": 1,
-  "string": 1,
-  "undefined": 1
-};
-
-/**
- * Expose `is`
- */
-
-var is = module.exports = {};
-
-/**
- * Test general.
- */
-
-/**
- * is.type
- * Test if `value` is a type of `type`.
- *
- * @param {Mixed} value value to test
- * @param {String} type type
- * @return {Boolean} true if `value` is a type of `type`, false otherwise
- * @api public
- */
-
-is.a =
-is.type = function (value, type) {
-  return typeof value === type;
-};
-
-/**
- * is.defined
- * Test if `value` is defined.
- *
- * @param {Mixed} value value to test
- * @return {Boolean} true if 'value' is defined, false otherwise
- * @api public
- */
-
-is.defined = function (value) {
-  return value !== undefined;
-};
-
-/**
- * is.empty
- * Test if `value` is empty.
- *
- * @param {Mixed} value value to test
- * @return {Boolean} true if `value` is empty, false otherwise
- * @api public
- */
-
-is.empty = function (value) {
-  var type = toString.call(value);
-  var key;
-
-  if ('[object Array]' === type || '[object Arguments]' === type) {
-    return value.length === 0;
-  }
-
-  if ('[object Object]' === type) {
-    for (key in value) if (owns.call(value, key)) return false;
-    return true;
-  }
-
-  if ('[object String]' === type) {
-    return '' === value;
-  }
-
-  return false;
-};
-
-/**
- * is.equal
- * Test if `value` is equal to `other`.
- *
- * @param {Mixed} value value to test
- * @param {Mixed} other value to compare with
- * @return {Boolean} true if `value` is equal to `other`, false otherwise
- */
-
-is.equal = function (value, other) {
-  var type = toString.call(value)
-  var key;
-
-  if (type !== toString.call(other)) {
-    return false;
-  }
-
-  if ('[object Object]' === type) {
-    for (key in value) {
-      if (!is.equal(value[key], other[key])) {
-        return false;
-      }
-    }
-    return true;
-  }
-
-  if ('[object Array]' === type) {
-    key = value.length;
-    if (key !== other.length) {
-      return false;
-    }
-    while (--key) {
-      if (!is.equal(value[key], other[key])) {
-        return false;
-      }
-    }
-    return true;
-  }
-
-  if ('[object Function]' === type) {
-    return value.prototype === other.prototype;
-  }
-
-  if ('[object Date]' === type) {
-    return value.getTime() === other.getTime();
-  }
-
-  return value === other;
-};
-
-/**
- * is.hosted
- * Test if `value` is hosted by `host`.
- *
- * @param {Mixed} value to test
- * @param {Mixed} host host to test with
- * @return {Boolean} true if `value` is hosted by `host`, false otherwise
- * @api public
- */
-
-is.hosted = function (value, host) {
-  var type = typeof host[value];
-  return type === 'object' ? !!host[value] : !NON_HOST_TYPES[type];
-};
-
-/**
- * is.instance
- * Test if `value` is an instance of `constructor`.
- *
- * @param {Mixed} value value to test
- * @return {Boolean} true if `value` is an instance of `constructor`
- * @api public
- */
-
-is.instance = is['instanceof'] = function (value, constructor) {
-  return value instanceof constructor;
-};
-
-/**
- * is.null
- * Test if `value` is null.
- *
- * @param {Mixed} value value to test
- * @return {Boolean} true if `value` is null, false otherwise
- * @api public
- */
-
-is['null'] = function (value) {
-  return value === null;
-};
-
-/**
- * is.undefined
- * Test if `value` is undefined.
- *
- * @param {Mixed} value value to test
- * @return {Boolean} true if `value` is undefined, false otherwise
- * @api public
- */
-
-is.undefined = function (value) {
-  return value === undefined;
-};
-
-/**
- * Test arguments.
- */
-
-/**
- * is.arguments
- * Test if `value` is an arguments object.
- *
- * @param {Mixed} value value to test
- * @return {Boolean} true if `value` is an arguments object, false otherwise
- * @api public
- */
-
-is.arguments = function (value) {
-  var isStandardArguments = '[object Arguments]' === toString.call(value);
-  var isOldArguments = !is.array(value) && is.arraylike(value) && is.object(value) && is.fn(value.callee);
-  return isStandardArguments || isOldArguments;
-};
-
-/**
- * Test array.
- */
-
-/**
- * is.array
- * Test if 'value' is an array.
- *
- * @param {Mixed} value value to test
- * @return {Boolean} true if `value` is an array, false otherwise
- * @api public
- */
-
-is.array = function (value) {
-  return '[object Array]' === toString.call(value);
-};
-
-/**
- * is.arguments.empty
- * Test if `value` is an empty arguments object.
- *
- * @param {Mixed} value value to test
- * @return {Boolean} true if `value` is an empty arguments object, false otherwise
- * @api public
- */
-is.arguments.empty = function (value) {
-  return is.arguments(value) && value.length === 0;
-};
-
-/**
- * is.array.empty
- * Test if `value` is an empty array.
- *
- * @param {Mixed} value value to test
- * @return {Boolean} true if `value` is an empty array, false otherwise
- * @api public
- */
-is.array.empty = function (value) {
-  return is.array(value) && value.length === 0;
-};
-
-/**
- * is.arraylike
- * Test if `value` is an arraylike object.
- *
- * @param {Mixed} value value to test
- * @return {Boolean} true if `value` is an arguments object, false otherwise
- * @api public
- */
-
-is.arraylike = function (value) {
-  return !!value && !is.boolean(value)
-    && owns.call(value, 'length')
-    && isFinite(value.length)
-    && is.number(value.length)
-    && value.length >= 0;
-};
-
-/**
- * Test boolean.
- */
-
-/**
- * is.boolean
- * Test if `value` is a boolean.
- *
- * @param {Mixed} value value to test
- * @return {Boolean} true if `value` is a boolean, false otherwise
- * @api public
- */
-
-is.boolean = function (value) {
-  return '[object Boolean]' === toString.call(value);
-};
-
-/**
- * is.false
- * Test if `value` is false.
- *
- * @param {Mixed} value value to test
- * @return {Boolean} true if `value` is false, false otherwise
- * @api public
- */
-
-is['false'] = function (value) {
-  return is.boolean(value) && (value === false || value.valueOf() === false);
-};
-
-/**
- * is.true
- * Test if `value` is true.
- *
- * @param {Mixed} value value to test
- * @return {Boolean} true if `value` is true, false otherwise
- * @api public
- */
-
-is['true'] = function (value) {
-  return is.boolean(value) && (value === true || value.valueOf() === true);
-};
-
-/**
- * Test date.
- */
-
-/**
- * is.date
- * Test if `value` is a date.
- *
- * @param {Mixed} value value to test
- * @return {Boolean} true if `value` is a date, false otherwise
- * @api public
- */
-
-is.date = function (value) {
-  return '[object Date]' === toString.call(value);
-};
-
-/**
- * Test element.
- */
-
-/**
- * is.element
- * Test if `value` is an html element.
- *
- * @param {Mixed} value value to test
- * @return {Boolean} true if `value` is an HTML Element, false otherwise
- * @api public
- */
-
-is.element = function (value) {
-  return value !== undefined
-    && typeof HTMLElement !== 'undefined'
-    && value instanceof HTMLElement
-    && value.nodeType === 1;
-};
-
-/**
- * Test error.
- */
-
-/**
- * is.error
- * Test if `value` is an error object.
- *
- * @param {Mixed} value value to test
- * @return {Boolean} true if `value` is an error object, false otherwise
- * @api public
- */
-
-is.error = function (value) {
-  return '[object Error]' === toString.call(value);
-};
-
-/**
- * Test function.
- */
-
-/**
- * is.fn / is.function (deprecated)
- * Test if `value` is a function.
- *
- * @param {Mixed} value value to test
- * @return {Boolean} true if `value` is a function, false otherwise
- * @api public
- */
-
-is.fn = is['function'] = function (value) {
-  var isAlert = typeof window !== 'undefined' && value === window.alert;
-  return isAlert || '[object Function]' === toString.call(value);
-};
-
-/**
- * Test number.
- */
-
-/**
- * is.number
- * Test if `value` is a number.
- *
- * @param {Mixed} value value to test
- * @return {Boolean} true if `value` is a number, false otherwise
- * @api public
- */
-
-is.number = function (value) {
-  return '[object Number]' === toString.call(value);
-};
-
-/**
- * is.infinite
- * Test if `value` is positive or negative infinity.
- *
- * @param {Mixed} value value to test
- * @return {Boolean} true if `value` is positive or negative Infinity, false otherwise
- * @api public
- */
-is.infinite = function (value) {
-  return value === Infinity || value === -Infinity;
-};
-
-/**
- * is.decimal
- * Test if `value` is a decimal number.
- *
- * @param {Mixed} value value to test
- * @return {Boolean} true if `value` is a decimal number, false otherwise
- * @api public
- */
-
-is.decimal = function (value) {
-  return is.number(value) && !isActualNaN(value) && value % 1 !== 0;
-};
-
-/**
- * is.divisibleBy
- * Test if `value` is divisible by `n`.
- *
- * @param {Number} value value to test
- * @param {Number} n dividend
- * @return {Boolean} true if `value` is divisible by `n`, false otherwise
- * @api public
- */
-
-is.divisibleBy = function (value, n) {
-  var isDividendInfinite = is.infinite(value);
-  var isDivisorInfinite = is.infinite(n);
-  var isNonZeroNumber = is.number(value) && !isActualNaN(value) && is.number(n) && !isActualNaN(n) && n !== 0;
-  return isDividendInfinite || isDivisorInfinite || (isNonZeroNumber && value % n === 0);
-};
-
-/**
- * is.int
- * Test if `value` is an integer.
- *
- * @param value to test
- * @return {Boolean} true if `value` is an integer, false otherwise
- * @api public
- */
-
-is.int = function (value) {
-  return is.number(value) && !isActualNaN(value) && value % 1 === 0;
-};
-
-/**
- * is.maximum
- * Test if `value` is greater than 'others' values.
- *
- * @param {Number} value value to test
- * @param {Array} others values to compare with
- * @return {Boolean} true if `value` is greater than `others` values
- * @api public
- */
-
-is.maximum = function (value, others) {
-  if (isActualNaN(value)) {
-    throw new TypeError('NaN is not a valid value');
-  } else if (!is.arraylike(others)) {
-    throw new TypeError('second argument must be array-like');
-  }
-  var len = others.length;
-
-  while (--len >= 0) {
-    if (value < others[len]) {
-      return false;
-    }
-  }
-
-  return true;
-};
-
-/**
- * is.minimum
- * Test if `value` is less than `others` values.
- *
- * @param {Number} value value to test
- * @param {Array} others values to compare with
- * @return {Boolean} true if `value` is less than `others` values
- * @api public
- */
-
-is.minimum = function (value, others) {
-  if (isActualNaN(value)) {
-    throw new TypeError('NaN is not a valid value');
-  } else if (!is.arraylike(others)) {
-    throw new TypeError('second argument must be array-like');
-  }
-  var len = others.length;
-
-  while (--len >= 0) {
-    if (value > others[len]) {
-      return false;
-    }
-  }
-
-  return true;
-};
-
-/**
- * is.nan
- * Test if `value` is not a number.
- *
- * @param {Mixed} value value to test
- * @return {Boolean} true if `value` is not a number, false otherwise
- * @api public
- */
-
-is.nan = function (value) {
-  return !is.number(value) || value !== value;
-};
-
-/**
- * is.even
- * Test if `value` is an even number.
- *
- * @param {Number} value value to test
- * @return {Boolean} true if `value` is an even number, false otherwise
- * @api public
- */
-
-is.even = function (value) {
-  return is.infinite(value) || (is.number(value) && value === value && value % 2 === 0);
-};
-
-/**
- * is.odd
- * Test if `value` is an odd number.
- *
- * @param {Number} value value to test
- * @return {Boolean} true if `value` is an odd number, false otherwise
- * @api public
- */
-
-is.odd = function (value) {
-  return is.infinite(value) || (is.number(value) && value === value && value % 2 !== 0);
-};
-
-/**
- * is.ge
- * Test if `value` is greater than or equal to `other`.
- *
- * @param {Number} value value to test
- * @param {Number} other value to compare with
- * @return {Boolean}
- * @api public
- */
-
-is.ge = function (value, other) {
-  if (isActualNaN(value) || isActualNaN(other)) {
-    throw new TypeError('NaN is not a valid value');
-  }
-  return !is.infinite(value) && !is.infinite(other) && value >= other;
-};
-
-/**
- * is.gt
- * Test if `value` is greater than `other`.
- *
- * @param {Number} value value to test
- * @param {Number} other value to compare with
- * @return {Boolean}
- * @api public
- */
-
-is.gt = function (value, other) {
-  if (isActualNaN(value) || isActualNaN(other)) {
-    throw new TypeError('NaN is not a valid value');
-  }
-  return !is.infinite(value) && !is.infinite(other) && value > other;
-};
-
-/**
- * is.le
- * Test if `value` is less than or equal to `other`.
- *
- * @param {Number} value value to test
- * @param {Number} other value to compare with
- * @return {Boolean} if 'value' is less than or equal to 'other'
- * @api public
- */
-
-is.le = function (value, other) {
-  if (isActualNaN(value) || isActualNaN(other)) {
-    throw new TypeError('NaN is not a valid value');
-  }
-  return !is.infinite(value) && !is.infinite(other) && value <= other;
-};
-
-/**
- * is.lt
- * Test if `value` is less than `other`.
- *
- * @param {Number} value value to test
- * @param {Number} other value to compare with
- * @return {Boolean} if `value` is less than `other`
- * @api public
- */
-
-is.lt = function (value, other) {
-  if (isActualNaN(value) || isActualNaN(other)) {
-    throw new TypeError('NaN is not a valid value');
-  }
-  return !is.infinite(value) && !is.infinite(other) && value < other;
-};
-
-/**
- * is.within
- * Test if `value` is within `start` and `finish`.
- *
- * @param {Number} value value to test
- * @param {Number} start lower bound
- * @param {Number} finish upper bound
- * @return {Boolean} true if 'value' is is within 'start' and 'finish'
- * @api public
- */
-is.within = function (value, start, finish) {
-  if (isActualNaN(value) || isActualNaN(start) || isActualNaN(finish)) {
-    throw new TypeError('NaN is not a valid value');
-  } else if (!is.number(value) || !is.number(start) || !is.number(finish)) {
-    throw new TypeError('all arguments must be numbers');
-  }
-  var isAnyInfinite = is.infinite(value) || is.infinite(start) || is.infinite(finish);
-  return isAnyInfinite || (value >= start && value <= finish);
-};
-
-/**
- * Test object.
- */
-
-/**
- * is.object
- * Test if `value` is an object.
- *
- * @param {Mixed} value value to test
- * @return {Boolean} true if `value` is an object, false otherwise
- * @api public
- */
-
-is.object = function (value) {
-  return value && '[object Object]' === toString.call(value);
-};
-
-/**
- * is.hash
- * Test if `value` is a hash - a plain object literal.
- *
- * @param {Mixed} value value to test
- * @return {Boolean} true if `value` is a hash, false otherwise
- * @api public
- */
-
-is.hash = function (value) {
-  return is.object(value) && value.constructor === Object && !value.nodeType && !value.setInterval;
-};
-
-/**
- * Test regexp.
- */
-
-/**
- * is.regexp
- * Test if `value` is a regular expression.
- *
- * @param {Mixed} value value to test
- * @return {Boolean} true if `value` is a regexp, false otherwise
- * @api public
- */
-
-is.regexp = function (value) {
-  return '[object RegExp]' === toString.call(value);
-};
-
-/**
- * Test string.
- */
-
-/**
- * is.string
- * Test if `value` is a string.
- *
- * @param {Mixed} value value to test
- * @return {Boolean} true if 'value' is a string, false otherwise
- * @api public
- */
-
-is.string = function (value) {
-  return '[object String]' === toString.call(value);
-};
-
-
-},{}],10:[function(require,module,exports){
-
-var hasOwn = Object.prototype.hasOwnProperty;
-var toString = Object.prototype.toString;
-
-module.exports = function forEach (obj, fn, ctx) {
-    if (toString.call(fn) !== '[object Function]') {
-        throw new TypeError('iterator must be a function');
-    }
-    var l = obj.length;
-    if (l === +l) {
-        for (var i = 0; i < l; i++) {
-            fn.call(ctx, obj[i], i, obj);
-        }
-    } else {
-        for (var k in obj) {
-            if (hasOwn.call(obj, k)) {
-                fn.call(ctx, obj[k], k, obj);
-            }
-        }
-    }
-};
-
-
-},{}]},{},[1])(1)
-});
-;/*
- (c) 2013, Vladimir Agafonkin
- RBush, a JavaScript library for high-performance 2D spatial indexing of points and rectangles.
- https://github.com/mourner/rbush
-*/
-
-(function () { 'use strict';
-
-function rbush(maxEntries, format) {
-
-    // jshint newcap: false, validthis: true
-    if (!(this instanceof rbush)) return new rbush(maxEntries, format);
-
-    // max entries in a node is 9 by default; min node fill is 40% for best performance
-    this._maxEntries = Math.max(4, maxEntries || 9);
-    this._minEntries = Math.max(2, Math.ceil(this._maxEntries * 0.4));
-
-    if (format) {
-        this._initFormat(format);
-    }
-
-    this.clear();
-}
-
-rbush.prototype = {
-
-    all: function () {
-        return this._all(this.data, []);
-    },
-
-    search: function (bbox) {
-
-        var node = this.data,
-            result = [],
-            toBBox = this.toBBox;
-
-        if (!intersects(bbox, node.bbox)) return result;
-
-        var nodesToSearch = [],
-            i, len, child, childBBox;
-
-        while (node) {
-            for (i = 0, len = node.children.length; i < len; i++) {
-
-                child = node.children[i];
-                childBBox = node.leaf ? toBBox(child) : child.bbox;
-
-                if (intersects(bbox, childBBox)) {
-                    if (node.leaf) result.push(child);
-                    else if (contains(bbox, childBBox)) this._all(child, result);
-                    else nodesToSearch.push(child);
-                }
-            }
-            node = nodesToSearch.pop();
-        }
-
-        return result;
-    },
-
-    load: function (data) {
-        if (!(data && data.length)) return this;
-
-        if (data.length < this._minEntries) {
-            for (var i = 0, len = data.length; i < len; i++) {
-                this.insert(data[i]);
-            }
-            return this;
-        }
-
-        // recursively build the tree with the given data from stratch using OMT algorithm
-        var node = this._build(data.slice(), 0, data.length - 1, 0);
-
-        if (!this.data.children.length) {
-            // save as is if tree is empty
-            this.data = node;
-
-        } else if (this.data.height === node.height) {
-            // split root if trees have the same height
-            this._splitRoot(this.data, node);
-
-        } else {
-            if (this.data.height < node.height) {
-                // swap trees if inserted one is bigger
-                var tmpNode = this.data;
-                this.data = node;
-                node = tmpNode;
-            }
-
-            // insert the small tree into the large tree at appropriate level
-            this._insert(node, this.data.height - node.height - 1, true);
-        }
-
-        return this;
-    },
-
-    insert: function (item) {
-        if (item) this._insert(item, this.data.height - 1);
-        return this;
-    },
-
-    clear: function () {
-        this.data = {
-            children: [],
-            height: 1,
-            bbox: empty(),
-            leaf: true
-        };
-        return this;
-    },
-
-    remove: function (item) {
-        if (!item) return this;
-
-        var node = this.data,
-            bbox = this.toBBox(item),
-            path = [],
-            indexes = [],
-            i, parent, index, goingUp;
-
-        // depth-first iterative tree traversal
-        while (node || path.length) {
-
-            if (!node) { // go up
-                node = path.pop();
-                parent = path[path.length - 1];
-                i = indexes.pop();
-                goingUp = true;
-            }
-
-            if (node.leaf) { // check current node
-                index = node.children.indexOf(item);
-
-                if (index !== -1) {
-                    // item found, remove the item and condense tree upwards
-                    node.children.splice(index, 1);
-                    path.push(node);
-                    this._condense(path);
-                    return this;
-                }
-            }
-
-            if (!goingUp && !node.leaf && contains(node.bbox, bbox)) { // go down
-                path.push(node);
-                indexes.push(i);
-                i = 0;
-                parent = node;
-                node = node.children[0];
-
-            } else if (parent) { // go right
-                i++;
-                node = parent.children[i];
-                goingUp = false;
-
-            } else node = null; // nothing found
-        }
-
-        return this;
-    },
-
-    toBBox: function (item) { return item; },
-
-    compareMinX: function (a, b) { return a[0] - b[0]; },
-    compareMinY: function (a, b) { return a[1] - b[1]; },
-
-    toJSON: function () { return this.data; },
-
-    fromJSON: function (data) {
-        this.data = data;
-        return this;
-    },
-
-    _all: function (node, result) {
-        var nodesToSearch = [];
-        while (node) {
-            if (node.leaf) result.push.apply(result, node.children);
-            else nodesToSearch.push.apply(nodesToSearch, node.children);
-
-            node = nodesToSearch.pop();
-        }
-        return result;
-    },
-
-    _build: function (items, left, right, level, height) {
-
-        var N = right - left + 1,
-            M = this._maxEntries,
-            node;
-
-        if (N <= M) {
-            node = {
-                children: items.slice(left, right + 1),
-                height: 1,
-                bbox: null,
-                leaf: true
-            };
-            calcBBox(node, this.toBBox);
-            return node;
-        }
-
-        if (!level) {
-            // target height of the bulk-loaded tree
-            height = Math.ceil(Math.log(N) / Math.log(M));
-
-            // target number of root entries to maximize storage utilization
-            M = Math.ceil(N / Math.pow(M, height - 1));
-        }
-
-        // TODO eliminate recursion?
+       var _deferred = new Set();
 
-        node = {
-            children: [],
-            height: height,
-            bbox: null
-        };
-
-        var N2 = Math.ceil(N / M),
-            N1 = N2 * Math.ceil(Math.sqrt(M)),
-            i, j, right2, childNode;
+       var _connectionID = 1;
+       var _tileZoom = 16;
+       var _noteZoom = 12;
+
+       var _rateLimitError;
+
+       var _userChangesets;
+
+       var _userDetails;
+
+       var _off; // set a default but also load this from the API status
+
+
+       var _maxWayNodes = 2000;
+
+       function authLoading() {
+         dispatch$2.call('authLoading');
+       }
+
+       function authDone() {
+         dispatch$2.call('authDone');
+       }
+
+       function abortRequest$2(controllerOrXHR) {
+         if (controllerOrXHR) {
+           controllerOrXHR.abort();
+         }
+       }
+
+       function hasInflightRequests(cache) {
+         return Object.keys(cache.inflight).length;
+       }
+
+       function abortUnwantedRequests(cache, visibleTiles) {
+         Object.keys(cache.inflight).forEach(function (k) {
+           if (cache.toLoad[k]) return;
+           if (visibleTiles.find(function (tile) {
+             return k === tile.id;
+           })) return;
+           abortRequest$2(cache.inflight[k]);
+           delete cache.inflight[k];
+         });
+       }
 
-        // split the items into M mostly square tiles
-        for (i = left; i <= right; i += N1) {
+       function getLoc(attrs) {
+         var lon = attrs.lon && attrs.lon.value;
+         var lat = attrs.lat && attrs.lat.value;
+         return [parseFloat(lon), parseFloat(lat)];
+       }
 
-            if (i + N1 <= right) partitionSort(items, i, right, i + N1, this.compareMinX);
-            right2 = Math.min(i + N1 - 1, right);
+       function getNodes(obj) {
+         var elems = obj.getElementsByTagName('nd');
+         var nodes = new Array(elems.length);
 
-            for (j = i; j <= right2; j += N2) {
+         for (var i = 0, l = elems.length; i < l; i++) {
+           nodes[i] = 'n' + elems[i].attributes.ref.value;
+         }
 
-                if (j + N2 <= right2) partitionSort(items, j, right2, j + N2, this.compareMinY);
+         return nodes;
+       }
 
-                // pack each entry recursively
-                childNode = this._build(items, j, Math.min(j + N2 - 1, right2), level + 1, height - 1);
-                node.children.push(childNode);
-            }
-        }
+       function getNodesJSON(obj) {
+         var elems = obj.nodes;
+         var nodes = new Array(elems.length);
 
-        calcBBox(node, this.toBBox);
+         for (var i = 0, l = elems.length; i < l; i++) {
+           nodes[i] = 'n' + elems[i];
+         }
 
-        return node;
-    },
+         return nodes;
+       }
 
-    _chooseSubtree: function (bbox, node, level, path) {
+       function getTags(obj) {
+         var elems = obj.getElementsByTagName('tag');
+         var tags = {};
 
-        var i, len, child, targetNode, area, enlargement, minArea, minEnlargement;
+         for (var i = 0, l = elems.length; i < l; i++) {
+           var attrs = elems[i].attributes;
+           tags[attrs.k.value] = attrs.v.value;
+         }
 
-        while (true) {
-            path.push(node);
+         return tags;
+       }
 
-            if (node.leaf || path.length - 1 === level) break;
+       function getMembers(obj) {
+         var elems = obj.getElementsByTagName('member');
+         var members = new Array(elems.length);
 
-            minArea = minEnlargement = Infinity;
+         for (var i = 0, l = elems.length; i < l; i++) {
+           var attrs = elems[i].attributes;
+           members[i] = {
+             id: attrs.type.value[0] + attrs.ref.value,
+             type: attrs.type.value,
+             role: attrs.role.value
+           };
+         }
 
-            for (i = 0, len = node.children.length; i < len; i++) {
-                child = node.children[i];
-                area = bboxArea(child.bbox);
-                enlargement = enlargedArea(bbox, child.bbox) - area;
+         return members;
+       }
 
-                // choose entry with the least area enlargement
-                if (enlargement < minEnlargement) {
-                    minEnlargement = enlargement;
-                    minArea = area < minArea ? area : minArea;
-                    targetNode = child;
+       function getMembersJSON(obj) {
+         var elems = obj.members;
+         var members = new Array(elems.length);
 
-                } else if (enlargement === minEnlargement) {
-                    // otherwise choose one with the smallest area
-                    if (area < minArea) {
-                        minArea = area;
-                        targetNode = child;
-                    }
-                }
-            }
+         for (var i = 0, l = elems.length; i < l; i++) {
+           var attrs = elems[i];
+           members[i] = {
+             id: attrs.type[0] + attrs.ref,
+             type: attrs.type,
+             role: attrs.role
+           };
+         }
 
-            node = targetNode;
-        }
+         return members;
+       }
 
-        return node;
-    },
+       function getVisible(attrs) {
+         return !attrs.visible || attrs.visible.value !== 'false';
+       }
 
-    _insert: function (item, level, isNode) {
+       function parseComments(comments) {
+         var parsedComments = []; // for each comment
 
-        var toBBox = this.toBBox,
-            bbox = isNode ? item.bbox : toBBox(item),
-            insertPath = [];
+         for (var i = 0; i < comments.length; i++) {
+           var comment = comments[i];
 
-        // find the best node for accommodating the item, saving all nodes along the path too
-        var node = this._chooseSubtree(bbox, this.data, level, insertPath);
+           if (comment.nodeName === 'comment') {
+             var childNodes = comment.childNodes;
+             var parsedComment = {};
 
-        // put the item into the node
-        node.children.push(item);
-        extend(node.bbox, bbox);
+             for (var j = 0; j < childNodes.length; j++) {
+               var node = childNodes[j];
+               var nodeName = node.nodeName;
+               if (nodeName === '#text') continue;
+               parsedComment[nodeName] = node.textContent;
 
-        // split on node overflow; propagate upwards if necessary
-        while (level >= 0) {
-            if (insertPath[level].children.length > this._maxEntries) {
-                this._split(insertPath, level);
-                level--;
-            } else break;
-        }
+               if (nodeName === 'uid') {
+                 var uid = node.textContent;
 
-        // adjust bboxes along the insertion path
-        this._adjustParentBBoxes(bbox, insertPath, level);
-    },
+                 if (uid && !_userCache.user[uid]) {
+                   _userCache.toLoad[uid] = true;
+                 }
+               }
+             }
 
-    // split overflowed node into two
-    _split: function (insertPath, level) {
+             if (parsedComment) {
+               parsedComments.push(parsedComment);
+             }
+           }
+         }
 
-        var node = insertPath[level],
-            M = node.children.length,
-            m = this._minEntries;
+         return parsedComments;
+       }
 
-        this._chooseSplitAxis(node, m, M);
+       function encodeNoteRtree(note) {
+         return {
+           minX: note.loc[0],
+           minY: note.loc[1],
+           maxX: note.loc[0],
+           maxY: note.loc[1],
+           data: note
+         };
+       }
 
-        var newNode = {
-            children: node.children.splice(this._chooseSplitIndex(node, m, M)),
-            height: node.height
-        };
+       var jsonparsers = {
+         node: function nodeData(obj, uid) {
+           return new osmNode({
+             id: uid,
+             visible: typeof obj.visible === 'boolean' ? obj.visible : true,
+             version: obj.version && obj.version.toString(),
+             changeset: obj.changeset && obj.changeset.toString(),
+             timestamp: obj.timestamp,
+             user: obj.user,
+             uid: obj.uid && obj.uid.toString(),
+             loc: [parseFloat(obj.lon), parseFloat(obj.lat)],
+             tags: obj.tags
+           });
+         },
+         way: function wayData(obj, uid) {
+           return new osmWay({
+             id: uid,
+             visible: typeof obj.visible === 'boolean' ? obj.visible : true,
+             version: obj.version && obj.version.toString(),
+             changeset: obj.changeset && obj.changeset.toString(),
+             timestamp: obj.timestamp,
+             user: obj.user,
+             uid: obj.uid && obj.uid.toString(),
+             tags: obj.tags,
+             nodes: getNodesJSON(obj)
+           });
+         },
+         relation: function relationData(obj, uid) {
+           return new osmRelation({
+             id: uid,
+             visible: typeof obj.visible === 'boolean' ? obj.visible : true,
+             version: obj.version && obj.version.toString(),
+             changeset: obj.changeset && obj.changeset.toString(),
+             timestamp: obj.timestamp,
+             user: obj.user,
+             uid: obj.uid && obj.uid.toString(),
+             tags: obj.tags,
+             members: getMembersJSON(obj)
+           });
+         },
+         user: function parseUser(obj, uid) {
+           return {
+             id: uid,
+             display_name: obj.display_name,
+             account_created: obj.account_created,
+             image_url: obj.img && obj.img.href,
+             changesets_count: obj.changesets && obj.changesets.count && obj.changesets.count.toString() || '0',
+             active_blocks: obj.blocks && obj.blocks.received && obj.blocks.received.active && obj.blocks.received.active.toString() || '0'
+           };
+         }
+       };
 
-        if (node.leaf) newNode.leaf = true;
+       function parseJSON(payload, callback, options) {
+         options = Object.assign({
+           skipSeen: true
+         }, options);
+
+         if (!payload) {
+           return callback({
+             message: 'No JSON',
+             status: -1
+           });
+         }
+
+         var json = payload;
+         if (_typeof(json) !== 'object') json = JSON.parse(payload);
+         if (!json.elements) return callback({
+           message: 'No JSON',
+           status: -1
+         });
+         var children = json.elements;
+         var handle = window.requestIdleCallback(function () {
+           _deferred["delete"](handle);
+
+           var results = [];
+           var result;
+
+           for (var i = 0; i < children.length; i++) {
+             result = parseChild(children[i]);
+             if (result) results.push(result);
+           }
+
+           callback(null, results);
+         });
+
+         _deferred.add(handle);
+
+         function parseChild(child) {
+           var parser = jsonparsers[child.type];
+           if (!parser) return null;
+           var uid;
+           uid = osmEntity.id.fromOSM(child.type, child.id);
+
+           if (options.skipSeen) {
+             if (_tileCache.seen[uid]) return null; // avoid reparsing a "seen" entity
+
+             _tileCache.seen[uid] = true;
+           }
+
+           return parser(child, uid);
+         }
+       }
 
-        calcBBox(node, this.toBBox);
-        calcBBox(newNode, this.toBBox);
+       function parseUserJSON(payload, callback, options) {
+         options = Object.assign({
+           skipSeen: true
+         }, options);
+
+         if (!payload) {
+           return callback({
+             message: 'No JSON',
+             status: -1
+           });
+         }
+
+         var json = payload;
+         if (_typeof(json) !== 'object') json = JSON.parse(payload);
+         if (!json.users && !json.user) return callback({
+           message: 'No JSON',
+           status: -1
+         });
+         var objs = json.users || [json];
+         var handle = window.requestIdleCallback(function () {
+           _deferred["delete"](handle);
+
+           var results = [];
+           var result;
+
+           for (var i = 0; i < objs.length; i++) {
+             result = parseObj(objs[i]);
+             if (result) results.push(result);
+           }
+
+           callback(null, results);
+         });
+
+         _deferred.add(handle);
+
+         function parseObj(obj) {
+           var uid = obj.user.id && obj.user.id.toString();
+
+           if (options.skipSeen && _userCache.user[uid]) {
+             delete _userCache.toLoad[uid];
+             return null;
+           }
+
+           var user = jsonparsers.user(obj.user, uid);
+           _userCache.user[uid] = user;
+           delete _userCache.toLoad[uid];
+           return user;
+         }
+       }
 
-        if (level) insertPath[level - 1].children.push(newNode);
-        else this._splitRoot(node, newNode);
-    },
+       var parsers = {
+         node: function nodeData(obj, uid) {
+           var attrs = obj.attributes;
+           return new osmNode({
+             id: uid,
+             visible: getVisible(attrs),
+             version: attrs.version.value,
+             changeset: attrs.changeset && attrs.changeset.value,
+             timestamp: attrs.timestamp && attrs.timestamp.value,
+             user: attrs.user && attrs.user.value,
+             uid: attrs.uid && attrs.uid.value,
+             loc: getLoc(attrs),
+             tags: getTags(obj)
+           });
+         },
+         way: function wayData(obj, uid) {
+           var attrs = obj.attributes;
+           return new osmWay({
+             id: uid,
+             visible: getVisible(attrs),
+             version: attrs.version.value,
+             changeset: attrs.changeset && attrs.changeset.value,
+             timestamp: attrs.timestamp && attrs.timestamp.value,
+             user: attrs.user && attrs.user.value,
+             uid: attrs.uid && attrs.uid.value,
+             tags: getTags(obj),
+             nodes: getNodes(obj)
+           });
+         },
+         relation: function relationData(obj, uid) {
+           var attrs = obj.attributes;
+           return new osmRelation({
+             id: uid,
+             visible: getVisible(attrs),
+             version: attrs.version.value,
+             changeset: attrs.changeset && attrs.changeset.value,
+             timestamp: attrs.timestamp && attrs.timestamp.value,
+             user: attrs.user && attrs.user.value,
+             uid: attrs.uid && attrs.uid.value,
+             tags: getTags(obj),
+             members: getMembers(obj)
+           });
+         },
+         note: function parseNote(obj, uid) {
+           var attrs = obj.attributes;
+           var childNodes = obj.childNodes;
+           var props = {};
+           props.id = uid;
+           props.loc = getLoc(attrs); // if notes are coincident, move them apart slightly
+
+           var coincident = false;
+           var epsilon = 0.00001;
+
+           do {
+             if (coincident) {
+               props.loc = geoVecAdd(props.loc, [epsilon, epsilon]);
+             }
+
+             var bbox = geoExtent(props.loc).bbox();
+             coincident = _noteCache.rtree.search(bbox).length;
+           } while (coincident); // parse note contents
+
+
+           for (var i = 0; i < childNodes.length; i++) {
+             var node = childNodes[i];
+             var nodeName = node.nodeName;
+             if (nodeName === '#text') continue; // if the element is comments, parse the comments
+
+             if (nodeName === 'comments') {
+               props[nodeName] = parseComments(node.childNodes);
+             } else {
+               props[nodeName] = node.textContent;
+             }
+           }
+
+           var note = new osmNote(props);
+           var item = encodeNoteRtree(note);
+           _noteCache.note[note.id] = note;
+
+           _noteCache.rtree.insert(item);
+
+           return note;
+         },
+         user: function parseUser(obj, uid) {
+           var attrs = obj.attributes;
+           var user = {
+             id: uid,
+             display_name: attrs.display_name && attrs.display_name.value,
+             account_created: attrs.account_created && attrs.account_created.value,
+             changesets_count: '0',
+             active_blocks: '0'
+           };
+           var img = obj.getElementsByTagName('img');
+
+           if (img && img[0] && img[0].getAttribute('href')) {
+             user.image_url = img[0].getAttribute('href');
+           }
+
+           var changesets = obj.getElementsByTagName('changesets');
+
+           if (changesets && changesets[0] && changesets[0].getAttribute('count')) {
+             user.changesets_count = changesets[0].getAttribute('count');
+           }
+
+           var blocks = obj.getElementsByTagName('blocks');
+
+           if (blocks && blocks[0]) {
+             var received = blocks[0].getElementsByTagName('received');
+
+             if (received && received[0] && received[0].getAttribute('active')) {
+               user.active_blocks = received[0].getAttribute('active');
+             }
+           }
+
+           _userCache.user[uid] = user;
+           delete _userCache.toLoad[uid];
+           return user;
+         }
+       };
 
-    _splitRoot: function (node, newNode) {
-        // split root node
-        this.data = {
-            children: [node, newNode],
-            height: node.height + 1
-        };
-        calcBBox(this.data, this.toBBox);
-    },
+       function parseXML(xml, callback, options) {
+         options = Object.assign({
+           skipSeen: true
+         }, options);
+
+         if (!xml || !xml.childNodes) {
+           return callback({
+             message: 'No XML',
+             status: -1
+           });
+         }
+
+         var root = xml.childNodes[0];
+         var children = root.childNodes;
+         var handle = window.requestIdleCallback(function () {
+           _deferred["delete"](handle);
+
+           var results = [];
+           var result;
+
+           for (var i = 0; i < children.length; i++) {
+             result = parseChild(children[i]);
+             if (result) results.push(result);
+           }
+
+           callback(null, results);
+         });
+
+         _deferred.add(handle);
+
+         function parseChild(child) {
+           var parser = parsers[child.nodeName];
+           if (!parser) return null;
+           var uid;
+
+           if (child.nodeName === 'user') {
+             uid = child.attributes.id.value;
+
+             if (options.skipSeen && _userCache.user[uid]) {
+               delete _userCache.toLoad[uid];
+               return null;
+             }
+           } else if (child.nodeName === 'note') {
+             uid = child.getElementsByTagName('id')[0].textContent;
+           } else {
+             uid = osmEntity.id.fromOSM(child.nodeName, child.attributes.id.value);
+
+             if (options.skipSeen) {
+               if (_tileCache.seen[uid]) return null; // avoid reparsing a "seen" entity
+
+               _tileCache.seen[uid] = true;
+             }
+           }
+
+           return parser(child, uid);
+         }
+       } // replace or remove note from rtree
+
+
+       function updateRtree(item, replace) {
+         _noteCache.rtree.remove(item, function isEql(a, b) {
+           return a.data.id === b.data.id;
+         });
+
+         if (replace) {
+           _noteCache.rtree.insert(item);
+         }
+       }
 
-    _chooseSplitIndex: function (node, m, M) {
+       function wrapcb(thisArg, callback, cid) {
+         return function (err, result) {
+           if (err) {
+             // 400 Bad Request, 401 Unauthorized, 403 Forbidden..
+             if (err.status === 400 || err.status === 401 || err.status === 403) {
+               thisArg.logout();
+             }
+
+             return callback.call(thisArg, err);
+           } else if (thisArg.getConnectionId() !== cid) {
+             return callback.call(thisArg, {
+               message: 'Connection Switched',
+               status: -1
+             });
+           } else {
+             return callback.call(thisArg, err, result);
+           }
+         };
+       }
 
-        var i, bbox1, bbox2, overlap, area, minOverlap, minArea, index;
+       var serviceOsm = {
+         init: function init() {
+           utilRebind(this, dispatch$2, 'on');
+         },
+         reset: function reset() {
+           Array.from(_deferred).forEach(function (handle) {
+             window.cancelIdleCallback(handle);
+
+             _deferred["delete"](handle);
+           });
+           _connectionID++;
+           _userChangesets = undefined;
+           _userDetails = undefined;
+           _rateLimitError = undefined;
+           Object.values(_tileCache.inflight).forEach(abortRequest$2);
+           Object.values(_noteCache.inflight).forEach(abortRequest$2);
+           Object.values(_noteCache.inflightPost).forEach(abortRequest$2);
+           if (_changeset.inflight) abortRequest$2(_changeset.inflight);
+           _tileCache = {
+             toLoad: {},
+             loaded: {},
+             inflight: {},
+             seen: {},
+             rtree: new RBush()
+           };
+           _noteCache = {
+             toLoad: {},
+             loaded: {},
+             inflight: {},
+             inflightPost: {},
+             note: {},
+             closed: {},
+             rtree: new RBush()
+           };
+           _userCache = {
+             toLoad: {},
+             user: {}
+           };
+           _cachedApiStatus = undefined;
+           _changeset = {};
+           return this;
+         },
+         getConnectionId: function getConnectionId() {
+           return _connectionID;
+         },
+         changesetURL: function changesetURL(changesetID) {
+           return urlroot + '/changeset/' + changesetID;
+         },
+         changesetsURL: function changesetsURL(center, zoom) {
+           var precision = Math.max(0, Math.ceil(Math.log(zoom) / Math.LN2));
+           return urlroot + '/history#map=' + Math.floor(zoom) + '/' + center[1].toFixed(precision) + '/' + center[0].toFixed(precision);
+         },
+         entityURL: function entityURL(entity) {
+           return urlroot + '/' + entity.type + '/' + entity.osmId();
+         },
+         historyURL: function historyURL(entity) {
+           return urlroot + '/' + entity.type + '/' + entity.osmId() + '/history';
+         },
+         userURL: function userURL(username) {
+           return urlroot + '/user/' + encodeURIComponent(username);
+         },
+         noteURL: function noteURL(note) {
+           return urlroot + '/note/' + note.id;
+         },
+         noteReportURL: function noteReportURL(note) {
+           return urlroot + '/reports/new?reportable_type=Note&reportable_id=' + note.id;
+         },
+         // Generic method to load data from the OSM API
+         // Can handle either auth or unauth calls.
+         loadFromAPI: function loadFromAPI(path, callback, options) {
+           options = Object.assign({
+             skipSeen: true
+           }, options);
+           var that = this;
+           var cid = _connectionID;
+
+           function done(err, payload) {
+             if (that.getConnectionId() !== cid) {
+               if (callback) callback({
+                 message: 'Connection Switched',
+                 status: -1
+               });
+               return;
+             }
+
+             var isAuthenticated = that.authenticated(); // 400 Bad Request, 401 Unauthorized, 403 Forbidden
+             // Logout and retry the request..
+
+             if (isAuthenticated && err && err.status && (err.status === 400 || err.status === 401 || err.status === 403)) {
+               that.logout();
+               that.loadFromAPI(path, callback, options); // else, no retry..
+             } else {
+               // 509 Bandwidth Limit Exceeded, 429 Too Many Requests
+               // Set the rateLimitError flag and trigger a warning..
+               if (!isAuthenticated && !_rateLimitError && err && err.status && (err.status === 509 || err.status === 429)) {
+                 _rateLimitError = err;
+                 dispatch$2.call('change');
+                 that.reloadApiStatus();
+               } else if (err && _cachedApiStatus === 'online' || !err && _cachedApiStatus !== 'online') {
+                 // If the response's error state doesn't match the status,
+                 // it's likely we lost or gained the connection so reload the status
+                 that.reloadApiStatus();
+               }
+
+               if (callback) {
+                 if (err) {
+                   return callback(err);
+                 } else {
+                   if (path.indexOf('.json') !== -1) {
+                     return parseJSON(payload, callback, options);
+                   } else {
+                     return parseXML(payload, callback, options);
+                   }
+                 }
+               }
+             }
+           }
+
+           if (this.authenticated()) {
+             return oauth.xhr({
+               method: 'GET',
+               path: path
+             }, done);
+           } else {
+             var url = urlroot + path;
+             var controller = new AbortController();
+             var fn;
+
+             if (path.indexOf('.json') !== -1) {
+               fn = d3_json;
+             } else {
+               fn = d3_xml;
+             }
+
+             fn(url, {
+               signal: controller.signal
+             }).then(function (data) {
+               done(null, data);
+             })["catch"](function (err) {
+               if (err.name === 'AbortError') return; // d3-fetch includes status in the error message,
+               // but we can't access the response itself
+               // https://github.com/d3/d3-fetch/issues/27
+
+               var match = err.message.match(/^\d{3}/);
+
+               if (match) {
+                 done({
+                   status: +match[0],
+                   statusText: err.message
+                 });
+               } else {
+                 done(err.message);
+               }
+             });
+             return controller;
+           }
+         },
+         // Load a single entity by id (ways and relations use the `/full` call to include
+         // nodes and members). Parent relations are not included, see `loadEntityRelations`.
+         // GET /api/0.6/node/#id
+         // GET /api/0.6/[way|relation]/#id/full
+         loadEntity: function loadEntity(id, callback) {
+           var type = osmEntity.id.type(id);
+           var osmID = osmEntity.id.toOSM(id);
+           var options = {
+             skipSeen: false
+           };
+           this.loadFromAPI('/api/0.6/' + type + '/' + osmID + (type !== 'node' ? '/full' : '') + '.json', function (err, entities) {
+             if (callback) callback(err, {
+               data: entities
+             });
+           }, options);
+         },
+         // Load a single entity with a specific version
+         // GET /api/0.6/[node|way|relation]/#id/#version
+         loadEntityVersion: function loadEntityVersion(id, version, callback) {
+           var type = osmEntity.id.type(id);
+           var osmID = osmEntity.id.toOSM(id);
+           var options = {
+             skipSeen: false
+           };
+           this.loadFromAPI('/api/0.6/' + type + '/' + osmID + '/' + version + '.json', function (err, entities) {
+             if (callback) callback(err, {
+               data: entities
+             });
+           }, options);
+         },
+         // Load the relations of a single entity with the given.
+         // GET /api/0.6/[node|way|relation]/#id/relations
+         loadEntityRelations: function loadEntityRelations(id, callback) {
+           var type = osmEntity.id.type(id);
+           var osmID = osmEntity.id.toOSM(id);
+           var options = {
+             skipSeen: false
+           };
+           this.loadFromAPI('/api/0.6/' + type + '/' + osmID + '/relations.json', function (err, entities) {
+             if (callback) callback(err, {
+               data: entities
+             });
+           }, options);
+         },
+         // Load multiple entities in chunks
+         // (note: callback may be called multiple times)
+         // Unlike `loadEntity`, child nodes and members are not fetched
+         // GET /api/0.6/[nodes|ways|relations]?#parameters
+         loadMultiple: function loadMultiple(ids, callback) {
+           var that = this;
+           var groups = utilArrayGroupBy(utilArrayUniq(ids), osmEntity.id.type);
+           Object.keys(groups).forEach(function (k) {
+             var type = k + 's'; // nodes, ways, relations
+
+             var osmIDs = groups[k].map(function (id) {
+               return osmEntity.id.toOSM(id);
+             });
+             var options = {
+               skipSeen: false
+             };
+             utilArrayChunk(osmIDs, 150).forEach(function (arr) {
+               that.loadFromAPI('/api/0.6/' + type + '.json?' + type + '=' + arr.join(), function (err, entities) {
+                 if (callback) callback(err, {
+                   data: entities
+                 });
+               }, options);
+             });
+           });
+         },
+         // Create, upload, and close a changeset
+         // PUT /api/0.6/changeset/create
+         // POST /api/0.6/changeset/#id/upload
+         // PUT /api/0.6/changeset/#id/close
+         putChangeset: function putChangeset(changeset, changes, callback) {
+           var cid = _connectionID;
+
+           if (_changeset.inflight) {
+             return callback({
+               message: 'Changeset already inflight',
+               status: -2
+             }, changeset);
+           } else if (_changeset.open) {
+             // reuse existing open changeset..
+             return createdChangeset.call(this, null, _changeset.open);
+           } else {
+             // Open a new changeset..
+             var options = {
+               method: 'PUT',
+               path: '/api/0.6/changeset/create',
+               options: {
+                 header: {
+                   'Content-Type': 'text/xml'
+                 }
+               },
+               content: JXON.stringify(changeset.asJXON())
+             };
+             _changeset.inflight = oauth.xhr(options, wrapcb(this, createdChangeset, cid));
+           }
+
+           function createdChangeset(err, changesetID) {
+             _changeset.inflight = null;
+
+             if (err) {
+               return callback(err, changeset);
+             }
+
+             _changeset.open = changesetID;
+             changeset = changeset.update({
+               id: changesetID
+             }); // Upload the changeset..
+
+             var options = {
+               method: 'POST',
+               path: '/api/0.6/changeset/' + changesetID + '/upload',
+               options: {
+                 header: {
+                   'Content-Type': 'text/xml'
+                 }
+               },
+               content: JXON.stringify(changeset.osmChangeJXON(changes))
+             };
+             _changeset.inflight = oauth.xhr(options, wrapcb(this, uploadedChangeset, cid));
+           }
+
+           function uploadedChangeset(err) {
+             _changeset.inflight = null;
+             if (err) return callback(err, changeset); // Upload was successful, safe to call the callback.
+             // Add delay to allow for postgres replication #1646 #2678
+
+             window.setTimeout(function () {
+               callback(null, changeset);
+             }, 2500);
+             _changeset.open = null; // At this point, we don't really care if the connection was switched..
+             // Only try to close the changeset if we're still talking to the same server.
+
+             if (this.getConnectionId() === cid) {
+               // Still attempt to close changeset, but ignore response because #2667
+               oauth.xhr({
+                 method: 'PUT',
+                 path: '/api/0.6/changeset/' + changeset.id + '/close',
+                 options: {
+                   header: {
+                     'Content-Type': 'text/xml'
+                   }
+                 }
+               }, function () {
+                 return true;
+               });
+             }
+           }
+         },
+         // Load multiple users in chunks
+         // (note: callback may be called multiple times)
+         // GET /api/0.6/users?users=#id1,#id2,...,#idn
+         loadUsers: function loadUsers(uids, callback) {
+           var toLoad = [];
+           var cached = [];
+           utilArrayUniq(uids).forEach(function (uid) {
+             if (_userCache.user[uid]) {
+               delete _userCache.toLoad[uid];
+               cached.push(_userCache.user[uid]);
+             } else {
+               toLoad.push(uid);
+             }
+           });
+
+           if (cached.length || !this.authenticated()) {
+             callback(undefined, cached);
+             if (!this.authenticated()) return; // require auth
+           }
+
+           utilArrayChunk(toLoad, 150).forEach(function (arr) {
+             oauth.xhr({
+               method: 'GET',
+               path: '/api/0.6/users.json?users=' + arr.join()
+             }, wrapcb(this, done, _connectionID));
+           }.bind(this));
+
+           function done(err, payload) {
+             if (err) return callback(err);
+             var options = {
+               skipSeen: true
+             };
+             return parseUserJSON(payload, function (err, results) {
+               if (err) return callback(err);
+               return callback(undefined, results);
+             }, options);
+           }
+         },
+         // Load a given user by id
+         // GET /api/0.6/user/#id
+         loadUser: function loadUser(uid, callback) {
+           if (_userCache.user[uid] || !this.authenticated()) {
+             // require auth
+             delete _userCache.toLoad[uid];
+             return callback(undefined, _userCache.user[uid]);
+           }
+
+           oauth.xhr({
+             method: 'GET',
+             path: '/api/0.6/user/' + uid + '.json'
+           }, wrapcb(this, done, _connectionID));
+
+           function done(err, payload) {
+             if (err) return callback(err);
+             var options = {
+               skipSeen: true
+             };
+             return parseUserJSON(payload, function (err, results) {
+               if (err) return callback(err);
+               return callback(undefined, results[0]);
+             }, options);
+           }
+         },
+         // Load the details of the logged-in user
+         // GET /api/0.6/user/details
+         userDetails: function userDetails(callback) {
+           if (_userDetails) {
+             // retrieve cached
+             return callback(undefined, _userDetails);
+           }
+
+           oauth.xhr({
+             method: 'GET',
+             path: '/api/0.6/user/details.json'
+           }, wrapcb(this, done, _connectionID));
+
+           function done(err, payload) {
+             if (err) return callback(err);
+             var options = {
+               skipSeen: false
+             };
+             return parseUserJSON(payload, function (err, results) {
+               if (err) return callback(err);
+               _userDetails = results[0];
+               return callback(undefined, _userDetails);
+             }, options);
+           }
+         },
+         // Load previous changesets for the logged in user
+         // GET /api/0.6/changesets?user=#id
+         userChangesets: function userChangesets(callback) {
+           if (_userChangesets) {
+             // retrieve cached
+             return callback(undefined, _userChangesets);
+           }
+
+           this.userDetails(wrapcb(this, gotDetails, _connectionID));
+
+           function gotDetails(err, user) {
+             if (err) {
+               return callback(err);
+             }
+
+             oauth.xhr({
+               method: 'GET',
+               path: '/api/0.6/changesets?user=' + user.id
+             }, wrapcb(this, done, _connectionID));
+           }
+
+           function done(err, xml) {
+             if (err) {
+               return callback(err);
+             }
+
+             _userChangesets = Array.prototype.map.call(xml.getElementsByTagName('changeset'), function (changeset) {
+               return {
+                 tags: getTags(changeset)
+               };
+             }).filter(function (changeset) {
+               var comment = changeset.tags.comment;
+               return comment && comment !== '';
+             });
+             return callback(undefined, _userChangesets);
+           }
+         },
+         // Fetch the status of the OSM API
+         // GET /api/capabilities
+         status: function status(callback) {
+           var url = urlroot + '/api/capabilities';
+           var errback = wrapcb(this, done, _connectionID);
+           d3_xml(url).then(function (data) {
+             errback(null, data);
+           })["catch"](function (err) {
+             errback(err.message);
+           });
+
+           function done(err, xml) {
+             if (err) {
+               // the status is null if no response could be retrieved
+               return callback(err, null);
+             } // update blocklists
+
+
+             var elements = xml.getElementsByTagName('blacklist');
+             var regexes = [];
+
+             for (var i = 0; i < elements.length; i++) {
+               var regexString = elements[i].getAttribute('regex'); // needs unencode?
+
+               if (regexString) {
+                 try {
+                   var regex = new RegExp(regexString);
+                   regexes.push(regex);
+                 } catch (e) {
+                   /* noop */
+                 }
+               }
+             }
+
+             if (regexes.length) {
+               _imageryBlocklists = regexes;
+             }
+
+             if (_rateLimitError) {
+               return callback(_rateLimitError, 'rateLimited');
+             } else {
+               var waynodes = xml.getElementsByTagName('waynodes');
+               var maxWayNodes = waynodes.length && parseInt(waynodes[0].getAttribute('maximum'), 10);
+               if (maxWayNodes && isFinite(maxWayNodes)) _maxWayNodes = maxWayNodes;
+               var apiStatus = xml.getElementsByTagName('status');
+               var val = apiStatus[0].getAttribute('api');
+               return callback(undefined, val);
+             }
+           }
+         },
+         // Calls `status` and dispatches an `apiStatusChange` event if the returned
+         // status differs from the cached status.
+         reloadApiStatus: function reloadApiStatus() {
+           // throttle to avoid unnecessary API calls
+           if (!this.throttledReloadApiStatus) {
+             var that = this;
+             this.throttledReloadApiStatus = throttle(function () {
+               that.status(function (err, status) {
+                 if (status !== _cachedApiStatus) {
+                   _cachedApiStatus = status;
+                   dispatch$2.call('apiStatusChange', that, err, status);
+                 }
+               });
+             }, 500);
+           }
+
+           this.throttledReloadApiStatus();
+         },
+         // Returns the maximum number of nodes a single way can have
+         maxWayNodes: function maxWayNodes() {
+           return _maxWayNodes;
+         },
+         // Load data (entities) from the API in tiles
+         // GET /api/0.6/map?bbox=
+         loadTiles: function loadTiles(projection, callback) {
+           if (_off) return; // determine the needed tiles to cover the view
+
+           var tiles = tiler$2.zoomExtent([_tileZoom, _tileZoom]).getTiles(projection); // abort inflight requests that are no longer needed
+
+           var hadRequests = hasInflightRequests(_tileCache);
+           abortUnwantedRequests(_tileCache, tiles);
+
+           if (hadRequests && !hasInflightRequests(_tileCache)) {
+             dispatch$2.call('loaded'); // stop the spinner
+           } // issue new requests..
+
+
+           tiles.forEach(function (tile) {
+             this.loadTile(tile, callback);
+           }, this);
+         },
+         // Load a single data tile
+         // GET /api/0.6/map?bbox=
+         loadTile: function loadTile(tile, callback) {
+           if (_off) return;
+           if (_tileCache.loaded[tile.id] || _tileCache.inflight[tile.id]) return;
+
+           if (!hasInflightRequests(_tileCache)) {
+             dispatch$2.call('loading'); // start the spinner
+           }
+
+           var path = '/api/0.6/map.json?bbox=';
+           var options = {
+             skipSeen: true
+           };
+           _tileCache.inflight[tile.id] = this.loadFromAPI(path + tile.extent.toParam(), tileCallback, options);
+
+           function tileCallback(err, parsed) {
+             delete _tileCache.inflight[tile.id];
+
+             if (!err) {
+               delete _tileCache.toLoad[tile.id];
+               _tileCache.loaded[tile.id] = true;
+               var bbox = tile.extent.bbox();
+               bbox.id = tile.id;
+
+               _tileCache.rtree.insert(bbox);
+             }
+
+             if (callback) {
+               callback(err, Object.assign({
+                 data: parsed
+               }, tile));
+             }
+
+             if (!hasInflightRequests(_tileCache)) {
+               dispatch$2.call('loaded'); // stop the spinner
+             }
+           }
+         },
+         isDataLoaded: function isDataLoaded(loc) {
+           var bbox = {
+             minX: loc[0],
+             minY: loc[1],
+             maxX: loc[0],
+             maxY: loc[1]
+           };
+           return _tileCache.rtree.collides(bbox);
+         },
+         // load the tile that covers the given `loc`
+         loadTileAtLoc: function loadTileAtLoc(loc, callback) {
+           // Back off if the toLoad queue is filling up.. re #6417
+           // (Currently `loadTileAtLoc` requests are considered low priority - used by operations to
+           // let users safely edit geometries which extend to unloaded tiles.  We can drop some.)
+           if (Object.keys(_tileCache.toLoad).length > 50) return;
+           var k = geoZoomToScale(_tileZoom + 1);
+           var offset = geoRawMercator().scale(k)(loc);
+           var projection = geoRawMercator().transform({
+             k: k,
+             x: -offset[0],
+             y: -offset[1]
+           });
+           var tiles = tiler$2.zoomExtent([_tileZoom, _tileZoom]).getTiles(projection);
+           tiles.forEach(function (tile) {
+             if (_tileCache.toLoad[tile.id] || _tileCache.loaded[tile.id] || _tileCache.inflight[tile.id]) return;
+             _tileCache.toLoad[tile.id] = true;
+             this.loadTile(tile, callback);
+           }, this);
+         },
+         // Load notes from the API in tiles
+         // GET /api/0.6/notes?bbox=
+         loadNotes: function loadNotes(projection, noteOptions) {
+           noteOptions = Object.assign({
+             limit: 10000,
+             closed: 7
+           }, noteOptions);
+           if (_off) return;
+           var that = this;
+           var path = '/api/0.6/notes?limit=' + noteOptions.limit + '&closed=' + noteOptions.closed + '&bbox=';
+
+           var throttleLoadUsers = throttle(function () {
+             var uids = Object.keys(_userCache.toLoad);
+             if (!uids.length) return;
+             that.loadUsers(uids, function () {}); // eagerly load user details
+           }, 750); // determine the needed tiles to cover the view
+
+
+           var tiles = tiler$2.zoomExtent([_noteZoom, _noteZoom]).getTiles(projection); // abort inflight requests that are no longer needed
+
+           abortUnwantedRequests(_noteCache, tiles); // issue new requests..
+
+           tiles.forEach(function (tile) {
+             if (_noteCache.loaded[tile.id] || _noteCache.inflight[tile.id]) return;
+             var options = {
+               skipSeen: false
+             };
+             _noteCache.inflight[tile.id] = that.loadFromAPI(path + tile.extent.toParam(), function (err) {
+               delete _noteCache.inflight[tile.id];
+
+               if (!err) {
+                 _noteCache.loaded[tile.id] = true;
+               }
+
+               throttleLoadUsers();
+               dispatch$2.call('loadedNotes');
+             }, options);
+           });
+         },
+         // Create a note
+         // POST /api/0.6/notes?params
+         postNoteCreate: function postNoteCreate(note, callback) {
+           if (!this.authenticated()) {
+             return callback({
+               message: 'Not Authenticated',
+               status: -3
+             }, note);
+           }
+
+           if (_noteCache.inflightPost[note.id]) {
+             return callback({
+               message: 'Note update already inflight',
+               status: -2
+             }, note);
+           }
+
+           if (!note.loc[0] || !note.loc[1] || !note.newComment) return; // location & description required
+
+           var comment = note.newComment;
+
+           if (note.newCategory && note.newCategory !== 'None') {
+             comment += ' #' + note.newCategory;
+           }
+
+           var path = '/api/0.6/notes?' + utilQsString({
+             lon: note.loc[0],
+             lat: note.loc[1],
+             text: comment
+           });
+           _noteCache.inflightPost[note.id] = oauth.xhr({
+             method: 'POST',
+             path: path
+           }, wrapcb(this, done, _connectionID));
+
+           function done(err, xml) {
+             delete _noteCache.inflightPost[note.id];
+
+             if (err) {
+               return callback(err);
+             } // we get the updated note back, remove from caches and reparse..
+
+
+             this.removeNote(note);
+             var options = {
+               skipSeen: false
+             };
+             return parseXML(xml, function (err, results) {
+               if (err) {
+                 return callback(err);
+               } else {
+                 return callback(undefined, results[0]);
+               }
+             }, options);
+           }
+         },
+         // Update a note
+         // POST /api/0.6/notes/#id/comment?text=comment
+         // POST /api/0.6/notes/#id/close?text=comment
+         // POST /api/0.6/notes/#id/reopen?text=comment
+         postNoteUpdate: function postNoteUpdate(note, newStatus, callback) {
+           if (!this.authenticated()) {
+             return callback({
+               message: 'Not Authenticated',
+               status: -3
+             }, note);
+           }
+
+           if (_noteCache.inflightPost[note.id]) {
+             return callback({
+               message: 'Note update already inflight',
+               status: -2
+             }, note);
+           }
+
+           var action;
+
+           if (note.status !== 'closed' && newStatus === 'closed') {
+             action = 'close';
+           } else if (note.status !== 'open' && newStatus === 'open') {
+             action = 'reopen';
+           } else {
+             action = 'comment';
+             if (!note.newComment) return; // when commenting, comment required
+           }
+
+           var path = '/api/0.6/notes/' + note.id + '/' + action;
+
+           if (note.newComment) {
+             path += '?' + utilQsString({
+               text: note.newComment
+             });
+           }
+
+           _noteCache.inflightPost[note.id] = oauth.xhr({
+             method: 'POST',
+             path: path
+           }, wrapcb(this, done, _connectionID));
+
+           function done(err, xml) {
+             delete _noteCache.inflightPost[note.id];
+
+             if (err) {
+               return callback(err);
+             } // we get the updated note back, remove from caches and reparse..
+
+
+             this.removeNote(note); // update closed note cache - used to populate `closed:note` changeset tag
+
+             if (action === 'close') {
+               _noteCache.closed[note.id] = true;
+             } else if (action === 'reopen') {
+               delete _noteCache.closed[note.id];
+             }
+
+             var options = {
+               skipSeen: false
+             };
+             return parseXML(xml, function (err, results) {
+               if (err) {
+                 return callback(err);
+               } else {
+                 return callback(undefined, results[0]);
+               }
+             }, options);
+           }
+         },
+         "switch": function _switch(options) {
+           urlroot = options.urlroot;
+           oauth.options(Object.assign({
+             url: urlroot,
+             loading: authLoading,
+             done: authDone
+           }, options));
+           this.reset();
+           this.userChangesets(function () {}); // eagerly load user details/changesets
+
+           dispatch$2.call('change');
+           return this;
+         },
+         toggle: function toggle(val) {
+           _off = !val;
+           return this;
+         },
+         isChangesetInflight: function isChangesetInflight() {
+           return !!_changeset.inflight;
+         },
+         // get/set cached data
+         // This is used to save/restore the state when entering/exiting the walkthrough
+         // Also used for testing purposes.
+         caches: function caches(obj) {
+           function cloneCache(source) {
+             var target = {};
+             Object.keys(source).forEach(function (k) {
+               if (k === 'rtree') {
+                 target.rtree = new RBush().fromJSON(source.rtree.toJSON()); // clone rbush
+               } else if (k === 'note') {
+                 target.note = {};
+                 Object.keys(source.note).forEach(function (id) {
+                   target.note[id] = osmNote(source.note[id]); // copy notes
+                 });
+               } else {
+                 target[k] = JSON.parse(JSON.stringify(source[k])); // clone deep
+               }
+             });
+             return target;
+           }
+
+           if (!arguments.length) {
+             return {
+               tile: cloneCache(_tileCache),
+               note: cloneCache(_noteCache),
+               user: cloneCache(_userCache)
+             };
+           } // access caches directly for testing (e.g., loading notes rtree)
+
+
+           if (obj === 'get') {
+             return {
+               tile: _tileCache,
+               note: _noteCache,
+               user: _userCache
+             };
+           }
+
+           if (obj.tile) {
+             _tileCache = obj.tile;
+             _tileCache.inflight = {};
+           }
+
+           if (obj.note) {
+             _noteCache = obj.note;
+             _noteCache.inflight = {};
+             _noteCache.inflightPost = {};
+           }
+
+           if (obj.user) {
+             _userCache = obj.user;
+           }
+
+           return this;
+         },
+         logout: function logout() {
+           _userChangesets = undefined;
+           _userDetails = undefined;
+           oauth.logout();
+           dispatch$2.call('change');
+           return this;
+         },
+         authenticated: function authenticated() {
+           return oauth.authenticated();
+         },
+         authenticate: function authenticate(callback) {
+           var that = this;
+           var cid = _connectionID;
+           _userChangesets = undefined;
+           _userDetails = undefined;
+
+           function done(err, res) {
+             if (err) {
+               if (callback) callback(err);
+               return;
+             }
+
+             if (that.getConnectionId() !== cid) {
+               if (callback) callback({
+                 message: 'Connection Switched',
+                 status: -1
+               });
+               return;
+             }
+
+             _rateLimitError = undefined;
+             dispatch$2.call('change');
+             if (callback) callback(err, res);
+             that.userChangesets(function () {}); // eagerly load user details/changesets
+           }
+
+           return oauth.authenticate(done);
+         },
+         imageryBlocklists: function imageryBlocklists() {
+           return _imageryBlocklists;
+         },
+         tileZoom: function tileZoom(val) {
+           if (!arguments.length) return _tileZoom;
+           _tileZoom = val;
+           return this;
+         },
+         // get all cached notes covering the viewport
+         notes: function notes(projection) {
+           var viewport = projection.clipExtent();
+           var min = [viewport[0][0], viewport[1][1]];
+           var max = [viewport[1][0], viewport[0][1]];
+           var bbox = geoExtent(projection.invert(min), projection.invert(max)).bbox();
+           return _noteCache.rtree.search(bbox).map(function (d) {
+             return d.data;
+           });
+         },
+         // get a single note from the cache
+         getNote: function getNote(id) {
+           return _noteCache.note[id];
+         },
+         // remove a single note from the cache
+         removeNote: function removeNote(note) {
+           if (!(note instanceof osmNote) || !note.id) return;
+           delete _noteCache.note[note.id];
+           updateRtree(encodeNoteRtree(note), false); // false = remove
+         },
+         // replace a single note in the cache
+         replaceNote: function replaceNote(note) {
+           if (!(note instanceof osmNote) || !note.id) return;
+           _noteCache.note[note.id] = note;
+           updateRtree(encodeNoteRtree(note), true); // true = replace
+
+           return note;
+         },
+         // Get an array of note IDs closed during this session.
+         // Used to populate `closed:note` changeset tag
+         getClosedIDs: function getClosedIDs() {
+           return Object.keys(_noteCache.closed).sort();
+         }
+       };
 
-        minOverlap = minArea = Infinity;
+       var _apibase$1 = 'https://wiki.openstreetmap.org/w/api.php';
+       var _inflight$1 = {};
+       var _wikibaseCache = {};
+       var _localeIDs = {
+         en: false
+       };
 
-        for (i = m; i <= M - m; i++) {
-            bbox1 = distBBox(node, 0, i, this.toBBox);
-            bbox2 = distBBox(node, i, M, this.toBBox);
+       var debouncedRequest$1 = debounce(request$1, 500, {
+         leading: false
+       });
+
+       function request$1(url, callback) {
+         if (_inflight$1[url]) return;
+         var controller = new AbortController();
+         _inflight$1[url] = controller;
+         d3_json(url, {
+           signal: controller.signal
+         }).then(function (result) {
+           delete _inflight$1[url];
+           if (callback) callback(null, result);
+         })["catch"](function (err) {
+           delete _inflight$1[url];
+           if (err.name === 'AbortError') return;
+           if (callback) callback(err.message);
+         });
+       }
 
-            overlap = intersectionArea(bbox1, bbox2);
-            area = bboxArea(bbox1) + bboxArea(bbox2);
+       var serviceOsmWikibase = {
+         init: function init() {
+           _inflight$1 = {};
+           _wikibaseCache = {};
+           _localeIDs = {};
+         },
+         reset: function reset() {
+           Object.values(_inflight$1).forEach(function (controller) {
+             controller.abort();
+           });
+           _inflight$1 = {};
+         },
+
+         /**
+          * Get the best value for the property, or undefined if not found
+          * @param entity object from wikibase
+          * @param property string e.g. 'P4' for image
+          * @param langCode string e.g. 'fr' for French
+          */
+         claimToValue: function claimToValue(entity, property, langCode) {
+           if (!entity.claims[property]) return undefined;
+           var locale = _localeIDs[langCode];
+           var preferredPick, localePick;
+           entity.claims[property].forEach(function (stmt) {
+             // If exists, use value limited to the needed language (has a qualifier P26 = locale)
+             // Or if not found, use the first value with the "preferred" rank
+             if (!preferredPick && stmt.rank === 'preferred') {
+               preferredPick = stmt;
+             }
+
+             if (locale && stmt.qualifiers && stmt.qualifiers.P26 && stmt.qualifiers.P26[0].datavalue.value.id === locale) {
+               localePick = stmt;
+             }
+           });
+           var result = localePick || preferredPick;
+
+           if (result) {
+             var datavalue = result.mainsnak.datavalue;
+             return datavalue.type === 'wikibase-entityid' ? datavalue.value.id : datavalue.value;
+           } else {
+             return undefined;
+           }
+         },
+
+         /**
+          * Convert monolingual property into a key-value object (language -> value)
+          * @param entity object from wikibase
+          * @param property string e.g. 'P31' for monolingual wiki page title
+          */
+         monolingualClaimToValueObj: function monolingualClaimToValueObj(entity, property) {
+           if (!entity || !entity.claims[property]) return undefined;
+           return entity.claims[property].reduce(function (acc, obj) {
+             var value = obj.mainsnak.datavalue.value;
+             acc[value.language] = value.text;
+             return acc;
+           }, {});
+         },
+         toSitelink: function toSitelink(key, value) {
+           var result = value ? 'Tag:' + key + '=' + value : 'Key:' + key;
+           return result.replace(/_/g, ' ').trim();
+         },
+         //
+         // Pass params object of the form:
+         // {
+         //   key: 'string',
+         //   value: 'string',
+         //   langCode: 'string'
+         // }
+         //
+         getEntity: function getEntity(params, callback) {
+           var doRequest = params.debounce ? debouncedRequest$1 : request$1;
+           var that = this;
+           var titles = [];
+           var result = {};
+           var rtypeSitelink = params.key === 'type' && params.value ? ('Relation:' + params.value).replace(/_/g, ' ').trim() : false;
+           var keySitelink = params.key ? this.toSitelink(params.key) : false;
+           var tagSitelink = params.key && params.value ? this.toSitelink(params.key, params.value) : false;
+           var localeSitelink;
+
+           if (params.langCodes) {
+             params.langCodes.forEach(function (langCode) {
+               if (_localeIDs[langCode] === undefined) {
+                 // If this is the first time we are asking about this locale,
+                 // fetch corresponding entity (if it exists), and cache it.
+                 // If there is no such entry, cache `false` value to avoid re-requesting it.
+                 localeSitelink = ('Locale:' + langCode).replace(/_/g, ' ').trim();
+                 titles.push(localeSitelink);
+               }
+             });
+           }
+
+           if (rtypeSitelink) {
+             if (_wikibaseCache[rtypeSitelink]) {
+               result.rtype = _wikibaseCache[rtypeSitelink];
+             } else {
+               titles.push(rtypeSitelink);
+             }
+           }
+
+           if (keySitelink) {
+             if (_wikibaseCache[keySitelink]) {
+               result.key = _wikibaseCache[keySitelink];
+             } else {
+               titles.push(keySitelink);
+             }
+           }
+
+           if (tagSitelink) {
+             if (_wikibaseCache[tagSitelink]) {
+               result.tag = _wikibaseCache[tagSitelink];
+             } else {
+               titles.push(tagSitelink);
+             }
+           }
+
+           if (!titles.length) {
+             // Nothing to do, we already had everything in the cache
+             return callback(null, result);
+           } // Requesting just the user language code
+           // If backend recognizes the code, it will perform proper fallbacks,
+           // and the result will contain the requested code. If not, all values are returned:
+           // {"zh-tw":{"value":"...","language":"zh-tw","source-language":"zh-hant"}
+           // {"pt-br":{"value":"...","language":"pt","for-language":"pt-br"}}
+
+
+           var obj = {
+             action: 'wbgetentities',
+             sites: 'wiki',
+             titles: titles.join('|'),
+             languages: params.langCodes.join('|'),
+             languagefallback: 1,
+             origin: '*',
+             format: 'json' // There is an MW Wikibase API bug https://phabricator.wikimedia.org/T212069
+             // We shouldn't use v1 until it gets fixed, but should switch to it afterwards
+             // formatversion: 2,
+
+           };
+           var url = _apibase$1 + '?' + utilQsString(obj);
+           doRequest(url, function (err, d) {
+             if (err) {
+               callback(err);
+             } else if (!d.success || d.error) {
+               callback(d.error.messages.map(function (v) {
+                 return v.html['*'];
+               }).join('<br>'));
+             } else {
+               var localeID = false;
+               Object.values(d.entities).forEach(function (res) {
+                 if (res.missing !== '') {
+                   var title = res.sitelinks.wiki.title;
+
+                   if (title === rtypeSitelink) {
+                     _wikibaseCache[rtypeSitelink] = res;
+                     result.rtype = res;
+                   } else if (title === keySitelink) {
+                     _wikibaseCache[keySitelink] = res;
+                     result.key = res;
+                   } else if (title === tagSitelink) {
+                     _wikibaseCache[tagSitelink] = res;
+                     result.tag = res;
+                   } else if (title === localeSitelink) {
+                     localeID = res.id;
+                   } else {
+                     console.log('Unexpected title ' + title); // eslint-disable-line no-console
+                   }
+                 }
+               });
+
+               if (localeSitelink) {
+                 // If locale ID is not found, store false to prevent repeated queries
+                 that.addLocale(params.langCodes[0], localeID);
+               }
+
+               callback(null, result);
+             }
+           });
+         },
+         //
+         // Pass params object of the form:
+         // {
+         //   key: 'string',     // required
+         //   value: 'string'    // optional
+         // }
+         //
+         // Get an result object used to display tag documentation
+         // {
+         //   title:        'string',
+         //   description:  'string',
+         //   editURL:      'string',
+         //   imageURL:     'string',
+         //   wiki:         { title: 'string', text: 'string', url: 'string' }
+         // }
+         //
+         getDocs: function getDocs(params, callback) {
+           var that = this;
+           var langCodes = _mainLocalizer.localeCodes().map(function (code) {
+             return code.toLowerCase();
+           });
+           params.langCodes = langCodes;
+           this.getEntity(params, function (err, data) {
+             if (err) {
+               callback(err);
+               return;
+             }
+
+             var entity = data.rtype || data.tag || data.key;
+
+             if (!entity) {
+               callback('No entity');
+               return;
+             }
+
+             var i;
+             var description;
+
+             for (i in langCodes) {
+               var _code = langCodes[i];
+
+               if (entity.descriptions[_code] && entity.descriptions[_code].language === _code) {
+                 description = entity.descriptions[_code];
+                 break;
+               }
+             }
+
+             if (!description && Object.values(entity.descriptions).length) description = Object.values(entity.descriptions)[0]; // prepare result
+
+             var result = {
+               title: entity.title,
+               description: description ? description.value : '',
+               descriptionLocaleCode: description ? description.language : '',
+               editURL: 'https://wiki.openstreetmap.org/wiki/' + entity.title
+             }; // add image
+
+             if (entity.claims) {
+               var imageroot;
+               var image = that.claimToValue(entity, 'P4', langCodes[0]);
+
+               if (image) {
+                 imageroot = 'https://commons.wikimedia.org/w/index.php';
+               } else {
+                 image = that.claimToValue(entity, 'P28', langCodes[0]);
+
+                 if (image) {
+                   imageroot = 'https://wiki.openstreetmap.org/w/index.php';
+                 }
+               }
+
+               if (imageroot && image) {
+                 result.imageURL = imageroot + '?' + utilQsString({
+                   title: 'Special:Redirect/file/' + image,
+                   width: 400
+                 });
+               }
+             } // Try to get a wiki page from tag data item first, followed by the corresponding key data item.
+             // If neither tag nor key data item contain a wiki page in the needed language nor English,
+             // get the first found wiki page from either the tag or the key item.
+
+
+             var rtypeWiki = that.monolingualClaimToValueObj(data.rtype, 'P31');
+             var tagWiki = that.monolingualClaimToValueObj(data.tag, 'P31');
+             var keyWiki = that.monolingualClaimToValueObj(data.key, 'P31');
+             var wikis = [rtypeWiki, tagWiki, keyWiki];
+
+             for (i in wikis) {
+               var wiki = wikis[i];
+
+               for (var j in langCodes) {
+                 var code = langCodes[j];
+                 var referenceId = langCodes[0].split('-')[0] !== 'en' && code.split('-')[0] === 'en' ? 'inspector.wiki_en_reference' : 'inspector.wiki_reference';
+                 var info = getWikiInfo(wiki, code, referenceId);
+
+                 if (info) {
+                   result.wiki = info;
+                   break;
+                 }
+               }
+
+               if (result.wiki) break;
+             }
+
+             callback(null, result); // Helper method to get wiki info if a given language exists
+
+             function getWikiInfo(wiki, langCode, tKey) {
+               if (wiki && wiki[langCode]) {
+                 return {
+                   title: wiki[langCode],
+                   text: tKey,
+                   url: 'https://wiki.openstreetmap.org/wiki/' + wiki[langCode]
+                 };
+               }
+             }
+           });
+         },
+         addLocale: function addLocale(langCode, qid) {
+           // Makes it easier to unit test
+           _localeIDs[langCode] = qid;
+         },
+         apibase: function apibase(val) {
+           if (!arguments.length) return _apibase$1;
+           _apibase$1 = val;
+           return this;
+         }
+       };
 
-            // choose distribution with minimum overlap
-            if (overlap < minOverlap) {
-                minOverlap = overlap;
-                index = i;
-
-                minArea = area < minArea ? area : minArea;
-
-            } else if (overlap === minOverlap) {
-                // otherwise choose distribution with minimum area
-                if (area < minArea) {
-                    minArea = area;
-                    index = i;
-                }
-            }
-        }
+       var jsonpCache = {};
+       window.jsonpCache = jsonpCache;
+       function jsonpRequest(url, callback) {
+         var request = {
+           abort: function abort() {}
+         };
+
+         if (window.JSONP_FIX) {
+           if (window.JSONP_DELAY === 0) {
+             callback(window.JSONP_FIX);
+           } else {
+             var t = window.setTimeout(function () {
+               callback(window.JSONP_FIX);
+             }, window.JSONP_DELAY || 0);
+
+             request.abort = function () {
+               window.clearTimeout(t);
+             };
+           }
+
+           return request;
+         }
+
+         function rand() {
+           var chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz';
+           var c = '';
+           var i = -1;
+
+           while (++i < 15) {
+             c += chars.charAt(Math.floor(Math.random() * 52));
+           }
+
+           return c;
+         }
+
+         function create(url) {
+           var e = url.match(/callback=(\w+)/);
+           var c = e ? e[1] : rand();
+
+           jsonpCache[c] = function (data) {
+             if (jsonpCache[c]) {
+               callback(data);
+             }
+
+             finalize();
+           };
+
+           function finalize() {
+             delete jsonpCache[c];
+             script.remove();
+           }
+
+           request.abort = finalize;
+           return 'jsonpCache.' + c;
+         }
+
+         var cb = create(url);
+         var script = select('head').append('script').attr('type', 'text/javascript').attr('src', url.replace(/(\{|%7B)callback(\}|%7D)/, cb));
+         return request;
+       }
 
-        return index;
-    },
+       var bubbleApi = 'https://dev.virtualearth.net/mapcontrol/HumanScaleServices/GetBubbles.ashx?';
+       var streetsideImagesApi = 'https://t.ssl.ak.tiles.virtualearth.net/tiles/';
+       var bubbleAppKey = 'AuftgJsO0Xs8Ts4M1xZUQJQXJNsvmh3IV8DkNieCiy3tCwCUMq76-WpkrBtNAuEm';
+       var pannellumViewerCSS = 'pannellum-streetside/pannellum.css';
+       var pannellumViewerJS = 'pannellum-streetside/pannellum.js';
+       var maxResults = 2000;
+       var tileZoom = 16.5;
+       var tiler$1 = utilTiler().zoomExtent([tileZoom, tileZoom]).skipNullIsland(true);
+       var dispatch$1 = dispatch$8('loadedImages', 'viewerChanged');
+       var minHfov = 10; // zoom in degrees:  20, 10, 5
+
+       var maxHfov = 90; // zoom out degrees
+
+       var defaultHfov = 45;
+       var _hires = false;
+       var _resolution = 512; // higher numbers are slower - 512, 1024, 2048, 4096
+
+       var _currScene = 0;
+
+       var _ssCache;
+
+       var _pannellumViewer;
+
+       var _sceneOptions = {
+         showFullscreenCtrl: false,
+         autoLoad: true,
+         compass: true,
+         yaw: 0,
+         minHfov: minHfov,
+         maxHfov: maxHfov,
+         hfov: defaultHfov,
+         type: 'cubemap',
+         cubeMap: []
+       };
 
-    // sorts node children by the best axis for split
-    _chooseSplitAxis: function (node, m, M) {
+       var _loadViewerPromise;
+       /**
+        * abortRequest().
+        */
 
-        var compareMinX = node.leaf ? this.compareMinX : compareNodeMinX,
-            compareMinY = node.leaf ? this.compareMinY : compareNodeMinY,
-            xMargin = this._allDistMargin(node, m, M, compareMinX),
-            yMargin = this._allDistMargin(node, m, M, compareMinY);
 
-        // if total distributions margin value is minimal for x, sort by minX,
-        // otherwise it's already sorted by minY
-        if (xMargin < yMargin) node.children.sort(compareMinX);
-    },
+       function abortRequest$1(i) {
+         i.abort();
+       }
+       /**
+        * localeTimeStamp().
+        */
+
+
+       function localeTimestamp(s) {
+         if (!s) return null;
+         var options = {
+           day: 'numeric',
+           month: 'short',
+           year: 'numeric'
+         };
+         var d = new Date(s);
+         if (isNaN(d.getTime())) return null;
+         return d.toLocaleString(_mainLocalizer.localeCode(), options);
+       }
+       /**
+        * loadTiles() wraps the process of generating tiles and then fetching image points for each tile.
+        */
+
+
+       function loadTiles(which, url, projection, margin) {
+         var tiles = tiler$1.margin(margin).getTiles(projection); // abort inflight requests that are no longer needed
+
+         var cache = _ssCache[which];
+         Object.keys(cache.inflight).forEach(function (k) {
+           var wanted = tiles.find(function (tile) {
+             return k.indexOf(tile.id + ',') === 0;
+           });
+
+           if (!wanted) {
+             abortRequest$1(cache.inflight[k]);
+             delete cache.inflight[k];
+           }
+         });
+         tiles.forEach(function (tile) {
+           return loadNextTilePage(which, url, tile);
+         });
+       }
+       /**
+        * loadNextTilePage() load data for the next tile page in line.
+        */
+
+
+       function loadNextTilePage(which, url, tile) {
+         var cache = _ssCache[which];
+         var nextPage = cache.nextPage[tile.id] || 0;
+         var id = tile.id + ',' + String(nextPage);
+         if (cache.loaded[id] || cache.inflight[id]) return;
+         cache.inflight[id] = getBubbles(url, tile, function (bubbles) {
+           cache.loaded[id] = true;
+           delete cache.inflight[id];
+           if (!bubbles) return; // [].shift() removes the first element, some statistics info, not a bubble point
+
+           bubbles.shift();
+           var features = bubbles.map(function (bubble) {
+             if (cache.points[bubble.id]) return null; // skip duplicates
+
+             var loc = [bubble.lo, bubble.la];
+             var d = {
+               loc: loc,
+               key: bubble.id,
+               ca: bubble.he,
+               captured_at: bubble.cd,
+               captured_by: 'microsoft',
+               // nbn: bubble.nbn,
+               // pbn: bubble.pbn,
+               // ad: bubble.ad,
+               // rn: bubble.rn,
+               pr: bubble.pr,
+               // previous
+               ne: bubble.ne,
+               // next
+               pano: true,
+               sequenceKey: null
+             };
+             cache.points[bubble.id] = d; // a sequence starts here
+
+             if (bubble.pr === undefined) {
+               cache.leaders.push(bubble.id);
+             }
+
+             return {
+               minX: loc[0],
+               minY: loc[1],
+               maxX: loc[0],
+               maxY: loc[1],
+               data: d
+             };
+           }).filter(Boolean);
+           cache.rtree.load(features);
+           connectSequences();
+
+           if (which === 'bubbles') {
+             dispatch$1.call('loadedImages');
+           }
+         });
+       } // call this sometimes to connect the bubbles into sequences
+
+
+       function connectSequences() {
+         var cache = _ssCache.bubbles;
+         var keepLeaders = [];
+
+         for (var i = 0; i < cache.leaders.length; i++) {
+           var bubble = cache.points[cache.leaders[i]];
+           var seen = {}; // try to make a sequence.. use the key of the leader bubble.
+
+           var sequence = {
+             key: bubble.key,
+             bubbles: []
+           };
+           var complete = false;
+
+           do {
+             sequence.bubbles.push(bubble);
+             seen[bubble.key] = true;
+
+             if (bubble.ne === undefined) {
+               complete = true;
+             } else {
+               bubble = cache.points[bubble.ne]; // advance to next
+             }
+           } while (bubble && !seen[bubble.key] && !complete);
+
+           if (complete) {
+             _ssCache.sequences[sequence.key] = sequence; // assign bubbles to the sequence
+
+             for (var j = 0; j < sequence.bubbles.length; j++) {
+               sequence.bubbles[j].sequenceKey = sequence.key;
+             } // create a GeoJSON LineString
+
+
+             sequence.geojson = {
+               type: 'LineString',
+               properties: {
+                 captured_at: sequence.bubbles[0] ? sequence.bubbles[0].captured_at : null,
+                 captured_by: sequence.bubbles[0] ? sequence.bubbles[0].captured_by : null,
+                 key: sequence.key
+               },
+               coordinates: sequence.bubbles.map(function (d) {
+                 return d.loc;
+               })
+             };
+           } else {
+             keepLeaders.push(cache.leaders[i]);
+           }
+         } // couldn't complete these, save for later
+
+
+         cache.leaders = keepLeaders;
+       }
+       /**
+        * getBubbles() handles the request to the server for a tile extent of 'bubbles' (streetside image locations).
+        */
+
+
+       function getBubbles(url, tile, callback) {
+         var rect = tile.extent.rectangle();
+         var urlForRequest = url + utilQsString({
+           n: rect[3],
+           s: rect[1],
+           e: rect[2],
+           w: rect[0],
+           c: maxResults,
+           appkey: bubbleAppKey,
+           jsCallback: '{callback}'
+         });
+         return jsonpRequest(urlForRequest, function (data) {
+           if (!data || data.error) {
+             callback(null);
+           } else {
+             callback(data);
+           }
+         });
+       } // partition viewport into higher zoom tiles
+
+
+       function partitionViewport(projection) {
+         var z = geoScaleToZoom(projection.scale());
+         var z2 = Math.ceil(z * 2) / 2 + 2.5; // round to next 0.5 and add 2.5
+
+         var tiler = utilTiler().zoomExtent([z2, z2]);
+         return tiler.getTiles(projection).map(function (tile) {
+           return tile.extent;
+         });
+       } // no more than `limit` results per partition.
+
+
+       function searchLimited(limit, projection, rtree) {
+         limit = limit || 5;
+         return partitionViewport(projection).reduce(function (result, extent) {
+           var found = rtree.search(extent.bbox()).slice(0, limit).map(function (d) {
+             return d.data;
+           });
+           return found.length ? result.concat(found) : result;
+         }, []);
+       }
+       /**
+        * loadImage()
+        */
+
+
+       function loadImage(imgInfo) {
+         return new Promise(function (resolve) {
+           var img = new Image();
+
+           img.onload = function () {
+             var canvas = document.getElementById('ideditor-canvas' + imgInfo.face);
+             var ctx = canvas.getContext('2d');
+             ctx.drawImage(img, imgInfo.x, imgInfo.y);
+             resolve({
+               imgInfo: imgInfo,
+               status: 'ok'
+             });
+           };
+
+           img.onerror = function () {
+             resolve({
+               data: imgInfo,
+               status: 'error'
+             });
+           };
+
+           img.setAttribute('crossorigin', '');
+           img.src = imgInfo.url;
+         });
+       }
+       /**
+        * loadCanvas()
+        */
+
+
+       function loadCanvas(imageGroup) {
+         return Promise.all(imageGroup.map(loadImage)).then(function (data) {
+           var canvas = document.getElementById('ideditor-canvas' + data[0].imgInfo.face);
+           var which = {
+             '01': 0,
+             '02': 1,
+             '03': 2,
+             '10': 3,
+             '11': 4,
+             '12': 5
+           };
+           var face = data[0].imgInfo.face;
+           _sceneOptions.cubeMap[which[face]] = canvas.toDataURL('image/jpeg', 1.0);
+           return {
+             status: 'loadCanvas for face ' + data[0].imgInfo.face + 'ok'
+           };
+         });
+       }
+       /**
+        * loadFaces()
+        */
 
-    // total margin of all possible split distributions where each node is at least m full
-    _allDistMargin: function (node, m, M, compare) {
 
-        node.children.sort(compare);
+       function loadFaces(faceGroup) {
+         return Promise.all(faceGroup.map(loadCanvas)).then(function () {
+           return {
+             status: 'loadFaces done'
+           };
+         });
+       }
 
-        var toBBox = this.toBBox,
-            leftBBox = distBBox(node, 0, m, toBBox),
-            rightBBox = distBBox(node, M - m, M, toBBox),
-            margin = bboxMargin(leftBBox) + bboxMargin(rightBBox),
-            i, child;
+       function setupCanvas(selection, reset) {
+         if (reset) {
+           selection.selectAll('#ideditor-stitcher-canvases').remove();
+         } // Add the Streetside working canvases. These are used for 'stitching', or combining,
+         // multiple images for each of the six faces, before passing to the Pannellum control as DataUrls
 
-        for (i = m; i < M - m; i++) {
-            child = node.children[i];
-            extend(leftBBox, node.leaf ? toBBox(child) : child.bbox);
-            margin += bboxMargin(leftBBox);
-        }
 
-        for (i = M - m - 1; i >= m; i--) {
-            child = node.children[i];
-            extend(rightBBox, node.leaf ? toBBox(child) : child.bbox);
-            margin += bboxMargin(rightBBox);
-        }
+         selection.selectAll('#ideditor-stitcher-canvases').data([0]).enter().append('div').attr('id', 'ideditor-stitcher-canvases').attr('display', 'none').selectAll('canvas').data(['canvas01', 'canvas02', 'canvas03', 'canvas10', 'canvas11', 'canvas12']).enter().append('canvas').attr('id', function (d) {
+           return 'ideditor-' + d;
+         }).attr('width', _resolution).attr('height', _resolution);
+       }
 
-        return margin;
-    },
-
-    _adjustParentBBoxes: function (bbox, path, level) {
-        // adjust bboxes along the given tree path
-        for (var i = level; i >= 0; i--) {
-            extend(path[i].bbox, bbox);
-        }
-    },
-
-    _condense: function (path) {
-        // go through the path, removing empty nodes and updating bboxes
-        for (var i = path.length - 1, siblings; i >= 0; i--) {
-            if (path[i].children.length === 0) {
-                if (i > 0) {
-                    siblings = path[i - 1].children;
-                    siblings.splice(siblings.indexOf(path[i]), 1);
-
-                } else this.clear();
-
-            } else calcBBox(path[i], this.toBBox);
-        }
-    },
-
-    _initFormat: function (format) {
-        // data format (minX, minY, maxX, maxY accessors)
+       function qkToXY(qk) {
+         var x = 0;
+         var y = 0;
+         var scale = 256;
 
-        // uses eval-type function compilation instead of just accepting a toBBox function
-        // because the algorithms are very sensitive to sorting functions performance,
-        // so they should be dead simple and without inner calls
+         for (var i = qk.length; i > 0; i--) {
+           var key = qk[i - 1];
+           x += +(key === '1' || key === '3') * scale;
+           y += +(key === '2' || key === '3') * scale;
+           scale *= 2;
+         }
 
-        // jshint evil: true
-
-        var compareArr = ['return a', ' - b', ';'];
-
-        this.compareMinX = new Function('a', 'b', compareArr.join(format[0]));
-        this.compareMinY = new Function('a', 'b', compareArr.join(format[1]));
-
-        this.toBBox = new Function('a', 'return [a' + format.join(', a') + '];');
-    }
-};
-
-// calculate node's bbox from bboxes of its children
-function calcBBox(node, toBBox) {
-    node.bbox = distBBox(node, 0, node.children.length, toBBox);
-}
-
-// min bounding rectangle of node children from k to p-1
-function distBBox(node, k, p, toBBox) {
-    var bbox = empty();
-
-    for (var i = k, child; i < p; i++) {
-        child = node.children[i];
-        extend(bbox, node.leaf ? toBBox(child) : child.bbox);
-    }
-
-    return bbox;
-}
-
-
-function empty() { return [Infinity, Infinity, -Infinity, -Infinity]; }
-
-function extend(a, b) {
-    a[0] = Math.min(a[0], b[0]);
-    a[1] = Math.min(a[1], b[1]);
-    a[2] = Math.max(a[2], b[2]);
-    a[3] = Math.max(a[3], b[3]);
-    return a;
-}
-
-function compareNodeMinX(a, b) { return a.bbox[0] - b.bbox[0]; }
-function compareNodeMinY(a, b) { return a.bbox[1] - b.bbox[1]; }
-
-function bboxArea(a)   { return (a[2] - a[0]) * (a[3] - a[1]); }
-function bboxMargin(a) { return (a[2] - a[0]) + (a[3] - a[1]); }
-
-function enlargedArea(a, b) {
-    return (Math.max(b[2], a[2]) - Math.min(b[0], a[0])) *
-           (Math.max(b[3], a[3]) - Math.min(b[1], a[1]));
-}
-
-function intersectionArea (a, b) {
-    var minX = Math.max(a[0], b[0]),
-        minY = Math.max(a[1], b[1]),
-        maxX = Math.min(a[2], b[2]),
-        maxY = Math.min(a[3], b[3]);
-
-    return Math.max(0, maxX - minX) *
-           Math.max(0, maxY - minY);
-}
-
-function contains(a, b) {
-    return a[0] <= b[0] &&
-           a[1] <= b[1] &&
-           b[2] <= a[2] &&
-           b[3] <= a[3];
-}
-
-function intersects (a, b) {
-    return b[0] <= a[2] &&
-           b[1] <= a[3] &&
-           b[2] >= a[0] &&
-           b[3] >= a[1];
-}
-
-
-function partitionSort(arr, left, right, k, compare) {
-    var pivot;
-
-    while (true) {
-        pivot = Math.floor((left + right) / 2);
-        pivot = partition(arr, left, right, pivot, compare);
-
-        if (k === pivot) break;
-        else if (k < pivot) right = pivot - 1;
-        else left = pivot + 1;
-    }
-
-    partition(arr, left, right, k, compare);
-}
-
-function partition(arr, left, right, pivot, compare) {
-    var k = left,
-        value = arr[pivot];
-
-    swap(arr, pivot, right);
-
-    for (var i = left; i < right; i++) {
-        if (compare(arr[i], value) < 0) {
-            swap(arr, k, i);
-            k++;
-        }
-    }
-    swap(arr, right, k);
-
-    return k;
-}
-
-function swap(arr, i, j) {
-    var tmp = arr[i];
-    arr[i] = arr[j];
-    arr[j] = tmp;
-}
-
-
-// export as AMD/CommonJS module or global variable
-if (typeof define === 'function' && define.amd) define(function() { return rbush; });
-else if (typeof module !== 'undefined') module.exports = rbush;
-else if (typeof self !== 'undefined') self.rbush = rbush;
-else window.rbush = rbush;
-
-})();(function(e){if("function"==typeof bootstrap)bootstrap("sexagesimal",e);else if("object"==typeof exports)module.exports=e();else if("function"==typeof define&&define.amd)define(e);else if("undefined"!=typeof ses){if(!ses.ok())return;ses.makeSexagesimal=e}else"undefined"!=typeof window?window.sexagesimal=e():global.sexagesimal=e()})(function(){var define,ses,bootstrap,module,exports;
-return (function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);throw new Error("Cannot find module '"+o+"'")}var f=n[o]={exports:{}};t[o][0].call(f.exports,function(e){var n=t[o][1][e];return s(n?n:e)},f,f.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o<r.length;o++)s(r[o]);return s})({1:[function(require,module,exports){
-module.exports = element;
-module.exports.pair = pair;
-module.exports.format = format;
-module.exports.formatPair = formatPair;
-
-function element(x, dims) {
-    return search(x, dims).val;
-}
-
-function formatPair(x) {
-    return format(x.lat, 'lat') + ' ' + format(x.lon, 'lon');
-}
-
-// Is 0 North or South?
-function format(x, dim) {
-    var dirs = {
-            lat: ['N', 'S'],
-            lon: ['E', 'W']
-        }[dim] || '',
-        dir = dirs[x >= 0 ? 0 : 1],
-        abs = Math.abs(x),
-        whole = Math.floor(abs),
-        fraction = abs - whole,
-        fractionMinutes = fraction * 60,
-        minutes = Math.floor(fractionMinutes),
-        seconds = Math.floor((fractionMinutes - minutes) * 60);
-
-    return whole + '° ' +
-        (minutes ? minutes + "' " : '') +
-        (seconds ? seconds + '" ' : '') + dir;
-}
-
-function search(x, dims, r) {
-    if (!dims) dims = 'NSEW';
-    if (typeof x !== 'string') return { val: null, regex: r };
-    r = r || /[\s\,]*([\-|\—|\―]?[0-9.]+)°? *(?:([0-9.]+)['’′‘] *)?(?:([0-9.]+)(?:''|"|”|″) *)?([NSEW])?/gi;
-    var m = r.exec(x);
-    if (!m) return { val: null, regex: r };
-    else if (m[4] && dims.indexOf(m[4]) === -1) return { val: null, regex: r };
-    else return {
-        val: (((m[1]) ? parseFloat(m[1]) : 0) +
-            ((m[2] ? parseFloat(m[2]) / 60 : 0)) +
-            ((m[3] ? parseFloat(m[3]) / 3600 : 0))) *
-            ((m[4] && m[4] === 'S' || m[4] === 'W') ? -1 : 1),
-        regex: r,
-        raw: m[0],
-        dim: m[4]
-    };
-}
-
-function pair(x, dims) {
-    x = x.trim();
-    var one = search(x, dims);
-    if (one.val === null) return null;
-    var two = search(x, dims, one.regex);
-    if (two.val === null) return null;
-    // null if one/two are not contiguous.
-    if (one.raw + two.raw !== x) return null;
-    if (one.dim) return swapdim(one.val, two.val, one.dim);
-    else return [one.val, two.val];
-}
-
-function swapdim(a, b, dim) {
-    if (dim == 'N' || dim == 'S') return [a, b];
-    if (dim == 'W' || dim == 'E') return [b, a];
-}
-
-},{}]},{},[1])
-(1)
-});
-;toGeoJSON = (function() {
-    'use strict';
-
-    var removeSpace = (/\s*/g),
-        trimSpace = (/^\s*|\s*$/g),
-        splitSpace = (/\s+/);
-    // generate a short, numeric hash of a string
-    function okhash(x) {
-        if (!x || !x.length) return 0;
-        for (var i = 0, h = 0; i < x.length; i++) {
-            h = ((h << 5) - h) + x.charCodeAt(i) | 0;
-        } return h;
-    }
-    // all Y children of X
-    function get(x, y) { return x.getElementsByTagName(y); }
-    function attr(x, y) { return x.getAttribute(y); }
-    function attrf(x, y) { return parseFloat(attr(x, y)); }
-    // one Y child of X, if any, otherwise null
-    function get1(x, y) { var n = get(x, y); return n.length ? n[0] : null; }
-    // https://developer.mozilla.org/en-US/docs/Web/API/Node.normalize
-    function norm(el) { if (el.normalize) { el.normalize(); } return el; }
-    // cast array x into numbers
-    function numarray(x) {
-        for (var j = 0, o = []; j < x.length; j++) o[j] = parseFloat(x[j]);
-        return o;
-    }
-    function clean(x) {
-        var o = {};
-        for (var i in x) if (x[i]) o[i] = x[i];
-        return o;
-    }
-    // get the content of a text node, if any
-    function nodeVal(x) { if (x) {norm(x);} return x && x.firstChild && x.firstChild.nodeValue; }
-    // get one coordinate from a coordinate array, if any
-    function coord1(v) { return numarray(v.replace(removeSpace, '').split(',')); }
-    // get all coordinates from a coordinate array as [[],[]]
-    function coord(v) {
-        var coords = v.replace(trimSpace, '').split(splitSpace),
-            o = [];
-        for (var i = 0; i < coords.length; i++) {
-            o.push(coord1(coords[i]));
-        }
-        return o;
-    }
-    function coordPair(x) { return [attrf(x, 'lon'), attrf(x, 'lat')]; }
-
-    // create a new feature collection parent object
-    function fc() {
-        return {
-            type: 'FeatureCollection',
-            features: []
-        };
-    }
-
-    var styleSupport = false;
-    if (typeof XMLSerializer !== 'undefined') {
-        var serializer = new XMLSerializer();
-        styleSupport = true;
-    }
-    function xml2str(str) { return serializer.serializeToString(str); }
-
-    var t = {
-        kml: function(doc, o) {
-            o = o || {};
-
-            var gj = fc(),
-                // styleindex keeps track of hashed styles in order to match features
-                styleIndex = {},
-                // atomic geospatial types supported by KML - MultiGeometry is
-                // handled separately
-                geotypes = ['Polygon', 'LineString', 'Point', 'Track'],
-                // all root placemarks in the file
-                placemarks = get(doc, 'Placemark'),
-                styles = get(doc, 'Style');
-
-            if (styleSupport) for (var k = 0; k < styles.length; k++) {
-                styleIndex['#' + attr(styles[k], 'id')] = okhash(xml2str(styles[k])).toString(16);
-            }
-            for (var j = 0; j < placemarks.length; j++) {
-                gj.features = gj.features.concat(getPlacemark(placemarks[j]));
-            }
-            function gxCoord(v) { return numarray(v.split(' ')); }
-            function gxCoords(root) {
-                var elems = get(root, 'coord', 'gx'), coords = [];
-                for (var i = 0; i < elems.length; i++) coords.push(gxCoord(nodeVal(elems[i])));
-                return coords;
-            }
-            function getGeometry(root) {
-                var geomNode, geomNodes, i, j, k, geoms = [];
-                if (get1(root, 'MultiGeometry')) return getGeometry(get1(root, 'MultiGeometry'));
-                if (get1(root, 'MultiTrack')) return getGeometry(get1(root, 'MultiTrack'));
-                for (i = 0; i < geotypes.length; i++) {
-                    geomNodes = get(root, geotypes[i]);
-                    if (geomNodes) {
-                        for (j = 0; j < geomNodes.length; j++) {
-                            geomNode = geomNodes[j];
-                            if (geotypes[i] == 'Point') {
-                                geoms.push({
-                                    type: 'Point',
-                                    coordinates: coord1(nodeVal(get1(geomNode, 'coordinates')))
-                                });
-                            } else if (geotypes[i] == 'LineString') {
-                                geoms.push({
-                                    type: 'LineString',
-                                    coordinates: coord(nodeVal(get1(geomNode, 'coordinates')))
-                                });
-                            } else if (geotypes[i] == 'Polygon') {
-                                var rings = get(geomNode, 'LinearRing'),
-                                    coords = [];
-                                for (k = 0; k < rings.length; k++) {
-                                    coords.push(coord(nodeVal(get1(rings[k], 'coordinates'))));
-                                }
-                                geoms.push({
-                                    type: 'Polygon',
-                                    coordinates: coords
-                                });
-                            } else if (geotypes[i] == 'Track') {
-                                geoms.push({
-                                    type: 'LineString',
-                                    coordinates: gxCoords(geomNode)
-                                });
-                            }
-                        }
-                    }
-                }
-                return geoms;
-            }
-            function getPlacemark(root) {
-                var geoms = getGeometry(root), i, properties = {},
-                    name = nodeVal(get1(root, 'name')),
-                    styleUrl = nodeVal(get1(root, 'styleUrl')),
-                    description = nodeVal(get1(root, 'description')),
-                    extendedData = get1(root, 'ExtendedData');
-
-                if (!geoms.length) return [];
-                if (name) properties.name = name;
-                if (styleUrl && styleIndex[styleUrl]) {
-                    properties.styleUrl = styleUrl;
-                    properties.styleHash = styleIndex[styleUrl];
-                }
-                if (description) properties.description = description;
-                if (extendedData) {
-                    var datas = get(extendedData, 'Data'),
-                        simpleDatas = get(extendedData, 'SimpleData');
-
-                    for (i = 0; i < datas.length; i++) {
-                        properties[datas[i].getAttribute('name')] = nodeVal(get1(datas[i], 'value'));
-                    }
-                    for (i = 0; i < simpleDatas.length; i++) {
-                        properties[simpleDatas[i].getAttribute('name')] = nodeVal(simpleDatas[i]);
-                    }
-                }
-                return [{
-                    type: 'Feature',
-                    geometry: (geoms.length === 1) ? geoms[0] : {
-                        type: 'GeometryCollection',
-                        geometries: geoms
-                    },
-                    properties: properties
-                }];
-            }
-            return gj;
-        },
-        gpx: function(doc, o) {
-            var i,
-                tracks = get(doc, 'trk'),
-                routes = get(doc, 'rte'),
-                waypoints = get(doc, 'wpt'),
-                // a feature collection
-                gj = fc();
-            for (i = 0; i < tracks.length; i++) {
-                gj.features.push(getLinestring(tracks[i], 'trkpt'));
-            }
-            for (i = 0; i < routes.length; i++) {
-                gj.features.push(getLinestring(routes[i], 'rtept'));
-            }
-            for (i = 0; i < waypoints.length; i++) {
-                gj.features.push(getPoint(waypoints[i]));
-            }
-            function getLinestring(node, pointname) {
-                var j, pts = get(node, pointname), line = [];
-                for (j = 0; j < pts.length; j++) {
-                    line.push(coordPair(pts[j]));
-                }
-                return {
-                    type: 'Feature',
-                    properties: getProperties(node),
-                    geometry: {
-                        type: 'LineString',
-                        coordinates: line
-                    }
-                };
-            }
-            function getPoint(node) {
-                var prop = getProperties(node);
-                prop.ele = nodeVal(get1(node, 'ele'));
-                prop.sym = nodeVal(get1(node, 'sym'));
-                return {
-                    type: 'Feature',
-                    properties: prop,
-                    geometry: {
-                        type: 'Point',
-                        coordinates: coordPair(node)
-                    }
-                };
-            }
-            function getProperties(node) {
-                var meta = ['name', 'desc', 'author', 'copyright', 'link',
-                            'time', 'keywords'],
-                    prop = {},
-                    k;
-                for (k = 0; k < meta.length; k++) {
-                    prop[meta[k]] = nodeVal(get1(node, meta[k]));
-                }
-                return clean(prop);
-            }
-            return gj;
-        }
-    };
-    return t;
-})();
-
-if (typeof module !== 'undefined') module.exports = toGeoJSON;
-/**
- * marked - a markdown parser
- * Copyright (c) 2011-2013, Christopher Jeffrey. (MIT Licensed)
- * https://github.com/chjj/marked
- */
-
-;(function() {
-
-/**
- * Block-Level Grammar
- */
-
-var block = {
-  newline: /^\n+/,
-  code: /^( {4}[^\n]+\n*)+/,
-  fences: noop,
-  hr: /^( *[-*_]){3,} *(?:\n+|$)/,
-  heading: /^ *(#{1,6}) *([^\n]+?) *#* *(?:\n+|$)/,
-  nptable: noop,
-  lheading: /^([^\n]+)\n *(=|-){3,} *\n*/,
-  blockquote: /^( *>[^\n]+(\n[^\n]+)*\n*)+/,
-  list: /^( *)(bull) [\s\S]+?(?:hr|\n{2,}(?! )(?!\1bull )\n*|\s*$)/,
-  html: /^ *(?:comment|closed|closing) *(?:\n{2,}|\s*$)/,
-  def: /^ *\[([^\]]+)\]: *<?([^\s>]+)>?(?: +["(]([^\n]+)[")])? *(?:\n+|$)/,
-  table: noop,
-  paragraph: /^((?:[^\n]+\n?(?!hr|heading|lheading|blockquote|tag|def))+)\n*/,
-  text: /^[^\n]+/
-};
-
-block.bullet = /(?:[*+-]|\d+\.)/;
-block.item = /^( *)(bull) [^\n]*(?:\n(?!\1bull )[^\n]*)*/;
-block.item = replace(block.item, 'gm')
-  (/bull/g, block.bullet)
-  ();
-
-block.list = replace(block.list)
-  (/bull/g, block.bullet)
-  ('hr', /\n+(?=(?: *[-*_]){3,} *(?:\n+|$))/)
-  ();
-
-block._tag = '(?!(?:'
-  + 'a|em|strong|small|s|cite|q|dfn|abbr|data|time|code'
-  + '|var|samp|kbd|sub|sup|i|b|u|mark|ruby|rt|rp|bdi|bdo'
-  + '|span|br|wbr|ins|del|img)\\b)\\w+(?!:/|@)\\b';
-
-block.html = replace(block.html)
-  ('comment', /<!--[\s\S]*?-->/)
-  ('closed', /<(tag)[\s\S]+?<\/\1>/)
-  ('closing', /<tag(?:"[^"]*"|'[^']*'|[^'">])*?>/)
-  (/tag/g, block._tag)
-  ();
-
-block.paragraph = replace(block.paragraph)
-  ('hr', block.hr)
-  ('heading', block.heading)
-  ('lheading', block.lheading)
-  ('blockquote', block.blockquote)
-  ('tag', '<' + block._tag)
-  ('def', block.def)
-  ();
-
-/**
- * Normal Block Grammar
- */
-
-block.normal = merge({}, block);
-
-/**
- * GFM Block Grammar
- */
-
-block.gfm = merge({}, block.normal, {
-  fences: /^ *(`{3,}|~{3,}) *(\S+)? *\n([\s\S]+?)\s*\1 *(?:\n+|$)/,
-  paragraph: /^/
-});
-
-block.gfm.paragraph = replace(block.paragraph)
-  ('(?!', '(?!' + block.gfm.fences.source.replace('\\1', '\\2') + '|')
-  ();
-
-/**
- * GFM + Tables Block Grammar
- */
-
-block.tables = merge({}, block.gfm, {
-  nptable: /^ *(\S.*\|.*)\n *([-:]+ *\|[-| :]*)\n((?:.*\|.*(?:\n|$))*)\n*/,
-  table: /^ *\|(.+)\n *\|( *[-:]+[-| :]*)\n((?: *\|.*(?:\n|$))*)\n*/
-});
-
-/**
- * Block Lexer
- */
-
-function Lexer(options) {
-  this.tokens = [];
-  this.tokens.links = {};
-  this.options = options || marked.defaults;
-  this.rules = block.normal;
-
-  if (this.options.gfm) {
-    if (this.options.tables) {
-      this.rules = block.tables;
-    } else {
-      this.rules = block.gfm;
-    }
-  }
-}
-
-/**
- * Expose Block Rules
- */
-
-Lexer.rules = block;
-
-/**
- * Static Lex Method
- */
-
-Lexer.lex = function(src, options) {
-  var lexer = new Lexer(options);
-  return lexer.lex(src);
-};
-
-/**
- * Preprocessing
- */
-
-Lexer.prototype.lex = function(src) {
-  src = src
-    .replace(/\r\n|\r/g, '\n')
-    .replace(/\t/g, '    ')
-    .replace(/\u00a0/g, ' ')
-    .replace(/\u2424/g, '\n');
-
-  return this.token(src, true);
-};
-
-/**
- * Lexing
- */
-
-Lexer.prototype.token = function(src, top) {
-  var src = src.replace(/^ +$/gm, '')
-    , next
-    , loose
-    , cap
-    , bull
-    , b
-    , item
-    , space
-    , i
-    , l;
-
-  while (src) {
-    // newline
-    if (cap = this.rules.newline.exec(src)) {
-      src = src.substring(cap[0].length);
-      if (cap[0].length > 1) {
-        this.tokens.push({
-          type: 'space'
-        });
-      }
-    }
-
-    // code
-    if (cap = this.rules.code.exec(src)) {
-      src = src.substring(cap[0].length);
-      cap = cap[0].replace(/^ {4}/gm, '');
-      this.tokens.push({
-        type: 'code',
-        text: !this.options.pedantic
-          ? cap.replace(/\n+$/, '')
-          : cap
-      });
-      continue;
-    }
-
-    // fences (gfm)
-    if (cap = this.rules.fences.exec(src)) {
-      src = src.substring(cap[0].length);
-      this.tokens.push({
-        type: 'code',
-        lang: cap[2],
-        text: cap[3]
-      });
-      continue;
-    }
-
-    // heading
-    if (cap = this.rules.heading.exec(src)) {
-      src = src.substring(cap[0].length);
-      this.tokens.push({
-        type: 'heading',
-        depth: cap[1].length,
-        text: cap[2]
-      });
-      continue;
-    }
-
-    // table no leading pipe (gfm)
-    if (top && (cap = this.rules.nptable.exec(src))) {
-      src = src.substring(cap[0].length);
-
-      item = {
-        type: 'table',
-        header: cap[1].replace(/^ *| *\| *$/g, '').split(/ *\| */),
-        align: cap[2].replace(/^ *|\| *$/g, '').split(/ *\| */),
-        cells: cap[3].replace(/\n$/, '').split('\n')
-      };
-
-      for (i = 0; i < item.align.length; i++) {
-        if (/^ *-+: *$/.test(item.align[i])) {
-          item.align[i] = 'right';
-        } else if (/^ *:-+: *$/.test(item.align[i])) {
-          item.align[i] = 'center';
-        } else if (/^ *:-+ *$/.test(item.align[i])) {
-          item.align[i] = 'left';
-        } else {
-          item.align[i] = null;
-        }
-      }
-
-      for (i = 0; i < item.cells.length; i++) {
-        item.cells[i] = item.cells[i].split(/ *\| */);
-      }
-
-      this.tokens.push(item);
-
-      continue;
-    }
-
-    // lheading
-    if (cap = this.rules.lheading.exec(src)) {
-      src = src.substring(cap[0].length);
-      this.tokens.push({
-        type: 'heading',
-        depth: cap[2] === '=' ? 1 : 2,
-        text: cap[1]
-      });
-      continue;
-    }
-
-    // hr
-    if (cap = this.rules.hr.exec(src)) {
-      src = src.substring(cap[0].length);
-      this.tokens.push({
-        type: 'hr'
-      });
-      continue;
-    }
-
-    // blockquote
-    if (cap = this.rules.blockquote.exec(src)) {
-      src = src.substring(cap[0].length);
-
-      this.tokens.push({
-        type: 'blockquote_start'
-      });
-
-      cap = cap[0].replace(/^ *> ?/gm, '');
-
-      // Pass `top` to keep the current
-      // "toplevel" state. This is exactly
-      // how markdown.pl works.
-      this.token(cap, top);
-
-      this.tokens.push({
-        type: 'blockquote_end'
-      });
-
-      continue;
-    }
-
-    // list
-    if (cap = this.rules.list.exec(src)) {
-      src = src.substring(cap[0].length);
-      bull = cap[2];
-
-      this.tokens.push({
-        type: 'list_start',
-        ordered: bull.length > 1
-      });
-
-      // Get each top-level item.
-      cap = cap[0].match(this.rules.item);
-
-      next = false;
-      l = cap.length;
-      i = 0;
-
-      for (; i < l; i++) {
-        item = cap[i];
-
-        // Remove the list item's bullet
-        // so it is seen as the next token.
-        space = item.length;
-        item = item.replace(/^ *([*+-]|\d+\.) +/, '');
-
-        // Outdent whatever the
-        // list item contains. Hacky.
-        if (~item.indexOf('\n ')) {
-          space -= item.length;
-          item = !this.options.pedantic
-            ? item.replace(new RegExp('^ {1,' + space + '}', 'gm'), '')
-            : item.replace(/^ {1,4}/gm, '');
-        }
-
-        // Determine whether the next list item belongs here.
-        // Backpedal if it does not belong in this list.
-        if (this.options.smartLists && i !== l - 1) {
-          b = block.bullet.exec(cap[i+1])[0];
-          if (bull !== b && !(bull.length > 1 && b.length > 1)) {
-            src = cap.slice(i + 1).join('\n') + src;
-            i = l - 1;
-          }
-        }
-
-        // Determine whether item is loose or not.
-        // Use: /(^|\n)(?! )[^\n]+\n\n(?!\s*$)/
-        // for discount behavior.
-        loose = next || /\n\n(?!\s*$)/.test(item);
-        if (i !== l - 1) {
-          next = item[item.length-1] === '\n';
-          if (!loose) loose = next;
-        }
-
-        this.tokens.push({
-          type: loose
-            ? 'loose_item_start'
-            : 'list_item_start'
-        });
-
-        // Recurse.
-        this.token(item, false);
-
-        this.tokens.push({
-          type: 'list_item_end'
-        });
-      }
-
-      this.tokens.push({
-        type: 'list_end'
-      });
-
-      continue;
-    }
-
-    // html
-    if (cap = this.rules.html.exec(src)) {
-      src = src.substring(cap[0].length);
-      this.tokens.push({
-        type: this.options.sanitize
-          ? 'paragraph'
-          : 'html',
-        pre: cap[1] === 'pre' || cap[1] === 'script',
-        text: cap[0]
-      });
-      continue;
-    }
-
-    // def
-    if (top && (cap = this.rules.def.exec(src))) {
-      src = src.substring(cap[0].length);
-      this.tokens.links[cap[1].toLowerCase()] = {
-        href: cap[2],
-        title: cap[3]
-      };
-      continue;
-    }
-
-    // table (gfm)
-    if (top && (cap = this.rules.table.exec(src))) {
-      src = src.substring(cap[0].length);
-
-      item = {
-        type: 'table',
-        header: cap[1].replace(/^ *| *\| *$/g, '').split(/ *\| */),
-        align: cap[2].replace(/^ *|\| *$/g, '').split(/ *\| */),
-        cells: cap[3].replace(/(?: *\| *)?\n$/, '').split('\n')
-      };
-
-      for (i = 0; i < item.align.length; i++) {
-        if (/^ *-+: *$/.test(item.align[i])) {
-          item.align[i] = 'right';
-        } else if (/^ *:-+: *$/.test(item.align[i])) {
-          item.align[i] = 'center';
-        } else if (/^ *:-+ *$/.test(item.align[i])) {
-          item.align[i] = 'left';
-        } else {
-          item.align[i] = null;
-        }
-      }
-
-      for (i = 0; i < item.cells.length; i++) {
-        item.cells[i] = item.cells[i]
-          .replace(/^ *\| *| *\| *$/g, '')
-          .split(/ *\| */);
-      }
-
-      this.tokens.push(item);
-
-      continue;
-    }
-
-    // top-level paragraph
-    if (top && (cap = this.rules.paragraph.exec(src))) {
-      src = src.substring(cap[0].length);
-      this.tokens.push({
-        type: 'paragraph',
-        text: cap[1][cap[1].length-1] === '\n'
-          ? cap[1].slice(0, -1)
-          : cap[1]
-      });
-      continue;
-    }
-
-    // text
-    if (cap = this.rules.text.exec(src)) {
-      // Top-level should never reach here.
-      src = src.substring(cap[0].length);
-      this.tokens.push({
-        type: 'text',
-        text: cap[0]
-      });
-      continue;
-    }
-
-    if (src) {
-      throw new
-        Error('Infinite loop on byte: ' + src.charCodeAt(0));
-    }
-  }
-
-  return this.tokens;
-};
-
-/**
- * Inline-Level Grammar
- */
-
-var inline = {
-  escape: /^\\([\\`*{}\[\]()#+\-.!_>])/,
-  autolink: /^<([^ >]+(@|:\/)[^ >]+)>/,
-  url: noop,
-  tag: /^<!--[\s\S]*?-->|^<\/?\w+(?:"[^"]*"|'[^']*'|[^'">])*?>/,
-  link: /^!?\[(inside)\]\(href\)/,
-  reflink: /^!?\[(inside)\]\s*\[([^\]]*)\]/,
-  nolink: /^!?\[((?:\[[^\]]*\]|[^\[\]])*)\]/,
-  strong: /^__([\s\S]+?)__(?!_)|^\*\*([\s\S]+?)\*\*(?!\*)/,
-  em: /^\b_((?:__|[\s\S])+?)_\b|^\*((?:\*\*|[\s\S])+?)\*(?!\*)/,
-  code: /^(`+)\s*([\s\S]*?[^`])\s*\1(?!`)/,
-  br: /^ {2,}\n(?!\s*$)/,
-  del: noop,
-  text: /^[\s\S]+?(?=[\\<!\[_*`]| {2,}\n|$)/
-};
-
-inline._inside = /(?:\[[^\]]*\]|[^\]]|\](?=[^\[]*\]))*/;
-inline._href = /\s*<?([^\s]*?)>?(?:\s+['"]([\s\S]*?)['"])?\s*/;
-
-inline.link = replace(inline.link)
-  ('inside', inline._inside)
-  ('href', inline._href)
-  ();
-
-inline.reflink = replace(inline.reflink)
-  ('inside', inline._inside)
-  ();
-
-/**
- * Normal Inline Grammar
- */
-
-inline.normal = merge({}, inline);
-
-/**
- * Pedantic Inline Grammar
- */
-
-inline.pedantic = merge({}, inline.normal, {
-  strong: /^__(?=\S)([\s\S]*?\S)__(?!_)|^\*\*(?=\S)([\s\S]*?\S)\*\*(?!\*)/,
-  em: /^_(?=\S)([\s\S]*?\S)_(?!_)|^\*(?=\S)([\s\S]*?\S)\*(?!\*)/
-});
-
-/**
- * GFM Inline Grammar
- */
-
-inline.gfm = merge({}, inline.normal, {
-  escape: replace(inline.escape)('])', '~|])')(),
-  url: /^(https?:\/\/[^\s<]+[^<.,:;"')\]\s])/,
-  del: /^~~(?=\S)([\s\S]*?\S)~~/,
-  text: replace(inline.text)
-    (']|', '~]|')
-    ('|', '|https?://|')
-    ()
-});
-
-/**
- * GFM + Line Breaks Inline Grammar
- */
-
-inline.breaks = merge({}, inline.gfm, {
-  br: replace(inline.br)('{2,}', '*')(),
-  text: replace(inline.gfm.text)('{2,}', '*')()
-});
-
-/**
- * Inline Lexer & Compiler
- */
-
-function InlineLexer(links, options) {
-  this.options = options || marked.defaults;
-  this.links = links;
-  this.rules = inline.normal;
-
-  if (!this.links) {
-    throw new
-      Error('Tokens array requires a `links` property.');
-  }
-
-  if (this.options.gfm) {
-    if (this.options.breaks) {
-      this.rules = inline.breaks;
-    } else {
-      this.rules = inline.gfm;
-    }
-  } else if (this.options.pedantic) {
-    this.rules = inline.pedantic;
-  }
-}
-
-/**
- * Expose Inline Rules
- */
-
-InlineLexer.rules = inline;
-
-/**
- * Static Lexing/Compiling Method
- */
-
-InlineLexer.output = function(src, links, options) {
-  var inline = new InlineLexer(links, options);
-  return inline.output(src);
-};
-
-/**
- * Lexing/Compiling
- */
-
-InlineLexer.prototype.output = function(src) {
-  var out = ''
-    , link
-    , text
-    , href
-    , cap;
-
-  while (src) {
-    // escape
-    if (cap = this.rules.escape.exec(src)) {
-      src = src.substring(cap[0].length);
-      out += cap[1];
-      continue;
-    }
-
-    // autolink
-    if (cap = this.rules.autolink.exec(src)) {
-      src = src.substring(cap[0].length);
-      if (cap[2] === '@') {
-        text = cap[1][6] === ':'
-          ? this.mangle(cap[1].substring(7))
-          : this.mangle(cap[1]);
-        href = this.mangle('mailto:') + text;
-      } else {
-        text = escape(cap[1]);
-        href = text;
-      }
-      out += '<a href="'
-        + href
-        + '">'
-        + text
-        + '</a>';
-      continue;
-    }
-
-    // url (gfm)
-    if (cap = this.rules.url.exec(src)) {
-      src = src.substring(cap[0].length);
-      text = escape(cap[1]);
-      href = text;
-      out += '<a href="'
-        + href
-        + '">'
-        + text
-        + '</a>';
-      continue;
-    }
-
-    // tag
-    if (cap = this.rules.tag.exec(src)) {
-      src = src.substring(cap[0].length);
-      out += this.options.sanitize
-        ? escape(cap[0])
-        : cap[0];
-      continue;
-    }
-
-    // link
-    if (cap = this.rules.link.exec(src)) {
-      src = src.substring(cap[0].length);
-      out += this.outputLink(cap, {
-        href: cap[2],
-        title: cap[3]
-      });
-      continue;
-    }
-
-    // reflink, nolink
-    if ((cap = this.rules.reflink.exec(src))
-        || (cap = this.rules.nolink.exec(src))) {
-      src = src.substring(cap[0].length);
-      link = (cap[2] || cap[1]).replace(/\s+/g, ' ');
-      link = this.links[link.toLowerCase()];
-      if (!link || !link.href) {
-        out += cap[0][0];
-        src = cap[0].substring(1) + src;
-        continue;
-      }
-      out += this.outputLink(cap, link);
-      continue;
-    }
-
-    // strong
-    if (cap = this.rules.strong.exec(src)) {
-      src = src.substring(cap[0].length);
-      out += '<strong>'
-        + this.output(cap[2] || cap[1])
-        + '</strong>';
-      continue;
-    }
-
-    // em
-    if (cap = this.rules.em.exec(src)) {
-      src = src.substring(cap[0].length);
-      out += '<em>'
-        + this.output(cap[2] || cap[1])
-        + '</em>';
-      continue;
-    }
-
-    // code
-    if (cap = this.rules.code.exec(src)) {
-      src = src.substring(cap[0].length);
-      out += '<code>'
-        + escape(cap[2], true)
-        + '</code>';
-      continue;
-    }
-
-    // br
-    if (cap = this.rules.br.exec(src)) {
-      src = src.substring(cap[0].length);
-      out += '<br>';
-      continue;
-    }
-
-    // del (gfm)
-    if (cap = this.rules.del.exec(src)) {
-      src = src.substring(cap[0].length);
-      out += '<del>'
-        + this.output(cap[1])
-        + '</del>';
-      continue;
-    }
-
-    // text
-    if (cap = this.rules.text.exec(src)) {
-      src = src.substring(cap[0].length);
-      out += escape(cap[0]);
-      continue;
-    }
-
-    if (src) {
-      throw new
-        Error('Infinite loop on byte: ' + src.charCodeAt(0));
-    }
-  }
-
-  return out;
-};
-
-/**
- * Compile Link
- */
-
-InlineLexer.prototype.outputLink = function(cap, link) {
-  if (cap[0][0] !== '!') {
-    return '<a href="'
-      + escape(link.href)
-      + '"'
-      + (link.title
-      ? ' title="'
-      + escape(link.title)
-      + '"'
-      : '')
-      + '>'
-      + this.output(cap[1])
-      + '</a>';
-  } else {
-    return '<img src="'
-      + escape(link.href)
-      + '" alt="'
-      + escape(cap[1])
-      + '"'
-      + (link.title
-      ? ' title="'
-      + escape(link.title)
-      + '"'
-      : '')
-      + '>';
-  }
-};
-
-/**
- * Smartypants Transformations
- */
-
-InlineLexer.prototype.smartypants = function(text) {
-  if (!this.options.smartypants) return text;
-  return text
-    .replace(/--/g, '—')
-    .replace(/'([^']*)'/g, '‘$1’')
-    .replace(/"([^"]*)"/g, '“$1”')
-    .replace(/\.{3}/g, '…');
-};
-
-/**
- * Mangle Links
- */
-
-InlineLexer.prototype.mangle = function(text) {
-  var out = ''
-    , l = text.length
-    , i = 0
-    , ch;
-
-  for (; i < l; i++) {
-    ch = text.charCodeAt(i);
-    if (Math.random() > 0.5) {
-      ch = 'x' + ch.toString(16);
-    }
-    out += '&#' + ch + ';';
-  }
-
-  return out;
-};
-
-/**
- * Parsing & Compiling
- */
-
-function Parser(options) {
-  this.tokens = [];
-  this.token = null;
-  this.options = options || marked.defaults;
-}
-
-/**
- * Static Parse Method
- */
-
-Parser.parse = function(src, options) {
-  var parser = new Parser(options);
-  return parser.parse(src);
-};
-
-/**
- * Parse Loop
- */
-
-Parser.prototype.parse = function(src) {
-  this.inline = new InlineLexer(src.links, this.options);
-  this.tokens = src.reverse();
-
-  var out = '';
-  while (this.next()) {
-    out += this.tok();
-  }
-
-  return out;
-};
-
-/**
- * Next Token
- */
-
-Parser.prototype.next = function() {
-  return this.token = this.tokens.pop();
-};
-
-/**
- * Preview Next Token
- */
-
-Parser.prototype.peek = function() {
-  return this.tokens[this.tokens.length-1] || 0;
-};
-
-/**
- * Parse Text Tokens
- */
-
-Parser.prototype.parseText = function() {
-  var body = this.token.text;
-
-  while (this.peek().type === 'text') {
-    body += '\n' + this.next().text;
-  }
-
-  return this.inline.output(body);
-};
-
-/**
- * Parse Current Token
- */
-
-Parser.prototype.tok = function() {
-  switch (this.token.type) {
-    case 'space': {
-      return '';
-    }
-    case 'hr': {
-      return '<hr>\n';
-    }
-    case 'heading': {
-      return '<h'
-        + this.token.depth
-        + '>'
-        + this.inline.output(this.token.text)
-        + '</h'
-        + this.token.depth
-        + '>\n';
-    }
-    case 'code': {
-      if (this.options.highlight) {
-        var code = this.options.highlight(this.token.text, this.token.lang);
-        if (code != null && code !== this.token.text) {
-          this.token.escaped = true;
-          this.token.text = code;
-        }
-      }
-
-      if (!this.token.escaped) {
-        this.token.text = escape(this.token.text, true);
-      }
-
-      return '<pre><code'
-        + (this.token.lang
-        ? ' class="'
-        + this.options.langPrefix
-        + this.token.lang
-        + '"'
-        : '')
-        + '>'
-        + this.token.text
-        + '</code></pre>\n';
-    }
-    case 'table': {
-      var body = ''
-        , heading
-        , i
-        , row
-        , cell
-        , j;
-
-      // header
-      body += '<thead>\n<tr>\n';
-      for (i = 0; i < this.token.header.length; i++) {
-        heading = this.inline.output(this.token.header[i]);
-        body += this.token.align[i]
-          ? '<th align="' + this.token.align[i] + '">' + heading + '</th>\n'
-          : '<th>' + heading + '</th>\n';
-      }
-      body += '</tr>\n</thead>\n';
-
-      // body
-      body += '<tbody>\n'
-      for (i = 0; i < this.token.cells.length; i++) {
-        row = this.token.cells[i];
-        body += '<tr>\n';
-        for (j = 0; j < row.length; j++) {
-          cell = this.inline.output(row[j]);
-          body += this.token.align[j]
-            ? '<td align="' + this.token.align[j] + '">' + cell + '</td>\n'
-            : '<td>' + cell + '</td>\n';
-        }
-        body += '</tr>\n';
-      }
-      body += '</tbody>\n';
-
-      return '<table>\n'
-        + body
-        + '</table>\n';
-    }
-    case 'blockquote_start': {
-      var body = '';
-
-      while (this.next().type !== 'blockquote_end') {
-        body += this.tok();
-      }
-
-      return '<blockquote>\n'
-        + body
-        + '</blockquote>\n';
-    }
-    case 'list_start': {
-      var type = this.token.ordered ? 'ol' : 'ul'
-        , body = '';
-
-      while (this.next().type !== 'list_end') {
-        body += this.tok();
-      }
-
-      return '<'
-        + type
-        + '>\n'
-        + body
-        + '</'
-        + type
-        + '>\n';
-    }
-    case 'list_item_start': {
-      var body = '';
-
-      while (this.next().type !== 'list_item_end') {
-        body += this.token.type === 'text'
-          ? this.parseText()
-          : this.tok();
-      }
-
-      return '<li>'
-        + body
-        + '</li>\n';
-    }
-    case 'loose_item_start': {
-      var body = '';
-
-      while (this.next().type !== 'list_item_end') {
-        body += this.tok();
-      }
-
-      return '<li>'
-        + body
-        + '</li>\n';
-    }
-    case 'html': {
-      return !this.token.pre && !this.options.pedantic
-        ? this.inline.output(this.token.text)
-        : this.token.text;
-    }
-    case 'paragraph': {
-      return '<p>'
-        + this.inline.output(this.token.text)
-        + '</p>\n';
-    }
-    case 'text': {
-      return '<p>'
-        + this.parseText()
-        + '</p>\n';
-    }
-  }
-};
-
-/**
- * Helpers
- */
-
-function escape(html, encode) {
-  return html
-    .replace(!encode ? /&(?!#?\w+;)/g : /&/g, '&amp;')
-    .replace(/</g, '&lt;')
-    .replace(/>/g, '&gt;')
-    .replace(/"/g, '&quot;')
-    .replace(/'/g, '&#39;');
-}
-
-function replace(regex, opt) {
-  regex = regex.source;
-  opt = opt || '';
-  return function self(name, val) {
-    if (!name) return new RegExp(regex, opt);
-    val = val.source || val;
-    val = val.replace(/(^|[^\[])\^/g, '$1');
-    regex = regex.replace(name, val);
-    return self;
-  };
-}
-
-function noop() {}
-noop.exec = noop;
-
-function merge(obj) {
-  var i = 1
-    , target
-    , key;
-
-  for (; i < arguments.length; i++) {
-    target = arguments[i];
-    for (key in target) {
-      if (Object.prototype.hasOwnProperty.call(target, key)) {
-        obj[key] = target[key];
-      }
-    }
-  }
-
-  return obj;
-}
-
-/**
- * Marked
- */
-
-function marked(src, opt, callback) {
-  if (callback || typeof opt === 'function') {
-    if (!callback) {
-      callback = opt;
-      opt = null;
-    }
-
-    if (opt) opt = merge({}, marked.defaults, opt);
-
-    var tokens = Lexer.lex(tokens, opt)
-      , highlight = opt.highlight
-      , pending = 0
-      , l = tokens.length
-      , i = 0;
-
-    if (!highlight || highlight.length < 3) {
-      return callback(null, Parser.parse(tokens, opt));
-    }
-
-    var done = function() {
-      delete opt.highlight;
-      var out = Parser.parse(tokens, opt);
-      opt.highlight = highlight;
-      return callback(null, out);
-    };
-
-    for (; i < l; i++) {
-      (function(token) {
-        if (token.type !== 'code') return;
-        pending++;
-        return highlight(token.text, token.lang, function(err, code) {
-          if (code == null || code === token.text) {
-            return --pending || done();
-          }
-          token.text = code;
-          token.escaped = true;
-          --pending || done();
-        });
-      })(tokens[i]);
-    }
-
-    return;
-  }
-  try {
-    if (opt) opt = merge({}, marked.defaults, opt);
-    return Parser.parse(Lexer.lex(src, opt), opt);
-  } catch (e) {
-    e.message += '\nPlease report this to https://github.com/chjj/marked.';
-    if ((opt || marked.defaults).silent) {
-      return '<p>An error occured:</p><pre>'
-        + escape(e.message + '', true)
-        + '</pre>';
-    }
-    throw e;
-  }
-}
-
-/**
- * Options
- */
-
-marked.options =
-marked.setOptions = function(opt) {
-  merge(marked.defaults, opt);
-  return marked;
-};
-
-marked.defaults = {
-  gfm: true,
-  tables: true,
-  breaks: false,
-  pedantic: false,
-  sanitize: false,
-  smartLists: false,
-  silent: false,
-  highlight: null,
-  langPrefix: 'lang-'
-};
-
-/**
- * Expose
- */
-
-marked.Parser = Parser;
-marked.parser = Parser.parse;
-
-marked.Lexer = Lexer;
-marked.lexer = Lexer.lex;
-
-marked.InlineLexer = InlineLexer;
-marked.inlineLexer = InlineLexer.output;
-
-marked.parse = marked;
-
-if (typeof exports === 'object') {
-  module.exports = marked;
-} else if (typeof define === 'function' && define.amd) {
-  define(function() { return marked; });
-} else {
-  this.marked = marked;
-}
-
-}).call(function() {
-  return this || (typeof window !== 'undefined' ? window : global);
-}());
-/* jshint ignore:start */
-(function () {
-'use strict';
-window.iD = function () {
-    window.locale.en = iD.data.en;
-    window.locale.current('en');
-
-    var context = {},
-        storage;
-
-    // https://github.com/openstreetmap/iD/issues/772
-    // http://mathiasbynens.be/notes/localstorage-pattern#comment-9
-    try { storage = localStorage; } catch (e) {}
-    storage = storage || (function() {
-        var s = {};
-        return {
-            getItem: function(k) { return s[k]; },
-            setItem: function(k, v) { s[k] = v; },
-            removeItem: function(k) { delete s[k]; }
-        };
-    })();
-
-    context.storage = function(k, v) {
-        try {
-            if (arguments.length === 1) return storage.getItem(k);
-            else if (v === null) storage.removeItem(k);
-            else storage.setItem(k, v);
-        } catch(e) {
-            // localstorage quota exceeded
-            /* jshint devel:true */
-            if (typeof console !== 'undefined') console.error('localStorage quota exceeded');
-            /* jshint devel:false */
-        }
-    };
-
-    var history = iD.History(context),
-        dispatch = d3.dispatch('enter', 'exit'),
-        mode,
-        container,
-        ui = iD.ui(context),
-        connection = iD.Connection(),
-        locale = iD.detect().locale,
-        localePath;
-
-    if (locale && iD.data.locales.indexOf(locale) === -1) {
-        locale = locale.split('-')[0];
-    }
-
-    connection.on('load.context', function loadContext(err, result) {
-        history.merge(result.data, result.extent);
-    });
-
-    context.preauth = function(options) {
-        connection.switch(options);
-        return context;
-    };
-
-    context.locale = function(_, path) {
-        locale = _;
-        localePath = path;
-        return context;
-    };
-
-    context.loadLocale = function(cb) {
-        if (locale && locale !== 'en' && iD.data.locales.indexOf(locale) !== -1) {
-            localePath = localePath || context.assetPath() + 'locales/' + locale + '.json';
-            d3.json(localePath, function(err, result) {
-                window.locale[locale] = result;
-                window.locale.current(locale);
-                cb();
-            });
-        } else {
-            cb();
-        }
-    };
-
-    /* Straight accessors. Avoid using these if you can. */
-    context.ui = function() { return ui; };
-    context.connection = function() { return connection; };
-    context.history = function() { return history; };
-
-    /* History */
-    context.graph = history.graph;
-    context.changes = history.changes;
-    context.intersects = history.intersects;
-
-    var inIntro = false;
-
-    context.inIntro = function(_) {
-        if (!arguments.length) return inIntro;
-        inIntro = _;
-        return context;
-    };
-
-    context.save = function() {
-        if (inIntro) return;
-        history.save();
-        if (history.hasChanges()) return t('save.unsaved_changes');
-    };
-
-    context.flush = function() {
-        connection.flush();
-        history.reset();
-        return context;
-    };
-
-    // Debounce save, since it's a synchronous localStorage write,
-    // and history changes can happen frequently (e.g. when dragging).
-    var debouncedSave = _.debounce(context.save, 350);
-    function withDebouncedSave(fn) {
-        return function() {
-            var result = fn.apply(history, arguments);
-            debouncedSave();
-            return result;
-        };
-    }
-
-    context.perform = withDebouncedSave(history.perform);
-    context.replace = withDebouncedSave(history.replace);
-    context.pop = withDebouncedSave(history.pop);
-    context.undo = withDebouncedSave(history.undo);
-    context.redo = withDebouncedSave(history.redo);
-
-    /* Graph */
-    context.hasEntity = function(id) {
-        return history.graph().hasEntity(id);
-    };
-
-    context.entity = function(id) {
-        return history.graph().entity(id);
-    };
-
-    context.childNodes = function(way) {
-        return history.graph().childNodes(way);
-    };
-
-    context.geometry = function(id) {
-        return context.entity(id).geometry(history.graph());
-    };
-
-    /* Modes */
-    context.enter = function(newMode) {
-        if (mode) {
-            mode.exit();
-            dispatch.exit(mode);
-        }
-
-        mode = newMode;
-        mode.enter();
-        dispatch.enter(mode);
-    };
-
-    context.mode = function() {
-        return mode;
-    };
-
-    context.selectedIDs = function() {
-        if (mode && mode.selectedIDs) {
-            return mode.selectedIDs();
-        } else {
-            return [];
-        }
-    };
-
-    context.loadEntity = function(id, zoomTo) {
-        if (zoomTo !== false) {
-            connection.loadEntity(id, function(error, entity) {
-                if (entity) {
-                    map.zoomTo(entity);
-                }
-            });
-        }
-
-        map.on('drawn.loadEntity', function() {
-            if (!context.hasEntity(id)) return;
-            map.on('drawn.loadEntity', null);
-            context.on('enter.loadEntity', null);
-            context.enter(iD.modes.Select(context, [id]));
-        });
-
-        context.on('enter.loadEntity', function() {
-            if (mode.id !== 'browse') {
-                map.on('drawn.loadEntity', null);
-                context.on('enter.loadEntity', null);
-            }
-        });
-    };
-
-    context.editable = function() {
-        return map.editable() && mode && mode.id !== 'save';
-    };
-
-    /* Behaviors */
-    context.install = function(behavior) {
-        context.surface().call(behavior);
-    };
-
-    context.uninstall = function(behavior) {
-        context.surface().call(behavior.off);
-    };
-
-    /* Projection */
-    context.projection = iD.geo.RawMercator();
-
-    /* Background */
-    var background = iD.Background(context);
-    context.background = function() { return background; };
-
-    /* Map */
-    var map = iD.Map(context);
-    context.map = function() { return map; };
-    context.layers = function() { return map.layers; };
-    context.surface = function() { return map.surface; };
-    context.mouse = map.mouse;
-    context.extent = map.extent;
-    context.pan = map.pan;
-    context.zoomIn = map.zoomIn;
-    context.zoomOut = map.zoomOut;
-
-    context.surfaceRect = function() {
-        // Work around a bug in Firefox.
-        //   http://stackoverflow.com/questions/18153989/
-        //   https://bugzilla.mozilla.org/show_bug.cgi?id=530985
-        return context.surface().node().parentNode.getBoundingClientRect();
-    };
-
-    /* Presets */
-    var presets = iD.presets()
-        .load(iD.data.presets);
-
-    context.presets = function() {
-        return presets;
-    };
-
-    context.container = function(_) {
-        if (!arguments.length) return container;
-        container = _;
-        container.classed('id-container', true);
-        return context;
-    };
-
-    var embed = false;
-    context.embed = function(_) {
-        if (!arguments.length) return embed;
-        embed = _;
-        return context;
-    };
-
-    var assetPath = '';
-    context.assetPath = function(_) {
-        if (!arguments.length) return assetPath;
-        assetPath = _;
-        return context;
-    };
-
-    var assetMap = {};
-    context.assetMap = function(_) {
-        if (!arguments.length) return assetMap;
-        assetMap = _;
-        return context;
-    };
-
-    context.imagePath = function(_) {
-        var asset = 'img/' + _;
-        return assetMap[asset] || assetPath + asset;
-    };
-
-    return d3.rebind(context, dispatch, 'on');
-};
-
-iD.version = '1.6.2';
-
-(function() {
-    var detected = {};
-
-    var ua = navigator.userAgent,
-        msie = new RegExp('MSIE ([0-9]{1,}[\\.0-9]{0,})');
-
-    if (msie.exec(ua) !== null) {
-        var rv = parseFloat(RegExp.$1);
-        detected.support = !(rv && rv < 9);
-    } else {
-        detected.support = true;
-    }
-
-    // Added due to incomplete svg style support. See #715
-    detected.opera = ua.indexOf('Opera') >= 0;
-
-    detected.locale = navigator.language || navigator.userLanguage;
-
-    detected.filedrop = (window.FileReader && 'ondrop' in window);
-
-    function nav(x) {
-        return navigator.userAgent.indexOf(x) !== -1;
-    }
-
-    if (nav('Win')) detected.os = 'win';
-    else if (nav('Mac')) detected.os = 'mac';
-    else if (nav('X11')) detected.os = 'linux';
-    else if (nav('Linux')) detected.os = 'linux';
-    else detected.os = 'win';
-
-    iD.detect = function() { return detected; };
-})();
-iD.countryCode  = function() {
-    var countryCode = {},
-        endpoint = 'https://nominatim.openstreetmap.org/reverse?';
-
-    if (!iD.countryCode.cache) {
-        iD.countryCode.cache = rbush();
-    }
-
-    var cache = iD.countryCode.cache;
-
-    countryCode.search = function(location, callback) {
-        var countryCodes = cache.search([location[0], location[1], location[0], location[1]]);
-
-        if (countryCodes.length > 0)
-            return callback(null, countryCodes[0][4]);
-
-        d3.json(endpoint +
-            iD.util.qsString({
-                format: 'json',
-                addressdetails: 1,
-                lat: location[1],
-                lon: location[0]
-            }), function(err, result) {
-                if (err)
-                    return callback(err);
-                else if (result && result.error)
-                    return callback(result.error);
-
-                var extent = iD.geo.Extent(location).padByMeters(1000);
-
-                cache.insert([extent[0][0], extent[0][1], extent[1][0], extent[1][1], result.address.country_code]);
-
-                callback(null, result.address.country_code);
-            });
-    };
-
-    return countryCode;
-};
-iD.taginfo = function() {
-    var taginfo = {},
-        endpoint = 'https://taginfo.openstreetmap.org/api/4/',
-        tag_sorts = {
-            point: 'count_nodes',
-            vertex: 'count_nodes',
-            area: 'count_ways',
-            line: 'count_ways'
-        },
-        tag_filters = {
-            point: 'nodes',
-            vertex: 'nodes',
-            area: 'ways',
-            line: 'ways'
-        };
-
-    if (!iD.taginfo.cache) {
-        iD.taginfo.cache = {};
-    }
-
-    var cache = iD.taginfo.cache;
-
-    function sets(parameters, n, o) {
-        if (parameters.geometry && o[parameters.geometry]) {
-            parameters[n] = o[parameters.geometry];
-        }
-        return parameters;
-    }
-
-    function setFilter(parameters) {
-        return sets(parameters, 'filter', tag_filters);
-    }
-
-    function setSort(parameters) {
-        return sets(parameters, 'sortname', tag_sorts);
-    }
-
-    function clean(parameters) {
-        return _.omit(parameters, 'geometry', 'debounce');
-    }
-
-    function shorten(parameters) {
-        if (!parameters.query) {
-            delete parameters.query;
-        } else {
-            parameters.query = parameters.query.slice(0, 3);
-        }
-        return parameters;
-    }
-
-    function popularKeys(parameters) {
-        var pop_field = 'count_all';
-        if (parameters.filter) pop_field = 'count_' + parameters.filter;
-        return function(d) { return parseFloat(d[pop_field]) > 10000; };
-    }
-
-    function popularValues() {
-        return function(d) { return parseFloat(d.fraction) > 0.01 || d.in_wiki; };
-    }
-
-    function valKey(d) { return { value: d.key }; }
-
-    function valKeyDescription(d) {
-        return {
-            value: d.value,
-            title: d.description
-        };
-    }
-
-    var debounced = _.debounce(d3.json, 100, true);
-
-    function request(url, debounce, callback) {
-        if (cache[url]) {
-            callback(null, cache[url]);
-        } else if (debounce) {
-            debounced(url, done);
-        } else {
-            d3.json(url, done);
-        }
-
-        function done(err, data) {
-            if (!err) cache[url] = data;
-            callback(err, data);
-        }
-    }
-
-    taginfo.keys = function(parameters, callback) {
-        var debounce = parameters.debounce;
-        parameters = clean(shorten(setSort(parameters)));
-        request(endpoint + 'keys/all?' +
-            iD.util.qsString(_.extend({
-                rp: 10,
-                sortname: 'count_all',
-                sortorder: 'desc',
-                page: 1
-            }, parameters)), debounce, function(err, d) {
-                if (err) return callback(err);
-                callback(null, d.data.filter(popularKeys(parameters)).map(valKey));
-            });
-    };
-
-    taginfo.values = function(parameters, callback) {
-        var debounce = parameters.debounce;
-        parameters = clean(shorten(setSort(setFilter(parameters))));
-        request(endpoint + 'key/values?' +
-            iD.util.qsString(_.extend({
-                rp: 25,
-                sortname: 'count_all',
-                sortorder: 'desc',
-                page: 1
-            }, parameters)), debounce, function(err, d) {
-                if (err) return callback(err);
-                callback(null, d.data.filter(popularValues()).map(valKeyDescription), parameters);
-            });
-    };
-
-    taginfo.docs = function(parameters, callback) {
-        var debounce = parameters.debounce;
-        parameters = clean(setSort(parameters));
-
-        var path = 'key/wiki_pages?';
-        if (parameters.value) path = 'tag/wiki_pages?';
-        else if (parameters.rtype) path = 'relation/wiki_pages?';
-
-        request(endpoint + path +
-            iD.util.qsString(parameters), debounce, callback);
-    };
-
-    taginfo.endpoint = function(_) {
-        if (!arguments.length) return endpoint;
-        endpoint = _;
-        return taginfo;
-    };
-
-    return taginfo;
-};
-iD.wikipedia  = function() {
-    var wiki = {},
-        endpoint = 'https://en.wikipedia.org/w/api.php?';
-
-    wiki.search = function(lang, query, callback) {
-        lang = lang || 'en';
-        d3.jsonp(endpoint.replace('en', lang) +
-            iD.util.qsString({
-                action: 'query',
-                list: 'search',
-                srlimit: '10',
-                srinfo: 'suggestion',
-                format: 'json',
-                callback: '{callback}',
-                srsearch: query
-            }), function(data) {
-                if (!data.query) return;
-                callback(query, data.query.search.map(function(d) {
-                    return d.title;
-                }));
-            });
-    };
-
-    wiki.suggestions = function(lang, query, callback) {
-        lang = lang || 'en';
-        d3.jsonp(endpoint.replace('en', lang) +
-            iD.util.qsString({
-                action: 'opensearch',
-                namespace: 0,
-                suggest: '',
-                format: 'json',
-                callback: '{callback}',
-                search: query
-            }), function(d) {
-                callback(d[0], d[1]);
-            });
-    };
-
-    wiki.translations = function(lang, title, callback) {
-        d3.jsonp(endpoint.replace('en', lang) +
-            iD.util.qsString({
-                action: 'query',
-                prop: 'langlinks',
-                format: 'json',
-                callback: '{callback}',
-                lllimit: 500,
-                titles: title
-            }), function(d) {
-                var list = d.query.pages[Object.keys(d.query.pages)[0]],
-                    translations = {};
-                if (list && list.langlinks) {
-                    list.langlinks.forEach(function(d) {
-                        translations[d.lang] = d['*'];
-                    });
-                    callback(translations);
-                }
-            });
-    };
-
-    return wiki;
-};
-iD.util = {};
-
-iD.util.tagText = function(entity) {
-    return d3.entries(entity.tags).map(function(e) {
-        return e.key + '=' + e.value;
-    }).join(', ');
-};
-
-iD.util.entitySelector = function(ids) {
-    return ids.length ? '.' + ids.join(',.') : 'nothing';
-};
-
-iD.util.entityOrMemberSelector = function(ids, graph) {
-    var s = iD.util.entitySelector(ids);
-
-    ids.forEach(function(id) {
-        var entity = graph.hasEntity(id);
-        if (entity && entity.type === 'relation') {
-            entity.members.forEach(function(member) {
-                s += ',.' + member.id;
-            });
-        }
-    });
-
-    return s;
-};
-
-iD.util.displayName = function(entity) {
-    var localeName = 'name:' + iD.detect().locale.toLowerCase().split('-')[0];
-    return entity.tags[localeName] || entity.tags.name || entity.tags.ref;
-};
-
-iD.util.stringQs = function(str) {
-    return str.split('&').reduce(function(obj, pair){
-        var parts = pair.split('=');
-        if (parts.length === 2) {
-            obj[parts[0]] = (null === parts[1]) ? '' : decodeURIComponent(parts[1]);
-        }
-        return obj;
-    }, {});
-};
-
-iD.util.qsString = function(obj, noencode) {
-    function softEncode(s) {
-      // encode everything except special characters used in certain hash parameters:
-      // "/" in map states, ":", ",", {" and "}" in background
-      return encodeURIComponent(s).replace(/(%2F|%3A|%2C|%7B|%7D)/g, decodeURIComponent);
-    }
-    return Object.keys(obj).sort().map(function(key) {
-        return encodeURIComponent(key) + '=' + (
-            noencode ? softEncode(obj[key]) : encodeURIComponent(obj[key]));
-    }).join('&');
-};
-
-iD.util.prefixDOMProperty = function(property) {
-    var prefixes = ['webkit', 'ms', 'moz', 'o'],
-        i = -1,
-        n = prefixes.length,
-        s = document.body;
-
-    if (property in s)
-        return property;
-
-    property = property.substr(0, 1).toUpperCase() + property.substr(1);
-
-    while (++i < n)
-        if (prefixes[i] + property in s)
-            return prefixes[i] + property;
-
-    return false;
-};
-
-iD.util.prefixCSSProperty = function(property) {
-    var prefixes = ['webkit', 'ms', 'Moz', 'O'],
-        i = -1,
-        n = prefixes.length,
-        s = document.body.style;
-
-    if (property.toLowerCase() in s)
-        return property.toLowerCase();
-
-    while (++i < n)
-        if (prefixes[i] + property in s)
-            return '-' + prefixes[i].toLowerCase() + property.replace(/([A-Z])/g, '-$1').toLowerCase();
-
-    return false;
-};
-
-
-iD.util.setTransform = function(el, x, y, scale) {
-    var prop = iD.util.transformProperty = iD.util.transformProperty || iD.util.prefixCSSProperty('Transform'),
-        translate = iD.detect().opera ?
-            'translate('   + x + 'px,' + y + 'px)' :
-            'translate3d(' + x + 'px,' + y + 'px,0)';
-    return el.style(prop, translate + (scale ? ' scale(' + scale + ')' : ''));
-};
-
-iD.util.getStyle = function(selector) {
-    for (var i = 0; i < document.styleSheets.length; i++) {
-        var rules = document.styleSheets[i].rules || document.styleSheets[i].cssRules || [];
-        for (var k = 0; k < rules.length; k++) {
-            var selectorText = rules[k].selectorText && rules[k].selectorText.split(', ');
-            if (_.contains(selectorText, selector)) {
-                return rules[k];
-            }
-        }
-    }
-};
-
-iD.util.editDistance = function(a, b) {
-    if (a.length === 0) return b.length;
-    if (b.length === 0) return a.length;
-    var matrix = [];
-    for (var i = 0; i <= b.length; i++) { matrix[i] = [i]; }
-    for (var j = 0; j <= a.length; j++) { matrix[0][j] = j; }
-    for (i = 1; i <= b.length; i++) {
-        for (j = 1; j <= a.length; j++) {
-            if (b.charAt(i-1) === a.charAt(j-1)) {
-                matrix[i][j] = matrix[i-1][j-1];
-            } else {
-                matrix[i][j] = Math.min(matrix[i-1][j-1] + 1, // substitution
-                    Math.min(matrix[i][j-1] + 1, // insertion
-                    matrix[i-1][j] + 1)); // deletion
-            }
-        }
-    }
-    return matrix[b.length][a.length];
-};
-
-// a d3.mouse-alike which
-// 1. Only works on HTML elements, not SVG
-// 2. Does not cause style recalculation
-iD.util.fastMouse = function(container) {
-    var rect = _.clone(container.getBoundingClientRect()),
-        rectLeft = rect.left,
-        rectTop = rect.top,
-        clientLeft = +container.clientLeft,
-        clientTop = +container.clientTop;
-    return function(e) {
-        return [
-            e.clientX - rectLeft - clientLeft,
-            e.clientY - rectTop - clientTop];
-    };
-};
-
-/* jshint -W103 */
-iD.util.getPrototypeOf = Object.getPrototypeOf || function(obj) { return obj.__proto__; };
-
-iD.util.asyncMap = function(inputs, func, callback) {
-    var remaining = inputs.length,
-        results = [],
-        errors = [];
-
-    inputs.forEach(function(d, i) {
-        func(d, function done(err, data) {
-            errors[i] = err;
-            results[i] = data;
-            remaining --;
-            if (!remaining) callback(errors, results);
-        });
-    });
-};
-
-// wraps an index to an interval [0..length-1]
-iD.util.wrap = function(index, length) {
-    if (index < 0)
-        index += Math.ceil(-index/length)*length;
-    return index % length;
-};
-// A per-domain session mutex backed by a cookie and dead man's
-// switch. If the session crashes, the mutex will auto-release
-// after 5 seconds.
-
-iD.util.SessionMutex = function(name) {
-    var mutex = {},
-        intervalID;
-
-    function renew() {
-        var expires = new Date();
-        expires.setSeconds(expires.getSeconds() + 5);
-        document.cookie = name + '=1; expires=' + expires.toUTCString();
-    }
-
-    mutex.lock = function() {
-        if (intervalID) return true;
-        var cookie = document.cookie.replace(new RegExp('(?:(?:^|.*;)\\s*' + name + '\\s*\\=\\s*([^;]*).*$)|^.*$'), '$1');
-        if (cookie) return false;
-        renew();
-        intervalID = window.setInterval(renew, 4000);
-        return true;
-    };
-
-    mutex.unlock = function() {
-        if (!intervalID) return;
-        document.cookie = name + '=; expires=Thu, 01 Jan 1970 00:00:00 GMT';
-        clearInterval(intervalID);
-        intervalID = null;
-    };
-
-    mutex.locked = function() {
-        return !!intervalID;
-    };
-
-    return mutex;
-};
-iD.util.SuggestNames = function(preset, suggestions) {
-    preset = preset.id.split('/', 2);
-    var k = preset[0],
-        v = preset[1];
-
-    return function(value, callback) {
-        var result = [];
-        if (value && value.length > 2) {
-            if (suggestions[k] && suggestions[k][v]) {
-                for (var sugg in suggestions[k][v]) {
-                    var dist = iD.util.editDistance(value, sugg.substring(0, value.length));
-                    if (dist < 3) {
-                        result.push({
-                            title: sugg,
-                            value: sugg,
-                            dist: dist
-                        });
-                    }
-                }
-            }
-            result.sort(function(a, b) {
-                return a.dist - b.dist;
-            });
-        }
-        result = result.slice(0,3);
-        callback(result);
-    };
-};
-iD.geo = {};
-
-iD.geo.roundCoords = function(c) {
-    return [Math.floor(c[0]), Math.floor(c[1])];
-};
-
-iD.geo.interp = function(p1, p2, t) {
-    return [p1[0] + (p2[0] - p1[0]) * t,
-            p1[1] + (p2[1] - p1[1]) * t];
-};
-
-// 2D cross product of OA and OB vectors, i.e. z-component of their 3D cross product.
-// Returns a positive value, if OAB makes a counter-clockwise turn,
-// negative for clockwise turn, and zero if the points are collinear.
-iD.geo.cross = function(o, a, b) {
-    return (a[0] - o[0]) * (b[1] - o[1]) - (a[1] - o[1]) * (b[0] - o[0]);
-};
-
-// http://jsperf.com/id-dist-optimization
-iD.geo.euclideanDistance = function(a, b) {
-    var x = a[0] - b[0], y = a[1] - b[1];
-    return Math.sqrt((x * x) + (y * y));
-};
-
-// using WGS84 polar radius (6356752.314245179 m)
-// const = 2 * PI * r / 360
-iD.geo.latToMeters = function(dLat) {
-    return dLat * 110946.257617;
-};
-
-// using WGS84 equatorial radius (6378137.0 m)
-// const = 2 * PI * r / 360
-iD.geo.lonToMeters = function(dLon, atLat) {
-    return Math.abs(atLat) >= 90 ? 0 :
-        dLon * 111319.490793 * Math.abs(Math.cos(atLat * (Math.PI/180)));
-};
-
-// using WGS84 polar radius (6356752.314245179 m)
-// const = 2 * PI * r / 360
-iD.geo.metersToLat = function(m) {
-    return m / 110946.257617;
-};
-
-// using WGS84 equatorial radius (6378137.0 m)
-// const = 2 * PI * r / 360
-iD.geo.metersToLon = function(m, atLat) {
-    return Math.abs(atLat) >= 90 ? 0 :
-        m / 111319.490793 / Math.abs(Math.cos(atLat * (Math.PI/180)));
-};
-
-// Equirectangular approximation of spherical distances on Earth
-iD.geo.sphericalDistance = function(a, b) {
-    var x = iD.geo.lonToMeters(a[0] - b[0], (a[1] + b[1]) / 2),
-        y = iD.geo.latToMeters(a[1] - b[1]);
-    return Math.sqrt((x * x) + (y * y));
-};
-
-iD.geo.edgeEqual = function(a, b) {
-    return (a[0] === b[0] && a[1] === b[1]) ||
-        (a[0] === b[1] && a[1] === b[0]);
-};
-
-// Return the counterclockwise angle in the range (-pi, pi)
-// between the positive X axis and the line intersecting a and b.
-iD.geo.angle = function(a, b, projection) {
-    a = projection(a.loc);
-    b = projection(b.loc);
-    return Math.atan2(b[1] - a[1], b[0] - a[0]);
-};
-
-// Choose the edge with the minimal distance from `point` to its orthogonal
-// projection onto that edge, if such a projection exists, or the distance to
-// the closest vertex on that edge. Returns an object with the `index` of the
-// chosen edge, the chosen `loc` on that edge, and the `distance` to to it.
-iD.geo.chooseEdge = function(nodes, point, projection) {
-    var dist = iD.geo.euclideanDistance,
-        points = nodes.map(function(n) { return projection(n.loc); }),
-        min = Infinity,
-        idx, loc;
-
-    function dot(p, q) {
-        return p[0] * q[0] + p[1] * q[1];
-    }
-
-    for (var i = 0; i < points.length - 1; i++) {
-        var o = points[i],
-            s = [points[i + 1][0] - o[0],
-                 points[i + 1][1] - o[1]],
-            v = [point[0] - o[0],
-                 point[1] - o[1]],
-            proj = dot(v, s) / dot(s, s),
-            p;
-
-        if (proj < 0) {
-            p = o;
-        } else if (proj > 1) {
-            p = points[i + 1];
-        } else {
-            p = [o[0] + proj * s[0], o[1] + proj * s[1]];
-        }
-
-        var d = dist(p, point);
-        if (d < min) {
-            min = d;
-            idx = i + 1;
-            loc = projection.invert(p);
-        }
-    }
-
-    return {
-        index: idx,
-        distance: min,
-        loc: loc
-    };
-};
-
-// Return the intersection point of 2 line segments.
-// From https://github.com/pgkelley4/line-segments-intersect
-// This uses the vector cross product approach described below:
-//  http://stackoverflow.com/a/565282/786339
-iD.geo.lineIntersection = function(a, b) {
-    function subtractPoints(point1, point2) {
-        return [point1[0] - point2[0], point1[1] - point2[1]];
-    }
-    function crossProduct(point1, point2) {
-        return point1[0] * point2[1] - point1[1] * point2[0];
-    }
-
-    var p = [a[0][0], a[0][1]],
-        p2 = [a[1][0], a[1][1]],
-        q = [b[0][0], b[0][1]],
-        q2 = [b[1][0], b[1][1]],
-        r = subtractPoints(p2, p),
-        s = subtractPoints(q2, q),
-        uNumerator = crossProduct(subtractPoints(q, p), r),
-        denominator = crossProduct(r, s);
-
-    if (uNumerator && denominator) {
-        var u = uNumerator / denominator,
-            t = crossProduct(subtractPoints(q, p), s) / denominator;
-
-        if ((t >= 0) && (t <= 1) && (u >= 0) && (u <= 1)) {
-            return iD.geo.interp(p, p2, t);
-        }
-    }
-
-    return null;
-};
-
-// Return whether point is contained in polygon.
-//
-// `point` should be a 2-item array of coordinates.
-// `polygon` should be an array of 2-item arrays of coordinates.
-//
-// From https://github.com/substack/point-in-polygon.
-// ray-casting algorithm based on
-// http://www.ecse.rpi.edu/Homepages/wrf/Research/Short_Notes/pnpoly.html
-//
-iD.geo.pointInPolygon = function(point, polygon) {
-    var x = point[0],
-        y = point[1],
-        inside = false;
-
-    for (var i = 0, j = polygon.length - 1; i < polygon.length; j = i++) {
-        var xi = polygon[i][0], yi = polygon[i][1];
-        var xj = polygon[j][0], yj = polygon[j][1];
-
-        var intersect = ((yi > y) !== (yj > y)) &&
-            (x < (xj - xi) * (y - yi) / (yj - yi) + xi);
-        if (intersect) inside = !inside;
-    }
-
-    return inside;
-};
-
-iD.geo.polygonContainsPolygon = function(outer, inner) {
-    return _.every(inner, function(point) {
-        return iD.geo.pointInPolygon(point, outer);
-    });
-};
-
-iD.geo.polygonIntersectsPolygon = function(outer, inner) {
-    function testSegments(outer, inner) {
-        for (var i = 0; i < outer.length - 1; i++) {
-            for (var j = 0; j < inner.length - 1; j++) {
-                var a = [ outer[i], outer[i+1] ],
-                    b = [ inner[j], inner[j+1] ];
-                if (iD.geo.lineIntersection(a, b)) return true;
-            }
-        }
-        return false;
-    }
-
-    return _.some(inner, function(point) {
-        return iD.geo.pointInPolygon(point, outer);
-    }) || testSegments(outer, inner);
-};
-
-iD.geo.pathLength = function(path) {
-    var length = 0,
-        dx, dy;
-    for (var i = 0; i < path.length - 1; i++) {
-        dx = path[i][0] - path[i + 1][0];
-        dy = path[i][1] - path[i + 1][1];
-        length += Math.sqrt(dx * dx + dy * dy);
-    }
-    return length;
-};
-iD.geo.Extent = function geoExtent(min, max) {
-    if (!(this instanceof iD.geo.Extent)) return new iD.geo.Extent(min, max);
-    if (min instanceof iD.geo.Extent) {
-        return min;
-    } else if (min && min.length === 2 && min[0].length === 2 && min[1].length === 2) {
-        this[0] = min[0];
-        this[1] = min[1];
-    } else {
-        this[0] = min        || [ Infinity,  Infinity];
-        this[1] = max || min || [-Infinity, -Infinity];
-    }
-};
-
-iD.geo.Extent.prototype = new Array(2);
-
-_.extend(iD.geo.Extent.prototype, {
-    extend: function(obj) {
-        if (!(obj instanceof iD.geo.Extent)) obj = new iD.geo.Extent(obj);
-        return iD.geo.Extent([Math.min(obj[0][0], this[0][0]),
-                              Math.min(obj[0][1], this[0][1])],
-                             [Math.max(obj[1][0], this[1][0]),
-                              Math.max(obj[1][1], this[1][1])]);
-    },
-
-    _extend: function(extent) {
-        this[0][0] = Math.min(extent[0][0], this[0][0]);
-        this[0][1] = Math.min(extent[0][1], this[0][1]);
-        this[1][0] = Math.max(extent[1][0], this[1][0]);
-        this[1][1] = Math.max(extent[1][1], this[1][1]);
-    },
-
-    area: function() {
-        return Math.abs((this[1][0] - this[0][0]) * (this[1][1] - this[0][1]));
-    },
-
-    center: function() {
-        return [(this[0][0] + this[1][0]) / 2,
-                (this[0][1] + this[1][1]) / 2];
-    },
-
-    polygon: function() {
-        return [
-            [this[0][0], this[0][1]],
-            [this[0][0], this[1][1]],
-            [this[1][0], this[1][1]],
-            [this[1][0], this[0][1]],
-            [this[0][0], this[0][1]]
-        ];
-    },
-
-    intersects: function(obj) {
-        if (!(obj instanceof iD.geo.Extent)) obj = new iD.geo.Extent(obj);
-        return obj[0][0] <= this[1][0] &&
-               obj[0][1] <= this[1][1] &&
-               obj[1][0] >= this[0][0] &&
-               obj[1][1] >= this[0][1];
-    },
-
-    intersection: function(obj) {
-        if (!this.intersects(obj)) return new iD.geo.Extent();
-        return new iD.geo.Extent([Math.max(obj[0][0], this[0][0]),
-                                  Math.max(obj[0][1], this[0][1])],
-                                 [Math.min(obj[1][0], this[1][0]),
-                                  Math.min(obj[1][1], this[1][1])]);
-    },
-
-    percentContainedIn: function(obj) {
-        if (!(obj instanceof iD.geo.Extent)) obj = new iD.geo.Extent(obj);
-        var a1 = this.intersection(obj).area(),
-            a2 = this.area();
-
-        if (a1 === Infinity || a2 === Infinity || a1 === 0 || a2 === 0) {
-            return 0;
-        } else {
-            return a1 / a2;
-        }
-    },
-
-    padByMeters: function(meters) {
-        var dLat = iD.geo.metersToLat(meters),
-            dLon = iD.geo.metersToLon(meters, this.center()[1]);
-        return iD.geo.Extent(
-                [this[0][0] - dLon, this[0][1] - dLat],
-                [this[1][0] + dLon, this[1][1] + dLat]);
-    },
-
-    toParam: function() {
-        return [this[0][0], this[0][1], this[1][0], this[1][1]].join(',');
-    }
-
-});
-iD.geo.Turn = function(turn) {
-    if (!(this instanceof iD.geo.Turn))
-        return new iD.geo.Turn(turn);
-    _.extend(this, turn);
-};
-
-iD.geo.Intersection = function(graph, vertexId) {
-    var vertex = graph.entity(vertexId),
-        highways = [];
-
-    // Pre-split ways that would need to be split in
-    // order to add a restriction. The real split will
-    // happen when the restriction is added.
-    graph.parentWays(vertex).forEach(function(way) {
-        if (!way.tags.highway || way.isArea() || way.isDegenerate())
-            return;
-
-        if (way.affix(vertexId)) {
-            highways.push(way);
-        } else {
-            var idx = _.indexOf(way.nodes, vertex.id, 1),
-                wayA = iD.Way({id: way.id + '-a', tags: way.tags, nodes: way.nodes.slice(0, idx + 1)}),
-                wayB = iD.Way({id: way.id + '-b', tags: way.tags, nodes: way.nodes.slice(idx)});
-
-            graph = graph.replace(wayA);
-            graph = graph.replace(wayB);
-
-            highways.push(wayA);
-            highways.push(wayB);
-        }
-    });
-
-    var intersection = {
-        highways: highways,
-        graph: graph
-    };
-
-    intersection.turns = function(fromNodeID) {
-        if (!fromNodeID)
-            return [];
-
-        var way = _.find(highways, function(way) { return way.contains(fromNodeID); });
-        if (way.first() === vertex.id && way.tags.oneway === 'yes')
-            return [];
-        if (way.last() === vertex.id && way.tags.oneway === '-1')
-            return [];
-
-        function withRestriction(turn) {
-            graph.parentRelations(graph.entity(turn.from.way)).forEach(function(relation) {
-                if (relation.tags.type !== 'restriction')
-                    return;
-
-                var f = relation.memberByRole('from'),
-                    t = relation.memberByRole('to'),
-                    v = relation.memberByRole('via');
-
-                if (f && f.id === turn.from.way &&
-                    v && v.id === turn.via.node &&
-                    t && t.id === turn.to.way) {
-                    turn.restriction = relation.id;
-                } else if (/^only_/.test(relation.tags.restriction) &&
-                    f && f.id === turn.from.way &&
-                    v && v.id === turn.via.node &&
-                    t && t.id !== turn.to.way) {
-                    turn.restriction = relation.id;
-                    turn.indirect_restriction = true;
-                }
-            });
-
-            return iD.geo.Turn(turn);
-        }
-
-        var from = {
-                node: way.nodes[way.first() === vertex.id ? 1 : way.nodes.length - 2],
-                way: way.id.split(/-(a|b)/)[0]
-            },
-            via = {node: vertex.id},
-            turns = [];
-
-        highways.forEach(function(parent) {
-            if (parent === way)
-                return;
-
-            var index = parent.nodes.indexOf(vertex.id);
-
-            // backward
-            if (parent.first() !== vertex.id && parent.tags.oneway !== 'yes') {
-                turns.push(withRestriction({
-                    from: from,
-                    via: via,
-                    to: {node: parent.nodes[index - 1], way: parent.id.split(/-(a|b)/)[0]}
-                }));
-            }
-
-            // forward
-            if (parent.last() !== vertex.id && parent.tags.oneway !== '-1') {
-                turns.push(withRestriction({
-                    from: from,
-                    via: via,
-                    to: {node: parent.nodes[index + 1], way: parent.id.split(/-(a|b)/)[0]}
-                }));
-            }
-        });
-
-        // U-turn
-        if (way.tags.oneway !== 'yes' && way.tags.oneway !== '-1') {
-            turns.push(withRestriction({
-                from: from,
-                via: via,
-                to: from,
-                u: true
-            }));
-        }
-
-        return turns;
-    };
-
-    return intersection;
-};
-
-
-iD.geo.inferRestriction = function(graph, from, via, to, projection) {
-    var fromWay = graph.entity(from.way),
-        fromNode = graph.entity(from.node),
-        toWay = graph.entity(to.way),
-        toNode = graph.entity(to.node),
-        viaNode = graph.entity(via.node),
-        fromOneWay = (fromWay.tags.oneway === 'yes' && fromWay.last() === via.node) ||
-            (fromWay.tags.oneway === '-1' && fromWay.first() === via.node),
-        toOneWay = (toWay.tags.oneway === 'yes' && toWay.first() === via.node) ||
-            (toWay.tags.oneway === '-1' && toWay.last() === via.node),
-        angle = iD.geo.angle(viaNode, fromNode, projection) -
-                iD.geo.angle(viaNode, toNode, projection);
-
-    angle = angle * 180 / Math.PI;
-
-    while (angle < 0)
-        angle += 360;
-
-    if (fromNode === toNode)
-        return 'no_u_turn';
-    if ((angle < 23 || angle > 336) && fromOneWay && toOneWay)
-        return 'no_u_turn';
-    if (angle < 158)
-        return 'no_right_turn';
-    if (angle > 202)
-        return 'no_left_turn';
-
-    return 'no_straight_on';
-};
-// For fixing up rendering of multipolygons with tags on the outer member.
-// https://github.com/openstreetmap/iD/issues/613
-iD.geo.isSimpleMultipolygonOuterMember = function(entity, graph) {
-    if (entity.type !== 'way')
-        return false;
-
-    var parents = graph.parentRelations(entity);
-    if (parents.length !== 1)
-        return false;
-
-    var parent = parents[0];
-    if (!parent.isMultipolygon() || Object.keys(parent.tags).length > 1)
-        return false;
-
-    var members = parent.members, member;
-    for (var i = 0; i < members.length; i++) {
-        member = members[i];
-        if (member.id === entity.id && member.role && member.role !== 'outer')
-            return false; // Not outer member
-        if (member.id !== entity.id && (!member.role || member.role === 'outer'))
-            return false; // Not a simple multipolygon
-    }
-
-    return parent;
-};
-
-iD.geo.simpleMultipolygonOuterMember = function(entity, graph) {
-    if (entity.type !== 'way')
-        return false;
-
-    var parents = graph.parentRelations(entity);
-    if (parents.length !== 1)
-        return false;
-
-    var parent = parents[0];
-    if (!parent.isMultipolygon() || Object.keys(parent.tags).length > 1)
-        return false;
-
-    var members = parent.members, member, outerMember;
-    for (var i = 0; i < members.length; i++) {
-        member = members[i];
-        if (!member.role || member.role === 'outer') {
-            if (outerMember)
-                return false; // Not a simple multipolygon
-            outerMember = member;
-        }
-    }
-
-    return outerMember && graph.hasEntity(outerMember.id);
-};
-
-// Join `array` into sequences of connecting ways.
-//
-// Segments which share identical start/end nodes will, as much as possible,
-// be connected with each other.
-//
-// The return value is a nested array. Each constituent array contains elements
-// of `array` which have been determined to connect. Each consitituent array
-// also has a `nodes` property whose value is an ordered array of member nodes,
-// with appropriate order reversal and start/end coordinate de-duplication.
-//
-// Members of `array` must have, at minimum, `type` and `id` properties.
-// Thus either an array of `iD.Way`s or a relation member array may be
-// used.
-//
-// If an member has a `tags` property, its tags will be reversed via
-// `iD.actions.Reverse` in the output.
-//
-// Incomplete members (those for which `graph.hasEntity(element.id)` returns
-// false) and non-way members are ignored.
-//
-iD.geo.joinWays = function(array, graph) {
-    var joined = [], member, current, nodes, first, last, i, how, what;
-
-    array = array.filter(function(member) {
-        return member.type === 'way' && graph.hasEntity(member.id);
-    });
-
-    function resolve(member) {
-        return graph.childNodes(graph.entity(member.id));
-    }
-
-    function reverse(member) {
-        return member.tags ? iD.actions.Reverse(member.id)(graph).entity(member.id) : member;
-    }
-
-    while (array.length) {
-        member = array.shift();
-        current = [member];
-        current.nodes = nodes = resolve(member).slice();
-        joined.push(current);
-
-        while (array.length && _.first(nodes) !== _.last(nodes)) {
-            first = _.first(nodes);
-            last  = _.last(nodes);
-
-            for (i = 0; i < array.length; i++) {
-                member = array[i];
-                what = resolve(member);
-
-                if (last === _.first(what)) {
-                    how  = nodes.push;
-                    what = what.slice(1);
-                    break;
-                } else if (last === _.last(what)) {
-                    how  = nodes.push;
-                    what = what.slice(0, -1).reverse();
-                    member = reverse(member);
-                    break;
-                } else if (first === _.last(what)) {
-                    how  = nodes.unshift;
-                    what = what.slice(0, -1);
-                    break;
-                } else if (first === _.first(what)) {
-                    how  = nodes.unshift;
-                    what = what.slice(1).reverse();
-                    member = reverse(member);
-                    break;
-                } else {
-                    what = how = null;
-                }
-            }
-
-            if (!what)
-                break; // No more joinable ways.
-
-            how.apply(current, [member]);
-            how.apply(nodes, what);
-
-            array.splice(i, 1);
-        }
-    }
-
-    return joined;
-};
-/*
-    Bypasses features of D3's default projection stream pipeline that are unnecessary:
-    * Antimeridian clipping
-    * Spherical rotation
-    * Resampling
-*/
-iD.geo.RawMercator = function () {
-    var project = d3.geo.mercator.raw,
-        k = 512 / Math.PI, // scale
-        x = 0, y = 0, // translate
-        clipExtent = [[0, 0], [0, 0]];
-
-    function projection(point) {
-        point = project(point[0] * Math.PI / 180, point[1] * Math.PI / 180);
-        return [point[0] * k + x, y - point[1] * k];
-    }
-
-    projection.invert = function(point) {
-        point = project.invert((point[0] - x) / k, (y - point[1]) / k);
-        return point && [point[0] * 180 / Math.PI, point[1] * 180 / Math.PI];
-    };
-
-    projection.scale = function(_) {
-        if (!arguments.length) return k;
-        k = +_;
-        return projection;
-    };
-
-    projection.translate = function(_) {
-        if (!arguments.length) return [x, y];
-        x = +_[0];
-        y = +_[1];
-        return projection;
-    };
-
-    projection.clipExtent = function(_) {
-        if (!arguments.length) return clipExtent;
-        clipExtent = _;
-        return projection;
-    };
-
-    projection.stream = d3.geo.transform({
-        point: function(x, y) {
-            x = projection([x, y]);
-            this.stream.point(x[0], x[1]);
-        }
-    }).stream;
-
-    return projection;
-};
-iD.actions = {};
-iD.actions.AddEntity = function(way) {
-    return function(graph) {
-        return graph.replace(way);
-    };
-};
-iD.actions.AddMember = function(relationId, member, memberIndex) {
-    return function(graph) {
-        var relation = graph.entity(relationId);
-
-        if (isNaN(memberIndex) && member.type === 'way') {
-            var members = relation.indexedMembers();
-            members.push(member);
-
-            var joined = iD.geo.joinWays(members, graph);
-            for (var i = 0; i < joined.length; i++) {
-                var segment = joined[i];
-                for (var j = 0; j < segment.length && segment.length >= 2; j++) {
-                    if (segment[j] !== member)
-                        continue;
-
-                    if (j === 0) {
-                        memberIndex = segment[j + 1].index;
-                    } else if (j === segment.length - 1) {
-                        memberIndex = segment[j - 1].index + 1;
-                    } else {
-                        memberIndex = Math.min(segment[j - 1].index + 1, segment[j + 1].index + 1);
-                    }
-                }
-            }
-        }
-
-        return graph.replace(relation.addMember(member, memberIndex));
-    };
-};
-iD.actions.AddMidpoint = function(midpoint, node) {
-    return function(graph) {
-        graph = graph.replace(node.move(midpoint.loc));
-
-        var parents = _.intersection(
-            graph.parentWays(graph.entity(midpoint.edge[0])),
-            graph.parentWays(graph.entity(midpoint.edge[1])));
-
-        parents.forEach(function(way) {
-            for (var i = 0; i < way.nodes.length - 1; i++) {
-                if (iD.geo.edgeEqual([way.nodes[i], way.nodes[i + 1]], midpoint.edge)) {
-                    graph = graph.replace(graph.entity(way.id).addNode(node.id, i + 1));
-
-                    // Add only one midpoint on doubled-back segments,
-                    // turning them into self-intersections.
-                    return;
-                }
-            }
-        });
-
-        return graph;
-    };
-};
-// https://github.com/openstreetmap/potlatch2/blob/master/net/systemeD/halcyon/connection/actions/AddNodeToWayAction.as
-iD.actions.AddVertex = function(wayId, nodeId, index) {
-    return function(graph) {
-        return graph.replace(graph.entity(wayId).addNode(nodeId, index));
-    };
-};
-iD.actions.ChangeMember = function(relationId, member, memberIndex) {
-    return function(graph) {
-        return graph.replace(graph.entity(relationId).updateMember(member, memberIndex));
-    };
-};
-iD.actions.ChangePreset = function(entityId, oldPreset, newPreset) {
-    return function(graph) {
-        var entity = graph.entity(entityId),
-            geometry = entity.geometry(graph),
-            tags = entity.tags;
-
-        if (oldPreset) tags = oldPreset.removeTags(tags, geometry);
-        if (newPreset) tags = newPreset.applyTags(tags, geometry);
-
-        return graph.replace(entity.update({tags: tags}));
-    };
-};
-iD.actions.ChangeTags = function(entityId, tags) {
-    return function(graph) {
-        var entity = graph.entity(entityId);
-        return graph.replace(entity.update({tags: tags}));
-    };
-};
-iD.actions.Circularize = function(wayId, projection, maxAngle) {
-    maxAngle = (maxAngle || 20) * Math.PI / 180;
-
-    var action = function(graph) {
-        var way = graph.entity(wayId);
-
-        if (!way.isConvex(graph)) {
-            graph = action.makeConvex(graph);
-        }
-
-        var nodes = _.uniq(graph.childNodes(way)),
-            keyNodes = nodes.filter(function(n) { return graph.parentWays(n).length !== 1; }),
-            points = nodes.map(function(n) { return projection(n.loc); }),
-            keyPoints = keyNodes.map(function(n) { return projection(n.loc); }),
-            centroid = (points.length === 2) ? iD.geo.interp(points[0], points[1], 0.5) : d3.geom.polygon(points).centroid(),
-            radius = d3.median(points, function(p) { return iD.geo.euclideanDistance(centroid, p); }),
-            sign = d3.geom.polygon(points).area() > 0 ? 1 : -1,
-            ids;
-
-        // we need atleast two key nodes for the algorithm to work
-        if (!keyNodes.length) {
-            keyNodes = [nodes[0]];
-            keyPoints = [points[0]];
-        }
-
-        if (keyNodes.length === 1) {
-            var index = nodes.indexOf(keyNodes[0]),
-                oppositeIndex = Math.floor((index + nodes.length / 2) % nodes.length);
-
-            keyNodes.push(nodes[oppositeIndex]);
-            keyPoints.push(points[oppositeIndex]);
-        }
-
-        // key points and nodes are those connected to the ways,
-        // they are projected onto the circle, inbetween nodes are moved
-        // to constant intervals between key nodes, extra inbetween nodes are
-        // added if necessary.
-        for (var i = 0; i < keyPoints.length; i++) {
-            var nextKeyNodeIndex = (i + 1) % keyNodes.length,
-                startNode = keyNodes[i],
-                endNode = keyNodes[nextKeyNodeIndex],
-                startNodeIndex = nodes.indexOf(startNode),
-                endNodeIndex = nodes.indexOf(endNode),
-                numberNewPoints = -1,
-                indexRange = endNodeIndex - startNodeIndex,
-                distance, totalAngle, eachAngle, startAngle, endAngle,
-                angle, loc, node, j,
-                inBetweenNodes = [];
-
-            if (indexRange < 0) {
-                indexRange += nodes.length;
-            }
-
-            // position this key node
-            distance = iD.geo.euclideanDistance(centroid, keyPoints[i]);
-            if (distance === 0) { distance = 1e-4; }
-            keyPoints[i] = [
-                centroid[0] + (keyPoints[i][0] - centroid[0]) / distance * radius,
-                centroid[1] + (keyPoints[i][1] - centroid[1]) / distance * radius];
-            graph = graph.replace(keyNodes[i].move(projection.invert(keyPoints[i])));
-
-            // figure out the between delta angle we want to match to
-            startAngle = Math.atan2(keyPoints[i][1] - centroid[1], keyPoints[i][0] - centroid[0]);
-            endAngle = Math.atan2(keyPoints[nextKeyNodeIndex][1] - centroid[1], keyPoints[nextKeyNodeIndex][0] - centroid[0]);
-            totalAngle = endAngle - startAngle;
-
-            // detects looping around -pi/pi
-            if (totalAngle * sign > 0) {
-                totalAngle = -sign * (2 * Math.PI - Math.abs(totalAngle));
-            }
-
-            do {
-                numberNewPoints++;
-                eachAngle = totalAngle / (indexRange + numberNewPoints);
-            } while (Math.abs(eachAngle) > maxAngle);
-
-            // move existing points
-            for (j = 1; j < indexRange; j++) {
-                angle = startAngle + j * eachAngle;
-                loc = projection.invert([
-                    centroid[0] + Math.cos(angle)*radius,
-                    centroid[1] + Math.sin(angle)*radius]);
-
-                node = nodes[(j + startNodeIndex) % nodes.length].move(loc);
-                graph = graph.replace(node);
-            }
-
-            // add new inbetween nodes if necessary
-            for (j = 0; j < numberNewPoints; j++) {
-                angle = startAngle + (indexRange + j) * eachAngle;
-                loc = projection.invert([
-                    centroid[0] + Math.cos(angle) * radius,
-                    centroid[1] + Math.sin(angle) * radius]);
-
-                node = iD.Node({loc: loc});
-                graph = graph.replace(node);
-
-                nodes.splice(endNodeIndex + j, 0, node);
-                inBetweenNodes.push(node.id);
-            }
-
-            // Check for other ways that share these keyNodes..
-            // If keyNodes are adjacent in both ways,
-            // we can add inBetween nodes to that shared way too..
-            if (indexRange === 1 && inBetweenNodes.length) {
-                var startIndex1 = way.nodes.lastIndexOf(startNode.id),
-                    endIndex1 = way.nodes.lastIndexOf(endNode.id),
-                    wayDirection1 = (endIndex1 - startIndex1);
-                if (wayDirection1 < -1) { wayDirection1 = 1;}
-
-                /*jshint -W083 */
-                _.each(_.without(graph.parentWays(keyNodes[i]), way), function(sharedWay) {
-                    if (sharedWay.areAdjacent(startNode.id, endNode.id)) {
-                        var startIndex2 = sharedWay.nodes.lastIndexOf(startNode.id),
-                            endIndex2 = sharedWay.nodes.lastIndexOf(endNode.id),
-                            wayDirection2 = (endIndex2 - startIndex2),
-                            insertAt = endIndex2;
-                        if (wayDirection2 < -1) { wayDirection2 = 1;}
-
-                        if (wayDirection1 !== wayDirection2) {
-                            inBetweenNodes.reverse();
-                            insertAt = startIndex2;
-                        }
-                        for (j = 0; j < inBetweenNodes.length; j++) {
-                            sharedWay = sharedWay.addNode(inBetweenNodes[j], insertAt + j);
-                        }
-                        graph = graph.replace(sharedWay);
-                    }
-                });
-                /*jshint +W083 */
-            }
-
-        }
-
-        // update the way to have all the new nodes
-        ids = nodes.map(function(n) { return n.id; });
-        ids.push(ids[0]);
-
-        way = way.update({nodes: ids});
-        graph = graph.replace(way);
-
-        return graph;
-    };
-
-    action.makeConvex = function(graph) {
-        var way = graph.entity(wayId),
-            nodes = _.uniq(graph.childNodes(way)),
-            points = nodes.map(function(n) { return projection(n.loc); }),
-            sign = d3.geom.polygon(points).area() > 0 ? 1 : -1,
-            hull = d3.geom.hull(points);
-
-        // D3 convex hulls go counterclockwise..
-        if (sign === -1) {
-            nodes.reverse();
-            points.reverse();
-        }
-
-        for (var i = 0; i < hull.length - 1; i++) {
-            var startIndex = points.indexOf(hull[i]),
-                endIndex = points.indexOf(hull[i+1]),
-                indexRange = (endIndex - startIndex);
-
-            if (indexRange < 0) {
-                indexRange += nodes.length;
-            }
-
-            // move interior nodes to the surface of the convex hull..
-            for (var j = 1; j < indexRange; j++) {
-                var point = iD.geo.interp(hull[i], hull[i+1], j / indexRange),
-                    node = nodes[(j + startIndex) % nodes.length].move(projection.invert(point));
-                graph = graph.replace(node);
-            }
-        }
-        return graph;
-    };
-
-    action.disabled = function(graph) {
-        if (!graph.entity(wayId).isClosed())
-            return 'not_closed';
-    };
-
-    return action;
-};
-// Connect the ways at the given nodes.
-//
-// The last node will survive. All other nodes will be replaced with
-// the surviving node in parent ways, and then removed.
-//
-// Tags and relation memberships of of non-surviving nodes are merged
-// to the survivor.
-//
-// This is the inverse of `iD.actions.Disconnect`.
-//
-// Reference:
-//   https://github.com/openstreetmap/potlatch2/blob/master/net/systemeD/halcyon/connection/actions/MergeNodesAction.as
-//   https://github.com/openstreetmap/josm/blob/mirror/src/org/openstreetmap/josm/actions/MergeNodesAction.java
-//
-iD.actions.Connect = function(nodeIds) {
-    return function(graph) {
-        var survivor = graph.entity(_.last(nodeIds));
-
-        for (var i = 0; i < nodeIds.length - 1; i++) {
-            var node = graph.entity(nodeIds[i]);
-
-            /*jshint -W083 */
-            graph.parentWays(node).forEach(function(parent) {
-                if (!parent.areAdjacent(node.id, survivor.id)) {
-                    graph = graph.replace(parent.replaceNode(node.id, survivor.id));
-                }
-            });
-
-            graph.parentRelations(node).forEach(function(parent) {
-                graph = graph.replace(parent.replaceMember(node, survivor));
-            });
-            /*jshint +W083 */
-
-            survivor = survivor.mergeTags(node.tags);
-            graph = iD.actions.DeleteNode(node.id)(graph);
-        }
-
-        graph = graph.replace(survivor);
-
-        return graph;
-    };
-};
-iD.actions.DeleteMember = function(relationId, memberIndex) {
-    return function(graph) {
-        var relation = graph.entity(relationId)
-            .removeMember(memberIndex);
-
-        graph = graph.replace(relation);
-
-        if (relation.isDegenerate())
-            graph = iD.actions.DeleteRelation(relation.id)(graph);
-
-        return graph;
-    };
-};
-iD.actions.DeleteMultiple = function(ids) {
-    var actions = {
-        way: iD.actions.DeleteWay,
-        node: iD.actions.DeleteNode,
-        relation: iD.actions.DeleteRelation
-    };
-
-    var action = function(graph) {
-        ids.forEach(function(id) {
-            if (graph.hasEntity(id)) { // It may have been deleted aready.
-                graph = actions[graph.entity(id).type](id)(graph);
-            }
-        });
-
-        return graph;
-    };
-
-    action.disabled = function(graph) {
-        for (var i = 0; i < ids.length; i++) {
-            var id = ids[i],
-                disabled = actions[graph.entity(id).type](id).disabled(graph);
-            if (disabled) return disabled;
-        }
-    };
-
-    return action;
-};
-// https://github.com/openstreetmap/potlatch2/blob/master/net/systemeD/halcyon/connection/actions/DeleteNodeAction.as
-iD.actions.DeleteNode = function(nodeId) {
-    var action = function(graph) {
-        var node = graph.entity(nodeId);
-
-        graph.parentWays(node)
-            .forEach(function(parent) {
-                parent = parent.removeNode(nodeId);
-                graph = graph.replace(parent);
-
-                if (parent.isDegenerate()) {
-                    graph = iD.actions.DeleteWay(parent.id)(graph);
-                }
-            });
-
-        graph.parentRelations(node)
-            .forEach(function(parent) {
-                parent = parent.removeMembersWithID(nodeId);
-                graph = graph.replace(parent);
-
-                if (parent.isDegenerate()) {
-                    graph = iD.actions.DeleteRelation(parent.id)(graph);
-                }
-            });
-
-        return graph.remove(node);
-    };
-
-    action.disabled = function() {
-        return false;
-    };
-
-    return action;
-};
-// https://github.com/openstreetmap/potlatch2/blob/master/net/systemeD/halcyon/connection/actions/DeleteRelationAction.as
-iD.actions.DeleteRelation = function(relationId) {
-    function deleteEntity(entity, graph) {
-        return !graph.parentWays(entity).length &&
-            !graph.parentRelations(entity).length &&
-            !entity.hasInterestingTags();
-    }
-
-    var action = function(graph) {
-        var relation = graph.entity(relationId);
-
-        graph.parentRelations(relation)
-            .forEach(function(parent) {
-                parent = parent.removeMembersWithID(relationId);
-                graph = graph.replace(parent);
-
-                if (parent.isDegenerate()) {
-                    graph = iD.actions.DeleteRelation(parent.id)(graph);
-                }
-            });
-
-        _.uniq(_.pluck(relation.members, 'id')).forEach(function(memberId) {
-            graph = graph.replace(relation.removeMembersWithID(memberId));
-
-            var entity = graph.entity(memberId);
-            if (deleteEntity(entity, graph)) {
-                graph = iD.actions.DeleteMultiple([memberId])(graph);
-            }
-        });
-
-        return graph.remove(relation);
-    };
-
-    action.disabled = function(graph) {
-        if (!graph.entity(relationId).isComplete(graph))
-            return 'incomplete_relation';
-    };
-
-    return action;
-};
-// https://github.com/openstreetmap/potlatch2/blob/master/net/systemeD/halcyon/connection/actions/DeleteWayAction.as
-iD.actions.DeleteWay = function(wayId) {
-    function deleteNode(node, graph) {
-        return !graph.parentWays(node).length &&
-            !graph.parentRelations(node).length &&
-            !node.hasInterestingTags();
-    }
-
-    var action = function(graph) {
-        var way = graph.entity(wayId);
-
-        graph.parentRelations(way)
-            .forEach(function(parent) {
-                parent = parent.removeMembersWithID(wayId);
-                graph = graph.replace(parent);
-
-                if (parent.isDegenerate()) {
-                    graph = iD.actions.DeleteRelation(parent.id)(graph);
-                }
-            });
-
-        _.uniq(way.nodes).forEach(function(nodeId) {
-            graph = graph.replace(way.removeNode(nodeId));
-
-            var node = graph.entity(nodeId);
-            if (deleteNode(node, graph)) {
-                graph = graph.remove(node);
-            }
-        });
-
-        return graph.remove(way);
-    };
-
-    action.disabled = function() {
-        return false;
-    };
-
-    return action;
-};
-iD.actions.DeprecateTags = function(entityId) {
-    return function(graph) {
-        var entity = graph.entity(entityId),
-            newtags = _.clone(entity.tags),
-            change = false,
-            rule;
-
-        // This handles deprecated tags with a single condition
-        for (var i = 0; i < iD.data.deprecated.length; i++) {
-
-            rule = iD.data.deprecated[i];
-            var match = _.pairs(rule.old)[0],
-                replacements = rule.replace ? _.pairs(rule.replace) : null;
-
-            if (entity.tags[match[0]] && match[1] === '*') {
-
-                var value = entity.tags[match[0]];
-                if (replacements && !newtags[replacements[0][0]]) {
-                    newtags[replacements[0][0]] = value;
-                }
-                delete newtags[match[0]];
-                change = true;
-
-            } else if (entity.tags[match[0]] === match[1]) {
-                newtags = _.assign({}, rule.replace || {}, _.omit(newtags, match[0]));
-                change = true;
-            }
-        }
-
-        if (change) {
-            return graph.replace(entity.update({tags: newtags}));
-        } else {
-            return graph;
-        }
-    };
-};
-iD.actions.DiscardTags = function(difference) {
-    return function(graph) {
-        function discardTags(entity) {
-            if (!_.isEmpty(entity.tags)) {
-                var tags = {};
-                _.each(entity.tags, function(v, k) {
-                    if (v) tags[k] = v;
-                });
-
-                graph = graph.replace(entity.update({
-                    tags: _.omit(tags, iD.data.discarded)
-                }));
-            }
-        }
-
-        difference.modified().forEach(discardTags);
-        difference.created().forEach(discardTags);
-
-        return graph;
-    };
-};
-// Disconect the ways at the given node.
-//
-// Optionally, disconnect only the given ways.
-//
-// For testing convenience, accepts an ID to assign to the (first) new node.
-// Normally, this will be undefined and the way will automatically
-// be assigned a new ID.
-//
-// This is the inverse of `iD.actions.Connect`.
-//
-// Reference:
-//   https://github.com/openstreetmap/potlatch2/blob/master/net/systemeD/halcyon/connection/actions/UnjoinNodeAction.as
-//   https://github.com/openstreetmap/josm/blob/mirror/src/org/openstreetmap/josm/actions/UnGlueAction.java
-//
-iD.actions.Disconnect = function(nodeId, newNodeId) {
-    var wayIds;
-
-    var action = function(graph) {
-        var node = graph.entity(nodeId),
-            connections = action.connections(graph);
-
-        connections.forEach(function(connection) {
-            var way = graph.entity(connection.wayID),
-                newNode = iD.Node({id: newNodeId, loc: node.loc, tags: node.tags});
-
-            graph = graph.replace(newNode);
-            if (connection.index === 0 && way.isArea()) {
-                // replace shared node with shared node..
-                graph = graph.replace(way.replaceNode(way.nodes[0], newNode.id));
-            } else {
-                // replace shared node with multiple new nodes..
-                graph = graph.replace(way.updateNode(newNode.id, connection.index));
-            }
-        });
-
-        return graph;
-    };
-
-    action.connections = function(graph) {
-        var candidates = [],
-            keeping = false,
-            parentWays = graph.parentWays(graph.entity(nodeId));
-
-        parentWays.forEach(function(way) {
-            if (wayIds && wayIds.indexOf(way.id) === -1) {
-                keeping = true;
-                return;
-            }
-            if (way.isArea() && (way.nodes[0] === nodeId)) {
-                candidates.push({wayID: way.id, index: 0});
-            } else {
-                way.nodes.forEach(function(waynode, index) {
-                    if (waynode === nodeId) {
-                        candidates.push({wayID: way.id, index: index});
-                    }
-                });
-            }
-        });
-
-        return keeping ? candidates : candidates.slice(1);
-    };
-
-    action.disabled = function(graph) {
-        var connections = action.connections(graph);
-        if (connections.length === 0 || (wayIds && wayIds.length !== connections.length))
-            return 'not_connected';
-    };
-
-    action.limitWays = function(_) {
-        if (!arguments.length) return wayIds;
-        wayIds = _;
-        return action;
-    };
-
-    return action;
-};
-// Join ways at the end node they share.
-//
-// This is the inverse of `iD.actions.Split`.
-//
-// Reference:
-//   https://github.com/systemed/potlatch2/blob/master/net/systemeD/halcyon/connection/actions/MergeWaysAction.as
-//   https://github.com/openstreetmap/josm/blob/mirror/src/org/openstreetmap/josm/actions/CombineWayAction.java
-//
-iD.actions.Join = function(ids) {
-
-    function groupEntitiesByGeometry(graph) {
-        var entities = ids.map(function(id) { return graph.entity(id); });
-        return _.extend({line: []}, _.groupBy(entities, function(entity) { return entity.geometry(graph); }));
-    }
-
-    var action = function(graph) {
-        var ways = ids.map(graph.entity, graph),
-            survivor = ways[0];
-
-        // Prefer to keep an existing way.
-        for (var i = 0; i < ways.length; i++) {
-            if (!ways[i].isNew()) {
-                survivor = ways[i];
-                break;
-            }
-        }
-
-        var joined = iD.geo.joinWays(ways, graph)[0];
-
-        survivor = survivor.update({nodes: _.pluck(joined.nodes, 'id')});
-        graph = graph.replace(survivor);
-
-        joined.forEach(function(way) {
-            if (way.id === survivor.id)
-                return;
-
-            graph.parentRelations(way).forEach(function(parent) {
-                graph = graph.replace(parent.replaceMember(way, survivor));
-            });
-
-            survivor = survivor.mergeTags(way.tags);
-
-            graph = graph.replace(survivor);
-            graph = iD.actions.DeleteWay(way.id)(graph);
-        });
-
-        return graph;
-    };
-
-    action.disabled = function(graph) {
-        var geometries = groupEntitiesByGeometry(graph);
-        if (ids.length < 2 || ids.length !== geometries.line.length)
-            return 'not_eligible';
-
-        var joined = iD.geo.joinWays(ids.map(graph.entity, graph), graph);
-        if (joined.length > 1)
-            return 'not_adjacent';
-
-        var nodeIds = _.pluck(joined[0].nodes, 'id').slice(1, -1),
-            relation;
-
-        joined[0].forEach(function(way) {
-            var parents = graph.parentRelations(way);
-            parents.forEach(function(parent) {
-                if (parent.isRestriction() && parent.members.some(function(m) { return nodeIds.indexOf(m.id) >= 0; }))
-                    relation = parent;
-            });
-        });
-
-        if (relation)
-            return 'restriction';
-    };
-
-    return action;
-};
-iD.actions.Merge = function(ids) {
-    function groupEntitiesByGeometry(graph) {
-        var entities = ids.map(function(id) { return graph.entity(id); });
-        return _.extend({point: [], area: [], line: [], relation: []},
-            _.groupBy(entities, function(entity) { return entity.geometry(graph); }));
-    }
-
-    var action = function(graph) {
-        var geometries = groupEntitiesByGeometry(graph),
-            target = geometries.area[0] || geometries.line[0],
-            points = geometries.point;
-
-        points.forEach(function(point) {
-            target = target.mergeTags(point.tags);
-
-            graph.parentRelations(point).forEach(function(parent) {
-                graph = graph.replace(parent.replaceMember(point, target));
-            });
-
-            graph = graph.remove(point);
-        });
-
-        graph = graph.replace(target);
-
-        return graph;
-    };
-
-    action.disabled = function(graph) {
-        var geometries = groupEntitiesByGeometry(graph);
-        if (geometries.point.length === 0 ||
-            (geometries.area.length + geometries.line.length) !== 1 ||
-            geometries.relation.length !== 0)
-            return 'not_eligible';
-    };
-
-    return action;
-};
-iD.actions.MergePolygon = function(ids, newRelationId) {
-
-    function groupEntities(graph) {
-        var entities = ids.map(function (id) { return graph.entity(id); });
-        return _.extend({
-                closedWay: [],
-                multipolygon: [],
-                other: []
-            }, _.groupBy(entities, function(entity) {
-                if (entity.type === 'way' && entity.isClosed()) {
-                    return 'closedWay';
-                } else if (entity.type === 'relation' && entity.isMultipolygon()) {
-                    return 'multipolygon';
-                } else {
-                    return 'other';
-                }
-            }));
-    }
-
-    var action = function(graph) {
-        var entities = groupEntities(graph);
-
-        // An array representing all the polygons that are part of the multipolygon.
-        //
-        // Each element is itself an array of objects with an id property, and has a
-        // locs property which is an array of the locations forming the polygon.
-        var polygons = entities.multipolygon.reduce(function(polygons, m) {
-            return polygons.concat(iD.geo.joinWays(m.members, graph));
-        }, []).concat(entities.closedWay.map(function(d) {
-            var member = [{id: d.id}];
-            member.nodes = graph.childNodes(d);
-            return member;
-        }));
-
-        // contained is an array of arrays of boolean values,
-        // where contained[j][k] is true iff the jth way is
-        // contained by the kth way.
-        var contained = polygons.map(function(w, i) {
-            return polygons.map(function(d, n) {
-                if (i === n) return null;
-                return iD.geo.polygonContainsPolygon(
-                    _.pluck(d.nodes, 'loc'),
-                    _.pluck(w.nodes, 'loc'));
-            });
-        });
-
-        // Sort all polygons as either outer or inner ways
-        var members = [],
-            outer = true;
-
-        while (polygons.length) {
-            extractUncontained(polygons);
-            polygons = polygons.filter(isContained);
-            contained = contained.filter(isContained).map(filterContained);
-        }
-
-        function isContained(d, i) {
-            return _.any(contained[i]);
-        }
-
-        function filterContained(d) {
-            return d.filter(isContained);
-        }
-
-        function extractUncontained(polygons) {
-            polygons.forEach(function(d, i) {
-                if (!isContained(d, i)) {
-                    d.forEach(function(member) {
-                        members.push({
-                            type: 'way',
-                            id: member.id,
-                            role: outer ? 'outer' : 'inner'
-                        });
-                    });
-                }
-            });
-            outer = !outer;
-        }
-
-        // Move all tags to one relation
-        var relation = entities.multipolygon[0] ||
-            iD.Relation({ id: newRelationId, tags: { type: 'multipolygon' }});
-
-        entities.multipolygon.slice(1).forEach(function(m) {
-            relation = relation.mergeTags(m.tags);
-            graph = graph.remove(m);
-        });
-
-        entities.closedWay.forEach(function(way) {
-            function isThisOuter(m) {
-                return m.id === way.id && m.role !== 'inner';
-            }
-            if (members.some(isThisOuter)) {
-                relation = relation.mergeTags(way.tags);
-                graph = graph.replace(way.update({ tags: {} }));
-            }
-        });
-
-        return graph.replace(relation.update({
-            members: members,
-            tags: _.omit(relation.tags, 'area')
-        }));
-    };
-
-    action.disabled = function(graph) {
-        var entities = groupEntities(graph);
-        if (entities.other.length > 0 ||
-            entities.closedWay.length + entities.multipolygon.length < 2)
-            return 'not_eligible';
-        if (!entities.multipolygon.every(function(r) { return r.isComplete(graph); }))
-            return 'incomplete_relation';
-    };
-
-    return action;
-};
-// https://github.com/openstreetmap/josm/blob/mirror/src/org/openstreetmap/josm/command/MoveCommand.java
-// https://github.com/openstreetmap/potlatch2/blob/master/net/systemeD/halcyon/connection/actions/MoveNodeAction.as
-iD.actions.Move = function(ids, delta, projection) {
-    function addNodes(ids, nodes, graph) {
-        ids.forEach(function(id) {
-            var entity = graph.entity(id);
-            if (entity.type === 'node') {
-                nodes.push(id);
-            } else if (entity.type === 'way') {
-                nodes.push.apply(nodes, entity.nodes);
-            } else {
-                addNodes(_.pluck(entity.members, 'id'), nodes, graph);
-            }
-        });
-    }
-
-    var action = function(graph) {
-        var nodes = [];
-
-        addNodes(ids, nodes, graph);
-
-        _.uniq(nodes).forEach(function(id) {
-            var node = graph.entity(id),
-                start = projection(node.loc),
-                end = projection.invert([start[0] + delta[0], start[1] + delta[1]]);
-            graph = graph.replace(node.move(end));
-        });
-
-        return graph;
-    };
-
-    action.disabled = function(graph) {
-        function incompleteRelation(id) {
-            var entity = graph.entity(id);
-            return entity.type === 'relation' && !entity.isComplete(graph);
-        }
-
-        if (_.any(ids, incompleteRelation))
-            return 'incomplete_relation';
-    };
-
-    return action;
-};
-// https://github.com/openstreetmap/josm/blob/mirror/src/org/openstreetmap/josm/command/MoveCommand.java
-// https://github.com/openstreetmap/potlatch2/blob/master/net/systemeD/halcyon/connection/actions/MoveNodeAction.as
-iD.actions.MoveNode = function(nodeId, loc) {
-    return function(graph) {
-        return graph.replace(graph.entity(nodeId).move(loc));
-    };
-};
-iD.actions.Noop = function() {
-    return function(graph) {
-        return graph;
-    };
-};
-/*
- * Based on https://github.com/openstreetmap/potlatch2/blob/master/net/systemeD/potlatch2/tools/Quadrilateralise.as
- */
-
-iD.actions.Orthogonalize = function(wayId, projection) {
-    var threshold = 12, // degrees within right or straight to alter
-        lowerThreshold = Math.cos((90 - threshold) * Math.PI / 180),
-        upperThreshold = Math.cos(threshold * Math.PI / 180);
-
-    var action = function(graph) {
-        var way = graph.entity(wayId),
-            nodes = graph.childNodes(way),
-            points = _.uniq(nodes).map(function(n) { return projection(n.loc); }),
-            corner = {i: 0, dotp: 1},
-            epsilon = 1e-4,
-            i, j, score, motions;
-
-        if (nodes.length === 4) {
-            for (i = 0; i < 1000; i++) {
-                motions = points.map(calcMotion);
-                points[corner.i] = addPoints(points[corner.i],motions[corner.i]);
-                score = corner.dotp;
-                if (score < epsilon) {
-                    break;
-                }
-            }
-
-            graph = graph.replace(graph.entity(nodes[corner.i].id)
-                .move(projection.invert(points[corner.i])));
-        } else {
-            var best,
-                originalPoints = _.clone(points);
-            score = Infinity;
-
-            for (i = 0; i < 1000; i++) {
-                motions = points.map(calcMotion);
-                for (j = 0; j < motions.length; j++) {
-                    points[j] = addPoints(points[j],motions[j]);
-                }
-                var newScore = squareness(points);
-                if (newScore < score) {
-                    best = _.clone(points);
-                    score = newScore;
-                }
-                if (score < epsilon) {
-                    break;
-                }
-            }
-
-            points = best;
-
-            for (i = 0; i < points.length; i++) {
-                // only move the points that actually moved
-                if (originalPoints[i][0] !== points[i][0] || originalPoints[i][1] !== points[i][1]) {
-                    graph = graph.replace(graph.entity(nodes[i].id)
-                        .move(projection.invert(points[i])));
-                }
-            }
-
-            // remove empty nodes on straight sections
-            for (i = 0; i < points.length; i++) {
-                var node = nodes[i];
-
-                if (graph.parentWays(node).length > 1 ||
-                    graph.parentRelations(node).length ||
-                    node.hasInterestingTags()) {
-
-                    continue;
-                }
-
-                var dotp = normalizedDotProduct(i, points);
-                if (dotp < -1 + epsilon) {
-                    graph = iD.actions.DeleteNode(nodes[i].id)(graph);
-                }
-            }
-        }
-
-        return graph;
-
-        function calcMotion(b, i, array) {
-            var a = array[(i - 1 + array.length) % array.length],
-                c = array[(i + 1) % array.length],
-                p = subtractPoints(a, b),
-                q = subtractPoints(c, b),
-                scale, dotp;
-
-            scale = 2 * Math.min(iD.geo.euclideanDistance(p, [0, 0]), iD.geo.euclideanDistance(q, [0, 0]));
-            p = normalizePoint(p, 1.0);
-            q = normalizePoint(q, 1.0);
-
-            dotp = filterDotProduct(p[0] * q[0] + p[1] * q[1]);
-
-            // nasty hack to deal with almost-straight segments (angle is closer to 180 than to 90/270).
-            if (array.length > 3) {
-                if (dotp < -0.707106781186547) {
-                    dotp += 1.0;
-                }
-            } else if (dotp && Math.abs(dotp) < corner.dotp) {
-                corner.i = i;
-                corner.dotp = Math.abs(dotp);
-            }
-
-            return normalizePoint(addPoints(p, q), 0.1 * dotp * scale);
-        }
-    };
-
-    function squareness(points) {
-        return points.reduce(function(sum, val, i, array) {
-            var dotp = normalizedDotProduct(i, array);
-
-            dotp = filterDotProduct(dotp);
-            return sum + 2.0 * Math.min(Math.abs(dotp - 1.0), Math.min(Math.abs(dotp), Math.abs(dotp + 1)));
-        }, 0);
-    }
-
-    function normalizedDotProduct(i, points) {
-        var a = points[(i - 1 + points.length) % points.length],
-            b = points[i],
-            c = points[(i + 1) % points.length],
-            p = subtractPoints(a, b),
-            q = subtractPoints(c, b);
-
-        p = normalizePoint(p, 1.0);
-        q = normalizePoint(q, 1.0);
-
-        return p[0] * q[0] + p[1] * q[1];
-    }
-
-    function subtractPoints(a, b) {
-        return [a[0] - b[0], a[1] - b[1]];
-    }
-
-    function addPoints(a, b) {
-        return [a[0] + b[0], a[1] + b[1]];
-    }
-
-    function normalizePoint(point, scale) {
-        var vector = [0, 0];
-        var length = Math.sqrt(point[0] * point[0] + point[1] * point[1]);
-        if (length !== 0) {
-            vector[0] = point[0] / length;
-            vector[1] = point[1] / length;
-        }
-
-        vector[0] *= scale;
-        vector[1] *= scale;
-
-        return vector;
-    }
-
-    function filterDotProduct(dotp) {
-        if (lowerThreshold > Math.abs(dotp) || Math.abs(dotp) > upperThreshold) {
-            return dotp;
-        }
-
-        return 0;
-    }
-
-    action.disabled = function(graph) {
-        var way = graph.entity(wayId),
-            nodes = graph.childNodes(way),
-            points = _.uniq(nodes).map(function(n) { return projection(n.loc); });
-
-        if (squareness(points)) {
-            return false;
-        }
-
-        return 'not_squarish';
-    };
-
-    return action;
-};
-// Create a restriction relation for `turn`, which must have the following structure:
-//
-//     {
-//         from: { node: <node ID>, way: <way ID> },
-//         via:  { node: <node ID> },
-//         to:   { node: <node ID>, way: <way ID> },
-//         restriction: <'no_right_turn', 'no_left_turn', etc.>
-//     }
-//
-// This specifies a restriction of type `restriction` when traveling from
-// `from.node` in `from.way` toward `to.node` in `to.way` via `via.node`.
-// (The action does not check that these entities form a valid intersection.)
-//
-// If `restriction` is not provided, it is automatically determined by
-// iD.geo.inferRestriction.
-//
-// If necessary, the `from` and `to` ways are split. In these cases, `from.node`
-// and `to.node` are used to determine which portion of the split ways become
-// members of the restriction.
-//
-// For testing convenience, accepts an ID to assign to the new relation.
-// Normally, this will be undefined and the relation will automatically
-// be assigned a new ID.
-//
-iD.actions.RestrictTurn = function(turn, projection, restrictionId) {
-    return function(graph) {
-        var from = graph.entity(turn.from.way),
-            via  = graph.entity(turn.via.node),
-            to   = graph.entity(turn.to.way);
-
-        function split(toOrFrom) {
-            var newID = toOrFrom.newID || iD.Way().id;
-            graph = iD.actions.Split(via.id, [newID])
-                .limitWays([toOrFrom.way])(graph);
-
-            var a = graph.entity(newID),
-                b = graph.entity(toOrFrom.way);
-
-            if (a.nodes.indexOf(toOrFrom.node) !== -1) {
-                return [a, b];
-            } else {
-                return [b, a];
-            }
-        }
-
-        if (!from.affix(via.id)) {
-            if (turn.from.node === turn.to.node) {
-                // U-turn
-                from = to = split(turn.from)[0];
-            } else if (turn.from.way === turn.to.way) {
-                // Straight-on
-                var s = split(turn.from);
-                from = s[0];
-                to   = s[1];
-            } else {
-                // Other
-                from = split(turn.from)[0];
-            }
-        }
-
-        if (!to.affix(via.id)) {
-            to = split(turn.to)[0];
-        }
-
-        return graph.replace(iD.Relation({
-            id: restrictionId,
-            tags: {
-                type: 'restriction',
-                restriction: turn.restriction ||
-                    iD.geo.inferRestriction(
-                        graph,
-                        turn.from,
-                        turn.via,
-                        turn.to,
-                        projection)
-            },
-            members: [
-                {id: from.id, type: 'way',  role: 'from'},
-                {id: via.id,  type: 'node', role: 'via'},
-                {id: to.id,   type: 'way',  role: 'to'}
-            ]
-        }));
-    };
-};
-/*
-  Order the nodes of a way in reverse order and reverse any direction dependent tags
-  other than `oneway`. (We assume that correcting a backwards oneway is the primary
-  reason for reversing a way.)
-
-  The following transforms are performed:
-
-    Keys:
-          *:right=* ⟺ *:left=*
-        *:forward=* ⟺ *:backward=*
-       direction=up ⟺ direction=down
-         incline=up ⟺ incline=down
-            *=right ⟺ *=left
-
-    Relation members:
-       role=forward ⟺ role=backward
-         role=north ⟺ role=south
-          role=east ⟺ role=west
-
-   In addition, numeric-valued `incline` tags are negated.
-
-   The JOSM implementation was used as a guide, but transformations that were of unclear benefit
-   or adjusted tags that don't seem to be used in practice were omitted.
-
-   References:
-      http://wiki.openstreetmap.org/wiki/Forward_%26_backward,_left_%26_right
-      http://wiki.openstreetmap.org/wiki/Key:direction#Steps
-      http://wiki.openstreetmap.org/wiki/Key:incline
-      http://wiki.openstreetmap.org/wiki/Route#Members
-      http://josm.openstreetmap.de/browser/josm/trunk/src/org/openstreetmap/josm/corrector/ReverseWayTagCorrector.java
- */
-iD.actions.Reverse = function(wayId) {
-    var replacements = [
-            [/:right$/, ':left'], [/:left$/, ':right'],
-            [/:forward$/, ':backward'], [/:backward$/, ':forward']
-        ],
-        numeric = /^([+\-]?)(?=[\d.])/,
-        roleReversals = {
-            forward: 'backward',
-            backward: 'forward',
-            north: 'south',
-            south: 'north',
-            east: 'west',
-            west: 'east'
-        };
-
-    function reverseKey(key) {
-        for (var i = 0; i < replacements.length; ++i) {
-            var replacement = replacements[i];
-            if (replacement[0].test(key)) {
-                return key.replace(replacement[0], replacement[1]);
-            }
-        }
-        return key;
-    }
-
-    function reverseValue(key, value) {
-        if (key === 'incline' && numeric.test(value)) {
-            return value.replace(numeric, function(_, sign) { return sign === '-' ? '' : '-'; });
-        } else if (key === 'incline' || key === 'direction') {
-            return {up: 'down', down: 'up'}[value] || value;
-        } else {
-            return {left: 'right', right: 'left'}[value] || value;
-        }
-    }
-
-    return function(graph) {
-        var way = graph.entity(wayId),
-            nodes = way.nodes.slice().reverse(),
-            tags = {}, key, role;
-
-        for (key in way.tags) {
-            tags[reverseKey(key)] = reverseValue(key, way.tags[key]);
-        }
-
-        graph.parentRelations(way).forEach(function(relation) {
-            relation.members.forEach(function(member, index) {
-                if (member.id === way.id && (role = roleReversals[member.role])) {
-                    relation = relation.updateMember({role: role}, index);
-                    graph = graph.replace(relation);
-                }
-            });
-        });
-
-        return graph.replace(way.update({nodes: nodes, tags: tags}));
-    };
-};
-iD.actions.RotateWay = function(wayId, pivot, angle, projection) {
-    return function(graph) {
-        return graph.update(function(graph) {
-            var way = graph.entity(wayId);
-
-            _.unique(way.nodes).forEach(function(id) {
-
-                var node = graph.entity(id),
-                    point = projection(node.loc),
-                    radial = [0,0];
-
-                radial[0] = point[0] - pivot[0];
-                radial[1] = point[1] - pivot[1];
-
-                point = [
-                    radial[0] * Math.cos(angle) - radial[1] * Math.sin(angle) + pivot[0],
-                    radial[0] * Math.sin(angle) + radial[1] * Math.cos(angle) + pivot[1]
-                ];
-
-                graph = graph.replace(node.move(projection.invert(point)));
-
-            });
-
-        });
-    };
-};
-// Split a way at the given node.
-//
-// Optionally, split only the given ways, if multiple ways share
-// the given node.
-//
-// This is the inverse of `iD.actions.Join`.
-//
-// For testing convenience, accepts an ID to assign to the new way.
-// Normally, this will be undefined and the way will automatically
-// be assigned a new ID.
-//
-// Reference:
-//   https://github.com/systemed/potlatch2/blob/master/net/systemeD/halcyon/connection/actions/SplitWayAction.as
-//
-iD.actions.Split = function(nodeId, newWayIds) {
-    var wayIds;
-
-    // if the way is closed, we need to search for a partner node
-    // to split the way at.
-    //
-    // The following looks for a node that is both far away from
-    // the initial node in terms of way segment length and nearby
-    // in terms of beeline-distance. This assures that areas get
-    // split on the most "natural" points (independent of the number
-    // of nodes).
-    // For example: bone-shaped areas get split across their waist
-    // line, circles across the diameter.
-    function splitArea(nodes, idxA, graph) {
-        var lengths = new Array(nodes.length),
-            length,
-            i,
-            best = 0,
-            idxB;
-
-        function wrap(index) {
-            return iD.util.wrap(index, nodes.length);
-        }
-
-        function dist(nA, nB) {
-            return iD.geo.sphericalDistance(graph.entity(nA).loc, graph.entity(nB).loc);
-        }
-
-        // calculate lengths
-        length = 0;
-        for (i = wrap(idxA+1); i !== idxA; i = wrap(i+1)) {
-            length += dist(nodes[i], nodes[wrap(i-1)]);
-            lengths[i] = length;
-        }
-
-        length = 0;
-        for (i = wrap(idxA-1); i !== idxA; i = wrap(i-1)) {
-            length += dist(nodes[i], nodes[wrap(i+1)]);
-            if (length < lengths[i])
-                lengths[i] = length;
-        }
-
-        // determine best opposite node to split
-        for (i = 0; i < nodes.length; i++) {
-            var cost = lengths[i] / dist(nodes[idxA], nodes[i]);
-            if (cost > best) {
-                idxB = i;
-                best = cost;
-            }
-        }
-
-        return idxB;
-    }
-
-    function split(graph, wayA, newWayId) {
-        var wayB = iD.Way({id: newWayId, tags: wayA.tags}),
-            nodesA,
-            nodesB,
-            isArea = wayA.isArea(),
-            isOuter = iD.geo.isSimpleMultipolygonOuterMember(wayA, graph);
-
-        if (wayA.isClosed()) {
-            var nodes = wayA.nodes.slice(0, -1),
-                idxA = _.indexOf(nodes, nodeId),
-                idxB = splitArea(nodes, idxA, graph);
-
-            if (idxB < idxA) {
-                nodesA = nodes.slice(idxA).concat(nodes.slice(0, idxB + 1));
-                nodesB = nodes.slice(idxB, idxA + 1);
-            } else {
-                nodesA = nodes.slice(idxA, idxB + 1);
-                nodesB = nodes.slice(idxB).concat(nodes.slice(0, idxA + 1));
-            }
-        } else {
-            var idx = _.indexOf(wayA.nodes, nodeId, 1);
-            nodesA = wayA.nodes.slice(0, idx + 1);
-            nodesB = wayA.nodes.slice(idx);
-        }
-
-        wayA = wayA.update({nodes: nodesA});
-        wayB = wayB.update({nodes: nodesB});
-
-        graph = graph.replace(wayA);
-        graph = graph.replace(wayB);
-
-        graph.parentRelations(wayA).forEach(function(relation) {
-            if (relation.isRestriction()) {
-                var via = relation.memberByRole('via');
-                if (via && wayB.contains(via.id)) {
-                    relation = relation.updateMember({id: wayB.id}, relation.memberById(wayA.id).index);
-                    graph = graph.replace(relation);
-                }
-            } else {
-                if (relation === isOuter) {
-                    graph = graph.replace(relation.mergeTags(wayA.tags));
-                    graph = graph.replace(wayA.update({tags: {}}));
-                    graph = graph.replace(wayB.update({tags: {}}));
-                }
-
-                var member = {
-                    id: wayB.id,
-                    type: 'way',
-                    role: relation.memberById(wayA.id).role
-                };
-
-                graph = iD.actions.AddMember(relation.id, member)(graph);
-            }
-        });
-
-        if (!isOuter && isArea) {
-            var multipolygon = iD.Relation({
-                tags: _.extend({}, wayA.tags, {type: 'multipolygon'}),
-                members: [
-                    {id: wayA.id, role: 'outer', type: 'way'},
-                    {id: wayB.id, role: 'outer', type: 'way'}
-                ]});
-
-            graph = graph.replace(multipolygon);
-            graph = graph.replace(wayA.update({tags: {}}));
-            graph = graph.replace(wayB.update({tags: {}}));
-        }
-
-        return graph;
-    }
-
-    var action = function(graph) {
-        var candidates = action.ways(graph);
-        for (var i = 0; i < candidates.length; i++) {
-            graph = split(graph, candidates[i], newWayIds && newWayIds[i]);
-        }
-        return graph;
-    };
-
-    action.ways = function(graph) {
-        var node = graph.entity(nodeId),
-            parents = graph.parentWays(node),
-            hasLines = _.any(parents, function(parent) { return parent.geometry(graph) === 'line'; });
-
-        return parents.filter(function(parent) {
-            if (wayIds && wayIds.indexOf(parent.id) === -1)
-                return false;
-
-            if (!wayIds && hasLines && parent.geometry(graph) !== 'line')
-                return false;
-
-            if (parent.isClosed()) {
-                return true;
-            }
-
-            for (var i = 1; i < parent.nodes.length - 1; i++) {
-                if (parent.nodes[i] === nodeId) {
-                    return true;
-                }
-            }
-
-            return false;
-        });
-    };
-
-    action.disabled = function(graph) {
-        var candidates = action.ways(graph);
-        if (candidates.length === 0 || (wayIds && wayIds.length !== candidates.length))
-            return 'not_eligible';
-    };
-
-    action.limitWays = function(_) {
-        if (!arguments.length) return wayIds;
-        wayIds = _;
-        return action;
-    };
-
-    return action;
-};
-/*
- * Based on https://github.com/openstreetmap/potlatch2/net/systemeD/potlatch2/tools/Straighten.as
- */
-
-iD.actions.Straighten = function(wayId, projection) {
-    function positionAlongWay(n, s, e) {
-        return ((n[0] - s[0]) * (e[0] - s[0]) + (n[1] - s[1]) * (e[1] - s[1]))/
-                (Math.pow(e[0] - s[0], 2) + Math.pow(e[1] - s[1], 2));
-    }
-
-    var action = function(graph) {
-        var way = graph.entity(wayId),
-            nodes = graph.childNodes(way),
-            points = nodes.map(function(n) { return projection(n.loc); }),
-            startPoint = points[0],
-            endPoint = points[points.length-1],
-            toDelete = [],
-            i;
-
-        for (i = 1; i < points.length-1; i++) {
-            var node = nodes[i],
-                point = points[i];
-
-            if (graph.parentWays(node).length > 1 ||
-                graph.parentRelations(node).length ||
-                node.hasInterestingTags()) {
-
-                var u = positionAlongWay(point, startPoint, endPoint),
-                    p0 = startPoint[0] + u * (endPoint[0] - startPoint[0]),
-                    p1 = startPoint[1] + u * (endPoint[1] - startPoint[1]);
-
-                graph = graph.replace(graph.entity(node.id)
-                    .move(projection.invert([p0, p1])));
-            } else {
-                // safe to delete
-                if (toDelete.indexOf(node) === -1) {
-                    toDelete.push(node);
-                }
-            }
-        }
-
-        for (i = 0; i < toDelete.length; i++) {
-            graph = iD.actions.DeleteNode(toDelete[i].id)(graph);
-        }
-
-        return graph;
-    };
-    
-    action.disabled = function(graph) {
-        // check way isn't too bendy
-        var way = graph.entity(wayId),
-            nodes = graph.childNodes(way),
-            points = nodes.map(function(n) { return projection(n.loc); }),
-            startPoint = points[0],
-            endPoint = points[points.length-1],
-            threshold = 0.2 * Math.sqrt(Math.pow(startPoint[0] - endPoint[0], 2) + Math.pow(startPoint[1] - endPoint[1], 2)),
-            i;
-
-        for (i = 1; i < points.length-1; i++) {
-            var point = points[i],
-                u = positionAlongWay(point, startPoint, endPoint),
-                p0 = startPoint[0] + u * (endPoint[0] - startPoint[0]),
-                p1 = startPoint[1] + u * (endPoint[1] - startPoint[1]),
-                dist = Math.sqrt(Math.pow(p0 - point[0], 2) + Math.pow(p1 - point[1], 2));
-
-            // to bendy if point is off by 20% of total start/end distance in projected space
-            if (dist > threshold) {
-                return 'too_bendy';
-            }
-        }
-    };
-
-    return action;
-};
-// Remove the effects of `turn.restriction` on `turn`, which must have the
-// following structure:
-//
-//     {
-//         from: { node: <node ID>, way: <way ID> },
-//         via:  { node: <node ID> },
-//         to:   { node: <node ID>, way: <way ID> },
-//         restriction: <relation ID>
-//     }
-//
-// In the simple case, `restriction` is a reference to a `no_*` restriction
-// on the turn itself. In this case, it is simply deleted.
-//
-// The more complex case is where `restriction` references an `only_*`
-// restriction on a different turn in the same intersection. In that case,
-// that restriction is also deleted, but at the same time restrictions on
-// the turns other than the first two are created.
-//
-iD.actions.UnrestrictTurn = function(turn) {
-    return function(graph) {
-        return iD.actions.DeleteRelation(turn.restriction)(graph);
-    };
-};
-iD.behavior = {};
-iD.behavior.AddWay = function(context) {
-    var event = d3.dispatch('start', 'startFromWay', 'startFromNode'),
-        draw = iD.behavior.Draw(context);
-
-    var addWay = function(surface) {
-        draw.on('click', event.start)
-            .on('clickWay', event.startFromWay)
-            .on('clickNode', event.startFromNode)
-            .on('cancel', addWay.cancel)
-            .on('finish', addWay.cancel);
-
-        context.map()
-            .dblclickEnable(false);
-
-        surface.call(draw);
-    };
-
-    addWay.off = function(surface) {
-        surface.call(draw.off);
-    };
-
-    addWay.cancel = function() {
-        window.setTimeout(function() {
-            context.map().dblclickEnable(true);
-        }, 1000);
-
-        context.enter(iD.modes.Browse(context));
-    };
-
-    addWay.tail = function(text) {
-        draw.tail(text);
-        return addWay;
-    };
-
-    return d3.rebind(addWay, event, 'on');
-};
-/*
-    `iD.behavior.drag` is like `d3.behavior.drag`, with the following differences:
-
-    * The `origin` function is expected to return an [x, y] tuple rather than an
-      {x, y} object.
-    * The events are `start`, `move`, and `end`.
-      (https://github.com/mbostock/d3/issues/563)
-    * The `start` event is not dispatched until the first cursor movement occurs.
-      (https://github.com/mbostock/d3/pull/368)
-    * The `move` event has a `point` and `delta` [x, y] tuple properties rather
-      than `x`, `y`, `dx`, and `dy` properties.
-    * The `end` event is not dispatched if no movement occurs.
-    * An `off` function is available that unbinds the drag's internal event handlers.
-    * Delegation is supported via the `delegate` function.
-
- */
-iD.behavior.drag = function() {
-    function d3_eventCancel() {
-      d3.event.stopPropagation();
-      d3.event.preventDefault();
-    }
-
-    var event = d3.dispatch('start', 'move', 'end'),
-        origin = null,
-        selector = '',
-        filter = null,
-        event_, target, surface;
-
-    event.of = function(thiz, argumentz) {
-      return function(e1) {
-        var e0 = e1.sourceEvent = d3.event;
-        e1.target = drag;
-        d3.event = e1;
-        try {
-          event[e1.type].apply(thiz, argumentz);
-        } finally {
-          d3.event = e0;
-        }
-      };
-    };
-
-    var d3_event_userSelectProperty = iD.util.prefixCSSProperty('UserSelect'),
-        d3_event_userSelectSuppress = d3_event_userSelectProperty ?
-            function () {
-                var selection = d3.selection(),
-                    select = selection.style(d3_event_userSelectProperty);
-                selection.style(d3_event_userSelectProperty, 'none');
-                return function () {
-                    selection.style(d3_event_userSelectProperty, select);
-                };
-            } :
-            function (type) {
-                var w = d3.select(window).on('selectstart.' + type, d3_eventCancel);
-                return function () {
-                    w.on('selectstart.' + type, null);
-                };
-            };
-
-    function mousedown() {
-        target = this;
-        event_ = event.of(target, arguments);
-        var eventTarget = d3.event.target,
-            touchId = d3.event.touches ? d3.event.changedTouches[0].identifier : null,
-            offset,
-            origin_ = point(),
-            started = false,
-            selectEnable = d3_event_userSelectSuppress(touchId !== null ? 'drag-' + touchId : 'drag');
-
-        var w = d3.select(window)
-            .on(touchId !== null ? 'touchmove.drag-' + touchId : 'mousemove.drag', dragmove)
-            .on(touchId !== null ? 'touchend.drag-' + touchId : 'mouseup.drag', dragend, true);
-
-        if (origin) {
-            offset = origin.apply(target, arguments);
-            offset = [offset[0] - origin_[0], offset[1] - origin_[1]];
-        } else {
-            offset = [0, 0];
-        }
-
-        if (touchId === null) d3.event.stopPropagation();
-
-        function point() {
-            var p = target.parentNode || surface;
-            return touchId !== null ? d3.touches(p).filter(function(p) {
-                return p.identifier === touchId;
-            })[0] : d3.mouse(p);
-        }
-
-        function dragmove() {
-
-            var p = point(),
-                dx = p[0] - origin_[0],
-                dy = p[1] - origin_[1];
-            
-            if (dx === 0 && dy === 0)
-                return;
-
-            if (!started) {
-                started = true;
-                event_({
-                    type: 'start'
-                });
-            }
-
-            origin_ = p;
-            d3_eventCancel();
-
-            event_({
-                type: 'move',
-                point: [p[0] + offset[0],  p[1] + offset[1]],
-                delta: [dx, dy]
-            });
-        }
-
-        function dragend() {
-            if (started) {
-                event_({
-                    type: 'end'
-                });
-
-                d3_eventCancel();
-                if (d3.event.target === eventTarget) w.on('click.drag', click, true);
-            }
-
-            w.on(touchId !== null ? 'touchmove.drag-' + touchId : 'mousemove.drag', null)
-                .on(touchId !== null ? 'touchend.drag-' + touchId : 'mouseup.drag', null);
-            selectEnable();
-        }
-
-        function click() {
-            d3_eventCancel();
-            w.on('click.drag', null);
-        }
-    }
-
-    function drag(selection) {
-        var matchesSelector = iD.util.prefixDOMProperty('matchesSelector'),
-            delegate = mousedown;
-
-        if (selector) {
-            delegate = function() {
-                var root = this,
-                    target = d3.event.target;
-                for (; target && target !== root; target = target.parentNode) {
-                    if (target[matchesSelector](selector) &&
-                            (!filter || filter(target.__data__))) {
-                        return mousedown.call(target, target.__data__);
-                    }
-                }
-            };
-        }
-
-        selection.on('mousedown.drag' + selector, delegate)
-            .on('touchstart.drag' + selector, delegate);
-    }
-
-    drag.off = function(selection) {
-        selection.on('mousedown.drag' + selector, null)
-            .on('touchstart.drag' + selector, null);
-    };
-
-    drag.delegate = function(_) {
-        if (!arguments.length) return selector;
-        selector = _;
-        return drag;
-    };
-
-    drag.filter = function(_) {
-        if (!arguments.length) return origin;
-        filter = _;
-        return drag;
-    };
-
-    drag.origin = function (_) {
-        if (!arguments.length) return origin;
-        origin = _;
-        return drag;
-    };
-
-    drag.cancel = function() {
-        d3.select(window)
-            .on('mousemove.drag', null)
-            .on('mouseup.drag', null);
-        return drag;
-    };
-
-    drag.target = function() {
-        if (!arguments.length) return target;
-        target = arguments[0];
-        event_ = event.of(target, Array.prototype.slice.call(arguments, 1));
-        return drag;
-    };
-
-    drag.surface = function() {
-        if (!arguments.length) return surface;
-        surface = arguments[0];
-        return drag;
-    };
-
-    return d3.rebind(drag, event, 'on');
-};
-iD.behavior.Draw = function(context) {
-    var event = d3.dispatch('move', 'click', 'clickWay',
-        'clickNode', 'undo', 'cancel', 'finish'),
-        keybinding = d3.keybinding('draw'),
-        hover = iD.behavior.Hover(context)
-            .altDisables(true)
-            .on('hover', context.ui().sidebar.hover),
-        tail = iD.behavior.Tail(),
-        edit = iD.behavior.Edit(context),
-        closeTolerance = 4,
-        tolerance = 12;
-
-    function datum() {
-        if (d3.event.altKey) return {};
-        else return d3.event.target.__data__ || {};
-    }
-
-    function mousedown() {
-
-        function point() {
-            var p = element.node().parentNode;
-            return touchId !== null ? d3.touches(p).filter(function(p) {
-                return p.identifier === touchId;
-            })[0] : d3.mouse(p);
-        }
-
-        var element = d3.select(this),
-            touchId = d3.event.touches ? d3.event.changedTouches[0].identifier : null,
-            time = +new Date(),
-            pos = point();
-
-        element.on('mousemove.draw', null);
-
-        d3.select(window).on('mouseup.draw', function() {
-            element.on('mousemove.draw', mousemove);
-            if (iD.geo.euclideanDistance(pos, point()) < closeTolerance ||
-                (iD.geo.euclideanDistance(pos, point()) < tolerance &&
-                (+new Date() - time) < 500)) {
-
-                // Prevent a quick second click
-                d3.select(window).on('click.draw-block', function() {
-                    d3.event.stopPropagation();
-                }, true);
-
-                context.map().dblclickEnable(false);
-
-                window.setTimeout(function() {
-                    context.map().dblclickEnable(true);
-                    d3.select(window).on('click.draw-block', null);
-                }, 500);
-
-                click();
-            }
-        });
-    }
-
-    function mousemove() {
-        event.move(datum());
-    }
-
-    function click() {
-        var d = datum();
-        if (d.type === 'way') {
-            var choice = iD.geo.chooseEdge(context.childNodes(d), context.mouse(), context.projection),
-                edge = [d.nodes[choice.index - 1], d.nodes[choice.index]];
-            event.clickWay(choice.loc, edge);
-
-        } else if (d.type === 'node') {
-            event.clickNode(d);
-
-        } else {
-            event.click(context.map().mouseCoordinates());
-        }
-    }
-
-    function backspace() {
-        d3.event.preventDefault();
-        event.undo();
-    }
-
-    function del() {
-        d3.event.preventDefault();
-        event.cancel();
-    }
-
-    function ret() {
-        d3.event.preventDefault();
-        event.finish();
-    }
-
-    function draw(selection) {
-        context.install(hover);
-        context.install(edit);
-
-        if (!context.inIntro() && !iD.behavior.Draw.usedTails[tail.text()]) {
-            context.install(tail);
-        }
-
-        keybinding
-            .on('⌫', backspace)
-            .on('⌦', del)
-            .on('⎋', ret)
-            .on('↩', ret);
-
-        selection
-            .on('mousedown.draw', mousedown)
-            .on('mousemove.draw', mousemove);
-
-        d3.select(document)
-            .call(keybinding);
-
-        return draw;
-    }
-
-    draw.off = function(selection) {
-        context.uninstall(hover);
-        context.uninstall(edit);
-
-        if (!context.inIntro() && !iD.behavior.Draw.usedTails[tail.text()]) {
-            context.uninstall(tail);
-            iD.behavior.Draw.usedTails[tail.text()] = true;
-        }
-
-        selection
-            .on('mousedown.draw', null)
-            .on('mousemove.draw', null);
-
-        d3.select(window)
-            .on('mouseup.draw', null);
-
-        d3.select(document)
-            .call(keybinding.off);
-    };
-
-    draw.tail = function(_) {
-        tail.text(_);
-        return draw;
-    };
-
-    return d3.rebind(draw, event, 'on');
-};
-
-iD.behavior.Draw.usedTails = {};
-iD.behavior.DrawWay = function(context, wayId, index, mode, baseGraph) {
-    var way = context.entity(wayId),
-        isArea = context.geometry(wayId) === 'area',
-        finished = false,
-        annotation = t((way.isDegenerate() ?
-            'operations.start.annotation.' :
-            'operations.continue.annotation.') + context.geometry(wayId)),
-        draw = iD.behavior.Draw(context);
-
-    var startIndex = typeof index === 'undefined' ? way.nodes.length - 1 : 0,
-        start = iD.Node({loc: context.graph().entity(way.nodes[startIndex]).loc}),
-        end = iD.Node({loc: context.map().mouseCoordinates()}),
-        segment = iD.Way({
-            nodes: typeof index === 'undefined' ? [start.id, end.id] : [end.id, start.id],
-            tags: _.clone(way.tags)
-        });
-
-    var f = context[way.isDegenerate() ? 'replace' : 'perform'];
-    if (isArea) {
-        f(iD.actions.AddEntity(end),
-            iD.actions.AddVertex(wayId, end.id, index));
-    } else {
-        f(iD.actions.AddEntity(start),
-            iD.actions.AddEntity(end),
-            iD.actions.AddEntity(segment));
-    }
-
-    function move(datum) {
-        var loc;
-
-        if (datum.type === 'node' && datum.id !== end.id) {
-            loc = datum.loc;
-        } else if (datum.type === 'way' && datum.id !== segment.id) {
-            loc = iD.geo.chooseEdge(context.childNodes(datum), context.mouse(), context.projection).loc;
-        } else {
-            loc = context.map().mouseCoordinates();
-        }
-
-        context.replace(iD.actions.MoveNode(end.id, loc));
-    }
-
-    function undone() {
-        finished = true;
-        context.enter(iD.modes.Browse(context));
-    }
-
-    function setActiveElements() {
-        var active = isArea ? [wayId, end.id] : [segment.id, start.id, end.id];
-        context.surface().selectAll(iD.util.entitySelector(active))
-            .classed('active', true);
-    }
-
-    var drawWay = function(surface) {
-        draw.on('move', move)
-            .on('click', drawWay.add)
-            .on('clickWay', drawWay.addWay)
-            .on('clickNode', drawWay.addNode)
-            .on('undo', context.undo)
-            .on('cancel', drawWay.cancel)
-            .on('finish', drawWay.finish);
-
-        context.map()
-            .dblclickEnable(false)
-            .on('drawn.draw', setActiveElements);
-
-        setActiveElements();
-
-        surface.call(draw);
-
-        context.history()
-            .on('undone.draw', undone);
-    };
-
-    drawWay.off = function(surface) {
-        if (!finished)
-            context.pop();
-
-        context.map()
-            .on('drawn.draw', null);
-
-        surface.call(draw.off)
-            .selectAll('.active')
-            .classed('active', false);
-
-        context.history()
-            .on('undone.draw', null);
-    };
-
-    function ReplaceTemporaryNode(newNode) {
-        return function(graph) {
-            if (isArea) {
-                return graph
-                    .replace(way.addNode(newNode.id, index))
-                    .remove(end);
-
-            } else {
-                return graph
-                    .replace(graph.entity(wayId).addNode(newNode.id, index))
-                    .remove(end)
-                    .remove(segment)
-                    .remove(start);
-            }
-        };
-    }
-
-    // Accept the current position of the temporary node and continue drawing.
-    drawWay.add = function(loc) {
-
-        // prevent duplicate nodes
-        var last = context.hasEntity(way.nodes[way.nodes.length - (isArea ? 2 : 1)]);
-        if (last && last.loc[0] === loc[0] && last.loc[1] === loc[1]) return;
-
-        var newNode = iD.Node({loc: loc});
-
-        context.replace(
-            iD.actions.AddEntity(newNode),
-            ReplaceTemporaryNode(newNode),
-            annotation);
-
-        finished = true;
-        context.enter(mode);
-    };
-
-    // Connect the way to an existing way.
-    drawWay.addWay = function(loc, edge) {
-        var previousEdge = startIndex ?
-            [way.nodes[startIndex], way.nodes[startIndex - 1]] :
-            [way.nodes[0], way.nodes[1]];
-
-        // Avoid creating duplicate segments
-        if (!isArea && iD.geo.edgeEqual(edge, previousEdge))
-            return;
-
-        var newNode = iD.Node({ loc: loc });
-
-        context.perform(
-            iD.actions.AddMidpoint({ loc: loc, edge: edge}, newNode),
-            ReplaceTemporaryNode(newNode),
-            annotation);
-
-        finished = true;
-        context.enter(mode);
-    };
-
-    // Connect the way to an existing node and continue drawing.
-    drawWay.addNode = function(node) {
-
-        // Avoid creating duplicate segments
-        if (way.areAdjacent(node.id, way.nodes[way.nodes.length - 1])) return;
-
-        context.perform(
-            ReplaceTemporaryNode(node),
-            annotation);
-
-        finished = true;
-        context.enter(mode);
-    };
-
-    // Finish the draw operation, removing the temporary node. If the way has enough
-    // nodes to be valid, it's selected. Otherwise, return to browse mode.
-    drawWay.finish = function() {
-        context.pop();
-        finished = true;
-
-        window.setTimeout(function() {
-            context.map().dblclickEnable(true);
-        }, 1000);
-
-        if (context.hasEntity(wayId)) {
-            context.enter(
-                iD.modes.Select(context, [wayId])
-                    .suppressMenu(true)
-                    .newFeature(true));
-        } else {
-            context.enter(iD.modes.Browse(context));
-        }
-    };
-
-    // Cancel the draw operation and return to browse, deleting everything drawn.
-    drawWay.cancel = function() {
-        context.perform(
-            d3.functor(baseGraph),
-            t('operations.cancel_draw.annotation'));
-
-        window.setTimeout(function() {
-            context.map().dblclickEnable(true);
-        }, 1000);
-
-        finished = true;
-        context.enter(iD.modes.Browse(context));
-    };
-
-    drawWay.tail = function(text) {
-        draw.tail(text);
-        return drawWay;
-    };
-
-    return drawWay;
-};
-iD.behavior.Edit = function(context) {
-    function edit() {
-        context.map()
-            .minzoom(16);
-    }
-
-    edit.off = function() {
-        context.map()
-            .minzoom(0);
-    };
-
-    return edit;
-};
-iD.behavior.Hash = function(context) {
-    var s0 = null, // cached location.hash
-        lat = 90 - 1e-8; // allowable latitude range
-
-    var parser = function(map, s) {
-        var q = iD.util.stringQs(s);
-        var args = (q.map || '').split('/').map(Number);
-        if (args.length < 3 || args.some(isNaN)) {
-            return true; // replace bogus hash
-        } else if (s !== formatter(map).slice(1)) {
-            map.centerZoom([args[1],
-                Math.min(lat, Math.max(-lat, args[2]))], args[0]);
-        }
-    };
-
-    var formatter = function(map) {
-        var mode = context.mode(),
-            center = map.center(),
-            zoom = map.zoom(),
-            precision = Math.max(0, Math.ceil(Math.log(zoom) / Math.LN2)),
-            q = _.omit(iD.util.stringQs(location.hash.substring(1)), 'comment'),
-            newParams = {};
-
-        if (mode && mode.id === 'browse') {
-            delete q.id;
-        } else {
-            var selected = context.selectedIDs().filter(function(id) {
-                return !context.entity(id).isNew();
-            });
-            if (selected.length) {
-                newParams.id = selected.join(',');
-            }
-        }
-
-        newParams.map = zoom.toFixed(2) +
-                '/' + center[0].toFixed(precision) +
-                '/' + center[1].toFixed(precision);
-
-        return '#' + iD.util.qsString(_.assign(q, newParams), true);
-    };
-
-    function update() {
-        var s1 = formatter(context.map());
-        if (s0 !== s1) location.replace(s0 = s1); // don't recenter the map!
-    }
-
-    var throttledUpdate = _.throttle(update, 500);
-
-    function hashchange() {
-        if (location.hash === s0) return; // ignore spurious hashchange events
-        if (parser(context.map(), (s0 = location.hash).substring(1))) {
-            update(); // replace bogus hash
-        }
-    }
-
-    function hash() {
-        context.map()
-            .on('move.hash', throttledUpdate);
-
-        context
-            .on('enter.hash', throttledUpdate);
-
-        d3.select(window)
-            .on('hashchange.hash', hashchange);
-
-        if (location.hash) {
-            var q = iD.util.stringQs(location.hash.substring(1));
-            if (q.id) context.loadEntity(q.id.split(',')[0], !q.map);
-            if (q.comment) context.storage('comment', q.comment);
-            hashchange();
-            if (q.map) hash.hadHash = true;
-        }
-    }
-
-    hash.off = function() {
-        context.map()
-            .on('move.hash', null);
-
-        context
-            .on('enter.hash', null);
-
-        d3.select(window)
-            .on('hashchange.hash', null);
-
-        location.hash = '';
-    };
-
-    return hash;
-};
-/*
-   The hover behavior adds the `.hover` class on mouseover to all elements to which
-   the identical datum is bound, and removes it on mouseout.
-
-   The :hover pseudo-class is insufficient for iD's purposes because a datum's visual
-   representation may consist of several elements scattered throughout the DOM hierarchy.
-   Only one of these elements can have the :hover pseudo-class, but all of them will
-   have the .hover class.
- */
-iD.behavior.Hover = function() {
-    var dispatch = d3.dispatch('hover'),
-        selection,
-        altDisables,
-        target;
-
-    function keydown() {
-        if (altDisables && d3.event.keyCode === d3.keybinding.modifierCodes.alt) {
-            dispatch.hover(null);
-            selection.selectAll('.hover')
-                .classed('hover-suppressed', true)
-                .classed('hover', false);
-        }
-    }
-
-    function keyup() {
-        if (altDisables && d3.event.keyCode === d3.keybinding.modifierCodes.alt) {
-            dispatch.hover(target ? target.id : null);
-            selection.selectAll('.hover-suppressed')
-                .classed('hover-suppressed', false)
-                .classed('hover', true);
-        }
-    }
-
-    var hover = function(__) {
-        selection = __;
-
-        function enter(d) {
-            if (d === target) return;
-
-            target = d;
-
-            selection.selectAll('.hover')
-                .classed('hover', false);
-            selection.selectAll('.hover-suppressed')
-                .classed('hover-suppressed', false);
-
-            if (target instanceof iD.Entity) {
-                var selector = '.' + target.id;
-
-                if (target.type === 'relation') {
-                    target.members.forEach(function(member) {
-                        selector += ', .' + member.id;
-                    });
-                }
-
-                var suppressed = altDisables && d3.event && d3.event.altKey;
-
-                selection.selectAll(selector)
-                    .classed(suppressed ? 'hover-suppressed' : 'hover', true);
-
-                dispatch.hover(target.id);
-            } else {
-                dispatch.hover(null);
-            }
-        }
-
-        var down;
-
-        function mouseover() {
-            if (down) return;
-            var target = d3.event.target;
-            enter(target ? target.__data__ : null);
-        }
-
-        function mouseout() {
-            if (down) return;
-            var target = d3.event.relatedTarget;
-            enter(target ? target.__data__ : null);
-        }
-
-        function mousedown() {
-            down = true;
-            d3.select(window)
-                .on('mouseup.hover', mouseup);
-        }
-
-        function mouseup() {
-            down = false;
-        }
-
-        selection
-            .on('mouseover.hover', mouseover)
-            .on('mouseout.hover', mouseout)
-            .on('mousedown.hover', mousedown)
-            .on('mouseup.hover', mouseup);
-
-        d3.select(window)
-            .on('keydown.hover', keydown)
-            .on('keyup.hover', keyup);
-    };
-
-    hover.off = function(selection) {
-        selection.selectAll('.hover')
-            .classed('hover', false);
-        selection.selectAll('.hover-suppressed')
-            .classed('hover-suppressed', false);
-
-        selection
-            .on('mouseover.hover', null)
-            .on('mouseout.hover', null)
-            .on('mousedown.hover', null)
-            .on('mouseup.hover', null);
-
-        d3.select(window)
-            .on('keydown.hover', null)
-            .on('keyup.hover', null)
-            .on('mouseup.hover', null);
-    };
-
-    hover.altDisables = function(_) {
-        if (!arguments.length) return altDisables;
-        altDisables = _;
-        return hover;
-    };
-
-    return d3.rebind(hover, dispatch, 'on');
-};
-iD.behavior.Lasso = function(context) {
-
-    var behavior = function(selection) {
-
-        var mouse = null,
-            lasso;
-
-        function mousedown() {
-            if (d3.event.shiftKey === true) {
-
-                mouse = context.mouse();
-                lasso = null;
-
-                selection
-                    .on('mousemove.lasso', mousemove)
-                    .on('mouseup.lasso', mouseup);
-
-                d3.event.stopPropagation();
-            }
-        }
-
-        function mousemove() {
-            if (!lasso) {
-                lasso = iD.ui.Lasso(context).a(mouse);
-                context.surface().call(lasso);
-            }
-
-            lasso.b(context.mouse());
-        }
-
-        function normalize(a, b) {
-            return [
-                [Math.min(a[0], b[0]), Math.min(a[1], b[1])],
-                [Math.max(a[0], b[0]), Math.max(a[1], b[1])]];
-        }
-
-        function mouseup() {
-
-            selection
-                .on('mousemove.lasso', null)
-                .on('mouseup.lasso', null);
-
-            if (!lasso) return;
-
-            var extent = iD.geo.Extent(
-                normalize(context.projection.invert(lasso.a()),
-                context.projection.invert(lasso.b())));
-
-            lasso.close();
-
-            var selected = context.intersects(extent).filter(function (entity) {
-                return entity.type === 'node';
-            });
-
-            if (selected.length) {
-                context.enter(iD.modes.Select(context, _.pluck(selected, 'id')));
-            }
-        }
-
-        selection
-            .on('mousedown.lasso', mousedown);
-    };
-
-    behavior.off = function(selection) {
-        selection.on('mousedown.lasso', null);
-    };
-
-    return behavior;
-};
-iD.behavior.Select = function(context) {
-    function keydown() {
-        if (d3.event && d3.event.shiftKey) {
-            context.surface()
-                .classed('behavior-multiselect', true);
-        }
-    }
-
-    function keyup() {
-        if (!d3.event || !d3.event.shiftKey) {
-            context.surface()
-                .classed('behavior-multiselect', false);
-        }
-    }
-
-    function click() {
-        var datum = d3.event.target.__data__;
-        var lasso = d3.select('#surface .lasso').node();
-        if (!(datum instanceof iD.Entity)) {
-            if (!d3.event.shiftKey && !lasso)
-                context.enter(iD.modes.Browse(context));
-
-        } else if (!d3.event.shiftKey && !lasso) {
-            // Avoid re-entering Select mode with same entity.
-            if (context.selectedIDs().length !== 1 || context.selectedIDs()[0] !== datum.id) {
-                context.enter(iD.modes.Select(context, [datum.id]));
-            } else {
-                context.mode().reselect();
-            }
-        } else if (context.selectedIDs().indexOf(datum.id) >= 0) {
-            var selectedIDs = _.without(context.selectedIDs(), datum.id);
-            context.enter(selectedIDs.length ?
-                iD.modes.Select(context, selectedIDs) :
-                iD.modes.Browse(context));
-
-        } else {
-            context.enter(iD.modes.Select(context, context.selectedIDs().concat([datum.id])));
-        }
-    }
-
-    var behavior = function(selection) {
-        d3.select(window)
-            .on('keydown.select', keydown)
-            .on('keyup.select', keyup);
-
-        selection.on('click.select', click);
-
-        keydown();
-    };
-
-    behavior.off = function(selection) {
-        d3.select(window)
-            .on('keydown.select', null)
-            .on('keyup.select', null);
-
-        selection.on('click.select', null);
-
-        keyup();
-    };
-
-    return behavior;
-};
-iD.behavior.Tail = function() {
-    var text,
-        container,
-        xmargin = 25,
-        tooltipSize = [0, 0],
-        selectionSize = [0, 0];
-
-    function tail(selection) {
-        if (!text) return;
-
-        d3.select(window)
-            .on('resize.tail', function() { selectionSize = selection.dimensions(); });
-
-        function show() {
-            container.style('display', 'block');
-            tooltipSize = container.dimensions();
-        }
-
-        function mousemove() {
-            if (container.style('display') === 'none') show();
-            var xoffset = ((d3.event.clientX + tooltipSize[0] + xmargin) > selectionSize[0]) ?
-                -tooltipSize[0] - xmargin : xmargin;
-            container.classed('left', xoffset > 0);
-            iD.util.setTransform(container, d3.event.clientX + xoffset, d3.event.clientY);
-        }
-
-        function mouseleave() {
-            if (d3.event.relatedTarget !== container.node()) {
-                container.style('display', 'none');
-            }
-        }
-
-        function mouseenter() {
-            if (d3.event.relatedTarget !== container.node()) {
-                show();
-            }
-        }
-
-        container = d3.select(document.body)
-            .append('div')
-            .style('display', 'none')
-            .attr('class', 'tail tooltip-inner');
-
-        container.append('div')
-            .text(text);
-
-        selection
-            .on('mousemove.tail', mousemove)
-            .on('mouseenter.tail', mouseenter)
-            .on('mouseleave.tail', mouseleave);
-
-        container
-            .on('mousemove.tail', mousemove);
-
-        tooltipSize = container.dimensions();
-        selectionSize = selection.dimensions();
-    }
-
-    tail.off = function(selection) {
-        if (!text) return;
-
-        container
-            .on('mousemove.tail', null)
-            .remove();
-
-        selection
-            .on('mousemove.tail', null)
-            .on('mouseenter.tail', null)
-            .on('mouseleave.tail', null);
-
-        d3.select(window)
-            .on('resize.tail', null);
-    };
-
-    tail.text = function(_) {
-        if (!arguments.length) return text;
-        text = _;
-        return tail;
-    };
-
-    return tail;
-};
-iD.modes = {};
-iD.modes.AddArea = function(context) {
-    var mode = {
-        id: 'add-area',
-        button: 'area',
-        title: t('modes.add_area.title'),
-        description: t('modes.add_area.description'),
-        key: '3'
-    };
-
-    var behavior = iD.behavior.AddWay(context)
-            .tail(t('modes.add_area.tail'))
-            .on('start', start)
-            .on('startFromWay', startFromWay)
-            .on('startFromNode', startFromNode),
-        defaultTags = {area: 'yes'};
-
-    function start(loc) {
-        var graph = context.graph(),
-            node = iD.Node({loc: loc}),
-            way = iD.Way({tags: defaultTags});
-
-        context.perform(
-            iD.actions.AddEntity(node),
-            iD.actions.AddEntity(way),
-            iD.actions.AddVertex(way.id, node.id),
-            iD.actions.AddVertex(way.id, node.id));
-
-        context.enter(iD.modes.DrawArea(context, way.id, graph));
-    }
-
-    function startFromWay(loc, edge) {
-        var graph = context.graph(),
-            node = iD.Node({loc: loc}),
-            way = iD.Way({tags: defaultTags});
-
-        context.perform(
-            iD.actions.AddEntity(node),
-            iD.actions.AddEntity(way),
-            iD.actions.AddVertex(way.id, node.id),
-            iD.actions.AddVertex(way.id, node.id),
-            iD.actions.AddMidpoint({ loc: loc, edge: edge }, node));
-
-        context.enter(iD.modes.DrawArea(context, way.id, graph));
-    }
-
-    function startFromNode(node) {
-        var graph = context.graph(),
-            way = iD.Way({tags: defaultTags});
-
-        context.perform(
-            iD.actions.AddEntity(way),
-            iD.actions.AddVertex(way.id, node.id),
-            iD.actions.AddVertex(way.id, node.id));
-
-        context.enter(iD.modes.DrawArea(context, way.id, graph));
-    }
-
-    mode.enter = function() {
-        context.install(behavior);
-    };
-
-    mode.exit = function() {
-        context.uninstall(behavior);
-    };
-
-    return mode;
-};
-iD.modes.AddLine = function(context) {
-    var mode = {
-        id: 'add-line',
-        button: 'line',
-        title: t('modes.add_line.title'),
-        description: t('modes.add_line.description'),
-        key: '2'
-    };
-
-    var behavior = iD.behavior.AddWay(context)
-        .tail(t('modes.add_line.tail'))
-        .on('start', start)
-        .on('startFromWay', startFromWay)
-        .on('startFromNode', startFromNode);
-
-    function start(loc) {
-        var graph = context.graph(),
-            node = iD.Node({loc: loc}),
-            way = iD.Way();
-
-        context.perform(
-            iD.actions.AddEntity(node),
-            iD.actions.AddEntity(way),
-            iD.actions.AddVertex(way.id, node.id));
-
-        context.enter(iD.modes.DrawLine(context, way.id, graph));
-    }
-
-    function startFromWay(loc, edge) {
-        var graph = context.graph(),
-            node = iD.Node({loc: loc}),
-            way = iD.Way();
-
-        context.perform(
-            iD.actions.AddEntity(node),
-            iD.actions.AddEntity(way),
-            iD.actions.AddVertex(way.id, node.id),
-            iD.actions.AddMidpoint({ loc: loc, edge: edge }, node));
-
-        context.enter(iD.modes.DrawLine(context, way.id, graph));
-    }
-
-    function startFromNode(node) {
-        var way = iD.Way();
-
-        context.perform(
-            iD.actions.AddEntity(way),
-            iD.actions.AddVertex(way.id, node.id));
-
-        context.enter(iD.modes.DrawLine(context, way.id, context.graph()));
-    }
-
-    mode.enter = function() {
-        context.install(behavior);
-    };
-
-    mode.exit = function() {
-        context.uninstall(behavior);
-    };
-
-    return mode;
-};
-iD.modes.AddPoint = function(context) {
-    var mode = {
-        id: 'add-point',
-        button: 'point',
-        title: t('modes.add_point.title'),
-        description: t('modes.add_point.description'),
-        key: '1'
-    };
-
-    var behavior = iD.behavior.Draw(context)
-        .tail(t('modes.add_point.tail'))
-        .on('click', add)
-        .on('clickWay', addWay)
-        .on('clickNode', addNode)
-        .on('cancel', cancel)
-        .on('finish', cancel);
-
-    function add(loc) {
-        var node = iD.Node({loc: loc});
-
-        context.perform(
-            iD.actions.AddEntity(node),
-            t('operations.add.annotation.point'));
-
-        context.enter(
-            iD.modes.Select(context, [node.id])
-                .suppressMenu(true)
-                .newFeature(true));
-    }
-
-    function addWay(loc) {
-        add(loc);
-    }
-
-    function addNode(node) {
-        add(node.loc);
-    }
-
-    function cancel() {
-        context.enter(iD.modes.Browse(context));
-    }
-
-    mode.enter = function() {
-        context.install(behavior);
-    };
-
-    mode.exit = function() {
-        context.uninstall(behavior);
-    };
-
-    return mode;
-};
-iD.modes.Browse = function(context) {
-    var mode = {
-        button: 'browse',
-        id: 'browse',
-        title: t('modes.browse.title'),
-        description: t('modes.browse.description')
-    }, sidebar;
-
-    var behaviors = [
-        iD.behavior.Hover(context)
-            .on('hover', context.ui().sidebar.hover),
-        iD.behavior.Select(context),
-        iD.behavior.Lasso(context),
-        iD.modes.DragNode(context).behavior];
-
-    mode.enter = function() {
-        behaviors.forEach(function(behavior) {
-            context.install(behavior);
-        });
-
-        // Get focus on the body.
-        if (document.activeElement && document.activeElement.blur) {
-            document.activeElement.blur();
-        }
-
-        if (sidebar) {
-            context.ui().sidebar.show(sidebar);
-        } else {
-            context.ui().sidebar.select(null);
-        }
-    };
-
-    mode.exit = function() {
-        behaviors.forEach(function(behavior) {
-            context.uninstall(behavior);
-        });
-
-        if (sidebar) {
-            context.ui().sidebar.hide(sidebar);
-        }
-    };
-
-    mode.sidebar = function(_) {
-        if (!arguments.length) return sidebar;
-        sidebar = _;
-        return mode;
-    };
-
-    return mode;
-};
-iD.modes.DragNode = function(context) {
-    var mode = {
-        id: 'drag-node',
-        button: 'browse'
-    };
-
-    var nudgeInterval,
-        activeIDs,
-        wasMidpoint,
-        cancelled,
-        selectedIDs = [],
-        hover = iD.behavior.Hover(context)
-            .altDisables(true)
-            .on('hover', context.ui().sidebar.hover),
-        edit = iD.behavior.Edit(context);
-
-    function edge(point, size) {
-        var pad = [30, 100, 30, 100];
-        if (point[0] > size[0] - pad[0]) return [-10, 0];
-        else if (point[0] < pad[2]) return [10, 0];
-        else if (point[1] > size[1] - pad[1]) return [0, -10];
-        else if (point[1] < pad[3]) return [0, 10];
-        return null;
-    }
-
-    function startNudge(nudge) {
-        if (nudgeInterval) window.clearInterval(nudgeInterval);
-        nudgeInterval = window.setInterval(function() {
-            context.pan(nudge);
-        }, 50);
-    }
-
-    function stopNudge() {
-        if (nudgeInterval) window.clearInterval(nudgeInterval);
-        nudgeInterval = null;
-    }
-
-    function moveAnnotation(entity) {
-        return t('operations.move.annotation.' + entity.geometry(context.graph()));
-    }
-
-    function connectAnnotation(entity) {
-        return t('operations.connect.annotation.' + entity.geometry(context.graph()));
-    }
-
-    function origin(entity) {
-        return context.projection(entity.loc);
-    }
-
-    function start(entity) {
-        cancelled = d3.event.sourceEvent.shiftKey;
-        if (cancelled) return behavior.cancel();
-
-        wasMidpoint = entity.type === 'midpoint';
-        if (wasMidpoint) {
-            var midpoint = entity;
-            entity = iD.Node();
-            context.perform(iD.actions.AddMidpoint(midpoint, entity));
-
-             var vertex = context.surface()
-                .selectAll('.' + entity.id);
-             behavior.target(vertex.node(), entity);
-
-        } else {
-            context.perform(
-                iD.actions.Noop());
-        }
-
-        activeIDs = _.pluck(context.graph().parentWays(entity), 'id');
-        activeIDs.push(entity.id);
-
-        context.enter(mode);
-    }
-
-    function datum() {
-        if (d3.event.sourceEvent.altKey) {
-            return {};
-        }
-
-        return d3.event.sourceEvent.target.__data__ || {};
-    }
-
-    // via https://gist.github.com/shawnbot/4166283
-    function childOf(p, c) {
-        if (p === c) return false;
-        while (c && c !== p) c = c.parentNode;
-        return c === p;
-    }
-
-    function move(entity) {
-        if (cancelled) return;
-        d3.event.sourceEvent.stopPropagation();
-
-        var nudge = childOf(context.container().node(),
-            d3.event.sourceEvent.toElement) &&
-            edge(d3.event.point, context.map().dimensions());
-
-        if (nudge) startNudge(nudge);
-        else stopNudge();
-
-        var loc = context.map().mouseCoordinates();
-
-        var d = datum();
-        if (d.type === 'node' && d.id !== entity.id) {
-            loc = d.loc;
-        } else if (d.type === 'way' && !d3.select(d3.event.sourceEvent.target).classed('fill')) {
-            loc = iD.geo.chooseEdge(context.childNodes(d), context.mouse(), context.projection).loc;
-        }
-
-        context.replace(
-            iD.actions.MoveNode(entity.id, loc),
-            moveAnnotation(entity));
-    }
-
-    function end(entity) {
-        if (cancelled) return;
-
-        var d = datum();
-
-        if (d.type === 'way') {
-            var choice = iD.geo.chooseEdge(context.childNodes(d), context.mouse(), context.projection);
-            context.replace(
-                iD.actions.AddMidpoint({ loc: choice.loc, edge: [d.nodes[choice.index - 1], d.nodes[choice.index]] }, entity),
-                connectAnnotation(d));
-
-        } else if (d.type === 'node' && d.id !== entity.id) {
-            context.replace(
-                iD.actions.Connect([d.id, entity.id]),
-                connectAnnotation(d));
-
-        } else if (wasMidpoint) {
-            context.replace(
-                iD.actions.Noop(),
-                t('operations.add.annotation.vertex'));
-
-        } else {
-            context.replace(
-                iD.actions.Noop(),
-                moveAnnotation(entity));
-        }
-
-        var reselection = selectedIDs.filter(function(id) {
-            return context.graph().hasEntity(id);
-        });
-
-        if (reselection.length) {
-            context.enter(
-                iD.modes.Select(context, reselection)
-                    .suppressMenu(true));
-        } else {
-            context.enter(iD.modes.Browse(context));
-        }
-    }
-
-    function cancel() {
-        behavior.cancel();
-        context.enter(iD.modes.Browse(context));
-    }
-
-    function setActiveElements() {
-        context.surface().selectAll(iD.util.entitySelector(activeIDs))
-            .classed('active', true);
-    }
-
-    var behavior = iD.behavior.drag()
-        .delegate('g.node, g.point, g.midpoint')
-        .surface(context.surface().node())
-        .origin(origin)
-        .on('start', start)
-        .on('move', move)
-        .on('end', end);
-
-    mode.enter = function() {
-        context.install(hover);
-        context.install(edit);
-
-        context.history()
-            .on('undone.drag-node', cancel);
-
-        context.map()
-            .on('drawn.drag-node', setActiveElements);
-
-        setActiveElements();
-    };
-
-    mode.exit = function() {
-        context.uninstall(hover);
-        context.uninstall(edit);
-
-        context.history()
-            .on('undone.drag-node', null);
-
-        context.map()
-            .on('drawn.drag-node', null);
-
-        context.surface()
-            .selectAll('.active')
-            .classed('active', false);
-
-        stopNudge();
-    };
-
-    mode.selectedIDs = function(_) {
-        if (!arguments.length) return selectedIDs;
-        selectedIDs = _;
-        return mode;
-    };
-
-    mode.behavior = behavior;
-
-    return mode;
-};
-iD.modes.DrawArea = function(context, wayId, baseGraph) {
-    var mode = {
-        button: 'area',
-        id: 'draw-area'
-    };
-
-    var behavior;
-
-    mode.enter = function() {
-        var way = context.entity(wayId),
-            headId = way.nodes[way.nodes.length - 2],
-            tailId = way.first();
-
-        behavior = iD.behavior.DrawWay(context, wayId, -1, mode, baseGraph)
-            .tail(t('modes.draw_area.tail'));
-
-        var addNode = behavior.addNode;
-
-        behavior.addNode = function(node) {
-            if (node.id === headId || node.id === tailId) {
-                behavior.finish();
-            } else {
-                addNode(node);
-            }
-        };
-
-        context.install(behavior);
-    };
-
-    mode.exit = function() {
-        context.uninstall(behavior);
-    };
-
-    mode.selectedIDs = function() {
-        return [wayId];
-    };
-
-    return mode;
-};
-iD.modes.DrawLine = function(context, wayId, baseGraph, affix) {
-    var mode = {
-        button: 'line',
-        id: 'draw-line'
-    };
-
-    var behavior;
-
-    mode.enter = function() {
-        var way = context.entity(wayId),
-            index = (affix === 'prefix') ? 0 : undefined,
-            headId = (affix === 'prefix') ? way.first() : way.last();
-
-        behavior = iD.behavior.DrawWay(context, wayId, index, mode, baseGraph)
-            .tail(t('modes.draw_line.tail'));
-
-        var addNode = behavior.addNode;
-
-        behavior.addNode = function(node) {
-            if (node.id === headId) {
-                behavior.finish();
-            } else {
-                addNode(node);
-            }
-        };
-
-        context.install(behavior);
-    };
-
-    mode.exit = function() {
-        context.uninstall(behavior);
-    };
-
-    mode.selectedIDs = function() {
-        return [wayId];
-    };
-
-    return mode;
-};
-iD.modes.Move = function(context, entityIDs) {
-    var mode = {
-        id: 'move',
-        button: 'browse'
-    };
-
-    var keybinding = d3.keybinding('move'),
-        edit = iD.behavior.Edit(context),
-        annotation = entityIDs.length === 1 ?
-            t('operations.move.annotation.' + context.geometry(entityIDs[0])) :
-            t('operations.move.annotation.multiple'),
-        origin,
-        nudgeInterval;
-
-    function edge(point, size) {
-        var pad = [30, 100, 30, 100];
-        if (point[0] > size[0] - pad[0]) return [-10, 0];
-        else if (point[0] < pad[2]) return [10, 0];
-        else if (point[1] > size[1] - pad[1]) return [0, -10];
-        else if (point[1] < pad[3]) return [0, 10];
-        return null;
-    }
-
-    function startNudge(nudge) {
-        if (nudgeInterval) window.clearInterval(nudgeInterval);
-        nudgeInterval = window.setInterval(function() {
-            context.pan(nudge);
-            context.replace(
-                iD.actions.Move(entityIDs, [-nudge[0], -nudge[1]], context.projection),
-                annotation);
-            var c = context.projection(origin);
-            origin = context.projection.invert([c[0] - nudge[0], c[1] - nudge[1]]);
-        }, 50);
-    }
-
-    function stopNudge() {
-        if (nudgeInterval) window.clearInterval(nudgeInterval);
-        nudgeInterval = null;
-    }
-
-    function move() {
-        var p = context.mouse();
-
-        var delta = origin ?
-            [p[0] - context.projection(origin)[0],
-                p[1] - context.projection(origin)[1]] :
-            [0, 0];
-
-        var nudge = edge(p, context.map().dimensions());
-        if (nudge) startNudge(nudge);
-        else stopNudge();
-
-        origin = context.map().mouseCoordinates();
-
-        context.replace(
-            iD.actions.Move(entityIDs, delta, context.projection),
-            annotation);
-    }
-
-    function finish() {
-        d3.event.stopPropagation();
-        context.enter(iD.modes.Select(context, entityIDs)
-            .suppressMenu(true));
-        stopNudge();
-    }
-
-    function cancel() {
-        context.pop();
-        context.enter(iD.modes.Select(context, entityIDs)
-            .suppressMenu(true));
-        stopNudge();
-    }
-
-    function undone() {
-        context.enter(iD.modes.Browse(context));
-    }
-
-    mode.enter = function() {
-        context.install(edit);
-
-        context.perform(
-            iD.actions.Noop(),
-            annotation);
-
-        context.surface()
-            .on('mousemove.move', move)
-            .on('click.move', finish);
-
-        context.history()
-            .on('undone.move', undone);
-
-        keybinding
-            .on('⎋', cancel)
-            .on('↩', finish);
-
-        d3.select(document)
-            .call(keybinding);
-    };
-
-    mode.exit = function() {
-        stopNudge();
-
-        context.uninstall(edit);
-
-        context.surface()
-            .on('mousemove.move', null)
-            .on('click.move', null);
-
-        context.history()
-            .on('undone.move', null);
-
-        keybinding.off();
-    };
-
-    return mode;
-};
-iD.modes.RotateWay = function(context, wayId) {
-    var mode = {
-        id: 'rotate-way',
-        button: 'browse'
-    };
-
-    var keybinding = d3.keybinding('rotate-way'),
-        edit = iD.behavior.Edit(context);
-
-    mode.enter = function() {
-        context.install(edit);
-
-        var annotation = t('operations.rotate.annotation.' + context.geometry(wayId)),
-            way = context.graph().entity(wayId),
-            nodes = _.uniq(context.graph().childNodes(way)),
-            points = nodes.map(function(n) { return context.projection(n.loc); }),
-            pivot = d3.geom.polygon(points).centroid(),
-            angle;
-
-        context.perform(
-            iD.actions.Noop(),
-            annotation);
-
-        function rotate() {
-
-            var mousePoint = context.mouse(),
-                newAngle = Math.atan2(mousePoint[1] - pivot[1], mousePoint[0] - pivot[0]);
-
-            if (typeof angle === 'undefined') angle = newAngle;
-
-            context.replace(
-                iD.actions.RotateWay(wayId, pivot, newAngle - angle, context.projection),
-                annotation);
-
-            angle = newAngle;
-        }
-
-        function finish() {
-            d3.event.stopPropagation();
-            context.enter(iD.modes.Select(context, [wayId])
-                .suppressMenu(true));
-        }
-
-        function cancel() {
-            context.pop();
-            context.enter(iD.modes.Select(context, [wayId])
-                .suppressMenu(true));
-        }
-
-        function undone() {
-            context.enter(iD.modes.Browse(context));
-        }
-
-        context.surface()
-            .on('mousemove.rotate-way', rotate)
-            .on('click.rotate-way', finish);
-
-        context.history()
-            .on('undone.rotate-way', undone);
-
-        keybinding
-            .on('⎋', cancel)
-            .on('↩', finish);
-
-        d3.select(document)
-            .call(keybinding);
-    };
-
-    mode.exit = function() {
-        context.uninstall(edit);
-
-        context.surface()
-            .on('mousemove.rotate-way', null)
-            .on('click.rotate-way', null);
-
-        context.history()
-            .on('undone.rotate-way', null);
-
-        keybinding.off();
-    };
-
-    return mode;
-};
-iD.modes.Save = function(context) {
-    var ui = iD.ui.Commit(context)
-        .on('cancel', cancel)
-        .on('save', save);
-
-    function cancel() {
-        context.enter(iD.modes.Browse(context));
-    }
-
-    function save(e) {
-        var loading = iD.ui.Loading(context)
-            .message(t('save.uploading'))
-            .blocking(true);
-
-        context.container()
-            .call(loading);
-
-        context.connection().putChangeset(
-            context.history().changes(iD.actions.DiscardTags(context.history().difference())),
-            e.comment,
-            context.history().imageryUsed(),
-            function(err, changeset_id) {
-                loading.close();
-                if (err) {
-                    var confirm = iD.ui.confirm(context.container());
-                    confirm
-                        .select('.modal-section.header')
-                        .append('h3')
-                        .text(t('save.error'));
-                    confirm
-                        .select('.modal-section.message-text')
-                        .append('p')
-                        .text(err.responseText || t('save.unknown_error_details'));
-                } else {
-                    context.flush();
-                    success(e, changeset_id);
-                }
-            });
-    }
-
-    function success(e, changeset_id) {
-        context.enter(iD.modes.Browse(context)
-            .sidebar(iD.ui.Success(context)
-                .changeset({
-                    id: changeset_id,
-                    comment: e.comment
-                })
-                .on('cancel', function(ui) {
-                    context.ui().sidebar.hide(ui);
-                })));
-    }
-
-    var mode = {
-        id: 'save'
-    };
-
-    var behaviors = [
-        iD.behavior.Hover(context),
-        iD.behavior.Select(context),
-        iD.behavior.Lasso(context),
-        iD.modes.DragNode(context).behavior];
-
-    mode.enter = function() {
-        behaviors.forEach(function(behavior) {
-            context.install(behavior);
-        });
-
-        context.connection().authenticate(function() {
-            context.ui().sidebar.show(ui);
-        });
-    };
-
-    mode.exit = function() {
-        behaviors.forEach(function(behavior) {
-            context.uninstall(behavior);
-        });
-
-        context.ui().sidebar.hide(ui);
-    };
-
-    return mode;
-};
-iD.modes.Select = function(context, selectedIDs) {
-    var mode = {
-        id: 'select',
-        button: 'browse'
-    };
-
-    var keybinding = d3.keybinding('select'),
-        timeout = null,
-        behaviors = [
-            iD.behavior.Hover(context),
-            iD.behavior.Select(context),
-            iD.behavior.Lasso(context),
-            iD.modes.DragNode(context)
-                .selectedIDs(selectedIDs)
-                .behavior],
-        inspector,
-        radialMenu,
-        newFeature = false,
-        suppressMenu = false;
-
-    var wrap = context.container()
-        .select('.inspector-wrap');
-
-    function singular() {
-        if (selectedIDs.length === 1) {
-            return context.entity(selectedIDs[0]);
-        }
-    }
-
-    function positionMenu() {
-        var entity = singular();
-
-        if (entity && entity.type === 'node') {
-            radialMenu.center(context.projection(entity.loc));
-        } else {
-            radialMenu.center(context.mouse());
-        }
-    }
-
-    function showMenu() {
-        context.surface()
-            .call(radialMenu.close)
-            .call(radialMenu);
-    }
-
-    mode.selectedIDs = function() {
-        return selectedIDs;
-    };
-
-    mode.reselect = function() {
-        var surfaceNode = context.surface().node();
-        if (surfaceNode.focus) { // FF doesn't support it
-            surfaceNode.focus();
-        }
-
-        positionMenu();
-        showMenu();
-    };
-
-    mode.newFeature = function(_) {
-        if (!arguments.length) return newFeature;
-        newFeature = _;
-        return mode;
-    };
-
-    mode.suppressMenu = function(_) {
-        if (!arguments.length) return suppressMenu;
-        suppressMenu = _;
-        return mode;
-    };
-
-    mode.enter = function() {
-        behaviors.forEach(function(behavior) {
-            context.install(behavior);
-        });
-
-        var operations = _.without(d3.values(iD.operations), iD.operations.Delete)
-            .map(function(o) { return o(selectedIDs, context); })
-            .filter(function(o) { return o.available(); });
-        operations.unshift(iD.operations.Delete(selectedIDs, context));
-
-        keybinding.on('⎋', function() {
-            context.enter(iD.modes.Browse(context));
-        }, true);
-
-        operations.forEach(function(operation) {
-            operation.keys.forEach(function(key) {
-                keybinding.on(key, function() {
-                    if (!operation.disabled()) {
-                        operation();
-                    }
-                });
-            });
-        });
-
-        context.ui().sidebar
-            .select(singular() ? singular().id : null, newFeature);
-
-        context.history()
-            .on('undone.select', update)
-            .on('redone.select', update);
-
-        function update() {
-            context.surface().call(radialMenu.close);
-
-            if (_.any(selectedIDs, function(id) { return !context.hasEntity(id); })) {
-                // Exit mode if selected entity gets undone
-                context.enter(iD.modes.Browse(context));
-            }
-        }
-
-        context.map().on('move.select', function() {
-            context.surface().call(radialMenu.close);
-        });
-
-        function dblclick() {
-            var target = d3.select(d3.event.target),
-                datum = target.datum();
-
-            if (datum instanceof iD.Way && !target.classed('fill')) {
-                var choice = iD.geo.chooseEdge(context.childNodes(datum), context.mouse(), context.projection),
-                    node = iD.Node();
-
-                var prev = datum.nodes[choice.index - 1],
-                    next = datum.nodes[choice.index];
-
-                context.perform(
-                    iD.actions.AddMidpoint({loc: choice.loc, edge: [prev, next]}, node),
-                    t('operations.add.annotation.vertex'));
-
-                d3.event.preventDefault();
-                d3.event.stopPropagation();
-            }
-        }
-
-        d3.select(document)
-            .call(keybinding);
-
-        function selectElements() {
-            context.surface()
-                .selectAll(iD.util.entityOrMemberSelector(selectedIDs, context.graph()))
-                .classed('selected', true);
-        }
-
-        context.map().on('drawn.select', selectElements);
-        selectElements();
-
-        radialMenu = iD.ui.RadialMenu(context, operations);
-        var show = d3.event && !suppressMenu;
-
-        if (show) {
-            positionMenu();
-        }
-
-        timeout = window.setTimeout(function() {
-            if (show) {
-                showMenu();
-            }
-
-            context.surface()
-                .on('dblclick.select', dblclick);
-        }, 200);
-
-        if (selectedIDs.length > 1) {
-            var entities = iD.ui.SelectionList(context, selectedIDs);
-            context.ui().sidebar.show(entities);
-        }
-    };
-
-    mode.exit = function() {
-        if (timeout) window.clearTimeout(timeout);
-
-        if (inspector) wrap.call(inspector.close);
-
-        behaviors.forEach(function(behavior) {
-            context.uninstall(behavior);
-        });
-
-        keybinding.off();
-
-        context.history()
-            .on('undone.select', null)
-            .on('redone.select', null);
-
-        context.surface()
-            .call(radialMenu.close)
-            .on('dblclick.select', null)
-            .selectAll('.selected')
-            .classed('selected', false);
-
-        context.map().on('drawn.select', null);
-        context.ui().sidebar.hide();
-    };
-
-    return mode;
-};
-iD.operations = {};
-iD.operations.Circularize = function(selectedIDs, context) {
-    var entityId = selectedIDs[0],
-        entity = context.entity(entityId),
-        extent = entity.extent(context.graph()),
-        geometry = context.geometry(entityId),
-        action = iD.actions.Circularize(entityId, context.projection);
-
-    var operation = function() {
-        var annotation = t('operations.circularize.annotation.' + geometry);
-        context.perform(action, annotation);
-    };
-
-    operation.available = function() {
-        return selectedIDs.length === 1 &&
-            entity.type === 'way' &&
-            _.uniq(entity.nodes).length > 1;
-    };
-
-    operation.disabled = function() {
-        var reason;
-        if (extent.percentContainedIn(context.extent()) < 0.8) {
-            reason = 'too_large';
-        }
-        return action.disabled(context.graph()) || reason;
-    };
-
-    operation.tooltip = function() {
-        var disable = operation.disabled();
-        return disable ?
-            t('operations.circularize.' + disable) :
-            t('operations.circularize.description.' + geometry);
-    };
-
-    operation.id = 'circularize';
-    operation.keys = [t('operations.circularize.key')];
-    operation.title = t('operations.circularize.title');
-
-    return operation;
-};
-iD.operations.Continue = function(selectedIDs, context) {
-    var graph = context.graph(),
-        entities = selectedIDs.map(function(id) { return graph.entity(id); }),
-        geometries = _.extend({line: [], vertex: []},
-            _.groupBy(entities, function(entity) { return entity.geometry(graph); })),
-        vertex = geometries.vertex[0];
-
-    function candidateWays() {
-        return graph.parentWays(vertex).filter(function(parent) {
-            return parent.geometry(graph) === 'line' &&
-                parent.affix(vertex.id) &&
-                (geometries.line.length === 0 || geometries.line[0] === parent);
-        });
-    }
-
-    var operation = function() {
-        var candidate = candidateWays()[0];
-        context.enter(iD.modes.DrawLine(
-            context,
-            candidate.id,
-            context.graph(),
-            candidate.affix(vertex.id)));
-    };
-
-    operation.available = function() {
-        return geometries.vertex.length === 1 && geometries.line.length <= 1;
-    };
-
-    operation.disabled = function() {
-        var candidates = candidateWays();
-        if (candidates.length === 0)
-            return 'not_eligible';
-        if (candidates.length > 1)
-            return 'multiple';
-    };
-
-    operation.tooltip = function() {
-        var disable = operation.disabled();
-        return disable ?
-            t('operations.continue.' + disable) :
-            t('operations.continue.description');
-    };
-
-    operation.id = 'continue';
-    operation.keys = [t('operations.continue.key')];
-    operation.title = t('operations.continue.title');
-
-    return operation;
-};
-iD.operations.Delete = function(selectedIDs, context) {
-    var action = iD.actions.DeleteMultiple(selectedIDs);
-
-    var operation = function() {
-        var annotation,
-            nextSelectedID;
-
-        if (selectedIDs.length > 1) {
-            annotation = t('operations.delete.annotation.multiple', {n: selectedIDs.length});
-
-        } else {
-            var id = selectedIDs[0],
-                entity = context.entity(id),
-                geometry = context.geometry(id),
-                parents = context.graph().parentWays(entity),
-                parent = parents[0];
-
-            annotation = t('operations.delete.annotation.' + geometry);
-
-            // Select the next closest node in the way.
-            if (geometry === 'vertex' && parents.length === 1 && parent.nodes.length > 2) {
-                var nodes = parent.nodes,
-                    i = nodes.indexOf(id);
-
-                if (i === 0) {
-                    i++;
-                } else if (i === nodes.length - 1) {
-                    i--;
-                } else {
-                    var a = iD.geo.sphericalDistance(entity.loc, context.entity(nodes[i - 1]).loc),
-                        b = iD.geo.sphericalDistance(entity.loc, context.entity(nodes[i + 1]).loc);
-                    i = a < b ? i - 1 : i + 1;
-                }
-
-                nextSelectedID = nodes[i];
-            }
-        }
-
-        if (nextSelectedID && context.hasEntity(nextSelectedID)) {
-            context.enter(iD.modes.Select(context, [nextSelectedID]));
-        } else {
-            context.enter(iD.modes.Browse(context));
-        }
-
-        context.perform(
-            action,
-            annotation);
-    };
-
-    operation.available = function() {
-        return true;
-    };
-
-    operation.disabled = function() {
-        return action.disabled(context.graph());
-    };
-
-    operation.tooltip = function() {
-        var disable = operation.disabled();
-        return disable ?
-            t('operations.delete.' + disable) :
-            t('operations.delete.description');
-    };
-
-    operation.id = 'delete';
-    operation.keys = [iD.ui.cmd('⌘⌫'), iD.ui.cmd('⌘⌦')];
-    operation.title = t('operations.delete.title');
-
-    return operation;
-};
-iD.operations.Disconnect = function(selectedIDs, context) {
-    var vertices = _.filter(selectedIDs, function vertex(entityId) {
-        return context.geometry(entityId) === 'vertex';
-    });
-
-    var entityId = vertices[0],
-        action = iD.actions.Disconnect(entityId);
-
-    if (selectedIDs.length > 1) {
-        action.limitWays(_.without(selectedIDs, entityId));
-    }
-
-    var operation = function() {
-        context.perform(action, t('operations.disconnect.annotation'));
-    };
-
-    operation.available = function() {
-        return vertices.length === 1;
-    };
-
-    operation.disabled = function() {
-        return action.disabled(context.graph());
-    };
-
-    operation.tooltip = function() {
-        var disable = operation.disabled();
-        return disable ?
-            t('operations.disconnect.' + disable) :
-            t('operations.disconnect.description');
-    };
-
-    operation.id = 'disconnect';
-    operation.keys = [t('operations.disconnect.key')];
-    operation.title = t('operations.disconnect.title');
-
-    return operation;
-};
-iD.operations.Merge = function(selectedIDs, context) {
-    var join = iD.actions.Join(selectedIDs),
-        merge = iD.actions.Merge(selectedIDs),
-        mergePolygon = iD.actions.MergePolygon(selectedIDs);
-
-    var operation = function() {
-        var annotation = t('operations.merge.annotation', {n: selectedIDs.length}),
-            action;
-
-        if (!join.disabled(context.graph())) {
-            action = join;
-        } else if (!merge.disabled(context.graph())) {
-            action = merge;
-        } else {
-            action = mergePolygon;
-        }
-
-        context.perform(action, annotation);
-        context.enter(iD.modes.Select(context, selectedIDs.filter(function(id) { return context.hasEntity(id); }))
-            .suppressMenu(true));
-    };
-
-    operation.available = function() {
-        return selectedIDs.length >= 2;
-    };
-
-    operation.disabled = function() {
-        return join.disabled(context.graph()) &&
-            merge.disabled(context.graph()) &&
-            mergePolygon.disabled(context.graph());
-    };
-
-    operation.tooltip = function() {
-        var j = join.disabled(context.graph()),
-            m = merge.disabled(context.graph()),
-            p = mergePolygon.disabled(context.graph());
-
-        if (j === 'restriction' && m && p)
-            return t('operations.merge.restriction', {relation: context.presets().item('type/restriction').name()});
-
-        if (p === 'incomplete_relation' && j && m)
-            return t('operations.merge.incomplete_relation');
-
-        if (j && m && p)
-            return t('operations.merge.' + j);
-
-        return t('operations.merge.description');
-    };
-
-    operation.id = 'merge';
-    operation.keys = [t('operations.merge.key')];
-    operation.title = t('operations.merge.title');
-
-    return operation;
-};
-iD.operations.Move = function(selectedIDs, context) {
-    var extent = selectedIDs.reduce(function(extent, id) {
-            return extent.extend(context.entity(id).extent(context.graph()));
-        }, iD.geo.Extent());
-
-    var operation = function() {
-        context.enter(iD.modes.Move(context, selectedIDs));
-    };
-
-    operation.available = function() {
-        return selectedIDs.length > 1 ||
-            context.entity(selectedIDs[0]).type !== 'node';
-    };
-
-    operation.disabled = function() {
-        var reason;
-        if (extent.area() && extent.percentContainedIn(context.extent()) < 0.8) {
-            reason = 'too_large';
-        }
-        return iD.actions.Move(selectedIDs).disabled(context.graph()) || reason;
-    };
-
-    operation.tooltip = function() {
-        var disable = operation.disabled();
-        return disable ?
-            t('operations.move.' + disable) :
-            t('operations.move.description');
-    };
-
-    operation.id = 'move';
-    operation.keys = [t('operations.move.key')];
-    operation.title = t('operations.move.title');
-
-    return operation;
-};
-iD.operations.Orthogonalize = function(selectedIDs, context) {
-    var entityId = selectedIDs[0],
-        entity = context.entity(entityId),
-        extent = entity.extent(context.graph()),
-        geometry = context.geometry(entityId),
-        action = iD.actions.Orthogonalize(entityId, context.projection);
-
-    var operation = function() {
-        var annotation = t('operations.orthogonalize.annotation.' + geometry);
-        context.perform(action, annotation);
-    };
-
-    operation.available = function() {
-        return selectedIDs.length === 1 &&
-            entity.type === 'way' &&
-            entity.isClosed() &&
-            _.uniq(entity.nodes).length > 2;
-    };
-
-    operation.disabled = function() {
-        var reason;
-        if (extent.percentContainedIn(context.extent()) < 0.8) {
-            reason = 'too_large';
-        }
-        return action.disabled(context.graph()) || reason;
-    };
-
-    operation.tooltip = function() {
-        var disable = operation.disabled();
-        return disable ?
-            t('operations.orthogonalize.' + disable) :
-            t('operations.orthogonalize.description.' + geometry);
-    };
-
-    operation.id = 'orthogonalize';
-    operation.keys = [t('operations.orthogonalize.key')];
-    operation.title = t('operations.orthogonalize.title');
-
-    return operation;
-};
-iD.operations.Reverse = function(selectedIDs, context) {
-    var entityId = selectedIDs[0];
-
-    var operation = function() {
-        context.perform(
-            iD.actions.Reverse(entityId),
-            t('operations.reverse.annotation'));
-    };
-
-    operation.available = function() {
-        return selectedIDs.length === 1 &&
-            context.geometry(entityId) === 'line';
-    };
-
-    operation.disabled = function() {
-        return false;
-    };
-
-    operation.tooltip = function() {
-        return t('operations.reverse.description');
-    };
-
-    operation.id = 'reverse';
-    operation.keys = [t('operations.reverse.key')];
-    operation.title = t('operations.reverse.title');
-
-    return operation;
-};
-iD.operations.Rotate = function(selectedIDs, context) {
-    var entityId = selectedIDs[0],
-        entity = context.entity(entityId),
-        extent = entity.extent(context.graph()),
-        geometry = context.geometry(entityId);
-
-    var operation = function() {
-        context.enter(iD.modes.RotateWay(context, entityId));
-    };
-
-    operation.available = function() {
-        if (selectedIDs.length !== 1 || entity.type !== 'way')
-            return false;
-        if (geometry === 'area')
-            return true;
-        if (entity.isClosed() &&
-            context.graph().parentRelations(entity).some(function(r) { return r.isMultipolygon(); }))
-            return true;
-        return false;
-    };
-
-    operation.disabled = function() {
-        if (extent.percentContainedIn(context.extent()) < 0.8) {
-            return 'too_large';
-        } else {
-            return false;
-        }
-    };
-
-    operation.tooltip = function() {
-        var disable = operation.disabled();
-        return disable ?
-            t('operations.rotate.' + disable) :
-            t('operations.rotate.description');
-    };
-
-    operation.id = 'rotate';
-    operation.keys = [t('operations.rotate.key')];
-    operation.title = t('operations.rotate.title');
-
-    return operation;
-};
-iD.operations.Split = function(selectedIDs, context) {
-    var vertices = _.filter(selectedIDs, function vertex(entityId) {
-        return context.geometry(entityId) === 'vertex';
-    });
-
-    var entityId = vertices[0],
-        action = iD.actions.Split(entityId);
-
-    if (selectedIDs.length > 1) {
-        action.limitWays(_.without(selectedIDs, entityId));
-    }
-
-    var operation = function() {
-        var annotation;
-
-        var ways = action.ways(context.graph());
-        if (ways.length === 1) {
-            annotation = t('operations.split.annotation.' + context.geometry(ways[0].id));
-        } else {
-            annotation = t('operations.split.annotation.multiple', {n: ways.length});
-        }
-
-        var difference = context.perform(action, annotation);
-        context.enter(iD.modes.Select(context, difference.extantIDs()));
-    };
-
-    operation.available = function() {
-        return vertices.length === 1;
-    };
-
-    operation.disabled = function() {
-        return action.disabled(context.graph());
-    };
-
-    operation.tooltip = function() {
-        var disable = operation.disabled();
-        if (disable) {
-            return t('operations.split.' + disable);
-        }
-
-        var ways = action.ways(context.graph());
-        if (ways.length === 1) {
-            return t('operations.split.description.' + context.geometry(ways[0].id));
-        } else {
-            return t('operations.split.description.multiple');
-        }
-    };
-
-    operation.id = 'split';
-    operation.keys = [t('operations.split.key')];
-    operation.title = t('operations.split.title');
-
-    return operation;
-};
-iD.operations.Straighten = function(selectedIDs, context) {
-    var entityId = selectedIDs[0],
-        action = iD.actions.Straighten(entityId, context.projection);
-
-    function operation() {
-        var annotation = t('operations.straighten.annotation');
-        context.perform(action, annotation);
-    }
-
-    operation.available = function() {
-        var entity = context.entity(entityId);
-        return selectedIDs.length === 1 &&
-            entity.type === 'way' &&
-            !entity.isClosed() &&
-            _.uniq(entity.nodes).length > 2;
-    };
-
-    operation.disabled = function() {
-        return action.disabled(context.graph());
-    };
-
-    operation.tooltip = function() {
-        var disable = operation.disabled();
-        return disable ?
-            t('operations.straighten.' + disable) :
-            t('operations.straighten.description');
-    };
-
-    operation.id = 'straighten';
-    operation.keys = [t('operations.straighten.key')];
-    operation.title = t('operations.straighten.title');
-
-    return operation;
-};
-/* jshint -W109 */
-iD.areaKeys = {
-    "aeroway": {
-        "gate": true,
-        "taxiway": true
-    },
-    "amenity": {
-        "atm": true,
-        "bbq": true,
-        "bench": true,
-        "bureau_de_change": true,
-        "clock": true,
-        "drinking_water": true,
-        "parking_entrance": true,
-        "post_box": true,
-        "telephone": true,
-        "vending_machine": true,
-        "waste_basket": true
-    },
-    "area": {},
-    "barrier": {
-        "block": true,
-        "bollard": true,
-        "cattle_grid": true,
-        "cycle_barrier": true,
-        "entrance": true,
-        "fence": true,
-        "gate": true,
-        "kissing_gate": true,
-        "lift_gate": true,
-        "stile": true,
-        "toll_booth": true
-    },
-    "building": {
-        "entrance": true
-    },
-    "craft": {},
-    "emergency": {
-        "fire_hydrant": true,
-        "phone": true
-    },
-    "golf": {
-        "hole": true
-    },
-    "historic": {
-        "boundary_stone": true
-    },
-    "landuse": {},
-    "leisure": {
-        "picnic_table": true,
-        "track": true,
-        "slipway": true
-    },
-    "man_made": {
-        "cutline": true,
-        "embankment": true,
-        "flagpole": true,
-        "pipeline": true,
-        "survey_point": true
-    },
-    "military": {},
-    "natural": {
-        "coastline": true,
-        "peak": true,
-        "spring": true,
-        "tree": true
-    },
-    "office": {},
-    "piste:type": {},
-    "place": {},
-    "power": {
-        "line": true,
-        "minor_line": true,
-        "pole": true,
-        "tower": true
-    },
-    "public_transport": {
-        "stop_position": true
-    },
-    "shop": {},
-    "tourism": {
-        "viewpoint": true
-    },
-    "waterway": {
-        "canal": true,
-        "ditch": true,
-        "drain": true,
-        "river": true,
-        "stream": true,
-        "weir": true
-    }
-};iD.Connection = function() {
-
-    var event = d3.dispatch('authenticating', 'authenticated', 'auth', 'loading', 'load', 'loaded'),
-        url = 'http://www.openstreetmap.org',
-        connection = {},
-        inflight = {},
-        loadedTiles = {},
-        tileZoom = 16,
-        oauth = osmAuth({
-            url: 'http://www.openstreetmap.org',
-            oauth_consumer_key: '5A043yRSEugj4DJ5TljuapfnrflWDte8jTOcWLlT',
-            oauth_secret: 'aB3jKq1TRsCOUrfOIZ6oQMEDmv2ptV76PA54NGLL',
-            loading: authenticating,
-            done: authenticated
-        }),
-        ndStr = 'nd',
-        tagStr = 'tag',
-        memberStr = 'member',
-        nodeStr = 'node',
-        wayStr = 'way',
-        relationStr = 'relation',
-        off;
-
-    connection.changesetURL = function(changesetId) {
-        return url + '/changeset/' + changesetId;
-    };
-
-    connection.changesetsURL = function(center, zoom) {
-        var precision = Math.max(0, Math.ceil(Math.log(zoom) / Math.LN2));
-        return url + '/history#map=' +
-            Math.floor(zoom) + '/' +
-            center[1].toFixed(precision) + '/' +
-            center[0].toFixed(precision);
-    };
-
-    connection.entityURL = function(entity) {
-        return url + '/' + entity.type + '/' + entity.osmId();
-    };
-
-    connection.userURL = function(username) {
-        return url + '/user/' + username;
-    };
-
-    connection.loadFromURL = function(url, callback) {
-        function done(dom) {
-            return callback(null, parse(dom));
-        }
-        return d3.xml(url).get().on('load', done);
-    };
-
-    connection.loadEntity = function(id, callback) {
-        var type = iD.Entity.id.type(id),
-            osmID = iD.Entity.id.toOSM(id);
-
-        connection.loadFromURL(
-            url + '/api/0.6/' + type + '/' + osmID + (type !== 'node' ? '/full' : ''),
-            function(err, entities) {
-                event.load(err, {data: entities});
-                if (callback) callback(err, entities && _.find(entities, function(e) { return e.id === id; }));
-            });
-    };
-
-    function authenticating() {
-        event.authenticating();
-    }
-
-    function authenticated() {
-        event.authenticated();
-    }
-
-    function getNodes(obj) {
-        var elems = obj.getElementsByTagName(ndStr),
-            nodes = new Array(elems.length);
-        for (var i = 0, l = elems.length; i < l; i++) {
-            nodes[i] = 'n' + elems[i].attributes.ref.value;
-        }
-        return nodes;
-    }
-
-    function getTags(obj) {
-        var elems = obj.getElementsByTagName(tagStr),
-            tags = {};
-        for (var i = 0, l = elems.length; i < l; i++) {
-            var attrs = elems[i].attributes;
-            tags[attrs.k.value] = attrs.v.value;
-        }
-        return tags;
-    }
-
-    function getMembers(obj) {
-        var elems = obj.getElementsByTagName(memberStr),
-            members = new Array(elems.length);
-        for (var i = 0, l = elems.length; i < l; i++) {
-            var attrs = elems[i].attributes;
-            members[i] = {
-                id: attrs.type.value[0] + attrs.ref.value,
-                type: attrs.type.value,
-                role: attrs.role.value
-            };
-        }
-        return members;
-    }
-
-    var parsers = {
-        node: function nodeData(obj) {
-            var attrs = obj.attributes;
-            return new iD.Node({
-                id: iD.Entity.id.fromOSM(nodeStr, attrs.id.value),
-                loc: [parseFloat(attrs.lon.value), parseFloat(attrs.lat.value)],
-                version: attrs.version.value,
-                user: attrs.user && attrs.user.value,
-                tags: getTags(obj)
-            });
-        },
-
-        way: function wayData(obj) {
-            var attrs = obj.attributes;
-            return new iD.Way({
-                id: iD.Entity.id.fromOSM(wayStr, attrs.id.value),
-                version: attrs.version.value,
-                user: attrs.user && attrs.user.value,
-                tags: getTags(obj),
-                nodes: getNodes(obj)
-            });
-        },
-
-        relation: function relationData(obj) {
-            var attrs = obj.attributes;
-            return new iD.Relation({
-                id: iD.Entity.id.fromOSM(relationStr, attrs.id.value),
-                version: attrs.version.value,
-                user: attrs.user && attrs.user.value,
-                tags: getTags(obj),
-                members: getMembers(obj)
-            });
-        }
-    };
-
-    function parse(dom) {
-        if (!dom || !dom.childNodes) return new Error('Bad request');
-
-        var root = dom.childNodes[0],
-            children = root.childNodes,
-            entities = [];
-
-        for (var i = 0, l = children.length; i < l; i++) {
-            var child = children[i],
-                parser = parsers[child.nodeName];
-            if (parser) {
-                entities.push(parser(child));
-            }
-        }
-
-        return entities;
-    }
-
-    connection.authenticated = function() {
-        return oauth.authenticated();
-    };
-
-    // Generate Changeset XML. Returns a string.
-    connection.changesetJXON = function(tags) {
-        return {
-            osm: {
-                changeset: {
-                    tag: _.map(tags, function(value, key) {
-                        return { '@k': key, '@v': value };
-                    }),
-                    '@version': 0.3,
-                    '@generator': 'iD'
-                }
-            }
-        };
-    };
-
-    // Generate [osmChange](http://wiki.openstreetmap.org/wiki/OsmChange)
-    // XML. Returns a string.
-    connection.osmChangeJXON = function(changeset_id, changes) {
-        function nest(x, order) {
-            var groups = {};
-            for (var i = 0; i < x.length; i++) {
-                var tagName = Object.keys(x[i])[0];
-                if (!groups[tagName]) groups[tagName] = [];
-                groups[tagName].push(x[i][tagName]);
-            }
-            var ordered = {};
-            order.forEach(function(o) {
-                if (groups[o]) ordered[o] = groups[o];
-            });
-            return ordered;
-        }
-
-        function rep(entity) {
-            return entity.asJXON(changeset_id);
-        }
-
-        return {
-            osmChange: {
-                '@version': 0.3,
-                '@generator': 'iD',
-                'create': nest(changes.created.map(rep), ['node', 'way', 'relation']),
-                'modify': nest(changes.modified.map(rep), ['node', 'way', 'relation']),
-                'delete': _.extend(nest(changes.deleted.map(rep), ['relation', 'way', 'node']), {'@if-unused': true})
-            }
-        };
-    };
-
-    connection.changesetTags = function(comment, imageryUsed) {
-        var tags = {
-            imagery_used: imageryUsed.join(';').substr(0, 255),
-            created_by: 'iD ' + iD.version
-        };
-
-        if (comment) {
-            tags.comment = comment;
-        }
-
-        return tags;
-    };
-
-    connection.putChangeset = function(changes, comment, imageryUsed, callback) {
-        oauth.xhr({
-                method: 'PUT',
-                path: '/api/0.6/changeset/create',
-                options: { header: { 'Content-Type': 'text/xml' } },
-                content: JXON.stringify(connection.changesetJXON(connection.changesetTags(comment, imageryUsed)))
-            }, function(err, changeset_id) {
-                if (err) return callback(err);
-                oauth.xhr({
-                    method: 'POST',
-                    path: '/api/0.6/changeset/' + changeset_id + '/upload',
-                    options: { header: { 'Content-Type': 'text/xml' } },
-                    content: JXON.stringify(connection.osmChangeJXON(changeset_id, changes))
-                }, function(err) {
-                    if (err) return callback(err);
-                    oauth.xhr({
-                        method: 'PUT',
-                        path: '/api/0.6/changeset/' + changeset_id + '/close'
-                    }, function(err) {
-                        callback(err, changeset_id);
-                    });
-                });
-            });
-    };
-
-    var userDetails;
-
-    connection.userDetails = function(callback) {
-        if (userDetails) {
-            callback(undefined, userDetails);
-            return;
-        }
-
-        function done(err, user_details) {
-            if (err) return callback(err);
-
-            var u = user_details.getElementsByTagName('user')[0],
-                img = u.getElementsByTagName('img'),
-                image_url = '';
-
-            if (img && img[0] && img[0].getAttribute('href')) {
-                image_url = img[0].getAttribute('href');
-            }
-
-            userDetails = {
-                display_name: u.attributes.display_name.value,
-                image_url: image_url,
-                id: u.attributes.id.value
-            };
-
-            callback(undefined, userDetails);
-        }
-
-        oauth.xhr({ method: 'GET', path: '/api/0.6/user/details' }, done);
-    };
-
-    connection.status = function(callback) {
-        function done(capabilities) {
-            var apiStatus = capabilities.getElementsByTagName('status');
-            callback(undefined, apiStatus[0].getAttribute('api'));
-        }
-        d3.xml(url + '/api/capabilities').get()
-            .on('load', done)
-            .on('error', callback);
-    };
-
-    function abortRequest(i) { i.abort(); }
-
-    connection.tileZoom = function(_) {
-        if (!arguments.length) return tileZoom;
-        tileZoom = _;
-        return connection;
-    };
-
-    connection.loadTiles = function(projection, dimensions) {
-
-        if (off) return;
-
-        var s = projection.scale() * 2 * Math.PI,
-            z = Math.max(Math.log(s) / Math.log(2) - 8, 0),
-            ts = 256 * Math.pow(2, z - tileZoom),
-            origin = [
-                s / 2 - projection.translate()[0],
-                s / 2 - projection.translate()[1]];
-
-        var tiles = d3.geo.tile()
-            .scaleExtent([tileZoom, tileZoom])
-            .scale(s)
-            .size(dimensions)
-            .translate(projection.translate())()
-            .map(function(tile) {
-                var x = tile[0] * ts - origin[0],
-                    y = tile[1] * ts - origin[1];
-
-                return {
-                    id: tile.toString(),
-                    extent: iD.geo.Extent(
-                        projection.invert([x, y + ts]),
-                        projection.invert([x + ts, y]))
-                };
-            });
-
-        function bboxUrl(tile) {
-            return url + '/api/0.6/map?bbox=' + tile.extent.toParam();
-        }
-
-        _.filter(inflight, function(v, i) {
-            var wanted = _.find(tiles, function(tile) {
-                return i === tile.id;
-            });
-            if (!wanted) delete inflight[i];
-            return !wanted;
-        }).map(abortRequest);
-
-        tiles.forEach(function(tile) {
-            var id = tile.id;
-
-            if (loadedTiles[id] || inflight[id]) return;
-
-            if (_.isEmpty(inflight)) {
-                event.loading();
-            }
-
-            inflight[id] = connection.loadFromURL(bboxUrl(tile), function(err, parsed) {
-                loadedTiles[id] = true;
-                delete inflight[id];
-
-                event.load(err, _.extend({data: parsed}, tile));
-
-                if (_.isEmpty(inflight)) {
-                    event.loaded();
-                }
-            });
-        });
-    };
-
-    connection.switch = function(options) {
-        url = options.url;
-        oauth.options(_.extend({
-            loading: authenticating,
-            done: authenticated
-        }, options));
-        event.auth();
-        connection.flush();
-        return connection;
-    };
-
-    connection.toggle = function(_) {
-        off = !_;
-        return connection;
-    };
-
-    connection.flush = function() {
-        _.forEach(inflight, abortRequest);
-        loadedTiles = {};
-        inflight = {};
-        return connection;
-    };
-
-    connection.loadedTiles = function(_) {
-        if (!arguments.length) return loadedTiles;
-        loadedTiles = _;
-        return connection;
-    };
-
-    connection.logout = function() {
-        oauth.logout();
-        event.auth();
-        return connection;
-    };
-
-    connection.authenticate = function(callback) {
-        function done(err, res) {
-            event.auth();
-            if (callback) callback(err, res);
-        }
-        return oauth.authenticate(done);
-    };
-
-    return d3.rebind(connection, event, 'on');
-};
-/*
-    iD.Difference represents the difference between two graphs.
-    It knows how to calculate the set of entities that were
-    created, modified, or deleted, and also contains the logic
-    for recursively extending a difference to the complete set
-    of entities that will require a redraw, taking into account
-    child and parent relationships.
- */
-iD.Difference = function(base, head) {
-    var changes = {}, length = 0;
-
-    function changed(h, b) {
-        return !_.isEqual(_.omit(h, 'v'), _.omit(b, 'v'));
-    }
-
-    _.each(head.entities, function(h, id) {
-        var b = base.entities[id];
-        if (changed(h, b)) {
-            changes[id] = {base: b, head: h};
-            length++;
-        }
-    });
-
-    _.each(base.entities, function(b, id) {
-        var h = head.entities[id];
-        if (!changes[id] && changed(h, b)) {
-            changes[id] = {base: b, head: h};
-            length++;
-        }
-    });
-
-    function addParents(parents, result) {
-        for (var i = 0; i < parents.length; i++) {
-            var parent = parents[i];
-
-            if (parent.id in result)
-                continue;
-
-            result[parent.id] = parent;
-            addParents(head.parentRelations(parent), result);
-        }
-    }
-
-    var difference = {};
-
-    difference.length = function() {
-        return length;
-    };
-
-    difference.changes = function() {
-        return changes;
-    };
-
-    difference.extantIDs = function() {
-        var result = [];
-        _.each(changes, function(change, id) {
-            if (change.head) result.push(id);
-        });
-        return result;
-    };
-
-    difference.modified = function() {
-        var result = [];
-        _.each(changes, function(change) {
-            if (change.base && change.head) result.push(change.head);
-        });
-        return result;
-    };
-
-    difference.created = function() {
-        var result = [];
-        _.each(changes, function(change) {
-            if (!change.base && change.head) result.push(change.head);
-        });
-        return result;
-    };
-
-    difference.deleted = function() {
-        var result = [];
-        _.each(changes, function(change) {
-            if (change.base && !change.head) result.push(change.base);
-        });
-        return result;
-    };
-
-    difference.summary = function() {
-        var relevant = {};
-
-        function addEntity(entity, graph, changeType) {
-            relevant[entity.id] = {
-                entity: entity,
-                graph: graph,
-                changeType: changeType
-            };
-        }
-
-        function addParents(entity) {
-            var parents = head.parentWays(entity);
-            for (var j = parents.length - 1; j >= 0; j--) {
-                var parent = parents[j];
-                if (!(parent.id in relevant)) addEntity(parent, head, 'modified');
-            }
-        }
-
-        _.each(changes, function(change) {
-            if (change.head && change.head.geometry(head) !== 'vertex') {
-                addEntity(change.head, head, change.base ? 'modified' : 'created');
-
-            } else if (change.base && change.base.geometry(base) !== 'vertex') {
-                addEntity(change.base, base, 'deleted');
-
-            } else if (change.base && change.head) { // modified vertex
-                var moved    = !_.isEqual(change.base.loc,  change.head.loc),
-                    retagged = !_.isEqual(change.base.tags, change.head.tags);
-
-                if (moved) {
-                    addParents(change.head);
-                }
-
-                if (retagged || (moved && change.head.hasInterestingTags())) {
-                    addEntity(change.head, head, 'modified');
-                }
-
-            } else if (change.head && change.head.hasInterestingTags()) { // created vertex
-                addEntity(change.head, head, 'created');
-
-            } else if (change.base && change.base.hasInterestingTags()) { // deleted vertex
-                addEntity(change.base, base, 'deleted');
-            }
-        });
-
-        return d3.values(relevant);
-    };
-
-    difference.complete = function(extent) {
-        var result = {}, id, change;
-
-        for (id in changes) {
-            change = changes[id];
-
-            var h = change.head,
-                b = change.base,
-                entity = h || b;
-
-            if (extent &&
-                (!h || !h.intersects(extent, head)) &&
-                (!b || !b.intersects(extent, base)))
-                continue;
-
-            result[id] = h;
-
-            if (entity.type === 'way') {
-                var nh = h ? h.nodes : [],
-                    nb = b ? b.nodes : [],
-                    diff, i;
-
-                diff = _.difference(nh, nb);
-                for (i = 0; i < diff.length; i++) {
-                    result[diff[i]] = head.hasEntity(diff[i]);
-                }
-
-                diff = _.difference(nb, nh);
-                for (i = 0; i < diff.length; i++) {
-                    result[diff[i]] = head.hasEntity(diff[i]);
-                }
-            }
-
-            addParents(head.parentWays(entity), result);
-            addParents(head.parentRelations(entity), result);
-        }
-
-        return result;
-    };
-
-    return difference;
-};
-iD.Entity = function(attrs) {
-    // For prototypal inheritance.
-    if (this instanceof iD.Entity) return;
-
-    // Create the appropriate subtype.
-    if (attrs && attrs.type) {
-        return iD.Entity[attrs.type].apply(this, arguments);
-    } else if (attrs && attrs.id) {
-        return iD.Entity[iD.Entity.id.type(attrs.id)].apply(this, arguments);
-    }
-
-    // Initialize a generic Entity (used only in tests).
-    return (new iD.Entity()).initialize(arguments);
-};
-
-iD.Entity.id = function(type) {
-    return iD.Entity.id.fromOSM(type, iD.Entity.id.next[type]--);
-};
-
-iD.Entity.id.next = {node: -1, way: -1, relation: -1};
-
-iD.Entity.id.fromOSM = function(type, id) {
-    return type[0] + id;
-};
-
-iD.Entity.id.toOSM = function(id) {
-    return id.slice(1);
-};
-
-iD.Entity.id.type = function(id) {
-    return {'n': 'node', 'w': 'way', 'r': 'relation'}[id[0]];
-};
-
-// A function suitable for use as the second argument to d3.selection#data().
-iD.Entity.key = function(entity) {
-    return entity.id + 'v' + (entity.v || 0);
-};
-
-iD.Entity.prototype = {
-    tags: {},
-
-    initialize: function(sources) {
-        for (var i = 0; i < sources.length; ++i) {
-            var source = sources[i];
-            for (var prop in source) {
-                if (Object.prototype.hasOwnProperty.call(source, prop)) {
-                    this[prop] = source[prop];
-                }
-            }
-        }
-
-        if (!this.id && this.type) {
-            this.id = iD.Entity.id(this.type);
-        }
-
-        if (iD.debug) {
-            Object.freeze(this);
-            Object.freeze(this.tags);
-
-            if (this.loc) Object.freeze(this.loc);
-            if (this.nodes) Object.freeze(this.nodes);
-            if (this.members) Object.freeze(this.members);
-        }
-
-        return this;
-    },
-
-    osmId: function() {
-        return iD.Entity.id.toOSM(this.id);
-    },
-
-    isNew: function() {
-        return this.osmId() < 0;
-    },
-
-    update: function(attrs) {
-        return iD.Entity(this, attrs, {v: 1 + (this.v || 0)});
-    },
-
-    mergeTags: function(tags) {
-        var merged = _.clone(this.tags), changed = false;
-        for (var k in tags) {
-            var t1 = merged[k],
-                t2 = tags[k];
-            if (!t1) {
-                changed = true;
-                merged[k] = t2;
-            } else if (t1 !== t2) {
-                changed = true;
-                merged[k] = _.union(t1.split(/;\s*/), t2.split(/;\s*/)).join(';');
-            }
-        }
-        return changed ? this.update({tags: merged}) : this;
-    },
-
-    intersects: function(extent, resolver) {
-        return this.extent(resolver).intersects(extent);
-    },
-
-    isUsed: function(resolver) {
-        return _.without(Object.keys(this.tags), 'area').length > 0 ||
-            resolver.parentRelations(this).length > 0;
-    },
-
-    hasInterestingTags: function() {
-        return _.keys(this.tags).some(function(key) {
-            return key !== 'attribution' &&
-                key !== 'created_by' &&
-                key !== 'source' &&
-                key !== 'odbl' &&
-                key.indexOf('tiger:') !== 0;
-        });
-    },
-
-    isHighwayIntersection: function() {
-        return false;
-    },
-
-    deprecatedTags: function() {
-        var tags = _.pairs(this.tags);
-        var deprecated = {};
-
-        iD.data.deprecated.forEach(function(d) {
-            var match = _.pairs(d.old)[0];
-            tags.forEach(function(t) {
-                if (t[0] === match[0] &&
-                    (t[1] === match[1] || match[1] === '*')) {
-                    deprecated[t[0]] = t[1];
-                }
-            });
-        });
-
-        return deprecated;
-    }
-};
-iD.Graph = function(other, mutable) {
-    if (!(this instanceof iD.Graph)) return new iD.Graph(other, mutable);
-
-    if (other instanceof iD.Graph) {
-        var base = other.base();
-        this.entities = _.assign(Object.create(base.entities), other.entities);
-        this._parentWays = _.assign(Object.create(base.parentWays), other._parentWays);
-        this._parentRels = _.assign(Object.create(base.parentRels), other._parentRels);
-
-    } else {
-        this.entities = Object.create({});
-        this._parentWays = Object.create({});
-        this._parentRels = Object.create({});
-        this.rebase(other || [], [this]);
-    }
-
-    this.transients = {};
-    this._childNodes = {};
-
-    if (!mutable) {
-        this.freeze();
-    }
-};
-
-iD.Graph.prototype = {
-    hasEntity: function(id) {
-        return this.entities[id];
-    },
-
-    entity: function(id) {
-        var entity = this.entities[id];
-        if (!entity) {
-            throw new Error('entity ' + id + ' not found');
-        }
-        return entity;
-    },
-
-    transient: function(entity, key, fn) {
-        var id = entity.id,
-            transients = this.transients[id] ||
-            (this.transients[id] = {});
-
-        if (transients[key] !== undefined) {
-            return transients[key];
-        }
-
-        transients[key] = fn.call(entity);
-
-        return transients[key];
-    },
-
-    parentWays: function(entity) {
-        return _.map(this._parentWays[entity.id], this.entity, this);
-    },
-
-    isPoi: function(entity) {
-        var parentWays = this._parentWays[entity.id];
-        return !parentWays || parentWays.length === 0;
-    },
-
-    isShared: function(entity) {
-        var parentWays = this._parentWays[entity.id];
-        return parentWays && parentWays.length > 1;
-    },
-
-    parentRelations: function(entity) {
-        return _.map(this._parentRels[entity.id], this.entity, this);
-    },
-
-    childNodes: function(entity) {
-        if (this._childNodes[entity.id])
-            return this._childNodes[entity.id];
-
-        var nodes = [];
-        for (var i = 0, l = entity.nodes.length; i < l; i++) {
-            nodes[i] = this.entity(entity.nodes[i]);
-        }
-
-        if (iD.debug) Object.freeze(nodes);
-
-        this._childNodes[entity.id] = nodes;
-        return this._childNodes[entity.id];
-    },
-
-    base: function() {
-        return {
-            'entities': iD.util.getPrototypeOf(this.entities),
-            'parentWays': iD.util.getPrototypeOf(this._parentWays),
-            'parentRels': iD.util.getPrototypeOf(this._parentRels)
-        };
-    },
-
-    // Unlike other graph methods, rebase mutates in place. This is because it
-    // is used only during the history operation that merges newly downloaded
-    // data into each state. To external consumers, it should appear as if the
-    // graph always contained the newly downloaded data.
-    rebase: function(entities, stack) {
-        var base = this.base(),
-            i, j, k, id;
-
-        for (i = 0; i < entities.length; i++) {
-            var entity = entities[i];
-
-            if (base.entities[entity.id])
-                continue;
-
-            // Merging data into the base graph
-            base.entities[entity.id] = entity;
-            this._updateCalculated(undefined, entity,
-                base.parentWays, base.parentRels);
-
-            // Restore provisionally-deleted nodes that are discovered to have an extant parent
-            if (entity.type === 'way') {
-                for (j = 0; j < entity.nodes.length; j++) {
-                    id = entity.nodes[j];
-                    for (k = 1; k < stack.length; k++) {
-                        var ents = stack[k].entities;
-                        if (ents.hasOwnProperty(id) && ents[id] === undefined) {
-                            delete ents[id];
-                        }
-                    }
-                }
-            }
-        }
-
-        for (i = 0; i < stack.length; i++) {
-            stack[i]._updateRebased();
-        }
-    },
-
-    _updateRebased: function() {
-        var base = this.base(),
-            i, k, child, id, keys;
-
-        keys = Object.keys(this._parentWays);
-        for (i = 0; i < keys.length; i++) {
-            child = keys[i];
-            if (base.parentWays[child]) {
-                for (k = 0; k < base.parentWays[child].length; k++) {
-                    id = base.parentWays[child][k];
-                    if (!this.entities.hasOwnProperty(id) && !_.contains(this._parentWays[child], id)) {
-                        this._parentWays[child].push(id);
-                    }
-                }
-            }
-        }
-
-        keys = Object.keys(this._parentRels);
-        for (i = 0; i < keys.length; i++) {
-            child = keys[i];
-            if (base.parentRels[child]) {
-                for (k = 0; k < base.parentRels[child].length; k++) {
-                    id = base.parentRels[child][k];
-                    if (!this.entities.hasOwnProperty(id) && !_.contains(this._parentRels[child], id)) {
-                        this._parentRels[child].push(id);
-                    }
-                }
-            }
-        }
-
-        this.transients = {};
-
-        // this._childNodes is not updated, under the assumption that
-        // ways are always downloaded with their child nodes.
-    },
-
-    // Updates calculated properties (parentWays, parentRels) for the specified change
-    _updateCalculated: function(oldentity, entity, parentWays, parentRels) {
-
-        parentWays = parentWays || this._parentWays;
-        parentRels = parentRels || this._parentRels;
-
-        var type = entity && entity.type || oldentity && oldentity.type,
-            removed, added, ways, rels, i;
-
-
-        if (type === 'way') {
-
-            // Update parentWays
-            if (oldentity && entity) {
-                removed = _.difference(oldentity.nodes, entity.nodes);
-                added = _.difference(entity.nodes, oldentity.nodes);
-            } else if (oldentity) {
-                removed = oldentity.nodes;
-                added = [];
-            } else if (entity) {
-                removed = [];
-                added = entity.nodes;
-            }
-            for (i = 0; i < removed.length; i++) {
-                parentWays[removed[i]] = _.without(parentWays[removed[i]], oldentity.id);
-            }
-            for (i = 0; i < added.length; i++) {
-                ways = _.without(parentWays[added[i]], entity.id);
-                ways.push(entity.id);
-                parentWays[added[i]] = ways;
-            }
-
-        } else if (type === 'relation') {
-
-            // Update parentRels
-            if (oldentity && entity) {
-                removed = _.difference(oldentity.members, entity.members);
-                added = _.difference(entity.members, oldentity);
-            } else if (oldentity) {
-                removed = oldentity.members;
-                added = [];
-            } else if (entity) {
-                removed = [];
-                added = entity.members;
-            }
-            for (i = 0; i < removed.length; i++) {
-                parentRels[removed[i].id] = _.without(parentRels[removed[i].id], oldentity.id);
-            }
-            for (i = 0; i < added.length; i++) {
-                rels = _.without(parentRels[added[i].id], entity.id);
-                rels.push(entity.id);
-                parentRels[added[i].id] = rels;
-            }
-        }
-    },
-
-    replace: function(entity) {
-        if (this.entities[entity.id] === entity)
-            return this;
-
-        return this.update(function() {
-            this._updateCalculated(this.entities[entity.id], entity);
-            this.entities[entity.id] = entity;
-        });
-    },
-
-    remove: function(entity) {
-        return this.update(function() {
-            this._updateCalculated(entity, undefined);
-            this.entities[entity.id] = undefined;
-        });
-    },
-
-    update: function() {
-        var graph = this.frozen ? iD.Graph(this, true) : this;
-
-        for (var i = 0; i < arguments.length; i++) {
-            arguments[i].call(graph, graph);
-        }
-
-        return this.frozen ? graph.freeze() : this;
-    },
-
-    freeze: function() {
-        this.frozen = true;
-
-        // No longer freezing entities here due to in-place updates needed in rebase.
-
-        return this;
-    },
-
-    // Obliterates any existing entities
-    load: function(entities) {
-        var base = this.base();
-        this.entities = Object.create(base.entities);
-
-        for (var i in entities) {
-            this.entities[i] = entities[i];
-            this._updateCalculated(base.entities[i], this.entities[i]);
-        }
-
-        return this;
-    }
-};
-iD.History = function(context) {
-    var stack, index, tree,
-        imageryUsed = ['Bing'],
-        dispatch = d3.dispatch('change', 'undone', 'redone'),
-        lock = iD.util.SessionMutex('lock');
-
-    function perform(actions) {
-        actions = Array.prototype.slice.call(actions);
-
-        var annotation;
-
-        if (!_.isFunction(_.last(actions))) {
-            annotation = actions.pop();
-        }
-
-        var graph = stack[index].graph;
-        for (var i = 0; i < actions.length; i++) {
-            graph = actions[i](graph);
-        }
-
-        return {
-            graph: graph,
-            annotation: annotation,
-            imageryUsed: imageryUsed
-        };
-    }
-
-    function change(previous) {
-        var difference = iD.Difference(previous, history.graph());
-        dispatch.change(difference);
-        return difference;
-    }
-
-    // iD uses namespaced keys so multiple installations do not conflict
-    function getKey(n) {
-        return 'iD_' + window.location.origin + '_' + n;
-    }
-
-    var history = {
-        graph: function() {
-            return stack[index].graph;
-        },
-
-        merge: function(entities, extent) {
-            stack[0].graph.rebase(entities, _.pluck(stack, 'graph'));
-            tree.rebase(entities);
-
-            dispatch.change(undefined, extent);
-        },
-
-        perform: function() {
-            var previous = stack[index].graph;
-
-            stack = stack.slice(0, index + 1);
-            stack.push(perform(arguments));
-            index++;
-
-            return change(previous);
-        },
-
-        replace: function() {
-            var previous = stack[index].graph;
-
-            // assert(index == stack.length - 1)
-            stack[index] = perform(arguments);
-
-            return change(previous);
-        },
-
-        pop: function() {
-            var previous = stack[index].graph;
-
-            if (index > 0) {
-                index--;
-                stack.pop();
-                return change(previous);
-            }
-        },
-
-        undo: function() {
-            var previous = stack[index].graph;
-
-            // Pop to the next annotated state.
-            while (index > 0) {
-                index--;
-                if (stack[index].annotation) break;
-            }
-
-            dispatch.undone();
-            return change(previous);
-        },
-
-        redo: function() {
-            var previous = stack[index].graph;
-
-            while (index < stack.length - 1) {
-                index++;
-                if (stack[index].annotation) break;
-            }
-
-            dispatch.redone();
-            return change(previous);
-        },
-
-        undoAnnotation: function() {
-            var i = index;
-            while (i >= 0) {
-                if (stack[i].annotation) return stack[i].annotation;
-                i--;
-            }
-        },
-
-        redoAnnotation: function() {
-            var i = index + 1;
-            while (i <= stack.length - 1) {
-                if (stack[i].annotation) return stack[i].annotation;
-                i++;
-            }
-        },
-
-        intersects: function(extent) {
-            return tree.intersects(extent, stack[index].graph);
-        },
-
-        difference: function() {
-            var base = stack[0].graph,
-                head = stack[index].graph;
-            return iD.Difference(base, head);
-        },
-
-        changes: function(action) {
-            var base = stack[0].graph,
-                head = stack[index].graph;
-
-            if (action) {
-                head = action(head);
-            }
-
-            var difference = iD.Difference(base, head);
-
-            return {
-                modified: difference.modified(),
-                created: difference.created(),
-                deleted: difference.deleted()
-            };
-        },
-
-        hasChanges: function() {
-            return this.difference().length() > 0;
-        },
-
-        imageryUsed: function(sources) {
-            if (sources) {
-                imageryUsed = sources;
-                return history;
-            } else {
-                return _(stack.slice(1, index + 1))
-                    .pluck('imageryUsed')
-                    .flatten()
-                    .unique()
-                    .without(undefined, 'Custom')
-                    .value();
-            }
-        },
-
-        reset: function() {
-            stack = [{graph: iD.Graph()}];
-            index = 0;
-            tree = iD.Tree(stack[0].graph);
-            dispatch.change();
-            return history;
-        },
-
-        toJSON: function() {
-            if (stack.length <= 1) return;
-
-            var allEntities = {},
-                baseEntities = {},
-                base = stack[0];
-
-            var s = stack.map(function(i) {
-                var modified = [], deleted = [];
-
-                _.forEach(i.graph.entities, function(entity, id) {
-                    if (entity) {
-                        var key = iD.Entity.key(entity);
-                        allEntities[key] = entity;
-                        modified.push(key);
-                    } else {
-                        deleted.push(id);
-                    }
-
-                    // make sure that the originals of changed or deleted entities get merged
-                    // into the base of the stack after restoring the data from JSON.
-                    if (id in base.graph.entities) {
-                        baseEntities[id] = base.graph.entities[id];
-                    }
-                });
-
-                var x = {};
-
-                if (modified.length) x.modified = modified;
-                if (deleted.length) x.deleted = deleted;
-                if (i.imageryUsed) x.imageryUsed = i.imageryUsed;
-                if (i.annotation) x.annotation = i.annotation;
-
-                return x;
-            });
-
-            return JSON.stringify({
-                version: 3,
-                entities: _.values(allEntities),
-                baseEntities: _.values(baseEntities),
-                stack: s,
-                nextIDs: iD.Entity.id.next,
-                index: index
-            });
-        },
-
-        fromJSON: function(json) {
-            var h = JSON.parse(json);
-
-            iD.Entity.id.next = h.nextIDs;
-            index = h.index;
-
-            if (h.version === 2 || h.version === 3) {
-                var allEntities = {};
-
-                h.entities.forEach(function(entity) {
-                    allEntities[iD.Entity.key(entity)] = iD.Entity(entity);
-                });
-
-                if (h.version === 3) {
-                    // this merges originals for changed entities into the base of
-                    // the stack even if the current stack doesn't have them (for
-                    // example when iD has been restarted in a different region)
-                    var baseEntities = h.baseEntities.map(iD.Entity);
-                    stack[0].graph.rebase(baseEntities, _.pluck(stack, 'graph'));
-                    tree.rebase(baseEntities);
-                }
-
-                stack = h.stack.map(function(d) {
-                    var entities = {}, entity;
-
-                    if (d.modified) {
-                        d.modified.forEach(function(key) {
-                            entity = allEntities[key];
-                            entities[entity.id] = entity;
-                        });
-                    }
-
-                    if (d.deleted) {
-                        d.deleted.forEach(function(id) {
-                            entities[id] = undefined;
-                        });
-                    }
-
-                    return {
-                        graph: iD.Graph(stack[0].graph).load(entities),
-                        annotation: d.annotation,
-                        imageryUsed: d.imageryUsed
-                    };
-                });
-            } else { // original version
-                stack = h.stack.map(function(d) {
-                    var entities = {};
-
-                    for (var i in d.entities) {
-                        var entity = d.entities[i];
-                        entities[i] = entity === 'undefined' ? undefined : iD.Entity(entity);
-                    }
-
-                    d.graph = iD.Graph(stack[0].graph).load(entities);
-                    return d;
-                });
-            }
-
-            dispatch.change();
-
-            return history;
-        },
-
-        save: function() {
-            if (lock.locked()) context.storage(getKey('saved_history'), history.toJSON() || null);
-            return history;
-        },
-
-        clearSaved: function() {
-            if (lock.locked()) context.storage(getKey('saved_history'), null);
-            return history;
-        },
-
-        lock: function() {
-            return lock.lock();
-        },
-
-        unlock: function() {
-            lock.unlock();
-        },
-
-        // is iD not open in another window and it detects that
-        // there's a history stored in localStorage that's recoverable?
-        restorableChanges: function() {
-            return lock.locked() && !!context.storage(getKey('saved_history'));
-        },
-
-        // load history from a version stored in localStorage
-        restore: function() {
-            if (!lock.locked()) return;
-
-            var json = context.storage(getKey('saved_history'));
-            if (json) history.fromJSON(json);
-        },
-
-        _getKey: getKey
-
-    };
-
-    history.reset();
-
-    return d3.rebind(history, dispatch, 'on');
-};
-iD.Node = iD.Entity.node = function iD_Node() {
-    if (!(this instanceof iD_Node)) {
-        return (new iD_Node()).initialize(arguments);
-    } else if (arguments.length) {
-        this.initialize(arguments);
-    }
-};
-
-iD.Node.prototype = Object.create(iD.Entity.prototype);
-
-_.extend(iD.Node.prototype, {
-    type: 'node',
-
-    extent: function() {
-        return new iD.geo.Extent(this.loc);
-    },
-
-    geometry: function(graph) {
-        return graph.transient(this, 'geometry', function() {
-            return graph.isPoi(this) ? 'point' : 'vertex';
-        });
-    },
-
-    move: function(loc) {
-        return this.update({loc: loc});
-    },
-
-    isIntersection: function(resolver) {
-        return resolver.transient(this, 'isIntersection', function() {
-            return resolver.parentWays(this).filter(function(parent) {
-                return (parent.tags.highway ||
-                    parent.tags.waterway ||
-                    parent.tags.railway ||
-                    parent.tags.aeroway) &&
-                    parent.geometry(resolver) === 'line';
-            }).length > 1;
-        });
-    },
-
-    isHighwayIntersection: function(resolver) {
-        return resolver.transient(this, 'isHighwayIntersection', function() {
-            return resolver.parentWays(this).filter(function(parent) {
-                return parent.tags.highway && parent.geometry(resolver) === 'line';
-            }).length > 1;
-        });
-    },
-
-    asJXON: function(changeset_id) {
-        var r = {
-            node: {
-                '@id': this.osmId(),
-                '@lon': this.loc[0],
-                '@lat': this.loc[1],
-                '@version': (this.version || 0),
-                tag: _.map(this.tags, function(v, k) {
-                    return { keyAttributes: { k: k, v: v } };
-                })
-            }
-        };
-        if (changeset_id) r.node['@changeset'] = changeset_id;
-        return r;
-    },
-
-    asGeoJSON: function() {
-        return {
-            type: 'Point',
-            coordinates: this.loc
-        };
-    }
-});
-iD.oneWayTags = {
-    'aerialway': {
-        'chair_lift': true,
-        'mixed_lift': true,
-        't-bar': true,
-        'j-bar': true,
-        'platter': true,
-        'rope_tow': true,
-        'magic_carpet': true,
-        'yes': true
-    },
-    'highway': {
-        'motorway': true,
-        'motorway_link': true
-    },
-    'junction': {
-        'roundabout': true
-    },
-    'man_made': {
-        'piste:halfpipe': true
-    },
-    'piste:type': {
-        'downhill': true,
-        'sled': true,
-        'yes': true
-    },
-    'waterway': {
-        'river': true,
-        'stream': true
-    }
-};
-iD.Relation = iD.Entity.relation = function iD_Relation() {
-    if (!(this instanceof iD_Relation)) {
-        return (new iD_Relation()).initialize(arguments);
-    } else if (arguments.length) {
-        this.initialize(arguments);
-    }
-};
-
-iD.Relation.prototype = Object.create(iD.Entity.prototype);
-
-iD.Relation.creationOrder = function(a, b) {
-    var aId = parseInt(iD.Entity.id.toOSM(a.id), 10);
-    var bId = parseInt(iD.Entity.id.toOSM(b.id), 10);
-
-    if (aId < 0 || bId < 0) return aId - bId;
-    return bId - aId;
-};
-
-_.extend(iD.Relation.prototype, {
-    type: 'relation',
-    members: [],
-
-    extent: function(resolver, memo) {
-        return resolver.transient(this, 'extent', function() {
-            if (memo && memo[this.id]) return iD.geo.Extent();
-            memo = memo || {};
-            memo[this.id] = true;
-
-            var extent = iD.geo.Extent();
-            for (var i = 0; i < this.members.length; i++) {
-                var member = resolver.hasEntity(this.members[i].id);
-                if (member) {
-                    extent._extend(member.extent(resolver, memo));
-                }
-            }
-            return extent;
-        });
-    },
-
-    geometry: function(graph) {
-        return graph.transient(this, 'geometry', function() {
-            return this.isMultipolygon() ? 'area' : 'relation';
-        });
-    },
-
-    isDegenerate: function() {
-        return this.members.length === 0;
-    },
-
-    // Return an array of members, each extended with an 'index' property whose value
-    // is the member index.
-    indexedMembers: function() {
-        var result = new Array(this.members.length);
-        for (var i = 0; i < this.members.length; i++) {
-            result[i] = _.extend({}, this.members[i], {index: i});
-        }
-        return result;
-    },
-
-    // Return the first member with the given role. A copy of the member object
-    // is returned, extended with an 'index' property whose value is the member index.
-    memberByRole: function(role) {
-        for (var i = 0; i < this.members.length; i++) {
-            if (this.members[i].role === role) {
-                return _.extend({}, this.members[i], {index: i});
-            }
-        }
-    },
-
-    // Return the first member with the given id. A copy of the member object
-    // is returned, extended with an 'index' property whose value is the member index.
-    memberById: function(id) {
-        for (var i = 0; i < this.members.length; i++) {
-            if (this.members[i].id === id) {
-                return _.extend({}, this.members[i], {index: i});
-            }
-        }
-    },
-
-    // Return the first member with the given id and role. A copy of the member object
-    // is returned, extended with an 'index' property whose value is the member index.
-    memberByIdAndRole: function(id, role) {
-        for (var i = 0; i < this.members.length; i++) {
-            if (this.members[i].id === id && this.members[i].role === role) {
-                return _.extend({}, this.members[i], {index: i});
-            }
-        }
-    },
-
-    addMember: function(member, index) {
-        var members = this.members.slice();
-        members.splice(index === undefined ? members.length : index, 0, member);
-        return this.update({members: members});
-    },
-
-    updateMember: function(member, index) {
-        var members = this.members.slice();
-        members.splice(index, 1, _.extend({}, members[index], member));
-        return this.update({members: members});
-    },
-
-    removeMember: function(index) {
-        var members = this.members.slice();
-        members.splice(index, 1);
-        return this.update({members: members});
-    },
-
-    removeMembersWithID: function(id) {
-        var members = _.reject(this.members, function(m) { return m.id === id; });
-        return this.update({members: members});
-    },
-
-    // Wherever a member appears with id `needle.id`, replace it with a member
-    // with id `replacement.id`, type `replacement.type`, and the original role,
-    // unless a member already exists with that id and role. Return an updated
-    // relation.
-    replaceMember: function(needle, replacement) {
-        if (!this.memberById(needle.id))
-            return this;
-
-        var members = [];
-
-        for (var i = 0; i < this.members.length; i++) {
-            var member = this.members[i];
-            if (member.id !== needle.id) {
-                members.push(member);
-            } else if (!this.memberByIdAndRole(replacement.id, member.role)) {
-                members.push({id: replacement.id, type: replacement.type, role: member.role});
-            }
-        }
-
-        return this.update({members: members});
-    },
-
-    asJXON: function(changeset_id) {
-        var r = {
-            relation: {
-                '@id': this.osmId(),
-                '@version': this.version || 0,
-                member: _.map(this.members, function(member) {
-                    return { keyAttributes: { type: member.type, role: member.role, ref: iD.Entity.id.toOSM(member.id) } };
-                }),
-                tag: _.map(this.tags, function(v, k) {
-                    return { keyAttributes: { k: k, v: v } };
-                })
-            }
-        };
-        if (changeset_id) r.relation['@changeset'] = changeset_id;
-        return r;
-    },
-
-    asGeoJSON: function(resolver) {
-        return resolver.transient(this, 'GeoJSON', function () {
-            if (this.isMultipolygon()) {
-                return {
-                    type: 'MultiPolygon',
-                    coordinates: this.multipolygon(resolver)
-                };
-            } else {
-                return {
-                    type: 'FeatureCollection',
-                    properties: this.tags,
-                    features: this.members.map(function (member) {
-                        return _.extend({role: member.role}, resolver.entity(member.id).asGeoJSON(resolver));
-                    })
-                };
-            }
-        });
-    },
-
-    area: function(resolver) {
-        return resolver.transient(this, 'area', function() {
-            return d3.geo.area(this.asGeoJSON(resolver));
-        });
-    },
-
-    isMultipolygon: function() {
-        return this.tags.type === 'multipolygon';
-    },
-
-    isComplete: function(resolver) {
-        for (var i = 0; i < this.members.length; i++) {
-            if (!resolver.hasEntity(this.members[i].id)) {
-                return false;
-            }
-        }
-        return true;
-    },
-
-    isRestriction: function() {
-        return !!(this.tags.type && this.tags.type.match(/^restriction:?/));
-    },
-
-    // Returns an array [A0, ... An], each Ai being an array of node arrays [Nds0, ... Ndsm],
-    // where Nds0 is an outer ring and subsequent Ndsi's (if any i > 0) being inner rings.
-    //
-    // This corresponds to the structure needed for rendering a multipolygon path using a
-    // `evenodd` fill rule, as well as the structure of a GeoJSON MultiPolygon geometry.
-    //
-    // In the case of invalid geometries, this function will still return a result which
-    // includes the nodes of all way members, but some Nds may be unclosed and some inner
-    // rings not matched with the intended outer ring.
-    //
-    multipolygon: function(resolver) {
-        var outers = this.members.filter(function(m) { return 'outer' === (m.role || 'outer'); }),
-            inners = this.members.filter(function(m) { return 'inner' === m.role; });
-
-        outers = iD.geo.joinWays(outers, resolver);
-        inners = iD.geo.joinWays(inners, resolver);
-
-        outers = outers.map(function(outer) { return _.pluck(outer.nodes, 'loc'); });
-        inners = inners.map(function(inner) { return _.pluck(inner.nodes, 'loc'); });
-
-        var result = outers.map(function(o) {
-            // Heuristic for detecting counterclockwise winding order. Assumes
-            // that OpenStreetMap polygons are not hemisphere-spanning.
-            return [d3.geo.area({type: 'Polygon', coordinates: [o]}) > 2 * Math.PI ? o.reverse() : o];
-        });
-
-        function findOuter(inner) {
-            var o, outer;
-
-            for (o = 0; o < outers.length; o++) {
-                outer = outers[o];
-                if (iD.geo.polygonContainsPolygon(outer, inner))
-                    return o;
-            }
-
-            for (o = 0; o < outers.length; o++) {
-                outer = outers[o];
-                if (iD.geo.polygonIntersectsPolygon(outer, inner))
-                    return o;
-            }
-        }
-
-        for (var i = 0; i < inners.length; i++) {
-            var inner = inners[i];
-
-            if (d3.geo.area({type: 'Polygon', coordinates: [inner]}) < 2 * Math.PI) {
-                inner = inner.reverse();
-            }
-
-            var o = findOuter(inners[i]);
-            if (o !== undefined)
-                result[o].push(inners[i]);
-            else
-                result.push([inners[i]]); // Invalid geometry
-        }
-
-        return result;
-    }
-});
-iD.Tree = function(head) {
-    var rtree = rbush(),
-        rectangles = {};
-
-    function extentRectangle(extent) {
-        return [
-            extent[0][0],
-            extent[0][1],
-            extent[1][0],
-            extent[1][1]
-        ];
-    }
-
-    function entityRectangle(entity) {
-        var rect = extentRectangle(entity.extent(head));
-        rect.id = entity.id;
-        rectangles[entity.id] = rect;
-        return rect;
-    }
-
-    function updateParents(entity, insertions, memo) {
-        head.parentWays(entity).forEach(function(parent) {
-            if (rectangles[parent.id]) {
-                rtree.remove(rectangles[parent.id]);
-                insertions[parent.id] = parent;
-            }
-        });
-
-        head.parentRelations(entity).forEach(function(parent) {
-            if (memo[entity.id]) return;
-            memo[entity.id] = true;
-            if (rectangles[parent.id]) {
-                rtree.remove(rectangles[parent.id]);
-                insertions[parent.id] = parent;
-            }
-            updateParents(parent, insertions, memo);
-        });
-    }
-
-    var tree = {};
-
-    tree.rebase = function(entities) {
-        var insertions = {};
-
-        for (var i = 0; i < entities.length; i++) {
-            var entity = entities[i];
-
-            if (head.entities.hasOwnProperty(entity.id) || rectangles[entity.id])
-                continue;
-
-            insertions[entity.id] = entity;
-            updateParents(entity, insertions, {});
-        }
-
-        rtree.load(_.map(insertions, entityRectangle));
-
-        return tree;
-    };
-
-    tree.intersects = function(extent, graph) {
-        if (graph !== head) {
-            var diff = iD.Difference(head, graph),
-                insertions = {};
-
-            head = graph;
-
-            diff.deleted().forEach(function(entity) {
-                rtree.remove(rectangles[entity.id]);
-                delete rectangles[entity.id];
-            });
-
-            diff.modified().forEach(function(entity) {
-                rtree.remove(rectangles[entity.id]);
-                insertions[entity.id] = entity;
-                updateParents(entity, insertions, {});
-            });
-
-            diff.created().forEach(function(entity) {
-                insertions[entity.id] = entity;
-            });
-
-            rtree.load(_.map(insertions, entityRectangle));
-        }
-
-        return rtree.search(extentRectangle(extent)).map(function(rect) {
-            return head.entity(rect.id);
-        });
-    };
-
-    return tree;
-};
-iD.Way = iD.Entity.way = function iD_Way() {
-    if (!(this instanceof iD_Way)) {
-        return (new iD_Way()).initialize(arguments);
-    } else if (arguments.length) {
-        this.initialize(arguments);
-    }
-};
-
-iD.Way.prototype = Object.create(iD.Entity.prototype);
-
-_.extend(iD.Way.prototype, {
-    type: 'way',
-    nodes: [],
-
-    extent: function(resolver) {
-        return resolver.transient(this, 'extent', function() {
-            var extent = iD.geo.Extent();
-            for (var i = 0; i < this.nodes.length; i++) {
-                var node = resolver.hasEntity(this.nodes[i]);
-                if (node) {
-                    extent._extend(node.extent());
-                }
-            }
-            return extent;
-        });
-    },
-
-    first: function() {
-        return this.nodes[0];
-    },
-
-    last: function() {
-        return this.nodes[this.nodes.length - 1];
-    },
-
-    contains: function(node) {
-        return this.nodes.indexOf(node) >= 0;
-    },
-
-    affix: function(node) {
-        if (this.nodes[0] === node) return 'prefix';
-        if (this.nodes[this.nodes.length - 1] === node) return 'suffix';
-    },
-
-    layer: function() {
-        // explicit layer tag, clamp between -10, 10..
-        if (this.tags.layer !== undefined) {
-            return Math.max(-10, Math.min(+(this.tags.layer), 10));
-        }
-
-        // implied layer tag..
-        if (this.tags.location === 'overground') return 1;
-        if (this.tags.location === 'underground') return -1;
-        if (this.tags.location === 'underwater') return -10;
-
-        if (this.tags.power === 'line') return 10;
-        if (this.tags.power === 'minor_line') return 10;
-        if (this.tags.aerialway) return 10;
-        if (this.tags.bridge) return 1;
-        if (this.tags.cutting) return -1;
-        if (this.tags.tunnel) return -1;
-        if (this.tags.waterway) return -1;
-        if (this.tags.man_made === 'pipeline') return -10;
-        if (this.tags.boundary) return -10;
-        return 0;
-    },
-
-    isOneWay: function() {
-        // explicit oneway tag..
-        if (['yes', '1', '-1'].indexOf(this.tags.oneway) !== -1) { return true; }
-        if (['no', '0'].indexOf(this.tags.oneway) !== -1) { return false; }
-
-        // implied oneway tag..
-        for (var key in this.tags) {
-            if (key in iD.oneWayTags && (this.tags[key] in iD.oneWayTags[key]))
-                return true;
-        }
-        return false;
-    },
-
-    isClosed: function() {
-        return this.nodes.length > 0 && this.first() === this.last();
-    },
-
-    isConvex: function(resolver) {
-        if (!this.isClosed() || this.isDegenerate()) return null;
-
-        var nodes = _.uniq(resolver.childNodes(this)),
-            coords = _.pluck(nodes, 'loc'),
-            curr = 0, prev = 0;
-
-        for (var i = 0; i < coords.length; i++) {
-            var o = coords[(i+1) % coords.length],
-                a = coords[i],
-                b = coords[(i+2) % coords.length],
-                res = iD.geo.cross(o, a, b);
-
-            curr = (res > 0) ? 1 : (res < 0) ? -1 : 0;
-            if (curr === 0) {
-                continue;
-            } else if (prev && curr !== prev) {
-                return false;
-            }
-            prev = curr;
-        }
-        return true;
-    },
-
-    isArea: function() {
-        if (this.tags.area === 'yes')
-            return true;
-        if (!this.isClosed() || this.tags.area === 'no')
-            return false;
-        for (var key in this.tags)
-            if (key in iD.areaKeys && !(this.tags[key] in iD.areaKeys[key]))
-                return true;
-        return false;
-    },
-
-    isDegenerate: function() {
-        return _.uniq(this.nodes).length < (this.isArea() ? 3 : 2);
-    },
-
-    areAdjacent: function(n1, n2) {
-        for (var i = 0; i < this.nodes.length; i++) {
-            if (this.nodes[i] === n1) {
-                if (this.nodes[i - 1] === n2) return true;
-                if (this.nodes[i + 1] === n2) return true;
-            }
-        }
-        return false;
-    },
-
-    geometry: function(graph) {
-        return graph.transient(this, 'geometry', function() {
-            return this.isArea() ? 'area' : 'line';
-        });
-    },
-
-    addNode: function(id, index) {
-        var nodes = this.nodes.slice();
-        nodes.splice(index === undefined ? nodes.length : index, 0, id);
-        return this.update({nodes: nodes});
-    },
-
-    updateNode: function(id, index) {
-        var nodes = this.nodes.slice();
-        nodes.splice(index, 1, id);
-        return this.update({nodes: nodes});
-    },
-
-    replaceNode: function(needle, replacement) {
-        if (this.nodes.indexOf(needle) < 0)
-            return this;
-
-        var nodes = this.nodes.slice();
-        for (var i = 0; i < nodes.length; i++) {
-            if (nodes[i] === needle) {
-                nodes[i] = replacement;
-            }
-        }
-        return this.update({nodes: nodes});
-    },
-
-    removeNode: function(id) {
-        var nodes = [];
-
-        for (var i = 0; i < this.nodes.length; i++) {
-            var node = this.nodes[i];
-            if (node !== id && nodes[nodes.length - 1] !== node) {
-                nodes.push(node);
-            }
-        }
-
-        // Preserve circularity
-        if (this.nodes.length > 1 && this.first() === id && this.last() === id && nodes[nodes.length - 1] !== nodes[0]) {
-            nodes.push(nodes[0]);
-        }
-
-        return this.update({nodes: nodes});
-    },
-
-    asJXON: function(changeset_id) {
-        var r = {
-            way: {
-                '@id': this.osmId(),
-                '@version': this.version || 0,
-                nd: _.map(this.nodes, function(id) {
-                    return { keyAttributes: { ref: iD.Entity.id.toOSM(id) } };
-                }),
-                tag: _.map(this.tags, function(v, k) {
-                    return { keyAttributes: { k: k, v: v } };
-                })
-            }
-        };
-        if (changeset_id) r.way['@changeset'] = changeset_id;
-        return r;
-    },
-
-    asGeoJSON: function(resolver) {
-        return resolver.transient(this, 'GeoJSON', function() {
-            var coordinates = _.pluck(resolver.childNodes(this), 'loc');
-            if (this.isArea() && this.isClosed()) {
-                return {
-                    type: 'Polygon',
-                    coordinates: [coordinates]
-                };
-            } else {
-                return {
-                    type: 'LineString',
-                    coordinates: coordinates
-                };
-            }
-        });
-    },
-
-    area: function(resolver) {
-        return resolver.transient(this, 'area', function() {
-            var nodes = resolver.childNodes(this);
-
-            var json = {
-                type: 'Polygon',
-                coordinates: [_.pluck(nodes, 'loc')]
-            };
-
-            if (!this.isClosed() && nodes.length) {
-                json.coordinates[0].push(nodes[0].loc);
-            }
-
-            var area = d3.geo.area(json);
-
-            // Heuristic for detecting counterclockwise winding order. Assumes
-            // that OpenStreetMap polygons are not hemisphere-spanning.
-            if (area > 2 * Math.PI) {
-                json.coordinates[0] = json.coordinates[0].reverse();
-                area = d3.geo.area(json);
-            }
-
-            return isNaN(area) ? 0 : area;
-        });
-    }
-});
-iD.Background = function(context) {
-    var dispatch = d3.dispatch('change'),
-        baseLayer = iD.TileLayer()
-            .projection(context.projection),
-        gpxLayer = iD.GpxLayer(context, dispatch)
-            .projection(context.projection),
-        mapillaryLayer = iD.MapillaryLayer(context),
-        overlayLayers = [];
-
-    var backgroundSources = iD.data.imagery.map(function(source) {
-        if (source.type === 'bing') {
-            return iD.BackgroundSource.Bing(source, dispatch);
-        } else {
-            return iD.BackgroundSource(source);
-        }
-    });
-
-    backgroundSources.unshift(iD.BackgroundSource.None());
-
-    function findSource(id) {
-        return _.find(backgroundSources, function(d) {
-            return d.id && d.id === id;
-        });
-    }
-
-    function updateImagery() {
-        var b = background.baseLayerSource(),
-            o = overlayLayers.map(function (d) { return d.source().id; }).join(','),
-            q = iD.util.stringQs(location.hash.substring(1));
-
-        var id = b.id;
-        if (id === 'custom') {
-            id = 'custom:' + b.template;
-        }
-
-        if (id) {
-            q.background = id;
-        } else {
-            delete q.background;
-        }
-
-        if (o) {
-            q.overlays = o;
-        } else {
-            delete q.overlays;
-        }
-
-        location.replace('#' + iD.util.qsString(q, true));
-
-        var imageryUsed = [b.imageryUsed()];
-
-        overlayLayers.forEach(function (d) {
-            var source = d.source();
-            if (!source.isLocatorOverlay()) {
-                imageryUsed.push(source.imageryUsed());
-            }
-        });
-
-        if (background.showsGpxLayer()) {
-            imageryUsed.push('Local GPX');
-        }
-
-        context.history().imageryUsed(imageryUsed);
-    }
-
-    function background(selection) {
-        var base = selection.selectAll('.background-layer')
-            .data([0]);
-
-        base.enter().insert('div', '.layer-data')
-            .attr('class', 'layer-layer background-layer');
-
-        base.call(baseLayer);
-
-        var gpx = selection.selectAll('.gpx-layer')
-            .data([0]);
-
-        gpx.enter().insert('div', '.layer-data')
-            .attr('class', 'layer-layer gpx-layer');
-
-        gpx.call(gpxLayer);
-
-        var overlays = selection.selectAll('.overlay-layer')
-            .data(overlayLayers, function(d) { return d.source().name(); });
-
-        overlays.enter().insert('div', '.layer-data')
-            .attr('class', 'layer-layer overlay-layer');
-
-        overlays.each(function(layer) {
-            d3.select(this).call(layer);
-        });
-
-        overlays.exit()
-            .remove();
-
-        var mapillary = selection.selectAll('.layer-mapillary')
-            .data([0]);
-
-        mapillary.enter().insert('div')
-            .attr('class', 'layer-layer layer-mapillary');
-
-        mapillary.call(mapillaryLayer);
-    }
-
-    background.sources = function(extent) {
-        return backgroundSources.filter(function(source) {
-            return source.intersects(extent);
-        });
-    };
-
-    background.dimensions = function(_) {
-        baseLayer.dimensions(_);
-        gpxLayer.dimensions(_);
-        mapillaryLayer.dimensions(_);
-
-        overlayLayers.forEach(function(layer) {
-            layer.dimensions(_);
-        });
-    };
-
-    background.baseLayerSource = function(d) {
-        if (!arguments.length) return baseLayer.source();
-
-        baseLayer.source(d);
-        dispatch.change();
-        updateImagery();
-
-        return background;
-    };
-
-    background.bing = function() {
-        background.baseLayerSource(findSource('Bing'));
-    };
-
-    background.hasGpxLayer = function() {
-        return !_.isEmpty(gpxLayer.geojson());
-    };
-
-    background.showsGpxLayer = function() {
-        return background.hasGpxLayer() && gpxLayer.enable();
-    };
-
-    function toDom(x) {
-        return (new DOMParser()).parseFromString(x, 'text/xml');
-    }
-
-    background.gpxLayerFiles = function(fileList) {
-        var f = fileList[0],
-            reader = new FileReader();
-
-        reader.onload = function(e) {
-            gpxLayer.geojson(toGeoJSON.gpx(toDom(e.target.result)));
-            background.zoomToGpxLayer();
-            dispatch.change();
-        };
-
-        reader.readAsText(f);
-    };
-
-    background.zoomToGpxLayer = function() {
-        if (background.hasGpxLayer()) {
-            var viewport = context.map().extent().polygon(),
-                coords = _.reduce(gpxLayer.geojson().features, function(coords, feature) {
-                    var c = feature.geometry.coordinates;
-                    return _.union(coords, feature.geometry.type === 'Point' ? [c] : c);
-                }, []);
-
-            if (!iD.geo.polygonIntersectsPolygon(viewport, coords)) {
-                context.map().extent(d3.geo.bounds(gpxLayer.geojson()));
-            }
-        }
-    };
-
-    background.toggleGpxLayer = function() {
-        gpxLayer.enable(!gpxLayer.enable());
-        dispatch.change();
-    };
-
-    background.showsMapillaryLayer = function() {
-        return mapillaryLayer.enable();
-    };
-
-    background.toggleMapillaryLayer = function() {
-        mapillaryLayer.enable(!mapillaryLayer.enable());
-        dispatch.change();
-    };
-
-    background.showsLayer = function(d) {
-        return d === baseLayer.source() ||
-            (d.id === 'custom' && baseLayer.source().id === 'custom') ||
-            overlayLayers.some(function(l) { return l.source() === d; });
-    };
-
-    background.overlayLayerSources = function() {
-        return overlayLayers.map(function (l) { return l.source(); });
-    };
-
-    background.toggleOverlayLayer = function(d) {
-        var layer;
-
-        for (var i = 0; i < overlayLayers.length; i++) {
-            layer = overlayLayers[i];
-            if (layer.source() === d) {
-                overlayLayers.splice(i, 1);
-                dispatch.change();
-                updateImagery();
-                return;
-            }
-        }
-
-        layer = iD.TileLayer()
-            .source(d)
-            .projection(context.projection)
-            .dimensions(baseLayer.dimensions());
-
-        overlayLayers.push(layer);
-        dispatch.change();
-        updateImagery();
-    };
-
-    background.nudge = function(d, zoom) {
-        baseLayer.source().nudge(d, zoom);
-        dispatch.change();
-        return background;
-    };
-
-    background.offset = function(d) {
-        if (!arguments.length) return baseLayer.source().offset();
-        baseLayer.source().offset(d);
-        dispatch.change();
-        return background;
-    };
-
-    var q = iD.util.stringQs(location.hash.substring(1)),
-        chosen = q.background || q.layer;
-
-    if (chosen && chosen.indexOf('custom:') === 0) {
-        background.baseLayerSource(iD.BackgroundSource.Custom(chosen.replace(/^custom:/, '')));
-    } else {
-        background.baseLayerSource(findSource(chosen) || findSource('Bing'));
-    }
-
-    var locator = _.find(backgroundSources, function(d) {
-        return d.overlay && d.default;
-    });
-
-    if (locator) {
-        background.toggleOverlayLayer(locator);
-    }
-
-    var overlays = (q.overlays || '').split(',');
-    overlays.forEach(function(overlay) {
-        overlay = findSource(overlay);
-        if (overlay) background.toggleOverlayLayer(overlay);
-    });
-
-    var gpx = q.gpx;
-    if (gpx) {
-        d3.text(gpx, function(err, gpxTxt) {
-            gpxLayer.geojson(toGeoJSON.gpx(toDom(gpxTxt)));
-            dispatch.change();
-        });
-    }
-
-    return d3.rebind(background, dispatch, 'on');
-};
-iD.BackgroundSource = function(data) {
-    var source = _.clone(data),
-        offset = [0, 0],
-        name = source.name;
-
-    source.scaleExtent = data.scaleExtent || [0, 20];
-
-    source.offset = function(_) {
-        if (!arguments.length) return offset;
-        offset = _;
-        return source;
-    };
-
-    source.nudge = function(_, zoomlevel) {
-        offset[0] += _[0] / Math.pow(2, zoomlevel);
-        offset[1] += _[1] / Math.pow(2, zoomlevel);
-        return source;
-    };
-
-    source.name = function() {
-        return name;
-    };
-
-    source.imageryUsed = function() {
-        return source.id || name;
-    };
-
-    source.url = function(coord) {
-        return data.template
-            .replace('{x}', coord[0])
-            .replace('{y}', coord[1])
-            // TMS-flipped y coordinate
-            .replace(/\{[t-]y\}/, Math.pow(2, coord[2]) - coord[1] - 1)
-            .replace(/\{z(oom)?\}/, coord[2])
-            .replace(/\{switch:([^}]+)\}/, function(s, r) {
-                var subdomains = r.split(',');
-                return subdomains[(coord[0] + coord[1]) % subdomains.length];
-            })
-            .replace('{u}', function() {
-                var u = '';
-                for (var zoom = coord[2]; zoom > 0; zoom--) {
-                    var b = 0;
-                    var mask = 1 << (zoom - 1);
-                    if ((coord[0] & mask) !== 0) b++;
-                    if ((coord[1] & mask) !== 0) b += 2;
-                    u += b.toString();
-                }
-                return u;
-            });
-    };
-
-    source.intersects = function(extent) {
-        extent = extent.polygon();
-        return !data.polygon || data.polygon.some(function(polygon) {
-            return iD.geo.polygonIntersectsPolygon(polygon, extent);
-        });
-    };
-
-    source.validZoom = function(z) {
-        return source.scaleExtent[0] <= z &&
-            (!source.isLocatorOverlay() || source.scaleExtent[1] > z);
-    };
-
-    source.isLocatorOverlay = function() {
-        return name === 'Locator Overlay';
-    };
-
-    source.copyrightNotices = function() {};
-
-    return source;
-};
-
-iD.BackgroundSource.Bing = function(data, dispatch) {
-    // http://msdn.microsoft.com/en-us/library/ff701716.aspx
-    // http://msdn.microsoft.com/en-us/library/ff701701.aspx
-
-    data.template = 'https://ecn.t{switch:0,1,2,3}.tiles.virtualearth.net/tiles/a{u}.jpeg?g=587&mkt=en-gb&n=z';
-
-    var bing = iD.BackgroundSource(data),
-        key = 'Arzdiw4nlOJzRwOz__qailc8NiR31Tt51dN2D7cm57NrnceZnCpgOkmJhNpGoppU', // Same as P2 and JOSM
-        url = 'https://dev.virtualearth.net/REST/v1/Imagery/Metadata/Aerial?include=ImageryProviders&key=' +
-            key + '&jsonp={callback}',
-        providers = [];
-
-    d3.jsonp(url, function(json) {
-        providers = json.resourceSets[0].resources[0].imageryProviders.map(function(provider) {
-            return {
-                attribution: provider.attribution,
-                areas: provider.coverageAreas.map(function(area) {
-                    return {
-                        zoom: [area.zoomMin, area.zoomMax],
-                        extent: iD.geo.Extent([area.bbox[1], area.bbox[0]], [area.bbox[3], area.bbox[2]])
-                    };
-                })
-            };
-        });
-        dispatch.change();
-    });
-
-    bing.copyrightNotices = function(zoom, extent) {
-        zoom = Math.min(zoom, 21);
-        return providers.filter(function(provider) {
-            return _.any(provider.areas, function(area) {
-                return extent.intersects(area.extent) &&
-                    area.zoom[0] <= zoom &&
-                    area.zoom[1] >= zoom;
-            });
-        }).map(function(provider) {
-            return provider.attribution;
-        }).join(', ');
-    };
-
-    bing.logo = 'bing_maps.png';
-    bing.terms_url = 'http://opengeodata.org/microsoft-imagery-details';
-
-    return bing;
-};
-
-iD.BackgroundSource.None = function() {
-    var source = iD.BackgroundSource({id: 'none', template: ''});
-
-    source.name = function() {
-        return t('background.none');
-    };
-
-    source.imageryUsed = function() {
-        return 'None';
-    };
-
-    return source;
-};
-
-iD.BackgroundSource.Custom = function(template) {
-    var source = iD.BackgroundSource({id: 'custom', template: template});
-
-    source.name = function() {
-        return t('background.custom');
-    };
-
-    source.imageryUsed = function() {
-        return 'Custom (' + template + ')';
-    };
-
-    return source;
-};
-iD.GpxLayer = function(context) {
-    var projection,
-        gj = {},
-        enable = true,
-        svg;
-
-    function render(selection) {
-        svg = selection.selectAll('svg')
-            .data([render]);
-
-        svg.enter()
-            .append('svg');
-
-        svg.style('display', enable ? 'block' : 'none');
-
-        var paths = svg
-            .selectAll('path')
-            .data([gj]);
-
-        paths
-            .enter()
-            .append('path')
-            .attr('class', 'gpx');
-
-        var path = d3.geo.path()
-            .projection(projection);
-
-        paths
-            .attr('d', path);
-
-        if (typeof gj.features !== 'undefined') {
-            svg
-                .selectAll('text')
-                .remove();
-
-            svg
-                .selectAll('path')
-                .data(gj.features)
-                .enter()
-                .append('text')
-                .attr('class', 'gpx')
-                .text(function(d) {
-                    return d.properties.desc || d.properties.name;
-                })
-                .attr('x', function(d) {
-                    var centroid = path.centroid(d);
-                    return centroid[0] + 5;
-                })
-                .attr('y', function(d) {
-                    var centroid = path.centroid(d);
-                    return centroid[1];
-                });
-        }
-    }
-
-    render.projection = function(_) {
-        if (!arguments.length) return projection;
-        projection = _;
-        return render;
-    };
-
-    render.enable = function(_) {
-        if (!arguments.length) return enable;
-        enable = _;
-        return render;
-    };
-
-    render.geojson = function(_) {
-        if (!arguments.length) return gj;
-        gj = _;
-        return render;
-    };
-
-    render.dimensions = function(_) {
-        if (!arguments.length) return svg.dimensions();
-        svg.dimensions(_);
-        return render;
-    };
-
-    render.id = 'layer-gpx';
-
-    function over() {
-        d3.event.stopPropagation();
-        d3.event.preventDefault();
-        d3.event.dataTransfer.dropEffect = 'copy';
-    }
-
-    d3.select('body')
-        .attr('dropzone', 'copy')
-        .on('drop.localgpx', function() {
-            d3.event.stopPropagation();
-            d3.event.preventDefault();
-            if (!iD.detect().filedrop) return;
-            context.background().gpxLayerFiles(d3.event.dataTransfer.files);
-        })
-        .on('dragenter.localgpx', over)
-        .on('dragexit.localgpx', over)
-        .on('dragover.localgpx', over);
-
-    return render;
-};
-iD.Map = function(context) {
-    var dimensions = [1, 1],
-        dispatch = d3.dispatch('move', 'drawn'),
-        projection = context.projection,
-        roundedProjection = iD.svg.RoundProjection(projection),
-        zoom = d3.behavior.zoom()
-            .translate(projection.translate())
-            .scale(projection.scale() * 2 * Math.PI)
-            .scaleExtent([1024, 256 * Math.pow(2, 24)])
-            .on('zoom', zoomPan),
-        dblclickEnabled = true,
-        transformStart,
-        transformed = false,
-        minzoom = 0,
-        points = iD.svg.Points(roundedProjection, context),
-        vertices = iD.svg.Vertices(roundedProjection, context),
-        lines = iD.svg.Lines(projection),
-        areas = iD.svg.Areas(projection),
-        midpoints = iD.svg.Midpoints(roundedProjection, context),
-        labels = iD.svg.Labels(projection, context),
-        supersurface, surface,
-        mouse,
-        mousemove;
-
-    function map(selection) {
-        context.history()
-            .on('change.map', redraw);
-        context.background()
-            .on('change.map', redraw);
-
-        selection.call(zoom);
-
-        supersurface = selection.append('div')
-            .attr('id', 'supersurface');
-
-        // Need a wrapper div because Opera can't cope with an absolutely positioned
-        // SVG element: http://bl.ocks.org/jfirebaugh/6fbfbd922552bf776c16
-        var dataLayer = supersurface.append('div')
-            .attr('class', 'layer-layer layer-data');
-
-        map.surface = surface = dataLayer.append('svg')
-            .on('mousedown.zoom', function() {
-                if (d3.event.button === 2) {
-                    d3.event.stopPropagation();
-                }
-            }, true)
-            .on('mouseup.zoom', function() {
-                if (resetTransform()) redraw();
-            })
-            .attr('id', 'surface')
-            .call(iD.svg.Surface(context));
-
-        supersurface.call(context.background());
-
-        surface.on('mousemove.map', function() {
-            mousemove = d3.event;
-        });
-
-        surface.on('mouseover.vertices', function() {
-            if (map.editable() && !transformed) {
-                var hover = d3.event.target.__data__;
-                surface.call(vertices.drawHover, context.graph(), hover, map.extent(), map.zoom());
-                dispatch.drawn({full: false});
-            }
-        });
-
-        surface.on('mouseout.vertices', function() {
-            if (map.editable() && !transformed) {
-                var hover = d3.event.relatedTarget && d3.event.relatedTarget.__data__;
-                surface.call(vertices.drawHover, context.graph(), hover, map.extent(), map.zoom());
-                dispatch.drawn({full: false});
-            }
-        });
-
-        context.on('enter.map', function() {
-            if (map.editable() && !transformed) {
-                var all = context.intersects(map.extent()),
-                    filter = d3.functor(true),
-                    graph = context.graph();
-                surface.call(vertices, graph, all, filter, map.extent(), map.zoom());
-                surface.call(midpoints, graph, all, filter, map.trimmedExtent());
-                dispatch.drawn({full: false});
-            }
-        });
-
-        map.dimensions(selection.dimensions());
-
-        labels.supersurface(supersurface);
-    }
-
-    function pxCenter() { return [dimensions[0] / 2, dimensions[1] / 2]; }
-
-    function drawVector(difference, extent) {
-        var filter, all,
-            graph = context.graph();
-
-        if (difference) {
-            var complete = difference.complete(map.extent());
-            all = _.compact(_.values(complete));
-            filter = function(d) { return d.id in complete; };
-
-        } else if (extent) {
-            all = context.intersects(map.extent().intersection(extent));
-            var set = d3.set(_.pluck(all, 'id'));
-            filter = function(d) { return set.has(d.id); };
-
-        } else {
-            all = context.intersects(map.extent());
-            filter = d3.functor(true);
-        }
-
-        surface
-            .call(vertices, graph, all, filter, map.extent(), map.zoom())
-            .call(lines, graph, all, filter)
-            .call(areas, graph, all, filter)
-            .call(midpoints, graph, all, filter, map.trimmedExtent())
-            .call(labels, graph, all, filter, dimensions, !difference && !extent);
-
-        if (points.points(context.intersects(map.extent()), 100).length >= 100) {
-            surface.select('.layer-hit').selectAll('g.point').remove();
-        } else {
-            surface.call(points, points.points(all), filter);
-        }
-
-        dispatch.drawn({full: true});
-    }
-
-    function editOff() {
-        var mode = context.mode();
-        surface.selectAll('.layer *').remove();
-        dispatch.drawn({full: true});
-        if (!(mode && mode.id === 'browse')) {
-            context.enter(iD.modes.Browse(context));
-        }
-    }
-
-    function zoomPan() {
-        if (d3.event && d3.event.sourceEvent.type === 'dblclick') {
-            if (!dblclickEnabled) {
-                zoom.scale(projection.scale() * 2 * Math.PI)
-                    .translate(projection.translate());
-                return d3.event.sourceEvent.preventDefault();
-            }
-        }
-
-        if (Math.log(d3.event.scale / Math.LN2 - 8) < minzoom + 1) {
-            iD.ui.flash(context.container())
-                .select('.content')
-                .text(t('cannot_zoom'));
-            return setZoom(16, true);
-        }
-
-        projection
-            .translate(d3.event.translate)
-            .scale(d3.event.scale / (2 * Math.PI));
-
-        var scale = d3.event.scale / transformStart[0],
-            tX = Math.round((d3.event.translate[0] / scale - transformStart[1][0]) * scale),
-            tY = Math.round((d3.event.translate[1] / scale - transformStart[1][1]) * scale);
-
-        transformed = true;
-        iD.util.setTransform(supersurface, tX, tY, scale);
-        queueRedraw();
-
-        dispatch.move(map);
-    }
-
-    function resetTransform() {
-        if (!transformed) return false;
-        iD.util.setTransform(supersurface, 0, 0);
-        transformed = false;
-        return true;
-    }
-
-    function redraw(difference, extent) {
-
-        if (!surface) return;
-
-        clearTimeout(timeoutId);
-
-        // If we are in the middle of a zoom/pan, we can't do differenced redraws.
-        // It would result in artifacts where differenced entities are redrawn with
-        // one transform and unchanged entities with another.
-        if (resetTransform()) {
-            difference = extent = undefined;
-        }
-
-        var zoom = String(~~map.zoom());
-        if (surface.attr('data-zoom') !== zoom) {
-            surface.attr('data-zoom', zoom)
-                .classed('low-zoom', zoom <= 16);
-        }
-
-        if (!difference) {
-            supersurface.call(context.background());
-        }
-
-        if (map.editable()) {
-            context.connection().loadTiles(projection, dimensions);
-            drawVector(difference, extent);
-        } else {
-            editOff();
-        }
-
-        transformStart = [
-            projection.scale() * 2 * Math.PI,
-            projection.translate().slice()];
-
-        return map;
-    }
-
-    var timeoutId;
-    function queueRedraw() {
-        clearTimeout(timeoutId);
-        timeoutId = setTimeout(function() { redraw(); }, 300);
-    }
-
-    function pointLocation(p) {
-        var translate = projection.translate(),
-            scale = projection.scale() * 2 * Math.PI;
-        return [(p[0] - translate[0]) / scale, (p[1] - translate[1]) / scale];
-    }
-
-    function locationPoint(l) {
-        var translate = projection.translate(),
-            scale = projection.scale() * 2 * Math.PI;
-        return [l[0] * scale + translate[0], l[1] * scale + translate[1]];
-    }
-
-    map.mouse = function() {
-        var e = mousemove || d3.event, s;
-        while ((s = e.sourceEvent)) e = s;
-        return mouse(e);
-    };
-
-    map.mouseCoordinates = function() {
-        return projection.invert(map.mouse());
-    };
-
-    map.dblclickEnable = function(_) {
-        if (!arguments.length) return dblclickEnabled;
-        dblclickEnabled = _;
-        return map;
-    };
-
-    function setZoom(_, force) {
-        if (_ === map.zoom() && !force)
-            return false;
-        var scale = 256 * Math.pow(2, _),
-            center = pxCenter(),
-            l = pointLocation(center);
-        scale = Math.max(1024, Math.min(256 * Math.pow(2, 24), scale));
-        projection.scale(scale / (2 * Math.PI));
-        zoom.scale(scale);
-        var t = projection.translate();
-        l = locationPoint(l);
-        t[0] += center[0] - l[0];
-        t[1] += center[1] - l[1];
-        projection.translate(t);
-        zoom.translate(projection.translate());
-        return true;
-    }
-
-    function setCenter(_) {
-        var c = map.center();
-        if (_[0] === c[0] && _[1] === c[1])
-            return false;
-        var t = projection.translate(),
-            pxC = pxCenter(),
-            ll = projection(_);
-        projection.translate([
-            t[0] - ll[0] + pxC[0],
-            t[1] - ll[1] + pxC[1]]);
-        zoom.translate(projection.translate());
-        return true;
-    }
-
-    map.pan = function(d) {
-        var t = projection.translate();
-        t[0] += d[0];
-        t[1] += d[1];
-        projection.translate(t);
-        zoom.translate(projection.translate());
-        dispatch.move(map);
-        return redraw();
-    };
-
-    map.dimensions = function(_) {
-        if (!arguments.length) return dimensions;
-        var center = map.center();
-        dimensions = _;
-        surface.dimensions(dimensions);
-        context.background().dimensions(dimensions);
-        projection.clipExtent([[0, 0], dimensions]);
-        mouse = iD.util.fastMouse(supersurface.node());
-        setCenter(center);
-        return redraw();
-    };
-
-    map.zoomIn = function() { return map.zoom(~~map.zoom() + 1); };
-    map.zoomOut = function() { return map.zoom(~~map.zoom() - 1); };
-
-    map.center = function(loc) {
-        if (!arguments.length) {
-            return projection.invert(pxCenter());
-        }
-
-        if (setCenter(loc)) {
-            dispatch.move(map);
-        }
-
-        return redraw();
-    };
-
-    map.zoom = function(z) {
-        if (!arguments.length) {
-            return Math.max(Math.log(projection.scale() * 2 * Math.PI) / Math.LN2 - 8, 0);
-        }
-
-        if (setZoom(z)) {
-            dispatch.move(map);
-        }
-
-        return redraw();
-    };
-
-    map.zoomTo = function(entity, zoomLimits) {
-        var extent = entity.extent(context.graph()),
-            zoom = map.extentZoom(extent);
-        zoomLimits = zoomLimits || [16, 20];
-        map.centerZoom(extent.center(), Math.min(Math.max(zoom, zoomLimits[0]), zoomLimits[1]));
-    };
-
-    map.centerZoom = function(loc, z) {
-        var centered = setCenter(loc),
-            zoomed   = setZoom(z);
-
-        if (centered || zoomed) {
-            dispatch.move(map);
-        }
-
-        return redraw();
-    };
-
-    map.centerEase = function(loc) {
-        var from = map.center().slice(),
-            t = 0,
-            stop;
-
-        surface.one('mousedown.ease', function() {
-            stop = true;
-        });
-
-        d3.timer(function() {
-            if (stop) return true;
-            map.center(iD.geo.interp(from, loc, (t += 1) / 10));
-            return t === 10;
-        }, 20);
-        return map;
-    };
-
-    map.extent = function(_) {
-        if (!arguments.length) {
-            return new iD.geo.Extent(projection.invert([0, dimensions[1]]),
-                                 projection.invert([dimensions[0], 0]));
-        } else {
-            var extent = iD.geo.Extent(_);
-            map.centerZoom(extent.center(), map.extentZoom(extent));
-        }
-    };
-
-    map.trimmedExtent = function() {
-        var headerY = 60, footerY = 30, pad = 10;
-        return new iD.geo.Extent(projection.invert([pad, dimensions[1] - footerY - pad]),
-                projection.invert([dimensions[0] - pad, headerY + pad]));
-    };
-
-    map.extentZoom = function(_) {
-        var extent = iD.geo.Extent(_),
-            tl = projection([extent[0][0], extent[1][1]]),
-            br = projection([extent[1][0], extent[0][1]]);
-
-        // Calculate maximum zoom that fits extent
-        var hFactor = (br[0] - tl[0]) / dimensions[0],
-            vFactor = (br[1] - tl[1]) / dimensions[1],
-            hZoomDiff = Math.log(Math.abs(hFactor)) / Math.LN2,
-            vZoomDiff = Math.log(Math.abs(vFactor)) / Math.LN2,
-            newZoom = map.zoom() - Math.max(hZoomDiff, vZoomDiff);
-
-        return newZoom;
-    };
-
-    map.editable = function() {
-        return map.zoom() >= 16;
-    };
-
-    map.minzoom = function(_) {
-        if (!arguments.length) return minzoom;
-        minzoom = _;
-        return map;
-    };
-
-    return d3.rebind(map, dispatch, 'on');
-};
-iD.MapillaryLayer = function (context) {
-    var enable = false,
-        currentImage,
-        svg, div, request;
-
-    function show(image) {
-        svg.selectAll('g')
-            .classed('selected', function(d) {
-                return currentImage && d.key === currentImage.key;
-            });
-
-        div.classed('hidden', false)
-            .classed('temp', image !== currentImage);
-
-        div.selectAll('img')
-            .attr('src', 'https://d1cuyjsrcm0gby.cloudfront.net/' + image.key + '/thumb-320.jpg');
-
-        div.selectAll('a')
-            .attr('href', 'http://mapillary.com/map/im/' + image.key);
-    }
-
-    function hide() {
-        currentImage = undefined;
-
-        svg.selectAll('g')
-            .classed('selected', false);
-
-        div.classed('hidden', true);
-    }
-
-    function transform(image) {
-        var t = 'translate(' + context.projection(image.loc) + ')';
-        if (image.ca) t += 'rotate(' + image.ca + ',0,0)';
-        return t;
-    }
-
-    function render(selection) {
-        svg = selection.selectAll('svg')
-            .data([0]);
-
-        svg.enter().append('svg')
-            .on('click', function() {
-                var image = d3.event.target.__data__;
-                if (currentImage === image) {
-                    hide();
-                } else {
-                    currentImage = image;
-                    show(image);
-                }
-            })
-            .on('mouseover', function() {
-                show(d3.event.target.__data__);
-            })
-            .on('mouseout', function() {
-                if (currentImage) {
-                    show(currentImage);
-                } else {
-                    hide();
-                }
-            });
-
-        svg.style('display', enable ? 'block' : 'none');
-
-        div = context.container().selectAll('.mapillary-image')
-            .data([0]);
-
-        var enter = div.enter().append('div')
-            .attr('class', 'mapillary-image');
-
-        enter.append('button')
-            .on('click', hide)
-            .append('div')
-            .attr('class', 'icon close');
-
-        enter.append('img');
-
-        var link = enter.append('a')
-            .attr('class', 'link')
-            .attr('target', '_blank');
-
-        link.append('span')
-            .attr('class', 'icon icon-pre-text out-link');
-
-        link.append('span')
-            .text(t('mapillary.view_on_mapillary'));
-
-        if (!enable) {
-            hide();
-
-            svg.selectAll('g')
-                .remove();
-
-            return;
-        }
-
-        // Update existing images while waiting for new ones to load.
-        svg.selectAll('g')
-            .attr('transform', transform);
-
-        var extent = context.map().extent();
-
-        if (request)
-            request.abort();
-
-        request = d3.json('https://mapillary-read-api.herokuapp.com/v1/s/search?min-lat=' +
-            extent[0][1] + '&max-lat=' + extent[1][1] + '&min-lon=' +
-            extent[0][0] + '&max-lon=' + extent[1][0] + '&max-results=100&geojson=true',
-            function (error, data) {
-                if (error) return;
-
-                var images = [];
-
-                for (var i = 0; i < data.features.length; i++) {
-                    var sequence = data.features[i];
-                    for (var j = 0; j < sequence.geometry.coordinates.length; j++) {
-                        images.push({
-                            key: sequence.properties.keys[j],
-                            ca: sequence.properties.cas[j],
-                            loc: sequence.geometry.coordinates[j]
-                        });
-                        if (images.length >= 1000) break;
-                    }
-                }
-
-                var g = svg.selectAll('g')
-                    .data(images, function(d) { return d.key; });
-
-                var enter = g.enter().append('g')
-                    .attr('class', 'image');
-
-                enter.append('path')
-                    .attr('d', 'M 0,-5 l 0,-20 l -5,30 l 10,0 l -5,-30');
-
-                enter.append('circle')
-                    .attr('dx', '0')
-                    .attr('dy', '0')
-                    .attr('r', '8');
-
-                g.attr('transform', transform);
-
-                g.exit()
-                    .remove();
-            });
-    }
-
-    render.enable = function(_) {
-        if (!arguments.length) return enable;
-        enable = _;
-        return render;
-    };
-
-    render.dimensions = function(_) {
-        if (!arguments.length) return svg.dimensions();
-        svg.dimensions(_);
-        return render;
-    };
-
-    return render;
-};
-iD.TileLayer = function() {
-    var tileSize = 256,
-        tile = d3.geo.tile(),
-        projection,
-        cache = {},
-        tileOrigin,
-        z,
-        transformProp = iD.util.prefixCSSProperty('Transform'),
-        source = d3.functor('');
-
-    function tileSizeAtZoom(d, z) {
-        return Math.ceil(tileSize * Math.pow(2, z - d[2])) / tileSize;
-    }
-
-    function atZoom(t, distance) {
-        var power = Math.pow(2, distance);
-        return [
-            Math.floor(t[0] * power),
-            Math.floor(t[1] * power),
-            t[2] + distance];
-    }
-
-    function lookUp(d) {
-        for (var up = -1; up > -d[2]; up--) {
-            var tile = atZoom(d, up);
-            if (cache[source.url(tile)] !== false) {
-                return tile;
-            }
-        }
-    }
-
-    function uniqueBy(a, n) {
-        var o = [], seen = {};
-        for (var i = 0; i < a.length; i++) {
-            if (seen[a[i][n]] === undefined) {
-                o.push(a[i]);
-                seen[a[i][n]] = true;
-            }
-        }
-        return o;
-    }
-
-    function addSource(d) {
-        d.push(source.url(d));
-        return d;
-    }
-
-    // Update tiles based on current state of `projection`.
-    function background(selection) {
-        tile.scale(projection.scale() * 2 * Math.PI)
-            .translate(projection.translate());
-
-        tileOrigin = [
-            projection.scale() * Math.PI - projection.translate()[0],
-            projection.scale() * Math.PI - projection.translate()[1]];
-
-        z = Math.max(Math.log(projection.scale() * 2 * Math.PI) / Math.log(2) - 8, 0);
-
-        render(selection);
-    }
-
-    // Derive the tiles onscreen, remove those offscreen and position them.
-    // Important that this part not depend on `projection` because it's
-    // rentered when tiles load/error (see #644).
-    function render(selection) {
-        var requests = [];
-
-        if (source.validZoom(z)) {
-            tile().forEach(function(d) {
-                addSource(d);
-                if (d[3] === '') return;
-                if (typeof d[3] !== 'string') return; // Workaround for chrome crash https://github.com/openstreetmap/iD/issues/2295
-                requests.push(d);
-                if (cache[d[3]] === false && lookUp(d)) {
-                    requests.push(addSource(lookUp(d)));
-                }
-            });
-
-            requests = uniqueBy(requests, 3).filter(function(r) {
-                // don't re-request tiles which have failed in the past
-                return cache[r[3]] !== false;
-            });
-        }
-
-        var pixelOffset = [
-            Math.round(source.offset()[0] * Math.pow(2, z)),
-            Math.round(source.offset()[1] * Math.pow(2, z))
-        ];
-
-        function load(d) {
-            cache[d[3]] = true;
-            d3.select(this)
-                .on('error', null)
-                .on('load', null)
-                .classed('tile-loaded', true);
-            render(selection);
-        }
-
-        function error(d) {
-            cache[d[3]] = false;
-            d3.select(this)
-                .on('error', null)
-                .on('load', null)
-                .remove();
-            render(selection);
-        }
-
-        function imageTransform(d) {
-            var _ts = tileSize * Math.pow(2, z - d[2]);
-            var scale = tileSizeAtZoom(d, z);
-            return 'translate(' +
-                (Math.round((d[0] * _ts) - tileOrigin[0]) + pixelOffset[0]) + 'px,' +
-                (Math.round((d[1] * _ts) - tileOrigin[1]) + pixelOffset[1]) + 'px)' +
-                'scale(' + scale + ',' + scale + ')';
-        }
-
-        var image = selection
-            .selectAll('img')
-            .data(requests, function(d) { return d[3]; });
-
-        image.exit()
-            .style(transformProp, imageTransform)
-            .classed('tile-removing', true)
-            .each(function() {
-                var tile = d3.select(this);
-                window.setTimeout(function() {
-                    if (tile.classed('tile-removing')) {
-                        tile.remove();
-                    }
-                }, 300);
-            });
-
-        image.enter().append('img')
-            .attr('class', 'tile')
-            .attr('src', function(d) { return d[3]; })
-            .on('error', error)
-            .on('load', load);
-
-        image
-            .style(transformProp, imageTransform)
-            .classed('tile-removing', false);
-    }
-
-    background.projection = function(_) {
-        if (!arguments.length) return projection;
-        projection = _;
-        return background;
-    };
-
-    background.dimensions = function(_) {
-        if (!arguments.length) return tile.size();
-        tile.size(_);
-        return background;
-    };
-
-    background.source = function(_) {
-        if (!arguments.length) return source;
-        source = _;
-        cache = {};
-        tile.scaleExtent(source.scaleExtent);
-        return background;
-    };
-
-    return background;
-};
-iD.svg = {
-    RoundProjection: function(projection) {
-        return function(d) {
-            return iD.geo.roundCoords(projection(d));
-        };
-    },
-
-    PointTransform: function(projection) {
-        return function(entity) {
-            // http://jsperf.com/short-array-join
-            var pt = projection(entity.loc);
-            return 'translate(' + pt[0] + ',' + pt[1] + ')';
-        };
-    },
-
-    Round: function () {
-        return d3.geo.transform({
-            point: function(x, y) { return this.stream.point(Math.floor(x), Math.floor(y)); }
-        });
-    },
-
-    Path: function(projection, graph, polygon) {
-        var cache = {},
-            round = iD.svg.Round().stream,
-            clip = d3.geo.clipExtent().extent(projection.clipExtent()).stream,
-            project = projection.stream,
-            path = d3.geo.path()
-                .projection({stream: function(output) { return polygon ? project(round(output)) : project(clip(round(output))); }});
-
-        return function(entity) {
-            if (entity.id in cache) {
-                return cache[entity.id];
-            } else {
-                return cache[entity.id] = path(entity.asGeoJSON(graph)); // jshint ignore:line
-            }
-        };
-    },
-
-    OneWaySegments: function(projection, graph, dt) {
-        return function(entity) {
-            var a,
-                b,
-                i = 0,
-                offset = dt,
-                segments = [],
-                viewport = iD.geo.Extent(projection.clipExtent()),
-                coordinates = graph.childNodes(entity).map(function(n) {
-                    return n.loc;
-                });
-
-            if (entity.tags.oneway === '-1') coordinates.reverse();
-
-            d3.geo.stream({
-                type: 'LineString',
-                coordinates: coordinates
-            }, projection.stream({
-                lineStart: function() {},
-                lineEnd: function() {
-                    a = null;
-                },
-                point: function(x, y) {
-                    b = [x, y];
-
-                    if (a) {
-                        var extent = iD.geo.Extent(a).extend(b),
-                            span = iD.geo.euclideanDistance(a, b) - offset;
-
-                        if (extent.intersects(viewport) && span >= 0) {
-                            var angle = Math.atan2(b[1] - a[1], b[0] - a[0]),
-                                dx = dt * Math.cos(angle),
-                                dy = dt * Math.sin(angle),
-                                p = [a[0] + offset * Math.cos(angle),
-                                     a[1] + offset * Math.sin(angle)];
-
-                            var segment = 'M' + a[0] + ',' + a[1] +
-                                          'L' + p[0] + ',' + p[1];
-
-                            for (span -= dt; span >= 0; span -= dt) {
-                                p[0] += dx;
-                                p[1] += dy;
-                                segment += 'L' + p[0] + ',' + p[1];
-                            }
-
-                            segment += 'L' + b[0] + ',' + b[1];
-                            segments.push({id: entity.id, index: i, d: segment});
-                        }
-
-                        offset = -span;
-                        i++;
-                    }
-
-                    a = b;
-                }
-            }));
-
-            return segments;
-        };
-    },
-
-    MultipolygonMemberTags: function(graph) {
-        return function(entity) {
-            var tags = entity.tags;
-            graph.parentRelations(entity).forEach(function(relation) {
-                if (relation.isMultipolygon()) {
-                    tags = _.extend({}, relation.tags, tags);
-                }
-            });
-            return tags;
-        };
-    }
-};
-iD.svg.Areas = function(projection) {
-    // Patterns only work in Firefox when set directly on element.
-    // (This is not a bug: https://bugzilla.mozilla.org/show_bug.cgi?id=750632)
-    var patterns = {
-        wetland: 'wetland',
-        beach: 'beach',
-        scrub: 'scrub',
-        construction: 'construction',
-        military: 'construction',
-        cemetery: 'cemetery',
-        grave_yard: 'cemetery',
-        meadow: 'meadow',
-        farm: 'farmland',
-        farmland: 'farmland',
-        orchard: 'orchard'
-    };
-
-    var patternKeys = ['landuse', 'natural', 'amenity'];
-
-    var clipped = ['residential', 'commercial', 'retail', 'industrial'];
-
-    function clip(entity) {
-        return clipped.indexOf(entity.tags.landuse) !== -1;
-    }
-
-    function setPattern(d) {
-        for (var i = 0; i < patternKeys.length; i++) {
-            if (patterns.hasOwnProperty(d.tags[patternKeys[i]])) {
-                this.style.fill = 'url("#pattern-' + patterns[d.tags[patternKeys[i]]] + '")';
-                return;
-            }
-        }
-        this.style.fill = '';
-    }
-
-    return function drawAreas(surface, graph, entities, filter) {
-        var path = iD.svg.Path(projection, graph, true),
-            areas = {},
-            multipolygon;
-
-        for (var i = 0; i < entities.length; i++) {
-            var entity = entities[i];
-            if (entity.geometry(graph) !== 'area') continue;
-
-            multipolygon = iD.geo.isSimpleMultipolygonOuterMember(entity, graph);
-            if (multipolygon) {
-                areas[multipolygon.id] = {
-                    entity: multipolygon.mergeTags(entity.tags),
-                    area: Math.abs(entity.area(graph))
-                };
-            } else if (!areas[entity.id]) {
-                areas[entity.id] = {
-                    entity: entity,
-                    area: Math.abs(entity.area(graph))
-                };
-            }
-        }
-
-        areas = d3.values(areas).filter(function hasPath(a) { return path(a.entity); });
-        areas.sort(function areaSort(a, b) { return b.area - a.area; });
-        areas = _.pluck(areas, 'entity');
-
-        var strokes = areas.filter(function(area) {
-            return area.type === 'way';
-        });
-
-        var data = {
-            clip: areas.filter(clip),
-            shadow: strokes,
-            stroke: strokes,
-            fill: areas
-        };
-
-        var clipPaths = surface.selectAll('defs').selectAll('.clipPath')
-           .filter(filter)
-           .data(data.clip, iD.Entity.key);
-
-        clipPaths.enter()
-           .append('clipPath')
-           .attr('class', 'clipPath')
-           .attr('id', function(entity) { return entity.id + '-clippath'; })
-           .append('path');
-
-        clipPaths.selectAll('path')
-           .attr('d', path);
-
-        clipPaths.exit()
-           .remove();
-
-        var areagroup = surface
-            .select('.layer-areas')
-            .selectAll('g.areagroup')
-            .data(['fill', 'shadow', 'stroke']);
-
-        areagroup.enter()
-            .append('g')
-            .attr('class', function(d) { return 'layer areagroup area-' + d; });
-
-        var paths = areagroup
-            .selectAll('path')
-            .filter(filter)
-            .data(function(layer) { return data[layer]; }, iD.Entity.key);
-
-        // Remove exiting areas first, so they aren't included in the `fills`
-        // array used for sorting below (https://github.com/openstreetmap/iD/issues/1903).
-        paths.exit()
-            .remove();
-
-        var fills = surface.selectAll('.area-fill path.area')[0];
-
-        var bisect = d3.bisector(function(node) {
-            return -node.__data__.area(graph);
-        }).left;
-
-        function sortedByArea(entity) {
-            if (this.__data__ === 'fill') {
-                return fills[bisect(fills, -entity.area(graph))];
-            }
-        }
-
-        paths.enter()
-            .insert('path', sortedByArea)
-            .each(function(entity) {
-                var layer = this.parentNode.__data__;
-
-                this.setAttribute('class', entity.type + ' area ' + layer + ' ' + entity.id);
-
-                if (layer === 'fill' && clip(entity)) {
-                    this.setAttribute('clip-path', 'url(#' + entity.id + '-clippath)');
-                }
-
-                if (layer === 'fill') {
-                    setPattern.apply(this, arguments);
-                }
-            })
-            .call(iD.svg.TagClasses());
-
-        paths
-            .attr('d', path);
-    };
-};
-/*
-    A standalone SVG element that contains only a `defs` sub-element. To be
-    used once globally, since defs IDs must be unique within a document.
-*/
-iD.svg.Defs = function(context) {
-    function autosize(image) {
-        var img = document.createElement('img');
-        img.src = image.attr('xlink:href');
-        img.onload = function() {
-            image.attr({
-                width: img.width,
-                height: img.height
-            });
-        };
-    }
-
-    function SpriteDefinition(id, href, data) {
-        return function(defs) {
-            defs.append('image')
-                .attr('id', id)
-                .attr('xlink:href', href)
-                .call(autosize);
-
-            defs.selectAll()
-                .data(data)
-                .enter().append('use')
-                .attr('id', function(d) { return d.key; })
-                .attr('transform', function(d) { return 'translate(-' + d.value[0] + ',-' + d.value[1] + ')'; })
-                .attr('xlink:href', '#' + id);
-        };
-    }
-
-    return function (selection) {
-        var defs = selection.append('defs');
-
-        defs.append('marker')
-            .attr({
-                id: 'oneway-marker',
-                viewBox: '0 0 10 10',
-                refY: 2.5,
-                refX: 5,
-                markerWidth: 2,
-                markerHeight: 2,
-                orient: 'auto'
-            })
-            .append('path')
-            .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');
-
-        var patterns = defs.selectAll('pattern')
-            .data([
-                // pattern name, pattern image name
-                ['wetland', 'wetland'],
-                ['construction', 'construction'],
-                ['cemetery', 'cemetery'],
-                ['orchard', 'orchard'],
-                ['farmland', 'farmland'],
-                ['beach', 'dots'],
-                ['scrub', 'dots'],
-                ['meadow', 'dots']
-            ])
-            .enter()
-            .append('pattern')
-            .attr({
-                id: function (d) {
-                    return 'pattern-' + d[0];
-                },
-                width: 32,
-                height: 32,
-                patternUnits: 'userSpaceOnUse'
-            });
-
-        patterns.append('rect')
-            .attr({
-                x: 0,
-                y: 0,
-                width: 32,
-                height: 32,
-                'class': function (d) {
-                    return 'pattern-color-' + d[0];
-                }
-            });
-
-        patterns.append('image')
-            .attr({
-                x: 0,
-                y: 0,
-                width: 32,
-                height: 32
-            })
-            .attr('xlink:href', function (d) {
-                return context.imagePath('pattern/' + d[1] + '.png');
-            });
-
-        defs.selectAll()
-            .data([12, 18, 20, 32, 45])
-            .enter().append('clipPath')
-            .attr('id', function (d) {
-                return 'clip-square-' + d;
-            })
-            .append('rect')
-            .attr('x', 0)
-            .attr('y', 0)
-            .attr('width', function (d) {
-                return d;
-            })
-            .attr('height', function (d) {
-                return d;
-            });
-
-        var maki = [];
-        _.forEach(iD.data.featureIcons, function (dimensions, name) {
-            if (dimensions['12'] && dimensions['18'] && dimensions['24']) {
-                maki.push({key: 'maki-' + name + '-12', value: dimensions['12']});
-                maki.push({key: 'maki-' + name + '-18', value: dimensions['18']});
-                maki.push({key: 'maki-' + name + '-24', value: dimensions['24']});
-            }
-        });
-
-        defs.call(SpriteDefinition(
-            'sprite',
-            context.imagePath('sprite.svg'),
-            d3.entries(iD.data.operations)));
-
-        defs.call(SpriteDefinition(
-            'maki-sprite',
-            context.imagePath('maki-sprite.png'),
-            maki));
-    };
-};
-iD.svg.Labels = function(projection, context) {
-    var path = d3.geo.path().projection(projection);
-
-    // Replace with dict and iterate over entities tags instead?
-    var label_stack = [
-        ['line', 'aeroway'],
-        ['line', 'highway'],
-        ['line', 'railway'],
-        ['line', 'waterway'],
-        ['area', 'aeroway'],
-        ['area', 'amenity'],
-        ['area', 'building'],
-        ['area', 'historic'],
-        ['area', 'leisure'],
-        ['area', 'man_made'],
-        ['area', 'natural'],
-        ['area', 'shop'],
-        ['area', 'tourism'],
-        ['point', 'aeroway'],
-        ['point', 'amenity'],
-        ['point', 'building'],
-        ['point', 'historic'],
-        ['point', 'leisure'],
-        ['point', 'man_made'],
-        ['point', 'natural'],
-        ['point', 'shop'],
-        ['point', 'tourism'],
-        ['line', 'name'],
-        ['area', 'name'],
-        ['point', 'name']
-    ];
-
-    var default_size = 12;
-
-    var font_sizes = label_stack.map(function(d) {
-        var style = iD.util.getStyle('text.' + d[0] + '.tag-' + d[1]),
-            m = style && style.cssText.match('font-size: ([0-9]{1,2})px;');
-        if (m) return parseInt(m[1], 10);
-
-        style = iD.util.getStyle('text.' + d[0]);
-        m = style && style.cssText.match('font-size: ([0-9]{1,2})px;');
-        if (m) return parseInt(m[1], 10);
-
-        return default_size;
-    });
-
-    var iconSize = 18;
-
-    var pointOffsets = [
-        [15, -11, 'start'], // right
-        [10, -11, 'start'], // unused right now
-        [-15, -11, 'end']
-    ];
-
-    var lineOffsets = [50, 45, 55, 40, 60, 35, 65, 30, 70, 25,
-        75, 20, 80, 15, 95, 10, 90, 5, 95];
-
-
-    var noIcons = ['building', 'landuse', 'natural'];
-    function blacklisted(preset) {
-        return _.any(noIcons, function(s) {
-            return preset.id.indexOf(s) >= 0;
-        });
-    }
-
-    function get(array, prop) {
-        return function(d, i) { return array[i][prop]; };
-    }
-
-    var textWidthCache = {};
-
-    function textWidth(text, size, elem) {
-        var c = textWidthCache[size];
-        if (!c) c = textWidthCache[size] = {};
-
-        if (c[text]) {
-            return c[text];
-
-        } else if (elem) {
-            c[text] = elem.getComputedTextLength();
-            return c[text];
-
-        } else {
-            var str = encodeURIComponent(text).match(/%[CDEFcdef]/g);
-            if (str === null) {
-                return size / 3 * 2 * text.length;
-            } else {
-                return size / 3 * (2 * text.length + str.length);
-            }
-        }
-    }
-
-    function drawLineLabels(group, entities, filter, classes, labels) {
-        var texts = group.selectAll('text.' + classes)
-            .filter(filter)
-            .data(entities, iD.Entity.key);
-
-        texts.enter()
-            .append('text')
-            .attr('class', function(d, i) { return classes + ' ' + labels[i].classes + ' ' + d.id; })
-            .append('textPath')
-            .attr('class', 'textpath');
-
-
-        texts.selectAll('.textpath')
-            .filter(filter)
-            .data(entities, iD.Entity.key)
-            .attr({
-                'startOffset': '50%',
-                'xlink:href': function(d) { return '#labelpath-' + d.id; }
-            })
-            .text(iD.util.displayName);
-
-        texts.exit().remove();
-    }
-
-    function drawLinePaths(group, entities, filter, classes, labels) {
-        var halos = group.selectAll('path')
-            .filter(filter)
-            .data(entities, iD.Entity.key);
-
-        halos.enter()
-            .append('path')
-            .style('stroke-width', get(labels, 'font-size'))
-            .attr('id', function(d) { return 'labelpath-' + d.id; })
-            .attr('class', classes);
-
-        halos.attr('d', get(labels, 'lineString'));
-
-        halos.exit().remove();
-    }
-
-    function drawPointLabels(group, entities, filter, classes, labels) {
-
-        var texts = group.selectAll('text.' + classes)
-            .filter(filter)
-            .data(entities, iD.Entity.key);
-
-        texts.enter()
-            .append('text')
-            .attr('class', function(d, i) { return classes + ' ' + labels[i].classes + ' ' + d.id; });
-
-        texts.attr('x', get(labels, 'x'))
-            .attr('y', get(labels, 'y'))
-            .style('text-anchor', get(labels, 'textAnchor'))
-            .text(iD.util.displayName)
-            .each(function(d, i) { textWidth(iD.util.displayName(d), labels[i].height, this); });
-
-        texts.exit().remove();
-        return texts;
-    }
-
-    function drawAreaLabels(group, entities, filter, classes, labels) {
-        entities = entities.filter(hasText);
-        labels = labels.filter(hasText);
-        return drawPointLabels(group, entities, filter, classes, labels);
-
-        function hasText(d, i) {
-            return labels[i].hasOwnProperty('x') && labels[i].hasOwnProperty('y');
-        }
-    }
-
-    function drawAreaIcons(group, entities, filter, classes, labels) {
-
-        var icons = group.selectAll('use')
-            .filter(filter)
-            .data(entities, iD.Entity.key);
-
-        icons.enter()
-            .append('use')
-            .attr('clip-path', 'url(#clip-square-18)')
-            .attr('class', 'icon');
-
-        icons.attr('transform', get(labels, 'transform'))
-            .attr('xlink:href', function(d) {
-                return '#maki-' + context.presets().match(d, context.graph()).icon + '-18';
-            });
-
-
-        icons.exit().remove();
-    }
-
-    function reverse(p) {
-        var angle = Math.atan2(p[1][1] - p[0][1], p[1][0] - p[0][0]);
-        return !(p[0][0] < p[p.length - 1][0] && angle < Math.PI/2 && angle > - Math.PI/2);
-    }
-
-    function lineString(nodes) {
-        return 'M' + nodes.join('L');
-    }
-
-    function subpath(nodes, from, to) {
-        function segmentLength(i) {
-            var dx = nodes[i][0] - nodes[i + 1][0];
-            var dy = nodes[i][1] - nodes[i + 1][1];
-            return Math.sqrt(dx * dx + dy * dy);
-        }
-
-        var sofar = 0,
-            start, end, i0, i1;
-        for (var i = 0; i < nodes.length - 1; i++) {
-            var current = segmentLength(i);
-            var portion;
-            if (!start && sofar + current >= from) {
-                portion = (from - sofar) / current;
-                start = [
-                    nodes[i][0] + portion * (nodes[i + 1][0] - nodes[i][0]),
-                    nodes[i][1] + portion * (nodes[i + 1][1] - nodes[i][1])
-                ];
-                i0 = i + 1;
-            }
-            if (!end && sofar + current >= to) {
-                portion = (to - sofar) / current;
-                end = [
-                    nodes[i][0] + portion * (nodes[i + 1][0] - nodes[i][0]),
-                    nodes[i][1] + portion * (nodes[i + 1][1] - nodes[i][1])
-                ];
-                i1 = i + 1;
-            }
-            sofar += current;
-
-        }
-        var ret = nodes.slice(i0, i1);
-        ret.unshift(start);
-        ret.push(end);
-        return ret;
-
-    }
-
-    function hideOnMouseover() {
-        var layers = d3.select(this)
-            .selectAll('.layer-label, .layer-halo');
-
-        layers.selectAll('.proximate')
-            .classed('proximate', false);
-
-        var mouse = context.mouse(),
-            pad = 50,
-            rect = [mouse[0] - pad, mouse[1] - pad, mouse[0] + pad, mouse[1] + pad],
-            ids = _.pluck(rtree.search(rect), 'id');
-
-        if (!ids.length) return;
-        layers.selectAll('.' + ids.join(', .'))
-            .classed('proximate', true);
-    }
-
-    var rtree = rbush(),
-        rectangles = {};
-
-    function labels(surface, graph, entities, filter, dimensions, fullRedraw) {
-
-        var hidePoints = !surface.select('.node.point').node();
-
-        var labelable = [], i, k, entity;
-        for (i = 0; i < label_stack.length; i++) labelable.push([]);
-
-        if (fullRedraw) {
-            rtree.clear();
-            rectangles = {};
-        } else {
-            for (i = 0; i < entities.length; i++) {
-                rtree.remove(rectangles[entities[i].id]);
-            }
-        }
-
-        // Split entities into groups specified by label_stack
-        for (i = 0; i < entities.length; i++) {
-            entity = entities[i];
-            var geometry = entity.geometry(graph);
-
-            if (geometry === 'vertex')
-                continue;
-            if (hidePoints && geometry === 'point')
-                continue;
-
-            var preset = geometry === 'area' && context.presets().match(entity, graph),
-                icon = preset && !blacklisted(preset) && preset.icon;
-
-            if (!icon && !iD.util.displayName(entity))
-                continue;
-
-            for (k = 0; k < label_stack.length; k ++) {
-                if (geometry === label_stack[k][0] && entity.tags[label_stack[k][1]]) {
-                    labelable[k].push(entity);
-                    break;
-                }
-            }
-        }
-
-        var positions = {
-            point: [],
-            line: [],
-            area: []
-        };
-
-        var labelled = {
-            point: [],
-            line: [],
-            area: []
-        };
-
-        // Try and find a valid label for labellable entities
-        for (k = 0; k < labelable.length; k++) {
-            var font_size = font_sizes[k];
-            for (i = 0; i < labelable[k].length; i ++) {
-                entity = labelable[k][i];
-                var name = iD.util.displayName(entity),
-                    width = name && textWidth(name, font_size),
-                    p;
-                if (entity.geometry(graph) === 'point') {
-                    p = getPointLabel(entity, width, font_size);
-                } else if (entity.geometry(graph) === 'line') {
-                    p = getLineLabel(entity, width, font_size);
-                } else if (entity.geometry(graph) === 'area') {
-                    p = getAreaLabel(entity, width, font_size);
-                }
-                if (p) {
-                    p.classes = entity.geometry(graph) + ' tag-' + label_stack[k][1];
-                    positions[entity.geometry(graph)].push(p);
-                    labelled[entity.geometry(graph)].push(entity);
-                }
-            }
-        }
-
-        function getPointLabel(entity, width, height) {
-            var coord = projection(entity.loc),
-                m = 5,  // margin
-                offset = pointOffsets[0],
-                p = {
-                    height: height,
-                    width: width,
-                    x: coord[0] + offset[0],
-                    y: coord[1] + offset[1],
-                    textAnchor: offset[2]
-                };
-            var rect = [p.x - m, p.y - m, p.x + width + m, p.y + height + m];
-            if (tryInsert(rect, entity.id)) return p;
-        }
-
-
-        function getLineLabel(entity, width, height) {
-            var nodes = _.pluck(graph.childNodes(entity), 'loc').map(projection),
-                length = iD.geo.pathLength(nodes);
-            if (length < width + 20) return;
-
-            for (var i = 0; i < lineOffsets.length; i ++) {
-                var offset = lineOffsets[i],
-                    middle = offset / 100 * length,
-                    start = middle - width/2;
-                if (start < 0 || start + width > length) continue;
-                var sub = subpath(nodes, start, start + width),
-                    rev = reverse(sub),
-                    rect = [
-                        Math.min(sub[0][0], sub[sub.length - 1][0]) - 10,
-                        Math.min(sub[0][1], sub[sub.length - 1][1]) - 10,
-                        Math.max(sub[0][0], sub[sub.length - 1][0]) + 20,
-                        Math.max(sub[0][1], sub[sub.length - 1][1]) + 30
-                    ];
-                if (rev) sub = sub.reverse();
-                if (tryInsert(rect, entity.id)) return {
-                    'font-size': height + 2,
-                    lineString: lineString(sub),
-                    startOffset: offset + '%'
-                };
-            }
-        }
-
-        function getAreaLabel(entity, width, height) {
-            var centroid = path.centroid(entity.asGeoJSON(graph, true)),
-                extent = entity.extent(graph),
-                entitywidth = projection(extent[1])[0] - projection(extent[0])[0],
-                rect;
-
-            if (!centroid || entitywidth < 20) return;
-
-            var iconX = centroid[0] - (iconSize/2),
-                iconY = centroid[1] - (iconSize/2),
-                textOffset = iconSize + 5;
-
-            var p = {
-                transform: 'translate(' + iconX + ',' + iconY + ')'
-            };
-
-            if (width && entitywidth >= width + 20) {
-                p.x = centroid[0];
-                p.y = centroid[1] + textOffset;
-                p.textAnchor = 'middle';
-                p.height = height;
-                rect = [p.x - width/2, p.y, p.x + width/2, p.y + height + textOffset];
-            } else {
-                rect = [iconX, iconY, iconX + iconSize, iconY + iconSize];
-            }
-
-            if (tryInsert(rect, entity.id)) return p;
-
-        }
-
-        function tryInsert(rect, id) {
-            // Check that label is visible
-            if (rect[0] < 0 || rect[1] < 0 || rect[2] > dimensions[0] ||
-                rect[3] > dimensions[1]) return false;
-            var v = rtree.search(rect).length === 0;
-            if (v) {
-                rect.id = id;
-                rtree.insert(rect);
-                rectangles[id] = rect;
-            }
-            return v;
-        }
-
-        var label = surface.select('.layer-label'),
-            halo = surface.select('.layer-halo');
-
-        // points
-        drawPointLabels(label, labelled.point, filter, 'pointlabel', positions.point);
-        drawPointLabels(halo, labelled.point, filter, 'pointlabel-halo', positions.point);
-
-        // lines
-        drawLinePaths(halo, labelled.line, filter, '', positions.line);
-        drawLineLabels(label, labelled.line, filter, 'linelabel', positions.line);
-        drawLineLabels(halo, labelled.line, filter, 'linelabel-halo', positions.line);
-
-        // areas
-        drawAreaLabels(label, labelled.area, filter, 'arealabel', positions.area);
-        drawAreaLabels(halo, labelled.area, filter, 'arealabel-halo', positions.area);
-        drawAreaIcons(label, labelled.area, filter, 'arealabel-icon', positions.area);
-    }
-
-    labels.supersurface = function(supersurface) {
-        supersurface
-            .on('mousemove.hidelabels', hideOnMouseover)
-            .on('mousedown.hidelabels', function () {
-                supersurface.on('mousemove.hidelabels', null);
-            })
-            .on('mouseup.hidelabels', function () {
-                supersurface.on('mousemove.hidelabels', hideOnMouseover);
-            });
-    };
-
-    return labels;
-};
-iD.svg.Lines = function(projection) {
-
-    var highway_stack = {
-        motorway: 0,
-        motorway_link: 1,
-        trunk: 2,
-        trunk_link: 3,
-        primary: 4,
-        primary_link: 5,
-        secondary: 6,
-        tertiary: 7,
-        unclassified: 8,
-        residential: 9,
-        service: 10,
-        footway: 11
-    };
-
-    function waystack(a, b) {
-        var as = 0, bs = 0;
-
-        if (a.tags.highway) { as -= highway_stack[a.tags.highway]; }
-        if (b.tags.highway) { bs -= highway_stack[b.tags.highway]; }
-        return as - bs;
-    }
-
-    return function drawLines(surface, graph, entities, filter) {
-        var ways = [], pathdata = {}, onewaydata = {},
-            getPath = iD.svg.Path(projection, graph);
-
-        for (var i = 0; i < entities.length; i++) {
-            var entity = entities[i],
-                outer = iD.geo.simpleMultipolygonOuterMember(entity, graph);
-            if (outer) {
-                ways.push(entity.mergeTags(outer.tags));
-            } else if (entity.geometry(graph) === 'line') {
-                ways.push(entity);
-            }
-        }
-
-        ways = ways.filter(getPath);
-
-        pathdata = _.groupBy(ways, function(way) { return way.layer(); });
-
-        _.forOwn(pathdata, function(v, k) {
-            onewaydata[k] = _(v)
-                .filter(function(d) { return d.isOneWay(); })
-                .map(iD.svg.OneWaySegments(projection, graph, 35))
-                .flatten()
-                .valueOf();
-        });
-
-        var layergroup = surface
-            .select('.layer-lines')
-            .selectAll('g.layergroup')
-            .data(d3.range(-10, 11));
-
-        layergroup.enter()
-            .append('g')
-            .attr('class', function(d) { return 'layer layergroup layer' + String(d); });
-
-
-        var linegroup = layergroup
-            .selectAll('g.linegroup')
-            .data(['shadow', 'casing', 'stroke']);
-
-        linegroup.enter()
-            .append('g')
-            .attr('class', function(d) { return 'layer linegroup line-' + d; });
-
-
-        var lines = linegroup
-            .selectAll('path')
-            .filter(filter)
-            .data(
-                function() { return pathdata[this.parentNode.parentNode.__data__] || []; },
-                iD.Entity.key
-            );
-
-        // Optimization: call simple TagClasses only on enter selection. This
-        // works because iD.Entity.key is defined to include the entity v attribute.
-        lines.enter()
-            .append('path')
-            .attr('class', function(d) { return 'way line ' + this.parentNode.__data__ + ' ' + d.id; })
-            .call(iD.svg.TagClasses());
-
-        lines
-            .sort(waystack)
-            .attr('d', getPath)
-            .call(iD.svg.TagClasses().tags(iD.svg.MultipolygonMemberTags(graph)));
-
-        lines.exit()
-            .remove();
-
-
-        var onewaygroup = layergroup
-            .selectAll('g.onewaygroup')
-            .data(['oneway']);
-
-        onewaygroup.enter()
-            .append('g')
-            .attr('class', 'layer onewaygroup');
-
-
-        var oneways = onewaygroup
-            .selectAll('path')
-            .filter(filter)
-            .data(
-                function() { return onewaydata[this.parentNode.parentNode.__data__] || []; },
-                function(d) { return [d.id, d.index]; }
-            );
-
-        oneways.enter()
-            .append('path')
-            .attr('class', 'oneway')
-            .attr('marker-mid', 'url(#oneway-marker)');
-
-        oneways
-            .attr('d', function(d) { return d.d; });
-
-        oneways.exit()
-            .remove();
-
-    };
-};
-iD.svg.Midpoints = function(projection, context) {
-    return function drawMidpoints(surface, graph, entities, filter, extent) {
-        var poly = extent.polygon(),
-            midpoints = {};
-
-        for (var i = 0; i < entities.length; i++) {
-            var entity = entities[i];
-
-            if (entity.type !== 'way')
-                continue;
-            if (!filter(entity))
-                continue;
-            if (context.selectedIDs().indexOf(entity.id) < 0)
-                continue;
-
-            var nodes = graph.childNodes(entity);
-            for (var j = 0; j < nodes.length - 1; j++) {
-
-                var a = nodes[j],
-                    b = nodes[j + 1],
-                    id = [a.id, b.id].sort().join('-');
-
-                if (midpoints[id]) {
-                    midpoints[id].parents.push(entity);
-                } else {
-                    if (iD.geo.euclideanDistance(projection(a.loc), projection(b.loc)) > 40) {
-                        var point = iD.geo.interp(a.loc, b.loc, 0.5),
-                            loc = null;
-
-                        if (extent.intersects(point)) {
-                            loc = point;
-                        } else {
-                            for (var k = 0; k < 4; k++) {
-                                point = iD.geo.lineIntersection([a.loc, b.loc], [poly[k], poly[k+1]]);
-                                if (point &&
-                                    iD.geo.euclideanDistance(projection(a.loc), projection(point)) > 20 &&
-                                    iD.geo.euclideanDistance(projection(b.loc), projection(point)) > 20)
-                                {
-                                    loc = point;
-                                    break;
-                                }
-                            }
-                        }
-
-                        if (loc) {
-                            midpoints[id] = {
-                                type: 'midpoint',
-                                id: id,
-                                loc: loc,
-                                edge: [a.id, b.id],
-                                parents: [entity]
-                            };
-                        }
-                    }
-                }
-            }
-        }
-
-        function midpointFilter(d) {
-            if (midpoints[d.id])
-                return true;
-
-            for (var i = 0; i < d.parents.length; i++)
-                if (filter(d.parents[i]))
-                    return true;
-
-            return false;
-        }
-
-        var groups = surface.select('.layer-hit').selectAll('g.midpoint')
-            .filter(midpointFilter)
-            .data(_.values(midpoints), function(d) { return d.id; });
-
-        var enter = groups.enter()
-            .insert('g', ':first-child')
-            .attr('class', 'midpoint');
-
-        enter.append('polygon')
-            .attr('points', '-6,8 10,0 -6,-8')
-            .attr('class', 'shadow');
-
-        enter.append('polygon')
-            .attr('points', '-3,4 5,0 -3,-4')
-            .attr('class', 'fill');
-
-        groups
-            .attr('transform', function(d) {
-                var translate = iD.svg.PointTransform(projection),
-                    a = context.entity(d.edge[0]),
-                    b = context.entity(d.edge[1]),
-                    angle = Math.round(iD.geo.angle(a, b, projection) * (180 / Math.PI));
-                return translate(d) + ' rotate(' + angle + ')';
-            })
-            .call(iD.svg.TagClasses().tags(
-                function(d) { return d.parents[0].tags; }
-            ));
-
-        // Propagate data bindings.
-        groups.select('polygon.shadow');
-        groups.select('polygon.fill');
-
-        groups.exit()
-            .remove();
-    };
-};
-iD.svg.Points = function(projection, context) {
-    function markerPath(selection, klass) {
-        selection
-            .attr('class', klass)
-            .attr('transform', 'translate(-8, -23)')
-            .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');
-    }
-
-    function sortY(a, b) {
-        return b.loc[1] - a.loc[1];
-    }
-
-    function drawPoints(surface, points, filter) {
-        points.sort(sortY);
-
-        var groups = surface.select('.layer-hit').selectAll('g.point')
-            .filter(filter)
-            .data(points, iD.Entity.key);
-
-        var group = groups.enter()
-            .append('g')
-            .attr('class', function(d) { return 'node point ' + d.id; })
-            .order();
-
-        group.append('path')
-            .call(markerPath, 'shadow');
-
-        group.append('path')
-            .call(markerPath, 'stroke');
-
-        group.append('use')
-            .attr('class', 'icon')
-            .attr('transform', 'translate(-6, -20)')
-            .attr('clip-path', 'url(#clip-square-12)');
-
-        groups.attr('transform', iD.svg.PointTransform(projection))
-            .call(iD.svg.TagClasses());
-
-        // Selecting the following implicitly
-        // sets the data (point entity) on the element
-        groups.select('.shadow');
-        groups.select('.stroke');
-        groups.select('.icon')
-            .attr('xlink:href', function(entity) {
-                var preset = context.presets().match(entity, context.graph());
-                return preset.icon ? '#maki-' + preset.icon + '-12' : '';
-            });
-
-        groups.exit()
-            .remove();
-    }
-
-    drawPoints.points = function(entities, limit) {
-        var graph = context.graph(),
-            points = [];
-
-        for (var i = 0; i < entities.length; i++) {
-            var entity = entities[i];
-            if (entity.geometry(graph) === 'point') {
-                points.push(entity);
-                if (limit && points.length >= limit) break;
-            }
-        }
-
-        return points;
-    };
-
-    return drawPoints;
-};
-iD.svg.Surface = function() {
-    return function (selection) {
-        selection.selectAll('defs')
-            .data([0])
-            .enter()
-            .append('defs');
-
-        var layers = selection.selectAll('.layer')
-            .data(['areas', 'lines', 'hit', 'halo', 'label']);
-
-        layers.enter().append('g')
-            .attr('class', function(d) { return 'layer layer-' + d; });
-    };
-};
-iD.svg.TagClasses = function() {
-    var primary = [
-            'building', 'highway', 'railway', 'waterway', 'aeroway',
-            'motorway', 'boundary', 'power', 'amenity', 'natural', 'landuse',
-            'leisure', 'place'
-        ],
-        secondary = [
-            'oneway', 'bridge', 'tunnel', 'construction', 'embankment', 'cutting'
-        ],
-        tagClassRe = /^tag-/,
-        tags = function(entity) { return entity.tags; };
-
-    var tagClasses = function(selection) {
-        selection.each(function tagClassesEach(entity) {
-            var classes, value = this.className;
-
-            if (value.baseVal !== undefined) value = value.baseVal;
-
-            classes = value.trim().split(/\s+/).filter(function(name) {
-                return name.length && !tagClassRe.test(name);
-            }).join(' ');
-
-            var t = tags(entity), i, k, v;
-
-            for (i = 0; i < primary.length; i++) {
-                k = primary[i];
-                v = t[k];
-                if (!v || v === 'no') continue;
-                classes += ' tag-' + k + ' tag-' + k + '-' + v;
-                break;
-            }
-
-            for (i = 0; i < secondary.length; i++) {
-                k = secondary[i];
-                v = t[k];
-                if (!v || v === 'no') continue;
-                classes += ' tag-' + k + ' tag-' + k + '-' + v;
-            }
-
-            classes = classes.trim();
-
-            if (classes !== value) {
-                d3.select(this).attr('class', classes);
-            }
-        });
-    };
-
-    tagClasses.tags = function(_) {
-        if (!arguments.length) return tags;
-        tags = _;
-        return tagClasses;
-    };
-
-    return tagClasses;
-};
-iD.svg.Turns = function(projection) {
-    return function(surface, graph, turns) {
-        function key(turn) {
-            return [turn.from.node + turn.via.node + turn.to.node].join('-');
-        }
-
-        function icon(turn) {
-            var u = turn.u ? '-u' : '';
-            if (!turn.restriction)
-                return '#icon-restriction-yes' + u;
-            var restriction = graph.entity(turn.restriction).tags.restriction;
-            return '#icon-restriction-' +
-                (!turn.indirect_restriction && /^only_/.test(restriction) ? 'only' : 'no') + u;
-        }
-
-        var groups = surface.select('.layer-hit').selectAll('g.turn')
-            .data(turns, key);
-
-        // Enter
-
-        var enter = groups.enter().append('g')
-            .attr('class', 'turn');
-
-        var nEnter = enter.filter(function (turn) { return !turn.u; });
-
-        nEnter.append('rect')
-            .attr('transform', 'translate(-12, -12)')
-            .attr('width', '45')
-            .attr('height', '25');
-
-        nEnter.append('use')
-            .attr('transform', 'translate(-12, -12)')
-            .attr('clip-path', 'url(#clip-square-45)');
-
-        var uEnter = enter.filter(function (turn) { return turn.u; });
-
-        uEnter.append('circle')
-            .attr('r', '16');
-
-        uEnter.append('use')
-            .attr('transform', 'translate(-16, -16)')
-            .attr('clip-path', 'url(#clip-square-32)');
-
-        // Update
-
-        groups
-            .attr('transform', function (turn) {
-                var v = graph.entity(turn.via.node),
-                    t = graph.entity(turn.to.node),
-                    a = iD.geo.angle(v, t, projection),
-                    p = projection(v.loc),
-                    r = turn.u ? 0 : 60;
-
-                return 'translate(' + (r * Math.cos(a) + p[0]) + ',' + (r * Math.sin(a) + p[1]) + ')' +
-                    'rotate(' + a * 180 / Math.PI + ')';
-            });
-
-        groups.select('use')
-            .attr('xlink:href', icon);
-
-        groups.select('rect');
-        groups.select('circle');
-
-        // Exit
-
-        groups.exit()
-            .remove();
-
-        return this;
-    };
-};
-iD.svg.Vertices = function(projection, context) {
-    var radiuses = {
-        //       z16-, z17, z18+, tagged
-        shadow: [6,    7.5,   7.5,  11.5],
-        stroke: [2.5,  3.5,   3.5,  7],
-        fill:   [1,    1.5,   1.5,  1.5]
-    };
-
-    var hover;
-
-    function siblingAndChildVertices(ids, graph, extent) {
-        var vertices = {};
-
-        function addChildVertices(entity) {
-            var i;
-            if (entity.type === 'way') {
-                for (i = 0; i < entity.nodes.length; i++) {
-                    addChildVertices(graph.entity(entity.nodes[i]));
-                }
-            } else if (entity.type === 'relation') {
-                for (i = 0; i < entity.members.length; i++) {
-                    var member = context.hasEntity(entity.members[i].id);
-                    if (member) {
-                        addChildVertices(member);
-                    }
-                }
-            } else if (entity.intersects(extent, graph)) {
-                vertices[entity.id] = entity;
-            }
-        }
-
-        ids.forEach(function(id) {
-            var entity = context.hasEntity(id);
-            if (entity && entity.type === 'node') {
-                vertices[entity.id] = entity;
-                context.graph().parentWays(entity).forEach(function(entity) {
-                    addChildVertices(entity);
-                });
-            } else if (entity) {
-                addChildVertices(entity);
-            }
-        });
-
-        return vertices;
-    }
-
-    function draw(selection, vertices, klass, graph, zoom) {
-        var icons = {},
-            z;
-
-        if (zoom < 17) {
-            z = 0;
-        } else if (zoom < 18) {
-            z = 1;
-        } else {
-            z = 2;
-        }
-
-        var groups = selection.data(vertices, function(entity) {
-            return iD.Entity.key(entity);
-        });
-
-        function icon(entity) {
-            if (entity.id in icons) return icons[entity.id];
-            icons[entity.id] =
-                entity.hasInterestingTags() &&
-                context.presets().match(entity, graph).icon;
-            return icons[entity.id];
-        }
-
-        function classCircle(klass) {
-            return function(entity) {
-                this.setAttribute('class', 'node vertex ' + klass + ' ' + entity.id);
-            };
-        }
-
-        function setAttributes(selection) {
-            ['shadow','stroke','fill'].forEach(function(klass) {
-                var rads = radiuses[klass];
-                selection.selectAll('.' + klass)
-                    .each(function(entity) {
-                        var i = z && icon(entity),
-                            c = i ? 0.5 : 0,
-                            r = rads[i ? 3 : z];
-                        this.setAttribute('cx', c);
-                        this.setAttribute('cy', -c);
-                        this.setAttribute('r', r);
-                        if (i && klass === 'fill') {
-                            this.setAttribute('visibility', 'hidden');
-                        } else {
-                            this.removeAttribute('visibility');
-                        }
-                    });
-            });
-
-            selection.selectAll('use')
-                .each(function() {
-                    if (z) {
-                        this.removeAttribute('visibility');
-                    } else {
-                        this.setAttribute('visibility', 'hidden');
-                    }
-                });
-        }
-
-        var enter = groups.enter()
-            .append('g')
-            .attr('class', function(d) { return 'node vertex ' + klass + ' ' + d.id; });
-
-        enter.append('circle')
-            .each(classCircle('shadow'));
-
-        enter.append('circle')
-            .each(classCircle('stroke'));
-
-        // Vertices with icons get a `use`.
-        enter.filter(function(d) { return icon(d); })
-            .append('use')
-            .attr('transform', 'translate(-6, -6)')
-            .attr('clip-path', 'url(#clip-square-12)')
-            .attr('xlink:href', function(d) { return '#maki-' + icon(d) + '-12'; });
-
-        // Vertices with tags get a fill.
-        enter.filter(function(d) { return d.hasInterestingTags(); })
-            .append('circle')
-            .each(classCircle('fill'));
-
-        groups
-            .attr('transform', iD.svg.PointTransform(projection))
-            .classed('shared', function(entity) { return graph.isShared(entity); })
-            .call(setAttributes);
-
-        groups.exit()
-            .remove();
-    }
-
-    function drawVertices(surface, graph, entities, filter, extent, zoom) {
-        var selected = siblingAndChildVertices(context.selectedIDs(), graph, extent),
-            vertices = [];
-
-        for (var i = 0; i < entities.length; i++) {
-            var entity = entities[i];
-
-            if (entity.geometry(graph) !== 'vertex')
-                continue;
-
-            if (entity.id in selected ||
-                entity.hasInterestingTags() ||
-                entity.isIntersection(graph)) {
-                vertices.push(entity);
-            }
-        }
-
-        surface.select('.layer-hit').selectAll('g.vertex.vertex-persistent')
-            .filter(filter)
-            .call(draw, vertices, 'vertex-persistent', graph, zoom);
-
-        drawHover(surface, graph, extent, zoom);
-    }
-
-    function drawHover(surface, graph, extent, zoom) {
-        var hovered = hover ? siblingAndChildVertices([hover.id], graph, extent) : {};
-
-        surface.select('.layer-hit').selectAll('g.vertex.vertex-hover')
-            .call(draw, d3.values(hovered), 'vertex-hover', graph, zoom);
-    }
-
-    drawVertices.drawHover = function(surface, graph, _, extent, zoom) {
-        if (hover !== _) {
-            hover = _;
-            drawHover(surface, graph, extent, zoom);
-        }
-    };
-
-    return drawVertices;
-};
-iD.ui = function(context) {
-    function render(container) {
-        var map = context.map();
-
-        if (iD.detect().opera) container.classed('opera', true);
-
-        var hash = iD.behavior.Hash(context);
-
-        hash();
-
-        if (!hash.hadHash) {
-            map.centerZoom([-77.02271, 38.90085], 20);
-        }
-
-        container.append('svg')
-            .attr('id', 'defs')
-            .call(iD.svg.Defs(context));
-
-        container.append('div')
-            .attr('id', 'sidebar')
-            .attr('class', 'col4')
-            .call(ui.sidebar);
-
-        var content = container.append('div')
-            .attr('id', 'content');
-
-        var bar = content.append('div')
-            .attr('id', 'bar')
-            .attr('class', 'fillD');
-
-        var m = content.append('div')
-            .attr('id', 'map')
-            .call(map);
-
-        bar.append('div')
-            .attr('class', 'spacer col4');
-
-        var limiter = bar.append('div')
-            .attr('class', 'limiter');
-
-        limiter.append('div')
-            .attr('class', 'button-wrap joined col3')
-            .call(iD.ui.Modes(context), limiter);
-
-        limiter.append('div')
-            .attr('class', 'button-wrap joined col1')
-            .call(iD.ui.UndoRedo(context));
-
-        limiter.append('div')
-            .attr('class', 'button-wrap col1')
-            .call(iD.ui.Save(context));
-
-        bar.append('div')
-            .attr('class', 'spinner')
-            .call(iD.ui.Spinner(context));
-
-        content
-            .call(iD.ui.Attribution(context));
-
-        content.append('div')
-            .style('display', 'none')
-            .attr('class', 'help-wrap map-overlay fillL col5 content');
+         return [x, y];
+       }
+
+       function getQuadKeys() {
+         var dim = _resolution / 256;
+         var quadKeys;
+
+         if (dim === 16) {
+           quadKeys = ['0000', '0001', '0010', '0011', '0100', '0101', '0110', '0111', '1000', '1001', '1010', '1011', '1100', '1101', '1110', '1111', '0002', '0003', '0012', '0013', '0102', '0103', '0112', '0113', '1002', '1003', '1012', '1013', '1102', '1103', '1112', '1113', '0020', '0021', '0030', '0031', '0120', '0121', '0130', '0131', '1020', '1021', '1030', '1031', '1120', '1121', '1130', '1131', '0022', '0023', '0032', '0033', '0122', '0123', '0132', '0133', '1022', '1023', '1032', '1033', '1122', '1123', '1132', '1133', '0200', '0201', '0210', '0211', '0300', '0301', '0310', '0311', '1200', '1201', '1210', '1211', '1300', '1301', '1310', '1311', '0202', '0203', '0212', '0213', '0302', '0303', '0312', '0313', '1202', '1203', '1212', '1213', '1302', '1303', '1312', '1313', '0220', '0221', '0230', '0231', '0320', '0321', '0330', '0331', '1220', '1221', '1230', '1231', '1320', '1321', '1330', '1331', '0222', '0223', '0232', '0233', '0322', '0323', '0332', '0333', '1222', '1223', '1232', '1233', '1322', '1323', '1332', '1333', '2000', '2001', '2010', '2011', '2100', '2101', '2110', '2111', '3000', '3001', '3010', '3011', '3100', '3101', '3110', '3111', '2002', '2003', '2012', '2013', '2102', '2103', '2112', '2113', '3002', '3003', '3012', '3013', '3102', '3103', '3112', '3113', '2020', '2021', '2030', '2031', '2120', '2121', '2130', '2131', '3020', '3021', '3030', '3031', '3120', '3121', '3130', '3131', '2022', '2023', '2032', '2033', '2122', '2123', '2132', '2133', '3022', '3023', '3032', '3033', '3122', '3123', '3132', '3133', '2200', '2201', '2210', '2211', '2300', '2301', '2310', '2311', '3200', '3201', '3210', '3211', '3300', '3301', '3310', '3311', '2202', '2203', '2212', '2213', '2302', '2303', '2312', '2313', '3202', '3203', '3212', '3213', '3302', '3303', '3312', '3313', '2220', '2221', '2230', '2231', '2320', '2321', '2330', '2331', '3220', '3221', '3230', '3231', '3320', '3321', '3330', '3331', '2222', '2223', '2232', '2233', '2322', '2323', '2332', '2333', '3222', '3223', '3232', '3233', '3322', '3323', '3332', '3333'];
+         } else if (dim === 8) {
+           quadKeys = ['000', '001', '010', '011', '100', '101', '110', '111', '002', '003', '012', '013', '102', '103', '112', '113', '020', '021', '030', '031', '120', '121', '130', '131', '022', '023', '032', '033', '122', '123', '132', '133', '200', '201', '210', '211', '300', '301', '310', '311', '202', '203', '212', '213', '302', '303', '312', '313', '220', '221', '230', '231', '320', '321', '330', '331', '222', '223', '232', '233', '322', '323', '332', '333'];
+         } else if (dim === 4) {
+           quadKeys = ['00', '01', '10', '11', '02', '03', '12', '13', '20', '21', '30', '31', '22', '23', '32', '33'];
+         } else {
+           // dim === 2
+           quadKeys = ['0', '1', '2', '3'];
+         }
+
+         return quadKeys;
+       }
+
+       var serviceStreetside = {
+         /**
+          * init() initialize streetside.
+          */
+         init: function init() {
+           if (!_ssCache) {
+             this.reset();
+           }
+
+           this.event = utilRebind(this, dispatch$1, 'on');
+         },
+
+         /**
+          * reset() reset the cache.
+          */
+         reset: function reset() {
+           if (_ssCache) {
+             Object.values(_ssCache.bubbles.inflight).forEach(abortRequest$1);
+           }
+
+           _ssCache = {
+             bubbles: {
+               inflight: {},
+               loaded: {},
+               nextPage: {},
+               rtree: new RBush(),
+               points: {},
+               leaders: []
+             },
+             sequences: {}
+           };
+         },
+
+         /**
+          * bubbles()
+          */
+         bubbles: function bubbles(projection) {
+           var limit = 5;
+           return searchLimited(limit, projection, _ssCache.bubbles.rtree);
+         },
+         cachedImage: function cachedImage(imageKey) {
+           return _ssCache.bubbles.points[imageKey];
+         },
+         sequences: function sequences(projection) {
+           var viewport = projection.clipExtent();
+           var min = [viewport[0][0], viewport[1][1]];
+           var max = [viewport[1][0], viewport[0][1]];
+           var bbox = geoExtent(projection.invert(min), projection.invert(max)).bbox();
+           var seen = {};
+           var results = []; // all sequences for bubbles in viewport
+
+           _ssCache.bubbles.rtree.search(bbox).forEach(function (d) {
+             var key = d.data.sequenceKey;
+
+             if (key && !seen[key]) {
+               seen[key] = true;
+               results.push(_ssCache.sequences[key].geojson);
+             }
+           });
+
+           return results;
+         },
+
+         /**
+          * loadBubbles()
+          */
+         loadBubbles: function loadBubbles(projection, margin) {
+           // by default: request 2 nearby tiles so we can connect sequences.
+           if (margin === undefined) margin = 2;
+           loadTiles('bubbles', bubbleApi, projection, margin);
+         },
+         viewer: function viewer() {
+           return _pannellumViewer;
+         },
+         initViewer: function initViewer() {
+           if (!window.pannellum) return;
+           if (_pannellumViewer) return;
+           _currScene += 1;
+
+           var sceneID = _currScene.toString();
+
+           var options = {
+             'default': {
+               firstScene: sceneID
+             },
+             scenes: {}
+           };
+           options.scenes[sceneID] = _sceneOptions;
+           _pannellumViewer = window.pannellum.viewer('ideditor-viewer-streetside', options);
+         },
+         ensureViewerLoaded: function ensureViewerLoaded(context) {
+           if (_loadViewerPromise) return _loadViewerPromise; // create ms-wrapper, a photo wrapper class
+
+           var wrap = context.container().select('.photoviewer').selectAll('.ms-wrapper').data([0]); // inject ms-wrapper into the photoviewer div
+           // (used by all to house each custom photo viewer)
+
+           var wrapEnter = wrap.enter().append('div').attr('class', 'photo-wrapper ms-wrapper').classed('hide', true);
+           var that = this;
+           var pointerPrefix = 'PointerEvent' in window ? 'pointer' : 'mouse'; // inject div to support streetside viewer (pannellum) and attribution line
+
+           wrapEnter.append('div').attr('id', 'ideditor-viewer-streetside').on(pointerPrefix + 'down.streetside', function () {
+             select(window).on(pointerPrefix + 'move.streetside', function () {
+               dispatch$1.call('viewerChanged');
+             }, true);
+           }).on(pointerPrefix + 'up.streetside pointercancel.streetside', function () {
+             select(window).on(pointerPrefix + 'move.streetside', null); // continue dispatching events for a few seconds, in case viewer has inertia.
+
+             var t = timer(function (elapsed) {
+               dispatch$1.call('viewerChanged');
+
+               if (elapsed > 2000) {
+                 t.stop();
+               }
+             });
+           }).append('div').attr('class', 'photo-attribution fillD');
+           var controlsEnter = wrapEnter.append('div').attr('class', 'photo-controls-wrap').append('div').attr('class', 'photo-controls');
+           controlsEnter.append('button').on('click.back', step(-1)).text('◄');
+           controlsEnter.append('button').on('click.forward', step(1)).text('►'); // create working canvas for stitching together images
+
+           wrap = wrap.merge(wrapEnter).call(setupCanvas, true); // Register viewer resize handler
+
+           context.ui().photoviewer.on('resize.streetside', function () {
+             if (_pannellumViewer) {
+               _pannellumViewer.resize();
+             }
+           });
+           _loadViewerPromise = new Promise(function (resolve, reject) {
+             var loadedCount = 0;
+
+             function loaded() {
+               loadedCount += 1; // wait until both files are loaded
+
+               if (loadedCount === 2) resolve();
+             }
+
+             var head = select('head'); // load streetside pannellum viewer css
+
+             head.selectAll('#ideditor-streetside-viewercss').data([0]).enter().append('link').attr('id', 'ideditor-streetside-viewercss').attr('rel', 'stylesheet').attr('crossorigin', 'anonymous').attr('href', context.asset(pannellumViewerCSS)).on('load.serviceStreetside', loaded).on('error.serviceStreetside', function () {
+               reject();
+             }); // load streetside pannellum viewer js
+
+             head.selectAll('#ideditor-streetside-viewerjs').data([0]).enter().append('script').attr('id', 'ideditor-streetside-viewerjs').attr('crossorigin', 'anonymous').attr('src', context.asset(pannellumViewerJS)).on('load.serviceStreetside', loaded).on('error.serviceStreetside', function () {
+               reject();
+             });
+           })["catch"](function () {
+             _loadViewerPromise = null;
+           });
+           return _loadViewerPromise;
+
+           function step(stepBy) {
+             return function () {
+               var viewer = context.container().select('.photoviewer');
+               var selected = viewer.empty() ? undefined : viewer.datum();
+               if (!selected) return;
+               var nextID = stepBy === 1 ? selected.ne : selected.pr;
+
+               var yaw = _pannellumViewer.getYaw();
+
+               var ca = selected.ca + yaw;
+               var origin = selected.loc; // construct a search trapezoid pointing out from current bubble
+
+               var meters = 35;
+               var p1 = [origin[0] + geoMetersToLon(meters / 5, origin[1]), origin[1]];
+               var p2 = [origin[0] + geoMetersToLon(meters / 2, origin[1]), origin[1] + geoMetersToLat(meters)];
+               var p3 = [origin[0] - geoMetersToLon(meters / 2, origin[1]), origin[1] + geoMetersToLat(meters)];
+               var p4 = [origin[0] - geoMetersToLon(meters / 5, origin[1]), origin[1]];
+               var poly = [p1, p2, p3, p4, p1]; // rotate it to face forward/backward
+
+               var angle = (stepBy === 1 ? ca : ca + 180) * (Math.PI / 180);
+               poly = geoRotate(poly, -angle, origin);
+               var extent = poly.reduce(function (extent, point) {
+                 return extent.extend(geoExtent(point));
+               }, geoExtent()); // find nearest other bubble in the search polygon
+
+               var minDist = Infinity;
+
+               _ssCache.bubbles.rtree.search(extent.bbox()).forEach(function (d) {
+                 if (d.data.key === selected.key) return;
+                 if (!geoPointInPolygon(d.data.loc, poly)) return;
+                 var dist = geoVecLength(d.data.loc, selected.loc);
+                 var theta = selected.ca - d.data.ca;
+                 var minTheta = Math.min(Math.abs(theta), 360 - Math.abs(theta));
+
+                 if (minTheta > 20) {
+                   dist += 5; // penalize distance if camera angles don't match
+                 }
+
+                 if (dist < minDist) {
+                   nextID = d.data.key;
+                   minDist = dist;
+                 }
+               });
+
+               var nextBubble = nextID && that.cachedImage(nextID);
+               if (!nextBubble) return;
+               context.map().centerEase(nextBubble.loc);
+               that.selectImage(context, nextBubble.key).yaw(yaw).showViewer(context);
+             };
+           }
+         },
+         yaw: function yaw(_yaw) {
+           if (typeof _yaw !== 'number') return _yaw;
+           _sceneOptions.yaw = _yaw;
+           return this;
+         },
+
+         /**
+          * showViewer()
+          */
+         showViewer: function showViewer(context) {
+           var wrap = context.container().select('.photoviewer').classed('hide', false);
+           var isHidden = wrap.selectAll('.photo-wrapper.ms-wrapper.hide').size();
+
+           if (isHidden) {
+             wrap.selectAll('.photo-wrapper:not(.ms-wrapper)').classed('hide', true);
+             wrap.selectAll('.photo-wrapper.ms-wrapper').classed('hide', false);
+           }
+
+           return this;
+         },
+
+         /**
+          * hideViewer()
+          */
+         hideViewer: function hideViewer(context) {
+           var viewer = context.container().select('.photoviewer');
+           if (!viewer.empty()) viewer.datum(null);
+           viewer.classed('hide', true).selectAll('.photo-wrapper').classed('hide', true);
+           context.container().selectAll('.viewfield-group, .sequence, .icon-sign').classed('currentView', false);
+           this.updateUrlImage(null);
+           return this.setStyles(context, null, true);
+         },
+
+         /**
+          * selectImage().
+          */
+         selectImage: function selectImage(context, key) {
+           var that = this;
+           var d = this.cachedImage(key);
+           var viewer = context.container().select('.photoviewer');
+           if (!viewer.empty()) viewer.datum(d);
+           this.setStyles(context, null, true);
+           var wrap = context.container().select('.photoviewer .ms-wrapper');
+           var attribution = wrap.selectAll('.photo-attribution').html('');
+           wrap.selectAll('.pnlm-load-box') // display "loading.."
+           .style('display', 'block');
+           if (!d) return this;
+           this.updateUrlImage(key);
+           _sceneOptions.northOffset = d.ca;
+           var line1 = attribution.append('div').attr('class', 'attribution-row');
+           var hiresDomId = utilUniqueDomId('streetside-hires'); // Add hires checkbox
+
+           var label = line1.append('label').attr('for', hiresDomId).attr('class', 'streetside-hires');
+           label.append('input').attr('type', 'checkbox').attr('id', hiresDomId).property('checked', _hires).on('click', function (d3_event) {
+             d3_event.stopPropagation();
+             _hires = !_hires;
+             _resolution = _hires ? 1024 : 512;
+             wrap.call(setupCanvas, true);
+             var viewstate = {
+               yaw: _pannellumViewer.getYaw(),
+               pitch: _pannellumViewer.getPitch(),
+               hfov: _pannellumViewer.getHfov()
+             };
+             _sceneOptions = Object.assign(_sceneOptions, viewstate);
+             that.selectImage(context, d.key).showViewer(context);
+           });
+           label.append('span').call(_t.append('streetside.hires'));
+           var captureInfo = line1.append('div').attr('class', 'attribution-capture-info'); // Add capture date
+
+           if (d.captured_by) {
+             var yyyy = new Date().getFullYear();
+             captureInfo.append('a').attr('class', 'captured_by').attr('target', '_blank').attr('href', 'https://www.microsoft.com/en-us/maps/streetside').text('©' + yyyy + ' Microsoft');
+             captureInfo.append('span').text('|');
+           }
+
+           if (d.captured_at) {
+             captureInfo.append('span').attr('class', 'captured_at').text(localeTimestamp(d.captured_at));
+           } // Add image links
+
+
+           var line2 = attribution.append('div').attr('class', 'attribution-row');
+           line2.append('a').attr('class', 'image-view-link').attr('target', '_blank').attr('href', 'https://www.bing.com/maps?cp=' + d.loc[1] + '~' + d.loc[0] + '&lvl=17&dir=' + d.ca + '&style=x&v=2&sV=1').call(_t.append('streetside.view_on_bing'));
+           line2.append('a').attr('class', 'image-report-link').attr('target', '_blank').attr('href', 'https://www.bing.com/maps/privacyreport/streetsideprivacyreport?bubbleid=' + encodeURIComponent(d.key) + '&focus=photo&lat=' + d.loc[1] + '&lng=' + d.loc[0] + '&z=17').call(_t.append('streetside.report'));
+           var bubbleIdQuadKey = d.key.toString(4);
+           var paddingNeeded = 16 - bubbleIdQuadKey.length;
+
+           for (var i = 0; i < paddingNeeded; i++) {
+             bubbleIdQuadKey = '0' + bubbleIdQuadKey;
+           }
+
+           var imgUrlPrefix = streetsideImagesApi + 'hs' + bubbleIdQuadKey;
+           var imgUrlSuffix = '.jpg?g=6338&n=z'; // Cubemap face code order matters here: front=01, right=02, back=03, left=10, up=11, down=12
+
+           var faceKeys = ['01', '02', '03', '10', '11', '12']; // Map images to cube faces
+
+           var quadKeys = getQuadKeys();
+           var faces = faceKeys.map(function (faceKey) {
+             return quadKeys.map(function (quadKey) {
+               var xy = qkToXY(quadKey);
+               return {
+                 face: faceKey,
+                 url: imgUrlPrefix + faceKey + quadKey + imgUrlSuffix,
+                 x: xy[0],
+                 y: xy[1]
+               };
+             });
+           });
+           loadFaces(faces).then(function () {
+             if (!_pannellumViewer) {
+               that.initViewer();
+             } else {
+               // make a new scene
+               _currScene += 1;
+
+               var sceneID = _currScene.toString();
+
+               _pannellumViewer.addScene(sceneID, _sceneOptions).loadScene(sceneID); // remove previous scene
+
+
+               if (_currScene > 2) {
+                 sceneID = (_currScene - 1).toString();
+
+                 _pannellumViewer.removeScene(sceneID);
+               }
+             }
+           });
+           return this;
+         },
+         getSequenceKeyForBubble: function getSequenceKeyForBubble(d) {
+           return d && d.sequenceKey;
+         },
+         // Updates the currently highlighted sequence and selected bubble.
+         // Reset is only necessary when interacting with the viewport because
+         // this implicitly changes the currently selected bubble/sequence
+         setStyles: function setStyles(context, hovered, reset) {
+           if (reset) {
+             // reset all layers
+             context.container().selectAll('.viewfield-group').classed('highlighted', false).classed('hovered', false).classed('currentView', false);
+             context.container().selectAll('.sequence').classed('highlighted', false).classed('currentView', false);
+           }
+
+           var hoveredBubbleKey = hovered && hovered.key;
+           var hoveredSequenceKey = this.getSequenceKeyForBubble(hovered);
+           var hoveredSequence = hoveredSequenceKey && _ssCache.sequences[hoveredSequenceKey];
+           var hoveredBubbleKeys = hoveredSequence && hoveredSequence.bubbles.map(function (d) {
+             return d.key;
+           }) || [];
+           var viewer = context.container().select('.photoviewer');
+           var selected = viewer.empty() ? undefined : viewer.datum();
+           var selectedBubbleKey = selected && selected.key;
+           var selectedSequenceKey = this.getSequenceKeyForBubble(selected);
+           var selectedSequence = selectedSequenceKey && _ssCache.sequences[selectedSequenceKey];
+           var selectedBubbleKeys = selectedSequence && selectedSequence.bubbles.map(function (d) {
+             return d.key;
+           }) || []; // highlight sibling viewfields on either the selected or the hovered sequences
+
+           var highlightedBubbleKeys = utilArrayUnion(hoveredBubbleKeys, selectedBubbleKeys);
+           context.container().selectAll('.layer-streetside-images .viewfield-group').classed('highlighted', function (d) {
+             return highlightedBubbleKeys.indexOf(d.key) !== -1;
+           }).classed('hovered', function (d) {
+             return d.key === hoveredBubbleKey;
+           }).classed('currentView', function (d) {
+             return d.key === selectedBubbleKey;
+           });
+           context.container().selectAll('.layer-streetside-images .sequence').classed('highlighted', function (d) {
+             return d.properties.key === hoveredSequenceKey;
+           }).classed('currentView', function (d) {
+             return d.properties.key === selectedSequenceKey;
+           }); // update viewfields if needed
+
+           context.container().selectAll('.layer-streetside-images .viewfield-group .viewfield').attr('d', viewfieldPath);
+
+           function viewfieldPath() {
+             var d = this.parentNode.__data__;
+
+             if (d.pano && d.key !== selectedBubbleKey) {
+               return 'M 8,13 m -10,0 a 10,10 0 1,0 20,0 a 10,10 0 1,0 -20,0';
+             } else {
+               return 'M 6,9 C 8,8.4 8,8.4 10,9 L 16,-2 C 12,-5 4,-5 0,-2 z';
+             }
+           }
+
+           return this;
+         },
+         updateUrlImage: function updateUrlImage(imageKey) {
+           if (!window.mocha) {
+             var hash = utilStringQs(window.location.hash);
+
+             if (imageKey) {
+               hash.photo = 'streetside/' + imageKey;
+             } else {
+               delete hash.photo;
+             }
+
+             window.location.replace('#' + utilQsString(hash, true));
+           }
+         },
+
+         /**
+          * cache().
+          */
+         cache: function cache() {
+           return _ssCache;
+         }
+       };
+
+       var _apibase = 'https://taginfo.openstreetmap.org/api/4/';
+       var _inflight = {};
+       var _popularKeys = {};
+       var _taginfoCache = {};
+       var tag_sorts = {
+         point: 'count_nodes',
+         vertex: 'count_nodes',
+         area: 'count_ways',
+         line: 'count_ways'
+       };
+       var tag_sort_members = {
+         point: 'count_node_members',
+         vertex: 'count_node_members',
+         area: 'count_way_members',
+         line: 'count_way_members',
+         relation: 'count_relation_members'
+       };
+       var tag_filters = {
+         point: 'nodes',
+         vertex: 'nodes',
+         area: 'ways',
+         line: 'ways'
+       };
+       var tag_members_fractions = {
+         point: 'count_node_members_fraction',
+         vertex: 'count_node_members_fraction',
+         area: 'count_way_members_fraction',
+         line: 'count_way_members_fraction',
+         relation: 'count_relation_members_fraction'
+       };
+
+       function sets(params, n, o) {
+         if (params.geometry && o[params.geometry]) {
+           params[n] = o[params.geometry];
+         }
+
+         return params;
+       }
+
+       function setFilter(params) {
+         return sets(params, 'filter', tag_filters);
+       }
+
+       function setSort(params) {
+         return sets(params, 'sortname', tag_sorts);
+       }
+
+       function setSortMembers(params) {
+         return sets(params, 'sortname', tag_sort_members);
+       }
+
+       function clean(params) {
+         return utilObjectOmit(params, ['geometry', 'debounce']);
+       }
+
+       function filterKeys(type) {
+         var count_type = type ? 'count_' + type : 'count_all';
+         return function (d) {
+           return parseFloat(d[count_type]) > 2500 || d.in_wiki;
+         };
+       }
+
+       function filterMultikeys(prefix) {
+         return function (d) {
+           // d.key begins with prefix, and d.key contains no additional ':'s
+           var re = new RegExp('^' + prefix + '(.*)$');
+           var matches = d.key.match(re) || [];
+           return matches.length === 2 && matches[1].indexOf(':') === -1;
+         };
+       }
+
+       function filterValues(allowUpperCase) {
+         return function (d) {
+           if (d.value.match(/[;,]/) !== null) return false; // exclude some punctuation
+
+           if (!allowUpperCase && d.value.match(/[A-Z*]/) !== null) return false; // exclude uppercase letters
+
+           return parseFloat(d.fraction) > 0.0;
+         };
+       }
+
+       function filterRoles(geometry) {
+         return function (d) {
+           if (d.role === '') return false; // exclude empty role
+
+           if (d.role.match(/[A-Z*;,]/) !== null) return false; // exclude uppercase letters and some punctuation
+
+           return parseFloat(d[tag_members_fractions[geometry]]) > 0.0;
+         };
+       }
+
+       function valKey(d) {
+         return {
+           value: d.key,
+           title: d.key
+         };
+       }
+
+       function valKeyDescription(d) {
+         var obj = {
+           value: d.value,
+           title: d.description || d.value
+         };
+
+         if (d.count) {
+           obj.count = d.count;
+         }
+
+         return obj;
+       }
+
+       function roleKey(d) {
+         return {
+           value: d.role,
+           title: d.role
+         };
+       } // sort keys with ':' lower than keys without ':'
+
+
+       function sortKeys(a, b) {
+         return a.key.indexOf(':') === -1 && b.key.indexOf(':') !== -1 ? -1 : a.key.indexOf(':') !== -1 && b.key.indexOf(':') === -1 ? 1 : 0;
+       }
+
+       var debouncedRequest = debounce(request, 300, {
+         leading: false
+       });
+
+       function request(url, params, exactMatch, callback, loaded) {
+         if (_inflight[url]) return;
+         if (checkCache(url, params, exactMatch, callback)) return;
+         var controller = new AbortController();
+         _inflight[url] = controller;
+         d3_json(url, {
+           signal: controller.signal
+         }).then(function (result) {
+           delete _inflight[url];
+           if (loaded) loaded(null, result);
+         })["catch"](function (err) {
+           delete _inflight[url];
+           if (err.name === 'AbortError') return;
+           if (loaded) loaded(err.message);
+         });
+       }
+
+       function checkCache(url, params, exactMatch, callback) {
+         var rp = params.rp || 25;
+         var testQuery = params.query || '';
+         var testUrl = url;
+
+         do {
+           var hit = _taginfoCache[testUrl]; // exact match, or shorter match yielding fewer than max results (rp)
+
+           if (hit && (url === testUrl || hit.length < rp)) {
+             callback(null, hit);
+             return true;
+           } // don't try to shorten the query
+
+
+           if (exactMatch || !testQuery.length) return false; // do shorten the query to see if we already have a cached result
+           // that has returned fewer than max results (rp)
+
+           testQuery = testQuery.slice(0, -1);
+           testUrl = url.replace(/&query=(.*?)&/, '&query=' + testQuery + '&');
+         } while (testQuery.length >= 0);
+
+         return false;
+       }
+
+       var serviceTaginfo = {
+         init: function init() {
+           _inflight = {};
+           _taginfoCache = {};
+           _popularKeys = {
+             // manually exclude some keys – #5377, #7485
+             postal_code: true,
+             full_name: true,
+             loc_name: true,
+             reg_name: true,
+             short_name: true,
+             sorting_name: true,
+             artist_name: true,
+             nat_name: true,
+             long_name: true,
+             'bridge:name': true
+           }; // Fetch popular keys.  We'll exclude these from `values`
+           // lookups because they stress taginfo, and they aren't likely
+           // to yield meaningful autocomplete results.. see #3955
+
+           var params = {
+             rp: 100,
+             sortname: 'values_all',
+             sortorder: 'desc',
+             page: 1,
+             debounce: false,
+             lang: _mainLocalizer.languageCode()
+           };
+           this.keys(params, function (err, data) {
+             if (err) return;
+             data.forEach(function (d) {
+               if (d.value === 'opening_hours') return; // exception
+
+               _popularKeys[d.value] = true;
+             });
+           });
+         },
+         reset: function reset() {
+           Object.values(_inflight).forEach(function (controller) {
+             controller.abort();
+           });
+           _inflight = {};
+         },
+         keys: function keys(params, callback) {
+           var doRequest = params.debounce ? debouncedRequest : request;
+           params = clean(setSort(params));
+           params = Object.assign({
+             rp: 10,
+             sortname: 'count_all',
+             sortorder: 'desc',
+             page: 1,
+             lang: _mainLocalizer.languageCode()
+           }, params);
+           var url = _apibase + 'keys/all?' + utilQsString(params);
+           doRequest(url, params, false, callback, function (err, d) {
+             if (err) {
+               callback(err);
+             } else {
+               var f = filterKeys(params.filter);
+               var result = d.data.filter(f).sort(sortKeys).map(valKey);
+               _taginfoCache[url] = result;
+               callback(null, result);
+             }
+           });
+         },
+         multikeys: function multikeys(params, callback) {
+           var doRequest = params.debounce ? debouncedRequest : request;
+           params = clean(setSort(params));
+           params = Object.assign({
+             rp: 25,
+             sortname: 'count_all',
+             sortorder: 'desc',
+             page: 1,
+             lang: _mainLocalizer.languageCode()
+           }, params);
+           var prefix = params.query;
+           var url = _apibase + 'keys/all?' + utilQsString(params);
+           doRequest(url, params, true, callback, function (err, d) {
+             if (err) {
+               callback(err);
+             } else {
+               var f = filterMultikeys(prefix);
+               var result = d.data.filter(f).map(valKey);
+               _taginfoCache[url] = result;
+               callback(null, result);
+             }
+           });
+         },
+         values: function values(params, callback) {
+           // Exclude popular keys from values lookups.. see #3955
+           var key = params.key;
+
+           if (key && _popularKeys[key]) {
+             callback(null, []);
+             return;
+           }
+
+           var doRequest = params.debounce ? debouncedRequest : request;
+           params = clean(setSort(setFilter(params)));
+           params = Object.assign({
+             rp: 25,
+             sortname: 'count_all',
+             sortorder: 'desc',
+             page: 1,
+             lang: _mainLocalizer.languageCode()
+           }, params);
+           var url = _apibase + 'key/values?' + utilQsString(params);
+           doRequest(url, params, false, callback, function (err, d) {
+             if (err) {
+               callback(err);
+             } else {
+               // In most cases we prefer taginfo value results with lowercase letters.
+               // A few OSM keys expect values to contain uppercase values (see #3377).
+               // This is not an exhaustive list (e.g. `name` also has uppercase values)
+               // but these are the fields where taginfo value lookup is most useful.
+               var re = /network|taxon|genus|species|brand|grape_variety|royal_cypher|listed_status|booth|rating|stars|:output|_hours|_times|_ref|manufacturer|country|target|brewery|cai_scale/;
+               var allowUpperCase = re.test(params.key);
+               var f = filterValues(allowUpperCase);
+               var result = d.data.filter(f).map(valKeyDescription);
+               _taginfoCache[url] = result;
+               callback(null, result);
+             }
+           });
+         },
+         roles: function roles(params, callback) {
+           var doRequest = params.debounce ? debouncedRequest : request;
+           var geometry = params.geometry;
+           params = clean(setSortMembers(params));
+           params = Object.assign({
+             rp: 25,
+             sortname: 'count_all_members',
+             sortorder: 'desc',
+             page: 1,
+             lang: _mainLocalizer.languageCode()
+           }, params);
+           var url = _apibase + 'relation/roles?' + utilQsString(params);
+           doRequest(url, params, true, callback, function (err, d) {
+             if (err) {
+               callback(err);
+             } else {
+               var f = filterRoles(geometry);
+               var result = d.data.filter(f).map(roleKey);
+               _taginfoCache[url] = result;
+               callback(null, result);
+             }
+           });
+         },
+         docs: function docs(params, callback) {
+           var doRequest = params.debounce ? debouncedRequest : request;
+           params = clean(setSort(params));
+           var path = 'key/wiki_pages?';
+
+           if (params.value) {
+             path = 'tag/wiki_pages?';
+           } else if (params.rtype) {
+             path = 'relation/wiki_pages?';
+           }
+
+           var url = _apibase + path + utilQsString(params);
+           doRequest(url, params, true, callback, function (err, d) {
+             if (err) {
+               callback(err);
+             } else {
+               _taginfoCache[url] = d.data;
+               callback(null, d.data);
+             }
+           });
+         },
+         apibase: function apibase(_) {
+           if (!arguments.length) return _apibase;
+           _apibase = _;
+           return this;
+         }
+       };
+
+       /**
+        * Wraps a GeoJSON {@link Geometry} in a GeoJSON {@link Feature}.
+        *
+        * @name feature
+        * @param {Geometry} geometry input geometry
+        * @param {Object} [properties={}] an Object of key-value pairs to add as properties
+        * @param {Object} [options={}] Optional Parameters
+        * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature
+        * @param {string|number} [options.id] Identifier associated with the Feature
+        * @returns {Feature} a GeoJSON Feature
+        * @example
+        * var geometry = {
+        *   "type": "Point",
+        *   "coordinates": [110, 50]
+        * };
+        *
+        * var feature = turf.feature(geometry);
+        *
+        * //=feature
+        */
+
+       function feature(geom, properties, options) {
+         if (options === void 0) {
+           options = {};
+         }
+
+         var feat = {
+           type: "Feature"
+         };
+
+         if (options.id === 0 || options.id) {
+           feat.id = options.id;
+         }
+
+         if (options.bbox) {
+           feat.bbox = options.bbox;
+         }
+
+         feat.properties = properties || {};
+         feat.geometry = geom;
+         return feat;
+       }
+       /**
+        * Creates a {@link Polygon} {@link Feature} from an Array of LinearRings.
+        *
+        * @name polygon
+        * @param {Array<Array<Array<number>>>} coordinates an array of LinearRings
+        * @param {Object} [properties={}] an Object of key-value pairs to add as properties
+        * @param {Object} [options={}] Optional Parameters
+        * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature
+        * @param {string|number} [options.id] Identifier associated with the Feature
+        * @returns {Feature<Polygon>} Polygon Feature
+        * @example
+        * var polygon = turf.polygon([[[-5, 52], [-4, 56], [-2, 51], [-7, 54], [-5, 52]]], { name: 'poly1' });
+        *
+        * //=polygon
+        */
+
+       function polygon(coordinates, properties, options) {
+         if (options === void 0) {
+           options = {};
+         }
+
+         for (var _i = 0, coordinates_1 = coordinates; _i < coordinates_1.length; _i++) {
+           var ring = coordinates_1[_i];
+
+           if (ring.length < 4) {
+             throw new Error("Each LinearRing of a Polygon must have 4 or more Positions.");
+           }
+
+           for (var j = 0; j < ring[ring.length - 1].length; j++) {
+             // Check if first point of Polygon contains two numbers
+             if (ring[ring.length - 1][j] !== ring[0][j]) {
+               throw new Error("First and last Position are not equivalent.");
+             }
+           }
+         }
+
+         var geom = {
+           type: "Polygon",
+           coordinates: coordinates
+         };
+         return feature(geom, properties, options);
+       }
+       /**
+        * Creates a {@link LineString} {@link Feature} from an Array of Positions.
+        *
+        * @name lineString
+        * @param {Array<Array<number>>} coordinates an array of Positions
+        * @param {Object} [properties={}] an Object of key-value pairs to add as properties
+        * @param {Object} [options={}] Optional Parameters
+        * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature
+        * @param {string|number} [options.id] Identifier associated with the Feature
+        * @returns {Feature<LineString>} LineString Feature
+        * @example
+        * var linestring1 = turf.lineString([[-24, 63], [-23, 60], [-25, 65], [-20, 69]], {name: 'line 1'});
+        * var linestring2 = turf.lineString([[-14, 43], [-13, 40], [-15, 45], [-10, 49]], {name: 'line 2'});
+        *
+        * //=linestring1
+        * //=linestring2
+        */
+
+       function lineString(coordinates, properties, options) {
+         if (options === void 0) {
+           options = {};
+         }
+
+         if (coordinates.length < 2) {
+           throw new Error("coordinates must be an array of two or more positions");
+         }
+
+         var geom = {
+           type: "LineString",
+           coordinates: coordinates
+         };
+         return feature(geom, properties, options);
+       }
+       /**
+        * Creates a {@link Feature<MultiLineString>} based on a
+        * coordinate array. Properties can be added optionally.
+        *
+        * @name multiLineString
+        * @param {Array<Array<Array<number>>>} coordinates an array of LineStrings
+        * @param {Object} [properties={}] an Object of key-value pairs to add as properties
+        * @param {Object} [options={}] Optional Parameters
+        * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature
+        * @param {string|number} [options.id] Identifier associated with the Feature
+        * @returns {Feature<MultiLineString>} a MultiLineString feature
+        * @throws {Error} if no coordinates are passed
+        * @example
+        * var multiLine = turf.multiLineString([[[0,0],[10,10]]]);
+        *
+        * //=multiLine
+        */
+
+       function multiLineString(coordinates, properties, options) {
+         if (options === void 0) {
+           options = {};
+         }
+
+         var geom = {
+           type: "MultiLineString",
+           coordinates: coordinates
+         };
+         return feature(geom, properties, options);
+       }
+       /**
+        * Creates a {@link Feature<MultiPolygon>} based on a
+        * coordinate array. Properties can be added optionally.
+        *
+        * @name multiPolygon
+        * @param {Array<Array<Array<Array<number>>>>} coordinates an array of Polygons
+        * @param {Object} [properties={}] an Object of key-value pairs to add as properties
+        * @param {Object} [options={}] Optional Parameters
+        * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature
+        * @param {string|number} [options.id] Identifier associated with the Feature
+        * @returns {Feature<MultiPolygon>} a multipolygon feature
+        * @throws {Error} if no coordinates are passed
+        * @example
+        * var multiPoly = turf.multiPolygon([[[[0,0],[0,10],[10,10],[10,0],[0,0]]]]);
+        *
+        * //=multiPoly
+        *
+        */
+
+       function multiPolygon(coordinates, properties, options) {
+         if (options === void 0) {
+           options = {};
+         }
+
+         var geom = {
+           type: "MultiPolygon",
+           coordinates: coordinates
+         };
+         return feature(geom, properties, options);
+       }
+
+       /**
+        * Get Geometry from Feature or Geometry Object
+        *
+        * @param {Feature|Geometry} geojson GeoJSON Feature or Geometry Object
+        * @returns {Geometry|null} GeoJSON Geometry Object
+        * @throws {Error} if geojson is not a Feature or Geometry Object
+        * @example
+        * var point = {
+        *   "type": "Feature",
+        *   "properties": {},
+        *   "geometry": {
+        *     "type": "Point",
+        *     "coordinates": [110, 40]
+        *   }
+        * }
+        * var geom = turf.getGeom(point)
+        * //={"type": "Point", "coordinates": [110, 40]}
+        */
+
+       function getGeom(geojson) {
+         if (geojson.type === "Feature") {
+           return geojson.geometry;
+         }
+
+         return geojson;
+       }
+
+       // Cohen-Sutherland line clipping algorithm, adapted to efficiently
+       // handle polylines rather than just segments
+       function lineclip(points, bbox, result) {
+         var len = points.length,
+             codeA = bitCode(points[0], bbox),
+             part = [],
+             i,
+             codeB,
+             lastCode;
+         var a;
+         var b;
+         if (!result) result = [];
+
+         for (i = 1; i < len; i++) {
+           a = points[i - 1];
+           b = points[i];
+           codeB = lastCode = bitCode(b, bbox);
+
+           while (true) {
+             if (!(codeA | codeB)) {
+               // accept
+               part.push(a);
+
+               if (codeB !== lastCode) {
+                 // segment went outside
+                 part.push(b);
+
+                 if (i < len - 1) {
+                   // start a new line
+                   result.push(part);
+                   part = [];
+                 }
+               } else if (i === len - 1) {
+                 part.push(b);
+               }
+
+               break;
+             } else if (codeA & codeB) {
+               // trivial reject
+               break;
+             } else if (codeA) {
+               // a outside, intersect with clip edge
+               a = intersect(a, b, codeA, bbox);
+               codeA = bitCode(a, bbox);
+             } else {
+               // b outside
+               b = intersect(a, b, codeB, bbox);
+               codeB = bitCode(b, bbox);
+             }
+           }
+
+           codeA = lastCode;
+         }
+
+         if (part.length) result.push(part);
+         return result;
+       } // Sutherland-Hodgeman polygon clipping algorithm
+
+       function polygonclip(points, bbox) {
+         var result, edge, prev, prevInside, i, p, inside; // clip against each side of the clip rectangle
+
+         for (edge = 1; edge <= 8; edge *= 2) {
+           result = [];
+           prev = points[points.length - 1];
+           prevInside = !(bitCode(prev, bbox) & edge);
+
+           for (i = 0; i < points.length; i++) {
+             p = points[i];
+             inside = !(bitCode(p, bbox) & edge); // if segment goes through the clip window, add an intersection
+
+             if (inside !== prevInside) result.push(intersect(prev, p, edge, bbox));
+             if (inside) result.push(p); // add a point if it's inside
+
+             prev = p;
+             prevInside = inside;
+           }
+
+           points = result;
+           if (!points.length) break;
+         }
+
+         return result;
+       } // intersect a segment against one of the 4 lines that make up the bbox
+
+       function intersect(a, b, edge, bbox) {
+         return edge & 8 ? [a[0] + (b[0] - a[0]) * (bbox[3] - a[1]) / (b[1] - a[1]), bbox[3]] // top
+         : edge & 4 ? [a[0] + (b[0] - a[0]) * (bbox[1] - a[1]) / (b[1] - a[1]), bbox[1]] // bottom
+         : edge & 2 ? [bbox[2], a[1] + (b[1] - a[1]) * (bbox[2] - a[0]) / (b[0] - a[0])] // right
+         : edge & 1 ? [bbox[0], a[1] + (b[1] - a[1]) * (bbox[0] - a[0]) / (b[0] - a[0])] // left
+         : null;
+       } // bit code reflects the point position relative to the bbox:
+       //         left  mid  right
+       //    top  1001  1000  1010
+       //    mid  0001  0000  0010
+       // bottom  0101  0100  0110
+
+
+       function bitCode(p, bbox) {
+         var code = 0;
+         if (p[0] < bbox[0]) code |= 1; // left
+         else if (p[0] > bbox[2]) code |= 2; // right
+
+         if (p[1] < bbox[1]) code |= 4; // bottom
+         else if (p[1] > bbox[3]) code |= 8; // top
+
+         return code;
+       }
+
+       /**
+        * Takes a {@link Feature} and a bbox and clips the feature to the bbox using
+        * [lineclip](https://github.com/mapbox/lineclip).
+        * May result in degenerate edges when clipping Polygons.
+        *
+        * @name bboxClip
+        * @param {Feature<LineString|MultiLineString|Polygon|MultiPolygon>} feature feature to clip to the bbox
+        * @param {BBox} bbox extent in [minX, minY, maxX, maxY] order
+        * @returns {Feature<LineString|MultiLineString|Polygon|MultiPolygon>} clipped Feature
+        * @example
+        * var bbox = [0, 0, 10, 10];
+        * var poly = turf.polygon([[[2, 2], [8, 4], [12, 8], [3, 7], [2, 2]]]);
+        *
+        * var clipped = turf.bboxClip(poly, bbox);
+        *
+        * //addToMap
+        * var addToMap = [bbox, poly, clipped]
+        */
+
+       function bboxClip(feature, bbox) {
+         var geom = getGeom(feature);
+         var type = geom.type;
+         var properties = feature.type === "Feature" ? feature.properties : {};
+         var coords = geom.coordinates;
+
+         switch (type) {
+           case "LineString":
+           case "MultiLineString":
+             {
+               var lines_1 = [];
+
+               if (type === "LineString") {
+                 coords = [coords];
+               }
+
+               coords.forEach(function (line) {
+                 lineclip(line, bbox, lines_1);
+               });
+
+               if (lines_1.length === 1) {
+                 return lineString(lines_1[0], properties);
+               }
+
+               return multiLineString(lines_1, properties);
+             }
+
+           case "Polygon":
+             return polygon(clipPolygon(coords, bbox), properties);
+
+           case "MultiPolygon":
+             return multiPolygon(coords.map(function (poly) {
+               return clipPolygon(poly, bbox);
+             }), properties);
+
+           default:
+             throw new Error("geometry " + type + " not supported");
+         }
+       }
+
+       function clipPolygon(rings, bbox) {
+         var outRings = [];
+
+         for (var _i = 0, rings_1 = rings; _i < rings_1.length; _i++) {
+           var ring = rings_1[_i];
+           var clipped = polygonclip(ring, bbox);
+
+           if (clipped.length > 0) {
+             if (clipped[0][0] !== clipped[clipped.length - 1][0] || clipped[0][1] !== clipped[clipped.length - 1][1]) {
+               clipped.push(clipped[0]);
+             }
+
+             if (clipped.length >= 4) {
+               outRings.push(clipped);
+             }
+           }
+         }
+
+         return outRings;
+       }
+
+       var tiler = utilTiler().tileSize(512).margin(1);
+       var dispatch = dispatch$8('loadedData');
+
+       var _vtCache;
+
+       function abortRequest(controller) {
+         controller.abort();
+       }
+
+       function vtToGeoJSON(data, tile, mergeCache) {
+         var vectorTile$1 = new vectorTile.VectorTile(new pbf(data));
+         var layers = Object.keys(vectorTile$1.layers);
+
+         if (!Array.isArray(layers)) {
+           layers = [layers];
+         }
+
+         var features = [];
+         layers.forEach(function (layerID) {
+           var layer = vectorTile$1.layers[layerID];
+
+           if (layer) {
+             for (var i = 0; i < layer.length; i++) {
+               var feature = layer.feature(i).toGeoJSON(tile.xyz[0], tile.xyz[1], tile.xyz[2]);
+               var geometry = feature.geometry; // Treat all Polygons as MultiPolygons
+
+               if (geometry.type === 'Polygon') {
+                 geometry.type = 'MultiPolygon';
+                 geometry.coordinates = [geometry.coordinates];
+               }
+
+               var isClipped = false; // Clip to tile bounds
+
+               if (geometry.type === 'MultiPolygon') {
+                 var featureClip = bboxClip(feature, tile.extent.rectangle());
+
+                 if (!fastDeepEqual(feature.geometry, featureClip.geometry)) {
+                   // feature = featureClip;
+                   isClipped = true;
+                 }
+
+                 if (!feature.geometry.coordinates.length) continue; // not actually on this tile
+
+                 if (!feature.geometry.coordinates[0].length) continue; // not actually on this tile
+               } // Generate some unique IDs and add some metadata
+
+
+               var featurehash = utilHashcode(fastJsonStableStringify(feature));
+               var propertyhash = utilHashcode(fastJsonStableStringify(feature.properties || {}));
+               feature.__layerID__ = layerID.replace(/[^_a-zA-Z0-9\-]/g, '_');
+               feature.__featurehash__ = featurehash;
+               feature.__propertyhash__ = propertyhash;
+               features.push(feature); // Clipped Polygons at same zoom with identical properties can get merged
+
+               if (isClipped && geometry.type === 'MultiPolygon') {
+                 var merged = mergeCache[propertyhash];
+
+                 if (merged && merged.length) {
+                   var other = merged[0];
+                   var coords = index.union(feature.geometry.coordinates, other.geometry.coordinates);
+
+                   if (!coords || !coords.length) {
+                     continue; // something failed in polygon union
+                   }
+
+                   merged.push(feature);
+
+                   for (var j = 0; j < merged.length; j++) {
+                     // all these features get...
+                     merged[j].geometry.coordinates = coords; // same coords
+
+                     merged[j].__featurehash__ = featurehash; // same hash, so deduplication works
+                   }
+                 } else {
+                   mergeCache[propertyhash] = [feature];
+                 }
+               }
+             }
+           }
+         });
+         return features;
+       }
+
+       function loadTile(source, tile) {
+         if (source.loaded[tile.id] || source.inflight[tile.id]) return;
+         var url = source.template.replace('{x}', tile.xyz[0]).replace('{y}', tile.xyz[1]) // TMS-flipped y coordinate
+         .replace(/\{[t-]y\}/, Math.pow(2, tile.xyz[2]) - tile.xyz[1] - 1).replace(/\{z(oom)?\}/, tile.xyz[2]).replace(/\{switch:([^}]+)\}/, function (s, r) {
+           var subdomains = r.split(',');
+           return subdomains[(tile.xyz[0] + tile.xyz[1]) % subdomains.length];
+         });
+         var controller = new AbortController();
+         source.inflight[tile.id] = controller;
+         fetch(url, {
+           signal: controller.signal
+         }).then(function (response) {
+           if (!response.ok) {
+             throw new Error(response.status + ' ' + response.statusText);
+           }
+
+           source.loaded[tile.id] = [];
+           delete source.inflight[tile.id];
+           return response.arrayBuffer();
+         }).then(function (data) {
+           if (!data) {
+             throw new Error('No Data');
+           }
+
+           var z = tile.xyz[2];
+
+           if (!source.canMerge[z]) {
+             source.canMerge[z] = {}; // initialize mergeCache
+           }
+
+           source.loaded[tile.id] = vtToGeoJSON(data, tile, source.canMerge[z]);
+           dispatch.call('loadedData');
+         })["catch"](function () {
+           source.loaded[tile.id] = [];
+           delete source.inflight[tile.id];
+         });
+       }
+
+       var serviceVectorTile = {
+         init: function init() {
+           if (!_vtCache) {
+             this.reset();
+           }
+
+           this.event = utilRebind(this, dispatch, 'on');
+         },
+         reset: function reset() {
+           for (var sourceID in _vtCache) {
+             var source = _vtCache[sourceID];
+
+             if (source && source.inflight) {
+               Object.values(source.inflight).forEach(abortRequest);
+             }
+           }
+
+           _vtCache = {};
+         },
+         addSource: function addSource(sourceID, template) {
+           _vtCache[sourceID] = {
+             template: template,
+             inflight: {},
+             loaded: {},
+             canMerge: {}
+           };
+           return _vtCache[sourceID];
+         },
+         data: function data(sourceID, projection) {
+           var source = _vtCache[sourceID];
+           if (!source) return [];
+           var tiles = tiler.getTiles(projection);
+           var seen = {};
+           var results = [];
+
+           for (var i = 0; i < tiles.length; i++) {
+             var features = source.loaded[tiles[i].id];
+             if (!features || !features.length) continue;
+
+             for (var j = 0; j < features.length; j++) {
+               var feature = features[j];
+               var hash = feature.__featurehash__;
+               if (seen[hash]) continue;
+               seen[hash] = true; // return a shallow copy, because the hash may change
+               // later if this feature gets merged with another
+
+               results.push(Object.assign({}, feature)); // shallow copy
+             }
+           }
+
+           return results;
+         },
+         loadTiles: function loadTiles(sourceID, template, projection) {
+           var source = _vtCache[sourceID];
+
+           if (!source) {
+             source = this.addSource(sourceID, template);
+           }
+
+           var tiles = tiler.getTiles(projection); // abort inflight requests that are no longer needed
+
+           Object.keys(source.inflight).forEach(function (k) {
+             var wanted = tiles.find(function (tile) {
+               return k === tile.id;
+             });
+
+             if (!wanted) {
+               abortRequest(source.inflight[k]);
+               delete source.inflight[k];
+             }
+           });
+           tiles.forEach(function (tile) {
+             loadTile(source, tile);
+           });
+         },
+         cache: function cache() {
+           return _vtCache;
+         }
+       };
+
+       var apibase = 'https://www.wikidata.org/w/api.php?';
+       var _wikidataCache = {};
+       var serviceWikidata = {
+         init: function init() {},
+         reset: function reset() {
+           _wikidataCache = {};
+         },
+         // Search for Wikidata items matching the query
+         itemsForSearchQuery: function itemsForSearchQuery(query, callback) {
+           if (!query) {
+             if (callback) callback('No query', {});
+             return;
+           }
+
+           var lang = this.languagesToQuery()[0];
+           var url = apibase + utilQsString({
+             action: 'wbsearchentities',
+             format: 'json',
+             formatversion: 2,
+             search: query,
+             type: 'item',
+             // the language to search
+             language: lang,
+             // the language for the label and description in the result
+             uselang: lang,
+             limit: 10,
+             origin: '*'
+           });
+           d3_json(url).then(function (result) {
+             if (result && result.error) {
+               throw new Error(result.error);
+             }
+
+             if (callback) callback(null, result.search || {});
+           })["catch"](function (err) {
+             if (callback) callback(err.message, {});
+           });
+         },
+         // Given a Wikipedia language and article title,
+         // return an array of corresponding Wikidata entities.
+         itemsByTitle: function itemsByTitle(lang, title, callback) {
+           if (!title) {
+             if (callback) callback('No title', {});
+             return;
+           }
+
+           lang = lang || 'en';
+           var url = apibase + utilQsString({
+             action: 'wbgetentities',
+             format: 'json',
+             formatversion: 2,
+             sites: lang.replace(/-/g, '_') + 'wiki',
+             titles: title,
+             languages: 'en',
+             // shrink response by filtering to one language
+             origin: '*'
+           });
+           d3_json(url).then(function (result) {
+             if (result && result.error) {
+               throw new Error(result.error);
+             }
+
+             if (callback) callback(null, result.entities || {});
+           })["catch"](function (err) {
+             if (callback) callback(err.message, {});
+           });
+         },
+         languagesToQuery: function languagesToQuery() {
+           return _mainLocalizer.localeCodes().map(function (code) {
+             return code.toLowerCase();
+           }).filter(function (code) {
+             // HACK: en-us isn't a wikidata language. We should really be filtering by
+             // the languages known to be supported by wikidata.
+             return code !== 'en-us';
+           });
+         },
+         entityByQID: function entityByQID(qid, callback) {
+           if (!qid) {
+             callback('No qid', {});
+             return;
+           }
+
+           if (_wikidataCache[qid]) {
+             if (callback) callback(null, _wikidataCache[qid]);
+             return;
+           }
+
+           var langs = this.languagesToQuery();
+           var url = apibase + utilQsString({
+             action: 'wbgetentities',
+             format: 'json',
+             formatversion: 2,
+             ids: qid,
+             props: 'labels|descriptions|claims|sitelinks',
+             sitefilter: langs.map(function (d) {
+               return d + 'wiki';
+             }).join('|'),
+             languages: langs.join('|'),
+             languagefallback: 1,
+             origin: '*'
+           });
+           d3_json(url).then(function (result) {
+             if (result && result.error) {
+               throw new Error(result.error);
+             }
+
+             if (callback) callback(null, result.entities[qid] || {});
+           })["catch"](function (err) {
+             if (callback) callback(err.message, {});
+           });
+         },
+         // Pass `params` object of the form:
+         // {
+         //   qid: 'string'      // brand wikidata  (e.g. 'Q37158')
+         // }
+         //
+         // Get an result object used to display tag documentation
+         // {
+         //   title:        'string',
+         //   description:  'string',
+         //   editURL:      'string',
+         //   imageURL:     'string',
+         //   wiki:         { title: 'string', text: 'string', url: 'string' }
+         // }
+         //
+         getDocs: function getDocs(params, callback) {
+           var langs = this.languagesToQuery();
+           this.entityByQID(params.qid, function (err, entity) {
+             if (err || !entity) {
+               callback(err || 'No entity');
+               return;
+             }
+
+             var i;
+             var description;
+
+             for (i in langs) {
+               var code = langs[i];
+
+               if (entity.descriptions[code] && entity.descriptions[code].language === code) {
+                 description = entity.descriptions[code];
+                 break;
+               }
+             }
+
+             if (!description && Object.values(entity.descriptions).length) description = Object.values(entity.descriptions)[0]; // prepare result
+
+             var result = {
+               title: entity.id,
+               description: description ? description.value : '',
+               descriptionLocaleCode: description ? description.language : '',
+               editURL: 'https://www.wikidata.org/wiki/' + entity.id
+             }; // add image
+
+             if (entity.claims) {
+               var imageroot = 'https://commons.wikimedia.org/w/index.php';
+               var props = ['P154', 'P18']; // logo image, image
+
+               var prop, image;
+
+               for (i = 0; i < props.length; i++) {
+                 prop = entity.claims[props[i]];
+
+                 if (prop && Object.keys(prop).length > 0) {
+                   image = prop[Object.keys(prop)[0]].mainsnak.datavalue.value;
+
+                   if (image) {
+                     result.imageURL = imageroot + '?' + utilQsString({
+                       title: 'Special:Redirect/file/' + image,
+                       width: 400
+                     });
+                     break;
+                   }
+                 }
+               }
+             }
+
+             if (entity.sitelinks) {
+               var englishLocale = _mainLocalizer.languageCode().toLowerCase() === 'en'; // must be one of these that we requested..
+
+               for (i = 0; i < langs.length; i++) {
+                 // check each, in order of preference
+                 var w = langs[i] + 'wiki';
+
+                 if (entity.sitelinks[w]) {
+                   var title = entity.sitelinks[w].title;
+                   var tKey = 'inspector.wiki_reference';
+
+                   if (!englishLocale && langs[i] === 'en') {
+                     // user's locale isn't English but
+                     tKey = 'inspector.wiki_en_reference'; // we are sending them to enwiki anyway..
+                   }
+
+                   result.wiki = {
+                     title: title,
+                     text: tKey,
+                     url: 'https://' + langs[i] + '.wikipedia.org/wiki/' + title.replace(/ /g, '_')
+                   };
+                   break;
+                 }
+               }
+             }
+
+             callback(null, result);
+           });
+         }
+       };
+
+       var endpoint = 'https://en.wikipedia.org/w/api.php?';
+       var serviceWikipedia = {
+         init: function init() {},
+         reset: function reset() {},
+         search: function search(lang, query, callback) {
+           if (!query) {
+             if (callback) callback('No Query', []);
+             return;
+           }
+
+           lang = lang || 'en';
+           var url = endpoint.replace('en', lang) + utilQsString({
+             action: 'query',
+             list: 'search',
+             srlimit: '10',
+             srinfo: 'suggestion',
+             format: 'json',
+             origin: '*',
+             srsearch: query
+           });
+           d3_json(url).then(function (result) {
+             if (result && result.error) {
+               throw new Error(result.error);
+             } else if (!result || !result.query || !result.query.search) {
+               throw new Error('No Results');
+             }
+
+             if (callback) {
+               var titles = result.query.search.map(function (d) {
+                 return d.title;
+               });
+               callback(null, titles);
+             }
+           })["catch"](function (err) {
+             if (callback) callback(err, []);
+           });
+         },
+         suggestions: function suggestions(lang, query, callback) {
+           if (!query) {
+             if (callback) callback('', []);
+             return;
+           }
+
+           lang = lang || 'en';
+           var url = endpoint.replace('en', lang) + utilQsString({
+             action: 'opensearch',
+             namespace: 0,
+             suggest: '',
+             format: 'json',
+             origin: '*',
+             search: query
+           });
+           d3_json(url).then(function (result) {
+             if (result && result.error) {
+               throw new Error(result.error);
+             } else if (!result || result.length < 2) {
+               throw new Error('No Results');
+             }
+
+             if (callback) callback(null, result[1] || []);
+           })["catch"](function (err) {
+             if (callback) callback(err.message, []);
+           });
+         },
+         translations: function translations(lang, title, callback) {
+           if (!title) {
+             if (callback) callback('No Title');
+             return;
+           }
+
+           var url = endpoint.replace('en', lang) + utilQsString({
+             action: 'query',
+             prop: 'langlinks',
+             format: 'json',
+             origin: '*',
+             lllimit: 500,
+             titles: title
+           });
+           d3_json(url).then(function (result) {
+             if (result && result.error) {
+               throw new Error(result.error);
+             } else if (!result || !result.query || !result.query.pages) {
+               throw new Error('No Results');
+             }
+
+             if (callback) {
+               var list = result.query.pages[Object.keys(result.query.pages)[0]];
+               var translations = {};
+
+               if (list && list.langlinks) {
+                 list.langlinks.forEach(function (d) {
+                   translations[d.lang] = d['*'];
+                 });
+               }
+
+               callback(null, translations);
+             }
+           })["catch"](function (err) {
+             if (callback) callback(err.message);
+           });
+         }
+       };
+
+       var services = {
+         geocoder: serviceNominatim,
+         keepRight: serviceKeepRight,
+         improveOSM: serviceImproveOSM,
+         osmose: serviceOsmose,
+         mapillary: serviceMapillary,
+         nsi: serviceNsi,
+         kartaview: serviceKartaview,
+         osm: serviceOsm,
+         osmWikibase: serviceOsmWikibase,
+         maprules: serviceMapRules,
+         streetside: serviceStreetside,
+         taginfo: serviceTaginfo,
+         vectorTile: serviceVectorTile,
+         wikidata: serviceWikidata,
+         wikipedia: serviceWikipedia
+       };
+
+       function modeDragNote(context) {
+         var mode = {
+           id: 'drag-note',
+           button: 'browse'
+         };
+         var edit = behaviorEdit(context);
+
+         var _nudgeInterval;
+
+         var _lastLoc;
+
+         var _note; // most current note.. dragged note may have stale datum.
+
+
+         function startNudge(d3_event, nudge) {
+           if (_nudgeInterval) window.clearInterval(_nudgeInterval);
+           _nudgeInterval = window.setInterval(function () {
+             context.map().pan(nudge);
+             doMove(d3_event, nudge);
+           }, 50);
+         }
+
+         function stopNudge() {
+           if (_nudgeInterval) {
+             window.clearInterval(_nudgeInterval);
+             _nudgeInterval = null;
+           }
+         }
+
+         function origin(note) {
+           return context.projection(note.loc);
+         }
+
+         function start(d3_event, note) {
+           _note = note;
+           var osm = services.osm;
+
+           if (osm) {
+             // Get latest note from cache.. The marker may have a stale datum bound to it
+             // and dragging it around can sometimes delete the users note comment.
+             _note = osm.getNote(_note.id);
+           }
+
+           context.surface().selectAll('.note-' + _note.id).classed('active', true);
+           context.perform(actionNoop());
+           context.enter(mode);
+           context.selectedNoteID(_note.id);
+         }
+
+         function move(d3_event, entity, point) {
+           d3_event.stopPropagation();
+           _lastLoc = context.projection.invert(point);
+           doMove(d3_event);
+           var nudge = geoViewportEdge(point, context.map().dimensions());
+
+           if (nudge) {
+             startNudge(d3_event, nudge);
+           } else {
+             stopNudge();
+           }
+         }
+
+         function doMove(d3_event, nudge) {
+           nudge = nudge || [0, 0];
+           var currPoint = d3_event && d3_event.point || context.projection(_lastLoc);
+           var currMouse = geoVecSubtract(currPoint, nudge);
+           var loc = context.projection.invert(currMouse);
+           _note = _note.move(loc);
+           var osm = services.osm;
+
+           if (osm) {
+             osm.replaceNote(_note); // update note cache
+           }
+
+           context.replace(actionNoop()); // trigger redraw
+         }
+
+         function end() {
+           context.replace(actionNoop()); // trigger redraw
+
+           context.selectedNoteID(_note.id).enter(modeSelectNote(context, _note.id));
+         }
+
+         var drag = behaviorDrag().selector('.layer-touch.markers .target.note.new').surface(context.container().select('.main-map').node()).origin(origin).on('start', start).on('move', move).on('end', end);
+
+         mode.enter = function () {
+           context.install(edit);
+         };
+
+         mode.exit = function () {
+           context.ui().sidebar.hover.cancel();
+           context.uninstall(edit);
+           context.surface().selectAll('.active').classed('active', false);
+           stopNudge();
+         };
+
+         mode.behavior = drag;
+         return mode;
+       }
+
+       function modeSelectData(context, selectedDatum) {
+         var mode = {
+           id: 'select-data',
+           button: 'browse'
+         };
+         var keybinding = utilKeybinding('select-data');
+         var dataEditor = uiDataEditor(context);
+         var behaviors = [behaviorBreathe(), behaviorHover(context), behaviorSelect(context), behaviorLasso(context), modeDragNode(context).behavior, modeDragNote(context).behavior]; // class the data as selected, or return to browse mode if the data is gone
+
+         function selectData(d3_event, drawn) {
+           var selection = context.surface().selectAll('.layer-mapdata .data' + selectedDatum.__featurehash__);
+
+           if (selection.empty()) {
+             // Return to browse mode if selected DOM elements have
+             // disappeared because the user moved them out of view..
+             var source = d3_event && d3_event.type === 'zoom' && d3_event.sourceEvent;
+
+             if (drawn && source && (source.type === 'pointermove' || source.type === 'mousemove' || source.type === 'touchmove')) {
+               context.enter(modeBrowse(context));
+             }
+           } else {
+             selection.classed('selected', true);
+           }
+         }
+
+         function esc() {
+           if (context.container().select('.combobox').size()) return;
+           context.enter(modeBrowse(context));
+         }
+
+         mode.zoomToSelected = function () {
+           var extent = geoExtent(d3_geoBounds(selectedDatum));
+           context.map().centerZoomEase(extent.center(), context.map().trimmedExtentZoom(extent));
+         };
+
+         mode.enter = function () {
+           behaviors.forEach(context.install);
+           keybinding.on(_t('inspector.zoom_to.key'), mode.zoomToSelected).on('⎋', esc, true);
+           select(document).call(keybinding);
+           selectData();
+           var sidebar = context.ui().sidebar;
+           sidebar.show(dataEditor.datum(selectedDatum)); // expand the sidebar, avoid obscuring the data if needed
+
+           var extent = geoExtent(d3_geoBounds(selectedDatum));
+           sidebar.expand(sidebar.intersects(extent));
+           context.map().on('drawn.select-data', selectData);
+         };
+
+         mode.exit = function () {
+           behaviors.forEach(context.uninstall);
+           select(document).call(keybinding.unbind);
+           context.surface().selectAll('.layer-mapdata .selected').classed('selected hover', false);
+           context.map().on('drawn.select-data', null);
+           context.ui().sidebar.hide();
+         };
+
+         return mode;
+       }
+
+       function behaviorSelect(context) {
+         var _tolerancePx = 4; // see also behaviorDrag
+
+         var _lastMouseEvent = null;
+         var _showMenu = false;
+         var _downPointers = {};
+         var _longPressTimeout = null;
+         var _lastInteractionType = null; // the id of the down pointer that's enabling multiselection while down
+
+         var _multiselectionPointerId = null; // use pointer events on supported platforms; fallback to mouse events
+
+         var _pointerPrefix = 'PointerEvent' in window ? 'pointer' : 'mouse';
+
+         function keydown(d3_event) {
+           if (d3_event.keyCode === 32) {
+             // don't react to spacebar events during text input
+             var activeNode = document.activeElement;
+             if (activeNode && new Set(['INPUT', 'TEXTAREA']).has(activeNode.nodeName)) return;
+           }
+
+           if (d3_event.keyCode === 93 || // context menu key
+           d3_event.keyCode === 32) {
+             // spacebar
+             d3_event.preventDefault();
+           }
+
+           if (d3_event.repeat) return; // ignore repeated events for held keys
+           // if any key is pressed the user is probably doing something other than long-pressing
+
+           cancelLongPress();
+
+           if (d3_event.shiftKey) {
+             context.surface().classed('behavior-multiselect', true);
+           }
+
+           if (d3_event.keyCode === 32) {
+             // spacebar
+             if (!_downPointers.spacebar && _lastMouseEvent) {
+               cancelLongPress();
+               _longPressTimeout = window.setTimeout(didLongPress, 500, 'spacebar', 'spacebar');
+               _downPointers.spacebar = {
+                 firstEvent: _lastMouseEvent,
+                 lastEvent: _lastMouseEvent
+               };
+             }
+           }
+         }
+
+         function keyup(d3_event) {
+           cancelLongPress();
+
+           if (!d3_event.shiftKey) {
+             context.surface().classed('behavior-multiselect', false);
+           }
+
+           if (d3_event.keyCode === 93) {
+             // context menu key
+             d3_event.preventDefault();
+             _lastInteractionType = 'menukey';
+             contextmenu(d3_event);
+           } else if (d3_event.keyCode === 32) {
+             // spacebar
+             var pointer = _downPointers.spacebar;
+
+             if (pointer) {
+               delete _downPointers.spacebar;
+               if (pointer.done) return;
+               d3_event.preventDefault();
+               _lastInteractionType = 'spacebar';
+               click(pointer.firstEvent, pointer.lastEvent, 'spacebar');
+             }
+           }
+         }
+
+         function pointerdown(d3_event) {
+           var id = (d3_event.pointerId || 'mouse').toString();
+           cancelLongPress();
+           if (d3_event.buttons && d3_event.buttons !== 1) return;
+           context.ui().closeEditMenu();
+           _longPressTimeout = window.setTimeout(didLongPress, 500, id, 'longdown-' + (d3_event.pointerType || 'mouse'));
+           _downPointers[id] = {
+             firstEvent: d3_event,
+             lastEvent: d3_event
+           };
+         }
+
+         function didLongPress(id, interactionType) {
+           var pointer = _downPointers[id];
+           if (!pointer) return;
+
+           for (var i in _downPointers) {
+             // don't allow this or any currently down pointer to trigger another click
+             _downPointers[i].done = true;
+           } // treat long presses like right-clicks
+
+
+           _longPressTimeout = null;
+           _lastInteractionType = interactionType;
+           _showMenu = true;
+           click(pointer.firstEvent, pointer.lastEvent, id);
+         }
+
+         function pointermove(d3_event) {
+           var id = (d3_event.pointerId || 'mouse').toString();
+
+           if (_downPointers[id]) {
+             _downPointers[id].lastEvent = d3_event;
+           }
+
+           if (!d3_event.pointerType || d3_event.pointerType === 'mouse') {
+             _lastMouseEvent = d3_event;
+
+             if (_downPointers.spacebar) {
+               _downPointers.spacebar.lastEvent = d3_event;
+             }
+           }
+         }
+
+         function pointerup(d3_event) {
+           var id = (d3_event.pointerId || 'mouse').toString();
+           var pointer = _downPointers[id];
+           if (!pointer) return;
+           delete _downPointers[id];
+
+           if (_multiselectionPointerId === id) {
+             _multiselectionPointerId = null;
+           }
+
+           if (pointer.done) return;
+           click(pointer.firstEvent, d3_event, id);
+         }
+
+         function pointercancel(d3_event) {
+           var id = (d3_event.pointerId || 'mouse').toString();
+           if (!_downPointers[id]) return;
+           delete _downPointers[id];
+
+           if (_multiselectionPointerId === id) {
+             _multiselectionPointerId = null;
+           }
+         }
+
+         function contextmenu(d3_event) {
+           d3_event.preventDefault();
+
+           if (!+d3_event.clientX && !+d3_event.clientY) {
+             if (_lastMouseEvent) {
+               d3_event.sourceEvent = _lastMouseEvent;
+             } else {
+               return;
+             }
+           } else {
+             _lastMouseEvent = d3_event;
+             _lastInteractionType = 'rightclick';
+           }
+
+           _showMenu = true;
+           click(d3_event, d3_event);
+         }
+
+         function click(firstEvent, lastEvent, pointerId) {
+           cancelLongPress();
+           var mapNode = context.container().select('.main-map').node(); // Use the `main-map` coordinate system since the surface and supersurface
+           // are transformed when drag-panning.
+
+           var pointGetter = utilFastMouse(mapNode);
+           var p1 = pointGetter(firstEvent);
+           var p2 = pointGetter(lastEvent);
+           var dist = geoVecLength(p1, p2);
+
+           if (dist > _tolerancePx || !mapContains(lastEvent)) {
+             resetProperties();
+             return;
+           }
+
+           var targetDatum = lastEvent.target.__data__;
+           var multiselectEntityId;
+
+           if (!_multiselectionPointerId) {
+             // If a different pointer than the one triggering this click is down on a
+             // feature, treat this and all future clicks as multiselection until that
+             // pointer is raised.
+             var selectPointerInfo = pointerDownOnSelection(pointerId);
+
+             if (selectPointerInfo) {
+               _multiselectionPointerId = selectPointerInfo.pointerId; // if the other feature isn't selected yet, make sure we select it
+
+               multiselectEntityId = !selectPointerInfo.selected && selectPointerInfo.entityId;
+               _downPointers[selectPointerInfo.pointerId].done = true;
+             }
+           } // support multiselect if data is already selected
+
+
+           var isMultiselect = context.mode().id === 'select' && ( // and shift key is down
+           lastEvent && lastEvent.shiftKey || // or we're lasso-selecting
+           context.surface().select('.lasso').node() || // or a pointer is down over a selected feature
+           _multiselectionPointerId && !multiselectEntityId);
+
+           processClick(targetDatum, isMultiselect, p2, multiselectEntityId);
+
+           function mapContains(event) {
+             var rect = mapNode.getBoundingClientRect();
+             return event.clientX >= rect.left && event.clientX <= rect.right && event.clientY >= rect.top && event.clientY <= rect.bottom;
+           }
+
+           function pointerDownOnSelection(skipPointerId) {
+             var mode = context.mode();
+             var selectedIDs = mode.id === 'select' ? mode.selectedIDs() : [];
+
+             for (var pointerId in _downPointers) {
+               if (pointerId === 'spacebar' || pointerId === skipPointerId) continue;
+               var pointerInfo = _downPointers[pointerId];
+               var p1 = pointGetter(pointerInfo.firstEvent);
+               var p2 = pointGetter(pointerInfo.lastEvent);
+               if (geoVecLength(p1, p2) > _tolerancePx) continue;
+               var datum = pointerInfo.firstEvent.target.__data__;
+               var entity = datum && datum.properties && datum.properties.entity || datum;
+
+               if (context.graph().hasEntity(entity.id)) {
+                 return {
+                   pointerId: pointerId,
+                   entityId: entity.id,
+                   selected: selectedIDs.indexOf(entity.id) !== -1
+                 };
+               }
+             }
+
+             return null;
+           }
+         }
+
+         function processClick(datum, isMultiselect, point, alsoSelectId) {
+           var mode = context.mode();
+           var showMenu = _showMenu;
+           var interactionType = _lastInteractionType;
+           var entity = datum && datum.properties && datum.properties.entity;
+           if (entity) datum = entity;
+
+           if (datum && datum.type === 'midpoint') {
+             // treat targeting midpoints as if targeting the parent way
+             datum = datum.parents[0];
+           }
+
+           var newMode;
+
+           if (datum instanceof osmEntity) {
+             // targeting an entity
+             var selectedIDs = context.selectedIDs();
+             context.selectedNoteID(null);
+             context.selectedErrorID(null);
+
+             if (!isMultiselect) {
+               // don't change the selection if we're toggling the menu atop a multiselection
+               if (!showMenu || selectedIDs.length <= 1 || selectedIDs.indexOf(datum.id) === -1) {
+                 if (alsoSelectId === datum.id) alsoSelectId = null;
+                 selectedIDs = (alsoSelectId ? [alsoSelectId] : []).concat([datum.id]); // always enter modeSelect even if the entity is already
+                 // selected since listeners may expect `context.enter` events,
+                 // e.g. in the walkthrough
+
+                 newMode = mode.id === 'select' ? mode.selectedIDs(selectedIDs) : modeSelect(context, selectedIDs).selectBehavior(behavior);
+                 context.enter(newMode);
+               }
+             } else {
+               if (selectedIDs.indexOf(datum.id) !== -1) {
+                 // clicked entity is already in the selectedIDs list..
+                 if (!showMenu) {
+                   // deselect clicked entity, then reenter select mode or return to browse mode..
+                   selectedIDs = selectedIDs.filter(function (id) {
+                     return id !== datum.id;
+                   });
+                   newMode = selectedIDs.length ? mode.selectedIDs(selectedIDs) : modeBrowse(context).selectBehavior(behavior);
+                   context.enter(newMode);
+                 }
+               } else {
+                 // clicked entity is not in the selected list, add it..
+                 selectedIDs = selectedIDs.concat([datum.id]);
+                 newMode = mode.selectedIDs(selectedIDs);
+                 context.enter(newMode);
+               }
+             }
+           } else if (datum && datum.__featurehash__ && !isMultiselect) {
+             // targeting custom data
+             context.selectedNoteID(null).enter(modeSelectData(context, datum));
+           } else if (datum instanceof osmNote && !isMultiselect) {
+             // targeting a note
+             context.selectedNoteID(datum.id).enter(modeSelectNote(context, datum.id));
+           } else if (datum instanceof QAItem & !isMultiselect) {
+             // targeting an external QA issue
+             context.selectedErrorID(datum.id).enter(modeSelectError(context, datum.id, datum.service));
+           } else {
+             // targeting nothing
+             context.selectedNoteID(null);
+             context.selectedErrorID(null);
+
+             if (!isMultiselect && mode.id !== 'browse') {
+               context.enter(modeBrowse(context));
+             }
+           }
+
+           context.ui().closeEditMenu(); // always request to show the edit menu in case the mode needs it
+
+           if (showMenu) context.ui().showEditMenu(point, interactionType);
+           resetProperties();
+         }
+
+         function cancelLongPress() {
+           if (_longPressTimeout) window.clearTimeout(_longPressTimeout);
+           _longPressTimeout = null;
+         }
+
+         function resetProperties() {
+           cancelLongPress();
+           _showMenu = false;
+           _lastInteractionType = null; // don't reset _lastMouseEvent since it might still be useful
+         }
+
+         function behavior(selection) {
+           resetProperties();
+           _lastMouseEvent = context.map().lastPointerEvent();
+           select(window).on('keydown.select', keydown).on('keyup.select', keyup).on(_pointerPrefix + 'move.select', pointermove, true).on(_pointerPrefix + 'up.select', pointerup, true).on('pointercancel.select', pointercancel, true).on('contextmenu.select-window', function (d3_event) {
+             // Edge and IE really like to show the contextmenu on the
+             // menubar when user presses a keyboard menu button
+             // even after we've already preventdefaulted the key event.
+             var e = d3_event;
+
+             if (+e.clientX === 0 && +e.clientY === 0) {
+               d3_event.preventDefault();
+             }
+           });
+           selection.on(_pointerPrefix + 'down.select', pointerdown).on('contextmenu.select', contextmenu);
+           /*if (d3_event && d3_event.shiftKey) {
+               context.surface()
+                   .classed('behavior-multiselect', true);
+           }*/
+         }
+
+         behavior.off = function (selection) {
+           cancelLongPress();
+           select(window).on('keydown.select', null).on('keyup.select', null).on('contextmenu.select-window', null).on(_pointerPrefix + 'move.select', null, true).on(_pointerPrefix + 'up.select', null, true).on('pointercancel.select', null, true);
+           selection.on(_pointerPrefix + 'down.select', null).on('contextmenu.select', null);
+           context.surface().classed('behavior-multiselect', false);
+         };
+
+         return behavior;
+       }
+
+       function operationContinue(context, selectedIDs) {
+         var _entities = selectedIDs.map(function (id) {
+           return context.graph().entity(id);
+         });
+
+         var _geometries = Object.assign({
+           line: [],
+           vertex: []
+         }, utilArrayGroupBy(_entities, function (entity) {
+           return entity.geometry(context.graph());
+         }));
+
+         var _vertex = _geometries.vertex.length && _geometries.vertex[0];
+
+         function candidateWays() {
+           return _vertex ? context.graph().parentWays(_vertex).filter(function (parent) {
+             return parent.geometry(context.graph()) === 'line' && !parent.isClosed() && parent.affix(_vertex.id) && (_geometries.line.length === 0 || _geometries.line[0] === parent);
+           }) : [];
+         }
+
+         var _candidates = candidateWays();
+
+         var operation = function operation() {
+           var candidate = _candidates[0];
+           context.enter(modeDrawLine(context, candidate.id, context.graph(), 'line', candidate.affix(_vertex.id), true));
+         };
+
+         operation.relatedEntityIds = function () {
+           return _candidates.length ? [_candidates[0].id] : [];
+         };
+
+         operation.available = function () {
+           return _geometries.vertex.length === 1 && _geometries.line.length <= 1 && !context.features().hasHiddenConnections(_vertex, context.graph());
+         };
+
+         operation.disabled = function () {
+           if (_candidates.length === 0) {
+             return 'not_eligible';
+           } else if (_candidates.length > 1) {
+             return 'multiple';
+           }
+
+           return false;
+         };
+
+         operation.tooltip = function () {
+           var disable = operation.disabled();
+           return disable ? _t('operations.continue.' + disable) : _t('operations.continue.description');
+         };
+
+         operation.annotation = function () {
+           return _t('operations.continue.annotation.line');
+         };
+
+         operation.id = 'continue';
+         operation.keys = [_t('operations.continue.key')];
+         operation.title = _t('operations.continue.title');
+         operation.behavior = behaviorOperation(context).which(operation);
+         return operation;
+       }
+
+       function operationCopy(context, selectedIDs) {
+         function getFilteredIdsToCopy() {
+           return selectedIDs.filter(function (selectedID) {
+             var entity = context.graph().hasEntity(selectedID); // don't copy untagged vertices separately from ways
+
+             return entity.hasInterestingTags() || entity.geometry(context.graph()) !== 'vertex';
+           });
+         }
+
+         var operation = function operation() {
+           var graph = context.graph();
+           var selected = groupEntities(getFilteredIdsToCopy(), graph);
+           var canCopy = [];
+           var skip = {};
+           var entity;
+           var i;
+
+           for (i = 0; i < selected.relation.length; i++) {
+             entity = selected.relation[i];
+
+             if (!skip[entity.id] && entity.isComplete(graph)) {
+               canCopy.push(entity.id);
+               skip = getDescendants(entity.id, graph, skip);
+             }
+           }
+
+           for (i = 0; i < selected.way.length; i++) {
+             entity = selected.way[i];
+
+             if (!skip[entity.id]) {
+               canCopy.push(entity.id);
+               skip = getDescendants(entity.id, graph, skip);
+             }
+           }
+
+           for (i = 0; i < selected.node.length; i++) {
+             entity = selected.node[i];
+
+             if (!skip[entity.id]) {
+               canCopy.push(entity.id);
+             }
+           }
+
+           context.copyIDs(canCopy);
+
+           if (_point && (canCopy.length !== 1 || graph.entity(canCopy[0]).type !== 'node')) {
+             // store the anchor coordinates if copying more than a single node
+             context.copyLonLat(context.projection.invert(_point));
+           } else {
+             context.copyLonLat(null);
+           }
+         };
+
+         function groupEntities(ids, graph) {
+           var entities = ids.map(function (id) {
+             return graph.entity(id);
+           });
+           return Object.assign({
+             relation: [],
+             way: [],
+             node: []
+           }, utilArrayGroupBy(entities, 'type'));
+         }
+
+         function getDescendants(id, graph, descendants) {
+           var entity = graph.entity(id);
+           var children;
+           descendants = descendants || {};
+
+           if (entity.type === 'relation') {
+             children = entity.members.map(function (m) {
+               return m.id;
+             });
+           } else if (entity.type === 'way') {
+             children = entity.nodes;
+           } else {
+             children = [];
+           }
+
+           for (var i = 0; i < children.length; i++) {
+             if (!descendants[children[i]]) {
+               descendants[children[i]] = true;
+               descendants = getDescendants(children[i], graph, descendants);
+             }
+           }
+
+           return descendants;
+         }
+
+         operation.available = function () {
+           return getFilteredIdsToCopy().length > 0;
+         };
+
+         operation.disabled = function () {
+           var extent = utilTotalExtent(getFilteredIdsToCopy(), context.graph());
+
+           if (extent.percentContainedIn(context.map().extent()) < 0.8) {
+             return 'too_large';
+           }
+
+           return false;
+         };
+
+         operation.availableForKeypress = function () {
+           var selection = window.getSelection && window.getSelection(); // if the user has text selected then let them copy that, not the selected feature
+
+           return !selection || !selection.toString();
+         };
+
+         operation.tooltip = function () {
+           var disable = operation.disabled();
+           return disable ? _t('operations.copy.' + disable, {
+             n: selectedIDs.length
+           }) : _t('operations.copy.description', {
+             n: selectedIDs.length
+           });
+         };
+
+         operation.annotation = function () {
+           return _t('operations.copy.annotation', {
+             n: selectedIDs.length
+           });
+         };
+
+         var _point;
+
+         operation.point = function (val) {
+           _point = val;
+           return operation;
+         };
+
+         operation.id = 'copy';
+         operation.keys = [uiCmd('⌘C')];
+         operation.title = _t('operations.copy.title');
+         operation.behavior = behaviorOperation(context).which(operation);
+         return operation;
+       }
+
+       function operationDisconnect(context, selectedIDs) {
+         var _vertexIDs = [];
+         var _wayIDs = [];
+         var _otherIDs = [];
+         var _actions = [];
+         selectedIDs.forEach(function (id) {
+           var entity = context.entity(id);
+
+           if (entity.type === 'way') {
+             _wayIDs.push(id);
+           } else if (entity.geometry(context.graph()) === 'vertex') {
+             _vertexIDs.push(id);
+           } else {
+             _otherIDs.push(id);
+           }
+         });
+
+         var _coords,
+             _descriptionID = '',
+             _annotationID = 'features';
+
+         var _disconnectingVertexIds = [];
+         var _disconnectingWayIds = [];
+
+         if (_vertexIDs.length > 0) {
+           // At the selected vertices, disconnect the selected ways, if any, else
+           // disconnect all connected ways
+           _disconnectingVertexIds = _vertexIDs;
+
+           _vertexIDs.forEach(function (vertexID) {
+             var action = actionDisconnect(vertexID);
+
+             if (_wayIDs.length > 0) {
+               var waysIDsForVertex = _wayIDs.filter(function (wayID) {
+                 var way = context.entity(wayID);
+                 return way.nodes.indexOf(vertexID) !== -1;
+               });
+
+               action.limitWays(waysIDsForVertex);
+             }
+
+             _actions.push(action);
+
+             _disconnectingWayIds = _disconnectingWayIds.concat(context.graph().parentWays(context.graph().entity(vertexID)).map(function (d) {
+               return d.id;
+             }));
+           });
+
+           _disconnectingWayIds = utilArrayUniq(_disconnectingWayIds).filter(function (id) {
+             return _wayIDs.indexOf(id) === -1;
+           });
+           _descriptionID += _actions.length === 1 ? 'single_point.' : 'multiple_points.';
+
+           if (_wayIDs.length === 1) {
+             _descriptionID += 'single_way.' + context.graph().geometry(_wayIDs[0]);
+           } else {
+             _descriptionID += _wayIDs.length === 0 ? 'no_ways' : 'multiple_ways';
+           }
+         } else if (_wayIDs.length > 0) {
+           // Disconnect the selected ways from each other, if they're connected,
+           // else disconnect them from all connected ways
+           var ways = _wayIDs.map(function (id) {
+             return context.entity(id);
+           });
+
+           var nodes = utilGetAllNodes(_wayIDs, context.graph());
+           _coords = nodes.map(function (n) {
+             return n.loc;
+           }); // actions for connected nodes shared by at least two selected ways
+
+           var sharedActions = [];
+           var sharedNodes = []; // actions for connected nodes
+
+           var unsharedActions = [];
+           var unsharedNodes = [];
+           nodes.forEach(function (node) {
+             var action = actionDisconnect(node.id).limitWays(_wayIDs);
+
+             if (action.disabled(context.graph()) !== 'not_connected') {
+               var count = 0;
+
+               for (var i in ways) {
+                 var way = ways[i];
+
+                 if (way.nodes.indexOf(node.id) !== -1) {
+                   count += 1;
+                 }
+
+                 if (count > 1) break;
+               }
+
+               if (count > 1) {
+                 sharedActions.push(action);
+                 sharedNodes.push(node);
+               } else {
+                 unsharedActions.push(action);
+                 unsharedNodes.push(node);
+               }
+             }
+           });
+           _descriptionID += 'no_points.';
+           _descriptionID += _wayIDs.length === 1 ? 'single_way.' : 'multiple_ways.';
+
+           if (sharedActions.length) {
+             // if any nodes are shared, only disconnect the selected ways from each other
+             _actions = sharedActions;
+             _disconnectingVertexIds = sharedNodes.map(function (node) {
+               return node.id;
+             });
+             _descriptionID += 'conjoined';
+             _annotationID = 'from_each_other';
+           } else {
+             // if no nodes are shared, disconnect the selected ways from all connected ways
+             _actions = unsharedActions;
+             _disconnectingVertexIds = unsharedNodes.map(function (node) {
+               return node.id;
+             });
+
+             if (_wayIDs.length === 1) {
+               _descriptionID += context.graph().geometry(_wayIDs[0]);
+             } else {
+               _descriptionID += 'separate';
+             }
+           }
+         }
+
+         var _extent = utilTotalExtent(_disconnectingVertexIds, context.graph());
+
+         var operation = function operation() {
+           context.perform(function (graph) {
+             return _actions.reduce(function (graph, action) {
+               return action(graph);
+             }, graph);
+           }, operation.annotation());
+           context.validator().validate();
+         };
+
+         operation.relatedEntityIds = function () {
+           if (_vertexIDs.length) {
+             return _disconnectingWayIds;
+           }
+
+           return _disconnectingVertexIds;
+         };
+
+         operation.available = function () {
+           if (_actions.length === 0) return false;
+           if (_otherIDs.length !== 0) return false;
+           if (_vertexIDs.length !== 0 && _wayIDs.length !== 0 && !_wayIDs.every(function (wayID) {
+             return _vertexIDs.some(function (vertexID) {
+               var way = context.entity(wayID);
+               return way.nodes.indexOf(vertexID) !== -1;
+             });
+           })) return false;
+           return true;
+         };
+
+         operation.disabled = function () {
+           var reason;
+
+           for (var actionIndex in _actions) {
+             reason = _actions[actionIndex].disabled(context.graph());
+             if (reason) return reason;
+           }
+
+           if (_extent && _extent.percentContainedIn(context.map().extent()) < 0.8) {
+             return 'too_large.' + ((_vertexIDs.length ? _vertexIDs : _wayIDs).length === 1 ? 'single' : 'multiple');
+           } else if (_coords && someMissing()) {
+             return 'not_downloaded';
+           } else if (selectedIDs.some(context.hasHiddenConnections)) {
+             return 'connected_to_hidden';
+           }
+
+           return false;
+
+           function someMissing() {
+             if (context.inIntro()) return false;
+             var osm = context.connection();
+
+             if (osm) {
+               var missing = _coords.filter(function (loc) {
+                 return !osm.isDataLoaded(loc);
+               });
+
+               if (missing.length) {
+                 missing.forEach(function (loc) {
+                   context.loadTileAtLoc(loc);
+                 });
+                 return true;
+               }
+             }
+
+             return false;
+           }
+         };
+
+         operation.tooltip = function () {
+           var disable = operation.disabled();
+
+           if (disable) {
+             return _t('operations.disconnect.' + disable);
+           }
+
+           return _t('operations.disconnect.description.' + _descriptionID);
+         };
+
+         operation.annotation = function () {
+           return _t('operations.disconnect.annotation.' + _annotationID);
+         };
+
+         operation.id = 'disconnect';
+         operation.keys = [_t('operations.disconnect.key')];
+         operation.title = _t('operations.disconnect.title');
+         operation.behavior = behaviorOperation(context).which(operation);
+         return operation;
+       }
+
+       function operationDowngrade(context, selectedIDs) {
+         var _affectedFeatureCount = 0;
+
+         var _downgradeType = downgradeTypeForEntityIDs(selectedIDs);
+
+         var _multi = _affectedFeatureCount === 1 ? 'single' : 'multiple';
+
+         function downgradeTypeForEntityIDs(entityIds) {
+           var downgradeType;
+           _affectedFeatureCount = 0;
+
+           for (var i in entityIds) {
+             var entityID = entityIds[i];
+             var type = downgradeTypeForEntityID(entityID);
+
+             if (type) {
+               _affectedFeatureCount += 1;
+
+               if (downgradeType && type !== downgradeType) {
+                 if (downgradeType !== 'generic' && type !== 'generic') {
+                   downgradeType = 'building_address';
+                 } else {
+                   downgradeType = 'generic';
+                 }
+               } else {
+                 downgradeType = type;
+               }
+             }
+           }
+
+           return downgradeType;
+         }
+
+         function downgradeTypeForEntityID(entityID) {
+           var graph = context.graph();
+           var entity = graph.entity(entityID);
+           var preset = _mainPresetIndex.match(entity, graph);
+           if (!preset || preset.isFallback()) return null;
+
+           if (entity.type === 'node' && preset.id !== 'address' && Object.keys(entity.tags).some(function (key) {
+             return key.match(/^addr:.{1,}/);
+           })) {
+             return 'address';
+           }
+
+           var geometry = entity.geometry(graph);
+
+           if (geometry === 'area' && entity.tags.building && !preset.tags.building) {
+             return 'building';
+           }
+
+           if (geometry === 'vertex' && Object.keys(entity.tags).length) {
+             return 'generic';
+           }
+
+           return null;
+         }
+
+         var buildingKeysToKeep = ['architect', 'building', 'height', 'layer', 'source', 'type', 'wheelchair'];
+         var addressKeysToKeep = ['source'];
+
+         var operation = function operation() {
+           context.perform(function (graph) {
+             for (var i in selectedIDs) {
+               var entityID = selectedIDs[i];
+               var type = downgradeTypeForEntityID(entityID);
+               if (!type) continue;
+               var tags = Object.assign({}, graph.entity(entityID).tags); // shallow copy
+
+               for (var key in tags) {
+                 if (type === 'address' && addressKeysToKeep.indexOf(key) !== -1) continue;
+
+                 if (type === 'building') {
+                   if (buildingKeysToKeep.indexOf(key) !== -1 || key.match(/^building:.{1,}/) || key.match(/^roof:.{1,}/)) continue;
+                 }
+
+                 if (type !== 'generic') {
+                   if (key.match(/^addr:.{1,}/) || key.match(/^source:.{1,}/)) continue;
+                 }
+
+                 delete tags[key];
+               }
+
+               graph = actionChangeTags(entityID, tags)(graph);
+             }
+
+             return graph;
+           }, operation.annotation());
+           context.validator().validate(); // refresh the select mode to enable the delete operation
+
+           context.enter(modeSelect(context, selectedIDs));
+         };
+
+         operation.available = function () {
+           return _downgradeType;
+         };
+
+         operation.disabled = function () {
+           if (selectedIDs.some(hasWikidataTag)) {
+             return 'has_wikidata_tag';
+           }
+
+           return false;
+
+           function hasWikidataTag(id) {
+             var entity = context.entity(id);
+             return entity.tags.wikidata && entity.tags.wikidata.trim().length > 0;
+           }
+         };
+
+         operation.tooltip = function () {
+           var disable = operation.disabled();
+           return disable ? _t('operations.downgrade.' + disable + '.' + _multi) : _t('operations.downgrade.description.' + _downgradeType);
+         };
+
+         operation.annotation = function () {
+           var suffix;
+
+           if (_downgradeType === 'building_address') {
+             suffix = 'generic';
+           } else {
+             suffix = _downgradeType;
+           }
+
+           return _t('operations.downgrade.annotation.' + suffix, {
+             n: _affectedFeatureCount
+           });
+         };
+
+         operation.id = 'downgrade';
+         operation.keys = [uiCmd('⌫')];
+         operation.title = _t('operations.downgrade.title');
+         operation.behavior = behaviorOperation(context).which(operation);
+         return operation;
+       }
+
+       function operationExtract(context, selectedIDs) {
+         var _amount = selectedIDs.length === 1 ? 'single' : 'multiple';
 
-        var controls = bar.append('div')
-            .attr('class', 'map-controls');
-
-        controls.append('div')
-            .attr('class', 'map-control zoombuttons')
-            .call(iD.ui.Zoom(context));
+         var _geometries = utilArrayUniq(selectedIDs.map(function (entityID) {
+           return context.graph().hasEntity(entityID) && context.graph().geometry(entityID);
+         }).filter(Boolean));
 
-        controls.append('div')
-            .attr('class', 'map-control geolocate-control')
-            .call(iD.ui.Geolocate(map));
-
-        controls.append('div')
-            .attr('class', 'map-control background-control')
-            .call(iD.ui.Background(context));
-
-        controls.append('div')
-            .attr('class', 'map-control help-control')
-            .call(iD.ui.Help(context));
-
-        var footer = content.append('div')
-            .attr('id', 'footer')
-            .attr('class', 'fillD');
-
-        footer.append('div')
-            .attr('id', 'scale-block')
-            .call(iD.ui.Scale(context));
-
-        var linkList = footer.append('div')
-            .attr('id', 'info-block')
-            .append('ul')
-            .attr('id', 'about-list')
-            .attr('class', 'link-list');
-
-        if (!context.embed()) {
-            linkList.call(iD.ui.Account(context));
-        }
-
-        linkList.append('li')
-            .append('a')
-            .attr('target', '_blank')
-            .attr('tabindex', -1)
-            .attr('href', 'http://github.com/openstreetmap/iD')
-            .text(iD.version);
-
-        var bugReport = linkList.append('li')
-            .append('a')
-            .attr('target', '_blank')
-            .attr('tabindex', -1)
-            .attr('href', 'https://github.com/openstreetmap/iD/issues');
-
-        bugReport.append('span')
-            .attr('class','icon bug light');
-
-        bugReport.call(bootstrap.tooltip()
-                .title(t('report_a_bug'))
-                .placement('top')
-            );
-
-        linkList.append('li')
-            .attr('class', 'user-list')
-            .attr('tabindex', -1)
-            .call(iD.ui.Contributors(context));
-
-        footer.append('div')
-            .attr('class', 'api-status')
-            .call(iD.ui.Status(context));
-
-        window.onbeforeunload = function() {
-            return context.save();
-        };
-
-        window.onunload = function() {
-            context.history().unlock();
-        };
-
-        d3.select(window).on('resize.editor', function() {
-            map.dimensions(m.dimensions());
-        });
-
-        function pan(d) {
-            return function() {
-                context.pan(d);
-            };
-        }
-
-        // pan amount
-        var pa = 5;
-
-        var keybinding = d3.keybinding('main')
-            .on('⌫', function() { d3.event.preventDefault(); })
-            .on('←', pan([pa, 0]))
-            .on('↑', pan([0, pa]))
-            .on('→', pan([-pa, 0]))
-            .on('↓', pan([0, -pa]));
-
-        d3.select(document)
-            .call(keybinding);
-
-        context.enter(iD.modes.Browse(context));
-
-        context.container()
-            .call(iD.ui.Splash(context))
-            .call(iD.ui.Restore(context));
-
-        var authenticating = iD.ui.Loading(context)
-            .message(t('loading_auth'));
-
-        context.connection()
-            .on('authenticating.ui', function() {
-                context.container()
-                    .call(authenticating);
-            })
-            .on('authenticated.ui', function() {
-                authenticating.close();
-            });
-    }
-
-    function ui(container) {
-        context.container(container);
-        context.loadLocale(function() {
-            render(container);
-        });
-    }
-
-    ui.sidebar = iD.ui.Sidebar(context);
-
-    return ui;
-};
-
-iD.ui.tooltipHtml = function(text, key) {
-    return '<span>' + text + '</span>' + '<div class="keyhint-wrap">' + '<span> ' + (t('tooltip_keyhint')) + ' </span>' + '<span class="keyhint"> ' + key + '</span></div>';
-};
-iD.ui.Account = function(context) {
-    var connection = context.connection();
-
-    function update(selection) {
-        if (!connection.authenticated()) {
-            selection.selectAll('#userLink, #logoutLink')
-                .style('display', 'none');
-            return;
-        }
-
-        connection.userDetails(function(err, details) {
-            var userLink = selection.select('#userLink'),
-                logoutLink = selection.select('#logoutLink');
-
-            userLink.html('');
-            logoutLink.html('');
-
-            if (err) return;
-
-            selection.selectAll('#userLink, #logoutLink')
-                .style('display', 'list-item');
-
-            // Link
-            userLink.append('a')
-                .attr('href', connection.userURL(details.display_name))
-                .attr('target', '_blank');
-
-            // Add thumbnail or dont
-            if (details.image_url) {
-                userLink.append('img')
-                    .attr('class', 'icon icon-pre-text user-icon')
-                    .attr('src', details.image_url);
-            } else {
-                userLink.append('span')
-                    .attr('class', 'icon avatar light icon-pre-text');
-            }
-
-            // Add user name
-            userLink.append('span')
-                .attr('class', 'label')
-                .text(details.display_name);
-
-            logoutLink.append('a')
-                .attr('class', 'logout')
-                .attr('href', '#')
-                .text(t('logout'))
-                .on('click.logout', function() {
-                    d3.event.preventDefault();
-                    connection.logout();
-                });
-        });
-    }
-
-    return function(selection) {
-        selection.append('li')
-            .attr('id', 'logoutLink')
-            .style('display', 'none');
-
-        selection.append('li')
-            .attr('id', 'userLink')
-            .style('display', 'none');
-
-        connection.on('auth.account', function() { update(selection); });
-        update(selection);
-    };
-};
-iD.ui.Attribution = function(context) {
-    var selection;
-
-    function attribution(data, klass) {
-        var div = selection.selectAll('.' + klass)
-            .data([0]);
-
-        div.enter()
-            .append('div')
-            .attr('class', klass);
-
-        var background = div.selectAll('.attribution')
-            .data(data, function(d) { return d.name(); });
-
-        background.enter()
-            .append('span')
-            .attr('class', 'attribution')
-            .each(function(d) {
-                if (d.terms_html) {
-                    d3.select(this)
-                        .html(d.terms_html);
-                    return;
-                }
-
-                var source = d.terms_text || d.id || d.name();
-
-                if (d.logo) {
-                    source = '<img class="source-image" src="' + context.imagePath(d.logo) + '">';
-                }
-
-                if (d.terms_url) {
-                    d3.select(this)
-                        .append('a')
-                        .attr('href', d.terms_url)
-                        .attr('target', '_blank')
-                        .html(source);
-                } else {
-                    d3.select(this)
-                        .text(source);
-                }
-            });
-
-        background.exit()
-            .remove();
-
-        var copyright = background.selectAll('.copyright-notice')
-            .data(function(d) {
-                var notice = d.copyrightNotices(context.map().zoom(), context.map().extent());
-                return notice ? [notice] : [];
-            });
-
-        copyright.enter()
-            .append('span')
-            .attr('class', 'copyright-notice');
-
-        copyright.text(String);
-
-        copyright.exit()
-            .remove();
-    }
-
-    function update() {
-        attribution([context.background().baseLayerSource()], 'base-layer-attribution');
-        attribution(context.background().overlayLayerSources().filter(function (s) {
-            return s.validZoom(context.map().zoom());
-        }), 'overlay-layer-attribution');
-    }
-
-    return function(select) {
-        selection = select;
-
-        context.background()
-            .on('change.attribution', update);
-
-        context.map()
-            .on('move.attribution', _.throttle(update, 400, {leading: false}));
-
-        update();
-    };
-};
-iD.ui.Background = function(context) {
-    var key = 'b',
-        opacities = [1, 0.75, 0.5, 0.25],
-        directions = [
-            ['left', [1, 0]],
-            ['top', [0, -1]],
-            ['right', [-1, 0]],
-            ['bottom', [0, 1]]],
-        opacityDefault = (context.storage('background-opacity') !== null) ?
-            (+context.storage('background-opacity')) : 0.5,
-        customTemplate = '';
-
-    // Can be 0 from <1.3.0 use or due to issue #1923.
-    if (opacityDefault === 0) opacityDefault = 0.5;
-
-    function background(selection) {
-
-        function setOpacity(d) {
-            var bg = context.container().selectAll('.background-layer')
-                .transition()
-                .style('opacity', d)
-                .attr('data-opacity', d);
-
-            if (!iD.detect().opera) {
-                iD.util.setTransform(bg, 0, 0);
-            }
-
-            opacityList.selectAll('li')
-                .classed('active', function(_) { return _ === d; });
-
-            context.storage('background-opacity', d);
-        }
-
-        function selectLayer() {
-            function active(d) {
-                return context.background().showsLayer(d);
-            }
-
-            content.selectAll('.layer, .custom_layer')
-                .classed('active', active)
-                .selectAll('input')
-                .property('checked', active);
-        }
-
-        function clickSetSource(d) {
-            d3.event.preventDefault();
-            context.background().baseLayerSource(d);
-            selectLayer();
-        }
-
-        function editCustom() {
-            d3.event.preventDefault();
-            var template = window.prompt(t('background.custom_prompt'), customTemplate);
-            if (!template ||
-                template.indexOf('google.com') !== -1 ||
-                template.indexOf('googleapis.com') !== -1 ||
-                template.indexOf('google.ru') !== -1) {
-                selectLayer();
-                return;
-            }
-            setCustom(template);
-        }
-
-        function setCustom(template) {
-            context.background().baseLayerSource(iD.BackgroundSource.Custom(template));
-            selectLayer();
-        }
-
-        function clickSetOverlay(d) {
-            d3.event.preventDefault();
-            context.background().toggleOverlayLayer(d);
-            selectLayer();
-        }
-
-        function clickGpx() {
-            context.background().toggleGpxLayer();
-            update();
-        }
-
-        function clickMapillary() {
-            context.background().toggleMapillaryLayer();
-            update();
-        }
-
-        function drawList(layerList, type, change, filter) {
-            var sources = context.background()
-                .sources(context.map().extent())
-                .filter(filter);
-
-            var layerLinks = layerList.selectAll('li.layer')
-                .data(sources, function(d) { return d.name(); });
-
-            var enter = layerLinks.enter()
-                .insert('li', '.custom_layer')
-                .attr('class', 'layer');
-
-            // only set tooltips for layers with tooltips
-            enter.filter(function(d) { return d.description; })
-                .call(bootstrap.tooltip()
-                    .title(function(d) { return d.description; })
-                    .placement('top'));
-
-            var label = enter.append('label');
-
-            label.append('input')
-                .attr('type', type)
-                .attr('name', 'layers')
-                .on('change', change);
-
-            label.append('span')
-                .text(function(d) { return d.name(); });
-
-            layerLinks.exit()
-                .remove();
-
-            layerList.style('display', layerList.selectAll('li.layer').data().length > 0 ? 'block' : 'none');
-        }
-
-        function update() {
-            backgroundList.call(drawList, 'radio', clickSetSource, function(d) { return !d.overlay; });
-            overlayList.call(drawList, 'checkbox', clickSetOverlay, function(d) { return d.overlay; });
-
-            var hasGpx = context.background().hasGpxLayer(),
-                showsGpx = context.background().showsGpxLayer();
-
-            gpxLayerItem
-                .classed('active', showsGpx)
-                .selectAll('input')
-                .property('disabled', !hasGpx)
-                .property('checked', showsGpx);
-
-            var showsMapillary = context.background().showsMapillaryLayer();
-
-            mapillaryLayerItem
-                .classed('active', showsMapillary)
-                .selectAll('input')
-                .property('checked', showsMapillary);
-
-            selectLayer();
-
-            var source = context.background().baseLayerSource();
-            if (source.id === 'custom') {
-                customTemplate = source.template;
-            }
-        }
-
-        function clickNudge(d) {
-
-            var timeout = window.setTimeout(function() {
-                    interval = window.setInterval(nudge, 100);
-                }, 500),
-                interval;
-
-            d3.select(this).on('mouseup', function() {
-                window.clearInterval(interval);
-                window.clearTimeout(timeout);
-                nudge();
-            });
-
-            function nudge() {
-                var offset = context.background()
-                    .nudge(d[1], context.map().zoom())
-                    .offset();
-                resetButton.classed('disabled', offset[0] === 0 && offset[1] === 0);
-            }
-        }
-
-        var content = selection.append('div')
-                .attr('class', 'fillL map-overlay col3 content hide'),
-            tooltip = bootstrap.tooltip()
-                .placement('left')
-                .html(true)
-                .title(iD.ui.tooltipHtml(t('background.description'), key));
-
-        function hide() { setVisible(false); }
-
-        function toggle() {
-            if (d3.event) d3.event.preventDefault();
-            tooltip.hide(button);
-            setVisible(!button.classed('active'));
-        }
-
-        function setVisible(show) {
-            if (show !== shown) {
-                button.classed('active', show);
-                shown = show;
-
-                if (show) {
-                    selection.on('mousedown.background-inside', function() {
-                        return d3.event.stopPropagation();
-                    });
-                    content.style('display', 'block')
-                        .style('right', '-300px')
-                        .transition()
-                        .duration(200)
-                        .style('right', '0px');
-                } else {
-                    content.style('display', 'block')
-                        .style('right', '0px')
-                        .transition()
-                        .duration(200)
-                        .style('right', '-300px')
-                        .each('end', function() {
-                            d3.select(this).style('display', 'none');
-                        });
-                    selection.on('mousedown.background-inside', null);
-                }
-            }
-        }
-
-        var button = selection.append('button')
-                .attr('tabindex', -1)
-                .on('click', toggle)
-                .call(tooltip),
-            opa = content
-                .append('div')
-                .attr('class', 'opacity-options-wrapper'),
-            shown = false;
-
-        button.append('span')
-            .attr('class', 'icon layers light');
-
-        opa.append('h4')
-            .text(t('background.title'));
-
-        var opacityList = opa.append('ul')
-            .attr('class', 'opacity-options');
-
-        opacityList.selectAll('div.opacity')
-            .data(opacities)
-            .enter()
-            .append('li')
-            .attr('data-original-title', function(d) {
-                return t('background.percent_brightness', { opacity: (d * 100) });
-            })
-            .on('click.set-opacity', setOpacity)
-            .html('<div class="select-box"></div>')
-            .call(bootstrap.tooltip()
-                .placement('left'))
-            .append('div')
-            .attr('class', 'opacity')
-            .style('opacity', String);
-
-        var backgroundList = content.append('ul')
-            .attr('class', 'layer-list');
-
-        var custom = backgroundList.append('li')
-            .attr('class', 'custom_layer')
-            .datum(iD.BackgroundSource.Custom());
-
-        custom.append('button')
-            .attr('class', 'layer-browse')
-            .call(bootstrap.tooltip()
-                .title(t('background.custom_button'))
-                .placement('left'))
-            .on('click', editCustom)
-            .append('span')
-            .attr('class', 'icon geocode');
-
-        var label = custom.append('label');
-
-        label.append('input')
-            .attr('type', 'radio')
-            .attr('name', 'layers')
-            .on('change', function () {
-                if (customTemplate) {
-                    setCustom(customTemplate);
-                } else {
-                    editCustom();
-                }
-            });
-
-        label.append('span')
-            .text(t('background.custom'));
-
-        var overlayList = content.append('ul')
-            .attr('class', 'layer-list');
-
-        var mapillaryLayerItem = overlayList.append('li');
-
-        label = mapillaryLayerItem.append('label')
-            .call(bootstrap.tooltip()
-                .title(t('mapillary.tooltip'))
-                .placement('top'));
-
-        label.append('input')
-            .attr('type', 'checkbox')
-            .on('change', clickMapillary);
-
-        label.append('span')
-            .text(t('mapillary.title'));
-
-        var gpxLayerItem = content.append('ul')
-            .style('display', iD.detect().filedrop ? 'block' : 'none')
-            .attr('class', 'layer-list')
-            .append('li')
-            .classed('layer-toggle-gpx', true);
-
-        gpxLayerItem.append('button')
-            .attr('class', 'layer-extent')
-            .call(bootstrap.tooltip()
-                .title(t('gpx.zoom'))
-                .placement('left'))
-            .on('click', function() {
-                d3.event.preventDefault();
-                d3.event.stopPropagation();
-                context.background().zoomToGpxLayer();
-            })
-            .append('span')
-            .attr('class', 'icon geolocate');
-
-        gpxLayerItem.append('button')
-            .attr('class', 'layer-browse')
-            .call(bootstrap.tooltip()
-                .title(t('gpx.browse'))
-                .placement('left'))
-            .on('click', function() {
-                d3.select(document.createElement('input'))
-                    .attr('type', 'file')
-                    .on('change', function() {
-                        context.background().gpxLayerFiles(d3.event.target.files);
-                    })
-                    .node().click();
-            })
-            .append('span')
-            .attr('class', 'icon geocode');
-
-        label = gpxLayerItem.append('label')
-            .call(bootstrap.tooltip()
-                .title(t('gpx.drag_drop'))
-                .placement('top'));
-
-        label.append('input')
-            .attr('type', 'checkbox')
-            .property('disabled', true)
-            .on('change', clickGpx);
-
-        label.append('span')
-            .text(t('gpx.local_layer'));
-
-        var adjustments = content.append('div')
-            .attr('class', 'adjustments');
-
-        adjustments.append('a')
-            .text(t('background.fix_misalignment'))
-            .attr('href', '#')
-            .classed('hide-toggle', true)
-            .classed('expanded', false)
-            .on('click', function() {
-                var exp = d3.select(this).classed('expanded');
-                nudgeContainer.style('display', exp ? 'none' : 'block');
-                d3.select(this).classed('expanded', !exp);
-                d3.event.preventDefault();
-            });
-
-        var nudgeContainer = adjustments.append('div')
-            .attr('class', 'nudge-container cf')
-            .style('display', 'none');
-
-        nudgeContainer.selectAll('button')
-            .data(directions).enter()
-            .append('button')
-            .attr('class', function(d) { return d[0] + ' nudge'; })
-            .on('mousedown', clickNudge);
-
-        var resetButton = nudgeContainer.append('button')
-            .attr('class', 'reset disabled')
-            .on('click', function () {
-                context.background().offset([0, 0]);
-                resetButton.classed('disabled', true);
-            });
-
-        resetButton.append('div')
-            .attr('class', 'icon undo');
-
-        context.map()
-            .on('move.background-update', _.debounce(update, 1000));
-
-        context.background()
-            .on('change.background-update', update);
-
-        update();
-        setOpacity(opacityDefault);
-
-        var keybinding = d3.keybinding('background');
-        keybinding.on(key, toggle);
-        keybinding.on('m', function() {
-            context.enter(iD.modes.SelectImage(context));
-        });
-
-        d3.select(document)
-            .call(keybinding);
-
-        context.surface().on('mousedown.background-outside', hide);
-        context.container().on('mousedown.background-outside', hide);
-    }
-
-    return background;
-};
-// Translate a MacOS key command into the appropriate Windows/Linux equivalent.
-// For example, ⌘Z -> Ctrl+Z
-iD.ui.cmd = function(code) {
-    if (iD.detect().os === 'mac')
-        return code;
-
-    var replacements = {
-        '⌘': 'Ctrl',
-        '⇧': 'Shift',
-        '⌥': 'Alt',
-        '⌫': 'Backspace',
-        '⌦': 'Delete'
-    }, keys = [];
-
-    if (iD.detect().os === 'win') {
-        if (code === '⌘⇧Z') return 'Ctrl+Y';
-    }
-
-    for (var i = 0; i < code.length; i++) {
-        if (code[i] in replacements) {
-            keys.push(replacements[code[i]]);
-        } else {
-            keys.push(code[i]);
-        }
-    }
-
-    return keys.join('+');
-};
-iD.ui.Commit = function(context) {
-    var event = d3.dispatch('cancel', 'save');
-
-    function commit(selection) {
-        var changes = context.history().changes(),
-            summary = context.history().difference().summary();
-
-        function zoomToEntity(change) {
-            var entity = change.entity;
-            if (change.changeType !== 'deleted' &&
-                context.graph().entity(entity.id).geometry(context.graph()) !== 'vertex') {
-                context.map().zoomTo(entity);
-                context.surface().selectAll(
-                    iD.util.entityOrMemberSelector([entity.id], context.graph()))
-                    .classed('hover', true);
-            }
-        }
-
-        var header = selection.append('div')
-            .attr('class', 'header fillL');
-
-        header.append('button')
-            .attr('class', 'fr')
-            .on('click', event.cancel)
-            .append('span')
-            .attr('class', 'icon close');
-
-        header.append('h3')
-            .text(t('commit.title'));
-
-        var body = selection.append('div')
-            .attr('class', 'body');
-
-        // Comment Section
-        var commentSection = body.append('div')
-            .attr('class', 'modal-section form-field commit-form');
-
-        commentSection.append('label')
-            .attr('class', 'form-label')
-            .text(t('commit.message_label'));
-
-        var commentField = commentSection.append('textarea')
-            .attr('placeholder', t('commit.description_placeholder'))
-            .attr('maxlength', 255)
-            .property('value', context.storage('comment') || '')
-            .on('blur.save', function () {
-                context.storage('comment', this.value);
-            });
-
-        commentField.node().select();
-
-        // Warnings
-        var warnings = body.selectAll('div.warning-section')
-            .data([iD.validate(changes, context.graph())])
-            .enter()
-            .append('div')
-            .attr('class', 'modal-section warning-section fillL2')
-            .style('display', function(d) { return _.isEmpty(d) ? 'none' : null; })
-            .style('background', '#ffb');
-
-        warnings.append('h3')
-            .text(t('commit.warnings'));
-
-        var warningLi = warnings.append('ul')
-            .attr('class', 'changeset-list')
-            .selectAll('li')
-            .data(function(d) { return d; })
-            .enter()
-            .append('li')
-            .style()
-            .on('mouseover', mouseover)
-            .on('mouseout', mouseout)
-            .on('click', warningClick);
-
-        warningLi.append('span')
-            .attr('class', 'alert icon icon-pre-text');
-
-        warningLi.append('strong').text(function(d) {
-            return d.message;
-        });
-
-        warningLi.filter(function(d) { return d.tooltip; })
-            .call(bootstrap.tooltip()
-                .title(function(d) { return d.tooltip; })
-                .placement('top')
-            );
-
-        // Save Section
-        var saveSection = body.append('div')
-            .attr('class','modal-section fillL cf');
-
-        var prose = saveSection.append('p')
-            .attr('class', 'commit-info')
-            .html(t('commit.upload_explanation'));
-
-        context.connection().userDetails(function(err, user) {
-            if (err) return;
-
-            var userLink = d3.select(document.createElement('div'));
-
-            if (user.image_url) {
-                userLink.append('img')
-                    .attr('src', user.image_url)
-                    .attr('class', 'icon icon-pre-text user-icon');
-            }
-
-            userLink.append('a')
-                .attr('class','user-info')
-                .text(user.display_name)
-                .attr('href', context.connection().userURL(user.display_name))
-                .attr('tabindex', -1)
-                .attr('target', '_blank');
-
-            prose.html(t('commit.upload_explanation_with_user', {user: userLink.html()}));
-        });
-
-        // Confirm Button
-        var saveButton = saveSection.append('button')
-            .attr('class', 'action col4 button')
-            .on('click.save', function() {
-                event.save({
-                    comment: commentField.node().value
-                });
-            });
-
-        saveButton.append('span')
-            .attr('class', 'label')
-            .text(t('commit.save'));
-
-        var changeSection = body.selectAll('div.commit-section')
-            .data([0])
-            .enter()
-            .append('div')
-            .attr('class', 'commit-section modal-section fillL2');
-
-        changeSection.append('h3')
-            .text(t('commit.changes', {count: summary.length}));
-
-        var li = changeSection.append('ul')
-            .attr('class', 'changeset-list')
-            .selectAll('li')
-            .data(summary)
-            .enter()
-            .append('li')
-            .on('mouseover', mouseover)
-            .on('mouseout', mouseout)
-            .on('click', zoomToEntity);
-
-        li.append('span')
-            .attr('class', function(d) {
-                return d.entity.geometry(d.graph) + ' ' + d.changeType + ' icon icon-pre-text';
-            });
-
-        li.append('span')
-            .attr('class', 'change-type')
-            .text(function(d) {
-                return t('commit.' + d.changeType) + ' ';
-            });
-
-        li.append('strong')
-            .attr('class', 'entity-type')
-            .text(function(d) {
-                return context.presets().match(d.entity, d.graph).name();
-            });
-
-        li.append('span')
-            .attr('class', 'entity-name')
-            .text(function(d) {
-                var name = iD.util.displayName(d.entity) || '',
-                    string = '';
-                if (name !== '') string += ':';
-                return string += ' ' + name;
-            });
-
-        li.style('opacity', 0)
-            .transition()
-            .style('opacity', 1);
-
-        li.style('opacity', 0)
-            .transition()
-            .style('opacity', 1);
-
-        function mouseover(d) {
-            if (d.entity) {
-                context.surface().selectAll(
-                    iD.util.entityOrMemberSelector([d.entity.id], context.graph())
-                ).classed('hover', true);
-            }
-        }
-
-        function mouseout() {
-            context.surface().selectAll('.hover')
-                .classed('hover', false);
-        }
-
-        function warningClick(d) {
-            if (d.entity) {
-                context.map().zoomTo(d.entity);
-                context.enter(
-                    iD.modes.Select(context, [d.entity.id])
-                        .suppressMenu(true));
-            }
-        }
-    }
-
-    return d3.rebind(commit, event, 'on');
-};
-iD.ui.confirm = function(selection) {
-    var modal = iD.ui.modal(selection);
-
-    modal.select('.modal')
-        .classed('modal-alert', true);
-
-    var section = modal.select('.content');
-
-    section.append('div')
-        .attr('class', 'modal-section header');
-
-    section.append('div')
-        .attr('class', 'modal-section message-text');
-
-    var buttonwrap = section.append('div')
-        .attr('class', 'modal-section buttons cf');
-
-    buttonwrap.append('button')
-        .attr('class', 'col2 action')
-        .on('click.confirm', function() {
-            modal.remove();
-        })
-        .text(t('confirm.okay'));
-
-    return modal;
-};
-iD.ui.Contributors = function(context) {
-    function update(selection) {
-        var users = {},
-            limit = 4,
-            entities = context.intersects(context.map().extent());
-
-        entities.forEach(function(entity) {
-            if (entity && entity.user) users[entity.user] = true;
-        });
-
-        var u = Object.keys(users),
-            subset = u.slice(0, u.length > limit ? limit - 1 : limit);
-
-        selection.html('')
-            .append('span')
-            .attr('class', 'icon nearby light icon-pre-text');
-
-        var userList = d3.select(document.createElement('span'));
-
-        userList.selectAll()
-            .data(subset)
-            .enter()
-            .append('a')
-            .attr('class', 'user-link')
-            .attr('href', function(d) { return context.connection().userURL(d); })
-            .attr('target', '_blank')
-            .attr('tabindex', -1)
-            .text(String);
-
-        if (u.length > limit) {
-            var count = d3.select(document.createElement('span'));
-
-            count.append('a')
-                .attr('target', '_blank')
-                .attr('tabindex', -1)
-                .attr('href', function() {
-                    return context.connection().changesetsURL(context.map().center(), context.map().zoom());
-                })
-                .text(u.length - limit + 1);
-
-            selection.append('span')
-                .html(t('contributors.truncated_list', {users: userList.html(), count: count.html()}));
-        } else {
-            selection.append('span')
-                .html(t('contributors.list', {users: userList.html()}));
-        }
-
-        if (!u.length) {
-            selection.transition().style('opacity', 0);
-        } else if (selection.style('opacity') === '0') {
-            selection.transition().style('opacity', 1);
-        }
-    }
-
-    return function(selection) {
-        update(selection);
-
-        context.connection().on('load.contributors', function() {
-            update(selection);
-        });
-
-        context.map().on('move.contributors', _.debounce(function() {
-            update(selection);
-        }, 500));
-    };
-};
-iD.ui.Disclosure = function() {
-    var dispatch = d3.dispatch('toggled'),
-        title,
-        expanded = false,
-        content = function () {};
-
-    var disclosure = function(selection) {
-        var $link = selection.selectAll('.hide-toggle')
-            .data([0]);
-
-        $link.enter().append('a')
-            .attr('href', '#')
-            .attr('class', 'hide-toggle');
-
-        $link.text(title)
-            .on('click', toggle)
-            .classed('expanded', expanded);
-
-        var $body = selection.selectAll('div')
-            .data([0]);
-
-        $body.enter().append('div');
-
-        $body.classed('hide', !expanded)
-            .call(content);
-
-        function toggle() {
-            expanded = !expanded;
-            $link.classed('expanded', expanded);
-            $body.call(iD.ui.Toggle(expanded));
-            dispatch.toggled(expanded);
-        }
-    };
-
-    disclosure.title = function(_) {
-        if (!arguments.length) return title;
-        title = _;
-        return disclosure;
-    };
-
-    disclosure.expanded = function(_) {
-        if (!arguments.length) return expanded;
-        expanded = _;
-        return disclosure;
-    };
-
-    disclosure.content = function(_) {
-        if (!arguments.length) return content;
-        content = _;
-        return disclosure;
-    };
-
-    return d3.rebind(disclosure, dispatch, 'on');
-};
-iD.ui.EntityEditor = function(context) {
-    var event = d3.dispatch('choose'),
-        state = 'select',
-        id,
-        preset,
-        reference;
-
-    var presetEditor = iD.ui.preset(context)
-        .on('change', changeTags);
-    var rawTagEditor = iD.ui.RawTagEditor(context)
-        .on('change', changeTags);
-
-    function entityEditor(selection) {
-        var entity = context.entity(id),
-            tags = _.clone(entity.tags);
-
-        var $header = selection.selectAll('.header')
-            .data([0]);
-
-        // Enter
-
-        var $enter = $header.enter().append('div')
-            .attr('class', 'header fillL cf');
-
-        $enter.append('button')
-            .attr('class', 'fr preset-close')
-            .append('span')
-            .attr('class', 'icon close');
-
-        $enter.append('h3');
-
-        // Update
-
-        $header.select('h3')
-            .text(t('inspector.edit'));
-
-        $header.select('.preset-close')
-            .on('click', function() {
-                context.enter(iD.modes.Browse(context));
-            });
-
-        var $body = selection.selectAll('.inspector-body')
-            .data([0]);
-
-        // Enter
-
-        $enter = $body.enter().append('div')
-            .attr('class', 'inspector-body');
-
-        $enter.append('div')
-            .attr('class', 'preset-list-item inspector-inner')
-            .append('div')
-            .attr('class', 'preset-list-button-wrap')
-            .append('button')
-            .attr('class', 'preset-list-button preset-reset')
-            .call(bootstrap.tooltip()
-                .title(t('inspector.back_tooltip'))
-                .placement('bottom'))
-            .append('div')
-            .attr('class', 'label');
-
-        $body.select('.preset-list-button-wrap')
-            .call(reference.button);
-
-        $body.select('.preset-list-item')
-            .call(reference.body);
-
-        $enter.append('div')
-            .attr('class', 'inspector-border inspector-preset');
-
-        $enter.append('div')
-            .attr('class', 'inspector-border raw-tag-editor inspector-inner');
-
-        $enter.append('div')
-            .attr('class', 'inspector-border raw-member-editor inspector-inner');
-
-        $enter.append('div')
-            .attr('class', 'raw-membership-editor inspector-inner');
-
-        selection.selectAll('.preset-reset')
-            .on('click', function() {
-                event.choose(preset);
-            });
-
-        // Update
-
-        $body.select('.preset-list-item button')
-            .call(iD.ui.PresetIcon()
-                .geometry(context.geometry(id))
-                .preset(preset));
-
-        $body.select('.preset-list-item .label')
-            .text(preset.name());
-
-        $body.select('.inspector-preset')
-            .call(presetEditor
-                .preset(preset)
-                .entityID(id)
-                .tags(tags)
-                .state(state));
-
-        $body.select('.raw-tag-editor')
-            .call(rawTagEditor
-                .preset(preset)
-                .entityID(id)
-                .tags(tags)
-                .state(state));
-
-        if (entity.type === 'relation') {
-            $body.select('.raw-member-editor')
-                .style('display', 'block')
-                .call(iD.ui.RawMemberEditor(context)
-                    .entityID(id));
-        } else {
-            $body.select('.raw-member-editor')
-                .style('display', 'none');
-        }
-
-        $body.select('.raw-membership-editor')
-            .call(iD.ui.RawMembershipEditor(context)
-                .entityID(id));
-
-        function historyChanged() {
-            if (state === 'hide') return;
-            var entity = context.hasEntity(id);
-            if (!entity) return;
-            entityEditor.preset(context.presets().match(entity, context.graph()));
-            entityEditor(selection);
-        }
-
-        context.history()
-            .on('change.entity-editor', historyChanged);
-    }
-
-    function clean(o) {
-        var out = {}, k, v;
-        /*jshint -W083 */
-        for (k in o) {
-            if (k && (v = o[k]) !== undefined) {
-                out[k] = v.split(';').map(function(s) { return s.trim(); }).join(';');
-            }
-        }
-        /*jshint +W083 */
-        return out;
-    }
-
-    function changeTags(changed) {
-        var entity = context.entity(id),
-            tags = clean(_.extend({}, entity.tags, changed));
-
-        if (!_.isEqual(entity.tags, tags)) {
-            context.perform(
-                iD.actions.ChangeTags(id, tags),
-                t('operations.change_tags.annotation'));
-        }
-    }
-
-    entityEditor.state = function(_) {
-        if (!arguments.length) return state;
-        state = _;
-        return entityEditor;
-    };
-
-    entityEditor.entityID = function(_) {
-        if (!arguments.length) return id;
-        id = _;
-        entityEditor.preset(context.presets().match(context.entity(id), context.graph()));
-        return entityEditor;
-    };
-
-    entityEditor.preset = function(_) {
-        if (!arguments.length) return preset;
-        if (_ !== preset) {
-            preset = _;
-            reference = iD.ui.TagReference(preset.reference(context.geometry(id)))
-                .showing(false);
-        }
-        return entityEditor;
-    };
-
-    return d3.rebind(entityEditor, event, 'on');
-};
-iD.ui.FeatureList = function(context) {
-    var geocodeResults;
-
-    function featureList(selection) {
-        var header = selection.append('div')
-            .attr('class', 'header fillL cf');
-
-        header.append('h3')
-            .text(t('inspector.feature_list'));
-
-        function keypress() {
-            var q = search.property('value'),
-                items = list.selectAll('.feature-list-item');
-            if (d3.event.keyCode === 13 && q.length && items.size()) {
-                click(items.datum());
-            }
-        }
-
-        function inputevent() {
-            geocodeResults = undefined;
-            drawList();
-        }
-
-        var searchWrap = selection.append('div')
-            .attr('class', 'search-header');
-
-        var search = searchWrap.append('input')
-            .attr('placeholder', t('inspector.search'))
-            .attr('type', 'search')
-            .on('keypress', keypress)
-            .on('input', inputevent);
-
-        searchWrap.append('span')
-            .attr('class', 'icon search');
-
-        var listWrap = selection.append('div')
-            .attr('class', 'inspector-body');
-
-        var list = listWrap.append('div')
-            .attr('class', 'feature-list cf');
-
-        context.map()
-            .on('drawn.feature-list', mapDrawn);
-
-        function mapDrawn(e) {
-            if (e.full) {
-                drawList();
-            }
-        }
-
-        function features() {
-            var entities = {},
-                result = [],
-                graph = context.graph(),
-                q = search.property('value').toLowerCase();
-
-            if (!q) return result;
-
-            var idMatch = q.match(/^([nwr])([0-9]+)$/);
-
-            if (idMatch) {
-                result.push({
-                    id: idMatch[0],
-                    geometry: idMatch[1] === 'n' ? 'point' : idMatch[1] === 'w' ? 'line' : 'relation',
-                    type: idMatch[1] === 'n' ? t('inspector.node') : idMatch[1] === 'w' ? t('inspector.way') : t('inspector.relation'),
-                    name: idMatch[2]
-                });
-            }
-
-            var locationMatch = sexagesimal.pair(q.toUpperCase()) || q.match(/^(-?\d+\.?\d*)\s+(-?\d+\.?\d*)$/);
-
-            if (locationMatch) {
-                var loc = [parseFloat(locationMatch[0]), parseFloat(locationMatch[1])];
-                result.push({
-                    id: -1,
-                    geometry: 'point',
-                    type: t('inspector.location'),
-                    name: loc[0].toFixed(6) + ', ' + loc[1].toFixed(6),
-                    location: loc
-                });
-            }
-
-            function addEntity(entity) {
-                if (entity.id in entities || result.length > 200)
-                    return;
-
-                entities[entity.id] = true;
-
-                var name = iD.util.displayName(entity) || '';
-                if (name.toLowerCase().indexOf(q) >= 0) {
-                    result.push({
-                        id: entity.id,
-                        entity: entity,
-                        geometry: context.geometry(entity.id),
-                        type: context.presets().match(entity, graph).name(),
-                        name: name
-                    });
-                }
-
-                graph.parentRelations(entity).forEach(function(parent) {
-                    addEntity(parent);
-                });
-            }
-
-            var visible = context.surface().selectAll('.point, .line, .area')[0];
-            for (var i = 0; i < visible.length && result.length <= 200; i++) {
-                addEntity(visible[i].__data__);
-            }
-
-            (geocodeResults || []).forEach(function(d) {
-                // https://github.com/openstreetmap/iD/issues/1890
-                if (d.osm_type && d.osm_id) {
-                    result.push({
-                        id: iD.Entity.id.fromOSM(d.osm_type, d.osm_id),
-                        geometry: d.osm_type === 'relation' ? 'relation' : d.osm_type === 'way' ? 'line' : 'point',
-                        type: d.type !== 'yes' ? (d.type.charAt(0).toUpperCase() + d.type.slice(1)).replace('_', ' ')
-                                               : (d.class.charAt(0).toUpperCase() + d.class.slice(1)).replace('_', ' '),
-                        name: d.display_name,
-                        extent: new iD.geo.Extent(
-                            [parseFloat(d.boundingbox[3]), parseFloat(d.boundingbox[0])],
-                            [parseFloat(d.boundingbox[2]), parseFloat(d.boundingbox[1])])
-                    });
-                }
-            });
-
-            return result;
-        }
-
-        function drawList() {
-            var value = search.property('value'),
-                results = features();
-
-            list.classed('filtered', value.length);
-
-            var noResultsWorldwide = geocodeResults && geocodeResults.length === 0;
-
-            var resultsIndicator = list.selectAll('.no-results-item')
-                .data([0])
-                .enter().append('button')
-                .property('disabled', true)
-                .attr('class', 'no-results-item');
-
-            resultsIndicator.append('span')
-                .attr('class', 'icon alert');
-
-            resultsIndicator.append('span')
-                .attr('class', 'entity-name');
-
-            list.selectAll('.no-results-item .entity-name')
-                .text(noResultsWorldwide ? t('geocoder.no_results_worldwide') : t('geocoder.no_results_visible'));
-
-            list.selectAll('.geocode-item')
-                .data([0])
-                .enter().append('button')
-                .attr('class', 'geocode-item')
-                .on('click', geocode)
-                .append('div')
-                .attr('class', 'label')
-                .append('span')
-                .attr('class', 'entity-name')
-                .text(t('geocoder.search'));
-
-            list.selectAll('.no-results-item')
-                .style('display', (value.length && !results.length) ? 'block' : 'none');
-
-            list.selectAll('.geocode-item')
-                .style('display', (value && geocodeResults === undefined) ? 'block' : 'none');
-
-            list.selectAll('.feature-list-item')
-                .data([-1])
-                .remove();
-
-            var items = list.selectAll('.feature-list-item')
-                .data(results, function(d) { return d.id; });
-
-            var enter = items.enter().insert('button', '.geocode-item')
-                .attr('class', 'feature-list-item')
-                .on('mouseover', mouseover)
-                .on('mouseout', mouseout)
-                .on('click', click);
-
-            var label = enter.append('div')
-                .attr('class', 'label');
-
-            label.append('span')
-                .attr('class', function(d) { return d.geometry + ' icon icon-pre-text'; });
-
-            label.append('span')
-                .attr('class', 'entity-type')
-                .text(function(d) { return d.type; });
-
-            label.append('span')
-                .attr('class', 'entity-name')
-                .text(function(d) { return d.name; });
-
-            enter.style('opacity', 0)
-                .transition()
-                .style('opacity', 1);
-
-            items.order();
-
-            items.exit()
-                .remove();
-        }
-
-        function mouseover(d) {
-            if (d.id === -1) return;
-
-            context.surface().selectAll(iD.util.entityOrMemberSelector([d.id], context.graph()))
-                .classed('hover', true);
-        }
-
-        function mouseout() {
-            context.surface().selectAll('.hover')
-                .classed('hover', false);
-        }
-
-        function click(d) {
-            d3.event.preventDefault();
-            if (d.location) {
-                context.map().centerZoom([d.location[1], d.location[0]], 20);
-            }
-            else if (d.entity) {
-                context.enter(iD.modes.Select(context, [d.entity.id]));
-            } else {
-                context.loadEntity(d.id);
-            }
-        }
-
-        function geocode() {
-            var searchVal = encodeURIComponent(search.property('value'));
-            d3.json('http://nominatim.openstreetmap.org/search/' + searchVal + '?limit=10&format=json', function(err, resp) {
-                geocodeResults = resp || [];
-                drawList();
-            });
-        }
-    }
-
-    return featureList;
-};
-iD.ui.flash = function(selection) {
-    var modal = iD.ui.modal(selection);
-
-    modal.select('.modal').classed('modal-flash', true);
-
-    modal.select('.content')
-        .classed('modal-section', true)
-        .append('div')
-        .attr('class', 'description');
-
-    modal.on('click.flash', function() { modal.remove(); });
-
-    setTimeout(function() {
-        modal.remove();
-        return true;
-    }, 1500);
-
-    return modal;
-};
-iD.ui.Geolocate = function(map) {
-    function click() {
-        navigator.geolocation.getCurrentPosition(
-            success, error);
-    }
-
-    function success(position) {
-        var extent = iD.geo.Extent([position.coords.longitude, position.coords.latitude])
-            .padByMeters(position.coords.accuracy);
-
-        map.centerZoom(extent.center(), Math.min(20, map.extentZoom(extent)));
-    }
-
-    function error() { }
-
-    return function(selection) {
-        if (!navigator.geolocation) return;
-
-        var button = selection.append('button')
-            .attr('tabindex', -1)
-            .attr('title', t('geolocate.title'))
-            .on('click', click)
-            .call(bootstrap.tooltip()
-                .placement('left'));
-
-         button.append('span')
-             .attr('class', 'icon geolocate light');
-    };
-};
-iD.ui.Help = function(context) {
-    var key = 'h';
-
-    var docKeys = [
-        'help.help',
-        'help.editing_saving',
-        'help.roads',
-        'help.gps',
-        'help.imagery',
-        'help.addresses',
-        'help.inspector',
-        'help.buildings',
-        'help.relations'];
-
-    var docs = docKeys.map(function(key) {
-        var text = t(key);
-        return {
-            title: text.split('\n')[0].replace('#', '').trim(),
-            html: marked(text.split('\n').slice(1).join('\n'))
-        };
-    });
-
-    function help(selection) {
-        var shown = false;
-
-        function hide() {
-            setVisible(false);
-        }
-
-        function toggle() {
-            if (d3.event) d3.event.preventDefault();
-            tooltip.hide(button);
-            setVisible(!button.classed('active'));
-        }
-
-        function setVisible(show) {
-            if (show !== shown) {
-                button.classed('active', show);
-                shown = show;
-                if (show) {
-                    pane.style('display', 'block')
-                        .style('right', '-500px')
-                        .transition()
-                        .duration(200)
-                        .style('right', '0px');
-                } else {
-                    pane.style('right', '0px')
-                        .transition()
-                        .duration(200)
-                        .style('right', '-500px')
-                        .each('end', function() {
-                            d3.select(this).style('display', 'none');
-                        });
-                }
-            }
-        }
-
-        function clickHelp(d, i) {
-            pane.property('scrollTop', 0);
-            doctitle.text(d.title);
-            body.html(d.html);
-            body.selectAll('a')
-                .attr('target', '_blank');
-            menuItems.classed('selected', function(m) {
-                return m.title === d.title;
-            });
-
-            nav.html('');
-
-            if (i > 0) {
-                var prevLink = nav.append('a')
-                    .attr('class', 'previous')
-                    .on('click', function() {
-                        clickHelp(docs[i - 1], i - 1);
-                    });
-                prevLink.append('span').attr('class', 'icon back blue');
-                prevLink.append('span').text(docs[i - 1].title);
-            }
-            if (i < docs.length - 1) {
-                var nextLink = nav.append('a')
-                    .attr('class', 'next')
-                    .on('click', function() {
-                        clickHelp(docs[i + 1], i + 1);
-                    });
-                nextLink.append('span').text(docs[i + 1].title);
-                nextLink.append('span').attr('class', 'icon forward blue');
-            }
-        }
-
-        function clickWalkthrough() {
-            d3.select(document.body).call(iD.ui.intro(context));
-            setVisible(false);
-        }
-
-        var tooltip = bootstrap.tooltip()
-            .placement('left')
-            .html(true)
-            .title(iD.ui.tooltipHtml(t('help.title'), key));
-
-        var button = selection.append('button')
-            .attr('tabindex', -1)
-            .on('click', toggle)
-            .call(tooltip);
-
-        button.append('span')
-            .attr('class', 'icon help light');
-
-        var pane = context.container()
-            .select('.help-wrap');
-
-        var toc = pane.append('ul')
-            .attr('class', 'toc');
-
-        var menuItems = toc.selectAll('li')
-            .data(docs)
-            .enter()
-            .append('li')
-            .append('a')
-            .text(function(d) { return d.title; })
-            .on('click', clickHelp);
-
-        toc.append('li')
-            .attr('class','walkthrough')
-            .append('a')
-            .text(t('splash.walkthrough'))
-            .on('click', clickWalkthrough);
-
-        var content = pane.append('div')
-            .attr('class', 'left-content');
-
-        var doctitle = content.append('h2')
-            .text(t('help.title'));
-
-        var body = content.append('div')
-            .attr('class', 'body');
-
-        var nav = content.append('div')
-            .attr('class', 'nav');
-
-        clickHelp(docs[0], 0);
-
-        var keybinding = d3.keybinding('help')
-            .on(key, toggle);
-
-        d3.select(document)
-            .call(keybinding);
-
-        context.surface().on('mousedown.help-outside', hide);
-        context.container().on('mousedown.b.help-outside', hide);
-
-        pane.on('mousedown.help-inside', function() {
-            return d3.event.stopPropagation();
-        });
-
-    }
-
-    return help;
-};
-iD.ui.Inspector = function(context) {
-    var presetList = iD.ui.PresetList(context),
-        entityEditor = iD.ui.EntityEditor(context),
-        state = 'select',
-        entityID,
-        newFeature = false;
-
-    function inspector(selection) {
-        presetList
-            .entityID(entityID)
-            .autofocus(newFeature)
-            .on('choose', setPreset);
-
-        entityEditor
-            .state(state)
-            .entityID(entityID)
-            .on('choose', showList);
-
-        var $wrap = selection.selectAll('.panewrap')
-            .data([0]);
-
-        var $enter = $wrap.enter().append('div')
-            .attr('class', 'panewrap');
-
-        $enter.append('div')
-            .attr('class', 'preset-list-pane pane');
-
-        $enter.append('div')
-            .attr('class', 'entity-editor-pane pane');
-
-        var $presetPane = $wrap.select('.preset-list-pane');
-        var $editorPane = $wrap.select('.entity-editor-pane');
-
-        var graph = context.graph(),
-            entity = context.entity(entityID),
-            showEditor = state === 'hover' ||
-                entity.isUsed(graph) ||
-                entity.isHighwayIntersection(graph);
-
-        if (showEditor) {
-            $wrap.style('right', '0%');
-            $editorPane.call(entityEditor);
-        } else {
-            $wrap.style('right', '-100%');
-            $presetPane.call(presetList);
-        }
-
-        var $footer = selection.selectAll('.footer')
-            .data([0]);
-
-        $footer.enter().append('div')
-            .attr('class', 'footer');
-
-        selection.select('.footer')
-            .call(iD.ui.ViewOnOSM(context)
-                .entityID(entityID));
-
-        function showList(preset) {
-            $wrap.transition()
-                .styleTween('right', function() { return d3.interpolate('0%', '-100%'); });
-
-            $presetPane.call(presetList
-                .preset(preset)
-                .autofocus(true));
-        }
-
-        function setPreset(preset) {
-            $wrap.transition()
-                .styleTween('right', function() { return d3.interpolate('-100%', '0%'); });
-
-            $editorPane.call(entityEditor
-                .preset(preset));
-        }
-    }
-
-    inspector.state = function(_) {
-        if (!arguments.length) return state;
-        state = _;
-        entityEditor.state(state);
-        return inspector;
-    };
-
-    inspector.entityID = function(_) {
-        if (!arguments.length) return entityID;
-        entityID = _;
-        return inspector;
-    };
-
-    inspector.newFeature = function(_) {
-        if (!arguments.length) return newFeature;
-        newFeature = _;
-        return inspector;
-    };
-
-    return inspector;
-};
-iD.ui.intro = function(context) {
-
-    var step;
-
-    function intro(selection) {
-
-        context.enter(iD.modes.Browse(context));
-
-        // Save current map state
-        var history = context.history().toJSON(),
-            hash = window.location.hash,
-            background = context.background().baseLayerSource(),
-            opacity = d3.select('.background-layer').style('opacity'),
-            loadedTiles = context.connection().loadedTiles(),
-            baseEntities = context.history().graph().base().entities,
-            introGraph;
-
-        // Load semi-real data used in intro
-        context.connection().toggle(false).flush();
-        context.history().reset();
-        
-        introGraph = JSON.parse(iD.introGraph);
-        for (var key in introGraph) {
-            introGraph[key] = iD.Entity(introGraph[key]);
-        }
-        context.history().merge(d3.values(iD.Graph().load(introGraph).entities));
-        context.background().bing();
-
-        // Block saving
-        var savebutton = d3.select('#bar button.save'),
-            save = savebutton.on('click');
-        savebutton.on('click', null);
-        context.inIntro(true);
-
-        d3.select('.background-layer').style('opacity', 1);
-
-        var curtain = d3.curtain();
-        selection.call(curtain);
-
-        function reveal(box, text, options) {
-            options = options || {};
-            if (text) curtain.reveal(box, text, options.tooltipClass, options.duration);
-            else curtain.reveal(box, '', '', options.duration);
-        }
-
-        var steps = ['navigation', 'point', 'area', 'line', 'startEditing'].map(function(step, i) {
-            var s = iD.ui.intro[step](context, reveal)
-                .on('done', function() {
-                    entered.filter(function(d) {
-                        return d.title === s.title;
-                    }).classed('finished', true);
-                    enter(steps[i + 1]);
-                });
-            return s;
-        });
-
-        steps[steps.length - 1].on('startEditing', function() {
-            curtain.remove();
-            navwrap.remove();
-            d3.select('.background-layer').style('opacity', opacity);
-            context.connection().toggle(true).flush().loadedTiles(loadedTiles);
-            context.history().reset().merge(d3.values(baseEntities));
-            context.background().baseLayerSource(background);
-            if (history) context.history().fromJSON(history);
-            window.location.replace(hash);
-            context.inIntro(false);
-            d3.select('#bar button.save').on('click', save);
-        });
-
-        var navwrap = selection.append('div').attr('class', 'intro-nav-wrap fillD');
-
-        var buttonwrap = navwrap.append('div')
-            .attr('class', 'joined')
-            .selectAll('button.step');
-
-        var entered = buttonwrap.data(steps)
-            .enter().append('button')
-                .attr('class', 'step')
-                .on('click', enter);
-
-        entered.append('div').attr('class','icon icon-pre-text apply');
-        entered.append('label').text(function(d) { return t(d.title); });
-        enter(steps[0]);
-
-        function enter (newStep) {
-
-            if (step) {
-                step.exit();
-            }
-
-            context.enter(iD.modes.Browse(context));
-
-            step = newStep;
-            step.enter();
-
-            entered.classed('active', function(d) {
-                return d.title === step.title;
-            });
-        }
-
-    }
-    return intro;
-};
-
-iD.ui.intro.pointBox = function(point, context) {
-    var rect = context.surfaceRect();
-    point = context.projection(point);
-    return {
-        left: point[0] + rect.left - 30,
-        top: point[1] + rect.top - 50,
-        width: 60,
-        height: 70
-    };
-};
-
-iD.ui.intro.pad = function(box, padding, context) {
-    if (box instanceof Array) {
-        var rect = context.surfaceRect();
-        box = context.projection(box);
-        box = {
-            left: box[0] + rect.left,
-            top: box[1] + rect.top
-        };
-    }
-    return {
-        left: box.left - padding,
-        top: box.top - padding,
-        width: (box.width || 0) + 2 * padding,
-        height: (box.width || 0) + 2 * padding
-    };
-};
-iD.ui.Lasso = function(context) {
-
-    var box, group,
-        a = [0, 0],
-        b = [0, 0];
-
-    function lasso(selection) {
-
-        context.container().classed('lasso', true);
-
-        group = selection.append('g')
-            .attr('class', 'lasso hide');
-
-        box = group.append('rect')
-            .attr('class', 'lasso-box');
-
-        group.call(iD.ui.Toggle(true));
-
-    }
-
-    // top-left
-    function topLeft(d) {
-        return 'translate(' + Math.min(d[0][0], d[1][0]) + ',' + Math.min(d[0][1], d[1][1]) + ')';
-    }
-
-    function width(d) { return Math.abs(d[0][0] - d[1][0]); }
-    function height(d) { return Math.abs(d[0][1] - d[1][1]); }
-
-    function draw() {
-        if (box) {
-            box.data([[a, b]])
-                .attr('transform', topLeft)
-                .attr('width', width)
-                .attr('height', height);
-        }
-    }
-
-    lasso.a = function(_) {
-        if (!arguments.length) return a;
-        a = _;
-        draw();
-        return lasso;
-    };
-
-    lasso.b = function(_) {
-        if (!arguments.length) return b;
-        b = _;
-        draw();
-        return lasso;
-    };
-
-    lasso.close = function() {
-        if (group) {
-            group.call(iD.ui.Toggle(false, function() {
-                d3.select(this).remove();
-            }));
-        }
-        context.container().classed('lasso', false);
-    };
-
-    return lasso;
-};
-iD.ui.Loading = function(context) {
-    var message = '',
-        blocking = false,
-        modal;
-
-    var loading = function(selection) {
-        modal = iD.ui.modal(selection, blocking);
-
-        var loadertext = modal.select('.content')
-            .classed('loading-modal', true)
-            .append('div')
-            .attr('class', 'modal-section fillL');
-
-        loadertext.append('img')
-            .attr('class', 'loader')
-            .attr('src', context.imagePath('loader-white.gif'));
-
-        loadertext.append('h3')
-            .text(message);
-
-        modal.select('button.close')
-            .attr('class', 'hide');
-
-        return loading;
-    };
-
-    loading.message = function(_) {
-        if (!arguments.length) return message;
-        message = _;
-        return loading;
-    };
-
-    loading.blocking = function(_) {
-        if (!arguments.length) return blocking;
-        blocking = _;
-        return loading;
-    };
-
-    loading.close = function() {
-        modal.remove();
-    };
-
-    return loading;
-};
-iD.ui.modal = function(selection, blocking) {
-
-    var previous = selection.select('div.modal');
-    var animate = previous.empty();
-
-    previous.transition()
-        .duration(200)
-        .style('opacity', 0)
-        .remove();
-
-    var shaded = selection
-        .append('div')
-        .attr('class', 'shaded')
-        .style('opacity', 0);
-
-    shaded.close = function() {
-        shaded
-            .transition()
-            .duration(200)
-            .style('opacity',0)
-            .remove();
-        modal
-            .transition()
-            .duration(200)
-            .style('top','0px');
-        keybinding.off();
-    };
-
-    var keybinding = d3.keybinding('modal')
-        .on('⌫', shaded.close)
-        .on('⎋', shaded.close);
-
-    d3.select(document).call(keybinding);
-
-    var modal = shaded.append('div')
-        .attr('class', 'modal fillL col6');
-
-        shaded.on('click.remove-modal', function() {
-            if (d3.event.target === this && !blocking) shaded.close();
-        });
-
-    modal.append('button')
-        .attr('class', 'close')
-        .on('click', function() {
-            if (!blocking) shaded.close();
-        })
-        .append('div')
-            .attr('class','icon close');
-
-    modal.append('div')
-        .attr('class', 'content');
-
-    if (animate) {
-        shaded.transition().style('opacity', 1);
-        modal
-            .style('top','0px')
-            .transition()
-            .duration(200)
-            .style('top','40px');
-    } else {
-        shaded.style('opacity', 1);
-    }
-
-
-    return shaded;
-};
-iD.ui.Modes = function(context) {
-    var modes = [
-        iD.modes.AddPoint(context),
-        iD.modes.AddLine(context),
-        iD.modes.AddArea(context)];
-
-    return function(selection) {
-        var buttons = selection.selectAll('button.add-button')
-            .data(modes);
-
-       buttons.enter().append('button')
-           .attr('tabindex', -1)
-           .attr('class', function(mode) { return mode.id + ' add-button col4'; })
-           .on('click.mode-buttons', function(mode) {
-               if (mode.id === context.mode().id) {
-                   context.enter(iD.modes.Browse(context));
-               } else {
-                   context.enter(mode);
-               }
-           })
-           .call(bootstrap.tooltip()
-               .placement('bottom')
-               .html(true)
-               .title(function(mode) {
-                   return iD.ui.tooltipHtml(mode.description, mode.key);
-               }));
-
-        context.map()
-            .on('move.modes', _.debounce(update, 500));
-
-        context
-            .on('enter.modes', update);
-
-        update();
-
-        buttons.append('span')
-            .attr('class', function(mode) { return mode.id + ' icon icon-pre-text'; });
-
-        buttons.append('span')
-            .attr('class', 'label')
-            .text(function(mode) { return mode.title; });
-
-        context.on('enter.editor', function(entered) {
-            buttons.classed('active', function(mode) { return entered.button === mode.button; });
-            context.container()
-                .classed('mode-' + entered.id, true);
-        });
-
-        context.on('exit.editor', function(exited) {
-            context.container()
-                .classed('mode-' + exited.id, false);
-        });
-
-        var keybinding = d3.keybinding('mode-buttons');
-
-        modes.forEach(function(m) {
-            keybinding.on(m.key, function() { if (context.editable()) context.enter(m); });
-        });
-
-        d3.select(document)
-            .call(keybinding);
-
-        function update() {
-            buttons.property('disabled', !context.editable());
-        }
-    };
-};
-iD.ui.Notice = function(context) {
-    return function(selection) {
-        var div = selection.append('div')
-            .attr('class', 'notice');
-
-        var button = div.append('button')
-            .attr('class', 'zoom-to notice')
-            .on('click', function() { context.map().zoom(16); });
-
-        button.append('span')
-            .attr('class', 'icon zoom-in-invert');
-
-        button.append('span')
-            .attr('class', 'label')
-            .text(t('zoom_in_edit'));
-
-        function disableTooHigh() {
-            div.style('display', context.map().editable() ? 'none' : 'block');
-        }
-
-        context.map()
-            .on('move.notice', _.debounce(disableTooHigh, 500));
-
-        disableTooHigh();
-    };
-};
-iD.ui.preset = function(context) {
-    var event = d3.dispatch('change'),
-        state,
-        fields,
-        preset,
-        tags,
-        id;
-
-    function UIField(field, entity, show) {
-        field = _.clone(field);
-
-        field.input = iD.ui.preset[field.type](field, context)
-            .on('change', event.change);
-
-        if (field.input.entity) field.input.entity(entity);
-
-        field.keys = field.keys || [field.key];
-
-        field.show = show;
-
-        field.shown = function() {
-            return field.id === 'name' || field.show || _.any(field.keys, function(key) { return !!tags[key]; });
-        };
-
-        field.modified = function() {
-            var original = context.graph().base().entities[entity.id];
-            return _.any(field.keys, function(key) {
-                return original ? tags[key] !== original.tags[key] : tags[key];
-            });
-        };
-
-        field.revert = function() {
-            var original = context.graph().base().entities[entity.id],
-                t = {};
-            field.keys.forEach(function(key) {
-                t[key] = original ? original.tags[key] : undefined;
-            });
-            return t;
-        };
-
-        field.present = function() {
-            return _.any(field.keys, function(key) {
-                return tags[key];
-            });
-        };
-
-        field.remove = function() {
-            var t = {};
-            field.keys.forEach(function(key) {
-                t[key] = undefined;
-            });
-            return t;
-        };
-
-        return field;
-    }
-
-    function fieldKey(field) {
-        return field.id;
-    }
-
-    function presets(selection) {
-        if (!fields) {
-            var entity = context.entity(id),
-                geometry = context.geometry(id);
-
-            fields = [UIField(context.presets().field('name'), entity)];
-
-            preset.fields.forEach(function(field) {
-                if (field.matchGeometry(geometry)) {
-                    fields.push(UIField(field, entity, true));
-                }
-            });
-
-            if (entity.isHighwayIntersection(context.graph())) {
-                fields.push(UIField(context.presets().field('restrictions'), entity, true));
-            }
-
-            context.presets().universal().forEach(function(field) {
-                if (preset.fields.indexOf(field) < 0) {
-                    fields.push(UIField(field, entity));
-                }
-            });
-        }
-
-        var shown = fields.filter(function(field) { return field.shown(); }),
-            notShown = fields.filter(function(field) { return !field.shown(); });
-
-        var $form = selection.selectAll('.preset-form')
-            .data([0]);
-
-        $form.enter().append('div')
-            .attr('class', 'preset-form inspector-inner fillL3');
-
-        var $fields = $form.selectAll('.form-field')
-            .data(shown, fieldKey);
-
-        // Enter
-
-        var $enter = $fields.enter()
-            .insert('div', '.more-buttons')
-            .attr('class', function(field) {
-                return 'form-field form-field-' + field.id;
-            });
-
-        var $label = $enter.append('label')
-            .attr('class', 'form-label')
-            .attr('for', function(field) { return 'preset-input-' + field.id; })
-            .text(function(field) { return field.label(); });
-
-        var wrap = $label.append('div')
-            .attr('class', 'form-label-button-wrap');
-
-        wrap.append('button')
-            .attr('class', 'remove-icon')
-            .append('span').attr('class', 'icon delete');
-
-        wrap.append('button')
-            .attr('class', 'modified-icon')
-            .attr('tabindex', -1)
-            .append('div')
-            .attr('class', 'icon undo');
-
-        // Update
-
-        $fields.select('.form-label-button-wrap .remove-icon')
-            .on('click', remove);
-
-        $fields.select('.modified-icon')
-            .on('click', revert);
-
-        $fields
-            .order()
-            .classed('modified', function(field) {
-                return field.modified();
-            })
-            .classed('present', function(field) {
-                return field.present();
-            })
-            .each(function(field) {
-                var reference = iD.ui.TagReference(field.reference || {key: field.key});
-
-                if (state === 'hover') {
-                    reference.showing(false);
-                }
-
-                d3.select(this)
-                    .call(field.input)
-                    .call(reference.body)
-                    .select('.form-label-button-wrap')
-                    .call(reference.button);
-
-                field.input.tags(tags);
-            });
-
-        $fields.exit()
-            .remove();
-
-        var $more = selection.selectAll('.more-buttons')
-            .data([0]);
-
-        $more.enter().append('div')
-            .attr('class', 'more-buttons inspector-inner');
-
-        var $buttons = $more.selectAll('.preset-add-field')
-            .data(notShown, fieldKey);
-
-        $buttons.enter()
-            .append('button')
-            .attr('class', 'preset-add-field')
-            .call(bootstrap.tooltip()
-                .placement('top')
-                .title(function(d) { return d.label(); }))
-            .append('span')
-            .attr('class', function(d) { return 'icon ' + d.icon; });
-
-        $buttons.on('click', show);
-
-        $buttons.exit()
-            .remove();
-
-        function show(field) {
-            field.show = true;
-            presets(selection);
-            field.input.focus();
-        }
-
-        function revert(field) {
-            d3.event.stopPropagation();
-            d3.event.preventDefault();
-            event.change(field.revert());
-        }
-
-        function remove(field) {
-            d3.event.stopPropagation();
-            d3.event.preventDefault();
-            event.change(field.remove());
-        }
-    }
-
-    presets.preset = function(_) {
-        if (!arguments.length) return preset;
-        if (preset && preset.id === _.id) return presets;
-        preset = _;
-        fields = null;
-        return presets;
-    };
-
-    presets.state = function(_) {
-        if (!arguments.length) return state;
-        state = _;
-        return presets;
-    };
-
-    presets.tags = function(_) {
-        if (!arguments.length) return tags;
-        tags = _;
-        // Don't reset fields here.
-        return presets;
-    };
-
-    presets.entityID = function(_) {
-        if (!arguments.length) return id;
-        if (id === _) return presets;
-        id = _;
-        fields = null;
-        return presets;
-    };
-
-    return d3.rebind(presets, event, 'on');
-};
-iD.ui.PresetIcon = function() {
-    var preset, geometry;
-
-    function presetIcon(selection) {
-        selection.each(setup);
-    }
-
-    function setup() {
-        var selection = d3.select(this),
-            p = preset.apply(this, arguments),
-            geom = geometry.apply(this, arguments);
-
-        var $fill = selection.selectAll('.preset-icon-fill')
-            .data([0]);
-
-        $fill.enter().append('div');
-
-        $fill.attr('class', function() {
-            var s = 'preset-icon-fill preset-icon-fill-' + geom;
-            for (var i in p.tags) {
-                s += ' tag-' + i + ' tag-' + i + '-' + p.tags[i];
-            }
-            return s;
-        });
-
-        var $icon = selection.selectAll('.preset-icon')
-            .data([0]);
-
-        $icon.enter().append('div');
-
-        $icon.attr('class', function() {
-            var icon = p.icon || (geom === 'line' ? 'other-line' : 'marker-stroked'),
-                klass = 'feature-' + icon + ' preset-icon';
-
-            var featureicon = iD.data.featureIcons[icon];
-            if (featureicon && featureicon[geom]) {
-                klass += ' preset-icon-' + geom;
-            } else if (icon === 'multipolygon') {
-                // Special case (geometry === 'area')
-                klass += ' preset-icon-relation';
-            }
-
-            return klass;
-        });
-    }
-
-    presetIcon.preset = function(_) {
-        if (!arguments.length) return preset;
-        preset = d3.functor(_);
-        return presetIcon;
-    };
-
-    presetIcon.geometry = function(_) {
-        if (!arguments.length) return geometry;
-        geometry = d3.functor(_);
-        return presetIcon;
-    };
-
-    return presetIcon;
-};
-iD.ui.PresetList = function(context) {
-    var event = d3.dispatch('choose'),
-        id,
-        currentPreset,
-        autofocus = false;
-
-    function presetList(selection) {
-        var geometry = context.geometry(id),
-            presets = context.presets().matchGeometry(geometry);
-
-        selection.html('');
-
-        var messagewrap = selection.append('div')
-            .attr('class', 'header fillL cf');
-
-        var message = messagewrap.append('h3')
-            .text(t('inspector.choose'));
-
-        if (context.entity(id).isUsed(context.graph())) {
-            messagewrap.append('button')
-                .attr('class', 'preset-choose')
-                .on('click', function() { event.choose(currentPreset); })
-                .append('span')
-                .attr('class', 'icon forward');
-        } else {
-            messagewrap.append('button')
-                .attr('class', 'close')
-                .on('click', function() {
-                    context.enter(iD.modes.Browse(context));
-                })
-                .append('span')
-                .attr('class', 'icon close');
-        }
-
-        function keydown() {
-            // hack to let delete shortcut work when search is autofocused
-            if (search.property('value').length === 0 &&
-                (d3.event.keyCode === d3.keybinding.keyCodes['⌫'] ||
-                 d3.event.keyCode === d3.keybinding.keyCodes['⌦'])) {
-                d3.event.preventDefault();
-                d3.event.stopPropagation();
-                iD.operations.Delete([id], context)();
-            } else if (search.property('value').length === 0 &&
-                (d3.event.ctrlKey || d3.event.metaKey) &&
-                d3.event.keyCode === d3.keybinding.keyCodes.z) {
-                d3.event.preventDefault();
-                d3.event.stopPropagation();
-                context.undo();
-            } else if (!d3.event.ctrlKey && !d3.event.metaKey) {
-                d3.select(this).on('keydown', null);
-            }
-        }
-
-        function keypress() {
-            // enter
-            var value = search.property('value');
-            if (d3.event.keyCode === 13 && value.length) {
-                list.selectAll('.preset-list-item:first-child').datum().choose();
-            }
-        }
-
-        function inputevent() {
-            var value = search.property('value');
-            list.classed('filtered', value.length);
-            if (value.length) {
-                var results = presets.search(value, geometry);
-                message.text(t('inspector.results', {
-                    n: results.collection.length,
-                    search: value
-                }));
-                list.call(drawList, results);
-            } else {
-                list.call(drawList, context.presets().defaults(geometry, 36));
-                message.text(t('inspector.choose'));
-            }
-        }
-
-        var searchWrap = selection.append('div')
-            .attr('class', 'search-header');
-
-        var search = searchWrap.append('input')
-            .attr('class', 'preset-search-input')
-            .attr('placeholder', t('inspector.search'))
-            .attr('type', 'search')
-            .on('keydown', keydown)
-            .on('keypress', keypress)
-            .on('input', inputevent);
-
-        searchWrap.append('span')
-            .attr('class', 'icon search');
-
-        if (autofocus) {
-            search.node().focus();
-        }
-
-        var listWrap = selection.append('div')
-            .attr('class', 'inspector-body');
-
-        var list = listWrap.append('div')
-            .attr('class', 'preset-list fillL cf')
-            .call(drawList, context.presets().defaults(geometry, 36));
-    }
-
-    function drawList(list, presets) {
-        var collection = presets.collection.map(function(preset) {
-            return preset.members ? CategoryItem(preset) : PresetItem(preset);
-        });
-
-        var items = list.selectAll('.preset-list-item')
-            .data(collection, function(d) { return d.preset.id; });
-
-        items.enter().append('div')
-            .attr('class', function(item) { return 'preset-list-item preset-' + item.preset.id.replace('/', '-'); })
-            .classed('current', function(item) { return item.preset === currentPreset; })
-            .each(function(item) {
-                d3.select(this).call(item);
-            })
-            .style('opacity', 0)
-            .transition()
-            .style('opacity', 1);
-
-        items.order();
-
-        items.exit()
-            .remove();
-    }
-
-    function CategoryItem(preset) {
-        var box, sublist, shown = false;
-
-        function item(selection) {
-            var wrap = selection.append('div')
-                .attr('class', 'preset-list-button-wrap category col12');
-
-            wrap.append('button')
-                .attr('class', 'preset-list-button')
-                .call(iD.ui.PresetIcon()
-                    .geometry(context.geometry(id))
-                    .preset(preset))
-                .on('click', item.choose)
-                .append('div')
-                .attr('class', 'label')
-                .text(preset.name());
-
-            box = selection.append('div')
-                .attr('class', 'subgrid col12')
-                .style('max-height', '0px')
-                .style('opacity', 0);
-
-            box.append('div')
-                .attr('class', 'arrow');
-
-            sublist = box.append('div')
-                .attr('class', 'preset-list fillL3 cf fl');
-        }
-
-        item.choose = function() {
-            if (shown) {
-                shown = false;
-                box.transition()
-                    .duration(200)
-                    .style('opacity', '0')
-                    .style('max-height', '0px')
-                    .style('padding-bottom', '0px');
-            } else {
-                shown = true;
-                sublist.call(drawList, preset.members);
-                box.transition()
-                    .duration(200)
-                    .style('opacity', '1')
-                    .style('max-height', 200 + preset.members.collection.length * 80 + 'px')
-                    .style('padding-bottom', '20px');
-            }
-        };
-
-        item.preset = preset;
-
-        return item;
-    }
-
-    function PresetItem(preset) {
-        function item(selection) {
-            var wrap = selection.append('div')
-                .attr('class', 'preset-list-button-wrap col12');
-
-            wrap.append('button')
-                .attr('class', 'preset-list-button')
-                .call(iD.ui.PresetIcon()
-                    .geometry(context.geometry(id))
-                    .preset(preset))
-                .on('click', item.choose)
-                .append('div')
-                .attr('class', 'label')
-                .text(preset.name());
-
-            wrap.call(item.reference.button);
-            selection.call(item.reference.body);
-        }
-
-        item.choose = function() {
-            context.presets().choose(preset);
-
-            context.perform(
-                iD.actions.ChangePreset(id, currentPreset, preset),
-                t('operations.change_tags.annotation'));
-
-            event.choose(preset);
-        };
-
-        item.help = function() {
-            d3.event.stopPropagation();
-            item.reference.toggle();
-        };
-
-        item.preset = preset;
-        item.reference = iD.ui.TagReference(preset.reference(context.geometry(id)));
-
-        return item;
-    }
-
-    presetList.autofocus = function(_) {
-        if (!arguments.length) return autofocus;
-        autofocus = _;
-        return presetList;
-    };
-
-    presetList.entityID = function(_) {
-        if (!arguments.length) return id;
-        id = _;
-        presetList.preset(context.presets().match(context.entity(id), context.graph()));
-        return presetList;
-    };
-
-    presetList.preset = function(_) {
-        if (!arguments.length) return currentPreset;
-        currentPreset = _;
-        return presetList;
-    };
-
-    return d3.rebind(presetList, event, 'on');
-};
-iD.ui.RadialMenu = function(context, operations) {
-    var menu,
-        center = [0, 0],
-        tooltip;
-
-    var radialMenu = function(selection) {
-        if (!operations.length)
-            return;
-
-        selection.node().parentNode.focus();
-
-        function click(operation) {
-            d3.event.stopPropagation();
-            if (operation.disabled())
-                return;
-            operation();
-            radialMenu.close();
-        }
-
-        menu = selection.append('g')
-            .attr('class', 'radial-menu')
-            .attr('transform', 'translate(' + center + ')')
-            .attr('opacity', 0);
-
-        menu.transition()
-            .attr('opacity', 1);
-
-        var r = 50,
-            a = Math.PI / 4,
-            a0 = -Math.PI / 4,
-            a1 = a0 + (operations.length - 1) * a;
-
-        menu.append('path')
-            .attr('class', 'radial-menu-background')
-            .attr('d', 'M' + r * Math.sin(a0) + ',' +
-                             r * Math.cos(a0) +
-                      ' A' + r + ',' + r + ' 0 ' + (operations.length > 5 ? '1' : '0') + ',0 ' +
-                             (r * Math.sin(a1) + 1e-3) + ',' +
-                             (r * Math.cos(a1) + 1e-3)) // Force positive-length path (#1305)
-            .attr('stroke-width', 50)
-            .attr('stroke-linecap', 'round');
-
-        var button = menu.selectAll()
-            .data(operations)
-            .enter().append('g')
-            .attr('transform', function(d, i) {
-                return 'translate(' + r * Math.sin(a0 + i * a) + ',' +
-                                      r * Math.cos(a0 + i * a) + ')';
-            });
-
-        button.append('circle')
-            .attr('class', function(d) { return 'radial-menu-item radial-menu-item-' + d.id; })
-            .attr('r', 15)
-            .classed('disabled', function(d) { return d.disabled(); })
-            .on('click', click)
-            .on('mousedown', mousedown)
-            .on('mouseover', mouseover)
-            .on('mouseout', mouseout);
-
-        button.append('use')
-            .attr('transform', 'translate(-10, -10)')
-            .attr('clip-path', 'url(#clip-square-20)')
-            .attr('xlink:href', function(d) { return '#icon-operation-' + (d.disabled() ? 'disabled-' : '') + d.id; });
-
-        tooltip = d3.select(document.body)
-            .append('div')
-            .attr('class', 'tooltip-inner radial-menu-tooltip');
-
-        function mousedown() {
-            d3.event.stopPropagation(); // https://github.com/openstreetmap/iD/issues/1869
-        }
-
-        function mouseover(d, i) {
-            var rect = context.surfaceRect(),
-                angle = a0 + i * a,
-                top = rect.top + (r + 25) * Math.cos(angle) + center[1] + 'px',
-                left = rect.left + (r + 25) * Math.sin(angle) + center[0] + 'px',
-                bottom = rect.height - (r + 25) * Math.cos(angle) - center[1] + 'px',
-                right = rect.width - (r + 25) * Math.sin(angle) - center[0] + 'px';
-
-            tooltip
-                .style('top', null)
-                .style('left', null)
-                .style('bottom', null)
-                .style('right', null)
-                .style('display', 'block')
-                .html(iD.ui.tooltipHtml(d.tooltip(), d.keys[0]));
-
-            if (i === 0) {
-                tooltip
-                    .style('right', right)
-                    .style('top', top);
-            } else if (i >= 4) {
-                tooltip
-                    .style('left', left)
-                    .style('bottom', bottom);
-            } else {
-                tooltip
-                    .style('left', left)
-                    .style('top', top);
-            }
-        }
-
-        function mouseout() {
-            tooltip.style('display', 'none');
-        }
-    };
-
-    radialMenu.close = function() {
-        if (menu) {
-            menu
-                .style('pointer-events', 'none')
-                .transition()
-                .attr('opacity', 0)
-                .remove();
-        }
-
-        if (tooltip) {
-            tooltip.remove();
-        }
-    };
-
-    radialMenu.center = function(_) {
-        if (!arguments.length) return center;
-        center = _;
-        return radialMenu;
-    };
-
-    return radialMenu;
-};
-iD.ui.RawMemberEditor = function(context) {
-    var id;
-
-    function selectMember(d) {
-        d3.event.preventDefault();
-        context.enter(iD.modes.Select(context, [d.id]));
-    }
-
-    function changeRole(d) {
-        var role = d3.select(this).property('value');
-        context.perform(
-            iD.actions.ChangeMember(d.relation.id, _.extend({}, d.id, {role: role}), d.index),
-            t('operations.change_role.annotation'));
-    }
-
-    function deleteMember(d) {
-        context.perform(
-            iD.actions.DeleteMember(d.relation.id, d.index),
-            t('operations.delete_member.annotation'));
-
-        if (!context.hasEntity(d.relation.id)) {
-            context.enter(iD.modes.Browse(context));
-        }
-    }
-
-    function rawMemberEditor(selection) {
-        var entity = context.entity(id),
-            memberships = [];
-
-        entity.members.forEach(function(member, index) {
-            memberships.push({
-                index: index,
-                id: member.id,
-                role: member.role,
-                relation: entity,
-                member: context.hasEntity(member.id)
-            });
-        });
-
-        selection.call(iD.ui.Disclosure()
-            .title(t('inspector.all_members') + ' (' + memberships.length + ')')
-            .expanded(true)
-            .on('toggled', toggled)
-            .content(content));
-
-        function toggled(expanded) {
-            if (expanded) {
-                selection.node().parentNode.scrollTop += 200;
-            }
-        }
-
-        function content($wrap) {
-            var $list = $wrap.selectAll('.member-list')
-                .data([0]);
-
-            $list.enter().append('ul')
-                .attr('class', 'member-list');
-
-            var $items = $list.selectAll('li')
-                .data(memberships, function(d) {
-                    return iD.Entity.key(d.relation) + ',' + d.index + ',' +
-                        (d.member ? iD.Entity.key(d.member) : 'incomplete');
-                });
-
-            var $enter = $items.enter().append('li')
-                .attr('class', 'member-row form-field')
-                .classed('member-incomplete', function(d) { return !d.member; });
-
-            $enter.each(function(d) {
-                if (d.member) {
-                    var $label = d3.select(this).append('label')
-                        .attr('class', 'form-label')
-                        .append('a')
-                        .attr('href', '#')
-                        .on('click', selectMember);
-
-                    $label.append('span')
-                        .attr('class', 'member-entity-type')
-                        .text(function(d) { return context.presets().match(d.member, context.graph()).name(); });
-
-                    $label.append('span')
-                        .attr('class', 'member-entity-name')
-                        .text(function(d) { return iD.util.displayName(d.member); });
-
-                } else {
-                    d3.select(this).append('label')
-                        .attr('class', 'form-label')
-                        .text(t('inspector.incomplete'));
-                }
-            });
-
-            $enter.append('input')
-                .attr('class', 'member-role')
-                .property('type', 'text')
-                .attr('maxlength', 255)
-                .attr('placeholder', t('inspector.role'))
-                .property('value', function(d) { return d.role; })
-                .on('change', changeRole);
-
-            $enter.append('button')
-                .attr('tabindex', -1)
-                .attr('class', 'remove button-input-action member-delete minor')
-                .on('click', deleteMember)
-                .append('span')
-                .attr('class', 'icon delete');
-
-            $items.exit()
-                .remove();
-        }
-    }
-
-    rawMemberEditor.entityID = function(_) {
-        if (!arguments.length) return id;
-        id = _;
-        return rawMemberEditor;
-    };
-
-    return rawMemberEditor;
-};
-iD.ui.RawMembershipEditor = function(context) {
-    var id, showBlank;
-
-    function selectRelation(d) {
-        d3.event.preventDefault();
-        context.enter(iD.modes.Select(context, [d.relation.id]));
-    }
-
-    function changeRole(d) {
-        var role = d3.select(this).property('value');
-        context.perform(
-            iD.actions.ChangeMember(d.relation.id, _.extend({}, d.member, {role: role}), d.index),
-            t('operations.change_role.annotation'));
-    }
-
-    function addMembership(d, role) {
-        showBlank = false;
-
-        if (d.relation) {
-            context.perform(
-                iD.actions.AddMember(d.relation.id, {id: id, type: context.entity(id).type, role: role}),
-                t('operations.add_member.annotation'));
-
-        } else {
-            var relation = iD.Relation();
-
-            context.perform(
-                iD.actions.AddEntity(relation),
-                iD.actions.AddMember(relation.id, {id: id, type: context.entity(id).type, role: role}),
-                t('operations.add.annotation.relation'));
-
-            context.enter(iD.modes.Select(context, [relation.id]));
-        }
-    }
-
-    function deleteMembership(d) {
-        context.perform(
-            iD.actions.DeleteMember(d.relation.id, d.index),
-            t('operations.delete_member.annotation'));
-    }
-
-    function relations(q) {
-        var newRelation = {
-                relation: null,
-                value: t('inspector.new_relation')
-            },
-            result = [],
-            graph = context.graph();
-
-        context.intersects(context.extent()).forEach(function(entity) {
-            if (entity.type !== 'relation' || entity.id === id)
-                return;
-
-            var presetName = context.presets().match(entity, graph).name(),
-                entityName = iD.util.displayName(entity) || '';
-
-            var value = presetName + ' ' + entityName;
-            if (q && value.toLowerCase().indexOf(q.toLowerCase()) === -1)
-                return;
-
-            result.push({
-                relation: entity,
-                value: value
-            });
-        });
-
-        result.sort(function(a, b) {
-            return iD.Relation.creationOrder(a.relation, b.relation);
-        });
-        result.unshift(newRelation);
-
-        return result;
-    }
-
-    function rawMembershipEditor(selection) {
-        var entity = context.entity(id),
-            memberships = [];
-
-        context.graph().parentRelations(entity).forEach(function(relation) {
-            relation.members.forEach(function(member, index) {
-                if (member.id === entity.id) {
-                    memberships.push({relation: relation, member: member, index: index});
-                }
-            });
-        });
-
-        selection.call(iD.ui.Disclosure()
-            .title(t('inspector.all_relations') + ' (' + memberships.length + ')')
-            .expanded(true)
-            .on('toggled', toggled)
-            .content(content));
-
-        function toggled(expanded) {
-            if (expanded) {
-                selection.node().parentNode.scrollTop += 200;
-            }
-        }
-
-        function content($wrap) {
-            var $list = $wrap.selectAll('.member-list')
-                .data([0]);
-
-            $list.enter().append('ul')
-                .attr('class', 'member-list');
-
-            var $items = $list.selectAll('li.member-row-normal')
-                .data(memberships, function(d) { return iD.Entity.key(d.relation) + ',' + d.index; });
-
-            var $enter = $items.enter().append('li')
-                .attr('class', 'member-row member-row-normal form-field');
-
-            var $label = $enter.append('label')
-                .attr('class', 'form-label')
-                .append('a')
-                .attr('href', '#')
-                .on('click', selectRelation);
-
-            $label.append('span')
-                .attr('class', 'member-entity-type')
-                .text(function(d) { return context.presets().match(d.relation, context.graph()).name(); });
-
-            $label.append('span')
-                .attr('class', 'member-entity-name')
-                .text(function(d) { return iD.util.displayName(d.relation); });
-
-            $enter.append('input')
-                .attr('class', 'member-role')
-                .property('type', 'text')
-                .attr('maxlength', 255)
-                .attr('placeholder', t('inspector.role'))
-                .property('value', function(d) { return d.member.role; })
-                .on('change', changeRole);
-
-            $enter.append('button')
-                .attr('tabindex', -1)
-                .attr('class', 'remove button-input-action member-delete minor')
-                .on('click', deleteMembership)
-                .append('span')
-                .attr('class', 'icon delete');
-
-            $items.exit()
-                .remove();
-
-            if (showBlank) {
-                var $new = $list.selectAll('.member-row-new')
-                    .data([0]);
-
-                $enter = $new.enter().append('li')
-                    .attr('class', 'member-row member-row-new form-field');
-
-                $enter.append('input')
-                    .attr('type', 'text')
-                    .attr('class', 'member-entity-input')
-                    .call(d3.combobox()
-                        .minItems(1)
-                        .fetcher(function(value, callback) {
-                            callback(relations(value));
-                        })
-                        .on('accept', function(d) {
-                            addMembership(d, $new.select('.member-role').property('value'));
-                        }));
-
-                $enter.append('input')
-                    .attr('class', 'member-role')
-                    .property('type', 'text')
-                    .attr('maxlength', 255)
-                    .attr('placeholder', t('inspector.role'))
-                    .on('change', changeRole);
-
-                $enter.append('button')
-                    .attr('tabindex', -1)
-                    .attr('class', 'remove button-input-action member-delete minor')
-                    .on('click', deleteMembership)
-                    .append('span')
-                    .attr('class', 'icon delete');
-
-            } else {
-                $list.selectAll('.member-row-new')
-                    .remove();
-            }
-
-            var $add = $wrap.selectAll('.add-relation')
-                .data([0]);
-
-            $add.enter().append('button')
-                .attr('class', 'add-relation')
-                .append('span')
-                .attr('class', 'icon plus light');
-
-            $wrap.selectAll('.add-relation')
-                .on('click', function() {
-                    showBlank = true;
-                    content($wrap);
-                    $list.selectAll('.member-entity-input').node().focus();
-                });
-        }
-    }
-
-    rawMembershipEditor.entityID = function(_) {
-        if (!arguments.length) return id;
-        id = _;
-        return rawMembershipEditor;
-    };
-
-    return rawMembershipEditor;
-};
-iD.ui.RawTagEditor = function(context) {
-    var event = d3.dispatch('change'),
-        taginfo = iD.taginfo(),
-        showBlank = false,
-        state,
-        preset,
-        tags,
-        id;
-
-    function rawTagEditor(selection) {
-        var count = Object.keys(tags).filter(function(d) { return d; }).length;
-
-        selection.call(iD.ui.Disclosure()
-            .title(t('inspector.all_tags') + ' (' + count + ')')
-            .expanded(context.storage('raw_tag_editor.expanded') === 'true' || preset.isFallback())
-            .on('toggled', toggled)
-            .content(content));
-
-        function toggled(expanded) {
-            context.storage('raw_tag_editor.expanded', expanded);
-            if (expanded) {
-                selection.node().parentNode.scrollTop += 200;
-            }
-        }
-    }
-
-    function content($wrap) {
-        var entries = d3.entries(tags);
-
-        if (!entries.length || showBlank) {
-            showBlank = false;
-            entries.push({key: '', value: ''});
-        }
-
-        var $list = $wrap.selectAll('.tag-list')
-            .data([0]);
-
-        $list.enter().append('ul')
-            .attr('class', 'tag-list');
-
-        var $newTag = $wrap.selectAll('.add-tag')
-            .data([0]);
-
-        var $enter = $newTag.enter().append('button')
-            .attr('class', 'add-tag');
-
-        $enter.append('span')
-            .attr('class', 'icon plus light');
-
-        $newTag.on('click', addTag);
-
-        var $items = $list.selectAll('li')
-            .data(entries, function(d) { return d.key; });
-
-        // Enter
-
-        $enter = $items.enter().append('li')
-            .attr('class', 'tag-row cf');
-
-        $enter.append('div')
-            .attr('class', 'key-wrap')
-            .append('input')
-            .property('type', 'text')
-            .attr('class', 'key')
-            .attr('maxlength', 255);
-
-        $enter.append('div')
-            .attr('class', 'input-wrap-position')
-            .append('input')
-            .property('type', 'text')
-            .attr('class', 'value')
-            .attr('maxlength', 255);
-
-        $enter.append('button')
-            .attr('tabindex', -1)
-            .attr('class', 'remove minor')
-            .append('span')
-            .attr('class', 'icon delete');
-
-        $enter.each(bindTypeahead);
-
-        // Update
-
-        $items.order();
-
-        $items.each(function(tag) {
-            var reference = iD.ui.TagReference({key: tag.key});
-
-            if (state === 'hover') {
-                reference.showing(false);
-            }
-
-            d3.select(this)
-                .call(reference.button)
-                .call(reference.body);
-        });
-
-        $items.select('input.key')
-            .value(function(d) { return d.key; })
-            .on('blur', keyChange)
-            .on('change', keyChange);
-
-        $items.select('input.value')
-            .value(function(d) { return d.value; })
-            .on('blur', valueChange)
-            .on('change', valueChange)
-            .on('keydown.push-more', pushMore);
-
-        $items.select('button.remove')
-            .on('click', removeTag);
-
-        $items.exit()
-            .remove();
-
-        function pushMore() {
-            if (d3.event.keyCode === 9 && !d3.event.shiftKey &&
-                $list.selectAll('li:last-child input.value').node() === this) {
-                addTag();
-            }
-        }
-
-        function bindTypeahead() {
-            var row = d3.select(this),
-                key = row.selectAll('input.key'),
-                value = row.selectAll('input.value');
-
-            function sort(value, data) {
-                var sameletter = [],
-                    other = [];
-                for (var i = 0; i < data.length; i++) {
-                    if (data[i].value.substring(0, value.length) === value) {
-                        sameletter.push(data[i]);
-                    } else {
-                        other.push(data[i]);
-                    }
-                }
-                return sameletter.concat(other);
-            }
-
-            key.call(d3.combobox()
-                .fetcher(function(value, callback) {
-                    taginfo.keys({
-                        debounce: true,
-                        geometry: context.geometry(id),
-                        query: value
-                    }, function(err, data) {
-                        if (!err) callback(sort(value, data));
-                    });
-                }));
-
-            value.call(d3.combobox()
-                .fetcher(function(value, callback) {
-                    taginfo.values({
-                        debounce: true,
-                        key: key.value(),
-                        geometry: context.geometry(id),
-                        query: value
-                    }, function(err, data) {
-                        if (!err) callback(sort(value, data));
-                    });
-                }));
-        }
-
-        function keyChange(d) {
-            var kOld = d.key,
-                kNew = this.value.trim(),
-                tag = {};
-
-            if (kNew && kNew !== kOld) {
-                var match = kNew.match(/^(.*?)(?:_(\d+))?$/),
-                    base = match[1],
-                    suffix = +(match[2] || 1);
-                while (tags[kNew]) {  // rename key if already in use
-                    kNew = base + '_' + suffix++;
-                }
-            }
-            tag[kOld] = undefined;
-            tag[kNew] = d.value;
-            d.key = kNew; // Maintain DOM identity through the subsequent update.
-            this.value = kNew;
-            event.change(tag);
-        }
-
-        function valueChange(d) {
-            var tag = {};
-            tag[d.key] = this.value;
-            event.change(tag);
-        }
-
-        function removeTag(d) {
-            var tag = {};
-            tag[d.key] = undefined;
-            event.change(tag);
-        }
-
-        function addTag() {
-            // Wrapped in a setTimeout in case it's being called from a blur
-            // handler. Without the setTimeout, the call to `content` would
-            // wipe out the pending value change.
-            setTimeout(function() {
-                showBlank = true;
-                content($wrap);
-                $list.selectAll('li:last-child input.key').node().focus();
-            }, 0);
-        }
-    }
-
-    rawTagEditor.state = function(_) {
-        if (!arguments.length) return state;
-        state = _;
-        return rawTagEditor;
-    };
-
-    rawTagEditor.preset = function(_) {
-        if (!arguments.length) return preset;
-        preset = _;
-        return rawTagEditor;
-    };
-
-    rawTagEditor.tags = function(_) {
-        if (!arguments.length) return tags;
-        tags = _;
-        return rawTagEditor;
-    };
-
-    rawTagEditor.entityID = function(_) {
-        if (!arguments.length) return id;
-        id = _;
-        return rawTagEditor;
-    };
-
-    return d3.rebind(rawTagEditor, event, 'on');
-};
-iD.ui.Restore = function(context) {
-    return function(selection) {
-        if (!context.history().lock() || !context.history().restorableChanges())
-            return;
-
-        var modal = iD.ui.modal(selection);
-
-        modal.select('.modal')
-            .attr('class', 'modal fillL col6');
-
-        var introModal = modal.select('.content');
-
-        introModal.attr('class','cf');
-
-        introModal.append('div')
-            .attr('class', 'modal-section')
-            .append('h3')
-            .text(t('restore.heading'));
-
-        introModal.append('div')
-            .attr('class','modal-section')
-            .append('p')
-            .text(t('restore.description'));
-
-        var buttonWrap = introModal.append('div')
-            .attr('class', 'modal-actions cf');
-
-        var restore = buttonWrap.append('button')
-            .attr('class', 'restore col6')
-            .text(t('restore.restore'))
-            .on('click', function() {
-                context.history().restore();
-                modal.remove();
-            });
-
-        buttonWrap.append('button')
-            .attr('class', 'reset col6')
-            .text(t('restore.reset'))
-            .on('click', function() {
-                context.history().clearSaved();
-                modal.remove();
-            });
-
-        restore.node().focus();
-    };
-};
-iD.ui.Save = function(context) {
-    var history = context.history(),
-        key = iD.ui.cmd('⌘S');
-
-    function saving() {
-        return context.mode().id === 'save';
-    }
-
-    function save() {
-        d3.event.preventDefault();
-        if (!saving() && history.hasChanges()) {
-            context.enter(iD.modes.Save(context));
-        }
-    }
-
-    return function(selection) {
-        var tooltip = bootstrap.tooltip()
-            .placement('bottom')
-            .html(true)
-            .title(iD.ui.tooltipHtml(t('save.no_changes'), key));
-
-        var button = selection.append('button')
-            .attr('class', 'save col12 disabled')
-            .attr('tabindex', -1)
-            .on('click', save)
-            .call(tooltip);
-
-        button.append('span')
-            .attr('class', 'label')
-            .text(t('save.title'));
-
-        button.append('span')
-            .attr('class', 'count')
-            .text('0');
-
-        var keybinding = d3.keybinding('undo-redo')
-            .on(key, save, true);
-
-        d3.select(document)
-            .call(keybinding);
-
-        var numChanges = 0;
-
-        context.history().on('change.save', function() {
-            var _ = history.difference().summary().length;
-            if (_ === numChanges)
-                return;
-            numChanges = _;
-
-            tooltip.title(iD.ui.tooltipHtml(t(numChanges > 0 ?
-                    'save.help' : 'save.no_changes'), key));
-
-            button
-                .classed('disabled', numChanges === 0)
-                .classed('has-count', numChanges > 0);
-
-            button.select('span.count')
-                .text(numChanges);
-        });
-
-        context.on('enter.save', function() {
-            button.property('disabled', saving());
-            if (saving()) button.call(tooltip.hide);
-        });
-    };
-};
-iD.ui.Scale = function(context) {
-    var projection = context.projection,
-        imperial = (iD.detect().locale.toLowerCase() === 'en-us'),
-        maxLength = 180,
-        tickHeight = 8;
-
-    function scaleDefs(loc1, loc2) {
-        var lat = (loc2[1] + loc1[1]) / 2,
-            conversion = (imperial ? 3.28084 : 1),
-            dist = iD.geo.lonToMeters(loc2[0] - loc1[0], lat) * conversion,
-            scale = { dist: 0, px: 0, text: '' },
-            buckets, i, val, dLon;
-
-        if (imperial) {
-            buckets = [5280000, 528000, 52800, 5280, 500, 50, 5, 1];
-        } else {
-            buckets = [5000000, 500000, 50000, 5000, 500, 50, 5, 1];
-        }
-
-        // determine a user-friendly endpoint for the scale
-        for (i = 0; i < buckets.length; i++) {
-            val = buckets[i];
-            if (dist >= val) {
-                scale.dist = Math.floor(dist / val) * val;
-                break;
-            }
-        }
-
-        dLon = iD.geo.metersToLon(scale.dist / conversion, lat);
-        scale.px = Math.round(projection([loc1[0] + dLon, loc1[1]])[0]);
-
-        if (imperial) {
-            if (scale.dist >= 5280) {
-                scale.dist /= 5280;
-                scale.text = String(scale.dist) + ' mi';
-            } else {
-                scale.text = String(scale.dist) + ' ft';
-            }
-        } else {
-            if (scale.dist >= 1000) {
-                scale.dist /= 1000;
-                scale.text = String(scale.dist) + ' km';
-            } else {
-                scale.text = String(scale.dist) + ' m';
-            }
-        }
-
-        return scale;
-    }
-
-    function update(selection) {
-        // choose loc1, loc2 along bottom of viewport (near where the scale will be drawn)
-        var dims = context.map().dimensions(),
-            loc1 = projection.invert([0, dims[1]]),
-            loc2 = projection.invert([maxLength, dims[1]]),
-            scale = scaleDefs(loc1, loc2);
-
-        selection.select('#scalepath')
-            .attr('d', 'M0.5,0.5v' + tickHeight + 'h' + scale.px + 'v-' + tickHeight);
-
-        selection.select('#scaletext')
-            .attr('x', scale.px + 8)
-            .attr('y', tickHeight)
-            .text(scale.text);
-    }
-
-    return function(selection) {
-        var g = selection.append('svg')
-            .attr('id', 'scale')
-            .append('g')
-            .attr('transform', 'translate(10,11)');
-
-        g.append('path').attr('id', 'scalepath');
-        g.append('text').attr('id', 'scaletext');
-
-        update(selection);
-
-        context.map().on('move.scale', function() {
-            update(selection);
-        });
-    };
-};
-iD.ui.SelectionList = function(context, selectedIDs) {
-
-    function selectionList(selection) {
-        selection.classed('selection-list-pane', true);
-
-        var header = selection.append('div')
-            .attr('class', 'header fillL cf');
-
-        header.append('h3')
-            .text(t('inspector.multiselect'));
-
-        var listWrap = selection.append('div')
-            .attr('class', 'inspector-body');
-
-        var list = listWrap.append('div')
-            .attr('class', 'feature-list cf');
-
-        context.history().on('change.selection-list', drawList);
-        drawList();
-
-        function drawList() {
-            var entities = selectedIDs
-                .map(function(id) { return context.hasEntity(id); })
-                .filter(function(entity) { return entity; });
-
-            var items = list.selectAll('.feature-list-item')
-                .data(entities, iD.Entity.key);
-
-            var enter = items.enter().append('button')
-                .attr('class', 'feature-list-item')
-                .on('click', function(entity) {
-                    context.enter(iD.modes.Select(context, [entity.id]));
-                });
-
-            // Enter
-
-            var label = enter.append('div')
-                .attr('class', 'label');
-
-            label.append('span')
-                .attr('class', 'icon icon-pre-text');
-
-            label.append('span')
-                .attr('class', 'entity-type');
-
-            label.append('span')
-                .attr('class', 'entity-name');
-
-            // Update
-
-            items.selectAll('.icon')
-                .attr('class', function(entity) { return context.geometry(entity.id) + ' icon icon-pre-text'; });
-
-            items.selectAll('.entity-type')
-                .text(function(entity) { return context.presets().match(entity, context.graph()).name(); });
-
-            items.selectAll('.entity-name')
-                .text(function(entity) { return iD.util.displayName(entity); });
-
-            // Exit
-
-            items.exit()
-                .remove();
-        }
-    }
-
-    return selectionList;
-
-};
-iD.ui.Sidebar = function(context) {
-    var inspector = iD.ui.Inspector(context),
-        current;
-
-    function sidebar(selection) {
-        var featureListWrap = selection.append('div')
-            .attr('class', 'feature-list-pane')
-            .call(iD.ui.FeatureList(context));
-
-        selection.call(iD.ui.Notice(context));
-
-        var inspectorWrap = selection.append('div')
-            .attr('class', 'inspector-hidden inspector-wrap fr');
-
-        sidebar.hover = function(id) {
-            if (!current && id) {
-                featureListWrap.classed('inspector-hidden', true);
-                inspectorWrap.classed('inspector-hidden', false)
-                    .classed('inspector-hover', true);
-
-                if (inspector.entityID() !== id || inspector.state() !== 'hover') {
-                    inspector
-                        .state('hover')
-                        .entityID(id);
-
-                    inspectorWrap.call(inspector);
-                }
-            } else if (!current) {
-                featureListWrap.classed('inspector-hidden', false);
-                inspectorWrap.classed('inspector-hidden', true);
-                inspector.state('hide');
-            }
-        };
-
-        sidebar.hover = _.throttle(sidebar.hover, 200);
-
-        sidebar.select = function(id, newFeature) {
-            if (!current && id) {
-                featureListWrap.classed('inspector-hidden', true);
-                inspectorWrap.classed('inspector-hidden', false)
-                    .classed('inspector-hover', false);
-
-                if (inspector.entityID() !== id || inspector.state() !== 'select') {
-                    inspector
-                        .state('select')
-                        .entityID(id)
-                        .newFeature(newFeature);
-
-                    inspectorWrap.call(inspector);
-                }
-            } else if (!current) {
-                featureListWrap.classed('inspector-hidden', false);
-                inspectorWrap.classed('inspector-hidden', true);
-                inspector.state('hide');
-            }
-        };
-
-        sidebar.show = function(component) {
-            featureListWrap.classed('inspector-hidden', true);
-            inspectorWrap.classed('inspector-hidden', true);
-            if (current) current.remove();
-            current = selection.append('div')
-                .attr('class', 'sidebar-component')
-                .call(component);
-        };
-
-        sidebar.hide = function() {
-            featureListWrap.classed('inspector-hidden', false);
-            inspectorWrap.classed('inspector-hidden', true);
-            if (current) current.remove();
-            current = null;
-        };
-    }
-
-    sidebar.hover = function() {};
-    sidebar.select = function() {};
-    sidebar.show = function() {};
-    sidebar.hide = function() {};
-
-    return sidebar;
-};
-iD.ui.SourceSwitch = function(context) {
-    var keys;
-
-    function click() {
-        d3.event.preventDefault();
-
-        if (context.history().hasChanges() &&
-            !window.confirm(t('source_switch.lose_changes'))) return;
-
-        var live = d3.select(this)
-            .classed('live');
-
-        context.connection()
-            .switch(live ? keys[1] : keys[0]);
-
-        context.flush();
-
-        d3.select(this)
-            .text(live ? t('source_switch.dev') : t('source_switch.live'))
-            .classed('live', !live);
-    }
-
-    var sourceSwitch = function(selection) {
-        selection.append('a')
-            .attr('href', '#')
-            .text(t('source_switch.live'))
-            .classed('live', true)
-            .attr('tabindex', -1)
-            .on('click', click);
-    };
-
-    sourceSwitch.keys = function(_) {
-        if (!arguments.length) return keys;
-        keys = _;
-        return sourceSwitch;
-    };
-
-    return sourceSwitch;
-};
-iD.ui.Spinner = function(context) {
-    var connection = context.connection();
-
-    return function(selection) {
-        var img = selection.append('img')
-            .attr('src', context.imagePath('loader-black.gif'))
-            .style('opacity', 0);
-
-        connection.on('loading.spinner', function() {
-            img.transition()
-                .style('opacity', 1);
-        });
-
-        connection.on('loaded.spinner', function() {
-            img.transition()
-                .style('opacity', 0);
-        });
-    };
-};
-iD.ui.Splash = function(context) {
-    return function(selection) {
-        if (context.storage('sawSplash'))
-             return;
-
-        context.storage('sawSplash', true);
-
-        var modal = iD.ui.modal(selection);
-
-        modal.select('.modal')
-            .attr('class', 'modal-splash modal col6');
-
-        var introModal = modal.select('.content')
-            .append('div')
-            .attr('class', 'fillL');
-
-        introModal.append('div')
-            .attr('class','modal-section cf')
-            .append('h3').text(t('splash.welcome'));
-
-        introModal.append('div')
-            .attr('class','modal-section')
-            .append('p')
-            .html(t('splash.text', {
-                version: iD.version,
-                website: '<a href="http://ideditor.com/">ideditor.com</a>',
-                github: '<a href="https://github.com/openstreetmap/iD">github.com</a>'
-            }));
-
-        var buttons = introModal.append('div').attr('class', 'modal-actions cf');
-
-        buttons.append('button')
-            .attr('class', 'col6 walkthrough')
-            .text(t('splash.walkthrough'))
-            .on('click', function() {
-                d3.select(document.body).call(iD.ui.intro(context));
-                modal.close();
-            });
-
-        buttons.append('button')
-            .attr('class', 'col6 start')
-            .text(t('splash.start'))
-            .on('click', modal.close);
-
-        modal.select('button.close').attr('class','hide');
-
-    };
-};
-iD.ui.Status = function(context) {
-    var connection = context.connection(),
-        errCount = 0;
-
-    return function(selection) {
-
-        function update() {
-
-            connection.status(function(err, apiStatus) {
-
-                selection.html('');
-
-                if (err && errCount++ < 2) return;
-
-                if (err) {
-                    selection.text(t('status.error'));
-
-                } else if (apiStatus === 'readonly') {
-                    selection.text(t('status.readonly'));
-
-                } else if (apiStatus === 'offline') {
-                    selection.text(t('status.offline'));
-                }
-
-                selection.attr('class', 'api-status ' + (err ? 'error' : apiStatus));
-                if (!err) errCount = 0;
-
-            });
-        }
-
-        connection.on('auth', function() { update(selection); });
-        window.setInterval(update, 90000);
-        update(selection);
-    };
-};
-iD.ui.Success = function(context) {
-    var event = d3.dispatch('cancel'),
-        changeset;
-
-    function success(selection) {
-        var message = (changeset.comment || t('success.edited_osm')).substring(0, 130) +
-            ' ' + context.connection().changesetURL(changeset.id);
-
-        var header = selection.append('div')
-            .attr('class', 'header fillL');
-
-        header.append('button')
-            .attr('class', 'fr')
-            .append('span')
-            .attr('class', 'icon close')
-            .on('click', function() { event.cancel(success); });
-
-        header.append('h3')
-            .text(t('success.just_edited'));
-
-        var body = selection.append('div')
-            .attr('class', 'body save-success fillL');
-
-        body.append('p')
-            .html(t('success.help_html'));
-
-        var changesetURL = context.connection().changesetURL(changeset.id);
-
-        body.append('a')
-            .attr('class', 'button col12 osm')
-            .attr('target', '_blank')
-            .attr('href', changesetURL)
-            .text(t('success.view_on_osm'));
-
-        var sharing = {
-            facebook: 'https://facebook.com/sharer/sharer.php?u=' + encodeURIComponent(changesetURL),
-            twitter: 'https://twitter.com/intent/tweet?source=webclient&text=' + encodeURIComponent(message),
-            google: 'https://plus.google.com/share?url=' + encodeURIComponent(changesetURL)
-        };
-
-        body.selectAll('.button.social')
-            .data(d3.entries(sharing))
-            .enter().append('a')
-            .attr('class', function(d) { return 'button social col4 ' + d.key; })
-            .attr('target', '_blank')
-            .attr('href', function(d) { return d.value; })
-            .call(bootstrap.tooltip()
-                .title(function(d) { return t('success.' + d.key); })
-                .placement('bottom'));
-    }
-
-    success.changeset = function(_) {
-        if (!arguments.length) return changeset;
-        changeset = _;
-        return success;
-    };
-
-    return d3.rebind(success, event, 'on');
-};
-iD.ui.TagReference = function(tag) {
-    var tagReference = {},
-        taginfo = iD.taginfo(),
-        button,
-        body,
-        loaded,
-        showing;
-
-    function findLocal(docs) {
-        var locale = iD.detect().locale.toLowerCase(),
-            localized;
-
-        localized = _.find(docs, function(d) {
-            return d.lang.toLowerCase() === locale;
-        });
-        if (localized) return localized;
-
-        // try the non-regional version of a language, like
-        // 'en' if the language is 'en-US'
-        if (locale.indexOf('-') !== -1) {
-            var first = locale.split('-')[0];
-            localized = _.find(docs, function(d) {
-                return d.lang.toLowerCase() === first;
-            });
-            if (localized) return localized;
-        }
-
-        // finally fall back to english
-        return _.find(docs, function(d) {
-            return d.lang.toLowerCase() === 'en';
-        });
-    }
-
-    function load() {
-        button.classed('tag-reference-loading', true);
-
-        taginfo.docs(tag, function(err, docs) {
-            if (!err && docs) {
-                docs = findLocal(docs);
-            }
-
-            body.html('');
-
-            if (!docs || !docs.description) {
-                body.append('p').text(t('inspector.no_documentation_key'));
-                show();
-                return;
-            }
-
-            if (docs.image && docs.image.thumb_url_prefix) {
-                body
-                    .append('img')
-                    .attr('class', 'wiki-image')
-                    .attr('src', docs.image.thumb_url_prefix + '100' + docs.image.thumb_url_suffix)
-                    .on('load', function() { show(); })
-                    .on('error', function() { d3.select(this).remove(); show(); });
-            } else {
-                show();
-            }
-
-            body
-                .append('p')
-                .text(docs.description);
-
-            var wikiLink = body
-                .append('a')
-                .attr('target', '_blank')
-                .attr('href', 'http://wiki.openstreetmap.org/wiki/' + docs.title);
-
-            wikiLink.append('span')
-                .attr('class','icon icon-pre-text out-link');
-
-            wikiLink.append('span')
-                .text(t('inspector.reference'));
-        });
-    }
-
-    function show() {
-        loaded = true;
-
-        button.classed('tag-reference-loading', false);
-
-        body.transition()
-            .duration(200)
-            .style('max-height', '200px')
-            .style('opacity', '1');
-
-        showing = true;
-    }
-
-    function hide(selection) {
-        selection = selection || body.transition().duration(200);
-
-        selection
-            .style('max-height', '0px')
-            .style('opacity', '0');
-
-        showing = false;
-    }
-
-    tagReference.button = function(selection) {
-        button = selection.selectAll('.tag-reference-button')
-            .data([0]);
-
-        var enter = button.enter().append('button')
-            .attr('tabindex', -1)
-            .attr('class', 'tag-reference-button');
-
-        enter.append('span')
-            .attr('class', 'icon inspect');
-
-        button.on('click', function () {
-            d3.event.stopPropagation();
-            d3.event.preventDefault();
-            if (showing) {
-                hide();
-            } else if (loaded) {
-                show();
-            } else {
-                load();
-            }
-        });
-    };
-
-    tagReference.body = function(selection) {
-        body = selection.selectAll('.tag-reference-body')
-            .data([0]);
-
-        body.enter().append('div')
-            .attr('class', 'tag-reference-body cf')
-            .style('max-height', '0')
-            .style('opacity', '0');
-
-        if (showing === false) {
-            hide(body);
-        }
-    };
-
-    tagReference.showing = function(_) {
-        if (!arguments.length) return showing;
-        showing = _;
-        return tagReference;
-    };
-
-    return tagReference;
-};// toggles the visibility of ui elements, using a combination of the
-// hide class, which sets display=none, and a d3 transition for opacity.
-// this will cause blinking when called repeatedly, so check that the
-// value actually changes between calls.
-iD.ui.Toggle = function(show, callback) {
-    return function(selection) {
-        selection
-            .style('opacity', show ? 0 : 1)
-            .classed('hide', false)
-            .transition()
-            .style('opacity', show ? 1 : 0)
-            .each('end', function() {
-                d3.select(this).classed('hide', !show);
-                if (callback) callback.apply(this);
-            });
-    };
-};
-iD.ui.UndoRedo = function(context) {
-    var commands = [{
-        id: 'undo',
-        cmd: iD.ui.cmd('⌘Z'),
-        action: function() { if (!saving()) context.undo(); },
-        annotation: function() { return context.history().undoAnnotation(); }
-    }, {
-        id: 'redo',
-        cmd: iD.ui.cmd('⌘⇧Z'),
-        action: function() { if (!saving()) context.redo(); },
-        annotation: function() { return context.history().redoAnnotation(); }
-    }];
-
-    function saving() {
-        return context.mode().id === 'save';
-    }
-
-    return function(selection) {
-        var tooltip = bootstrap.tooltip()
-            .placement('bottom')
-            .html(true)
-            .title(function (d) {
-                return iD.ui.tooltipHtml(d.annotation() ?
-                    t(d.id + '.tooltip', {action: d.annotation()}) :
-                    t(d.id + '.nothing'), d.cmd);
-            });
-
-        var buttons = selection.selectAll('button')
-            .data(commands)
-            .enter().append('button')
-            .attr('class', 'col6 disabled')
-            .on('click', function(d) { return d.action(); })
-            .call(tooltip);
-
-        buttons.append('span')
-            .attr('class', function(d) { return 'icon ' + d.id; });
-
-        var keybinding = d3.keybinding('undo')
-            .on(commands[0].cmd, function() { d3.event.preventDefault(); commands[0].action(); })
-            .on(commands[1].cmd, function() { d3.event.preventDefault(); commands[1].action(); });
-
-        d3.select(document)
-            .call(keybinding);
-
-        context.history()
-            .on('change.undo_redo', update);
-
-        context
-            .on('enter.undo_redo', update);
-
-        function update() {
-            buttons
-                .property('disabled', saving())
-                .classed('disabled', function(d) { return !d.annotation(); })
-                .each(function() {
-                    var selection = d3.select(this);
-                    if (selection.property('tooltipVisible')) {
-                        selection.call(tooltip.show);
-                    }
-                });
-        }
-    };
-};
-iD.ui.ViewOnOSM = function(context) {
-    var id;
-
-    function viewOnOSM(selection) {
-        var entity = context.entity(id);
-
-        selection.style('display', entity.isNew() ? 'none' : null);
-
-        var $link = selection.selectAll('.view-on-osm')
-            .data([0]);
-
-        var $enter = $link.enter().append('a')
-            .attr('class', 'view-on-osm')
-            .attr('target', '_blank');
-
-        $enter.append('span')
-            .attr('class', 'icon icon-pre-text out-link');
-
-        $enter.append('span')
-            .text(t('inspector.view_on_osm'));
-
-        $link.attr('href', context.connection().entityURL(entity));
-    }
-
-    viewOnOSM.entityID = function(_) {
-        if (!arguments.length) return id;
-        id = _;
-        return viewOnOSM;
-    };
-
-    return viewOnOSM;
-};
-iD.ui.Zoom = function(context) {
-    var zooms = [{
-        id: 'zoom-in',
-        title: t('zoom.in'),
-        action: context.zoomIn,
-        key: '+'
-    }, {
-        id: 'zoom-out',
-        title: t('zoom.out'),
-        action: context.zoomOut,
-        key: '-'
-    }];
-
-    return function(selection) {
-        var button = selection.selectAll('button')
-            .data(zooms)
-            .enter().append('button')
-            .attr('tabindex', -1)
-            .attr('class', function(d) { return d.id; })
-            .on('click.editor', function(d) { d.action(); })
-            .call(bootstrap.tooltip()
-                .placement('left')
-                .html(true)
-                .title(function(d) {
-                    return iD.ui.tooltipHtml(d.title, d.key);
-                }));
-
-        button.append('span')
-            .attr('class', function(d) { return d.id + ' icon'; });
-
-        var keybinding = d3.keybinding('zoom');
-
-        _.each(['=','ffequals','plus','ffplus'], function(key) {
-            keybinding.on(key, function() { context.zoomIn(); });
-            keybinding.on('⇧' + key, function() { context.zoomIn(); });
-        });
-        _.each(['-','ffminus','_','dash'], function(key) {
-            keybinding.on(key, function() { context.zoomOut(); });
-            keybinding.on('⇧' + key, function() { context.zoomOut(); });
-        });
-
-        d3.select(document)
-            .call(keybinding);
-    };
-};
-iD.ui.preset.access = function(field) {
-    var event = d3.dispatch('change'),
-        items;
-
-    function access(selection) {
-        var wrap = selection.selectAll('.preset-input-wrap')
-            .data([0]);
-
-        wrap.enter().append('div')
-            .attr('class', 'cf preset-input-wrap')
-            .append('ul');
-
-        items = wrap.select('ul').selectAll('li')
-            .data(field.keys);
-
-        // Enter
-
-        var enter = items.enter().append('li')
-            .attr('class', function(d) { return 'cf preset-access-' + d; });
-
-        enter.append('span')
-            .attr('class', 'col6 label preset-label-access')
-            .attr('for', function(d) { return 'preset-input-access-' + d; })
-            .text(function(d) { return field.t('types.' + d); });
-
-        enter.append('div')
-            .attr('class', 'col6 preset-input-access-wrap')
-            .append('input')
-            .attr('type', 'text')
-            .attr('class', 'preset-input-access')
-            .attr('id', function(d) { return 'preset-input-access-' + d; })
-            .each(function(d) {
-                d3.select(this)
-                    .call(d3.combobox()
-                        .data(access.options(d)));
-            });
-
-        // Update
-
-        wrap.selectAll('.preset-input-access')
-            .on('change', change)
-            .on('blur', change);
-    }
-
-    function change(d) {
-        var tag = {};
-        tag[d] = d3.select(this).value() || undefined;
-        event.change(tag);
-    }
-
-    access.options = function(type) {
-        var options = ['no', 'permissive', 'private', 'destination'];
-
-        if (type !== 'access') {
-            options.unshift('yes');
-            options.push('designated');
-        }
-
-        return options.map(function(option) {
-            return {
-                title: field.t('options.' + option + '.description'),
-                value: option
-            };
-        });
-    };
-
-    var placeholders = {
-        footway: {
-            foot: 'designated',
-            motor_vehicle: 'no'
-        },
-        steps: {
-            foot: 'yes',
-            motor_vehicle: 'no',
-            bicycle: 'no',
-            horse: 'no'
-        },
-        pedestrian: {
-            foot: 'yes',
-            motor_vehicle: 'no'
-        },
-        cycleway: {
-            motor_vehicle: 'no',
-            bicycle: 'designated'
-        },
-        bridleway: {
-            motor_vehicle: 'no',
-            horse: 'designated'
-        },
-        path: {
-            foot: 'yes',
-            motor_vehicle: 'no',
-            bicycle: 'yes',
-            horse: 'yes'
-        },
-        motorway: {
-            foot: 'no',
-            motor_vehicle: 'yes',
-            bicycle: 'no',
-            horse: 'no'
-        },
-        trunk: {
-            motor_vehicle: 'yes'
-        },
-        primary: {
-            foot: 'yes',
-            motor_vehicle: 'yes',
-            bicycle: 'yes',
-            horse: 'yes'
-        },
-        secondary: {
-            foot: 'yes',
-            motor_vehicle: 'yes',
-            bicycle: 'yes',
-            horse: 'yes'
-        },
-        tertiary: {
-            foot: 'yes',
-            motor_vehicle: 'yes',
-            bicycle: 'yes',
-            horse: 'yes'
-        },
-        residential: {
-            foot: 'yes',
-            motor_vehicle: 'yes',
-            bicycle: 'yes',
-            horse: 'yes'
-        },
-        unclassified: {
-            foot: 'yes',
-            motor_vehicle: 'yes',
-            bicycle: 'yes',
-            horse: 'yes'
-        },
-        service: {
-            foot: 'yes',
-            motor_vehicle: 'yes',
-            bicycle: 'yes',
-            horse: 'yes'
-        },
-        motorway_link: {
-            foot: 'no',
-            motor_vehicle: 'yes',
-            bicycle: 'no',
-            horse: 'no'
-        },
-        trunk_link: {
-            motor_vehicle: 'yes'
-        },
-        primary_link: {
-            foot: 'yes',
-            motor_vehicle: 'yes',
-            bicycle: 'yes',
-            horse: 'yes'
-        },
-        secondary_link: {
-            foot: 'yes',
-            motor_vehicle: 'yes',
-            bicycle: 'yes',
-            horse: 'yes'
-        },
-        tertiary_link: {
-            foot: 'yes',
-            motor_vehicle: 'yes',
-            bicycle: 'yes',
-            horse: 'yes'
-        }
-    };
-
-    access.tags = function(tags) {
-        items.selectAll('.preset-input-access')
-            .value(function(d) { return tags[d] || ''; })
-            .attr('placeholder', function() {
-                return tags.access ? tags.access : field.placeholder();
-            });
-
-        items.selectAll('#preset-input-access-access')
-            .attr('placeholder', 'yes');
-
-        _.forEach(placeholders[tags.highway], function(value, key) {
-            items.selectAll('#preset-input-access-' + key)
-                .attr('placeholder', function() {
-                    return (tags.access && (value === 'yes' || value === 'designated')) ? tags.access : value;
-                });
-        });
-    };
-
-    access.focus = function() {
-        items.selectAll('.preset-input-access')
-            .node().focus();
-    };
-
-    return d3.rebind(access, event, 'on');
-};
-iD.ui.preset.address = function(field, context) {
-    var event = d3.dispatch('init', 'change'),
-        wrap,
-        entity,
-        isInitialized;
-
-    var widths = {
-        housenumber: 1/3,
-        street: 2/3,
-        city: 2/3,
-        state: 1/4,
-        postcode: 1/3
-    };
-
-    function getStreets() {
-        var extent = entity.extent(context.graph()),
-            l = extent.center(),
-            box = iD.geo.Extent(l).padByMeters(200);
-
-        return context.intersects(box)
-            .filter(isAddressable)
-            .map(function(d) {
-                var loc = context.projection([
-                    (extent[0][0] + extent[1][0]) / 2,
-                    (extent[0][1] + extent[1][1]) / 2]),
-                    choice = iD.geo.chooseEdge(context.childNodes(d), loc, context.projection);
-                return {
-                    title: d.tags.name,
-                    value: d.tags.name,
-                    dist: choice.distance
-                };
-            }).sort(function(a, b) {
-                return a.dist - b.dist;
-            });
-
-        function isAddressable(d) {
-            return d.tags.highway && d.tags.name && d.type === 'way';
-        }
-    }
-
-    function getCities() {
-        var extent = entity.extent(context.graph()),
-            l = extent.center(),
-            box = iD.geo.Extent(l).padByMeters(200);
-
-        return context.intersects(box)
-            .filter(isAddressable)
-            .map(function(d) {
-                return {
-                    title: d.tags['addr:city'] || d.tags.name,
-                    value: d.tags['addr:city'] || d.tags.name,
-                    dist: iD.geo.sphericalDistance(d.extent(context.graph()).center(), l)
-                };
-            }).sort(function(a, b) {
-                return a.dist - b.dist;
-            });
-
-        function isAddressable(d) {
-            if (d.tags.name &&
-                (d.tags.admin_level === '8' || d.tags.border_type === 'city'))
-                return true;
-
-            if (d.tags.place && d.tags.name && (
-                    d.tags.place === 'city' ||
-                    d.tags.place === 'town' ||
-                    d.tags.place === 'village'))
-                return true;
-
-            if (d.tags['addr:city']) return true;
-
-            return false;
-        }
-    }
-
-    function getPostCodes() {
-        var extent = entity.extent(context.graph()),
-            l = extent.center(),
-            box = iD.geo.Extent(l).padByMeters(200);
-
-        return context.intersects(box)
-            .filter(isAddressable)
-            .map(function(d) {
-                return {
-                    title: d.tags['addr:postcode'],
-                    value: d.tags['addr:postcode'],
-                    dist: iD.geo.sphericalDistance(d.extent(context.graph()).center(), l)
-                };
-            }).sort(function(a, b) {
-                return a.dist - b.dist;
-            });
-
-        function isAddressable(d) {
-            return d.tags['addr:postcode'];
-        }
-    }
-
-    function address(selection) {
-        selection.selectAll('.preset-input-wrap')
-            .remove();
-
-        var center = entity.extent(context.graph()).center(),
-            addressFormat;
-
-        // Enter
-
-        wrap = selection.append('div')
-            .attr('class', 'preset-input-wrap');
-
-        iD.countryCode().search(center, function (err, countryCode) {
-            addressFormat = _.find(iD.data.addressFormats, function (a) {
-                return a && a.countryCodes && _.contains(a.countryCodes, countryCode);
-            }) || _.first(iD.data.addressFormats);
-
-            function row(r) {
-                // Normalize widths.
-                var total = _.reduce(r, function(sum, field) {
-                    return sum + (widths[field] || 0.5);
-                }, 0);
-
-                return r.map(function (field) {
-                    return {
-                        id: field,
-                        width: (widths[field] || 0.5) / total
-                    };
-                });
-            }
-
-            wrap.selectAll('div')
-                .data(addressFormat.format)
-                .enter()
-                .append('div')
-                .attr('class', 'addr-row')
-                .selectAll('input')
-                .data(row)
-                .enter()
-                .append('input')
-                .property('type', 'text')
-                .attr('placeholder', function (d) { return field.t('placeholders.' + d.id); })
-                .attr('class', function (d) { return 'addr-' + d.id; })
-                .style('width', function (d) { return d.width * 100 + '%'; });
-
-            // Update
-
-            wrap.selectAll('.addr-street')
-                .call(d3.combobox()
-                    .fetcher(function(value, callback) {
-                        callback(getStreets());
-                    }));
-
-            wrap.selectAll('.addr-city')
-                .call(d3.combobox()
-                    .fetcher(function(value, callback) {
-                        callback(getCities());
-                    }));
-
-            wrap.selectAll('.addr-postcode')
-                .call(d3.combobox()
-                    .fetcher(function(value, callback) {
-                        callback(getPostCodes());
-                    }));
-
-            wrap.selectAll('input')
-                .on('blur', change)
-                .on('change', change);
-
-            event.init();
-            isInitialized = true;
-        });
-    }
-
-    function change() {
-        var tags = {};
-
-        wrap.selectAll('input')
-            .each(function (field) {
-                tags['addr:' + field.id] = this.value || undefined;
-            });
-
-        event.change(tags);
-    }
-
-    function updateTags(tags) {
-        wrap.selectAll('input')
-            .value(function (field) {
-                return tags['addr:' + field.id] || '';
-            });
-    }
-
-    address.entity = function(_) {
-        if (!arguments.length) return entity;
-        entity = _;
-        return address;
-    };
-
-    address.tags = function(tags) {
-        if (isInitialized) {
-            updateTags(tags);
-        } else {
-            event.on('init', function () {
-                updateTags(tags);
-            });
-        }
-    };
-
-    address.focus = function() {
-        wrap.selectAll('input').node().focus();
-    };
-
-    return d3.rebind(address, event, 'on');
-};
-iD.ui.preset.check =
-iD.ui.preset.defaultcheck = function(field) {
-    var event = d3.dispatch('change'),
-        options = field.strings && field.strings.options,
-        values = [],
-        texts = [],
-        entity, value, box, text, label;
-
-    if (options) {
-        for (var k in options) {
-            values.push(k === 'undefined' ? undefined : k);
-            texts.push(field.t('options.' + k, { 'default': options[k] }));
-        }
-    } else {
-        values = [undefined, 'yes'];
-        texts = [t('inspector.unknown'), t('inspector.check.yes')];
-        if (field.type === 'check') {
-            values.push('no');
-            texts.push(t('inspector.check.no'));
-        }
-    }
-
-    var check = function(selection) {
-        // hack: pretend oneway field is a oneway_yes field
-        // where implied oneway tag exists (e.g. `junction=roundabout`) #2220, #1841
-        if (field.id === 'oneway') {
-            for (var key in entity.tags) {
-                if (key in iD.oneWayTags && (entity.tags[key] in iD.oneWayTags[key])) {
-                    texts[0] = t('presets.fields.oneway_yes.options.undefined');
-                    break;
-                }
-            }
-        }
-
-        selection.classed('checkselect', 'true');
-
-        label = selection.selectAll('.preset-input-wrap')
-            .data([0]);
-
-        var enter = label.enter().append('label')
-            .attr('class', 'preset-input-wrap');
-
-        enter.append('input')
-            .property('indeterminate', field.type === 'check')
-            .attr('type', 'checkbox')
-            .attr('id', 'preset-input-' + field.id);
-
-        enter.append('span')
-            .text(texts[0])
-            .attr('class', 'value');
-
-        box = label.select('input')
-            .on('click', function() {
-                var t = {};
-                t[field.key] = values[(values.indexOf(value) + 1) % values.length];
-                event.change(t);
-                d3.event.stopPropagation();
-            });
-
-        text = label.select('span.value');
-    };
-
-    check.entity = function(_) {
-        if (!arguments.length) return entity;
-        entity = _;
-        return check;
-    };
-
-    check.tags = function(tags) {
-        value = tags[field.key];
-        box.property('indeterminate', field.type === 'check' && !value);
-        box.property('checked', value === 'yes');
-        text.text(texts[values.indexOf(value)]);
-        label.classed('set', !!value);
-    };
-
-    check.focus = function() {
-        box.node().focus();
-    };
-
-    return d3.rebind(check, event, 'on');
-};
-iD.ui.preset.combo =
-iD.ui.preset.typeCombo = function(field) {
-    var event = d3.dispatch('change'),
-        optstrings = field.strings && field.strings.options,
-        optarray = field.options,
-        strings = {},
-        input;
-
-    function combo(selection) {
-        var combobox = d3.combobox();
-
-        input = selection.selectAll('input')
-            .data([0]);
-
-        var enter = input.enter()
-            .append('input')
-            .attr('type', 'text')
-            .attr('id', 'preset-input-' + field.id);
-
-        if (optstrings) { enter.attr('readonly', 'readonly'); }
-
-        input
-            .call(combobox)
-            .on('change', change)
-            .on('blur', change)
-            .each(function() {
-                if (optstrings) {
-                    _.each(optstrings, function(v, k) {
-                        strings[k] = field.t('options.' + k, { 'default': v });
-                    });
-                    stringsLoaded();
-                } else if (optarray) {
-                    _.each(optarray, function(k) {
-                        strings[k] = k.replace(/_+/g, ' ');
-                    });
-                    stringsLoaded();
-                } else {
-                    iD.taginfo().values({key: field.key}, function(err, data) {
-                        if (!err) {
-                            _.each(_.pluck(data, 'value'), function(k) {
-                                strings[k] = k.replace(/_+/g, ' ');
-                            });
-                            stringsLoaded();
-                        }
-                    });
-                }
-            });
-
-        function stringsLoaded() {
-            var keys = _.keys(strings),
-                strs = [],
-                placeholders;
-
-            combobox.data(keys.map(function(k) {
-                var s = strings[k],
-                    o = {};
-                o.title = o.value = s;
-                if (s.length < 20) { strs.push(s); }
-                return o;
-            }));
-
-            placeholders = strs.length > 1 ? strs : keys;
-            input.attr('placeholder', field.placeholder() ||
-                (placeholders.slice(0, 3).join(', ') + '...'));
-        }
-    }
-
-    function change() {
-        var optstring = _.find(_.keys(strings), function(k) { return strings[k] === input.value(); }),
-            value = optstring || (input.value()
-                .split(';')
-                .map(function(s) { return s.trim(); })
-                .join(';')
-                .replace(/\s+/g, '_'));
-
-        if (field.type === 'typeCombo' && !value) value = 'yes';
-
-        var t = {};
-        t[field.key] = value || undefined;
-        event.change(t);
-    }
-
-    combo.tags = function(tags) {
-        var key = tags[field.key],
-            value = strings[key] || key || '';
-        if (field.type === 'typeCombo' && value.toLowerCase() === 'yes') value = '';
-        input.value(value);
-    };
-
-    combo.focus = function() {
-        input.node().focus();
-    };
-
-    return d3.rebind(combo, event, 'on');
-};
-iD.ui.preset.text =
-iD.ui.preset.number =
-iD.ui.preset.tel =
-iD.ui.preset.email =
-iD.ui.preset.url = function(field) {
-
-    var event = d3.dispatch('change'),
-        input;
-
-    function i(selection) {
-        input = selection.selectAll('input')
-            .data([0]);
-
-        input.enter().append('input')
-            .attr('type', field.type)
-            .attr('id', 'preset-input-' + field.id)
-            .attr('placeholder', field.placeholder() || t('inspector.unknown'));
-
-        input
-            .on('blur', change)
-            .on('change', change);
-
-        if (field.type === 'number') {
-            input.attr('type', 'text');
-
-            var spinControl = selection.selectAll('.spin-control')
-                .data([0]);
-
-            var enter = spinControl.enter().append('div')
-                .attr('class', 'spin-control');
-
-            enter.append('button')
-                .datum(1)
-                .attr('class', 'increment');
-
-            enter.append('button')
-                .datum(-1)
-                .attr('class', 'decrement');
-
-            spinControl.selectAll('button')
-                .on('click', function(d) {
-                    d3.event.preventDefault();
-                    var num = parseInt(input.node().value || 0, 10);
-                    if (!isNaN(num)) input.node().value = num + d;
-                    change();
-                });
-        }
-    }
-
-    function change() {
-        var t = {};
-        t[field.key] = input.value() || undefined;
-        event.change(t);
-    }
-
-    i.tags = function(tags) {
-        input.value(tags[field.key] || '');
-    };
-
-    i.focus = function() {
-        input.node().focus();
-    };
-
-    return d3.rebind(i, event, 'on');
-};
-iD.ui.preset.localized = function(field, context) {
-
-    var event = d3.dispatch('change'),
-        wikipedia = iD.wikipedia(),
-        input, localizedInputs, wikiTitles,
-        entity;
-
-    function i(selection) {
-        input = selection.selectAll('.localized-main')
-            .data([0]);
-
-        input.enter().append('input')
-            .attr('type', 'text')
-            .attr('id', 'preset-input-' + field.id)
-            .attr('class', 'localized-main')
-            .attr('placeholder', field.placeholder());
-
-        if (field.id === 'name') {
-            var preset = context.presets().match(entity, context.graph());
-            input.call(d3.combobox().fetcher(
-                iD.util.SuggestNames(preset, iD.data.suggestions)
-            ));
-        }
-
-        input
-            .on('blur', change)
-            .on('change', change);
-
-        var translateButton = selection.selectAll('.localized-add')
-            .data([0]);
-
-        translateButton.enter().append('button')
-            .attr('class', 'button-input-action localized-add minor')
-            .call(bootstrap.tooltip()
-                .title(t('translate.translate'))
-                .placement('left'))
-            .append('span')
-            .attr('class', 'icon plus');
-
-        translateButton
-            .on('click', addBlank);
-
-        localizedInputs = selection.selectAll('.localized-wrap')
-            .data([0]);
-
-        localizedInputs.enter().append('div')
-            .attr('class', 'localized-wrap');
-    }
-
-    function addBlank() {
-        d3.event.preventDefault();
-        var data = localizedInputs.selectAll('div.entry').data();
-        data.push({ lang: '', value: '' });
-        localizedInputs.call(render, data);
-    }
-
-    function change() {
-        var t = {};
-        t[field.key] = d3.select(this).value() || undefined;
-        event.change(t);
-    }
-
-    function key(lang) { return field.key + ':' + lang; }
-
-    function changeLang(d) {
-        var lang = d3.select(this).value(),
-            t = {},
-            language = _.find(iD.data.wikipedia, function(d) {
-                return d[0].toLowerCase() === lang.toLowerCase() ||
-                    d[1].toLowerCase() === lang.toLowerCase();
-            });
-
-        if (language) lang = language[2];
-
-        if (d.lang && d.lang !== lang) {
-            t[key(d.lang)] = undefined;
-        }
-
-        var value = d3.select(this.parentNode)
-            .selectAll('.localized-value')
-            .value();
-
-        if (lang && value) {
-            t[key(lang)] = value;
-        } else if (lang && wikiTitles && wikiTitles[d.lang]) {
-            t[key(lang)] = wikiTitles[d.lang];
-        }
-
-        d.lang = lang;
-        event.change(t);
-    }
-
-    function changeValue(d) {
-        if (!d.lang) return;
-        var t = {};
-        t[key(d.lang)] = d3.select(this).value() || undefined;
-        event.change(t);
-    }
-
-    function fetcher(value, cb) {
-        var v = value.toLowerCase();
-
-        cb(iD.data.wikipedia.filter(function(d) {
-            return d[0].toLowerCase().indexOf(v) >= 0 ||
-            d[1].toLowerCase().indexOf(v) >= 0 ||
-            d[2].toLowerCase().indexOf(v) >= 0;
-        }).map(function(d) {
-            return { value: d[1] };
-        }));
-    }
-
-    function render(selection, data) {
-        var wraps = selection.selectAll('div.entry').
-            data(data, function(d) { return d.lang; });
-
-        var innerWrap = wraps.enter()
-            .insert('div', ':first-child');
-
-        innerWrap.attr('class', 'entry')
-            .each(function() {
-                var wrap = d3.select(this);
-                var langcombo = d3.combobox().fetcher(fetcher);
-
-                var label = wrap.append('label')
-                    .attr('class','form-label')
-                    .text(t('translate.localized_translation_label'))
-                    .attr('for','localized-lang');
-
-                label.append('button')
-                    .attr('class', 'minor remove')
-                    .on('click', function(d){
-                        d3.event.preventDefault();
-                        var t = {};
-                        t[key(d.lang)] = undefined;
-                        event.change(t);
-                        d3.select(this.parentNode.parentNode)
-                            .style('top','0')
-                            .style('max-height','240px')
-                            .transition()
-                            .style('opacity', '0')
-                            .style('max-height','0px')
-                            .remove();
-                    })
-                    .append('span').attr('class', 'icon delete');
-
-                wrap.append('input')
-                    .attr('class', 'localized-lang')
-                    .attr('type', 'text')
-                    .attr('placeholder',t('translate.localized_translation_language'))
-                    .on('blur', changeLang)
-                    .on('change', changeLang)
-                    .call(langcombo);
-
-                wrap.append('input')
-                    .on('blur', changeValue)
-                    .on('change', changeValue)
-                    .attr('type', 'text')
-                    .attr('placeholder', t('translate.localized_translation_name'))
-                    .attr('class', 'localized-value');
-            });
-
-        innerWrap
-            .style('margin-top', '0px')
-            .style('max-height', '0px')
-            .style('opacity', '0')
-            .transition()
-            .duration(200)
-            .style('margin-top', '10px')
-            .style('max-height', '240px')
-            .style('opacity', '1')
-            .each('end', function() {
-                d3.select(this)
-                    .style('max-height', '')
-                    .style('overflow', 'visible');
-            });
-
-        wraps.exit()
-            .transition()
-            .duration(200)
-            .style('max-height','0px')
-            .style('opacity', '0')
-            .style('top','-10px')
-            .remove();
-
-        var entry = selection.selectAll('.entry');
-
-        entry.select('.localized-lang')
-            .value(function(d) {
-                var lang = _.find(iD.data.wikipedia, function(lang) { return lang[2] === d.lang; });
-                return lang ? lang[1] : d.lang;
-            });
-
-        entry.select('.localized-value')
-            .value(function(d) { return d.value; });
-    }
-
-    i.tags = function(tags) {
-
-        // Fetch translations from wikipedia
-        if (tags.wikipedia && !wikiTitles) {
-            wikiTitles = {};
-            var wm = tags.wikipedia.match(/([^:]+):(.+)/);
-            if (wm && wm[0] && wm[1]) {
-                wikipedia.translations(wm[1], wm[2], function(d) {
-                    wikiTitles = d;
-                });
-            }
-        }
-
-        input.value(tags[field.key] || '');
-
-        var postfixed = [];
-        for (var i in tags) {
-            var m = i.match(new RegExp(field.key + ':([a-zA-Z_-]+)$'));
-            if (m && m[1]) {
-                postfixed.push({ lang: m[1], value: tags[i]});
-            }
-        }
-
-        localizedInputs.call(render, postfixed.reverse());
-    };
-
-    i.focus = function() {
-        input.node().focus();
-    };
-
-    i.entity = function(_) {
-        entity = _;
-    };
-
-    return d3.rebind(i, event, 'on');
-};
-iD.ui.preset.maxspeed = function(field, context) {
-
-    var event = d3.dispatch('change'),
-        entity,
-        imperial,
-        unitInput,
-        combobox,
-        input;
-
-    var metricValues = [20, 30, 40, 50, 60, 70, 80, 90, 100, 110, 120],
-        imperialValues = [20, 25, 30, 35, 40, 45, 50, 55, 65, 70];
-
-    function maxspeed(selection) {
-        combobox = d3.combobox();
-        var unitCombobox = d3.combobox().data(['km/h', 'mph'].map(comboValues));
-
-        input = selection.selectAll('#preset-input-' + field.id)
-            .data([0]);
-
-        input.enter().append('input')
-            .attr('type', 'text')
-            .attr('id', 'preset-input-' + field.id)
-            .attr('placeholder', field.placeholder());
-
-        input
-            .call(combobox)
-            .on('change', change)
-            .on('blur', change);
-
-        var childNodes = context.graph().childNodes(context.entity(entity.id)),
-            loc = childNodes[~~(childNodes.length/2)].loc;
-
-        imperial = _.any(iD.data.imperial.features, function(f) {
-            return _.any(f.geometry.coordinates, function(d) {
-                return iD.geo.pointInPolygon(loc, d[0]);
-            });
-        });
-
-        unitInput = selection.selectAll('input.maxspeed-unit')
-            .data([0]);
-
-        unitInput.enter().append('input')
-            .attr('type', 'text')
-            .attr('class', 'maxspeed-unit');
-
-        unitInput
-            .on('blur', changeUnits)
-            .on('change', changeUnits)
-            .call(unitCombobox);
-
-        function changeUnits() {
-            imperial = unitInput.value() === 'mph';
-            unitInput.value(imperial ? 'mph' : 'km/h');
-            setSuggestions();
-            change();
-        }
-
-    }
-
-    function setSuggestions() {
-        combobox.data((imperial ? imperialValues : metricValues).map(comboValues));
-        unitInput.value(imperial ? 'mph' : 'km/h');
-    }
-
-    function comboValues(d) {
-        return {
-            value: d.toString(),
-            title: d.toString()
-        };
-    }
-
-    function change() {
-        var tag = {},
-            value = input.value();
-
-        if (!value) {
-            tag[field.key] = undefined;
-        } else if (isNaN(value) || !imperial) {
-            tag[field.key] = value;
-        } else {
-            tag[field.key] = value + ' mph';
-        }
-
-        event.change(tag);
-    }
-
-    maxspeed.tags = function(tags) {
-        var value = tags[field.key];
-
-        if (value && value.indexOf('mph') >= 0) {
-            value = parseInt(value, 10);
-            imperial = true;
-        } else if (value) {
-            imperial = false;
-        }
-
-        setSuggestions();
-
-        input.value(value || '');
-    };
-
-    maxspeed.focus = function() {
-        input.node().focus();
-    };
-
-    maxspeed.entity = function(_) {
-        entity = _;
-    };
-
-    return d3.rebind(maxspeed, event, 'on');
-};
-iD.ui.preset.radio = function(field) {
-
-    var event = d3.dispatch('change'),
-        labels, radios, placeholder;
-
-    function radio(selection) {
-        selection.classed('preset-radio', true);
-
-        var wrap = selection.selectAll('.preset-input-wrap')
-            .data([0]);
-
-        var buttonWrap = wrap.enter().append('div')
-            .attr('class', 'preset-input-wrap toggle-list');
-
-        buttonWrap.append('span')
-            .attr('class', 'placeholder');
-
-        placeholder = selection.selectAll('.placeholder');
-
-        labels = wrap.selectAll('label')
-            .data(field.options || field.keys);
-
-        var enter = labels.enter().append('label');
-
-        enter.append('input')
-            .attr('type', 'radio')
-            .attr('name', field.id)
-            .attr('value', function(d) { return field.t('options.' + d, { 'default': d }); })
-            .attr('checked', false);
-
-        enter.append('span')
-            .text(function(d) { return field.t('options.' + d, { 'default': d }); });
-
-        radios = labels.selectAll('input')
-            .on('change', change);
-    }
-
-    function change() {
-        var t = {};
-        if (field.key) t[field.key] = undefined;
-        radios.each(function(d) {
-            var active = d3.select(this).property('checked');
-            if (field.key) {
-                if (active) t[field.key] = d;
-            } else {
-                t[d] = active ? 'yes' : undefined;
-            }
-        });
-        event.change(t);
-    }
-
-    radio.tags = function(tags) {
-        function checked(d) {
-            if (field.key) {
-                return tags[field.key] === d;
-            } else {
-                return !!(tags[d] && tags[d] !== 'no');
-            }
-        }
-
-        labels.classed('active', checked);
-        radios.property('checked', checked);
-        var selection = radios.filter(function() { return this.checked; });
-        if (selection.empty()) {
-            placeholder.text(t('inspector.none'));
-        } else {
-            placeholder.text(selection.attr('value'));
-        }
-    };
-
-    radio.focus = function() {
-        radios.node().focus();
-    };
-
-    return d3.rebind(radio, event, 'on');
-};
-iD.ui.preset.restrictions = function(field, context) {
-    var event = d3.dispatch('change'),
-        vertexID,
-        fromNodeID;
-
-    function restrictions(selection) {
-        var wrap = selection.selectAll('.preset-input-wrap')
-            .data([0]);
-
-        var enter = wrap.enter().append('div')
-            .attr('class', 'preset-input-wrap');
-
-        enter.append('div')
-            .attr('class', 'restriction-help');
-
-        enter.append('svg')
-            .call(iD.svg.Surface(context))
-            .call(iD.behavior.Hover(context));
-
-        var intersection = iD.geo.Intersection(context.graph(), vertexID),
-            graph = intersection.graph,
-            vertex = graph.entity(vertexID),
-            surface = wrap.selectAll('svg'),
-            filter = function () { return true; },
-            extent = iD.geo.Extent(),
-            projection = iD.geo.RawMercator(),
-            lines = iD.svg.Lines(projection, context),
-            vertices = iD.svg.Vertices(projection, context),
-            turns = iD.svg.Turns(projection, context);
-
-        var d = wrap.dimensions(),
-            c = [d[0] / 2, d[1] / 2],
-            z = 21;
-
-        projection
-            .scale(256 * Math.pow(2, z) / (2 * Math.PI));
-
-        var s = projection(vertex.loc);
-
-        projection
-            .translate([c[0] - s[0], c[1] - s[1]])
-            .clipExtent([[0, 0], d]);
-
-        surface
-            .call(vertices, graph, [vertex], filter, extent, z)
-            .call(lines, graph, intersection.highways, filter)
-            .call(turns, graph, intersection.turns(fromNodeID));
-
-        surface
-            .on('click.restrictions', click)
-            .on('mouseover.restrictions', mouseover)
-            .on('mouseout.restrictions', mouseout);
-
-        surface
-            .selectAll('.selected')
-            .classed('selected', false);
-
-        if (fromNodeID) {
-            surface
-                .selectAll('.' + _.find(intersection.highways, function(way) { return way.contains(fromNodeID); }).id)
-                .classed('selected', true);
-        }
-
-        mouseout();
-
-        context.history()
-            .on('change.restrictions', render);
-
-        d3.select(window)
-            .on('resize.restrictions', render);
-
-        function click() {
-            var datum = d3.event.target.__data__;
-            if (datum instanceof iD.Entity) {
-                fromNodeID = datum.nodes[(datum.first() === vertexID) ? 1 : datum.nodes.length - 2];
-                render();
-            } else if (datum instanceof iD.geo.Turn) {
-                if (datum.restriction) {
-                    context.perform(
-                        iD.actions.UnrestrictTurn(datum, projection),
-                        t('operations.restriction.annotation.delete'));
-                } else {
-                    context.perform(
-                        iD.actions.RestrictTurn(datum, projection),
-                        t('operations.restriction.annotation.create'));
-                }
-            }
-        }
-
-        function mouseover() {
-            var datum = d3.event.target.__data__;
-            if (datum instanceof iD.geo.Turn) {
-                var graph = context.graph(),
-                    presets = context.presets(),
-                    preset;
-
-                if (datum.restriction) {
-                    preset = presets.match(graph.entity(datum.restriction), graph);
-                } else {
-                    preset = presets.item('type/restriction/' +
-                        iD.geo.inferRestriction(
-                            graph,
-                            datum.from,
-                            datum.via,
-                            datum.to,
-                            projection));
-                }
-
-                wrap.selectAll('.restriction-help')
-                    .text(t('operations.restriction.help.' +
-                        (datum.restriction ? 'toggle_off' : 'toggle_on'),
-                        {restriction: preset.name()}));
-            }
-        }
-
-        function mouseout() {
-            wrap.selectAll('.restriction-help')
-                .text(t('operations.restriction.help.' +
-                    (fromNodeID ? 'toggle' : 'select')));
-        }
-
-        function render() {
-            if (context.hasEntity(vertexID)) {
-                restrictions(selection);
-            }
-        }
-    }
-
-    restrictions.entity = function(_) {
-        if (!vertexID || vertexID !== _.id) {
-            fromNodeID = null;
-            vertexID = _.id;
-        }
-    };
-
-    restrictions.tags = function() {};
-    restrictions.focus = function() {};
-
-    return d3.rebind(restrictions, event, 'on');
-};
-iD.ui.preset.textarea = function(field) {
-
-    var event = d3.dispatch('change'),
-        input;
-
-    function i(selection) {
-        input = selection.selectAll('textarea')
-            .data([0]);
-
-        input.enter().append('textarea')
-            .attr('id', 'preset-input-' + field.id)
-            .attr('placeholder', field.placeholder() || t('inspector.unknown'))
-            .attr('maxlength', 255);
-
-        input
-            .on('blur', change)
-            .on('change', change);
-    }
-
-    function change() {
-        var t = {};
-        t[field.key] = input.value() || undefined;
-        event.change(t);
-    }
-
-    i.tags = function(tags) {
-        input.value(tags[field.key] || '');
-    };
-
-    i.focus = function() {
-        input.node().focus();
-    };
-
-    return d3.rebind(i, event, 'on');
-};
-iD.ui.preset.wikipedia = function(field, context) {
-
-    var event = d3.dispatch('change'),
-        wikipedia = iD.wikipedia(),
-        link, entity, lang, title;
-
-    function i(selection) {
-
-        var langcombo = d3.combobox()
-            .fetcher(function(value, cb) {
-                var v = value.toLowerCase();
-
-                cb(iD.data.wikipedia.filter(function(d) {
-                    return d[0].toLowerCase().indexOf(v) >= 0 ||
-                        d[1].toLowerCase().indexOf(v) >= 0 ||
-                        d[2].toLowerCase().indexOf(v) >= 0;
-                }).map(function(d) {
-                    return { value: d[1] };
-                }));
-            });
-
-        var titlecombo = d3.combobox()
-            .fetcher(function(value, cb) {
-
-                if (!value) value = context.entity(entity.id).tags.name || '';
-                var searchfn = value.length > 7 ? wikipedia.search : wikipedia.suggestions;
-
-                searchfn(language()[2], value, function(query, data) {
-                    cb(data.map(function(d) {
-                        return { value: d };
-                    }));
-                });
-            });
-
-        lang = selection.selectAll('input.wiki-lang')
-            .data([0]);
-
-        lang.enter().append('input')
-            .attr('type', 'text')
-            .attr('class', 'wiki-lang')
-            .value('English');
-
-        lang
-            .call(langcombo)
-            .on('blur', changeLang)
-            .on('change', changeLang);
-
-        title = selection.selectAll('input.wiki-title')
-            .data([0]);
-
-        title.enter().append('input')
-            .attr('type', 'text')
-            .attr('class', 'wiki-title')
-            .attr('id', 'preset-input-' + field.id);
-
-        title
-            .call(titlecombo)
-            .on('blur', change)
-            .on('change', change);
-
-        link = selection.selectAll('a.wiki-link')
-            .data([0]);
-
-        link.enter().append('a')
-            .attr('class', 'wiki-link button-input-action minor')
-            .attr('target', '_blank')
-            .append('span')
-            .attr('class', 'icon out-link');
-    }
-
-    function language() {
-        var value = lang.value().toLowerCase();
-        return _.find(iD.data.wikipedia, function(d) {
-            return d[0].toLowerCase() === value ||
-                d[1].toLowerCase() === value ||
-                d[2].toLowerCase() === value;
-        }) || iD.data.wikipedia[0];
-    }
-
-    function changeLang() {
-        lang.value(language()[1]);
-        change();
-    }
-
-    function change() {
-        var value = title.value(),
-            m = value.match(/https?:\/\/([a-z]+)\.wikipedia\.org\/wiki\/(.+)/),
-            l = m && _.find(iD.data.wikipedia, function(d) { return m[1] === d[2]; });
-
-        if (l) {
-            // Normalize title http://www.mediawiki.org/wiki/API:Query#Title_normalization
-            value = m[2].replace(/_/g, ' ');
-            value = value.slice(0, 1).toUpperCase() + value.slice(1);
-            lang.value(l[1]);
-            title.value(value);
-        }
-
-        var t = {};
-        t[field.key] = value ? language()[2] + ':' + value : undefined;
-        event.change(t);
-    }
-
-    i.tags = function(tags) {
-        var value = tags[field.key] || '',
-            m = value.match(/([^:]+):(.+)/),
-            l = m && _.find(iD.data.wikipedia, function(d) { return m[1] === d[2]; });
-
-        // value in correct format
-        if (l) {
-            lang.value(l[1]);
-            title.value(m[2]);
-            link.attr('href', 'http://' + m[1] + '.wikipedia.org/wiki/' + m[2]);
-
-        // unrecognized value format
-        } else {
-            title.value(value);
-            link.attr('href', 'http://en.wikipedia.org/wiki/Special:Search?search=' + value);
-        }
-    };
-
-    i.entity = function(_) {
-        entity = _;
-    };
-
-    i.focus = function() {
-        title.node().focus();
-    };
-
-    return d3.rebind(i, event, 'on');
-};
-iD.ui.intro.area = function(context, reveal) {
-
-    var event = d3.dispatch('done'),
-        timeout;
-
-    var step = {
-        title: 'intro.areas.title'
-    };
-
-    step.enter = function() {
-
-        var playground = [-85.63552, 41.94159],
-            corner = [-85.63565411045074, 41.9417715536927];
-        context.map().centerZoom(playground, 19);
-        reveal('button.add-area', t('intro.areas.add'), {tooltipClass: 'intro-areas-add'});
-
-        context.on('enter.intro', addArea);
-
-        function addArea(mode) {
-            if (mode.id !== 'add-area') return;
-            context.on('enter.intro', drawArea);
-
-            var padding = 120 * Math.pow(2, context.map().zoom() - 19);
-            var pointBox = iD.ui.intro.pad(corner, padding, context);
-            reveal(pointBox, t('intro.areas.corner'));
-
-            context.map().on('move.intro', function() {
-                padding = 120 * Math.pow(2, context.map().zoom() - 19);
-                pointBox = iD.ui.intro.pad(corner, padding, context);
-                reveal(pointBox, t('intro.areas.corner'), {duration: 0});
-            });
-        }
-
-        function drawArea(mode) {
-            if (mode.id !== 'draw-area') return;
-            context.on('enter.intro', enterSelect);
-
-            var padding = 150 * Math.pow(2, context.map().zoom() - 19);
-            var pointBox = iD.ui.intro.pad(playground, padding, context);
-            reveal(pointBox, t('intro.areas.place'));
-
-            context.map().on('move.intro', function() {
-                padding = 150 * Math.pow(2, context.map().zoom() - 19);
-                pointBox = iD.ui.intro.pad(playground, padding, context);
-                reveal(pointBox, t('intro.areas.place'), {duration: 0});
-            });
-        }
-
-        function enterSelect(mode) {
-            if (mode.id !== 'select') return;
-            context.map().on('move.intro', null);
-            context.on('enter.intro', null);
-
-            timeout = setTimeout(function() {
-                reveal('.preset-search-input', t('intro.areas.search', {name: context.presets().item('leisure/playground').name()}));
-                d3.select('.preset-search-input').on('keyup.intro', keySearch);
-            }, 500);
-        }
-
-        function keySearch() {
-            var first = d3.select('.preset-list-item:first-child');
-            if (first.classed('preset-leisure-playground')) {
-                reveal(first.select('.preset-list-button').node(), t('intro.areas.choose'));
-                d3.selection.prototype.one.call(context.history(), 'change.intro', selectedPreset);
-                d3.select('.preset-search-input').on('keyup.intro', null);
-            }
-        }
-
-        function selectedPreset() {
-            reveal('.pane', t('intro.areas.describe'));
-            context.on('exit.intro', event.done);
-        }
-    };
-
-    step.exit = function() {
-        window.clearTimeout(timeout);
-        context.on('enter.intro', null);
-        context.on('exit.intro', null);
-        context.history().on('change.intro', null);
-        context.map().on('move.intro', null);
-        d3.select('.preset-search-input').on('keyup.intro', null);
-    };
-
-    return d3.rebind(step, event, 'on');
-};
-iD.ui.intro.line = function(context, reveal) {
-
-    var event = d3.dispatch('done'),
-        timeouts = [];
-
-    var step = {
-        title: 'intro.lines.title'
-    };
-
-    function timeout(f, t) {
-        timeouts.push(window.setTimeout(f, t));
-    }
-
-    step.enter = function() {
-
-        var centroid = [-85.62830, 41.95699];
-        var midpoint = [-85.62975395449628, 41.95787501510204];
-        var start = [-85.6297754121684, 41.95805253325314];
-        var intersection = [-85.62974496187628, 41.95742515554585];
-
-        context.map().centerZoom(start, 18);
-        reveal('button.add-line', t('intro.lines.add'), {tooltipClass: 'intro-lines-add'});
-
-        context.on('enter.intro', addLine);
-
-        function addLine(mode) {
-            if (mode.id !== 'add-line') return;
-            context.on('enter.intro', drawLine);
-
-            var padding = 150 * Math.pow(2, context.map().zoom() - 18);
-            var pointBox = iD.ui.intro.pad(start, padding, context);
-            reveal(pointBox, t('intro.lines.start'));
-
-            context.map().on('move.intro', function() {
-                padding = 150 * Math.pow(2, context.map().zoom() - 18);
-                pointBox = iD.ui.intro.pad(start, padding, context);
-                reveal(pointBox, t('intro.lines.start'), {duration: 0});
-            });
-        }
-
-        function drawLine(mode) {
-            if (mode.id !== 'draw-line') return;
-            context.history().on('change.intro', addIntersection);
-            context.on('enter.intro', retry);
-
-            var padding = 300 * Math.pow(2, context.map().zoom() - 19);
-            var pointBox = iD.ui.intro.pad(midpoint, padding, context);
-            reveal(pointBox, t('intro.lines.intersect'));
-
-            context.map().on('move.intro', function() {
-                padding = 300 * Math.pow(2, context.map().zoom() - 19);
-                pointBox = iD.ui.intro.pad(midpoint, padding, context);
-                reveal(pointBox, t('intro.lines.intersect'), {duration: 0});
-            });
-        }
-
-        // ended line before creating intersection
-        function retry(mode) {
-            if (mode.id !== 'select') return;
-            var pointBox = iD.ui.intro.pad(intersection, 30, context);
-            reveal(pointBox, t('intro.lines.restart'));
-            timeout(function() {
-                context.replace(iD.actions.DeleteMultiple(mode.selectedIDs()));
-                step.exit();
-                step.enter();
-            }, 3000);
-        }
-
-        function addIntersection(changes) {
-            if ( _.any(changes.created(), function(d) {
-                return d.type === 'node' && context.graph().parentWays(d).length > 1;
-            })) {
-                context.history().on('change.intro', null);
-                context.on('enter.intro', enterSelect);
-
-                var padding = 900 * Math.pow(2, context.map().zoom() - 19);
-                var pointBox = iD.ui.intro.pad(centroid, padding, context);
-                reveal(pointBox, t('intro.lines.finish'));
-
-                context.map().on('move.intro', function() {
-                    padding = 900 * Math.pow(2, context.map().zoom() - 19);
-                    pointBox = iD.ui.intro.pad(centroid, padding, context);
-                    reveal(pointBox, t('intro.lines.finish'), {duration: 0});
-                });
-            }
-        }
-
-        function enterSelect(mode) {
-            if (mode.id !== 'select') return;
-            context.map().on('move.intro', null);
-            context.on('enter.intro', null);
-            d3.select('#curtain').style('pointer-events', 'all');
-
-            presetCategory();
-        }
-
-        function presetCategory() {
-            timeout(function() {
-                d3.select('#curtain').style('pointer-events', 'none');
-                var road = d3.select('.preset-category-road .preset-list-button');
-                reveal(road.node(), t('intro.lines.road'));
-                road.one('click.intro', roadCategory);
-            }, 500);
-        }
-
-        function roadCategory() {
-            timeout(function() {
-                var grid = d3.select('.subgrid');
-                reveal(grid.node(), t('intro.lines.residential'));
-                grid.selectAll(':not(.preset-highway-residential) .preset-list-button')
-                    .one('click.intro', retryPreset);
-                grid.selectAll('.preset-highway-residential .preset-list-button')
-                    .one('click.intro', roadDetails);
-            }, 500);
-        }
-
-        // selected wrong road type
-        function retryPreset() {
-            timeout(function() {
-                var preset = d3.select('.entity-editor-pane .preset-list-button');
-                reveal(preset.node(), t('intro.lines.wrong_preset'));
-                preset.one('click.intro', presetCategory);
-            }, 500);
-        }
-
-        function roadDetails() {
-            reveal('.pane', t('intro.lines.describe'));
-            context.on('exit.intro', event.done);
-        }
-
-    };
-
-    step.exit = function() {
-        d3.select('#curtain').style('pointer-events', 'none');
-        timeouts.forEach(window.clearTimeout);
-        context.on('enter.intro', null);
-        context.on('exit.intro', null);
-        context.map().on('move.intro', null);
-        context.history().on('change.intro', null);
-    };
-
-    return d3.rebind(step, event, 'on');
-};
-iD.ui.intro.navigation = function(context, reveal) {
-
-    var event = d3.dispatch('done'),
-        timeouts = [];
-
-    var step = {
-        title: 'intro.navigation.title'
-    };
-
-    function set(f, t) {
-        timeouts.push(window.setTimeout(f, t));
-    }
-
-    /*
-     * Steps:
-     * Drag map
-     * Select poi
-     * Show editor header
-     * Show editor pane
-     * Select road
-     * Show header
-     */
-
-    step.enter = function() {
-
-        var rect = context.surfaceRect(),
-            map = {
-                left: rect.left + 10,
-                top: rect.top + 70,
-                width: rect.width - 70,
-                height: rect.height - 170
-            };
-
-        context.map().centerZoom([-85.63591, 41.94285], 19);
-
-        reveal(map, t('intro.navigation.drag'));
-
-        context.map().on('move.intro', _.debounce(function() {
-            context.map().on('move.intro', null);
-            townhall();
-            context.on('enter.intro', inspectTownHall);
-        }, 400));
-
-        function townhall() {
-            var hall = [-85.63645945147184, 41.942986488012565];
-
-            var point = context.projection(hall);
-            if (point[0] < 0 || point[0] > rect.width ||
-                point[1] < 0 || point[1] > rect.height) {
-                context.map().center(hall);
-            }
-
-            var box = iD.ui.intro.pointBox(hall, context);
-            reveal(box, t('intro.navigation.select'));
-
-            context.map().on('move.intro', function() {
-                var box = iD.ui.intro.pointBox(hall, context);
-                reveal(box, t('intro.navigation.select'), {duration: 0});
-            });
-        }
-
-        function inspectTownHall(mode) {
-            if (mode.id !== 'select') return;
-            context.on('enter.intro', null);
-            context.map().on('move.intro', null);
-            set(function() {
-                reveal('.entity-editor-pane', t('intro.navigation.pane'));
-                context.on('exit.intro', event.done);
-            }, 700);
-        }
-
-    };
-
-    step.exit = function() {
-        context.map().on('move.intro', null);
-        context.on('enter.intro', null);
-        context.on('exit.intro', null);
-        timeouts.forEach(window.clearTimeout);
-    };
-
-    return d3.rebind(step, event, 'on');
-};
-iD.ui.intro.point = function(context, reveal) {
-
-    var event = d3.dispatch('done'),
-        timeouts = [];
-
-    var step = {
-        title: 'intro.points.title'
-    };
-
-    function setTimeout(f, t) {
-        timeouts.push(window.setTimeout(f, t));
-    }
-
-    step.enter = function() {
-
-        context.map().centerZoom([-85.63279, 41.94394], 19);
-        reveal('button.add-point', t('intro.points.add'), {tooltipClass: 'intro-points-add'});
-
-        var corner = [-85.632481,41.944094];
-
-        context.on('enter.intro', addPoint);
-
-        function addPoint(mode) {
-            if (mode.id !== 'add-point') return;
-            context.on('enter.intro', enterSelect);
-
-            var pointBox = iD.ui.intro.pad(corner, 150, context);
-            reveal(pointBox, t('intro.points.place'));
-
-            context.map().on('move.intro', function() {
-                pointBox = iD.ui.intro.pad(corner, 150, context);
-                reveal(pointBox, t('intro.points.place'), {duration: 0});
-            });
-
-        }
-
-        function enterSelect(mode) {
-            if (mode.id !== 'select') return;
-            context.map().on('move.intro', null);
-            context.on('enter.intro', null);
-
-            setTimeout(function() {
-                reveal('.preset-search-input', t('intro.points.search', {name: context.presets().item('amenity/cafe').name()}));
-                d3.select('.preset-search-input').on('keyup.intro', keySearch);
-            }, 500);
-        }
-
-        function keySearch() {
-            var first = d3.select('.preset-list-item:first-child');
-            if (first.classed('preset-amenity-cafe')) {
-                reveal(first.select('.preset-list-button').node(), t('intro.points.choose'));
-                d3.selection.prototype.one.call(context.history(), 'change.intro', selectedPreset);
-
-                d3.select('.preset-search-input').on('keydown.intro', function() {
-                    // Prevent search from updating and changing the grid
-                    d3.event.stopPropagation();
-                    d3.event.preventDefault();
-                }, true).on('keyup.intro', null);
-            }
-        }
-
-        function selectedPreset() {
-            setTimeout(function() {
-                reveal('.entity-editor-pane', t('intro.points.describe'), {tooltipClass: 'intro-points-describe'});
-                context.history().on('change.intro', closeEditor);
-                context.on('exit.intro', selectPoint);
-            }, 400);
-        }
-
-        function closeEditor() {
-            d3.select('.preset-search-input').on('keydown.intro', null);
-            context.history().on('change.intro', null);
-            reveal('.entity-editor-pane', t('intro.points.close'));
-        }
-
-        function selectPoint() {
-            context.on('exit.intro', null);
-            context.history().on('change.intro', null);
-            context.on('enter.intro', enterReselect);
-
-            var pointBox = iD.ui.intro.pad(corner, 150, context);
-            reveal(pointBox, t('intro.points.reselect'));
-
-            context.map().on('move.intro', function() {
-                pointBox = iD.ui.intro.pad(corner, 150, context);
-                reveal(pointBox, t('intro.points.reselect'), {duration: 0});
-            });
-        }
-
-        function enterReselect(mode) {
-            if (mode.id !== 'select') return;
-            context.map().on('move.intro', null);
-            context.on('enter.intro', null);
-
-            setTimeout(function() {
-                reveal('.entity-editor-pane', t('intro.points.fixname'));
-                context.on('exit.intro', deletePoint);
-            }, 500);
-        }
-
-        function deletePoint() {
-            context.on('exit.intro', null);
-            context.on('enter.intro', enterDelete);
-
-            var pointBox = iD.ui.intro.pad(corner, 150, context);
-            reveal(pointBox, t('intro.points.reselect_delete'));
-
-            context.map().on('move.intro', function() {
-                pointBox = iD.ui.intro.pad(corner, 150, context);
-                reveal(pointBox, t('intro.points.reselect_delete'), {duration: 0});
-            });
-        }
-
-        function enterDelete(mode) {
-            if (mode.id !== 'select') return;
-            context.map().on('move.intro', null);
-            context.on('enter.intro', null);
-            context.on('exit.intro', deletePoint);
-            context.map().on('move.intro', deletePoint);
-            context.history().on('change.intro', deleted);
-
-            setTimeout(function() {
-                var node = d3.select('.radial-menu-item-delete').node();
-                var pointBox = iD.ui.intro.pad(node.getBoundingClientRect(), 50, context);
-                reveal(pointBox, t('intro.points.delete'));
-            }, 300);
-        }
-
-        function deleted(changed) {
-            if (changed.deleted().length) event.done();
-        }
-
-    };
-
-    step.exit = function() {
-        timeouts.forEach(window.clearTimeout);
-        context.on('exit.intro', null);
-        context.on('enter.intro', null);
-        context.map().on('move.intro', null);
-        context.history().on('change.intro', null);
-        d3.select('.preset-search-input').on('keyup.intro', null).on('keydown.intro', null);
-    };
-
-    return d3.rebind(step, event, 'on');
-};
-iD.ui.intro.startEditing = function(context, reveal) {
-
-    var event = d3.dispatch('done', 'startEditing'),
-        modal,
-        timeouts = [];
-
-    var step = {
-        title: 'intro.startediting.title'
-    };
-
-    function timeout(f, t) {
-        timeouts.push(window.setTimeout(f, t));
-    }
-
-    step.enter = function() {
-
-        reveal('.map-control.help-control', t('intro.startediting.help'));
-
-        timeout(function() {
-            reveal('#bar button.save', t('intro.startediting.save'));
-        }, 3500);
-
-        timeout(function() {
-            reveal('#surface');
-        }, 7000);
-
-        timeout(function() {
-            modal = iD.ui.modal(context.container());
-
-            modal.select('.modal')
-                .attr('class', 'modal-splash modal col6');
-
-            modal.selectAll('.close').remove();
-
-            var startbutton = modal.select('.content')
-                .attr('class', 'fillL')
-                    .append('button')
-                        .attr('class', 'modal-section huge-modal-button')
-                        .on('click', function() {
-                                modal.remove();
-                        });
-
-                startbutton.append('div')
-                    .attr('class','illustration');
-                startbutton.append('h2')
-                    .text(t('intro.startediting.start'));
-
-            event.startEditing();
-
-        }, 7500);
-    };
-
-    step.exit = function() {
-        if (modal) modal.remove();
-        timeouts.forEach(window.clearTimeout);
-    };
-
-    return d3.rebind(step, event, 'on');
-};
-iD.presets = function() {
-
-    // an iD.presets.Collection with methods for
-    // loading new data and returning defaults
-
-    var all = iD.presets.Collection([]),
-        defaults = { area: all, line: all, point: all, vertex: all, relation: all },
-        fields = {},
-        universal = [],
-        recent = iD.presets.Collection([]);
-
-    // Index of presets by (geometry, tag key).
-    var index = {
-        point: {},
-        vertex: {},
-        line: {},
-        area: {},
-        relation: {}
-    };
-
-    all.match = function(entity, resolver) {
-        var geometry = entity.geometry(resolver),
-            geometryMatches = index[geometry],
-            best = -1,
-            match;
-
-        for (var k in entity.tags) {
-            var keyMatches = geometryMatches[k];
-            if (!keyMatches) continue;
-
-            for (var i = 0; i < keyMatches.length; i++) {
-                var score = keyMatches[i].matchScore(entity);
-                if (score > best) {
-                    best = score;
-                    match = keyMatches[i];
-                }
-            }
-        }
-
-        return match || all.item(geometry);
-    };
-
-    all.load = function(d) {
-
-        if (d.fields) {
-            _.forEach(d.fields, function(d, id) {
-                fields[id] = iD.presets.Field(id, d);
-                if (d.universal) universal.push(fields[id]);
-            });
-        }
-
-        if (d.presets) {
-            _.forEach(d.presets, function(d, id) {
-                all.collection.push(iD.presets.Preset(id, d, fields));
-            });
-        }
-
-        if (d.categories) {
-            _.forEach(d.categories, function(d, id) {
-                all.collection.push(iD.presets.Category(id, d, all));
-            });
-        }
-
-        if (d.defaults) {
-            var getItem = _.bind(all.item, all);
-            defaults = {
-                area: iD.presets.Collection(d.defaults.area.map(getItem)),
-                line: iD.presets.Collection(d.defaults.line.map(getItem)),
-                point: iD.presets.Collection(d.defaults.point.map(getItem)),
-                vertex: iD.presets.Collection(d.defaults.vertex.map(getItem)),
-                relation: iD.presets.Collection(d.defaults.relation.map(getItem))
-            };
-        }
-
-        for (var i = 0; i < all.collection.length; i++) {
-            var preset = all.collection[i],
-                geometry = preset.geometry;
-
-            for (var j = 0; j < geometry.length; j++) {
-                var g = index[geometry[j]];
-                for (var k in preset.tags) {
-                    (g[k] = g[k] || []).push(preset);
-                }
-            }
-        }
-
-        return all;
-    };
-
-    all.field = function(id) {
-        return fields[id];
-    };
-
-    all.universal = function() {
-        return universal;
-    };
-
-    all.defaults = function(geometry, n) {
-        var rec = recent.matchGeometry(geometry).collection.slice(0, 4),
-            def = _.uniq(rec.concat(defaults[geometry].collection)).slice(0, n - 1);
-        return iD.presets.Collection(_.unique(rec.concat(def).concat(all.item(geometry))));
-    };
-
-    all.choose = function(preset) {
-        if (!preset.isFallback()) {
-            recent = iD.presets.Collection(_.unique([preset].concat(recent.collection)));
-        }
-        return all;
-    };
-
-    return all;
-};
-iD.presets.Category = function(id, category, all) {
-    category = _.clone(category);
-
-    category.id = id;
-
-    category.members = iD.presets.Collection(category.members.map(function(id) {
-        return all.item(id);
-    }));
-
-    category.matchGeometry = function(geometry) {
-        return category.geometry.indexOf(geometry) >= 0;
-    };
-
-    category.matchScore = function() { return -1; };
-
-    category.name = function() {
-        return t('presets.categories.' + id + '.name', {'default': id});
-    };
-
-    category.terms = function() {
-        return [];
-    };
-
-    return category;
-};
-iD.presets.Collection = function(collection) {
-
-    var maxSearchResults = 50,
-        maxSuggestionResults = 10;
-
-    var presets = {
-
-        collection: collection,
-
-        item: function(id) {
-            return _.find(collection, function(d) {
-                return d.id === id;
-            });
-        },
-
-        matchGeometry: function(geometry) {
-            return iD.presets.Collection(collection.filter(function(d) {
-                return d.matchGeometry(geometry);
-            }));
-        },
-
-        search: function(value, geometry) {
-            if (!value) return this;
-
-            value = value.toLowerCase();
-
-            var searchable = _.filter(collection, function(a) {
-                return a.searchable !== false && a.suggestion !== true;
-            }),
-            suggestions = _.filter(collection, function(a) {
-                return a.suggestion === true;
-            });
-
-            // matches value to preset.name
-            var leading_name = _.filter(searchable, function(a) {
-                    return leading(a.name().toLowerCase());
-                }).sort(function(a, b) {
-                    var i = a.name().toLowerCase().indexOf(value) - b.name().toLowerCase().indexOf(value);
-                    if (i === 0) return a.name().length - b.name().length;
-                    else return i;
-                });
-
-            // matches value to preset.terms values
-            var leading_terms = _.filter(searchable, function(a) {
-                return _.any(a.terms() || [], leading);
-            });
-
-            function leading(a) {
-                var index = a.indexOf(value);
-                return index === 0 || a[index - 1] === ' ';
-            }
-
-            // finds close matches to value in preset.name
-            var levenstein_name = searchable.map(function(a) {
-                    return {
-                        preset: a,
-                        dist: iD.util.editDistance(value, a.name().toLowerCase())
-                    };
-                }).filter(function(a) {
-                    return a.dist + Math.min(value.length - a.preset.name().length, 0) < 3;
-                }).sort(function(a, b) {
-                    return a.dist - b.dist;
-                }).map(function(a) {
-                    return a.preset;
-                });
-
-            // finds close matches to value in preset.terms
-            var leventstein_terms = _.filter(searchable, function(a) {
-                    return _.any(a.terms() || [], function(b) {
-                        return iD.util.editDistance(value, b) + Math.min(value.length - b.length, 0) < 3;
-                    });
-                });
-
-            function suggestionName(name) {
-                var nameArray = name.split(' - ');
-                if (nameArray.length > 1) {
-                    name = nameArray.slice(0, nameArray.length-1).join(' - ');
-                }
-                return name.toLowerCase();
-            }
-
-            var leading_suggestions = _.filter(suggestions, function(a) {
-                    return leading(suggestionName(a.name()));
-                }).sort(function(a, b) {
-                    a = suggestionName(a.name());
-                    b = suggestionName(b.name());
-                    var i = a.indexOf(value) - b.indexOf(value);
-                    if (i === 0) return a.length - b.length;
-                    else return i;
-                });
-
-            var leven_suggestions = suggestions.map(function(a) {
-                    return {
-                        preset: a,
-                        dist: iD.util.editDistance(value, suggestionName(a.name()))
-                    };
-                }).filter(function(a) {
-                    return a.dist + Math.min(value.length - suggestionName(a.preset.name()).length, 0) < 1;
-                }).sort(function(a, b) {
-                    return a.dist - b.dist;
-                }).map(function(a) {
-                    return a.preset;
-                });
-
-            var other = presets.item(geometry);
-
-            var results = leading_name.concat(
-                            leading_terms,
-                            leading_suggestions.slice(0, maxSuggestionResults+5),
-                            levenstein_name,
-                            leventstein_terms,
-                            leven_suggestions.slice(0, maxSuggestionResults)
-                        ).slice(0, maxSearchResults-1);
-
-            return iD.presets.Collection(_.unique(
-                    results.concat(other)
-                ));
-        }
-    };
-
-    return presets;
-};
-iD.presets.Field = function(id, field) {
-    field = _.clone(field);
-
-    field.id = id;
-
-    field.matchGeometry = function(geometry) {
-        return !field.geometry || field.geometry === geometry;
-    };
-
-    field.t = function(scope, options) {
-        return t('presets.fields.' + id + '.' + scope, options);
-    };
-
-    field.label = function() {
-        return field.t('label', {'default': id});
-    };
-
-    var placeholder = field.placeholder;
-    field.placeholder = function() {
-        return field.t('placeholder', {'default': placeholder});
-    };
-
-    return field;
-};
-iD.presets.Preset = function(id, preset, fields) {
-    preset = _.clone(preset);
-
-    preset.id = id;
-    preset.fields = (preset.fields || []).map(getFields);
-
-    function getFields(f) {
-        return fields[f];
-    }
-
-    preset.matchGeometry = function(geometry) {
-        return preset.geometry.indexOf(geometry) >= 0;
-    };
-
-    var matchScore = preset.matchScore || 1;
-    preset.matchScore = function(entity) {
-        var tags = preset.tags,
-            score = 0;
-
-        for (var t in tags) {
-            if (entity.tags[t] === tags[t]) {
-                score += matchScore;
-            } else if (tags[t] === '*' && t in entity.tags) {
-                score += matchScore / 2;
-            } else {
-                return -1;
-            }
-        }
-
-        return score;
-    };
-
-    preset.t = function(scope, options) {
-        return t('presets.presets.' + id + '.' + scope, options);
-    };
-
-    var name = preset.name;
-    preset.name = function() {
-        if (preset.suggestion) {
-            id = id.split('/');
-            id = id[0] + '/' + id[1];
-            return name + ' - ' + t('presets.presets.' + id + '.name');
-        }
-        return preset.t('name', {'default': name});
-    };
-
-    preset.terms = function() {
-        return preset.t('terms', {'default': ''}).split(',');
-    };
-
-    preset.isFallback = function() {
-        return Object.keys(preset.tags).length === 0;
-    };
-
-    preset.reference = function(geometry) {
-        var key = Object.keys(preset.tags)[0],
-            value = preset.tags[key];
-
-        if (geometry === 'relation' && key === 'type') {
-            return { rtype: value };
-        } else if (value === '*') {
-            return { key: key };
-        } else {
-            return { key: key, value: value };
-        }
-    };
-
-    var removeTags = preset.removeTags || preset.tags;
-    preset.removeTags = function(tags, geometry) {
-        tags = _.omit(tags, _.keys(removeTags));
-
-        for (var f in preset.fields) {
-            var field = preset.fields[f];
-            if (field.matchGeometry(geometry) && field['default'] === tags[field.key]) {
-                delete tags[field.key];
-            }
-        }
-
-        return tags;
-    };
-
-    var applyTags = preset.addTags || preset.tags;
-    preset.applyTags = function(tags, geometry) {
-        var k;
-
-        tags = _.clone(tags);
-
-        for (k in applyTags) {
-            if (applyTags[k] === '*') {
-                tags[k] = 'yes';
-            } else {
-                tags[k] = applyTags[k];
-            }
-        }
-
-        // Add area=yes if necessary
-        for (k in applyTags) {
-            if (geometry === 'area' && !(k in iD.areaKeys))
-                tags.area = 'yes';
-            break;
-        }
-
-        for (var f in preset.fields) {
-            var field = preset.fields[f];
-            if (field.matchGeometry(geometry) && field.key && !tags[field.key] && field['default']) {
-                tags[field.key] = field['default'];
-            }
-        }
-
-        return tags;
-    };
-
-    return preset;
-};
-iD.validate = function(changes, graph) {
-    var warnings = [];
-
-    // https://github.com/openstreetmap/josm/blob/mirror/src/org/
-    // openstreetmap/josm/data/validation/tests/UnclosedWays.java#L80
-    function tagSuggestsArea(change) {
-        if (_.isEmpty(change.tags)) return false;
-        var tags = change.tags;
-        var presence = ['landuse', 'amenities', 'tourism', 'shop'];
-        for (var i = 0; i < presence.length; i++) {
-            if (tags[presence[i]] !== undefined) {
-                return presence[i] + '=' + tags[presence[i]];
-            }
-        }
-        if (tags.building && tags.building === 'yes') return 'building=yes';
-    }
-
-    if (changes.deleted.length > 100) {
-        warnings.push({
-            message: t('validations.many_deletions', { n: changes.deleted.length })
-        });
-    }
-
-    for (var i = 0; i < changes.created.length; i++) {
-        var change = changes.created[i],
-            geometry = change.geometry(graph);
-
-        if ((geometry === 'point' || geometry === 'line' || geometry === 'area') && !change.isUsed(graph)) {
-            warnings.push({
-                message: t('validations.untagged_' + geometry),
-                tooltip: t('validations.untagged_' + geometry + '_tooltip'),
-                entity: change
-            });
-        }
-
-        var deprecatedTags = change.deprecatedTags();
-        if (!_.isEmpty(deprecatedTags)) {
-            warnings.push({
-                message: t('validations.deprecated_tags', {
-                    tags: iD.util.tagText({ tags: deprecatedTags })
-                }), entity: change });
-        }
-
-        if (geometry === 'line' && tagSuggestsArea(change)) {
-            warnings.push({
-                message: t('validations.tag_suggests_area', {tag: tagSuggestsArea(change)}),
-                entity: change
-            });
-        }
-    }
-
-    return warnings;
-};
-/* jshint ignore:start */
-})();
-window.locale = { _current: 'en' };
-
-locale.current = function(_) {
-    if (!arguments.length) return locale._current;
-    if (locale[_] !== undefined) locale._current = _;
-    else if (locale[_.split('-')[0]]) locale._current = _.split('-')[0];
-    return locale;
-};
-
-function t(s, o, loc) {
-    loc = loc || locale._current;
-
-    var path = s.split(".").reverse(),
-        rep = locale[loc];
-
-    while (rep !== undefined && path.length) rep = rep[path.pop()];
-
-    if (rep !== undefined) {
-        if (o) for (var k in o) rep = rep.replace('{' + k + '}', o[k]);
-        return rep;
-    }
-
-    if (loc !== 'en') {
-        return t(s, o, 'en');
-    }
-
-    if (o && 'default' in o) {
-        return o['default'];
-    }
-
-    var missing = 'Missing ' + loc + ' translation: ' + s;
-    if (typeof console !== "undefined") console.error(missing);
-
-    return missing;
-}
-iD.introGraph = '{"n185954700":{"id":"n185954700","loc":[-85.642244,41.939081],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T04:56:33Z","tags":{}},"n185964961":{"id":"n185964961","loc":[-85.6406588,41.942601],"version":"3","changeset":"9619138","user":"bbmiller","uid":"451048","visible":"true","timestamp":"2011-10-21T20:04:13Z","tags":{}},"n185964962":{"id":"n185964962","loc":[-85.6394548,41.94261],"version":"3","changeset":"9619138","user":"bbmiller","uid":"451048","visible":"true","timestamp":"2011-10-21T20:04:13Z","tags":{}},"n185970607":{"id":"n185970607","loc":[-85.641094,41.94006],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:04:43Z","tags":{}},"n185970614":{"id":"n185970614","loc":[-85.641825,41.941316],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:04:43Z","tags":{}},"n185970616":{"id":"n185970616","loc":[-85.641838,41.941556],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:04:43Z","tags":{}},"n185973650":{"id":"n185973650","loc":[-85.639918,41.940064],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:05:59Z","tags":{}},"n185973660":{"id":"n185973660","loc":[-85.640645,41.941339],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:05:59Z","tags":{}},"n185973659":{"id":"n185973659","loc":[-85.6406115,41.9400658],"version":"3","changeset":"12170230","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:56:56Z","tags":{}},"n185974479":{"id":"n185974479","loc":[-85.639402,41.941344],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:06:18Z","tags":{}},"n185974481":{"id":"n185974481","loc":[-85.643071,41.941288],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:06:18Z","tags":{}},"n185976259":{"id":"n185976259","loc":[-85.642213,41.940043],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:07:24Z","tags":{}},"n185976261":{"id":"n185976261","loc":[-85.643056,41.94001],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:07:24Z","tags":{}},"n185964959":{"id":"n185964959","loc":[-85.6431031,41.9425754],"version":"3","changeset":"9619138","user":"bbmiller","uid":"451048","visible":"true","timestamp":"2011-10-21T20:04:12Z","tags":{}},"n185964960":{"id":"n185964960","loc":[-85.6418749,41.9425864],"version":"3","changeset":"9619138","user":"bbmiller","uid":"451048","visible":"true","timestamp":"2011-10-21T20:04:12Z","tags":{}},"n185981481":{"id":"n185981481","loc":[-85.6386827,41.9400828],"version":"3","changeset":"12170230","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:56:56Z","tags":{}},"n185981482":{"id":"n185981482","loc":[-85.6393664,41.9400854],"version":"3","changeset":"12170230","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:56:56Z","tags":{}},"n2138493844":{"id":"n2138493844","loc":[-85.6427969,41.940522],"version":"1","changeset":"14879185","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-02T05:55:31Z","tags":{}},"n2138493845":{"id":"n2138493845","loc":[-85.6425891,41.9405228],"version":"1","changeset":"14879185","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-02T05:55:31Z","tags":{}},"n2138493846":{"id":"n2138493846","loc":[-85.6425868,41.9402875],"version":"1","changeset":"14879185","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-02T05:55:31Z","tags":{}},"n2138493847":{"id":"n2138493847","loc":[-85.6427969,41.9402858],"version":"1","changeset":"14879185","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-02T05:55:31Z","tags":{}},"n2138493848":{"id":"n2138493848","loc":[-85.6425708,41.9405234],"version":"1","changeset":"14879185","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-02T05:55:31Z","tags":{}},"n2138493849":{"id":"n2138493849","loc":[-85.642568,41.9402855],"version":"1","changeset":"14879185","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-02T05:55:31Z","tags":{}},"n2138493850":{"id":"n2138493850","loc":[-85.6423157,41.9402886],"version":"1","changeset":"14879185","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-02T05:55:32Z","tags":{}},"n2138493851":{"id":"n2138493851","loc":[-85.6423212,41.9404362],"version":"1","changeset":"14879185","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-02T05:55:32Z","tags":{}},"n2138493852":{"id":"n2138493852","loc":[-85.6422923,41.9404578],"version":"1","changeset":"14879185","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-02T05:55:32Z","tags":{}},"n2138493853":{"id":"n2138493853","loc":[-85.6422868,41.9404834],"version":"1","changeset":"14879185","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-02T05:55:32Z","tags":{}},"n2138493854":{"id":"n2138493854","loc":[-85.6423226,41.9405091],"version":"1","changeset":"14879185","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-02T05:55:32Z","tags":{}},"n2138493855":{"id":"n2138493855","loc":[-85.6423847,41.9405111],"version":"1","changeset":"14879185","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-02T05:55:32Z","tags":{}},"n2138493856":{"id":"n2138493856","loc":[-85.6424081,41.9405265],"version":"1","changeset":"14879185","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-02T05:55:32Z","tags":{}},"n2140155811":{"id":"n2140155811","loc":[-85.6419547,41.9410956],"version":"1","changeset":"14897169","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T14:35:18Z","tags":{}},"n2140155814":{"id":"n2140155814","loc":[-85.6427577,41.9410884],"version":"1","changeset":"14897169","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T14:35:18Z","tags":{}},"n2140155816":{"id":"n2140155816","loc":[-85.6427545,41.9410052],"version":"1","changeset":"14897169","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T14:35:18Z","tags":{}},"n2140155818":{"id":"n2140155818","loc":[-85.6428057,41.9410028],"version":"1","changeset":"14897169","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T14:35:18Z","tags":{}},"n2140155821":{"id":"n2140155821","loc":[-85.6427993,41.9407339],"version":"1","changeset":"14897169","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T14:35:18Z","tags":{}},"n2140155823":{"id":"n2140155823","loc":[-85.6427385,41.9407339],"version":"1","changeset":"14897169","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T14:35:18Z","tags":{}},"n2140155825":{"id":"n2140155825","loc":[-85.6427417,41.9406435],"version":"1","changeset":"14897169","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T14:35:18Z","tags":{}},"n2140155827":{"id":"n2140155827","loc":[-85.6419515,41.9406482],"version":"1","changeset":"14897169","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T14:35:18Z","tags":{}},"n2140155828":{"id":"n2140155828","loc":[-85.6429368,41.9412407],"version":"1","changeset":"14897169","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T14:35:18Z","tags":{}},"n2140155829":{"id":"n2140155829","loc":[-85.6417756,41.9412526],"version":"1","changeset":"14897169","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T14:35:18Z","tags":{}},"n2140155830":{"id":"n2140155830","loc":[-85.641766,41.9405983],"version":"1","changeset":"14897169","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T14:35:18Z","tags":{}},"n2140155831":{"id":"n2140155831","loc":[-85.6419803,41.9405983],"version":"1","changeset":"14897169","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T14:35:18Z","tags":{}},"n2140155832":{"id":"n2140155832","loc":[-85.6419611,41.9401366],"version":"1","changeset":"14897169","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T14:35:18Z","tags":{}},"n2140155833":{"id":"n2140155833","loc":[-85.6429336,41.94012],"version":"1","changeset":"14897169","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T14:35:18Z","tags":{}},"n2140155834":{"id":"n2140155834","loc":[-85.6430697,41.9411732],"version":"1","changeset":"14897169","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T14:35:18Z","tags":{}},"n2140155835":{"id":"n2140155835","loc":[-85.6428411,41.9409974],"version":"1","changeset":"14897169","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T14:35:18Z","tags":{}},"n2140155837":{"id":"n2140155837","loc":[-85.6428388,41.9407211],"version":"1","changeset":"14897169","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T14:35:18Z","tags":{}},"n2140155839":{"id":"n2140155839","loc":[-85.6430624,41.9405521],"version":"1","changeset":"14897169","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T14:35:18Z","tags":{}},"n2140155840":{"id":"n2140155840","loc":[-85.6427323,41.9412396],"version":"1","changeset":"14897169","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T14:35:18Z","tags":{}},"n2140155842":{"id":"n2140155842","loc":[-85.6418147,41.9412457],"version":"1","changeset":"14897169","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T14:35:18Z","tags":{}},"n2140155844":{"id":"n2140155844","loc":[-85.641813,41.9411319],"version":"1","changeset":"14897169","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T14:35:18Z","tags":{}},"n2140155845":{"id":"n2140155845","loc":[-85.6418394,41.9411111],"version":"1","changeset":"14897169","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T14:35:18Z","tags":{}},"n2140155847":{"id":"n2140155847","loc":[-85.6418838,41.9410977],"version":"1","changeset":"14897169","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T14:35:18Z","tags":{}},"n2140155849":{"id":"n2140155849","loc":[-85.6427324,41.9410921],"version":"1","changeset":"14897169","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T14:35:18Z","tags":{}},"n2140155851":{"id":"n2140155851","loc":[-85.6427798,41.9412945],"version":"1","changeset":"14897169","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T14:35:18Z","tags":{}},"n2140155852":{"id":"n2140155852","loc":[-85.6427701,41.9411777],"version":"1","changeset":"14897169","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T14:35:18Z","tags":{}},"n2140155854":{"id":"n2140155854","loc":[-85.6427323,41.9411572],"version":"1","changeset":"14897169","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T14:35:18Z","tags":{}},"n2140155856":{"id":"n2140155856","loc":[-85.6418478,41.9411666],"version":"1","changeset":"14897169","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T14:35:18Z","tags":{}},"n2165942818":{"id":"n2165942818","loc":[-85.6437533,41.9415029],"version":"1","changeset":"15116533","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-21T20:33:02Z","tags":{}},"n2165942819":{"id":"n2165942819","loc":[-85.6437623,41.9421195],"version":"1","changeset":"15116533","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-21T20:33:02Z","tags":{}},"n2168510551":{"id":"n2168510551","loc":[-85.6423795,41.9422615],"version":"1","changeset":"15132039","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-23T08:10:23Z","tags":{}},"n2168510552":{"id":"n2168510552","loc":[-85.6423744,41.9419439],"version":"1","changeset":"15132039","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-23T08:10:23Z","tags":{}},"n2168510553":{"id":"n2168510553","loc":[-85.642518,41.9419427],"version":"1","changeset":"15132039","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-23T08:10:23Z","tags":{}},"n2168510554":{"id":"n2168510554","loc":[-85.6425186,41.9419801],"version":"1","changeset":"15132039","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-23T08:10:23Z","tags":{}},"n2168510555":{"id":"n2168510555","loc":[-85.6428314,41.9419773],"version":"1","changeset":"15132039","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-23T08:10:23Z","tags":{}},"n2168510556":{"id":"n2168510556","loc":[-85.6428368,41.9423116],"version":"1","changeset":"15132039","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-23T08:10:23Z","tags":{}},"n2168510557":{"id":"n2168510557","loc":[-85.6424947,41.9423146],"version":"1","changeset":"15132039","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-23T08:10:23Z","tags":{}},"n2168510558":{"id":"n2168510558","loc":[-85.6424938,41.9422605],"version":"1","changeset":"15132039","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-23T08:10:23Z","tags":{}},"n2189046007":{"id":"n2189046007","loc":[-85.6410866,41.9424327],"version":"1","changeset":"15276417","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T22:05:43Z","tags":{}},"n2189046009":{"id":"n2189046009","loc":[-85.6410805,41.9420061],"version":"1","changeset":"15276417","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T22:05:43Z","tags":{}},"n2189046011":{"id":"n2189046011","loc":[-85.6412443,41.9420048],"version":"1","changeset":"15276417","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T22:05:43Z","tags":{}},"n2189046012":{"id":"n2189046012","loc":[-85.6412505,41.9424314],"version":"1","changeset":"15276417","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T22:05:43Z","tags":{}},"n2189046014":{"id":"n2189046014","loc":[-85.6413311,41.942968],"version":"1","changeset":"15276417","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T22:05:43Z","tags":{}},"n2189046016":{"id":"n2189046016","loc":[-85.6413281,41.942713],"version":"1","changeset":"15276417","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T22:05:43Z","tags":{}},"n2189046018":{"id":"n2189046018","loc":[-85.641521,41.9427117],"version":"1","changeset":"15276417","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T22:05:43Z","tags":{}},"n2189046021":{"id":"n2189046021","loc":[-85.6415234,41.9429236],"version":"1","changeset":"15276417","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T22:05:43Z","tags":{}},"n2189046022":{"id":"n2189046022","loc":[-85.6415045,41.9429238],"version":"1","changeset":"15276417","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T22:05:43Z","tags":{}},"n2189046025":{"id":"n2189046025","loc":[-85.641505,41.9429668],"version":"1","changeset":"15276417","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T22:05:43Z","tags":{}},"n2189046053":{"id":"n2189046053","loc":[-85.6385988,41.942412],"version":"1","changeset":"15276417","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T22:05:43Z","tags":{}},"n2189046054":{"id":"n2189046054","loc":[-85.6385985,41.9423311],"version":"1","changeset":"15276417","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T22:05:43Z","tags":{}},"n2189046055":{"id":"n2189046055","loc":[-85.6387617,41.9423308],"version":"1","changeset":"15276417","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T22:05:43Z","tags":{}},"n2189046056":{"id":"n2189046056","loc":[-85.6387616,41.9423026],"version":"1","changeset":"15276417","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T22:05:43Z","tags":{}},"n2189046058":{"id":"n2189046058","loc":[-85.6388215,41.9423025],"version":"1","changeset":"15276417","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T22:05:43Z","tags":{}},"n2189046059":{"id":"n2189046059","loc":[-85.6388219,41.9424115],"version":"1","changeset":"15276417","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T22:05:43Z","tags":{}},"n2189046060":{"id":"n2189046060","loc":[-85.6391096,41.9424486],"version":"1","changeset":"15276417","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T22:05:43Z","tags":{}},"n2189046061":{"id":"n2189046061","loc":[-85.6391105,41.9423673],"version":"1","changeset":"15276417","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T22:05:43Z","tags":{}},"n2189046063":{"id":"n2189046063","loc":[-85.6392911,41.9423684],"version":"1","changeset":"15276417","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T22:05:43Z","tags":{}},"n2189046065":{"id":"n2189046065","loc":[-85.6392903,41.9424497],"version":"1","changeset":"15276417","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T22:05:43Z","tags":{}},"n2189046067":{"id":"n2189046067","loc":[-85.6397927,41.9423876],"version":"1","changeset":"15276417","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T22:05:43Z","tags":{}},"n2189046069":{"id":"n2189046069","loc":[-85.6397897,41.9422981],"version":"1","changeset":"15276417","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T22:05:43Z","tags":{}},"n2189046070":{"id":"n2189046070","loc":[-85.6399702,41.9422947],"version":"1","changeset":"15276417","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T22:05:43Z","tags":{}},"n2189046072":{"id":"n2189046072","loc":[-85.6399732,41.9423843],"version":"1","changeset":"15276417","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T22:05:43Z","tags":{}},"n2189046074":{"id":"n2189046074","loc":[-85.6396331,41.9430227],"version":"1","changeset":"15276417","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T22:05:43Z","tags":{}},"n2189046075":{"id":"n2189046075","loc":[-85.6398673,41.9430189],"version":"1","changeset":"15276417","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T22:05:43Z","tags":{}},"n2189046077":{"id":"n2189046077","loc":[-85.6398656,41.9429637],"version":"1","changeset":"15276417","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T22:05:43Z","tags":{}},"n2189046079":{"id":"n2189046079","loc":[-85.6398885,41.9429633],"version":"1","changeset":"15276417","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T22:05:43Z","tags":{}},"n2189046082":{"id":"n2189046082","loc":[-85.6398832,41.942779],"version":"1","changeset":"15276417","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T22:05:43Z","tags":{}},"n2189046083":{"id":"n2189046083","loc":[-85.6398513,41.9427796],"version":"1","changeset":"15276417","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T22:05:43Z","tags":{}},"n2189046085":{"id":"n2189046085","loc":[-85.6398502,41.9427401],"version":"1","changeset":"15276417","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T22:05:43Z","tags":{}},"n2189046087":{"id":"n2189046087","loc":[-85.6397889,41.9427411],"version":"1","changeset":"15276417","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T22:05:43Z","tags":{}},"n2189046089":{"id":"n2189046089","loc":[-85.6397892,41.942753],"version":"1","changeset":"15276417","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T22:05:43Z","tags":{}},"n2189046090":{"id":"n2189046090","loc":[-85.6396983,41.9427544],"version":"1","changeset":"15276417","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T22:05:43Z","tags":{}},"n2189046092":{"id":"n2189046092","loc":[-85.6396993,41.9427882],"version":"1","changeset":"15276417","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T22:05:43Z","tags":{}},"n2189046094":{"id":"n2189046094","loc":[-85.6396746,41.9427886],"version":"1","changeset":"15276417","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T22:05:43Z","tags":{}},"n2189046096":{"id":"n2189046096","loc":[-85.6396758,41.9428296],"version":"1","changeset":"15276417","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T22:05:43Z","tags":{}},"n2189046097":{"id":"n2189046097","loc":[-85.6397007,41.9428292],"version":"1","changeset":"15276417","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T22:05:43Z","tags":{}},"n2189046099":{"id":"n2189046099","loc":[-85.6397018,41.9428686],"version":"1","changeset":"15276417","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T22:05:43Z","tags":{}},"n2189046103":{"id":"n2189046103","loc":[-85.6396289,41.9428697],"version":"1","changeset":"15276417","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T22:05:44Z","tags":{}},"n2189046112":{"id":"n2189046112","loc":[-85.6435683,41.9429457],"version":"1","changeset":"15276417","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T22:05:44Z","tags":{}},"n2189046113":{"id":"n2189046113","loc":[-85.643568,41.9427766],"version":"1","changeset":"15276417","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T22:05:44Z","tags":{}},"n2189046115":{"id":"n2189046115","loc":[-85.6434011,41.9427767],"version":"1","changeset":"15276417","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T22:05:44Z","tags":{}},"n2189046116":{"id":"n2189046116","loc":[-85.6434012,41.9428631],"version":"1","changeset":"15276417","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T22:05:44Z","tags":{}},"n2189046117":{"id":"n2189046117","loc":[-85.643448,41.9428631],"version":"1","changeset":"15276417","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T22:05:44Z","tags":{}},"n2189046118":{"id":"n2189046118","loc":[-85.6434481,41.9429457],"version":"1","changeset":"15276417","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T22:05:44Z","tags":{}},"n2189046119":{"id":"n2189046119","loc":[-85.6428363,41.9429809],"version":"1","changeset":"15276417","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T22:05:44Z","tags":{}},"n2189046120":{"id":"n2189046120","loc":[-85.6429171,41.9429791],"version":"1","changeset":"15276417","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T22:05:44Z","tags":{}},"n2189046121":{"id":"n2189046121","loc":[-85.642914,41.9429041],"version":"1","changeset":"15276417","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T22:05:44Z","tags":{}},"n2189046122":{"id":"n2189046122","loc":[-85.6429385,41.9429035],"version":"1","changeset":"15276417","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T22:05:44Z","tags":{}},"n2189046123":{"id":"n2189046123","loc":[-85.6429348,41.9428126],"version":"1","changeset":"15276417","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T22:05:44Z","tags":{}},"n2189046124":{"id":"n2189046124","loc":[-85.6427746,41.9428163],"version":"1","changeset":"15276417","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T22:05:44Z","tags":{}},"n2189046125":{"id":"n2189046125","loc":[-85.6427783,41.942906],"version":"1","changeset":"15276417","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T22:05:44Z","tags":{}},"n2189046126":{"id":"n2189046126","loc":[-85.6428332,41.9429047],"version":"1","changeset":"15276417","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T22:05:44Z","tags":{}},"n2189046127":{"id":"n2189046127","loc":[-85.6423018,41.9428859],"version":"1","changeset":"15276417","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T22:05:44Z","tags":{}},"n2189046128":{"id":"n2189046128","loc":[-85.6422987,41.9427208],"version":"1","changeset":"15276417","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T22:05:44Z","tags":{}},"n2189046130":{"id":"n2189046130","loc":[-85.6424218,41.9427195],"version":"1","changeset":"15276417","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T22:05:44Z","tags":{}},"n2189046131":{"id":"n2189046131","loc":[-85.6424246,41.9428684],"version":"1","changeset":"15276417","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T22:05:44Z","tags":{}},"n2189046132":{"id":"n2189046132","loc":[-85.6423845,41.9428689],"version":"1","changeset":"15276417","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T22:05:44Z","tags":{}},"n2189046133":{"id":"n2189046133","loc":[-85.6423848,41.942885],"version":"1","changeset":"15276417","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T22:05:44Z","tags":{}},"n2189046134":{"id":"n2189046134","loc":[-85.641533,41.9429392],"version":"1","changeset":"15276417","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T22:05:44Z","tags":{}},"n2189046135":{"id":"n2189046135","loc":[-85.6416096,41.9428768],"version":"1","changeset":"15276417","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T22:05:44Z","tags":{}},"n2189046137":{"id":"n2189046137","loc":[-85.6416763,41.9429221],"version":"1","changeset":"15276417","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T22:05:44Z","tags":{}},"n2189046138":{"id":"n2189046138","loc":[-85.6415997,41.9429845],"version":"1","changeset":"15276417","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T22:05:44Z","tags":{}},"n2189046139":{"id":"n2189046139","loc":[-85.6420598,41.9428016],"version":"1","changeset":"15276417","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T22:05:44Z","tags":{}},"n2189046140":{"id":"n2189046140","loc":[-85.6420593,41.9427415],"version":"1","changeset":"15276417","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T22:05:44Z","tags":{}},"n2189046141":{"id":"n2189046141","loc":[-85.6421957,41.9427409],"version":"1","changeset":"15276417","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T22:05:44Z","tags":{}},"n2189046142":{"id":"n2189046142","loc":[-85.6421963,41.9428182],"version":"1","changeset":"15276417","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T22:05:44Z","tags":{}},"n2189046143":{"id":"n2189046143","loc":[-85.6421281,41.9428185],"version":"1","changeset":"15276417","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T22:05:44Z","tags":{}},"n2189046144":{"id":"n2189046144","loc":[-85.6421279,41.9428013],"version":"1","changeset":"15276417","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T22:05:44Z","tags":{}},"n2189046145":{"id":"n2189046145","loc":[-85.6409429,41.9429345],"version":"1","changeset":"15276417","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T22:05:44Z","tags":{}},"n2189046146":{"id":"n2189046146","loc":[-85.6410354,41.9429334],"version":"1","changeset":"15276417","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T22:05:44Z","tags":{}},"n2189046147":{"id":"n2189046147","loc":[-85.6410325,41.9427972],"version":"1","changeset":"15276417","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T22:05:44Z","tags":{}},"n2189046148":{"id":"n2189046148","loc":[-85.640997,41.9427976],"version":"1","changeset":"15276417","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T22:05:44Z","tags":{}},"n2189046149":{"id":"n2189046149","loc":[-85.6409963,41.9427643],"version":"1","changeset":"15276417","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T22:05:44Z","tags":{}},"n2189046150":{"id":"n2189046150","loc":[-85.6408605,41.9427659],"version":"1","changeset":"15276417","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T22:05:44Z","tags":{}},"n2189046152":{"id":"n2189046152","loc":[-85.6408623,41.9428482],"version":"1","changeset":"15276417","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T22:05:44Z","tags":{}},"n2189046153":{"id":"n2189046153","loc":[-85.640941,41.9428473],"version":"1","changeset":"15276417","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T22:05:44Z","tags":{}},"n2189152992":{"id":"n2189152992","loc":[-85.6437661,41.9422257],"version":"1","changeset":"15277317","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-07T00:30:06Z","tags":{}},"n2189152993":{"id":"n2189152993","loc":[-85.643768,41.9424067],"version":"1","changeset":"15277317","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-07T00:30:06Z","tags":{}},"n2189152994":{"id":"n2189152994","loc":[-85.6432176,41.9417705],"version":"1","changeset":"15277317","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-07T00:30:06Z","tags":{}},"n2189152995":{"id":"n2189152995","loc":[-85.6432097,41.941327],"version":"1","changeset":"15277317","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-07T00:30:06Z","tags":{}},"n2189152996":{"id":"n2189152996","loc":[-85.6436493,41.9413226],"version":"1","changeset":"15277317","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-07T00:30:06Z","tags":{}},"n2189152997":{"id":"n2189152997","loc":[-85.6436563,41.9417164],"version":"1","changeset":"15277317","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-07T00:30:06Z","tags":{}},"n2189152998":{"id":"n2189152998","loc":[-85.6435796,41.9417171],"version":"1","changeset":"15277317","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-07T00:30:06Z","tags":{}},"n2189152999":{"id":"n2189152999","loc":[-85.6435805,41.9417669],"version":"1","changeset":"15277317","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-07T00:30:06Z","tags":{}},"n2189153000":{"id":"n2189153000","loc":[-85.6438202,41.9414953],"version":"1","changeset":"15277317","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-07T00:30:06Z","tags":{}},"n2189153001":{"id":"n2189153001","loc":[-85.6438173,41.9413175],"version":"1","changeset":"15277317","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-07T00:30:06Z","tags":{}},"n2189153004":{"id":"n2189153004","loc":[-85.6432535,41.9418466],"version":"1","changeset":"15277317","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-07T00:30:06Z","tags":{}},"n2189153005":{"id":"n2189153005","loc":[-85.6433935,41.9418599],"version":"1","changeset":"15277317","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-07T00:30:06Z","tags":{}},"n2189153006":{"id":"n2189153006","loc":[-85.6434831,41.9418986],"version":"1","changeset":"15277317","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-07T00:30:06Z","tags":{}},"n2189153007":{"id":"n2189153007","loc":[-85.6435678,41.9419774],"version":"1","changeset":"15277317","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-07T00:30:06Z","tags":{}},"n2189153008":{"id":"n2189153008","loc":[-85.6435987,41.9420282],"version":"1","changeset":"15277317","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-07T00:30:06Z","tags":{}},"n2189153009":{"id":"n2189153009","loc":[-85.643438,41.9419573],"version":"1","changeset":"15277317","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-07T00:30:06Z","tags":{}},"n2189153010":{"id":"n2189153010","loc":[-85.6435284,41.9424676],"version":"1","changeset":"15277317","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-07T00:30:06Z","tags":{}},"n2189153011":{"id":"n2189153011","loc":[-85.6436207,41.9423631],"version":"1","changeset":"15277317","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-07T00:30:06Z","tags":{}},"n2189153012":{"id":"n2189153012","loc":[-85.6434957,41.9422973],"version":"1","changeset":"15277317","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-07T00:30:06Z","tags":{}},"n2189153013":{"id":"n2189153013","loc":[-85.6434457,41.9422458],"version":"1","changeset":"15277317","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-07T00:30:06Z","tags":{}},"n2189153014":{"id":"n2189153014","loc":[-85.6433976,41.9421772],"version":"1","changeset":"15277317","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-07T00:30:06Z","tags":{}},"n2189153015":{"id":"n2189153015","loc":[-85.6433861,41.9420785],"version":"1","changeset":"15277317","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-07T00:30:06Z","tags":{}},"n2189153016":{"id":"n2189153016","loc":[-85.6433765,41.9420313],"version":"1","changeset":"15277317","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-07T00:30:06Z","tags":{}},"n2189153017":{"id":"n2189153017","loc":[-85.6432207,41.9420284],"version":"1","changeset":"15277317","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-07T00:30:06Z","tags":{}},"n2189153018":{"id":"n2189153018","loc":[-85.6432245,41.9422759],"version":"1","changeset":"15277317","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-07T00:30:06Z","tags":{}},"n2189153019":{"id":"n2189153019","loc":[-85.6432649,41.9423474],"version":"1","changeset":"15277317","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-07T00:30:06Z","tags":{}},"n2189153020":{"id":"n2189153020","loc":[-85.6433226,41.9424132],"version":"1","changeset":"15277317","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-07T00:30:06Z","tags":{}},"n2189153021":{"id":"n2189153021","loc":[-85.6434111,41.9424704],"version":"1","changeset":"15277317","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-07T00:30:06Z","tags":{}},"n2189153022":{"id":"n2189153022","loc":[-85.6434591,41.9424347],"version":"1","changeset":"15277317","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-07T00:30:06Z","tags":{}},"n2189153025":{"id":"n2189153025","loc":[-85.6437669,41.9423073],"version":"1","changeset":"15277317","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-07T00:30:06Z","tags":{}},"n2189153026":{"id":"n2189153026","loc":[-85.6436611,41.942293],"version":"1","changeset":"15277317","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-07T00:30:06Z","tags":{}},"n2189153027":{"id":"n2189153027","loc":[-85.6435784,41.9422473],"version":"1","changeset":"15277317","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-07T00:30:06Z","tags":{}},"n2189153028":{"id":"n2189153028","loc":[-85.6435245,41.9421443],"version":"1","changeset":"15277317","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-07T00:30:06Z","tags":{}},"n2189153029":{"id":"n2189153029","loc":[-85.6435149,41.9420613],"version":"1","changeset":"15277317","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-07T00:30:06Z","tags":{}},"n2189153030":{"id":"n2189153030","loc":[-85.6433528,41.9419269],"version":"1","changeset":"15277317","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-07T00:30:06Z","tags":{}},"n2189153031":{"id":"n2189153031","loc":[-85.6432535,41.9419191],"version":"1","changeset":"15277317","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-07T00:30:06Z","tags":{}},"n2189153032":{"id":"n2189153032","loc":[-85.6430868,41.9419198],"version":"1","changeset":"15277317","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-07T00:30:06Z","tags":{}},"n2189153033":{"id":"n2189153033","loc":[-85.6434894,41.9420033],"version":"1","changeset":"15277317","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-07T00:30:06Z","tags":{}},"n2189153034":{"id":"n2189153034","loc":[-85.6432974,41.9419225],"version":"1","changeset":"15277317","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-07T00:30:06Z","tags":{}},"n2189153035":{"id":"n2189153035","loc":[-85.6433055,41.9421632],"version":"1","changeset":"15277317","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-07T00:30:07Z","tags":{}},"n2189153036":{"id":"n2189153036","loc":[-85.6433538,41.9422849],"version":"1","changeset":"15277317","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-07T00:30:07Z","tags":{}},"n2189153037":{"id":"n2189153037","loc":[-85.6434718,41.9423887],"version":"1","changeset":"15277317","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-07T00:30:07Z","tags":{}},"n2189153038":{"id":"n2189153038","loc":[-85.6436134,41.9422667],"version":"1","changeset":"15277317","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-07T00:30:07Z","tags":{}},"n2189153040":{"id":"n2189153040","loc":[-85.6438759,41.9414017],"version":"1","changeset":"15277317","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-07T00:30:07Z","tags":{}},"n2189153041":{"id":"n2189153041","loc":[-85.6438181,41.9413687],"version":"1","changeset":"15277317","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-07T00:30:07Z","tags":{}},"n2189153042":{"id":"n2189153042","loc":[-85.6436821,41.9413044],"version":"1","changeset":"15277317","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-07T00:30:07Z","tags":{}},"n2189153043":{"id":"n2189153043","loc":[-85.6435899,41.9412862],"version":"1","changeset":"15277317","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-07T00:30:07Z","tags":{}},"n2189153044":{"id":"n2189153044","loc":[-85.6433169,41.9417268],"version":"1","changeset":"15277317","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-07T00:30:07Z","tags":{}},"n2189153045":{"id":"n2189153045","loc":[-85.643301,41.9412859],"version":"1","changeset":"15277317","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-07T00:30:07Z","tags":{}},"n2189153046":{"id":"n2189153046","loc":[-85.6435531,41.9416981],"version":"1","changeset":"15277317","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-07T00:30:07Z","tags":{}},"n2189153047":{"id":"n2189153047","loc":[-85.6435427,41.9412863],"version":"1","changeset":"15277317","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-07T00:30:07Z","tags":{}},"n185948706":{"id":"n185948706","loc":[-85.6369439,41.940122],"version":"3","changeset":"9619138","user":"bbmiller","uid":"451048","visible":"true","timestamp":"2011-10-21T20:04:13Z","tags":{}},"n185949348":{"id":"n185949348","loc":[-85.640039,41.931135],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T04:54:09Z","tags":{}},"n185949870":{"id":"n185949870","loc":[-85.643195,41.949261],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T04:54:20Z","tags":{}},"n185954680":{"id":"n185954680","loc":[-85.6337802,41.9401143],"version":"3","changeset":"12170230","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:56:56Z","tags":{}},"n185954784":{"id":"n185954784","loc":[-85.6487485,41.942527],"version":"3","changeset":"9619138","user":"bbmiller","uid":"451048","visible":"true","timestamp":"2011-10-21T20:04:13Z","tags":{}},"n185958670":{"id":"n185958670","loc":[-85.637255,41.940104],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T04:58:30Z","tags":{}},"n185958672":{"id":"n185958672","loc":[-85.636996,41.941355],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T04:58:31Z","tags":{}},"n185960207":{"id":"n185960207","loc":[-85.634992,41.940118],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T04:59:09Z","tags":{}},"n185963163":{"id":"n185963163","loc":[-85.638831,41.93398],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:00:45Z","tags":{}},"n185963165":{"id":"n185963165","loc":[-85.640073,41.933968],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:00:45Z","tags":{}},"n185963167":{"id":"n185963167","loc":[-85.641225,41.933972],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:00:45Z","tags":{}},"n185963168":{"id":"n185963168","loc":[-85.642386,41.933952],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:00:45Z","tags":{}},"n185964695":{"id":"n185964695","loc":[-85.6443608,41.9425645],"version":"3","changeset":"9619138","user":"bbmiller","uid":"451048","visible":"true","timestamp":"2011-10-21T20:04:12Z","tags":{}},"n185964697":{"id":"n185964697","loc":[-85.644384,41.939941],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:01:31Z","tags":{}},"n185964963":{"id":"n185964963","loc":[-85.6382347,41.9426146],"version":"3","changeset":"9619138","user":"bbmiller","uid":"451048","visible":"true","timestamp":"2011-10-21T20:04:13Z","tags":{}},"n185964965":{"id":"n185964965","loc":[-85.637022,41.942622],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:01:40Z","tags":{}},"n185964967":{"id":"n185964967","loc":[-85.6363706,41.9426606],"version":"3","changeset":"9619138","user":"bbmiller","uid":"451048","visible":"true","timestamp":"2011-10-21T20:04:13Z","tags":{}},"n185964968":{"id":"n185964968","loc":[-85.6357988,41.9427748],"version":"3","changeset":"9619138","user":"bbmiller","uid":"451048","visible":"true","timestamp":"2011-10-21T20:04:13Z","tags":{}},"n185964969":{"id":"n185964969","loc":[-85.6355409,41.9428465],"version":"3","changeset":"9619138","user":"bbmiller","uid":"451048","visible":"true","timestamp":"2011-10-21T20:04:13Z","tags":{}},"n185964970":{"id":"n185964970","loc":[-85.6348729,41.9430443],"version":"3","changeset":"9619138","user":"bbmiller","uid":"451048","visible":"true","timestamp":"2011-10-21T19:46:00Z","tags":{}},"n185966958":{"id":"n185966958","loc":[-85.641946,41.946413],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:02:51Z","tags":{}},"n185966960":{"id":"n185966960","loc":[-85.643148,41.946389],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:02:51Z","tags":{}},"n185967774":{"id":"n185967774","loc":[-85.641889,41.943852],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:03:12Z","tags":{}},"n185967775":{"id":"n185967775","loc":[-85.641922,41.945121],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:03:12Z","tags":{}},"n185967776":{"id":"n185967776","loc":[-85.641927,41.947544],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:03:12Z","tags":{}},"n185967777":{"id":"n185967777","loc":[-85.641982,41.947622],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:03:12Z","tags":{}},"n185969289":{"id":"n185969289","loc":[-85.63928,41.929221],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:03:52Z","tags":{}},"n185969704":{"id":"n185969704","loc":[-85.6388186,41.9350099],"version":"3","changeset":"12170230","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:56:56Z","tags":{}},"n185969706":{"id":"n185969706","loc":[-85.6400709,41.9349957],"version":"3","changeset":"12170230","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:56:56Z","tags":{}},"n185969708":{"id":"n185969708","loc":[-85.6412214,41.9349827],"version":"3","changeset":"12170230","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:56:56Z","tags":{}},"n185969710":{"id":"n185969710","loc":[-85.6423509,41.934974],"version":"3","changeset":"12170230","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:56:56Z","tags":{}},"n185970602":{"id":"n185970602","loc":[-85.641293,41.931817],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:04:43Z","tags":{}},"n185970604":{"id":"n185970604","loc":[-85.641258,41.932705],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:04:43Z","tags":{}},"n185970605":{"id":"n185970605","loc":[-85.641148,41.936984],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:04:43Z","tags":{}},"n185970606":{"id":"n185970606","loc":[-85.641112,41.938169],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:04:43Z","tags":{}},"n185970906":{"id":"n185970906","loc":[-85.639454,41.943871],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:04:50Z","tags":{}},"n185970908":{"id":"n185970908","loc":[-85.6394635,41.9450504],"version":"3","changeset":"9619138","user":"bbmiller","uid":"451048","visible":"true","timestamp":"2011-10-21T19:45:57Z","tags":{}},"n185970909":{"id":"n185970909","loc":[-85.6394914,41.9451911],"version":"3","changeset":"9619138","user":"bbmiller","uid":"451048","visible":"true","timestamp":"2011-10-21T19:45:57Z","tags":{}},"n185971368":{"id":"n185971368","loc":[-85.635769,41.940122],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:05:01Z","tags":{}},"n185971978":{"id":"n185971978","loc":[-85.640003,41.936988],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:05:14Z","tags":{}},"n185971980":{"id":"n185971980","loc":[-85.642299,41.936988],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:05:14Z","tags":{}},"n185973633":{"id":"n185973633","loc":[-85.639023,41.92861],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:05:59Z","tags":{}},"n185973635":{"id":"n185973635","loc":[-85.639153,41.928969],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:05:59Z","tags":{}},"n185973637":{"id":"n185973637","loc":[-85.639213,41.929088],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:05:59Z","tags":{}},"n185973639":{"id":"n185973639","loc":[-85.63935,41.929396],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:05:59Z","tags":{}},"n185973641":{"id":"n185973641","loc":[-85.640143,41.931462],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:05:59Z","tags":{}},"n185973644":{"id":"n185973644","loc":[-85.64019,41.931788],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:05:59Z","tags":{}},"n185973646":{"id":"n185973646","loc":[-85.6401365,41.9327199],"version":"3","changeset":"12170230","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:56:56Z","tags":{}},"n185973648":{"id":"n185973648","loc":[-85.639983,41.938174],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:05:59Z","tags":{}},"n185974477":{"id":"n185974477","loc":[-85.638206,41.941331],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:06:18Z","tags":{}},"n185975928":{"id":"n185975928","loc":[-85.640683,41.94513],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:07:13Z","tags":{}},"n185975930":{"id":"n185975930","loc":[-85.643102,41.945103],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:07:13Z","tags":{}},"n185976255":{"id":"n185976255","loc":[-85.642424,41.931817],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:07:24Z","tags":{}},"n185976257":{"id":"n185976257","loc":[-85.64242,41.932699],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:07:24Z","tags":{}},"n185976258":{"id":"n185976258","loc":[-85.6422621,41.9381489],"version":"3","changeset":"12170230","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:56:57Z","tags":{}},"n185977452":{"id":"n185977452","loc":[-85.6457497,41.9398834],"version":"3","changeset":"5841745","user":"themps","uid":"196173","visible":"true","timestamp":"2010-09-22T00:20:34Z","tags":{}},"n185978772":{"id":"n185978772","loc":[-85.646656,41.939869],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:08:34Z","tags":{}},"n185981472":{"id":"n185981472","loc":[-85.6388962,41.9321266],"version":"3","changeset":"12170230","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:56:56Z","tags":{}},"n185981474":{"id":"n185981474","loc":[-85.6388769,41.9327334],"version":"3","changeset":"12170230","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:56:56Z","tags":{}},"n185981476":{"id":"n185981476","loc":[-85.638829,41.934116],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:10:11Z","tags":{}},"n185981478":{"id":"n185981478","loc":[-85.63876,41.937002],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:10:11Z","tags":{}},"n185981480":{"id":"n185981480","loc":[-85.638682,41.93819],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:10:11Z","tags":{}},"n185981999":{"id":"n185981999","loc":[-85.638194,41.9400866],"version":"3","changeset":"12170230","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:56:57Z","tags":{}},"n185982001":{"id":"n185982001","loc":[-85.646302,41.93988],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:10:26Z","tags":{}},"n185982877":{"id":"n185982877","loc":[-85.640676,41.943867],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:10:54Z","tags":{}},"n185982879":{"id":"n185982879","loc":[-85.640734,41.945887],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:10:54Z","tags":{}},"n185985823":{"id":"n185985823","loc":[-85.643106,41.943841],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:12:39Z","tags":{}},"n185985824":{"id":"n185985824","loc":[-85.643145,41.947641],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:12:39Z","tags":{}},"n185985825":{"id":"n185985825","loc":[-85.643219,41.950829],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:12:39Z","tags":{}},"n1475301385":{"id":"n1475301385","loc":[-85.6360612,41.9427042],"version":"1","changeset":"9619138","user":"bbmiller","uid":"451048","visible":"true","timestamp":"2011-10-21T20:04:12Z","tags":{}},"n1475301397":{"id":"n1475301397","loc":[-85.6366651,41.9426328],"version":"1","changeset":"9619138","user":"bbmiller","uid":"451048","visible":"true","timestamp":"2011-10-21T20:04:12Z","tags":{}},"n2139795811":{"id":"n2139795811","loc":[-85.6469154,41.9425427],"version":"1","changeset":"14892219","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T07:47:56Z","tags":{}},"n2139795830":{"id":"n2139795830","loc":[-85.6443194,41.9399444],"version":"1","changeset":"14892219","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T07:47:57Z","tags":{}},"n2139795834":{"id":"n2139795834","loc":[-85.6453506,41.9399002],"version":"1","changeset":"14892219","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T07:47:57Z","tags":{}},"n2139795837":{"id":"n2139795837","loc":[-85.645806,41.9398831],"version":"1","changeset":"14892219","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T07:47:57Z","tags":{}},"n2139858932":{"id":"n2139858932","loc":[-85.6351721,41.9429557],"version":"1","changeset":"14893110","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:29:12Z","tags":{}},"n2140019000":{"id":"n2140019000","loc":[-85.6359935,41.9427224],"version":"1","changeset":"14895342","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T12:35:05Z","tags":{}},"n2165942817":{"id":"n2165942817","loc":[-85.6442017,41.9414993],"version":"1","changeset":"15116533","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-21T20:33:02Z","tags":{}},"n2165942820":{"id":"n2165942820","loc":[-85.6442107,41.9421159],"version":"1","changeset":"15116533","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-21T20:33:02Z","tags":{}},"n2189152990":{"id":"n2189152990","loc":[-85.6442328,41.942404],"version":"1","changeset":"15277317","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-07T00:30:05Z","tags":{}},"n2189152991":{"id":"n2189152991","loc":[-85.6442309,41.9422229],"version":"1","changeset":"15277317","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-07T00:30:06Z","tags":{}},"n2189153002":{"id":"n2189153002","loc":[-85.6441329,41.9413147],"version":"1","changeset":"15277317","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-07T00:30:06Z","tags":{}},"n2189153003":{"id":"n2189153003","loc":[-85.6441357,41.9414925],"version":"1","changeset":"15277317","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-07T00:30:06Z","tags":{}},"n2189153023":{"id":"n2189153023","loc":[-85.6443453,41.9423074],"version":"1","changeset":"15277317","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-07T00:30:06Z","tags":{}},"n2189153024":{"id":"n2189153024","loc":[-85.6442318,41.9423045],"version":"1","changeset":"15277317","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-07T00:30:06Z","tags":{}},"n2189153039":{"id":"n2189153039","loc":[-85.6441343,41.9414025],"version":"1","changeset":"15277317","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-07T00:30:07Z","tags":{}},"w208643102":{"id":"w208643102","version":"1","changeset":"15277317","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-07T00:30:12Z","tags":{"highway":"service","service":"parking_aisle"},"nodes":["n2189153034","n2189153035","n2189153036","n2189153037","n2189153038"]},"w17966942":{"id":"w17966942","version":"3","changeset":"14892219","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T07:48:04Z","tags":{"highway":"residential","name":"Millard St","tiger:cfcc":"A41","tiger:county":"St. Joseph, MI","tiger:name_base":"Millard","tiger:name_type":"St","tiger:reviewed":"no","tiger:separated":"no","tiger:source":"tiger_import_dch_v0.6_20070813","tiger:tlid":"15312476:15312477:15312478:15326070:15326071:15329003:15329004:15312479:15312480:15312483:15326956:15326957:15312485:15312486:15322600:15325988","tiger:upload_uuid":"bulk_upload.pl-b79f893a-0be1-4a5f-a183-6aea114c9af7","tiger:zip_left":"49093","tiger:zip_right":"49093"},"nodes":["n185954680","n185960207","n185971368","n185948706","n185958670","n185981999","n185981481","n185981482","n185973650","n185973659","n185970607","n185976259","n185976261","n2139795830","n185964697","n2139795834","n185977452","n2139795837","n185982001","n185978772"]},"w208643105":{"id":"w208643105","version":"1","changeset":"15277317","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-07T00:30:12Z","tags":{"highway":"service","service":"parking_aisle"},"nodes":["n2189153046","n2189153047"]},"w208631637":{"id":"w208631637","version":"1","changeset":"15276417","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T22:05:45Z","tags":{"area":"yes","building":"yes"},"nodes":["n2189046014","n2189046016","n2189046018","n2189046021","n2189046022","n2189046025","n2189046014"]},"w208643096":{"id":"w208643096","version":"1","changeset":"15277317","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-07T00:30:12Z","tags":{"amenity":"parking","area":"yes","fee":"no"},"nodes":["n2189152990","n2189153024","n2189152991","n2189152992","n2189153025","n2189152993","n2189152990"]},"w208631656":{"id":"w208631656","version":"1","changeset":"15276417","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T22:05:46Z","tags":{"area":"yes","building":"yes"},"nodes":["n2189046134","n2189046135","n2189046137","n2189046138","n2189046134"]},"w204003417":{"id":"w204003417","version":"1","changeset":"14897169","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T14:35:18Z","tags":{"area":"yes","building":"school"},"nodes":["n2140155811","n2140155814","n2140155816","n2140155818","n2140155821","n2140155823","n2140155825","n2140155827","n2140155811"]},"w208631654":{"id":"w208631654","version":"1","changeset":"15276417","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T22:05:46Z","tags":{"area":"yes","building":"yes"},"nodes":["n2189046127","n2189046128","n2189046130","n2189046131","n2189046132","n2189046133","n2189046127"]},"w17966327":{"id":"w17966327","version":"3","changeset":"15277317","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-07T00:30:16Z","tags":{"highway":"residential","name":"S Douglas Ave","tiger:cfcc":"A41","tiger:county":"St. Joseph, MI","tiger:name_base":"Douglas","tiger:name_direction_prefix":"S","tiger:name_type":"Ave","tiger:reviewed":"no","tiger:zip_left":"49093","tiger:zip_right":"49093"},"nodes":["n185976261","n2140155839","n2140155834","n185974481","n2189153032","n185964959"]},"w41785752":{"id":"w41785752","version":"10","changeset":"15421127","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-19T15:11:59Z","tags":{"highway":"primary","name":"West Michigan Avenue","old_ref":"US 131","ref":"US 131 Business;M 60","tiger:cfcc":"A21","tiger:county":"St. Joseph, MI","tiger:name_base":"Michigan","tiger:name_base_1":"State Highway 60","tiger:name_base_2":"US Hwy 131 (Bus)","tiger:name_direction_prefix":"W","tiger:name_type":"Ave","tiger:reviewed":"no","access":"yes"},"nodes":["n185954784","n2139795811","n185964695","n185964959","n185964960","n185964961","n185964962","n185964963","n185964965","n1475301397","n185964967","n1475301385","n2140019000","n185964968","n185964969","n2139858932","n185964970"]},"w203841842":{"id":"w203841842","version":"1","changeset":"14879185","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-02T05:55:32Z","tags":{"area":"yes","leisure":"playground"},"nodes":["n2138493848","n2138493849","n2138493850","n2138493851","n2138493852","n2138493853","n2138493854","n2138493855","n2138493856","n2138493848"]},"w208643103":{"id":"w208643103","version":"1","changeset":"15277317","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-07T00:30:12Z","tags":{"highway":"service"},"nodes":["n2189153039","n2189153040","n2189153041","n2189153042","n2189153043","n2189153047","n2189153045","n185974481"]},"w208643098":{"id":"w208643098","version":"1","changeset":"15277317","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-07T00:30:12Z","tags":{"amenity":"parking","area":"yes"},"nodes":["n2189153000","n2189153041","n2189153001","n2189153002","n2189153039","n2189153003","n2189153000"]},"w208631646":{"id":"w208631646","version":"1","changeset":"15276417","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T22:05:45Z","tags":{"area":"yes","building":"yes"},"nodes":["n2189046067","n2189046069","n2189046070","n2189046072","n2189046067"]},"w208631653":{"id":"w208631653","version":"1","changeset":"15276417","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T22:05:45Z","tags":{"area":"yes","building":"yes"},"nodes":["n2189046119","n2189046120","n2189046121","n2189046122","n2189046123","n2189046124","n2189046125","n2189046126","n2189046119"]},"w17966041":{"id":"w17966041","version":"1","changeset":"402341","user":"DaveHansenTiger","uid":"7168","visible":"true","timestamp":"2007-12-23T20:41:50Z","tags":{"highway":"residential","name":"S Lincoln Ave","tiger:cfcc":"A41","tiger:county":"St. Joseph, MI","tiger:name_base":"Lincoln","tiger:name_direction_prefix":"S","tiger:name_type":"Ave","tiger:reviewed":"no","tiger:separated":"no","tiger:source":"tiger_import_dch_v0.6_20070813","tiger:tlid":"15312474:15312448","tiger:upload_uuid":"bulk_upload.pl-b79f893a-0be1-4a5f-a183-6aea114c9af7","tiger:zip_left":"49093","tiger:zip_right":"49093"},"nodes":["n185973659","n185973660","n185964961"]},"w208631645":{"id":"w208631645","version":"1","changeset":"15276417","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T22:05:45Z","tags":{"area":"yes","building":"yes"},"nodes":["n2189046060","n2189046061","n2189046063","n2189046065","n2189046060"]},"w206803397":{"id":"w206803397","version":"1","changeset":"15132039","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-23T08:10:25Z","tags":{"area":"yes","building":"yes"},"nodes":["n2168510551","n2168510552","n2168510553","n2168510554","n2168510555","n2168510556","n2168510557","n2168510558","n2168510551"]},"w17965792":{"id":"w17965792","version":"2","changeset":"9619138","user":"bbmiller","uid":"451048","visible":"true","timestamp":"2011-10-21T19:46:10Z","tags":{"highway":"residential","name":"N Hooker Ave","tiger:cfcc":"A41","tiger:county":"St. Joseph, MI","tiger:name_base":"Hooker","tiger:name_direction_prefix":"N","tiger:name_type":"Ave","tiger:reviewed":"no","tiger:separated":"no","tiger:source":"tiger_import_dch_v0.6_20070813","tiger:tlid":"15313197:15312414:15312395","tiger:upload_uuid":"bulk_upload.pl-b79f893a-0be1-4a5f-a183-6aea114c9af7","tiger:zip_left":"49093","tiger:zip_right":"49093"},"nodes":["n185964962","n185970906","n185970908","n185970909"]},"w208631651":{"id":"w208631651","version":"1","changeset":"15276417","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T22:05:45Z","tags":{"area":"yes","building":"yes"},"nodes":["n2189046112","n2189046113","n2189046115","n2189046116","n2189046117","n2189046118","n2189046112"]},"w208631643":{"id":"w208631643","version":"1","changeset":"15276417","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T22:05:45Z","tags":{"area":"yes","building":"yes"},"nodes":["n2189046053","n2189046054","n2189046055","n2189046056","n2189046058","n2189046059","n2189046053"]},"w17966878":{"id":"w17966878","version":"1","changeset":"402341","user":"DaveHansenTiger","uid":"7168","visible":"true","timestamp":"2007-12-23T20:48:03Z","tags":{"highway":"residential","name":"S Hooker Ave","tiger:cfcc":"A41","tiger:county":"St. Joseph, MI","tiger:name_base":"Hooker","tiger:name_direction_prefix":"S","tiger:name_type":"Ave","tiger:reviewed":"no","tiger:separated":"no","tiger:source":"tiger_import_dch_v0.6_20070813","tiger:tlid":"15312508:15312529:15312553:15312597:15328883:15338803","tiger:upload_uuid":"bulk_upload.pl-b79f893a-0be1-4a5f-a183-6aea114c9af7","tiger:zip_left":"49093","tiger:zip_right":"49093"},"nodes":["n185981472","n185981474","n185963163","n185981476","n185969704","n185981478","n185981480","n185981481"]},"w17966102":{"id":"w17966102","version":"2","changeset":"14896694","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T14:01:36Z","tags":{"highway":"residential","name":"South St","tiger:cfcc":"A41","tiger:county":"St. Joseph, MI","tiger:name_base":"South","tiger:name_type":"St","tiger:reviewed":"no","tiger:separated":"no","tiger:source":"tiger_import_dch_v0.6_20070813","tiger:tlid":"15312446","tiger:upload_uuid":"bulk_upload.pl-b79f893a-0be1-4a5f-a183-6aea114c9af7"},"nodes":["n185958672","n185974477","n185974479","n185973660","n185970614"]},"w208631660":{"id":"w208631660","version":"1","changeset":"15276417","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T22:05:46Z","tags":{"area":"yes","building":"yes"},"nodes":["n2189046145","n2189046146","n2189046147","n2189046148","n2189046149","n2189046150","n2189046152","n2189046153","n2189046145"]},"w208643101":{"id":"w208643101","version":"1","changeset":"15277317","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-07T00:30:12Z","tags":{"highway":"service"},"nodes":["n2189153023","n2189153024","n2189153025","n2189153026","n2189153038","n2189153027","n2189153028","n2189153029","n2189153033","n2189153009","n2189153030","n2189153034","n2189153031","n2189153032"]},"w204000205":{"id":"w204000205","version":"2","changeset":"14897169","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T14:35:19Z","tags":{"highway":"residential","name":"South St","oneway":"yes","tiger:cfcc":"A41","tiger:county":"St. Joseph, MI","tiger:name_base":"South","tiger:name_type":"St","tiger:reviewed":"no","tiger:separated":"no","tiger:source":"tiger_import_dch_v0.6_20070813","tiger:tlid":"15312446","tiger:upload_uuid":"bulk_upload.pl-b79f893a-0be1-4a5f-a183-6aea114c9af7"},"nodes":["n185974481","n2140155851","n185970614"]},"w203841841":{"id":"w203841841","version":"1","changeset":"14879185","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-02T05:55:32Z","tags":{"area":"yes","leisure":"pitch","pitch":"basketball"},"nodes":["n2138493844","n2138493845","n2138493846","n2138493847","n2138493844"]},"w17965444":{"id":"w17965444","version":"1","changeset":"402341","user":"DaveHansenTiger","uid":"7168","visible":"true","timestamp":"2007-12-23T20:37:03Z","tags":{"highway":"residential","name":"N Grant Ave","tiger:cfcc":"A41","tiger:county":"St. Joseph, MI","tiger:name_base":"Grant","tiger:name_direction_prefix":"N","tiger:name_type":"Ave","tiger:reviewed":"no","tiger:separated":"no","tiger:source":"tiger_import_dch_v0.6_20070813","tiger:tlid":"15312348:15312365:15312422:15312392","tiger:upload_uuid":"bulk_upload.pl-b79f893a-0be1-4a5f-a183-6aea114c9af7","tiger:zip_left":"49093","tiger:zip_right":"49093"},"nodes":["n185964960","n185967774","n185967775","n185966958","n185967776","n185967777"]},"w208631648":{"id":"w208631648","version":"1","changeset":"15276417","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T22:05:45Z","tags":{"area":"yes","building":"yes"},"nodes":["n2189046074","n2189046075","n2189046077","n2189046079","n2189046082","n2189046083","n2189046085","n2189046087","n2189046089","n2189046090","n2189046092","n2189046094","n2189046096","n2189046097","n2189046099","n2189046103","n2189046074"]},"w208643100":{"id":"w208643100","version":"1","changeset":"15277317","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-07T00:30:12Z","tags":{"amenity":"parking","area":"yes"},"nodes":["n2189153010","n2189153011","n2189153012","n2189153013","n2189153014","n2189153015","n2189153016","n2189153017","n2189153018","n2189153019","n2189153020","n2189153021","n2189153022","n2189153010"]},"w17965749":{"id":"w17965749","version":"1","changeset":"402341","user":"DaveHansenTiger","uid":"7168","visible":"true","timestamp":"2007-12-23T20:39:28Z","tags":{"highway":"residential","name":"S Grant Ave","tiger:cfcc":"A41","tiger:county":"St. Joseph, MI","tiger:name_base":"Grant","tiger:name_direction_prefix":"S","tiger:name_type":"Ave","tiger:reviewed":"no","tiger:separated":"no","tiger:source":"tiger_import_dch_v0.6_20070813","tiger:tlid":"15312445","tiger:upload_uuid":"bulk_upload.pl-b79f893a-0be1-4a5f-a183-6aea114c9af7","tiger:zip_left":"49093","tiger:zip_right":"49093"},"nodes":["n185970614","n185970616","n185964960"]},"w206574482":{"id":"w206574482","version":"2","changeset":"15128027","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-22T20:03:31Z","tags":{"addr:state":"MI","amenity":"library","area":"yes","building":"yes","ele":"249","gnis:county_name":"St. Joseph","gnis:feature_id":"2418162","gnis:import_uuid":"57871b70-0100-4405-bb30-88b2e001a944","gnis:reviewed":"no","name":"Three Rivers Public Library","source":"USGS Geonames"},"nodes":["n2165942817","n2165942818","n2165942819","n2165942820","n2165942817"]},"w208643097":{"id":"w208643097","version":"1","changeset":"15277317","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-07T00:30:12Z","tags":{"amenity":"parking","area":"yes"},"nodes":["n2189152994","n2189152995","n2189152996","n2189152997","n2189152998","n2189152999","n2189152994"]},"w17966879":{"id":"w17966879","version":"1","changeset":"402341","user":"DaveHansenTiger","uid":"7168","visible":"true","timestamp":"2007-12-23T20:48:03Z","tags":{"highway":"residential","name":"S Hooker Ave","tiger:cfcc":"A41","tiger:county":"St. Joseph, MI","tiger:name_base":"Hooker","tiger:name_direction_prefix":"S","tiger:name_type":"Ave","tiger:reviewed":"no","tiger:separated":"no","tiger:source":"tiger_import_dch_v0.6_20070813","tiger:tlid":"15312475:15312449","tiger:upload_uuid":"bulk_upload.pl-b79f893a-0be1-4a5f-a183-6aea114c9af7","tiger:zip_left":"49093","tiger:zip_right":"49093"},"nodes":["n185981482","n185974479","n185964962"]},"w17966325":{"id":"w17966325","version":"1","changeset":"402341","user":"DaveHansenTiger","uid":"7168","visible":"true","timestamp":"2007-12-23T20:43:58Z","tags":{"highway":"residential","name":"S Douglas Ave","tiger:cfcc":"A41","tiger:county":"St. Joseph, MI","tiger:name_base":"Douglas","tiger:name_direction_prefix":"S","tiger:name_type":"Ave","tiger:reviewed":"no","tiger:separated":"no","tiger:source":"tiger_import_dch_v0.6_20070813","tiger:tlid":"15330300:15312522:15312547:15330299:15312603:15312571:15331740","tiger:upload_uuid":"bulk_upload.pl-b79f893a-0be1-4a5f-a183-6aea114c9af7","tiger:zip_left":"49093","tiger:zip_right":"49093"},"nodes":["n185976255","n185976257","n185963168","n185969710","n185971980","n185976258","n185954700","n185976259"]},"w17967390":{"id":"w17967390","version":"1","changeset":"402341","user":"DaveHansenTiger","uid":"7168","visible":"true","timestamp":"2007-12-23T20:51:27Z","tags":{"highway":"residential","name":"N Douglas Ave","tiger:cfcc":"A41","tiger:county":"St. Joseph, MI","tiger:name_base":"Douglas","tiger:name_direction_prefix":"N","tiger:name_type":"Ave","tiger:reviewed":"no","tiger:separated":"no","tiger:source":"tiger_import_dch_v0.6_20070813","tiger:tlid":"15312300","tiger:upload_uuid":"bulk_upload.pl-b79f893a-0be1-4a5f-a183-6aea114c9af7"},"nodes":["n185964959","n185985823","n185975930","n185966960","n185985824","n185949870","n185985825"]},"w208631635":{"id":"w208631635","version":"1","changeset":"15276417","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T22:05:45Z","tags":{"area":"yes","building":"yes"},"nodes":["n2189046007","n2189046009","n2189046011","n2189046012","n2189046007"]},"w208643099":{"id":"w208643099","version":"1","changeset":"15277317","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-07T00:30:12Z","tags":{"amenity":"parking","area":"yes"},"nodes":["n2189153031","n2189153004","n2189153005","n2189153006","n2189153007","n2189153008","n2189153029","n2189153033","n2189153009","n2189153030","n2189153031"]},"w208631658":{"id":"w208631658","version":"1","changeset":"15276417","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T22:05:46Z","tags":{"area":"yes","building":"yes"},"nodes":["n2189046139","n2189046140","n2189046141","n2189046142","n2189046143","n2189046144","n2189046139"]},"w208643104":{"id":"w208643104","version":"1","changeset":"15277317","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-07T00:30:12Z","tags":{"highway":"service","service":"parking_aisle"},"nodes":["n2189153044","n2189153045"]},"w17966039":{"id":"w17966039","version":"1","changeset":"402341","user":"DaveHansenTiger","uid":"7168","visible":"true","timestamp":"2007-12-23T20:41:49Z","tags":{"highway":"residential","name":"S Lincoln Ave","tiger:cfcc":"A41","tiger:county":"St. Joseph, MI","tiger:name_base":"Lincoln","tiger:name_direction_prefix":"S","tiger:name_type":"Ave","tiger:reviewed":"no","tiger:separated":"no","tiger:source":"tiger_import_dch_v0.6_20070813","tiger:tlid":"15312526:15312511:15312550:15312601:15312998:15312626:15312574:15328327:15328328:15313210","tiger:upload_uuid":"bulk_upload.pl-b79f893a-0be1-4a5f-a183-6aea114c9af7","tiger:zip_left":"49093","tiger:zip_right":"49093"},"nodes":["n185973633","n185973635","n185973637","n185969289","n185973639","n185949348","n185973641","n185973644","n185973646","n185963165","n185969706","n185971978","n185973648","n185973650"]},"w204003420":{"id":"w204003420","version":"1","changeset":"14897169","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T14:35:18Z","tags":{"amenity":"parking","area":"yes"},"nodes":["n2140155840","n2140155842","n2140155844","n2140155845","n2140155847","n2140155849","n2140155854","n2140155840"]},"w204003419":{"id":"w204003419","version":"1","changeset":"14897169","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T14:35:18Z","tags":{"highway":"service"},"nodes":["n2140155834","n2140155835","n2140155837","n2140155839"]},"w204003418":{"id":"w204003418","version":"1","changeset":"14897169","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T14:35:18Z","tags":{"amenity":"school","area":"yes","name":"Andrews Elementary School"},"nodes":["n2140155828","n2140155829","n2140155830","n2140155831","n2140155832","n2140155833","n2140155828"]},"w17965747":{"id":"w17965747","version":"1","changeset":"402341","user":"DaveHansenTiger","uid":"7168","visible":"true","timestamp":"2007-12-23T20:39:27Z","tags":{"highway":"residential","name":"S Grant Ave","tiger:cfcc":"A41","tiger:county":"St. Joseph, MI","tiger:name_base":"Grant","tiger:name_direction_prefix":"S","tiger:name_type":"Ave","tiger:reviewed":"no","tiger:separated":"no","tiger:source":"tiger_import_dch_v0.6_20070813","tiger:tlid":"15312509:15312524:15312549:15312605:15329008:15312572","tiger:upload_uuid":"bulk_upload.pl-b79f893a-0be1-4a5f-a183-6aea114c9af7","tiger:zip_left":"49093","tiger:zip_right":"49093"},"nodes":["n185970602","n185970604","n185963167","n185969708","n185970605","n185970606","n185970607"]},"w17967073":{"id":"w17967073","version":"1","changeset":"402341","user":"DaveHansenTiger","uid":"7168","visible":"true","timestamp":"2007-12-23T20:49:07Z","tags":{"highway":"residential","name":"N Lincoln Ave","tiger:cfcc":"A41","tiger:county":"St. Joseph, MI","tiger:name_base":"Lincoln","tiger:name_direction_prefix":"N","tiger:name_type":"Ave","tiger:reviewed":"no","tiger:separated":"no","tiger:source":"tiger_import_dch_v0.6_20070813","tiger:tlid":"15313196:15312424:15312394","tiger:upload_uuid":"bulk_upload.pl-b79f893a-0be1-4a5f-a183-6aea114c9af7","tiger:zip_left":"49093","tiger:zip_right":"49093"},"nodes":["n185964961","n185982877","n185975928","n185982879"]},"w204003421":{"id":"w204003421","version":"1","changeset":"14897169","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T14:35:18Z","tags":{"highway":"service","service":"parking_aisle"},"nodes":["n2140155851","n2140155852","n2140155854","n2140155856"]},"r1943857":{"id":"r1943857","version":"2","changeset":"13612265","user":"migurski","uid":"8287","visible":"true","timestamp":"2012-10-24T04:10:54Z","tags":{"is_in:state":"MI","modifier":"Business","name":"US 131 Business (Three Rivers, MI)","network":"US:US","ref":"131","route":"road","type":"route"},"members":[{"id":"w17966509","type":"way","role":"forward"},{"id":"w143497377","type":"way","role":""},{"id":"w134150811","type":"way","role":""},{"id":"w134150800","type":"way","role":""},{"id":"w134150789","type":"way","role":""},{"id":"w134150795","type":"way","role":""},{"id":"w41785752","type":"way","role":""},{"id":"w17965146","type":"way","role":"forward"},{"id":"w17964031","type":"way","role":"forward"}]},"r270277":{"id":"r270277","version":"21","changeset":"15347356","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T03:41:02Z","tags":{"network":"US:MI","ref":"60","route":"road","state_id":"MI","type":"route","url":"http://en.wikipedia.org/wiki/M-60_%28Michigan_highway%29"},"members":[{"id":"w17751087","type":"way","role":"east"},{"id":"w117148312","type":"way","role":"east"},{"id":"w40942155","type":"way","role":"west"},{"id":"w17751017","type":"way","role":""},{"id":"w17751083","type":"way","role":""},{"id":"w17747780","type":"way","role":""},{"id":"w41068082","type":"way","role":""},{"id":"w197025212","type":"way","role":""},{"id":"w17743874","type":"way","role":""},{"id":"w17751044","type":"way","role":""},{"id":"w17752167","type":"way","role":""},{"id":"w17751089","type":"way","role":""},{"id":"w17743879","type":"way","role":""},{"id":"w17751064","type":"way","role":""},{"id":"w197057073","type":"way","role":""},{"id":"w167699963","type":"way","role":""},{"id":"w167699972","type":"way","role":""},{"id":"w17967584","type":"way","role":""},{"id":"w167699964","type":"way","role":""},{"id":"w17967582","type":"way","role":"west"},{"id":"w41260270","type":"way","role":"west"},{"id":"w17965146","type":"way","role":"west"},{"id":"w41785752","type":"way","role":""},{"id":"w134150795","type":"way","role":""},{"id":"w134150789","type":"way","role":""},{"id":"w134150800","type":"way","role":""},{"id":"w134150811","type":"way","role":""},{"id":"w134150836","type":"way","role":""},{"id":"w134150802","type":"way","role":""},{"id":"w41074896","type":"way","role":""},{"id":"w17966773","type":"way","role":""},{"id":"w17967415","type":"way","role":""},{"id":"w41074899","type":"way","role":""},{"id":"w17967581","type":"way","role":""},{"id":"w41074902","type":"way","role":""},{"id":"w41074906","type":"way","role":""},{"id":"w209707997","type":"way","role":""},{"id":"w209707998","type":"way","role":""},{"id":"w17964798","type":"way","role":""},{"id":"w17966034","type":"way","role":""},{"id":"w17967593","type":"way","role":""},{"id":"w41074888","type":"way","role":""},{"id":"w17733772","type":"way","role":""},{"id":"w41074813","type":"way","role":""},{"id":"w17742213","type":"way","role":""},{"id":"w17746863","type":"way","role":""},{"id":"w17745772","type":"way","role":""},{"id":"w17742222","type":"way","role":""},{"id":"w17745922","type":"way","role":""},{"id":"w17742198","type":"way","role":""},{"id":"w17747675","type":"way","role":""},{"id":"w17739927","type":"way","role":""},{"id":"w17745708","type":"way","role":""},{"id":"w41006323","type":"way","role":""},{"id":"w17744233","type":"way","role":""},{"id":"w17739436","type":"way","role":""},{"id":"w17742201","type":"way","role":""},{"id":"w151418616","type":"way","role":""},{"id":"w17750062","type":"way","role":""},{"id":"w17742227","type":"way","role":"east"},{"id":"w41006348","type":"way","role":"east"},{"id":"w41260984","type":"way","role":""},{"id":"w17832427","type":"way","role":""},{"id":"w17838408","type":"way","role":""},{"id":"w17835846","type":"way","role":""},{"id":"w17832923","type":"way","role":""},{"id":"w17839388","type":"way","role":""},{"id":"w17838390","type":"way","role":""},{"id":"w17831272","type":"way","role":""},{"id":"w17828581","type":"way","role":""},{"id":"w38240686","type":"way","role":""},{"id":"w17838405","type":"way","role":"east"},{"id":"w123323711","type":"way","role":"east"},{"id":"w17830167","type":"way","role":"east"},{"id":"w99011909","type":"way","role":"east"},{"id":"w41911361","type":"way","role":"east"},{"id":"w41911355","type":"way","role":"east"},{"id":"w41911356","type":"way","role":"east"},{"id":"w117148326","type":"way","role":"west"},{"id":"w41911352","type":"way","role":"west"},{"id":"w41911353","type":"way","role":"west"},{"id":"w41911354","type":"way","role":"west"},{"id":"w41911360","type":"way","role":"west"},{"id":"w38240676","type":"way","role":"west"},{"id":"w123323710","type":"way","role":"west"},{"id":"w41260271","type":"way","role":"east"},{"id":"w41260273","type":"way","role":"east"},{"id":"w17964031","type":"way","role":"east"},{"id":"w41006344","type":"way","role":"west"},{"id":"w41006351","type":"way","role":"west"}]},"n367813436":{"id":"n367813436","loc":[-85.63605205663384,41.94305506683346],"version":"2","changeset":"14895342","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T12:35:05Z","tags":{"addr:state":"MI","amenity":"fire_station","ele":"245","gnis:county_name":"St. Joseph","gnis:feature_id":"2417894","gnis:import_uuid":"57871b70-0100-4405-bb30-88b2e001a944","gnis:reviewed":"no","name":"Three Rivers Fire Department","source":"USGS Geonames"}},"n185948708":{"id":"n185948708","loc":[-85.6369828,41.9408789],"version":"3","changeset":"9619138","user":"bbmiller","uid":"451048","visible":"true","timestamp":"2011-10-21T20:04:13Z","tags":{}},"n185948710":{"id":"n185948710","loc":[-85.6370184,41.9411346],"version":"3","changeset":"9619138","user":"bbmiller","uid":"451048","visible":"true","timestamp":"2011-10-21T20:04:13Z","tags":{}},"n185954691":{"id":"n185954691","loc":[-85.634476,41.941475],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T04:56:32Z","tags":{}},"n185954692":{"id":"n185954692","loc":[-85.635008,41.941846],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T04:56:32Z","tags":{}},"n185954693":{"id":"n185954693","loc":[-85.635362,41.941962],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T04:56:33Z","tags":{}},"n185954695":{"id":"n185954695","loc":[-85.63578,41.941978],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T04:56:33Z","tags":{}},"n185972903":{"id":"n185972903","loc":[-85.63295,41.9430062],"version":"3","changeset":"9619138","user":"bbmiller","uid":"451048","visible":"true","timestamp":"2011-10-21T19:45:59Z","tags":{}},"n185964971":{"id":"n185964971","loc":[-85.6346811,41.9431023],"version":"3","changeset":"9619138","user":"bbmiller","uid":"451048","visible":"true","timestamp":"2011-10-21T19:46:00Z","tags":{}},"n1819805854":{"id":"n1819805854","loc":[-85.6331275,41.9404837],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:08:28Z","tags":{}},"n1819805918":{"id":"n1819805918","loc":[-85.6331168,41.942798],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:08:28Z","tags":{}},"n1819805762":{"id":"n1819805762","loc":[-85.6333034,41.9424123],"version":"2","changeset":"14894902","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T12:02:33Z","tags":{}},"n1819805907":{"id":"n1819805907","loc":[-85.6334819,41.9419121],"version":"2","changeset":"14894902","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T12:02:33Z","tags":{}},"n1819805915":{"id":"n1819805915","loc":[-85.6334554,41.9413588],"version":"2","changeset":"14894902","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T12:02:33Z","tags":{}},"n1819848888":{"id":"n1819848888","loc":[-85.6331625,41.942679],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:50Z","tags":{}},"n1819848930":{"id":"n1819848930","loc":[-85.6338684,41.9431252],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:51Z","tags":{}},"n1819858505":{"id":"n1819858505","loc":[-85.6346782,41.9429092],"version":"1","changeset":"12170230","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:56:54Z","tags":{}},"n1819858507":{"id":"n1819858507","loc":[-85.6339003,41.9414534],"version":"1","changeset":"12170230","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:56:54Z","tags":{}},"n1819858508":{"id":"n1819858508","loc":[-85.6345709,41.9427742],"version":"1","changeset":"12170230","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:56:54Z","tags":{}},"n1819858509":{"id":"n1819858509","loc":[-85.63419,41.9417322],"version":"1","changeset":"12170230","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:56:54Z","tags":{}},"n1819858511":{"id":"n1819858511","loc":[-85.6340666,41.9415652],"version":"1","changeset":"12170230","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:56:54Z","tags":{}},"n1819858512":{"id":"n1819858512","loc":[-85.6343295,41.9423027],"version":"1","changeset":"12170230","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:56:54Z","tags":{}},"n1819858514":{"id":"n1819858514","loc":[-85.6343241,41.942207],"version":"1","changeset":"12170230","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:56:54Z","tags":{}},"n1819858521":{"id":"n1819858521","loc":[-85.633391,41.941231],"version":"1","changeset":"12170230","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:56:55Z","tags":{}},"n1819858528":{"id":"n1819858528","loc":[-85.6343027,41.9419716],"version":"1","changeset":"12170230","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:56:55Z","tags":{}},"n185954683":{"id":"n185954683","loc":[-85.6335412,41.940147],"version":"3","changeset":"12170230","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:56:56Z","tags":{}},"n185954685":{"id":"n185954685","loc":[-85.6334296,41.9403023],"version":"3","changeset":"12170230","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:56:56Z","tags":{}},"n185954687":{"id":"n185954687","loc":[-85.6333988,41.9404704],"version":"3","changeset":"12170230","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:56:56Z","tags":{}},"n185954689":{"id":"n185954689","loc":[-85.6335511,41.9410225],"version":"3","changeset":"12170230","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:56:56Z","tags":{}},"n185954690":{"id":"n185954690","loc":[-85.6336721,41.9411669],"version":"3","changeset":"12170230","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:56:56Z","tags":{}},"n1820938802":{"id":"n1820938802","loc":[-85.6330671,41.941845],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:43Z","tags":{}},"n1821006702":{"id":"n1821006702","loc":[-85.6344047,41.9395496],"version":"1","changeset":"12181163","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T01:58:48Z","tags":{}},"n2130304133":{"id":"n2130304133","loc":[-85.6349025,41.9427659],"version":"1","changeset":"14802606","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-01-27T04:50:52Z","tags":{}},"n2130304136":{"id":"n2130304136","loc":[-85.6346027,41.9422017],"version":"1","changeset":"14802606","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-01-27T04:50:52Z","tags":{}},"n2130304138":{"id":"n2130304138","loc":[-85.6348577,41.9421517],"version":"1","changeset":"14802606","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-01-27T04:50:52Z","tags":{}},"n2130304140":{"id":"n2130304140","loc":[-85.6348419,41.9422694],"version":"1","changeset":"14802606","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-01-27T04:50:52Z","tags":{}},"n2130304142":{"id":"n2130304142","loc":[-85.6349071,41.9423135],"version":"1","changeset":"14802606","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-01-27T04:50:52Z","tags":{}},"n2130304144":{"id":"n2130304144","loc":[-85.6350495,41.9423312],"version":"1","changeset":"14802606","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-01-27T04:50:52Z","tags":{}},"n2130304146":{"id":"n2130304146","loc":[-85.6351009,41.9422812],"version":"1","changeset":"14802606","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-01-27T04:50:52Z","tags":{}},"n2130304147":{"id":"n2130304147","loc":[-85.6351227,41.9421532],"version":"1","changeset":"14802606","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-01-27T04:50:52Z","tags":{}},"n2130304148":{"id":"n2130304148","loc":[-85.635526,41.9421547],"version":"1","changeset":"14802606","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-01-27T04:50:52Z","tags":{}},"n2130304149":{"id":"n2130304149","loc":[-85.6355339,41.9425768],"version":"1","changeset":"14802606","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-01-27T04:50:52Z","tags":{}},"n2130304150":{"id":"n2130304150","loc":[-85.6351582,41.9426562],"version":"1","changeset":"14802606","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-01-27T04:50:52Z","tags":{}},"n2130304151":{"id":"n2130304151","loc":[-85.6351207,41.9427032],"version":"1","changeset":"14802606","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-01-27T04:50:52Z","tags":{}},"n2138493807":{"id":"n2138493807","loc":[-85.6350923,41.9415216],"version":"1","changeset":"14879185","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-02T05:55:31Z","tags":{}},"n2138493808":{"id":"n2138493808","loc":[-85.6353603,41.9411061],"version":"1","changeset":"14879185","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-02T05:55:31Z","tags":{}},"n2138493809":{"id":"n2138493809","loc":[-85.6354421,41.9410942],"version":"1","changeset":"14879185","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-02T05:55:31Z","tags":{}},"n2138493810":{"id":"n2138493810","loc":[-85.6355079,41.9411044],"version":"1","changeset":"14879185","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-02T05:55:31Z","tags":{}},"n2138493811":{"id":"n2138493811","loc":[-85.6355693,41.9411246],"version":"1","changeset":"14879185","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-02T05:55:31Z","tags":{}},"n2138493812":{"id":"n2138493812","loc":[-85.6355829,41.9411061],"version":"1","changeset":"14879185","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-02T05:55:31Z","tags":{}},"n2138493813":{"id":"n2138493813","loc":[-85.6355624,41.9409777],"version":"1","changeset":"14879185","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-02T05:55:31Z","tags":{}},"n2138493814":{"id":"n2138493814","loc":[-85.6355011,41.9409152],"version":"1","changeset":"14879185","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-02T05:55:31Z","tags":{}},"n2138493815":{"id":"n2138493815","loc":[-85.635383,41.9409219],"version":"1","changeset":"14879185","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-02T05:55:31Z","tags":{}},"n2138493816":{"id":"n2138493816","loc":[-85.635299,41.9409658],"version":"1","changeset":"14879185","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-02T05:55:31Z","tags":{}},"n2138493817":{"id":"n2138493817","loc":[-85.6351695,41.941204],"version":"1","changeset":"14879185","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-02T05:55:31Z","tags":{}},"n2138493818":{"id":"n2138493818","loc":[-85.6348879,41.9415166],"version":"1","changeset":"14879185","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-02T05:55:31Z","tags":{}},"n2138493819":{"id":"n2138493819","loc":[-85.634897,41.9415757],"version":"1","changeset":"14879185","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-02T05:55:31Z","tags":{}},"n2138493820":{"id":"n2138493820","loc":[-85.6349606,41.9416399],"version":"1","changeset":"14879185","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-02T05:55:31Z","tags":{}},"n2138493821":{"id":"n2138493821","loc":[-85.6350219,41.9416669],"version":"1","changeset":"14879185","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-02T05:55:31Z","tags":{}},"n2138493822":{"id":"n2138493822","loc":[-85.6351241,41.9416314],"version":"1","changeset":"14879185","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-02T05:55:31Z","tags":{}},"n2138493823":{"id":"n2138493823","loc":[-85.6350855,41.9415622],"version":"1","changeset":"14879185","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-02T05:55:31Z","tags":{}},"n2138493824":{"id":"n2138493824","loc":[-85.6350401,41.9413603],"version":"1","changeset":"14879185","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-02T05:55:31Z","tags":{}},"n2138493825":{"id":"n2138493825","loc":[-85.6352206,41.9410765],"version":"1","changeset":"14879185","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-02T05:55:31Z","tags":{}},"n2138493826":{"id":"n2138493826","loc":[-85.6343865,41.9415594],"version":"1","changeset":"14879185","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-02T05:55:31Z","tags":{}},"n2138493827":{"id":"n2138493827","loc":[-85.6343506,41.9415873],"version":"1","changeset":"14879185","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-02T05:55:31Z","tags":{}},"n2138493828":{"id":"n2138493828","loc":[-85.6344158,41.9417557],"version":"1","changeset":"14879185","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-02T05:55:31Z","tags":{}},"n2138493829":{"id":"n2138493829","loc":[-85.6344614,41.9417968],"version":"1","changeset":"14879185","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-02T05:55:31Z","tags":{}},"n2138493830":{"id":"n2138493830","loc":[-85.6345005,41.9418186],"version":"1","changeset":"14879185","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-02T05:55:31Z","tags":{}},"n2138493831":{"id":"n2138493831","loc":[-85.6345965,41.9418162],"version":"1","changeset":"14879185","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-02T05:55:31Z","tags":{}},"n2138493832":{"id":"n2138493832","loc":[-85.6347317,41.9417242],"version":"1","changeset":"14879185","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-02T05:55:31Z","tags":{}},"n2138493833":{"id":"n2138493833","loc":[-85.6346722,41.941775],"version":"1","changeset":"14879185","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-02T05:55:31Z","tags":{}},"n2139858909":{"id":"n2139858909","loc":[-85.633403,41.9391006],"version":"1","changeset":"14893110","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:29:12Z","tags":{}},"n2139858910":{"id":"n2139858910","loc":[-85.6332973,41.9393967],"version":"1","changeset":"14893110","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:29:12Z","tags":{}},"n2139858911":{"id":"n2139858911","loc":[-85.633205,41.9396742],"version":"1","changeset":"14893110","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:29:12Z","tags":{}},"n2139858912":{"id":"n2139858912","loc":[-85.6332203,41.9397772],"version":"1","changeset":"14893110","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:29:12Z","tags":{}},"n2139858913":{"id":"n2139858913","loc":[-85.6333453,41.939936],"version":"1","changeset":"14893110","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:29:12Z","tags":{}},"n2139858914":{"id":"n2139858914","loc":[-85.6333761,41.9400018],"version":"1","changeset":"14893110","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:29:12Z","tags":{}},"n2139858915":{"id":"n2139858915","loc":[-85.63328,41.9402249],"version":"1","changeset":"14893110","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:29:12Z","tags":{}},"n2139858916":{"id":"n2139858916","loc":[-85.6332357,41.9403523],"version":"1","changeset":"14893110","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:29:12Z","tags":{}},"n2139858917":{"id":"n2139858917","loc":[-85.6332838,41.9405831],"version":"1","changeset":"14893110","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:29:12Z","tags":{}},"n2139858918":{"id":"n2139858918","loc":[-85.6333643,41.9408744],"version":"1","changeset":"14893110","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:29:12Z","tags":{}},"n2139858919":{"id":"n2139858919","loc":[-85.6334394,41.9410519],"version":"1","changeset":"14893110","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:29:12Z","tags":{}},"n2139858920":{"id":"n2139858920","loc":[-85.6335815,41.9411717],"version":"1","changeset":"14893110","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:29:12Z","tags":{}},"n2139858921":{"id":"n2139858921","loc":[-85.6337478,41.9412734],"version":"1","changeset":"14893110","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:29:12Z","tags":{}},"n2139858922":{"id":"n2139858922","loc":[-85.6343174,41.9415268],"version":"1","changeset":"14893110","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:29:12Z","tags":{}},"n2139858923":{"id":"n2139858923","loc":[-85.6343886,41.9417397],"version":"1","changeset":"14893110","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:29:12Z","tags":{}},"n2139858924":{"id":"n2139858924","loc":[-85.6344407,41.9418015],"version":"1","changeset":"14893110","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:29:12Z","tags":{}},"n2139858925":{"id":"n2139858925","loc":[-85.6345139,41.9418366],"version":"1","changeset":"14893110","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:29:12Z","tags":{}},"n2139858926":{"id":"n2139858926","loc":[-85.6344846,41.942005],"version":"1","changeset":"14893110","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:29:12Z","tags":{}},"n2139858927":{"id":"n2139858927","loc":[-85.6345775,41.9422218],"version":"1","changeset":"14893110","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:29:12Z","tags":{}},"n2139858928":{"id":"n2139858928","loc":[-85.6348771,41.9427814],"version":"1","changeset":"14893110","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:29:12Z","tags":{}},"n2139858929":{"id":"n2139858929","loc":[-85.6349487,41.9427995],"version":"1","changeset":"14893110","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:29:12Z","tags":{}},"n2139858930":{"id":"n2139858930","loc":[-85.6350415,41.9427874],"version":"1","changeset":"14893110","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:29:12Z","tags":{}},"n2139858931":{"id":"n2139858931","loc":[-85.6351246,41.9428589],"version":"1","changeset":"14893110","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:29:12Z","tags":{}},"n2139858978":{"id":"n2139858978","loc":[-85.6349658,41.9431481],"version":"1","changeset":"14893110","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:29:13Z","tags":{}},"n2139858979":{"id":"n2139858979","loc":[-85.6350081,41.9431287],"version":"1","changeset":"14893110","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:29:13Z","tags":{}},"n2139858980":{"id":"n2139858980","loc":[-85.6349967,41.9430997],"version":"1","changeset":"14893110","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:29:13Z","tags":{}},"n2139858981":{"id":"n2139858981","loc":[-85.6352158,41.9430352],"version":"1","changeset":"14893110","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:29:13Z","tags":{}},"n2139858982":{"id":"n2139858982","loc":[-85.6348174,41.94267],"version":"1","changeset":"14893110","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:29:13Z","tags":{}},"n2139858983":{"id":"n2139858983","loc":[-85.6346142,41.9425989],"version":"1","changeset":"14893110","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:29:13Z","tags":{}},"n2139858984":{"id":"n2139858984","loc":[-85.6344938,41.9423809],"version":"1","changeset":"14893110","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:29:13Z","tags":{}},"n2139858985":{"id":"n2139858985","loc":[-85.6344856,41.9422997],"version":"1","changeset":"14893110","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:29:13Z","tags":{}},"n2139870380":{"id":"n2139870380","loc":[-85.6346707,41.9417955],"version":"1","changeset":"14893310","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:47:00Z","tags":{}},"n2139870381":{"id":"n2139870381","loc":[-85.6345949,41.9418311],"version":"1","changeset":"14893310","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:47:00Z","tags":{}},"n2139870382":{"id":"n2139870382","loc":[-85.6343322,41.9418659],"version":"1","changeset":"14893310","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:47:00Z","tags":{}},"n2139870383":{"id":"n2139870383","loc":[-85.6342072,41.941885],"version":"1","changeset":"14893310","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:47:00Z","tags":{}},"n2139870384":{"id":"n2139870384","loc":[-85.6341325,41.9418919],"version":"1","changeset":"14893310","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:47:00Z","tags":{}},"n2139870385":{"id":"n2139870385","loc":[-85.6341314,41.9422028],"version":"1","changeset":"14893310","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:47:00Z","tags":{}},"n2139870386":{"id":"n2139870386","loc":[-85.6340472,41.9423271],"version":"1","changeset":"14893310","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:47:00Z","tags":{}},"n2139870387":{"id":"n2139870387","loc":[-85.6342185,41.9427933],"version":"1","changeset":"14893310","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:47:00Z","tags":{}},"n2139870388":{"id":"n2139870388","loc":[-85.6340605,41.9423924],"version":"1","changeset":"14893310","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:47:00Z","tags":{}},"n2139870389":{"id":"n2139870389","loc":[-85.6339889,41.9424069],"version":"1","changeset":"14893310","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:47:00Z","tags":{}},"n2139870390":{"id":"n2139870390","loc":[-85.633971,41.942356],"version":"1","changeset":"14893310","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:47:00Z","tags":{}},"n2139870391":{"id":"n2139870391","loc":[-85.63361,41.9424235],"version":"1","changeset":"14893310","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:47:00Z","tags":{}},"n2139870392":{"id":"n2139870392","loc":[-85.6337137,41.9426819],"version":"1","changeset":"14893310","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:47:00Z","tags":{}},"n2139870393":{"id":"n2139870393","loc":[-85.6336977,41.9428632],"version":"1","changeset":"14893310","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:47:00Z","tags":{}},"n2139870394":{"id":"n2139870394","loc":[-85.6338823,41.9428647],"version":"1","changeset":"14893310","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:47:00Z","tags":{}},"n2139870395":{"id":"n2139870395","loc":[-85.6339412,41.9430069],"version":"1","changeset":"14893310","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:47:00Z","tags":{}},"n2139870396":{"id":"n2139870396","loc":[-85.6338873,41.9430353],"version":"1","changeset":"14893310","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:47:00Z","tags":{}},"n2139870397":{"id":"n2139870397","loc":[-85.6337676,41.942815],"version":"1","changeset":"14893310","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:47:00Z","tags":{}},"n2139870398":{"id":"n2139870398","loc":[-85.6336822,41.9423505],"version":"1","changeset":"14893310","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:47:00Z","tags":{}},"n2139870399":{"id":"n2139870399","loc":[-85.634037,41.9422725],"version":"1","changeset":"14893310","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:47:00Z","tags":{}},"n2139870400":{"id":"n2139870400","loc":[-85.6340294,41.9422518],"version":"1","changeset":"14893310","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:47:00Z","tags":{}},"n2139870401":{"id":"n2139870401","loc":[-85.6336726,41.9423312],"version":"1","changeset":"14893310","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:47:00Z","tags":{}},"n2139870402":{"id":"n2139870402","loc":[-85.6342188,41.9425715],"version":"1","changeset":"14893310","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:47:00Z","tags":{}},"n2139870403":{"id":"n2139870403","loc":[-85.6342524,41.942565],"version":"1","changeset":"14893310","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:47:00Z","tags":{}},"n2139870404":{"id":"n2139870404","loc":[-85.6341438,41.942299],"version":"1","changeset":"14893310","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:47:00Z","tags":{}},"n2139870405":{"id":"n2139870405","loc":[-85.6341149,41.9423061],"version":"1","changeset":"14893310","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:47:00Z","tags":{}},"n2139870407":{"id":"n2139870407","loc":[-85.6340846,41.9431458],"version":"1","changeset":"14893310","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:47:01Z","tags":{}},"n2139870408":{"id":"n2139870408","loc":[-85.6339436,41.9429032],"version":"1","changeset":"14893310","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:47:01Z","tags":{}},"n2139870409":{"id":"n2139870409","loc":[-85.6343143,41.9428207],"version":"1","changeset":"14893310","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:47:01Z","tags":{}},"n2139870410":{"id":"n2139870410","loc":[-85.6343507,41.94277],"version":"1","changeset":"14893310","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:47:01Z","tags":{}},"n2139870411":{"id":"n2139870411","loc":[-85.6341527,41.942254],"version":"1","changeset":"14893310","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:47:01Z","tags":{}},"n2139870412":{"id":"n2139870412","loc":[-85.6340925,41.9422199],"version":"1","changeset":"14893310","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:47:01Z","tags":{}},"n2139870413":{"id":"n2139870413","loc":[-85.6335435,41.9423433],"version":"1","changeset":"14893310","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:47:01Z","tags":{}},"n2139870414":{"id":"n2139870414","loc":[-85.6335023,41.9423975],"version":"1","changeset":"14893310","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:47:01Z","tags":{}},"n2139870415":{"id":"n2139870415","loc":[-85.6335086,41.9424552],"version":"1","changeset":"14893310","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:47:01Z","tags":{}},"n2139870416":{"id":"n2139870416","loc":[-85.6336296,41.942665],"version":"1","changeset":"14893310","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:47:01Z","tags":{}},"n2139870417":{"id":"n2139870417","loc":[-85.6341396,41.9428596],"version":"1","changeset":"14893310","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:47:01Z","tags":{}},"n2139870418":{"id":"n2139870418","loc":[-85.6339701,41.9424487],"version":"1","changeset":"14893310","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:47:01Z","tags":{}},"n2139870419":{"id":"n2139870419","loc":[-85.6335514,41.9425294],"version":"1","changeset":"14893310","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:47:01Z","tags":{}},"n2139870420":{"id":"n2139870420","loc":[-85.6337406,41.9424929],"version":"1","changeset":"14893310","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:47:01Z","tags":{}},"n2139870421":{"id":"n2139870421","loc":[-85.6338939,41.9428687],"version":"1","changeset":"14893310","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:47:01Z","tags":{}},"n2139870422":{"id":"n2139870422","loc":[-85.6341323,41.9419538],"version":"1","changeset":"14893310","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:47:01Z","tags":{}},"n2139870423":{"id":"n2139870423","loc":[-85.6340321,41.9420376],"version":"1","changeset":"14893310","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:47:01Z","tags":{}},"n2139870424":{"id":"n2139870424","loc":[-85.6337648,41.942238],"version":"1","changeset":"14893310","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:47:01Z","tags":{}},"n2139870425":{"id":"n2139870425","loc":[-85.6337604,41.9422685],"version":"1","changeset":"14893310","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:47:01Z","tags":{}},"n2139870426":{"id":"n2139870426","loc":[-85.6337682,41.9422928],"version":"1","changeset":"14893310","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:47:01Z","tags":{}},"n2139870427":{"id":"n2139870427","loc":[-85.6338086,41.9423862],"version":"1","changeset":"14893310","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:47:01Z","tags":{}},"n2139870428":{"id":"n2139870428","loc":[-85.6349465,41.9416631],"version":"1","changeset":"14893310","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:47:01Z","tags":{}},"n2139870429":{"id":"n2139870429","loc":[-85.6351097,41.9416973],"version":"1","changeset":"14893310","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:47:01Z","tags":{}},"n2139870430":{"id":"n2139870430","loc":[-85.6353371,41.9416798],"version":"1","changeset":"14893310","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:47:01Z","tags":{}},"n2139870431":{"id":"n2139870431","loc":[-85.6349627,41.9422506],"version":"1","changeset":"14893310","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:47:01Z","tags":{}},"n2139870432":{"id":"n2139870432","loc":[-85.634979,41.9421815],"version":"1","changeset":"14893310","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:47:01Z","tags":{}},"n2139870433":{"id":"n2139870433","loc":[-85.634885,41.9421679],"version":"1","changeset":"14893310","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:47:01Z","tags":{}},"n2139870434":{"id":"n2139870434","loc":[-85.6348689,41.9422377],"version":"1","changeset":"14893310","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:47:01Z","tags":{}},"n2139870435":{"id":"n2139870435","loc":[-85.6349779,41.9419486],"version":"1","changeset":"14893310","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:47:01Z","tags":{}},"n2139870436":{"id":"n2139870436","loc":[-85.6349505,41.9418933],"version":"1","changeset":"14893310","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:47:01Z","tags":{}},"n2139870437":{"id":"n2139870437","loc":[-85.6347327,41.9419505],"version":"1","changeset":"14893310","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:47:01Z","tags":{}},"n2139870438":{"id":"n2139870438","loc":[-85.6347614,41.9420087],"version":"1","changeset":"14893310","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:47:01Z","tags":{}},"n2139870439":{"id":"n2139870439","loc":[-85.6351889,41.9416912],"version":"1","changeset":"14893310","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:47:01Z","tags":{}},"n2139870440":{"id":"n2139870440","loc":[-85.6351092,41.9418426],"version":"1","changeset":"14893310","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:47:01Z","tags":{}},"n2139870441":{"id":"n2139870441","loc":[-85.635086,41.9419659],"version":"1","changeset":"14893310","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:47:01Z","tags":{}},"n2139870442":{"id":"n2139870442","loc":[-85.6350584,41.9421466],"version":"1","changeset":"14893310","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:47:01Z","tags":{}},"n2139870443":{"id":"n2139870443","loc":[-85.6350993,41.9421606],"version":"1","changeset":"14893310","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:47:01Z","tags":{}},"n2139870444":{"id":"n2139870444","loc":[-85.6350993,41.9422132],"version":"1","changeset":"14893310","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:47:01Z","tags":{}},"n2139870445":{"id":"n2139870445","loc":[-85.6350794,41.9422855],"version":"1","changeset":"14893310","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:47:01Z","tags":{}},"n2139870446":{"id":"n2139870446","loc":[-85.6350474,41.9423159],"version":"1","changeset":"14893310","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:47:01Z","tags":{}},"n2139870447":{"id":"n2139870447","loc":[-85.6349251,41.9422998],"version":"1","changeset":"14893310","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:47:01Z","tags":{}},"n2139870448":{"id":"n2139870448","loc":[-85.634911,41.9422755],"version":"1","changeset":"14893310","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:47:01Z","tags":{}},"n2139870449":{"id":"n2139870449","loc":[-85.6349157,41.9422553],"version":"1","changeset":"14893310","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:47:01Z","tags":{}},"n2139870450":{"id":"n2139870450","loc":[-85.6347213,41.9419324],"version":"1","changeset":"14893310","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:47:01Z","tags":{}},"n2139870451":{"id":"n2139870451","loc":[-85.6349535,41.9418771],"version":"1","changeset":"14893310","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:47:01Z","tags":{}},"n2139870452":{"id":"n2139870452","loc":[-85.6350135,41.9419421],"version":"1","changeset":"14893310","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:47:02Z","tags":{}},"n2139870453":{"id":"n2139870453","loc":[-85.6348584,41.9418997],"version":"1","changeset":"14893310","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:47:02Z","tags":{}},"n2139870454":{"id":"n2139870454","loc":[-85.6348113,41.9418101],"version":"1","changeset":"14893310","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:47:02Z","tags":{}},"n2139870455":{"id":"n2139870455","loc":[-85.6347306,41.9417449],"version":"1","changeset":"14893310","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:47:02Z","tags":{}},"n2139870456":{"id":"n2139870456","loc":[-85.6349123,41.941776],"version":"1","changeset":"14893310","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:47:02Z","tags":{}},"n2139870457":{"id":"n2139870457","loc":[-85.6349423,41.9421448],"version":"1","changeset":"14893310","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:47:02Z","tags":{}},"n2139870458":{"id":"n2139870458","loc":[-85.6349436,41.9420652],"version":"1","changeset":"14893310","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:47:02Z","tags":{}},"n2139870459":{"id":"n2139870459","loc":[-85.6349136,41.9419963],"version":"1","changeset":"14893310","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:47:02Z","tags":{}},"n2139870460":{"id":"n2139870460","loc":[-85.6349814,41.9419789],"version":"1","changeset":"14893310","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:47:02Z","tags":{}},"n2139989328":{"id":"n2139989328","loc":[-85.6334188,41.9421725],"version":"1","changeset":"14894902","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T12:02:33Z","tags":{}},"n2139989330":{"id":"n2139989330","loc":[-85.6335087,41.9416308],"version":"1","changeset":"14894902","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T12:02:33Z","tags":{}},"n2139989335":{"id":"n2139989335","loc":[-85.6336856,41.9429371],"version":"1","changeset":"14894902","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T12:02:33Z","tags":{}},"n2139989337":{"id":"n2139989337","loc":[-85.6333713,41.9427217],"version":"1","changeset":"14894902","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T12:02:33Z","tags":{}},"n2139989339":{"id":"n2139989339","loc":[-85.6332912,41.9425383],"version":"1","changeset":"14894902","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T12:02:33Z","tags":{}},"n2139989341":{"id":"n2139989341","loc":[-85.6339369,41.9409198],"version":"1","changeset":"14894902","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T12:02:33Z","tags":{}},"n2139989344":{"id":"n2139989344","loc":[-85.634097,41.9409469],"version":"1","changeset":"14894902","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T12:02:33Z","tags":{}},"n2139989346":{"id":"n2139989346","loc":[-85.634137,41.9412852],"version":"1","changeset":"14894902","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T12:02:33Z","tags":{}},"n2139989348":{"id":"n2139989348","loc":[-85.6344536,41.9414151],"version":"1","changeset":"14894902","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T12:02:33Z","tags":{}},"n2139989350":{"id":"n2139989350","loc":[-85.6350794,41.9412392],"version":"1","changeset":"14894902","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T12:02:33Z","tags":{}},"n2139989351":{"id":"n2139989351","loc":[-85.6352541,41.9409387],"version":"1","changeset":"14894902","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T12:02:33Z","tags":{}},"n2139989353":{"id":"n2139989353","loc":[-85.6357198,41.9408007],"version":"1","changeset":"14894902","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T12:02:33Z","tags":{}},"n2139989355":{"id":"n2139989355","loc":[-85.6357235,41.9427088],"version":"1","changeset":"14894902","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T12:02:33Z","tags":{}},"n2139989357":{"id":"n2139989357","loc":[-85.6337119,41.9421256],"version":"1","changeset":"14894902","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T12:02:33Z","tags":{}},"n2139989359":{"id":"n2139989359","loc":[-85.6336913,41.9420655],"version":"1","changeset":"14894902","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T12:02:33Z","tags":{}},"n2139989360":{"id":"n2139989360","loc":[-85.633582,41.9420867],"version":"1","changeset":"14894902","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T12:02:33Z","tags":{}},"n2139989362":{"id":"n2139989362","loc":[-85.6336058,41.9421491],"version":"1","changeset":"14894902","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T12:02:33Z","tags":{}},"n2139989364":{"id":"n2139989364","loc":[-85.6339685,41.9410995],"version":"1","changeset":"14894902","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T12:02:33Z","tags":{}},"n2139989366":{"id":"n2139989366","loc":[-85.6339067,41.9411383],"version":"1","changeset":"14894902","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T12:02:33Z","tags":{}},"n2139989368":{"id":"n2139989368","loc":[-85.6339685,41.9411972],"version":"1","changeset":"14894902","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T12:02:33Z","tags":{}},"n2139989370":{"id":"n2139989370","loc":[-85.6340398,41.9411619],"version":"1","changeset":"14894902","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T12:02:33Z","tags":{}},"n2139870379":{"id":"n2139870379","loc":[-85.6348391,41.9416651],"version":"2","changeset":"14894902","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T12:02:33Z","tags":{}},"n2140006363":{"id":"n2140006363","loc":[-85.6353144,41.9430345],"version":"1","changeset":"14895132","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T12:19:24Z","tags":{}},"n2140006364":{"id":"n2140006364","loc":[-85.6349191,41.9431422],"version":"1","changeset":"14895132","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T12:19:24Z","tags":{}},"n2140018997":{"id":"n2140018997","loc":[-85.63645945147184,41.942986488012565],"version":"1","changeset":"14895342","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T12:35:05Z","tags":{"amenity":"townhall","name":"Three Rivers City Hall"}},"n2140018998":{"id":"n2140018998","loc":[-85.6370319,41.9427919],"version":"1","changeset":"14895342","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T12:35:05Z","tags":{}},"n2140018999":{"id":"n2140018999","loc":[-85.6360687,41.9427808],"version":"1","changeset":"14895342","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T12:35:05Z","tags":{}},"n2199856288":{"id":"n2199856288","loc":[-85.6344968,41.9407307],"version":"1","changeset":"15353718","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T16:29:46Z","tags":{}},"n2199856289":{"id":"n2199856289","loc":[-85.634492,41.9406036],"version":"1","changeset":"15353718","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T16:29:46Z","tags":{}},"n2199856290":{"id":"n2199856290","loc":[-85.634891,41.9406001],"version":"1","changeset":"15353718","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T16:29:46Z","tags":{}},"n2199856291":{"id":"n2199856291","loc":[-85.6348894,41.9405288],"version":"1","changeset":"15353718","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T16:29:46Z","tags":{}},"n2199856292":{"id":"n2199856292","loc":[-85.6349166,41.94053],"version":"1","changeset":"15353718","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T16:29:46Z","tags":{}},"n2199856293":{"id":"n2199856293","loc":[-85.6349166,41.9404956],"version":"1","changeset":"15353718","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T16:29:46Z","tags":{}},"n2199856294":{"id":"n2199856294","loc":[-85.6350219,41.9404956],"version":"1","changeset":"15353718","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T16:29:46Z","tags":{}},"n2199856295":{"id":"n2199856295","loc":[-85.6350251,41.94053],"version":"1","changeset":"15353718","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T16:29:46Z","tags":{}},"n2199856296":{"id":"n2199856296","loc":[-85.6350538,41.9405288],"version":"1","changeset":"15353718","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T16:29:46Z","tags":{}},"n2199856297":{"id":"n2199856297","loc":[-85.6350602,41.94079],"version":"1","changeset":"15353718","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T16:29:46Z","tags":{}},"n2199856298":{"id":"n2199856298","loc":[-85.6351703,41.9407912],"version":"1","changeset":"15353718","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T16:29:46Z","tags":{}},"n2199856299":{"id":"n2199856299","loc":[-85.6351688,41.9409171],"version":"1","changeset":"15353718","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T16:29:46Z","tags":{}},"n2199856300":{"id":"n2199856300","loc":[-85.6347889,41.9409135],"version":"1","changeset":"15353718","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T16:29:46Z","tags":{}},"n2199856301":{"id":"n2199856301","loc":[-85.6347921,41.94079],"version":"1","changeset":"15353718","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T16:29:46Z","tags":{}},"n2199856302":{"id":"n2199856302","loc":[-85.6348942,41.9407888],"version":"1","changeset":"15353718","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T16:29:46Z","tags":{}},"n2199856303":{"id":"n2199856303","loc":[-85.6348926,41.9407283],"version":"1","changeset":"15353718","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T16:29:46Z","tags":{}},"n185951869":{"id":"n185951869","loc":[-85.6387639,41.957288],"version":"3","changeset":"14676554","user":"bbmiller","uid":"451048","visible":"true","timestamp":"2013-01-16T20:05:17Z","tags":{}},"n185958643":{"id":"n185958643","loc":[-85.636746,41.929221],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T04:58:30Z","tags":{}},"n185958645":{"id":"n185958645","loc":[-85.636791,41.929363],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T04:58:30Z","tags":{}},"n185958647":{"id":"n185958647","loc":[-85.6375975,41.9314987],"version":"3","changeset":"12170230","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:56:55Z","tags":{}},"n185958649":{"id":"n185958649","loc":[-85.637669,41.931667],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T04:58:30Z","tags":{}},"n185958651":{"id":"n185958651","loc":[-85.637728,41.931901],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T04:58:30Z","tags":{}},"n185958653":{"id":"n185958653","loc":[-85.637724,41.932187],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T04:58:30Z","tags":{}},"n185958656":{"id":"n185958656","loc":[-85.637732,41.932761],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T04:58:30Z","tags":{}},"n185958658":{"id":"n185958658","loc":[-85.637688,41.93398],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T04:58:30Z","tags":{}},"n185958660":{"id":"n185958660","loc":[-85.637685,41.934223],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T04:58:30Z","tags":{}},"n185958662":{"id":"n185958662","loc":[-85.6376468,41.9350232],"version":"3","changeset":"12170230","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:56:55Z","tags":{}},"n185958664":{"id":"n185958664","loc":[-85.637564,41.937028],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T04:58:30Z","tags":{}},"n185958666":{"id":"n185958666","loc":[-85.637458,41.938197],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T04:58:30Z","tags":{}},"n185958668":{"id":"n185958668","loc":[-85.637424,41.938692],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T04:58:30Z","tags":{}},"n185964972":{"id":"n185964972","loc":[-85.6341901,41.9432732],"version":"3","changeset":"9619138","user":"bbmiller","uid":"451048","visible":"true","timestamp":"2011-10-21T19:46:00Z","tags":{}},"n185971361":{"id":"n185971361","loc":[-85.635762,41.938208],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:05:01Z","tags":{}},"n185971364":{"id":"n185971364","loc":[-85.635732,41.9384],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:05:01Z","tags":{}},"n185971366":{"id":"n185971366","loc":[-85.635736,41.938697],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:05:01Z","tags":{}},"n185972775":{"id":"n185972775","loc":[-85.635638,42.070357],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:05:36Z","tags":{}},"n185972777":{"id":"n185972777","loc":[-85.635724,42.069929],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:05:36Z","tags":{}},"n185972779":{"id":"n185972779","loc":[-85.635804,42.069248],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:05:36Z","tags":{}},"n185972781":{"id":"n185972781","loc":[-85.635869,42.068361],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:05:36Z","tags":{}},"n185972783":{"id":"n185972783","loc":[-85.635883,42.067582],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:05:36Z","tags":{}},"n185972785":{"id":"n185972785","loc":[-85.635875,42.067114],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:05:36Z","tags":{}},"n185972787":{"id":"n185972787","loc":[-85.635778,42.065359],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:05:36Z","tags":{}},"n185972788":{"id":"n185972788","loc":[-85.635728,42.063416],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:05:36Z","tags":{}},"n185972789":{"id":"n185972789","loc":[-85.635665,42.062491],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:05:36Z","tags":{}},"n185972790":{"id":"n185972790","loc":[-85.635617,42.061928],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:05:36Z","tags":{}},"n185972791":{"id":"n185972791","loc":[-85.635614,42.061898],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:05:36Z","tags":{}},"n185972793":{"id":"n185972793","loc":[-85.635379,42.060288],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:05:36Z","tags":{}},"n185972795":{"id":"n185972795","loc":[-85.635092,42.05799],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:05:36Z","tags":{}},"n185972797":{"id":"n185972797","loc":[-85.634843,42.055781],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:05:36Z","tags":{}},"n185972798":{"id":"n185972798","loc":[-85.634817,42.055549],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:05:36Z","tags":{}},"n185972800":{"id":"n185972800","loc":[-85.634708,42.053942],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:05:37Z","tags":{}},"n185972802":{"id":"n185972802","loc":[-85.634447,42.051809],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:05:37Z","tags":{}},"n185972805":{"id":"n185972805","loc":[-85.634241,42.04946],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:05:37Z","tags":{}},"n185972807":{"id":"n185972807","loc":[-85.633787,42.045926],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:05:37Z","tags":{}},"n185972809":{"id":"n185972809","loc":[-85.633811,42.045645],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:05:37Z","tags":{}},"n185972811":{"id":"n185972811","loc":[-85.63373,42.043626],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:05:37Z","tags":{}},"n185972813":{"id":"n185972813","loc":[-85.633698,42.042184],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:05:37Z","tags":{}},"n185972814":{"id":"n185972814","loc":[-85.63369,42.04181],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:05:37Z","tags":{}},"n185972815":{"id":"n185972815","loc":[-85.633681,42.040714],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:05:37Z","tags":{}},"n185972816":{"id":"n185972816","loc":[-85.633571,42.036322],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:05:37Z","tags":{}},"n185972817":{"id":"n185972817","loc":[-85.633537,42.034044],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:05:37Z","tags":{}},"n185972819":{"id":"n185972819","loc":[-85.633481,42.030785],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:05:37Z","tags":{}},"n185972821":{"id":"n185972821","loc":[-85.633452,42.027538],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:05:37Z","tags":{}},"n185972824":{"id":"n185972824","loc":[-85.633438,42.027427],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:05:37Z","tags":{}},"n185972826":{"id":"n185972826","loc":[-85.633342,42.022656],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:05:37Z","tags":{}},"n185972830":{"id":"n185972830","loc":[-85.63327,42.020724],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:05:37Z","tags":{}},"n185972832":{"id":"n185972832","loc":[-85.633198,42.019106],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:05:37Z","tags":{}},"n185972834":{"id":"n185972834","loc":[-85.633249,42.018363],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:05:37Z","tags":{}},"n185972835":{"id":"n185972835","loc":[-85.633139,42.012944],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:05:37Z","tags":{}},"n185972836":{"id":"n185972836","loc":[-85.63309,42.008284],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:05:38Z","tags":{}},"n185972839":{"id":"n185972839","loc":[-85.63298,42.00005],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:05:38Z","tags":{}},"n185972845":{"id":"n185972845","loc":[-85.6325369,41.9764959],"version":"3","changeset":"14676554","user":"bbmiller","uid":"451048","visible":"true","timestamp":"2013-01-16T20:05:17Z","tags":{}},"n185972847":{"id":"n185972847","loc":[-85.6327549,41.9750005],"version":"4","changeset":"14676554","user":"bbmiller","uid":"451048","visible":"true","timestamp":"2013-01-16T20:05:17Z","tags":{}},"n185972849":{"id":"n185972849","loc":[-85.6329374,41.9742527],"version":"4","changeset":"14676554","user":"bbmiller","uid":"451048","visible":"true","timestamp":"2013-01-16T20:05:17Z","tags":{}},"n185972851":{"id":"n185972851","loc":[-85.6331387,41.9736039],"version":"3","changeset":"14676554","user":"bbmiller","uid":"451048","visible":"true","timestamp":"2013-01-16T20:05:17Z","tags":{}},"n185972862":{"id":"n185972862","loc":[-85.6383589,41.9585023],"version":"4","changeset":"14676554","user":"bbmiller","uid":"451048","visible":"true","timestamp":"2013-01-16T20:05:17Z","tags":{}},"n185972868":{"id":"n185972868","loc":[-85.6393633,41.9551716],"version":"3","changeset":"9619138","user":"bbmiller","uid":"451048","visible":"true","timestamp":"2011-10-21T19:54:55Z","tags":{}},"n185972878":{"id":"n185972878","loc":[-85.639377,41.95335],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:05:39Z","tags":{}},"n185972882":{"id":"n185972882","loc":[-85.6389179,41.9516944],"version":"3","changeset":"9619138","user":"bbmiller","uid":"451048","visible":"true","timestamp":"2011-10-21T19:54:55Z","tags":{}},"n185972885":{"id":"n185972885","loc":[-85.6387444,41.9512105],"version":"3","changeset":"9619138","user":"bbmiller","uid":"451048","visible":"true","timestamp":"2011-10-21T19:54:55Z","tags":{}},"n185972891":{"id":"n185972891","loc":[-85.636421,41.946392],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:05:39Z","tags":{}},"n185972895":{"id":"n185972895","loc":[-85.635965,41.945809],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:05:39Z","tags":{}},"n185972897":{"id":"n185972897","loc":[-85.635683,41.945449],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:05:39Z","tags":{}},"n185972899":{"id":"n185972899","loc":[-85.635281,41.9450252],"version":"3","changeset":"9619138","user":"bbmiller","uid":"451048","visible":"true","timestamp":"2011-10-21T19:45:59Z","tags":{}},"n185972905":{"id":"n185972905","loc":[-85.6324428,41.9425743],"version":"3","changeset":"9619138","user":"bbmiller","uid":"451048","visible":"true","timestamp":"2011-10-21T19:46:00Z","tags":{}},"n185985217":{"id":"n185985217","loc":[-85.638243,41.943674],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:12:20Z","tags":{}},"n185985219":{"id":"n185985219","loc":[-85.638228,41.943747],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:12:20Z","tags":{}},"n185985221":{"id":"n185985221","loc":[-85.638163,41.943797],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:12:20Z","tags":{}},"n185985222":{"id":"n185985222","loc":[-85.638089,41.943832],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:12:20Z","tags":{}},"n185985223":{"id":"n185985223","loc":[-85.637969,41.943841],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:12:20Z","tags":{}},"n185985225":{"id":"n185985225","loc":[-85.637841,41.943833],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:12:20Z","tags":{}},"n185985227":{"id":"n185985227","loc":[-85.637601,41.943789],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:12:20Z","tags":{}},"n185985229":{"id":"n185985229","loc":[-85.637449,41.943754],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:12:20Z","tags":{}},"n185985231":{"id":"n185985231","loc":[-85.637342,41.943734],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:12:20Z","tags":{}},"n185985233":{"id":"n185985233","loc":[-85.637218,41.943703],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:12:21Z","tags":{}},"n185985235":{"id":"n185985235","loc":[-85.637151,41.943663],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:12:21Z","tags":{}},"n185985238":{"id":"n185985238","loc":[-85.637118,41.943615],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:12:21Z","tags":{}},"n185985240":{"id":"n185985240","loc":[-85.637073,41.943494],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:12:21Z","tags":{}},"n185990434":{"id":"n185990434","loc":[-85.6329028,41.9984292],"version":"3","changeset":"14676554","user":"bbmiller","uid":"451048","visible":"true","timestamp":"2013-01-16T20:05:18Z","tags":{"railway":"level_crossing"}},"n1475284023":{"id":"n1475284023","loc":[-85.6336163,41.9435806],"version":"1","changeset":"9619138","user":"bbmiller","uid":"451048","visible":"true","timestamp":"2011-10-21T19:45:47Z","tags":{"railway":"level_crossing"}},"n1475293222":{"id":"n1475293222","loc":[-85.6394045,41.953658],"version":"1","changeset":"9619138","user":"bbmiller","uid":"451048","visible":"true","timestamp":"2011-10-21T19:54:50Z","tags":{"railway":"level_crossing"}},"n1475293226":{"id":"n1475293226","loc":[-85.6364975,41.9638663],"version":"1","changeset":"9619138","user":"bbmiller","uid":"451048","visible":"true","timestamp":"2011-10-21T19:54:50Z","tags":{"railway":"level_crossing"}},"n1475293234":{"id":"n1475293234","loc":[-85.6390449,41.9565145],"version":"1","changeset":"9619138","user":"bbmiller","uid":"451048","visible":"true","timestamp":"2011-10-21T19:54:51Z","tags":{}},"n1475293240":{"id":"n1475293240","loc":[-85.636943,41.9473114],"version":"1","changeset":"9619138","user":"bbmiller","uid":"451048","visible":"true","timestamp":"2011-10-21T19:54:51Z","tags":{}},"n1475293252":{"id":"n1475293252","loc":[-85.6392115,41.9559003],"version":"1","changeset":"9619138","user":"bbmiller","uid":"451048","visible":"true","timestamp":"2011-10-21T19:54:51Z","tags":{}},"n1475293254":{"id":"n1475293254","loc":[-85.6348931,41.9685127],"version":"1","changeset":"9619138","user":"bbmiller","uid":"451048","visible":"true","timestamp":"2011-10-21T19:54:51Z","tags":{"railway":"level_crossing"}},"n1475293260":{"id":"n1475293260","loc":[-85.6375999,41.9485401],"version":"1","changeset":"9619138","user":"bbmiller","uid":"451048","visible":"true","timestamp":"2011-10-21T19:54:52Z","tags":{}},"n1475293261":{"id":"n1475293261","loc":[-85.6391256,41.9523817],"version":"1","changeset":"9619138","user":"bbmiller","uid":"451048","visible":"true","timestamp":"2011-10-21T19:54:52Z","tags":{"railway":"level_crossing"}},"n1475293264":{"id":"n1475293264","loc":[-85.6394155,41.9546493],"version":"1","changeset":"9619138","user":"bbmiller","uid":"451048","visible":"true","timestamp":"2011-10-21T19:54:52Z","tags":{"railway":"level_crossing"}},"n1819805614":{"id":"n1819805614","loc":[-85.6345652,41.9363097],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:08:25Z","tags":{}},"n1819805618":{"id":"n1819805618","loc":[-85.6295334,41.9426862],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:08:25Z","tags":{}},"n1819805622":{"id":"n1819805622","loc":[-85.6308208,41.9430773],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:08:25Z","tags":{}},"n1819805626":{"id":"n1819805626","loc":[-85.6274734,41.9406592],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:08:25Z","tags":{}},"n1819805629":{"id":"n1819805629","loc":[-85.6296943,41.9430533],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:08:25Z","tags":{}},"n1819805632":{"id":"n1819805632","loc":[-85.6340931,41.9354477],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:08:25Z","tags":{}},"n1819805636":{"id":"n1819805636","loc":[-85.6304131,41.9436598],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:08:25Z","tags":{}},"n1819805639":{"id":"n1819805639","loc":[-85.6304882,41.9426623],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:08:25Z","tags":{}},"n1819805641":{"id":"n1819805641","loc":[-85.6336103,41.9367487],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:08:26Z","tags":{}},"n1819805643":{"id":"n1819805643","loc":[-85.6300376,41.9418084],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:08:26Z","tags":{}},"n1819805645":{"id":"n1819805645","loc":[-85.6365286,41.9336679],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:08:26Z","tags":{}},"n1819805647":{"id":"n1819805647","loc":[-85.632016,41.9429221],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:08:26Z","tags":{}},"n1819805666":{"id":"n1819805666","loc":[-85.6314753,41.9442663],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:08:26Z","tags":{}},"n1819805669":{"id":"n1819805669","loc":[-85.6268619,41.9402203],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:08:26Z","tags":{}},"n1819805673":{"id":"n1819805673","loc":[-85.6296728,41.9412099],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:08:26Z","tags":{}},"n1819805676":{"id":"n1819805676","loc":[-85.6354557,41.932766],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:08:26Z","tags":{}},"n1819805680":{"id":"n1819805680","loc":[-85.632752,41.9431012],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:08:26Z","tags":{}},"n1819805683":{"id":"n1819805683","loc":[-85.631147,41.9432014],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:08:26Z","tags":{}},"n1819805687":{"id":"n1819805687","loc":[-85.635284,41.9343942],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:08:26Z","tags":{}},"n1819805690":{"id":"n1819805690","loc":[-85.6249736,41.9405794],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:08:26Z","tags":{}},"n1819805694":{"id":"n1819805694","loc":[-85.6294153,41.9417925],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:08:26Z","tags":{}},"n1819805698":{"id":"n1819805698","loc":[-85.6323486,41.9426986],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:08:26Z","tags":{}},"n1819805702":{"id":"n1819805702","loc":[-85.6340287,41.9373871],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:08:26Z","tags":{}},"n1819805707":{"id":"n1819805707","loc":[-85.6353698,41.9316326],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:08:26Z","tags":{}},"n1819805711":{"id":"n1819805711","loc":[-85.6284176,41.940356],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:08:26Z","tags":{}},"n1819805715":{"id":"n1819805715","loc":[-85.6291471,41.9412897],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:08:26Z","tags":{}},"n1819805718":{"id":"n1819805718","loc":[-85.6311105,41.943979],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:08:26Z","tags":{}},"n1819805722":{"id":"n1819805722","loc":[-85.6320868,41.9400128],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:08:26Z","tags":{}},"n1819805724":{"id":"n1819805724","loc":[-85.635166,41.9324627],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:08:26Z","tags":{}},"n1819805727":{"id":"n1819805727","loc":[-85.6344686,41.9350567],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:08:26Z","tags":{}},"n1819805728":{"id":"n1819805728","loc":[-85.6357132,41.9332369],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:08:26Z","tags":{}},"n1819805731":{"id":"n1819805731","loc":[-85.629984,41.9434444],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:08:26Z","tags":{}},"n1819805760":{"id":"n1819805760","loc":[-85.6330996,41.9378784],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:08:27Z","tags":{}},"n1819805766":{"id":"n1819805766","loc":[-85.625274,41.9411141],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:08:27Z","tags":{}},"n1819805770":{"id":"n1819805770","loc":[-85.6326321,41.9412173],"version":"2","changeset":"14894784","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T11:53:28Z","tags":{}},"n1819805774":{"id":"n1819805774","loc":[-85.6347047,41.9312096],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:08:27Z","tags":{}},"n1819805777":{"id":"n1819805777","loc":[-85.6363569,41.9339552],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:08:27Z","tags":{}},"n1819805780":{"id":"n1819805780","loc":[-85.6327392,41.941926],"version":"2","changeset":"14894784","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T11:53:28Z","tags":{}},"n1819805783":{"id":"n1819805783","loc":[-85.6357239,41.9338435],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:08:27Z","tags":{}},"n1819805786":{"id":"n1819805786","loc":[-85.6356595,41.9346576],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:08:27Z","tags":{}},"n1819805789":{"id":"n1819805789","loc":[-85.6316469,41.9436598],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:08:27Z","tags":{}},"n1819805792":{"id":"n1819805792","loc":[-85.6350587,41.9354557],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:08:27Z","tags":{}},"n1819805795":{"id":"n1819805795","loc":[-85.6360028,41.9322791],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:08:27Z","tags":{}},"n1819805798":{"id":"n1819805798","loc":[-85.63125,41.9443062],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:08:27Z","tags":{}},"n1819805802":{"id":"n1819805802","loc":[-85.6263362,41.9408109],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:08:27Z","tags":{}},"n1819805805":{"id":"n1819805805","loc":[-85.6315075,41.9438753],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:08:27Z","tags":{}},"n1819805808":{"id":"n1819805808","loc":[-85.6340008,41.9316051],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:08:27Z","tags":{}},"n1819805810":{"id":"n1819805810","loc":[-85.6345545,41.9320557],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:08:27Z","tags":{}},"n1819805812":{"id":"n1819805812","loc":[-85.6250809,41.9408587],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:08:27Z","tags":{}},"n1819805814":{"id":"n1819805814","loc":[-85.6257783,41.9400926],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:08:27Z","tags":{}},"n1819805834":{"id":"n1819805834","loc":[-85.6326408,41.9424363],"version":"2","changeset":"14894784","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T11:53:28Z","tags":{}},"n1819805838":{"id":"n1819805838","loc":[-85.6365607,41.9334365],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:08:27Z","tags":{}},"n1819805842":{"id":"n1819805842","loc":[-85.6288253,41.9410343],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:08:27Z","tags":{}},"n1819805846":{"id":"n1819805846","loc":[-85.6279133,41.9402921],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:08:27Z","tags":{}},"n1819805849":{"id":"n1819805849","loc":[-85.6289433,41.9405156],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:08:28Z","tags":{}},"n1819805852":{"id":"n1819805852","loc":[-85.6313787,41.9439152],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:08:28Z","tags":{}},"n1819805858":{"id":"n1819805858","loc":[-85.6300805,41.9420398],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:08:28Z","tags":{}},"n1819805861":{"id":"n1819805861","loc":[-85.6321941,41.9396297],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:08:28Z","tags":{}},"n1819805864":{"id":"n1819805864","loc":[-85.6329129,41.9393903],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:08:28Z","tags":{}},"n1819805868":{"id":"n1819805868","loc":[-85.632001,41.9434922],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:08:28Z","tags":{}},"n1819805870":{"id":"n1819805870","loc":[-85.6314903,41.9431535],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:08:28Z","tags":{}},"n1819805873":{"id":"n1819805873","loc":[-85.6251667,41.9401166],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:08:28Z","tags":{}},"n1819805876":{"id":"n1819805876","loc":[-85.63287,41.939941],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:08:28Z","tags":{}},"n1819805878":{"id":"n1819805878","loc":[-85.6307886,41.9437317],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:08:28Z","tags":{}},"n1819805880":{"id":"n1819805880","loc":[-85.6321727,41.940348],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:08:28Z","tags":{}},"n1819805883":{"id":"n1819805883","loc":[-85.6265872,41.940113],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:08:28Z","tags":{}},"n1819805885":{"id":"n1819805885","loc":[-85.6268404,41.9406672],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:08:28Z","tags":{}},"n1819805887":{"id":"n1819805887","loc":[-85.6325267,41.9389035],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:08:28Z","tags":{}},"n1819805889":{"id":"n1819805889","loc":[-85.6364964,41.933189],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:08:28Z","tags":{}},"n1819805911":{"id":"n1819805911","loc":[-85.6248663,41.9401804],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:08:28Z","tags":{}},"n1819805922":{"id":"n1819805922","loc":[-85.633267,41.9387199],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:08:28Z","tags":{}},"n1819805925":{"id":"n1819805925","loc":[-85.6293402,41.9408428],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:08:28Z","tags":{}},"n1819848849":{"id":"n1819848849","loc":[-85.6464957,41.9695178],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:49Z","tags":{}},"n1819848850":{"id":"n1819848850","loc":[-85.6497642,41.9611355],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:49Z","tags":{}},"n1819848851":{"id":"n1819848851","loc":[-85.6480943,41.9624818],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:49Z","tags":{}},"n1819848854":{"id":"n1819848854","loc":[-85.6500362,41.9657367],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:49Z","tags":{}},"n1819848855":{"id":"n1819848855","loc":[-85.6493673,41.9783496],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:49Z","tags":{}},"n1819848856":{"id":"n1819848856","loc":[-85.6457409,41.9548007],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:49Z","tags":{}},"n1819848857":{"id":"n1819848857","loc":[-85.651313,41.9760426],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:49Z","tags":{}},"n1819848858":{"id":"n1819848858","loc":[-85.6495819,41.9784772],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:49Z","tags":{}},"n1819848859":{"id":"n1819848859","loc":[-85.6495105,41.9833722],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:49Z","tags":{}},"n1819848860":{"id":"n1819848860","loc":[-85.6405053,41.9492792],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:49Z","tags":{}},"n1819848863":{"id":"n1819848863","loc":[-85.6502293,41.9786826],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:49Z","tags":{}},"n1819848865":{"id":"n1819848865","loc":[-85.6406877,41.9495106],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:49Z","tags":{}},"n1819848870":{"id":"n1819848870","loc":[-85.6493136,41.9704611],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:49Z","tags":{}},"n1819848871":{"id":"n1819848871","loc":[-85.6372249,41.9441284],"version":"2","changeset":"12170230","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:56:57Z","tags":{}},"n1819848873":{"id":"n1819848873","loc":[-85.6512379,41.9659441],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:49Z","tags":{}},"n1819848875":{"id":"n1819848875","loc":[-85.6508087,41.9650187],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:49Z","tags":{}},"n1819848877":{"id":"n1819848877","loc":[-85.6487166,41.9605352],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:49Z","tags":{}},"n1819848878":{"id":"n1819848878","loc":[-85.6506478,41.9760665],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:49Z","tags":{}},"n1819848879":{"id":"n1819848879","loc":[-85.651431,41.9758512],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:49Z","tags":{}},"n1819848886":{"id":"n1819848886","loc":[-85.6477617,41.9563945],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:49Z","tags":{}},"n1819848889":{"id":"n1819848889","loc":[-85.6497895,41.9832286],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:50Z","tags":{}},"n1819848892":{"id":"n1819848892","loc":[-85.6504868,41.9791931],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:50Z","tags":{}},"n1819848893":{"id":"n1819848893","loc":[-85.6498002,41.9615085],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:50Z","tags":{}},"n1819848894":{"id":"n1819848894","loc":[-85.6404302,41.9502846],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:50Z","tags":{}},"n1819848901":{"id":"n1819848901","loc":[-85.6354412,41.9439886],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:50Z","tags":{}},"n1819848903":{"id":"n1819848903","loc":[-85.6472145,41.9698528],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:50Z","tags":{}},"n1819848904":{"id":"n1819848904","loc":[-85.6401979,41.9486233],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:50Z","tags":{}},"n1819848905":{"id":"n1819848905","loc":[-85.6475042,41.963503],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:50Z","tags":{}},"n1819848909":{"id":"n1819848909","loc":[-85.6343405,41.94358],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:50Z","tags":{}},"n1819848914":{"id":"n1819848914","loc":[-85.6503474,41.9737773],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:50Z","tags":{}},"n1819848915":{"id":"n1819848915","loc":[-85.6389533,41.9470992],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:50Z","tags":{}},"n1819848916":{"id":"n1819848916","loc":[-85.6483625,41.9577907],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:50Z","tags":{}},"n1819848917":{"id":"n1819848917","loc":[-85.6484768,41.9617419],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:50Z","tags":{}},"n1819848918":{"id":"n1819848918","loc":[-85.644078,41.9545693],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:50Z","tags":{}},"n1819848919":{"id":"n1819848919","loc":[-85.6437169,41.9543041],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:50Z","tags":{}},"n1819848920":{"id":"n1819848920","loc":[-85.6478331,41.9627949],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:50Z","tags":{}},"n1819848922":{"id":"n1819848922","loc":[-85.6499144,41.9785889],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:50Z","tags":{}},"n1819848924":{"id":"n1819848924","loc":[-85.647633,41.9720066],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:51Z","tags":{}},"n1819848926":{"id":"n1819848926","loc":[-85.6487987,41.978868],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:51Z","tags":{}},"n1819848927":{"id":"n1819848927","loc":[-85.6495105,41.9730355],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:51Z","tags":{}},"n1819848928":{"id":"n1819848928","loc":[-85.648223,41.9829654],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:51Z","tags":{}},"n1819848929":{"id":"n1819848929","loc":[-85.6514846,41.9659122],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:51Z","tags":{}},"n1819848931":{"id":"n1819848931","loc":[-85.6498753,41.9731871],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:51Z","tags":{}},"n1819848932":{"id":"n1819848932","loc":[-85.640906,41.9508575],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:51Z","tags":{}},"n1819848933":{"id":"n1819848933","loc":[-85.649775,41.9799767],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:51Z","tags":{}},"n1819848934":{"id":"n1819848934","loc":[-85.6507014,41.9739927],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:51Z","tags":{}},"n1819848937":{"id":"n1819848937","loc":[-85.6479763,41.9840899],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:51Z","tags":{}},"n1819848938":{"id":"n1819848938","loc":[-85.6501113,41.9600884],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:51Z","tags":{}},"n1819848939":{"id":"n1819848939","loc":[-85.6389962,41.9478253],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:51Z","tags":{}},"n1819848941":{"id":"n1819848941","loc":[-85.637469,41.9445791],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:51Z","tags":{}},"n1819848942":{"id":"n1819848942","loc":[-85.6494569,41.9601682],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:51Z","tags":{}},"n1819848943":{"id":"n1819848943","loc":[-85.6368803,41.9439351],"version":"2","changeset":"12170230","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:56:57Z","tags":{}},"n1819848945":{"id":"n1819848945","loc":[-85.6474398,41.9724213],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:51Z","tags":{}},"n1819848946":{"id":"n1819848946","loc":[-85.6382629,41.9463666],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:51Z","tags":{}},"n1819848948":{"id":"n1819848948","loc":[-85.6489633,41.9830771],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:52Z","tags":{}},"n1819848952":{"id":"n1819848952","loc":[-85.6488882,41.9600326],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:52Z","tags":{}},"n1819848953":{"id":"n1819848953","loc":[-85.6488094,41.9774324],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:52Z","tags":{}},"n1819848954":{"id":"n1819848954","loc":[-85.6491135,41.9600485],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:52Z","tags":{}},"n1819848955":{"id":"n1819848955","loc":[-85.6501435,41.9734583],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:52Z","tags":{}},"n1819848956":{"id":"n1819848956","loc":[-85.6495534,41.960958],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:52Z","tags":{}},"n1819848958":{"id":"n1819848958","loc":[-85.6474683,41.9561491],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:52Z","tags":{}},"n1819848959":{"id":"n1819848959","loc":[-85.6401083,41.9485451],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:52Z","tags":{}},"n1819848960":{"id":"n1819848960","loc":[-85.6481764,41.9678686],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:52Z","tags":{}},"n1819848961":{"id":"n1819848961","loc":[-85.6484017,41.967382],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:52Z","tags":{}},"n1819848962":{"id":"n1819848962","loc":[-85.6501328,41.959897],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:52Z","tags":{}},"n1819848964":{"id":"n1819848964","loc":[-85.6403695,41.9504586],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:52Z","tags":{}},"n1819848966":{"id":"n1819848966","loc":[-85.6398975,41.9491499],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:52Z","tags":{}},"n1819848967":{"id":"n1819848967","loc":[-85.6412455,41.9510187],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:52Z","tags":{}},"n1819848968":{"id":"n1819848968","loc":[-85.6482622,41.9619493],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:52Z","tags":{}},"n1819848969":{"id":"n1819848969","loc":[-85.6405841,41.9501474],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:52Z","tags":{}},"n1819848970":{"id":"n1819848970","loc":[-85.6478583,41.9703394],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:52Z","tags":{}},"n1819848971":{"id":"n1819848971","loc":[-85.6493388,41.9832845],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:52Z","tags":{}},"n1819848972":{"id":"n1819848972","loc":[-85.6485664,41.9829415],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:52Z","tags":{}},"n1819848974":{"id":"n1819848974","loc":[-85.6491457,41.9779887],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:52Z","tags":{}},"n1819848975":{"id":"n1819848975","loc":[-85.6468889,41.9697033],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:52Z","tags":{}},"n1819848976":{"id":"n1819848976","loc":[-85.6452726,41.9546072],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:52Z","tags":{}},"n1819848977":{"id":"n1819848977","loc":[-85.6448435,41.9546072],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:53Z","tags":{}},"n1819848979":{"id":"n1819848979","loc":[-85.6485342,41.9763138],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:53Z","tags":{}},"n1819848980":{"id":"n1819848980","loc":[-85.6495282,41.9664087],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:53Z","tags":{}},"n1819848986":{"id":"n1819848986","loc":[-85.6486307,41.9603278],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:53Z","tags":{}},"n1819848987":{"id":"n1819848987","loc":[-85.6492278,41.9791871],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:53Z","tags":{}},"n1819848990":{"id":"n1819848990","loc":[-85.6501934,41.9800724],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:53Z","tags":{}},"n1819848992":{"id":"n1819848992","loc":[-85.6482445,41.9819685],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:53Z","tags":{}},"n1819848993":{"id":"n1819848993","loc":[-85.6481871,41.9704451],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:53Z","tags":{}},"n1819848994":{"id":"n1819848994","loc":[-85.6371364,41.9457602],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:53Z","tags":{}},"n1819848996":{"id":"n1819848996","loc":[-85.6500362,41.9801023],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:53Z","tags":{}},"n1819849000":{"id":"n1819849000","loc":[-85.639007,41.9485914],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:53Z","tags":{}},"n1819849001":{"id":"n1819849001","loc":[-85.6488882,41.9669253],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:53Z","tags":{}},"n1819849002":{"id":"n1819849002","loc":[-85.6484698,41.9565062],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:53Z","tags":{}},"n1819849004":{"id":"n1819849004","loc":[-85.6510769,41.9761064],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:53Z","tags":{}},"n1819849005":{"id":"n1819849005","loc":[-85.6503581,41.9799029],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:53Z","tags":{}},"n1819849006":{"id":"n1819849006","loc":[-85.6489381,41.9703893],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:53Z","tags":{}},"n1819849008":{"id":"n1819849008","loc":[-85.6497457,41.9833588],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:53Z","tags":{}},"n1819849011":{"id":"n1819849011","loc":[-85.6497358,41.9717593],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:53Z","tags":{}},"n1819849012":{"id":"n1819849012","loc":[-85.6494676,41.9796796],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:53Z","tags":{}},"n1819849019":{"id":"n1819849019","loc":[-85.6486093,41.9771034],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:54Z","tags":{}},"n1819849021":{"id":"n1819849021","loc":[-85.6504546,41.9796556],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:54Z","tags":{}},"n1819849022":{"id":"n1819849022","loc":[-85.6371294,41.9454154],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:54Z","tags":{}},"n1819849023":{"id":"n1819849023","loc":[-85.6503436,41.9759249],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:54Z","tags":{}},"n1819849025":{"id":"n1819849025","loc":[-85.6462382,41.9693822],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:54Z","tags":{}},"n1819849026":{"id":"n1819849026","loc":[-85.6497573,41.983093],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:54Z","tags":{}},"n1819849028":{"id":"n1819849028","loc":[-85.6497465,41.9602799],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:54Z","tags":{}},"n1819849029":{"id":"n1819849029","loc":[-85.6374728,41.9460698],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:54Z","tags":{}},"n1819849030":{"id":"n1819849030","loc":[-85.6486592,41.9566039],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:54Z","tags":{}},"n1819849031":{"id":"n1819849031","loc":[-85.6515989,41.9654993],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:54Z","tags":{}},"n1819849032":{"id":"n1819849032","loc":[-85.6387028,41.9482658],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:54Z","tags":{}},"n1819849033":{"id":"n1819849033","loc":[-85.6464742,41.9688398],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:54Z","tags":{}},"n1819849034":{"id":"n1819849034","loc":[-85.6495212,41.9589236],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:54Z","tags":{}},"n1819849035":{"id":"n1819849035","loc":[-85.6490599,41.9790096],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:54Z","tags":{}},"n1819849036":{"id":"n1819849036","loc":[-85.6489918,41.9800724],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:54Z","tags":{}},"n1819849038":{"id":"n1819849038","loc":[-85.6499182,41.9659042],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:54Z","tags":{}},"n1819849040":{"id":"n1819849040","loc":[-85.639758,41.9490143],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:54Z","tags":{}},"n1819849041":{"id":"n1819849041","loc":[-85.6514846,41.9755241],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:54Z","tags":{}},"n1819849042":{"id":"n1819849042","loc":[-85.6436633,41.9540647],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:54Z","tags":{}},"n1819849045":{"id":"n1819849045","loc":[-85.6475541,41.9726387],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:55Z","tags":{}},"n1819849046":{"id":"n1819849046","loc":[-85.6488308,41.9718331],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:55Z","tags":{}},"n1819849047":{"id":"n1819849047","loc":[-85.6377694,41.9460953],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:55Z","tags":{}},"n1819849048":{"id":"n1819849048","loc":[-85.6490706,41.9804452],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:55Z","tags":{}},"n1819849049":{"id":"n1819849049","loc":[-85.6485449,41.9766248],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:55Z","tags":{}},"n1819849051":{"id":"n1819849051","loc":[-85.6483625,41.9790256],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:55Z","tags":{}},"n1819849052":{"id":"n1819849052","loc":[-85.6490706,41.9585167],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:55Z","tags":{}},"n1819849053":{"id":"n1819849053","loc":[-85.6425008,41.9522874],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:55Z","tags":{}},"n1819849054":{"id":"n1819849054","loc":[-85.6475793,41.9632158],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:55Z","tags":{}},"n1819849055":{"id":"n1819849055","loc":[-85.6408631,41.9499399],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:55Z","tags":{}},"n1819849056":{"id":"n1819849056","loc":[-85.6483373,41.9814681],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:55Z","tags":{}},"n1819849057":{"id":"n1819849057","loc":[-85.6313548,41.9442876],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:55Z","tags":{}},"n1819849058":{"id":"n1819849058","loc":[-85.6432663,41.9529796],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:55Z","tags":{}},"n1819849059":{"id":"n1819849059","loc":[-85.6487128,41.9582873],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:55Z","tags":{}},"n1819849060":{"id":"n1819849060","loc":[-85.6482338,41.9817612],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:55Z","tags":{}},"n1819849062":{"id":"n1819849062","loc":[-85.6485664,41.9788661],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:55Z","tags":{}},"n1819849063":{"id":"n1819849063","loc":[-85.6373081,41.9448824],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:55Z","tags":{}},"n1819849064":{"id":"n1819849064","loc":[-85.6472215,41.9557582],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:55Z","tags":{}},"n1819849065":{"id":"n1819849065","loc":[-85.6348984,41.9440414],"version":"2","changeset":"14893390","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:53:38Z","tags":{}},"n1819849066":{"id":"n1819849066","loc":[-85.6501972,41.9647315],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:55Z","tags":{}},"n1819849067":{"id":"n1819849067","loc":[-85.6489741,41.9808281],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:55Z","tags":{}},"n1819849068":{"id":"n1819849068","loc":[-85.6420111,41.9515034],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:55Z","tags":{}},"n1819849069":{"id":"n1819849069","loc":[-85.6397972,41.9488882],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:55Z","tags":{}},"n1819849070":{"id":"n1819849070","loc":[-85.6499718,41.9593465],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:55Z","tags":{}},"n1819849071":{"id":"n1819849071","loc":[-85.6486844,41.9811311],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:55Z","tags":{}},"n1819849072":{"id":"n1819849072","loc":[-85.6390392,41.9474663],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:55Z","tags":{}},"n1819849074":{"id":"n1819849074","loc":[-85.6495642,41.9616362],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:55Z","tags":{}},"n1819849075":{"id":"n1819849075","loc":[-85.6483518,41.9791931],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:55Z","tags":{}},"n1819849076":{"id":"n1819849076","loc":[-85.6478974,41.9833104],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:56Z","tags":{}},"n1819849077":{"id":"n1819849077","loc":[-85.640155,41.948719],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:56Z","tags":{}},"n1819849078":{"id":"n1819849078","loc":[-85.6399366,41.9487845],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:56Z","tags":{}},"n1819849079":{"id":"n1819849079","loc":[-85.6492959,41.9825348],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:56Z","tags":{}},"n1819849080":{"id":"n1819849080","loc":[-85.6505083,41.9648352],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:56Z","tags":{}},"n1819849081":{"id":"n1819849081","loc":[-85.6492959,41.9645241],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:56Z","tags":{}},"n1819849082":{"id":"n1819849082","loc":[-85.6402049,41.9491835],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:56Z","tags":{}},"n1819849083":{"id":"n1819849083","loc":[-85.6495175,41.9826963],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:56Z","tags":{}},"n1819849084":{"id":"n1819849084","loc":[-85.6480836,41.9728361],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:56Z","tags":{}},"n1819849085":{"id":"n1819849085","loc":[-85.6374349,41.9443425],"version":"2","changeset":"12170230","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:56:57Z","tags":{}},"n1819849086":{"id":"n1819849086","loc":[-85.6478331,41.9681238],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:56Z","tags":{}},"n1819849089":{"id":"n1819849089","loc":[-85.639368,41.9486169],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:56Z","tags":{}},"n1819849092":{"id":"n1819849092","loc":[-85.6503581,41.9788022],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:56Z","tags":{}},"n1819849093":{"id":"n1819849093","loc":[-85.64862,41.9568014],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:56Z","tags":{}},"n1819849094":{"id":"n1819849094","loc":[-85.6496999,41.9828877],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:56Z","tags":{}},"n1819849095":{"id":"n1819849095","loc":[-85.647472,41.972198],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:56Z","tags":{}},"n1819849096":{"id":"n1819849096","loc":[-85.6485771,41.9644523],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:56Z","tags":{}},"n1819849097":{"id":"n1819849097","loc":[-85.6388353,41.9480488],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:56Z","tags":{}},"n1819849099":{"id":"n1819849099","loc":[-85.6472752,41.9683312],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:56Z","tags":{}},"n1819849104":{"id":"n1819849104","loc":[-85.6479548,41.9836035],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:57Z","tags":{}},"n1819849105":{"id":"n1819849105","loc":[-85.6462489,41.9691668],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:57Z","tags":{}},"n1819849107":{"id":"n1819849107","loc":[-85.6511912,41.9746328],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:57Z","tags":{}},"n1819849108":{"id":"n1819849108","loc":[-85.6498646,41.9714881],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:57Z","tags":{}},"n1819849111":{"id":"n1819849111","loc":[-85.6488239,41.961684],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:57Z","tags":{}},"n1819849112":{"id":"n1819849112","loc":[-85.6469356,41.9553812],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:57Z","tags":{}},"n1819849114":{"id":"n1819849114","loc":[-85.6479548,41.9640853],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:57Z","tags":{}},"n1819849119":{"id":"n1819849119","loc":[-85.6491565,41.961692],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:57Z","tags":{}},"n1819849121":{"id":"n1819849121","loc":[-85.651667,41.9656728],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:57Z","tags":{}},"n1819849124":{"id":"n1819849124","loc":[-85.6388423,41.9484414],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:57Z","tags":{}},"n1819849126":{"id":"n1819849126","loc":[-85.6371686,41.9450978],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:57Z","tags":{}},"n1819849127":{"id":"n1819849127","loc":[-85.6502615,41.9656728],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:57Z","tags":{}},"n1819849129":{"id":"n1819849129","loc":[-85.6498501,41.9613031],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:57Z","tags":{}},"n1819849131":{"id":"n1819849131","loc":[-85.6513881,41.9653298],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:57Z","tags":{}},"n1819849133":{"id":"n1819849133","loc":[-85.639883,41.9485291],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:57Z","tags":{}},"n1819849139":{"id":"n1819849139","loc":[-85.6508693,41.9658264],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:57Z","tags":{}},"n1819849140":{"id":"n1819849140","loc":[-85.6486806,41.9761642],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:57Z","tags":{}},"n1819849141":{"id":"n1819849141","loc":[-85.6483159,41.9717613],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:57Z","tags":{}},"n1819849144":{"id":"n1819849144","loc":[-85.6443714,41.9546232],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:58Z","tags":{}},"n1819849146":{"id":"n1819849146","loc":[-85.641775,41.9513359],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:58Z","tags":{}},"n1819849147":{"id":"n1819849147","loc":[-85.6495604,41.9757335],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:58Z","tags":{}},"n1819849148":{"id":"n1819849148","loc":[-85.6465671,41.9551678],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:58Z","tags":{}},"n1819849150":{"id":"n1819849150","loc":[-85.6485127,41.9794084],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:58Z","tags":{}},"n1819849151":{"id":"n1819849151","loc":[-85.6499144,41.9757096],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:58Z","tags":{}},"n1819849152":{"id":"n1819849152","loc":[-85.6433736,41.9531072],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:58Z","tags":{}},"n1819849154":{"id":"n1819849154","loc":[-85.6489741,41.9607426],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:58Z","tags":{}},"n1819849155":{"id":"n1819849155","loc":[-85.640627,41.9507697],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:58Z","tags":{}},"n1819849156":{"id":"n1819849156","loc":[-85.6509659,41.9743058],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:58Z","tags":{}},"n1819849157":{"id":"n1819849157","loc":[-85.6486844,41.9704431],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:58Z","tags":{}},"n1819849158":{"id":"n1819849158","loc":[-85.6498538,41.9711132],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:58Z","tags":{}},"n1819849159":{"id":"n1819849159","loc":[-85.6358937,41.943719],"version":"2","changeset":"12170230","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:56:57Z","tags":{}},"n1819849160":{"id":"n1819849160","loc":[-85.6497358,41.9707702],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:58Z","tags":{}},"n1819849161":{"id":"n1819849161","loc":[-85.6480476,41.9564842],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:58Z","tags":{}},"n1819849162":{"id":"n1819849162","loc":[-85.6482982,41.9574556],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:58Z","tags":{}},"n1819849163":{"id":"n1819849163","loc":[-85.6501757,41.9757794],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:58Z","tags":{}},"n1819849164":{"id":"n1819849164","loc":[-85.6372973,41.9459916],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:58Z","tags":{}},"n1819849165":{"id":"n1819849165","loc":[-85.6513773,41.9750775],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:58Z","tags":{}},"n1819849166":{"id":"n1819849166","loc":[-85.6436418,41.9537455],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:58Z","tags":{}},"n1819849167":{"id":"n1819849167","loc":[-85.6483625,41.9571524],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:58Z","tags":{}},"n1819849169":{"id":"n1819849169","loc":[-85.647751,41.9727962],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:58Z","tags":{}},"n1819849170":{"id":"n1819849170","loc":[-85.6504546,41.9656808],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:58Z","tags":{}},"n1819849171":{"id":"n1819849171","loc":[-85.6479977,41.971839],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:58Z","tags":{}},"n1819849172":{"id":"n1819849172","loc":[-85.6482767,41.9642449],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:58Z","tags":{}},"n1819849174":{"id":"n1819849174","loc":[-85.6414317,41.9512086],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:58Z","tags":{}},"n1819849176":{"id":"n1819849176","loc":[-85.6469034,41.9685287],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:59Z","tags":{}},"n1819849179":{"id":"n1819849179","loc":[-85.6408631,41.9497564],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:59Z","tags":{}},"n1819849182":{"id":"n1819849182","loc":[-85.6476721,41.96384],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:59Z","tags":{}},"n1819849183":{"id":"n1819849183","loc":[-85.6479725,41.983111],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:59Z","tags":{}},"n1819849184":{"id":"n1819849184","loc":[-85.640788,41.9500516],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:59Z","tags":{}},"n1819849185":{"id":"n1819849185","loc":[-85.6427798,41.9528778],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:59Z","tags":{}},"n1819849186":{"id":"n1819849186","loc":[-85.6435308,41.9534124],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:59Z","tags":{}},"n1819849187":{"id":"n1819849187","loc":[-85.6483733,41.9821998],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:59Z","tags":{}},"n1819849189":{"id":"n1819849189","loc":[-85.6351752,41.9440796],"version":"2","changeset":"14893390","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:53:38Z","tags":{}},"n1819849191":{"id":"n1819849191","loc":[-85.6487021,41.9601463],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:59Z","tags":{}},"n1819849192":{"id":"n1819849192","loc":[-85.6363811,41.9437605],"version":"2","changeset":"12170230","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:56:57Z","tags":{}},"n1819849193":{"id":"n1819849193","loc":[-85.6490883,41.9759728],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:59Z","tags":{}},"n1819849194":{"id":"n1819849194","loc":[-85.6423292,41.9520081],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:59Z","tags":{}},"n1819849195":{"id":"n1819849195","loc":[-85.6500003,41.960242],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:59Z","tags":{}},"n1819849196":{"id":"n1819849196","loc":[-85.6385778,41.9466443],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:59Z","tags":{}},"n1819849197":{"id":"n1819849197","loc":[-85.6494032,41.9718789],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:59Z","tags":{}},"n1819849198":{"id":"n1819849198","loc":[-85.6404339,41.9506501],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:59Z","tags":{}},"n1819849199":{"id":"n1819849199","loc":[-85.6426226,41.9527083],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:59Z","tags":{}},"n1819849200":{"id":"n1819849200","loc":[-85.6439101,41.9545035],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:59Z","tags":{}},"n1819849201":{"id":"n1819849201","loc":[-85.6516563,41.9657845],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:48:00Z","tags":{}},"n1819849202":{"id":"n1819849202","loc":[-85.6473395,41.9699585],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:48:00Z","tags":{}},"n1819858501":{"id":"n1819858501","loc":[-85.6361263,41.9437126],"version":"1","changeset":"12170230","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:56:54Z","tags":{}},"n1819858503":{"id":"n1819858503","loc":[-85.6350068,41.944034],"version":"2","changeset":"14893390","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:53:38Z","tags":{}},"n1819858513":{"id":"n1819858513","loc":[-85.6371402,41.9453282],"version":"1","changeset":"12170230","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:56:54Z","tags":{}},"n1819858518":{"id":"n1819858518","loc":[-85.6348713,41.9432923],"version":"1","changeset":"12170230","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:56:54Z","tags":{}},"n1819858523":{"id":"n1819858523","loc":[-85.6357047,41.943799],"version":"1","changeset":"12170230","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:56:55Z","tags":{}},"n1819858526":{"id":"n1819858526","loc":[-85.6349947,41.9435756],"version":"1","changeset":"12170230","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:56:55Z","tags":{}},"n1819858531":{"id":"n1819858531","loc":[-85.6350376,41.943827],"version":"1","changeset":"12170230","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:56:55Z","tags":{}},"n1820937508":{"id":"n1820937508","loc":[-85.1026013,42.0881722],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:55:57Z","tags":{}},"n1820937509":{"id":"n1820937509","loc":[-85.0558088,42.102493],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:55:57Z","tags":{}},"n1820937511":{"id":"n1820937511","loc":[-85.3030116,41.9724451],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:55:57Z","tags":{}},"n1820937513":{"id":"n1820937513","loc":[-85.0353221,42.1027398],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:55:57Z","tags":{}},"n1820937514":{"id":"n1820937514","loc":[-85.0835468,42.1015469],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:55:57Z","tags":{}},"n1820937515":{"id":"n1820937515","loc":[-85.2421298,42.0106305],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:55:57Z","tags":{}},"n1820937517":{"id":"n1820937517","loc":[-85.0090632,42.0910452],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:55:57Z","tags":{}},"n1820937518":{"id":"n1820937518","loc":[-85.086626,42.0948838],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:55:57Z","tags":{}},"n1820937520":{"id":"n1820937520","loc":[-85.2552039,42.0015448],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:55:58Z","tags":{}},"n1820937521":{"id":"n1820937521","loc":[-85.3739614,41.9969917],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:55:58Z","tags":{}},"n1820937522":{"id":"n1820937522","loc":[-85.4831166,41.993898],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:55:58Z","tags":{}},"n1820937523":{"id":"n1820937523","loc":[-85.0341084,42.0977657],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:55:58Z","tags":{}},"n1820937524":{"id":"n1820937524","loc":[-85.3272802,41.9710333],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:55:58Z","tags":{}},"n1820937525":{"id":"n1820937525","loc":[-85.2125568,42.0414521],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:55:58Z","tags":{}},"n1820937526":{"id":"n1820937526","loc":[-85.3798022,41.9992458],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:55:58Z","tags":{}},"n1820937527":{"id":"n1820937527","loc":[-85.2652021,41.999768],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:55:58Z","tags":{}},"n1820937528":{"id":"n1820937528","loc":[-85.3852739,42.0004896],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:55:58Z","tags":{}},"n1820937529":{"id":"n1820937529","loc":[-85.3911919,42.0030513],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:55:58Z","tags":{}},"n1820937530":{"id":"n1820937530","loc":[-85.5440349,41.9717109],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:55:58Z","tags":{}},"n1820937531":{"id":"n1820937531","loc":[-85.2790155,41.9911764],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:55:58Z","tags":{}},"n1820937532":{"id":"n1820937532","loc":[-85.4723277,41.9950518],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:55:58Z","tags":{}},"n1820937533":{"id":"n1820937533","loc":[-85.5690546,41.9653931],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:55:58Z","tags":{}},"n1820937535":{"id":"n1820937535","loc":[-85.5674882,41.9649623],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:55:58Z","tags":{}},"n1820937536":{"id":"n1820937536","loc":[-85.6362815,41.9189165],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:55:58Z","tags":{}},"n1820937537":{"id":"n1820937537","loc":[-85.5659003,41.963638],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:55:58Z","tags":{}},"n1820937539":{"id":"n1820937539","loc":[-85.6391353,41.9122262],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:55:59Z","tags":{}},"n1820937540":{"id":"n1820937540","loc":[-85.4834385,41.9894803],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:55:59Z","tags":{}},"n1820937541":{"id":"n1820937541","loc":[-85.6399078,41.9160744],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:55:59Z","tags":{}},"n1820937542":{"id":"n1820937542","loc":[-85.632874,41.941031],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:55:59Z","tags":{}},"n1820937543":{"id":"n1820937543","loc":[-85.1307591,42.0726961],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:55:59Z","tags":{}},"n1820937544":{"id":"n1820937544","loc":[-85.6444397,41.9128378],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:55:59Z","tags":{}},"n1820937545":{"id":"n1820937545","loc":[-85.6197204,41.9420365],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:55:59Z","tags":{}},"n1820937546":{"id":"n1820937546","loc":[-85.1164857,42.0864631],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:55:59Z","tags":{}},"n1820937547":{"id":"n1820937547","loc":[-85.6476111,41.9142222],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:55:59Z","tags":{}},"n1820937548":{"id":"n1820937548","loc":[-85.2915747,41.9774223],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:55:59Z","tags":{}},"n1820937549":{"id":"n1820937549","loc":[-85.6430192,41.9102461],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:55:59Z","tags":{}},"n1820937550":{"id":"n1820937550","loc":[-85.1597495,42.0639017],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:55:59Z","tags":{}},"n1820937551":{"id":"n1820937551","loc":[-85.5504079,41.9701793],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:55:59Z","tags":{}},"n1820937553":{"id":"n1820937553","loc":[-85.2781317,41.9948951],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:55:59Z","tags":{}},"n1820937555":{"id":"n1820937555","loc":[-85.3724594,41.997518],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:55:59Z","tags":{}},"n1820937556":{"id":"n1820937556","loc":[-85.5629434,41.9665155],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:55:59Z","tags":{}},"n1820937557":{"id":"n1820937557","loc":[-85.3791971,41.9990808],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:55:59Z","tags":{}},"n1820937558":{"id":"n1820937558","loc":[-85.001891,42.0878843],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:55:59Z","tags":{}},"n1820937560":{"id":"n1820937560","loc":[-85.3140838,41.9709056],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:00Z","tags":{}},"n1820937561":{"id":"n1820937561","loc":[-85.2468032,42.0146987],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:00Z","tags":{}},"n1820937563":{"id":"n1820937563","loc":[-85.0877378,42.097255],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:00Z","tags":{}},"n1820937564":{"id":"n1820937564","loc":[-85.2442498,42.0150654],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:00Z","tags":{}},"n1820937566":{"id":"n1820937566","loc":[-85.3108973,41.9701478],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:00Z","tags":{}},"n1820937568":{"id":"n1820937568","loc":[-85.0344584,42.1016572],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:00Z","tags":{}},"n1820937569":{"id":"n1820937569","loc":[-85.2331025,42.0297387],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:00Z","tags":{}},"n1820937570":{"id":"n1820937570","loc":[-85.5058446,41.9746996],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:00Z","tags":{}},"n1820937571":{"id":"n1820937571","loc":[-85.5622739,41.9676427],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:00Z","tags":{}},"n1820937572":{"id":"n1820937572","loc":[-85.2792687,41.9890337],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:00Z","tags":{}},"n1820937574":{"id":"n1820937574","loc":[-84.9909302,42.08695],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:00Z","tags":{}},"n1820937575":{"id":"n1820937575","loc":[-85.6218233,41.9418609],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:00Z","tags":{}},"n1820937576":{"id":"n1820937576","loc":[-85.3577437,41.9931062],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:00Z","tags":{}},"n1820937577":{"id":"n1820937577","loc":[-85.639028,41.9165853],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:00Z","tags":{}},"n1820937578":{"id":"n1820937578","loc":[-84.9956576,42.0865348],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:00Z","tags":{}},"n1820937579":{"id":"n1820937579","loc":[-85.4828376,41.990198],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:00Z","tags":{}},"n1820937580":{"id":"n1820937580","loc":[-85.3244478,41.9720543],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:00Z","tags":{}},"n1820937582":{"id":"n1820937582","loc":[-85.0517479,42.1035159],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:00Z","tags":{}},"n1820937583":{"id":"n1820937583","loc":[-85.225646,42.0338025],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:00Z","tags":{}},"n1820937584":{"id":"n1820937584","loc":[-84.9941019,42.0862163],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:00Z","tags":{}},"n1820937586":{"id":"n1820937586","loc":[-85.1051762,42.0879452],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:00Z","tags":{}},"n1820937587":{"id":"n1820937587","loc":[-85.1245203,42.0753162],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:00Z","tags":{}},"n1820937588":{"id":"n1820937588","loc":[-85.3250808,41.9719506],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:00Z","tags":{}},"n1820937589":{"id":"n1820937589","loc":[-85.2720109,41.997933],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:00Z","tags":{}},"n1820937590":{"id":"n1820937590","loc":[-85.2556653,42.0027248],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:01Z","tags":{}},"n1820937591":{"id":"n1820937591","loc":[-85.0872483,42.0943544],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:01Z","tags":{}},"n1820937592":{"id":"n1820937592","loc":[-85.2778353,41.9955023],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:01Z","tags":{}},"n1820937593":{"id":"n1820937593","loc":[-85.2984733,41.9735538],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:01Z","tags":{}},"n1820937594":{"id":"n1820937594","loc":[-85.101578,42.0889552],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:01Z","tags":{}},"n1820937595":{"id":"n1820937595","loc":[-85.3888745,42.0016959],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:01Z","tags":{}},"n1820937596":{"id":"n1820937596","loc":[-84.9903508,42.0870654],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:01Z","tags":{}},"n1820937597":{"id":"n1820937597","loc":[-85.6405558,41.9146261],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:01Z","tags":{}},"n1820937598":{"id":"n1820937598","loc":[-85.6460704,41.9141311],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:01Z","tags":{}},"n1820937599":{"id":"n1820937599","loc":[-85.0377468,42.1037428],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:01Z","tags":{}},"n1820937600":{"id":"n1820937600","loc":[-85.2298345,42.0312899],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:01Z","tags":{}},"n1820937601":{"id":"n1820937601","loc":[-85.1080958,42.0861964],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:01Z","tags":{}},"n1820937602":{"id":"n1820937602","loc":[-85.6325307,41.9402329],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:01Z","tags":{}},"n1820937603":{"id":"n1820937603","loc":[-85.1165984,42.0832184],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:01Z","tags":{}},"n1820937604":{"id":"n1820937604","loc":[-85.6354446,41.9190602],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:01Z","tags":{}},"n1820937605":{"id":"n1820937605","loc":[-85.1114592,42.0862959],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:01Z","tags":{}},"n1820937606":{"id":"n1820937606","loc":[-85.0858763,42.1001646],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:01Z","tags":{}},"n1820937607":{"id":"n1820937607","loc":[-85.0472083,42.1015151],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:01Z","tags":{}},"n1820937608":{"id":"n1820937608","loc":[-85.0802477,42.1027609],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:01Z","tags":{}},"n1820937610":{"id":"n1820937610","loc":[-85.0924585,42.0928564],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:01Z","tags":{}},"n1820937611":{"id":"n1820937611","loc":[-85.0329617,42.09827],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:01Z","tags":{}},"n1820937612":{"id":"n1820937612","loc":[-85.2814617,41.993465],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:01Z","tags":{}},"n1820937613":{"id":"n1820937613","loc":[-85.3097708,41.9700282],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:01Z","tags":{}},"n1820937614":{"id":"n1820937614","loc":[-85.2809427,41.993695],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:01Z","tags":{}},"n1820937615":{"id":"n1820937615","loc":[-85.0583233,42.1026494],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:01Z","tags":{}},"n1820937617":{"id":"n1820937617","loc":[-85.2801592,41.9840021],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:02Z","tags":{}},"n1820937619":{"id":"n1820937619","loc":[-85.1064154,42.0863449],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:02Z","tags":{}},"n1820937620":{"id":"n1820937620","loc":[-85.0423173,42.1014662],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:02Z","tags":{}},"n1820937621":{"id":"n1820937621","loc":[-85.2168913,42.0398107],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:02Z","tags":{}},"n1820937622":{"id":"n1820937622","loc":[-85.2798481,41.9833401],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:02Z","tags":{}},"n1820937623":{"id":"n1820937623","loc":[-85.0575468,42.1028672],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:02Z","tags":{}},"n1820937625":{"id":"n1820937625","loc":[-85.0130369,42.0893067],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:02Z","tags":{}},"n1820937626":{"id":"n1820937626","loc":[-85.0346985,42.1018256],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:02Z","tags":{}},"n1820937627":{"id":"n1820937627","loc":[-85.2231569,42.0372768],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:02Z","tags":{}},"n1820937628":{"id":"n1820937628","loc":[-85.2956195,41.9732268],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:02Z","tags":{}},"n1820937629":{"id":"n1820937629","loc":[-85.1052312,42.086893],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:02Z","tags":{}},"n1820937630":{"id":"n1820937630","loc":[-85.4813356,41.9958436],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:02Z","tags":{}},"n1820937631":{"id":"n1820937631","loc":[-85.0961599,42.0914672],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:02Z","tags":{}},"n1820937632":{"id":"n1820937632","loc":[-85.308419,41.9704749],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:02Z","tags":{}},"n1820937633":{"id":"n1820937633","loc":[-85.295952,41.9715119],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:02Z","tags":{}},"n1820937634":{"id":"n1820937634","loc":[-85.3310933,41.9703923],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:02Z","tags":{}},"n1820937635":{"id":"n1820937635","loc":[-85.2940745,41.9739686],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:02Z","tags":{}},"n1820937636":{"id":"n1820937636","loc":[-85.3803343,42.000484],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:02Z","tags":{}},"n1820937637":{"id":"n1820937637","loc":[-85.1174231,42.0845533],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:02Z","tags":{}},"n1820937638":{"id":"n1820937638","loc":[-85.0095836,42.089839],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:03Z","tags":{}},"n1820937639":{"id":"n1820937639","loc":[-85.3179354,41.9705866],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:03Z","tags":{}},"n1820937640":{"id":"n1820937640","loc":[-85.257708,42.0001189],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:03Z","tags":{}},"n1820937641":{"id":"n1820937641","loc":[-85.2563522,42.0002771],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:03Z","tags":{}},"n1820937642":{"id":"n1820937642","loc":[-85.3181929,41.970419],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:03Z","tags":{}},"n1820937643":{"id":"n1820937643","loc":[-85.2911884,41.9757154],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:03Z","tags":{}},"n1820937644":{"id":"n1820937644","loc":[-85.2714423,41.9975862],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:03Z","tags":{}},"n1820937645":{"id":"n1820937645","loc":[-85.0193669,42.089888],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:03Z","tags":{}},"n1820937646":{"id":"n1820937646","loc":[-85.3889818,42.0039921],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:03Z","tags":{}},"n1820937647":{"id":"n1820937647","loc":[-85.3408093,41.9853965],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:03Z","tags":{}},"n1820937648":{"id":"n1820937648","loc":[-85.1258091,42.0748332],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:03Z","tags":{}},"n1820937649":{"id":"n1820937649","loc":[-85.5722561,41.962782],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:03Z","tags":{}},"n1820937650":{"id":"n1820937650","loc":[-85.3266902,41.9721819],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:03Z","tags":{}},"n1820937651":{"id":"n1820937651","loc":[-85.1473255,42.065192],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:03Z","tags":{}},"n1820937652":{"id":"n1820937652","loc":[-85.1462526,42.0655106],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:03Z","tags":{}},"n1820937653":{"id":"n1820937653","loc":[-85.4641051,42.0013929],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:03Z","tags":{}},"n1820937654":{"id":"n1820937654","loc":[-85.5620379,41.9700677],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:03Z","tags":{}},"n1820937655":{"id":"n1820937655","loc":[-85.3226025,41.971121],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:03Z","tags":{}},"n1820937656":{"id":"n1820937656","loc":[-85.0200965,42.0899516],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:03Z","tags":{}},"n1820937657":{"id":"n1820937657","loc":[-85.0624714,42.1044711],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:03Z","tags":{}},"n1820937658":{"id":"n1820937658","loc":[-85.5649562,41.9637178],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:03Z","tags":{}},"n1820937659":{"id":"n1820937659","loc":[-85.2360315,42.0253315],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:03Z","tags":{}},"n1820937660":{"id":"n1820937660","loc":[-85.3881449,41.9994475],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:03Z","tags":{}},"n1820937661":{"id":"n1820937661","loc":[-85.5032911,41.976263],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:03Z","tags":{}},"n1820937662":{"id":"n1820937662","loc":[-85.481297,41.9871414],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:03Z","tags":{}},"n1820937663":{"id":"n1820937663","loc":[-85.1167056,42.0841898],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:03Z","tags":{}},"n1820937664":{"id":"n1820937664","loc":[-85.2891714,41.9787223],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:03Z","tags":{}},"n1820937665":{"id":"n1820937665","loc":[-85.4393429,42.0058736],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:03Z","tags":{}},"n1820937666":{"id":"n1820937666","loc":[-85.0077007,42.0895762],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:03Z","tags":{}},"n1820937667":{"id":"n1820937667","loc":[-85.2736202,41.9979171],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:03Z","tags":{}},"n1820937668":{"id":"n1820937668","loc":[-84.9935332,42.0859296],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:03Z","tags":{}},"n1820937669":{"id":"n1820937669","loc":[-85.0622769,42.1046713],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:04Z","tags":{}},"n1820937670":{"id":"n1820937670","loc":[-85.2309031,42.0311249],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:04Z","tags":{}},"n1820937671":{"id":"n1820937671","loc":[-85.0343726,42.10069],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:04Z","tags":{}},"n1820937672":{"id":"n1820937672","loc":[-85.0596551,42.1048612],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:04Z","tags":{}},"n1820937673":{"id":"n1820937673","loc":[-85.1338597,42.0707449],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:04Z","tags":{}},"n1820937674":{"id":"n1820937674","loc":[-85.3117663,41.9689194],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:04Z","tags":{}},"n1820937675":{"id":"n1820937675","loc":[-85.0705649,42.1057499],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:04Z","tags":{}},"n1820937676":{"id":"n1820937676","loc":[-85.2441425,42.0180944],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:04Z","tags":{}},"n1820937677":{"id":"n1820937677","loc":[-85.1171174,42.0862692],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:04Z","tags":{}},"n1820937678":{"id":"n1820937678","loc":[-85.0346824,42.1005519],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:04Z","tags":{}},"n1820937680":{"id":"n1820937680","loc":[-85.2389927,42.0229245],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:04Z","tags":{}},"n1820937681":{"id":"n1820937681","loc":[-85.0834892,42.1018642],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:04Z","tags":{}},"n1820937682":{"id":"n1820937682","loc":[-85.0619443,42.1049459],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:04Z","tags":{}},"n1820937683":{"id":"n1820937683","loc":[-85.2845366,41.9811868],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:04Z","tags":{}},"n1820937684":{"id":"n1820937684","loc":[-85.210411,42.0394123],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:04Z","tags":{}},"n1820937685":{"id":"n1820937685","loc":[-85.4377383,42.0055942],"version":"2","changeset":"12524188","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-28T14:51:01Z","tags":{}},"n1820937686":{"id":"n1820937686","loc":[-85.2882058,41.9789138],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:04Z","tags":{}},"n1820937687":{"id":"n1820937687","loc":[-85.2741191,41.9955808],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:04Z","tags":{}},"n1820937688":{"id":"n1820937688","loc":[-85.3442211,41.9903575],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:04Z","tags":{}},"n1820937689":{"id":"n1820937689","loc":[-85.2641413,41.9995237],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:04Z","tags":{}},"n1820937690":{"id":"n1820937690","loc":[-85.2804489,41.9829174],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:04Z","tags":{}},"n1820937691":{"id":"n1820937691","loc":[-85.5593342,41.9729074],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:04Z","tags":{}},"n1820937692":{"id":"n1820937692","loc":[-85.3590912,41.9932601],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:04Z","tags":{}},"n1820937694":{"id":"n1820937694","loc":[-85.4826445,41.9957479],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:05Z","tags":{}},"n1820937695":{"id":"n1820937695","loc":[-85.4539127,42.0063041],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:05Z","tags":{}},"n1820937696":{"id":"n1820937696","loc":[-85.2456767,42.0153683],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:05Z","tags":{}},"n1820937697":{"id":"n1820937697","loc":[-85.5794015,41.9489631],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:05Z","tags":{}},"n1820937698":{"id":"n1820937698","loc":[-85.4108686,42.0078507],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:05Z","tags":{}},"n1820937699":{"id":"n1820937699","loc":[-85.0616386,42.1051529],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:05Z","tags":{}},"n1820937700":{"id":"n1820937700","loc":[-85.4977979,41.978241],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:05Z","tags":{}},"n1820937701":{"id":"n1820937701","loc":[-85.2488417,42.0086319],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:05Z","tags":{}},"n1820937702":{"id":"n1820937702","loc":[-85.5588836,41.9728116],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:05Z","tags":{}},"n1820937703":{"id":"n1820937703","loc":[-85.4557366,42.0051241],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:05Z","tags":{}},"n1820937705":{"id":"n1820937705","loc":[-85.0723151,42.1056094],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:05Z","tags":{}},"n1820937706":{"id":"n1820937706","loc":[-85.0057909,42.0887323],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:05Z","tags":{}},"n1820937707":{"id":"n1820937707","loc":[-85.0756786,42.105677],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:05Z","tags":{}},"n1820937708":{"id":"n1820937708","loc":[-85.0901504,42.0940001],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:05Z","tags":{}},"n1820937709":{"id":"n1820937709","loc":[-85.0979999,42.0910213],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:05Z","tags":{}},"n1820937710":{"id":"n1820937710","loc":[-85.2376301,42.0239686],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:05Z","tags":{}},"n1820937711":{"id":"n1820937711","loc":[-85.2780671,41.9902299],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:05Z","tags":{}},"n1820937712":{"id":"n1820937712","loc":[-85.251481,42.0113188],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:05Z","tags":{}},"n1820937713":{"id":"n1820937713","loc":[-85.3114767,41.9690311],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:05Z","tags":{}},"n1820937714":{"id":"n1820937714","loc":[-85.2649621,41.9975662],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:05Z","tags":{}},"n1820937715":{"id":"n1820937715","loc":[-85.283807,41.9813383],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:05Z","tags":{}},"n1820937716":{"id":"n1820937716","loc":[-85.5515451,41.9703867],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:06Z","tags":{}},"n1820937717":{"id":"n1820937717","loc":[-85.1176605,42.0850896],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:06Z","tags":{}},"n1820937718":{"id":"n1820937718","loc":[-85.1069317,42.0862441],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:06Z","tags":{}},"n1820937719":{"id":"n1820937719","loc":[-85.2739314,41.9976938],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:06Z","tags":{}},"n1820937720":{"id":"n1820937720","loc":[-85.5550212,41.9702112],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:06Z","tags":{}},"n1820937721":{"id":"n1820937721","loc":[-85.3076679,41.9719904],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:06Z","tags":{}},"n1820937722":{"id":"n1820937722","loc":[-85.592319,41.9440316],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:06Z","tags":{}},"n1820937723":{"id":"n1820937723","loc":[-85.3139979,41.9704031],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:06Z","tags":{}},"n1820937724":{"id":"n1820937724","loc":[-85.0421134,42.1013149],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:06Z","tags":{}},"n1820937725":{"id":"n1820937725","loc":[-85.2508373,42.0102741],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:06Z","tags":{}},"n1820937726":{"id":"n1820937726","loc":[-85.0830922,42.1038821],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:06Z","tags":{}},"n1820937727":{"id":"n1820937727","loc":[-85.6342473,41.9360031],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:06Z","tags":{}},"n1820937730":{"id":"n1820937730","loc":[-85.0500192,42.1024942],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:06Z","tags":{}},"n1820937731":{"id":"n1820937731","loc":[-85.3498644,41.9926221],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:06Z","tags":{}},"n1820937732":{"id":"n1820937732","loc":[-85.0234117,42.0918903],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:06Z","tags":{}},"n1820937733":{"id":"n1820937733","loc":[-85.0464425,42.1009408],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:06Z","tags":{}},"n1820937734":{"id":"n1820937734","loc":[-85.033938,42.099886],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:06Z","tags":{}},"n1820937736":{"id":"n1820937736","loc":[-85.0152752,42.0886009],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:06Z","tags":{}},"n1820937737":{"id":"n1820937737","loc":[-85.0441894,42.1012671],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:06Z","tags":{}},"n1820937738":{"id":"n1820937738","loc":[-85.4668731,41.9979804],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:06Z","tags":{}},"n1820937739":{"id":"n1820937739","loc":[-85.4407377,42.006033],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:06Z","tags":{}},"n1820937740":{"id":"n1820937740","loc":[-85.2262253,42.0344878],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:06Z","tags":{}},"n1820937741":{"id":"n1820937741","loc":[-85.2550001,42.0033706],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:06Z","tags":{}},"n1820937742":{"id":"n1820937742","loc":[-85.3071422,41.9722617],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:06Z","tags":{}},"n1820937743":{"id":"n1820937743","loc":[-85.6147852,41.942228],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:06Z","tags":{}},"n1820937744":{"id":"n1820937744","loc":[-85.0183853,42.0901825],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:06Z","tags":{}},"n1820937745":{"id":"n1820937745","loc":[-85.6323161,41.9228489],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:07Z","tags":{}},"n1820937746":{"id":"n1820937746","loc":[-85.0095568,42.0901376],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:07Z","tags":{}},"n1820937747":{"id":"n1820937747","loc":[-85.2524037,42.0113826],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:07Z","tags":{}},"n1820937748":{"id":"n1820937748","loc":[-85.3186864,41.9708578],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:07Z","tags":{}},"n1820937749":{"id":"n1820937749","loc":[-85.2805669,41.9870883],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:07Z","tags":{}},"n1820937750":{"id":"n1820937750","loc":[-85.0585768,42.1038144],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:07Z","tags":{}},"n1820937751":{"id":"n1820937751","loc":[-85.2970786,41.9715358],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:07Z","tags":{}},"n1820937752":{"id":"n1820937752","loc":[-85.1315758,42.0723445],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:07Z","tags":{}},"n1820937753":{"id":"n1820937753","loc":[-85.2448291,42.0175444],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:07Z","tags":{}},"n1820937754":{"id":"n1820937754","loc":[-85.2446468,42.0174248],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:07Z","tags":{}},"n1820937755":{"id":"n1820937755","loc":[-85.229165,42.032129],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:07Z","tags":{}},"n1820937756":{"id":"n1820937756","loc":[-85.5612654,41.9724926],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:07Z","tags":{}},"n1820937757":{"id":"n1820937757","loc":[-85.2331776,42.030854],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:07Z","tags":{}},"n1820937758":{"id":"n1820937758","loc":[-85.2271909,42.0334519],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:07Z","tags":{}},"n1820937759":{"id":"n1820937759","loc":[-85.1032396,42.0879214],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:07Z","tags":{}},"n1820937760":{"id":"n1820937760","loc":[-85.0638447,42.1044154],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:07Z","tags":{}},"n1820937761":{"id":"n1820937761","loc":[-85.1260706,42.0745556],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:07Z","tags":{}},"n1820937762":{"id":"n1820937762","loc":[-85.3454485,41.99132],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:07Z","tags":{}},"n1820937763":{"id":"n1820937763","loc":[-85.2639321,41.9980088],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:07Z","tags":{}},"n1820937764":{"id":"n1820937764","loc":[-85.0837681,42.1013746],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:07Z","tags":{}},"n1820937765":{"id":"n1820937765","loc":[-85.2808137,41.9869368],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:07Z","tags":{}},"n1820937766":{"id":"n1820937766","loc":[-85.6338997,41.9309373],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:07Z","tags":{}},"n1820937767":{"id":"n1820937767","loc":[-85.2267403,42.0332766],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:07Z","tags":{}},"n1820937768":{"id":"n1820937768","loc":[-85.0605831,42.1052074],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:07Z","tags":{}},"n1820937769":{"id":"n1820937769","loc":[-85.0259021,42.0930037],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:07Z","tags":{}},"n1820937770":{"id":"n1820937770","loc":[-85.232963,42.0313162],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:07Z","tags":{}},"n1820937771":{"id":"n1820937771","loc":[-85.2404947,42.0125381],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:07Z","tags":{}},"n1820937772":{"id":"n1820937772","loc":[-85.0910892,42.0935742],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:08Z","tags":{}},"n1820937773":{"id":"n1820937773","loc":[-85.2554829,42.0019435],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:08Z","tags":{}},"n1820937774":{"id":"n1820937774","loc":[-85.2799339,41.9867773],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:08Z","tags":{}},"n1820937775":{"id":"n1820937775","loc":[-85.1075432,42.0852767],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:08Z","tags":{}},"n1820937776":{"id":"n1820937776","loc":[-85.1176927,42.0854001],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:08Z","tags":{}},"n1820937777":{"id":"n1820937777","loc":[-85.1067064,42.0863357],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:08Z","tags":{}},"n1820937778":{"id":"n1820937778","loc":[-85.2517492,42.0106333],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:08Z","tags":{}},"n1820937779":{"id":"n1820937779","loc":[-85.0987174,42.0909031],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:08Z","tags":{}},"n1820937780":{"id":"n1820937780","loc":[-85.1160083,42.0863994],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:08Z","tags":{}},"n1820937781":{"id":"n1820937781","loc":[-85.1268645,42.0739703],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:08Z","tags":{}},"n1820937782":{"id":"n1820937782","loc":[-85.0454702,42.1002852],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:08Z","tags":{}},"n1820937783":{"id":"n1820937783","loc":[-85.1334145,42.0705418],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:08Z","tags":{}},"n1820937784":{"id":"n1820937784","loc":[-85.5866542,41.947431],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:08Z","tags":{}},"n1820937786":{"id":"n1820937786","loc":[-85.2359886,42.0250366],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:08Z","tags":{}},"n1820937787":{"id":"n1820937787","loc":[-85.3138048,41.9698527],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:08Z","tags":{}},"n1820937788":{"id":"n1820937788","loc":[-85.1274291,42.0733081],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:08Z","tags":{}},"n1820937790":{"id":"n1820937790","loc":[-85.6292905,41.9411267],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:08Z","tags":{}},"n1820937791":{"id":"n1820937791","loc":[-85.5958809,41.9417333],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:08Z","tags":{}},"n1820937792":{"id":"n1820937792","loc":[-85.1271019,42.0737581],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:09Z","tags":{}},"n1820937793":{"id":"n1820937793","loc":[-85.2312679,42.0314437],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:09Z","tags":{}},"n1820937794":{"id":"n1820937794","loc":[-85.1081387,42.0863516],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:09Z","tags":{}},"n1820937795":{"id":"n1820937795","loc":[-85.2424473,42.0212109],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:09Z","tags":{}},"n1820937796":{"id":"n1820937796","loc":[-85.2710654,41.9975236],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:09Z","tags":{}},"n1820937797":{"id":"n1820937797","loc":[-85.4798408,41.9863223],"version":"2","changeset":"12182679","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T07:37:01Z","tags":{}},"n1820937798":{"id":"n1820937798","loc":[-85.035939,42.104296],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:09Z","tags":{}},"n1820937799":{"id":"n1820937799","loc":[-85.2178139,42.0395398],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:09Z","tags":{}},"n1820937800":{"id":"n1820937800","loc":[-85.0630709,42.1042614],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:09Z","tags":{}},"n1820937801":{"id":"n1820937801","loc":[-85.0440124,42.1014861],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:09Z","tags":{}},"n1820937802":{"id":"n1820937802","loc":[-85.1321874,42.0720458],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:09Z","tags":{}},"n1820937804":{"id":"n1820937804","loc":[-85.079427,42.1029121],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:09Z","tags":{}},"n1820937805":{"id":"n1820937805","loc":[-85.2962632,41.9738968],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:09Z","tags":{}},"n1820937806":{"id":"n1820937806","loc":[-85.6334748,41.9274627],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:09Z","tags":{}},"n1820937807":{"id":"n1820937807","loc":[-85.1057341,42.0872804],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:09Z","tags":{}},"n1820937808":{"id":"n1820937808","loc":[-85.4960169,41.9778263],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:09Z","tags":{}},"n1820937809":{"id":"n1820937809","loc":[-85.2821226,41.9910273],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:09Z","tags":{}},"n1820937810":{"id":"n1820937810","loc":[-85.0013868,42.0885054],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:09Z","tags":{}},"n1820937811":{"id":"n1820937811","loc":[-85.2952547,41.9729795],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:09Z","tags":{}},"n1820937812":{"id":"n1820937812","loc":[-85.1298375,42.0667842],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:09Z","tags":{}},"n1820937813":{"id":"n1820937813","loc":[-85.1339201,42.0710025],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:09Z","tags":{}},"n1820937814":{"id":"n1820937814","loc":[-85.0374356,42.103691],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:09Z","tags":{}},"n1820937815":{"id":"n1820937815","loc":[-85.0061115,42.0880607],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:09Z","tags":{}},"n1820937817":{"id":"n1820937817","loc":[-85.2398402,42.0226934],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:09Z","tags":{}},"n1820937818":{"id":"n1820937818","loc":[-85.123501,42.076236],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:09Z","tags":{}},"n1820937819":{"id":"n1820937819","loc":[-85.1209489,42.0791294],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:10Z","tags":{}},"n1820937820":{"id":"n1820937820","loc":[-85.0818624,42.1025778],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:10Z","tags":{}},"n1820937821":{"id":"n1820937821","loc":[-85.4428835,42.0054749],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:10Z","tags":{}},"n1820937822":{"id":"n1820937822","loc":[-85.4710359,41.9961147],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:10Z","tags":{}},"n1820937823":{"id":"n1820937823","loc":[-85.4253354,42.006198],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:10Z","tags":{}},"n1820937824":{"id":"n1820937824","loc":[-85.5486483,41.9709451],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:10Z","tags":{}},"n1820937825":{"id":"n1820937825","loc":[-85.2303238,42.0310452],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:10Z","tags":{}},"n1820937826":{"id":"n1820937826","loc":[-85.6450405,41.9136361],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:10Z","tags":{}},"n1820937828":{"id":"n1820937828","loc":[-85.2606853,41.9964073],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:10Z","tags":{}},"n1820937830":{"id":"n1820937830","loc":[-85.097383,42.0911447],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:10Z","tags":{}},"n1820937831":{"id":"n1820937831","loc":[-85.0498207,42.102136],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:10Z","tags":{}},"n1820937832":{"id":"n1820937832","loc":[-85.1232435,42.0763793],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:10Z","tags":{}},"n1820937833":{"id":"n1820937833","loc":[-85.394093,42.0055921],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:10Z","tags":{}},"n1820937834":{"id":"n1820937834","loc":[-85.3566665,41.9928295],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:10Z","tags":{}},"n1820937835":{"id":"n1820937835","loc":[-85.3543276,41.9920002],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:10Z","tags":{}},"n1820937837":{"id":"n1820937837","loc":[-85.084668,42.1034932],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:10Z","tags":{}},"n1820937838":{"id":"n1820937838","loc":[-85.4400296,42.0060649],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:10Z","tags":{}},"n1820937839":{"id":"n1820937839","loc":[-85.2362246,42.025714],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:10Z","tags":{}},"n1820937840":{"id":"n1820937840","loc":[-85.0409225,42.1012791],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:10Z","tags":{}},"n1820937841":{"id":"n1820937841","loc":[-85.2442283,42.019832],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:10Z","tags":{}},"n1820937842":{"id":"n1820937842","loc":[-85.1123001,42.084824],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:10Z","tags":{}},"n1820937843":{"id":"n1820937843","loc":[-85.1603074,42.0638061],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:10Z","tags":{}},"n1820937844":{"id":"n1820937844","loc":[-85.1359744,42.0650646],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:10Z","tags":{}},"n1820937845":{"id":"n1820937845","loc":[-85.1757569,42.053849],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:10Z","tags":{}},"n1820937846":{"id":"n1820937846","loc":[-85.5200925,41.9716686],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:10Z","tags":{}},"n1820937848":{"id":"n1820937848","loc":[-85.5525322,41.9701315],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:10Z","tags":{}},"n1820937849":{"id":"n1820937849","loc":[-85.0406489,42.10149],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:10Z","tags":{}},"n1820937850":{"id":"n1820937850","loc":[-85.0142547,42.088825],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:11Z","tags":{}},"n1820937851":{"id":"n1820937851","loc":[-85.343749,41.9881884],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:11Z","tags":{}},"n1820937852":{"id":"n1820937852","loc":[-85.074996,42.1060205],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:11Z","tags":{}},"n1820937853":{"id":"n1820937853","loc":[-85.2436275,42.0136864],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:11Z","tags":{}},"n1820937854":{"id":"n1820937854","loc":[-85.2641453,41.9980897],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:11Z","tags":{}},"n1820937856":{"id":"n1820937856","loc":[-85.2802343,41.9870086],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:11Z","tags":{}},"n1820937857":{"id":"n1820937857","loc":[-85.0099256,42.0909946],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:11Z","tags":{}},"n1820937858":{"id":"n1820937858","loc":[-85.493957,41.9786079],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:11Z","tags":{}},"n1820937859":{"id":"n1820937859","loc":[-85.0739405,42.1059795],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:11Z","tags":{}},"n1820937860":{"id":"n1820937860","loc":[-85.2331605,42.0301423],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:11Z","tags":{}},"n1820937862":{"id":"n1820937862","loc":[-85.2035231,42.0438425],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:11Z","tags":{}},"n1820937863":{"id":"n1820937863","loc":[-85.0884928,42.0986971],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:11Z","tags":{}},"n1820937864":{"id":"n1820937864","loc":[-85.131597,42.0690142],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:11Z","tags":{}},"n1820937865":{"id":"n1820937865","loc":[-85.3937454,42.0052677],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:11Z","tags":{}},"n1820937866":{"id":"n1820937866","loc":[-85.2212729,42.0378561],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:11Z","tags":{}},"n1820937867":{"id":"n1820937867","loc":[-85.0886068,42.0982421],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:11Z","tags":{}},"n1820937868":{"id":"n1820937868","loc":[-85.0875004,42.0968064],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:11Z","tags":{}},"n1820937869":{"id":"n1820937869","loc":[-85.0771323,42.1042642],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:12Z","tags":{}},"n1820937870":{"id":"n1820937870","loc":[-85.0164554,42.0894887],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:12Z","tags":{}},"n1820937871":{"id":"n1820937871","loc":[-85.6069102,41.9415577],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:12Z","tags":{}},"n1820937872":{"id":"n1820937872","loc":[-85.3273875,41.9704908],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:12Z","tags":{}},"n1820937873":{"id":"n1820937873","loc":[-85.3890891,41.9997983],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:12Z","tags":{}},"n1820937875":{"id":"n1820937875","loc":[-85.5091276,41.9723705],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:12Z","tags":{}},"n1820937876":{"id":"n1820937876","loc":[-85.0770626,42.1047696],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:12Z","tags":{}},"n1820937877":{"id":"n1820937877","loc":[-85.612575,41.9419567],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:12Z","tags":{}},"n1820937878":{"id":"n1820937878","loc":[-85.3868146,42.0036094],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:12Z","tags":{}},"n1820937879":{"id":"n1820937879","loc":[-85.2722738,41.9981204],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:12Z","tags":{}},"n1820937880":{"id":"n1820937880","loc":[-85.3064878,41.9723733],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:12Z","tags":{}},"n1820937882":{"id":"n1820937882","loc":[-85.1270845,42.0727678],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:12Z","tags":{}},"n1820937884":{"id":"n1820937884","loc":[-85.3316512,41.97923],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:12Z","tags":{}},"n1820937885":{"id":"n1820937885","loc":[-85.3932519,42.0042472],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:12Z","tags":{}},"n1820937886":{"id":"n1820937886","loc":[-85.2457411,42.0175444],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:12Z","tags":{}},"n1820937887":{"id":"n1820937887","loc":[-85.1397509,42.0648415],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:12Z","tags":{}},"n1820937891":{"id":"n1820937891","loc":[-85.3196735,41.9719665],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:12Z","tags":{}},"n1820937892":{"id":"n1820937892","loc":[-85.3372473,41.9845033],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:12Z","tags":{}},"n1820937894":{"id":"n1820937894","loc":[-85.3254778,41.9719745],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:12Z","tags":{}},"n1820937897":{"id":"n1820937897","loc":[-85.3185148,41.9691268],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:12Z","tags":{}},"n1820937899":{"id":"n1820937899","loc":[-85.5419106,41.9714556],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:12Z","tags":{}},"n1820937901":{"id":"n1820937901","loc":[-85.3293509,41.9748368],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:12Z","tags":{}},"n1820937903":{"id":"n1820937903","loc":[-85.0798078,42.1028365],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:13Z","tags":{}},"n1820937905":{"id":"n1820937905","loc":[-85.3954191,42.0056025],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:13Z","tags":{}},"n1820937909":{"id":"n1820937909","loc":[-85.3417534,41.9857155],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:13Z","tags":{}},"n1820937913":{"id":"n1820937913","loc":[-84.9927822,42.0857107],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:13Z","tags":{}},"n1820937915":{"id":"n1820937915","loc":[-85.5444212,41.9712801],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:13Z","tags":{}},"n1820937917":{"id":"n1820937917","loc":[-85.259088,41.9981682],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:13Z","tags":{}},"n1820937921":{"id":"n1820937921","loc":[-85.2784576,41.9876358],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:13Z","tags":{}},"n1820937922":{"id":"n1820937922","loc":[-84.9971918,42.087753],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:13Z","tags":{}},"n1820937924":{"id":"n1820937924","loc":[-85.5310688,41.966899],"version":"2","changeset":"12182668","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T07:35:33Z","tags":{}},"n1820937928":{"id":"n1820937928","loc":[-85.3766436,41.9979326],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:13Z","tags":{}},"n1820937930":{"id":"n1820937930","loc":[-85.5494852,41.9704346],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:13Z","tags":{}},"n1820937933":{"id":"n1820937933","loc":[-85.5548281,41.9695412],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:13Z","tags":{}},"n1820937935":{"id":"n1820937935","loc":[-85.0768588,42.105088],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:13Z","tags":{}},"n1820937937":{"id":"n1820937937","loc":[-85.2646885,41.9978054],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:13Z","tags":{}},"n1820937939":{"id":"n1820937939","loc":[-85.2441532,42.0176082],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:13Z","tags":{}},"n1820937941":{"id":"n1820937941","loc":[-85.105553,42.0877928],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:13Z","tags":{}},"n1820937943":{"id":"n1820937943","loc":[-85.0879457,42.0958909],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:13Z","tags":{}},"n1820937944":{"id":"n1820937944","loc":[-85.3187015,41.9704402],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:13Z","tags":{}},"n1820937945":{"id":"n1820937945","loc":[-85.5624456,41.970626],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:13Z","tags":{}},"n1820937946":{"id":"n1820937946","loc":[-85.0580176,42.1028644],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:13Z","tags":{}},"n1820937948":{"id":"n1820937948","loc":[-85.3016061,41.9726286],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:13Z","tags":{}},"n1820937949":{"id":"n1820937949","loc":[-85.4310388,42.0069418],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:13Z","tags":{}},"n1820937950":{"id":"n1820937950","loc":[-85.2945144,41.9740723],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:13Z","tags":{}},"n1820937951":{"id":"n1820937951","loc":[-85.1170222,42.082657],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:13Z","tags":{}},"n1820937952":{"id":"n1820937952","loc":[-85.0864503,42.0947632],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:14Z","tags":{}},"n1820937953":{"id":"n1820937953","loc":[-85.4285926,42.0059533],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:14Z","tags":{}},"n1820937970":{"id":"n1820937970","loc":[-85.3629965,41.9938023],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:14Z","tags":{}},"n1820937972":{"id":"n1820937972","loc":[-85.2438099,42.0199755],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:14Z","tags":{}},"n1820937974":{"id":"n1820937974","loc":[-85.1327654,42.0699285],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:14Z","tags":{}},"n1820937977":{"id":"n1820937977","loc":[-85.1515956,42.0611935],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:14Z","tags":{}},"n1820937978":{"id":"n1820937978","loc":[-85.0107369,42.0896638],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:14Z","tags":{}},"n1820937979":{"id":"n1820937979","loc":[-85.1152626,42.0862083],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:14Z","tags":{}},"n1820937980":{"id":"n1820937980","loc":[-85.4531831,42.0062881],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:14Z","tags":{}},"n1820937981":{"id":"n1820937981","loc":[-85.0341473,42.0985924],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:14Z","tags":{}},"n1820937982":{"id":"n1820937982","loc":[-85.0877485,42.0960171],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:14Z","tags":{}},"n1820937983":{"id":"n1820937983","loc":[-85.2756373,41.9951742],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:14Z","tags":{}},"n1820937984":{"id":"n1820937984","loc":[-85.2965421,41.9714401],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:14Z","tags":{}},"n1820937985":{"id":"n1820937985","loc":[-85.2409775,42.0226934],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:14Z","tags":{}},"n1820937986":{"id":"n1820937986","loc":[-85.0170723,42.0900579],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:14Z","tags":{}},"n1820937987":{"id":"n1820937987","loc":[-85.1034663,42.0880555],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:14Z","tags":{}},"n1820937988":{"id":"n1820937988","loc":[-85.0585071,42.1031577],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:14Z","tags":{}},"n1820937990":{"id":"n1820937990","loc":[-85.0819174,42.1032373],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:14Z","tags":{}},"n1820937992":{"id":"n1820937992","loc":[-85.0546608,42.1030542],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:14Z","tags":{}},"n1820937993":{"id":"n1820937993","loc":[-85.0100811,42.0906125],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:14Z","tags":{}},"n1820937995":{"id":"n1820937995","loc":[-85.6304278,41.9432655],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:14Z","tags":{}},"n1820937997":{"id":"n1820937997","loc":[-85.0255628,42.092778],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:14Z","tags":{}},"n1820938011":{"id":"n1820938011","loc":[-85.2316756,42.0317146],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:15Z","tags":{}},"n1820938012":{"id":"n1820938012","loc":[-85.4067917,42.008042],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:15Z","tags":{}},"n1820938013":{"id":"n1820938013","loc":[-85.390398,42.0028759],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:15Z","tags":{}},"n1820938014":{"id":"n1820938014","loc":[-85.0161604,42.0886527],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:15Z","tags":{}},"n1820938015":{"id":"n1820938015","loc":[-85.125337,42.0744589],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:15Z","tags":{}},"n1820938016":{"id":"n1820938016","loc":[-85.2151317,42.0404801],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:15Z","tags":{}},"n1820938017":{"id":"n1820938017","loc":[-85.3165085,41.9706025],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:15Z","tags":{}},"n1820938018":{"id":"n1820938018","loc":[-85.5641193,41.9640688],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:15Z","tags":{}},"n1820938019":{"id":"n1820938019","loc":[-85.147583,42.0642203],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:15Z","tags":{}},"n1820938022":{"id":"n1820938022","loc":[-85.2803781,41.9947886],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:15Z","tags":{}},"n1820938024":{"id":"n1820938024","loc":[-85.2692469,41.9982053],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:15Z","tags":{}},"n1820938026":{"id":"n1820938026","loc":[-85.4321975,42.0067505],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:15Z","tags":{}},"n1820938028":{"id":"n1820938028","loc":[-85.572535,41.9633405],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:15Z","tags":{}},"n1820938030":{"id":"n1820938030","loc":[-85.3237505,41.9716475],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:15Z","tags":{}},"n1820938032":{"id":"n1820938032","loc":[-85.6487698,41.9141583],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:15Z","tags":{}},"n1820938033":{"id":"n1820938033","loc":[-85.0526371,42.1038315],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:15Z","tags":{}},"n1820938034":{"id":"n1820938034","loc":[-85.088069,42.0978731],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:15Z","tags":{}},"n1820938035":{"id":"n1820938035","loc":[-85.2516312,42.0102267],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:15Z","tags":{}},"n1820938039":{"id":"n1820938039","loc":[-85.2731374,41.9982958],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:15Z","tags":{}},"n1820938040":{"id":"n1820938040","loc":[-85.5453224,41.9713439],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:16Z","tags":{}},"n1820938041":{"id":"n1820938041","loc":[-85.4480548,42.0049647],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:16Z","tags":{}},"n1820938043":{"id":"n1820938043","loc":[-85.2504081,42.010322],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:16Z","tags":{}},"n1820938045":{"id":"n1820938045","loc":[-85.2663447,41.99919],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:16Z","tags":{}},"n1820938046":{"id":"n1820938046","loc":[-85.0507287,42.102907],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:16Z","tags":{}},"n1820938047":{"id":"n1820938047","loc":[-85.0408246,42.1024743],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:16Z","tags":{}},"n1820938048":{"id":"n1820938048","loc":[-85.2796335,41.9866099],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:16Z","tags":{}},"n1820938050":{"id":"n1820938050","loc":[-85.452475,42.0061127],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:16Z","tags":{}},"n1820938051":{"id":"n1820938051","loc":[-85.2410569,42.0128147],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:16Z","tags":{}},"n1820938052":{"id":"n1820938052","loc":[-85.0413302,42.1011477],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:16Z","tags":{}},"n1820938053":{"id":"n1820938053","loc":[-85.6327409,41.9197627],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:16Z","tags":{}},"n1820938056":{"id":"n1820938056","loc":[-85.1072039,42.0857994],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:16Z","tags":{}},"n1820938057":{"id":"n1820938057","loc":[-85.2001114,42.0448145],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:16Z","tags":{}},"n1820938058":{"id":"n1820938058","loc":[-85.2655347,41.9978186],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:16Z","tags":{}},"n1820938059":{"id":"n1820938059","loc":[-85.2330918,42.0304874],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:16Z","tags":{}},"n1820938060":{"id":"n1820938060","loc":[-85.2601113,41.9966545],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:16Z","tags":{}},"n1820938061":{"id":"n1820938061","loc":[-85.5397863,41.9708494],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:16Z","tags":{}},"n1820938062":{"id":"n1820938062","loc":[-85.2702085,41.9977217],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:16Z","tags":{}},"n1820938063":{"id":"n1820938063","loc":[-85.2219982,42.03699],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:16Z","tags":{}},"n1820938064":{"id":"n1820938064","loc":[-85.0668957,42.105121],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:16Z","tags":{}},"n1820938065":{"id":"n1820938065","loc":[-85.2328665,42.0270769],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:16Z","tags":{}},"n1820938066":{"id":"n1820938066","loc":[-85.3189654,41.9694778],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:16Z","tags":{}},"n1820938067":{"id":"n1820938067","loc":[-85.3814115,42.0022915],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:16Z","tags":{}},"n1820938068":{"id":"n1820938068","loc":[-85.2759108,41.9956008],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:16Z","tags":{}},"n1820938069":{"id":"n1820938069","loc":[-85.0391938,42.1034853],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:17Z","tags":{}},"n1820938070":{"id":"n1820938070","loc":[-85.2850623,41.9810353],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:17Z","tags":{}},"n1820938071":{"id":"n1820938071","loc":[-85.538074,41.970855],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:17Z","tags":{}},"n1820938073":{"id":"n1820938073","loc":[-85.1319661,42.0670932],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:17Z","tags":{}},"n1820938074":{"id":"n1820938074","loc":[-85.2816763,41.9913678],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:17Z","tags":{}},"n1820938075":{"id":"n1820938075","loc":[-85.3182144,41.9700282],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:17Z","tags":{}},"n1820938076":{"id":"n1820938076","loc":[-85.5909028,41.9458989],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:17Z","tags":{}},"n1820938077":{"id":"n1820938077","loc":[-85.4057617,42.0074361],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:17Z","tags":{}},"n1820938078":{"id":"n1820938078","loc":[-85.2620438,41.9967729],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:17Z","tags":{}},"n1820938079":{"id":"n1820938079","loc":[-85.1122143,42.0851107],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:17Z","tags":{}},"n1820938080":{"id":"n1820938080","loc":[-85.2443785,42.0174567],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:17Z","tags":{}},"n1820938081":{"id":"n1820938081","loc":[-85.0319733,42.0953853],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:17Z","tags":{}},"n1820938082":{"id":"n1820938082","loc":[-85.0878276,42.09443],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:17Z","tags":{}},"n1820938083":{"id":"n1820938083","loc":[-85.0271789,42.0935809],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:17Z","tags":{}},"n1820938084":{"id":"n1820938084","loc":[-85.0326399,42.0974222],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:17Z","tags":{}},"n1820938085":{"id":"n1820938085","loc":[-85.3989167,42.0065592],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:17Z","tags":{}},"n1820938086":{"id":"n1820938086","loc":[-85.3263361,41.9721261],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:17Z","tags":{}},"n1820938087":{"id":"n1820938087","loc":[-85.2547855,42.0037134],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:17Z","tags":{}},"n1820938088":{"id":"n1820938088","loc":[-85.4373259,42.005746],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:17Z","tags":{}},"n1820938089":{"id":"n1820938089","loc":[-85.3094275,41.9699245],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:17Z","tags":{}},"n1820938090":{"id":"n1820938090","loc":[-85.2783246,41.9872793],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:17Z","tags":{}},"n1820938092":{"id":"n1820938092","loc":[-85.0815633,42.1025169],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:17Z","tags":{}},"n1820938093":{"id":"n1820938093","loc":[-85.1788511,42.0522134],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:17Z","tags":{}},"n1820938095":{"id":"n1820938095","loc":[-85.2830345,41.9816733],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:17Z","tags":{}},"n1820938096":{"id":"n1820938096","loc":[-85.0744984,42.1059835],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:17Z","tags":{}},"n1820938097":{"id":"n1820938097","loc":[-85.2788396,41.9879333],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:17Z","tags":{}},"n1820938098":{"id":"n1820938098","loc":[-85.3640093,41.9946531],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:18Z","tags":{}},"n1820938099":{"id":"n1820938099","loc":[-85.291167,41.9787463],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:18Z","tags":{}},"n1820938100":{"id":"n1820938100","loc":[-85.0772436,42.1038156],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:18Z","tags":{}},"n1820938101":{"id":"n1820938101","loc":[-85.00563,42.0887482],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:18Z","tags":{}},"n1820938102":{"id":"n1820938102","loc":[-85.0326881,42.0961245],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:18Z","tags":{}},"n1820938104":{"id":"n1820938104","loc":[-85.0530448,42.1038634],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:18Z","tags":{}},"n1820938105":{"id":"n1820938105","loc":[-85.2625266,41.9970639],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:18Z","tags":{}},"n1820938106":{"id":"n1820938106","loc":[-85.2827556,41.9823512],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:18Z","tags":{}},"n1820938107":{"id":"n1820938107","loc":[-85.2784319,41.9910752],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:18Z","tags":{}},"n1820938108":{"id":"n1820938108","loc":[-85.0882099,42.094393],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:18Z","tags":{}},"n1820938109":{"id":"n1820938109","loc":[-85.5718484,41.9645371],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:18Z","tags":{}},"n1820938110":{"id":"n1820938110","loc":[-85.2559764,42.0099317],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:18Z","tags":{}},"n1820938111":{"id":"n1820938111","loc":[-85.2969284,41.973179],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:18Z","tags":{}},"n1820938113":{"id":"n1820938113","loc":[-85.3875055,42.0019726],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:18Z","tags":{}},"n1820938114":{"id":"n1820938114","loc":[-85.4250779,42.0068199],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:18Z","tags":{}},"n1820938115":{"id":"n1820938115","loc":[-85.0645367,42.104889],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:18Z","tags":{}},"n1820938116":{"id":"n1820938116","loc":[-85.1636762,42.0623724],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:18Z","tags":{}},"n1820938117":{"id":"n1820938117","loc":[-85.0757322,42.1055935],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:18Z","tags":{}},"n1820938118":{"id":"n1820938118","loc":[-85.3695197,41.9981559],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:19Z","tags":{}},"n1820938120":{"id":"n1820938120","loc":[-85.1297516,42.0671027],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:19Z","tags":{}},"n1820938121":{"id":"n1820938121","loc":[-85.1057448,42.0875551],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:19Z","tags":{}},"n1820938122":{"id":"n1820938122","loc":[-85.2805175,41.9943182],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:19Z","tags":{}},"n1820938123":{"id":"n1820938123","loc":[-85.2545173,42.0040722],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:19Z","tags":{}},"n1820938124":{"id":"n1820938124","loc":[-84.9966607,42.0871319],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:19Z","tags":{}},"n1820938125":{"id":"n1820938125","loc":[-85.0099899,42.0904612],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:19Z","tags":{}},"n1820938126":{"id":"n1820938126","loc":[-85.2489919,42.0091102],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:19Z","tags":{}},"n1820938127":{"id":"n1820938127","loc":[-85.0342706,42.0979476],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:19Z","tags":{}},"n1820938128":{"id":"n1820938128","loc":[-85.1080891,42.0855884],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:19Z","tags":{}},"n1820938129":{"id":"n1820938129","loc":[-85.0128183,42.0905356],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:19Z","tags":{}},"n1820938130":{"id":"n1820938130","loc":[-85.631608,41.9434251],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:19Z","tags":{}},"n1820938131":{"id":"n1820938131","loc":[-85.2551975,42.0008524],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:19Z","tags":{}},"n1820938132":{"id":"n1820938132","loc":[-85.6421823,41.9096233],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:19Z","tags":{}},"n1820938133":{"id":"n1820938133","loc":[-85.0125059,42.0906284],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:19Z","tags":{}},"n1820938134":{"id":"n1820938134","loc":[-85.5499358,41.9701793],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:19Z","tags":{}},"n1820938135":{"id":"n1820938135","loc":[-85.5472107,41.9712323],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:19Z","tags":{}},"n1820938136":{"id":"n1820938136","loc":[-85.2760758,41.9958691],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:19Z","tags":{}},"n1820938137":{"id":"n1820938137","loc":[-85.276678,41.9960433],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:19Z","tags":{}},"n1820938138":{"id":"n1820938138","loc":[-85.0570319,42.1024731],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:19Z","tags":{}},"n1820938140":{"id":"n1820938140","loc":[-85.2394325,42.0227492],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:19Z","tags":{}},"n1820938142":{"id":"n1820938142","loc":[-85.5666341,41.9638829],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:19Z","tags":{}},"n1820938144":{"id":"n1820938144","loc":[-85.258101,41.9996353],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:19Z","tags":{}},"n1820938147":{"id":"n1820938147","loc":[-85.2129645,42.0413565],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:19Z","tags":{}},"n1820938149":{"id":"n1820938149","loc":[-84.9962369,42.0868373],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:20Z","tags":{}},"n1820938151":{"id":"n1820938151","loc":[-85.2570386,42.0084968],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:20Z","tags":{}},"n1820938153":{"id":"n1820938153","loc":[-85.3971142,42.0050285],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:20Z","tags":{}},"n1820938155":{"id":"n1820938155","loc":[-85.1072093,42.0855566],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:20Z","tags":{}},"n1820938157":{"id":"n1820938157","loc":[-85.2840323,41.9920959],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:20Z","tags":{}},"n1820938159":{"id":"n1820938159","loc":[-85.1187924,42.0816458],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:20Z","tags":{}},"n1820938161":{"id":"n1820938161","loc":[-85.2681324,41.9985788],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:20Z","tags":{}},"n1820938163":{"id":"n1820938163","loc":[-85.0887034,42.0984969],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:20Z","tags":{}},"n1820938165":{"id":"n1820938165","loc":[-85.4133405,42.0073141],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:20Z","tags":{}},"n1820938166":{"id":"n1820938166","loc":[-85.0097445,42.0902888],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:20Z","tags":{}},"n1820938167":{"id":"n1820938167","loc":[-85.0828133,42.1037388],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:20Z","tags":{}},"n1820938168":{"id":"n1820938168","loc":[-85.0549599,42.1030833],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:20Z","tags":{}},"n1820938169":{"id":"n1820938169","loc":[-85.4571528,42.0010421],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:20Z","tags":{}},"n1820938178":{"id":"n1820938178","loc":[-85.2706644,41.9975941],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:20Z","tags":{}},"n1820938180":{"id":"n1820938180","loc":[-85.2258606,42.0335794],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:20Z","tags":{}},"n1820938182":{"id":"n1820938182","loc":[-85.2832276,41.9814659],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:20Z","tags":{}},"n1820938184":{"id":"n1820938184","loc":[-85.1082299,42.0860928],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:20Z","tags":{}},"n1820938185":{"id":"n1820938185","loc":[-85.3839392,42.0022381],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:20Z","tags":{}},"n1820938186":{"id":"n1820938186","loc":[-85.2772131,41.995905],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:20Z","tags":{}},"n1820938187":{"id":"n1820938187","loc":[-85.1044895,42.0879214],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:20Z","tags":{}},"n1820938188":{"id":"n1820938188","loc":[-85.2135267,42.0407087],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:20Z","tags":{}},"n1820938189":{"id":"n1820938189","loc":[-85.2543993,42.0044628],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:20Z","tags":{}},"n1820938190":{"id":"n1820938190","loc":[-85.1501793,42.0617351],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:20Z","tags":{}},"n1820938191":{"id":"n1820938191","loc":[-85.3350587,41.9820469],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:20Z","tags":{}},"n1820938192":{"id":"n1820938192","loc":[-85.1350731,42.0655735],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:20Z","tags":{}},"n1820938193":{"id":"n1820938193","loc":[-85.0404008,42.1028843],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:20Z","tags":{}},"n1820938194":{"id":"n1820938194","loc":[-85.6323161,41.943042],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:21Z","tags":{}},"n1820938195":{"id":"n1820938195","loc":[-85.1259593,42.0742837],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:21Z","tags":{}},"n1820938196":{"id":"n1820938196","loc":[-85.4562988,42.0033758],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:21Z","tags":{}},"n1820938197":{"id":"n1820938197","loc":[-85.256824,42.0056826],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:21Z","tags":{}},"n1820938198":{"id":"n1820938198","loc":[-85.2742103,41.9963862],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:21Z","tags":{}},"n1820938199":{"id":"n1820938199","loc":[-85.0380888,42.1037877],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:21Z","tags":{}},"n1820938200":{"id":"n1820938200","loc":[-85.47404,41.9944721],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:21Z","tags":{}},"n1820938201":{"id":"n1820938201","loc":[-85.103021,42.087948],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:21Z","tags":{}},"n1820938202":{"id":"n1820938202","loc":[-85.4030151,42.0065113],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:21Z","tags":{}},"n1820938203":{"id":"n1820938203","loc":[-85.2113981,42.040735],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:21Z","tags":{}},"n1820938204":{"id":"n1820938204","loc":[-85.2603433,41.9965137],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:21Z","tags":{}},"n1820938206":{"id":"n1820938206","loc":[-85.1669378,42.0607634],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:21Z","tags":{}},"n1820938207":{"id":"n1820938207","loc":[-85.0642027,42.1046076],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:21Z","tags":{}},"n1820938208":{"id":"n1820938208","loc":[-85.2812428,41.9915696],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:21Z","tags":{}},"n1820938209":{"id":"n1820938209","loc":[-85.0839559,42.1038343],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:21Z","tags":{}},"n1820938210":{"id":"n1820938210","loc":[-85.1239946,42.0769368],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:21Z","tags":{}},"n1820938211":{"id":"n1820938211","loc":[-85.2311177,42.0283042],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:21Z","tags":{}},"n1820938212":{"id":"n1820938212","loc":[-85.2791614,41.9882682],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:21Z","tags":{}},"n1820938213":{"id":"n1820938213","loc":[-85.2674941,41.9987582],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:21Z","tags":{}},"n1820938214":{"id":"n1820938214","loc":[-85.352787,41.9919579],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:21Z","tags":{}},"n1820938215":{"id":"n1820938215","loc":[-85.0874146,42.0952182],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:21Z","tags":{}},"n1820938216":{"id":"n1820938216","loc":[-85.0069711,42.0877092],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:21Z","tags":{}},"n1820938217":{"id":"n1820938217","loc":[-85.2059049,42.0404004],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:21Z","tags":{}},"n1820938218":{"id":"n1820938218","loc":[-85.2403552,42.0227332],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:21Z","tags":{}},"n1820938219":{"id":"n1820938219","loc":[-85.2492923,42.0098915],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:21Z","tags":{}},"n1820938220":{"id":"n1820938220","loc":[-85.269778,41.9979541],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:22Z","tags":{}},"n1820938221":{"id":"n1820938221","loc":[-85.2097673,42.0389024],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:22Z","tags":{}},"n1820938222":{"id":"n1820938222","loc":[-85.0845942,42.1032015],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:22Z","tags":{}},"n1820938223":{"id":"n1820938223","loc":[-84.993206,42.0858142],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:22Z","tags":{}},"n1820938224":{"id":"n1820938224","loc":[-85.2108187,42.0402729],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:22Z","tags":{}},"n1820938225":{"id":"n1820938225","loc":[-84.9893959,42.0873043],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:22Z","tags":{}},"n1820938226":{"id":"n1820938226","loc":[-85.2952332,41.9719984],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:22Z","tags":{}},"n1820938227":{"id":"n1820938227","loc":[-85.4100961,42.0081536],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:22Z","tags":{}},"n1820938228":{"id":"n1820938228","loc":[-85.3299088,41.9785696],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:22Z","tags":{}},"n1820938229":{"id":"n1820938229","loc":[-85.2258176,42.0340097],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:22Z","tags":{}},"n1820938230":{"id":"n1820938230","loc":[-85.3146739,41.9711449],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:22Z","tags":{}},"n1820938231":{"id":"n1820938231","loc":[-85.5447645,41.9712801],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:22Z","tags":{}},"n1820938232":{"id":"n1820938232","loc":[-85.5510087,41.9705941],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:22Z","tags":{}},"n1820938233":{"id":"n1820938233","loc":[-85.5122389,41.9703445],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:22Z","tags":{}},"n1820938234":{"id":"n1820938234","loc":[-85.2792687,41.9865381],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:22Z","tags":{}},"n1820938235":{"id":"n1820938235","loc":[-85.1475229,42.0630151],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:22Z","tags":{}},"n1820938237":{"id":"n1820938237","loc":[-85.0332889,42.0996034],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:22Z","tags":{}},"n1820938238":{"id":"n1820938238","loc":[-85.2588882,41.9986877],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:22Z","tags":{}},"n1820938239":{"id":"n1820938239","loc":[-85.0656458,42.1050892],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:22Z","tags":{}},"n1820938240":{"id":"n1820938240","loc":[-84.9913915,42.086098],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:23Z","tags":{}},"n1820938241":{"id":"n1820938241","loc":[-85.4752416,41.9944402],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:23Z","tags":{}},"n1820938242":{"id":"n1820938242","loc":[-85.1214304,42.0791147],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:23Z","tags":{}},"n1820938243":{"id":"n1820938243","loc":[-85.0075183,42.0886925],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:23Z","tags":{}},"n1820938244":{"id":"n1820938244","loc":[-85.1052888,42.0872087],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:23Z","tags":{}},"n1820938245":{"id":"n1820938245","loc":[-85.3104252,41.9703393],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:23Z","tags":{}},"n1820938246":{"id":"n1820938246","loc":[-85.232109,42.0318158],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:23Z","tags":{}},"n1820938247":{"id":"n1820938247","loc":[-85.0756075,42.1059528],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:23Z","tags":{}},"n1820938248":{"id":"n1820938248","loc":[-85.0075612,42.0890866],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:23Z","tags":{}},"n1820938249":{"id":"n1820938249","loc":[-85.1013312,42.0897474],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:23Z","tags":{}},"n1820938250":{"id":"n1820938250","loc":[-85.1168076,42.0828919],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:23Z","tags":{}},"n1820938251":{"id":"n1820938251","loc":[-85.2951367,41.9723334],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:23Z","tags":{}},"n1820938252":{"id":"n1820938252","loc":[-85.0879363,42.0976053],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:23Z","tags":{}},"n1820938253":{"id":"n1820938253","loc":[-85.0354763,42.1021838],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:23Z","tags":{}},"n1820938254":{"id":"n1820938254","loc":[-85.2379627,42.0236339],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:23Z","tags":{}},"n1820938255":{"id":"n1820938255","loc":[-85.1308245,42.0685364],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:23Z","tags":{}},"n1820938256":{"id":"n1820938256","loc":[-85.0914446,42.0934774],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:23Z","tags":{}},"n1820938257":{"id":"n1820938257","loc":[-85.2436812,42.014069],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:23Z","tags":{}},"n1820938258":{"id":"n1820938258","loc":[-85.0682529,42.1056106],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:23Z","tags":{}},"n1820938259":{"id":"n1820938259","loc":[-85.290652,41.9766805],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:23Z","tags":{}},"n1820938260":{"id":"n1820938260","loc":[-85.0133494,42.0897434],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:23Z","tags":{}},"n1820938261":{"id":"n1820938261","loc":[-85.2753047,41.9949429],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:23Z","tags":{}},"n1820938262":{"id":"n1820938262","loc":[-85.0314691,42.0950788],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:23Z","tags":{}},"n1820938263":{"id":"n1820938263","loc":[-85.3444786,41.9908359],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:24Z","tags":{}},"n1820938264":{"id":"n1820938264","loc":[-85.0443115,42.1009061],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:24Z","tags":{}},"n1820938265":{"id":"n1820938265","loc":[-85.0634853,42.1043159],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:24Z","tags":{}},"n1820938267":{"id":"n1820938267","loc":[-85.3978223,42.0053952],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:24Z","tags":{}},"n1820938268":{"id":"n1820938268","loc":[-85.0228659,42.0911885],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:24Z","tags":{}},"n1820938269":{"id":"n1820938269","loc":[-85.0220237,42.0906272],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:24Z","tags":{}},"n1820938270":{"id":"n1820938270","loc":[-85.1061525,42.0863369],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:24Z","tags":{}},"n1820938271":{"id":"n1820938271","loc":[-85.2382309,42.0233708],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:24Z","tags":{}},"n1820938272":{"id":"n1820938272","loc":[-85.310672,41.9702755],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:24Z","tags":{}},"n1820938273":{"id":"n1820938273","loc":[-85.1448192,42.0652613],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:24Z","tags":{}},"n1820938274":{"id":"n1820938274","loc":[-85.6036057,41.9403766],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:24Z","tags":{}},"n1820938275":{"id":"n1820938275","loc":[-85.0778941,42.1032413],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:24Z","tags":{}},"n1820938276":{"id":"n1820938276","loc":[-85.1279374,42.0723974],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:24Z","tags":{}},"n1820938277":{"id":"n1820938277","loc":[-85.2806635,41.9847836],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:24Z","tags":{}},"n1820938278":{"id":"n1820938278","loc":[-85.2653201,41.9976352],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:24Z","tags":{}},"n1820938279":{"id":"n1820938279","loc":[-85.0351665,42.1001805],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:24Z","tags":{}},"n1820938280":{"id":"n1820938280","loc":[-85.0718269,42.1056253],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:24Z","tags":{}},"n1820938281":{"id":"n1820938281","loc":[-85.2574248,42.0075322],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:24Z","tags":{}},"n1820938282":{"id":"n1820938282","loc":[-85.126666,42.0740778],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:24Z","tags":{}},"n1820938283":{"id":"n1820938283","loc":[-85.077705,42.1034733],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:24Z","tags":{}},"n1820938284":{"id":"n1820938284","loc":[-85.3535552,41.9919045],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:24Z","tags":{}},"n1820938286":{"id":"n1820938286","loc":[-85.2810711,41.9866657],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:24Z","tags":{}},"n1820938287":{"id":"n1820938287","loc":[-85.4567494,42.0019885],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:24Z","tags":{}},"n1820938288":{"id":"n1820938288","loc":[-85.2642419,41.9992936],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:24Z","tags":{}},"n1820938289":{"id":"n1820938289","loc":[-85.2643344,41.9980925],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:24Z","tags":{}},"n1820938290":{"id":"n1820938290","loc":[-85.3270335,41.9776125],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:24Z","tags":{}},"n1820938291":{"id":"n1820938291","loc":[-85.1200584,42.0795077],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:24Z","tags":{}},"n1820938292":{"id":"n1820938292","loc":[-85.2290792,42.0340256],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:25Z","tags":{}},"n1820938293":{"id":"n1820938293","loc":[-85.6015887,41.9401372],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:25Z","tags":{}},"n1820938294":{"id":"n1820938294","loc":[-85.5370869,41.970488],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:25Z","tags":{}},"n1820938295":{"id":"n1820938295","loc":[-85.3108866,41.9698048],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:25Z","tags":{}},"n1820938297":{"id":"n1820938297","loc":[-85.1556511,42.0628184],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:25Z","tags":{}},"n1820938298":{"id":"n1820938298","loc":[-85.0027922,42.0875221],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:25Z","tags":{}},"n1820938300":{"id":"n1820938300","loc":[-85.3873338,42.0040614],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:25Z","tags":{}},"n1820938301":{"id":"n1820938301","loc":[-85.0350753,42.1004034],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:25Z","tags":{}},"n1820938302":{"id":"n1820938302","loc":[-85.6239476,41.9411906],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:25Z","tags":{}},"n1820938304":{"id":"n1820938304","loc":[-85.0118246,42.0897964],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:25Z","tags":{}},"n1820938306":{"id":"n1820938306","loc":[-85.4796877,41.995275],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:25Z","tags":{}},"n1820938307":{"id":"n1820938307","loc":[-85.5388636,41.9707856],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:25Z","tags":{}},"n1820938309":{"id":"n1820938309","loc":[-85.2971902,41.9727773],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:25Z","tags":{}},"n1820938310":{"id":"n1820938310","loc":[-85.5426831,41.9715513],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:25Z","tags":{}},"n1820938311":{"id":"n1820938311","loc":[-85.2798373,41.9836671],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:25Z","tags":{}},"n1820938312":{"id":"n1820938312","loc":[-85.2432198,42.0104017],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:25Z","tags":{}},"n1820938313":{"id":"n1820938313","loc":[-85.2650412,41.9987554],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:25Z","tags":{}},"n1820938317":{"id":"n1820938317","loc":[-85.0015423,42.0882386],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:25Z","tags":{}},"n1820938318":{"id":"n1820938318","loc":[-85.1409783,42.064879],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:26Z","tags":{}},"n1820938319":{"id":"n1820938319","loc":[-85.1691908,42.058995],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:26Z","tags":{}},"n1820938320":{"id":"n1820938320","loc":[-85.1059165,42.0864882],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:26Z","tags":{}},"n1820938321":{"id":"n1820938321","loc":[-85.3664941,41.9965771],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:26Z","tags":{}},"n1820938323":{"id":"n1820938323","loc":[-85.3143198,41.9710971],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:26Z","tags":{}},"n1820938324":{"id":"n1820938324","loc":[-85.0016067,42.0880675],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:26Z","tags":{}},"n1820938325":{"id":"n1820938325","loc":[-85.0148139,42.0887164],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:26Z","tags":{}},"n1820938326":{"id":"n1820938326","loc":[-85.0324682,42.0959056],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:26Z","tags":{}},"n1820938327":{"id":"n1820938327","loc":[-85.0898661,42.0939921],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:26Z","tags":{}},"n1820938328":{"id":"n1820938328","loc":[-85.2556427,42.0004936],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:26Z","tags":{}},"n1820938329":{"id":"n1820938329","loc":[-85.6287112,41.9407437],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:26Z","tags":{}},"n1820938330":{"id":"n1820938330","loc":[-84.9913392,42.0866701],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:26Z","tags":{}},"n1820938331":{"id":"n1820938331","loc":[-85.2685777,41.9984632],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:26Z","tags":{}},"n1820938332":{"id":"n1820938332","loc":[-85.0078884,42.0901614],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:26Z","tags":{}},"n1820938333":{"id":"n1820938333","loc":[-84.999642,42.0878616],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:26Z","tags":{}},"n1820938334":{"id":"n1820938334","loc":[-85.0188909,42.0899186],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:26Z","tags":{}},"n1820938335":{"id":"n1820938335","loc":[-85.2830238,41.9819843],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:26Z","tags":{}},"n1820938336":{"id":"n1820938336","loc":[-85.2491421,42.0096204],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:26Z","tags":{}},"n1820938337":{"id":"n1820938337","loc":[-85.0585701,42.1034295],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:27Z","tags":{}},"n1820938338":{"id":"n1820938338","loc":[-85.0651965,42.1051636],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:27Z","tags":{}},"n1820938339":{"id":"n1820938339","loc":[-85.0583944,42.104292],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:27Z","tags":{}},"n1820938340":{"id":"n1820938340","loc":[-85.119876,42.0801567],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:27Z","tags":{}},"n1820938341":{"id":"n1820938341","loc":[-85.0943937,42.0931323],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:27Z","tags":{}},"n1820938342":{"id":"n1820938342","loc":[-85.1504583,42.0613209],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:27Z","tags":{}},"n1820938343":{"id":"n1820938343","loc":[-85.0425426,42.1019836],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:27Z","tags":{}},"n1820938345":{"id":"n1820938345","loc":[-84.9991391,42.0878206],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:27Z","tags":{}},"n1820938346":{"id":"n1820938346","loc":[-85.2563841,42.0094614],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:27Z","tags":{}},"n1820938347":{"id":"n1820938347","loc":[-85.0515387,42.103297],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:27Z","tags":{}},"n1820938348":{"id":"n1820938348","loc":[-85.0857261,42.1003636],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:27Z","tags":{}},"n1820938349":{"id":"n1820938349","loc":[-85.078971,42.1029241],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:27Z","tags":{}},"n1820938350":{"id":"n1820938350","loc":[-85.5699558,41.958931],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:27Z","tags":{}},"n1820938351":{"id":"n1820938351","loc":[-85.3181285,41.9696533],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:27Z","tags":{}},"n1820938352":{"id":"n1820938352","loc":[-85.5998506,41.9402329],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:27Z","tags":{}},"n1820938353":{"id":"n1820938353","loc":[-85.2567277,42.000317],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:27Z","tags":{}},"n1820938354":{"id":"n1820938354","loc":[-85.3082795,41.9708338],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:27Z","tags":{}},"n1820938355":{"id":"n1820938355","loc":[-85.3127856,41.9692784],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:27Z","tags":{}},"n1820938356":{"id":"n1820938356","loc":[-85.0340775,42.1010721],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:27Z","tags":{}},"n1820938357":{"id":"n1820938357","loc":[-85.3158111,41.9706583],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:27Z","tags":{}},"n1820938359":{"id":"n1820938359","loc":[-85.2312035,42.0280412],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:27Z","tags":{}},"n1820938360":{"id":"n1820938360","loc":[-85.2448613,42.018477],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:27Z","tags":{}},"n1820938361":{"id":"n1820938361","loc":[-85.29077,41.9759068],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:27Z","tags":{}},"n1820938364":{"id":"n1820938364","loc":[-85.3677387,41.9976615],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:28Z","tags":{}},"n1820938365":{"id":"n1820938365","loc":[-85.0785204,42.1030355],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:28Z","tags":{}},"n1820938366":{"id":"n1820938366","loc":[-85.2262039,42.0333722],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:28Z","tags":{}},"n1820938367":{"id":"n1820938367","loc":[-85.1226011,42.0780902],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:28Z","tags":{}},"n1820938368":{"id":"n1820938368","loc":[-85.3229673,41.971129],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:28Z","tags":{}},"n1820938369":{"id":"n1820938369","loc":[-85.385334,42.0000056],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:28Z","tags":{}},"n1820938370":{"id":"n1820938370","loc":[-85.000098,42.0879094],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:28Z","tags":{}},"n1820938372":{"id":"n1820938372","loc":[-85.3852481,42.0025091],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:28Z","tags":{}},"n1820938373":{"id":"n1820938373","loc":[-85.3770513,41.9982515],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:28Z","tags":{}},"n1820938374":{"id":"n1820938374","loc":[-85.6278314,41.9405362],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:28Z","tags":{}},"n1820938375":{"id":"n1820938375","loc":[-85.6355133,41.9344068],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:28Z","tags":{}},"n1820938376":{"id":"n1820938376","loc":[-85.635642,41.9324753],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:28Z","tags":{}},"n1820938377":{"id":"n1820938377","loc":[-85.3154463,41.970778],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:28Z","tags":{}},"n1820938378":{"id":"n1820938378","loc":[-85.0920334,42.093411],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:28Z","tags":{}},"n1820938379":{"id":"n1820938379","loc":[-85.3269155,41.9722297],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:28Z","tags":{}},"n1820938381":{"id":"n1820938381","loc":[-85.1134334,42.0849184],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:28Z","tags":{}},"n1820938382":{"id":"n1820938382","loc":[-85.005968,42.088585],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:28Z","tags":{}},"n1820938384":{"id":"n1820938384","loc":[-85.1245203,42.0757183],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:28Z","tags":{}},"n1820938385":{"id":"n1820938385","loc":[-85.020704,42.0905396],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:28Z","tags":{}},"n1820938386":{"id":"n1820938386","loc":[-85.119585,42.0808984],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:28Z","tags":{}},"n1820938387":{"id":"n1820938387","loc":[-85.0072447,42.0880117],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:28Z","tags":{}},"n1820938388":{"id":"n1820938388","loc":[-85.2742908,41.9960273],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:28Z","tags":{}},"n1820938389":{"id":"n1820938389","loc":[-85.3275807,41.9696852],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:28Z","tags":{}},"n1820938390":{"id":"n1820938390","loc":[-85.2385635,42.0231556],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:28Z","tags":{}},"n1820938392":{"id":"n1820938392","loc":[-85.0202856,42.0900778],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:29Z","tags":{}},"n1820938393":{"id":"n1820938393","loc":[-85.2067847,42.0395398],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:29Z","tags":{}},"n1820938394":{"id":"n1820938394","loc":[-85.5183544,41.9713495],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:29Z","tags":{}},"n1820938396":{"id":"n1820938396","loc":[-85.5073037,41.9736787],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:29Z","tags":{}},"n1820938397":{"id":"n1820938397","loc":[-85.2519638,42.0114225],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:29Z","tags":{}},"n1820938398":{"id":"n1820938398","loc":[-85.287487,41.9793285],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:29Z","tags":{}},"n1820938399":{"id":"n1820938399","loc":[-85.2298088,42.0336431],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:29Z","tags":{}},"n1820938400":{"id":"n1820938400","loc":[-85.229444,42.0339141],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:29Z","tags":{}},"n1820938401":{"id":"n1820938401","loc":[-85.2421791,42.0220239],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:29Z","tags":{}},"n1820938402":{"id":"n1820938402","loc":[-85.2976687,41.9737612],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:29Z","tags":{}},"n1820938403":{"id":"n1820938403","loc":[-85.3622069,41.993473],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:29Z","tags":{}},"n1820938404":{"id":"n1820938404","loc":[-85.2465458,42.014906],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:29Z","tags":{}},"n1820938405":{"id":"n1820938405","loc":[-85.5724663,41.9639412],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:29Z","tags":{}},"n1820938406":{"id":"n1820938406","loc":[-85.3708501,41.9982037],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:29Z","tags":{}},"n1820938408":{"id":"n1820938408","loc":[-85.2564592,42.0055311],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:29Z","tags":{}},"n1820938409":{"id":"n1820938409","loc":[-85.1192846,42.0810856],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:29Z","tags":{}},"n1820938410":{"id":"n1820938410","loc":[-85.5623812,41.971663],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:29Z","tags":{}},"n1820938411":{"id":"n1820938411","loc":[-85.3221948,41.9719665],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:29Z","tags":{}},"n1820938412":{"id":"n1820938412","loc":[-85.5168738,41.9710305],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:29Z","tags":{}},"n1820938413":{"id":"n1820938413","loc":[-85.4546852,42.0061127],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:29Z","tags":{}},"n1820938414":{"id":"n1820938414","loc":[-85.5896153,41.9463617],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:29Z","tags":{}},"n1820938415":{"id":"n1820938415","loc":[-85.2978189,41.9722138],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:30Z","tags":{}},"n1820938416":{"id":"n1820938416","loc":[-85.1021681,42.0883581],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:30Z","tags":{}},"n1820938417":{"id":"n1820938417","loc":[-85.2797193,41.9912984],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:30Z","tags":{}},"n1820938419":{"id":"n1820938419","loc":[-85.2362461,42.0248533],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:30Z","tags":{}},"n1820938420":{"id":"n1820938420","loc":[-85.4833639,41.9846252],"version":"2","changeset":"12182679","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T07:37:01Z","tags":{}},"n1820938422":{"id":"n1820938422","loc":[-85.3281064,41.9689433],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:30Z","tags":{}},"n1820938424":{"id":"n1820938424","loc":[-85.2416963,42.0130088],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:30Z","tags":{}},"n1820938425":{"id":"n1820938425","loc":[-85.5718655,41.9564577],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:30Z","tags":{}},"n1820938426":{"id":"n1820938426","loc":[-85.0512812,42.1030701],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:30Z","tags":{}},"n1820938427":{"id":"n1820938427","loc":[-85.1273527,42.0723616],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:30Z","tags":{}},"n1820938428":{"id":"n1820938428","loc":[-85.0215033,42.0904083],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:30Z","tags":{}},"n1820938429":{"id":"n1820938429","loc":[-85.6169953,41.942228],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:30Z","tags":{}},"n1820938430":{"id":"n1820938430","loc":[-85.2829165,41.9907243],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:30Z","tags":{}},"n1820938431":{"id":"n1820938431","loc":[-85.2240796,42.0374203],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:30Z","tags":{}},"n1820938432":{"id":"n1820938432","loc":[-85.0167598,42.0898442],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:30Z","tags":{}},"n1820938433":{"id":"n1820938433","loc":[-85.2132649,42.0411334],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:30Z","tags":{}},"n1820938434":{"id":"n1820938434","loc":[-85.2293839,42.031513],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:30Z","tags":{}},"n1820938435":{"id":"n1820938435","loc":[-85.1203374,42.0792608],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:31Z","tags":{}},"n1820938436":{"id":"n1820938436","loc":[-85.109571,42.086268],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:31Z","tags":{}},"n1820938437":{"id":"n1820938437","loc":[-85.1079026,42.0853842],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:31Z","tags":{}},"n1820938438":{"id":"n1820938438","loc":[-85.109237,42.0862413],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:31Z","tags":{}},"n1820938439":{"id":"n1820938439","loc":[-85.2259936,42.0350831],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:31Z","tags":{}},"n1820938440":{"id":"n1820938440","loc":[-85.3669705,41.99679],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:31Z","tags":{}},"n1820938441":{"id":"n1820938441","loc":[-85.2418143,42.0223507],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:31Z","tags":{}},"n1820938442":{"id":"n1820938442","loc":[-85.3101248,41.9702515],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:31Z","tags":{}},"n1820938443":{"id":"n1820938443","loc":[-85.069315,42.1059688],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:31Z","tags":{}},"n1820938444":{"id":"n1820938444","loc":[-85.205862,42.0410378],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:31Z","tags":{}},"n1820938445":{"id":"n1820938445","loc":[-85.0388076,42.1036604],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:31Z","tags":{}},"n1820938446":{"id":"n1820938446","loc":[-85.2225389,42.0370115],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:31Z","tags":{}},"n1820938447":{"id":"n1820938447","loc":[-85.3241474,41.9719346],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:31Z","tags":{}},"n1820938448":{"id":"n1820938448","loc":[-85.3125496,41.9690789],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:31Z","tags":{}},"n1820938449":{"id":"n1820938449","loc":[-85.1146497,42.0857039],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:31Z","tags":{}},"n1820938450":{"id":"n1820938450","loc":[-85.1333944,42.0714963],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:31Z","tags":{}},"n1820938451":{"id":"n1820938451","loc":[-85.5619306,41.9720937],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:31Z","tags":{}},"n1820938452":{"id":"n1820938452","loc":[-85.2553651,42.0006479],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:31Z","tags":{}},"n1820938453":{"id":"n1820938453","loc":[-85.3151137,41.9710093],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:31Z","tags":{}},"n1820938454":{"id":"n1820938454","loc":[-85.2592315,41.9977947],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:31Z","tags":{}},"n1820938455":{"id":"n1820938455","loc":[-85.2655723,41.9995966],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:31Z","tags":{}},"n1820938456":{"id":"n1820938456","loc":[-85.4820652,41.9959233],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:32Z","tags":{}},"n1820938459":{"id":"n1820938459","loc":[-85.450737,42.0055068],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:32Z","tags":{}},"n1820938460":{"id":"n1820938460","loc":[-85.2428658,42.0205573],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:32Z","tags":{}},"n1820938461":{"id":"n1820938461","loc":[-85.0835576,42.1021559],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:32Z","tags":{}},"n1820938462":{"id":"n1820938462","loc":[-85.244636,42.0194733],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:32Z","tags":{}},"n1820938463":{"id":"n1820938463","loc":[-85.5702562,41.9581332],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:32Z","tags":{}},"n1820938465":{"id":"n1820938465","loc":[-85.5680031,41.9659515],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:32Z","tags":{}},"n1820938467":{"id":"n1820938467","loc":[-85.2798752,41.9948353],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:32Z","tags":{}},"n1820938468":{"id":"n1820938468","loc":[-85.0477407,42.1015537],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:32Z","tags":{}},"n1820938469":{"id":"n1820938469","loc":[-85.6403842,41.913732],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:32Z","tags":{}},"n1820938470":{"id":"n1820938470","loc":[-85.0396029,42.103289],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:32Z","tags":{}},"n1820938471":{"id":"n1820938471","loc":[-85.2824702,41.9907777],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:32Z","tags":{}},"n1820938472":{"id":"n1820938472","loc":[-85.2969284,41.9735538],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:32Z","tags":{}},"n1820938474":{"id":"n1820938474","loc":[-85.401041,42.0070853],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:32Z","tags":{}},"n1820938475":{"id":"n1820938475","loc":[-85.4116625,42.0073883],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:32Z","tags":{}},"n1820938476":{"id":"n1820938476","loc":[-85.0437764,42.1016214],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:32Z","tags":{}},"n1820938477":{"id":"n1820938477","loc":[-85.3643269,41.9958436],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:32Z","tags":{}},"n1820938478":{"id":"n1820938478","loc":[-85.3895182,42.0009465],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:32Z","tags":{}},"n1820938479":{"id":"n1820938479","loc":[-85.636157,41.9333373],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:32Z","tags":{}},"n1820938480":{"id":"n1820938480","loc":[-85.2811355,41.9858044],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:33Z","tags":{}},"n1820938481":{"id":"n1820938481","loc":[-85.0239052,42.092153],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:33Z","tags":{}},"n1820938482":{"id":"n1820938482","loc":[-85.2558798,42.0053557],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:33Z","tags":{}},"n1820938483":{"id":"n1820938483","loc":[-85.2544422,42.0047339],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:33Z","tags":{}},"n1820938484":{"id":"n1820938484","loc":[-85.4864683,41.9843183],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:33Z","tags":{}},"n1820938485":{"id":"n1820938485","loc":[-85.2554185,42.0031075],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:33Z","tags":{}},"n1820938486":{"id":"n1820938486","loc":[-85.3082795,41.9712486],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:33Z","tags":{}},"n1820938487":{"id":"n1820938487","loc":[-85.2433378,42.0133436],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:33Z","tags":{}},"n1820938488":{"id":"n1820938488","loc":[-85.0216696,42.0904162],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:33Z","tags":{}},"n1820938489":{"id":"n1820938489","loc":[-85.2546138,42.0050289],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:33Z","tags":{}},"n1820938490":{"id":"n1820938490","loc":[-85.2717521,41.9977349],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:33Z","tags":{}},"n1820938491":{"id":"n1820938491","loc":[-85.0100489,42.0908195],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:33Z","tags":{}},"n1820938492":{"id":"n1820938492","loc":[-85.207879,42.0392211],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:33Z","tags":{}},"n1820938493":{"id":"n1820938493","loc":[-85.0007363,42.0882836],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:33Z","tags":{}},"n1820938494":{"id":"n1820938494","loc":[-85.5775303,41.9504097],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:33Z","tags":{}},"n1820938495":{"id":"n1820938495","loc":[-85.1131584,42.0847683],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:33Z","tags":{}},"n1820938496":{"id":"n1820938496","loc":[-85.0887825,42.0941633],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:33Z","tags":{}},"n1820938497":{"id":"n1820938497","loc":[-85.1185926,42.0818938],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:33Z","tags":{}},"n1820938498":{"id":"n1820938498","loc":[-85.2748487,41.9948712],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:33Z","tags":{}},"n1820938499":{"id":"n1820938499","loc":[-85.2566952,42.0090788],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:33Z","tags":{}},"n1820938500":{"id":"n1820938500","loc":[-85.0774757,42.1036234],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:33Z","tags":{}},"n1820938501":{"id":"n1820938501","loc":[-85.4190869,42.008903],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:33Z","tags":{}},"n1820938502":{"id":"n1820938502","loc":[-85.1140395,42.0850577],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:33Z","tags":{}},"n1820938503":{"id":"n1820938503","loc":[-85.1136104,42.0848627],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:33Z","tags":{}},"n1820938504":{"id":"n1820938504","loc":[-85.5828089,41.9480638],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:33Z","tags":{}},"n1820938505":{"id":"n1820938505","loc":[-85.625514,41.9405202],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:33Z","tags":{}},"n1820938506":{"id":"n1820938506","loc":[-85.2063384,42.0398322],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:33Z","tags":{}},"n1820938507":{"id":"n1820938507","loc":[-85.3395476,41.9851636],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:33Z","tags":{}},"n1820938508":{"id":"n1820938508","loc":[-85.0328853,42.0963606],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:34Z","tags":{}},"n1820938510":{"id":"n1820938510","loc":[-85.1170369,42.0843702],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:34Z","tags":{}},"n1820938511":{"id":"n1820938511","loc":[-85.2784748,41.9868487],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:34Z","tags":{}},"n1820938512":{"id":"n1820938512","loc":[-85.6310501,41.9435528],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:34Z","tags":{}},"n1820938514":{"id":"n1820938514","loc":[-85.0334284,42.0981028],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:34Z","tags":{}},"n1820938515":{"id":"n1820938515","loc":[-84.9912091,42.0868226],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:34Z","tags":{}},"n1820938516":{"id":"n1820938516","loc":[-85.2806141,41.9940351],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:34Z","tags":{}},"n1820938517":{"id":"n1820938517","loc":[-85.1233025,42.0776734],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:34Z","tags":{}},"n1820938518":{"id":"n1820938518","loc":[-85.2047891,42.0429023],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:34Z","tags":{}},"n1820938519":{"id":"n1820938519","loc":[-85.1475443,42.0648312],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:34Z","tags":{}},"n1820938520":{"id":"n1820938520","loc":[-85.2644685,41.9990891],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:34Z","tags":{}},"n1820938521":{"id":"n1820938521","loc":[-85.1056281,42.0872553],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:34Z","tags":{}},"n1820938522":{"id":"n1820938522","loc":[-85.4813184,41.9930105],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:34Z","tags":{}},"n1820938523":{"id":"n1820938523","loc":[-85.321551,41.9722936],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:34Z","tags":{}},"n1820938524":{"id":"n1820938524","loc":[-85.1564664,42.0631211],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:34Z","tags":{}},"n1820938525":{"id":"n1820938525","loc":[-85.4149885,42.0079144],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:34Z","tags":{}},"n1820938527":{"id":"n1820938527","loc":[-85.2861888,41.9803653],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:34Z","tags":{}},"n1820938528":{"id":"n1820938528","loc":[-85.1301379,42.0682178],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:34Z","tags":{}},"n1820938529":{"id":"n1820938529","loc":[-85.4156537,42.0084247],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:34Z","tags":{}},"n1820938530":{"id":"n1820938530","loc":[-85.245151,42.0176082],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:34Z","tags":{}},"n1820938531":{"id":"n1820938531","loc":[-85.457818,42.0001651],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:34Z","tags":{}},"n1820938532":{"id":"n1820938532","loc":[-85.310951,41.9694538],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:35Z","tags":{}},"n1820938533":{"id":"n1820938533","loc":[-85.1509089,42.0611298],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:35Z","tags":{}},"n1820938534":{"id":"n1820938534","loc":[-85.1108249,42.086321],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:35Z","tags":{}},"n1820938535":{"id":"n1820938535","loc":[-85.1260344,42.0740687],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:35Z","tags":{}},"n1820938536":{"id":"n1820938536","loc":[-85.4561228,42.0042791],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:35Z","tags":{}},"n1820938537":{"id":"n1820938537","loc":[-85.2805082,41.9945761],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:35Z","tags":{}},"n1820938538":{"id":"n1820938538","loc":[-85.273352,41.9981921],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:35Z","tags":{}},"n1820938539":{"id":"n1820938539","loc":[-85.1084216,42.0864364],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:35Z","tags":{}},"n1820938540":{"id":"n1820938540","loc":[-85.5009737,41.9773637],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:35Z","tags":{}},"n1820938541":{"id":"n1820938541","loc":[-85.3960843,42.0051879],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:35Z","tags":{}},"n1820938542":{"id":"n1820938542","loc":[-85.3425088,41.9865034],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:35Z","tags":{}},"n1820938545":{"id":"n1820938545","loc":[-84.9937907,42.0860849],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:35Z","tags":{}},"n1820938546":{"id":"n1820938546","loc":[-85.1084176,42.086065],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:35Z","tags":{}},"n1820938547":{"id":"n1820938547","loc":[-85.3492851,41.9924786],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:35Z","tags":{}},"n1820938548":{"id":"n1820938548","loc":[-85.2512235,42.0101147],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:35Z","tags":{}},"n1820938549":{"id":"n1820938549","loc":[-85.3717298,41.9979326],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:35Z","tags":{}},"n1820938551":{"id":"n1820938551","loc":[-85.2573712,42.0064081],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:36Z","tags":{}},"n1820938552":{"id":"n1820938552","loc":[-85.2514596,42.010139],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:36Z","tags":{}},"n1820938553":{"id":"n1820938553","loc":[-85.416512,42.0088073],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:36Z","tags":{}},"n1820938554":{"id":"n1820938554","loc":[-85.4365964,42.0061606],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:36Z","tags":{}},"n1820938555":{"id":"n1820938555","loc":[-85.4552431,42.0057301],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:36Z","tags":{}},"n1820938556":{"id":"n1820938556","loc":[-85.2916283,41.9778769],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:36Z","tags":{}},"n1820938557":{"id":"n1820938557","loc":[-85.100709,42.0902968],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:36Z","tags":{}},"n1820938558":{"id":"n1820938558","loc":[-85.4703064,41.9965771],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:36Z","tags":{}},"n1820938559":{"id":"n1820938559","loc":[-85.3134722,41.9696134],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:36Z","tags":{}},"n1820938560":{"id":"n1820938560","loc":[-85.4834213,41.9885768],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:36Z","tags":{}},"n1820938561":{"id":"n1820938561","loc":[-85.2740641,41.9975236],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:36Z","tags":{}},"n1820938562":{"id":"n1820938562","loc":[-85.148334,42.0623405],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:36Z","tags":{}},"n1820938563":{"id":"n1820938563","loc":[-85.2358598,42.0263675],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:36Z","tags":{}},"n1820938565":{"id":"n1820938565","loc":[-85.2902979,41.9790892],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:36Z","tags":{}},"n1820938566":{"id":"n1820938566","loc":[-85.2528865,42.0112869],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:36Z","tags":{}},"n1820938567":{"id":"n1820938567","loc":[-85.2595319,41.9973003],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:36Z","tags":{}},"n1820938568":{"id":"n1820938568","loc":[-85.071151,42.105689],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:36Z","tags":{}},"n1820938570":{"id":"n1820938570","loc":[-85.299278,41.9732188],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:36Z","tags":{}},"n1820938571":{"id":"n1820938571","loc":[-85.0354669,42.1024771],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:36Z","tags":{}},"n1820938583":{"id":"n1820938583","loc":[-85.3313937,41.972562],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:36Z","tags":{}},"n1820938585":{"id":"n1820938585","loc":[-85.0756933,42.1058334],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:36Z","tags":{}},"n1820938587":{"id":"n1820938587","loc":[-85.3130324,41.9694219],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:36Z","tags":{}},"n1820938590":{"id":"n1820938590","loc":[-85.0934227,42.0931681],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:37Z","tags":{}},"n1820938592":{"id":"n1820938592","loc":[-85.3517956,41.9922553],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:37Z","tags":{}},"n1820938593":{"id":"n1820938593","loc":[-85.4023971,42.0065169],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:37Z","tags":{}},"n1820938594":{"id":"n1820938594","loc":[-85.3506798,41.9925583],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:37Z","tags":{}},"n1820938595":{"id":"n1820938595","loc":[-85.3673524,41.9971193],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:37Z","tags":{}},"n1820938596":{"id":"n1820938596","loc":[-85.1073608,42.0853523],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:37Z","tags":{}},"n1820938597":{"id":"n1820938597","loc":[-85.2976579,41.972477],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:37Z","tags":{}},"n1820938598":{"id":"n1820938598","loc":[-85.5616517,41.9694295],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:37Z","tags":{}},"n1820938599":{"id":"n1820938599","loc":[-85.3552074,41.9921915],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:37Z","tags":{}},"n1820938600":{"id":"n1820938600","loc":[-85.4665126,41.9999953],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:37Z","tags":{}},"n1820938601":{"id":"n1820938601","loc":[-85.2740695,41.9966226],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:37Z","tags":{}},"n1820938602":{"id":"n1820938602","loc":[-85.279376,41.9886669],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:37Z","tags":{}},"n1820938603":{"id":"n1820938603","loc":[-85.0771109,42.1040413],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:37Z","tags":{}},"n1820938604":{"id":"n1820938604","loc":[-85.2636049,41.9977895],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:37Z","tags":{}},"n1820938605":{"id":"n1820938605","loc":[-85.3762145,41.9976456],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:37Z","tags":{}},"n1820938606":{"id":"n1820938606","loc":[-85.2321369,42.0289577],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:37Z","tags":{}},"n1820938620":{"id":"n1820938620","loc":[-85.4947724,41.9776189],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:37Z","tags":{}},"n1820938622":{"id":"n1820938622","loc":[-85.1547069,42.0622768],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:37Z","tags":{}},"n1820938624":{"id":"n1820938624","loc":[-85.0005056,42.0880249],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:37Z","tags":{}},"n1820938626":{"id":"n1820938626","loc":[-85.0735596,42.1059357],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:37Z","tags":{}},"n1820938628":{"id":"n1820938628","loc":[-85.4665298,41.99932],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:37Z","tags":{}},"n1820938629":{"id":"n1820938629","loc":[-85.434515,42.0065273],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:37Z","tags":{}},"n1820938630":{"id":"n1820938630","loc":[-85.117462,42.0823823],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:37Z","tags":{}},"n1820938631":{"id":"n1820938631","loc":[-85.0131777,42.0890707],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:37Z","tags":{}},"n1820938632":{"id":"n1820938632","loc":[-85.0875326,42.0961934],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:37Z","tags":{}},"n1820938634":{"id":"n1820938634","loc":[-85.6433839,41.9112042],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:38Z","tags":{}},"n1820938635":{"id":"n1820938635","loc":[-85.1366181,42.064969],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:38Z","tags":{}},"n1820938636":{"id":"n1820938636","loc":[-85.073109,42.1057925],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:38Z","tags":{}},"n1820938638":{"id":"n1820938638","loc":[-85.161406,42.0632541],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:38Z","tags":{}},"n1820938640":{"id":"n1820938640","loc":[-85.6343932,41.9188845],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:38Z","tags":{}},"n1820938642":{"id":"n1820938642","loc":[-85.2500004,42.010306],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:38Z","tags":{}},"n1820938644":{"id":"n1820938644","loc":[-85.291918,41.9753166],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:38Z","tags":{}},"n1820938663":{"id":"n1820938663","loc":[-85.2841611,41.9916812],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:38Z","tags":{}},"n1820938664":{"id":"n1820938664","loc":[-85.1052955,42.0868134],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:38Z","tags":{}},"n1820938665":{"id":"n1820938665","loc":[-85.4606118,42.0005534],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:38Z","tags":{}},"n1820938666":{"id":"n1820938666","loc":[-85.5672736,41.9642922],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:38Z","tags":{}},"n1820938667":{"id":"n1820938667","loc":[-85.6348481,41.9316932],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:38Z","tags":{}},"n1820938668":{"id":"n1820938668","loc":[-85.0224904,42.0909576],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:38Z","tags":{}},"n1820938669":{"id":"n1820938669","loc":[-85.0133856,42.0899755],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:38Z","tags":{}},"n1820938670":{"id":"n1820938670","loc":[-85.344779,41.991139],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:38Z","tags":{}},"n1820938671":{"id":"n1820938671","loc":[-85.632874,41.9425313],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:38Z","tags":{}},"n1820938673":{"id":"n1820938673","loc":[-85.4941501,41.9779698],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:38Z","tags":{}},"n1820938675":{"id":"n1820938675","loc":[-85.0862559,42.0997519],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:38Z","tags":{}},"n1820938676":{"id":"n1820938676","loc":[-85.0097874,42.0898032],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:38Z","tags":{}},"n1820938678":{"id":"n1820938678","loc":[-84.9913553,42.0863675],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:38Z","tags":{}},"n1820938680":{"id":"n1820938680","loc":[-85.0533666,42.1038315],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:38Z","tags":{}},"n1820938682":{"id":"n1820938682","loc":[-85.2950294,41.9743914],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:38Z","tags":{}},"n1820938684":{"id":"n1820938684","loc":[-85.2517385,42.0104499],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:38Z","tags":{}},"n1820938686":{"id":"n1820938686","loc":[-85.0247971,42.0922514],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:38Z","tags":{}},"n1820938688":{"id":"n1820938688","loc":[-85.0807037,42.1026017],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:38Z","tags":{}},"n1820938690":{"id":"n1820938690","loc":[-85.52462,41.9722748],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:39Z","tags":{}},"n1820938694":{"id":"n1820938694","loc":[-85.2586535,41.9988818],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:39Z","tags":{}},"n1820938695":{"id":"n1820938695","loc":[-85.0931612,42.092948],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:39Z","tags":{}},"n1820938697":{"id":"n1820938697","loc":[-85.2470822,42.016564],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:39Z","tags":{}},"n1820938698":{"id":"n1820938698","loc":[-85.4143018,42.0075158],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:39Z","tags":{}},"n1820938699":{"id":"n1820938699","loc":[-85.0771484,42.104487],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:39Z","tags":{}},"n1820938700":{"id":"n1820938700","loc":[-85.0291208,42.0942775],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:39Z","tags":{}},"n1820938701":{"id":"n1820938701","loc":[-85.6367964,41.9185971],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:39Z","tags":{}},"n1820938702":{"id":"n1820938702","loc":[-85.085419,42.1010693],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:39Z","tags":{}},"n1820938703":{"id":"n1820938703","loc":[-85.0583877,42.1040584],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:39Z","tags":{}},"n1820938705":{"id":"n1820938705","loc":[-85.2573379,42.0003182],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:39Z","tags":{}},"n1820938706":{"id":"n1820938706","loc":[-85.2655937,41.9981575],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:39Z","tags":{}},"n1820938707":{"id":"n1820938707","loc":[-85.023181,42.0915758],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:39Z","tags":{}},"n1820938708":{"id":"n1820938708","loc":[-85.2318687,42.0274674],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:39Z","tags":{}},"n1820938709":{"id":"n1820938709","loc":[-85.1056389,42.0866184],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:39Z","tags":{}},"n1820938710":{"id":"n1820938710","loc":[-85.5276265,41.9700978],"version":"2","changeset":"12182668","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T07:35:33Z","tags":{}},"n1820938711":{"id":"n1820938711","loc":[-85.0864128,42.0945761],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:39Z","tags":{}},"n1820938712":{"id":"n1820938712","loc":[-84.9897071,42.0871888],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:39Z","tags":{}},"n1820938714":{"id":"n1820938714","loc":[-85.1328845,42.0665611],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:40Z","tags":{}},"n1820938715":{"id":"n1820938715","loc":[-85.0336537,42.0991377],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:40Z","tags":{}},"n1820938716":{"id":"n1820938716","loc":[-85.087597,42.0986692],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:40Z","tags":{}},"n1820938717":{"id":"n1820938717","loc":[-85.1241394,42.0761882],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:40Z","tags":{}},"n1820938718":{"id":"n1820938718","loc":[-85.1176002,42.0847723],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:40Z","tags":{}},"n1820938719":{"id":"n1820938719","loc":[-85.2423615,42.0216572],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:40Z","tags":{}},"n1820938721":{"id":"n1820938721","loc":[-85.2196378,42.0387908],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:40Z","tags":{}},"n1820938722":{"id":"n1820938722","loc":[-85.0164272,42.0890082],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:40Z","tags":{}},"n1820938723":{"id":"n1820938723","loc":[-85.5917182,41.9451807],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:40Z","tags":{}},"n1820938724":{"id":"n1820938724","loc":[-85.2458806,42.0086638],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:40Z","tags":{}},"n1820938725":{"id":"n1820938725","loc":[-85.1264474,42.0740527],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:40Z","tags":{}},"n1820938726":{"id":"n1820938726","loc":[-85.1961631,42.04738],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:40Z","tags":{}},"n1820938727":{"id":"n1820938727","loc":[-85.2784643,41.9943648],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:40Z","tags":{}},"n1820938728":{"id":"n1820938728","loc":[-85.2905554,41.9763216],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:40Z","tags":{}},"n1820938729":{"id":"n1820938729","loc":[-85.2913386,41.9771511],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:40Z","tags":{}},"n1820938730":{"id":"n1820938730","loc":[-85.0112519,42.0895683],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:40Z","tags":{}},"n1820938732":{"id":"n1820938732","loc":[-85.4290261,42.0064531],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:40Z","tags":{}},"n1820938733":{"id":"n1820938733","loc":[-85.3867073,42.0031629],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:41Z","tags":{}},"n1820938734":{"id":"n1820938734","loc":[-85.4943647,41.9836005],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:41Z","tags":{}},"n1820938735":{"id":"n1820938735","loc":[-85.4900303,41.9860728],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:41Z","tags":{}},"n1820938736":{"id":"n1820938736","loc":[-85.0866153,42.0944539],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:41Z","tags":{}},"n1820938737":{"id":"n1820938737","loc":[-85.0869532,42.0990911],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:41Z","tags":{}},"n1820938738":{"id":"n1820938738","loc":[-85.6321659,41.9208851],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:41Z","tags":{}},"n1820938739":{"id":"n1820938739","loc":[-85.5930485,41.9433453],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:41Z","tags":{}},"n1820938740":{"id":"n1820938740","loc":[-85.0406851,42.102733],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:41Z","tags":{}},"n1820938741":{"id":"n1820938741","loc":[-85.1051131,42.0869846],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:41Z","tags":{}},"n1820938742":{"id":"n1820938742","loc":[-85.1377554,42.0648893],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:41Z","tags":{}},"n1820938743":{"id":"n1820938743","loc":[-85.2795694,41.994604],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:41Z","tags":{}},"n1820938745":{"id":"n1820938745","loc":[-85.4948153,41.9826594],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:41Z","tags":{}},"n1820938746":{"id":"n1820938746","loc":[-85.4488916,42.0050923],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:41Z","tags":{}},"n1820938747":{"id":"n1820938747","loc":[-85.1052526,42.0866144],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:41Z","tags":{}},"n1820938748":{"id":"n1820938748","loc":[-85.1468749,42.0653991],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:41Z","tags":{}},"n1820938749":{"id":"n1820938749","loc":[-85.0856886,42.1006104],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:41Z","tags":{}},"n1820938750":{"id":"n1820938750","loc":[-85.2144022,42.0404004],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:41Z","tags":{}},"n1820938751":{"id":"n1820938751","loc":[-85.277771,41.9907458],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:41Z","tags":{}},"n1820938752":{"id":"n1820938752","loc":[-85.1474542,42.0636149],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:41Z","tags":{}},"n1820938753":{"id":"n1820938753","loc":[-85.0820515,42.1028075],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:41Z","tags":{}},"n1820938754":{"id":"n1820938754","loc":[-85.1122948,42.08525],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:41Z","tags":{}},"n1820938756":{"id":"n1820938756","loc":[-85.0173352,42.0901933],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:42Z","tags":{}},"n1820938757":{"id":"n1820938757","loc":[-85.2259721,42.0354018],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:42Z","tags":{}},"n1820938758":{"id":"n1820938758","loc":[-85.0872389,42.0987795],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:42Z","tags":{}},"n1820938759":{"id":"n1820938759","loc":[-85.2291436,42.031874],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:42Z","tags":{}},"n1820938760":{"id":"n1820938760","loc":[-85.3802485,42.0016002],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:42Z","tags":{}},"n1820938761":{"id":"n1820938761","loc":[-85.3945822,42.0057938],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:42Z","tags":{}},"n1820938762":{"id":"n1820938762","loc":[-85.5273237,41.9713017],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:42Z","tags":{}},"n1820938763":{"id":"n1820938763","loc":[-85.2868862,41.9798629],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:42Z","tags":{}},"n1820938764":{"id":"n1820938764","loc":[-85.2516677,42.0107899],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:42Z","tags":{}},"n1820938766":{"id":"n1820938766","loc":[-85.3183002,41.9693103],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:42Z","tags":{}},"n1820938768":{"id":"n1820938768","loc":[-85.2159042,42.0401932],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:42Z","tags":{}},"n1820938770":{"id":"n1820938770","loc":[-85.0094481,42.0911141],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:42Z","tags":{}},"n1820938771":{"id":"n1820938771","loc":[-85.0244538,42.0922155],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:42Z","tags":{}},"n1820938772":{"id":"n1820938772","loc":[-85.231697,42.028862],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:42Z","tags":{}},"n1820938773":{"id":"n1820938773","loc":[-85.2102394,42.0390617],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:42Z","tags":{}},"n1820938774":{"id":"n1820938774","loc":[-85.2463419,42.0151212],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:42Z","tags":{}},"n1820938775":{"id":"n1820938775","loc":[-85.0726195,42.1056424],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:42Z","tags":{}},"n1820938776":{"id":"n1820938776","loc":[-85.0060431,42.0883262],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:42Z","tags":{}},"n1820938778":{"id":"n1820938778","loc":[-85.425889,42.0056982],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:42Z","tags":{}},"n1820938779":{"id":"n1820938779","loc":[-85.1183042,42.0820638],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:42Z","tags":{}},"n1820938780":{"id":"n1820938780","loc":[-85.441596,42.0058257],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:43Z","tags":{}},"n1820938781":{"id":"n1820938781","loc":[-85.1124879,42.0847086],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:43Z","tags":{}},"n1820938782":{"id":"n1820938782","loc":[-85.2452733,42.0153894],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:43Z","tags":{}},"n1820938783":{"id":"n1820938783","loc":[-85.2741191,41.9969244],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:43Z","tags":{}},"n1820938784":{"id":"n1820938784","loc":[-85.2829487,41.9822236],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:43Z","tags":{}},"n1820938785":{"id":"n1820938785","loc":[-85.3202743,41.972142],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:43Z","tags":{}},"n1820938786":{"id":"n1820938786","loc":[-85.2345402,42.0266465],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:43Z","tags":{}},"n1820938787":{"id":"n1820938787","loc":[-85.3037626,41.9724611],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:43Z","tags":{}},"n1820938789":{"id":"n1820938789","loc":[-85.2474792,42.0161973],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:43Z","tags":{}},"n1820938790":{"id":"n1820938790","loc":[-85.2951045,41.9727323],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:43Z","tags":{}},"n1820938791":{"id":"n1820938791","loc":[-85.322345,41.9712726],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:43Z","tags":{}},"n1820938792":{"id":"n1820938792","loc":[-85.2402372,42.0110394],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:43Z","tags":{}},"n1820938793":{"id":"n1820938793","loc":[-85.5135693,41.9698659],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:43Z","tags":{}},"n1820938794":{"id":"n1820938794","loc":[-85.4695339,41.9967366],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:43Z","tags":{}},"n1820938796":{"id":"n1820938796","loc":[-85.0418492,42.1011131],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:43Z","tags":{}},"n1820938797":{"id":"n1820938797","loc":[-85.3334107,41.9806337],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:43Z","tags":{}},"n1820938798":{"id":"n1820938798","loc":[-85.5625314,41.9711685],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:43Z","tags":{}},"n1820938799":{"id":"n1820938799","loc":[-85.3755707,41.9973585],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:43Z","tags":{}},"n1820938800":{"id":"n1820938800","loc":[-85.5227532,41.9722429],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:43Z","tags":{}},"n1820938801":{"id":"n1820938801","loc":[-85.4267687,42.0052836],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:43Z","tags":{}},"n1820938803":{"id":"n1820938803","loc":[-85.0284704,42.0940837],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:43Z","tags":{}},"n1820938804":{"id":"n1820938804","loc":[-85.015585,42.0885305],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:43Z","tags":{}},"n1820938805":{"id":"n1820938805","loc":[-85.0765905,42.1053865],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:43Z","tags":{}},"n1820938806":{"id":"n1820938806","loc":[-85.2614953,41.9964551],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:43Z","tags":{}},"n1820938808":{"id":"n1820938808","loc":[-85.0307355,42.0947313],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:44Z","tags":{}},"n1820938810":{"id":"n1820938810","loc":[-85.3894753,42.0003565],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:44Z","tags":{}},"n1820938812":{"id":"n1820938812","loc":[-85.0868848,42.095006],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:44Z","tags":{}},"n1820938813":{"id":"n1820938813","loc":[-85.3854198,42.0009465],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:44Z","tags":{}},"n1820938814":{"id":"n1820938814","loc":[-85.2659692,41.9993534],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:44Z","tags":{}},"n1820938815":{"id":"n1820938815","loc":[-85.1234259,42.0765266],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:44Z","tags":{}},"n1820938816":{"id":"n1820938816","loc":[-85.1426906,42.0648893],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:44Z","tags":{}},"n1820938818":{"id":"n1820938818","loc":[-85.1014533,42.0893067],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:44Z","tags":{}},"n1820938819":{"id":"n1820938819","loc":[-85.0883064,42.098067],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:44Z","tags":{}},"n1820938820":{"id":"n1820938820","loc":[-85.0503156,42.102704],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:44Z","tags":{}},"n1820938821":{"id":"n1820938821","loc":[-85.1179649,42.0821884],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:44Z","tags":{}},"n1820938822":{"id":"n1820938822","loc":[-85.3484697,41.9921596],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:44Z","tags":{}},"n1820938823":{"id":"n1820938823","loc":[-85.3732962,41.9970874],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:44Z","tags":{}},"n1820938824":{"id":"n1820938824","loc":[-85.2784104,41.9898312],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:44Z","tags":{}},"n1820938825":{"id":"n1820938825","loc":[-85.4441709,42.0052198],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:44Z","tags":{}},"n1820938826":{"id":"n1820938826","loc":[-85.3925438,42.0038326],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:44Z","tags":{}},"n1820938829":{"id":"n1820938829","loc":[-85.5717582,41.9621861],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:44Z","tags":{}},"n1820938830":{"id":"n1820938830","loc":[-85.0866314,42.0995051],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:45Z","tags":{}},"n1820938831":{"id":"n1820938831","loc":[-85.576672,41.9522769],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:45Z","tags":{}},"n1820938832":{"id":"n1820938832","loc":[-85.1587238,42.0636205],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:45Z","tags":{}},"n1820938833":{"id":"n1820938833","loc":[-85.3804245,41.9999155],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:45Z","tags":{}},"n1820938834":{"id":"n1820938834","loc":[-85.280083,41.9948843],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:45Z","tags":{}},"n1820938836":{"id":"n1820938836","loc":[-85.561892,41.9686693],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:45Z","tags":{}},"n1820938837":{"id":"n1820938837","loc":[-85.0158975,42.0885253],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:45Z","tags":{}},"n1820938838":{"id":"n1820938838","loc":[-85.4248204,42.007633],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:45Z","tags":{}},"n1820938839":{"id":"n1820938839","loc":[-85.0352738,42.1039657],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:45Z","tags":{}},"n1820938840":{"id":"n1820938840","loc":[-85.211956,42.0411812],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:45Z","tags":{}},"n1820938841":{"id":"n1820938841","loc":[-85.4816575,41.9908997],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:45Z","tags":{}},"n1820938842":{"id":"n1820938842","loc":[-85.3807635,42.0020308],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:45Z","tags":{}},"n1820938843":{"id":"n1820938843","loc":[-85.0100865,42.0898521],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:45Z","tags":{}},"n1820938844":{"id":"n1820938844","loc":[-85.0103936,42.0897434],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:45Z","tags":{}},"n1820938848":{"id":"n1820938848","loc":[-85.2430052,42.0131363],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:45Z","tags":{}},"n1820938849":{"id":"n1820938849","loc":[-85.112559,42.0853723],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:45Z","tags":{}},"n1820938851":{"id":"n1820938851","loc":[-85.3641553,41.9952535],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:46Z","tags":{}},"n1820938852":{"id":"n1820938852","loc":[-85.2087373,42.0390777],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:46Z","tags":{}},"n1820938853":{"id":"n1820938853","loc":[-85.2473933,42.0148263],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:46Z","tags":{}},"n1820938854":{"id":"n1820938854","loc":[-85.0213464,42.090509],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:46Z","tags":{}},"n1820938855":{"id":"n1820938855","loc":[-85.0673208,42.1052353],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:46Z","tags":{}},"n1820938856":{"id":"n1820938856","loc":[-85.1003053,42.0905528],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:46Z","tags":{}},"n1820938857":{"id":"n1820938857","loc":[-85.2617367,41.9965389],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:46Z","tags":{}},"n1820938858":{"id":"n1820938858","loc":[-85.280363,41.9916015],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:46Z","tags":{}},"n1820938859":{"id":"n1820938859","loc":[-85.0038866,42.0873469],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:46Z","tags":{}},"n1820938860":{"id":"n1820938860","loc":[-85.2476401,42.0151451],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:46Z","tags":{}},"n1820938861":{"id":"n1820938861","loc":[-85.193717,42.0499294],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:46Z","tags":{}},"n1820938862":{"id":"n1820938862","loc":[-85.3478689,41.9917609],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:46Z","tags":{}},"n1820938863":{"id":"n1820938863","loc":[-85.5638017,41.9648881],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:46Z","tags":{}},"n1820938864":{"id":"n1820938864","loc":[-85.4356308,42.0064476],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:46Z","tags":{}},"n1820938865":{"id":"n1820938865","loc":[-85.0561722,42.1023509],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:46Z","tags":{}},"n1820938867":{"id":"n1820938867","loc":[-85.2256031,42.0356034],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:46Z","tags":{}},"n1820938868":{"id":"n1820938868","loc":[-85.6102576,41.9420844],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:46Z","tags":{}},"n1820938869":{"id":"n1820938869","loc":[-85.2285213,42.0339938],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:46Z","tags":{}},"n1820938870":{"id":"n1820938870","loc":[-85.0326238,42.0978003],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:47Z","tags":{}},"n1820938871":{"id":"n1820938871","loc":[-85.0131389,42.0903736],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:47Z","tags":{}},"n1820938872":{"id":"n1820938872","loc":[-85.2550859,42.0012259],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:47Z","tags":{}},"n1820938873":{"id":"n1820938873","loc":[-85.1130029,42.0846966],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:47Z","tags":{}},"n1820938874":{"id":"n1820938874","loc":[-85.1579041,42.06336],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:47Z","tags":{}},"n1820938875":{"id":"n1820938875","loc":[-85.0430522,42.1020234],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:47Z","tags":{}},"n1820938876":{"id":"n1820938876","loc":[-85.2786679,41.9865935],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:47Z","tags":{}},"n1820938877":{"id":"n1820938877","loc":[-85.1221666,42.0788706],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:47Z","tags":{}},"n1820938878":{"id":"n1820938878","loc":[-85.2554614,42.0103303],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:47Z","tags":{}},"n1820938879":{"id":"n1820938879","loc":[-85.2349801,42.0265748],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:47Z","tags":{}},"n1820938880":{"id":"n1820938880","loc":[-85.0997434,42.0907864],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:47Z","tags":{}},"n1820938881":{"id":"n1820938881","loc":[-85.0045464,42.0878167],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:47Z","tags":{}},"n1820938882":{"id":"n1820938882","loc":[-85.2728048,41.9982519],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:47Z","tags":{}},"n1820938883":{"id":"n1820938883","loc":[-85.3111333,41.9691587],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:47Z","tags":{}},"n1820938884":{"id":"n1820938884","loc":[-85.3219802,41.9721899],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:47Z","tags":{}},"n1820938885":{"id":"n1820938885","loc":[-85.3091378,41.9699325],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:47Z","tags":{}},"n1820938887":{"id":"n1820938887","loc":[-85.4242367,42.0085203],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:47Z","tags":{}},"n1820938888":{"id":"n1820938888","loc":[-84.9968377,42.0874504],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:47Z","tags":{}},"n1820938890":{"id":"n1820938890","loc":[-85.5443139,41.9714078],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:48Z","tags":{}},"n1820938891":{"id":"n1820938891","loc":[-85.6404013,41.9154676],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:48Z","tags":{}},"n1820938892":{"id":"n1820938892","loc":[-85.3644986,41.9962582],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:48Z","tags":{}},"n1820938893":{"id":"n1820938893","loc":[-85.0496772,42.1018323],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:48Z","tags":{}},"n1820938894":{"id":"n1820938894","loc":[-85.297261,41.9737373],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:48Z","tags":{}},"n1820938895":{"id":"n1820938895","loc":[-85.0327096,42.098071],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:48Z","tags":{}},"n1820938896":{"id":"n1820938896","loc":[-85.3856773,41.9996867],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:48Z","tags":{}},"n1820938897":{"id":"n1820938897","loc":[-85.0493862,42.1015509],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:48Z","tags":{}},"n1820938898":{"id":"n1820938898","loc":[-84.9969879,42.0876614],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:48Z","tags":{}},"n1820938899":{"id":"n1820938899","loc":[-85.0848625,42.1013587],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:48Z","tags":{}},"n1820938900":{"id":"n1820938900","loc":[-85.5853195,41.9479201],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:48Z","tags":{}},"n1820938901":{"id":"n1820938901","loc":[-85.6329169,41.9387964],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:48Z","tags":{}},"n1820938902":{"id":"n1820938902","loc":[-85.0843046,42.1029468],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:48Z","tags":{}},"n1820938903":{"id":"n1820938903","loc":[-85.1228747,42.0778474],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:48Z","tags":{}},"n1820938904":{"id":"n1820938904","loc":[-85.4855456,41.984095],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:48Z","tags":{}},"n1820938905":{"id":"n1820938905","loc":[-85.0573269,42.1026801],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:48Z","tags":{}},"n1820938906":{"id":"n1820938906","loc":[-85.2425868,42.0131523],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:48Z","tags":{}},"n1820938907":{"id":"n1820938907","loc":[-85.1149622,42.0860053],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:48Z","tags":{}},"n1820938908":{"id":"n1820938908","loc":[-85.4833097,41.9951578],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:48Z","tags":{}},"n1820938909":{"id":"n1820938909","loc":[-85.075979,42.1056372],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:48Z","tags":{}},"n1820938910":{"id":"n1820938910","loc":[-85.0338509,42.0977139],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:48Z","tags":{}},"n1820938911":{"id":"n1820938911","loc":[-85.6384272,41.9115715],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:48Z","tags":{}},"n1820938912":{"id":"n1820938912","loc":[-85.0458363,42.1004074],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:48Z","tags":{}},"n1820938913":{"id":"n1820938913","loc":[-85.0592138,42.1048305],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:48Z","tags":{}},"n1820938914":{"id":"n1820938914","loc":[-85.2807493,41.9916653],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:49Z","tags":{}},"n1820938915":{"id":"n1820938915","loc":[-85.1103274,42.0864193],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:49Z","tags":{}},"n1820938916":{"id":"n1820938916","loc":[-85.6267156,41.9404404],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:49Z","tags":{}},"n1820938918":{"id":"n1820938918","loc":[-85.0331374,42.0982911],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:49Z","tags":{}},"n1820938919":{"id":"n1820938919","loc":[-85.5637331,41.965409],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:49Z","tags":{}},"n1820938920":{"id":"n1820938920","loc":[-85.5457515,41.9714237],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:49Z","tags":{}},"n1820938922":{"id":"n1820938922","loc":[-85.082073,42.1030104],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:49Z","tags":{}},"n1820938923":{"id":"n1820938923","loc":[-85.0780765,42.103102],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:49Z","tags":{}},"n1820938924":{"id":"n1820938924","loc":[-85.4208035,42.0089508],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:49Z","tags":{}},"n1820938925":{"id":"n1820938925","loc":[-85.3469934,41.9914795],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:49Z","tags":{}},"n1820938926":{"id":"n1820938926","loc":[-85.0322,42.095619],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:49Z","tags":{}},"n1820938927":{"id":"n1820938927","loc":[-85.4784431,41.9949401],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:49Z","tags":{}},"n1820938928":{"id":"n1820938928","loc":[-85.1303095,42.0667523],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:49Z","tags":{}},"n1820938929":{"id":"n1820938929","loc":[-85.2463784,42.0084781],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:49Z","tags":{}},"n1820938930":{"id":"n1820938930","loc":[-85.6299986,41.9427707],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:49Z","tags":{}},"n1820938931":{"id":"n1820938931","loc":[-85.6325907,41.9238499],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:49Z","tags":{}},"n1820938932":{"id":"n1820938932","loc":[-85.4808464,41.9914476],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:49Z","tags":{}},"n1820938934":{"id":"n1820938934","loc":[-85.2411599,42.0105292],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:49Z","tags":{}},"n1820938935":{"id":"n1820938935","loc":[-85.0163213,42.0892379],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:49Z","tags":{}},"n1820938936":{"id":"n1820938936","loc":[-85.3290934,41.9682322],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:49Z","tags":{}},"n1820938937":{"id":"n1820938937","loc":[-85.4925623,41.9853231],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:49Z","tags":{}},"n1820938938":{"id":"n1820938938","loc":[-85.0338294,42.09892],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:50Z","tags":{}},"n1820938940":{"id":"n1820938940","loc":[-85.4174561,42.008903],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:50Z","tags":{}},"n1820938941":{"id":"n1820938941","loc":[-85.1165595,42.0838845],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:50Z","tags":{}},"n1820938942":{"id":"n1820938942","loc":[-85.2954585,41.9717192],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:50Z","tags":{}},"n1820938943":{"id":"n1820938943","loc":[-85.6330199,41.9257338],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:50Z","tags":{}},"n1820938944":{"id":"n1820938944","loc":[-85.2294654,42.0324478],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:50Z","tags":{}},"n1820938945":{"id":"n1820938945","loc":[-85.5601282,41.9728914],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:50Z","tags":{}},"n1820938946":{"id":"n1820938946","loc":[-85.1176324,42.08568],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:50Z","tags":{}},"n1820938947":{"id":"n1820938947","loc":[-85.0210245,42.0906005],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:50Z","tags":{}},"n1820938948":{"id":"n1820938948","loc":[-85.0251887,42.09253],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:50Z","tags":{}},"n1820938949":{"id":"n1820938949","loc":[-85.0895832,42.0939551],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:50Z","tags":{}},"n1820938950":{"id":"n1820938950","loc":[-84.9915109,42.085842],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:50Z","tags":{}},"n1820938951":{"id":"n1820938951","loc":[-85.2187366,42.0393486],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:50Z","tags":{}},"n1820938952":{"id":"n1820938952","loc":[-85.006605,42.087579],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:50Z","tags":{}},"n1820938953":{"id":"n1820938953","loc":[-85.046641,42.1012393],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:50Z","tags":{}},"n1820938954":{"id":"n1820938954","loc":[-85.052102,42.103695],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:50Z","tags":{}},"n1820938955":{"id":"n1820938955","loc":[-85.283925,41.9912825],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:50Z","tags":{}},"n1820938956":{"id":"n1820938956","loc":[-85.2326626,42.0316349],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:50Z","tags":{}},"n1820938957":{"id":"n1820938957","loc":[-85.1174298,42.0859694],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:50Z","tags":{}},"n1820938958":{"id":"n1820938958","loc":[-85.3802056,41.9994794],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:50Z","tags":{}},"n1820938959":{"id":"n1820938959","loc":[-85.4586334,41.9999737],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:50Z","tags":{}},"n1820938960":{"id":"n1820938960","loc":[-85.4302234,42.0069418],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:50Z","tags":{}},"n1820938961":{"id":"n1820938961","loc":[-85.092201,42.0930674],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:50Z","tags":{}},"n1820938962":{"id":"n1820938962","loc":[-85.3684511,41.9979382],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:50Z","tags":{}},"n1820938963":{"id":"n1820938963","loc":[-85.4618735,42.0011856],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:50Z","tags":{}},"n1820938964":{"id":"n1820938964","loc":[-85.4828205,41.9877793],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:50Z","tags":{}},"n1820938965":{"id":"n1820938965","loc":[-85.0837789,42.1025726],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:51Z","tags":{}},"n1820938966":{"id":"n1820938966","loc":[-85.0176195,42.090253],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:51Z","tags":{}},"n1820938967":{"id":"n1820938967","loc":[-85.3801627,42.001074],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:51Z","tags":{}},"n1820938968":{"id":"n1820938968","loc":[-85.4767007,41.994488],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:51Z","tags":{}},"n1820938969":{"id":"n1820938969","loc":[-85.274268,41.9957495],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:51Z","tags":{}},"n1820938970":{"id":"n1820938970","loc":[-85.2977438,41.9719506],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:51Z","tags":{}},"n1820938971":{"id":"n1820938971","loc":[-85.2425546,42.0208682],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:51Z","tags":{}},"n1820938972":{"id":"n1820938972","loc":[-85.2557082,42.002382],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:51Z","tags":{}},"n1820938973":{"id":"n1820938973","loc":[-85.3187937,41.9691986],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:51Z","tags":{}},"n1820938975":{"id":"n1820938975","loc":[-85.2448077,42.0153045],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:51Z","tags":{}},"n1820938977":{"id":"n1820938977","loc":[-85.0343015,42.0997718],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:51Z","tags":{}},"n1820938978":{"id":"n1820938978","loc":[-85.2449364,42.01874],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:51Z","tags":{}},"n1820938979":{"id":"n1820938979","loc":[-85.2598391,41.9969602],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:51Z","tags":{}},"n1820938980":{"id":"n1820938980","loc":[-85.4294724,42.0067665],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:51Z","tags":{}},"n1820938981":{"id":"n1820938981","loc":[-85.428082,42.0055124],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:51Z","tags":{}},"n1820938983":{"id":"n1820938983","loc":[-85.5436315,41.9717484],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:51Z","tags":{}},"n1820938985":{"id":"n1820938985","loc":[-85.5978336,41.9407437],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:51Z","tags":{}},"n1820938986":{"id":"n1820938986","loc":[-85.491661,41.9860249],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:51Z","tags":{}},"n1820938987":{"id":"n1820938987","loc":[-85.4942789,41.9801392],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:51Z","tags":{}},"n1820938988":{"id":"n1820938988","loc":[-85.0416306,42.1010841],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:52Z","tags":{}},"n1820938989":{"id":"n1820938989","loc":[-85.2653644,41.9984433],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:52Z","tags":{}},"n1820938990":{"id":"n1820938990","loc":[-85.1028266,42.0881124],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:52Z","tags":{}},"n1820938991":{"id":"n1820938991","loc":[-85.0163146,42.0887932],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:52Z","tags":{}},"n1820938992":{"id":"n1820938992","loc":[-85.5282209,41.9678112],"version":"2","changeset":"12182668","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T07:35:33Z","tags":{}},"n1820938993":{"id":"n1820938993","loc":[-85.5442752,41.9715888],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:52Z","tags":{}},"n1820938994":{"id":"n1820938994","loc":[-85.5634327,41.9658558],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:52Z","tags":{}},"n1820938995":{"id":"n1820938995","loc":[-85.0384227,42.1037627],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:52Z","tags":{}},"n1820938996":{"id":"n1820938996","loc":[-85.1144258,42.0854439],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:52Z","tags":{}},"n1820938997":{"id":"n1820938997","loc":[-85.1870651,42.0506305],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:52Z","tags":{}},"n1820938998":{"id":"n1820938998","loc":[-85.1256159,42.0747376],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:52Z","tags":{}},"n1820938999":{"id":"n1820938999","loc":[-85.3272695,41.9715836],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:52Z","tags":{}},"n1820939000":{"id":"n1820939000","loc":[-85.0543067,42.103098],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:52Z","tags":{}},"n1820939001":{"id":"n1820939001","loc":[-85.4678173,41.9973585],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:52Z","tags":{}},"n1820939003":{"id":"n1820939003","loc":[-85.0266626,42.0933154],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:52Z","tags":{}},"n1820939004":{"id":"n1820939004","loc":[-85.0353046,42.1019728],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:52Z","tags":{}},"n1820939005":{"id":"n1820939005","loc":[-85.1237961,42.0762798],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:52Z","tags":{}},"n1820939006":{"id":"n1820939006","loc":[-85.2812214,41.9826702],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:52Z","tags":{}},"n1820939007":{"id":"n1820939007","loc":[-85.2927763,41.9747343],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:53Z","tags":{}},"n1820939008":{"id":"n1820939008","loc":[-85.3270979,41.9720862],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:53Z","tags":{}},"n1820939009":{"id":"n1820939009","loc":[-85.488657,41.9856581],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:53Z","tags":{}},"n1820939010":{"id":"n1820939010","loc":[-85.3087301,41.9701399],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:53Z","tags":{}},"n1820939011":{"id":"n1820939011","loc":[-85.0276939,42.093768],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:53Z","tags":{}},"n1820939012":{"id":"n1820939012","loc":[-85.2956516,41.9748779],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:53Z","tags":{}},"n1820939013":{"id":"n1820939013","loc":[-85.1298579,42.0726443],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:53Z","tags":{}},"n1820939014":{"id":"n1820939014","loc":[-85.105144,42.0870893],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:53Z","tags":{}},"n1820939015":{"id":"n1820939015","loc":[-85.0677486,42.1053917],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:53Z","tags":{}},"n1820939016":{"id":"n1820939016","loc":[-85.0333681,42.0993459],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:53Z","tags":{}},"n1820939017":{"id":"n1820939017","loc":[-85.6384272,41.910805],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:53Z","tags":{}},"n1820939018":{"id":"n1820939018","loc":[-85.399496,42.006894],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:53Z","tags":{}},"n1820939019":{"id":"n1820939019","loc":[-85.2648427,41.9998318],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:53Z","tags":{}},"n1820939020":{"id":"n1820939020","loc":[-85.1237424,42.0766779],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:53Z","tags":{}},"n1820939021":{"id":"n1820939021","loc":[-85.2515025,42.0109442],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:53Z","tags":{}},"n1820939022":{"id":"n1820939022","loc":[-85.5566306,41.9718385],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:53Z","tags":{}},"n1820939023":{"id":"n1820939023","loc":[-85.090644,42.0938369],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:53Z","tags":{}},"n1820939024":{"id":"n1820939024","loc":[-85.1245525,42.074914],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:53Z","tags":{}},"n1820939025":{"id":"n1820939025","loc":[-85.1099934,42.0863926],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:53Z","tags":{}},"n1820939026":{"id":"n1820939026","loc":[-85.1251653,42.0744589],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:53Z","tags":{}},"n1820939027":{"id":"n1820939027","loc":[-85.401792,42.0068143],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:54Z","tags":{}},"n1820939028":{"id":"n1820939028","loc":[-85.0094763,42.0899584],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:54Z","tags":{}},"n1820939029":{"id":"n1820939029","loc":[-85.1330779,42.0705605],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:54Z","tags":{}},"n1820939030":{"id":"n1820939030","loc":[-85.4935064,41.984398],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:54Z","tags":{}},"n1820939031":{"id":"n1820939031","loc":[-85.5713334,41.9613939],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:54Z","tags":{}},"n1820939032":{"id":"n1820939032","loc":[-85.0873945,42.0964669],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:54Z","tags":{}},"n1820939033":{"id":"n1820939033","loc":[-85.0886497,42.0986481],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:54Z","tags":{}},"n1820939034":{"id":"n1820939034","loc":[-85.3276343,41.9758897],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:54Z","tags":{}},"n1820939035":{"id":"n1820939035","loc":[-85.1304386,42.0727387],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:54Z","tags":{}},"n1820939036":{"id":"n1820939036","loc":[-85.2551932,42.0052999],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:54Z","tags":{}},"n1820939037":{"id":"n1820939037","loc":[-85.2206936,42.0384458],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:54Z","tags":{}},"n1820939038":{"id":"n1820939038","loc":[-85.2313645,42.0286389],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:54Z","tags":{}},"n1820939039":{"id":"n1820939039","loc":[-85.0754586,42.1059835],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:54Z","tags":{}},"n1820939040":{"id":"n1820939040","loc":[-85.0663324,42.1050812],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:54Z","tags":{}},"n1820939041":{"id":"n1820939041","loc":[-85.2406234,42.0106887],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:54Z","tags":{}},"n1820939042":{"id":"n1820939042","loc":[-85.0685962,42.1058175],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:54Z","tags":{}},"n1820939043":{"id":"n1820939043","loc":[-85.0689462,42.1059437],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:54Z","tags":{}},"n1820939044":{"id":"n1820939044","loc":[-85.0586144,42.1046144],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:54Z","tags":{}},"n1820939045":{"id":"n1820939045","loc":[-85.3650565,41.9965452],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:54Z","tags":{}},"n1820939047":{"id":"n1820939047","loc":[-85.5752558,41.9536014],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:54Z","tags":{}},"n1820939048":{"id":"n1820939048","loc":[-85.5110159,41.9710624],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:55Z","tags":{}},"n1820939050":{"id":"n1820939050","loc":[-85.2832641,41.9926477],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:55Z","tags":{}},"n1820939051":{"id":"n1820939051","loc":[-85.0078402,42.0898947],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:55Z","tags":{}},"n1820939052":{"id":"n1820939052","loc":[-85.3882737,42.0017916],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:55Z","tags":{}},"n1820939053":{"id":"n1820939053","loc":[-85.1718945,42.0564937],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:55Z","tags":{}},"n1820939054":{"id":"n1820939054","loc":[-85.0947048,42.0929293],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:55Z","tags":{}},"n1820939055":{"id":"n1820939055","loc":[-85.4456944,42.0051082],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:55Z","tags":{}},"n1820939056":{"id":"n1820939056","loc":[-85.3139872,41.9706903],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:55Z","tags":{}},"n1820939057":{"id":"n1820939057","loc":[-85.3893895,42.0034021],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:55Z","tags":{}},"n1820939058":{"id":"n1820939058","loc":[-85.2425332,42.0106089],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:55Z","tags":{}},"n1820939059":{"id":"n1820939059","loc":[-85.6085624,41.9420844],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:55Z","tags":{}},"n1820939060":{"id":"n1820939060","loc":[-85.210411,42.0397789],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:55Z","tags":{}},"n1820939061":{"id":"n1820939061","loc":[-85.2762542,41.9960473],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:55Z","tags":{}},"n1820939062":{"id":"n1820939062","loc":[-85.4686584,41.9969973],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:55Z","tags":{}},"n1820939063":{"id":"n1820939063","loc":[-85.3860421,42.0018394],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:55Z","tags":{}},"n1820939064":{"id":"n1820939064","loc":[-85.5636944,41.9644414],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:55Z","tags":{}},"n1820939065":{"id":"n1820939065","loc":[-85.3267331,41.9766554],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:55Z","tags":{}},"n1820939066":{"id":"n1820939066","loc":[-85.0868996,42.0943822],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:55Z","tags":{}},"n1820939067":{"id":"n1820939067","loc":[-85.104861,42.0880038],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:55Z","tags":{}},"n1820939068":{"id":"n1820939068","loc":[-85.5537123,41.9695093],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:55Z","tags":{}},"n1820939069":{"id":"n1820939069","loc":[-85.6325092,41.9396743],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:55Z","tags":{}},"n1820939070":{"id":"n1820939070","loc":[-85.3869648,42.0024454],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:55Z","tags":{}},"n1820939071":{"id":"n1820939071","loc":[-85.2775349,41.9957335],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:55Z","tags":{}},"n1820939072":{"id":"n1820939072","loc":[-85.2055616,42.0421533],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:56Z","tags":{}},"n1820939073":{"id":"n1820939073","loc":[-85.4731431,41.9946531],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:56Z","tags":{}},"n1820939074":{"id":"n1820939074","loc":[-85.0399609,42.1030833],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:56Z","tags":{}},"n1820939075":{"id":"n1820939075","loc":[-85.3055758,41.9725169],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:56Z","tags":{}},"n1820939076":{"id":"n1820939076","loc":[-85.4834599,41.994488],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:56Z","tags":{}},"n1820939077":{"id":"n1820939077","loc":[-85.3819866,42.0023018],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:56Z","tags":{}},"n1820939078":{"id":"n1820939078","loc":[-85.1218756,42.0789992],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:56Z","tags":{}},"n1820939079":{"id":"n1820939079","loc":[-85.2793159,41.9944458],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:56Z","tags":{}},"n1820939080":{"id":"n1820939080","loc":[-85.2495498,42.0101466],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:56Z","tags":{}},"n1820939081":{"id":"n1820939081","loc":[-85.0035969,42.0872434],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:56Z","tags":{}},"n1820939082":{"id":"n1820939082","loc":[-85.1054243,42.0865626],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:56Z","tags":{}},"n1820939083":{"id":"n1820939083","loc":[-85.0917665,42.0934774],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:56Z","tags":{}},"n1820939084":{"id":"n1820939084","loc":[-85.3442211,41.988938],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:56Z","tags":{}},"n1820939086":{"id":"n1820939086","loc":[-85.273989,41.9953588],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:56Z","tags":{}},"n1820939087":{"id":"n1820939087","loc":[-85.1142541,42.0852488],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:56Z","tags":{}},"n1820939089":{"id":"n1820939089","loc":[-85.1526684,42.0615758],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:56Z","tags":{}},"n1820939090":{"id":"n1820939090","loc":[-85.2538843,42.0110159],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:56Z","tags":{}},"n1820939091":{"id":"n1820939091","loc":[-85.28341,41.9909635],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:56Z","tags":{}},"n1820939092":{"id":"n1820939092","loc":[-85.3963178,42.0050217],"version":"2","changeset":"13114234","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-09-15T03:33:29Z","tags":{}},"n1820939093":{"id":"n1820939093","loc":[-85.0851682,42.1012472],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:56Z","tags":{}},"n1820939095":{"id":"n1820939095","loc":[-85.2811784,41.986243],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:56Z","tags":{}},"n1820939096":{"id":"n1820939096","loc":[-85.4274125,42.0052995],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:56Z","tags":{}},"n1820939097":{"id":"n1820939097","loc":[-85.0871262,42.0951652],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:56Z","tags":{}},"n1820939099":{"id":"n1820939099","loc":[-85.1314253,42.0671665],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:57Z","tags":{}},"n1820939100":{"id":"n1820939100","loc":[-85.2778997,41.991001],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:57Z","tags":{}},"n1820939101":{"id":"n1820939101","loc":[-85.112107,42.0862812],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:57Z","tags":{}},"n1820939102":{"id":"n1820939102","loc":[-85.299911,41.9729955],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:57Z","tags":{}},"n1820939103":{"id":"n1820939103","loc":[-85.639822,41.9094796],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:57Z","tags":{}},"n1820939104":{"id":"n1820939104","loc":[-85.122294,42.0785334],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:57Z","tags":{}},"n1820939105":{"id":"n1820939105","loc":[-85.2476294,42.015719],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:57Z","tags":{}},"n1820939106":{"id":"n1820939106","loc":[-85.4946007,41.9814631],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:57Z","tags":{}},"n1820939107":{"id":"n1820939107","loc":[-85.0879524,42.0986919],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:57Z","tags":{}},"n1820939108":{"id":"n1820939108","loc":[-85.0342814,42.098274],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:57Z","tags":{}},"n1820939109":{"id":"n1820939109","loc":[-85.2450695,42.0095463],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:57Z","tags":{}},"n1820939110":{"id":"n1820939110","loc":[-85.3847546,42.0024135],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:57Z","tags":{}},"n1820939111":{"id":"n1820939111","loc":[-85.2961344,41.9742558],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:57Z","tags":{}},"n1820939112":{"id":"n1820939112","loc":[-85.27899,41.994317],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:57Z","tags":{}},"n1820939114":{"id":"n1820939114","loc":[-85.1017644,42.0886618],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:57Z","tags":{}},"n1820939115":{"id":"n1820939115","loc":[-85.076215,42.1056333],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:57Z","tags":{}},"n1820939116":{"id":"n1820939116","loc":[-85.1198009,42.0805349],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:57Z","tags":{}},"n1820939117":{"id":"n1820939117","loc":[-85.11988,42.0798513],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:57Z","tags":{}},"n1820939118":{"id":"n1820939118","loc":[-85.147819,42.0625476],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:57Z","tags":{}},"n1820939119":{"id":"n1820939119","loc":[-85.0585969,42.1029042],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:57Z","tags":{}},"n1820939120":{"id":"n1820939120","loc":[-85.1248596,42.0745744],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:57Z","tags":{}},"n1820939121":{"id":"n1820939121","loc":[-85.3023786,41.9725249],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:58Z","tags":{}},"n1820939123":{"id":"n1820939123","loc":[-85.0119332,42.0900699],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:58Z","tags":{}},"n1820939124":{"id":"n1820939124","loc":[-85.2466852,42.0170343],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:58Z","tags":{}},"n1820939125":{"id":"n1820939125","loc":[-85.0033019,42.0872792],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:58Z","tags":{}},"n1820939126":{"id":"n1820939126","loc":[-85.0042084,42.0875778],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:58Z","tags":{}},"n1820939128":{"id":"n1820939128","loc":[-85.0052961,42.0885424],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:58Z","tags":{}},"n1820939130":{"id":"n1820939130","loc":[-85.0647942,42.10508],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:58Z","tags":{}},"n1820939131":{"id":"n1820939131","loc":[-85.2824123,41.9825107],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:58Z","tags":{}},"n1820939132":{"id":"n1820939132","loc":[-85.3210039,41.9723255],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:58Z","tags":{}},"n1820939133":{"id":"n1820939133","loc":[-85.0491033,42.1014184],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:58Z","tags":{}},"n1820939134":{"id":"n1820939134","loc":[-85.1127776,42.0855168],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:58Z","tags":{}},"n1820939135":{"id":"n1820939135","loc":[-85.1243768,42.0759322],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:58Z","tags":{}},"n1820939137":{"id":"n1820939137","loc":[-85.125974,42.0747547],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:58Z","tags":{}},"n1820939138":{"id":"n1820939138","loc":[-85.1071248,42.0859973],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:58Z","tags":{}},"n1820939139":{"id":"n1820939139","loc":[-85.5326175,41.9674833],"version":"2","changeset":"12182668","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T07:35:32Z","tags":{}},"n1820939140":{"id":"n1820939140","loc":[-85.1338715,42.0660833],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:58Z","tags":{}},"n1820939142":{"id":"n1820939142","loc":[-85.649671,41.9135675],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:58Z","tags":{}},"n1820939144":{"id":"n1820939144","loc":[-85.0236545,42.0920444],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:59Z","tags":{}},"n1820939145":{"id":"n1820939145","loc":[-85.1084391,42.0859376],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:59Z","tags":{}},"n1820939146":{"id":"n1820939146","loc":[-85.1539988,42.0618626],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:59Z","tags":{}},"n1820939147":{"id":"n1820939147","loc":[-85.2354521,42.026511],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:59Z","tags":{}},"n1820939148":{"id":"n1820939148","loc":[-85.2362246,42.0260408],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:59Z","tags":{}},"n1820939149":{"id":"n1820939149","loc":[-85.2401342,42.0115233],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:59Z","tags":{}},"n1820939150":{"id":"n1820939150","loc":[-85.295319,41.9747423],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:59Z","tags":{}},"n1820939151":{"id":"n1820939151","loc":[-85.1164696,42.0835409],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:59Z","tags":{}},"n1820939152":{"id":"n1820939152","loc":[-85.3232891,41.9712885],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:59Z","tags":{}},"n1820939153":{"id":"n1820939153","loc":[-85.2574463,42.0068944],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:59Z","tags":{}},"n1820939155":{"id":"n1820939155","loc":[-85.5704064,41.9598246],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:59Z","tags":{}},"n1820939156":{"id":"n1820939156","loc":[-85.0349077,42.0998116],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:59Z","tags":{}},"n1820939157":{"id":"n1820939157","loc":[-85.0949529,42.0925619],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:59Z","tags":{}},"n1820939159":{"id":"n1820939159","loc":[-85.0179829,42.0902343],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:59Z","tags":{}},"n1820939160":{"id":"n1820939160","loc":[-85.0405832,42.1016942],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:59Z","tags":{}},"n1820939161":{"id":"n1820939161","loc":[-85.2534015,42.0111833],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:59Z","tags":{}},"n1820939162":{"id":"n1820939162","loc":[-85.0839881,42.102708],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:59Z","tags":{}},"n1820939163":{"id":"n1820939163","loc":[-85.0341996,42.1008385],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:59Z","tags":{}},"n1820939164":{"id":"n1820939164","loc":[-85.1037761,42.0879731],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:56:59Z","tags":{}},"n1820939173":{"id":"n1820939173","loc":[-85.0460616,42.1005786],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:00Z","tags":{}},"n1820939177":{"id":"n1820939177","loc":[-85.0061651,42.0878059],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:00Z","tags":{}},"n1820939181":{"id":"n1820939181","loc":[-85.1456775,42.0654684],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:00Z","tags":{}},"n1820939183":{"id":"n1820939183","loc":[-85.1325508,42.0718439],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:00Z","tags":{}},"n1820939185":{"id":"n1820939185","loc":[-85.2485842,42.008329],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:00Z","tags":{}},"n1820939187":{"id":"n1820939187","loc":[-85.2744128,41.9949322],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:00Z","tags":{}},"n1820939189":{"id":"n1820939189","loc":[-85.2579025,41.9999542],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:00Z","tags":{}},"n1820939191":{"id":"n1820939191","loc":[-85.3358998,41.9828987],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:00Z","tags":{}},"n1820939193":{"id":"n1820939193","loc":[-85.3192658,41.9716714],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:00Z","tags":{}},"n1820939194":{"id":"n1820939194","loc":[-85.6400795,41.9130725],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:00Z","tags":{}},"n1820939195":{"id":"n1820939195","loc":[-85.3278489,41.9780591],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:00Z","tags":{}},"n1820939196":{"id":"n1820939196","loc":[-85.2800197,41.983061],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:00Z","tags":{}},"n1820939197":{"id":"n1820939197","loc":[-85.3278167,41.9692943],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:00Z","tags":{}},"n1820939198":{"id":"n1820939198","loc":[-85.3366894,41.9838653],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:00Z","tags":{}},"n1820939199":{"id":"n1820939199","loc":[-85.0328383,42.0969923],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:00Z","tags":{}},"n1820939201":{"id":"n1820939201","loc":[-85.3259284,41.9720383],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:00Z","tags":{}},"n1820939217":{"id":"n1820939217","loc":[-85.1840181,42.0503277],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:01Z","tags":{}},"n1820939220":{"id":"n1820939220","loc":[-85.422563,42.0089986],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:01Z","tags":{}},"n1820939222":{"id":"n1820939222","loc":[-85.555386,41.9707856],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:01Z","tags":{}},"n1820939224":{"id":"n1820939224","loc":[-85.3830809,42.002254],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:01Z","tags":{}},"n1820939226":{"id":"n1820939226","loc":[-84.9917938,42.0857517],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:01Z","tags":{}},"n1820939227":{"id":"n1820939227","loc":[-85.2936775,41.9740484],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:01Z","tags":{}},"n1820939228":{"id":"n1820939228","loc":[-85.2632133,41.9975024],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:01Z","tags":{}},"n1820939229":{"id":"n1820939229","loc":[-85.2809424,41.9853259],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:01Z","tags":{}},"n1820939230":{"id":"n1820939230","loc":[-85.242104,42.0131204],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:01Z","tags":{}},"n1820939232":{"id":"n1820939232","loc":[-85.2610246,41.9963901],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:01Z","tags":{}},"n1820939233":{"id":"n1820939233","loc":[-85.2335531,42.0268378],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:01Z","tags":{}},"n1820939234":{"id":"n1820939234","loc":[-85.3188839,41.9713575],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:01Z","tags":{}},"n1820939235":{"id":"n1820939235","loc":[-85.2413637,42.0225658],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:01Z","tags":{}},"n1820939237":{"id":"n1820939237","loc":[-85.0010796,42.0887215],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:01Z","tags":{}},"n1820939239":{"id":"n1820939239","loc":[-85.2241697,42.0362624],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:01Z","tags":{}},"n1820939243":{"id":"n1820939243","loc":[-85.0368456,42.1040134],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:01Z","tags":{}},"n1820939244":{"id":"n1820939244","loc":[-85.1327986,42.069524],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:01Z","tags":{}},"n1820939260":{"id":"n1820939260","loc":[-85.5408163,41.9711206],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:01Z","tags":{}},"n1820939261":{"id":"n1820939261","loc":[-85.2959199,41.9746546],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:02Z","tags":{}},"n1820939262":{"id":"n1820939262","loc":[-85.3298659,41.9683598],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:02Z","tags":{}},"n1820939263":{"id":"n1820939263","loc":[-85.2240581,42.0358425],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:02Z","tags":{}},"n1820939264":{"id":"n1820939264","loc":[-85.2438206,42.0101944],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:02Z","tags":{}},"n1820939265":{"id":"n1820939265","loc":[-85.3984489,42.0059589],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:02Z","tags":{}},"n1820939266":{"id":"n1820939266","loc":[-85.2330811,42.0294279],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:02Z","tags":{}},"n1820939268":{"id":"n1820939268","loc":[-85.1126877,42.0857704],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:02Z","tags":{}},"n1820939271":{"id":"n1820939271","loc":[-85.254925,42.0106253],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:02Z","tags":{}},"n1820939273":{"id":"n1820939273","loc":[-85.4328046,42.0064662],"version":"2","changeset":"12524188","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-28T14:51:01Z","tags":{}},"n1820939277":{"id":"n1820939277","loc":[-85.289622,41.9789616],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:02Z","tags":{}},"n1820939279":{"id":"n1820939279","loc":[-85.4574532,42.0004043],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:02Z","tags":{}},"n1820939281":{"id":"n1820939281","loc":[-85.4803486,41.9867211],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:02Z","tags":{}},"n1820939283":{"id":"n1820939283","loc":[-85.157475,42.0631848],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:02Z","tags":{}},"n1820939285":{"id":"n1820939285","loc":[-85.2571458,42.0059935],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:02Z","tags":{}},"n1820939287":{"id":"n1820939287","loc":[-85.2818544,41.9825984],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:02Z","tags":{}},"n1820939289":{"id":"n1820939289","loc":[-85.2298302,42.0328781],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:02Z","tags":{}},"n1820939291":{"id":"n1820939291","loc":[-85.4819523,41.984821],"version":"2","changeset":"12182679","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T07:37:01Z","tags":{}},"n1820939301":{"id":"n1820939301","loc":[-85.3139765,41.9701159],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:03Z","tags":{}},"n1820939304":{"id":"n1820939304","loc":[-85.0424447,42.101742],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:03Z","tags":{}},"n1820939306":{"id":"n1820939306","loc":[-85.6360283,41.9338482],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:03Z","tags":{}},"n1820939310":{"id":"n1820939310","loc":[-85.3463025,41.9913622],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:03Z","tags":{}},"n1820939312":{"id":"n1820939312","loc":[-85.4664869,41.9988097],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:03Z","tags":{}},"n1820939314":{"id":"n1820939314","loc":[-85.149364,42.0622449],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:03Z","tags":{}},"n1820939316":{"id":"n1820939316","loc":[-85.2460415,42.0153125],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:03Z","tags":{}},"n1820939318":{"id":"n1820939318","loc":[-85.4806103,41.9924523],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:03Z","tags":{}},"n1820939320":{"id":"n1820939320","loc":[-85.2449042,42.0190987],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:03Z","tags":{}},"n1820939322":{"id":"n1820939322","loc":[-85.5280165,41.9689263],"version":"2","changeset":"12182668","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T07:35:33Z","tags":{}},"n1820939324":{"id":"n1820939324","loc":[-85.0051204,42.0882625],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:03Z","tags":{}},"n1820939326":{"id":"n1820939326","loc":[-85.1240925,42.0771546],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:03Z","tags":{}},"n1820939329":{"id":"n1820939329","loc":[-85.2261653,42.0342225],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:03Z","tags":{}},"n1820939331":{"id":"n1820939331","loc":[-85.5259933,41.972211],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:03Z","tags":{}},"n1820939333":{"id":"n1820939333","loc":[-85.0074754,42.0883183],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:03Z","tags":{}},"n1820939335":{"id":"n1820939335","loc":[-85.0764014,42.1055549],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:03Z","tags":{}},"n1820939336":{"id":"n1820939336","loc":[-85.2908773,41.9769597],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:03Z","tags":{}},"n1820939337":{"id":"n1820939337","loc":[-85.4095382,42.0083449],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:03Z","tags":{}},"n1820939346":{"id":"n1820939346","loc":[-85.2514166,42.0111753],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:03Z","tags":{}},"n1820939348":{"id":"n1820939348","loc":[-85.0030377,42.0873799],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:03Z","tags":{}},"n1820939350":{"id":"n1820939350","loc":[-85.3659362,41.9964974],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:03Z","tags":{}},"n1820939352":{"id":"n1820939352","loc":[-85.226058,42.0348281],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:04Z","tags":{}},"n1820939355":{"id":"n1820939355","loc":[-85.1902408,42.0507101],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:04Z","tags":{}},"n1820939357":{"id":"n1820939357","loc":[-85.2781854,41.9946001],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:04Z","tags":{}},"n1820939359":{"id":"n1820939359","loc":[-85.2139988,42.0405175],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:04Z","tags":{}},"n1820939361":{"id":"n1820939361","loc":[-85.0086609,42.0908262],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:04Z","tags":{}},"n1820939363":{"id":"n1820939363","loc":[-85.0627128,42.1043398],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:04Z","tags":{}},"n1820939365":{"id":"n1820939365","loc":[-85.1311346,42.072501],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:04Z","tags":{}},"n1820939369":{"id":"n1820939369","loc":[-85.248198,42.0082652],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:04Z","tags":{}},"n1820939370":{"id":"n1820939370","loc":[-84.99792,42.087794],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:04Z","tags":{}},"n1820939371":{"id":"n1820939371","loc":[-85.2786775,41.9942783],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:04Z","tags":{}},"n1820939372":{"id":"n1820939372","loc":[-85.0342103,42.1013957],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:04Z","tags":{}},"n1820939373":{"id":"n1820939373","loc":[-85.2022357,42.0444799],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:04Z","tags":{}},"n1820939374":{"id":"n1820939374","loc":[-85.2279205,42.0337388],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:04Z","tags":{}},"n1820939375":{"id":"n1820939375","loc":[-85.1337699,42.0712614],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:04Z","tags":{}},"n1820939376":{"id":"n1820939376","loc":[-85.317517,41.9707062],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:04Z","tags":{}},"n1820939377":{"id":"n1820939377","loc":[-85.1326326,42.070218],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:04Z","tags":{}},"n1820939394":{"id":"n1820939394","loc":[-85.0197746,42.0899118],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:04Z","tags":{}},"n1820939397":{"id":"n1820939397","loc":[-85.2590076,41.9984632],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:04Z","tags":{}},"n1820939399":{"id":"n1820939399","loc":[-85.2469964,42.0083449],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:04Z","tags":{}},"n1820939400":{"id":"n1820939400","loc":[-85.2470929,42.0146668],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:04Z","tags":{}},"n1820939401":{"id":"n1820939401","loc":[-84.9984095,42.0878087],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:04Z","tags":{}},"n1820939402":{"id":"n1820939402","loc":[-85.2372653,42.0243273],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:04Z","tags":{}},"n1820939403":{"id":"n1820939403","loc":[-85.2454986,42.0091955],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:05Z","tags":{}},"n1820939404":{"id":"n1820939404","loc":[-85.0539205,42.1035995],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:05Z","tags":{}},"n1820939405":{"id":"n1820939405","loc":[-85.550601,41.9706101],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:05Z","tags":{}},"n1820939406":{"id":"n1820939406","loc":[-85.0351343,42.0999656],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:05Z","tags":{}},"n1820939407":{"id":"n1820939407","loc":[-85.0082908,42.0905755],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:05Z","tags":{}},"n1820939408":{"id":"n1820939408","loc":[-85.0132904,42.0902251],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:05Z","tags":{}},"n1820939410":{"id":"n1820939410","loc":[-85.0892546,42.094012],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:05Z","tags":{}},"n1820939412":{"id":"n1820939412","loc":[-85.0350793,42.1030315],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:05Z","tags":{}},"n1820939416":{"id":"n1820939416","loc":[-85.0012406,42.0886777],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:05Z","tags":{}},"n1820939418":{"id":"n1820939418","loc":[-85.0577453,42.1029229],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:05Z","tags":{}},"n1820939420":{"id":"n1820939420","loc":[-85.1230786,42.0776722],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:05Z","tags":{}},"n1820939422":{"id":"n1820939422","loc":[-85.571136,41.9649304],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:05Z","tags":{}},"n1820939436":{"id":"n1820939436","loc":[-85.1137968,42.0848997],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:05Z","tags":{}},"n1820939437":{"id":"n1820939437","loc":[-85.3559584,41.9925105],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:05Z","tags":{}},"n1820939438":{"id":"n1820939438","loc":[-85.0080172,42.0903565],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:05Z","tags":{}},"n1820939439":{"id":"n1820939439","loc":[-85.0048897,42.0880913],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:05Z","tags":{}},"n1820939441":{"id":"n1820939441","loc":[-85.0406959,42.1018574],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:05Z","tags":{}},"n1820939443":{"id":"n1820939443","loc":[-85.3897328,42.0029078],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:05Z","tags":{}},"n1820939445":{"id":"n1820939445","loc":[-85.122349,42.0782814],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:05Z","tags":{}},"n1820939448":{"id":"n1820939448","loc":[-85.4872193,41.985036],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:05Z","tags":{}},"n1820939450":{"id":"n1820939450","loc":[-85.0120459,42.0904919],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:05Z","tags":{}},"n1820939452":{"id":"n1820939452","loc":[-85.6320543,41.921982],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:06Z","tags":{}},"n1820939456":{"id":"n1820939456","loc":[-85.0844749,42.1036843],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:06Z","tags":{}},"n1820939458":{"id":"n1820939458","loc":[-85.0968037,42.091296],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:06Z","tags":{}},"n1820939463":{"id":"n1820939463","loc":[-85.5339747,41.9681841],"version":"2","changeset":"12182668","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T07:35:33Z","tags":{}},"n1820939465":{"id":"n1820939465","loc":[-85.4125423,42.0072129],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:06Z","tags":{}},"n1820939467":{"id":"n1820939467","loc":[-85.6335563,41.9303626],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:06Z","tags":{}},"n1820939469":{"id":"n1820939469","loc":[-85.2821014,41.9932126],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:06Z","tags":{}},"n1820939471":{"id":"n1820939471","loc":[-85.374691,41.9969917],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:06Z","tags":{}},"n1820939485":{"id":"n1820939485","loc":[-85.4471321,42.0049806],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:06Z","tags":{}},"n1820939487":{"id":"n1820939487","loc":[-85.3752532,41.9972206],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:06Z","tags":{}},"n1820939489":{"id":"n1820939489","loc":[-85.4517283,42.005927],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:06Z","tags":{}},"n1820939492":{"id":"n1820939492","loc":[-85.4662552,42.0005693],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:06Z","tags":{}},"n1820939494":{"id":"n1820939494","loc":[-85.0120083,42.0902928],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:06Z","tags":{}},"n1820939496":{"id":"n1820939496","loc":[-85.044463,42.1004631],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:06Z","tags":{}},"n1820939498":{"id":"n1820939498","loc":[-85.418293,42.0089667],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:06Z","tags":{}},"n1820939500":{"id":"n1820939500","loc":[-85.0554762,42.1027358],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:06Z","tags":{}},"n1820939504":{"id":"n1820939504","loc":[-85.1246289,42.0746858],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:06Z","tags":{}},"n1820939507":{"id":"n1820939507","loc":[-85.0408139,42.1021838],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:07Z","tags":{}},"n1820939508":{"id":"n1820939508","loc":[-85.1236204,42.0775169],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:07Z","tags":{}},"n1820939509":{"id":"n1820939509","loc":[-85.0350109,42.1037428],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:07Z","tags":{}},"n1820939510":{"id":"n1820939510","loc":[-85.0551583,42.1029878],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:07Z","tags":{}},"n1820939511":{"id":"n1820939511","loc":[-85.0956771,42.0916662],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:07Z","tags":{}},"n1820939512":{"id":"n1820939512","loc":[-85.2323408,42.0273638],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:07Z","tags":{}},"n1820939513":{"id":"n1820939513","loc":[-85.1232771,42.0762388],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:07Z","tags":{}},"n1820939531":{"id":"n1820939531","loc":[-85.264608,41.9997828],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:07Z","tags":{}},"n1820939533":{"id":"n1820939533","loc":[-85.4198808,42.0087914],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:07Z","tags":{}},"n1820939535":{"id":"n1820939535","loc":[-85.3080864,41.9715677],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:07Z","tags":{}},"n1820939536":{"id":"n1820939536","loc":[-85.1189426,42.0812596],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:07Z","tags":{}},"n1820939537":{"id":"n1820939537","loc":[-85.2642741,41.9996764],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:07Z","tags":{}},"n1820939538":{"id":"n1820939538","loc":[-85.2572531,42.0079627],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:07Z","tags":{}},"n1820939539":{"id":"n1820939539","loc":[-85.2907807,41.9790174],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:07Z","tags":{}},"n1820939540":{"id":"n1820939540","loc":[-85.3171415,41.9707301],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:07Z","tags":{}},"n1820939541":{"id":"n1820939541","loc":[-85.08777,42.0953841],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:07Z","tags":{}},"n1820939542":{"id":"n1820939542","loc":[-85.1239262,42.0773218],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:07Z","tags":{}},"n1820939543":{"id":"n1820939543","loc":[-84.9973956,42.0877968],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:07Z","tags":{}},"n1820939544":{"id":"n1820939544","loc":[-85.011606,42.0896161],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:07Z","tags":{}},"n1820939545":{"id":"n1820939545","loc":[-85.4077358,42.0082971],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:07Z","tags":{}},"n1820939546":{"id":"n1820939546","loc":[-85.3614945,41.9933717],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:07Z","tags":{}},"n1820939547":{"id":"n1820939547","loc":[-85.3189118,41.9697649],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:08Z","tags":{}},"n1820939550":{"id":"n1820939550","loc":[-85.1262691,42.0740221],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:08Z","tags":{}},"n1820939551":{"id":"n1820939551","loc":[-85.3863639,41.9994635],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:08Z","tags":{}},"n1820939552":{"id":"n1820939552","loc":[-85.2836034,41.9923953],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:08Z","tags":{}},"n1820939554":{"id":"n1820939554","loc":[-85.3222377,41.9715916],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:08Z","tags":{}},"n1820939555":{"id":"n1820939555","loc":[-85.0122658,42.0906312],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:08Z","tags":{}},"n1820939556":{"id":"n1820939556","loc":[-85.0022652,42.0877581],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:08Z","tags":{}},"n1820939557":{"id":"n1820939557","loc":[-85.1011314,42.0899954],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:08Z","tags":{}},"n1820939559":{"id":"n1820939559","loc":[-85.0008181,42.0885293],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:08Z","tags":{}},"n1820939561":{"id":"n1820939561","loc":[-85.3637046,41.9942488],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:08Z","tags":{}},"n1820939562":{"id":"n1820939562","loc":[-85.4500117,42.0052892],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:08Z","tags":{}},"n1820939563":{"id":"n1820939563","loc":[-85.0537636,42.1036365],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:08Z","tags":{}},"n1820939565":{"id":"n1820939565","loc":[-85.2367503,42.0246939],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:08Z","tags":{}},"n1820939566":{"id":"n1820939566","loc":[-85.0448479,42.1002653],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:08Z","tags":{}},"n1820939567":{"id":"n1820939567","loc":[-85.6337065,41.9295006],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:08Z","tags":{}},"n1820939568":{"id":"n1820939568","loc":[-85.0879792,42.095623],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:08Z","tags":{}},"n1820939569":{"id":"n1820939569","loc":[-85.6347623,41.9352369],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:08Z","tags":{}},"n1820939570":{"id":"n1820939570","loc":[-85.1497931,42.0620378],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:08Z","tags":{}},"n1820939571":{"id":"n1820939571","loc":[-85.5676169,41.9656324],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:09Z","tags":{}},"n1820939572":{"id":"n1820939572","loc":[-85.638041,41.9166971],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:09Z","tags":{}},"n1820939573":{"id":"n1820939573","loc":[-85.4993429,41.9781293],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:09Z","tags":{}},"n1820939574":{"id":"n1820939574","loc":[-85.5352831,41.9692127],"version":"2","changeset":"12182668","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T07:35:33Z","tags":{}},"n1820939575":{"id":"n1820939575","loc":[-84.9924429,42.0857118],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:09Z","tags":{}},"n1820939577":{"id":"n1820939577","loc":[-85.0581101,42.1026721],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:09Z","tags":{}},"n1820939578":{"id":"n1820939578","loc":[-85.641088,41.9094477],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:09Z","tags":{}},"n1820939579":{"id":"n1820939579","loc":[-85.2548821,42.0052282],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:09Z","tags":{}},"n1820939580":{"id":"n1820939580","loc":[-85.1124463,42.0859734],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:09Z","tags":{}},"n1820939581":{"id":"n1820939581","loc":[-85.1083479,42.0857624],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:09Z","tags":{}},"n1820939583":{"id":"n1820939583","loc":[-85.1387424,42.0648893],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:09Z","tags":{}},"n1820939584":{"id":"n1820939584","loc":[-85.5152645,41.9700892],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:09Z","tags":{}},"n1820939585":{"id":"n1820939585","loc":[-85.5463738,41.9713439],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:09Z","tags":{}},"n1820939586":{"id":"n1820939586","loc":[-85.360207,41.9933717],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:09Z","tags":{}},"n1820939587":{"id":"n1820939587","loc":[-85.2402372,42.0120917],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:09Z","tags":{}},"n1820939588":{"id":"n1820939588","loc":[-85.3936381,42.0047255],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:09Z","tags":{}},"n1820939589":{"id":"n1820939589","loc":[-85.3310246,41.973784],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:09Z","tags":{}},"n1820939590":{"id":"n1820939590","loc":[-85.0329403,42.096642],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:09Z","tags":{}},"n1820939591":{"id":"n1820939591","loc":[-85.0097271,42.0910981],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:10Z","tags":{}},"n1820939593":{"id":"n1820939593","loc":[-85.0446562,42.1003437],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:10Z","tags":{}},"n1820939595":{"id":"n1820939595","loc":[-85.0856671,42.1008452],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:10Z","tags":{}},"n1820939596":{"id":"n1820939596","loc":[-85.4087228,42.0083449],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:10Z","tags":{}},"n1820939597":{"id":"n1820939597","loc":[-85.0609519,42.1052564],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:10Z","tags":{}},"n1820939598":{"id":"n1820939598","loc":[-85.3432126,41.9874548],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:10Z","tags":{}},"n1820939599":{"id":"n1820939599","loc":[-85.4041738,42.0067027],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:10Z","tags":{}},"n1820939600":{"id":"n1820939600","loc":[-85.0825437,42.1035768],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:10Z","tags":{}},"n1820939601":{"id":"n1820939601","loc":[-85.048422,42.101498],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:10Z","tags":{}},"n1820939602":{"id":"n1820939602","loc":[-85.0336256,42.0999031],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:10Z","tags":{}},"n1820939603":{"id":"n1820939603","loc":[-85.046818,42.1014104],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:10Z","tags":{}},"n1820939605":{"id":"n1820939605","loc":[-85.2856524,41.98078],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:10Z","tags":{}},"n1820939607":{"id":"n1820939607","loc":[-85.1118173,42.0864245],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:10Z","tags":{}},"n1820939609":{"id":"n1820939609","loc":[-85.0443397,42.1006263],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:10Z","tags":{}},"n1820939610":{"id":"n1820939610","loc":[-85.0336698,42.0978361],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:10Z","tags":{}},"n1820939611":{"id":"n1820939611","loc":[-85.4630322,42.0014248],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:11Z","tags":{}},"n1820939612":{"id":"n1820939612","loc":[-85.0613127,42.1052353],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:11Z","tags":{}},"n1820939613":{"id":"n1820939613","loc":[-85.0137571,42.0887801],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:11Z","tags":{}},"n1820939614":{"id":"n1820939614","loc":[-85.272487,41.9982013],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:11Z","tags":{}},"n1820939616":{"id":"n1820939616","loc":[-85.4665727,41.9983791],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:11Z","tags":{}},"n1820939617":{"id":"n1820939617","loc":[-85.1288078,42.0725476],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:11Z","tags":{}},"n1820939618":{"id":"n1820939618","loc":[-85.4653282,42.00109],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:11Z","tags":{}},"n1820939619":{"id":"n1820939619","loc":[-85.2314717,42.0276746],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:11Z","tags":{}},"n1820939620":{"id":"n1820939620","loc":[-85.255982,42.0003569],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:11Z","tags":{}},"n1820939621":{"id":"n1820939621","loc":[-85.2886779,41.9787223],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:11Z","tags":{}},"n1820939622":{"id":"n1820939622","loc":[-85.22438,42.0367509],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:11Z","tags":{}},"n1820939623":{"id":"n1820939623","loc":[-85.0334713,42.0998382],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:11Z","tags":{}},"n1820939624":{"id":"n1820939624","loc":[-85.2236504,42.037484],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:11Z","tags":{}},"n1820939625":{"id":"n1820939625","loc":[-85.636908,41.9175162],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:11Z","tags":{}},"n1820939627":{"id":"n1820939627","loc":[-85.2669187,41.9989707],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:11Z","tags":{}},"n1820939628":{"id":"n1820939628","loc":[-85.3247268,41.9720702],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:11Z","tags":{}},"n1820939629":{"id":"n1820939629","loc":[-85.3785104,41.9987299],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:11Z","tags":{}},"n1820939630":{"id":"n1820939630","loc":[-85.5267658,41.9720515],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:12Z","tags":{}},"n1820939631":{"id":"n1820939631","loc":[-85.2445116,42.0098811],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:12Z","tags":{}},"n1820939632":{"id":"n1820939632","loc":[-85.1271448,42.0725077],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:12Z","tags":{}},"n1820939633":{"id":"n1820939633","loc":[-85.0345751,42.099724],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:12Z","tags":{}},"n1820939634":{"id":"n1820939634","loc":[-85.4217476,42.0089986],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:12Z","tags":{}},"n1820939635":{"id":"n1820939635","loc":[-85.3121848,41.9689433],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:12Z","tags":{}},"n1820939636":{"id":"n1820939636","loc":[-85.2826419,41.9929985],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:12Z","tags":{}},"n1820939637":{"id":"n1820939637","loc":[-85.3160257,41.9706344],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:12Z","tags":{}},"n1820939638":{"id":"n1820939638","loc":[-85.5684967,41.9657919],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:12Z","tags":{}},"n1820939640":{"id":"n1820939640","loc":[-85.225131,42.0356194],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:12Z","tags":{}},"n1820939642":{"id":"n1820939642","loc":[-85.1324124,42.0693328],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:12Z","tags":{}},"n1820939644":{"id":"n1820939644","loc":[-84.9994073,42.0878843],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:12Z","tags":{}},"n1820939645":{"id":"n1820939645","loc":[-85.1087596,42.0863329],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:12Z","tags":{}},"n1820939646":{"id":"n1820939646","loc":[-85.2915532,41.9782996],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:12Z","tags":{}},"n1820939647":{"id":"n1820939647","loc":[-84.9988708,42.0877808],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:12Z","tags":{}},"n1820939648":{"id":"n1820939648","loc":[-85.2243628,42.0356728],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:12Z","tags":{}},"n1820939649":{"id":"n1820939649","loc":[-85.0427397,42.1020524],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:12Z","tags":{}},"n1820939650":{"id":"n1820939650","loc":[-85.6388392,41.9100752],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:13Z","tags":{}},"n1820939651":{"id":"n1820939651","loc":[-85.0133709,42.0888557],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:13Z","tags":{}},"n1820939652":{"id":"n1820939652","loc":[-85.318798,41.9701211],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:13Z","tags":{}},"n1820939653":{"id":"n1820939653","loc":[-85.6335778,41.9190602],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:13Z","tags":{}},"n1820939654":{"id":"n1820939654","loc":[-85.6338396,41.9370247],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:13Z","tags":{}},"n1820939655":{"id":"n1820939655","loc":[-85.0939069,42.0931988],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:13Z","tags":{}},"n1820939656":{"id":"n1820939656","loc":[-85.5702347,41.9651378],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:13Z","tags":{}},"n1820939657":{"id":"n1820939657","loc":[-85.4235286,42.0088392],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:13Z","tags":{}},"n1820939658":{"id":"n1820939658","loc":[-85.2740856,41.9972206],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:13Z","tags":{}},"n1820939659":{"id":"n1820939659","loc":[-85.4824299,41.9934195],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:13Z","tags":{}},"n1820939660":{"id":"n1820939660","loc":[-85.3857846,42.0014408],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:13Z","tags":{}},"n1820939661":{"id":"n1820939661","loc":[-85.0451658,42.10028],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:13Z","tags":{}},"n1820939662":{"id":"n1820939662","loc":[-85.3893036,42.001377],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:13Z","tags":{}},"n1820939664":{"id":"n1820939664","loc":[-85.2455845,42.0088607],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:13Z","tags":{}},"n1820939665":{"id":"n1820939665","loc":[-85.2741071,41.9951116],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:13Z","tags":{}},"n1820939666":{"id":"n1820939666","loc":[-85.1298375,42.0677718],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:13Z","tags":{}},"n1820939667":{"id":"n1820939667","loc":[-85.5491848,41.9707377],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:13Z","tags":{}},"n1820939669":{"id":"n1820939669","loc":[-85.2780298,41.995238],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:14Z","tags":{}},"n1820939670":{"id":"n1820939670","loc":[-85.1330068,42.0716926],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:14Z","tags":{}},"n1820939671":{"id":"n1820939671","loc":[-85.0811342,42.1025129],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:14Z","tags":{}},"n1820939672":{"id":"n1820939672","loc":[-85.2325124,42.0290135],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:14Z","tags":{}},"n1820939673":{"id":"n1820939673","loc":[-85.2975077,41.9716953],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:14Z","tags":{}},"n1820939674":{"id":"n1820939674","loc":[-85.0951729,42.0922394],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:14Z","tags":{}},"n1820939676":{"id":"n1820939676","loc":[-85.0363252,42.1043119],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:14Z","tags":{}},"n1820939677":{"id":"n1820939677","loc":[-85.2960057,41.97349],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:14Z","tags":{}},"n1820939678":{"id":"n1820939678","loc":[-85.3701849,41.9982515],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:14Z","tags":{}},"n1820939679":{"id":"n1820939679","loc":[-85.3381486,41.9848861],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:14Z","tags":{}},"n1820939680":{"id":"n1820939680","loc":[-85.2058448,42.0417286],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:14Z","tags":{}},"n1820939682":{"id":"n1820939682","loc":[-85.0819335,42.1034443],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:14Z","tags":{}},"n1820939683":{"id":"n1820939683","loc":[-85.3872223,41.9993359],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:14Z","tags":{}},"n1820939684":{"id":"n1820939684","loc":[-85.095366,42.091909],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:14Z","tags":{}},"n1820939685":{"id":"n1820939685","loc":[-85.2327914,42.0291888],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:14Z","tags":{}},"n1820939686":{"id":"n1820939686","loc":[-85.0433459,42.1018773],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:14Z","tags":{}},"n1820939687":{"id":"n1820939687","loc":[-85.0585339,42.1027318],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:14Z","tags":{}},"n1820939688":{"id":"n1820939688","loc":[-85.0062885,42.0876347],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:14Z","tags":{}},"n1820939689":{"id":"n1820939689","loc":[-85.246299,42.017377],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:14Z","tags":{}},"n1820939690":{"id":"n1820939690","loc":[-85.2932376,41.9742877],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:14Z","tags":{}},"n1820939691":{"id":"n1820939691","loc":[-85.2962846,41.9736815],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:14Z","tags":{}},"n1820939692":{"id":"n1820939692","loc":[-85.6052365,41.9409193],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:15Z","tags":{}},"n1820939693":{"id":"n1820939693","loc":[-85.2570536,42.0003341],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:15Z","tags":{}},"n1820939694":{"id":"n1820939694","loc":[-85.0488458,42.1014064],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:15Z","tags":{}},"n1820939695":{"id":"n1820939695","loc":[-85.4050321,42.0069578],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:15Z","tags":{}},"n1820939696":{"id":"n1820939696","loc":[-85.4847517,41.9845894],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:15Z","tags":{}},"n1820939697":{"id":"n1820939697","loc":[-85.0844655,42.1013826],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:15Z","tags":{}},"n1820939698":{"id":"n1820939698","loc":[-85.1437206,42.0650008],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:15Z","tags":{}},"n1820939699":{"id":"n1820939699","loc":[-85.1168183,42.0864034],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:15Z","tags":{}},"n1820939700":{"id":"n1820939700","loc":[-85.5479831,41.9711366],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:15Z","tags":{}},"n1820939701":{"id":"n1820939701","loc":[-85.0349948,42.1034124],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:15Z","tags":{}},"n1820939702":{"id":"n1820939702","loc":[-85.0835589,42.1038821],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:15Z","tags":{}},"n1820939703":{"id":"n1820939703","loc":[-85.0203875,42.0902649],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:15Z","tags":{}},"n1820939704":{"id":"n1820939704","loc":[-85.0371191,42.1038184],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:15Z","tags":{}},"n1820939705":{"id":"n1820939705","loc":[-85.1273312,42.0735681],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:15Z","tags":{}},"n1820939707":{"id":"n1820939707","loc":[-85.1272239,42.0730226],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:15Z","tags":{}},"n1820939710":{"id":"n1820939710","loc":[-85.0349881,42.1019012],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:15Z","tags":{}},"n1820939712":{"id":"n1820939712","loc":[-85.2440459,42.0178313],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:15Z","tags":{}},"n1820939713":{"id":"n1820939713","loc":[-85.2444751,42.0182618],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:15Z","tags":{}},"n1820939714":{"id":"n1820939714","loc":[-85.0539996,42.1032863],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:15Z","tags":{}},"n1820939715":{"id":"n1820939715","loc":[-85.2215905,42.0373246],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:16Z","tags":{}},"n1820939716":{"id":"n1820939716","loc":[-85.0649712,42.1051994],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:16Z","tags":{}},"n1820939717":{"id":"n1820939717","loc":[-85.0927146,42.0927581],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:16Z","tags":{}},"n1820939718":{"id":"n1820939718","loc":[-85.3884668,42.0042312],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:16Z","tags":{}},"n1820939719":{"id":"n1820939719","loc":[-85.0840672,42.1013241],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:16Z","tags":{}},"n1820939720":{"id":"n1820939720","loc":[-85.304739,41.9725408],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:16Z","tags":{}},"n1820939721":{"id":"n1820939721","loc":[-85.2243585,42.0371334],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:16Z","tags":{}},"n1820939722":{"id":"n1820939722","loc":[-85.0599823,42.1049686],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:16Z","tags":{}},"n1820939723":{"id":"n1820939723","loc":[-85.0298825,42.0944288],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:16Z","tags":{}},"n1820939724":{"id":"n1820939724","loc":[-85.0366095,42.1042443],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:16Z","tags":{}},"n1820939725":{"id":"n1820939725","loc":[-85.0698783,42.1058135],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:16Z","tags":{}},"n1820939726":{"id":"n1820939726","loc":[-85.1054551,42.0873361],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:16Z","tags":{}},"n1820939727":{"id":"n1820939727","loc":[-84.9952324,42.0864285],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:16Z","tags":{}},"n1820939728":{"id":"n1820939728","loc":[-85.3442211,41.9897993],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:16Z","tags":{}},"n1820939729":{"id":"n1820939729","loc":[-85.4386134,42.0056822],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:16Z","tags":{}},"n1820939730":{"id":"n1820939730","loc":[-85.2438528,42.0146589],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:16Z","tags":{}},"n1820939731":{"id":"n1820939731","loc":[-85.0355581,42.1041846],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:16Z","tags":{}},"n1820939732":{"id":"n1820939732","loc":[-85.557682,41.9724447],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:16Z","tags":{}},"n1820939734":{"id":"n1820939734","loc":[-85.2299418,42.033314],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:16Z","tags":{}},"n1820939735":{"id":"n1820939735","loc":[-85.6297412,41.9419088],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:16Z","tags":{}},"n1820939736":{"id":"n1820939736","loc":[-85.2645101,41.9980259],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:16Z","tags":{}},"n1820939738":{"id":"n1820939738","loc":[-85.082195,42.1035649],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:16Z","tags":{}},"n1820939739":{"id":"n1820939739","loc":[-85.234272,42.0267102],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:17Z","tags":{}},"n1820939740":{"id":"n1820939740","loc":[-85.0130758,42.0895006],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:17Z","tags":{}},"n1820939741":{"id":"n1820939741","loc":[-85.4594702,42.0000375],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:17Z","tags":{}},"n1820939742":{"id":"n1820939742","loc":[-84.9946745,42.0863687],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:17Z","tags":{}},"n1820939743":{"id":"n1820939743","loc":[-85.6438775,41.9120186],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:17Z","tags":{}},"n1820939744":{"id":"n1820939744","loc":[-85.6372685,41.9168089],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:17Z","tags":{}},"n1820939745":{"id":"n1820939745","loc":[-85.2789468,41.9893208],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:17Z","tags":{}},"n1820939747":{"id":"n1820939747","loc":[-85.3775019,41.998427],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:17Z","tags":{}},"n1820939749":{"id":"n1820939749","loc":[-85.0993571,42.0909178],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:17Z","tags":{}},"n1820939750":{"id":"n1820939750","loc":[-85.1308503,42.0669339],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:17Z","tags":{}},"n1820939751":{"id":"n1820939751","loc":[-85.4802566,41.9856659],"version":"2","changeset":"12182679","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T07:37:01Z","tags":{}},"n1820939752":{"id":"n1820939752","loc":[-85.2543563,42.0108804],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:17Z","tags":{}},"n1820939753":{"id":"n1820939753","loc":[-85.1041033,42.0878815],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:17Z","tags":{}},"n1820939755":{"id":"n1820939755","loc":[-85.4000969,42.0071651],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:17Z","tags":{}},"n1820939757":{"id":"n1820939757","loc":[-85.3858275,42.0022381],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:17Z","tags":{}},"n1820939758":{"id":"n1820939758","loc":[-85.3653998,41.996609],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:17Z","tags":{}},"n1820939759":{"id":"n1820939759","loc":[-85.2432949,42.0202305],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:17Z","tags":{}},"n1820939760":{"id":"n1820939760","loc":[-85.3878874,42.0042472],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:17Z","tags":{}},"n1820939761":{"id":"n1820939761","loc":[-85.2516741,42.0114145],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:17Z","tags":{}},"n1820939762":{"id":"n1820939762","loc":[-85.2788825,41.9865142],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:18Z","tags":{}},"n1820939763":{"id":"n1820939763","loc":[-85.0009147,42.0886686],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:18Z","tags":{}},"n1820939764":{"id":"n1820939764","loc":[-85.3918142,42.003434],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:18Z","tags":{}},"n1820939765":{"id":"n1820939765","loc":[-85.5532832,41.9696848],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:18Z","tags":{}},"n1820939766":{"id":"n1820939766","loc":[-85.5545063,41.969254],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:18Z","tags":{}},"n1820939768":{"id":"n1820939768","loc":[-85.1327989,42.0704769],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:18Z","tags":{}},"n1820939770":{"id":"n1820939770","loc":[-85.0588558,42.1047696],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:18Z","tags":{}},"n1820939772":{"id":"n1820939772","loc":[-85.555798,41.9713017],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:18Z","tags":{}},"n1820939773":{"id":"n1820939773","loc":[-85.0565853,42.1023589],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:18Z","tags":{}},"n1820939774":{"id":"n1820939774","loc":[-85.2582941,41.9992765],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:18Z","tags":{}},"n1820939775":{"id":"n1820939775","loc":[-85.3007264,41.9727642],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:18Z","tags":{}},"n1820939776":{"id":"n1820939776","loc":[-85.2477045,42.0082652],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:18Z","tags":{}},"n1820939777":{"id":"n1820939777","loc":[-85.2415247,42.0104973],"version":"1","changeset":"12180411","user":"Thad C","uid":"349027","visible":"true","timestamp":"2012-07-10T22:57:18Z","tags":{}},"n1821006698":{"id":"n1821006698","loc":[-85.6345227,41.9382009],"version":"1","changeset":"12181163","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T01:58:48Z","tags":{}},"n1821006700":{"id":"n1821006700","loc":[-85.6344894,41.938975],"version":"1","changeset":"12181163","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T01:58:48Z","tags":{}},"n1821006704":{"id":"n1821006704","loc":[-85.6351181,41.9370157],"version":"1","changeset":"12181163","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T01:58:48Z","tags":{}},"n1821006706":{"id":"n1821006706","loc":[-85.6357554,41.9361657],"version":"1","changeset":"12181163","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T01:58:48Z","tags":{}},"n1821006708":{"id":"n1821006708","loc":[-85.6351235,41.9368481],"version":"1","changeset":"12181163","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T01:58:48Z","tags":{}},"n1821006710":{"id":"n1821006710","loc":[-85.6352844,41.9364211],"version":"1","changeset":"12181163","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T01:58:48Z","tags":{}},"n1821006712":{"id":"n1821006712","loc":[-85.6351503,41.937307],"version":"1","changeset":"12181163","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T01:58:48Z","tags":{}},"n1821006716":{"id":"n1821006716","loc":[-85.6350366,41.9379774],"version":"1","changeset":"12181163","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T01:58:48Z","tags":{}},"n1821006725":{"id":"n1821006725","loc":[-85.6352147,41.9375903],"version":"1","changeset":"12181163","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T01:58:48Z","tags":{}},"n1821137607":{"id":"n1821137607","loc":[-85.5297057,41.9669915],"version":"1","changeset":"12182668","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T07:35:32Z","tags":{}},"n1821137608":{"id":"n1821137608","loc":[-85.5288598,41.9673094],"version":"1","changeset":"12182668","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T07:35:32Z","tags":{}},"n1821139530":{"id":"n1821139530","loc":[-85.4832228,41.9881686],"version":"1","changeset":"12182679","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T07:37:01Z","tags":{}},"n1821139531":{"id":"n1821139531","loc":[-85.4812101,41.9851258],"version":"1","changeset":"12182679","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T07:37:01Z","tags":{}},"n1821139532":{"id":"n1821139532","loc":[-85.4799127,41.9860244],"version":"1","changeset":"12182679","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T07:37:01Z","tags":{}},"n1821139533":{"id":"n1821139533","loc":[-85.4800313,41.9865555],"version":"1","changeset":"12182679","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T07:37:01Z","tags":{}},"n1841425201":{"id":"n1841425201","loc":[-85.4334577,42.0063713],"version":"1","changeset":"12524188","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-28T14:50:57Z","tags":{}},"n1841425222":{"id":"n1841425222","loc":[-85.4382449,42.0055785],"version":"1","changeset":"12524188","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-28T14:50:58Z","tags":{}},"n1914861007":{"id":"n1914861007","loc":[-85.394959,42.0057472],"version":"1","changeset":"13114234","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-09-15T03:33:21Z","tags":{}},"n1914861057":{"id":"n1914861057","loc":[-85.3967185,42.0049695],"version":"1","changeset":"13114234","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-09-15T03:33:22Z","tags":{}},"n1914861112":{"id":"n1914861112","loc":[-85.394179,42.0056906],"version":"1","changeset":"13114234","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-09-15T03:33:24Z","tags":{}},"n1914861306":{"id":"n1914861306","loc":[-85.3900226,42.0028488],"version":"1","changeset":"13114234","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-09-15T03:33:27Z","tags":{}},"n2114807565":{"id":"n2114807565","loc":[-85.6385979,41.9577824],"version":"1","changeset":"14676554","user":"bbmiller","uid":"451048","visible":"true","timestamp":"2013-01-16T20:05:15Z","tags":{}},"n2114807568":{"id":"n2114807568","loc":[-85.6325097,41.9775713],"version":"1","changeset":"14676554","user":"bbmiller","uid":"451048","visible":"true","timestamp":"2013-01-16T20:05:15Z","tags":{}},"n2114807572":{"id":"n2114807572","loc":[-85.6328996,41.9980965],"version":"1","changeset":"14676554","user":"bbmiller","uid":"451048","visible":"true","timestamp":"2013-01-16T20:05:15Z","tags":{}},"n2114807578":{"id":"n2114807578","loc":[-85.6344818,41.9696956],"version":"1","changeset":"14676554","user":"bbmiller","uid":"451048","visible":"true","timestamp":"2013-01-16T20:05:15Z","tags":{}},"n2114807583":{"id":"n2114807583","loc":[-85.6326289,41.9757853],"version":"1","changeset":"14676554","user":"bbmiller","uid":"451048","visible":"true","timestamp":"2013-01-16T20:05:15Z","tags":{}},"n2114807593":{"id":"n2114807593","loc":[-85.6360828,41.9650674],"version":"1","changeset":"14676554","user":"bbmiller","uid":"451048","visible":"true","timestamp":"2013-01-16T20:05:15Z","tags":{}},"n2130304159":{"id":"n2130304159","loc":[-85.6352537,41.9450015],"version":"1","changeset":"14802606","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-01-27T04:50:52Z","tags":{"railway":"level_crossing"}},"n2139795852":{"id":"n2139795852","loc":[-85.6374708,41.9311633],"version":"1","changeset":"14892219","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T07:47:57Z","tags":{}},"n2139858882":{"id":"n2139858882","loc":[-85.635178,41.9356158],"version":"1","changeset":"14893110","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:29:11Z","tags":{}},"n2139858883":{"id":"n2139858883","loc":[-85.63533,41.9355886],"version":"1","changeset":"14893110","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:29:11Z","tags":{}},"n2139858884":{"id":"n2139858884","loc":[-85.6353819,41.93556],"version":"1","changeset":"14893110","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:29:11Z","tags":{}},"n2139858885":{"id":"n2139858885","loc":[-85.6353665,41.9355157],"version":"1","changeset":"14893110","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:29:11Z","tags":{}},"n2139858886":{"id":"n2139858886","loc":[-85.6353165,41.9354971],"version":"1","changeset":"14893110","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:29:11Z","tags":{}},"n2139858887":{"id":"n2139858887","loc":[-85.6352454,41.9355328],"version":"1","changeset":"14893110","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:29:11Z","tags":{}},"n2139858888":{"id":"n2139858888","loc":[-85.6350184,41.9357846],"version":"1","changeset":"14893110","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:29:11Z","tags":{}},"n2139858889":{"id":"n2139858889","loc":[-85.634978,41.9359448],"version":"1","changeset":"14893110","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:29:11Z","tags":{}},"n2139858890":{"id":"n2139858890","loc":[-85.6347723,41.9361523],"version":"1","changeset":"14893110","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:29:11Z","tags":{}},"n2139858891":{"id":"n2139858891","loc":[-85.6347165,41.9362667],"version":"1","changeset":"14893110","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:29:11Z","tags":{}},"n2139858892":{"id":"n2139858892","loc":[-85.6346992,41.9364312],"version":"1","changeset":"14893110","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:29:11Z","tags":{}},"n2139858893":{"id":"n2139858893","loc":[-85.634603,41.9366329],"version":"1","changeset":"14893110","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:29:11Z","tags":{}},"n2139858894":{"id":"n2139858894","loc":[-85.6345973,41.9367488],"version":"1","changeset":"14893110","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:29:11Z","tags":{}},"n2139858895":{"id":"n2139858895","loc":[-85.6345127,41.9369734],"version":"1","changeset":"14893110","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:29:11Z","tags":{}},"n2139858896":{"id":"n2139858896","loc":[-85.634478,41.9371923],"version":"1","changeset":"14893110","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:29:11Z","tags":{}},"n2139858897":{"id":"n2139858897","loc":[-85.6344838,41.9373768],"version":"1","changeset":"14893110","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:29:11Z","tags":{}},"n2139858898":{"id":"n2139858898","loc":[-85.6346242,41.9375299],"version":"1","changeset":"14893110","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:29:11Z","tags":{}},"n2139858899":{"id":"n2139858899","loc":[-85.6347723,41.9376357],"version":"1","changeset":"14893110","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:29:11Z","tags":{}},"n2139858900":{"id":"n2139858900","loc":[-85.6347607,41.9377788],"version":"1","changeset":"14893110","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:29:11Z","tags":{}},"n2139858901":{"id":"n2139858901","loc":[-85.6346204,41.9379533],"version":"1","changeset":"14893110","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:29:11Z","tags":{}},"n2139858902":{"id":"n2139858902","loc":[-85.6344184,41.9380105],"version":"1","changeset":"14893110","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:29:11Z","tags":{}},"n2139858903":{"id":"n2139858903","loc":[-85.6341627,41.9380406],"version":"1","changeset":"14893110","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:29:11Z","tags":{}},"n2139858904":{"id":"n2139858904","loc":[-85.634005,41.9381679],"version":"1","changeset":"14893110","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:29:11Z","tags":{}},"n2139858905":{"id":"n2139858905","loc":[-85.63393,41.9383353],"version":"1","changeset":"14893110","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:29:11Z","tags":{}},"n2139858906":{"id":"n2139858906","loc":[-85.6338588,41.9384597],"version":"1","changeset":"14893110","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:29:12Z","tags":{}},"n2139858907":{"id":"n2139858907","loc":[-85.6336627,41.9387759],"version":"1","changeset":"14893110","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:29:12Z","tags":{}},"n2139858908":{"id":"n2139858908","loc":[-85.6335127,41.9389361],"version":"1","changeset":"14893110","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:29:12Z","tags":{}},"n2139858933":{"id":"n2139858933","loc":[-85.6353118,41.9432646],"version":"1","changeset":"14893110","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:29:12Z","tags":{}},"n2139858934":{"id":"n2139858934","loc":[-85.6353952,41.9433002],"version":"1","changeset":"14893110","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:29:12Z","tags":{}},"n2139858935":{"id":"n2139858935","loc":[-85.6356496,41.9433255],"version":"1","changeset":"14893110","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:29:12Z","tags":{}},"n2139858936":{"id":"n2139858936","loc":[-85.6363128,41.9433373],"version":"1","changeset":"14893110","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:29:12Z","tags":{}},"n2139858937":{"id":"n2139858937","loc":[-85.6365467,41.9433779],"version":"1","changeset":"14893110","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:29:12Z","tags":{}},"n2139858938":{"id":"n2139858938","loc":[-85.6368692,41.9435265],"version":"1","changeset":"14893110","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:29:12Z","tags":{}},"n2139858939":{"id":"n2139858939","loc":[-85.6370986,41.9437039],"version":"1","changeset":"14893110","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:29:12Z","tags":{}},"n2139858940":{"id":"n2139858940","loc":[-85.6372371,41.9437732],"version":"1","changeset":"14893110","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:29:12Z","tags":{}},"n2139858941":{"id":"n2139858941","loc":[-85.6374756,41.9438171],"version":"1","changeset":"14893110","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:29:12Z","tags":{}},"n2139858942":{"id":"n2139858942","loc":[-85.6376164,41.9439286],"version":"1","changeset":"14893110","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:29:12Z","tags":{}},"n2139858943":{"id":"n2139858943","loc":[-85.6377504,41.944138],"version":"1","changeset":"14893110","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:29:12Z","tags":{}},"n2139858944":{"id":"n2139858944","loc":[-85.6384204,41.9443137],"version":"1","changeset":"14893110","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:29:12Z","tags":{}},"n2139858945":{"id":"n2139858945","loc":[-85.6385726,41.9444506],"version":"1","changeset":"14893110","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:29:12Z","tags":{}},"n2139858946":{"id":"n2139858946","loc":[-85.638702,41.9445739],"version":"1","changeset":"14893110","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:29:12Z","tags":{}},"n2139858947":{"id":"n2139858947","loc":[-85.6387179,41.9446516],"version":"1","changeset":"14893110","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:29:12Z","tags":{}},"n2139858948":{"id":"n2139858948","loc":[-85.6387088,41.9447985],"version":"1","changeset":"14893110","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:29:12Z","tags":{}},"n2139858949":{"id":"n2139858949","loc":[-85.6387656,41.9449877],"version":"1","changeset":"14893110","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:29:12Z","tags":{}},"n2139858950":{"id":"n2139858950","loc":[-85.638777,41.9451448],"version":"1","changeset":"14893110","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:29:12Z","tags":{}},"n2139858951":{"id":"n2139858951","loc":[-85.6387088,41.9452631],"version":"1","changeset":"14893110","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:29:12Z","tags":{}},"n2139858964":{"id":"n2139858964","loc":[-85.6383346,41.9442912],"version":"1","changeset":"14893110","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:29:13Z","tags":{}},"n2139858966":{"id":"n2139858966","loc":[-85.6384724,41.9443605],"version":"1","changeset":"14893110","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:29:13Z","tags":{}},"n2139858967":{"id":"n2139858967","loc":[-85.6354078,41.9434285],"version":"1","changeset":"14893110","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:29:13Z","tags":{}},"n2139858968":{"id":"n2139858968","loc":[-85.635271,41.943654],"version":"1","changeset":"14893110","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:29:13Z","tags":{}},"n2139858969":{"id":"n2139858969","loc":[-85.6352657,41.9437437],"version":"1","changeset":"14893110","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:29:13Z","tags":{}},"n2139858970":{"id":"n2139858970","loc":[-85.635271,41.9438195],"version":"1","changeset":"14893110","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:29:13Z","tags":{}},"n2139858971":{"id":"n2139858971","loc":[-85.6351563,41.9438906],"version":"1","changeset":"14893110","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:29:13Z","tags":{}},"n2139858972":{"id":"n2139858972","loc":[-85.6351384,41.9438882],"version":"1","changeset":"14893110","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:29:13Z","tags":{}},"n2139858973":{"id":"n2139858973","loc":[-85.6351514,41.9438034],"version":"1","changeset":"14893110","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:29:13Z","tags":{}},"n2139858974":{"id":"n2139858974","loc":[-85.6351237,41.9436641],"version":"1","changeset":"14893110","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:29:13Z","tags":{}},"n2139858975":{"id":"n2139858975","loc":[-85.6351498,41.9436108],"version":"1","changeset":"14893110","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:29:13Z","tags":{}},"n2139858976":{"id":"n2139858976","loc":[-85.6351058,41.9435345],"version":"1","changeset":"14893110","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:29:13Z","tags":{}},"n2139858977":{"id":"n2139858977","loc":[-85.6349641,41.9432051],"version":"1","changeset":"14893110","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:29:13Z","tags":{}},"n2139858986":{"id":"n2139858986","loc":[-85.6341205,41.9380746],"version":"1","changeset":"14893110","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:29:13Z","tags":{}},"n2139858990":{"id":"n2139858990","loc":[-85.6345671,41.9381816],"version":"1","changeset":"14893110","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:29:13Z","tags":{}},"n2139858995":{"id":"n2139858995","loc":[-85.6339783,41.9382273],"version":"1","changeset":"14893110","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:29:13Z","tags":{}},"n2139859003":{"id":"n2139859003","loc":[-85.6340477,41.9373489],"version":"1","changeset":"14893110","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:29:14Z","tags":{}},"n2139859004":{"id":"n2139859004","loc":[-85.6339784,41.9374752],"version":"1","changeset":"14893110","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:29:14Z","tags":{}},"n2139870406":{"id":"n2139870406","loc":[-85.6342265,41.9432605],"version":"1","changeset":"14893310","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:47:01Z","tags":{}},"n2139877106":{"id":"n2139877106","loc":[-85.6346323,41.9438746],"version":"1","changeset":"14893390","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:53:38Z","tags":{}},"n2139982399":{"id":"n2139982399","loc":[-85.6324055,41.9408537],"version":"1","changeset":"14894784","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T11:53:27Z","tags":{}},"n2139982400":{"id":"n2139982400","loc":[-85.632488,41.941063],"version":"1","changeset":"14894784","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T11:53:27Z","tags":{"leisure":"slipway"}},"n2139982401":{"id":"n2139982401","loc":[-85.6327261,41.9415366],"version":"1","changeset":"14894784","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T11:53:27Z","tags":{}},"n2139982402":{"id":"n2139982402","loc":[-85.6326391,41.9413598],"version":"1","changeset":"14894784","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T11:53:27Z","tags":{}},"n2139982403":{"id":"n2139982403","loc":[-85.6327041,41.9414391],"version":"1","changeset":"14894784","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T11:53:27Z","tags":{}},"n2139982405":{"id":"n2139982405","loc":[-85.6322891,41.9406009],"version":"1","changeset":"14894784","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T11:53:27Z","tags":{}},"n2139982406":{"id":"n2139982406","loc":[-85.6325412,41.9425257],"version":"1","changeset":"14894784","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T11:53:27Z","tags":{}},"n2139989333":{"id":"n2139989333","loc":[-85.6340584,41.9431731],"version":"1","changeset":"14894902","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T12:02:33Z","tags":{}},"n2140006331":{"id":"n2140006331","loc":[-85.6361751,41.9459744],"version":"1","changeset":"14895132","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T12:19:24Z","tags":{}},"n2140006334":{"id":"n2140006334","loc":[-85.636528,41.9459751],"version":"1","changeset":"14895132","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T12:19:24Z","tags":{}},"n2140006336":{"id":"n2140006336","loc":[-85.6370918,41.9458926],"version":"1","changeset":"14895132","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T12:19:24Z","tags":{}},"n2140006338":{"id":"n2140006338","loc":[-85.6378806,41.9456474],"version":"1","changeset":"14895132","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T12:19:24Z","tags":{}},"n2140006340":{"id":"n2140006340","loc":[-85.6385831,41.9454343],"version":"1","changeset":"14895132","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T12:19:24Z","tags":{}},"n2140006342":{"id":"n2140006342","loc":[-85.639341,41.945157],"version":"1","changeset":"14895132","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T12:19:24Z","tags":{}},"n2140006344":{"id":"n2140006344","loc":[-85.6393497,41.9450232],"version":"1","changeset":"14895132","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T12:19:24Z","tags":{}},"n2140006346":{"id":"n2140006346","loc":[-85.6388245,41.9450145],"version":"1","changeset":"14895132","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T12:19:24Z","tags":{}},"n2140006348":{"id":"n2140006348","loc":[-85.6388167,41.9441739],"version":"1","changeset":"14895132","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T12:19:24Z","tags":{}},"n2140006351":{"id":"n2140006351","loc":[-85.6382915,41.9441797],"version":"1","changeset":"14895132","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T12:19:24Z","tags":{}},"n2140006353":{"id":"n2140006353","loc":[-85.63828,41.9438109],"version":"1","changeset":"14895132","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T12:19:24Z","tags":{}},"n2140006355":{"id":"n2140006355","loc":[-85.6381949,41.9436009],"version":"1","changeset":"14895132","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T12:19:24Z","tags":{}},"n2140006357":{"id":"n2140006357","loc":[-85.6371904,41.9435918],"version":"1","changeset":"14895132","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T12:19:24Z","tags":{}},"n2140006359":{"id":"n2140006359","loc":[-85.6366966,41.9432727],"version":"1","changeset":"14895132","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T12:19:24Z","tags":{}},"n2140006361":{"id":"n2140006361","loc":[-85.6353755,41.9432744],"version":"1","changeset":"14895132","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T12:19:24Z","tags":{}},"n2140006365":{"id":"n2140006365","loc":[-85.6350906,41.9435472],"version":"1","changeset":"14895132","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T12:19:24Z","tags":{}},"n2140006366":{"id":"n2140006366","loc":[-85.6343461,41.9441573],"version":"1","changeset":"14895132","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T12:19:24Z","tags":{}},"n2140006395":{"id":"n2140006395","loc":[-85.6351171,41.9437175],"version":"1","changeset":"14895132","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T12:19:24Z","tags":{}},"n2140006397":{"id":"n2140006397","loc":[-85.635352,41.9450206],"version":"1","changeset":"14895132","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T12:19:24Z","tags":{}},"n2140006399":{"id":"n2140006399","loc":[-85.6358194,41.9454937],"version":"1","changeset":"14895132","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T12:19:24Z","tags":{}},"n2140006401":{"id":"n2140006401","loc":[-85.6348693,41.9445739],"version":"1","changeset":"14895132","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T12:19:24Z","tags":{}},"n2140006431":{"id":"n2140006431","loc":[-85.6376737,41.9438023],"version":"1","changeset":"14895132","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T12:19:25Z","tags":{}},"n2140006437":{"id":"n2140006437","loc":[-85.6382631,41.9442724],"version":"1","changeset":"14895132","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T12:19:25Z","tags":{}},"n2189123379":{"id":"n2189123379","loc":[-85.6342671,41.9352665],"version":"1","changeset":"15277145","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T23:41:21Z","tags":{}},"w203974076":{"id":"w203974076","version":"1","changeset":"14893310","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:47:03Z","tags":{"highway":"footway"},"nodes":["n2139870442","n2139870457","n2139870458","n2139870459","n2139870460","n2139870452"]},"w170989131":{"id":"w170989131","version":"5","changeset":"13114234","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-09-15T03:33:30Z","tags":{"name":"St Joseph River","source":"Bing Imagery","waterway":"river"},"nodes":["n1820938225","n1820938712","n1820937596","n1820937574","n1820938515","n1820938330","n1820938678","n1820938240","n1820938950","n1820939226","n1820939575","n1820937913","n1820938223","n1820937668","n1820938545","n1820937584","n1820939742","n1820939727","n1820937578","n1820938149","n1820938124","n1820938888","n1820938898","n1820937922","n1820939543","n1820939370","n1820939401","n1820939647","n1820938345","n1820939644","n1820938333","n1820938370","n1820938624","n1820938493","n1820939559","n1820939763","n1820939237","n1820939416","n1820937810","n1820938317","n1820938324","n1820937558","n1820939556","n1820938298","n1820939348","n1820939125","n1820939081","n1820938859","n1820939126","n1820938881","n1820939439","n1820939324","n1820939128","n1820938101","n1820937706","n1820938382","n1820938776","n1820937815","n1820939177","n1820939688","n1820938952","n1820938216","n1820938387","n1820939333","n1820938243","n1820938248","n1820937666","n1820939051","n1820938332","n1820939438","n1820939407","n1820939361","n1820937517","n1820938770","n1820939591","n1820937857","n1820938491","n1820937993","n1820938125","n1820938166","n1820937746","n1820939028","n1820937638","n1820938676","n1820938843","n1820938844","n1820937978","n1820938730","n1820939544","n1820938304","n1820939123","n1820939494","n1820939450","n1820939555","n1820938133","n1820938129","n1820938871","n1820939408","n1820938669","n1820938260","n1820939740","n1820937625","n1820938631","n1820939651","n1820939613","n1820937850","n1820938325","n1820937736","n1820938804","n1820938837","n1820938014","n1820938991","n1820938722","n1820938935","n1820937870","n1820938432","n1820937986","n1820938756","n1820938966","n1820939159","n1820937744","n1820938334","n1820937645","n1820939394","n1820937656","n1820938392","n1820939703","n1820938385","n1820938947","n1820938854","n1820938428","n1820938488","n1820938269","n1820938668","n1820938268","n1820938707","n1820937732","n1820939144","n1820938481","n1820938771","n1820938686","n1820938948","n1820937997","n1820937769","n1820939003","n1820938083","n1820939011","n1820938803","n1820938700","n1820939723","n1820938808","n1820938262","n1820938081","n1820938926","n1820938326","n1820938102","n1820938508","n1820939590","n1820939199","n1820938084","n1820938870","n1820938895","n1820937611","n1820938918","n1820938514","n1820939610","n1820938910","n1820937523","n1820938127","n1820939108","n1820937981","n1820938938","n1820938715","n1820939016","n1820938237","n1820939623","n1820939602","n1820937734","n1820938977","n1820939633","n1820939156","n1820939406","n1820938279","n1820938301","n1820937678","n1820937671","n1820939163","n1820938356","n1820939372","n1820937568","n1820937626","n1820939710","n1820939004","n1820938253","n1820938571","n1820937513","n1820939412","n1820939701","n1820939509","n1820938839","n1820939731","n1820937798","n1820939676","n1820939724","n1820939243","n1820939704","n1820937814","n1820937599","n1820938199","n1820938995","n1820938445","n1820938069","n1820938470","n1820939074","n1820938193","n1820938740","n1820938047","n1820939507","n1820939441","n1820939160","n1820937849","n1820937840","n1820938052","n1820938988","n1820938796","n1820937724","n1820937620","n1820939304","n1820938343","n1820939649","n1820938875","n1820939686","n1820938476","n1820937801","n1820937737","n1820938264","n1820939609","n1820939496","n1820939593","n1820939566","n1820939661","n1820937782","n1820938912","n1820939173","n1820937733","n1820938953","n1820939603","n1820937607","n1820938468","n1820939601","n1820939694","n1820939133","n1820938897","n1820938893","n1820937831","n1820937730","n1820938820","n1820938046","n1820938426","n1820938347","n1820937582","n1820938954","n1820938033","n1820938104","n1820938680","n1820939563","n1820939404","n1820939714","n1820939000","n1820937992","n1820938168","n1820939510","n1820939500","n1820937509","n1820938865","n1820939773","n1820938138","n1820938905","n1820937623","n1820939418","n1820937946","n1820939577","n1820937615","n1820939687","n1820939119","n1820937988","n1820938337","n1820937750","n1820938703","n1820938339","n1820939044","n1820939770","n1820938913","n1820937672","n1820939722","n1820937768","n1820939597","n1820939612","n1820937699","n1820937682","n1820937669","n1820937657","n1820939363","n1820937800","n1820938265","n1820937760","n1820938207","n1820938115","n1820939130","n1820939716","n1820938338","n1820938239","n1820939040","n1820938064","n1820938855","n1820939015","n1820938258","n1820939042","n1820939043","n1820938443","n1820939725","n1820937675","n1820938568","n1820938280","n1820937705","n1820938775","n1820938636","n1820938626","n1820937859","n1820938096","n1820937852","n1820939039","n1820938247","n1820938585","n1820937707","n1820938117","n1820938909","n1820939115","n1820939335","n1820938805","n1820937935","n1820937876","n1820938699","n1820937869","n1820938603","n1820938100","n1820938500","n1820938283","n1820938275","n1820938923","n1820938365","n1820938349","n1820937804","n1820937903","n1820937608","n1820938688","n1820939671","n1820938092","n1820937820","n1820938753","n1820938922","n1820937990","n1820939682","n1820939738","n1820939600","n1820938167","n1820937726","n1820939702","n1820938209","n1820939456","n1820937837","n1820938222","n1820938902","n1820939162","n1820938965","n1820938461","n1820937681","n1820937514","n1820937764","n1820939719","n1820939697","n1820938899","n1820939093","n1820938702","n1820939595","n1820938749","n1820938348","n1820937606","n1820938675","n1820938830","n1820938737","n1820938758","n1820938716","n1820939107","n1820937863","n1820939033","n1820938163","n1820937867","n1820938819","n1820938034","n1820938252","n1820937563","n1820937868","n1820939032","n1820938632","n1820937982","n1820937943","n1820939568","n1820939541","n1820938215","n1820939097","n1820938812","n1820937518","n1820937952","n1820938711","n1820938736","n1820939066","n1820937591","n1820938082","n1820938108","n1820938496","n1820939410","n1820938949","n1820938327","n1820937708","n1820939023","n1820937772","n1820938256","n1820939083","n1820938378","n1820938961","n1820937610","n1820939717","n1820938695","n1820938590","n1820939655","n1820938341","n1820939054","n1820939157","n1820939674","n1820939684","n1820939511","n1820937631","n1820939458","n1820937830","n1820937709","n1820937779","n1820939749","n1820938880","n1820938856","n1820938557","n1820939557","n1820938249","n1820938818","n1820937594","n1820939114","n1820938416","n1820937508","n1820938990","n1820938201","n1820937759","n1820937987","n1820939164","n1820939753","n1820938187","n1820939067","n1820937586","n1820937941","n1820938121","n1820937807","n1820938521","n1820939726","n1820938244","n1820939014","n1820938741","n1820937629","n1820938664","n1820938747","n1820939082","n1820938709","n1820938320","n1820938270","n1820937619","n1820937777","n1820937718","n1820939138","n1820938056","n1820938155","n1820938596","n1820937775","n1820938437","n1820938128","n1820939581","n1820939145","n1820938546","n1820938184","n1820937601","n1820937794","n1820938539","n1820939645","n1820938438","n1820938436","n1820939025","n1820938915","n1820938534","n1820937605","n1820939607","n1820939101","n1820939580","n1820939268","n1820939134","n1820938849","n1820938754","n1820938079","n1820937842","n1820938781","n1820938873","n1820938495","n1820938381","n1820938503","n1820939436","n1820938502","n1820939087","n1820938996","n1820938449","n1820938907","n1820937979","n1820937780","n1820937546","n1820939699","n1820937677","n1820938957","n1820938946","n1820937776","n1820937717","n1820938718","n1820937637","n1820938510","n1820937663","n1820938941","n1820939151","n1820937603","n1820938250","n1820937951","n1820938630","n1820938821","n1820938779","n1820938497","n1820938159","n1820939536","n1820938409","n1820938386","n1820939116","n1820938340","n1820939117","n1820938291","n1820938435","n1820937819","n1820938242","n1820939078","n1820938877","n1820939104","n1820939445","n1820938367","n1820938903","n1820939420","n1820938517","n1820939508","n1820939542","n1820939326","n1820938210","n1820939020","n1820938815","n1820937832","n1820939513","n1820937818","n1820939005","n1820938717","n1820939135","n1820938384","n1820937587","n1820939024","n1820939504","n1820939120","n1820939026","n1820938015","n1820938998","n1820937648","n1820939137","n1820937761","n1820938195","n1820938535","n1820939550","n1820938725","n1820938282","n1820937781","n1820937792","n1820939705","n1820937788","n1820939707","n1820937882","n1820939632","n1820938427","n1820938276","n1820939617","n1820939013","n1820939035","n1820937543","n1820939365","n1820937752","n1820937802","n1820939183","n1820939670","n1820938450","n1820939375","n1820937813","n1820937673","n1820937783","n1820939029","n1820939768","n1820939377","n1820937974","n1820939244","n1820939642","n1820937864","n1820938255","n1820938528","n1820939666","n1820938120","n1820937812","n1820938928","n1820939750","n1820939099","n1820938073","n1820938714","n1820939140","n1820938192","n1820937844","n1820938635","n1820938742","n1820939583","n1820937887","n1820938318","n1820938816","n1820939698","n1820938273","n1820939181","n1820937652","n1820938748","n1820937651","n1820938519","n1820938019","n1820938752","n1820938235","n1820939118","n1820938562","n1820939314","n1820939570","n1820938190","n1820938342","n1820938533","n1820937977","n1820939089","n1820939146","n1820938622","n1820938297","n1820938524","n1820939283","n1820938874","n1820938832","n1820937550","n1820937843","n1820938638","n1820938116","n1820938206","n1820938319","n1820939053","n1820937845","n1820938093","n1820939217","n1820938997","n1820939355","n1820938861","n1820938726","n1820938057","n1820939373","n1820937862","n1820938518","n1820939072","n1820939680","n1820938444","n1820938217","n1820938506","n1820938393","n1820938492","n1820938852","n1820938221","n1820938773","n1820937684","n1820939060","n1820938224","n1820938203","n1820938840","n1820937525","n1820938147","n1820938433","n1820938188","n1820939359","n1820938750","n1820938016","n1820938768","n1820937621","n1820937799","n1820938951","n1820938721","n1820939037","n1820937866","n1820939715","n1820938063","n1820938446","n1820937627","n1820939624","n1820938431","n1820939721","n1820939622","n1820939239","n1820939263","n1820939648","n1820939640","n1820938867","n1820938757","n1820938439","n1820939352","n1820937740","n1820939329","n1820938229","n1820937583","n1820938180","n1820938366","n1820937767","n1820937758","n1820939374","n1820938869","n1820938292","n1820938400","n1820938399","n1820939734","n1820939289","n1820938944","n1820937755","n1820938759","n1820938434","n1820937600","n1820937825","n1820937670","n1820937793","n1820938011","n1820938246","n1820938956","n1820937770","n1820937757","n1820938059","n1820937860","n1820937569","n1820939266","n1820939685","n1820939672","n1820938606","n1820938772","n1820939038","n1820938211","n1820938359","n1820939619","n1820938708","n1820939512","n1820938065","n1820939233","n1820939739","n1820938786","n1820938879","n1820939147","n1820938563","n1820939148","n1820937839","n1820937659","n1820937786","n1820938419","n1820939565","n1820939402","n1820937710","n1820938254","n1820938271","n1820938390","n1820937680","n1820938140","n1820937817","n1820938218","n1820937985","n1820939235","n1820938441","n1820938401","n1820938719","n1820937795","n1820938971","n1820938460","n1820939759","n1820937972","n1820937841","n1820938462","n1820939320","n1820938978","n1820938360","n1820939713","n1820937676","n1820939712","n1820937939","n1820938080","n1820937754","n1820937753","n1820938530","n1820937886","n1820939689","n1820939124","n1820938697","n1820938789","n1820939105","n1820938860","n1820938853","n1820939400","n1820937561","n1820938404","n1820938774","n1820939316","n1820937696","n1820938782","n1820938975","n1820937564","n1820939730","n1820938257","n1820937853","n1820938487","n1820938848","n1820938906","n1820939230","n1820938424","n1820938051","n1820937771","n1820939587","n1820939149","n1820938792","n1820939041","n1820938934","n1820939777","n1820937515","n1820939058","n1820938312","n1820939264","n1820939631","n1820939109","n1820939403","n1820939664","n1820938724","n1820938929","n1820939399","n1820939776","n1820939369","n1820939185","n1820937701","n1820938126","n1820938336","n1820938219","n1820939080","n1820938642","n1820938043","n1820937725","n1820938548","n1820938552","n1820938035","n1820938684","n1820937778","n1820938764","n1820939021","n1820939346","n1820937712","n1820939761","n1820938397","n1820937747","n1820938566","n1820939161","n1820939090","n1820939752","n1820939271","n1820938878","n1820938110","n1820938346","n1820938499","n1820938151","n1820939538","n1820938281","n1820939153","n1820938551","n1820939285","n1820938197","n1820938408","n1820938482","n1820939036","n1820939579","n1820938489","n1820938483","n1820938189","n1820938123","n1820938087","n1820937741","n1820938485","n1820937590","n1820938972","n1820937773","n1820937520","n1820938872","n1820938131","n1820938452","n1820938328","n1820939620","n1820937641","n1820938353","n1820939693","n1820938705","n1820937640","n1820939189","n1820938144","n1820939774","n1820938694","n1820938238","n1820939397","n1820937917","n1820938454","n1820938567","n1820938979","n1820938060","n1820938204","n1820937828","n1820939232","n1820938806","n1820938857","n1820938078","n1820938105","n1820939228","n1820938604","n1820937763","n1820937854","n1820938289","n1820939736","n1820937937","n1820937714","n1820938278","n1820938058","n1820938706","n1820938989","n1820938313","n1820938520","n1820938288","n1820937689","n1820939537","n1820939531","n1820939019","n1820937527","n1820938455","n1820938814","n1820938045","n1820939627","n1820938213","n1820938161","n1820938331","n1820938024","n1820938220","n1820938062","n1820938178","n1820937796","n1820937644","n1820938490","n1820937589","n1820937879","n1820939614","n1820938882","n1820938039","n1820938538","n1820937667","n1820937719","n1820938561","n1820939658","n1820938783","n1820938601","n1820938198","n1820938388","n1820938969","n1820937687","n1820939086","n1820939665","n1820939187","n1820938498","n1820938261","n1820937983","n1820938068","n1820938136","n1820939061","n1820938137","n1820938186","n1820939071","n1820937592","n1820939669","n1820937553","n1820939357","n1820938727","n1820939371","n1820939112","n1820939079","n1820938743","n1820938467","n1820938834","n1820938022","n1820938537","n1820938122","n1820938516","n1820937614","n1820937612","n1820939469","n1820939636","n1820939050","n1820939552","n1820938157","n1820938663","n1820938955","n1820939091","n1820938430","n1820938471","n1820937809","n1820938074","n1820938208","n1820938914","n1820938858","n1820938417","n1820937531","n1820938107","n1820939100","n1820938751","n1820937711","n1820938824","n1820939745","n1820937572","n1820938602","n1820938212","n1820938097","n1820937921","n1820938090","n1820938511","n1820938876","n1820939762","n1820938234","n1820938048","n1820937774","n1820937856","n1820937749","n1820937765","n1820938286","n1820939095","n1820938480","n1820939229","n1820938277","n1820937617","n1820938311","n1820937622","n1820939196","n1820937690","n1820939006","n1820939287","n1820939131","n1820938106","n1820938784","n1820938335","n1820938095","n1820938182","n1820937715","n1820937683","n1820938070","n1820939605","n1820938527","n1820938763","n1820938398","n1820937686","n1820939621","n1820937664","n1820939277","n1820938565","n1820939539","n1820938099","n1820939646","n1820938556","n1820937548","n1820938729","n1820939336","n1820938259","n1820938728","n1820938361","n1820937643","n1820938644","n1820939007","n1820939690","n1820939227","n1820937635","n1820937950","n1820938682","n1820939150","n1820939012","n1820939261","n1820939111","n1820937805","n1820939691","n1820939677","n1820937628","n1820937811","n1820938790","n1820938251","n1820938226","n1820938942","n1820937633","n1820937984","n1820937751","n1820939673","n1820938970","n1820938415","n1820938597","n1820938309","n1820938111","n1820938472","n1820938894","n1820938402","n1820937593","n1820938570","n1820939102","n1820939775","n1820937948","n1820939121","n1820937511","n1820938787","n1820939720","n1820939075","n1820937880","n1820937742","n1820937721","n1820939535","n1820938486","n1820938354","n1820937632","n1820939010","n1820938885","n1820938089","n1820937613","n1820938442","n1820938245","n1820938272","n1820937566","n1820938295","n1820938532","n1820938883","n1820937713","n1820937674","n1820939635","n1820938448","n1820938355","n1820938587","n1820938559","n1820937787","n1820939301","n1820937723","n1820939056","n1820937560","n1820938323","n1820938230","n1820938453","n1820938377","n1820938357","n1820939637","n1820938017","n1820939540","n1820939376","n1820937639","n1820937642","n1820938075","n1820938351","n1820938766","n1820937897","n1820938973","n1820938066","n1820939547","n1820939652","n1820937944","n1820937748","n1820939234","n1820939193","n1820937891","n1820938785","n1820939132","n1820938523","n1820938884","n1820938411","n1820939554","n1820938791","n1820937655","n1820938368","n1820939152","n1820938030","n1820938447","n1820937580","n1820939628","n1820937588","n1820937894","n1820939201","n1820938086","n1820937650","n1820938379","n1820939008","n1820938999","n1820937524","n1820937872","n1820938389","n1820939197","n1820938422","n1820938936","n1820939262","n1820937634","n1820938583","n1820939589","n1820937901","n1820939034","n1820939065","n1820938290","n1820939195","n1820938228","n1820937884","n1820938797","n1820938191","n1820939191","n1820939198","n1820937892","n1820939679","n1820938507","n1820937647","n1820937909","n1820938542","n1820939598","n1820937851","n1820939084","n1820939728","n1820937688","n1820938263","n1820938670","n1820937762","n1820939310","n1820938925","n1820938862","n1820938822","n1820938547","n1820937731","n1820938594","n1820938592","n1820938214","n1820938284","n1820937835","n1820938599","n1820939437","n1820937834","n1820937576","n1820937692","n1820939586","n1820939546","n1820938403","n1820937970","n1820939561","n1820938098","n1820938851","n1820938477","n1820938892","n1820939045","n1820939758","n1820939350","n1820938321","n1820938440","n1820938595","n1820938364","n1820938962","n1820938118","n1820939678","n1820938406","n1820938549","n1820937555","n1820938823","n1820937521","n1820939471","n1820939487","n1820938799","n1820938605","n1820937928","n1820938373","n1820939747","n1820939629","n1820937557","n1820937526","n1820938958","n1820938833","n1820937636","n1820938967","n1820938760","n1820938842","n1820938067","n1820939077","n1820939224","n1820938185","n1820939110","n1820938372","n1820939757","n1820939063","n1820939660","n1820938813","n1820937528","n1820938369","n1820938896","n1820939551","n1820939683","n1820937660","n1820937873","n1820938810","n1820938478","n1820939662","n1820937595","n1820939052","n1820938113","n1820939070","n1820938733","n1820937878","n1820938300","n1820939760","n1820939718","n1820937646","n1820939057","n1820939443","n1914861306","n1820938013","n1820937529","n1820939764","n1820938826","n1820937885","n1820939588","n1820937865","n1820937833","n1914861112","n1820938761","n1914861007","n1820937905","n1820938541","n1820939092","n1914861057","n1820938153","n1820938267","n1820939265","n1820938085","n1820939018","n1820939755","n1820938474","n1820939027","n1820938593","n1820938202","n1820939599","n1820939695","n1820938077","n1820938012","n1820939545","n1820939596","n1820939337","n1820938227","n1820937698","n1820938475","n1820939465","n1820938165","n1820938698","n1820938525","n1820938529","n1820938553","n1820938940","n1820939498","n1820938501","n1820939533","n1820938924","n1820939634","n1820939220","n1820939657","n1820938887","n1820938838","n1820938114","n1820937823","n1820938778","n1820938801","n1820939096","n1820938981","n1820937953","n1820938732","n1820938980","n1820938960","n1820937949","n1820938026","n1820939273","n1841425201","n1820938629","n1820938864","n1820938554","n1820938088","n1820937685","n1841425222","n1820939729","n1820937665","n1820937838","n1820937739","n1820938780","n1820937821","n1820938825","n1820939055","n1820939485","n1820938041","n1820938746","n1820939562","n1820938459","n1820939489","n1820938050","n1820937980","n1820937695","n1820938413","n1820938555","n1820937703","n1820938536","n1820938196","n1820938287","n1820938169","n1820939279","n1820938531","n1820938959","n1820939741","n1820938665","n1820938963","n1820939611","n1820937653","n1820939618","n1820939492","n1820938600","n1820938628","n1820939312","n1820939616","n1820937738","n1820939001","n1820939062","n1820938794","n1820938558","n1820937822","n1820937532","n1820939073","n1820938200","n1820938241","n1820938968","n1820938927","n1820938306","n1820937630","n1820938456","n1820937694","n1820938908","n1820939076","n1820937522","n1820939659","n1820938522","n1820939318","n1820938932","n1820938841","n1820937579","n1820937540","n1820938560","n1821139530","n1820938964","n1820937662","n1820939281","n1821139533","n1820937797","n1821139532","n1820939751","n1821139531","n1820939291","n1820938420","n1820939696","n1820938904","n1820938484","n1820939448","n1820939009","n1820938735","n1820938986","n1820938937","n1820939030","n1820938734","n1820938745","n1820939106","n1820938987","n1820937858","n1820938673","n1820938620","n1820937808","n1820937700","n1820939573","n1820938540","n1820937661","n1820937570","n1820938396","n1820937875","n1820939048","n1820938233","n1820938793","n1820939584","n1820938412","n1820938394","n1820937846","n1820938800","n1820938690","n1820939331","n1820939630","n1820938762","n1820938710","n1820939322","n1820938992","n1821137608","n1821137607","n1820937924","n1820939139","n1820939463","n1820939574","n1820938294","n1820938071","n1820938307","n1820938061","n1820939260","n1820937899","n1820938310","n1820938983","n1820937530","n1820938993","n1820938890","n1820937915","n1820938231","n1820938040","n1820938920","n1820939585","n1820938135","n1820939700","n1820937824","n1820939667","n1820937930","n1820938134","n1820937551","n1820939405","n1820938232","n1820937716","n1820937848","n1820939765","n1820939068","n1820939766","n1820937933","n1820937720","n1820939222","n1820939772","n1820939022","n1820939732","n1820937702","n1820937691","n1820938945","n1820937756","n1820938451","n1820938410","n1820938798","n1820937945","n1820937654","n1820938598","n1820938836","n1820937571","n1820937556","n1820938994","n1820938919","n1820938863","n1820939064","n1820938018","n1820937658","n1820937537","n1820938142","n1820938666","n1820937535","n1820939571","n1820938465","n1820939638","n1820937533","n1820939656","n1820939422","n1820938109","n1820938405","n1820938028","n1820937649","n1820938829","n1820939031","n1820939155","n1820938350","n1820938463","n1820938425","n1820939047","n1820938831","n1820938494","n1820937697","n1820938504","n1820938900","n1820937784","n1820938414","n1820938076","n1820938723","n1820937722","n1820938739","n1820937791","n1820938985","n1820938352","n1820938293","n1820938274","n1820939692","n1820937871","n1820939059","n1820938868","n1820937877","n1820937743","n1820938429","n1820937545","n1820937575","n1820938302","n1820938505","n1820938916","n1820938374","n1820938329","n1820937790","n1820939735","n1820938930","n1820937995","n1820938512","n1820938130","n1820938194","n1820938671","n1820938802","n1820937542","n1820937602","n1820939069","n1820938901","n1820939654","n1820937727","n1820939569","n1820938375","n1820939306","n1820938479","n1820938376","n1820938667","n1820937766","n1820939467","n1820939567","n1820937806","n1820938943","n1820938931","n1820937745","n1820939452","n1820938738","n1820938053","n1820939653","n1820938640","n1820937604","n1820937536","n1820938701","n1820939625","n1820939744","n1820939572","n1820937577","n1820937541","n1820938891","n1820937597","n1820938469","n1820939194","n1820937539","n1820938911","n1820939017","n1820939650","n1820939103","n1820939578","n1820938132","n1820937549","n1820938634","n1820939743","n1820937544","n1820937826","n1820937598","n1820937547","n1820938032","n1820939142"]},"w17963021":{"id":"w17963021","version":"1","changeset":"402341","user":"DaveHansenTiger","uid":"7168","visible":"true","timestamp":"2007-12-23T20:22:17Z","tags":{"highway":"residential","tiger:cfcc":"A41","tiger:county":"St. Joseph, MI","tiger:reviewed":"no","tiger:separated":"no","tiger:source":"tiger_import_dch_v0.6_20070813","tiger:tlid":"15331667","tiger:upload_uuid":"bulk_upload.pl-b79f893a-0be1-4a5f-a183-6aea114c9af7"},"nodes":["n185948706","n185948708","n185948710"]},"w203974069":{"id":"w203974069","version":"2","changeset":"14894902","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T12:02:34Z","tags":{"amenity":"shelter","area":"yes","building":"yes","shelter_type":"picnic_shelter"},"nodes":["n2139870431","n2139870432","n2139870433","n2139870434","n2139870431"]},"w209816575":{"id":"w209816575","version":"1","changeset":"15353718","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T16:29:46Z","tags":{"area":"yes","building":"yes"},"nodes":["n2199856288","n2199856289","n2199856290","n2199856291","n2199856292","n2199856293","n2199856294","n2199856295","n2199856296","n2199856297","n2199856298","n2199856299","n2199856300","n2199856301","n2199856302","n2199856303","n2199856288"]},"w203841838":{"id":"w203841838","version":"1","changeset":"14879185","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-02T05:55:32Z","tags":{"area":"yes","natural":"water"},"nodes":["n2138493826","n2138493827","n2138493828","n2138493829","n2138493830","n2138493831","n2138493833","n2138493832","n2138493826"]},"w203972937":{"id":"w203972937","version":"2","changeset":"14895132","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T12:19:26Z","tags":{"highway":"path","name":"Riverwalk Trail","surface":"asphalt","width":"3"},"nodes":["n2139858882","n2139858883","n2139858884","n2139858885","n2139858886","n2139858887","n2139858882","n2139858888","n2139858889","n2139858890","n2139858891","n2139858892","n2139858893","n2139858894","n2139858895","n2139858896","n2139858897","n2139858898","n2139858899","n2139858900","n2139858901","n2139858902","n2139858903","n2139858986","n2139858904","n2139858995","n2139858905","n2139858906","n2139858907","n2139858908","n2139858909","n2139858910","n2139858911","n2139858912","n2139858913","n2139858914","n2139858915","n2139858916","n2139858917","n2139858918","n2139858919","n2139858920","n2139858921","n2139858922","n2139858923","n2139858924","n2139858925","n2139858926","n2139858927","n2139858982","n2139858928","n2139858929","n2139858930","n2139858931","n2139858932","n2139858981","n2139858933","n2139858934","n2139858935","n2139858936","n2139858937","n2139858938","n2139858939","n2139858940","n2139858941","n2139858942","n2139858943","n2140006437","n2139858964","n2139858944","n2139858966","n2139858945","n2139858946","n2139858947","n2139858948","n2139858949","n2139858950","n2139858951"]},"w17964015":{"id":"w17964015","version":"2","changeset":"14893310","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:47:03Z","tags":{"highway":"residential","tiger:cfcc":"A41","tiger:county":"St. Joseph, MI","tiger:reviewed":"no","tiger:separated":"no","tiger:source":"tiger_import_dch_v0.6_20070813","tiger:tlid":"15326005:15326006","tiger:upload_uuid":"bulk_upload.pl-b79f893a-0be1-4a5f-a183-6aea114c9af7"},"nodes":["n185954680","n185954683","n185954685","n185954687","n185954689","n185954690","n185954691","n2139870379","n2139870456","n185954692","n185954693","n185954695"]},"w17967315":{"id":"w17967315","version":"2","changeset":"15421127","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-19T15:12:01Z","tags":{"highway":"residential","name":"South Andrews Street","tiger:cfcc":"A41","tiger:county":"St. Joseph, MI","tiger:name_base":"Andrews","tiger:name_direction_prefix":"S","tiger:name_type":"St","tiger:reviewed":"no","tiger:zip_left":"49093","tiger:zip_right":"49093"},"nodes":["n185981999","n185974477","n185964963"]},"w203974071":{"id":"w203974071","version":"1","changeset":"14893310","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:47:03Z","tags":{"highway":"footway"},"nodes":["n2139870439","n2139870440","n2139870441","n2139870442","n2139870443","n2139870444","n2139870445","n2139870446","n2139870447","n2139870448","n2139870449"]},"w170848824":{"id":"w170848824","version":"3","changeset":"15276848","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T22:54:30Z","tags":{"name":"Rocky River","source":"Bing","waterway":"river"},"nodes":["n1819858503","n1819858531","n1819858526","n1819858518","n1819858505","n1819858508","n1819858512","n1819858514","n1819858528","n1819858509","n1819858511","n1819858507","n1819858521"]},"w203986458":{"id":"w203986458","version":"1","changeset":"14894902","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T12:02:33Z","tags":{"amenity":"shelter","area":"yes","shelter_type":"picnic_shelter"},"nodes":["n2139989357","n2139989359","n2139989360","n2139989362","n2139989357"]},"w170844917":{"id":"w170844917","version":"7","changeset":"15277145","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T23:41:22Z","tags":{"source":"Bing","waterway":"riverbank"},"nodes":["n1819805911","n1819805690","n1819805812","n1819805766","n1819805802","n1819805885","n1819805626","n1819805842","n1819805715","n1819805694","n1819805618","n1819805629","n1819805731","n1819805636","n1819805878","n1819805718","n1819805798","n1819849057","n1819805666","n1819805852","n1819805805","n1819805789","n1819805868","n1819805680","n1819805918","n1819848888","n1819805762","n2139989328","n1819805907","n2139989330","n1819805915","n1819858521","n1819805854","n1819805876","n1819805864","n1819805922","n2139859004","n1819805702","n2139859003","n1819805614","n1819805792","n1819805786","n1819805777","n1819805645","n1819805838","n1819805889","n1819805795","n1819805707","n1819805774","n1819805808","n1819805810","n1819805724","n1819805676","n1819805728","n1819805783","n1819805687","n1819805727","n2189123379","n1819805632","n1819805641","n1819805760","n1819805887","n1819805861","n1819805722","n1819805880","n2139982405","n2139982399","n2139982400","n1819805770","n2139982402","n2139982403","n2139982401","n1819805780","n1819805834","n2139982406","n1819805698","n1819805647","n1819805870","n1819805683","n1819805622","n1819805639","n1819805858","n1819805643","n1819805673","n1819805925","n1819805849","n1819805711","n1819805846","n1819805669","n1819805883","n1819805814","n1819805873","n1819805911"]},"w17967326":{"id":"w17967326","version":"4","changeset":"15421127","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-19T15:12:01Z","tags":{"highway":"residential","name":"North Constantine Street","tiger:cfcc":"A41","tiger:county":"St. Joseph, MI","tiger:name_base":"Constantine","tiger:name_direction_prefix":"N","tiger:name_type":"St","tiger:reviewed":"no","tiger:zip_left":"49093","tiger:zip_right":"49093"},"nodes":["n185985217","n185985219","n185985221","n185985222","n185985223","n185985225","n2140006431","n185985227","n185985229","n185985231","n185985233","n185985235","n185985238","n185985240","n2140018998","n185964965"]},"w134150789":{"id":"w134150789","version":"5","changeset":"15421127","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-19T15:11:59Z","tags":{"highway":"primary","name":"West Michigan Avenue","old_ref":"US 131","ref":"US 131 Business;M 60","tiger:cfcc":"A21","tiger:county":"St. Joseph, MI","tiger:name_base":"Michigan","tiger:name_base_1":"State Highway 60","tiger:name_base_2":"US Hwy 131 (Bus)","tiger:name_direction_prefix":"W","tiger:name_type":"Ave","tiger:reviewed":"no"},"nodes":["n185964971","n2139870406","n185964972"]},"w17966400":{"id":"w17966400","version":"3","changeset":"15421127","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-19T15:12:01Z","tags":{"highway":"tertiary","name":"South Constantine Street","tiger:cfcc":"A41","tiger:county":"St. Joseph, MI","tiger:name_base":"Constantine","tiger:name_direction_prefix":"S","tiger:name_type":"St","tiger:reviewed":"no","tiger:zip_left":"49093","tiger:zip_right":"49093"},"nodes":["n185958672","n185964965"]},"w203974066":{"id":"w203974066","version":"1","changeset":"14893310","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:47:02Z","tags":{"highway":"service","service":"parking_aisle"},"nodes":["n2139870417","n2139870418","n2139870420","n2139870419"]},"w17965998":{"id":"w17965998","version":"5","changeset":"14802606","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-01-27T04:50:53Z","tags":{"name":"Conrail Railroad","railway":"rail","tiger:cfcc":"B11","tiger:county":"St. Joseph, MI","tiger:name_base":"Conrail Railroad","tiger:reviewed":"no"},"nodes":["n185972775","n185972777","n185972779","n185972781","n185972783","n185972785","n185972787","n185972788","n185972789","n185972790","n185972791","n185972793","n185972795","n185972797","n185972798","n185972800","n185972802","n185972805","n185972807","n185972809","n185972811","n185972813","n185972814","n185972815","n185972816","n185972817","n185972819","n185972821","n185972824","n185972826","n185972830","n185972832","n185972834","n185972835","n185972836","n185972839","n185990434","n2114807572","n2114807568","n185972845","n2114807583","n185972847","n185972849","n185972851","n2114807578","n1475293254","n2114807593","n1475293226","n185972862","n2114807565","n185951869","n1475293234","n1475293252","n185972868","n1475293264","n1475293222","n185972878","n1475293261","n185972882","n185972885","n1475293260","n1475293240","n185972891","n185972895","n185972897","n185972899","n2130304159","n1475284023","n185972903"]},"w134150795":{"id":"w134150795","version":"4","changeset":"15421127","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-19T15:11:59Z","tags":{"bridge":"yes","highway":"primary","name":"West Michigan Avenue","old_ref":"US 131","ref":"US 131 Business;M 60","tiger:cfcc":"A21","tiger:county":"St. Joseph, MI","tiger:name_base":"Michigan","tiger:name_base_1":"State Highway 60","tiger:name_base_2":"US Hwy 131 (Bus)","tiger:name_direction_prefix":"W","tiger:name_type":"Ave","tiger:reviewed":"no"},"nodes":["n185964970","n185964971"]},"w203974067":{"id":"w203974067","version":"1","changeset":"14893310","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:47:02Z","tags":{"highway":"service","service":"parking_aisle"},"nodes":["n2139870420","n2139870421"]},"w170995908":{"id":"w170995908","version":"3","changeset":"14893110","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:29:15Z","tags":{"highway":"residential","name":"Thomas Street","source":"Bing"},"nodes":["n1821006702","n1821006700","n1821006698","n2139858990","n1821006716","n1821006725","n1821006712","n1821006704","n1821006708","n1821006710","n1821006706"]},"w17965834":{"id":"w17965834","version":"3","changeset":"15421127","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-19T15:12:01Z","tags":{"highway":"residential","name":"Spring Street","tiger:cfcc":"A41","tiger:county":"St. Joseph, MI","tiger:name_base":"Spring","tiger:name_type":"St","tiger:reviewed":"no","tiger:zip_left":"49093"},"nodes":["n185971361","n185971364","n185971366","n185971368","n185954695","n185964968"]},"w203974070":{"id":"w203974070","version":"2","changeset":"14894902","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T12:02:34Z","tags":{"amenity":"shelter","area":"yes","building":"yes","shelter_type":"picnic_shelter"},"nodes":["n2139870435","n2139870436","n2139870437","n2139870438","n2139870435"]},"w203989879":{"id":"w203989879","version":"1","changeset":"14895342","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T12:35:05Z","tags":{"highway":"service"},"nodes":["n2140018998","n2140018999","n2140019000"]},"w203974062":{"id":"w203974062","version":"1","changeset":"14893310","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:47:02Z","tags":{"amenity":"parking","area":"yes"},"nodes":["n2139870387","n2139870388","n2139870389","n2139870390","n2139870391","n2139870392","n2139870397","n2139870393","n2139870396","n2139870395","n2139870394","n2139870387"]},"w203974061":{"id":"w203974061","version":"1","changeset":"14893310","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:47:02Z","tags":{"bridge":"yes","highway":"footway"},"nodes":["n2139870382","n2139870383"]},"w203049587":{"id":"w203049587","version":"1","changeset":"14802606","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-01-27T04:50:52Z","tags":{"area":"yes","name":"Scidmore Park Petting Zoo","tourism":"zoo","zoo":"petting_zoo"},"nodes":["n2130304133","n2130304136","n2130304138","n2130304140","n2130304142","n2130304144","n2130304146","n2130304147","n2130304148","n2130304149","n2130304150","n2130304151","n2130304133"]},"w203972941":{"id":"w203972941","version":"1","changeset":"14893110","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:29:14Z","tags":{"highway":"path"},"nodes":["n2139858982","n2139858983","n2139858984","n2139858985","n2139858927"]},"w203974065":{"id":"w203974065","version":"1","changeset":"14893310","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:47:02Z","tags":{"highway":"service"},"nodes":["n2139870406","n2139870407","n2139870408","n2139870417","n2139870409","n2139870410","n2139870411","n2139870412","n2139870426","n2139870413","n2139870414","n2139870415","n2139870419","n2139870416","n2139870421","n2139870408"]},"w203972940":{"id":"w203972940","version":"1","changeset":"14893110","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:29:14Z","tags":{"highway":"path","name":"Riverwalk Trail"},"nodes":["n2139858934","n2139858967","n2139858968","n2139858969","n2139858970","n2139858971","n2139858972","n2139858973","n2139858974","n2139858975","n2139858976","n2139858977","n2139858978","n2139858979","n2139858980","n2139858981"]},"w203974072":{"id":"w203974072","version":"1","changeset":"14893310","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:47:03Z","tags":{"highway":"footway"},"nodes":["n2139858925","n2139870450","n2139870453","n2139870451","n2139870452","n2139870441"]},"w203974074":{"id":"w203974074","version":"1","changeset":"14893310","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:47:03Z","tags":{"highway":"footway"},"nodes":["n2139870454","n2139870456","n2139870429"]},"w203974060":{"id":"w203974060","version":"1","changeset":"14893310","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:47:02Z","tags":{"highway":"footway"},"nodes":["n2139870383","n2139870384","n2139870422","n2139870385","n2139870386","n2139870388"]},"w203841837":{"id":"w203841837","version":"1","changeset":"14879185","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-02T05:55:32Z","tags":{"area":"yes","natural":"water"},"nodes":["n2138493807","n2138493808","n2138493809","n2138493810","n2138493811","n2138493812","n2138493813","n2138493814","n2138493815","n2138493816","n2138493825","n2138493817","n2138493824","n2138493818","n2138493819","n2138493820","n2138493821","n2138493822","n2138493823","n2138493807"]},"w134150845":{"id":"w134150845","version":"1","changeset":"9619138","user":"bbmiller","uid":"451048","visible":"true","timestamp":"2011-10-21T19:45:57Z","tags":{"bridge":"yes","name":"Conrail Railroad","railway":"rail","tiger:cfcc":"B11","tiger:county":"St. Joseph, MI","tiger:name_base":"Conrail Railroad","tiger:reviewed":"no","tiger:source":"tiger_import_dch_v0.6_20070813","tiger:tlid":"15324560:15329061:15329062:15333515:15333516:15333517:15328802:15312982:15312984:15312980:15326010:15326011:15313203:15322169:15324562:15312971:15312973:15312977:15328799:15328907:15328908:15322175:15329059:15333626:15333627:15325105:15322549:15337756:153","tiger:upload_uuid":"bulk_upload.pl-b79f893a-0be1-4a5f-a183-6aea114c9af7"},"nodes":["n185972903","n185972905"]},"w203974059":{"id":"w203974059","version":"1","changeset":"14893310","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:47:02Z","tags":{"highway":"footway"},"nodes":["n2139870430","n2139870439","n2139870429","n2139870428","n2139870379","n2139870455","n2139870380","n2139870381","n2139858925","n2139870382"]},"w203986457":{"id":"w203986457","version":"2","changeset":"15287771","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-07T21:56:30Z","tags":{"area":"yes","ele":"241","gnis:county_id":"149","gnis:created":"04/30/2008","gnis:feature_id":"2417887","gnis:state_id":"26","leisure":"park","name":"Scidmore Park","website":"http://www.threeriversmi.us/?page_id=53"},"nodes":["n2139989333","n2139989335","n2139989337","n2139989339","n1819805762","n2139989328","n1819805907","n2139989330","n1819805915","n2139989341","n2139989344","n2139989346","n2139989348","n2139989350","n2139989351","n2139989353","n2139989355","n2139989333"]},"w170848331":{"id":"w170848331","version":"4","changeset":"15276848","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T22:54:29Z","tags":{"name":"Rocky River","source":"Bing","waterway":"river"},"nodes":["n1819848937","n1819849104","n1819849076","n1819849183","n1819848928","n1819848972","n1819848948","n1819848971","n1819848859","n1819849008","n1819848889","n1819849026","n1819849094","n1819849083","n1819849079","n1819849187","n1819848992","n1819849060","n1819849056","n1819849071","n1819849067","n1819849048","n1819849036","n1819849150","n1819849075","n1819849051","n1819849062","n1819848926","n1819849035","n1819848987","n1819849012","n1819848933","n1819848996","n1819848990","n1819849005","n1819849021","n1819848892","n1819849092","n1819848863","n1819848922","n1819848858","n1819848855","n1819848974","n1819848953","n1819849019","n1819849049","n1819848979","n1819849140","n1819849193","n1819849147","n1819849151","n1819849163","n1819849023","n1819848878","n1819849004","n1819848857","n1819848879","n1819849041","n1819849165","n1819849107","n1819849156","n1819848934","n1819848914","n1819848955","n1819848931","n1819848927","n1819849084","n1819849169","n1819849045","n1819848945","n1819849095","n1819848924","n1819849171","n1819849141","n1819849046","n1819849197","n1819849011","n1819849108","n1819849158","n1819849160","n1819848870","n1819849006","n1819849157","n1819848993","n1819848970","n1819849202","n1819848903","n1819848975","n1819848849","n1819849025","n1819849105","n1819849033","n1819849176","n1819849099","n1819849086","n1819848960","n1819848961","n1819849001","n1819848980","n1819849038","n1819848854","n1819849127","n1819849170","n1819849139","n1819848873","n1819848929","n1819849201","n1819849121","n1819849031","n1819849131","n1819848875","n1819849080","n1819849066","n1819849081","n1819849096","n1819849172","n1819849114","n1819849182","n1819848905","n1819849054","n1819848920","n1819848851","n1819848968","n1819848917","n1819849111","n1819849119","n1819849074","n1819848893","n1819849129","n1819848850","n1819848956","n1819849154","n1819848877","n1819848986","n1819849191","n1819848952","n1819848954","n1819848942","n1819849028","n1819849195","n1819848938","n1819848962","n1819849070","n1819849034","n1819849052","n1819849059","n1819848916","n1819849162","n1819849167","n1819849093","n1819849030","n1819849002","n1819849161","n1819848886","n1819848958","n1819849064","n1819849112","n1819849148","n1819848856","n1819848976","n1819848977","n1819849144","n1819848918","n1819849200","n1819848919","n1819849042","n1819849166","n1819849186","n1819849152","n1819849058","n1819849185","n1819849199","n1819849053","n1819849194","n1819849068","n1819849146","n1819849174","n1819848967","n1819848932","n1819849155","n1819849198","n1819848964","n1819848894","n1819848969","n1819849184","n1819849055","n1819849179","n1819848865","n1819848860","n1819849082","n1819848966","n1819849040","n1819849069","n1819849078","n1819849077","n1819848904","n1819848959","n1819849133","n1819849089","n1819849000","n1819849124","n1819849032","n1819849097","n1819848939","n1819849072","n1819848915","n1819849196","n1819848946","n1819849047","n1819849029","n1819849164","n1819848994","n1819849022","n1819858513","n1819849126","n1819849063","n1819848941","n1819849085","n1819848871","n1819848943","n1819849192","n1819858501","n1819849159","n1819858523","n1819848901","n1819849189","n1819858503","n1819849065","n2139877106","n1819848909","n1819848930","n1819848888"]},"w17967397":{"id":"w17967397","version":"2","changeset":"15421127","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-19T15:12:01Z","tags":{"highway":"residential","name":"North Andrews Street","tiger:cfcc":"A41","tiger:county":"St. Joseph, MI","tiger:name_base":"Andrews","tiger:name_direction_prefix":"N","tiger:name_type":"St","tiger:reviewed":"no","tiger:zip_left":"49093","tiger:zip_right":"49093"},"nodes":["n185964963","n185985217"]},"w17964497":{"id":"w17964497","version":"3","changeset":"14892219","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T07:48:05Z","tags":{"highway":"tertiary","name":"Constantine St","tiger:cfcc":"A41","tiger:county":"St. Joseph, MI","tiger:name_base":"Constantine","tiger:name_type":"St","tiger:reviewed":"no","tiger:zip_left":"49093","tiger:zip_right":"49093"},"nodes":["n185958643","n185958645","n2139795852","n185958647","n185958649","n185958651","n185958653","n185958656","n185958658","n185958660","n185958662","n185958664","n185958666","n185958668","n185958670","n185948710","n185958672"]},"w203974068":{"id":"w203974068","version":"1","changeset":"14893310","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:47:03Z","tags":{"highway":"footway"},"nodes":["n2139870422","n2139870423","n2139870424","n2139870425","n2139870426","n2139870427"]},"w203974063":{"id":"w203974063","version":"1","changeset":"14893310","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:47:02Z","tags":{"amenity":"parking","area":"yes"},"nodes":["n2139870398","n2139870399","n2139870400","n2139870401","n2139870398"]},"w203986459":{"id":"w203986459","version":"1","changeset":"14894902","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T12:02:33Z","tags":{"amenity":"shelter","area":"yes","shelter_type":"picnic_shelter"},"nodes":["n2139989364","n2139989366","n2139989368","n2139989370","n2139989364"]},"w203988286":{"id":"w203988286","version":"1","changeset":"14895132","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T12:19:25Z","tags":{"area":"yes","leisure":"park","name":"Memory Isle Park","website":"http://www.threeriversmi.us/?page_id=53"},"nodes":["n2140006331","n2140006334","n2140006336","n2140006338","n2140006340","n2140006342","n2140006344","n2140006346","n2140006348","n2140006351","n2140006353","n2140006355","n2140006357","n2140006359","n2140006361","n2140006363","n2140006364","n2140006365","n2140006395","n2140006366","n2140006401","n2140006397","n2140006399","n2140006331"]},"w203974073":{"id":"w203974073","version":"1","changeset":"14893310","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:47:03Z","tags":{"highway":"footway"},"nodes":["n2139870453","n2139870454","n2139870455"]},"w203974064":{"id":"w203974064","version":"1","changeset":"14893310","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:47:02Z","tags":{"amenity":"parking","area":"yes"},"nodes":["n2139870402","n2139870403","n2139870404","n2139870405","n2139870402"]},"n185966959":{"id":"n185966959","loc":[-85.642185,41.946411],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:02:51Z","tags":{}},"n1475283980":{"id":"n1475283980","loc":[-85.6398249,41.9451425],"version":"1","changeset":"9619138","user":"bbmiller","uid":"451048","visible":"true","timestamp":"2011-10-21T19:45:46Z","tags":{}},"n1475284013":{"id":"n1475284013","loc":[-85.6396448,41.9451666],"version":"1","changeset":"9619138","user":"bbmiller","uid":"451048","visible":"true","timestamp":"2011-10-21T19:45:47Z","tags":{}},"n1475284042":{"id":"n1475284042","loc":[-85.6386382,41.9454789],"version":"1","changeset":"9619138","user":"bbmiller","uid":"451048","visible":"true","timestamp":"2011-10-21T19:45:47Z","tags":{}},"n185975925":{"id":"n185975925","loc":[-85.6393332,41.9452388],"version":"3","changeset":"9619138","user":"bbmiller","uid":"451048","visible":"true","timestamp":"2011-10-21T19:45:58Z","tags":{}},"n185975919":{"id":"n185975919","loc":[-85.6391279,41.9453044],"version":"3","changeset":"9619138","user":"bbmiller","uid":"451048","visible":"true","timestamp":"2011-10-21T19:45:58Z","tags":{}},"n185975917":{"id":"n185975917","loc":[-85.6389034,41.9453872],"version":"3","changeset":"9619138","user":"bbmiller","uid":"451048","visible":"true","timestamp":"2011-10-21T19:45:58Z","tags":{}},"n2140006369":{"id":"n2140006369","loc":[-85.6386163,41.9451631],"version":"1","changeset":"14895132","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T12:19:24Z","tags":{}},"n2140006370":{"id":"n2140006370","loc":[-85.6385144,41.9449357],"version":"1","changeset":"14895132","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T12:19:24Z","tags":{}},"n2140006417":{"id":"n2140006417","loc":[-85.6385785,41.9450299],"version":"1","changeset":"14895132","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T12:19:24Z","tags":{}},"n2140006419":{"id":"n2140006419","loc":[-85.6385781,41.9452152],"version":"1","changeset":"14895132","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T12:19:24Z","tags":{}},"n2189123361":{"id":"n2189123361","loc":[-85.6404948,41.947015],"version":"1","changeset":"15277145","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T23:41:21Z","tags":{}},"n2189123363":{"id":"n2189123363","loc":[-85.6395765,41.946495],"version":"1","changeset":"15277145","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T23:41:21Z","tags":{}},"n2189123365":{"id":"n2189123365","loc":[-85.6389347,41.9460875],"version":"1","changeset":"15277145","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T23:41:21Z","tags":{}},"n185966962":{"id":"n185966962","loc":[-85.644417,41.946364],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:02:51Z","tags":{}},"n185975911":{"id":"n185975911","loc":[-85.637532,41.9458276],"version":"3","changeset":"9619138","user":"bbmiller","uid":"451048","visible":"true","timestamp":"2011-10-21T19:45:58Z","tags":{}},"n185975913":{"id":"n185975913","loc":[-85.6376323,41.9457936],"version":"3","changeset":"9619138","user":"bbmiller","uid":"451048","visible":"true","timestamp":"2011-10-21T19:45:59Z","tags":{}},"n185975915":{"id":"n185975915","loc":[-85.6383596,41.9455425],"version":"3","changeset":"9619138","user":"bbmiller","uid":"451048","visible":"true","timestamp":"2011-10-21T19:45:58Z","tags":{}},"n185975932":{"id":"n185975932","loc":[-85.644403,41.945088],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:07:13Z","tags":{}},"n185975934":{"id":"n185975934","loc":[-85.645486,41.945084],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:07:13Z","tags":{}},"n185979974":{"id":"n185979974","loc":[-85.644381,41.943831],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:09:24Z","tags":{}},"n2139795809":{"id":"n2139795809","loc":[-85.6464756,41.9450813],"version":"1","changeset":"14892219","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T07:47:56Z","tags":{}},"n2139795810":{"id":"n2139795810","loc":[-85.6466646,41.945174],"version":"1","changeset":"14892219","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T07:47:56Z","tags":{}},"n2139858952":{"id":"n2139858952","loc":[-85.6383567,41.9454039],"version":"1","changeset":"14893110","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:29:12Z","tags":{}},"n2139858953":{"id":"n2139858953","loc":[-85.6380506,41.9455301],"version":"1","changeset":"14893110","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:29:13Z","tags":{}},"n2139858954":{"id":"n2139858954","loc":[-85.6377321,41.9455546],"version":"1","changeset":"14893110","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:29:13Z","tags":{}},"n2139858955":{"id":"n2139858955","loc":[-85.6376571,41.9455245],"version":"1","changeset":"14893110","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:29:13Z","tags":{}},"n2139858956":{"id":"n2139858956","loc":[-85.6375859,41.9454544],"version":"1","changeset":"14893110","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:29:13Z","tags":{}},"n2139858957":{"id":"n2139858957","loc":[-85.6376686,41.9453185],"version":"1","changeset":"14893110","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:29:13Z","tags":{}},"n2139858958":{"id":"n2139858958","loc":[-85.6378936,41.9451712],"version":"1","changeset":"14893110","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:29:13Z","tags":{}},"n2139858959":{"id":"n2139858959","loc":[-85.6379225,41.9450825],"version":"1","changeset":"14893110","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:29:13Z","tags":{}},"n2139858960":{"id":"n2139858960","loc":[-85.6379302,41.9447564],"version":"1","changeset":"14893110","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:29:13Z","tags":{}},"n2139858961":{"id":"n2139858961","loc":[-85.6379763,41.9446963],"version":"1","changeset":"14893110","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:29:13Z","tags":{}},"n2139858962":{"id":"n2139858962","loc":[-85.6380436,41.9446706],"version":"1","changeset":"14893110","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:29:13Z","tags":{}},"n2139858963":{"id":"n2139858963","loc":[-85.6381286,41.9445969],"version":"1","changeset":"14893110","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:29:13Z","tags":{}},"n2139858965":{"id":"n2139858965","loc":[-85.6382523,41.9444134],"version":"1","changeset":"14893110","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:29:13Z","tags":{}},"n2140006367":{"id":"n2140006367","loc":[-85.6380923,41.9454418],"version":"1","changeset":"14895132","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T12:19:24Z","tags":{}},"n2140006368":{"id":"n2140006368","loc":[-85.6384089,41.9453146],"version":"1","changeset":"14895132","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T12:19:24Z","tags":{}},"n2140006372":{"id":"n2140006372","loc":[-85.6383252,41.9447706],"version":"1","changeset":"14895132","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T12:19:24Z","tags":{}},"n2140006374":{"id":"n2140006374","loc":[-85.6381033,41.9447436],"version":"1","changeset":"14895132","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T12:19:24Z","tags":{}},"n2140006376":{"id":"n2140006376","loc":[-85.6379759,41.9447815],"version":"1","changeset":"14895132","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T12:19:24Z","tags":{}},"n2140006378":{"id":"n2140006378","loc":[-85.6379832,41.9448654],"version":"1","changeset":"14895132","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T12:19:24Z","tags":{}},"n2140006380":{"id":"n2140006380","loc":[-85.6380632,41.9450738],"version":"1","changeset":"14895132","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T12:19:24Z","tags":{}},"n2140006382":{"id":"n2140006382","loc":[-85.6380414,41.9452064],"version":"1","changeset":"14895132","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T12:19:24Z","tags":{}},"n2140006389":{"id":"n2140006389","loc":[-85.6379068,41.9453092],"version":"1","changeset":"14895132","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T12:19:24Z","tags":{}},"n2140006391":{"id":"n2140006391","loc":[-85.637925,41.9453904],"version":"1","changeset":"14895132","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T12:19:24Z","tags":{}},"n2140006393":{"id":"n2140006393","loc":[-85.6379977,41.94545],"version":"1","changeset":"14895132","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T12:19:24Z","tags":{}},"n2189123275":{"id":"n2189123275","loc":[-85.6371346,41.9462544],"version":"1","changeset":"15277145","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T23:41:20Z","tags":{}},"n2189123278":{"id":"n2189123278","loc":[-85.6368371,41.9466153],"version":"1","changeset":"15277145","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T23:41:20Z","tags":{}},"n2189123280":{"id":"n2189123280","loc":[-85.6379537,41.9489088],"version":"1","changeset":"15277145","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T23:41:20Z","tags":{}},"n2189123282":{"id":"n2189123282","loc":[-85.6383816,41.9497858],"version":"1","changeset":"15277145","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T23:41:20Z","tags":{}},"n2189123285":{"id":"n2189123285","loc":[-85.6393673,41.9512417],"version":"1","changeset":"15277145","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T23:41:20Z","tags":{}},"n2189123287":{"id":"n2189123287","loc":[-85.640554,41.9517766],"version":"1","changeset":"15277145","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T23:41:20Z","tags":{}},"n2189123289":{"id":"n2189123289","loc":[-85.6411,41.9522344],"version":"1","changeset":"15277145","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T23:41:20Z","tags":{}},"n2189123291":{"id":"n2189123291","loc":[-85.6417418,41.9526574],"version":"1","changeset":"15277145","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T23:41:20Z","tags":{}},"n2189123293":{"id":"n2189123293","loc":[-85.642321,41.9529407],"version":"1","changeset":"15277145","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T23:41:20Z","tags":{}},"n2189123295":{"id":"n2189123295","loc":[-85.6427697,41.9532278],"version":"1","changeset":"15277145","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T23:41:20Z","tags":{}},"n2189123297":{"id":"n2189123297","loc":[-85.6433332,41.9538254],"version":"1","changeset":"15277145","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T23:41:20Z","tags":{}},"n2189123300":{"id":"n2189123300","loc":[-85.6435785,41.9543648],"version":"1","changeset":"15277145","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T23:41:20Z","tags":{}},"n2189123301":{"id":"n2189123301","loc":[-85.6444394,41.9541048],"version":"1","changeset":"15277145","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T23:41:20Z","tags":{}},"n2189123303":{"id":"n2189123303","loc":[-85.6450603,41.954],"version":"1","changeset":"15277145","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T23:41:20Z","tags":{}},"n2189123312":{"id":"n2189123312","loc":[-85.6454829,41.9539108],"version":"1","changeset":"15277145","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T23:41:20Z","tags":{}},"n2189123314":{"id":"n2189123314","loc":[-85.6460464,41.9538526],"version":"1","changeset":"15277145","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T23:41:20Z","tags":{}},"n2189123315":{"id":"n2189123315","loc":[-85.6463178,41.9537167],"version":"1","changeset":"15277145","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T23:41:20Z","tags":{}},"n2189123316":{"id":"n2189123316","loc":[-85.646276,41.9534141],"version":"1","changeset":"15277145","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T23:41:20Z","tags":{}},"n2189123317":{"id":"n2189123317","loc":[-85.6459995,41.9531541],"version":"1","changeset":"15277145","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T23:41:20Z","tags":{}},"n2189123318":{"id":"n2189123318","loc":[-85.645222,41.9531929],"version":"1","changeset":"15277145","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T23:41:20Z","tags":{}},"n2189123319":{"id":"n2189123319","loc":[-85.6447316,41.9531813],"version":"1","changeset":"15277145","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T23:41:20Z","tags":{}},"n2189123320":{"id":"n2189123320","loc":[-85.6440637,41.9532977],"version":"1","changeset":"15277145","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T23:41:21Z","tags":{}},"n2189123321":{"id":"n2189123321","loc":[-85.6438185,41.9531774],"version":"1","changeset":"15277145","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T23:41:21Z","tags":{}},"n2189123322":{"id":"n2189123322","loc":[-85.6440011,41.9528398],"version":"1","changeset":"15277145","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T23:41:21Z","tags":{}},"n2189123323":{"id":"n2189123323","loc":[-85.6442672,41.9525914],"version":"1","changeset":"15277145","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T23:41:21Z","tags":{}},"n2189123324":{"id":"n2189123324","loc":[-85.6442881,41.9523276],"version":"1","changeset":"15277145","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T23:41:21Z","tags":{}},"n2189123326":{"id":"n2189123326","loc":[-85.644262,41.952153],"version":"1","changeset":"15277145","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T23:41:21Z","tags":{}},"n2189123328":{"id":"n2189123328","loc":[-85.6441681,41.9520404],"version":"1","changeset":"15277145","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T23:41:21Z","tags":{}},"n2189123330":{"id":"n2189123330","loc":[-85.6442098,41.9517494],"version":"1","changeset":"15277145","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T23:41:21Z","tags":{}},"n2189123333":{"id":"n2189123333","loc":[-85.6438498,41.9515864],"version":"1","changeset":"15277145","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T23:41:21Z","tags":{}},"n2189123336":{"id":"n2189123336","loc":[-85.6435889,41.9513225],"version":"1","changeset":"15277145","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T23:41:21Z","tags":{}},"n2189123339":{"id":"n2189123339","loc":[-85.6425349,41.9510315],"version":"1","changeset":"15277145","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T23:41:21Z","tags":{}},"n2189123342":{"id":"n2189123342","loc":[-85.6422688,41.9508802],"version":"1","changeset":"15277145","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T23:41:21Z","tags":{}},"n2189123345":{"id":"n2189123345","loc":[-85.6418775,41.9508142],"version":"1","changeset":"15277145","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T23:41:21Z","tags":{}},"n2189123348":{"id":"n2189123348","loc":[-85.6415488,41.9508064],"version":"1","changeset":"15277145","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T23:41:21Z","tags":{}},"n2189123351":{"id":"n2189123351","loc":[-85.6411027,41.9505488],"version":"1","changeset":"15277145","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T23:41:21Z","tags":{}},"n2189123353":{"id":"n2189123353","loc":[-85.6410374,41.9498208],"version":"1","changeset":"15277145","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T23:41:21Z","tags":{}},"n2189123355":{"id":"n2189123355","loc":[-85.6410061,41.9494327],"version":"1","changeset":"15277145","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T23:41:21Z","tags":{}},"n2189123357":{"id":"n2189123357","loc":[-85.6411522,41.9482569],"version":"1","changeset":"15277145","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T23:41:21Z","tags":{}},"n2189123359":{"id":"n2189123359","loc":[-85.6410548,41.9473036],"version":"1","changeset":"15277145","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T23:41:21Z","tags":{}},"n2189123368":{"id":"n2189123368","loc":[-85.6380216,41.9458974],"version":"1","changeset":"15277145","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T23:41:21Z","tags":{}},"n2189123370":{"id":"n2189123370","loc":[-85.6386721,41.9507782],"version":"1","changeset":"15277145","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T23:41:21Z","tags":{}},"w17968193":{"id":"w17968193","version":"1","changeset":"402580","user":"DaveHansenTiger","uid":"7168","visible":"true","timestamp":"2007-12-23T20:56:35Z","tags":{"highway":"residential","name":"French St","tiger:cfcc":"A41","tiger:county":"St. Joseph, MI","tiger:name_base":"French","tiger:name_type":"St","tiger:reviewed":"no","tiger:separated":"no","tiger:source":"tiger_import_dch_v0.6_20070813","tiger:tlid":"15312389:15312396","tiger:upload_uuid":"bulk_upload.pl-b79f893a-0be1-4a5f-a183-6aea114c9af7"},"nodes":["n185970906","n185982877","n185967774","n185985823","n185979974"]},"w203972939":{"id":"w203972939","version":"1","changeset":"14893110","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:29:14Z","tags":{"highway":"path"},"nodes":["n2139858965","n2139858966"]},"w203988289":{"id":"w203988289","version":"1","changeset":"14895132","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T12:19:25Z","tags":{"area":"yes","natural":"water"},"nodes":["n2140006367","n2140006368","n2140006419","n2140006369","n2140006417","n2140006370","n2140006372","n2140006374","n2140006376","n2140006378","n2140006380","n2140006382","n2140006389","n2140006391","n2140006393","n2140006367"]},"w208640157":{"id":"w208640157","version":"1","changeset":"15277145","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T23:41:22Z","tags":{"area":"yes","natural":"wetland"},"nodes":["n1819849029","n2189123275","n2189123278","n2189123280","n2189123282","n2189123370","n2189123285","n2189123287","n2189123289","n2189123291","n2189123293","n2189123295","n2189123297","n2189123300","n2189123301","n2189123303","n2189123312","n2189123314","n2189123315","n2189123316","n2189123317","n2189123318","n2189123319","n2189123320","n2189123321","n2189123322","n2189123323","n2189123324","n2189123326","n2189123328","n2189123330","n2189123333","n2189123336","n2189123339","n2189123342","n2189123345","n2189123348","n2189123351","n2189123353","n2189123355","n2189123357","n2189123359","n2189123361","n2189123363","n2189123365","n2189123368","n1819849029"]},"w17966281":{"id":"w17966281","version":"3","changeset":"14892219","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T07:48:03Z","tags":{"highway":"residential","name":"Pealer St","tiger:cfcc":"A41","tiger:county":"St. Joseph, MI","tiger:name_base":"Pealer","tiger:name_type":"St","tiger:reviewed":"no","tiger:separated":"no","tiger:source":"tiger_import_dch_v0.6_20070813","tiger:tlid":"15312363:15312366:15312367:15312368:15325990:15325991:15324554","tiger:upload_uuid":"bulk_upload.pl-b79f893a-0be1-4a5f-a183-6aea114c9af7","tiger:zip_left":"49093","tiger:zip_right":"49093"},"nodes":["n185975911","n185975913","n185975915","n1475284042","n185975917","n185975919","n185975925","n185970909","n1475284013","n1475283980","n185975928","n185967775","n185975930","n185975932","n185975934","n2139795809","n2139795810"]},"w17965353":{"id":"w17965353","version":"1","changeset":"402341","user":"DaveHansenTiger","uid":"7168","visible":"true","timestamp":"2007-12-23T20:36:24Z","tags":{"highway":"residential","name":"Yauney St","tiger:cfcc":"A41","tiger:county":"St. Joseph, MI","tiger:name_base":"Yauney","tiger:name_type":"St","tiger:reviewed":"no","tiger:separated":"no","tiger:source":"tiger_import_dch_v0.6_20070813","tiger:tlid":"15312346:15312347","tiger:upload_uuid":"bulk_upload.pl-b79f893a-0be1-4a5f-a183-6aea114c9af7"},"nodes":["n185966958","n185966959","n185966960","n185966962"]},"w203972938":{"id":"w203972938","version":"1","changeset":"14893110","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:29:14Z","tags":{"highway":"path","name":"Riverwalk Trail"},"nodes":["n2139858964","n2139858965","n2139858963","n2139858962","n2139858961","n2139858960","n2139858959","n2139858958","n2139858957","n2139858956","n2139858955","n2139858954","n2139858953","n2139858952","n2139858951"]},"n354002665":{"id":"n354002665","loc":[-85.6366599,41.9444923],"version":"1","changeset":"698464","user":"iandees","uid":"4732","visible":"true","timestamp":"2009-02-28T21:20:26Z","tags":{"ele":"244","gnis:county_id":"149","gnis:created":"04/14/1980","gnis:feature_id":"1624726","gnis:state_id":"26","name":"Memory Isle","place":"island"}},"n354031301":{"id":"n354031301","loc":[-85.635,41.9463889],"version":"1","changeset":"698464","user":"iandees","uid":"4732","visible":"true","timestamp":"2009-02-28T22:12:53Z","tags":{"amenity":"post_office","ele":"248","gnis:county_id":"149","gnis:created":"04/30/2008","gnis:feature_id":"2418163","gnis:state_id":"26","name":"Three Rivers Post Office"}},"n185963454":{"id":"n185963454","loc":[-85.633686,41.946072],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:00:55Z","tags":{}},"n185963455":{"id":"n185963455","loc":[-85.633815,41.946131],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:00:55Z","tags":{}},"n185963456":{"id":"n185963456","loc":[-85.633951,41.946174],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:00:55Z","tags":{}},"n185978375":{"id":"n185978375","loc":[-85.634385,41.94559],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:08:23Z","tags":{}},"n185978377":{"id":"n185978377","loc":[-85.634544,41.945725],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:08:23Z","tags":{}},"n185978379":{"id":"n185978379","loc":[-85.634573,41.945764],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:08:23Z","tags":{}},"n185978381":{"id":"n185978381","loc":[-85.634616,41.945849],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:08:23Z","tags":{}},"n185978383":{"id":"n185978383","loc":[-85.634629,41.945893],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:08:24Z","tags":{}},"n185984011":{"id":"n185984011","loc":[-85.636058,41.946201],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:11:46Z","tags":{}},"n185984013":{"id":"n185984013","loc":[-85.636112,41.946366],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:11:46Z","tags":{}},"n185984015":{"id":"n185984015","loc":[-85.636143,41.946551],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:11:46Z","tags":{}},"n185988237":{"id":"n185988237","loc":[-85.6354162,41.946044],"version":"3","changeset":"15277317","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-07T00:30:16Z","tags":{}},"n185988969":{"id":"n185988969","loc":[-85.635374,41.945325],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:14:16Z","tags":{}},"n185988971":{"id":"n185988971","loc":[-85.635643,41.945585],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:14:16Z","tags":{}},"n185988972":{"id":"n185988972","loc":[-85.635853,41.94586],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:14:16Z","tags":{}},"n1475283992":{"id":"n1475283992","loc":[-85.6372968,41.9459007],"version":"1","changeset":"9619138","user":"bbmiller","uid":"451048","visible":"true","timestamp":"2011-10-21T19:45:46Z","tags":{}},"n1475284011":{"id":"n1475284011","loc":[-85.6359415,41.9459797],"version":"1","changeset":"9619138","user":"bbmiller","uid":"451048","visible":"true","timestamp":"2011-10-21T19:45:47Z","tags":{}},"n1475284019":{"id":"n1475284019","loc":[-85.6364433,41.9460423],"version":"1","changeset":"9619138","user":"bbmiller","uid":"451048","visible":"true","timestamp":"2011-10-21T19:45:47Z","tags":{}},"n185984009":{"id":"n185984009","loc":[-85.6360524,41.9460485],"version":"3","changeset":"9619138","user":"bbmiller","uid":"451048","visible":"true","timestamp":"2011-10-21T19:45:58Z","tags":{}},"n185988239":{"id":"n185988239","loc":[-85.6358187,41.9460423],"version":"3","changeset":"9619138","user":"bbmiller","uid":"451048","visible":"true","timestamp":"2011-10-21T19:45:59Z","tags":{}},"n185988243":{"id":"n185988243","loc":[-85.6366156,41.9460282],"version":"3","changeset":"9619138","user":"bbmiller","uid":"451048","visible":"true","timestamp":"2011-10-21T19:45:59Z","tags":{}},"n185988244":{"id":"n185988244","loc":[-85.6368316,41.9460046],"version":"3","changeset":"9619138","user":"bbmiller","uid":"451048","visible":"true","timestamp":"2011-10-21T19:45:59Z","tags":{}},"n185988245":{"id":"n185988245","loc":[-85.6370133,41.9459704],"version":"3","changeset":"9619138","user":"bbmiller","uid":"451048","visible":"true","timestamp":"2011-10-21T19:45:59Z","tags":{}},"n185988241":{"id":"n185988241","loc":[-85.636291,41.9460461],"version":"3","changeset":"9619138","user":"bbmiller","uid":"451048","visible":"true","timestamp":"2011-10-21T19:45:59Z","tags":{}},"n185964976":{"id":"n185964976","loc":[-85.633923,41.9434157],"version":"3","changeset":"9619138","user":"bbmiller","uid":"451048","visible":"true","timestamp":"2011-10-21T19:46:00Z","tags":{}},"n185964980":{"id":"n185964980","loc":[-85.6333656,41.9437293],"version":"3","changeset":"9619138","user":"bbmiller","uid":"451048","visible":"true","timestamp":"2011-10-21T19:46:00Z","tags":{}},"n185978388":{"id":"n185978388","loc":[-85.6346449,41.9460571],"version":"3","changeset":"9619138","user":"bbmiller","uid":"451048","visible":"true","timestamp":"2011-10-21T19:46:01Z","tags":{}},"n1819858504":{"id":"n1819858504","loc":[-85.6365343,41.9447926],"version":"1","changeset":"12170230","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:56:54Z","tags":{}},"n1819858506":{"id":"n1819858506","loc":[-85.6370546,41.9451882],"version":"1","changeset":"12170230","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:56:54Z","tags":{}},"n1819858516":{"id":"n1819858516","loc":[-85.6358369,41.9444654],"version":"1","changeset":"12170230","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:56:54Z","tags":{}},"n1819858519":{"id":"n1819858519","loc":[-85.6361534,41.9446176],"version":"1","changeset":"12170230","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:56:54Z","tags":{}},"n1819858525":{"id":"n1819858525","loc":[-85.6368025,41.9449442],"version":"1","changeset":"12170230","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:56:55Z","tags":{}},"n1819858527":{"id":"n1819858527","loc":[-85.6334199,41.9457495],"version":"1","changeset":"12170230","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:56:55Z","tags":{}},"n185963452":{"id":"n185963452","loc":[-85.633564,41.9458519],"version":"3","changeset":"12170230","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:56:56Z","tags":{}},"n185963453":{"id":"n185963453","loc":[-85.6336152,41.9459804],"version":"3","changeset":"12170230","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:56:56Z","tags":{}},"n185963451":{"id":"n185963451","loc":[-85.6332888,41.9456871],"version":"3","changeset":"12170230","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:56:57Z","tags":{}},"n2130304152":{"id":"n2130304152","loc":[-85.6359466,41.9454599],"version":"1","changeset":"14802606","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-01-27T04:50:52Z","tags":{}},"n2130304153":{"id":"n2130304153","loc":[-85.6362773,41.9452683],"version":"1","changeset":"14802606","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-01-27T04:50:52Z","tags":{}},"n2130304154":{"id":"n2130304154","loc":[-85.6352028,41.9442868],"version":"1","changeset":"14802606","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-01-27T04:50:52Z","tags":{}},"n2130304155":{"id":"n2130304155","loc":[-85.6348756,41.9444769],"version":"1","changeset":"14802606","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-01-27T04:50:52Z","tags":{}},"n2130304156":{"id":"n2130304156","loc":[-85.6349723,41.9444207],"version":"1","changeset":"14802606","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-01-27T04:50:52Z","tags":{}},"n2130304157":{"id":"n2130304157","loc":[-85.6338698,41.9434443],"version":"1","changeset":"14802606","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-01-27T04:50:52Z","tags":{}},"n2130304158":{"id":"n2130304158","loc":[-85.635094,41.9451026],"version":"1","changeset":"14802606","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-01-27T04:50:52Z","tags":{}},"n2130304160":{"id":"n2130304160","loc":[-85.6353716,41.9449322],"version":"1","changeset":"14802606","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-01-27T04:50:52Z","tags":{}},"n2130304162":{"id":"n2130304162","loc":[-85.6365942,41.9459352],"version":"1","changeset":"14802606","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-01-27T04:50:52Z","tags":{}},"n2130304163":{"id":"n2130304163","loc":[-85.6369006,41.9457469],"version":"1","changeset":"14802606","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-01-27T04:50:52Z","tags":{}},"n2130304164":{"id":"n2130304164","loc":[-85.6363292,41.9452278],"version":"1","changeset":"14802606","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-01-27T04:50:52Z","tags":{}},"n2130304165":{"id":"n2130304165","loc":[-85.6360248,41.9454175],"version":"1","changeset":"14802606","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-01-27T04:50:52Z","tags":{}},"n2139824683":{"id":"n2139824683","loc":[-85.6339825,41.9446441],"version":"1","changeset":"14892598","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T08:37:01Z","tags":{}},"n2139824689":{"id":"n2139824689","loc":[-85.6340437,41.9446925],"version":"1","changeset":"14892598","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T08:37:01Z","tags":{}},"n2139824702":{"id":"n2139824702","loc":[-85.6340961,41.9447551],"version":"1","changeset":"14892598","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T08:37:02Z","tags":{}},"n2139824705":{"id":"n2139824705","loc":[-85.6337467,41.944809],"version":"1","changeset":"14892598","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T08:37:02Z","tags":{}},"n2139824707":{"id":"n2139824707","loc":[-85.6341598,41.9448129],"version":"1","changeset":"14892598","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T08:37:02Z","tags":{}},"n2139824710":{"id":"n2139824710","loc":[-85.6342771,41.9448223],"version":"1","changeset":"14892598","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T08:37:02Z","tags":{}},"n2139824712":{"id":"n2139824712","loc":[-85.6346058,41.944841],"version":"1","changeset":"14892598","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T08:37:02Z","tags":{}},"n2139824713":{"id":"n2139824713","loc":[-85.633808,41.9448574],"version":"1","changeset":"14892598","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T08:37:02Z","tags":{}},"n2139824714":{"id":"n2139824714","loc":[-85.6340889,41.9448589],"version":"1","changeset":"14892598","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T08:37:02Z","tags":{}},"n2139824716":{"id":"n2139824716","loc":[-85.6343335,41.944871],"version":"1","changeset":"14892598","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T08:37:02Z","tags":{}},"n2139824717":{"id":"n2139824717","loc":[-85.6343341,41.9448717],"version":"1","changeset":"14892598","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T08:37:02Z","tags":{}},"n2139824720":{"id":"n2139824720","loc":[-85.6338757,41.9449069],"version":"1","changeset":"14892598","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T08:37:02Z","tags":{}},"n2139824721":{"id":"n2139824721","loc":[-85.6341445,41.9449071],"version":"1","changeset":"14892598","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T08:37:02Z","tags":{}},"n2139824724":{"id":"n2139824724","loc":[-85.6334787,41.9449262],"version":"1","changeset":"14892598","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T08:37:02Z","tags":{}},"n2139824726":{"id":"n2139824726","loc":[-85.6347119,41.9449332],"version":"1","changeset":"14892598","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T08:37:02Z","tags":{}},"n2139824727":{"id":"n2139824727","loc":[-85.6347175,41.9449418],"version":"1","changeset":"14892598","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T08:37:02Z","tags":{}},"n2139824728":{"id":"n2139824728","loc":[-85.6344284,41.9449538],"version":"1","changeset":"14892598","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T08:37:02Z","tags":{}},"n2139824729":{"id":"n2139824729","loc":[-85.6339339,41.9449573],"version":"1","changeset":"14892598","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T08:37:02Z","tags":{}},"n2139824730":{"id":"n2139824730","loc":[-85.6339179,41.9449682],"version":"1","changeset":"14892598","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T08:37:02Z","tags":{}},"n2139824732":{"id":"n2139824732","loc":[-85.6335472,41.9449895],"version":"1","changeset":"14892598","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T08:37:02Z","tags":{}},"n2139824733":{"id":"n2139824733","loc":[-85.6339736,41.9450164],"version":"1","changeset":"14892598","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T08:37:02Z","tags":{}},"n2139824735":{"id":"n2139824735","loc":[-85.6336034,41.9450415],"version":"1","changeset":"14892598","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T08:37:02Z","tags":{}},"n2139824736":{"id":"n2139824736","loc":[-85.6348317,41.945043],"version":"1","changeset":"14892598","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T08:37:02Z","tags":{}},"n2139824737":{"id":"n2139824737","loc":[-85.63403,41.9450651],"version":"1","changeset":"14892598","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T08:37:02Z","tags":{}},"n2139824738":{"id":"n2139824738","loc":[-85.6336611,41.9450949],"version":"1","changeset":"14892598","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T08:37:02Z","tags":{}},"n2139824740":{"id":"n2139824740","loc":[-85.6336582,41.9450966],"version":"1","changeset":"14892598","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T08:37:02Z","tags":{}},"n2139824744":{"id":"n2139824744","loc":[-85.6331702,41.9451107],"version":"1","changeset":"14892598","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T08:37:02Z","tags":{}},"n2139824745":{"id":"n2139824745","loc":[-85.6333388,41.9451142],"version":"1","changeset":"14892598","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T08:37:02Z","tags":{}},"n2139824746":{"id":"n2139824746","loc":[-85.6337131,41.9451341],"version":"1","changeset":"14892598","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T08:37:02Z","tags":{}},"n2139824747":{"id":"n2139824747","loc":[-85.6337021,41.9451372],"version":"1","changeset":"14892598","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T08:37:02Z","tags":{}},"n2139824748":{"id":"n2139824748","loc":[-85.6341244,41.9451472],"version":"1","changeset":"14892598","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T08:37:02Z","tags":{}},"n2139824749":{"id":"n2139824749","loc":[-85.6333952,41.945166],"version":"1","changeset":"14892598","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T08:37:02Z","tags":{}},"n2139824750":{"id":"n2139824750","loc":[-85.633395,41.9451661],"version":"1","changeset":"14892598","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T08:37:03Z","tags":{}},"n2139824751":{"id":"n2139824751","loc":[-85.6346258,41.9451725],"version":"1","changeset":"14892598","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T08:37:03Z","tags":{}},"n2139824752":{"id":"n2139824752","loc":[-85.6332387,41.9451741],"version":"1","changeset":"14892598","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T08:37:03Z","tags":{}},"n2139824753":{"id":"n2139824753","loc":[-85.6346901,41.9451853],"version":"1","changeset":"14892598","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T08:37:03Z","tags":{}},"n2139824754":{"id":"n2139824754","loc":[-85.6346611,41.9452035],"version":"1","changeset":"14892598","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T08:37:03Z","tags":{}},"n2139824755":{"id":"n2139824755","loc":[-85.6346574,41.9452059],"version":"1","changeset":"14892598","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T08:37:03Z","tags":{}},"n2139824756":{"id":"n2139824756","loc":[-85.6345611,41.9452133],"version":"1","changeset":"14892598","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T08:37:03Z","tags":{}},"n2139824757":{"id":"n2139824757","loc":[-85.633453,41.9452194],"version":"1","changeset":"14892598","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T08:37:03Z","tags":{}},"n2139824758":{"id":"n2139824758","loc":[-85.6335508,41.9452283],"version":"1","changeset":"14892598","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T08:37:03Z","tags":{}},"n2139824759":{"id":"n2139824759","loc":[-85.6347424,41.9452312],"version":"1","changeset":"14892598","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T08:37:03Z","tags":{}},"n2139824760":{"id":"n2139824760","loc":[-85.6342305,41.9452395],"version":"1","changeset":"14892598","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T08:37:03Z","tags":{}},"n2139824761":{"id":"n2139824761","loc":[-85.6342319,41.9452449],"version":"1","changeset":"14892598","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T08:37:03Z","tags":{}},"n2139824762":{"id":"n2139824762","loc":[-85.6334969,41.94526],"version":"1","changeset":"14892598","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T08:37:03Z","tags":{}},"n2139824763":{"id":"n2139824763","loc":[-85.63468,41.9452706],"version":"1","changeset":"14892598","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T08:37:03Z","tags":{}},"n2139824764":{"id":"n2139824764","loc":[-85.6346772,41.9452724],"version":"1","changeset":"14892598","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T08:37:03Z","tags":{}},"n2139824765":{"id":"n2139824765","loc":[-85.6338611,41.9452763],"version":"1","changeset":"14892598","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T08:37:03Z","tags":{}},"n2139824766":{"id":"n2139824766","loc":[-85.6347811,41.9452939],"version":"1","changeset":"14892598","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T08:37:03Z","tags":{}},"n2139824767":{"id":"n2139824767","loc":[-85.6347375,41.9453211],"version":"1","changeset":"14892598","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T08:37:03Z","tags":{}},"n2139824768":{"id":"n2139824768","loc":[-85.6339171,41.9453301],"version":"1","changeset":"14892598","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T08:37:03Z","tags":{}},"n2139824769":{"id":"n2139824769","loc":[-85.6348307,41.9453377],"version":"1","changeset":"14892598","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T08:37:03Z","tags":{}},"n2139824770":{"id":"n2139824770","loc":[-85.6347067,41.9453405],"version":"1","changeset":"14892598","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T08:37:03Z","tags":{}},"n2139824771":{"id":"n2139824771","loc":[-85.6343461,41.9453461],"version":"1","changeset":"14892598","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T08:37:03Z","tags":{}},"n2139824772":{"id":"n2139824772","loc":[-85.6343481,41.9453475],"version":"1","changeset":"14892598","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T08:37:03Z","tags":{}},"n2139824773":{"id":"n2139824773","loc":[-85.634805,41.9453538],"version":"1","changeset":"14892598","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T08:37:03Z","tags":{}},"n2139824774":{"id":"n2139824774","loc":[-85.6336997,41.9453692],"version":"1","changeset":"14892598","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T08:37:03Z","tags":{}},"n2139824775":{"id":"n2139824775","loc":[-85.6339709,41.9453818],"version":"1","changeset":"14892598","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T08:37:03Z","tags":{}},"n2139824776":{"id":"n2139824776","loc":[-85.6336229,41.9454134],"version":"1","changeset":"14892598","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T08:37:03Z","tags":{}},"n2139824777":{"id":"n2139824777","loc":[-85.6349022,41.9454141],"version":"1","changeset":"14892598","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T08:37:03Z","tags":{}},"n2139824778":{"id":"n2139824778","loc":[-85.6348854,41.9454246],"version":"1","changeset":"14892598","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T08:37:03Z","tags":{}},"n2139824779":{"id":"n2139824779","loc":[-85.6340286,41.9454373],"version":"1","changeset":"14892598","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T08:37:03Z","tags":{}},"n2139824780":{"id":"n2139824780","loc":[-85.6336963,41.9454572],"version":"1","changeset":"14892598","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T08:37:03Z","tags":{}},"n2139824781":{"id":"n2139824781","loc":[-85.6336789,41.9454672],"version":"1","changeset":"14892598","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T08:37:03Z","tags":{}},"n2139824782":{"id":"n2139824782","loc":[-85.6344933,41.945475],"version":"1","changeset":"14892598","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T08:37:03Z","tags":{}},"n2139824783":{"id":"n2139824783","loc":[-85.6340854,41.9454918],"version":"1","changeset":"14892598","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T08:37:03Z","tags":{}},"n2139824784":{"id":"n2139824784","loc":[-85.6350036,41.9455034],"version":"1","changeset":"14892598","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T08:37:03Z","tags":{}},"n2139824785":{"id":"n2139824785","loc":[-85.6337501,41.9455089],"version":"1","changeset":"14892598","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T08:37:03Z","tags":{}},"n2139824786":{"id":"n2139824786","loc":[-85.6337497,41.9455091],"version":"1","changeset":"14892598","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T08:37:03Z","tags":{}},"n2139824787":{"id":"n2139824787","loc":[-85.6345425,41.9455186],"version":"1","changeset":"14892598","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T08:37:03Z","tags":{}},"n2139824788":{"id":"n2139824788","loc":[-85.6341459,41.9455372],"version":"1","changeset":"14892598","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T08:37:03Z","tags":{}},"n2139824789":{"id":"n2139824789","loc":[-85.6341376,41.945542],"version":"1","changeset":"14892598","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T08:37:03Z","tags":{}},"n2139824790":{"id":"n2139824790","loc":[-85.6338394,41.9455462],"version":"1","changeset":"14892598","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T08:37:03Z","tags":{}},"n2139824791":{"id":"n2139824791","loc":[-85.6349171,41.9455588],"version":"1","changeset":"14892598","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T08:37:03Z","tags":{}},"n2139824792":{"id":"n2139824792","loc":[-85.6338074,41.9455646],"version":"1","changeset":"14892598","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T08:37:03Z","tags":{}},"n2139824793":{"id":"n2139824793","loc":[-85.6346229,41.9455894],"version":"1","changeset":"14892598","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T08:37:03Z","tags":{}},"n2139824794":{"id":"n2139824794","loc":[-85.6338983,41.9455995],"version":"1","changeset":"14892598","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T08:37:03Z","tags":{}},"n2139824795":{"id":"n2139824795","loc":[-85.6338962,41.9456007],"version":"1","changeset":"14892598","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T08:37:03Z","tags":{}},"n2139824796":{"id":"n2139824796","loc":[-85.6342475,41.9456348],"version":"1","changeset":"14892598","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T08:37:03Z","tags":{}},"n2139824797":{"id":"n2139824797","loc":[-85.6339505,41.9456497],"version":"1","changeset":"14892598","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T08:37:03Z","tags":{}},"n2139824798":{"id":"n2139824798","loc":[-85.6347243,41.9456788],"version":"1","changeset":"14892598","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T08:37:03Z","tags":{}},"n2139824799":{"id":"n2139824799","loc":[-85.635057,41.9456831],"version":"1","changeset":"14892598","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T08:37:03Z","tags":{}},"n2139824800":{"id":"n2139824800","loc":[-85.635287,41.9457056],"version":"1","changeset":"14892598","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T08:37:03Z","tags":{}},"n2139824801":{"id":"n2139824801","loc":[-85.6350753,41.9457068],"version":"1","changeset":"14892598","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T08:37:03Z","tags":{}},"n2139824802":{"id":"n2139824802","loc":[-85.6347753,41.9457252],"version":"1","changeset":"14892598","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T08:37:04Z","tags":{}},"n2139824803":{"id":"n2139824803","loc":[-85.6340521,41.9457473],"version":"1","changeset":"14892598","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T08:37:04Z","tags":{}},"n2139824804":{"id":"n2139824804","loc":[-85.6352875,41.9457611],"version":"1","changeset":"14892598","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T08:37:04Z","tags":{}},"n2139824805":{"id":"n2139824805","loc":[-85.6352941,41.9457611],"version":"1","changeset":"14892598","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T08:37:04Z","tags":{}},"n2139824806":{"id":"n2139824806","loc":[-85.6350758,41.9457623],"version":"1","changeset":"14892598","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T08:37:04Z","tags":{}},"n2139824807":{"id":"n2139824807","loc":[-85.6348194,41.9457638],"version":"1","changeset":"14892598","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T08:37:04Z","tags":{}},"n2139824808":{"id":"n2139824808","loc":[-85.635296,41.9459428],"version":"1","changeset":"14892598","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T08:37:04Z","tags":{}},"n2139824809":{"id":"n2139824809","loc":[-85.6348212,41.9459455],"version":"1","changeset":"14892598","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T08:37:04Z","tags":{}},"n2139832635":{"id":"n2139832635","loc":[-85.6354612,41.9448791],"version":"1","changeset":"14892737","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T08:51:49Z","tags":{}},"n2139832636":{"id":"n2139832636","loc":[-85.6360241,41.9453844],"version":"1","changeset":"14892737","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T08:51:49Z","tags":{}},"n2139832637":{"id":"n2139832637","loc":[-85.6361452,41.9453121],"version":"1","changeset":"14892737","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T08:51:49Z","tags":{}},"n2139832639":{"id":"n2139832639","loc":[-85.6355997,41.944797],"version":"1","changeset":"14892737","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T08:51:49Z","tags":{}},"n2139832641":{"id":"n2139832641","loc":[-85.6351346,41.9443541],"version":"1","changeset":"14892737","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T08:51:49Z","tags":{}},"n2139832647":{"id":"n2139832647","loc":[-85.6329883,41.9453692],"version":"1","changeset":"14892737","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T08:51:49Z","tags":{}},"n2139832653":{"id":"n2139832653","loc":[-85.6333643,41.9456293],"version":"1","changeset":"14892737","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T08:51:49Z","tags":{}},"n2139832663":{"id":"n2139832663","loc":[-85.6335394,41.9455339],"version":"1","changeset":"14892737","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T08:51:49Z","tags":{}},"n2139832665":{"id":"n2139832665","loc":[-85.6332375,41.9452476],"version":"1","changeset":"14892737","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T08:51:49Z","tags":{}},"n2139832667":{"id":"n2139832667","loc":[-85.6331664,41.9452161],"version":"1","changeset":"14892737","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T08:51:49Z","tags":{}},"n2139832669":{"id":"n2139832669","loc":[-85.6331144,41.9451875],"version":"1","changeset":"14892737","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T08:51:49Z","tags":{}},"n2139832671":{"id":"n2139832671","loc":[-85.6330779,41.9451274],"version":"1","changeset":"14892737","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T08:51:49Z","tags":{}},"n2139832673":{"id":"n2139832673","loc":[-85.6330664,41.9450802],"version":"1","changeset":"14892737","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T08:51:49Z","tags":{}},"n2139832678":{"id":"n2139832678","loc":[-85.6332218,41.9453585],"version":"1","changeset":"14892737","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T08:51:49Z","tags":{}},"n2139832686":{"id":"n2139832686","loc":[-85.6334246,41.945541],"version":"1","changeset":"14892737","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T08:51:49Z","tags":{}},"n2139832691":{"id":"n2139832691","loc":[-85.6329898,41.9454997],"version":"1","changeset":"14892737","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T08:51:49Z","tags":{}},"n2139832693":{"id":"n2139832693","loc":[-85.6343554,41.9443274],"version":"1","changeset":"14892737","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T08:51:49Z","tags":{}},"n2139832694":{"id":"n2139832694","loc":[-85.6336339,41.9437089],"version":"1","changeset":"14892737","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T08:51:49Z","tags":{}},"n2139832696":{"id":"n2139832696","loc":[-85.633532,41.9437708],"version":"1","changeset":"14892737","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T08:51:49Z","tags":{}},"n2139832697":{"id":"n2139832697","loc":[-85.6338316,41.9440868],"version":"1","changeset":"14892737","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T08:51:49Z","tags":{}},"n2139832698":{"id":"n2139832698","loc":[-85.6342258,41.9444141],"version":"1","changeset":"14892737","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T08:51:49Z","tags":{}},"n2139832699":{"id":"n2139832699","loc":[-85.6339164,41.9442166],"version":"1","changeset":"14892737","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T08:51:49Z","tags":{}},"n2139832700":{"id":"n2139832700","loc":[-85.6341389,41.944384],"version":"1","changeset":"14892737","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T08:51:49Z","tags":{}},"n2139832701":{"id":"n2139832701","loc":[-85.634235,41.9443259],"version":"1","changeset":"14892737","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T08:51:49Z","tags":{}},"n2139832702":{"id":"n2139832702","loc":[-85.633613,41.9437875],"version":"1","changeset":"14892737","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T08:51:49Z","tags":{}},"n2139832703":{"id":"n2139832703","loc":[-85.633915,41.9436132],"version":"1","changeset":"14892737","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T08:51:49Z","tags":{}},"n2139832704":{"id":"n2139832704","loc":[-85.6340019,41.9435613],"version":"1","changeset":"14892737","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T08:51:49Z","tags":{}},"n2139832706":{"id":"n2139832706","loc":[-85.6343197,41.9438427],"version":"1","changeset":"14892737","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T08:51:49Z","tags":{}},"n2139832708":{"id":"n2139832708","loc":[-85.6342361,41.9438936],"version":"1","changeset":"14892737","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T08:51:49Z","tags":{}},"n2139832709":{"id":"n2139832709","loc":[-85.6353839,41.9460401],"version":"1","changeset":"14892737","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T08:51:49Z","tags":{}},"n2139832710":{"id":"n2139832710","loc":[-85.6354032,41.9456763],"version":"1","changeset":"14892737","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T08:51:49Z","tags":{}},"n2139832711":{"id":"n2139832711","loc":[-85.6356839,41.9459252],"version":"1","changeset":"14892737","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T08:51:49Z","tags":{}},"n2139832712":{"id":"n2139832712","loc":[-85.6356109,41.945735],"version":"1","changeset":"14892737","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T08:51:49Z","tags":{}},"n2139832713":{"id":"n2139832713","loc":[-85.6353997,41.9457421],"version":"1","changeset":"14892737","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T08:51:49Z","tags":{}},"n2139832714":{"id":"n2139832714","loc":[-85.6353895,41.9459347],"version":"1","changeset":"14892737","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T08:51:49Z","tags":{}},"n2139832715":{"id":"n2139832715","loc":[-85.6334777,41.9436628],"version":"1","changeset":"14892737","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T08:51:49Z","tags":{}},"n2139832716":{"id":"n2139832716","loc":[-85.6333137,41.9435382],"version":"1","changeset":"14892737","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T08:51:49Z","tags":{}},"n2139832717":{"id":"n2139832717","loc":[-85.6330938,41.9435406],"version":"1","changeset":"14892737","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T08:51:50Z","tags":{}},"n2139832721":{"id":"n2139832721","loc":[-85.6333023,41.9434922],"version":"1","changeset":"14892737","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T08:51:50Z","tags":{}},"n2139832722":{"id":"n2139832722","loc":[-85.6330466,41.943623],"version":"1","changeset":"14892737","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T08:51:50Z","tags":{}},"n2139832723":{"id":"n2139832723","loc":[-85.6332746,41.9435624],"version":"1","changeset":"14892737","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T08:51:50Z","tags":{}},"n2139832724":{"id":"n2139832724","loc":[-85.6333511,41.9435176],"version":"1","changeset":"14892737","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T08:51:50Z","tags":{}},"n2139832725":{"id":"n2139832725","loc":[-85.6332241,41.9434001],"version":"1","changeset":"14892737","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T08:51:50Z","tags":{}},"n2139832726":{"id":"n2139832726","loc":[-85.6332355,41.9433686],"version":"1","changeset":"14892737","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T08:51:50Z","tags":{}},"n2139870373":{"id":"n2139870373","loc":[-85.6351783,41.9439117],"version":"1","changeset":"14893310","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:47:00Z","tags":{}},"n2139870374":{"id":"n2139870374","loc":[-85.6351431,41.9439217],"version":"1","changeset":"14893310","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:47:00Z","tags":{}},"n2139870375":{"id":"n2139870375","loc":[-85.6348853,41.9439117],"version":"1","changeset":"14893310","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:47:00Z","tags":{}},"n2139870376":{"id":"n2139870376","loc":[-85.6348317,41.9439105],"version":"1","changeset":"14893310","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:47:00Z","tags":{}},"n2139870377":{"id":"n2139870377","loc":[-85.6346384,41.944007],"version":"1","changeset":"14893310","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:47:00Z","tags":{}},"n2139870378":{"id":"n2139870378","loc":[-85.6345563,41.9440523],"version":"1","changeset":"14893310","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:47:00Z","tags":{}},"n2140006403":{"id":"n2140006403","loc":[-85.6359942,41.9450097],"version":"1","changeset":"14895132","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T12:19:24Z","tags":{}},"n2140006405":{"id":"n2140006405","loc":[-85.6363884,41.9446079],"version":"1","changeset":"14895132","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T12:19:24Z","tags":{}},"n2140006407":{"id":"n2140006407","loc":[-85.6362148,41.9447874],"version":"1","changeset":"14895132","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T12:19:24Z","tags":{}},"n2140006409":{"id":"n2140006409","loc":[-85.6379476,41.9445869],"version":"1","changeset":"14895132","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T12:19:24Z","tags":{}},"n2140006411":{"id":"n2140006411","loc":[-85.6378485,41.9445674],"version":"1","changeset":"14895132","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T12:19:24Z","tags":{}},"n2140006413":{"id":"n2140006413","loc":[-85.6378952,41.9444547],"version":"1","changeset":"14895132","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T12:19:24Z","tags":{}},"n2140006415":{"id":"n2140006415","loc":[-85.6379962,41.944477],"version":"1","changeset":"14895132","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T12:19:24Z","tags":{}},"n2140006421":{"id":"n2140006421","loc":[-85.6355248,41.9433702],"version":"1","changeset":"14895132","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T12:19:24Z","tags":{}},"n2140006423":{"id":"n2140006423","loc":[-85.6378471,41.9439233],"version":"1","changeset":"14895132","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T12:19:25Z","tags":{}},"n2140006425":{"id":"n2140006425","loc":[-85.6378913,41.9441238],"version":"1","changeset":"14895132","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T12:19:25Z","tags":{}},"n2140006426":{"id":"n2140006426","loc":[-85.6381674,41.9442289],"version":"1","changeset":"14895132","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T12:19:25Z","tags":{}},"n2140006427":{"id":"n2140006427","loc":[-85.6382359,41.9440975],"version":"1","changeset":"14895132","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T12:19:25Z","tags":{}},"n2140006428":{"id":"n2140006428","loc":[-85.6382071,41.9440252],"version":"1","changeset":"14895132","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T12:19:25Z","tags":{}},"n2140006429":{"id":"n2140006429","loc":[-85.6381409,41.9439973],"version":"1","changeset":"14895132","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T12:19:25Z","tags":{}},"n2140006430":{"id":"n2140006430","loc":[-85.6380569,41.9440153],"version":"1","changeset":"14895132","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T12:19:25Z","tags":{}},"n2140006433":{"id":"n2140006433","loc":[-85.6379071,41.9442467],"version":"1","changeset":"14895132","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T12:19:25Z","tags":{}},"n2140006435":{"id":"n2140006435","loc":[-85.6381634,41.9443125],"version":"1","changeset":"14895132","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T12:19:25Z","tags":{}},"n2140006436":{"id":"n2140006436","loc":[-85.6382407,41.944301],"version":"1","changeset":"14895132","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T12:19:25Z","tags":{}},"n2140006438":{"id":"n2140006438","loc":[-85.6382761,41.9442188],"version":"1","changeset":"14895132","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T12:19:25Z","tags":{}},"n2140006439":{"id":"n2140006439","loc":[-85.6382429,41.9441761],"version":"1","changeset":"14895132","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T12:19:25Z","tags":{}},"n2140006440":{"id":"n2140006440","loc":[-85.6382016,41.9441632],"version":"1","changeset":"14895132","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T12:19:25Z","tags":{}},"n2140006441":{"id":"n2140006441","loc":[-85.6378185,41.9439835],"version":"1","changeset":"14895132","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T12:19:25Z","tags":{}},"n2166205688":{"id":"n2166205688","loc":[-85.6349963,41.9444392],"version":"1","changeset":"15117845","user":"rolandg","uid":"8703","visible":"true","timestamp":"2013-02-21T23:02:38Z","tags":{}},"n2168544780":{"id":"n2168544780","loc":[-85.633944,41.945807],"version":"1","changeset":"15132216","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-23T08:37:02Z","tags":{}},"n2168544781":{"id":"n2168544781","loc":[-85.6340783,41.9458621],"version":"1","changeset":"15132216","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-23T08:37:02Z","tags":{}},"n2168544782":{"id":"n2168544782","loc":[-85.6338184,41.9457548],"version":"1","changeset":"15132216","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-23T08:37:02Z","tags":{}},"n2168544783":{"id":"n2168544783","loc":[-85.6339925,41.9459777],"version":"1","changeset":"15132216","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-23T08:37:02Z","tags":{}},"n2168544784":{"id":"n2168544784","loc":[-85.6337317,41.9458698],"version":"1","changeset":"15132216","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-23T08:37:02Z","tags":{}},"n2168544785":{"id":"n2168544785","loc":[-85.6337297,41.9460042],"version":"1","changeset":"15132216","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-23T08:37:02Z","tags":{}},"n2168544786":{"id":"n2168544786","loc":[-85.633919,41.9460797],"version":"1","changeset":"15132216","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-23T08:37:02Z","tags":{}},"n2168544787":{"id":"n2168544787","loc":[-85.6338672,41.9459263],"version":"1","changeset":"15132216","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-23T08:37:02Z","tags":{}},"n2168544788":{"id":"n2168544788","loc":[-85.6338246,41.9459853],"version":"1","changeset":"15132216","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-23T08:37:02Z","tags":{}},"n2168544789":{"id":"n2168544789","loc":[-85.6337615,41.9459601],"version":"1","changeset":"15132216","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-23T08:37:02Z","tags":{}},"n2168544790":{"id":"n2168544790","loc":[-85.6342079,41.9460399],"version":"1","changeset":"15132216","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-23T08:37:02Z","tags":{}},"n2168544791":{"id":"n2168544791","loc":[-85.6343346,41.9458503],"version":"1","changeset":"15132216","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-23T08:37:02Z","tags":{}},"n2168544792":{"id":"n2168544792","loc":[-85.6343759,41.9458116],"version":"1","changeset":"15132216","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-23T08:37:02Z","tags":{}},"n2168544793":{"id":"n2168544793","loc":[-85.6344394,41.9458109],"version":"1","changeset":"15132216","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-23T08:37:02Z","tags":{}},"n2168544795":{"id":"n2168544795","loc":[-85.6344827,41.945851],"version":"1","changeset":"15132216","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-23T08:37:02Z","tags":{}},"n2168544797":{"id":"n2168544797","loc":[-85.6344807,41.945969],"version":"1","changeset":"15132216","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-23T08:37:02Z","tags":{}},"n2168544798":{"id":"n2168544798","loc":[-85.6344404,41.9459697],"version":"1","changeset":"15132216","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-23T08:37:02Z","tags":{}},"n2168544799":{"id":"n2168544799","loc":[-85.6344413,41.9460333],"version":"1","changeset":"15132216","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-23T08:37:02Z","tags":{}},"n2168544800":{"id":"n2168544800","loc":[-85.6342173,41.9460705],"version":"1","changeset":"15132216","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-23T08:37:02Z","tags":{}},"n2168544801":{"id":"n2168544801","loc":[-85.6342162,41.9460392],"version":"1","changeset":"15132216","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-23T08:37:02Z","tags":{}},"n2168544802":{"id":"n2168544802","loc":[-85.6344251,41.9460351],"version":"1","changeset":"15132216","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-23T08:37:02Z","tags":{}},"n2168544805":{"id":"n2168544805","loc":[-85.6344257,41.9460507],"version":"1","changeset":"15132216","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-23T08:37:02Z","tags":{}},"n2168544807":{"id":"n2168544807","loc":[-85.6344721,41.9460498],"version":"1","changeset":"15132216","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-23T08:37:02Z","tags":{}},"n2168544809":{"id":"n2168544809","loc":[-85.6344754,41.9461427],"version":"1","changeset":"15132216","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-23T08:37:02Z","tags":{}},"n2168544811":{"id":"n2168544811","loc":[-85.6344311,41.9461435],"version":"1","changeset":"15132216","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-23T08:37:02Z","tags":{}},"n2168544813":{"id":"n2168544813","loc":[-85.6344317,41.9461592],"version":"1","changeset":"15132216","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-23T08:37:02Z","tags":{}},"n2168544815":{"id":"n2168544815","loc":[-85.6343708,41.9461604],"version":"1","changeset":"15132216","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-23T08:37:02Z","tags":{}},"n2168544817":{"id":"n2168544817","loc":[-85.6343715,41.9461786],"version":"1","changeset":"15132216","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-23T08:37:02Z","tags":{}},"n2168544819":{"id":"n2168544819","loc":[-85.6343229,41.9461795],"version":"1","changeset":"15132216","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-23T08:37:02Z","tags":{}},"n2168544821":{"id":"n2168544821","loc":[-85.6343222,41.9461606],"version":"1","changeset":"15132216","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-23T08:37:02Z","tags":{}},"n2168544823":{"id":"n2168544823","loc":[-85.6342476,41.9461621],"version":"1","changeset":"15132216","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-23T08:37:03Z","tags":{}},"n2168544825":{"id":"n2168544825","loc":[-85.6342444,41.94607],"version":"1","changeset":"15132216","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-23T08:37:03Z","tags":{}},"n2168544827":{"id":"n2168544827","loc":[-85.634138,41.9461632],"version":"1","changeset":"15132216","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-23T08:37:03Z","tags":{}},"n2168544829":{"id":"n2168544829","loc":[-85.6342016,41.9460703],"version":"1","changeset":"15132216","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-23T08:37:03Z","tags":{}},"n2168544830":{"id":"n2168544830","loc":[-85.6332929,41.9463092],"version":"1","changeset":"15132216","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-23T08:37:03Z","tags":{}},"n2168544831":{"id":"n2168544831","loc":[-85.633122,41.946239],"version":"1","changeset":"15132216","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-23T08:37:03Z","tags":{}},"n2168544832":{"id":"n2168544832","loc":[-85.6332954,41.9460055],"version":"1","changeset":"15132216","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-23T08:37:03Z","tags":{}},"n2168544833":{"id":"n2168544833","loc":[-85.6333954,41.9460466],"version":"1","changeset":"15132216","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-23T08:37:03Z","tags":{}},"n2168544834":{"id":"n2168544834","loc":[-85.6334044,41.9460345],"version":"1","changeset":"15132216","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-23T08:37:03Z","tags":{}},"n2168544835":{"id":"n2168544835","loc":[-85.6334594,41.9460571],"version":"1","changeset":"15132216","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-23T08:37:03Z","tags":{}},"n2168544836":{"id":"n2168544836","loc":[-85.6333871,41.9461544],"version":"1","changeset":"15132216","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-23T08:37:03Z","tags":{}},"n2168544837":{"id":"n2168544837","loc":[-85.633403,41.9461609],"version":"1","changeset":"15132216","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-23T08:37:03Z","tags":{}},"n2168544838":{"id":"n2168544838","loc":[-85.6341683,41.9464167],"version":"1","changeset":"15132216","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-23T08:37:03Z","tags":{}},"n2168544839":{"id":"n2168544839","loc":[-85.6341711,41.9463411],"version":"1","changeset":"15132216","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-23T08:37:03Z","tags":{}},"n2168544840":{"id":"n2168544840","loc":[-85.6344471,41.9463469],"version":"1","changeset":"15132216","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-23T08:37:03Z","tags":{}},"n2168544841":{"id":"n2168544841","loc":[-85.6344441,41.9464243],"version":"1","changeset":"15132216","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-23T08:37:03Z","tags":{}},"n2168544842":{"id":"n2168544842","loc":[-85.6343622,41.9464226],"version":"1","changeset":"15132216","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-23T08:37:03Z","tags":{}},"n2168544843":{"id":"n2168544843","loc":[-85.6343593,41.9464989],"version":"1","changeset":"15132216","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-23T08:37:03Z","tags":{}},"n2168544844":{"id":"n2168544844","loc":[-85.6342812,41.9464973],"version":"1","changeset":"15132216","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-23T08:37:03Z","tags":{}},"n2168544845":{"id":"n2168544845","loc":[-85.634283,41.9464504],"version":"1","changeset":"15132216","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-23T08:37:03Z","tags":{}},"n2168544846":{"id":"n2168544846","loc":[-85.6342609,41.9464499],"version":"1","changeset":"15132216","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-23T08:37:03Z","tags":{}},"n2168544847":{"id":"n2168544847","loc":[-85.6342621,41.9464187],"version":"1","changeset":"15132216","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-23T08:37:03Z","tags":{}},"n2168544848":{"id":"n2168544848","loc":[-85.6348414,41.9463396],"version":"1","changeset":"15132216","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-23T08:37:03Z","tags":{}},"n2168544849":{"id":"n2168544849","loc":[-85.6348387,41.9461872],"version":"1","changeset":"15132216","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-23T08:37:03Z","tags":{}},"n2168544850":{"id":"n2168544850","loc":[-85.6351186,41.9461844],"version":"1","changeset":"15132216","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-23T08:37:03Z","tags":{}},"n2168544851":{"id":"n2168544851","loc":[-85.635119,41.9462112],"version":"1","changeset":"15132216","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-23T08:37:03Z","tags":{}},"n2168544852":{"id":"n2168544852","loc":[-85.6351918,41.9462104],"version":"1","changeset":"15132216","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-23T08:37:03Z","tags":{}},"n2168544853":{"id":"n2168544853","loc":[-85.6351944,41.9463515],"version":"1","changeset":"15132216","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-23T08:37:03Z","tags":{}},"n2168544854":{"id":"n2168544854","loc":[-85.6351049,41.9463524],"version":"1","changeset":"15132216","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-23T08:37:03Z","tags":{}},"n2168544855":{"id":"n2168544855","loc":[-85.6351046,41.946337],"version":"1","changeset":"15132216","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-23T08:37:03Z","tags":{}},"n2189153180":{"id":"n2189153180","loc":[-85.6340369,41.9469572],"version":"1","changeset":"15277317","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-07T00:30:10Z","tags":{}},"n2189153181":{"id":"n2189153181","loc":[-85.6342531,41.946953],"version":"1","changeset":"15277317","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-07T00:30:10Z","tags":{}},"n2189153183":{"id":"n2189153183","loc":[-85.6348115,41.9465468],"version":"1","changeset":"15277317","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-07T00:30:10Z","tags":{}},"n2189153184":{"id":"n2189153184","loc":[-85.6348105,41.9464569],"version":"1","changeset":"15277317","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-07T00:30:10Z","tags":{}},"n2189153185":{"id":"n2189153185","loc":[-85.6351431,41.9464549],"version":"1","changeset":"15277317","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-07T00:30:10Z","tags":{}},"n2189153186":{"id":"n2189153186","loc":[-85.6351441,41.9465448],"version":"1","changeset":"15277317","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-07T00:30:10Z","tags":{}},"n2189153187":{"id":"n2189153187","loc":[-85.6350077,41.9465456],"version":"1","changeset":"15277317","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-07T00:30:10Z","tags":{}},"n2189153188":{"id":"n2189153188","loc":[-85.635008,41.9465721],"version":"1","changeset":"15277317","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-07T00:30:10Z","tags":{}},"n2189153189":{"id":"n2189153189","loc":[-85.6348965,41.9465727],"version":"1","changeset":"15277317","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-07T00:30:10Z","tags":{}},"n2189153190":{"id":"n2189153190","loc":[-85.6348962,41.9465463],"version":"1","changeset":"15277317","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-07T00:30:10Z","tags":{}},"n2189153191":{"id":"n2189153191","loc":[-85.6348963,41.9471586],"version":"1","changeset":"15277317","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-07T00:30:10Z","tags":{}},"n2189153192":{"id":"n2189153192","loc":[-85.6348944,41.947032],"version":"1","changeset":"15277317","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-07T00:30:10Z","tags":{}},"n2189153193":{"id":"n2189153193","loc":[-85.6350241,41.947031],"version":"1","changeset":"15277317","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-07T00:30:10Z","tags":{}},"n2189153194":{"id":"n2189153194","loc":[-85.635026,41.9471575],"version":"1","changeset":"15277317","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-07T00:30:10Z","tags":{}},"n2189153195":{"id":"n2189153195","loc":[-85.6352328,41.9471053],"version":"1","changeset":"15277317","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-07T00:30:10Z","tags":{}},"n2189153196":{"id":"n2189153196","loc":[-85.6352359,41.9469906],"version":"1","changeset":"15277317","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-07T00:30:10Z","tags":{}},"n2189153197":{"id":"n2189153197","loc":[-85.6353694,41.9469925],"version":"1","changeset":"15277317","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-07T00:30:10Z","tags":{}},"n2189153198":{"id":"n2189153198","loc":[-85.6353664,41.9471072],"version":"1","changeset":"15277317","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-07T00:30:10Z","tags":{}},"n2189153199":{"id":"n2189153199","loc":[-85.6348241,41.9469287],"version":"1","changeset":"15277317","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-07T00:30:10Z","tags":{}},"n2189153200":{"id":"n2189153200","loc":[-85.6348248,41.9468185],"version":"1","changeset":"15277317","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-07T00:30:10Z","tags":{}},"n2189153201":{"id":"n2189153201","loc":[-85.6351199,41.9468195],"version":"1","changeset":"15277317","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-07T00:30:10Z","tags":{}},"n2189153202":{"id":"n2189153202","loc":[-85.6351192,41.9469298],"version":"1","changeset":"15277317","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-07T00:30:10Z","tags":{}},"n2189153203":{"id":"n2189153203","loc":[-85.6347965,41.9468057],"version":"1","changeset":"15277317","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-07T00:30:10Z","tags":{}},"n2189153204":{"id":"n2189153204","loc":[-85.634792,41.9466044],"version":"1","changeset":"15277317","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-07T00:30:10Z","tags":{}},"n2189153205":{"id":"n2189153205","loc":[-85.6349483,41.9466025],"version":"1","changeset":"15277317","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-07T00:30:10Z","tags":{}},"n2189153206":{"id":"n2189153206","loc":[-85.6349493,41.9466448],"version":"1","changeset":"15277317","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-07T00:30:10Z","tags":{}},"n2189153207":{"id":"n2189153207","loc":[-85.6349753,41.9466445],"version":"1","changeset":"15277317","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-07T00:30:10Z","tags":{}},"n2189153208":{"id":"n2189153208","loc":[-85.6349743,41.9465995],"version":"1","changeset":"15277317","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-07T00:30:10Z","tags":{}},"n2189153209":{"id":"n2189153209","loc":[-85.6351173,41.9465977],"version":"1","changeset":"15277317","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-07T00:30:10Z","tags":{}},"n2189153210":{"id":"n2189153210","loc":[-85.6351219,41.9468015],"version":"1","changeset":"15277317","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-07T00:30:10Z","tags":{}},"n2189153211":{"id":"n2189153211","loc":[-85.6349806,41.9468032],"version":"1","changeset":"15277317","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-07T00:30:10Z","tags":{}},"n2189153212":{"id":"n2189153212","loc":[-85.6349794,41.9467519],"version":"1","changeset":"15277317","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-07T00:30:10Z","tags":{}},"n2189153213":{"id":"n2189153213","loc":[-85.6349521,41.9467523],"version":"1","changeset":"15277317","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-07T00:30:10Z","tags":{}},"n2189153214":{"id":"n2189153214","loc":[-85.6349532,41.9468037],"version":"1","changeset":"15277317","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-07T00:30:10Z","tags":{}},"n2189153215":{"id":"n2189153215","loc":[-85.6346302,41.9468381],"version":"1","changeset":"15277317","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-07T00:30:10Z","tags":{}},"n2189153216":{"id":"n2189153216","loc":[-85.6343028,41.9468449],"version":"1","changeset":"15277317","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-07T00:30:10Z","tags":{}},"n2189153217":{"id":"n2189153217","loc":[-85.6342006,41.9468297],"version":"1","changeset":"15277317","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-07T00:30:10Z","tags":{}},"n2189153218":{"id":"n2189153218","loc":[-85.6336698,41.9465918],"version":"1","changeset":"15277317","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-07T00:30:10Z","tags":{}},"n2189153219":{"id":"n2189153219","loc":[-85.6344663,41.9466639],"version":"1","changeset":"15277317","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-07T00:30:10Z","tags":{}},"n2189153220":{"id":"n2189153220","loc":[-85.6344639,41.9466015],"version":"1","changeset":"15277317","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-07T00:30:10Z","tags":{}},"n2189153221":{"id":"n2189153221","loc":[-85.6342283,41.9466065],"version":"1","changeset":"15277317","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-07T00:30:10Z","tags":{}},"n2189153222":{"id":"n2189153222","loc":[-85.6342303,41.9466587],"version":"1","changeset":"15277317","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-07T00:30:10Z","tags":{}},"n2189153223":{"id":"n2189153223","loc":[-85.6342843,41.9466575],"version":"1","changeset":"15277317","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-07T00:30:10Z","tags":{}},"n2189153224":{"id":"n2189153224","loc":[-85.6342851,41.9466794],"version":"1","changeset":"15277317","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-07T00:30:10Z","tags":{}},"n2189153225":{"id":"n2189153225","loc":[-85.6343475,41.9466781],"version":"1","changeset":"15277317","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-07T00:30:10Z","tags":{}},"n2189153226":{"id":"n2189153226","loc":[-85.634347,41.9466664],"version":"1","changeset":"15277317","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-07T00:30:10Z","tags":{}},"n2189153227":{"id":"n2189153227","loc":[-85.6354428,41.9470148],"version":"1","changeset":"15277317","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-07T00:30:10Z","tags":{}},"n2189153228":{"id":"n2189153228","loc":[-85.6354432,41.9468005],"version":"1","changeset":"15277317","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-07T00:30:10Z","tags":{}},"n2189153229":{"id":"n2189153229","loc":[-85.6360277,41.9468011],"version":"1","changeset":"15277317","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-07T00:30:11Z","tags":{}},"n2189153230":{"id":"n2189153230","loc":[-85.6360273,41.9470154],"version":"1","changeset":"15277317","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-07T00:30:11Z","tags":{}},"n2189153231":{"id":"n2189153231","loc":[-85.6354565,41.9465823],"version":"1","changeset":"15277317","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-07T00:30:11Z","tags":{}},"n2189153232":{"id":"n2189153232","loc":[-85.6354496,41.946218],"version":"1","changeset":"15277317","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-07T00:30:11Z","tags":{}},"n2189153233":{"id":"n2189153233","loc":[-85.6356355,41.9465788],"version":"1","changeset":"15277317","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-07T00:30:11Z","tags":{}},"n2189153234":{"id":"n2189153234","loc":[-85.6357155,41.9468008],"version":"1","changeset":"15277317","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-07T00:30:11Z","tags":{}},"n2189153235":{"id":"n2189153235","loc":[-85.6359539,41.9467969],"version":"1","changeset":"15277317","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-07T00:30:11Z","tags":{}},"n2189153236":{"id":"n2189153236","loc":[-85.6359561,41.9463036],"version":"1","changeset":"15277317","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-07T00:30:11Z","tags":{}},"n2189153237":{"id":"n2189153237","loc":[-85.6360129,41.9464793],"version":"1","changeset":"15277317","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-07T00:30:11Z","tags":{}},"n2189153238":{"id":"n2189153238","loc":[-85.6360152,41.9463898],"version":"1","changeset":"15277317","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-07T00:30:11Z","tags":{}},"n2189153239":{"id":"n2189153239","loc":[-85.6359607,41.9464928],"version":"1","changeset":"15277317","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-07T00:30:11Z","tags":{}},"n2189153240":{"id":"n2189153240","loc":[-85.6356903,41.9462227],"version":"1","changeset":"15277317","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-07T00:30:11Z","tags":{}},"n2189153242":{"id":"n2189153242","loc":[-85.6354163,41.946142],"version":"1","changeset":"15277317","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-07T00:30:11Z","tags":{}},"n2189153243":{"id":"n2189153243","loc":[-85.6357546,41.9462214],"version":"1","changeset":"15277317","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-07T00:30:11Z","tags":{}},"n2189153244":{"id":"n2189153244","loc":[-85.6357937,41.9462542],"version":"1","changeset":"15277317","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-07T00:30:11Z","tags":{}},"n2189153245":{"id":"n2189153245","loc":[-85.6358723,41.9467048],"version":"1","changeset":"15277317","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-07T00:30:11Z","tags":{}},"n2189153246":{"id":"n2189153246","loc":[-85.6361494,41.946757],"version":"1","changeset":"15277317","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-07T00:30:11Z","tags":{}},"n2189153247":{"id":"n2189153247","loc":[-85.6354173,41.9469082],"version":"1","changeset":"15277317","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-07T00:30:11Z","tags":{}},"n2189153248":{"id":"n2189153248","loc":[-85.635443,41.9469079],"version":"1","changeset":"15277317","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-07T00:30:11Z","tags":{}},"n2189153249":{"id":"n2189153249","loc":[-85.6360275,41.9469093],"version":"1","changeset":"15277317","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-07T00:30:11Z","tags":{}},"n2189153250":{"id":"n2189153250","loc":[-85.6361542,41.946915],"version":"1","changeset":"15277317","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-07T00:30:11Z","tags":{}},"n2189153251":{"id":"n2189153251","loc":[-85.6358654,41.9464843],"version":"1","changeset":"15277317","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-07T00:30:11Z","tags":{}},"n2189153252":{"id":"n2189153252","loc":[-85.6359549,41.9467499],"version":"1","changeset":"15277317","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-07T00:30:11Z","tags":{}},"n2189153253":{"id":"n2189153253","loc":[-85.6357172,41.9466335],"version":"1","changeset":"15277317","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-07T00:30:11Z","tags":{}},"n2189153254":{"id":"n2189153254","loc":[-85.6355644,41.9461768],"version":"1","changeset":"15277317","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-07T00:30:11Z","tags":{}},"n2189153255":{"id":"n2189153255","loc":[-85.6355655,41.946528],"version":"1","changeset":"15277317","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-07T00:30:11Z","tags":{}},"n2189153256":{"id":"n2189153256","loc":[-85.6357055,41.9465971],"version":"1","changeset":"15277317","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-07T00:30:11Z","tags":{}},"n2189153257":{"id":"n2189153257","loc":[-85.635869,41.9465971],"version":"1","changeset":"15277317","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-07T00:30:11Z","tags":{}},"n2189153259":{"id":"n2189153259","loc":[-85.6354561,41.9470278],"version":"1","changeset":"15277317","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-07T00:30:11Z","tags":{}},"n2189153260":{"id":"n2189153260","loc":[-85.6357961,41.9470233],"version":"1","changeset":"15277317","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-07T00:30:11Z","tags":{}},"n2189153261":{"id":"n2189153261","loc":[-85.6357977,41.9470907],"version":"1","changeset":"15277317","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-07T00:30:11Z","tags":{}},"n2189153262":{"id":"n2189153262","loc":[-85.6357297,41.9470916],"version":"1","changeset":"15277317","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-07T00:30:11Z","tags":{}},"n2189153263":{"id":"n2189153263","loc":[-85.635733,41.947233],"version":"1","changeset":"15277317","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-07T00:30:11Z","tags":{}},"n2189153264":{"id":"n2189153264","loc":[-85.6362674,41.9468637],"version":"1","changeset":"15277317","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-07T00:30:11Z","tags":{}},"n2189153265":{"id":"n2189153265","loc":[-85.6362646,41.9467047],"version":"1","changeset":"15277317","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-07T00:30:11Z","tags":{}},"n2189153266":{"id":"n2189153266","loc":[-85.6363267,41.9467047],"version":"1","changeset":"15277317","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-07T00:30:11Z","tags":{}},"n2189153267":{"id":"n2189153267","loc":[-85.6362633,41.9465848],"version":"1","changeset":"15277317","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-07T00:30:11Z","tags":{}},"n2189153268":{"id":"n2189153268","loc":[-85.6363805,41.9465468],"version":"1","changeset":"15277317","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-07T00:30:11Z","tags":{}},"n2189153269":{"id":"n2189153269","loc":[-85.6364604,41.9466842],"version":"1","changeset":"15277317","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-07T00:30:11Z","tags":{}},"n2189153270":{"id":"n2189153270","loc":[-85.6364604,41.9468647],"version":"1","changeset":"15277317","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-07T00:30:11Z","tags":{}},"n2199109756":{"id":"n2199109756","loc":[-85.6337134,41.9471841],"version":"1","changeset":"15347594","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T05:16:50Z","tags":{}},"n2199109757":{"id":"n2199109757","loc":[-85.6336514,41.94716],"version":"1","changeset":"15347594","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T05:16:50Z","tags":{}},"n2199109758":{"id":"n2199109758","loc":[-85.6337043,41.9470847],"version":"1","changeset":"15347594","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T05:16:50Z","tags":{}},"n2199109759":{"id":"n2199109759","loc":[-85.6335997,41.9470441],"version":"1","changeset":"15347594","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T05:16:51Z","tags":{}},"n2199109760":{"id":"n2199109760","loc":[-85.6335064,41.9471771],"version":"1","changeset":"15347594","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T05:16:51Z","tags":{}},"n185960195":{"id":"n185960195","loc":[-85.6295992,41.9524346],"version":"3","changeset":"14676554","user":"bbmiller","uid":"451048","visible":"true","timestamp":"2013-01-16T20:05:17Z","tags":{}},"n185960796":{"id":"n185960796","loc":[-85.634723,41.953681],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T04:59:24Z","tags":{}},"n185961396":{"id":"n185961396","loc":[-85.634767,41.959009],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T04:59:39Z","tags":{}},"n185962625":{"id":"n185962625","loc":[-85.635175,41.97201],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:00:29Z","tags":{}},"n185964982":{"id":"n185964982","loc":[-85.632799,41.9440543],"version":"3","changeset":"9619138","user":"bbmiller","uid":"451048","visible":"true","timestamp":"2011-10-21T19:46:00Z","tags":{}},"n185965289":{"id":"n185965289","loc":[-85.634621,41.947323],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:01:49Z","tags":{}},"n185965291":{"id":"n185965291","loc":[-85.636166,41.947296],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:01:49Z","tags":{}},"n185965399":{"id":"n185965399","loc":[-85.634776,41.959834],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:01:52Z","tags":{}},"n185966937":{"id":"n185966937","loc":[-85.633183,41.947315],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:02:50Z","tags":{}},"n185966948":{"id":"n185966948","loc":[-85.626406,41.957188],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:02:50Z","tags":{}},"n185967422":{"id":"n185967422","loc":[-85.6320229,41.9490123],"version":"3","changeset":"14676554","user":"bbmiller","uid":"451048","visible":"true","timestamp":"2013-01-16T20:05:17Z","tags":{}},"n185967917":{"id":"n185967917","loc":[-85.634763,41.958292],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:03:17Z","tags":{}},"n185967918":{"id":"n185967918","loc":[-85.636271,41.958311],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:03:17Z","tags":{}},"n185968100":{"id":"n185968100","loc":[-85.630835,41.950656],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:03:22Z","tags":{}},"n185970515":{"id":"n185970515","loc":[-85.634832,41.963866],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:04:41Z","tags":{}},"n185971578":{"id":"n185971578","loc":[-85.634641,41.948627],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:05:05Z","tags":{}},"n185971580":{"id":"n185971580","loc":[-85.6361818,41.9486135],"version":"3","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:48:03Z","tags":{}},"n185971631":{"id":"n185971631","loc":[-85.634729,41.954667],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:05:06Z","tags":{}},"n185971632":{"id":"n185971632","loc":[-85.636236,41.954656],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:05:06Z","tags":{}},"n185972155":{"id":"n185972155","loc":[-85.623333,41.961987],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:05:18Z","tags":{}},"n185974583":{"id":"n185974583","loc":[-85.634686,41.951158],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:06:21Z","tags":{}},"n185974585":{"id":"n185974585","loc":[-85.6362059,41.9511457],"version":"3","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:48:03Z","tags":{}},"n185975064":{"id":"n185975064","loc":[-85.636218,41.953667],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:06:49Z","tags":{}},"n185975735":{"id":"n185975735","loc":[-85.634923,41.969269],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:07:09Z","tags":{}},"n185978390":{"id":"n185978390","loc":[-85.634668,41.949875],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:08:24Z","tags":{}},"n185978392":{"id":"n185978392","loc":[-85.634686,41.952415],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:08:24Z","tags":{}},"n185978394":{"id":"n185978394","loc":[-85.634726,41.955921],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:08:24Z","tags":{}},"n185978399":{"id":"n185978399","loc":[-85.6347861,41.9606613],"version":"3","changeset":"14676554","user":"bbmiller","uid":"451048","visible":"true","timestamp":"2013-01-16T20:05:17Z","tags":{}},"n185978402":{"id":"n185978402","loc":[-85.634806,41.961485],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:08:24Z","tags":{}},"n185978406":{"id":"n185978406","loc":[-85.6348298,41.964783],"version":"3","changeset":"14892219","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T07:48:00Z","tags":{}},"n185978410":{"id":"n185978410","loc":[-85.6348766,41.9677088],"version":"3","changeset":"14676554","user":"bbmiller","uid":"451048","visible":"true","timestamp":"2013-01-16T20:05:17Z","tags":{}},"n185978414":{"id":"n185978414","loc":[-85.634938,41.971566],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:08:25Z","tags":{}},"n185978415":{"id":"n185978415","loc":[-85.634942,41.971611],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:08:25Z","tags":{}},"n185978417":{"id":"n185978417","loc":[-85.634952,41.971655],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:08:25Z","tags":{}},"n185978419":{"id":"n185978419","loc":[-85.634989,41.971741],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:08:25Z","tags":{}},"n185978420":{"id":"n185978420","loc":[-85.635063,41.971864],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:08:25Z","tags":{}},"n185978787":{"id":"n185978787","loc":[-85.627936,41.954693],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:08:34Z","tags":{}},"n185978790":{"id":"n185978790","loc":[-85.626832,41.954677],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:08:34Z","tags":{}},"n185978967":{"id":"n185978967","loc":[-85.632278,41.948613],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:08:39Z","tags":{}},"n185980735":{"id":"n185980735","loc":[-85.628639,41.953725],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:09:47Z","tags":{}},"n185982163":{"id":"n185982163","loc":[-85.636233,41.952398],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:10:31Z","tags":{}},"n185982193":{"id":"n185982193","loc":[-85.6313855,41.9499125],"version":"3","changeset":"14676554","user":"bbmiller","uid":"451048","visible":"true","timestamp":"2013-01-16T20:05:17Z","tags":{}},"n185982195":{"id":"n185982195","loc":[-85.6304857,41.9511945],"version":"3","changeset":"14676554","user":"bbmiller","uid":"451048","visible":"true","timestamp":"2013-01-16T20:05:17Z","tags":{}},"n185982196":{"id":"n185982196","loc":[-85.626336,41.957291],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:10:32Z","tags":{}},"n185982197":{"id":"n185982197","loc":[-85.625578,41.958664],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:10:32Z","tags":{}},"n185982198":{"id":"n185982198","loc":[-85.624619,41.960145],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:10:32Z","tags":{}},"n185982200":{"id":"n185982200","loc":[-85.624494,41.960338],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:10:32Z","tags":{}},"n185984017":{"id":"n185984017","loc":[-85.636163,41.947382],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:11:46Z","tags":{}},"n185984020":{"id":"n185984020","loc":[-85.636188,41.9498803],"version":"3","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:48:03Z","tags":{}},"n185984022":{"id":"n185984022","loc":[-85.636276,41.955919],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:11:47Z","tags":{}},"n185984024":{"id":"n185984024","loc":[-85.636279,41.956901],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:11:47Z","tags":{}},"n185988036":{"id":"n185988036","loc":[-85.631422,41.948294],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:13:30Z","tags":{}},"n185988867":{"id":"n185988867","loc":[-85.63102,41.948805],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:14:13Z","tags":{}},"n185988869":{"id":"n185988869","loc":[-85.630773,41.949209],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:14:13Z","tags":{}},"n185988871":{"id":"n185988871","loc":[-85.63005,41.95016],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:14:13Z","tags":{}},"n185988872":{"id":"n185988872","loc":[-85.629423,41.951016],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:14:13Z","tags":{}},"n185988873":{"id":"n185988873","loc":[-85.629252,41.951256],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:14:13Z","tags":{}},"n185988875":{"id":"n185988875","loc":[-85.629126,41.951489],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:14:13Z","tags":{}},"n185988877":{"id":"n185988877","loc":[-85.628991,41.951704],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:14:13Z","tags":{}},"n185988878":{"id":"n185988878","loc":[-85.628689,41.952112],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:14:13Z","tags":{}},"n185988879":{"id":"n185988879","loc":[-85.628313,41.952666],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:14:13Z","tags":{}},"n185988880":{"id":"n185988880","loc":[-85.627687,41.953529],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:14:13Z","tags":{}},"n185988882":{"id":"n185988882","loc":[-85.627394,41.953947],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:14:13Z","tags":{}},"n185988884":{"id":"n185988884","loc":[-85.627287,41.954128],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:14:14Z","tags":{}},"n1819858502":{"id":"n1819858502","loc":[-85.6328435,41.9455473],"version":"1","changeset":"12170230","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:56:54Z","tags":{}},"n1819858510":{"id":"n1819858510","loc":[-85.6324841,41.9453438],"version":"1","changeset":"12170230","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:56:54Z","tags":{}},"n1819858515":{"id":"n1819858515","loc":[-85.6318511,41.9446409],"version":"1","changeset":"12170230","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:56:54Z","tags":{}},"n1819858520":{"id":"n1819858520","loc":[-85.6326558,41.9454708],"version":"1","changeset":"12170230","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:56:54Z","tags":{}},"n1819858522":{"id":"n1819858522","loc":[-85.6319048,41.9447407],"version":"1","changeset":"12170230","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:56:55Z","tags":{}},"n1819858524":{"id":"n1819858524","loc":[-85.6317718,41.9443666],"version":"1","changeset":"12170230","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:56:55Z","tags":{}},"n1819858530":{"id":"n1819858530","loc":[-85.632055,41.9449128],"version":"1","changeset":"12170230","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:56:55Z","tags":{}},"n2139795768":{"id":"n2139795768","loc":[-85.6243023,41.9606102],"version":"1","changeset":"14892219","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T07:47:55Z","tags":{}},"n2139832645":{"id":"n2139832645","loc":[-85.6324455,41.9448607],"version":"1","changeset":"14892737","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T08:51:49Z","tags":{}},"n2139832649":{"id":"n2139832649","loc":[-85.6328043,41.9454773],"version":"1","changeset":"14892737","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T08:51:49Z","tags":{}},"n2139832651":{"id":"n2139832651","loc":[-85.6322547,41.9449621],"version":"1","changeset":"14892737","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T08:51:49Z","tags":{}},"n2139832675":{"id":"n2139832675","loc":[-85.6327356,41.944757],"version":"1","changeset":"14892737","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T08:51:49Z","tags":{}},"n2139832677":{"id":"n2139832677","loc":[-85.6325433,41.9448599],"version":"1","changeset":"14892737","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T08:51:49Z","tags":{}},"n2139832680":{"id":"n2139832680","loc":[-85.6328885,41.9455614],"version":"1","changeset":"14892737","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T08:51:49Z","tags":{}},"n2139832682":{"id":"n2139832682","loc":[-85.6320913,41.9449492],"version":"1","changeset":"14892737","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T08:51:49Z","tags":{}},"n2139832684":{"id":"n2139832684","loc":[-85.6325366,41.9447133],"version":"1","changeset":"14892737","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T08:51:49Z","tags":{}},"n2139832688":{"id":"n2139832688","loc":[-85.6322786,41.94485],"version":"1","changeset":"14892737","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T08:51:49Z","tags":{}},"n2139832718":{"id":"n2139832718","loc":[-85.6327486,41.9432475],"version":"1","changeset":"14892737","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T08:51:50Z","tags":{}},"n2139832719":{"id":"n2139832719","loc":[-85.6327926,41.9431773],"version":"1","changeset":"14892737","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T08:51:50Z","tags":{}},"n2139832720":{"id":"n2139832720","loc":[-85.6329033,41.943153],"version":"1","changeset":"14892737","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T08:51:50Z","tags":{}},"n2139832727":{"id":"n2139832727","loc":[-85.6328975,41.9430783],"version":"2","changeset":"14892929","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:11:47Z","tags":{}},"n2139844839":{"id":"n2139844839","loc":[-85.6326261,41.9432308],"version":"1","changeset":"14892929","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:11:47Z","tags":{}},"n2189015992":{"id":"n2189015992","loc":[-85.6347706,41.9593383],"version":"1","changeset":"15276188","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T21:42:51Z","tags":{}},"n2189153179":{"id":"n2189153179","loc":[-85.6340476,41.9472565],"version":"1","changeset":"15277317","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-07T00:30:10Z","tags":{}},"n2189153182":{"id":"n2189153182","loc":[-85.6342638,41.9472522],"version":"1","changeset":"15277317","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-07T00:30:10Z","tags":{}},"n2189153241":{"id":"n2189153241","loc":[-85.6354184,41.9473091],"version":"1","changeset":"15277317","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-07T00:30:11Z","tags":{}},"n2189153258":{"id":"n2189153258","loc":[-85.6354611,41.9472366],"version":"1","changeset":"15277317","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-07T00:30:11Z","tags":{}},"n2189153277":{"id":"n2189153277","loc":[-85.6328948,41.9462374],"version":"1","changeset":"15277317","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-07T00:30:12Z","tags":{}},"n2199109755":{"id":"n2199109755","loc":[-85.6336729,41.9472417],"version":"1","changeset":"15347594","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T05:16:50Z","tags":{}},"w203970139":{"id":"w203970139","version":"1","changeset":"14892598","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T08:37:06Z","tags":{"building":"yes"},"nodes":["n2139824793","n2139824787","n2139824773","n2139824778","n2139824793"]},"w203970098":{"id":"w203970098","version":"1","changeset":"14892598","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T08:37:04Z","tags":{"building":"yes"},"nodes":["n2139824748","n2139824712","n2139824726","n2139824760","n2139824748"]},"w208643132":{"id":"w208643132","version":"1","changeset":"15277317","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-07T00:30:14Z","tags":{"area":"yes","building":"yes"},"nodes":["n2189153195","n2189153196","n2189153197","n2189153198","n2189153195"]},"w203970094":{"id":"w203970094","version":"1","changeset":"14892598","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T08:37:04Z","tags":{"building":"yes"},"nodes":["n2139824755","n2139824753","n2139824759","n2139824764","n2139824763","n2139824767","n2139824770","n2139824782","n2139824772","n2139824756","n2139824751","n2139824754","n2139824755"]},"w208643138":{"id":"w208643138","version":"1","changeset":"15277317","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-07T00:30:15Z","tags":{"amenity":"parking","area":"yes"},"nodes":["n2189153231","n2189153232","n2189153240","n2189153244","n2189153236","n2189153238","n2189153237","n2189153239","n2189153252","n2189153235","n2189153234","n2189153253","n2189153233","n2189153231"]},"w203970125":{"id":"w203970125","version":"1","changeset":"14892598","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T08:37:05Z","tags":{"building":"yes"},"nodes":["n2139824735","n2139824738","n2139824757","n2139824749","n2139824735"]},"w170848823":{"id":"w170848823","version":"2","changeset":"14893390","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:53:39Z","tags":{"name":"Rocky River","source":"Bing","waterway":"river"},"nodes":["n1819849189","n1819858516","n1819858519","n1819858504","n1819858525","n1819858506","n1819858513"]},"w203970898":{"id":"w203970898","version":"1","changeset":"14892737","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T08:51:50Z","tags":{"amenity":"parking","area":"yes"},"nodes":["n2139832645","n2139832647","n2139832649","n2139832651","n2139832645"]},"w203970134":{"id":"w203970134","version":"1","changeset":"14892598","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T08:37:06Z","tags":{"building":"yes"},"nodes":["n2139824796","n2139824803","n2139824797","n2139824788","n2139824796"]},"w203970104":{"id":"w203970104","version":"1","changeset":"14892598","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T08:37:04Z","tags":{"building":"yes"},"nodes":["n2139824733","n2139824730","n2139824714","n2139824721","n2139824733"]},"w206805245":{"id":"w206805245","version":"1","changeset":"15132216","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-23T08:37:04Z","tags":{"area":"yes","building":"yes"},"nodes":["n2168544780","n2168544781","n2139824796","n2139824803","n2168544780"]},"w206805252":{"id":"w206805252","version":"1","changeset":"15132216","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-23T08:37:04Z","tags":{"area":"yes","building":"yes"},"nodes":["n2168544838","n2168544839","n2168544840","n2168544841","n2168544842","n2168544843","n2168544844","n2168544845","n2168544846","n2168544847","n2168544838"]},"w203970099":{"id":"w203970099","version":"1","changeset":"14892598","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T08:37:04Z","tags":{"building":"yes"},"nodes":["n2139824783","n2139824795","n2139824790","n2139824779","n2139824783"]},"w17967730":{"id":"w17967730","version":"2","changeset":"15277317","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-07T00:30:18Z","tags":{"highway":"residential","name":"Water St","tiger:cfcc":"A41","tiger:county":"St. Joseph, MI","tiger:name_base":"Water","tiger:name_type":"St","tiger:reviewed":"no","tiger:zip_left":"49093","tiger:zip_right":"49093"},"nodes":["n185963451","n2189153277","n185988036","n185988867","n185988869","n185988871","n185988872","n185988873","n185988875","n185988877","n185988878","n185988879","n185988880","n185988882","n185988884","n185978790"]},"w208643133":{"id":"w208643133","version":"1","changeset":"15277317","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-07T00:30:14Z","tags":{"area":"yes","building":"yes"},"nodes":["n2189153199","n2189153200","n2189153201","n2189153202","n2189153199"]},"w203970127":{"id":"w203970127","version":"1","changeset":"14892598","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T08:37:05Z","tags":{"building":"yes"},"nodes":["n2139824794","n2139824783","n2139824789","n2139824797","n2139824794"]},"w208643139":{"id":"w208643139","version":"1","changeset":"15277317","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-07T00:30:15Z","tags":{"highway":"service"},"nodes":["n185988237","n2189153242","n2189153247","n2189153241"]},"w203988297":{"id":"w203988297","version":"1","changeset":"14895132","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T12:19:25Z","tags":{"amenity":"parking","area":"yes"},"nodes":["n2140006423","n2140006441","n2140006425","n2140006426","n2140006440","n2140006427","n2140006428","n2140006429","n2140006430","n2140006423"]},"w206805250":{"id":"w206805250","version":"1","changeset":"15132216","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-23T08:37:04Z","tags":{"area":"yes","building":"yes"},"nodes":["n2168544827","n2168544823","n2168544825","n2168544800","n2168544829","n2168544827"]},"w208643140":{"id":"w208643140","version":"1","changeset":"15277317","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-07T00:30:15Z","tags":{"highway":"service","service":"parking_aisle"},"nodes":["n2189153242","n2189153254","n2189153243","n2189153244","n2189153251","n2189153257","n2189153245","n2189153252","n2189153246"]},"w203974055":{"id":"w203974055","version":"1","changeset":"14893310","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:47:02Z","tags":{"bridge":"yes","highway":"path","name":"Riverwalk Trail"},"nodes":["n2139870376","n2139870377"]},"w206805247":{"id":"w206805247","version":"1","changeset":"15132216","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-23T08:37:04Z","tags":{"area":"yes","building":"yes"},"nodes":["n2168544785","n2168544786","n2168544783","n2168544787","n2168544788","n2168544789","n2168544785"]},"w17964996":{"id":"w17964996","version":"3","changeset":"14892737","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T08:51:51Z","tags":{"highway":"residential","name":"Foster St","tiger:cfcc":"A41","tiger:county":"St. Joseph, MI","tiger:name_base":"Foster","tiger:name_type":"St","tiger:reviewed":"no","tiger:separated":"no","tiger:source":"tiger_import_dch_v0.6_20070813","tiger:tlid":"15312360","tiger:upload_uuid":"bulk_upload.pl-b79f893a-0be1-4a5f-a183-6aea114c9af7"},"nodes":["n1819858524","n1819858515","n1819858522","n1819858530","n2139832682","n1819858510","n1819858520","n1819858502","n2139832680","n185963451","n1819858527","n185963452","n185963453","n185963454","n185963455","n185963456"]},"w208643144":{"id":"w208643144","version":"1","changeset":"15277317","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-07T00:30:15Z","tags":{"area":"yes","building":"yes"},"nodes":["n2189153264","n2189153265","n2189153266","n2189153267","n2189153268","n2189153269","n2189153270","n2189153264"]},"w203970914":{"id":"w203970914","version":"2","changeset":"14892929","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:11:47Z","tags":{"amenity":"parking","area":"yes"},"nodes":["n2139832722","n2139832723","n2139832724","n2139832725","n2139832726","n2139832727","n2139844839","n2139832722"]},"w208643143":{"id":"w208643143","version":"1","changeset":"15277317","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-07T00:30:15Z","tags":{"area":"yes","building":"yes"},"nodes":["n2189153258","n2189153259","n2189153260","n2189153261","n2189153262","n2189153263","n2189153258"]},"w203049590":{"id":"w203049590","version":"3","changeset":"14895132","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T12:19:25Z","tags":{"amenity":"parking","area":"yes"},"nodes":["n2130304152","n2130304153","n2140006403","n2130304154","n2130304156","n2130304155","n2130304160","n2130304152"]},"w203974054":{"id":"w203974054","version":"1","changeset":"14893310","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:47:02Z","tags":{"highway":"path","name":"Riverwalk Trail"},"nodes":["n2139858971","n2139870373","n2139870374"]},"w203049595":{"id":"w203049595","version":"2","changeset":"14892737","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T08:51:51Z","tags":{"highway":"service"},"nodes":["n2130304158","n2130304159","n2130304160","n2139832635","n2139832639"]},"w203970913":{"id":"w203970913","version":"1","changeset":"14892737","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T08:51:51Z","tags":{"highway":"service","service":"parking_aisle"},"nodes":["n2139832715","n2139832716","n2139832717","n2139832718","n2139832719","n2139832720","n2139832721","n2139832716"]},"w208643134":{"id":"w208643134","version":"1","changeset":"15277317","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-07T00:30:15Z","tags":{"area":"yes","building":"yes"},"nodes":["n2189153203","n2189153204","n2189153205","n2189153206","n2189153207","n2189153208","n2189153209","n2189153210","n2189153211","n2189153212","n2189153213","n2189153214","n2189153203"]},"w134150808":{"id":"w134150808","version":"1","changeset":"9619138","user":"bbmiller","uid":"451048","visible":"true","timestamp":"2011-10-21T19:45:53Z","tags":{"bridge":"yes","highway":"residential","name":"Moore St","tiger:cfcc":"A41","tiger:county":"St. Joseph, MI","tiger:name_base":"Moore","tiger:name_type":"St","tiger:reviewed":"no","tiger:separated":"no","tiger:source":"tiger_import_dch_v0.6_20070813","tiger:tlid":"15328392:15312870:15312967","tiger:upload_uuid":"bulk_upload.pl-b79f893a-0be1-4a5f-a183-6aea114c9af7"},"nodes":["n185988239","n185984009","n185988241","n1475284019"]},"w203970115":{"id":"w203970115","version":"1","changeset":"14892598","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T08:37:05Z","tags":{"building":"yes"},"nodes":["n2139824761","n2139824727","n2139824736","n2139824771","n2139824761"]},"w208643130":{"id":"w208643130","version":"1","changeset":"15277317","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-07T00:30:14Z","tags":{"area":"yes","building":"yes"},"nodes":["n2189153183","n2189153184","n2189153185","n2189153186","n2189153187","n2189153188","n2189153189","n2189153190","n2189153183"]},"w206805246":{"id":"w206805246","version":"1","changeset":"15132216","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-23T08:37:04Z","tags":{"area":"yes","building":"yes"},"nodes":["n2168544782","n2168544780","n2168544781","n2168544783","n2168544787","n2168544784","n2168544782"]},"w203970138":{"id":"w203970138","version":"1","changeset":"14892598","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T08:37:06Z","tags":{"building":"yes"},"nodes":["n2139824729","n2139824720","n2139824702","n2139824707","n2139824729"]},"w203970133":{"id":"w203970133","version":"1","changeset":"14892598","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T08:37:06Z","tags":{"building":"yes"},"nodes":["n2139824748","n2139824737","n2139824717","n2139824728","n2139824748"]},"w203970907":{"id":"w203970907","version":"1","changeset":"14892737","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T08:51:50Z","tags":{"highway":"service","service":"parking_aisle"},"nodes":["n2139832700","n2139832701","n2139832702"]},"w203974056":{"id":"w203974056","version":"1","changeset":"14893310","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:47:02Z","tags":{"highway":"path","name":"Riverwalk Trail"},"nodes":["n2139870377","n2139870378"]},"w203970897":{"id":"w203970897","version":"2","changeset":"15117845","user":"rolandg","uid":"8703","visible":"true","timestamp":"2013-02-21T23:02:38Z","tags":{"highway":"service","service":"parking_aisle"},"nodes":["n2130304156","n2166205688","n2139832635","n2139832636","n2139832637","n2139832639","n2139832641","n2166205688"]},"w203974057":{"id":"w203974057","version":"1","changeset":"14893310","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:47:02Z","tags":{"highway":"path","name":"Riverwalk Trail"},"nodes":["n2139870375","n2139870376"]},"w203049594":{"id":"w203049594","version":"3","changeset":"14893310","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:47:03Z","tags":{"highway":"service"},"nodes":["n2130304156","n2139870378","n2139832706","n2139832704","n2130304157"]},"w203970122":{"id":"w203970122","version":"1","changeset":"14892598","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T08:37:05Z","tags":{"building":"yes"},"nodes":["n2139824757","n2139824740","n2139824747","n2139824762","n2139824757"]},"w208643136":{"id":"w208643136","version":"1","changeset":"15277317","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-07T00:30:15Z","tags":{"area":"yes","building":"yes"},"nodes":["n2189153219","n2189153220","n2189153221","n2189153222","n2189153223","n2189153224","n2189153225","n2189153226","n2189153219"]},"w203970128":{"id":"w203970128","version":"1","changeset":"14892598","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T08:37:05Z","tags":{"building":"yes"},"nodes":["n2139824732","n2139824752","n2139824744","n2139824724","n2139824732"]},"w203970097":{"id":"w203970097","version":"1","changeset":"14892598","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T08:37:04Z","tags":{"building":"yes"},"nodes":["n2139824737","n2139824733","n2139824710","n2139824716","n2139824737"]},"w203970137":{"id":"w203970137","version":"1","changeset":"14892598","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T08:37:06Z","tags":{"building":"yes"},"nodes":["n2139824765","n2139824774","n2139824758","n2139824746","n2139824765"]},"w134150840":{"id":"w134150840","version":"1","changeset":"9619138","user":"bbmiller","uid":"451048","visible":"true","timestamp":"2011-10-21T19:45:56Z","tags":{"highway":"residential","name":"Moore St","tiger:cfcc":"A41","tiger:county":"St. Joseph, MI","tiger:name_base":"Moore","tiger:name_type":"St","tiger:reviewed":"no","tiger:separated":"no","tiger:source":"tiger_import_dch_v0.6_20070813","tiger:tlid":"15328392:15312870:15312967","tiger:upload_uuid":"bulk_upload.pl-b79f893a-0be1-4a5f-a183-6aea114c9af7"},"nodes":["n1475284019","n185988243","n185988244","n185988245"]},"w17967628":{"id":"w17967628","version":"3","changeset":"14892737","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T08:51:51Z","tags":{"highway":"residential","name":"Moore St","tiger:cfcc":"A41","tiger:county":"St. Joseph, MI","tiger:name_base":"Moore","tiger:name_type":"St","tiger:reviewed":"no","tiger:separated":"no","tiger:source":"tiger_import_dch_v0.6_20070813","tiger:tlid":"15328392:15312870:15312967","tiger:upload_uuid":"bulk_upload.pl-b79f893a-0be1-4a5f-a183-6aea114c9af7"},"nodes":["n185978388","n2139832709","n185988237","n185988239"]},"w203988292":{"id":"w203988292","version":"1","changeset":"14895132","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T12:19:25Z","tags":{"bridge":"yes","highway":"footway"},"nodes":["n2140006407","n2140006405"]},"w203970118":{"id":"w203970118","version":"1","changeset":"14892598","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T08:37:05Z","tags":{"building":"yes"},"nodes":["n2139824775","n2139824785","n2139824780","n2139824768","n2139824775"]},"w203970121":{"id":"w203970121","version":"1","changeset":"14892598","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T08:37:05Z","tags":{"building":"yes"},"nodes":["n2139824768","n2139824781","n2139824776","n2139824765","n2139824768"]},"w17967752":{"id":"w17967752","version":"5","changeset":"15421127","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-19T15:12:00Z","tags":{"highway":"residential","name":"Railroad Drive","tiger:cfcc":"A41","tiger:county":"St. Joseph, MI","tiger:name_base":"Railroad","tiger:name_type":"Dr","tiger:reviewed":"no","tiger:zip_left":"49093","tiger:zip_right":"49093"},"nodes":["n185964980","n2139832699","n2139832700","n2130304158","n185988969","n185988971","n185988972","n1475284011"]},"w203970136":{"id":"w203970136","version":"1","changeset":"14892598","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T08:37:06Z","tags":{"building":"yes"},"nodes":["n2139824798","n2139824793","n2139824777","n2139824784","n2139824798"]},"w203970142":{"id":"w203970142","version":"1","changeset":"14892598","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T08:37:06Z","tags":{"building":"yes"},"nodes":["n2139824808","n2139824809","n2139824807","n2139824806","n2139824801","n2139824800","n2139824804","n2139824805","n2139824808"]},"w208643137":{"id":"w208643137","version":"1","changeset":"15277317","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-07T00:30:15Z","tags":{"amenity":"parking","area":"yes"},"nodes":["n2189153227","n2189153248","n2189153228","n2189153234","n2189153235","n2189153229","n2189153249","n2189153230","n2189153227"]},"w208643129":{"id":"w208643129","version":"1","changeset":"15277317","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-07T00:30:14Z","tags":{"area":"yes","building":"yes"},"nodes":["n2189153179","n2189153180","n2189153181","n2189153182","n2189153179"]},"w203970909":{"id":"w203970909","version":"1","changeset":"14892737","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T08:51:50Z","tags":{"amenity":"parking","area":"yes"},"nodes":["n2139832703","n2139832704","n2139832706","n2139832708","n2139832703"]},"w203970905":{"id":"w203970905","version":"1","changeset":"14892737","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T08:51:50Z","tags":{"highway":"service","service":"parking_aisle"},"nodes":["n2139832688","n2139832691"]},"w203988298":{"id":"w203988298","version":"1","changeset":"14895132","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T12:19:25Z","tags":{"highway":"service"},"nodes":["n2140006431","n2140006433","n2140006435","n2140006436","n2140006437","n2140006438","n2140006439","n2140006440"]},"w203970106":{"id":"w203970106","version":"1","changeset":"14892598","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T08:37:04Z","tags":{"building":"yes"},"nodes":["n2139824798","n2139824791","n2139824799","n2139824802","n2139824798"]},"w203970129":{"id":"w203970129","version":"1","changeset":"14892598","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T08:37:06Z","tags":{"building":"yes"},"nodes":["n2139824787","n2139824782","n2139824766","n2139824769","n2139824787"]},"w208643131":{"id":"w208643131","version":"1","changeset":"15277317","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-07T00:30:14Z","tags":{"area":"yes","building":"yes"},"nodes":["n2189153191","n2189153192","n2189153193","n2189153194","n2189153191"]},"w206805249":{"id":"w206805249","version":"1","changeset":"15132216","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-23T08:37:04Z","tags":{"area":"yes","building":"yes"},"nodes":["n2168544800","n2168544801","n2168544802","n2168544805","n2168544807","n2168544809","n2168544811","n2168544813","n2168544815","n2168544817","n2168544819","n2168544821","n2168544823","n2168544825","n2168544800"]},"w134150800":{"id":"w134150800","version":"3","changeset":"13675000","user":"NE2","uid":"207745","visible":"true","timestamp":"2012-10-29T15:08:54Z","tags":{"bridge":"yes","highway":"primary","name":"W Michigan Ave","old_ref":"US 131","ref":"US 131 Business;M 60","tiger:cfcc":"A21","tiger:county":"St. Joseph, MI","tiger:name_base":"Michigan","tiger:name_base_1":"State Highway 60","tiger:name_base_2":"US Hwy 131 (Bus)","tiger:name_direction_prefix":"W","tiger:name_type":"Ave","tiger:reviewed":"no"},"nodes":["n185964972","n185964976"]},"w17966984":{"id":"w17966984","version":"4","changeset":"15473186","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-24T01:52:21Z","tags":{"highway":"residential","name":"Portage Avenue","tiger:cfcc":"A41","tiger:county":"St. Joseph, MI","tiger:name_base":"Portage","tiger:name_type":"Ave","tiger:reviewed":"no","tiger:zip_left":"49093","tiger:zip_right":"49093"},"nodes":["n185978375","n185963456","n2189153218","n185966937","n185978967","n185967422","n185982193","n185968100","n185982195","n185960195","n185980735","n185978787","n185966948","n185982196","n185982197","n185982198","n185982200","n2139795768","n185972155"]},"w203988294":{"id":"w203988294","version":"1","changeset":"14895132","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T12:19:25Z","tags":{"amenity":"shelter","area":"yes","building":"yes","shelter_type":"picnic_shelter"},"nodes":["n2140006409","n2140006411","n2140006413","n2140006415","n2140006409"]},"w203970912":{"id":"w203970912","version":"1","changeset":"14892737","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T08:51:50Z","tags":{"amenity":"parking","area":"yes"},"nodes":["n2139832711","n2139832712","n2139832713","n2139832714","n2139832711"]},"w203970119":{"id":"w203970119","version":"1","changeset":"14892598","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T08:37:05Z","tags":{"building":"yes"},"nodes":["n2139824713","n2139824705","n2139824683","n2139824689","n2139824713"]},"w203970114":{"id":"w203970114","version":"1","changeset":"14892598","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T08:37:05Z","tags":{"building":"yes"},"nodes":["n2139824735","n2139824750","n2139824745","n2139824732","n2139824735"]},"w208643142":{"id":"w208643142","version":"1","changeset":"15277317","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-07T00:30:15Z","tags":{"highway":"service","service":"parking_aisle"},"nodes":["n2189153254","n2189153255","n2189153256","n2189153257"]},"w206805253":{"id":"w206805253","version":"1","changeset":"15132216","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-23T08:37:04Z","tags":{"area":"yes","building":"yes"},"nodes":["n2168544848","n2168544849","n2168544850","n2168544851","n2168544852","n2168544853","n2168544854","n2168544855","n2168544848"]},"w143497377":{"id":"w143497377","version":"7","changeset":"15421127","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-19T15:11:59Z","tags":{"highway":"primary","name":"North Main Street","old_ref":"US 131","ref":"US 131 Business","tiger:cfcc":"A31","tiger:county":"St. Joseph, MI","tiger:name_base":"Main","tiger:name_base_1":"US Hwy 131 (Bus)","tiger:name_direction_prefix":"N","tiger:name_type":"St","tiger:reviewed":"no","tiger:zip_left":"49093","tiger:zip_left_1":"49093","tiger:zip_right":"49093","tiger:zip_right_1":"49093"},"nodes":["n185962625","n185978420","n185978419","n185978417","n185978415","n185978414","n185975735","n1475293254","n185978410","n185978406","n185970515","n185978402","n185978399","n185965399","n2189015992","n185961396","n185967917","n185978394","n185971631","n185960796","n185978392","n185974583","n185978390","n185971578","n185965289","n2189153215","n185978388","n185978383","n185978381","n185978379","n185978377","n185978375","n185964982"]},"w134150811":{"id":"w134150811","version":"6","changeset":"15421127","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-19T15:11:58Z","tags":{"highway":"primary","name":"West Michigan Avenue","old_ref":"US 131","ref":"US 131 Business;M 60","tiger:cfcc":"A21","tiger:county":"St. Joseph, MI","tiger:name_base":"Michigan","tiger:name_base_1":"State Highway 60","tiger:name_base_2":"US Hwy 131 (Bus)","tiger:name_direction_prefix":"W","tiger:name_type":"Ave","tiger:reviewed":"no"},"nodes":["n185964976","n2130304157","n1475284023","n2139832715","n185964980","n185964982"]},"w208643135":{"id":"w208643135","version":"1","changeset":"15277317","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-07T00:30:15Z","tags":{"highway":"service","service":"parking_aisle"},"nodes":["n2189153215","n2189153216","n2189153217","n2189153218"]},"w17967183":{"id":"w17967183","version":"4","changeset":"15473186","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-24T01:52:23Z","tags":{"highway":"residential","name":"West Street","tiger:cfcc":"A41","tiger:county":"St. Joseph, MI","tiger:name_base":"West","tiger:name_type":"St","tiger:reviewed":"no","tiger:zip_left":"49093","tiger:zip_right":"49093"},"nodes":["n1475284011","n185984011","n185984013","n185984015","n2189153246","n2189153250","n185965291","n185984017","n185971580","n185984020","n185974585","n185982163","n185975064","n185971632","n185984022","n185984024","n185967918"]},"w134150778":{"id":"w134150778","version":"1","changeset":"9619138","user":"bbmiller","uid":"451048","visible":"true","timestamp":"2011-10-21T19:45:48Z","tags":{"bridge":"yes","highway":"residential","name":"Moore St","tiger:cfcc":"A41","tiger:county":"St. Joseph, MI","tiger:name_base":"Moore","tiger:name_type":"St","tiger:reviewed":"no","tiger:separated":"no","tiger:source":"tiger_import_dch_v0.6_20070813","tiger:tlid":"15328392:15312870:15312967","tiger:upload_uuid":"bulk_upload.pl-b79f893a-0be1-4a5f-a183-6aea114c9af7"},"nodes":["n185988245","n1475283992","n185975911"]},"w206805248":{"id":"w206805248","version":"1","changeset":"15132216","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-23T08:37:04Z","tags":{"area":"yes","building":"yes"},"nodes":["n2168544790","n2168544791","n2168544792","n2168544793","n2168544795","n2168544797","n2168544798","n2168544799","n2168544802","n2168544801","n2168544790"]},"w203974058":{"id":"w203974058","version":"1","changeset":"14893310","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T09:47:02Z","tags":{"bridge":"yes","highway":"path","name":"Riverwalk Trail"},"nodes":["n2139870374","n2139870375"]},"w203970902":{"id":"w203970902","version":"1","changeset":"14892737","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T08:51:50Z","tags":{"highway":"service"},"nodes":["n2139832678","n2139832691","n2139832680"]},"w203988296":{"id":"w203988296","version":"1","changeset":"14895132","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T12:19:25Z","tags":{"highway":"path"},"nodes":["n2139858967","n2140006421","n2139858935"]},"w206805251":{"id":"w206805251","version":"1","changeset":"15132216","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-23T08:37:04Z","tags":{"area":"yes","building":"yes"},"nodes":["n2168544830","n2168544831","n2168544832","n2168544833","n2168544834","n2168544835","n2168544836","n2168544837","n2168544830"]},"w203970906":{"id":"w203970906","version":"1","changeset":"14892737","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T08:51:50Z","tags":{"amenity":"parking","area":"yes"},"nodes":["n2139832693","n2139832694","n2139832696","n2139832697","n2139832698","n2139832693"]},"w203049598":{"id":"w203049598","version":"1","changeset":"14802606","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-01-27T04:50:52Z","tags":{"area":"yes","leisure":"pitch","sport":"tennis"},"nodes":["n2130304162","n2130304163","n2130304164","n2130304165","n2130304162"]},"w203970911":{"id":"w203970911","version":"1","changeset":"14892737","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T08:51:50Z","tags":{"highway":"service"},"nodes":["n2139832709","n2139832714","n2139832713","n2139832710","n185988971"]},"w203970105":{"id":"w203970105","version":"1","changeset":"14892598","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T08:37:04Z","tags":{"building":"yes"},"nodes":["n2139824779","n2139824792","n2139824786","n2139824775","n2139824779"]},"w203988290":{"id":"w203988290","version":"1","changeset":"14895132","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T12:19:25Z","tags":{"highway":"footway"},"nodes":["n2140006403","n2140006407"]},"w203970900":{"id":"w203970900","version":"1","changeset":"14892737","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T08:51:50Z","tags":{"amenity":"parking","area":"yes"},"nodes":["n2139832653","n2139832663","n2139832665","n2139832667","n2139832669","n2139832671","n2139832673","n2139832675","n2139832677","n2139832653"]},"w209717048":{"id":"w209717048","version":"1","changeset":"15347594","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T05:16:53Z","tags":{"area":"yes","building":"yes"},"nodes":["n2199109755","n2199109756","n2199109757","n2199109758","n2199109759","n2199109760","n2199109755"]},"w208643141":{"id":"w208643141","version":"1","changeset":"15277317","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-07T00:30:15Z","tags":{"highway":"service","service":"parking_aisle"},"nodes":["n2189153247","n2189153248","n2189153249","n2189153250"]},"w203970903":{"id":"w203970903","version":"1","changeset":"14892737","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T08:51:50Z","tags":{"highway":"service","service":"parking_aisle"},"nodes":["n2139832682","n2139832688","n2139832684","n2139832678","n2139832686"]},"n354002527":{"id":"n354002527","loc":[-85.6236039,41.9458813],"version":"1","changeset":"698464","user":"iandees","uid":"4732","visible":"true","timestamp":"2009-02-28T21:20:07Z","tags":{"amenity":"school","ele":"246","gnis:county_id":"149","gnis:created":"04/14/1980","gnis:edited":"02/21/2008","gnis:feature_id":"1624371","gnis:state_id":"26","name":"Barrows School"}},"n185963396":{"id":"n185963396","loc":[-85.627401,41.943496],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:00:52Z","tags":{}},"n185963397":{"id":"n185963397","loc":[-85.627403,41.943625],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:00:52Z","tags":{}},"n185965101":{"id":"n185965101","loc":[-85.626409,41.943215],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:01:44Z","tags":{}},"n185971474":{"id":"n185971474","loc":[-85.624884,41.943508],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:05:03Z","tags":{}},"n185971475":{"id":"n185971475","loc":[-85.625191,41.943509],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:05:03Z","tags":{}},"n185971482":{"id":"n185971482","loc":[-85.624882,41.94382],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:05:03Z","tags":{}},"n185983135":{"id":"n185983135","loc":[-85.624893,41.945616],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:11:01Z","tags":{}},"n185983137":{"id":"n185983137","loc":[-85.624912,41.946524],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:11:01Z","tags":{}},"n185988027":{"id":"n185988027","loc":[-85.622721,41.946535],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:13:30Z","tags":{}},"n185963398":{"id":"n185963398","loc":[-85.6273993,41.9446899],"version":"3","changeset":"9619138","user":"bbmiller","uid":"451048","visible":"true","timestamp":"2011-10-21T19:45:58Z","tags":{}},"n185983238":{"id":"n185983238","loc":[-85.6227157,41.9456321],"version":"3","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:59:04Z","tags":{}},"n185980374":{"id":"n185980374","loc":[-85.6248856,41.9447242],"version":"3","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:59:04Z","tags":{}},"n185980373":{"id":"n185980373","loc":[-85.6226744,41.9447371],"version":"3","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:59:04Z","tags":{}},"n2196831342":{"id":"n2196831342","loc":[-85.6250924,41.945063],"version":"1","changeset":"15335510","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-12T03:10:39Z","tags":{}},"n2196831343":{"id":"n2196831343","loc":[-85.6252335,41.9450636],"version":"1","changeset":"15335510","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-12T03:10:39Z","tags":{}},"n2196831344":{"id":"n2196831344","loc":[-85.6252286,41.9448707],"version":"1","changeset":"15335510","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-12T03:10:39Z","tags":{}},"n2196831345":{"id":"n2196831345","loc":[-85.6250661,41.9448707],"version":"1","changeset":"15335510","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-12T03:10:39Z","tags":{}},"n2196831346":{"id":"n2196831346","loc":[-85.6250243,41.9449012],"version":"1","changeset":"15335510","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-12T03:10:39Z","tags":{}},"n2196831347":{"id":"n2196831347","loc":[-85.6250251,41.9449244],"version":"1","changeset":"15335510","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-12T03:10:39Z","tags":{}},"n2196831348":{"id":"n2196831348","loc":[-85.6250867,41.9449257],"version":"1","changeset":"15335510","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-12T03:10:39Z","tags":{}},"n2196831349":{"id":"n2196831349","loc":[-85.625349,41.9445058],"version":"1","changeset":"15335510","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-12T03:10:39Z","tags":{}},"n2196831350":{"id":"n2196831350","loc":[-85.6253471,41.9443882],"version":"1","changeset":"15335510","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-12T03:10:39Z","tags":{}},"n2196831351":{"id":"n2196831351","loc":[-85.6251516,41.94439],"version":"1","changeset":"15335510","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-12T03:10:39Z","tags":{}},"n2196831352":{"id":"n2196831352","loc":[-85.6251522,41.9444308],"version":"1","changeset":"15335510","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-12T03:10:39Z","tags":{}},"n2196831353":{"id":"n2196831353","loc":[-85.6251344,41.9444309],"version":"1","changeset":"15335510","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-12T03:10:39Z","tags":{}},"n2196831354":{"id":"n2196831354","loc":[-85.6251356,41.9445077],"version":"1","changeset":"15335510","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-12T03:10:39Z","tags":{}},"n2196831355":{"id":"n2196831355","loc":[-85.6232357,41.9463406],"version":"1","changeset":"15335510","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-12T03:10:39Z","tags":{}},"n2196831356":{"id":"n2196831356","loc":[-85.6232409,41.9460668],"version":"1","changeset":"15335510","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-12T03:10:40Z","tags":{}},"n2196831357":{"id":"n2196831357","loc":[-85.6232072,41.9460665],"version":"1","changeset":"15335510","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-12T03:10:40Z","tags":{}},"n2196831358":{"id":"n2196831358","loc":[-85.6232117,41.9458272],"version":"1","changeset":"15335510","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-12T03:10:40Z","tags":{}},"n2196831359":{"id":"n2196831359","loc":[-85.6229808,41.9458248],"version":"1","changeset":"15335510","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-12T03:10:40Z","tags":{}},"n2196831360":{"id":"n2196831360","loc":[-85.6229763,41.9460627],"version":"1","changeset":"15335510","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-12T03:10:40Z","tags":{}},"n2196831361":{"id":"n2196831361","loc":[-85.623006,41.946063],"version":"1","changeset":"15335510","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-12T03:10:40Z","tags":{}},"n2196831362":{"id":"n2196831362","loc":[-85.6230023,41.9462557],"version":"1","changeset":"15335510","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-12T03:10:40Z","tags":{}},"n2196831363":{"id":"n2196831363","loc":[-85.6230755,41.9462565],"version":"1","changeset":"15335510","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-12T03:10:40Z","tags":{}},"n2196831364":{"id":"n2196831364","loc":[-85.6230739,41.9463389],"version":"1","changeset":"15335510","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-12T03:10:40Z","tags":{}},"n185947349":{"id":"n185947349","loc":[-85.618327,41.945607],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T04:53:11Z","tags":{}},"n185947359":{"id":"n185947359","loc":[-85.615453,41.945597],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T04:53:11Z","tags":{}},"n185947378":{"id":"n185947378","loc":[-85.617231,41.945603],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T04:53:12Z","tags":{}},"n185947474":{"id":"n185947474","loc":[-85.616136,41.945602],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T04:53:14Z","tags":{}},"n185948972":{"id":"n185948972","loc":[-85.615273,41.945637],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T04:54:02Z","tags":{}},"n185955019":{"id":"n185955019","loc":[-85.620172,41.945627],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T04:56:37Z","tags":{}},"n185960682":{"id":"n185960682","loc":[-85.622759,41.951845],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T04:59:21Z","tags":{}},"n185961369":{"id":"n185961369","loc":[-85.622758,41.947444],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T04:59:38Z","tags":{}},"n185961371":{"id":"n185961371","loc":[-85.624908,41.947416],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T04:59:38Z","tags":{}},"n185963392":{"id":"n185963392","loc":[-85.6270462,41.9409953],"version":"3","changeset":"9619138","user":"bbmiller","uid":"451048","visible":"true","timestamp":"2011-10-21T19:45:58Z","tags":{}},"n185963393":{"id":"n185963393","loc":[-85.627295,41.941304],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:00:51Z","tags":{}},"n185963394":{"id":"n185963394","loc":[-85.627352,41.94148],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:00:52Z","tags":{}},"n185963395":{"id":"n185963395","loc":[-85.62737,41.942261],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:00:52Z","tags":{}},"n185965099":{"id":"n185965099","loc":[-85.6264,41.942263],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:01:44Z","tags":{}},"n185965108":{"id":"n185965108","loc":[-85.622769,41.949224],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:01:44Z","tags":{}},"n185965110":{"id":"n185965110","loc":[-85.624937,41.949237],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:01:44Z","tags":{}},"n185966295":{"id":"n185966295","loc":[-85.6299942,41.9446689],"version":"3","changeset":"9619138","user":"bbmiller","uid":"451048","visible":"true","timestamp":"2011-10-21T19:46:01Z","tags":{}},"n185966342":{"id":"n185966342","loc":[-85.624873,41.942022],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:02:34Z","tags":{}},"n185970222":{"id":"n185970222","loc":[-85.622761,41.948357],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:04:17Z","tags":{}},"n185970224":{"id":"n185970224","loc":[-85.624924,41.9483338],"version":"3","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:59:05Z","tags":{}},"n185971477":{"id":"n185971477","loc":[-85.620051,41.94383],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:05:03Z","tags":{}},"n185971478":{"id":"n185971478","loc":[-85.621219,41.943801],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:05:03Z","tags":{}},"n185971481":{"id":"n185971481","loc":[-85.621812,41.943807],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:05:03Z","tags":{}},"n185973866":{"id":"n185973866","loc":[-85.627629,41.946498],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:06:03Z","tags":{}},"n185974699":{"id":"n185974699","loc":[-85.6227688,41.950119],"version":"3","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:59:05Z","tags":{}},"n185978800":{"id":"n185978800","loc":[-85.623953,41.954684],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:08:34Z","tags":{}},"n185980372":{"id":"n185980372","loc":[-85.621459,41.944756],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:09:37Z","tags":{}},"n185980378":{"id":"n185980378","loc":[-85.6286375,41.9446764],"version":"3","changeset":"9619138","user":"bbmiller","uid":"451048","visible":"true","timestamp":"2011-10-21T19:45:59Z","tags":{}},"n185980380":{"id":"n185980380","loc":[-85.630139,41.944661],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:09:38Z","tags":{}},"n185980382":{"id":"n185980382","loc":[-85.630298,41.944635],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:09:38Z","tags":{}},"n185980384":{"id":"n185980384","loc":[-85.630759,41.94454],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:09:38Z","tags":{}},"n185980386":{"id":"n185980386","loc":[-85.6312369,41.9444548],"version":"3","changeset":"9619138","user":"bbmiller","uid":"451048","visible":"true","timestamp":"2011-10-21T19:45:59Z","tags":{}},"n185983133":{"id":"n185983133","loc":[-85.6248672,41.9415903],"version":"3","changeset":"9619138","user":"bbmiller","uid":"451048","visible":"true","timestamp":"2011-10-21T19:45:57Z","tags":{}},"n185983139":{"id":"n185983139","loc":[-85.624951,41.950239],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:11:01Z","tags":{}},"n185983140":{"id":"n185983140","loc":[-85.624934,41.950681],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:11:01Z","tags":{}},"n185983141":{"id":"n185983141","loc":[-85.624813,41.950983],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:11:02Z","tags":{}},"n185983143":{"id":"n185983143","loc":[-85.6246225,41.951591],"version":"3","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:59:03Z","tags":{}},"n185983144":{"id":"n185983144","loc":[-85.623908,41.9539165],"version":"3","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:59:03Z","tags":{}},"n185983145":{"id":"n185983145","loc":[-85.6238903,41.9540956],"version":"3","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:59:03Z","tags":{}},"n185983146":{"id":"n185983146","loc":[-85.623898,41.95431],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:11:02Z","tags":{}},"n185983236":{"id":"n185983236","loc":[-85.628481,41.945611],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:11:05Z","tags":{}},"n185985914":{"id":"n185985914","loc":[-85.620072,41.946538],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:12:42Z","tags":{}},"n185986812":{"id":"n185986812","loc":[-85.6227785,41.9510005],"version":"3","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:59:05Z","tags":{}},"n185988028":{"id":"n185988028","loc":[-85.6281401,41.9469632],"version":"3","changeset":"9619138","user":"bbmiller","uid":"451048","visible":"true","timestamp":"2011-10-21T19:45:58Z","tags":{}},"n185988030":{"id":"n185988030","loc":[-85.6282451,41.9470314],"version":"3","changeset":"9619138","user":"bbmiller","uid":"451048","visible":"true","timestamp":"2011-10-21T19:45:58Z","tags":{}},"n185988032":{"id":"n185988032","loc":[-85.6283312,41.9470656],"version":"3","changeset":"9619138","user":"bbmiller","uid":"451048","visible":"true","timestamp":"2011-10-21T19:45:58Z","tags":{}},"w17964989":{"id":"w17964989","version":"1","changeset":"402341","user":"DaveHansenTiger","uid":"7168","visible":"true","timestamp":"2007-12-23T20:33:37Z","tags":{"highway":"residential","name":"Middle St","tiger:cfcc":"A41","tiger:county":"St. Joseph, MI","tiger:name_base":"Middle","tiger:name_type":"St","tiger:reviewed":"no","tiger:separated":"no","tiger:source":"tiger_import_dch_v0.6_20070813","tiger:tlid":"15312433:15328741:15312403:15312465","tiger:upload_uuid":"bulk_upload.pl-b79f893a-0be1-4a5f-a183-6aea114c9af7","tiger:zip_left":"49093","tiger:zip_right":"49093"},"nodes":["n185963392","n185963393","n185963394","n185963395","n185963396","n185963397","n185963398"]},"w17965158":{"id":"w17965158","version":"1","changeset":"402341","user":"DaveHansenTiger","uid":"7168","visible":"true","timestamp":"2007-12-23T20:34:55Z","tags":{"access":"private","highway":"service","name":"Battle St","tiger:cfcc":"A74","tiger:county":"St. Joseph, MI","tiger:name_base":"Battle","tiger:name_type":"St","tiger:reviewed":"no","tiger:source":"tiger_import_dch_v0.6_20070813","tiger:tlid":"15313281","tiger:upload_uuid":"bulk_upload.pl-b79f893a-0be1-4a5f-a183-6aea114c9af7"},"nodes":["n185965099","n185965101"]},"w41074896":{"id":"w41074896","version":"4","changeset":"15421127","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-19T15:11:58Z","tags":{"highway":"secondary","name":"East Michigan Avenue","name_1":"State Highway 60","ref":"M 60","tiger:cfcc":"A31","tiger:county":"St. Joseph, MI","tiger:name_base":"Michigan","tiger:name_base_1":"State Highway 60","tiger:name_direction_prefix":"E","tiger:name_type":"Ave","tiger:reviewed":"no","tiger:zip_left":"49093","tiger:zip_right":"49093"},"nodes":["n185980372","n185980373","n185980374","n185963398","n185980378","n185966295","n185980380","n185980382","n185980384","n185980386"]},"w17965846":{"id":"w17965846","version":"1","changeset":"402341","user":"DaveHansenTiger","uid":"7168","visible":"true","timestamp":"2007-12-23T20:40:12Z","tags":{"highway":"residential","name":"2nd Ave","tiger:cfcc":"A41","tiger:county":"St. Joseph, MI","tiger:name_base":"2nd","tiger:name_type":"Ave","tiger:reviewed":"no","tiger:separated":"no","tiger:source":"tiger_import_dch_v0.6_20070813","tiger:tlid":"15313726","tiger:upload_uuid":"bulk_upload.pl-b79f893a-0be1-4a5f-a183-6aea114c9af7","tiger:zip_left":"49093","tiger:zip_right":"49093"},"nodes":["n185971477","n185971478","n185971481","n185971482"]},"w209470306":{"id":"w209470306","version":"1","changeset":"15335510","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-12T03:10:41Z","tags":{"area":"yes","building":"yes"},"nodes":["n2196831349","n2196831350","n2196831351","n2196831352","n2196831353","n2196831354","n2196831349"]},"w17965845":{"id":"w17965845","version":"1","changeset":"402341","user":"DaveHansenTiger","uid":"7168","visible":"true","timestamp":"2007-12-23T20:40:12Z","tags":{"highway":"residential","name":"2nd Ave","tiger:cfcc":"A41","tiger:county":"St. Joseph, MI","tiger:name_base":"2nd","tiger:name_type":"Ave","tiger:reviewed":"no","tiger:separated":"no","tiger:source":"tiger_import_dch_v0.6_20070813","tiger:tlid":"15335065","tiger:upload_uuid":"bulk_upload.pl-b79f893a-0be1-4a5f-a183-6aea114c9af7","tiger:zip_left":"49093","tiger:zip_right":"49093"},"nodes":["n185971474","n185971475","n185963396"]},"w209470307":{"id":"w209470307","version":"1","changeset":"15335510","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-12T03:10:41Z","tags":{"area":"yes","building":"yes"},"nodes":["n2196831355","n2196831356","n2196831357","n2196831358","n2196831359","n2196831360","n2196831361","n2196831362","n2196831363","n2196831364","n2196831355"]},"w17968192":{"id":"w17968192","version":"2","changeset":"15473162","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-24T01:43:17Z","tags":{"highway":"residential","name":"Washington St","tiger:cfcc":"A41","tiger:county":"St. Joseph, MI","tiger:name_base":"Washington","tiger:name_type":"St","tiger:reviewed":"no","tiger:zip_left":"49093","tiger:zip_right":"49093"},"nodes":["n185980373","n185983238","n185988027","n185961369","n185970222","n185965108","n185974699","n185986812","n185960682"]},"w17967603":{"id":"w17967603","version":"2","changeset":"9619138","user":"bbmiller","uid":"451048","visible":"true","timestamp":"2011-10-21T19:46:23Z","tags":{"highway":"residential","name":"5th Ave","tiger:cfcc":"A41","tiger:county":"St. Joseph, MI","tiger:name_base":"5th","tiger:name_type":"Ave","tiger:reviewed":"no","tiger:separated":"no","tiger:source":"tiger_import_dch_v0.6_20070813","tiger:tlid":"15312324:15312811:15314055:15314056:15313692:15328995:15313188","tiger:upload_uuid":"bulk_upload.pl-b79f893a-0be1-4a5f-a183-6aea114c9af7","tiger:zip_left":"49093","tiger:zip_right":"49093"},"nodes":["n185985914","n185988027","n185983137","n185973866","n185988028","n185988030","n185988032"]},"w209470305":{"id":"w209470305","version":"1","changeset":"15335510","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-12T03:10:41Z","tags":{"area":"yes","building":"yes"},"nodes":["n2196831342","n2196831343","n2196831344","n2196831345","n2196831346","n2196831347","n2196831348","n2196831342"]},"w17967092":{"id":"w17967092","version":"1","changeset":"402341","user":"DaveHansenTiger","uid":"7168","visible":"true","timestamp":"2007-12-23T20:49:18Z","tags":{"highway":"residential","name":"Wood St","tiger:cfcc":"A41","tiger:county":"St. Joseph, MI","tiger:name_base":"Wood","tiger:name_type":"St","tiger:reviewed":"no","tiger:separated":"no","tiger:source":"tiger_import_dch_v0.6_20070813","tiger:tlid":"15313653:15313659:15313679:15314060","tiger:upload_uuid":"bulk_upload.pl-b79f893a-0be1-4a5f-a183-6aea114c9af7","tiger:zip_left":"49093","tiger:zip_right":"49093"},"nodes":["n185983133","n185966342","n185971474","n185971482","n185980374","n185983135","n185983137","n185961371","n185970224","n185965110","n185983139","n185983140","n185983141","n185983143","n185983144","n185983145","n185983146","n185978800"]},"w17967107":{"id":"w17967107","version":"1","changeset":"402341","user":"DaveHansenTiger","uid":"7168","visible":"true","timestamp":"2007-12-23T20:49:23Z","tags":{"highway":"residential","name":"4th Ave","tiger:cfcc":"A41","tiger:county":"St. Joseph, MI","tiger:name_base":"4th","tiger:name_type":"Ave","tiger:reviewed":"no","tiger:separated":"no","tiger:source":"tiger_import_dch_v0.6_20070813","tiger:tlid":"15314053:15314054:15313697:15313698:15313700:15313701:15313699:15314427","tiger:upload_uuid":"bulk_upload.pl-b79f893a-0be1-4a5f-a183-6aea114c9af7","tiger:zip_left":"49093","tiger:zip_right":"49093"},"nodes":["n185983236","n185983135","n185983238","n185955019","n185947349","n185947378","n185947474","n185947359","n185948972"]},"n354030330":{"id":"n354030330","loc":[-85.6297222,41.9444444],"version":"1","changeset":"698464","user":"iandees","uid":"4732","visible":"true","timestamp":"2009-02-28T22:10:58Z","tags":{"ele":"243","gnis:county_id":"149","gnis:created":"03/21/2008","gnis:feature_id":"2401246","gnis:state_id":"26","leisure":"park","name":"Scouter Park"}},"n185966296":{"id":"n185966296","loc":[-85.629998,41.944078],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:02:33Z","tags":{}},"n185966298":{"id":"n185966298","loc":[-85.629972,41.943927],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:02:33Z","tags":{}},"n185966300":{"id":"n185966300","loc":[-85.629948,41.943783],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:02:33Z","tags":{}},"n185980391":{"id":"n185980391","loc":[-85.6322992,41.9442766],"version":"3","changeset":"9619138","user":"bbmiller","uid":"451048","visible":"true","timestamp":"2011-10-21T19:45:59Z","tags":{}},"n185980393":{"id":"n185980393","loc":[-85.6324925,41.9442136],"version":"3","changeset":"9619138","user":"bbmiller","uid":"451048","visible":"true","timestamp":"2011-10-21T19:45:59Z","tags":{}},"n185980389":{"id":"n185980389","loc":[-85.6320272,41.9443281],"version":"3","changeset":"9619138","user":"bbmiller","uid":"451048","visible":"true","timestamp":"2011-10-21T19:45:59Z","tags":{}},"n185980388":{"id":"n185980388","loc":[-85.6315778,41.9443959],"version":"3","changeset":"9619138","user":"bbmiller","uid":"451048","visible":"true","timestamp":"2011-10-21T19:45:59Z","tags":{}},"n354031320":{"id":"n354031320","loc":[-85.6280556,41.9447222],"version":"3","changeset":"3908860","user":"Geogast","uid":"51045","visible":"true","timestamp":"2010-02-18T13:28:21Z","tags":{"amenity":"place_of_worship","ele":"245","gnis:county_id":"149","gnis:created":"04/30/2008","gnis:feature_id":"2417881","gnis:state_id":"26","name":"Riverside Church","religion":"christian"}},"n185987309":{"id":"n185987309","loc":[-85.6286497,41.9453531],"version":"3","changeset":"9619138","user":"bbmiller","uid":"451048","visible":"true","timestamp":"2011-10-21T19:45:57Z","tags":{}},"n185987311":{"id":"n185987311","loc":[-85.6285942,41.9454805],"version":"3","changeset":"9619138","user":"bbmiller","uid":"451048","visible":"true","timestamp":"2011-10-21T19:45:57Z","tags":{}},"n185988034":{"id":"n185988034","loc":[-85.6285815,41.9471692],"version":"3","changeset":"9619138","user":"bbmiller","uid":"451048","visible":"true","timestamp":"2011-10-21T19:45:58Z","tags":{}},"n185988896":{"id":"n185988896","loc":[-85.6318433,41.9437929],"version":"3","changeset":"9619138","user":"bbmiller","uid":"451048","visible":"true","timestamp":"2011-10-21T19:45:59Z","tags":{}},"n185977764":{"id":"n185977764","loc":[-85.6322988,41.943472],"version":"3","changeset":"9619138","user":"bbmiller","uid":"451048","visible":"true","timestamp":"2011-10-21T19:46:01Z","tags":{}},"n1819848852":{"id":"n1819848852","loc":[-85.6315188,41.9448808],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:49Z","tags":{}},"n1819848912":{"id":"n1819848912","loc":[-85.6284289,41.9472189],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:50Z","tags":{}},"n1819848925":{"id":"n1819848925","loc":[-85.6314501,41.9451617],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:51Z","tags":{}},"n1819848949":{"id":"n1819848949","loc":[-85.6309394,41.9455192],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:52Z","tags":{}},"n1819848951":{"id":"n1819848951","loc":[-85.6290297,41.9457187],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:52Z","tags":{}},"n1819848963":{"id":"n1819848963","loc":[-85.630521,41.9455591],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:52Z","tags":{}},"n1819848981":{"id":"n1819848981","loc":[-85.6292936,41.9455846],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:53Z","tags":{}},"n1819848989":{"id":"n1819848989","loc":[-85.6298451,41.9455431],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:53Z","tags":{}},"n1819848998":{"id":"n1819848998","loc":[-85.6314973,41.9446254],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:53Z","tags":{}},"n1819849018":{"id":"n1819849018","loc":[-85.6302807,41.9455527],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:54Z","tags":{}},"n1819849043":{"id":"n1819849043","loc":[-85.6285533,41.9469731],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:54Z","tags":{}},"n1819849087":{"id":"n1819849087","loc":[-85.6314501,41.9453532],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:56Z","tags":{}},"n1819849090":{"id":"n1819849090","loc":[-85.628843,41.9461033],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:56Z","tags":{}},"n1819849109":{"id":"n1819849109","loc":[-85.6311926,41.9454729],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:57Z","tags":{}},"n1819849116":{"id":"n1819849116","loc":[-85.6288967,41.9459437],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:57Z","tags":{}},"n1819849177":{"id":"n1819849177","loc":[-85.6287894,41.9464544],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:59Z","tags":{}},"n1819858529":{"id":"n1819858529","loc":[-85.6325485,41.9445625],"version":"1","changeset":"12170230","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:56:55Z","tags":{}},"n2189112797":{"id":"n2189112797","loc":[-85.6275271,41.944555],"version":"1","changeset":"15277056","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T23:26:15Z","tags":{}},"n2189112798":{"id":"n2189112798","loc":[-85.6275196,41.9437258],"version":"1","changeset":"15277056","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T23:26:15Z","tags":{}},"n2189112799":{"id":"n2189112799","loc":[-85.6278937,41.943723],"version":"1","changeset":"15277056","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T23:26:15Z","tags":{}},"n2189112800":{"id":"n2189112800","loc":[-85.6278969,41.9439191],"version":"1","changeset":"15277056","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T23:26:15Z","tags":{}},"n2189112801":{"id":"n2189112801","loc":[-85.6279907,41.9439345],"version":"1","changeset":"15277056","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T23:26:15Z","tags":{}},"n2189112802":{"id":"n2189112802","loc":[-85.6280817,41.9439663],"version":"1","changeset":"15277056","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T23:26:15Z","tags":{}},"n2189112803":{"id":"n2189112803","loc":[-85.6281768,41.9440145],"version":"1","changeset":"15277056","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T23:26:15Z","tags":{}},"n2189112804":{"id":"n2189112804","loc":[-85.6281933,41.9440483],"version":"1","changeset":"15277056","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T23:26:15Z","tags":{}},"n2189112805":{"id":"n2189112805","loc":[-85.6281671,41.9440535],"version":"1","changeset":"15277056","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T23:26:15Z","tags":{}},"n2189112806":{"id":"n2189112806","loc":[-85.6281933,41.9440935],"version":"1","changeset":"15277056","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T23:26:15Z","tags":{}},"n2189112807":{"id":"n2189112807","loc":[-85.6282126,41.9441437],"version":"1","changeset":"15277056","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T23:26:16Z","tags":{}},"n2189112808":{"id":"n2189112808","loc":[-85.628214,41.9441991],"version":"1","changeset":"15277056","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T23:26:16Z","tags":{}},"n2189112809":{"id":"n2189112809","loc":[-85.6283298,41.944196],"version":"1","changeset":"15277056","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T23:26:16Z","tags":{}},"n2189112810":{"id":"n2189112810","loc":[-85.6283285,41.9442616],"version":"1","changeset":"15277056","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T23:26:16Z","tags":{}},"n2189112811":{"id":"n2189112811","loc":[-85.6281727,41.9442616],"version":"1","changeset":"15277056","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T23:26:16Z","tags":{}},"n2189112812":{"id":"n2189112812","loc":[-85.6281713,41.9442934],"version":"1","changeset":"15277056","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T23:26:16Z","tags":{}},"n2189112813":{"id":"n2189112813","loc":[-85.6280386,41.9442963],"version":"1","changeset":"15277056","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T23:26:16Z","tags":{}},"n2189112814":{"id":"n2189112814","loc":[-85.6280405,41.9443292],"version":"1","changeset":"15277056","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T23:26:16Z","tags":{}},"n2189112815":{"id":"n2189112815","loc":[-85.627829,41.9443349],"version":"1","changeset":"15277056","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T23:26:16Z","tags":{}},"n2189112816":{"id":"n2189112816","loc":[-85.6278347,41.9445495],"version":"1","changeset":"15277056","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T23:26:16Z","tags":{}},"n2189153271":{"id":"n2189153271","loc":[-85.6321053,41.9460342],"version":"1","changeset":"15277317","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-07T00:30:11Z","tags":{}},"n2189153272":{"id":"n2189153272","loc":[-85.632278,41.9457841],"version":"1","changeset":"15277317","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-07T00:30:11Z","tags":{}},"n2189153273":{"id":"n2189153273","loc":[-85.632823,41.9459936],"version":"1","changeset":"15277317","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-07T00:30:11Z","tags":{}},"n2189153274":{"id":"n2189153274","loc":[-85.6326845,41.9461963],"version":"1","changeset":"15277317","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-07T00:30:11Z","tags":{}},"n2189153275":{"id":"n2189153275","loc":[-85.6325664,41.9461507],"version":"1","changeset":"15277317","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-07T00:30:12Z","tags":{}},"n2189153276":{"id":"n2189153276","loc":[-85.6325323,41.946198],"version":"1","changeset":"15277317","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-07T00:30:12Z","tags":{}},"n2189153278":{"id":"n2189153278","loc":[-85.6321916,41.9459733],"version":"1","changeset":"15277317","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-07T00:30:12Z","tags":{}},"n2189153279":{"id":"n2189153279","loc":[-85.6322598,41.9458703],"version":"1","changeset":"15277317","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-07T00:30:12Z","tags":{}},"n2189153280":{"id":"n2189153280","loc":[-85.6327208,41.9460358],"version":"1","changeset":"15277317","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-07T00:30:12Z","tags":{}},"n2189153281":{"id":"n2189153281","loc":[-85.6326413,41.9461422],"version":"1","changeset":"15277317","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-07T00:30:12Z","tags":{}},"n185959079":{"id":"n185959079","loc":[-85.6293702,41.9474668],"version":"3","changeset":"9619138","user":"bbmiller","uid":"451048","visible":"true","timestamp":"2011-10-21T19:45:58Z","tags":{}},"n185966301":{"id":"n185966301","loc":[-85.629692,41.943136],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:02:33Z","tags":{}},"n185966304":{"id":"n185966304","loc":[-85.629565,41.942916],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:02:33Z","tags":{}},"n185966308":{"id":"n185966308","loc":[-85.629501,41.942751],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:02:33Z","tags":{}},"n185966315":{"id":"n185966315","loc":[-85.629472,41.942578],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:02:34Z","tags":{}},"n185966319":{"id":"n185966319","loc":[-85.629444,41.942414],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:02:34Z","tags":{}},"n185966321":{"id":"n185966321","loc":[-85.629391,41.94205],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:02:34Z","tags":{}},"n185966323":{"id":"n185966323","loc":[-85.629369,41.941858],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:02:34Z","tags":{}},"n185966327":{"id":"n185966327","loc":[-85.629297,41.941604],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:02:34Z","tags":{}},"n185966331":{"id":"n185966331","loc":[-85.629233,41.941549],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:02:34Z","tags":{}},"n185966336":{"id":"n185966336","loc":[-85.628504,41.941364],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:02:34Z","tags":{}},"n185966338":{"id":"n185966338","loc":[-85.628275,41.941303],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:02:34Z","tags":{}},"n185966340":{"id":"n185966340","loc":[-85.6269038,41.9410983],"version":"3","changeset":"9619138","user":"bbmiller","uid":"451048","visible":"true","timestamp":"2011-10-21T19:46:01Z","tags":{}},"n185973867":{"id":"n185973867","loc":[-85.626843,41.947333],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:06:03Z","tags":{}},"n185977762":{"id":"n185977762","loc":[-85.6318441,41.9429453],"version":"3","changeset":"9619138","user":"bbmiller","uid":"451048","visible":"true","timestamp":"2011-10-21T19:46:01Z","tags":{}},"n1819848853":{"id":"n1819848853","loc":[-85.625854,41.9492218],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:49Z","tags":{}},"n1819848861":{"id":"n1819848861","loc":[-85.6251459,41.9552376],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:49Z","tags":{}},"n1819848874":{"id":"n1819848874","loc":[-85.6267445,41.9482961],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:49Z","tags":{}},"n1819848882":{"id":"n1819848882","loc":[-85.6257209,41.9552396],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:49Z","tags":{}},"n1819848883":{"id":"n1819848883","loc":[-85.624706,41.9523173],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:49Z","tags":{}},"n1819848907":{"id":"n1819848907","loc":[-85.62609,41.9561471],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:50Z","tags":{}},"n1819848908":{"id":"n1819848908","loc":[-85.6244013,41.9549284],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:50Z","tags":{}},"n1819848911":{"id":"n1819848911","loc":[-85.6265578,41.9553672],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:50Z","tags":{}},"n1819848923":{"id":"n1819848923","loc":[-85.6246802,41.9550959],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:50Z","tags":{}},"n1819848936":{"id":"n1819848936","loc":[-85.6241588,41.9539291],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:51Z","tags":{}},"n1819848940":{"id":"n1819848940","loc":[-85.62506,41.9511129],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:51Z","tags":{}},"n1819848944":{"id":"n1819848944","loc":[-85.624942,41.9515912],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:51Z","tags":{}},"n1819848950":{"id":"n1819848950","loc":[-85.6273989,41.9475461],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:52Z","tags":{}},"n1819848957":{"id":"n1819848957","loc":[-85.627695,41.947404],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:52Z","tags":{}},"n1819849009":{"id":"n1819849009","loc":[-85.6259248,41.94896],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:53Z","tags":{}},"n1819849037":{"id":"n1819849037","loc":[-85.6257252,41.9502112],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:54Z","tags":{}},"n1819849061":{"id":"n1819849061","loc":[-85.6270084,41.9479626],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:55Z","tags":{}},"n1819849073":{"id":"n1819849073","loc":[-85.6243734,41.9534583],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:55Z","tags":{}},"n1819849091":{"id":"n1819849091","loc":[-85.6241373,41.9543918],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:56Z","tags":{}},"n1819849130":{"id":"n1819849130","loc":[-85.6282572,41.9473067],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:57Z","tags":{}},"n1819849143":{"id":"n1819849143","loc":[-85.625281,41.9506596],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:57Z","tags":{}},"n1819849153":{"id":"n1819849153","loc":[-85.6258647,41.9498043],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:58Z","tags":{}},"n1819849168":{"id":"n1819849168","loc":[-85.6265084,41.9559317],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:58Z","tags":{}},"n1819849173":{"id":"n1819849173","loc":[-85.6263325,41.9552156],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:58Z","tags":{}},"n1819849175":{"id":"n1819849175","loc":[-85.6266372,41.9556764],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:58Z","tags":{}},"n1819849178":{"id":"n1819849178","loc":[-85.6242232,41.9545993],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:59Z","tags":{}},"n1819849181":{"id":"n1819849181","loc":[-85.6262187,41.9486712],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:59Z","tags":{}},"n1819849188":{"id":"n1819849188","loc":[-85.6245558,41.9530434],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:59Z","tags":{}},"n1819849190":{"id":"n1819849190","loc":[-85.6255982,41.9563017],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:59Z","tags":{}},"n2168544738":{"id":"n2168544738","loc":[-85.6245707,41.9529711],"version":"1","changeset":"15132216","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-23T08:37:01Z","tags":{}},"w208643145":{"id":"w208643145","version":"1","changeset":"15277317","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-07T00:30:15Z","tags":{"amenity":"parking","area":"yes"},"nodes":["n2189153271","n2189153272","n2189153273","n2189153274","n2189153275","n2189153276","n2189153271"]},"w17967561":{"id":"w17967561","version":"2","changeset":"9619138","user":"bbmiller","uid":"451048","visible":"true","timestamp":"2011-10-21T19:46:21Z","tags":{"highway":"residential","name":"Garden St","tiger:cfcc":"A41","tiger:county":"St. Joseph, MI","tiger:name_base":"Garden","tiger:name_type":"St","tiger:reviewed":"no","tiger:separated":"no","tiger:source":"tiger_import_dch_v0.6_20070813","tiger:tlid":"15312361:15322884:15322885","tiger:upload_uuid":"bulk_upload.pl-b79f893a-0be1-4a5f-a183-6aea114c9af7","tiger:zip_left":"49093","tiger:zip_right":"49093"},"nodes":["n185980378","n185987309","n185987311","n185983236","n185973866"]},"w134150802":{"id":"w134150802","version":"2","changeset":"15421127","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-19T15:11:58Z","tags":{"bridge":"yes","highway":"secondary","name":"East Michigan Avenue","name_1":"State Highway 60","ref":"M 60","tiger:cfcc":"A31","tiger:county":"St. Joseph, MI","tiger:name_base":"Michigan","tiger:name_base_1":"State Highway 60","tiger:name_direction_prefix":"E","tiger:name_type":"Ave","tiger:reviewed":"no","tiger:zip_left":"49093","tiger:zip_right":"49093"},"nodes":["n185980386","n185980388"]},"w208639462":{"id":"w208639462","version":"1","changeset":"15277056","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T23:26:18Z","tags":{"area":"yes","building":"yes"},"nodes":["n2189112797","n2189112798","n2189112799","n2189112800","n2189112801","n2189112802","n2189112803","n2189112804","n2189112805","n2189112806","n2189112807","n2189112808","n2189112809","n2189112810","n2189112811","n2189112812","n2189112813","n2189112814","n2189112815","n2189112816","n2189112797"]},"w134150830":{"id":"w134150830","version":"3","changeset":"15421127","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-19T15:12:00Z","tags":{"bridge":"yes","highway":"secondary","name":"South Main Street","old_ref":"US 131","ref":"M 86","tiger:cfcc":"A31","tiger:county":"St. Joseph, MI","tiger:name_base":"Main","tiger:name_base_1":"State Highway 86","tiger:name_direction_prefix":"S","tiger:name_type":"St","tiger:reviewed":"no"},"nodes":["n185977762","n185977764"]},"w134150801":{"id":"w134150801","version":"3","changeset":"15421127","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-19T15:12:00Z","tags":{"highway":"secondary","name":"South Main Street","old_ref":"US 131","ref":"M 86","tiger:cfcc":"A31","tiger:county":"St. Joseph, MI","tiger:name_base":"Main","tiger:name_base_1":"State Highway 86","tiger:name_direction_prefix":"S","tiger:name_type":"St","tiger:reviewed":"no"},"nodes":["n185977764","n185964982"]},"w208643146":{"id":"w208643146","version":"1","changeset":"15277317","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-07T00:30:16Z","tags":{"highway":"service","service":"parking_aisle"},"nodes":["n2189153277","n2189153281","n2189153278","n2189153279","n2189153280","n2189153281"]},"w17966061":{"id":"w17966061","version":"1","changeset":"402341","user":"DaveHansenTiger","uid":"7168","visible":"true","timestamp":"2007-12-23T20:42:00Z","tags":{"highway":"residential","name":"John Glenn Ct","tiger:cfcc":"A41","tiger:county":"St. Joseph, MI","tiger:name_base":"John Glenn","tiger:name_type":"Ct","tiger:reviewed":"no","tiger:separated":"no","tiger:source":"tiger_import_dch_v0.6_20070813","tiger:tlid":"15313190","tiger:upload_uuid":"bulk_upload.pl-b79f893a-0be1-4a5f-a183-6aea114c9af7"},"nodes":["n185973866","n185973867"]},"w134150772":{"id":"w134150772","version":"1","changeset":"9619138","user":"bbmiller","uid":"451048","visible":"true","timestamp":"2011-10-21T19:45:48Z","tags":{"highway":"residential","name":"5th Ave","tiger:cfcc":"A41","tiger:county":"St. Joseph, MI","tiger:name_base":"5th","tiger:name_type":"Ave","tiger:reviewed":"no","tiger:separated":"no","tiger:source":"tiger_import_dch_v0.6_20070813","tiger:tlid":"15312324:15312811:15314055:15314056:15313692:15328995:15313188","tiger:upload_uuid":"bulk_upload.pl-b79f893a-0be1-4a5f-a183-6aea114c9af7","tiger:zip_left":"49093","tiger:zip_right":"49093"},"nodes":["n185988034","n185959079","n185988036","n185978967"]},"w134150836":{"id":"w134150836","version":"3","changeset":"15421127","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-19T15:11:58Z","tags":{"highway":"secondary","name":"East Michigan Avenue","name_1":"State Highway 60","ref":"M 60","tiger:cfcc":"A31","tiger:county":"St. Joseph, MI","tiger:name_base":"Michigan","tiger:name_base_1":"State Highway 60","tiger:name_direction_prefix":"E","tiger:name_type":"Ave","tiger:reviewed":"no","tiger:zip_left":"49093","tiger:zip_right":"49093"},"nodes":["n185980388","n1819858524","n185980389","n185980391","n185980393","n185964982"]},"w17967734":{"id":"w17967734","version":"3","changeset":"15421127","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-19T15:12:00Z","tags":{"highway":"residential","name":"Water Street","tiger:cfcc":"A41","tiger:county":"St. Joseph, MI","tiger:name_base":"Water","tiger:name_type":"St","tiger:reviewed":"no","tiger:zip_left":"49093","tiger:zip_right":"49093"},"nodes":["n185988896","n185980391","n1819858529"]},"w17965305":{"id":"w17965305","version":"1","changeset":"402341","user":"DaveHansenTiger","uid":"7168","visible":"true","timestamp":"2007-12-23T20:35:57Z","tags":{"highway":"residential","name":"River Dr","tiger:cfcc":"A41","tiger:county":"St. Joseph, MI","tiger:name_base":"River","tiger:name_type":"Dr","tiger:reviewed":"no","tiger:separated":"no","tiger:source":"tiger_import_dch_v0.6_20070813","tiger:tlid":"15312440:15338837","tiger:upload_uuid":"bulk_upload.pl-b79f893a-0be1-4a5f-a183-6aea114c9af7","tiger:zip_left":"49093","tiger:zip_right":"49093"},"nodes":["n185966295","n185966296","n185966298","n185966300","n185966301","n185966304","n185966308","n185966315","n185966319","n185966321","n185966323","n185966327","n185966331","n185966336","n185966338","n185963392","n185966340","n185966342"]},"w134150826":{"id":"w134150826","version":"1","changeset":"9619138","user":"bbmiller","uid":"451048","visible":"true","timestamp":"2011-10-21T19:45:55Z","tags":{"bridge":"yes","highway":"residential","name":"5th Ave","tiger:cfcc":"A41","tiger:county":"St. Joseph, MI","tiger:name_base":"5th","tiger:name_type":"Ave","tiger:reviewed":"no","tiger:separated":"no","tiger:source":"tiger_import_dch_v0.6_20070813","tiger:tlid":"15312324:15312811:15314055:15314056:15313692:15328995:15313188","tiger:upload_uuid":"bulk_upload.pl-b79f893a-0be1-4a5f-a183-6aea114c9af7","tiger:zip_left":"49093","tiger:zip_right":"49093"},"nodes":["n185988032","n185988034"]},"w170848330":{"id":"w170848330","version":"3","changeset":"15306846","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-09T19:50:50Z","tags":{"name":"Portage River","source":"Bing","waterway":"river"},"nodes":["n1819849190","n1819848907","n1819849168","n1819849175","n1819848911","n1819849173","n1819848882","n1819848861","n1819848923","n1819848908","n1819849178","n1819849091","n1819848936","n1819849073","n1819849188","n2168544738","n1819848883","n1819848944","n1819848940","n1819849143","n1819849037","n1819849153","n1819848853","n1819849009","n1819849181","n1819848874","n1819849061","n1819848950","n1819848957","n1819849130","n1819848912","n1819849043","n1819849177","n1819849090","n1819849116","n1819848951","n1819848981","n1819848989","n1819849018","n1819848963","n1819848949","n1819849109","n1819849087","n1819848925","n1819848852","n1819848998","n1819849057"]},"r270264":{"id":"r270264","version":"8","changeset":"13611326","user":"migurski","uid":"8287","visible":"true","timestamp":"2012-10-23T23:35:16Z","tags":{"network":"US:MI","ref":"86","route":"road","state_id":"MI","type":"route","url":"http://en.wikipedia.org/wiki/M-86_%28Michigan_highway%29"},"members":[{"id":"w17737723","type":"way","role":""},{"id":"w17735949","type":"way","role":""},{"id":"w17740404","type":"way","role":""},{"id":"w17966273","type":"way","role":""},{"id":"w17964745","type":"way","role":""},{"id":"w151538068","type":"way","role":""},{"id":"w151538067","type":"way","role":""},{"id":"w17964960","type":"way","role":""},{"id":"w17966099","type":"way","role":""},{"id":"w17968009","type":"way","role":""},{"id":"w41259499","type":"way","role":""},{"id":"w151540401","type":"way","role":""},{"id":"w151540418","type":"way","role":""},{"id":"w17967997","type":"way","role":""},{"id":"w17966029","type":"way","role":""},{"id":"w17964801","type":"way","role":""},{"id":"w41259496","type":"way","role":""},{"id":"w151540399","type":"way","role":""},{"id":"w17968004","type":"way","role":""},{"id":"w17966462","type":"way","role":""},{"id":"w134150830","type":"way","role":""},{"id":"w134150801","type":"way","role":""},{"id":"w17732295","type":"way","role":""}]},"n185980093":{"id":"n185980093","loc":[-85.6271414,41.9407274],"version":"4","changeset":"12805153","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-08-21T08:30:01Z","tags":{}},"n185964330":{"id":"n185964330","loc":[-85.6235688,41.9399111],"version":"3","changeset":"12805153","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-08-21T08:30:01Z","tags":{}},"n185964328":{"id":"n185964328","loc":[-85.6235609,41.9391301],"version":"3","changeset":"12805153","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-08-21T08:30:01Z","tags":{}},"n185958034":{"id":"n185958034","loc":[-85.627102,41.939125],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T04:58:00Z","tags":{}},"n185964331":{"id":"n185964331","loc":[-85.623571,41.940124],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:01:21Z","tags":{}},"n185964329":{"id":"n185964329","loc":[-85.623562,41.9392411],"version":"3","changeset":"12805153","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-08-21T08:30:01Z","tags":{}},"n185972756":{"id":"n185972756","loc":[-85.623802,41.939102],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:05:35Z","tags":{}},"n185972757":{"id":"n185972757","loc":[-85.623584,41.93913],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:05:35Z","tags":{}},"n185975325":{"id":"n185975325","loc":[-85.624835,41.939318],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:06:57Z","tags":{}},"n185975326":{"id":"n185975326","loc":[-85.624811,41.939435],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:06:57Z","tags":{}},"n185975327":{"id":"n185975327","loc":[-85.624635,41.939703],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:06:57Z","tags":{}},"n185975328":{"id":"n185975328","loc":[-85.624366,41.940055],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:06:57Z","tags":{}},"n185975330":{"id":"n185975330","loc":[-85.624287,41.940113],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:06:57Z","tags":{}},"n185975332":{"id":"n185975332","loc":[-85.624215,41.940134],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:06:57Z","tags":{}},"n185980088":{"id":"n185980088","loc":[-85.627127,41.940086],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:09:28Z","tags":{}},"n185988943":{"id":"n185988943","loc":[-85.622643,41.940128],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:14:15Z","tags":{}},"n185988961":{"id":"n185988961","loc":[-85.627263,41.940082],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:14:16Z","tags":{}},"n185990192":{"id":"n185990192","loc":[-85.622933,41.939224],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:14:56Z","tags":{}},"n185990194":{"id":"n185990194","loc":[-85.621976,41.939203],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:14:56Z","tags":{}},"n185991378":{"id":"n185991378","loc":[-85.622643,41.940635],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:15:34Z","tags":{}},"n1475283999":{"id":"n1475283999","loc":[-85.6271165,41.9408429],"version":"1","changeset":"9619138","user":"bbmiller","uid":"451048","visible":"true","timestamp":"2011-10-21T19:45:46Z","tags":{}},"n185980090":{"id":"n185980090","loc":[-85.6271315,41.9402001],"version":"3","changeset":"9619138","user":"bbmiller","uid":"451048","visible":"true","timestamp":"2011-10-21T19:45:59Z","tags":{}},"n185958036":{"id":"n185958036","loc":[-85.6248366,41.9391615],"version":"3","changeset":"9619138","user":"bbmiller","uid":"451048","visible":"true","timestamp":"2011-10-21T19:46:01Z","tags":{}},"n1819800188":{"id":"n1819800188","loc":[-85.6246947,41.9401644],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:03:21Z","tags":{}},"n1819800199":{"id":"n1819800199","loc":[-85.6233686,41.9430896],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:03:22Z","tags":{}},"n1819800204":{"id":"n1819800204","loc":[-85.6223236,41.9408587],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:03:22Z","tags":{}},"n1819800213":{"id":"n1819800213","loc":[-85.6247526,41.9414138],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:03:22Z","tags":{}},"n1819800216":{"id":"n1819800216","loc":[-85.6230961,41.9407151],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:03:22Z","tags":{}},"n1819800218":{"id":"n1819800218","loc":[-85.621991,41.9429336],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:03:22Z","tags":{}},"n1819800221":{"id":"n1819800221","loc":[-85.6246088,41.9424708],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:03:22Z","tags":{}},"n1819800227":{"id":"n1819800227","loc":[-85.6241368,41.9403081],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:03:22Z","tags":{}},"n1819800230":{"id":"n1819800230","loc":[-85.6226776,41.9431012],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:03:22Z","tags":{}},"n1819800231":{"id":"n1819800231","loc":[-85.6243728,41.9401644],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:03:22Z","tags":{}},"n1819800232":{"id":"n1819800232","loc":[-85.6249629,41.9408907],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:03:22Z","tags":{}},"n1819800248":{"id":"n1819800248","loc":[-85.6238685,41.9405555],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:03:23Z","tags":{}},"n1819800266":{"id":"n1819800266","loc":[-85.6246882,41.9418367],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:03:23Z","tags":{}},"n1819800271":{"id":"n1819800271","loc":[-85.62492,41.9413695],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:03:23Z","tags":{}},"n1819800294":{"id":"n1819800294","loc":[-85.6243556,41.9427465],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:03:24Z","tags":{}},"n1819800304":{"id":"n1819800304","loc":[-85.6251453,41.94117],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:03:24Z","tags":{}},"n1819800325":{"id":"n1819800325","loc":[-85.6248234,41.9405714],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:03:25Z","tags":{}},"n1819800362":{"id":"n1819800362","loc":[-85.6239544,41.9429416],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:03:25Z","tags":{}},"n1819800368":{"id":"n1819800368","loc":[-85.6243406,41.9402283],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:03:26Z","tags":{}},"n1819800375":{"id":"n1819800375","loc":[-85.6226562,41.940755],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:03:26Z","tags":{}},"n1819800377":{"id":"n1819800377","loc":[-85.6232033,41.9406512],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:03:26Z","tags":{}},"n185945133":{"id":"n185945133","loc":[-85.623501,41.933232],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T04:52:24Z","tags":{}},"n185945135":{"id":"n185945135","loc":[-85.624776,41.933205],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T04:52:24Z","tags":{}},"n185945395":{"id":"n185945395","loc":[-85.624741,41.93019],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T04:52:30Z","tags":{}},"n185952239":{"id":"n185952239","loc":[-85.615166,41.9382],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T04:55:12Z","tags":{}},"n185954490":{"id":"n185954490","loc":[-85.624721,41.929278],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T04:56:27Z","tags":{}},"n185957831":{"id":"n185957831","loc":[-85.625041,41.938662],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T04:57:55Z","tags":{}},"n185958030":{"id":"n185958030","loc":[-85.629033,41.93913],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T04:58:00Z","tags":{}},"n185958032":{"id":"n185958032","loc":[-85.628429,41.939143],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T04:58:00Z","tags":{}},"n185958498":{"id":"n185958498","loc":[-85.621605,41.940143],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T04:58:27Z","tags":{}},"n185961186":{"id":"n185961186","loc":[-85.624792,41.935214],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T04:59:34Z","tags":{}},"n185963099":{"id":"n185963099","loc":[-85.6204461,41.9401485],"version":"3","changeset":"15379124","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-15T23:38:37Z","tags":{}},"n185963698":{"id":"n185963698","loc":[-85.6297342,41.9400783],"version":"3","changeset":"9619138","user":"bbmiller","uid":"451048","visible":"true","timestamp":"2011-10-21T19:54:55Z","tags":{}},"n185964320":{"id":"n185964320","loc":[-85.623511,41.934216],"version":"3","changeset":"12805153","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-08-21T08:30:01Z","tags":{}},"n185964322":{"id":"n185964322","loc":[-85.6235312,41.9362084],"version":"3","changeset":"12805153","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-08-21T08:30:01Z","tags":{}},"n185964324":{"id":"n185964324","loc":[-85.6235488,41.9371726],"version":"3","changeset":"12805153","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-08-21T08:30:01Z","tags":{}},"n185964326":{"id":"n185964326","loc":[-85.6235512,41.9381718],"version":"3","changeset":"12805153","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-08-21T08:30:01Z","tags":{}},"n185967077":{"id":"n185967077","loc":[-85.617359,41.940161],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:02:54Z","tags":{}},"n185967634":{"id":"n185967634","loc":[-85.6248039,41.9362012],"version":"3","changeset":"12805153","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-08-21T08:29:59Z","tags":{}},"n185970833":{"id":"n185970833","loc":[-85.6248019,41.9381684],"version":"3","changeset":"12805153","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-08-21T08:30:00Z","tags":{}},"n185972752":{"id":"n185972752","loc":[-85.624582,41.938848],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:05:35Z","tags":{}},"n185972754":{"id":"n185972754","loc":[-85.6242,41.939008],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:05:35Z","tags":{}},"n185973251":{"id":"n185973251","loc":[-85.602727,41.936012],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:05:49Z","tags":{}},"n185974509":{"id":"n185974509","loc":[-85.62478,41.93217],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:06:19Z","tags":{}},"n185975315":{"id":"n185975315","loc":[-85.624703,41.925597],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:06:56Z","tags":{}},"n185975316":{"id":"n185975316","loc":[-85.624716,41.927359],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:06:57Z","tags":{}},"n185975317":{"id":"n185975317","loc":[-85.62475,41.93119],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:06:57Z","tags":{}},"n185975318":{"id":"n185975318","loc":[-85.624782,41.934218],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:06:57Z","tags":{}},"n185975320":{"id":"n185975320","loc":[-85.6247949,41.9371708],"version":"3","changeset":"12805153","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-08-21T08:29:58Z","tags":{}},"n185977754":{"id":"n185977754","loc":[-85.6276,41.937412],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:08:04Z","tags":{}},"n185980075":{"id":"n185980075","loc":[-85.627451,41.937549],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:09:28Z","tags":{}},"n185980077":{"id":"n185980077","loc":[-85.627375,41.937618],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:09:28Z","tags":{}},"n185980078":{"id":"n185980078","loc":[-85.627278,41.937728],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:09:28Z","tags":{}},"n185980079":{"id":"n185980079","loc":[-85.627199,41.937842],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:09:28Z","tags":{}},"n185980081":{"id":"n185980081","loc":[-85.627141,41.937981],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:09:28Z","tags":{}},"n185980083":{"id":"n185980083","loc":[-85.627109,41.938153],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:09:28Z","tags":{}},"n185980085":{"id":"n185980085","loc":[-85.627101,41.938699],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:09:28Z","tags":{}},"n185981173":{"id":"n185981173","loc":[-85.61433,41.940167],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:10:02Z","tags":{}},"n185987021":{"id":"n185987021","loc":[-85.628311,41.942261],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:13:07Z","tags":{}},"n185988963":{"id":"n185988963","loc":[-85.628439,41.940086],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:14:16Z","tags":{}},"n185990195":{"id":"n185990195","loc":[-85.621225,41.939143],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:14:56Z","tags":{}},"n185990196":{"id":"n185990196","loc":[-85.620576,41.939033],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:14:56Z","tags":{}},"n185990198":{"id":"n185990198","loc":[-85.619081,41.938804],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:14:56Z","tags":{}},"n185990200":{"id":"n185990200","loc":[-85.617593,41.938552],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:14:56Z","tags":{}},"n185990202":{"id":"n185990202","loc":[-85.617372,41.938535],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:14:56Z","tags":{}},"n185990204":{"id":"n185990204","loc":[-85.616087,41.93832],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:14:56Z","tags":{}},"n185990206":{"id":"n185990206","loc":[-85.615754,41.938289],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:14:57Z","tags":{}},"n185990209":{"id":"n185990209","loc":[-85.615438,41.938251],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:14:57Z","tags":{}},"n185990211":{"id":"n185990211","loc":[-85.613469,41.937867],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:14:57Z","tags":{}},"n185990212":{"id":"n185990212","loc":[-85.610172,41.937298],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:14:57Z","tags":{}},"n185990213":{"id":"n185990213","loc":[-85.605537,41.936497],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:14:57Z","tags":{}},"n185990214":{"id":"n185990214","loc":[-85.604014,41.936234],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:14:57Z","tags":{}},"n1819800180":{"id":"n1819800180","loc":[-85.588775,41.9455032],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:03:21Z","tags":{}},"n1819800181":{"id":"n1819800181","loc":[-85.6074212,41.9408827],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:03:21Z","tags":{}},"n1819800182":{"id":"n1819800182","loc":[-85.6131397,41.9427022],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:03:21Z","tags":{}},"n1819800183":{"id":"n1819800183","loc":[-85.6171523,41.9416807],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:03:21Z","tags":{}},"n1819800184":{"id":"n1819800184","loc":[-85.602465,41.9397415],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:03:21Z","tags":{}},"n1819800185":{"id":"n1819800185","loc":[-85.6109296,41.9410583],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:03:21Z","tags":{}},"n1819800186":{"id":"n1819800186","loc":[-85.6165729,41.9418004],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:03:21Z","tags":{}},"n1819800189":{"id":"n1819800189","loc":[-85.5866293,41.9458224],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:03:21Z","tags":{}},"n1819800191":{"id":"n1819800191","loc":[-85.5853311,41.9466603],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:03:21Z","tags":{}},"n1819800201":{"id":"n1819800201","loc":[-85.6101142,41.9433406],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:03:22Z","tags":{}},"n1819800202":{"id":"n1819800202","loc":[-85.600963,41.9428618],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:03:22Z","tags":{}},"n1819800206":{"id":"n1819800206","loc":[-85.6154357,41.9427501],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:03:22Z","tags":{}},"n1819800207":{"id":"n1819800207","loc":[-85.6040309,41.9414094],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:03:22Z","tags":{}},"n1819800209":{"id":"n1819800209","loc":[-85.6113694,41.943189],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:03:22Z","tags":{}},"n1819800211":{"id":"n1819800211","loc":[-85.618032,41.9416408],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:03:22Z","tags":{}},"n1819800214":{"id":"n1819800214","loc":[-85.5959419,41.9402602],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:03:22Z","tags":{}},"n1819800219":{"id":"n1819800219","loc":[-85.5972117,41.9420043],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:03:22Z","tags":{}},"n1819800223":{"id":"n1819800223","loc":[-85.6117171,41.9430019],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:03:22Z","tags":{}},"n1819800224":{"id":"n1819800224","loc":[-85.5977873,41.9395579],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:03:22Z","tags":{}},"n1819800226":{"id":"n1819800226","loc":[-85.5917362,41.9432209],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:03:22Z","tags":{}},"n1819800228":{"id":"n1819800228","loc":[-85.6055759,41.9419122],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:03:22Z","tags":{}},"n1819800229":{"id":"n1819800229","loc":[-85.6203395,41.9425595],"version":"2","changeset":"14894526","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T11:32:18Z","tags":{}},"n1819800233":{"id":"n1819800233","loc":[-85.6107579,41.9433007],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:03:22Z","tags":{}},"n1819800234":{"id":"n1819800234","loc":[-85.6039773,41.9412498],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:03:22Z","tags":{}},"n1819800235":{"id":"n1819800235","loc":[-85.6000977,41.9412861],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:03:22Z","tags":{}},"n1819800236":{"id":"n1819800236","loc":[-85.6026689,41.9407231],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:03:22Z","tags":{}},"n1819800237":{"id":"n1819800237","loc":[-85.615161,41.9428662],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:03:23Z","tags":{}},"n1819800238":{"id":"n1819800238","loc":[-85.5878953,41.9454314],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:03:23Z","tags":{}},"n1819800239":{"id":"n1819800239","loc":[-85.6035267,41.941569],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:03:23Z","tags":{}},"n1819800240":{"id":"n1819800240","loc":[-85.5929738,41.9450208],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:03:23Z","tags":{}},"n1819800241":{"id":"n1819800241","loc":[-85.6186329,41.9416488],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:03:23Z","tags":{}},"n1819800242":{"id":"n1819800242","loc":[-85.5881136,41.9483963],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:03:23Z","tags":{}},"n1819800243":{"id":"n1819800243","loc":[-85.5909208,41.9466922],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:03:23Z","tags":{}},"n1819800244":{"id":"n1819800244","loc":[-85.5997721,41.9394941],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:03:23Z","tags":{}},"n1819800245":{"id":"n1819800245","loc":[-85.6202064,41.9425712],"version":"2","changeset":"14894526","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T11:32:18Z","tags":{}},"n1819800246":{"id":"n1819800246","loc":[-85.591071,41.9448808],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:03:23Z","tags":{}},"n1819800247":{"id":"n1819800247","loc":[-85.5866078,41.9490622],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:03:23Z","tags":{}},"n1819800250":{"id":"n1819800250","loc":[-85.602383,41.9420841],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:03:23Z","tags":{}},"n1819800251":{"id":"n1819800251","loc":[-85.5957418,41.9426906],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:03:23Z","tags":{}},"n1819800255":{"id":"n1819800255","loc":[-85.6157039,41.9416727],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:03:23Z","tags":{}},"n1819800256":{"id":"n1819800256","loc":[-85.6080328,41.9410982],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:03:23Z","tags":{}},"n1819800258":{"id":"n1819800258","loc":[-85.6192551,41.9414892],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:03:23Z","tags":{}},"n1819800260":{"id":"n1819800260","loc":[-85.6104253,41.94117],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:03:23Z","tags":{}},"n1819800261":{"id":"n1819800261","loc":[-85.6204503,41.9425709],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:03:23Z","tags":{}},"n1819800263":{"id":"n1819800263","loc":[-85.5872194,41.9455431],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:03:23Z","tags":{}},"n1819800264":{"id":"n1819800264","loc":[-85.616176,41.9418244],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:03:23Z","tags":{}},"n1819800268":{"id":"n1819800268","loc":[-85.6120883,41.9426703],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:03:23Z","tags":{}},"n1819800269":{"id":"n1819800269","loc":[-85.5894547,41.9474946],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:03:23Z","tags":{}},"n1819800272":{"id":"n1819800272","loc":[-85.6209181,41.9425027],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:03:23Z","tags":{}},"n1819800274":{"id":"n1819800274","loc":[-85.6122814,41.9412817],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:03:23Z","tags":{}},"n1819800276":{"id":"n1819800276","loc":[-85.5895153,41.9452798],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:03:23Z","tags":{}},"n1819800277":{"id":"n1819800277","loc":[-85.5884317,41.9455272],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:03:23Z","tags":{}},"n1819800279":{"id":"n1819800279","loc":[-85.5884103,41.9480966],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:03:23Z","tags":{}},"n1819800287":{"id":"n1819800287","loc":[-85.5904917,41.9453915],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:03:24Z","tags":{}},"n1819800288":{"id":"n1819800288","loc":[-85.6212292,41.9412977],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:03:24Z","tags":{}},"n1819800289":{"id":"n1819800289","loc":[-85.5954377,41.9406832],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:03:24Z","tags":{}},"n1819800290":{"id":"n1819800290","loc":[-85.593721,41.9420957],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:03:24Z","tags":{}},"n1819800291":{"id":"n1819800291","loc":[-85.6162832,41.9427102],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:03:24Z","tags":{}},"n1819800292":{"id":"n1819800292","loc":[-85.605018,41.9401804],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:03:24Z","tags":{}},"n1819800293":{"id":"n1819800293","loc":[-85.6086443,41.941146],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:03:24Z","tags":{}},"n1819800296":{"id":"n1819800296","loc":[-85.6204675,41.9413775],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:03:24Z","tags":{}},"n1819800297":{"id":"n1819800297","loc":[-85.612496,41.9424947],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:03:24Z","tags":{}},"n1819800299":{"id":"n1819800299","loc":[-85.6065629,41.9423431],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:03:24Z","tags":{}},"n1819800301":{"id":"n1819800301","loc":[-85.6036125,41.9398452],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:03:24Z","tags":{}},"n1819800303":{"id":"n1819800303","loc":[-85.6114767,41.94117],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:03:24Z","tags":{}},"n1819800306":{"id":"n1819800306","loc":[-85.592616,41.9428139],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:03:24Z","tags":{}},"n1819800308":{"id":"n1819800308","loc":[-85.6023041,41.9419521],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:03:24Z","tags":{}},"n1819800310":{"id":"n1819800310","loc":[-85.6218944,41.9411061],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:03:24Z","tags":{}},"n1819800311":{"id":"n1819800311","loc":[-85.6097816,41.941162],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:03:24Z","tags":{}},"n1819800312":{"id":"n1819800312","loc":[-85.5922549,41.9457869],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:03:24Z","tags":{}},"n1819800313":{"id":"n1819800313","loc":[-85.5986027,41.9417206],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:03:24Z","tags":{}},"n1819800314":{"id":"n1819800314","loc":[-85.5918687,41.946138],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:03:24Z","tags":{}},"n1819800315":{"id":"n1819800315","loc":[-85.5872875,41.948883],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:03:24Z","tags":{}},"n1819800316":{"id":"n1819800316","loc":[-85.594272,41.9436642],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:03:25Z","tags":{}},"n1819800317":{"id":"n1819800317","loc":[-85.6176351,41.941577],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:03:25Z","tags":{}},"n1819800318":{"id":"n1819800318","loc":[-85.6137834,41.9430853],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:03:25Z","tags":{}},"n1819800319":{"id":"n1819800319","loc":[-85.6195383,41.942622],"version":"2","changeset":"14894526","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T11:32:18Z","tags":{"leisure":"slipway"}},"n1819800320":{"id":"n1819800320","loc":[-85.5971006,41.9398053],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:03:25Z","tags":{}},"n1819800321":{"id":"n1819800321","loc":[-85.601714,41.9406752],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:03:25Z","tags":{}},"n1819800322":{"id":"n1819800322","loc":[-85.5908028,41.9453117],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:03:25Z","tags":{}},"n1819800323":{"id":"n1819800323","loc":[-85.6062732,41.9404597],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:03:25Z","tags":{}},"n1819800324":{"id":"n1819800324","loc":[-85.62124,41.9425905],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:03:25Z","tags":{}},"n1819800327":{"id":"n1819800327","loc":[-85.6008664,41.942766],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:03:25Z","tags":{}},"n1819800328":{"id":"n1819800328","loc":[-85.6179355,41.9428538],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:03:25Z","tags":{}},"n1819800330":{"id":"n1819800330","loc":[-85.6045566,41.9415131],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:03:25Z","tags":{}},"n1819800331":{"id":"n1819800331","loc":[-85.5944935,41.9414653],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:03:25Z","tags":{}},"n1819800333":{"id":"n1819800333","loc":[-85.6088911,41.943181],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:03:25Z","tags":{}},"n1819800334":{"id":"n1819800334","loc":[-85.5946367,41.943369],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:03:25Z","tags":{}},"n1819800336":{"id":"n1819800336","loc":[-85.6150494,41.9429656],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:03:25Z","tags":{}},"n1819800343":{"id":"n1819800343","loc":[-85.6096099,41.9433326],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:03:25Z","tags":{}},"n1819800345":{"id":"n1819800345","loc":[-85.5915216,41.9435401],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:03:25Z","tags":{}},"n1819800347":{"id":"n1819800347","loc":[-85.607786,41.9428698],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:03:25Z","tags":{}},"n1819800349":{"id":"n1819800349","loc":[-85.6187616,41.9426623],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:03:25Z","tags":{}},"n1819800350":{"id":"n1819800350","loc":[-85.6012527,41.9426064],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:03:25Z","tags":{}},"n1819800352":{"id":"n1819800352","loc":[-85.6214867,41.9428379],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:03:25Z","tags":{}},"n1819800354":{"id":"n1819800354","loc":[-85.61338,41.94293],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:03:25Z","tags":{}},"n1819800355":{"id":"n1819800355","loc":[-85.5923156,41.9428139],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:03:25Z","tags":{}},"n1819800357":{"id":"n1819800357","loc":[-85.5901591,41.9453197],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:03:25Z","tags":{}},"n1819800359":{"id":"n1819800359","loc":[-85.6033979,41.9408827],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:03:25Z","tags":{}},"n1819800360":{"id":"n1819800360","loc":[-85.6186543,41.9414653],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:03:25Z","tags":{}},"n1819800363":{"id":"n1819800363","loc":[-85.6128607,41.9425665],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:03:25Z","tags":{}},"n1819800365":{"id":"n1819800365","loc":[-85.614234,41.9412977],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:03:25Z","tags":{}},"n1819800367":{"id":"n1819800367","loc":[-85.6089662,41.9410902],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:03:26Z","tags":{}},"n1819800369":{"id":"n1819800369","loc":[-85.6197379,41.9413695],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:03:26Z","tags":{}},"n1819800370":{"id":"n1819800370","loc":[-85.6037348,41.941733],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:03:26Z","tags":{}},"n1819800371":{"id":"n1819800371","loc":[-85.5993467,41.9415654],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:03:26Z","tags":{}},"n1819800372":{"id":"n1819800372","loc":[-85.598077,41.94196],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:03:26Z","tags":{}},"n1819800373":{"id":"n1819800373","loc":[-85.5984203,41.9394781],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:03:26Z","tags":{}},"n1819800374":{"id":"n1819800374","loc":[-85.6013315,41.9427066],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:03:26Z","tags":{}},"n1819800376":{"id":"n1819800376","loc":[-85.5934673,41.944167],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:03:26Z","tags":{}},"n1819800378":{"id":"n1819800378","loc":[-85.6011062,41.9407753],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:03:26Z","tags":{}},"n1819800379":{"id":"n1819800379","loc":[-85.6150602,41.9415131],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:03:26Z","tags":{}},"n1819800380":{"id":"n1819800380","loc":[-85.6132148,41.9412338],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:03:26Z","tags":{}},"n1819800381":{"id":"n1819800381","loc":[-85.5889038,41.9453835],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:03:26Z","tags":{}},"n2139966621":{"id":"n2139966621","loc":[-85.6198719,41.9426184],"version":"1","changeset":"14894526","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T11:32:17Z","tags":{}},"n2139966622":{"id":"n2139966622","loc":[-85.6197551,41.9426123],"version":"1","changeset":"14894526","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T11:32:17Z","tags":{}},"n2139966623":{"id":"n2139966623","loc":[-85.6196467,41.9426279],"version":"1","changeset":"14894526","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T11:32:18Z","tags":{}},"n2139966624":{"id":"n2139966624","loc":[-85.6191519,41.9426221],"version":"1","changeset":"14894526","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T11:32:18Z","tags":{}},"n2139966625":{"id":"n2139966625","loc":[-85.6194153,41.9426256],"version":"1","changeset":"14894526","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T11:32:18Z","tags":{}},"n2139966626":{"id":"n2139966626","loc":[-85.6200497,41.9425812],"version":"1","changeset":"14894526","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T11:32:18Z","tags":{}},"n2139966629":{"id":"n2139966629","loc":[-85.6192123,41.9426229],"version":"1","changeset":"14894526","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T11:32:18Z","tags":{}},"n2203933101":{"id":"n2203933101","loc":[-85.6030009,41.9360592],"version":"1","changeset":"15379124","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-15T23:38:36Z","tags":{}},"w17967539":{"id":"w17967539","version":"1","changeset":"402341","user":"DaveHansenTiger","uid":"7168","visible":"true","timestamp":"2007-12-23T20:52:28Z","tags":{"highway":"residential","name":"1st Ave","tiger:cfcc":"A41","tiger:county":"St. Joseph, MI","tiger:name_base":"1st","tiger:name_type":"Ave","tiger:reviewed":"no","tiger:separated":"no","tiger:source":"tiger_import_dch_v0.6_20070813","tiger:tlid":"15335113:15313280","tiger:upload_uuid":"bulk_upload.pl-b79f893a-0be1-4a5f-a183-6aea114c9af7"},"nodes":["n185965099","n185963395","n185987021"]},"w17967751":{"id":"w17967751","version":"2","changeset":"9619138","user":"bbmiller","uid":"451048","visible":"true","timestamp":"2011-10-21T19:55:03Z","tags":{"highway":"residential","name":"River St","tiger:cfcc":"A41","tiger:county":"St. Joseph, MI","tiger:name_base":"River","tiger:name_type":"St","tiger:reviewed":"no","tiger:separated":"no","tiger:source":"tiger_import_dch_v0.6_20070813","tiger:tlid":"15312481:15312487","tiger:upload_uuid":"bulk_upload.pl-b79f893a-0be1-4a5f-a183-6aea114c9af7","tiger:zip_left":"49093","tiger:zip_right":"49093"},"nodes":["n185980088","n185988961","n185988963","n185963698"]},"w17965088":{"id":"w17965088","version":"1","changeset":"402341","user":"DaveHansenTiger","uid":"7168","visible":"true","timestamp":"2007-12-23T20:34:20Z","tags":{"highway":"residential","name":"9th St","tiger:cfcc":"A41","tiger:county":"St. Joseph, MI","tiger:name_base":"9th","tiger:name_type":"St","tiger:reviewed":"no","tiger:separated":"no","tiger:source":"tiger_import_dch_v0.6_20070813","tiger:tlid":"15314207:15313759:15313772:15313802:15313796:15313781:15314179","tiger:upload_uuid":"bulk_upload.pl-b79f893a-0be1-4a5f-a183-6aea114c9af7","tiger:zip_left":"49093","tiger:zip_right":"49093"},"nodes":["n185945133","n185964320","n185964322","n185964324","n185964326","n185964328","n185964329","n185964330","n185964331"]},"w17964467":{"id":"w17964467","version":"1","changeset":"402341","user":"DaveHansenTiger","uid":"7168","visible":"true","timestamp":"2007-12-23T20:29:37Z","tags":{"highway":"residential","name":"Mechanic St","tiger:cfcc":"A41","tiger:county":"St. Joseph, MI","tiger:name_base":"Mechanic","tiger:name_type":"St","tiger:reviewed":"no","tiger:separated":"no","tiger:source":"tiger_import_dch_v0.6_20070813","tiger:tlid":"15312501:15312497:15335073","tiger:upload_uuid":"bulk_upload.pl-b79f893a-0be1-4a5f-a183-6aea114c9af7","tiger:zip_left":"49093","tiger:zip_right":"49093"},"nodes":["n185958030","n185958032","n185958034","n185958036"]},"w134150842":{"id":"w134150842","version":"1","changeset":"9619138","user":"bbmiller","uid":"451048","visible":"true","timestamp":"2011-10-21T19:45:56Z","tags":{"bridge":"yes","highway":"residential","name":"6th St","tiger:cfcc":"A41","tiger:county":"St. Joseph, MI","tiger:name_base":"6th","tiger:name_type":"St","tiger:reviewed":"no","tiger:separated":"no","tiger:source":"tiger_import_dch_v0.6_20070813","tiger:tlid":"15312892:15312519","tiger:upload_uuid":"bulk_upload.pl-b79f893a-0be1-4a5f-a183-6aea114c9af7"},"nodes":["n185980090","n185980093"]},"w17966740":{"id":"w17966740","version":"2","changeset":"9619138","user":"bbmiller","uid":"451048","visible":"true","timestamp":"2011-10-21T19:46:07Z","tags":{"highway":"residential","name":"6th St","tiger:cfcc":"A41","tiger:county":"St. Joseph, MI","tiger:name_base":"6th","tiger:name_type":"St","tiger:reviewed":"no","tiger:separated":"no","tiger:source":"tiger_import_dch_v0.6_20070813","tiger:tlid":"15312892:15312519","tiger:upload_uuid":"bulk_upload.pl-b79f893a-0be1-4a5f-a183-6aea114c9af7"},"nodes":["n185977754","n185980075","n185980077","n185980078","n185980079","n185980081","n185980083","n185980085","n185958034","n185980088","n185980090"]},"w170844765":{"id":"w170844765","version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:03:26Z","tags":{"waterway":"dam"},"nodes":["n1819800304","n1819800232","n1819800325","n1819800188"]},"w17967745":{"id":"w17967745","version":"2","changeset":"14676554","user":"bbmiller","uid":"451048","visible":"true","timestamp":"2013-01-16T20:05:21Z","tags":{"highway":"residential","name":"River St","tiger:cfcc":"A41","tiger:county":"St. Joseph, MI","tiger:name_base":"River","tiger:name_type":"St","tiger:reviewed":"no","tiger:zip_left":"49093","tiger:zip_right":"49093"},"nodes":["n185981173","n185967077","n185963099","n185958498","n185988943","n185964331","n185975332"]},"w17968113":{"id":"w17968113","version":"1","changeset":"402580","user":"DaveHansenTiger","uid":"7168","visible":"true","timestamp":"2007-12-23T20:56:09Z","tags":{"highway":"residential","name":"Green St","tiger:cfcc":"A41","tiger:county":"St. Joseph, MI","tiger:name_base":"Green","tiger:name_type":"St","tiger:reviewed":"no","tiger:separated":"no","tiger:source":"tiger_import_dch_v0.6_20070813","tiger:tlid":"15314409","tiger:upload_uuid":"bulk_upload.pl-b79f893a-0be1-4a5f-a183-6aea114c9af7"},"nodes":["n185988943","n185991378"]},"w134150833":{"id":"w134150833","version":"1","changeset":"9619138","user":"bbmiller","uid":"451048","visible":"true","timestamp":"2011-10-21T19:45:55Z","tags":{"highway":"residential","name":"6th St","tiger:cfcc":"A41","tiger:county":"St. Joseph, MI","tiger:name_base":"6th","tiger:name_type":"St","tiger:reviewed":"no","tiger:separated":"no","tiger:source":"tiger_import_dch_v0.6_20070813","tiger:tlid":"15312892:15312519","tiger:upload_uuid":"bulk_upload.pl-b79f893a-0be1-4a5f-a183-6aea114c9af7"},"nodes":["n185980093","n1475283999","n185963392"]},"w17967935":{"id":"w17967935","version":"3","changeset":"15379124","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-15T23:38:37Z","tags":{"name":"Michigan Central Railroad","railway":"abandoned","tiger:cfcc":"B11","tiger:county":"St. Joseph, MI","tiger:name_base":"Michigan Central Railroad","tiger:reviewed":"no"},"nodes":["n185972757","n185990192","n185990194","n185990195","n185990196","n185990198","n185990200","n185990202","n185990204","n185990206","n185990209","n185952239","n185990211","n185990212","n185990213","n185990214","n2203933101","n185973251"]},"w17965993":{"id":"w17965993","version":"2","changeset":"9619138","user":"bbmiller","uid":"451048","visible":"true","timestamp":"2011-10-21T19:46:19Z","tags":{"name":"Conrail Railroad","railway":"abandoned","tiger:cfcc":"B11","tiger:county":"St. Joseph, MI","tiger:name_base":"Conrail Railroad","tiger:reviewed":"no","tiger:source":"tiger_import_dch_v0.6_20070813","tiger:tlid":"15314180:15314177","tiger:upload_uuid":"bulk_upload.pl-b79f893a-0be1-4a5f-a183-6aea114c9af7"},"nodes":["n185957831","n185972752","n185972754","n185972756","n185972757"]},"w17966211":{"id":"w17966211","version":"2","changeset":"9619138","user":"bbmiller","uid":"451048","visible":"true","timestamp":"2011-10-21T19:46:07Z","tags":{"highway":"residential","name":"8th St","tiger:cfcc":"A41","tiger:county":"St. Joseph, MI","tiger:name_base":"8th","tiger:name_type":"St","tiger:reviewed":"no","tiger:separated":"no","tiger:source":"tiger_import_dch_v0.6_20070813","tiger:tlid":"15313757:15313771:15313791:15313794:15313799:15313811:15313814:15313824:15313846:15314618:15313817:15313788:15314178:15324590","tiger:upload_uuid":"bulk_upload.pl-b79f893a-0be1-4a5f-a183-6aea114c9af7","tiger:zip_left":"49093","tiger:zip_right":"49093"},"nodes":["n185975315","n185975316","n185954490","n185945395","n185975317","n185974509","n185945135","n185975318","n185961186","n185967634","n185975320","n185970833","n185958036","n185975325","n185975326","n185975327","n185975328","n185975330","n185975332"]},"w170844766":{"id":"w170844766","version":"2","changeset":"14894526","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T11:32:18Z","tags":{"source":"Bing","waterway":"riverbank"},"nodes":["n1819800229","n1819800245","n2139966626","n2139966621","n2139966622","n2139966623","n1819800319","n2139966625","n2139966629","n2139966624","n1819800349","n1819800328","n1819800291","n1819800206","n1819800237","n1819800336","n1819800318","n1819800354","n1819800182","n1819800363","n1819800297","n1819800268","n1819800223","n1819800209","n1819800233","n1819800201","n1819800343","n1819800333","n1819800347","n1819800299","n1819800228","n1819800330","n1819800370","n1819800250","n1819800374","n1819800202","n1819800327","n1819800350","n1819800308","n1819800239","n1819800207","n1819800234","n1819800359","n1819800236","n1819800321","n1819800378","n1819800235","n1819800371","n1819800313","n1819800372","n1819800219","n1819800251","n1819800334","n1819800316","n1819800376","n1819800240","n1819800312","n1819800314","n1819800243","n1819800269","n1819800279","n1819800242","n1819800315","n1819800247","n1819800191","n1819800189","n1819800263","n1819800238","n1819800277","n1819800180","n1819800381","n1819800276","n1819800357","n1819800287","n1819800322","n1819800246","n1819800345","n1819800226","n1819800355","n1819800306","n1819800290","n1819800331","n1819800289","n1819800214","n1819800320","n1819800224","n1819800373","n1819800244","n1819800184","n1819800301","n1819800292","n1819800323","n1819800181","n1819800256","n1819800293","n1819800367","n1819800311","n1819800260","n1819800185","n1819800303","n1819800274","n1819800380","n1819800365","n1819800379","n1819800255","n1819800264","n1819800186","n1819800183","n1819800317","n1819800211","n1819800241","n1819800360","n1819800258","n1819800369","n1819800296","n1819800288","n1819800310","n1819800204","n1819800375","n1819800216","n1819800377","n1819800248","n1819800227","n1819800368","n1819800231","n1819800188","n1819800325","n1819800232","n1819800304","n1819800271","n1819800213","n1819800266","n1819800221","n1819800294","n1819800362","n1819800199","n1819800230","n1819800218","n1819800352","n1819800324","n1819800272","n1819800261","n1819800229"]},"n1875654132":{"id":"n1875654132","loc":[-85.6297439,41.939808],"version":"1","changeset":"12805153","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-08-21T08:29:36Z","tags":{}},"n1475293263":{"id":"n1475293263","loc":[-85.6296235,41.939922],"version":"2","changeset":"12805153","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-08-21T08:30:02Z","tags":{}},"n185947850":{"id":"n185947850","loc":[-85.631594,41.942613],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T04:53:22Z","tags":{}},"n185952745":{"id":"n185952745","loc":[-85.630986,41.941786],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T04:55:25Z","tags":{}},"n185972907":{"id":"n185972907","loc":[-85.631797,41.9420055],"version":"3","changeset":"9619138","user":"bbmiller","uid":"451048","visible":"true","timestamp":"2011-10-21T19:54:55Z","tags":{}},"n185972911":{"id":"n185972911","loc":[-85.6309723,41.9411623],"version":"3","changeset":"9619138","user":"bbmiller","uid":"451048","visible":"true","timestamp":"2011-10-21T19:54:55Z","tags":{}},"n185972915":{"id":"n185972915","loc":[-85.6295971,41.939267],"version":"3","changeset":"9619138","user":"bbmiller","uid":"451048","visible":"true","timestamp":"2011-10-21T19:54:55Z","tags":{}},"n1475293223":{"id":"n1475293223","loc":[-85.6313962,41.9416114],"version":"1","changeset":"9619138","user":"bbmiller","uid":"451048","visible":"true","timestamp":"2011-10-21T19:54:50Z","tags":{"railway":"level_crossing"}},"n1475293231":{"id":"n1475293231","loc":[-85.6318779,41.9415447],"version":"1","changeset":"9619138","user":"bbmiller","uid":"451048","visible":"true","timestamp":"2011-10-21T19:54:50Z","tags":{}},"n1475293241":{"id":"n1475293241","loc":[-85.6304613,41.9405499],"version":"1","changeset":"9619138","user":"bbmiller","uid":"451048","visible":"true","timestamp":"2011-10-21T19:54:51Z","tags":{}},"n1475293246":{"id":"n1475293246","loc":[-85.6297512,41.9395393],"version":"2","changeset":"12805153","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-08-21T08:30:02Z","tags":{"railway":"level_crossing"}},"n1475293251":{"id":"n1475293251","loc":[-85.6316633,41.9415128],"version":"1","changeset":"9619138","user":"bbmiller","uid":"451048","visible":"true","timestamp":"2011-10-21T19:54:51Z","tags":{}},"n2139982404":{"id":"n2139982404","loc":[-85.6313283,41.9413748],"version":"1","changeset":"14894784","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T11:53:27Z","tags":{}},"n2139982407":{"id":"n2139982407","loc":[-85.6325545,41.9417787],"version":"1","changeset":"14894784","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T11:53:27Z","tags":{}},"n2139982408":{"id":"n2139982408","loc":[-85.6324499,41.9417693],"version":"1","changeset":"14894784","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T11:53:27Z","tags":{}},"n2139982409":{"id":"n2139982409","loc":[-85.6324753,41.9416444],"version":"1","changeset":"14894784","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T11:53:27Z","tags":{}},"n2139982410":{"id":"n2139982410","loc":[-85.6325814,41.9416538],"version":"1","changeset":"14894784","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T11:53:27Z","tags":{}},"n2139982411":{"id":"n2139982411","loc":[-85.6319572,41.9413515],"version":"1","changeset":"14894784","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T11:53:27Z","tags":{}},"n2139982412":{"id":"n2139982412","loc":[-85.6322925,41.941139],"version":"1","changeset":"14894784","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T11:53:27Z","tags":{}},"n2139982413":{"id":"n2139982413","loc":[-85.6323153,41.941153],"version":"1","changeset":"14894784","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T11:53:27Z","tags":{}},"n2139982414":{"id":"n2139982414","loc":[-85.6323019,41.9412617],"version":"1","changeset":"14894784","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T11:53:27Z","tags":{}},"n2139982415":{"id":"n2139982415","loc":[-85.6323703,41.9412667],"version":"1","changeset":"14894784","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T11:53:27Z","tags":{}},"n2139982416":{"id":"n2139982416","loc":[-85.6323555,41.941538],"version":"1","changeset":"14894784","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T11:53:27Z","tags":{}},"n2139982417":{"id":"n2139982417","loc":[-85.6321343,41.9416777],"version":"1","changeset":"14894784","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T11:53:27Z","tags":{}},"n2139982418":{"id":"n2139982418","loc":[-85.6319425,41.9416866],"version":"1","changeset":"14894784","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T11:53:27Z","tags":{}},"n2139982419":{"id":"n2139982419","loc":[-85.6320303,41.9416941],"version":"1","changeset":"14894784","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T11:53:27Z","tags":{}},"n2139982420":{"id":"n2139982420","loc":[-85.6321665,41.9415554],"version":"1","changeset":"14894784","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T11:53:27Z","tags":{}},"n2139982421":{"id":"n2139982421","loc":[-85.632412,41.9414164],"version":"1","changeset":"14894784","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T11:53:27Z","tags":{}},"n2139982422":{"id":"n2139982422","loc":[-85.6324801,41.9413421],"version":"1","changeset":"14894784","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T11:53:27Z","tags":{}},"n2139982423":{"id":"n2139982423","loc":[-85.6325023,41.9412585],"version":"1","changeset":"14894784","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T11:53:27Z","tags":{}},"n2139982424":{"id":"n2139982424","loc":[-85.6324532,41.9411607],"version":"1","changeset":"14894784","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T11:53:27Z","tags":{}},"n2139982425":{"id":"n2139982425","loc":[-85.6323502,41.941103],"version":"1","changeset":"14894784","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T11:53:27Z","tags":{}},"n2139982426":{"id":"n2139982426","loc":[-85.6322362,41.9411183],"version":"1","changeset":"14894784","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T11:53:27Z","tags":{}},"n2139982427":{"id":"n2139982427","loc":[-85.6318941,41.9413551],"version":"1","changeset":"14894784","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T11:53:27Z","tags":{}},"n2139982428":{"id":"n2139982428","loc":[-85.6318592,41.9414105],"version":"1","changeset":"14894784","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T11:53:27Z","tags":{}},"n2139982429":{"id":"n2139982429","loc":[-85.6320111,41.9415866],"version":"1","changeset":"14894784","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T11:53:27Z","tags":{}},"n2139982430":{"id":"n2139982430","loc":[-85.632446,41.9413792],"version":"1","changeset":"14894784","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T11:53:27Z","tags":{}},"n2139982431":{"id":"n2139982431","loc":[-85.6325112,41.941416],"version":"1","changeset":"14894784","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T11:53:27Z","tags":{}},"n2139982432":{"id":"n2139982432","loc":[-85.6325449,41.9416345],"version":"1","changeset":"14894784","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T11:53:27Z","tags":{}},"n2139982433":{"id":"n2139982433","loc":[-85.6326122,41.94164],"version":"1","changeset":"14894784","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T11:53:27Z","tags":{}},"n2139982434":{"id":"n2139982434","loc":[-85.6325954,41.9421966],"version":"1","changeset":"14894784","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T11:53:27Z","tags":{}},"n2139982435":{"id":"n2139982435","loc":[-85.6325655,41.9422411],"version":"1","changeset":"14894784","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T11:53:27Z","tags":{}},"n2139982436":{"id":"n2139982436","loc":[-85.632515,41.9422564],"version":"1","changeset":"14894784","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T11:53:27Z","tags":{}},"n2139982437":{"id":"n2139982437","loc":[-85.6324495,41.94223],"version":"1","changeset":"14894784","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T11:53:27Z","tags":{}},"n2139982438":{"id":"n2139982438","loc":[-85.6324009,41.9421743],"version":"1","changeset":"14894784","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T11:53:27Z","tags":{}},"n2139982439":{"id":"n2139982439","loc":[-85.6323915,41.9421145],"version":"1","changeset":"14894784","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T11:53:27Z","tags":{}},"n2139982440":{"id":"n2139982440","loc":[-85.6320287,41.9418585],"version":"1","changeset":"14894784","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T11:53:27Z","tags":{}},"n2139982441":{"id":"n2139982441","loc":[-85.6318285,41.9416387],"version":"1","changeset":"14894784","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T11:53:27Z","tags":{}},"n1475293258":{"id":"n1475293258","loc":[-85.6318289,41.9415077],"version":"2","changeset":"14894784","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T11:53:28Z","tags":{}},"n2168544754":{"id":"n2168544754","loc":[-85.6312814,41.9431198],"version":"1","changeset":"15132216","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-23T08:37:01Z","tags":{}},"n2168544755":{"id":"n2168544755","loc":[-85.6314212,41.9430646],"version":"1","changeset":"15132216","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-23T08:37:01Z","tags":{}},"n2168544756":{"id":"n2168544756","loc":[-85.6313387,41.942949],"version":"1","changeset":"15132216","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-23T08:37:01Z","tags":{}},"n2168544757":{"id":"n2168544757","loc":[-85.6311989,41.9430041],"version":"1","changeset":"15132216","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-23T08:37:01Z","tags":{}},"n2168544758":{"id":"n2168544758","loc":[-85.6311024,41.9429313],"version":"1","changeset":"15132216","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-23T08:37:01Z","tags":{}},"n2168544759":{"id":"n2168544759","loc":[-85.6310087,41.9428087],"version":"1","changeset":"15132216","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-23T08:37:01Z","tags":{}},"n2168544760":{"id":"n2168544760","loc":[-85.6313831,41.9426504],"version":"1","changeset":"15132216","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-23T08:37:01Z","tags":{}},"n2168544761":{"id":"n2168544761","loc":[-85.6314768,41.9427729],"version":"1","changeset":"15132216","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-23T08:37:01Z","tags":{}},"n2168544762":{"id":"n2168544762","loc":[-85.6306376,41.942809],"version":"1","changeset":"15132216","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-23T08:37:01Z","tags":{}},"n2168544763":{"id":"n2168544763","loc":[-85.6307378,41.9429427],"version":"1","changeset":"15132216","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-23T08:37:01Z","tags":{}},"n2168544764":{"id":"n2168544764","loc":[-85.630841,41.9428998],"version":"1","changeset":"15132216","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-23T08:37:01Z","tags":{}},"n2168544765":{"id":"n2168544765","loc":[-85.6307408,41.9427662],"version":"1","changeset":"15132216","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-23T08:37:01Z","tags":{}},"n2168544766":{"id":"n2168544766","loc":[-85.6305404,41.9426029],"version":"1","changeset":"15132216","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-23T08:37:01Z","tags":{}},"n2168544767":{"id":"n2168544767","loc":[-85.6304976,41.9426194],"version":"1","changeset":"15132216","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-23T08:37:01Z","tags":{}},"n2168544768":{"id":"n2168544768","loc":[-85.6305673,41.9427184],"version":"1","changeset":"15132216","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-23T08:37:02Z","tags":{}},"n2168544769":{"id":"n2168544769","loc":[-85.6306164,41.9426984],"version":"1","changeset":"15132216","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-23T08:37:02Z","tags":{}},"n2168544770":{"id":"n2168544770","loc":[-85.6306418,41.9427302],"version":"1","changeset":"15132216","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-23T08:37:02Z","tags":{}},"n2168544771":{"id":"n2168544771","loc":[-85.6306861,41.9427137],"version":"1","changeset":"15132216","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-23T08:37:02Z","tags":{}},"n2168544772":{"id":"n2168544772","loc":[-85.6307146,41.9427537],"version":"1","changeset":"15132216","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-23T08:37:02Z","tags":{}},"n2168544773":{"id":"n2168544773","loc":[-85.6308999,41.9426807],"version":"1","changeset":"15132216","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-23T08:37:02Z","tags":{}},"n2168544774":{"id":"n2168544774","loc":[-85.6308429,41.9426053],"version":"1","changeset":"15132216","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-23T08:37:02Z","tags":{}},"n2168544775":{"id":"n2168544775","loc":[-85.6308999,41.9425806],"version":"1","changeset":"15132216","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-23T08:37:02Z","tags":{}},"n2168544776":{"id":"n2168544776","loc":[-85.6308318,41.9424875],"version":"1","changeset":"15132216","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-23T08:37:02Z","tags":{}},"n2168544777":{"id":"n2168544777","loc":[-85.6307732,41.9425087],"version":"1","changeset":"15132216","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-23T08:37:02Z","tags":{}},"n2168544778":{"id":"n2168544778","loc":[-85.6307178,41.9424357],"version":"1","changeset":"15132216","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-23T08:37:02Z","tags":{}},"n2168544779":{"id":"n2168544779","loc":[-85.630485,41.942524],"version":"1","changeset":"15132216","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-23T08:37:02Z","tags":{}},"n2189099387":{"id":"n2189099387","loc":[-85.631203,41.9393371],"version":"1","changeset":"15276938","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T23:06:04Z","tags":{}},"n2189099404":{"id":"n2189099404","loc":[-85.6301963,41.9391363],"version":"1","changeset":"15276938","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T23:06:04Z","tags":{}},"n2189099405":{"id":"n2189099405","loc":[-85.6304447,41.9391352],"version":"1","changeset":"15276938","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T23:06:04Z","tags":{}},"n2189099406":{"id":"n2189099406","loc":[-85.6304463,41.9393391],"version":"1","changeset":"15276938","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T23:06:04Z","tags":{}},"n2189099407":{"id":"n2189099407","loc":[-85.6308435,41.9393373],"version":"1","changeset":"15276938","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T23:06:04Z","tags":{}},"n2189099408":{"id":"n2189099408","loc":[-85.6308418,41.9391251],"version":"1","changeset":"15276938","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T23:06:04Z","tags":{}},"n2189099409":{"id":"n2189099409","loc":[-85.6310929,41.939124],"version":"1","changeset":"15276938","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T23:06:04Z","tags":{}},"n2189099410":{"id":"n2189099410","loc":[-85.6310946,41.9393376],"version":"1","changeset":"15276938","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T23:06:04Z","tags":{}},"n2189112720":{"id":"n2189112720","loc":[-85.6314677,41.9412327],"version":"1","changeset":"15277056","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T23:26:14Z","tags":{}},"n2189112721":{"id":"n2189112721","loc":[-85.6313337,41.9411397],"version":"1","changeset":"15277056","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T23:26:14Z","tags":{}},"n2189112722":{"id":"n2189112722","loc":[-85.6320521,41.9405678],"version":"1","changeset":"15277056","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T23:26:14Z","tags":{}},"n2189112723":{"id":"n2189112723","loc":[-85.6321899,41.9406633],"version":"1","changeset":"15277056","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T23:26:14Z","tags":{}},"n2189112724":{"id":"n2189112724","loc":[-85.6313229,41.9408344],"version":"1","changeset":"15277056","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T23:26:14Z","tags":{}},"n2189112725":{"id":"n2189112725","loc":[-85.6311223,41.9410018],"version":"1","changeset":"15277056","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T23:26:14Z","tags":{}},"n2189112726":{"id":"n2189112726","loc":[-85.6313205,41.9411333],"version":"1","changeset":"15277056","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T23:26:14Z","tags":{}},"n2189112727":{"id":"n2189112727","loc":[-85.6315211,41.9409659],"version":"1","changeset":"15277056","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T23:26:14Z","tags":{}},"n2189112728":{"id":"n2189112728","loc":[-85.6311035,41.9402529],"version":"1","changeset":"15277056","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T23:26:14Z","tags":{}},"n2189112729":{"id":"n2189112729","loc":[-85.631226,41.9402107],"version":"1","changeset":"15277056","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T23:26:14Z","tags":{}},"n2189112730":{"id":"n2189112730","loc":[-85.6315966,41.9408051],"version":"1","changeset":"15277056","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T23:26:14Z","tags":{}},"n2189112731":{"id":"n2189112731","loc":[-85.6314741,41.9408473],"version":"1","changeset":"15277056","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T23:26:14Z","tags":{}},"n2189112732":{"id":"n2189112732","loc":[-85.6318114,41.940534],"version":"1","changeset":"15277056","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T23:26:14Z","tags":{}},"n2189112733":{"id":"n2189112733","loc":[-85.631588,41.94061],"version":"1","changeset":"15277056","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T23:26:14Z","tags":{}},"n2189112734":{"id":"n2189112734","loc":[-85.6314379,41.940366],"version":"1","changeset":"15277056","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T23:26:14Z","tags":{}},"n2189112735":{"id":"n2189112735","loc":[-85.6316613,41.94029],"version":"1","changeset":"15277056","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T23:26:14Z","tags":{}},"n2189112736":{"id":"n2189112736","loc":[-85.6306214,41.9400415],"version":"1","changeset":"15277056","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T23:26:14Z","tags":{}},"n2189112737":{"id":"n2189112737","loc":[-85.6304362,41.9397728],"version":"1","changeset":"15277056","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T23:26:14Z","tags":{}},"n2189112738":{"id":"n2189112738","loc":[-85.6305899,41.9397142],"version":"1","changeset":"15277056","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T23:26:14Z","tags":{}},"n2189112739":{"id":"n2189112739","loc":[-85.6307751,41.9399828],"version":"1","changeset":"15277056","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T23:26:14Z","tags":{}},"n2189112740":{"id":"n2189112740","loc":[-85.6304695,41.9401673],"version":"1","changeset":"15277056","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T23:26:14Z","tags":{}},"n2189112741":{"id":"n2189112741","loc":[-85.6301298,41.9396855],"version":"1","changeset":"15277056","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T23:26:14Z","tags":{}},"n2189112742":{"id":"n2189112742","loc":[-85.6303016,41.9396184],"version":"1","changeset":"15277056","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T23:26:14Z","tags":{}},"n2189112743":{"id":"n2189112743","loc":[-85.6306413,41.9401003],"version":"1","changeset":"15277056","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T23:26:14Z","tags":{}},"n2189112744":{"id":"n2189112744","loc":[-85.6309656,41.9406189],"version":"1","changeset":"15277056","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T23:26:14Z","tags":{}},"n2189112745":{"id":"n2189112745","loc":[-85.6308738,41.940493],"version":"1","changeset":"15277056","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T23:26:14Z","tags":{}},"n2189112746":{"id":"n2189112746","loc":[-85.6309333,41.940469],"version":"1","changeset":"15277056","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T23:26:14Z","tags":{}},"n2189112747":{"id":"n2189112747","loc":[-85.6307634,41.9402358],"version":"1","changeset":"15277056","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T23:26:14Z","tags":{}},"n2189112748":{"id":"n2189112748","loc":[-85.6308798,41.9401889],"version":"1","changeset":"15277056","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T23:26:14Z","tags":{}},"n2189112749":{"id":"n2189112749","loc":[-85.6311416,41.940548],"version":"1","changeset":"15277056","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T23:26:14Z","tags":{}},"n2189112750":{"id":"n2189112750","loc":[-85.6309577,41.9408708],"version":"1","changeset":"15277056","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T23:26:14Z","tags":{}},"n2189112751":{"id":"n2189112751","loc":[-85.630874,41.9407777],"version":"1","changeset":"15277056","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T23:26:14Z","tags":{}},"n2189112752":{"id":"n2189112752","loc":[-85.6310622,41.9406841],"version":"1","changeset":"15277056","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T23:26:14Z","tags":{}},"n2189112753":{"id":"n2189112753","loc":[-85.6311459,41.9407772],"version":"1","changeset":"15277056","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T23:26:14Z","tags":{}},"n2189112754":{"id":"n2189112754","loc":[-85.6320308,41.9405747],"version":"1","changeset":"15277056","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T23:26:14Z","tags":{}},"n2189112755":{"id":"n2189112755","loc":[-85.6317769,41.9401857],"version":"1","changeset":"15277056","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T23:26:14Z","tags":{}},"n2189112756":{"id":"n2189112756","loc":[-85.6313462,41.9401785],"version":"1","changeset":"15277056","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T23:26:14Z","tags":{}},"n2189112757":{"id":"n2189112757","loc":[-85.6313423,41.9401199],"version":"1","changeset":"15277056","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T23:26:15Z","tags":{}},"n2189112758":{"id":"n2189112758","loc":[-85.6318308,41.9401184],"version":"1","changeset":"15277056","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T23:26:15Z","tags":{}},"n2189112759":{"id":"n2189112759","loc":[-85.6321154,41.9405433],"version":"1","changeset":"15277056","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T23:26:15Z","tags":{}},"n2189112760":{"id":"n2189112760","loc":[-85.6310307,41.941683],"version":"1","changeset":"15277056","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T23:26:15Z","tags":{}},"n2189112761":{"id":"n2189112761","loc":[-85.6309808,41.9416078],"version":"1","changeset":"15277056","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T23:26:15Z","tags":{}},"n2189112762":{"id":"n2189112762","loc":[-85.6312094,41.9415156],"version":"1","changeset":"15277056","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T23:26:15Z","tags":{}},"n2189112763":{"id":"n2189112763","loc":[-85.6312636,41.9415865],"version":"1","changeset":"15277056","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T23:26:15Z","tags":{}},"n2189112764":{"id":"n2189112764","loc":[-85.6309384,41.94155],"version":"1","changeset":"15277056","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T23:26:15Z","tags":{}},"n2189112765":{"id":"n2189112765","loc":[-85.631156,41.9414619],"version":"1","changeset":"15277056","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T23:26:15Z","tags":{}},"n2189112766":{"id":"n2189112766","loc":[-85.6311968,41.94152],"version":"1","changeset":"15277056","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T23:26:15Z","tags":{}},"n2189112767":{"id":"n2189112767","loc":[-85.6308946,41.9414851],"version":"1","changeset":"15277056","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T23:26:15Z","tags":{}},"n2189112768":{"id":"n2189112768","loc":[-85.6308237,41.9413888],"version":"1","changeset":"15277056","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T23:26:15Z","tags":{}},"n2189112769":{"id":"n2189112769","loc":[-85.6309858,41.9413228],"version":"1","changeset":"15277056","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T23:26:15Z","tags":{}},"n2189112770":{"id":"n2189112770","loc":[-85.6310567,41.9414192],"version":"1","changeset":"15277056","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T23:26:15Z","tags":{}},"n2189112771":{"id":"n2189112771","loc":[-85.6307774,41.9413276],"version":"1","changeset":"15277056","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T23:26:15Z","tags":{}},"n2189112772":{"id":"n2189112772","loc":[-85.6309068,41.9412735],"version":"1","changeset":"15277056","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T23:26:15Z","tags":{}},"n2189112773":{"id":"n2189112773","loc":[-85.6309531,41.9413347],"version":"1","changeset":"15277056","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T23:26:15Z","tags":{}},"n2189112774":{"id":"n2189112774","loc":[-85.6307975,41.9412466],"version":"1","changeset":"15277056","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T23:26:15Z","tags":{}},"n2189112775":{"id":"n2189112775","loc":[-85.6307006,41.9411699],"version":"1","changeset":"15277056","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T23:26:15Z","tags":{}},"n2189112776":{"id":"n2189112776","loc":[-85.6308289,41.941113],"version":"1","changeset":"15277056","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T23:26:15Z","tags":{}},"n2189112777":{"id":"n2189112777","loc":[-85.6308997,41.9412012],"version":"1","changeset":"15277056","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T23:26:15Z","tags":{}},"n2189112778":{"id":"n2189112778","loc":[-85.630765,41.9412062],"version":"1","changeset":"15277056","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T23:26:15Z","tags":{}},"n2189112779":{"id":"n2189112779","loc":[-85.630739,41.9412177],"version":"1","changeset":"15277056","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T23:26:15Z","tags":{}},"n2189112780":{"id":"n2189112780","loc":[-85.6305822,41.9410391],"version":"1","changeset":"15277056","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T23:26:15Z","tags":{}},"n2189112781":{"id":"n2189112781","loc":[-85.6304117,41.9408177],"version":"1","changeset":"15277056","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T23:26:15Z","tags":{}},"n2189112782":{"id":"n2189112782","loc":[-85.6305086,41.9407769],"version":"1","changeset":"15277056","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T23:26:15Z","tags":{}},"n2189112783":{"id":"n2189112783","loc":[-85.6306779,41.9410044],"version":"1","changeset":"15277056","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T23:26:15Z","tags":{}},"n2189112784":{"id":"n2189112784","loc":[-85.6307734,41.9421663],"version":"1","changeset":"15277056","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T23:26:15Z","tags":{}},"n2189112785":{"id":"n2189112785","loc":[-85.630708,41.9420741],"version":"1","changeset":"15277056","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T23:26:15Z","tags":{}},"n2189112786":{"id":"n2189112786","loc":[-85.630863,41.9420133],"version":"1","changeset":"15277056","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T23:26:15Z","tags":{}},"n2189112787":{"id":"n2189112787","loc":[-85.6309285,41.9421055],"version":"1","changeset":"15277056","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T23:26:15Z","tags":{}},"n2189112788":{"id":"n2189112788","loc":[-85.6307014,41.9420263],"version":"1","changeset":"15277056","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T23:26:15Z","tags":{}},"n2189112789":{"id":"n2189112789","loc":[-85.6306648,41.941971],"version":"1","changeset":"15277056","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T23:26:15Z","tags":{}},"n2189112790":{"id":"n2189112790","loc":[-85.6307927,41.9419178],"version":"1","changeset":"15277056","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T23:26:15Z","tags":{}},"n2189112791":{"id":"n2189112791","loc":[-85.6308366,41.9419696],"version":"1","changeset":"15277056","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T23:26:15Z","tags":{}},"n2189112792":{"id":"n2189112792","loc":[-85.6307574,41.9418708],"version":"1","changeset":"15277056","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T23:26:15Z","tags":{}},"n2189112793":{"id":"n2189112793","loc":[-85.6306288,41.9419231],"version":"1","changeset":"15277056","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T23:26:15Z","tags":{}},"n2189112794":{"id":"n2189112794","loc":[-85.6306943,41.9417835],"version":"1","changeset":"15277056","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T23:26:15Z","tags":{}},"n2189112795":{"id":"n2189112795","loc":[-85.6305344,41.9418474],"version":"1","changeset":"15277056","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T23:26:15Z","tags":{}},"n2189112796":{"id":"n2189112796","loc":[-85.6305981,41.9419355],"version":"1","changeset":"15277056","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T23:26:15Z","tags":{}},"n2189123410":{"id":"n2189123410","loc":[-85.6315476,41.9393801],"version":"1","changeset":"15277145","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T23:41:21Z","tags":{}},"n2189123412":{"id":"n2189123412","loc":[-85.6315247,41.9399188],"version":"1","changeset":"15277145","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T23:41:22Z","tags":{}},"n2189123415":{"id":"n2189123415","loc":[-85.6316484,41.9400433],"version":"1","changeset":"15277145","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T23:41:22Z","tags":{}},"n185945138":{"id":"n185945138","loc":[-85.627073,41.93319],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T04:52:24Z","tags":{}},"n185945142":{"id":"n185945142","loc":[-85.6296891,41.9331674],"version":"3","changeset":"12805153","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-08-21T08:30:00Z","tags":{}},"n185945401":{"id":"n185945401","loc":[-85.6269,41.930199],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T04:52:30Z","tags":{}},"n185945405":{"id":"n185945405","loc":[-85.6296598,41.9301676],"version":"3","changeset":"12805153","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-08-21T08:30:00Z","tags":{}},"n185956891":{"id":"n185956891","loc":[-85.6251617,41.9255049],"version":"3","changeset":"9619138","user":"bbmiller","uid":"451048","visible":"true","timestamp":"2011-10-21T19:46:00Z","tags":{}},"n185959979":{"id":"n185959979","loc":[-85.626333,41.928347],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T04:59:03Z","tags":{}},"n185959983":{"id":"n185959983","loc":[-85.6296419,41.9283288],"version":"3","changeset":"12805153","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-08-21T08:29:59Z","tags":{}},"n185961192":{"id":"n185961192","loc":[-85.627053,41.9352031],"version":"3","changeset":"12805153","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-08-21T08:29:59Z","tags":{}},"n185961200":{"id":"n185961200","loc":[-85.6297088,41.9351902],"version":"4","changeset":"12805153","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-08-21T08:29:59Z","tags":{}},"n185963655":{"id":"n185963655","loc":[-85.6296112,41.9273948],"version":"3","changeset":"12805153","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-08-21T08:30:00Z","tags":{}},"n185963665":{"id":"n185963665","loc":[-85.626047,41.92737],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:01:01Z","tags":{}},"n185963688":{"id":"n185963688","loc":[-85.6296503,41.9292199],"version":"3","changeset":"12805153","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-08-21T08:30:01Z","tags":{}},"n185963689":{"id":"n185963689","loc":[-85.6296694,41.931157],"version":"3","changeset":"12805153","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-08-21T08:30:01Z","tags":{}},"n185963690":{"id":"n185963690","loc":[-85.6296791,41.9321485],"version":"3","changeset":"12805153","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-08-21T08:30:01Z","tags":{}},"n185963691":{"id":"n185963691","loc":[-85.6296991,41.9341973],"version":"3","changeset":"12805153","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-08-21T08:30:01Z","tags":{}},"n185967638":{"id":"n185967638","loc":[-85.627089,41.9361884],"version":"3","changeset":"12805153","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-08-21T08:29:59Z","tags":{}},"n185972917":{"id":"n185972917","loc":[-85.6293759,41.9388605],"version":"3","changeset":"9619138","user":"bbmiller","uid":"451048","visible":"true","timestamp":"2011-10-21T19:54:55Z","tags":{}},"n185972919":{"id":"n185972919","loc":[-85.6290337,41.9380234],"version":"3","changeset":"12805153","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-08-21T08:30:01Z","tags":{}},"n185972921":{"id":"n185972921","loc":[-85.628424,41.936212],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:05:40Z","tags":{}},"n185972923":{"id":"n185972923","loc":[-85.628367,41.936029],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:05:40Z","tags":{}},"n185974511":{"id":"n185974511","loc":[-85.627064,41.932169],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:06:19Z","tags":{}},"n185977728":{"id":"n185977728","loc":[-85.625605,41.925842],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:08:03Z","tags":{}},"n185977729":{"id":"n185977729","loc":[-85.625685,41.926163],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:08:03Z","tags":{}},"n185977731":{"id":"n185977731","loc":[-85.6257845,41.9264872],"version":"3","changeset":"12805153","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-08-21T08:29:59Z","tags":{}},"n185977733":{"id":"n185977733","loc":[-85.62663,41.929251],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:08:03Z","tags":{}},"n185977734":{"id":"n185977734","loc":[-85.627008,41.930642],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:08:03Z","tags":{}},"n185977736":{"id":"n185977736","loc":[-85.627029,41.930775],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:08:03Z","tags":{}},"n185977738":{"id":"n185977738","loc":[-85.627041,41.930946],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:08:03Z","tags":{}},"n185977739":{"id":"n185977739","loc":[-85.6270379,41.9311746],"version":"3","changeset":"12805153","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-08-21T08:29:59Z","tags":{}},"n185977742":{"id":"n185977742","loc":[-85.627055,41.934206],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:08:04Z","tags":{}},"n185977744":{"id":"n185977744","loc":[-85.627084,41.936804],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:08:04Z","tags":{}},"n185977746":{"id":"n185977746","loc":[-85.627104,41.936914],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:08:04Z","tags":{}},"n185977748":{"id":"n185977748","loc":[-85.627156,41.937026],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:08:04Z","tags":{}},"n185977750":{"id":"n185977750","loc":[-85.6272406,41.9371672],"version":"3","changeset":"12805153","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-08-21T08:29:59Z","tags":{}},"n185977752":{"id":"n185977752","loc":[-85.627317,41.93723],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:08:04Z","tags":{}},"n185977753":{"id":"n185977753","loc":[-85.627422,41.937312],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:08:04Z","tags":{}},"n185977755":{"id":"n185977755","loc":[-85.627754,41.937504],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:08:04Z","tags":{}},"n185977757":{"id":"n185977757","loc":[-85.627883,41.937623],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:08:04Z","tags":{}},"n185977761":{"id":"n185977761","loc":[-85.627984,41.93773],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:08:04Z","tags":{}},"n1475283996":{"id":"n1475283996","loc":[-85.6270514,41.9317122],"version":"1","changeset":"9619138","user":"bbmiller","uid":"451048","visible":"true","timestamp":"2011-10-21T19:45:46Z","tags":{"railway":"level_crossing"}},"n1475284004":{"id":"n1475284004","loc":[-85.6278177,41.9342117],"version":"1","changeset":"9619138","user":"bbmiller","uid":"451048","visible":"true","timestamp":"2011-10-21T19:45:46Z","tags":{"railway":"level_crossing"}},"n1475284014":{"id":"n1475284014","loc":[-85.6251877,41.9255913],"version":"1","changeset":"9619138","user":"bbmiller","uid":"451048","visible":"true","timestamp":"2011-10-21T19:45:47Z","tags":{"railway":"level_crossing"}},"n1475284017":{"id":"n1475284017","loc":[-85.6274992,41.9331816],"version":"1","changeset":"9619138","user":"bbmiller","uid":"451048","visible":"true","timestamp":"2011-10-21T19:45:47Z","tags":{"railway":"level_crossing"}},"n1475284021":{"id":"n1475284021","loc":[-85.6297108,41.9353939],"version":"2","changeset":"12805153","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-08-21T08:30:02Z","tags":{"railway":"level_crossing"}},"n1475284027":{"id":"n1475284027","loc":[-85.62811,41.935198],"version":"2","changeset":"12805153","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-08-21T08:30:03Z","tags":{"railway":"level_crossing"}},"n1475284035":{"id":"n1475284035","loc":[-85.626888,41.9311757],"version":"2","changeset":"12805153","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-08-21T08:30:03Z","tags":{"railway":"level_crossing"}},"n1475293245":{"id":"n1475293245","loc":[-85.6286047,41.9367881],"version":"1","changeset":"9619138","user":"bbmiller","uid":"451048","visible":"true","timestamp":"2011-10-21T19:54:51Z","tags":{}},"n1875654302":{"id":"n1875654302","loc":[-85.6296367,41.927491],"version":"1","changeset":"12805153","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-08-21T08:29:43Z","tags":{}},"n2189099388":{"id":"n2189099388","loc":[-85.6312007,41.9389988],"version":"1","changeset":"15276938","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T23:06:04Z","tags":{}},"n2189099389":{"id":"n2189099389","loc":[-85.6311003,41.9389992],"version":"1","changeset":"15276938","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T23:06:04Z","tags":{}},"n2189099390":{"id":"n2189099390","loc":[-85.6310988,41.9387847],"version":"1","changeset":"15276938","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T23:06:04Z","tags":{}},"n2189099391":{"id":"n2189099391","loc":[-85.6312165,41.9387843],"version":"1","changeset":"15276938","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T23:06:04Z","tags":{}},"n2189099392":{"id":"n2189099392","loc":[-85.6312152,41.9385857],"version":"1","changeset":"15276938","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T23:06:04Z","tags":{}},"n2189099393":{"id":"n2189099393","loc":[-85.6310877,41.9385862],"version":"1","changeset":"15276938","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T23:06:04Z","tags":{}},"n2189099394":{"id":"n2189099394","loc":[-85.6310858,41.9383161],"version":"1","changeset":"15276938","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T23:06:04Z","tags":{}},"n2189099395":{"id":"n2189099395","loc":[-85.6302002,41.9383196],"version":"1","changeset":"15276938","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T23:06:04Z","tags":{}},"n2189099396":{"id":"n2189099396","loc":[-85.6302011,41.9384472],"version":"1","changeset":"15276938","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T23:06:04Z","tags":{}},"n2189099397":{"id":"n2189099397","loc":[-85.6301018,41.9384476],"version":"1","changeset":"15276938","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T23:06:04Z","tags":{}},"n2189099398":{"id":"n2189099398","loc":[-85.6301025,41.9385419],"version":"1","changeset":"15276938","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T23:06:04Z","tags":{}},"n2189099399":{"id":"n2189099399","loc":[-85.6299275,41.9385427],"version":"1","changeset":"15276938","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T23:06:04Z","tags":{}},"n2189099400":{"id":"n2189099400","loc":[-85.62993,41.9388653],"version":"1","changeset":"15276938","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T23:06:04Z","tags":{}},"n2189099401":{"id":"n2189099401","loc":[-85.630107,41.9388645],"version":"1","changeset":"15276938","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T23:06:04Z","tags":{}},"n2189099402":{"id":"n2189099402","loc":[-85.6301079,41.9389908],"version":"1","changeset":"15276938","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T23:06:04Z","tags":{}},"n2189099403":{"id":"n2189099403","loc":[-85.6301951,41.9389904],"version":"1","changeset":"15276938","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T23:06:04Z","tags":{}},"n2189123382":{"id":"n2189123382","loc":[-85.6336279,41.9354365],"version":"1","changeset":"15277145","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T23:41:21Z","tags":{}},"n2189123384":{"id":"n2189123384","loc":[-85.6328492,41.9355177],"version":"1","changeset":"15277145","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T23:41:21Z","tags":{}},"n2189123387":{"id":"n2189123387","loc":[-85.6323762,41.9357396],"version":"1","changeset":"15277145","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T23:41:21Z","tags":{}},"n2189123388":{"id":"n2189123388","loc":[-85.6315174,41.9358966],"version":"1","changeset":"15277145","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T23:41:21Z","tags":{}},"n2189123389":{"id":"n2189123389","loc":[-85.6304331,41.936124],"version":"1","changeset":"15277145","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T23:41:21Z","tags":{}},"n2189123390":{"id":"n2189123390","loc":[-85.6302075,41.9364271],"version":"1","changeset":"15277145","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T23:41:21Z","tags":{}},"n2189123391":{"id":"n2189123391","loc":[-85.6303458,41.9367953],"version":"1","changeset":"15277145","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T23:41:21Z","tags":{}},"n2189123392":{"id":"n2189123392","loc":[-85.6299601,41.9369739],"version":"1","changeset":"15277145","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T23:41:21Z","tags":{}},"n2189123393":{"id":"n2189123393","loc":[-85.6299164,41.9374882],"version":"1","changeset":"15277145","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T23:41:21Z","tags":{}},"n2189123394":{"id":"n2189123394","loc":[-85.6299455,41.9378022],"version":"1","changeset":"15277145","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T23:41:21Z","tags":{}},"n2189123395":{"id":"n2189123395","loc":[-85.6299771,41.9379053],"version":"1","changeset":"15277145","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T23:41:21Z","tags":{}},"n2189123396":{"id":"n2189123396","loc":[-85.6301597,41.9379091],"version":"1","changeset":"15277145","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T23:41:21Z","tags":{}},"n2189123397":{"id":"n2189123397","loc":[-85.6308042,41.9377913],"version":"1","changeset":"15277145","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T23:41:21Z","tags":{}},"n2189123398":{"id":"n2189123398","loc":[-85.6316885,41.9378082],"version":"1","changeset":"15277145","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T23:41:21Z","tags":{}},"n2189123399":{"id":"n2189123399","loc":[-85.6316848,41.9380079],"version":"1","changeset":"15277145","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T23:41:21Z","tags":{}},"n2189123400":{"id":"n2189123400","loc":[-85.6318449,41.9381161],"version":"1","changeset":"15277145","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T23:41:21Z","tags":{}},"n2189123401":{"id":"n2189123401","loc":[-85.6320705,41.9381811],"version":"1","changeset":"15277145","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T23:41:21Z","tags":{}},"n2189123402":{"id":"n2189123402","loc":[-85.6321433,41.9383706],"version":"1","changeset":"15277145","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T23:41:21Z","tags":{}},"n2189123404":{"id":"n2189123404","loc":[-85.632056,41.9384355],"version":"1","changeset":"15277145","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T23:41:21Z","tags":{}},"n2189123406":{"id":"n2189123406","loc":[-85.6317867,41.9384572],"version":"1","changeset":"15277145","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T23:41:21Z","tags":{}},"n2189123409":{"id":"n2189123409","loc":[-85.6316572,41.9387281],"version":"1","changeset":"15277145","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T23:41:21Z","tags":{}},"n2189123417":{"id":"n2189123417","loc":[-85.6315946,41.93775],"version":"1","changeset":"15277145","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T23:41:22Z","tags":{}},"n2189123419":{"id":"n2189123419","loc":[-85.6302641,41.9378393],"version":"1","changeset":"15277145","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T23:41:22Z","tags":{}},"w208640158":{"id":"w208640158","version":"1","changeset":"15277145","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T23:41:22Z","tags":{"area":"yes","natural":"wetland"},"nodes":["n2189123379","n2189123382","n2189123384","n2189123387","n2189123388","n2189123389","n2189123390","n2189123391","n2189123392","n2189123393","n2189123394","n2189123395","n2189123396","n2189123419","n2189123397","n2189123417","n2189123398","n2189123399","n2189123400","n2189123401","n2189123402","n2189123404","n2189123406","n2189123409","n2189123410","n2189123412","n2189123415","n1819805722","n1819805861","n1819805887","n1819805760","n1819805641","n1819805632","n2189123379"]},"w134150787":{"id":"w134150787","version":"3","changeset":"14676554","user":"bbmiller","uid":"451048","visible":"true","timestamp":"2013-01-16T20:05:20Z","tags":{"name":"Conrail Railroad","railway":"rail","tiger:cfcc":"B11","tiger:county":"St. Joseph, MI","tiger:name_base":"Conrail Railroad","tiger:reviewed":"no"},"nodes":["n185972905","n185972907","n1475293223","n185972911","n1475293241","n1475293246","n185972915","n185972917","n185972919","n1475293245","n185972921","n185972923","n1475284027","n1475284004","n1475284017","n1475283996","n1475284035","n1475284014","n185956891"]},"w208639443":{"id":"w208639443","version":"1","changeset":"15277056","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T23:26:17Z","tags":{"area":"yes","building":"yes"},"nodes":["n2189112720","n2189112721","n2189112722","n2189112723","n2189112720"]},"w17966462":{"id":"w17966462","version":"9","changeset":"15421127","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-19T15:12:00Z","tags":{"highway":"secondary","name":"South Main Street","old_ref":"US 131","ref":"M 86","tiger:cfcc":"A31","tiger:county":"St. Joseph, MI","tiger:name_base":"Main","tiger:name_base_1":"State Highway 86","tiger:name_direction_prefix":"S","tiger:name_type":"St","tiger:reviewed":"no"},"nodes":["n185977728","n185977729","n185977731","n185963665","n185959979","n185977733","n185945401","n185977734","n185977736","n185977738","n185977739","n1475283996","n185974511","n185945138","n185977742","n185961192","n185967638","n185977744","n185977746","n185977748","n185977750","n185977752","n185977753","n185977754","n185977755","n185977757","n185977761","n185958030","n1475293263","n185963698","n185952745","n185947850","n185977762"]},"w203985741":{"id":"w203985741","version":"1","changeset":"14894784","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T11:53:27Z","tags":{"area":"yes","leisure":"park","name":"Conservation Park","website":"http://www.threeriversmi.us/?page_id=53"},"nodes":["n2139982404","n2139982405","n2139982399","n2139982400","n1819805770","n2139982402","n2139982403","n2139982401","n1819805780","n1819805834","n2139982406","n2139982404"]},"w17963676":{"id":"w17963676","version":"3","changeset":"14894784","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T11:53:28Z","tags":{"highway":"service","tiger:cfcc":"A41","tiger:county":"St. Joseph, MI","tiger:reviewed":"no","tiger:separated":"no","tiger:source":"tiger_import_dch_v0.6_20070813","tiger:tlid":"15312976","tiger:upload_uuid":"bulk_upload.pl-b79f893a-0be1-4a5f-a183-6aea114c9af7"},"nodes":["n1475293258","n2139982428","n2139982427","n2139982426","n2139982425","n2139982424","n2139982423","n2139982422","n2139982430","n2139982421","n2139982420","n2139982429","n1475293231","n1475293258","n1475293251","n1475293223","n185952745"]},"w203985745":{"id":"w203985745","version":"1","changeset":"14894784","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T11:53:28Z","tags":{"highway":"footway"},"nodes":["n2139982430","n2139982431","n2139982432","n2139982433","n2139982434","n2139982435","n2139982436","n2139982437","n2139982438","n2139982439","n2139982440","n2139982441","n1475293231"]},"w208639451":{"id":"w208639451","version":"1","changeset":"15277056","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T23:26:17Z","tags":{"area":"yes","building":"yes"},"nodes":["n2189112754","n2189112755","n2189112756","n2189112757","n2189112758","n2189112759","n2189112754"]},"w208639452":{"id":"w208639452","version":"1","changeset":"15277056","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T23:26:17Z","tags":{"area":"yes","building":"yes"},"nodes":["n2189112760","n2189112761","n2189112766","n2189112762","n2189112763","n2189112760"]},"w206805244":{"id":"w206805244","version":"1","changeset":"15132216","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-23T08:37:03Z","tags":{"area":"yes","building":"yes"},"nodes":["n2168544766","n2168544767","n2168544768","n2168544769","n2168544770","n2168544771","n2168544772","n2168544773","n2168544774","n2168544775","n2168544776","n2168544777","n2168544778","n2168544779","n2168544766"]},"w208639444":{"id":"w208639444","version":"1","changeset":"15277056","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T23:26:17Z","tags":{"area":"yes","building":"yes"},"nodes":["n2189112724","n2189112725","n2189112726","n2189112727","n2189112724"]},"w208639450":{"id":"w208639450","version":"1","changeset":"15277056","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T23:26:17Z","tags":{"area":"yes","building":"yes"},"nodes":["n2189112750","n2189112751","n2189112752","n2189112753","n2189112750"]},"w208639448":{"id":"w208639448","version":"1","changeset":"15277056","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T23:26:17Z","tags":{"area":"yes","building":"yes"},"nodes":["n2189112740","n2189112741","n2189112742","n2189112743","n2189112740"]},"w208637859":{"id":"w208637859","version":"1","changeset":"15276938","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T23:06:06Z","tags":{"area":"yes","building":"yes"},"nodes":["n2189099387","n2189099388","n2189099389","n2189099390","n2189099391","n2189099392","n2189099393","n2189099394","n2189099395","n2189099396","n2189099397","n2189099398","n2189099399","n2189099400","n2189099401","n2189099402","n2189099403","n2189099404","n2189099405","n2189099406","n2189099407","n2189099408","n2189099409","n2189099410","n2189099387"]},"w208639453":{"id":"w208639453","version":"1","changeset":"15277056","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T23:26:17Z","tags":{"area":"yes","building":"yes"},"nodes":["n2189112764","n2189112765","n2189112766","n2189112761","n2189112764"]},"w208639456":{"id":"w208639456","version":"1","changeset":"15277056","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T23:26:18Z","tags":{"area":"yes","building":"yes"},"nodes":["n2189112774","n2189112778","n2189112779","n2189112775","n2189112776","n2189112777","n2189112774"]},"w208639445":{"id":"w208639445","version":"1","changeset":"15277056","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T23:26:17Z","tags":{"area":"yes","building":"yes"},"nodes":["n2189112728","n2189112729","n2189112730","n2189112731","n2189112728"]},"w17967776":{"id":"w17967776","version":"1","changeset":"402580","user":"DaveHansenTiger","uid":"7168","visible":"true","timestamp":"2007-12-23T20:54:17Z","tags":{"highway":"residential","name":"5th St","tiger:cfcc":"A41","tiger:county":"St. Joseph, MI","tiger:name_base":"5th","tiger:name_type":"St","tiger:reviewed":"no","tiger:separated":"no","tiger:source":"tiger_import_dch_v0.6_20070813","tiger:tlid":"15312495","tiger:upload_uuid":"bulk_upload.pl-b79f893a-0be1-4a5f-a183-6aea114c9af7"},"nodes":["n185958032","n185988963"]},"w208639461":{"id":"w208639461","version":"1","changeset":"15277056","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T23:26:18Z","tags":{"area":"yes","building":"yes"},"nodes":["n2189112792","n2189112794","n2189112795","n2189112796","n2189112793","n2189112792"]},"w206805241":{"id":"w206805241","version":"1","changeset":"15132216","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-23T08:37:03Z","tags":{"area":"yes","building":"yes"},"nodes":["n2168544754","n2168544755","n2168544756","n2168544757","n2168544754"]},"w208639449":{"id":"w208639449","version":"1","changeset":"15277056","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T23:26:17Z","tags":{"area":"yes","building":"yes"},"nodes":["n2189112744","n2189112745","n2189112746","n2189112747","n2189112748","n2189112749","n2189112744"]},"w208639455":{"id":"w208639455","version":"1","changeset":"15277056","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T23:26:18Z","tags":{"area":"yes","building":"yes"},"nodes":["n2189112771","n2189112772","n2189112773","n2189112768","n2189112771"]},"w208639457":{"id":"w208639457","version":"1","changeset":"15277056","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T23:26:18Z","tags":{"area":"yes","building":"yes"},"nodes":["n2189112780","n2189112781","n2189112782","n2189112783","n2189112780"]},"w208639446":{"id":"w208639446","version":"1","changeset":"15277056","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T23:26:17Z","tags":{"area":"yes","building":"yes"},"nodes":["n2189112732","n2189112733","n2189112734","n2189112735","n2189112732"]},"w208639454":{"id":"w208639454","version":"1","changeset":"15277056","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T23:26:17Z","tags":{"area":"yes","building":"yes"},"nodes":["n2189112767","n2189112768","n2189112773","n2189112769","n2189112770","n2189112767"]},"w203985743":{"id":"w203985743","version":"1","changeset":"14894784","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T11:53:28Z","tags":{"amenity":"parking","area":"yes"},"nodes":["n2139982411","n2139982412","n2139982413","n2139982414","n2139982415","n2139982416","n2139982417","n2139982419","n2139982418","n2139982411"]},"w17965023":{"id":"w17965023","version":"4","changeset":"12805153","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-08-21T08:30:10Z","tags":{"highway":"residential","name":"4th St","tiger:cfcc":"A41","tiger:county":"St. Joseph, MI","tiger:name_base":"4th","tiger:name_type":"St","tiger:reviewed":"no","tiger:separated":"no","tiger:source":"tiger_import_dch_v0.6_20070813","tiger:tlid":"15313205","tiger:upload_uuid":"bulk_upload.pl-b79f893a-0be1-4a5f-a183-6aea114c9af7"},"nodes":["n185963655","n1875654302","n185959983","n185963688","n185945405","n185963689","n185963690","n185945142","n185963691","n185961200","n1475284021","n1475293246","n1875654132","n1475293263"]},"w206805242":{"id":"w206805242","version":"1","changeset":"15132216","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-23T08:37:03Z","tags":{"area":"yes","building":"yes"},"nodes":["n2168544758","n2168544759","n2168544760","n2168544761","n2168544758"]},"w208639460":{"id":"w208639460","version":"1","changeset":"15277056","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T23:26:18Z","tags":{"area":"yes","building":"yes"},"nodes":["n2189112792","n2189112793","n2189112789","n2189112790","n2189112792"]},"w208639447":{"id":"w208639447","version":"1","changeset":"15277056","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T23:26:17Z","tags":{"area":"yes","building":"yes"},"nodes":["n2189112736","n2189112737","n2189112738","n2189112739","n2189112736"]},"w208639458":{"id":"w208639458","version":"1","changeset":"15277056","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T23:26:18Z","tags":{"area":"yes","building":"yes"},"nodes":["n2189112784","n2189112785","n2189112786","n2189112787","n2189112784"]},"w203985744":{"id":"w203985744","version":"1","changeset":"14894784","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T11:53:28Z","tags":{"highway":"service"},"nodes":["n2139982425","n2139982400"]},"w208639459":{"id":"w208639459","version":"1","changeset":"15277056","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T23:26:18Z","tags":{"area":"yes","building":"yes"},"nodes":["n2189112788","n2189112789","n2189112790","n2189112791","n2189112788"]},"w203985742":{"id":"w203985742","version":"1","changeset":"14894784","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T11:53:28Z","tags":{"amenity":"shelter","area":"yes","shelter_type":"picnic_shelter"},"nodes":["n2139982407","n2139982408","n2139982409","n2139982410","n2139982407"]},"w206805243":{"id":"w206805243","version":"1","changeset":"15132216","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-23T08:37:03Z","tags":{"area":"yes","building":"yes"},"nodes":["n2168544762","n2168544763","n2168544764","n2168544765","n2168544762"]},"n185959081":{"id":"n185959081","loc":[-85.628469,41.948674],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T04:58:41Z","tags":{}},"n185967427":{"id":"n185967427","loc":[-85.632054,41.951174],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:03:04Z","tags":{}},"n185967424":{"id":"n185967424","loc":[-85.6320391,41.9499109],"version":"3","changeset":"14676554","user":"bbmiller","uid":"451048","visible":"true","timestamp":"2013-01-16T20:05:17Z","tags":{}},"n185968101":{"id":"n185968101","loc":[-85.6308395,41.9511969],"version":"3","changeset":"14676554","user":"bbmiller","uid":"451048","visible":"true","timestamp":"2013-01-16T20:05:17Z","tags":{}},"n185960792":{"id":"n185960792","loc":[-85.632074,41.953707],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T04:59:24Z","tags":{}},"n185961389":{"id":"n185961389","loc":[-85.630935,41.959037],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T04:59:39Z","tags":{}},"n185961391":{"id":"n185961391","loc":[-85.632169,41.959025],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T04:59:39Z","tags":{}},"n185965395":{"id":"n185965395","loc":[-85.63216,41.959859],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:01:52Z","tags":{}},"n185966953":{"id":"n185966953","loc":[-85.630894,41.957428],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:02:50Z","tags":{}},"n185966955":{"id":"n185966955","loc":[-85.632122,41.957427],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:02:50Z","tags":{}},"n185967430":{"id":"n185967430","loc":[-85.632077,41.952453],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:03:04Z","tags":{}},"n185967432":{"id":"n185967432","loc":[-85.632095,41.954685],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:03:04Z","tags":{}},"n185967434":{"id":"n185967434","loc":[-85.632121,41.955914],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:03:04Z","tags":{}},"n185967436":{"id":"n185967436","loc":[-85.632128,41.9583],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:03:04Z","tags":{}},"n185967438":{"id":"n185967438","loc":[-85.632187,41.960681],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:03:04Z","tags":{}},"n185967440":{"id":"n185967440","loc":[-85.632182,41.961493],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:03:04Z","tags":{}},"n185968102":{"id":"n185968102","loc":[-85.630855,41.952452],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:03:22Z","tags":{}},"n185968104":{"id":"n185968104","loc":[-85.630887,41.953714],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:03:22Z","tags":{}},"n185968106":{"id":"n185968106","loc":[-85.630883,41.954692],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:03:22Z","tags":{}},"n185968108":{"id":"n185968108","loc":[-85.630904,41.955913],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:03:22Z","tags":{}},"n185968110":{"id":"n185968110","loc":[-85.630904,41.958058],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:03:22Z","tags":{}},"n185968112":{"id":"n185968112","loc":[-85.630952,41.960667],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:03:22Z","tags":{}},"n185968114":{"id":"n185968114","loc":[-85.630972,41.961495],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:03:22Z","tags":{}},"n185968116":{"id":"n185968116","loc":[-85.630962,41.961967],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:03:22Z","tags":{}},"n185978969":{"id":"n185978969","loc":[-85.633214,41.948618],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:08:39Z","tags":{}},"n185985812":{"id":"n185985812","loc":[-85.633274,41.951159],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:12:39Z","tags":{}},"n185986155":{"id":"n185986155","loc":[-85.633258,41.949893],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:12:48Z","tags":{}},"n2208608826":{"id":"n2208608826","loc":[-85.6339222,41.9486225],"version":"1","changeset":"15411098","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-18T17:54:40Z","tags":{}},"w17964531":{"id":"w17964531","version":"1","changeset":"402341","user":"DaveHansenTiger","uid":"7168","visible":"true","timestamp":"2007-12-23T20:30:22Z","tags":{"highway":"residential","name":"Willow Dr","tiger:cfcc":"A41","tiger:county":"St. Joseph, MI","tiger:name_base":"Willow","tiger:name_type":"Dr","tiger:reviewed":"no","tiger:separated":"no","tiger:source":"tiger_import_dch_v0.6_20070813","tiger:tlid":"15313189","tiger:upload_uuid":"bulk_upload.pl-b79f893a-0be1-4a5f-a183-6aea114c9af7","tiger:zip_left":"49093"},"nodes":["n185959079","n185959081"]},"w17967386":{"id":"w17967386","version":"3","changeset":"15473186","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-24T01:52:24Z","tags":{"highway":"residential","name":"East Armitage Street","tiger:cfcc":"A41","tiger:county":"St. Joseph, MI","tiger:name_base":"Armitage","tiger:name_direction_prefix":"E","tiger:name_type":"St","tiger:reviewed":"no","tiger:zip_left":"49093","tiger:zip_right":"49093"},"nodes":["n185982195","n185968101","n185967427","n185985812","n185974583"]},"w17965502":{"id":"w17965502","version":"2","changeset":"15473186","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-24T01:52:21Z","tags":{"highway":"residential","name":"Elm Street","tiger:cfcc":"A41","tiger:county":"St. Joseph, MI","tiger:name_base":"Elm","tiger:name_type":"St","tiger:reviewed":"no"},"nodes":["n185968100","n185968101","n185968102","n185968104","n185968106","n185968108","n185966953","n185968110","n185961389","n185968112","n185968114","n185968116"]},"w17967844":{"id":"w17967844","version":"2","changeset":"15473186","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-24T01:52:24Z","tags":{"highway":"residential","name":"East Bennett Street","tiger:cfcc":"A41","tiger:county":"St. Joseph, MI","tiger:name_base":"Bennett","tiger:name_direction_prefix":"E","tiger:name_type":"St","tiger:reviewed":"no"},"nodes":["n185982193","n185967424","n185986155","n185978390"]},"w17966581":{"id":"w17966581","version":"2","changeset":"15411098","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-18T17:54:40Z","tags":{"highway":"residential","name":"E Kelsey St","tiger:cfcc":"A41","tiger:county":"St. Joseph, MI","tiger:name_base":"Kelsey","tiger:name_direction_prefix":"E","tiger:name_type":"St","tiger:reviewed":"no","tiger:zip_left":"49093","tiger:zip_right":"49093"},"nodes":["n185978967","n185978969","n2208608826","n185971578"]},"w17965402":{"id":"w17965402","version":"3","changeset":"15473186","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-24T01:52:22Z","tags":{"highway":"residential","name":"Walnut Street","tiger:cfcc":"A41","tiger:county":"St. Joseph, MI","tiger:name_base":"Walnut","tiger:name_type":"St","tiger:reviewed":"no","tiger:zip_left":"49093","tiger:zip_right":"49093"},"nodes":["n185967422","n185967424","n185967427","n185967430","n185960792","n185967432","n185967434","n185966955","n185967436","n185961391","n185965395","n185967438","n185967440"]},"n2199093506":{"id":"n2199093506","loc":[-85.6251879,41.9478322],"version":"1","changeset":"15347539","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T04:54:44Z","tags":{}},"n2199093505":{"id":"n2199093505","loc":[-85.6252076,41.9477749],"version":"1","changeset":"15347539","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T04:54:44Z","tags":{}},"n2199093504":{"id":"n2199093504","loc":[-85.6252289,41.9477602],"version":"1","changeset":"15347539","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T04:54:44Z","tags":{}},"n2199093503":{"id":"n2199093503","loc":[-85.625201,41.9477492],"version":"1","changeset":"15347539","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T04:54:44Z","tags":{}},"n2199093502":{"id":"n2199093502","loc":[-85.6251682,41.9477066],"version":"1","changeset":"15347539","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T04:54:44Z","tags":{}},"n2199093501":{"id":"n2199093501","loc":[-85.6251715,41.947609],"version":"1","changeset":"15347539","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T04:54:44Z","tags":{}},"n2199093500":{"id":"n2199093500","loc":[-85.6252125,41.9475639],"version":"1","changeset":"15347539","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T04:54:44Z","tags":{}},"n2199093499":{"id":"n2199093499","loc":[-85.6252896,41.9475602],"version":"1","changeset":"15347539","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T04:54:44Z","tags":{}},"n2199093498":{"id":"n2199093498","loc":[-85.6253027,41.9475334],"version":"1","changeset":"15347539","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T04:54:44Z","tags":{}},"n2199093497":{"id":"n2199093497","loc":[-85.6253437,41.9474822],"version":"1","changeset":"15347539","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T04:54:44Z","tags":{}},"n2199093496":{"id":"n2199093496","loc":[-85.6254421,41.9474675],"version":"1","changeset":"15347539","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T04:54:44Z","tags":{}},"n2199093495":{"id":"n2199093495","loc":[-85.6256503,41.9474944],"version":"1","changeset":"15347539","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T04:54:44Z","tags":{}},"n2199093494":{"id":"n2199093494","loc":[-85.6257257,41.9476127],"version":"1","changeset":"15347539","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T04:54:44Z","tags":{}},"n2199093493":{"id":"n2199093493","loc":[-85.6257028,41.9477285],"version":"1","changeset":"15347539","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T04:54:44Z","tags":{}},"n2199093492":{"id":"n2199093492","loc":[-85.6255339,41.9478102],"version":"1","changeset":"15347539","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T04:54:44Z","tags":{}},"n2199093491":{"id":"n2199093491","loc":[-85.6253912,41.9478224],"version":"1","changeset":"15347539","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T04:54:44Z","tags":{}},"n2199093490":{"id":"n2199093490","loc":[-85.6253043,41.947859],"version":"1","changeset":"15347539","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T04:54:44Z","tags":{}},"n2199093489":{"id":"n2199093489","loc":[-85.6252027,41.9478846],"version":"1","changeset":"15347539","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T04:54:44Z","tags":{}},"n2199093458":{"id":"n2199093458","loc":[-85.6246876,41.9486617],"version":"1","changeset":"15347539","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T04:54:43Z","tags":{}},"n2199093457":{"id":"n2199093457","loc":[-85.6243127,41.9486583],"version":"1","changeset":"15347539","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T04:54:43Z","tags":{}},"n2199093456":{"id":"n2199093456","loc":[-85.624306,41.9490569],"version":"1","changeset":"15347539","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T04:54:43Z","tags":{}},"n2199093455":{"id":"n2199093455","loc":[-85.624681,41.9490603],"version":"1","changeset":"15347539","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T04:54:43Z","tags":{}},"n2199093514":{"id":"n2199093514","loc":[-85.6236228,41.9496059],"version":"1","changeset":"15347539","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T04:54:45Z","tags":{}},"n2199093513":{"id":"n2199093513","loc":[-85.6236231,41.9496997],"version":"1","changeset":"15347539","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T04:54:45Z","tags":{}},"n2199093512":{"id":"n2199093512","loc":[-85.623357,41.9497002],"version":"1","changeset":"15347539","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T04:54:45Z","tags":{}},"n2199093511":{"id":"n2199093511","loc":[-85.6233567,41.9496136],"version":"1","changeset":"15347539","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T04:54:45Z","tags":{}},"n2199093508":{"id":"n2199093508","loc":[-85.6239735,41.9494287],"version":"1","changeset":"15347539","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T04:54:45Z","tags":{}},"n2199093507":{"id":"n2199093507","loc":[-85.6239741,41.9496052],"version":"1","changeset":"15347539","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T04:54:45Z","tags":{}},"n2199093488":{"id":"n2199093488","loc":[-85.624497,41.9512286],"version":"1","changeset":"15347539","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T04:54:44Z","tags":{}},"n2199093487":{"id":"n2199093487","loc":[-85.6244966,41.9511259],"version":"1","changeset":"15347539","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T04:54:44Z","tags":{}},"n2199093486":{"id":"n2199093486","loc":[-85.6243151,41.9511263],"version":"1","changeset":"15347539","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T04:54:44Z","tags":{}},"n2199093485":{"id":"n2199093485","loc":[-85.6243154,41.951229],"version":"1","changeset":"15347539","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T04:54:44Z","tags":{}},"n2199093484":{"id":"n2199093484","loc":[-85.6241205,41.9508665],"version":"1","changeset":"15347539","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T04:54:44Z","tags":{}},"n2199093483":{"id":"n2199093483","loc":[-85.624115,41.9505249],"version":"1","changeset":"15347539","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T04:54:44Z","tags":{}},"n2199093482":{"id":"n2199093482","loc":[-85.6243149,41.9505231],"version":"1","changeset":"15347539","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T04:54:44Z","tags":{}},"n2199093481":{"id":"n2199093481","loc":[-85.6243203,41.9508648],"version":"1","changeset":"15347539","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T04:54:44Z","tags":{}},"n2199093480":{"id":"n2199093480","loc":[-85.624393,41.9508668],"version":"1","changeset":"15347539","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T04:54:44Z","tags":{}},"n2199093479":{"id":"n2199093479","loc":[-85.6243904,41.9505956],"version":"1","changeset":"15347539","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T04:54:44Z","tags":{}},"n2199093478":{"id":"n2199093478","loc":[-85.6246727,41.950594],"version":"1","changeset":"15347539","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T04:54:44Z","tags":{}},"n2199093477":{"id":"n2199093477","loc":[-85.624675,41.9508203],"version":"1","changeset":"15347539","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T04:54:44Z","tags":{}},"n2199093476":{"id":"n2199093476","loc":[-85.6245097,41.9508212],"version":"1","changeset":"15347539","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T04:54:44Z","tags":{}},"n2199093475":{"id":"n2199093475","loc":[-85.6245101,41.9508662],"version":"1","changeset":"15347539","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T04:54:44Z","tags":{}},"n2199093474":{"id":"n2199093474","loc":[-85.6241008,41.9493459],"version":"1","changeset":"15347539","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T04:54:44Z","tags":{}},"n2199093473":{"id":"n2199093473","loc":[-85.6242442,41.9493459],"version":"1","changeset":"15347539","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T04:54:44Z","tags":{}},"n2199093472":{"id":"n2199093472","loc":[-85.6242442,41.9493681],"version":"1","changeset":"15347539","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T04:54:44Z","tags":{}},"n2199093471":{"id":"n2199093471","loc":[-85.6243397,41.9493681],"version":"1","changeset":"15347539","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T04:54:44Z","tags":{}},"n2199093470":{"id":"n2199093470","loc":[-85.6243417,41.9493511],"version":"1","changeset":"15347539","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T04:54:44Z","tags":{}},"n2199093469":{"id":"n2199093469","loc":[-85.6247251,41.9493485],"version":"1","changeset":"15347539","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T04:54:44Z","tags":{}},"n2199093468":{"id":"n2199093468","loc":[-85.6247548,41.9504949],"version":"1","changeset":"15347539","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T04:54:44Z","tags":{}},"n2199093467":{"id":"n2199093467","loc":[-85.6241214,41.9505017],"version":"1","changeset":"15347539","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T04:54:44Z","tags":{}},"n2199093466":{"id":"n2199093466","loc":[-85.6254398,41.950174],"version":"1","changeset":"15347539","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T04:54:44Z","tags":{}},"n2199093465":{"id":"n2199093465","loc":[-85.6254412,41.9499872],"version":"1","changeset":"15347539","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T04:54:44Z","tags":{}},"n2199093464":{"id":"n2199093464","loc":[-85.6255363,41.9499876],"version":"1","changeset":"15347539","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T04:54:44Z","tags":{}},"n2199093463":{"id":"n2199093463","loc":[-85.6255374,41.9498439],"version":"1","changeset":"15347539","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T04:54:44Z","tags":{}},"n2199093462":{"id":"n2199093462","loc":[-85.6255638,41.949844],"version":"1","changeset":"15347539","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T04:54:44Z","tags":{}},"n2199093461":{"id":"n2199093461","loc":[-85.6255652,41.9496672],"version":"1","changeset":"15347539","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T04:54:43Z","tags":{}},"n2199093460":{"id":"n2199093460","loc":[-85.6251823,41.9496656],"version":"1","changeset":"15347539","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T04:54:43Z","tags":{}},"n2199093459":{"id":"n2199093459","loc":[-85.6251785,41.9501729],"version":"1","changeset":"15347539","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T04:54:43Z","tags":{}},"n2199093510":{"id":"n2199093510","loc":[-85.6229922,41.9496143],"version":"1","changeset":"15347539","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T04:54:45Z","tags":{}},"n2199093509":{"id":"n2199093509","loc":[-85.6229915,41.9494306],"version":"1","changeset":"15347539","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T04:54:45Z","tags":{}},"n185948903":{"id":"n185948903","loc":[-85.616514,41.947449],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T04:53:45Z","tags":{}},"n185955120":{"id":"n185955120","loc":[-85.620103,41.951],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T04:56:39Z","tags":{}},"n185955143":{"id":"n185955143","loc":[-85.619784,41.94746],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T04:56:39Z","tags":{}},"n185960124":{"id":"n185960124","loc":[-85.615238,41.947468],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T04:59:07Z","tags":{}},"n185961362":{"id":"n185961362","loc":[-85.617437,41.947451],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T04:59:38Z","tags":{}},"n185961364":{"id":"n185961364","loc":[-85.61861,41.947456],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T04:59:38Z","tags":{}},"n185961367":{"id":"n185961367","loc":[-85.620088,41.947458],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T04:59:38Z","tags":{}},"n185965105":{"id":"n185965105","loc":[-85.620087,41.94924],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:01:44Z","tags":{}},"n185970220":{"id":"n185970220","loc":[-85.62156,41.948333],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:04:17Z","tags":{}},"n185974697":{"id":"n185974697","loc":[-85.6201059,41.950132],"version":"3","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:59:05Z","tags":{}},"n2138420778":{"id":"n2138420778","loc":[-85.616948,41.9474499],"version":"1","changeset":"14878832","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-02T04:00:13Z","tags":{}},"w17967535":{"id":"w17967535","version":"1","changeset":"402341","user":"DaveHansenTiger","uid":"7168","visible":"true","timestamp":"2007-12-23T20:52:19Z","tags":{"highway":"residential","name":"10th Ave","tiger:cfcc":"A41","tiger:county":"St. Joseph, MI","tiger:name_base":"10th","tiger:name_type":"Ave","tiger:reviewed":"no","tiger:separated":"no","tiger:source":"tiger_import_dch_v0.6_20070813","tiger:tlid":"15313652:15313654","tiger:upload_uuid":"bulk_upload.pl-b79f893a-0be1-4a5f-a183-6aea114c9af7","tiger:zip_left":"49093","tiger:zip_right":"49093"},"nodes":["n185955120","n185986812","n185983141"]},"w209716130":{"id":"w209716130","version":"1","changeset":"15347539","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T04:54:46Z","tags":{"area":"yes","building":"yes"},"nodes":["n2199093485","n2199093486","n2199093487","n2199093488","n2199093485"]},"w17964788":{"id":"w17964788","version":"2","changeset":"14878832","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-02T04:00:15Z","tags":{"highway":"residential","name":"6th Ave","tiger:cfcc":"A41","tiger:county":"St. Joseph, MI","tiger:name_base":"6th","tiger:name_type":"Ave","tiger:reviewed":"no","tiger:separated":"no","tiger:source":"tiger_import_dch_v0.6_20070813","tiger:tlid":"15313681:15313682:15329115:15329116:15330465:15330466","tiger:upload_uuid":"bulk_upload.pl-b79f893a-0be1-4a5f-a183-6aea114c9af7","tiger:zip_left":"49093","tiger:zip_right":"49093"},"nodes":["n185960124","n185948903","n2138420778","n185961362","n185961364","n185955143","n185961367","n185961369","n185961371"]},"w17965159":{"id":"w17965159","version":"1","changeset":"402341","user":"DaveHansenTiger","uid":"7168","visible":"true","timestamp":"2007-12-23T20:34:55Z","tags":{"highway":"residential","name":"8th Ave","tiger:cfcc":"A41","tiger:county":"St. Joseph, MI","tiger:name_base":"8th","tiger:name_type":"Ave","tiger:reviewed":"no","tiger:separated":"no","tiger:source":"tiger_import_dch_v0.6_20070813","tiger:tlid":"15313660","tiger:upload_uuid":"bulk_upload.pl-b79f893a-0be1-4a5f-a183-6aea114c9af7"},"nodes":["n185965105","n185965108","n185965110"]},"w209716125":{"id":"w209716125","version":"1","changeset":"15347539","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T04:54:45Z","tags":{"area":"yes","building":"yes"},"nodes":["n2199093459","n2199093460","n2199093461","n2199093462","n2199093463","n2199093464","n2199093465","n2199093466","n2199093459"]},"w17965699":{"id":"w17965699","version":"1","changeset":"402341","user":"DaveHansenTiger","uid":"7168","visible":"true","timestamp":"2007-12-23T20:39:03Z","tags":{"highway":"residential","name":"7th Ave","tiger:cfcc":"A41","tiger:county":"St. Joseph, MI","tiger:name_base":"7th","tiger:name_type":"Ave","tiger:reviewed":"no","tiger:separated":"no","tiger:source":"tiger_import_dch_v0.6_20070813","tiger:tlid":"15313667:15314407","tiger:upload_uuid":"bulk_upload.pl-b79f893a-0be1-4a5f-a183-6aea114c9af7","tiger:zip_left":"49093","tiger:zip_right":"49093"},"nodes":["n185970220","n185970222","n185970224"]},"w209716132":{"id":"w209716132","version":"1","changeset":"15347539","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T04:54:46Z","tags":{"area":"yes","building":"yes"},"nodes":["n2199093507","n2199093508","n2199093509","n2199093510","n2199093511","n2199093512","n2199093513","n2199093514","n2199093507"]},"w17966129":{"id":"w17966129","version":"1","changeset":"402341","user":"DaveHansenTiger","uid":"7168","visible":"true","timestamp":"2007-12-23T20:42:41Z","tags":{"highway":"residential","name":"9th Ave","tiger:cfcc":"A41","tiger:county":"St. Joseph, MI","tiger:name_base":"9th","tiger:name_type":"Ave","tiger:reviewed":"no","tiger:separated":"no","tiger:source":"tiger_import_dch_v0.6_20070813","tiger:tlid":"15313656","tiger:upload_uuid":"bulk_upload.pl-b79f893a-0be1-4a5f-a183-6aea114c9af7","tiger:zip_left":"49093","tiger:zip_right":"49093"},"nodes":["n185974697","n185974699"]},"w209716127":{"id":"w209716127","version":"1","changeset":"15347539","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T04:54:46Z","tags":{"area":"yes","building":"yes"},"nodes":["n2199093475","n2199093476","n2199093477","n2199093478","n2199093479","n2199093480","n2199093475"]},"w209716131":{"id":"w209716131","version":"1","changeset":"15347539","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T04:54:46Z","tags":{"area":"yes","natural":"water","water":"pond"},"nodes":["n2199093489","n2199093490","n2199093491","n2199093492","n2199093493","n2199093494","n2199093495","n2199093496","n2199093497","n2199093498","n2199093499","n2199093500","n2199093501","n2199093502","n2199093503","n2199093504","n2199093505","n2199093506","n2199093489"]},"w209716126":{"id":"w209716126","version":"1","changeset":"15347539","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T04:54:45Z","tags":{"area":"yes","building":"yes"},"nodes":["n2199093467","n2199093468","n2199093469","n2199093470","n2199093471","n2199093472","n2199093473","n2199093474","n2199093467"]},"w209716124":{"id":"w209716124","version":"1","changeset":"15347539","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T04:54:45Z","tags":{"area":"yes","building":"yes"},"nodes":["n2199093455","n2199093456","n2199093457","n2199093458","n2199093455"]},"w209716128":{"id":"w209716128","version":"1","changeset":"15347539","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T04:54:46Z","tags":{"area":"yes","building":"yes"},"nodes":["n2199093481","n2199093482","n2199093483","n2199093484","n2199093481"]},"n185949872":{"id":"n185949872","loc":[-85.643009,41.949264],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T04:54:20Z","tags":{}},"n185949875":{"id":"n185949875","loc":[-85.642598,41.94929],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T04:54:20Z","tags":{}},"n185949877":{"id":"n185949877","loc":[-85.642127,41.949382],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T04:54:20Z","tags":{}},"n185949881":{"id":"n185949881","loc":[-85.64169,41.949936],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T04:54:20Z","tags":{}},"n185988165":{"id":"n185988165","loc":[-85.642167,41.947657],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:13:33Z","tags":{}},"n185988167":{"id":"n185988167","loc":[-85.642347,41.947662],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:13:33Z","tags":{}},"n185988169":{"id":"n185988169","loc":[-85.642621,41.947659],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:13:33Z","tags":{}},"n185965019":{"id":"n185965019","loc":[-85.6385084,41.951127],"version":"4","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:48:03Z","tags":{}},"n1475293248":{"id":"n1475293248","loc":[-85.6386095,41.9512214],"version":"2","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:48:04Z","tags":{}},"n185962639":{"id":"n185962639","loc":[-85.649669,41.949161],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:00:30Z","tags":{}},"n185962810":{"id":"n185962810","loc":[-85.649907,41.949157],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:00:34Z","tags":{}},"n185964355":{"id":"n185964355","loc":[-85.637412,41.9511359],"version":"3","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:48:03Z","tags":{}},"n185965021":{"id":"n185965021","loc":[-85.638661,41.952386],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:01:42Z","tags":{}},"n185965023":{"id":"n185965023","loc":[-85.638654,41.953665],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:01:42Z","tags":{}},"n185965025":{"id":"n185965025","loc":[-85.638694,41.954649],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:01:42Z","tags":{}},"n185965027":{"id":"n185965027","loc":[-85.638724,41.955913],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:01:42Z","tags":{}},"n185971415":{"id":"n185971415","loc":[-85.644466,41.949246],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:05:02Z","tags":{}},"n185971417":{"id":"n185971417","loc":[-85.647021,41.949193],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:05:02Z","tags":{}},"n185971420":{"id":"n185971420","loc":[-85.648476,41.949169],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:05:02Z","tags":{}},"n185979975":{"id":"n185979975","loc":[-85.644429,41.947633],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:09:24Z","tags":{}},"n185988171":{"id":"n185988171","loc":[-85.645377,41.947622],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:13:34Z","tags":{}},"w17963211":{"id":"w17963211","version":"1","changeset":"402341","user":"DaveHansenTiger","uid":"7168","visible":"true","timestamp":"2007-12-23T20:23:06Z","tags":{"highway":"residential","tiger:cfcc":"A41","tiger:county":"St. Joseph, MI","tiger:reviewed":"no","tiger:separated":"no","tiger:source":"tiger_import_dch_v0.6_20070813","tiger:tlid":"15313193","tiger:upload_uuid":"bulk_upload.pl-b79f893a-0be1-4a5f-a183-6aea114c9af7"},"nodes":["n185949870","n185949872","n185949875","n185949877","n185949881"]},"w17965839":{"id":"w17965839","version":"1","changeset":"402341","user":"DaveHansenTiger","uid":"7168","visible":"true","timestamp":"2007-12-23T20:40:10Z","tags":{"highway":"residential","name":"Arnold St","tiger:cfcc":"A41","tiger:county":"St. Joseph, MI","tiger:name_base":"Arnold","tiger:name_type":"St","tiger:reviewed":"no","tiger:separated":"no","tiger:source":"tiger_import_dch_v0.6_20070813","tiger:tlid":"15327930:15324550:15312304:15324551","tiger:upload_uuid":"bulk_upload.pl-b79f893a-0be1-4a5f-a183-6aea114c9af7","tiger:zip_left":"49093","tiger:zip_right":"49093"},"nodes":["n185949870","n185971415","n185971417","n185971420","n185962639","n185962810"]},"w17967618":{"id":"w17967618","version":"1","changeset":"402341","user":"DaveHansenTiger","uid":"7168","visible":"true","timestamp":"2007-12-23T20:53:22Z","tags":{"highway":"residential","name":"Pierson St","tiger:cfcc":"A41","tiger:county":"St. Joseph, MI","tiger:name_base":"Pierson","tiger:name_type":"St","tiger:reviewed":"no","tiger:separated":"no","tiger:source":"tiger_import_dch_v0.6_20070813","tiger:tlid":"15313265:15312333:15324553","tiger:upload_uuid":"bulk_upload.pl-b79f893a-0be1-4a5f-a183-6aea114c9af7"},"nodes":["n185967777","n185988165","n185988167","n185988169","n185985824","n185979975","n185988171"]},"w17965149":{"id":"w17965149","version":"2","changeset":"9619138","user":"bbmiller","uid":"451048","visible":"true","timestamp":"2011-10-21T19:54:56Z","tags":{"highway":"residential","name":"Oak St","tiger:cfcc":"A41","tiger:county":"St. Joseph, MI","tiger:name_base":"Oak","tiger:name_type":"St","tiger:reviewed":"no","tiger:separated":"no","tiger:source":"tiger_import_dch_v0.6_20070813","tiger:tlid":"15331522","tiger:upload_uuid":"bulk_upload.pl-b79f893a-0be1-4a5f-a183-6aea114c9af7"},"nodes":["n185965019","n1475293248","n185965021","n185965023","n185965025","n185965027"]},"w17966118":{"id":"w17966118","version":"3","changeset":"15473186","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-24T01:52:24Z","tags":{"highway":"residential","name":"West Armitage Street","tiger:cfcc":"A41","tiger:county":"St. Joseph, MI","tiger:name_base":"Armitage","tiger:name_direction_prefix":"W","tiger:name_type":"St","tiger:reviewed":"no","tiger:zip_left":"49093","tiger:zip_right":"49093"},"nodes":["n185974583","n185974585","n185964355","n185965019"]},"n2208608800":{"id":"n2208608800","loc":[-85.6354294,41.9486201],"version":"1","changeset":"15411098","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-18T17:54:39Z","tags":{}},"n2199109806":{"id":"n2199109806","loc":[-85.6350474,41.9477884],"version":"1","changeset":"15347594","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T05:16:51Z","tags":{}},"n2199109804":{"id":"n2199109804","loc":[-85.6350476,41.9477962],"version":"1","changeset":"15347594","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T05:16:51Z","tags":{}},"n2199109802":{"id":"n2199109802","loc":[-85.635002,41.9477969],"version":"1","changeset":"15347594","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T05:16:51Z","tags":{}},"n2199109799":{"id":"n2199109799","loc":[-85.6350018,41.9477883],"version":"1","changeset":"15347594","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T05:16:51Z","tags":{}},"n2199109797":{"id":"n2199109797","loc":[-85.6349141,41.9477897],"version":"1","changeset":"15347594","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T05:16:51Z","tags":{}},"n2199109795":{"id":"n2199109795","loc":[-85.6349131,41.9477535],"version":"1","changeset":"15347594","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T05:16:51Z","tags":{}},"n2199109793":{"id":"n2199109793","loc":[-85.6349395,41.9477531],"version":"1","changeset":"15347594","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T05:16:51Z","tags":{}},"n2199109791":{"id":"n2199109791","loc":[-85.6349382,41.9477077],"version":"1","changeset":"15347594","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T05:16:51Z","tags":{}},"n2199109789":{"id":"n2199109789","loc":[-85.6351236,41.9477049],"version":"1","changeset":"15347594","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T05:16:51Z","tags":{}},"n2199109787":{"id":"n2199109787","loc":[-85.6351259,41.9477872],"version":"1","changeset":"15347594","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T05:16:51Z","tags":{}},"n2199109785":{"id":"n2199109785","loc":[-85.634972,41.9475992],"version":"1","changeset":"15347594","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T05:16:51Z","tags":{}},"n2199109783":{"id":"n2199109783","loc":[-85.6349206,41.9475997],"version":"1","changeset":"15347594","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T05:16:51Z","tags":{}},"n2199109770":{"id":"n2199109770","loc":[-85.6348499,41.9475461],"version":"1","changeset":"15347594","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T05:16:51Z","tags":{}},"n2199109768":{"id":"n2199109768","loc":[-85.6348499,41.9475084],"version":"1","changeset":"15347594","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T05:16:51Z","tags":{}},"n2199109765":{"id":"n2199109765","loc":[-85.6349241,41.9474569],"version":"1","changeset":"15347594","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T05:16:51Z","tags":{}},"n2199109763":{"id":"n2199109763","loc":[-85.634967,41.9474564],"version":"1","changeset":"15347594","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T05:16:51Z","tags":{}},"n2199109762":{"id":"n2199109762","loc":[-85.6350405,41.9475121],"version":"1","changeset":"15347594","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T05:16:51Z","tags":{}},"n2199109761":{"id":"n2199109761","loc":[-85.6350405,41.9475419],"version":"1","changeset":"15347594","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T05:16:51Z","tags":{}},"n2199109753":{"id":"n2199109753","loc":[-85.6342443,41.9478391],"version":"1","changeset":"15347594","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T05:16:50Z","tags":{}},"n2199109751":{"id":"n2199109751","loc":[-85.6342427,41.9477927],"version":"1","changeset":"15347594","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T05:16:50Z","tags":{}},"n2199109745":{"id":"n2199109745","loc":[-85.6342439,41.9476859],"version":"1","changeset":"15347594","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T05:16:50Z","tags":{}},"n2199109743":{"id":"n2199109743","loc":[-85.6342429,41.9476575],"version":"1","changeset":"15347594","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T05:16:50Z","tags":{}},"n2199109741":{"id":"n2199109741","loc":[-85.6344615,41.9476533],"version":"1","changeset":"15347594","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T05:16:50Z","tags":{}},"n2199109739":{"id":"n2199109739","loc":[-85.6344678,41.9478348],"version":"1","changeset":"15347594","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T05:16:50Z","tags":{}},"n2199109737":{"id":"n2199109737","loc":[-85.634416,41.9480059],"version":"1","changeset":"15347594","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T05:16:50Z","tags":{}},"n2199109735":{"id":"n2199109735","loc":[-85.6344145,41.9478983],"version":"1","changeset":"15347594","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T05:16:50Z","tags":{}},"n2199109733":{"id":"n2199109733","loc":[-85.6342749,41.9478993],"version":"1","changeset":"15347594","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T05:16:50Z","tags":{}},"n2199109731":{"id":"n2199109731","loc":[-85.6342753,41.9479272],"version":"1","changeset":"15347594","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T05:16:50Z","tags":{}},"n2199109729":{"id":"n2199109729","loc":[-85.6342498,41.9479274],"version":"1","changeset":"15347594","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T05:16:50Z","tags":{}},"n2199109727":{"id":"n2199109727","loc":[-85.6342505,41.9479762],"version":"1","changeset":"15347594","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T05:16:50Z","tags":{}},"n2199109725":{"id":"n2199109725","loc":[-85.6342743,41.947976],"version":"1","changeset":"15347594","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T05:16:50Z","tags":{}},"n2199109723":{"id":"n2199109723","loc":[-85.6342747,41.948007],"version":"1","changeset":"15347594","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T05:16:50Z","tags":{}},"n2199109721":{"id":"n2199109721","loc":[-85.6343415,41.9476355],"version":"1","changeset":"15347594","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T05:16:50Z","tags":{}},"n2199109719":{"id":"n2199109719","loc":[-85.6343391,41.9474973],"version":"1","changeset":"15347594","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T05:16:50Z","tags":{}},"n2199109717":{"id":"n2199109717","loc":[-85.6343133,41.9474798],"version":"1","changeset":"15347594","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T05:16:50Z","tags":{}},"n2199109715":{"id":"n2199109715","loc":[-85.6342874,41.9474737],"version":"1","changeset":"15347594","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T05:16:50Z","tags":{}},"n2199109709":{"id":"n2199109709","loc":[-85.6349804,41.94815],"version":"1","changeset":"15347594","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T05:16:50Z","tags":{}},"n2199109707":{"id":"n2199109707","loc":[-85.6348915,41.9481505],"version":"1","changeset":"15347594","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T05:16:50Z","tags":{}},"n2199109705":{"id":"n2199109705","loc":[-85.6348917,41.9481692],"version":"1","changeset":"15347594","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T05:16:50Z","tags":{}},"n2199109702":{"id":"n2199109702","loc":[-85.6348522,41.9481694],"version":"1","changeset":"15347594","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T05:16:50Z","tags":{}},"n2199109700":{"id":"n2199109700","loc":[-85.6348532,41.9482679],"version":"1","changeset":"15347594","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T05:16:50Z","tags":{}},"n2199109698":{"id":"n2199109698","loc":[-85.6348315,41.948268],"version":"1","changeset":"15347594","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T05:16:50Z","tags":{}},"n2199109696":{"id":"n2199109696","loc":[-85.6348318,41.9482955],"version":"1","changeset":"15347594","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T05:16:50Z","tags":{}},"n2199109694":{"id":"n2199109694","loc":[-85.6349653,41.9482946],"version":"1","changeset":"15347594","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T05:16:50Z","tags":{}},"n2199109692":{"id":"n2199109692","loc":[-85.6349656,41.9483211],"version":"1","changeset":"15347594","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T05:16:50Z","tags":{}},"n2199109690":{"id":"n2199109690","loc":[-85.634999,41.9483209],"version":"1","changeset":"15347594","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T05:16:50Z","tags":{}},"n2199109688":{"id":"n2199109688","loc":[-85.6349987,41.9482947],"version":"1","changeset":"15347594","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T05:16:50Z","tags":{}},"n2199109686":{"id":"n2199109686","loc":[-85.6351753,41.9482935],"version":"1","changeset":"15347594","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T05:16:50Z","tags":{}},"n2199109684":{"id":"n2199109684","loc":[-85.6351749,41.9482617],"version":"1","changeset":"15347594","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T05:16:50Z","tags":{}},"n2199109682":{"id":"n2199109682","loc":[-85.6351588,41.9482618],"version":"1","changeset":"15347594","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T05:16:50Z","tags":{}},"n2199109680":{"id":"n2199109680","loc":[-85.6351575,41.9481518],"version":"1","changeset":"15347594","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T05:16:50Z","tags":{}},"n2199109678":{"id":"n2199109678","loc":[-85.6350671,41.9481524],"version":"1","changeset":"15347594","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T05:16:50Z","tags":{}},"n2199109676":{"id":"n2199109676","loc":[-85.6350649,41.9479659],"version":"1","changeset":"15347594","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T05:16:50Z","tags":{}},"n2199109674":{"id":"n2199109674","loc":[-85.6349785,41.9479665],"version":"1","changeset":"15347594","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T05:16:50Z","tags":{}},"n2199109671":{"id":"n2199109671","loc":[-85.6343069,41.9483263],"version":"1","changeset":"15347594","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T05:16:50Z","tags":{}},"n2199109669":{"id":"n2199109669","loc":[-85.6343052,41.9482981],"version":"1","changeset":"15347594","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T05:16:50Z","tags":{}},"n2199109658":{"id":"n2199109658","loc":[-85.6343314,41.9480549],"version":"1","changeset":"15347594","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T05:16:50Z","tags":{}},"n2199109656":{"id":"n2199109656","loc":[-85.6343305,41.9480461],"version":"1","changeset":"15347594","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T05:16:50Z","tags":{}},"n2199109654":{"id":"n2199109654","loc":[-85.634435,41.9480468],"version":"1","changeset":"15347594","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T05:16:50Z","tags":{}},"n2199109652":{"id":"n2199109652","loc":[-85.6344342,41.9483746],"version":"1","changeset":"15347594","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T05:16:50Z","tags":{}},"n2199109650":{"id":"n2199109650","loc":[-85.6344629,41.9483727],"version":"1","changeset":"15347594","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T05:16:50Z","tags":{}},"n2199109648":{"id":"n2199109648","loc":[-85.6344637,41.9484561],"version":"1","changeset":"15347594","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T05:16:49Z","tags":{}},"n2199109645":{"id":"n2199109645","loc":[-85.63443,41.9484567],"version":"1","changeset":"15347594","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T05:16:49Z","tags":{}},"n2199109642":{"id":"n2199109642","loc":[-85.6344317,41.948505],"version":"1","changeset":"15347594","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T05:16:49Z","tags":{}},"n185964352":{"id":"n185964352","loc":[-85.6373958,41.9489943],"version":"3","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:48:03Z","tags":{}},"n185964351":{"id":"n185964351","loc":[-85.637113,41.9486],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:01:21Z","tags":{}},"n2208608825":{"id":"n2208608825","loc":[-85.6354483,41.9494241],"version":"1","changeset":"15411098","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-18T17:54:40Z","tags":{}},"n2208608823":{"id":"n2208608823","loc":[-85.6360418,41.949416],"version":"1","changeset":"15411098","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-18T17:54:40Z","tags":{}},"n2208608821":{"id":"n2208608821","loc":[-85.6360458,41.9495802],"version":"1","changeset":"15411098","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-18T17:54:40Z","tags":{}},"n2208608811":{"id":"n2208608811","loc":[-85.6357458,41.9495843],"version":"1","changeset":"15411098","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-18T17:54:39Z","tags":{}},"n2208608808":{"id":"n2208608808","loc":[-85.6357508,41.9497835],"version":"1","changeset":"15411098","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-18T17:54:39Z","tags":{}},"n2208608806":{"id":"n2208608806","loc":[-85.6354573,41.9497875],"version":"1","changeset":"15411098","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-18T17:54:39Z","tags":{}},"n2208608795":{"id":"n2208608795","loc":[-85.6354595,41.9498778],"version":"1","changeset":"15411098","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-18T17:54:39Z","tags":{}},"n2199109638":{"id":"n2199109638","loc":[-85.6349605,41.949749],"version":"1","changeset":"15347594","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T05:16:49Z","tags":{}},"n2199109636":{"id":"n2199109636","loc":[-85.6349605,41.9497639],"version":"1","changeset":"15347594","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T05:16:49Z","tags":{}},"n2199109634":{"id":"n2199109634","loc":[-85.6349061,41.94971],"version":"1","changeset":"15347594","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T05:16:49Z","tags":{}},"n2199109632":{"id":"n2199109632","loc":[-85.6349048,41.9496569],"version":"1","changeset":"15347594","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T05:16:49Z","tags":{}},"n2199109630":{"id":"n2199109630","loc":[-85.6348835,41.9496571],"version":"1","changeset":"15347594","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T05:16:49Z","tags":{}},"n2199109628":{"id":"n2199109628","loc":[-85.6348829,41.9497103],"version":"1","changeset":"15347594","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T05:16:49Z","tags":{}},"n2199109626":{"id":"n2199109626","loc":[-85.635227,41.9497738],"version":"1","changeset":"15347594","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T05:16:49Z","tags":{}},"n2199109624":{"id":"n2199109624","loc":[-85.6352184,41.9497787],"version":"1","changeset":"15347594","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T05:16:49Z","tags":{}},"n2199109622":{"id":"n2199109622","loc":[-85.6351181,41.9497806],"version":"1","changeset":"15347594","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T05:16:49Z","tags":{}},"n2199109620":{"id":"n2199109620","loc":[-85.6351181,41.9497456],"version":"1","changeset":"15347594","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T05:16:49Z","tags":{}},"n2199109618":{"id":"n2199109618","loc":[-85.6348842,41.9497651],"version":"1","changeset":"15347594","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T05:16:49Z","tags":{}},"n2199109616":{"id":"n2199109616","loc":[-85.6348827,41.9496238],"version":"1","changeset":"15347594","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T05:16:49Z","tags":{}},"n2199109615":{"id":"n2199109615","loc":[-85.6351268,41.9496206],"version":"1","changeset":"15347594","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T05:16:49Z","tags":{}},"n2199109614":{"id":"n2199109614","loc":[-85.6351261,41.9495891],"version":"1","changeset":"15347594","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T05:16:49Z","tags":{}},"n2199109613":{"id":"n2199109613","loc":[-85.6351957,41.9495881],"version":"1","changeset":"15347594","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T05:16:49Z","tags":{}},"n2199109612":{"id":"n2199109612","loc":[-85.6351924,41.9494515],"version":"1","changeset":"15347594","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T05:16:49Z","tags":{}},"n2199109611":{"id":"n2199109611","loc":[-85.6353997,41.9494488],"version":"1","changeset":"15347594","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T05:16:49Z","tags":{}},"n2199109610":{"id":"n2199109610","loc":[-85.6354074,41.9497715],"version":"1","changeset":"15347594","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T05:16:49Z","tags":{}},"n2189015681":{"id":"n2189015681","loc":[-85.6344229,41.9509639],"version":"1","changeset":"15276188","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T21:42:49Z","tags":{}},"n2189015677":{"id":"n2189015677","loc":[-85.634424,41.9507396],"version":"1","changeset":"15276188","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T21:42:49Z","tags":{}},"n2138493843":{"id":"n2138493843","loc":[-85.6343935,41.9502836],"version":"1","changeset":"14879185","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-02T05:55:31Z","tags":{}},"n2138493840":{"id":"n2138493840","loc":[-85.634398,41.9506264],"version":"1","changeset":"14879185","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-02T05:55:31Z","tags":{}},"n354002838":{"id":"n354002838","loc":[-85.6345197,41.9510631],"version":"2","changeset":"14676554","user":"bbmiller","uid":"451048","visible":"true","timestamp":"2013-01-16T20:05:18Z","tags":{}},"n2114807590":{"id":"n2114807590","loc":[-85.634511,41.9499767],"version":"1","changeset":"14676554","user":"bbmiller","uid":"451048","visible":"true","timestamp":"2013-01-16T20:05:15Z","tags":{}},"n185964353":{"id":"n185964353","loc":[-85.6374092,41.9498755],"version":"3","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:48:03Z","tags":{}},"n1819849180":{"id":"n1819849180","loc":[-85.6348236,41.94996],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:59Z","tags":{}},"n1819849115":{"id":"n1819849115","loc":[-85.6354372,41.9499538],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:57Z","tags":{}},"n1819848921":{"id":"n1819848921","loc":[-85.6348439,41.951064],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:50Z","tags":{}},"n1819848885":{"id":"n1819848885","loc":[-85.6354575,41.9510578],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:49Z","tags":{}},"n185984281":{"id":"n185984281","loc":[-85.638075,41.949872],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:11:55Z","tags":{}},"n2208608827":{"id":"n2208608827","loc":[-85.6339169,41.9473191],"version":"1","changeset":"15411098","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-18T17:54:40Z","tags":{}},"n2199109749":{"id":"n2199109749","loc":[-85.6342082,41.9477934],"version":"1","changeset":"15347594","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T05:16:50Z","tags":{}},"n2199109747":{"id":"n2199109747","loc":[-85.6342045,41.9476867],"version":"1","changeset":"15347594","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T05:16:50Z","tags":{}},"n2199109713":{"id":"n2199109713","loc":[-85.6342404,41.9474746],"version":"1","changeset":"15347594","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T05:16:50Z","tags":{}},"n2199109711":{"id":"n2199109711","loc":[-85.6342404,41.9476355],"version":"1","changeset":"15347594","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T05:16:50Z","tags":{}},"n2199109673":{"id":"n2199109673","loc":[-85.6340886,41.9483282],"version":"1","changeset":"15347594","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T05:16:50Z","tags":{}},"n2199109667":{"id":"n2199109667","loc":[-85.6342403,41.9482988],"version":"1","changeset":"15347594","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T05:16:50Z","tags":{}},"n2199109665":{"id":"n2199109665","loc":[-85.6342386,41.9482116],"version":"1","changeset":"15347594","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T05:16:50Z","tags":{}},"n2199109662":{"id":"n2199109662","loc":[-85.6340861,41.9482135],"version":"1","changeset":"15347594","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T05:16:50Z","tags":{}},"n2199109660":{"id":"n2199109660","loc":[-85.6340802,41.9480562],"version":"1","changeset":"15347594","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T05:16:50Z","tags":{}},"n2199109640":{"id":"n2199109640","loc":[-85.6340928,41.9485063],"version":"1","changeset":"15347594","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T05:16:49Z","tags":{}},"n354031366":{"id":"n354031366","loc":[-85.6341667,41.9477778],"version":"3","changeset":"3908860","user":"Geogast","uid":"51045","visible":"true","timestamp":"2010-02-18T13:28:25Z","tags":{"amenity":"place_of_worship","ele":"249","gnis:county_id":"149","gnis:created":"04/30/2008","gnis:feature_id":"2417877","gnis:state_id":"26","name":"Faith Tabernacle Church","religion":"christian"}},"n2189015686":{"id":"n2189015686","loc":[-85.6337798,41.95099],"version":"1","changeset":"15276188","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T21:42:49Z","tags":{}},"n2189015684":{"id":"n2189015684","loc":[-85.6337794,41.9509674],"version":"1","changeset":"15276188","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T21:42:49Z","tags":{}},"n2189015673":{"id":"n2189015673","loc":[-85.6337501,41.9507457],"version":"1","changeset":"15276188","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T21:42:49Z","tags":{}},"n2189015669":{"id":"n2189015669","loc":[-85.6337501,41.9506974],"version":"1","changeset":"15276188","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T21:42:49Z","tags":{}},"n2189015665":{"id":"n2189015665","loc":[-85.6339034,41.9506959],"version":"1","changeset":"15276188","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T21:42:49Z","tags":{}},"n2189015662":{"id":"n2189015662","loc":[-85.6339015,41.950436],"version":"1","changeset":"15276188","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T21:42:49Z","tags":{}},"n2189015658":{"id":"n2189015658","loc":[-85.6334916,41.9504376],"version":"1","changeset":"15276188","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T21:42:49Z","tags":{}},"n2189015655":{"id":"n2189015655","loc":[-85.6334939,41.9507558],"version":"1","changeset":"15276188","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T21:42:49Z","tags":{}},"n2189015650":{"id":"n2189015650","loc":[-85.6334543,41.950756],"version":"1","changeset":"15276188","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T21:42:49Z","tags":{}},"n2189015649":{"id":"n2189015649","loc":[-85.633456,41.9509915],"version":"1","changeset":"15276188","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T21:42:49Z","tags":{}},"n2138493842":{"id":"n2138493842","loc":[-85.6339937,41.9502836],"version":"1","changeset":"14879185","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-02T05:55:31Z","tags":{}},"n2138493841":{"id":"n2138493841","loc":[-85.6339983,41.9506281],"version":"1","changeset":"14879185","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-02T05:55:31Z","tags":{}},"n2114807579":{"id":"n2114807579","loc":[-85.6333644,41.9510682],"version":"1","changeset":"14676554","user":"bbmiller","uid":"451048","visible":"true","timestamp":"2013-01-16T20:05:15Z","tags":{}},"n2114807573":{"id":"n2114807573","loc":[-85.6333557,41.9499819],"version":"1","changeset":"14676554","user":"bbmiller","uid":"451048","visible":"true","timestamp":"2013-01-16T20:05:15Z","tags":{}},"n354031330":{"id":"n354031330","loc":[-85.6341667,41.9497222],"version":"3","changeset":"3908860","user":"Geogast","uid":"51045","visible":"true","timestamp":"2010-02-18T13:28:24Z","tags":{"amenity":"place_of_worship","ele":"250","gnis:county_id":"149","gnis:created":"04/30/2008","gnis:feature_id":"2417879","gnis:state_id":"26","name":"Trinity Episcopal Church","religion":"christian"}},"n185960794":{"id":"n185960794","loc":[-85.633307,41.9537],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T04:59:24Z","tags":{}},"n185964357":{"id":"n185964357","loc":[-85.637432,41.952399],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:01:21Z","tags":{}},"n185964358":{"id":"n185964358","loc":[-85.637452,41.953665],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:01:21Z","tags":{}},"n185964359":{"id":"n185964359","loc":[-85.63746,41.954658],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:01:21Z","tags":{}},"n185964360":{"id":"n185964360","loc":[-85.637473,41.95592],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:01:21Z","tags":{}},"n185964361":{"id":"n185964361","loc":[-85.637468,41.956906],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:01:21Z","tags":{}},"n185964362":{"id":"n185964362","loc":[-85.637483,41.958313],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:01:21Z","tags":{}},"n185966957":{"id":"n185966957","loc":[-85.633361,41.957422],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:02:50Z","tags":{}},"n185975351":{"id":"n185975351","loc":[-85.63334,41.9559],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:06:58Z","tags":{}},"n185978784":{"id":"n185978784","loc":[-85.633311,41.954679],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:08:34Z","tags":{}},"n185986157":{"id":"n185986157","loc":[-85.633287,41.952426],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:12:48Z","tags":{}},"n185986158":{"id":"n185986158","loc":[-85.6333607,41.9582301],"version":"3","changeset":"15473186","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-24T01:52:20Z","tags":{"highway":"turning_circle"}},"w17965182":{"id":"w17965182","version":"2","changeset":"15277317","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-07T00:30:17Z","tags":{"highway":"residential","name":"W Prutzman St","tiger:cfcc":"A41","tiger:county":"St. Joseph, MI","tiger:name_base":"Prutzman","tiger:name_direction_prefix":"W","tiger:name_type":"St","tiger:reviewed":"no","tiger:zip_left":"49093"},"nodes":["n185965289","n2189153241","n185965291"]},"w208627205":{"id":"w208627205","version":"1","changeset":"15276188","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T21:42:53Z","tags":{"area":"yes","building":"yes"},"nodes":["n2189015649","n2189015650","n2189015655","n2189015658","n2189015662","n2189015665","n2189015669","n2189015673","n2189015677","n2189015681","n2189015684","n2189015686","n2189015649"]},"w209717042":{"id":"w209717042","version":"1","changeset":"15347594","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T05:16:52Z","tags":{"amenity":"place_of_worship","area":"yes","building":"yes","denomination":"presbyterian","ele":"250","gnis:county_id":"149","gnis:created":"04/30/2008","gnis:feature_id":"2417878","gnis:state_id":"26","name":"First Presbyterian Church","religion":"christian"},"nodes":["n2199109610","n2199109611","n2199109612","n2199109613","n2199109614","n2199109615","n2199109616","n2199109630","n2199109632","n2199109634","n2199109628","n2199109618","n2199109636","n2199109638","n2199109620","n2199109622","n2199109624","n2199109626","n2199109610"]},"w209717045":{"id":"w209717045","version":"1","changeset":"15347594","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T05:16:52Z","tags":{"area":"yes","building":"yes"},"nodes":["n2199109711","n2199109713","n2199109715","n2199109717","n2199109719","n2199109721","n2199109711"]},"w209717047":{"id":"w209717047","version":"1","changeset":"15347594","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T05:16:53Z","tags":{"area":"yes","building":"yes"},"nodes":["n2199109739","n2199109741","n2199109743","n2199109745","n2199109747","n2199109749","n2199109751","n2199109753","n2199109739"]},"w209717044":{"id":"w209717044","version":"1","changeset":"15347594","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T05:16:52Z","tags":{"area":"yes","building":"yes"},"nodes":["n2199109674","n2199109676","n2199109678","n2199109680","n2199109682","n2199109684","n2199109686","n2199109688","n2199109690","n2199109692","n2199109694","n2199109696","n2199109698","n2199109700","n2199109702","n2199109705","n2199109707","n2199109709","n2199109674"]},"w210822776":{"id":"w210822776","version":"1","changeset":"15411098","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-18T17:54:40Z","tags":{"highway":"service","service":"alley","surface":"unpaved"},"nodes":["n2208608795","n2208608806","n2208608825","n2208608800","n2189153241"]},"w210822778":{"id":"w210822778","version":"1","changeset":"15411098","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-18T17:54:40Z","tags":{"highway":"service","service":"alley"},"nodes":["n2208608826","n2208608827"]},"w209717050":{"id":"w209717050","version":"1","changeset":"15347594","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T05:16:53Z","tags":{"area":"yes","building":"yes"},"nodes":["n2199109787","n2199109789","n2199109791","n2199109793","n2199109795","n2199109797","n2199109799","n2199109802","n2199109804","n2199109806","n2199109787"]},"w17965097":{"id":"w17965097","version":"2","changeset":"15473186","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-24T01:52:23Z","tags":{"highway":"residential","name":"Maple Street","tiger:cfcc":"A41","tiger:county":"St. Joseph, MI","tiger:name_base":"Maple","tiger:name_type":"St","tiger:reviewed":"no"},"nodes":["n185964351","n185964352","n185964353","n185964355","n185964357","n185964358","n185964359","n185964360","n185964361","n185964362"]},"w17965856":{"id":"w17965856","version":"2","changeset":"15411098","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-18T17:54:40Z","tags":{"highway":"residential","name":"W Kelsey St","tiger:cfcc":"A41","tiger:county":"St. Joseph, MI","tiger:name_base":"Kelsey","tiger:name_direction_prefix":"W","tiger:name_type":"St","tiger:reviewed":"no","tiger:zip_left":"49093"},"nodes":["n185971578","n2208608800","n185971580","n185964351"]},"w17967444":{"id":"w17967444","version":"2","changeset":"15473186","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-24T01:52:22Z","tags":{"highway":"residential","name":"East Street","tiger:cfcc":"A41","tiger:county":"St. Joseph, MI","tiger:name_base":"East","tiger:name_type":"St","tiger:reviewed":"no","tiger:zip_left":"49093","tiger:zip_right":"49093"},"nodes":["n185966937","n185978969","n185986155","n185985812","n185986157","n185960794","n185978784","n185975351","n185966957","n185986158"]},"w17967764":{"id":"w17967764","version":"1","changeset":"402580","user":"DaveHansenTiger","uid":"7168","visible":"true","timestamp":"2007-12-23T20:54:14Z","tags":{"highway":"residential","name":"Rock River Ave","tiger:cfcc":"A41","tiger:county":"St. Joseph, MI","tiger:name_base":"Rock River","tiger:name_type":"Ave","tiger:reviewed":"no","tiger:separated":"no","tiger:source":"tiger_import_dch_v0.6_20070813","tiger:tlid":"15312338","tiger:upload_uuid":"bulk_upload.pl-b79f893a-0be1-4a5f-a183-6aea114c9af7","tiger:zip_left":"49093","tiger:zip_right":"49093"},"nodes":["n185984017","n185964351"]},"w170848329":{"id":"w170848329","version":"2","changeset":"14676554","user":"bbmiller","uid":"451048","visible":"true","timestamp":"2013-01-16T20:05:18Z","tags":{"ele":"251","gnis:county_id":"149","gnis:created":"04/30/2008","gnis:feature_id":"2418164","gnis:state_id":"26","leisure":"park","name":"LaFayette Park","source":"Bing"},"nodes":["n1819849180","n1819849115","n1819848885","n1819848921","n1819849180"]},"w17967208":{"id":"w17967208","version":"4","changeset":"15473186","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-24T01:52:24Z","tags":{"highway":"residential","name":"West Bennett Street","tiger:cfcc":"A41","tiger:county":"St. Joseph, MI","tiger:name_base":"Bennett","tiger:name_direction_prefix":"W","tiger:name_type":"St","tiger:reviewed":"no"},"nodes":["n185978390","n2208608795","n185984020","n185964353","n185984281"]},"w17965349":{"id":"w17965349","version":"2","changeset":"15411098","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-18T17:54:40Z","tags":{"highway":"residential","name":"E Prutzman St","tiger:cfcc":"A41","tiger:county":"St. Joseph, MI","tiger:name_base":"Prutzman","tiger:name_direction_prefix":"E","tiger:name_type":"St","tiger:reviewed":"no","tiger:zip_left":"49093"},"nodes":["n185966937","n2208608827","n185965289"]},"w209717049":{"id":"w209717049","version":"1","changeset":"15347594","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T05:16:53Z","tags":{"area":"yes","building":"yes"},"nodes":["n2199109761","n2199109762","n2199109763","n2199109765","n2199109768","n2199109770","n2199109783","n2199109785","n2199109761"]},"w203841840":{"id":"w203841840","version":"1","changeset":"14879185","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-02T05:55:32Z","tags":{"area":"yes","leisure":"playground"},"nodes":["n2138493840","n2138493841","n2138493842","n2138493843","n2138493840"]},"w209717043":{"id":"w209717043","version":"1","changeset":"15347594","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T05:16:52Z","tags":{"amenity":"place_of_worship","area":"yes","building":"church","denomination":"methodist","ele":"249","gnis:county_id":"149","gnis:created":"04/30/2008","gnis:feature_id":"2417880","gnis:state_id":"26","name":"First United Methodist Church","religion":"christian"},"nodes":["n2199109640","n2199109642","n2199109645","n2199109648","n2199109650","n2199109652","n2199109654","n2199109656","n2199109658","n2199109660","n2199109662","n2199109665","n2199109667","n2199109669","n2199109671","n2199109673","n2199109640"]},"w201484341":{"id":"w201484341","version":"1","changeset":"14676554","user":"bbmiller","uid":"451048","visible":"true","timestamp":"2013-01-16T20:05:16Z","tags":{"amenity":"school","ele":"250","gnis:county_id":"149","gnis:created":"04/14/1980","gnis:edited":"02/22/2008","gnis:feature_id":"1624612","gnis:state_id":"26","name":"Hoppin School"},"nodes":["n354002838","n2114807579","n2114807573","n2114807590","n354002838"]},"w209717046":{"id":"w209717046","version":"1","changeset":"15347594","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T05:16:52Z","tags":{"area":"yes","building":"yes"},"nodes":["n2199109723","n2199109725","n2199109727","n2199109729","n2199109731","n2199109733","n2199109735","n2199109737","n2199109723"]},"w210822777":{"id":"w210822777","version":"1","changeset":"15411098","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-18T17:54:40Z","tags":{"amenity":"parking","area":"yes"},"nodes":["n2208608806","n2208608808","n2208608811","n2208608821","n2208608823","n2208608825","n2208608806"]},"n185954965":{"id":"n185954965","loc":[-85.6191189,41.9441922],"version":"3","changeset":"9619138","user":"bbmiller","uid":"451048","visible":"true","timestamp":"2011-10-21T19:45:57Z","tags":{}},"n185954968":{"id":"n185954968","loc":[-85.6194384,41.9442405],"version":"3","changeset":"9619138","user":"bbmiller","uid":"451048","visible":"true","timestamp":"2011-10-21T19:45:58Z","tags":{}},"n185954970":{"id":"n185954970","loc":[-85.6196543,41.9443252],"version":"3","changeset":"9619138","user":"bbmiller","uid":"451048","visible":"true","timestamp":"2011-10-21T19:45:58Z","tags":{}},"n185954972":{"id":"n185954972","loc":[-85.6197862,41.9444539],"version":"3","changeset":"9619138","user":"bbmiller","uid":"451048","visible":"true","timestamp":"2011-10-21T19:45:58Z","tags":{}},"n354002931":{"id":"n354002931","loc":[-85.6198991,41.9455269],"version":"2","changeset":"9619138","user":"bbmiller","uid":"451048","visible":"true","timestamp":"2011-10-21T19:46:01Z","tags":{}},"n354030853":{"id":"n354030853","loc":[-85.6219444,41.9455556],"version":"3","changeset":"3908860","user":"Geogast","uid":"51045","visible":"true","timestamp":"2010-02-18T13:28:19Z","tags":{"amenity":"place_of_worship","ele":"246","gnis:county_id":"149","gnis:created":"04/30/2008","gnis:feature_id":"2417869","gnis:state_id":"26","name":"Grant Chapel","religion":"christian"}},"n367815963":{"id":"n367815963","loc":[-85.6202778,41.9461111],"version":"1","changeset":"871579","user":"amillar","uid":"28145","visible":"true","timestamp":"2009-03-31T07:45:44Z","tags":{"addr:state":"MI","building":"yes","ele":"247","gnis:county_name":"St. Joseph","gnis:feature_id":"2418176","gnis:import_uuid":"57871b70-0100-4405-bb30-88b2e001a944","gnis:reviewed":"no","name":"George Washington Carver Community Center","source":"USGS Geonames"}},"n185947331":{"id":"n185947331","loc":[-85.618779,41.943269],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T04:53:11Z","tags":{}},"n185947333":{"id":"n185947333","loc":[-85.618795,41.943511],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T04:53:11Z","tags":{}},"n185947336":{"id":"n185947336","loc":[-85.618711,41.94413],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T04:53:11Z","tags":{}},"n185947338":{"id":"n185947338","loc":[-85.618704,41.944189],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T04:53:11Z","tags":{}},"n185947339":{"id":"n185947339","loc":[-85.618597,41.944337],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T04:53:11Z","tags":{}},"n185947340":{"id":"n185947340","loc":[-85.618485,41.944528],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T04:53:11Z","tags":{}},"n185947343":{"id":"n185947343","loc":[-85.618442,41.944716],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T04:53:11Z","tags":{}},"n185947345":{"id":"n185947345","loc":[-85.618457,41.945107],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T04:53:11Z","tags":{}},"n185947347":{"id":"n185947347","loc":[-85.618296,41.945338],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T04:53:11Z","tags":{}},"n185947374":{"id":"n185947374","loc":[-85.616748,41.944453],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T04:53:11Z","tags":{}},"n185947375":{"id":"n185947375","loc":[-85.616813,41.944646],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T04:53:11Z","tags":{}},"n185947376":{"id":"n185947376","loc":[-85.616859,41.945196],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T04:53:12Z","tags":{}},"n185947377":{"id":"n185947377","loc":[-85.616941,41.945352],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T04:53:12Z","tags":{}},"n185947406":{"id":"n185947406","loc":[-85.618184,41.944227],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T04:53:13Z","tags":{}},"n185947409":{"id":"n185947409","loc":[-85.617911,41.943875],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T04:53:13Z","tags":{}},"n185947410":{"id":"n185947410","loc":[-85.617579,41.943682],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T04:53:13Z","tags":{}},"n185947411":{"id":"n185947411","loc":[-85.61713,41.943589],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T04:53:13Z","tags":{}},"n185947412":{"id":"n185947412","loc":[-85.616549,41.943559],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T04:53:13Z","tags":{}},"n185947414":{"id":"n185947414","loc":[-85.616482,41.943556],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T04:53:13Z","tags":{}},"n185947464":{"id":"n185947464","loc":[-85.616526,41.943788],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T04:53:14Z","tags":{}},"n185947466":{"id":"n185947466","loc":[-85.616504,41.944002],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T04:53:14Z","tags":{}},"n185948863":{"id":"n185948863","loc":[-85.619017,41.943391],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T04:53:45Z","tags":{}},"n185948865":{"id":"n185948865","loc":[-85.619059,41.943368],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T04:53:45Z","tags":{}},"n185955022":{"id":"n185955022","loc":[-85.620088,41.945571],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T04:56:37Z","tags":{}},"n185955025":{"id":"n185955025","loc":[-85.620051,41.945505],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T04:56:37Z","tags":{}},"n185955028":{"id":"n185955028","loc":[-85.62001,41.94541],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T04:56:37Z","tags":{}},"n185980371":{"id":"n185980371","loc":[-85.620982,41.944742],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:09:37Z","tags":{}},"n185980398":{"id":"n185980398","loc":[-85.621305,41.944782],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:09:38Z","tags":{}},"n185980401":{"id":"n185980401","loc":[-85.621174,41.944819],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:09:38Z","tags":{}},"n185980403":{"id":"n185980403","loc":[-85.621029,41.944871],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:09:38Z","tags":{}},"n185980405":{"id":"n185980405","loc":[-85.620741,41.945011],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:09:38Z","tags":{}},"n185980407":{"id":"n185980407","loc":[-85.620616,41.945085],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:09:38Z","tags":{}},"n185980409":{"id":"n185980409","loc":[-85.620506,41.945172],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:09:38Z","tags":{}},"n185980411":{"id":"n185980411","loc":[-85.620394,41.945273],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:09:38Z","tags":{}},"n185980413":{"id":"n185980413","loc":[-85.620316,41.94536],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:09:39Z","tags":{}},"n185980415":{"id":"n185980415","loc":[-85.620257,41.945452],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:09:39Z","tags":{}},"n185980417":{"id":"n185980417","loc":[-85.620212,41.945535],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:09:39Z","tags":{}},"n185985910":{"id":"n185985910","loc":[-85.620101,41.945811],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:12:41Z","tags":{}},"n185985912":{"id":"n185985912","loc":[-85.620081,41.945937],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:12:42Z","tags":{}},"n1475283972":{"id":"n1475283972","loc":[-85.6198991,41.9437179],"version":"1","changeset":"9619138","user":"bbmiller","uid":"451048","visible":"true","timestamp":"2011-10-21T19:45:45Z","tags":{}},"n1475283982":{"id":"n1475283982","loc":[-85.6195022,41.9433463],"version":"1","changeset":"9619138","user":"bbmiller","uid":"451048","visible":"true","timestamp":"2011-10-21T19:45:46Z","tags":{}},"n1475284007":{"id":"n1475284007","loc":[-85.6193037,41.9433383],"version":"1","changeset":"9619138","user":"bbmiller","uid":"451048","visible":"true","timestamp":"2011-10-21T19:45:47Z","tags":{}},"n1475284040":{"id":"n1475284040","loc":[-85.6197329,41.9434121],"version":"1","changeset":"9619138","user":"bbmiller","uid":"451048","visible":"true","timestamp":"2011-10-21T19:45:47Z","tags":{}},"n1475284044":{"id":"n1475284044","loc":[-85.6198756,41.9435363],"version":"1","changeset":"9619138","user":"bbmiller","uid":"451048","visible":"true","timestamp":"2011-10-21T19:45:47Z","tags":{}},"n1475284050":{"id":"n1475284050","loc":[-85.6199689,41.9432106],"version":"1","changeset":"9619138","user":"bbmiller","uid":"451048","visible":"true","timestamp":"2011-10-21T19:45:48Z","tags":{}},"n1475284053":{"id":"n1475284053","loc":[-85.6198943,41.9432921],"version":"1","changeset":"9619138","user":"bbmiller","uid":"451048","visible":"true","timestamp":"2011-10-21T19:45:48Z","tags":{}},"n185954974":{"id":"n185954974","loc":[-85.6198296,41.94473],"version":"3","changeset":"9619138","user":"bbmiller","uid":"451048","visible":"true","timestamp":"2011-10-21T19:45:58Z","tags":{}},"n185954977":{"id":"n185954977","loc":[-85.6200474,41.9447384],"version":"3","changeset":"9619138","user":"bbmiller","uid":"451048","visible":"true","timestamp":"2011-10-21T19:45:58Z","tags":{}},"n2196831365":{"id":"n2196831365","loc":[-85.6202259,41.9460883],"version":"1","changeset":"15335510","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-12T03:10:40Z","tags":{}},"n2196831366":{"id":"n2196831366","loc":[-85.6202245,41.9458642],"version":"1","changeset":"15335510","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-12T03:10:40Z","tags":{}},"n2196831367":{"id":"n2196831367","loc":[-85.6205184,41.9458631],"version":"1","changeset":"15335510","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-12T03:10:40Z","tags":{}},"n2196831368":{"id":"n2196831368","loc":[-85.6205189,41.9459437],"version":"1","changeset":"15335510","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-12T03:10:40Z","tags":{}},"n2196831369":{"id":"n2196831369","loc":[-85.6203879,41.9459441],"version":"1","changeset":"15335510","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-12T03:10:40Z","tags":{}},"n2196831370":{"id":"n2196831370","loc":[-85.6203888,41.9460878],"version":"1","changeset":"15335510","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-12T03:10:40Z","tags":{}},"n2196831371":{"id":"n2196831371","loc":[-85.6184046,41.9465663],"version":"1","changeset":"15335510","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-12T03:10:40Z","tags":{}},"n2196831372":{"id":"n2196831372","loc":[-85.6191563,41.9465618],"version":"1","changeset":"15335510","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-12T03:10:40Z","tags":{}},"n2196831373":{"id":"n2196831373","loc":[-85.6191536,41.946319],"version":"1","changeset":"15335510","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-12T03:10:40Z","tags":{}},"n2196831374":{"id":"n2196831374","loc":[-85.6187356,41.9463216],"version":"1","changeset":"15335510","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-12T03:10:40Z","tags":{}},"n2196831375":{"id":"n2196831375","loc":[-85.6187334,41.9461197],"version":"1","changeset":"15335510","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-12T03:10:40Z","tags":{}},"n2196831376":{"id":"n2196831376","loc":[-85.6193167,41.9461162],"version":"1","changeset":"15335510","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-12T03:10:40Z","tags":{}},"n2196831377":{"id":"n2196831377","loc":[-85.6193156,41.9460229],"version":"1","changeset":"15335510","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-12T03:10:40Z","tags":{}},"n2196831378":{"id":"n2196831378","loc":[-85.619622,41.946021],"version":"1","changeset":"15335510","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-12T03:10:40Z","tags":{}},"n2196831379":{"id":"n2196831379","loc":[-85.6196237,41.9461712],"version":"1","changeset":"15335510","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-12T03:10:40Z","tags":{}},"n2196831380":{"id":"n2196831380","loc":[-85.6197702,41.9461703],"version":"1","changeset":"15335510","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-12T03:10:40Z","tags":{}},"n2196831381":{"id":"n2196831381","loc":[-85.6197685,41.9460202],"version":"1","changeset":"15335510","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-12T03:10:40Z","tags":{}},"n2196831382":{"id":"n2196831382","loc":[-85.6197323,41.9460204],"version":"1","changeset":"15335510","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-12T03:10:40Z","tags":{}},"n2196831383":{"id":"n2196831383","loc":[-85.6197305,41.9458563],"version":"1","changeset":"15335510","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-12T03:10:40Z","tags":{}},"n2196831384":{"id":"n2196831384","loc":[-85.6196165,41.945857],"version":"1","changeset":"15335510","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-12T03:10:40Z","tags":{}},"n2196831385":{"id":"n2196831385","loc":[-85.6196156,41.9457764],"version":"1","changeset":"15335510","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-12T03:10:40Z","tags":{}},"n2196831386":{"id":"n2196831386","loc":[-85.6194472,41.9457775],"version":"1","changeset":"15335510","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-12T03:10:40Z","tags":{}},"n2196831387":{"id":"n2196831387","loc":[-85.6194151,41.9457777],"version":"1","changeset":"15335510","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-12T03:10:40Z","tags":{}},"n2196831388":{"id":"n2196831388","loc":[-85.6183779,41.9457883],"version":"1","changeset":"15335510","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-12T03:10:40Z","tags":{}},"n2196831389":{"id":"n2196831389","loc":[-85.6183842,41.9461317],"version":"1","changeset":"15335510","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-12T03:10:40Z","tags":{}},"n2196831390":{"id":"n2196831390","loc":[-85.6185026,41.9461304],"version":"1","changeset":"15335510","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-12T03:10:40Z","tags":{}},"n2196831391":{"id":"n2196831391","loc":[-85.6185061,41.9463194],"version":"1","changeset":"15335510","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-12T03:10:40Z","tags":{}},"n2196831392":{"id":"n2196831392","loc":[-85.6184001,41.9463205],"version":"1","changeset":"15335510","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-12T03:10:40Z","tags":{}},"n2196831393":{"id":"n2196831393","loc":[-85.6182482,41.9464163],"version":"1","changeset":"15335510","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-12T03:10:40Z","tags":{}},"n2196831394":{"id":"n2196831394","loc":[-85.6182467,41.9463193],"version":"1","changeset":"15335510","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-12T03:10:40Z","tags":{}},"n2196831395":{"id":"n2196831395","loc":[-85.6180389,41.946321],"version":"1","changeset":"15335510","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-12T03:10:40Z","tags":{}},"n2196831397":{"id":"n2196831397","loc":[-85.6180404,41.946418],"version":"1","changeset":"15335510","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-12T03:10:40Z","tags":{}},"n185947303":{"id":"n185947303","loc":[-85.611074,41.943389],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T04:53:10Z","tags":{}},"n185947304":{"id":"n185947304","loc":[-85.611332,41.943267],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T04:53:10Z","tags":{}},"n185947305":{"id":"n185947305","loc":[-85.611635,41.943218],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T04:53:10Z","tags":{}},"n185947306":{"id":"n185947306","loc":[-85.612762,41.943311],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T04:53:10Z","tags":{}},"n185947308":{"id":"n185947308","loc":[-85.613027,41.943327],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T04:53:10Z","tags":{}},"n185947310":{"id":"n185947310","loc":[-85.615377,41.942996],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T04:53:10Z","tags":{}},"n185947312":{"id":"n185947312","loc":[-85.615701,41.943007],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T04:53:10Z","tags":{}},"n185947314":{"id":"n185947314","loc":[-85.61604,41.943067],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T04:53:10Z","tags":{}},"n185947315":{"id":"n185947315","loc":[-85.61626,41.943083],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T04:53:10Z","tags":{}},"n185947316":{"id":"n185947316","loc":[-85.616507,41.943048],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T04:53:10Z","tags":{}},"n185947319":{"id":"n185947319","loc":[-85.616702,41.94299],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T04:53:10Z","tags":{}},"n185947321":{"id":"n185947321","loc":[-85.617078,41.942918],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T04:53:11Z","tags":{}},"n185947322":{"id":"n185947322","loc":[-85.617366,41.942973],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T04:53:11Z","tags":{}},"n185947323":{"id":"n185947323","loc":[-85.617601,41.943033],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T04:53:11Z","tags":{}},"n185947325":{"id":"n185947325","loc":[-85.617799,41.943027],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T04:53:11Z","tags":{}},"n185947327":{"id":"n185947327","loc":[-85.618264,41.942961],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T04:53:11Z","tags":{}},"n185947328":{"id":"n185947328","loc":[-85.618508,41.942972],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T04:53:11Z","tags":{}},"n185947329":{"id":"n185947329","loc":[-85.618707,41.943076],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T04:53:11Z","tags":{}},"n185947361":{"id":"n185947361","loc":[-85.615356,41.944922],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T04:53:11Z","tags":{}},"n185947363":{"id":"n185947363","loc":[-85.61536,41.944893],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T04:53:11Z","tags":{}},"n185947365":{"id":"n185947365","loc":[-85.615406,41.944547],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T04:53:11Z","tags":{}},"n185947367":{"id":"n185947367","loc":[-85.61548,41.944351],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T04:53:11Z","tags":{}},"n185947369":{"id":"n185947369","loc":[-85.615805,41.94419],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T04:53:11Z","tags":{}},"n185947371":{"id":"n185947371","loc":[-85.616166,41.944156],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T04:53:11Z","tags":{}},"n185947373":{"id":"n185947373","loc":[-85.616411,41.944197],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T04:53:11Z","tags":{}},"n185947416":{"id":"n185947416","loc":[-85.616335,41.94343],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T04:53:13Z","tags":{}},"n185947417":{"id":"n185947417","loc":[-85.616069,41.943293],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T04:53:13Z","tags":{}},"n185947419":{"id":"n185947419","loc":[-85.615803,41.943249],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T04:53:13Z","tags":{}},"n185947420":{"id":"n185947420","loc":[-85.615524,41.943342],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T04:53:13Z","tags":{}},"n185947421":{"id":"n185947421","loc":[-85.615311,41.94353],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T04:53:13Z","tags":{}},"n185947422":{"id":"n185947422","loc":[-85.614338,41.943558],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T04:53:13Z","tags":{}},"n185947423":{"id":"n185947423","loc":[-85.61422,41.94369],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T04:53:13Z","tags":{}},"n185947425":{"id":"n185947425","loc":[-85.614221,41.944224],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T04:53:13Z","tags":{}},"n185947427":{"id":"n185947427","loc":[-85.614198,41.944888],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T04:53:13Z","tags":{}},"n185947429":{"id":"n185947429","loc":[-85.614221,41.945439],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T04:53:13Z","tags":{}},"n185947468":{"id":"n185947468","loc":[-85.615908,41.944756],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T04:53:14Z","tags":{}},"n185947470":{"id":"n185947470","loc":[-85.615871,41.944888],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T04:53:14Z","tags":{}},"n185947472":{"id":"n185947472","loc":[-85.615878,41.94507],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T04:53:14Z","tags":{}},"n185955153":{"id":"n185955153","loc":[-85.620087,41.947701],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T04:56:39Z","tags":{}},"n185960690":{"id":"n185960690","loc":[-85.620141,41.951901],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T04:59:21Z","tags":{}},"n185978817":{"id":"n185978817","loc":[-85.617193,41.954706],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:08:35Z","tags":{}},"n185985916":{"id":"n185985916","loc":[-85.620088,41.94758],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:12:42Z","tags":{}},"n185985918":{"id":"n185985918","loc":[-85.620133,41.951538],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:12:42Z","tags":{}},"n185985919":{"id":"n185985919","loc":[-85.62013,41.952104],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:12:42Z","tags":{}},"n185985920":{"id":"n185985920","loc":[-85.620104,41.952305],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:12:42Z","tags":{}},"n185985921":{"id":"n185985921","loc":[-85.620062,41.952499],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:12:42Z","tags":{}},"n185985922":{"id":"n185985922","loc":[-85.619993,41.952702],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:12:42Z","tags":{}},"n185985925":{"id":"n185985925","loc":[-85.619879,41.952986],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:12:42Z","tags":{}},"n185985927":{"id":"n185985927","loc":[-85.619689,41.95329],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:12:42Z","tags":{}},"n185985928":{"id":"n185985928","loc":[-85.619508,41.953521],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:12:42Z","tags":{}},"n185985929":{"id":"n185985929","loc":[-85.619286,41.953728],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:12:42Z","tags":{}},"n185985930":{"id":"n185985930","loc":[-85.618925,41.954007],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:12:42Z","tags":{}},"n185985931":{"id":"n185985931","loc":[-85.618638,41.954189],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:12:42Z","tags":{}},"n185985932":{"id":"n185985932","loc":[-85.61831,41.954358],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:12:42Z","tags":{}},"n185985934":{"id":"n185985934","loc":[-85.618015,41.954485],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:12:43Z","tags":{}},"n185985936":{"id":"n185985936","loc":[-85.617606,41.954611],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:12:43Z","tags":{}},"n1475283975":{"id":"n1475283975","loc":[-85.6150935,41.9434118],"version":"1","changeset":"9619138","user":"bbmiller","uid":"451048","visible":"true","timestamp":"2011-10-21T19:45:46Z","tags":{}},"n1475283979":{"id":"n1475283979","loc":[-85.6193367,41.9430252],"version":"1","changeset":"9619138","user":"bbmiller","uid":"451048","visible":"true","timestamp":"2011-10-21T19:45:46Z","tags":{}},"n1475283989":{"id":"n1475283989","loc":[-85.6104771,41.9455269],"version":"1","changeset":"9619138","user":"bbmiller","uid":"451048","visible":"true","timestamp":"2011-10-21T19:45:46Z","tags":{}},"n1475283990":{"id":"n1475283990","loc":[-85.6104771,41.9437179],"version":"1","changeset":"9619138","user":"bbmiller","uid":"451048","visible":"true","timestamp":"2011-10-21T19:45:46Z","tags":{}},"n1475283994":{"id":"n1475283994","loc":[-85.6198042,41.9429763],"version":"1","changeset":"9619138","user":"bbmiller","uid":"451048","visible":"true","timestamp":"2011-10-21T19:45:46Z","tags":{}},"n1475283998":{"id":"n1475283998","loc":[-85.6192101,41.9426716],"version":"1","changeset":"9619138","user":"bbmiller","uid":"451048","visible":"true","timestamp":"2011-10-21T19:45:46Z","tags":{}},"n1475284000":{"id":"n1475284000","loc":[-85.6198622,41.942836],"version":"1","changeset":"9619138","user":"bbmiller","uid":"451048","visible":"true","timestamp":"2011-10-21T19:45:46Z","tags":{}},"n1475284002":{"id":"n1475284002","loc":[-85.6163262,41.9427688],"version":"1","changeset":"9619138","user":"bbmiller","uid":"451048","visible":"true","timestamp":"2011-10-21T19:45:46Z","tags":{}},"n1475284006":{"id":"n1475284006","loc":[-85.6179527,41.9429168],"version":"1","changeset":"9619138","user":"bbmiller","uid":"451048","visible":"true","timestamp":"2011-10-21T19:45:47Z","tags":{}},"n1475284029":{"id":"n1475284029","loc":[-85.6197195,41.9427278],"version":"1","changeset":"9619138","user":"bbmiller","uid":"451048","visible":"true","timestamp":"2011-10-21T19:45:47Z","tags":{}},"n1475284038":{"id":"n1475284038","loc":[-85.6194405,41.9427837],"version":"1","changeset":"9619138","user":"bbmiller","uid":"451048","visible":"true","timestamp":"2011-10-21T19:45:47Z","tags":{}},"n1475284052":{"id":"n1475284052","loc":[-85.6153225,41.942841],"version":"1","changeset":"9619138","user":"bbmiller","uid":"451048","visible":"true","timestamp":"2011-10-21T19:45:48Z","tags":{}},"n1475284055":{"id":"n1475284055","loc":[-85.6129233,41.9437179],"version":"1","changeset":"9619138","user":"bbmiller","uid":"451048","visible":"true","timestamp":"2011-10-21T19:45:48Z","tags":{}},"n2139966627":{"id":"n2139966627","loc":[-85.61958,41.9427558],"version":"1","changeset":"14894526","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T11:32:18Z","tags":{}},"w17966773":{"id":"w17966773","version":"3","changeset":"2558583","user":"elliskev","uid":"163338","visible":"true","timestamp":"2009-09-21T16:12:43Z","tags":{"highway":"secondary","name":"E Michigan Ave","ref":"M 60","tiger:cfcc":"A41","tiger:county":"St. Joseph, MI","tiger:name_base":"Michigan","tiger:name_direction_prefix":"E","tiger:name_type":"Ave","tiger:reviewed":"no","tiger:separated":"no","tiger:source":"tiger_import_dch_v0.6_20070813","tiger:tlid":"15313712","tiger:upload_uuid":"bulk_upload.pl-b79f893a-0be1-4a5f-a183-6aea114c9af7","tiger:zip_left":"49093","tiger:zip_right":"49093"},"nodes":["n185980372","n185980398","n185980401","n185980403","n185980405","n185980407","n185980409","n185980411","n185980413","n185980415","n185980417","n185955019"]},"w17964043":{"id":"w17964043","version":"3","changeset":"14894526","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T11:32:19Z","tags":{"highway":"residential","tiger:cfcc":"A41","tiger:county":"St. Joseph, MI","tiger:reviewed":"no","tiger:separated":"no","tiger:source":"tiger_import_dch_v0.6_20070813","tiger:tlid":"15326065:15326068","tiger:upload_uuid":"bulk_upload.pl-b79f893a-0be1-4a5f-a183-6aea114c9af7"},"nodes":["n185955019","n185955022","n185955025","n185955028","n185954977","n185971477","n1475284050","n1475284000","n1475284029","n2139966627","n1475284038"]},"w17962834":{"id":"w17962834","version":"2","changeset":"9619138","user":"bbmiller","uid":"451048","visible":"true","timestamp":"2011-10-21T19:46:15Z","tags":{"highway":"service","tiger:cfcc":"A41","tiger:county":"St. Joseph, MI","tiger:reviewed":"no","tiger:separated":"no","tiger:source":"tiger_import_dch_v0.6_20070813","tiger:tlid":"15313719:15313728:15331618","tiger:upload_uuid":"bulk_upload.pl-b79f893a-0be1-4a5f-a183-6aea114c9af7"},"nodes":["n185947316","n185947414","n185947464","n185947466","n185947373","n185947468","n185947470","n185947472","n185947474"]},"w209470310":{"id":"w209470310","version":"1","changeset":"15335510","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-12T03:10:41Z","tags":{"area":"yes","building":"yes"},"nodes":["n2196831393","n2196831394","n2196831395","n2196831397","n2196831393"]},"w17963058":{"id":"w17963058","version":"2","changeset":"9619138","user":"bbmiller","uid":"451048","visible":"true","timestamp":"2011-10-21T19:46:05Z","tags":{"highway":"service","tiger:cfcc":"A41","tiger:county":"St. Joseph, MI","tiger:reviewed":"no","tiger:separated":"no","tiger:source":"tiger_import_dch_v0.6_20070813","tiger:tlid":"15326058:15326066:15326067","tiger:upload_uuid":"bulk_upload.pl-b79f893a-0be1-4a5f-a183-6aea114c9af7"},"nodes":["n185947333","n185948863","n185948865","n1475284007","n1475283982","n1475284040","n1475284044"]},"w17962823":{"id":"w17962823","version":"2","changeset":"9619138","user":"bbmiller","uid":"451048","visible":"true","timestamp":"2011-10-21T19:46:14Z","tags":{"highway":"service","tiger:cfcc":"A41","tiger:county":"St. Joseph, MI","tiger:reviewed":"no","tiger:separated":"no","tiger:source":"tiger_import_dch_v0.6_20070813","tiger:tlid":"15313714:15313704:15313720:15313721","tiger:upload_uuid":"bulk_upload.pl-b79f893a-0be1-4a5f-a183-6aea114c9af7"},"nodes":["n185947359","n185947361","n185947363","n185947365","n185947367","n185947369","n185947371","n185947373","n185947374","n185947375","n185947376","n185947377","n185947378"]},"w17962821":{"id":"w17962821","version":"2","changeset":"9619138","user":"bbmiller","uid":"451048","visible":"true","timestamp":"2011-10-21T19:46:15Z","tags":{"highway":"service","tiger:cfcc":"A41","tiger:county":"St. Joseph, MI","tiger:reviewed":"no","tiger:separated":"no","tiger:source":"tiger_import_dch_v0.6_20070813","tiger:tlid":"15313713:15313734:15313731:15313735:15313737:15313723","tiger:upload_uuid":"bulk_upload.pl-b79f893a-0be1-4a5f-a183-6aea114c9af7"},"nodes":["n185947303","n185947304","n185947305","n185947306","n185947308","n185947310","n185947312","n185947314","n185947315","n185947316","n185947319","n185947321","n185947322","n185947323","n185947325","n185947327","n185947328","n185947329","n185947331","n185947333","n185947336","n185947338","n185947339","n185947340","n185947343","n185947345","n185947347","n185947349"]},"w134150798":{"id":"w134150798","version":"1","changeset":"9619138","user":"bbmiller","uid":"451048","visible":"true","timestamp":"2011-10-21T19:45:52Z","tags":{"amenity":"grave_yard","ele":"249","gnis:county_id":"149","gnis:created":"04/14/1980","gnis:feature_id":"1624862","gnis:state_id":"26","name":"Riverside Cemetery"},"nodes":["n354002931","n1475283972","n1475284053","n1475283994","n1475283979","n1475283998","n1475284006","n1475284002","n1475284052","n1475283975","n1475284055","n1475283990","n1475283989","n354002931"]},"w17964040":{"id":"w17964040","version":"2","changeset":"9619138","user":"bbmiller","uid":"451048","visible":"true","timestamp":"2011-10-21T19:46:02Z","tags":{"highway":"service","tiger:cfcc":"A41","tiger:county":"St. Joseph, MI","tiger:reviewed":"no","tiger:separated":"no","tiger:source":"tiger_import_dch_v0.6_20070813","tiger:tlid":"15326063:15326064","tiger:upload_uuid":"bulk_upload.pl-b79f893a-0be1-4a5f-a183-6aea114c9af7"},"nodes":["n185947336","n185954965","n185954968","n185954970","n185954972","n185954974","n185954977"]},"w209470308":{"id":"w209470308","version":"1","changeset":"15335510","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-12T03:10:41Z","tags":{"area":"yes","building":"yes"},"nodes":["n2196831365","n2196831366","n2196831367","n2196831368","n2196831369","n2196831370","n2196831365"]},"w17962828":{"id":"w17962828","version":"2","changeset":"9619138","user":"bbmiller","uid":"451048","visible":"true","timestamp":"2011-10-21T19:46:14Z","tags":{"highway":"service","tiger:cfcc":"A41","tiger:county":"St. Joseph, MI","tiger:reviewed":"no","tiger:separated":"no","tiger:source":"tiger_import_dch_v0.6_20070813","tiger:tlid":"15313715:15313706:15328746:15313727:15313729","tiger:upload_uuid":"bulk_upload.pl-b79f893a-0be1-4a5f-a183-6aea114c9af7"},"nodes":["n185947340","n185947406","n185947409","n185947410","n185947411","n185947412","n185947414","n185947416","n185947417","n185947419","n185947420","n185947421","n185947422","n185947423","n185947425","n185947427","n185947429"]},"w209470309":{"id":"w209470309","version":"1","changeset":"15335510","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-12T03:10:41Z","tags":{"area":"yes","building":"yes"},"nodes":["n2196831371","n2196831372","n2196831373","n2196831374","n2196831375","n2196831376","n2196831377","n2196831378","n2196831379","n2196831380","n2196831381","n2196831382","n2196831383","n2196831384","n2196831385","n2196831386","n2196831387","n2196831388","n2196831389","n2196831390","n2196831391","n2196831392","n2196831371"]},"w17967415":{"id":"w17967415","version":"3","changeset":"2558583","user":"elliskev","uid":"163338","visible":"true","timestamp":"2009-09-21T16:12:41Z","tags":{"highway":"secondary","name":"Jefferson St","name_1":"State Highway 60","ref":"M 60","tiger:cfcc":"A31","tiger:county":"St. Joseph, MI","tiger:name_base":"Jefferson","tiger:name_base_1":"State Highway 60","tiger:name_type":"St","tiger:reviewed":"no","tiger:separated":"no","tiger:source":"tiger_import_dch_v0.6_20070813","tiger:tlid":"15313637:15313662:15313657:15328403","tiger:upload_uuid":"bulk_upload.pl-b79f893a-0be1-4a5f-a183-6aea114c9af7","tiger:zip_left":"49093"},"nodes":["n185955019","n185985910","n185985912","n185985914","n185961367","n185985916","n185955153","n185965105","n185974697","n185955120","n185985918","n185960690","n185985919","n185985920","n185985921","n185985922","n185985925","n185985927","n185985928","n185985929","n185985930","n185985931","n185985932","n185985934","n185985936","n185978817"]},"w17966772":{"id":"w17966772","version":"4","changeset":"9619138","user":"bbmiller","uid":"451048","visible":"true","timestamp":"2011-10-21T19:46:07Z","tags":{"highway":"unclassified","name":"E Michigan Ave","name_1":"State Highway 60","tiger:cfcc":"A31","tiger:county":"St. Joseph, MI","tiger:name_base":"Michigan","tiger:name_base_1":"State Highway 60","tiger:name_direction_prefix":"E","tiger:name_type":"Ave","tiger:reviewed":"no","tiger:separated":"no","tiger:source":"tiger_import_dch_v0.6_20070813","tiger:tlid":"15313710:15313711:15314052:15312385:15312378","tiger:upload_uuid":"bulk_upload.pl-b79f893a-0be1-4a5f-a183-6aea114c9af7","tiger:zip_left":"49093","tiger:zip_right":"49093"},"nodes":["n185954977","n185980371","n185980372"]},"n185958500":{"id":"n185958500","loc":[-85.621591,41.941075],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T04:58:27Z","tags":{}},"n185963110":{"id":"n185963110","loc":[-85.6204416,41.9408882],"version":"3","changeset":"15379124","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-15T23:38:37Z","tags":{}},"n2139966628":{"id":"n2139966628","loc":[-85.6196431,41.9426467],"version":"1","changeset":"14894526","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T11:32:18Z","tags":{"leisure":"fishing"}},"n2139966630":{"id":"n2139966630","loc":[-85.6199354,41.9429616],"version":"1","changeset":"14894526","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T11:32:18Z","tags":{}},"n2199127051":{"id":"n2199127051","loc":[-85.6170556,41.939696],"version":"1","changeset":"15347669","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T05:38:19Z","tags":{}},"n2199127052":{"id":"n2199127052","loc":[-85.6170536,41.9392909],"version":"1","changeset":"15347669","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T05:38:19Z","tags":{}},"n2199127053":{"id":"n2199127053","loc":[-85.6172067,41.9392905],"version":"1","changeset":"15347669","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T05:38:19Z","tags":{}},"n2199127054":{"id":"n2199127054","loc":[-85.6172061,41.9391853],"version":"1","changeset":"15347669","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T05:38:19Z","tags":{}},"n2199127055":{"id":"n2199127055","loc":[-85.6171481,41.9391854],"version":"1","changeset":"15347669","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T05:38:19Z","tags":{}},"n2199127060":{"id":"n2199127060","loc":[-85.6167389,41.9392896],"version":"1","changeset":"15347669","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T05:38:20Z","tags":{}},"n2199127061":{"id":"n2199127061","loc":[-85.6168728,41.9392892],"version":"1","changeset":"15347669","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T05:38:20Z","tags":{}},"n2199127062":{"id":"n2199127062","loc":[-85.6168747,41.9396965],"version":"1","changeset":"15347669","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T05:38:20Z","tags":{}},"n2199127071":{"id":"n2199127071","loc":[-85.620196,41.9399446],"version":"1","changeset":"15347669","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T05:38:20Z","tags":{}},"n2199127072":{"id":"n2199127072","loc":[-85.620193,41.9397316],"version":"1","changeset":"15347669","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T05:38:20Z","tags":{}},"n2199127073":{"id":"n2199127073","loc":[-85.6200381,41.9397328],"version":"1","changeset":"15347669","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T05:38:20Z","tags":{}},"n2199127074":{"id":"n2199127074","loc":[-85.6200412,41.9399458],"version":"1","changeset":"15347669","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T05:38:20Z","tags":{}},"n2199127075":{"id":"n2199127075","loc":[-85.6203606,41.9399939],"version":"1","changeset":"15347669","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T05:38:20Z","tags":{}},"n2199127076":{"id":"n2199127076","loc":[-85.6205527,41.9399922],"version":"1","changeset":"15347669","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T05:38:20Z","tags":{}},"n2199127077":{"id":"n2199127077","loc":[-85.6205482,41.9397115],"version":"1","changeset":"15347669","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T05:38:20Z","tags":{}},"n2199127078":{"id":"n2199127078","loc":[-85.6204132,41.9397124],"version":"1","changeset":"15347669","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T05:38:20Z","tags":{}},"n2199127079":{"id":"n2199127079","loc":[-85.6204144,41.9396341],"version":"1","changeset":"15347669","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T05:38:20Z","tags":{}},"n2199127080":{"id":"n2199127080","loc":[-85.6205699,41.9396324],"version":"1","changeset":"15347669","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T05:38:20Z","tags":{}},"n2199127081":{"id":"n2199127081","loc":[-85.6205722,41.939498],"version":"1","changeset":"15347669","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T05:38:20Z","tags":{}},"n2199127082":{"id":"n2199127082","loc":[-85.6204064,41.9394997],"version":"1","changeset":"15347669","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T05:38:20Z","tags":{}},"n2199127083":{"id":"n2199127083","loc":[-85.6204087,41.939561],"version":"1","changeset":"15347669","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T05:38:20Z","tags":{}},"n2199127084":{"id":"n2199127084","loc":[-85.6203103,41.9395618],"version":"1","changeset":"15347669","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T05:38:20Z","tags":{}},"n2199127085":{"id":"n2199127085","loc":[-85.620308,41.9396069],"version":"1","changeset":"15347669","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T05:38:20Z","tags":{}},"n2199127086":{"id":"n2199127086","loc":[-85.6200347,41.9396086],"version":"1","changeset":"15347669","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T05:38:20Z","tags":{}},"n2199127087":{"id":"n2199127087","loc":[-85.6200382,41.9397141],"version":"1","changeset":"15347669","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T05:38:20Z","tags":{}},"n2199127088":{"id":"n2199127088","loc":[-85.6202257,41.9397149],"version":"1","changeset":"15347669","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T05:38:20Z","tags":{}},"n2199127089":{"id":"n2199127089","loc":[-85.6202269,41.9399182],"version":"1","changeset":"15347669","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T05:38:20Z","tags":{}},"n2199127090":{"id":"n2199127090","loc":[-85.6203595,41.9399199],"version":"1","changeset":"15347669","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T05:38:20Z","tags":{}},"n2199127091":{"id":"n2199127091","loc":[-85.6212335,41.939688],"version":"1","changeset":"15347669","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T05:38:20Z","tags":{}},"n2199127092":{"id":"n2199127092","loc":[-85.6212328,41.939595],"version":"1","changeset":"15347669","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T05:38:20Z","tags":{}},"n2199127093":{"id":"n2199127093","loc":[-85.6208807,41.9395966],"version":"1","changeset":"15347669","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T05:38:20Z","tags":{}},"n2199127094":{"id":"n2199127094","loc":[-85.6208815,41.9396896],"version":"1","changeset":"15347669","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T05:38:20Z","tags":{}},"n2199127095":{"id":"n2199127095","loc":[-85.6208676,41.9396872],"version":"1","changeset":"15347669","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T05:38:20Z","tags":{}},"n2199127096":{"id":"n2199127096","loc":[-85.6208583,41.9393539],"version":"1","changeset":"15347669","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T05:38:20Z","tags":{}},"n2199127097":{"id":"n2199127097","loc":[-85.6207006,41.9393563],"version":"1","changeset":"15347669","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T05:38:20Z","tags":{}},"n2199127098":{"id":"n2199127098","loc":[-85.6207099,41.9396896],"version":"1","changeset":"15347669","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T05:38:20Z","tags":{}},"n185967054":{"id":"n185967054","loc":[-85.6173384,41.9356126],"version":"3","changeset":"15379027","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-15T23:24:18Z","tags":{}},"n185967063":{"id":"n185967063","loc":[-85.617371,41.936243],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:02:53Z","tags":{}},"n185967065":{"id":"n185967065","loc":[-85.617337,41.936299],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:02:53Z","tags":{}},"n185967068":{"id":"n185967068","loc":[-85.617321,41.936373],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:02:53Z","tags":{}},"n185967070":{"id":"n185967070","loc":[-85.6173562,41.9366969],"version":"3","changeset":"15379027","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-15T23:24:18Z","tags":{}},"n185967074":{"id":"n185967074","loc":[-85.6173635,41.9377414],"version":"3","changeset":"15379027","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-15T23:24:18Z","tags":{}},"n185967075":{"id":"n185967075","loc":[-85.6173696,41.9381886],"version":"3","changeset":"12805153","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-08-21T08:29:58Z","tags":{}},"n185967076":{"id":"n185967076","loc":[-85.617372,41.938535],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:02:54Z","tags":{}},"n2199127056":{"id":"n2199127056","loc":[-85.617147,41.9389616],"version":"1","changeset":"15347669","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T05:38:19Z","tags":{}},"n2199127057":{"id":"n2199127057","loc":[-85.6172136,41.9389614],"version":"1","changeset":"15347669","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T05:38:19Z","tags":{}},"n2199127058":{"id":"n2199127058","loc":[-85.6172123,41.9386909],"version":"1","changeset":"15347669","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T05:38:19Z","tags":{}},"n2199127059":{"id":"n2199127059","loc":[-85.616736,41.9386922],"version":"1","changeset":"15347669","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T05:38:19Z","tags":{}},"n2203921041":{"id":"n2203921041","loc":[-85.6173018,41.9346369],"version":"1","changeset":"15379027","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-15T23:24:18Z","tags":{}},"w203983952":{"id":"w203983952","version":"1","changeset":"14894526","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T11:32:18Z","tags":{"highway":"service"},"nodes":["n2139966627","n1819800319"]},"w209718301":{"id":"w209718301","version":"1","changeset":"15347669","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T05:38:21Z","tags":{"area":"yes","building":"yes"},"nodes":["n2199127051","n2199127052","n2199127053","n2199127054","n2199127055","n2199127056","n2199127057","n2199127058","n2199127059","n2199127060","n2199127061","n2199127062","n2199127051"]},"w209718304":{"id":"w209718304","version":"1","changeset":"15347669","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T05:38:21Z","tags":{"area":"yes","building":"yes"},"nodes":["n2199127071","n2199127072","n2199127073","n2199127074","n2199127071"]},"w17964961":{"id":"w17964961","version":"2","changeset":"15379124","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-15T23:38:37Z","tags":{"highway":"residential","name":"Whipple St","tiger:cfcc":"A41","tiger:county":"St. Joseph, MI","tiger:name_base":"Whipple","tiger:name_type":"St","tiger:reviewed":"no","tiger:zip_left":"49093"},"nodes":["n185963099","n185963110"]},"w17964489":{"id":"w17964489","version":"1","changeset":"402341","user":"DaveHansenTiger","uid":"7168","visible":"true","timestamp":"2007-12-23T20:29:56Z","tags":{"highway":"residential","name":"Jackson St","tiger:cfcc":"A41","tiger:county":"St. Joseph, MI","tiger:name_base":"Jackson","tiger:name_type":"St","tiger:reviewed":"no","tiger:separated":"no","tiger:source":"tiger_import_dch_v0.6_20070813","tiger:tlid":"15314430","tiger:upload_uuid":"bulk_upload.pl-b79f893a-0be1-4a5f-a183-6aea114c9af7"},"nodes":["n185958498","n185958500"]},"w203983953":{"id":"w203983953","version":"1","changeset":"14894526","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T11:32:18Z","tags":{"area":"yes","leisure":"park","name":"Marina Park","website":"http://www.threeriversmi.us/?page_id=53"},"nodes":["n1475283994","n1475283979","n1475283998","n2139966629","n2139966625","n1819800319","n2139966623","n2139966622","n2139966621","n2139966630","n1475283994"]},"w17965366":{"id":"w17965366","version":"2","changeset":"15379027","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-15T23:24:18Z","tags":{"highway":"residential","name":"14th St","tiger:cfcc":"A41","tiger:county":"St. Joseph, MI","tiger:name_base":"14th","tiger:name_type":"St","tiger:reviewed":"no","tiger:zip_left":"49093","tiger:zip_right":"49093"},"nodes":["n2203921041","n185967054","n185967063","n185967065","n185967068","n185967070","n185967074","n185967075","n185967076","n185967077"]},"w209718306":{"id":"w209718306","version":"1","changeset":"15347669","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T05:38:21Z","tags":{"area":"yes","building":"yes"},"nodes":["n2199127091","n2199127092","n2199127093","n2199127094","n2199127091"]},"w209718307":{"id":"w209718307","version":"1","changeset":"15347669","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T05:38:21Z","tags":{"area":"yes","building":"yes"},"nodes":["n2199127095","n2199127096","n2199127097","n2199127098","n2199127095"]},"w209718305":{"id":"w209718305","version":"1","changeset":"15347669","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T05:38:21Z","tags":{"area":"yes","building":"yes"},"nodes":["n2199127075","n2199127076","n2199127077","n2199127078","n2199127079","n2199127080","n2199127081","n2199127082","n2199127083","n2199127084","n2199127085","n2199127086","n2199127087","n2199127088","n2199127089","n2199127090","n2199127075"]},"n185960199":{"id":"n185960199","loc":[-85.62965,41.95469],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T04:59:08Z","tags":{}},"n185980737":{"id":"n185980737","loc":[-85.629083,41.953725],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:09:48Z","tags":{}},"n2114807561":{"id":"n2114807561","loc":[-85.6297681,41.9524688],"version":"1","changeset":"14676554","user":"bbmiller","uid":"451048","visible":"true","timestamp":"2013-01-16T20:05:15Z","tags":{}},"n2114807597":{"id":"n2114807597","loc":[-85.6296517,41.952563],"version":"1","changeset":"14676554","user":"bbmiller","uid":"451048","visible":"true","timestamp":"2013-01-16T20:05:15Z","tags":{}},"n185960197":{"id":"n185960197","loc":[-85.629676,41.9537314],"version":"3","changeset":"14676554","user":"bbmiller","uid":"451048","visible":"true","timestamp":"2013-01-16T20:05:17Z","tags":{}},"n185978791":{"id":"n185978791","loc":[-85.6244542,41.9547066],"version":"3","changeset":"14676554","user":"bbmiller","uid":"451048","visible":"true","timestamp":"2013-01-16T20:05:17Z","tags":{}},"w17967573":{"id":"w17967573","version":"2","changeset":"14676554","user":"bbmiller","uid":"451048","visible":"true","timestamp":"2013-01-16T20:05:20Z","tags":{"highway":"residential","name":"E Wheeler St","tiger:cfcc":"A41","tiger:county":"St. Joseph, MI","tiger:name_base":"Wheeler","tiger:name_direction_prefix":"E","tiger:name_type":"St","tiger:reviewed":"no"},"nodes":["n185960195","n2114807561","n185968102","n185967430","n185986157","n185978392"]},"w17966553":{"id":"w17966553","version":"5","changeset":"15473186","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-24T01:52:22Z","tags":{"highway":"residential","name":"East Hoffman Street","tiger:cfcc":"A41","tiger:county":"St. Joseph, MI","tiger:name_base":"Hoffman","tiger:name_direction_prefix":"E","tiger:name_type":"St","tiger:reviewed":"no","tiger:zip_left":"49093","tiger:zip_right":"49093"},"nodes":["n185971631","n185978784","n185967432","n185968106","n185960199","n185978787","n185978790","n185978791"]},"w17966787":{"id":"w17966787","version":"2","changeset":"15473186","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-24T01:52:23Z","tags":{"highway":"residential","name":"East Cushman Street","tiger:cfcc":"A41","tiger:county":"St. Joseph, MI","tiger:name_base":"Cushman","tiger:name_direction_prefix":"E","tiger:name_type":"St","tiger:reviewed":"no"},"nodes":["n185980735","n185980737","n185960197","n185968104","n185960792"]},"w17964723":{"id":"w17964723","version":"2","changeset":"15473186","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-24T01:52:22Z","tags":{"highway":"residential","name":"Cushman Street","tiger:cfcc":"A41","tiger:county":"St. Joseph, MI","tiger:name_base":"Cushman","tiger:name_type":"St","tiger:reviewed":"no"},"nodes":["n185960792","n185960794","n185960796"]},"w17964654":{"id":"w17964654","version":"3","changeset":"15473186","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-24T01:52:22Z","tags":{"highway":"residential","name":"Pine Street","tiger:cfcc":"A41","tiger:county":"St. Joseph, MI","tiger:name_base":"Pine","tiger:name_type":"St","tiger:reviewed":"no","tiger:zip_left":"49093","tiger:zip_right":"49093"},"nodes":["n185960195","n2114807597","n185960197","n185960199"]},"n1819848862":{"id":"n1819848862","loc":[-85.6346087,41.9545845],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:49Z","tags":{}},"n1819848935":{"id":"n1819848935","loc":[-85.6345948,41.9537717],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:51Z","tags":{}},"n1819848973":{"id":"n1819848973","loc":[-85.6334247,41.9537827],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:52Z","tags":{}},"n1819848997":{"id":"n1819848997","loc":[-85.6334386,41.9545956],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:53Z","tags":{}},"n2189015861":{"id":"n2189015861","loc":[-85.6375906,41.954836],"version":"1","changeset":"15276188","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T21:42:50Z","tags":{}},"n2189015865":{"id":"n2189015865","loc":[-85.6383307,41.9548291],"version":"1","changeset":"15276188","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T21:42:50Z","tags":{}},"n2189015867":{"id":"n2189015867","loc":[-85.6383337,41.9550072],"version":"1","changeset":"15276188","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T21:42:51Z","tags":{}},"n2189015868":{"id":"n2189015868","loc":[-85.6380986,41.9550094],"version":"1","changeset":"15276188","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T21:42:51Z","tags":{}},"n2189015869":{"id":"n2189015869","loc":[-85.6381005,41.9551226],"version":"1","changeset":"15276188","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T21:42:51Z","tags":{}},"n2199109808":{"id":"n2199109808","loc":[-85.6372702,41.9522894],"version":"1","changeset":"15347594","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T05:16:51Z","tags":{}},"n2199109810":{"id":"n2199109810","loc":[-85.6372677,41.9521583],"version":"1","changeset":"15347594","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T05:16:51Z","tags":{}},"n2199109812":{"id":"n2199109812","loc":[-85.6369505,41.9521617],"version":"1","changeset":"15347594","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T05:16:51Z","tags":{}},"n2199109814":{"id":"n2199109814","loc":[-85.636953,41.9522927],"version":"1","changeset":"15347594","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T05:16:51Z","tags":{}},"n185952156":{"id":"n185952156","loc":[-85.640983,41.9546557],"version":"3","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:48:03Z","tags":{}},"n185953423":{"id":"n185953423","loc":[-85.641871,41.954652],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T04:55:56Z","tags":{}},"n185971637":{"id":"n185971637","loc":[-85.641583,41.95465],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:05:06Z","tags":{}},"n185971639":{"id":"n185971639","loc":[-85.6421344,41.9546444],"version":"3","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:48:03Z","tags":{}},"n185971642":{"id":"n185971642","loc":[-85.6428264,41.9545612],"version":"3","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:48:03Z","tags":{}},"n185971648":{"id":"n185971648","loc":[-85.6436023,41.9544262],"version":"3","changeset":"9619138","user":"bbmiller","uid":"451048","visible":"true","timestamp":"2011-10-21T19:54:55Z","tags":{}},"n185975066":{"id":"n185975066","loc":[-85.640532,41.953638],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:06:49Z","tags":{}},"n185975067":{"id":"n185975067","loc":[-85.64079,41.953638],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:06:49Z","tags":{}},"n185982166":{"id":"n185982166","loc":[-85.6399012,41.9523817],"version":"3","changeset":"9619138","user":"bbmiller","uid":"451048","visible":"true","timestamp":"2011-10-21T19:54:55Z","tags":{}},"n2189015858":{"id":"n2189015858","loc":[-85.6376104,41.9560138],"version":"1","changeset":"15276188","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T21:42:50Z","tags":{}},"n2189015870":{"id":"n2189015870","loc":[-85.6386794,41.9551172],"version":"1","changeset":"15276188","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T21:42:51Z","tags":{}},"n2189015871":{"id":"n2189015871","loc":[-85.6386817,41.955256],"version":"1","changeset":"15276188","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T21:42:51Z","tags":{}},"n2189015873":{"id":"n2189015873","loc":[-85.6385437,41.9552573],"version":"1","changeset":"15276188","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T21:42:51Z","tags":{}},"n2189015876":{"id":"n2189015876","loc":[-85.638555,41.9559278],"version":"1","changeset":"15276188","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T21:42:51Z","tags":{}},"n2189015879":{"id":"n2189015879","loc":[-85.6384954,41.9559283],"version":"1","changeset":"15276188","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T21:42:51Z","tags":{}},"n2189015882":{"id":"n2189015882","loc":[-85.6384965,41.9559935],"version":"1","changeset":"15276188","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T21:42:51Z","tags":{}},"n2189015885":{"id":"n2189015885","loc":[-85.6383533,41.9559949],"version":"1","changeset":"15276188","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T21:42:51Z","tags":{}},"n2189015888":{"id":"n2189015888","loc":[-85.638351,41.9558607],"version":"1","changeset":"15276188","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T21:42:51Z","tags":{}},"n2189015891":{"id":"n2189015891","loc":[-85.6382178,41.9558619],"version":"1","changeset":"15276188","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T21:42:51Z","tags":{}},"n2189015894":{"id":"n2189015894","loc":[-85.6382203,41.956008],"version":"1","changeset":"15276188","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T21:42:51Z","tags":{}},"w208627223":{"id":"w208627223","version":"1","changeset":"15276188","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T21:42:53Z","tags":{"area":"yes","building":"yes"},"nodes":["n2189015858","n2189015861","n2189015865","n2189015867","n2189015868","n2189015869","n2189015870","n2189015871","n2189015873","n2189015876","n2189015879","n2189015882","n2189015885","n2189015888","n2189015891","n2189015894","n2189015858"]},"w170848328":{"id":"w170848328","version":"2","changeset":"14676554","user":"bbmiller","uid":"451048","visible":"true","timestamp":"2013-01-16T20:05:18Z","tags":{"ele":"250","gnis:county_id":"149","gnis:created":"04/14/1980","gnis:feature_id":"1624408","gnis:state_id":"26","leisure":"park","name":"Bowman Park","source":"Bing"},"nodes":["n1819848935","n1819848973","n1819848997","n1819848862","n1819848935"]},"w17965866":{"id":"w17965866","version":"3","changeset":"15473186","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-24T01:52:23Z","tags":{"highway":"residential","name":"West Hoffman Street","tiger:cfcc":"A41","tiger:county":"St. Joseph, MI","tiger:name_base":"Hoffman","tiger:name_direction_prefix":"W","tiger:name_type":"St","tiger:reviewed":"no"},"nodes":["n185971631","n185971632","n185964359","n185965025","n1475293264","n185952156","n185971637","n185953423","n185971639","n185971642","n185971648"]},"w209717051":{"id":"w209717051","version":"1","changeset":"15347594","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T05:16:53Z","tags":{"amenity":"place_of_worship","area":"yes","building":"yes","denomination":"baptist","ele":"251","gnis:county_id":"149","gnis:created":"04/30/2008","gnis:feature_id":"2417886","gnis:state_id":"26","name":"Calvary Missionary Baptist Church","religion":"christian"},"nodes":["n2199109808","n2199109810","n2199109812","n2199109814","n2199109808"]},"w17966172":{"id":"w17966172","version":"3","changeset":"15473186","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-24T01:52:23Z","tags":{"highway":"residential","name":"West Cushman Street","tiger:cfcc":"A41","tiger:county":"St. Joseph, MI","tiger:name_base":"Cushman","tiger:name_direction_prefix":"W","tiger:name_type":"St","tiger:reviewed":"no"},"nodes":["n185960796","n185975064","n185964358","n185965023","n1475293222","n185975066","n185975067"]},"w17966975":{"id":"w17966975","version":"2","changeset":"9619138","user":"bbmiller","uid":"451048","visible":"true","timestamp":"2011-10-21T19:55:06Z","tags":{"highway":"residential","name":"W Wheeler St","tiger:cfcc":"A41","tiger:county":"St. Joseph, MI","tiger:name_base":"Wheeler","tiger:name_direction_prefix":"W","tiger:name_type":"St","tiger:reviewed":"no","tiger:separated":"no","tiger:source":"tiger_import_dch_v0.6_20070813","tiger:tlid":"15312250:15312254","tiger:upload_uuid":"bulk_upload.pl-b79f893a-0be1-4a5f-a183-6aea114c9af7"},"nodes":["n185978392","n185982163","n185964357","n185965021","n1475293261","n185982166"]},"n185960684":{"id":"n185960684","loc":[-85.622687,41.951885],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T04:59:21Z","tags":{}},"n185960686":{"id":"n185960686","loc":[-85.622492,41.951901],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T04:59:21Z","tags":{}},"n185978795":{"id":"n185978795","loc":[-85.6240991,41.954708],"version":"3","changeset":"14676554","user":"bbmiller","uid":"451048","visible":"true","timestamp":"2013-01-16T20:05:17Z","tags":{}},"n185978803":{"id":"n185978803","loc":[-85.623348,41.954547],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:08:34Z","tags":{}},"n185978806":{"id":"n185978806","loc":[-85.623123,41.954502],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:08:34Z","tags":{}},"n185978808":{"id":"n185978808","loc":[-85.622923,41.954469],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:08:34Z","tags":{}},"n185978810":{"id":"n185978810","loc":[-85.622787,41.954457],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:08:35Z","tags":{}},"n185978811":{"id":"n185978811","loc":[-85.622612,41.954458],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:08:35Z","tags":{}},"n185978813":{"id":"n185978813","loc":[-85.622368,41.954472],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:08:35Z","tags":{}},"n1819790545":{"id":"n1819790545","loc":[-85.6240295,41.9548949],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:58:53Z","tags":{}},"n1819790621":{"id":"n1819790621","loc":[-85.6235789,41.954855],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:58:55Z","tags":{}},"n1819790664":{"id":"n1819790664","loc":[-85.6238363,41.9549507],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:58:56Z","tags":{}},"n1819790683":{"id":"n1819790683","loc":[-85.6224727,41.9545921],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:58:57Z","tags":{}},"n1819790730":{"id":"n1819790730","loc":[-85.6227527,41.9545795],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:58:58Z","tags":{}},"n1819790740":{"id":"n1819790740","loc":[-85.6240402,41.9550784],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:58:58Z","tags":{}},"n1819790831":{"id":"n1819790831","loc":[-85.624126,41.9549986],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:59:00Z","tags":{}},"n1819790861":{"id":"n1819790861","loc":[-85.6231712,41.9546872],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:59:01Z","tags":{}},"n1819790887":{"id":"n1819790887","loc":[-85.6242762,41.955206],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:59:01Z","tags":{}},"n2168544739":{"id":"n2168544739","loc":[-85.6249102,41.952801],"version":"1","changeset":"15132216","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-23T08:37:01Z","tags":{}},"n2168544740":{"id":"n2168544740","loc":[-85.6251859,41.9527564],"version":"1","changeset":"15132216","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-23T08:37:01Z","tags":{}},"n2168544741":{"id":"n2168544741","loc":[-85.6255515,41.9527921],"version":"1","changeset":"15132216","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-23T08:37:01Z","tags":{}},"n2168544742":{"id":"n2168544742","loc":[-85.626001,41.9529481],"version":"1","changeset":"15132216","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-23T08:37:01Z","tags":{}},"n2168544743":{"id":"n2168544743","loc":[-85.6265284,41.9529838],"version":"1","changeset":"15132216","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-23T08:37:01Z","tags":{}},"n2168544744":{"id":"n2168544744","loc":[-85.626942,41.9528857],"version":"1","changeset":"15132216","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-23T08:37:01Z","tags":{}},"n2168544745":{"id":"n2168544745","loc":[-85.6270918,41.9526851],"version":"1","changeset":"15132216","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-23T08:37:01Z","tags":{}},"n2168544746":{"id":"n2168544746","loc":[-85.6272117,41.95244],"version":"1","changeset":"15132216","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-23T08:37:01Z","tags":{}},"n2168544747":{"id":"n2168544747","loc":[-85.6271578,41.952226],"version":"1","changeset":"15132216","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-23T08:37:01Z","tags":{}},"n2168544748":{"id":"n2168544748","loc":[-85.6270019,41.9519719],"version":"1","changeset":"15132216","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-23T08:37:01Z","tags":{}},"n2168544749":{"id":"n2168544749","loc":[-85.6268221,41.9518382],"version":"1","changeset":"15132216","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-23T08:37:01Z","tags":{}},"n2168544750":{"id":"n2168544750","loc":[-85.6265284,41.951807],"version":"1","changeset":"15132216","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-23T08:37:01Z","tags":{}},"n2168544751":{"id":"n2168544751","loc":[-85.6256534,41.9518516],"version":"1","changeset":"15132216","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-23T08:37:01Z","tags":{}},"n2168544752":{"id":"n2168544752","loc":[-85.6253477,41.9518338],"version":"1","changeset":"15132216","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-23T08:37:01Z","tags":{}},"n2168544753":{"id":"n2168544753","loc":[-85.6251139,41.9517669],"version":"1","changeset":"15132216","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-23T08:37:01Z","tags":{}},"n185955747":{"id":"n185955747","loc":[-85.620674,41.954709],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T04:56:55Z","tags":{}},"n185960688":{"id":"n185960688","loc":[-85.621032,41.951913],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T04:59:21Z","tags":{}},"n185972054":{"id":"n185972054","loc":[-85.6186728,41.9547335],"version":"3","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:59:04Z","tags":{}},"n185978814":{"id":"n185978814","loc":[-85.6201708,41.9547403],"version":"3","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:59:05Z","tags":{}},"n1819790532":{"id":"n1819790532","loc":[-85.6244908,41.9555731],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:58:53Z","tags":{}},"n1819790536":{"id":"n1819790536","loc":[-85.6217925,41.9583135],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:58:53Z","tags":{}},"n1819790538":{"id":"n1819790538","loc":[-85.6233954,41.9600014],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:58:53Z","tags":{}},"n1819790539":{"id":"n1819790539","loc":[-85.6204611,41.9562117],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:58:53Z","tags":{}},"n1819790546":{"id":"n1819790546","loc":[-85.6210898,41.9567657],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:58:53Z","tags":{}},"n1819790548":{"id":"n1819790548","loc":[-85.6202465,41.9562237],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:58:53Z","tags":{}},"n1819790550":{"id":"n1819790550","loc":[-85.6250165,41.9560677],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:58:53Z","tags":{}},"n1819790551":{"id":"n1819790551","loc":[-85.6227946,41.9597023],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:58:53Z","tags":{}},"n1819790553":{"id":"n1819790553","loc":[-85.6215726,41.9584571],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:58:53Z","tags":{}},"n1819790556":{"id":"n1819790556","loc":[-85.6196306,41.9573002],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:58:53Z","tags":{}},"n1819790557":{"id":"n1819790557","loc":[-85.6209503,41.9563109],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:58:53Z","tags":{}},"n1819790558":{"id":"n1819790558","loc":[-85.6196939,41.9574085],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:58:54Z","tags":{}},"n1819790561":{"id":"n1819790561","loc":[-85.621079,41.957751],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:58:54Z","tags":{}},"n1819790562":{"id":"n1819790562","loc":[-85.6224255,41.9611417],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:58:54Z","tags":{}},"n1819790565":{"id":"n1819790565","loc":[-85.6232506,41.9604841],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:58:54Z","tags":{}},"n1819790566":{"id":"n1819790566","loc":[-85.6190835,41.9562909],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:58:54Z","tags":{}},"n1819790567":{"id":"n1819790567","loc":[-85.622227,41.9593028],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:58:54Z","tags":{}},"n1819790569":{"id":"n1819790569","loc":[-85.620976,41.9591039],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:58:54Z","tags":{}},"n1819790571":{"id":"n1819790571","loc":[-85.6212078,41.9565303],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:58:54Z","tags":{}},"n1819790572":{"id":"n1819790572","loc":[-85.6235306,41.9595102],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:58:54Z","tags":{}},"n1819790581":{"id":"n1819790581","loc":[-85.6235563,41.9579351],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:58:54Z","tags":{}},"n1819790584":{"id":"n1819790584","loc":[-85.6230371,41.9574598],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:58:54Z","tags":{}},"n1819790586":{"id":"n1819790586","loc":[-85.6211748,41.9564272],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:58:54Z","tags":{}},"n1819790588":{"id":"n1819790588","loc":[-85.6226508,41.9601086],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:58:54Z","tags":{}},"n1819790591":{"id":"n1819790591","loc":[-85.6218032,41.9607468],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:58:54Z","tags":{}},"n1819790593":{"id":"n1819790593","loc":[-85.6207915,41.9618735],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:58:54Z","tags":{}},"n1819790596":{"id":"n1819790596","loc":[-85.6252955,41.9567858],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:58:54Z","tags":{}},"n1819790598":{"id":"n1819790598","loc":[-85.6196618,41.9568939],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:58:54Z","tags":{}},"n1819790600":{"id":"n1819790600","loc":[-85.6224416,41.9587084],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:58:54Z","tags":{}},"n1819790602":{"id":"n1819790602","loc":[-85.6217442,41.9558641],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:58:54Z","tags":{}},"n1819790603":{"id":"n1819790603","loc":[-85.6213355,41.9592116],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:58:54Z","tags":{}},"n1819790604":{"id":"n1819790604","loc":[-85.622801,41.9573042],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:58:54Z","tags":{}},"n1819790608":{"id":"n1819790608","loc":[-85.6199729,41.9574325],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:58:55Z","tags":{}},"n1819790610":{"id":"n1819790610","loc":[-85.6195555,41.9557165],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:58:55Z","tags":{}},"n1819790611":{"id":"n1819790611","loc":[-85.622978,41.9586007],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:58:55Z","tags":{}},"n1819790613":{"id":"n1819790613","loc":[-85.6253963,41.9562636],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:58:55Z","tags":{}},"n1819790614":{"id":"n1819790614","loc":[-85.6235252,41.9580342],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:58:55Z","tags":{}},"n1819790616":{"id":"n1819790616","loc":[-85.6232988,41.9596305],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:58:55Z","tags":{}},"n1819790617":{"id":"n1819790617","loc":[-85.6226776,41.9598732],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:58:55Z","tags":{}},"n1819790619":{"id":"n1819790619","loc":[-85.625553,41.9561794],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:58:55Z","tags":{}},"n1819790620":{"id":"n1819790620","loc":[-85.6235574,41.959231],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:58:55Z","tags":{}},"n1819790624":{"id":"n1819790624","loc":[-85.6228429,41.9573726],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:58:55Z","tags":{}},"n1819790626":{"id":"n1819790626","loc":[-85.6193785,41.9556766],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:58:55Z","tags":{}},"n1819790628":{"id":"n1819790628","loc":[-85.620092,41.9554253],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:58:55Z","tags":{}},"n1819790630":{"id":"n1819790630","loc":[-85.6226658,41.9604402],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:58:55Z","tags":{}},"n1819790638":{"id":"n1819790638","loc":[-85.6219964,41.9602561],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:58:55Z","tags":{}},"n1819790640":{"id":"n1819790640","loc":[-85.6232731,41.9599969],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:58:56Z","tags":{}},"n1819790643":{"id":"n1819790643","loc":[-85.6247698,41.9568895],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:58:56Z","tags":{}},"n1819790650":{"id":"n1819790650","loc":[-85.6216412,41.9550149],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:58:56Z","tags":{}},"n1819790652":{"id":"n1819790652","loc":[-85.6224952,41.9603918],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:58:56Z","tags":{}},"n1819790656":{"id":"n1819790656","loc":[-85.61918,41.9555649],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:58:56Z","tags":{}},"n1819790661":{"id":"n1819790661","loc":[-85.6200169,41.955505],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:58:56Z","tags":{}},"n1819790662":{"id":"n1819790662","loc":[-85.6217389,41.9563149],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:58:56Z","tags":{}},"n1819790666":{"id":"n1819790666","loc":[-85.6229566,41.9598373],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:58:56Z","tags":{}},"n1819790667":{"id":"n1819790667","loc":[-85.6209117,41.9609189],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:58:56Z","tags":{}},"n1819790669":{"id":"n1819790669","loc":[-85.6252311,41.9562353],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:58:56Z","tags":{}},"n1819790670":{"id":"n1819790670","loc":[-85.6209758,41.961868],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:58:56Z","tags":{}},"n1819790672":{"id":"n1819790672","loc":[-85.6209557,41.9589078],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:58:56Z","tags":{}},"n1819790673":{"id":"n1819790673","loc":[-85.6190352,41.9561393],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:58:56Z","tags":{}},"n1819790675":{"id":"n1819790675","loc":[-85.6236432,41.9586685],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:58:56Z","tags":{}},"n1819790676":{"id":"n1819790676","loc":[-85.6194901,41.9565389],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:58:56Z","tags":{}},"n1819790678":{"id":"n1819790678","loc":[-85.6219266,41.9582417],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:58:56Z","tags":{}},"n1819790680":{"id":"n1819790680","loc":[-85.6208258,41.9557211],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:58:57Z","tags":{}},"n1819790681":{"id":"n1819790681","loc":[-85.6212024,41.9613212],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:58:57Z","tags":{}},"n1819790682":{"id":"n1819790682","loc":[-85.624877,41.9559401],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:58:57Z","tags":{}},"n1819790684":{"id":"n1819790684","loc":[-85.6206499,41.9583693],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:58:57Z","tags":{}},"n1819790699":{"id":"n1819790699","loc":[-85.6215243,41.956279],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:58:57Z","tags":{}},"n1819790701":{"id":"n1819790701","loc":[-85.6246625,41.9559321],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:58:57Z","tags":{}},"n1819790703":{"id":"n1819790703","loc":[-85.6230478,41.9585089],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:58:57Z","tags":{}},"n1819790708":{"id":"n1819790708","loc":[-85.6211102,41.9575402],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:58:57Z","tags":{}},"n1819790710":{"id":"n1819790710","loc":[-85.6215082,41.9548468],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:58:57Z","tags":{}},"n1819790711":{"id":"n1819790711","loc":[-85.6206552,41.9586007],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:58:57Z","tags":{}},"n1819790713":{"id":"n1819790713","loc":[-85.6215404,41.9549705],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:58:57Z","tags":{}},"n1819790715":{"id":"n1819790715","loc":[-85.6216906,41.955521],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:58:57Z","tags":{}},"n1819790717":{"id":"n1819790717","loc":[-85.6215404,41.9547391],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:58:57Z","tags":{}},"n1819790722":{"id":"n1819790722","loc":[-85.6219964,41.9599131],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:58:57Z","tags":{}},"n1819790723":{"id":"n1819790723","loc":[-85.622286,41.9606989],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:58:57Z","tags":{}},"n1819790725":{"id":"n1819790725","loc":[-85.6228439,41.9572005],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:58:57Z","tags":{}},"n1819790727":{"id":"n1819790727","loc":[-85.6202518,41.9554458],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:58:58Z","tags":{}},"n1819790728":{"id":"n1819790728","loc":[-85.623434,41.9575276],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:58:58Z","tags":{}},"n1819790729":{"id":"n1819790729","loc":[-85.6234287,41.9568576],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:58:58Z","tags":{}},"n1819790732":{"id":"n1819790732","loc":[-85.6229566,41.9571369],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:58:58Z","tags":{}},"n1819790733":{"id":"n1819790733","loc":[-85.6225543,41.9590275],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:58:58Z","tags":{}},"n1819790734":{"id":"n1819790734","loc":[-85.6232892,41.9583135],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:58:58Z","tags":{}},"n1819790736":{"id":"n1819790736","loc":[-85.622977,41.9608551],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:58:58Z","tags":{}},"n1819790737":{"id":"n1819790737","loc":[-85.624008,41.9569533],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:58:58Z","tags":{}},"n1819790741":{"id":"n1819790741","loc":[-85.6212775,41.9608545],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:58:58Z","tags":{}},"n1819790742":{"id":"n1819790742","loc":[-85.6231282,41.9569932],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:58:58Z","tags":{}},"n1819790743":{"id":"n1819790743","loc":[-85.6224523,41.9591831],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:58:58Z","tags":{}},"n1819790744":{"id":"n1819790744","loc":[-85.6210951,41.9610819],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:58:58Z","tags":{}},"n1819790745":{"id":"n1819790745","loc":[-85.6220114,41.960544],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:58:58Z","tags":{}},"n1819790755":{"id":"n1819790755","loc":[-85.6216369,41.9553854],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:58:58Z","tags":{}},"n1819790757":{"id":"n1819790757","loc":[-85.6209986,41.9592709],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:58:58Z","tags":{}},"n1819790758":{"id":"n1819790758","loc":[-85.6200437,41.9563468],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:58:58Z","tags":{}},"n1819790764":{"id":"n1819790764","loc":[-85.6219363,41.9596823],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:58:59Z","tags":{}},"n1819790765":{"id":"n1819790765","loc":[-85.6237612,41.9568496],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:58:59Z","tags":{}},"n1819790769":{"id":"n1819790769","loc":[-85.6212389,41.9593433],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:58:59Z","tags":{}},"n1819790771":{"id":"n1819790771","loc":[-85.6210726,41.9560123],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:58:59Z","tags":{}},"n1819790772":{"id":"n1819790772","loc":[-85.6212711,41.9561838],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:58:59Z","tags":{}},"n1819790776":{"id":"n1819790776","loc":[-85.6234437,41.9577795],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:58:59Z","tags":{}},"n1819790777":{"id":"n1819790777","loc":[-85.6212502,41.9618599],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:58:59Z","tags":{}},"n1819790783":{"id":"n1819790783","loc":[-85.6216895,41.9610585],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:58:59Z","tags":{}},"n1819790784":{"id":"n1819790784","loc":[-85.6200115,41.9556367],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:58:59Z","tags":{}},"n1819790785":{"id":"n1819790785","loc":[-85.6210576,41.9573002],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:58:59Z","tags":{}},"n1819790786":{"id":"n1819790786","loc":[-85.621138,41.9576632],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:58:59Z","tags":{}},"n1819790788":{"id":"n1819790788","loc":[-85.6207733,41.9578946],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:58:59Z","tags":{}},"n1819790789":{"id":"n1819790789","loc":[-85.6200705,41.9571566],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:58:59Z","tags":{}},"n1819790790":{"id":"n1819790790","loc":[-85.6245337,41.9558443],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:58:59Z","tags":{}},"n1819790792":{"id":"n1819790792","loc":[-85.621932,41.9608066],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:58:59Z","tags":{}},"n1819790793":{"id":"n1819790793","loc":[-85.6233578,41.9581385],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:58:59Z","tags":{}},"n1819790794":{"id":"n1819790794","loc":[-85.6204557,41.9555136],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:58:59Z","tags":{}},"n1819790797":{"id":"n1819790797","loc":[-85.6235038,41.9576074],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:58:59Z","tags":{}},"n1819790800":{"id":"n1819790800","loc":[-85.6214438,41.9607508],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:58:59Z","tags":{}},"n1819790801":{"id":"n1819790801","loc":[-85.623492,41.9602129],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:59:00Z","tags":{}},"n1819790802":{"id":"n1819790802","loc":[-85.6216691,41.9546553],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:59:00Z","tags":{}},"n1819790803":{"id":"n1819790803","loc":[-85.6231057,41.9586851],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:59:00Z","tags":{}},"n1819790804":{"id":"n1819790804","loc":[-85.6209224,41.9578673],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:59:00Z","tags":{}},"n1819790813":{"id":"n1819790813","loc":[-85.620092,41.9572962],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:59:00Z","tags":{}},"n1819790814":{"id":"n1819790814","loc":[-85.6216691,41.9552218],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:59:00Z","tags":{}},"n1819790816":{"id":"n1819790816","loc":[-85.6216144,41.9609668],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:59:00Z","tags":{}},"n1819790818":{"id":"n1819790818","loc":[-85.6216906,41.9557324],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:59:00Z","tags":{}},"n1819790820":{"id":"n1819790820","loc":[-85.6192069,41.9564186],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:59:00Z","tags":{}},"n1819790823":{"id":"n1819790823","loc":[-85.6211155,41.9566027],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:59:00Z","tags":{}},"n1819790825":{"id":"n1819790825","loc":[-85.6233106,41.9569294],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:59:00Z","tags":{}},"n1819790839":{"id":"n1819790839","loc":[-85.625671,41.9564986],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:59:00Z","tags":{}},"n1819790842":{"id":"n1819790842","loc":[-85.6235252,41.9567379],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:59:00Z","tags":{}},"n1819790844":{"id":"n1819790844","loc":[-85.6253813,41.9566342],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:59:00Z","tags":{}},"n1819790847":{"id":"n1819790847","loc":[-85.6200963,41.9567702],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:59:00Z","tags":{}},"n1819790849":{"id":"n1819790849","loc":[-85.6238031,41.9587449],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:59:00Z","tags":{}},"n1819790851":{"id":"n1819790851","loc":[-85.6234984,41.9584571],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:59:00Z","tags":{}},"n1819790856":{"id":"n1819790856","loc":[-85.6242226,41.9570092],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:59:00Z","tags":{}},"n1819790865":{"id":"n1819790865","loc":[-85.6200265,41.9569458],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:59:01Z","tags":{}},"n1819790869":{"id":"n1819790869","loc":[-85.6230049,41.9601245],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:59:01Z","tags":{}},"n1819790871":{"id":"n1819790871","loc":[-85.6190727,41.9558322],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:59:01Z","tags":{}},"n1819790873":{"id":"n1819790873","loc":[-85.6217442,41.9550104],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:59:01Z","tags":{}},"n1819790875":{"id":"n1819790875","loc":[-85.6208044,41.9587808],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:59:01Z","tags":{}},"n1819790879":{"id":"n1819790879","loc":[-85.6198444,41.9574484],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:59:01Z","tags":{}},"n1819790883":{"id":"n1819790883","loc":[-85.623713,41.9588719],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:59:01Z","tags":{}},"n1819790885":{"id":"n1819790885","loc":[-85.6223289,41.9605075],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:59:01Z","tags":{}},"n1819790889":{"id":"n1819790889","loc":[-85.6208044,41.9562437],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:59:01Z","tags":{}},"n1819790893":{"id":"n1819790893","loc":[-85.6218183,41.9559684],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:59:01Z","tags":{}},"n1819790906":{"id":"n1819790906","loc":[-85.6214052,41.958697],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:59:01Z","tags":{}},"n1819790913":{"id":"n1819790913","loc":[-85.6209981,41.9609957],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:59:01Z","tags":{}},"n1819790917":{"id":"n1819790917","loc":[-85.6216208,41.9604436],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:59:01Z","tags":{}},"n1819790919":{"id":"n1819790919","loc":[-85.6209406,41.9616373],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:59:01Z","tags":{}},"n1819790920":{"id":"n1819790920","loc":[-85.6221948,41.9583334],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:59:01Z","tags":{}},"n1819790922":{"id":"n1819790922","loc":[-85.6216681,41.9615292],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:59:01Z","tags":{}},"n1819790924":{"id":"n1819790924","loc":[-85.6210147,41.9570489],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:59:02Z","tags":{}},"n1819790929":{"id":"n1819790929","loc":[-85.6193678,41.955521],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:59:02Z","tags":{}},"w17964707":{"id":"w17964707","version":"1","changeset":"402341","user":"DaveHansenTiger","uid":"7168","visible":"true","timestamp":"2007-12-23T20:31:34Z","tags":{"highway":"residential","name":"11th Ave","tiger:cfcc":"A41","tiger:county":"St. Joseph, MI","tiger:name_base":"11th","tiger:name_type":"Ave","tiger:reviewed":"no","tiger:separated":"no","tiger:source":"tiger_import_dch_v0.6_20070813","tiger:tlid":"15314405","tiger:upload_uuid":"bulk_upload.pl-b79f893a-0be1-4a5f-a183-6aea114c9af7","tiger:zip_left":"49093","tiger:zip_right":"49093"},"nodes":["n185960682","n185960684","n185960686","n185960688","n185960690"]},"w201484345":{"id":"w201484345","version":"1","changeset":"14676554","user":"bbmiller","uid":"451048","visible":"true","timestamp":"2013-01-16T20:05:16Z","tags":{"bridge":"yes","highway":"residential","name":"E Hoffman St","tiger:cfcc":"A41","tiger:county":"St. Joseph, MI","tiger:name_base":"Hoffman","tiger:name_direction_prefix":"E","tiger:name_type":"St","tiger:reviewed":"no","tiger:zip_left":"49093","tiger:zip_right":"49093"},"nodes":["n185978791","n185978795"]},"w201484348":{"id":"w201484348","version":"1","changeset":"14676554","user":"bbmiller","uid":"451048","visible":"true","timestamp":"2013-01-16T20:05:16Z","tags":{"highway":"residential","name":"E Hoffman St","tiger:cfcc":"A41","tiger:county":"St. Joseph, MI","tiger:name_base":"Hoffman","tiger:name_direction_prefix":"E","tiger:name_type":"St","tiger:reviewed":"no","tiger:zip_left":"49093","tiger:zip_right":"49093"},"nodes":["n185978795","n185978800","n185978803","n185978806","n185978808","n185978810","n185978811","n185978813","n185955747","n185978814","n185972054","n185978817"]},"w170843845":{"id":"w170843845","version":"3","changeset":"14676554","user":"bbmiller","uid":"451048","visible":"true","timestamp":"2013-01-16T20:05:23Z","tags":{"ele":"244","gnis:county_id":"149","gnis:created":"04/14/1980","gnis:feature_id":"1624607","gnis:state_id":"26","landuse":"reservoir","name":"Hoffman Pond","natural":"water","source":"Bing"},"nodes":["n1819790732","n1819790742","n1819790825","n1819790729","n1819790842","n1819790765","n1819790737","n1819790856","n1819790643","n1819790596","n1819790844","n1819790839","n1819849190","n1819790619","n1819790613","n1819790669","n1819790550","n1819790682","n1819790701","n1819790790","n1819790532","n1819790887","n1819790740","n1819790831","n1819790545","n1819790664","n1819790621","n1819790861","n1819790730","n1819790683","n1819790802","n1819790717","n1819790710","n1819790713","n1819790650","n1819790873","n1819790814","n1819790755","n1819790715","n1819790818","n1819790602","n1819790893","n1819790662","n1819790699","n1819790772","n1819790771","n1819790680","n1819790794","n1819790727","n1819790628","n1819790661","n1819790784","n1819790610","n1819790626","n1819790929","n1819790656","n1819790871","n1819790673","n1819790566","n1819790820","n1819790676","n1819790598","n1819790556","n1819790558","n1819790879","n1819790608","n1819790813","n1819790789","n1819790865","n1819790847","n1819790758","n1819790548","n1819790539","n1819790889","n1819790557","n1819790586","n1819790571","n1819790823","n1819790546","n1819790924","n1819790785","n1819790708","n1819790786","n1819790561","n1819790804","n1819790788","n1819790684","n1819790711","n1819790875","n1819790672","n1819790569","n1819790757","n1819790769","n1819790603","n1819790906","n1819790553","n1819790536","n1819790678","n1819790920","n1819790600","n1819790733","n1819790743","n1819790567","n1819790764","n1819790722","n1819790638","n1819790917","n1819790800","n1819790741","n1819790667","n1819790913","n1819790744","n1819790816","n1819790591","n1819790745","n1819790885","n1819790652","n1819790588","n1819790617","n1819790551","n1819790666","n1819790869","n1819790630","n1819790723","n1819790792","n1819790783","n1819790681","n1819790919","n1819790593","n1819790670","n1819790777","n1819790922","n1819790562","n1819790736","n1819790565","n1819790801","n1819790538","n1819790640","n1819790616","n1819790572","n1819790620","n1819790883","n1819790849","n1819790675","n1819790851","n1819790803","n1819790611","n1819790703","n1819790734","n1819790793","n1819790614","n1819790581","n1819790776","n1819790797","n1819790728","n1819790584","n1819790624","n1819790604","n1819790725","n1819790732"]},"w206805240":{"id":"w206805240","version":"2","changeset":"15306846","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-09T19:50:50Z","tags":{"waterway":"river"},"nodes":["n2168544738","n2168544739","n2168544740","n2168544741","n2168544742","n2168544743","n2168544744","n2168544745","n2168544746","n2168544747","n2168544748","n2168544749","n2168544750","n2168544751","n2168544752","n2168544753","n1819848944"]},"n394490429":{"id":"n394490429","loc":[-85.643883,41.954365],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:29Z","tags":{}},"n185953421":{"id":"n185953421","loc":[-85.641876,41.954946],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T04:55:56Z","tags":{}},"n185953417":{"id":"n185953417","loc":[-85.6418306,41.9551597],"version":"3","changeset":"15276188","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T21:42:55Z","tags":{}},"n185977233":{"id":"n185977233","loc":[-85.642987,41.95486],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:07:49Z","tags":{}},"n185977232":{"id":"n185977232","loc":[-85.642894,41.9547842],"version":"3","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:48:03Z","tags":{}},"n1475293244":{"id":"n1475293244","loc":[-85.63974,41.9521543],"version":"1","changeset":"9619138","user":"bbmiller","uid":"451048","visible":"true","timestamp":"2011-10-21T19:54:51Z","tags":{}},"n1819848890":{"id":"n1819848890","loc":[-85.6410004,41.9552822],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:50Z","tags":{}},"n1819848965":{"id":"n1819848965","loc":[-85.6409795,41.9553892],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:52Z","tags":{}},"n2189015846":{"id":"n2189015846","loc":[-85.6420457,41.9549528],"version":"1","changeset":"15276188","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T21:42:50Z","tags":{}},"n2189015849":{"id":"n2189015849","loc":[-85.6425867,41.9551392],"version":"1","changeset":"15276188","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T21:42:50Z","tags":{}},"n2189015852":{"id":"n2189015852","loc":[-85.6426877,41.9549771],"version":"1","changeset":"15276188","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T21:42:50Z","tags":{}},"n2199109816":{"id":"n2199109816","loc":[-85.6399215,41.9540925],"version":"1","changeset":"15347594","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T05:16:51Z","tags":{}},"n2199109818":{"id":"n2199109818","loc":[-85.6399182,41.9538236],"version":"1","changeset":"15347594","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T05:16:51Z","tags":{}},"n2199109820":{"id":"n2199109820","loc":[-85.6402201,41.9538216],"version":"1","changeset":"15347594","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T05:16:51Z","tags":{}},"n2199109822":{"id":"n2199109822","loc":[-85.640222,41.9539771],"version":"1","changeset":"15347594","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T05:16:51Z","tags":{}},"n2199109825":{"id":"n2199109825","loc":[-85.6402904,41.9539766],"version":"1","changeset":"15347594","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T05:16:51Z","tags":{}},"n2199109827":{"id":"n2199109827","loc":[-85.6402918,41.95409],"version":"1","changeset":"15347594","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T05:16:51Z","tags":{}},"n2199109829":{"id":"n2199109829","loc":[-85.6395845,41.9544626],"version":"1","changeset":"15347594","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T05:16:51Z","tags":{}},"n2199109831":{"id":"n2199109831","loc":[-85.6395792,41.9540671],"version":"1","changeset":"15347594","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T05:16:51Z","tags":{}},"n2199109833":{"id":"n2199109833","loc":[-85.6397173,41.9540661],"version":"1","changeset":"15347594","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T05:16:51Z","tags":{}},"n2199109835":{"id":"n2199109835","loc":[-85.6397226,41.9544616],"version":"1","changeset":"15347594","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T05:16:51Z","tags":{}},"n2199109837":{"id":"n2199109837","loc":[-85.6399641,41.9545058],"version":"1","changeset":"15347594","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T05:16:51Z","tags":{}},"n2199109839":{"id":"n2199109839","loc":[-85.6399637,41.9541859],"version":"1","changeset":"15347594","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T05:16:51Z","tags":{}},"n2199109841":{"id":"n2199109841","loc":[-85.6401098,41.9541858],"version":"1","changeset":"15347594","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T05:16:51Z","tags":{}},"n2199109843":{"id":"n2199109843","loc":[-85.64011,41.9543272],"version":"1","changeset":"15347594","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T05:16:51Z","tags":{}},"n2199109845":{"id":"n2199109845","loc":[-85.6400783,41.9543273],"version":"1","changeset":"15347594","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T05:16:51Z","tags":{}},"n2199109847":{"id":"n2199109847","loc":[-85.6400785,41.9545058],"version":"1","changeset":"15347594","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T05:16:51Z","tags":{}},"n2199109853":{"id":"n2199109853","loc":[-85.6396184,41.9554049],"version":"1","changeset":"15347594","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T05:16:52Z","tags":{}},"n2199109855":{"id":"n2199109855","loc":[-85.6396825,41.9553713],"version":"1","changeset":"15347594","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T05:16:52Z","tags":{}},"n185949745":{"id":"n185949745","loc":[-85.6442727,41.9553112],"version":"3","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:48:03Z","tags":{}},"n185949748":{"id":"n185949748","loc":[-85.6448804,41.9555238],"version":"3","changeset":"15276188","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T21:42:55Z","tags":{}},"n185949755":{"id":"n185949755","loc":[-85.6420011,41.9603536],"version":"3","changeset":"15276188","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T21:42:54Z","tags":{}},"n185949763":{"id":"n185949763","loc":[-85.6408843,41.9555822],"version":"3","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:48:03Z","tags":{}},"n185949765":{"id":"n185949765","loc":[-85.6414548,41.9557751],"version":"3","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:48:03Z","tags":{}},"n185952158":{"id":"n185952158","loc":[-85.640066,41.956854],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T04:55:10Z","tags":{}},"n185952160":{"id":"n185952160","loc":[-85.639848,41.957229],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T04:55:10Z","tags":{}},"n185952161":{"id":"n185952161","loc":[-85.6396089,41.9576192],"version":"3","changeset":"15276188","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T21:42:55Z","tags":{}},"n185952163":{"id":"n185952163","loc":[-85.63892,41.957957],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T04:55:10Z","tags":{}},"n185953413":{"id":"n185953413","loc":[-85.64162,41.955475],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T04:55:56Z","tags":{}},"n185971651":{"id":"n185971651","loc":[-85.6440766,41.9543462],"version":"3","changeset":"9619138","user":"bbmiller","uid":"451048","visible":"true","timestamp":"2011-10-21T19:54:55Z","tags":{}},"n185977234":{"id":"n185977234","loc":[-85.645044,41.955581],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:07:49Z","tags":{}},"n394490395":{"id":"n394490395","loc":[-85.657336,41.936762],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:28Z","tags":{}},"n394490396":{"id":"n394490396","loc":[-85.653896,41.936978],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:28Z","tags":{}},"n394490397":{"id":"n394490397","loc":[-85.653732,41.937386],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:28Z","tags":{}},"n394490398":{"id":"n394490398","loc":[-85.65182,41.937378],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:28Z","tags":{}},"n394490399":{"id":"n394490399","loc":[-85.651843,41.938445],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:28Z","tags":{}},"n394490400":{"id":"n394490400","loc":[-85.652536,41.938447],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:28Z","tags":{}},"n394490401":{"id":"n394490401","loc":[-85.652533,41.938901],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:28Z","tags":{}},"n394490402":{"id":"n394490402","loc":[-85.652084,41.9389],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:28Z","tags":{}},"n394490403":{"id":"n394490403","loc":[-85.6521,41.939627],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:28Z","tags":{}},"n394490404":{"id":"n394490404","loc":[-85.652301,41.939628],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:28Z","tags":{}},"n394490405":{"id":"n394490405","loc":[-85.652302,41.939755],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:28Z","tags":{}},"n394490406":{"id":"n394490406","loc":[-85.652783,41.939747],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:28Z","tags":{}},"n394490407":{"id":"n394490407","loc":[-85.652835,41.94112],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:28Z","tags":{}},"n394490408":{"id":"n394490408","loc":[-85.651968,41.941123],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:28Z","tags":{}},"n394490409":{"id":"n394490409","loc":[-85.651983,41.941969],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:28Z","tags":{}},"n394490410":{"id":"n394490410","loc":[-85.652908,41.941961],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:28Z","tags":{}},"n394490411":{"id":"n394490411","loc":[-85.65292,41.94278],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:28Z","tags":{}},"n394490412":{"id":"n394490412","loc":[-85.651698,41.942816],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:28Z","tags":{}},"n394490413":{"id":"n394490413","loc":[-85.651509,41.942823],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:28Z","tags":{}},"n394490414":{"id":"n394490414","loc":[-85.651272,41.942837],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:28Z","tags":{}},"n394490415":{"id":"n394490415","loc":[-85.651272,41.943325],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:28Z","tags":{}},"n394490416":{"id":"n394490416","loc":[-85.65122,41.944053],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:28Z","tags":{}},"n394490417":{"id":"n394490417","loc":[-85.651193,41.944449],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:28Z","tags":{}},"n394490418":{"id":"n394490418","loc":[-85.651088,41.944969],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:28Z","tags":{}},"n394490419":{"id":"n394490419","loc":[-85.650949,41.945554],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:28Z","tags":{}},"n394490420":{"id":"n394490420","loc":[-85.650907,41.945719],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:28Z","tags":{}},"n394490421":{"id":"n394490421","loc":[-85.650808,41.946016],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:29Z","tags":{}},"n394490422":{"id":"n394490422","loc":[-85.650712,41.946516],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:29Z","tags":{}},"n394490423":{"id":"n394490423","loc":[-85.650493,41.947166],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:29Z","tags":{}},"n394490424":{"id":"n394490424","loc":[-85.650626,41.947213],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:29Z","tags":{}},"n394490425":{"id":"n394490425","loc":[-85.650201,41.948109],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:29Z","tags":{}},"n394490426":{"id":"n394490426","loc":[-85.649868,41.948797],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:29Z","tags":{}},"n394490427":{"id":"n394490427","loc":[-85.649669,41.949161],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:29Z","tags":{}},"n394490428":{"id":"n394490428","loc":[-85.64659,41.954067],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:29Z","tags":{}},"n394490430":{"id":"n394490430","loc":[-85.644034,41.95444],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:29Z","tags":{}},"n394490431":{"id":"n394490431","loc":[-85.644248,41.954507],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:29Z","tags":{}},"n394490432":{"id":"n394490432","loc":[-85.64491,41.954481],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:29Z","tags":{}},"n394490433":{"id":"n394490433","loc":[-85.645213,41.954433],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:29Z","tags":{}},"n394490434":{"id":"n394490434","loc":[-85.645426,41.954477],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:29Z","tags":{}},"n394490435":{"id":"n394490435","loc":[-85.6458,41.954704],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:29Z","tags":{}},"n394490436":{"id":"n394490436","loc":[-85.64605,41.954804],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:29Z","tags":{}},"n394490437":{"id":"n394490437","loc":[-85.646125,41.954817],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:30Z","tags":{}},"n394490438":{"id":"n394490438","loc":[-85.646002,41.954997],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:30Z","tags":{}},"n394490439":{"id":"n394490439","loc":[-85.645764,41.955366],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:30Z","tags":{}},"n394490440":{"id":"n394490440","loc":[-85.645525,41.955734],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:30Z","tags":{}},"n394490441":{"id":"n394490441","loc":[-85.64443,41.957424],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:30Z","tags":{}},"n394490442":{"id":"n394490442","loc":[-85.641712,41.961723],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:30Z","tags":{}},"n394490443":{"id":"n394490443","loc":[-85.640747,41.963246],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:30Z","tags":{}},"n394490444":{"id":"n394490444","loc":[-85.637803,41.967894],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:30Z","tags":{}},"n394490445":{"id":"n394490445","loc":[-85.637673,41.967861],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:30Z","tags":{}},"n394490446":{"id":"n394490446","loc":[-85.636637,41.969275],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:30Z","tags":{}},"n394490447":{"id":"n394490447","loc":[-85.634923,41.969269],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:30Z","tags":{}},"n394490448":{"id":"n394490448","loc":[-85.634893,41.968537],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:30Z","tags":{}},"n394490449":{"id":"n394490449","loc":[-85.634544,41.96927],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:30Z","tags":{}},"n394490450":{"id":"n394490450","loc":[-85.630835,41.969274],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:30Z","tags":{}},"n394490451":{"id":"n394490451","loc":[-85.630834,41.968348],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:30Z","tags":{}},"n394490452":{"id":"n394490452","loc":[-85.630857,41.968179],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:30Z","tags":{}},"n394490453":{"id":"n394490453","loc":[-85.630924,41.968044],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:30Z","tags":{}},"n394490454":{"id":"n394490454","loc":[-85.631004,41.967925],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:30Z","tags":{}},"n394490455":{"id":"n394490455","loc":[-85.631143,41.967811],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:30Z","tags":{}},"n394490456":{"id":"n394490456","loc":[-85.631311,41.967736],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:30Z","tags":{}},"n394490457":{"id":"n394490457","loc":[-85.631595,41.967693],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:30Z","tags":{}},"n394490458":{"id":"n394490458","loc":[-85.63325,41.967702],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:30Z","tags":{}},"n394490459":{"id":"n394490459","loc":[-85.633247,41.967021],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:30Z","tags":{}},"n394490460":{"id":"n394490460","loc":[-85.634858,41.967021],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:30Z","tags":{}},"n394490461":{"id":"n394490461","loc":[-85.634865,41.967711],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:30Z","tags":{}},"n394490462":{"id":"n394490462","loc":[-85.634884,41.968231],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:30Z","tags":{}},"n394490463":{"id":"n394490463","loc":[-85.636559,41.963867],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:30Z","tags":{}},"n394490464":{"id":"n394490464","loc":[-85.634832,41.963866],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:30Z","tags":{}},"n394490465":{"id":"n394490465","loc":[-85.63481,41.961899],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:30Z","tags":{}},"n394490466":{"id":"n394490466","loc":[-85.637219,41.961842],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:30Z","tags":{}},"n394490467":{"id":"n394490467","loc":[-85.637837,41.960019],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:30Z","tags":{}},"n394490468":{"id":"n394490468","loc":[-85.637459,41.960022],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:30Z","tags":{}},"n394490469":{"id":"n394490469","loc":[-85.635295,41.959987],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:30Z","tags":{}},"n394490470":{"id":"n394490470","loc":[-85.634783,41.959979],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:30Z","tags":{}},"n394490471":{"id":"n394490471","loc":[-85.634776,41.959834],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:30Z","tags":{}},"n394490472":{"id":"n394490472","loc":[-85.634767,41.959009],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:30Z","tags":{}},"n394490473":{"id":"n394490473","loc":[-85.634763,41.958292],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:30Z","tags":{}},"n394490474":{"id":"n394490474","loc":[-85.633346,41.958287],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:30Z","tags":{}},"n394490475":{"id":"n394490475","loc":[-85.632128,41.9583],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:30Z","tags":{}},"n394490476":{"id":"n394490476","loc":[-85.631414,41.958318],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:31Z","tags":{}},"n394490477":{"id":"n394490477","loc":[-85.63137,41.959033],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:31Z","tags":{}},"n394490478":{"id":"n394490478","loc":[-85.631325,41.959753],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:31Z","tags":{}},"n394490479":{"id":"n394490479","loc":[-85.631494,41.95977],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:31Z","tags":{}},"n394490480":{"id":"n394490480","loc":[-85.631456,41.960673],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:31Z","tags":{}},"n394490481":{"id":"n394490481","loc":[-85.631421,41.961494],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:31Z","tags":{}},"n394490482":{"id":"n394490482","loc":[-85.631404,41.961887],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:31Z","tags":{}},"n394490483":{"id":"n394490483","loc":[-85.631401,41.961968],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:31Z","tags":{}},"n394490484":{"id":"n394490484","loc":[-85.630962,41.961967],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:31Z","tags":{}},"n394490485":{"id":"n394490485","loc":[-85.6299,41.961973],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:31Z","tags":{}},"n394490486":{"id":"n394490486","loc":[-85.624929,41.962002],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:31Z","tags":{}},"n394490487":{"id":"n394490487","loc":[-85.623333,41.961987],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:31Z","tags":{}},"n394490488":{"id":"n394490488","loc":[-85.621894,41.963956],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:31Z","tags":{}},"n394490489":{"id":"n394490489","loc":[-85.62131,41.963727],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:31Z","tags":{}},"n394490490":{"id":"n394490490","loc":[-85.621216,41.963868],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:31Z","tags":{}},"n394490491":{"id":"n394490491","loc":[-85.620356,41.965119],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:31Z","tags":{}},"n394490492":{"id":"n394490492","loc":[-85.620848,41.965341],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:31Z","tags":{}},"n394490493":{"id":"n394490493","loc":[-85.620684,41.965558],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:31Z","tags":{}},"n394490494":{"id":"n394490494","loc":[-85.620621,41.965658],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:31Z","tags":{}},"n394490495":{"id":"n394490495","loc":[-85.618165,41.965759],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:31Z","tags":{}},"n394490496":{"id":"n394490496","loc":[-85.618071,41.965759],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:31Z","tags":{}},"n394490497":{"id":"n394490497","loc":[-85.617986,41.965759],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:31Z","tags":{}},"n394490498":{"id":"n394490498","loc":[-85.605673,41.965764],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:31Z","tags":{}},"n394490499":{"id":"n394490499","loc":[-85.605668,41.963548],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:31Z","tags":{}},"n394490500":{"id":"n394490500","loc":[-85.605664,41.962094],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:31Z","tags":{}},"n394490501":{"id":"n394490501","loc":[-85.595828,41.962159],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:31Z","tags":{}},"n394490502":{"id":"n394490502","loc":[-85.587869,41.962169],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:31Z","tags":{}},"n394490503":{"id":"n394490503","loc":[-85.586289,41.962179],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:31Z","tags":{}},"n394490504":{"id":"n394490504","loc":[-85.583774,41.962178],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:31Z","tags":{}},"n394490505":{"id":"n394490505","loc":[-85.583774,41.961789],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:31Z","tags":{}},"n394490506":{"id":"n394490506","loc":[-85.581303,41.961783],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:31Z","tags":{}},"n394490507":{"id":"n394490507","loc":[-85.581304,41.961616],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:31Z","tags":{}},"n394490508":{"id":"n394490508","loc":[-85.581292,41.961616],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:31Z","tags":{}},"n394490509":{"id":"n394490509","loc":[-85.581247,41.959244],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:31Z","tags":{}},"n394490510":{"id":"n394490510","loc":[-85.581245,41.958394],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:31Z","tags":{}},"n394490511":{"id":"n394490511","loc":[-85.581276,41.958372],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:31Z","tags":{}},"n394490512":{"id":"n394490512","loc":[-85.581302,41.958353],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:32Z","tags":{}},"n394490513":{"id":"n394490513","loc":[-85.581376,41.9583],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:32Z","tags":{}},"n394490514":{"id":"n394490514","loc":[-85.582256,41.957663],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:32Z","tags":{}},"n394490515":{"id":"n394490515","loc":[-85.585299,41.955483],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:32Z","tags":{}},"n394490516":{"id":"n394490516","loc":[-85.585588,41.955331],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:32Z","tags":{}},"n394490517":{"id":"n394490517","loc":[-85.586053,41.955163],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:32Z","tags":{}},"n394490518":{"id":"n394490518","loc":[-85.58632,41.955076],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:32Z","tags":{}},"n394490519":{"id":"n394490519","loc":[-85.586478,41.955025],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:32Z","tags":{}},"n394490520":{"id":"n394490520","loc":[-85.58692,41.954947],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:32Z","tags":{}},"n394490521":{"id":"n394490521","loc":[-85.587327,41.954914],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:32Z","tags":{}},"n394490522":{"id":"n394490522","loc":[-85.587345,41.954913],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:32Z","tags":{}},"n394490523":{"id":"n394490523","loc":[-85.587358,41.954913],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:32Z","tags":{}},"n394490524":{"id":"n394490524","loc":[-85.58963,41.954877],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:32Z","tags":{}},"n394490525":{"id":"n394490525","loc":[-85.591077,41.954865],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:32Z","tags":{}},"n394490526":{"id":"n394490526","loc":[-85.594824,41.954843],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:32Z","tags":{}},"n394490527":{"id":"n394490527","loc":[-85.594804,41.95331],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:32Z","tags":{}},"n394490528":{"id":"n394490528","loc":[-85.599336,41.95331],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:32Z","tags":{}},"n394490529":{"id":"n394490529","loc":[-85.599336,41.954825],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:32Z","tags":{}},"n394490530":{"id":"n394490530","loc":[-85.597828,41.954839],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:32Z","tags":{}},"n394490531":{"id":"n394490531","loc":[-85.597833,41.95614],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:32Z","tags":{}},"n394490532":{"id":"n394490532","loc":[-85.596586,41.956151],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:32Z","tags":{}},"n394490533":{"id":"n394490533","loc":[-85.596586,41.956394],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:32Z","tags":{}},"n394490534":{"id":"n394490534","loc":[-85.595933,41.956394],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:32Z","tags":{}},"n394490535":{"id":"n394490535","loc":[-85.595933,41.958176],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:32Z","tags":{}},"n394490536":{"id":"n394490536","loc":[-85.597635,41.958179],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:32Z","tags":{}},"n394490537":{"id":"n394490537","loc":[-85.597717,41.958177],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:32Z","tags":{}},"n394490538":{"id":"n394490538","loc":[-85.601671,41.958194],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:32Z","tags":{}},"n394490539":{"id":"n394490539","loc":[-85.605619,41.958194],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:32Z","tags":{}},"n394490540":{"id":"n394490540","loc":[-85.608054,41.958187],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:32Z","tags":{}},"n394490542":{"id":"n394490542","loc":[-85.6080762,41.9547864],"version":"2","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:47:47Z","tags":{}},"n394490545":{"id":"n394490545","loc":[-85.6104354,41.9548263],"version":"2","changeset":"12747630","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-08-16T08:22:38Z","tags":{}},"n394490546":{"id":"n394490546","loc":[-85.610274,41.951106],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:33Z","tags":{}},"n394490547":{"id":"n394490547","loc":[-85.610278,41.950829],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:33Z","tags":{}},"n394490548":{"id":"n394490548","loc":[-85.610309,41.948377],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:33Z","tags":{}},"n394490549":{"id":"n394490549","loc":[-85.610314,41.947986],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:33Z","tags":{}},"n394490550":{"id":"n394490550","loc":[-85.610464,41.947985],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:33Z","tags":{}},"n394490551":{"id":"n394490551","loc":[-85.610447,41.947468],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:33Z","tags":{}},"n394490552":{"id":"n394490552","loc":[-85.612469,41.947471],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:33Z","tags":{}},"n394490553":{"id":"n394490553","loc":[-85.612494,41.945576],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:33Z","tags":{}},"n394490554":{"id":"n394490554","loc":[-85.610292,41.94558],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:33Z","tags":{}},"n394490555":{"id":"n394490555","loc":[-85.608412,41.945625],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:33Z","tags":{}},"n394490556":{"id":"n394490556","loc":[-85.608412,41.943036],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:33Z","tags":{}},"n394490557":{"id":"n394490557","loc":[-85.608702,41.943087],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:33Z","tags":{}},"n394490558":{"id":"n394490558","loc":[-85.609196,41.943224],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:33Z","tags":{}},"n394490559":{"id":"n394490559","loc":[-85.609571,41.943263],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:33Z","tags":{}},"n394490560":{"id":"n394490560","loc":[-85.610116,41.943295],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:33Z","tags":{}},"n394490561":{"id":"n394490561","loc":[-85.610273,41.943275],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:33Z","tags":{}},"n394490562":{"id":"n394490562","loc":[-85.611339,41.943075],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:33Z","tags":{}},"n394490563":{"id":"n394490563","loc":[-85.611575,41.942997],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:33Z","tags":{}},"n394490564":{"id":"n394490564","loc":[-85.611847,41.942849],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:33Z","tags":{}},"n394490565":{"id":"n394490565","loc":[-85.612164,41.942568],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:33Z","tags":{}},"n394490566":{"id":"n394490566","loc":[-85.612341,41.942529],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:33Z","tags":{}},"n394490567":{"id":"n394490567","loc":[-85.612562,41.942524],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:33Z","tags":{}},"n394490568":{"id":"n394490568","loc":[-85.612768,41.942546],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:33Z","tags":{}},"n394490569":{"id":"n394490569","loc":[-85.612938,41.942633],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:33Z","tags":{}},"n394490570":{"id":"n394490570","loc":[-85.6131,41.942782],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:33Z","tags":{}},"n394490571":{"id":"n394490571","loc":[-85.613299,41.942919],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:33Z","tags":{}},"n394490572":{"id":"n394490572","loc":[-85.613498,41.942996],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:33Z","tags":{}},"n394490573":{"id":"n394490573","loc":[-85.614698,41.942842],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:33Z","tags":{}},"n394490574":{"id":"n394490574","loc":[-85.615288,41.942698],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:33Z","tags":{}},"n394490575":{"id":"n394490575","loc":[-85.616054,41.942693],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:33Z","tags":{}},"n394490576":{"id":"n394490576","loc":[-85.61603,41.942175],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:33Z","tags":{}},"n394490577":{"id":"n394490577","loc":[-85.616004,41.941741],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:33Z","tags":{}},"n394490578":{"id":"n394490578","loc":[-85.615994,41.940156],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:33Z","tags":{}},"n394490579":{"id":"n394490579","loc":[-85.615144,41.940159],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:34Z","tags":{}},"n394490580":{"id":"n394490580","loc":[-85.614915,41.940161],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:34Z","tags":{}},"n394490582":{"id":"n394490582","loc":[-85.614875,41.938532],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:34Z","tags":{}},"n394490583":{"id":"n394490583","loc":[-85.616167,41.938787],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:34Z","tags":{}},"n394490585":{"id":"n394490585","loc":[-85.616176,41.938589],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:34Z","tags":{}},"n394490586":{"id":"n394490586","loc":[-85.614537,41.938282],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:34Z","tags":{}},"n394490588":{"id":"n394490588","loc":[-85.610141,41.937459],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:34Z","tags":{}},"n394490589":{"id":"n394490589","loc":[-85.610172,41.937298],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:34Z","tags":{}},"n394490590":{"id":"n394490590","loc":[-85.609918,41.935495],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:34Z","tags":{}},"n394490592":{"id":"n394490592","loc":[-85.610092,41.935451],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:34Z","tags":{}},"n394490594":{"id":"n394490594","loc":[-85.610681,41.935247],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:34Z","tags":{}},"n394490595":{"id":"n394490595","loc":[-85.611446,41.934955],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:34Z","tags":{}},"n394490596":{"id":"n394490596","loc":[-85.612057,41.934696],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:34Z","tags":{}},"n394490598":{"id":"n394490598","loc":[-85.613256,41.934084],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:34Z","tags":{}},"n394490599":{"id":"n394490599","loc":[-85.613948,41.933682],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:34Z","tags":{}},"n394490601":{"id":"n394490601","loc":[-85.61436,41.933417],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:34Z","tags":{}},"n394490602":{"id":"n394490602","loc":[-85.614638,41.933212],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:34Z","tags":{}},"n394490604":{"id":"n394490604","loc":[-85.615249,41.9332],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:34Z","tags":{}},"n394490605":{"id":"n394490605","loc":[-85.618218,41.933223],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:34Z","tags":{}},"n394490607":{"id":"n394490607","loc":[-85.618241,41.933479],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:34Z","tags":{}},"n394490608":{"id":"n394490608","loc":[-85.618257,41.93365],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:34Z","tags":{}},"n394490609":{"id":"n394490609","loc":[-85.618298,41.935067],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:34Z","tags":{}},"n394490611":{"id":"n394490611","loc":[-85.619791,41.935067],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:34Z","tags":{}},"n394490612":{"id":"n394490612","loc":[-85.619794,41.933301],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:34Z","tags":{}},"n394490613":{"id":"n394490613","loc":[-85.619795,41.932692],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:34Z","tags":{}},"n394490614":{"id":"n394490614","loc":[-85.619729,41.929517],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:34Z","tags":{}},"n394490615":{"id":"n394490615","loc":[-85.619801,41.929305],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:34Z","tags":{}},"n394490616":{"id":"n394490616","loc":[-85.619809,41.927391],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:34Z","tags":{}},"n394490617":{"id":"n394490617","loc":[-85.620883,41.927378],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:34Z","tags":{}},"n394490618":{"id":"n394490618","loc":[-85.620988,41.927368],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:34Z","tags":{}},"n394490619":{"id":"n394490619","loc":[-85.621076,41.927368],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:34Z","tags":{}},"n394490620":{"id":"n394490620","loc":[-85.621156,41.927376],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:34Z","tags":{}},"n394490621":{"id":"n394490621","loc":[-85.621685,41.92737],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:34Z","tags":{}},"n394490622":{"id":"n394490622","loc":[-85.624716,41.927359],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:34Z","tags":{}},"n394490623":{"id":"n394490623","loc":[-85.625308,41.92737],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:34Z","tags":{}},"n394490624":{"id":"n394490624","loc":[-85.625655,41.927377],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:35Z","tags":{}},"n394490625":{"id":"n394490625","loc":[-85.625093,41.925591],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:35Z","tags":{}},"n394490626":{"id":"n394490626","loc":[-85.625174,41.92559],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:35Z","tags":{}},"n394490627":{"id":"n394490627","loc":[-85.625249,41.925597],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:35Z","tags":{}},"n394490628":{"id":"n394490628","loc":[-85.625532,41.925604],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:35Z","tags":{}},"n394490629":{"id":"n394490629","loc":[-85.625761,41.925597],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:35Z","tags":{}},"n394490630":{"id":"n394490630","loc":[-85.625955,41.926153],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:35Z","tags":{}},"n394490631":{"id":"n394490631","loc":[-85.626209,41.926155],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:35Z","tags":{}},"n394490632":{"id":"n394490632","loc":[-85.627757,41.926151],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:35Z","tags":{}},"n394490633":{"id":"n394490633","loc":[-85.627825,41.926298],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:35Z","tags":{}},"n394490634":{"id":"n394490634","loc":[-85.627994,41.926315],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:35Z","tags":{}},"n394490635":{"id":"n394490635","loc":[-85.628049,41.927196],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:35Z","tags":{}},"n394490636":{"id":"n394490636","loc":[-85.62949,41.927221],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:35Z","tags":{}},"n394490637":{"id":"n394490637","loc":[-85.629602,41.927277],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:35Z","tags":{}},"n394490638":{"id":"n394490638","loc":[-85.6297102,41.9273279],"version":"2","changeset":"12805153","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-08-21T08:30:02Z","tags":{}},"n394490639":{"id":"n394490639","loc":[-85.630958,41.927398],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:06:35Z","tags":{}},"n394490699":{"id":"n394490699","loc":[-85.632741,41.927388],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:07:55Z","tags":{}},"n394490700":{"id":"n394490700","loc":[-85.632997,41.927391],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:07:55Z","tags":{}},"n394490701":{"id":"n394490701","loc":[-85.633149,41.927393],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:07:55Z","tags":{}},"n394490702":{"id":"n394490702","loc":[-85.633334,41.927393],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:07:55Z","tags":{}},"n394490703":{"id":"n394490703","loc":[-85.633468,41.927561],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:07:55Z","tags":{}},"n394490704":{"id":"n394490704","loc":[-85.633563,41.927755],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:07:55Z","tags":{}},"n394490705":{"id":"n394490705","loc":[-85.633662,41.928192],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:07:55Z","tags":{}},"n394490706":{"id":"n394490706","loc":[-85.633679,41.928807],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:07:55Z","tags":{}},"n394490707":{"id":"n394490707","loc":[-85.633687,41.929107],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:07:55Z","tags":{}},"n394490708":{"id":"n394490708","loc":[-85.633927,41.929109],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:07:55Z","tags":{}},"n394490709":{"id":"n394490709","loc":[-85.634126,41.929111],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:07:55Z","tags":{}},"n394490710":{"id":"n394490710","loc":[-85.634207,41.92911],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:07:55Z","tags":{}},"n394490711":{"id":"n394490711","loc":[-85.634323,41.929111],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:07:55Z","tags":{}},"n394490712":{"id":"n394490712","loc":[-85.636712,41.929128],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:07:55Z","tags":{}},"n394490713":{"id":"n394490713","loc":[-85.63808,41.9291],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:07:55Z","tags":{}},"n394490714":{"id":"n394490714","loc":[-85.639213,41.929088],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:07:55Z","tags":{}},"n394490715":{"id":"n394490715","loc":[-85.639189,41.92852],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:07:55Z","tags":{}},"n394490716":{"id":"n394490716","loc":[-85.639204,41.925488],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:07:55Z","tags":{}},"n394490717":{"id":"n394490717","loc":[-85.644204,41.925452],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:07:55Z","tags":{}},"n394490718":{"id":"n394490718","loc":[-85.651425,41.925406],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:07:56Z","tags":{}},"n394490719":{"id":"n394490719","loc":[-85.651449,41.926321],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:07:56Z","tags":{}},"n394490720":{"id":"n394490720","loc":[-85.651451,41.926969],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:07:56Z","tags":{}},"n394490721":{"id":"n394490721","loc":[-85.651458,41.928052],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:07:56Z","tags":{}},"n394490722":{"id":"n394490722","loc":[-85.651446,41.928892],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:07:56Z","tags":{}},"n394490723":{"id":"n394490723","loc":[-85.651456,41.929447],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:07:56Z","tags":{}},"n394490724":{"id":"n394490724","loc":[-85.651707,41.929454],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:07:56Z","tags":{}},"n394490725":{"id":"n394490725","loc":[-85.652369,41.929473],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:07:56Z","tags":{}},"n394490726":{"id":"n394490726","loc":[-85.6525,41.929452],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:07:56Z","tags":{}},"n394490727":{"id":"n394490727","loc":[-85.654066,41.92946],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:07:56Z","tags":{}},"n394490728":{"id":"n394490728","loc":[-85.654816,41.92946],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:07:56Z","tags":{}},"n394490729":{"id":"n394490729","loc":[-85.654816,41.930337],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:07:56Z","tags":{}},"n394490730":{"id":"n394490730","loc":[-85.654587,41.930337],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:07:56Z","tags":{}},"n394490731":{"id":"n394490731","loc":[-85.654548,41.931072],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:07:56Z","tags":{}},"n394490732":{"id":"n394490732","loc":[-85.654538,41.931701],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:07:56Z","tags":{}},"n394490733":{"id":"n394490733","loc":[-85.654898,41.931689],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:07:56Z","tags":{}},"n394490734":{"id":"n394490734","loc":[-85.654898,41.932505],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:07:56Z","tags":{}},"n394490735":{"id":"n394490735","loc":[-85.654854,41.932514],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:07:56Z","tags":{}},"n394490736":{"id":"n394490736","loc":[-85.655497,41.932499],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:07:56Z","tags":{}},"n394490737":{"id":"n394490737","loc":[-85.656405,41.932493],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:07:56Z","tags":{}},"n394490738":{"id":"n394490738","loc":[-85.656422,41.933416],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:07:56Z","tags":{}},"n394490739":{"id":"n394490739","loc":[-85.657322,41.933438],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:07:56Z","tags":{}},"n1475293233":{"id":"n1475293233","loc":[-85.6385522,41.9585167],"version":"1","changeset":"9619138","user":"bbmiller","uid":"451048","visible":"true","timestamp":"2011-10-21T19:54:50Z","tags":{}},"n1475293242":{"id":"n1475293242","loc":[-85.64609,41.9540815],"version":"1","changeset":"9619138","user":"bbmiller","uid":"451048","visible":"true","timestamp":"2011-10-21T19:54:51Z","tags":{}},"n1475293249":{"id":"n1475293249","loc":[-85.6358079,41.9692721],"version":"1","changeset":"9619138","user":"bbmiller","uid":"451048","visible":"true","timestamp":"2011-10-21T19:54:51Z","tags":{}},"n1475293256":{"id":"n1475293256","loc":[-85.6387369,41.9581583],"version":"1","changeset":"9619138","user":"bbmiller","uid":"451048","visible":"true","timestamp":"2011-10-21T19:54:51Z","tags":{}},"n1475293259":{"id":"n1475293259","loc":[-85.6455882,41.9541138],"version":"1","changeset":"9619138","user":"bbmiller","uid":"451048","visible":"true","timestamp":"2011-10-21T19:54:52Z","tags":{}},"n1475293266":{"id":"n1475293266","loc":[-85.6451008,41.9541821],"version":"1","changeset":"9619138","user":"bbmiller","uid":"451048","visible":"true","timestamp":"2011-10-21T19:54:52Z","tags":{}},"n1819800253":{"id":"n1819800253","loc":[-85.6134286,41.9429692],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:03:23Z","tags":{}},"n2114807558":{"id":"n2114807558","loc":[-85.6365609,41.963866],"version":"1","changeset":"14676554","user":"bbmiller","uid":"451048","visible":"true","timestamp":"2013-01-16T20:05:15Z","tags":{"railway":"level_crossing"}},"n2189015728":{"id":"n2189015728","loc":[-85.6383956,41.9590576],"version":"1","changeset":"15276188","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T21:42:50Z","tags":{}},"n2189015838":{"id":"n2189015838","loc":[-85.6435144,41.9563705],"version":"1","changeset":"15276188","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T21:42:50Z","tags":{}},"n2189015842":{"id":"n2189015842","loc":[-85.6415782,41.9557035],"version":"1","changeset":"15276188","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T21:42:50Z","tags":{}},"n2189015855":{"id":"n2189015855","loc":[-85.6440829,41.9554577],"version":"1","changeset":"15276188","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T21:42:50Z","tags":{}},"n2199109849":{"id":"n2199109849","loc":[-85.6393434,41.9565591],"version":"1","changeset":"15347594","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T05:16:51Z","tags":{}},"n2199109851":{"id":"n2199109851","loc":[-85.6393208,41.9565002],"version":"1","changeset":"15347594","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T05:16:51Z","tags":{}},"n2199109857":{"id":"n2199109857","loc":[-85.6401986,41.955545],"version":"1","changeset":"15347594","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T05:16:52Z","tags":{}},"n2199109859":{"id":"n2199109859","loc":[-85.6402362,41.955587],"version":"1","changeset":"15347594","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T05:16:52Z","tags":{}},"n2199109861":{"id":"n2199109861","loc":[-85.6395958,41.9565675],"version":"1","changeset":"15347594","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T05:16:52Z","tags":{}},"n2199109863":{"id":"n2199109863","loc":[-85.639528,41.9566011],"version":"1","changeset":"15347594","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T05:16:52Z","tags":{}},"w209717053":{"id":"w209717053","version":"1","changeset":"15347594","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T05:16:53Z","tags":{"area":"yes","building":"yes"},"nodes":["n2199109829","n2199109831","n2199109833","n2199109835","n2199109829"]},"w17966415":{"id":"w17966415","version":"2","changeset":"15276188","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T21:42:55Z","tags":{"access":"private","highway":"service","name":"Manufacturing Way","tiger:cfcc":"A74","tiger:county":"St. Joseph, MI","tiger:name_base":"Manufacturing","tiger:name_type":"Way","tiger:reviewed":"no"},"nodes":["n185971642","n185977232","n185977233","n185949745","n185949748","n185977234"]},"w209717054":{"id":"w209717054","version":"1","changeset":"15347594","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T05:16:53Z","tags":{"area":"yes","building":"yes"},"nodes":["n2199109837","n2199109839","n2199109841","n2199109843","n2199109845","n2199109847","n2199109837"]},"w208627214":{"id":"w208627214","version":"1","changeset":"15276188","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T21:42:53Z","tags":{"highway":"service","tiger:cfcc":"A41","tiger:county":"St. Joseph, MI","tiger:reviewed":"no"},"nodes":["n185949755","n2189015728","n1475293233","n1475293256","n185952163","n185952161","n185952160","n185952158","n185949763","n1819848965","n1819848890","n185952156"]},"w17963817":{"id":"w17963817","version":"2","changeset":"15276188","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T21:42:55Z","tags":{"access":"private","highway":"service","tiger:cfcc":"A74","tiger:county":"St. Joseph, MI","tiger:reviewed":"no"},"nodes":["n185949765","n185953413","n185953417","n185953421","n185953423"]},"w34369809":{"id":"w34369809","version":"7","changeset":"14676554","user":"bbmiller","uid":"451048","visible":"true","timestamp":"2013-01-16T20:05:19Z","tags":{"admin_level":"8","boundary":"administrative","landuse":"residential","source":"TIGER/Line® 2008 Place Shapefiles (http://www.census.gov/geo/www/tiger/)"},"nodes":["n394490395","n394490396","n394490397","n394490398","n394490399","n394490400","n394490401","n394490402","n394490403","n394490404","n394490405","n394490406","n394490407","n394490408","n394490409","n394490410","n394490411","n394490412","n394490413","n394490414","n394490415","n394490416","n394490417","n394490418","n394490419","n394490420","n394490421","n394490422","n394490423","n394490424","n394490425","n394490426","n394490427","n394490428","n1475293242","n1475293259","n1475293266","n394490429","n394490430","n394490431","n394490432","n394490433","n394490434","n394490435","n394490436","n394490437","n394490438","n394490439","n394490440","n394490441","n394490442","n394490443","n394490444","n394490445","n394490446","n1475293249","n394490447","n394490448","n394490449","n394490450","n394490451","n394490452","n394490453","n394490454","n394490455","n394490456","n394490457","n394490458","n394490459","n394490460","n394490461","n394490462","n2114807558","n394490463","n1475293226","n394490464","n394490465","n394490466","n394490467","n394490468","n394490469","n394490470","n394490471","n394490472","n394490473","n394490474","n394490475","n394490476","n394490477","n394490478","n394490479","n394490480","n394490481","n394490482","n394490483","n394490484","n394490485","n394490486","n394490487","n394490488","n394490489","n394490490","n394490491","n394490492","n394490493","n394490494","n394490495","n394490496","n394490497","n394490498","n394490499","n394490500","n394490501","n394490502","n394490503","n394490504","n394490505","n394490506","n394490507","n394490508","n394490509","n394490510","n394490511","n394490512","n394490513","n394490514","n394490515","n394490516","n394490517","n394490518","n394490519","n394490520","n394490521","n394490522","n394490523","n394490524","n394490525","n394490526","n394490527","n394490528","n394490529","n394490530","n394490531","n394490532","n394490533","n394490534","n394490535","n394490536","n394490537","n394490538","n394490539","n394490540","n394490542","n394490545","n394490546","n394490547","n394490548","n394490549","n394490550","n394490551","n394490552","n394490553","n394490554","n394490555","n394490556","n394490557","n394490558","n394490559","n394490560","n394490561","n394490562","n394490563","n394490564","n394490565","n394490566","n394490567","n394490568","n394490569","n394490570","n394490571","n1819800253","n394490572","n394490573","n394490574","n394490575","n394490576","n394490577","n394490578","n394490579","n394490580","n394490582","n394490583","n394490585","n394490586","n394490588","n394490589","n394490590","n394490592","n394490594","n394490595","n394490596","n394490598","n394490599","n394490601","n394490602","n394490604","n394490605","n394490607","n394490608","n394490609","n394490611","n394490612","n394490613","n394490614","n394490615","n394490616","n394490617","n394490618","n394490619","n394490620","n394490621","n394490622","n394490623","n394490624","n394490625","n394490626","n394490627","n394490628","n394490629","n394490630","n394490631","n394490632","n394490633","n394490634","n394490635","n394490636","n394490637","n394490638","n394490639","n394490699","n394490700","n394490701","n394490702","n394490703","n394490704","n394490705","n394490706","n394490707","n394490708","n394490709","n394490710","n394490711","n394490712","n394490713","n394490714","n394490715","n394490716","n394490717","n394490718","n394490719","n394490720","n394490721","n394490722","n394490723","n394490724","n394490725","n394490726","n394490727","n394490728","n394490729","n394490730","n394490731","n394490732","n394490733","n394490734","n394490735","n394490736","n394490737","n394490738","n394490739","n394490395"]},"w208627221":{"id":"w208627221","version":"1","changeset":"15276188","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T21:42:53Z","tags":{"amenity":"parking","area":"yes"},"nodes":["n2189015838","n2189015842","n2189015846","n2189015849","n2189015852","n2189015855","n2189015838"]},"w209717052":{"id":"w209717052","version":"1","changeset":"15347594","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T05:16:53Z","tags":{"area":"yes","building":"yes"},"nodes":["n2199109816","n2199109818","n2199109820","n2199109822","n2199109825","n2199109827","n2199109816"]},"w134151784":{"id":"w134151784","version":"1","changeset":"9619138","user":"bbmiller","uid":"451048","visible":"true","timestamp":"2011-10-21T19:54:52Z","tags":{"bridge":"yes","highway":"residential","name":"W Hoffman St","tiger:cfcc":"A41","tiger:county":"St. Joseph, MI","tiger:name_base":"Hoffman","tiger:name_direction_prefix":"W","tiger:name_type":"St","tiger:reviewed":"no","tiger:separated":"no","tiger:source":"tiger_import_dch_v0.6_20070813","tiger:tlid":"15312195:15312958:15312207:15313273:15328372:15328373","tiger:upload_uuid":"bulk_upload.pl-b79f893a-0be1-4a5f-a183-6aea114c9af7"},"nodes":["n185971648","n185971651"]},"w209717055":{"id":"w209717055","version":"1","changeset":"15347594","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T05:16:53Z","tags":{"area":"yes","landuse":"basin"},"nodes":["n2199109849","n2199109851","n2199109853","n2199109855","n2199109857","n2199109859","n2199109861","n2199109863","n2199109849"]},"w17967763":{"id":"w17967763","version":"2","changeset":"9619138","user":"bbmiller","uid":"451048","visible":"true","timestamp":"2011-10-21T19:55:04Z","tags":{"highway":"residential","name":"Rock River Ave","tiger:cfcc":"A41","tiger:county":"St. Joseph, MI","tiger:name_base":"Rock River","tiger:name_type":"Ave","tiger:reviewed":"no","tiger:separated":"no","tiger:source":"tiger_import_dch_v0.6_20070813","tiger:tlid":"15312230:15312252:15335064:15333550","tiger:upload_uuid":"bulk_upload.pl-b79f893a-0be1-4a5f-a183-6aea114c9af7","tiger:zip_left":"49093"},"nodes":["n1475293244","n185982166","n185975067","n185971637"]},"r134949":{"id":"r134949","version":"2","changeset":"14979874","user":"malenki","uid":"39504","visible":"true","timestamp":"2013-02-10T12:18:08Z","tags":{"admin_level":"8","border_type":"city","boundary":"administrative","is_in":"USA, Michigan","is_in:country":"USA","is_in:country_code":"US","is_in:iso_3166_2":"US:MI","is_in:state":"Michigan","is_in:state_code":"MI","name":"Three Rivers","place":"city","source":"TIGER/Line® 2008 Place Shapefiles (http://www.census.gov/geo/www/tiger/)","tiger:CLASSFP":"C5","tiger:CPI":"Y","tiger:FUNCSTAT":"A","tiger:LSAD":"25","tiger:MTFCC":"G4110","tiger:NAME":"Three Rivers","tiger:NAMELSAD":"Three Rivers city","tiger:PCICBSA":"N","tiger:PCINECTA":"N","tiger:PLACEFP":"79760","tiger:PLACENS":"01627164","tiger:PLCIDFP":"2679760","tiger:STATEFP":"26","type":"boundary","wikipedia":"en:Three Rivers, Michigan"},"members":[{"id":"w34369809","type":"way","role":"outer"},{"id":"w34369821","type":"way","role":"outer"},{"id":"w34369822","type":"way","role":"outer"},{"id":"w34369823","type":"way","role":"outer"},{"id":"w34369824","type":"way","role":"outer"},{"id":"w34369825","type":"way","role":"outer"},{"id":"w34369826","type":"way","role":"outer"},{"id":"w34369810","type":"way","role":"inner"},{"id":"w34369811","type":"way","role":"inner"},{"id":"w34369812","type":"way","role":"inner"},{"id":"w34367079","type":"way","role":"inner"},{"id":"w34369814","type":"way","role":"inner"},{"id":"w34367080","type":"way","role":"inner"},{"id":"w34369815","type":"way","role":"inner"},{"id":"w34369820","type":"way","role":"inner"}]},"n1819848881":{"id":"n1819848881","loc":[-85.638562,41.9569965],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:49Z","tags":{}},"n1819848947":{"id":"n1819848947","loc":[-85.6384348,41.9576565],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:51Z","tags":{}},"n1819849044":{"id":"n1819849044","loc":[-85.6385749,41.9573345],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:54Z","tags":{}},"n2114807547":{"id":"n2114807547","loc":[-85.6384626,41.9583756],"version":"1","changeset":"14676554","user":"bbmiller","uid":"451048","visible":"true","timestamp":"2013-01-16T20:05:15Z","tags":{}},"n2114807564":{"id":"n2114807564","loc":[-85.638535,41.9581283],"version":"1","changeset":"14676554","user":"bbmiller","uid":"451048","visible":"true","timestamp":"2013-01-16T20:05:15Z","tags":{}},"n2189015691":{"id":"n2189015691","loc":[-85.6435584,41.9565243],"version":"1","changeset":"15276188","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T21:42:49Z","tags":{}},"n2189015696":{"id":"n2189015696","loc":[-85.6435805,41.9566049],"version":"1","changeset":"15276188","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T21:42:50Z","tags":{}},"n2189015722":{"id":"n2189015722","loc":[-85.6435035,41.9567438],"version":"1","changeset":"15276188","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T21:42:50Z","tags":{}},"n2189015744":{"id":"n2189015744","loc":[-85.6437991,41.9569582],"version":"1","changeset":"15276188","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T21:42:50Z","tags":{}},"n2189015747":{"id":"n2189015747","loc":[-85.6433042,41.9567742],"version":"1","changeset":"15276188","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T21:42:50Z","tags":{}},"n2189015750":{"id":"n2189015750","loc":[-85.6433827,41.9566844],"version":"1","changeset":"15276188","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T21:42:50Z","tags":{}},"n2189015753":{"id":"n2189015753","loc":[-85.6430447,41.9565588],"version":"1","changeset":"15276188","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T21:42:50Z","tags":{}},"n2189015756":{"id":"n2189015756","loc":[-85.6431111,41.956451],"version":"1","changeset":"15276188","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T21:42:50Z","tags":{}},"n2189015759":{"id":"n2189015759","loc":[-85.6420247,41.956083],"version":"1","changeset":"15276188","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T21:42:50Z","tags":{}},"n2189015760":{"id":"n2189015760","loc":[-85.6419945,41.9561369],"version":"1","changeset":"15276188","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T21:42:50Z","tags":{}},"n2189015764":{"id":"n2189015764","loc":[-85.6413729,41.9558945],"version":"1","changeset":"15276188","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T21:42:50Z","tags":{}},"n2189015766":{"id":"n2189015766","loc":[-85.6412884,41.9560606],"version":"1","changeset":"15276188","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T21:42:50Z","tags":{}},"n2189015770":{"id":"n2189015770","loc":[-85.6411798,41.9560112],"version":"1","changeset":"15276188","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T21:42:50Z","tags":{}},"n2189015771":{"id":"n2189015771","loc":[-85.6410651,41.9562132],"version":"1","changeset":"15276188","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T21:42:50Z","tags":{}},"n2189015774":{"id":"n2189015774","loc":[-85.6409504,41.9561728],"version":"1","changeset":"15276188","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T21:42:50Z","tags":{}},"n2189015778":{"id":"n2189015778","loc":[-85.6407996,41.9564241],"version":"1","changeset":"15276188","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T21:42:50Z","tags":{}},"n2189015781":{"id":"n2189015781","loc":[-85.6406889,41.9563892],"version":"1","changeset":"15276188","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T21:42:50Z","tags":{}},"n2189015785":{"id":"n2189015785","loc":[-85.6404857,41.9567024],"version":"1","changeset":"15276188","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T21:42:50Z","tags":{}},"n2189015789":{"id":"n2189015789","loc":[-85.6406909,41.9567877],"version":"1","changeset":"15276188","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T21:42:50Z","tags":{}},"n2189015793":{"id":"n2189015793","loc":[-85.6405642,41.9570165],"version":"1","changeset":"15276188","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T21:42:50Z","tags":{}},"n2189015796":{"id":"n2189015796","loc":[-85.6415359,41.9573711],"version":"1","changeset":"15276188","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T21:42:50Z","tags":{}},"n2189015800":{"id":"n2189015800","loc":[-85.6411738,41.9579501],"version":"1","changeset":"15276188","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T21:42:50Z","tags":{}},"n2189015804":{"id":"n2189015804","loc":[-85.6411119,41.957921],"version":"1","changeset":"15276188","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T21:42:50Z","tags":{}},"n2189015808":{"id":"n2189015808","loc":[-85.6403186,41.9591751],"version":"1","changeset":"15276188","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T21:42:50Z","tags":{}},"n2189015909":{"id":"n2189015909","loc":[-85.6389293,41.9564636],"version":"1","changeset":"15276188","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T21:42:51Z","tags":{}},"n2189015926":{"id":"n2189015926","loc":[-85.6385431,41.9564617],"version":"1","changeset":"15276188","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T21:42:51Z","tags":{}},"n2189015929":{"id":"n2189015929","loc":[-85.6385457,41.9561823],"version":"1","changeset":"15276188","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T21:42:51Z","tags":{}},"n2189015932":{"id":"n2189015932","loc":[-85.6389319,41.9561843],"version":"1","changeset":"15276188","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T21:42:51Z","tags":{}},"n2199109865":{"id":"n2199109865","loc":[-85.6400768,41.956776],"version":"1","changeset":"15347594","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T05:16:52Z","tags":{}},"n2199109867":{"id":"n2199109867","loc":[-85.639902,41.9567153],"version":"1","changeset":"15347594","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T05:16:52Z","tags":{}},"n2199109869":{"id":"n2199109869","loc":[-85.640004,41.956553],"version":"1","changeset":"15347594","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T05:16:52Z","tags":{}},"n2199109871":{"id":"n2199109871","loc":[-85.6401788,41.9566137],"version":"1","changeset":"15347594","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T05:16:52Z","tags":{}},"n2199109873":{"id":"n2199109873","loc":[-85.6399316,41.9564506],"version":"1","changeset":"15347594","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T05:16:52Z","tags":{"man_made":"water_tower"}},"n2199109876":{"id":"n2199109876","loc":[-85.6397689,41.9572354],"version":"1","changeset":"15347594","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T05:16:52Z","tags":{}},"n2199109878":{"id":"n2199109878","loc":[-85.6399229,41.9569826],"version":"1","changeset":"15347594","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T05:16:52Z","tags":{}},"n2199109880":{"id":"n2199109880","loc":[-85.639706,41.9569095],"version":"1","changeset":"15347594","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T05:16:52Z","tags":{}},"n2199109882":{"id":"n2199109882","loc":[-85.639552,41.9571623],"version":"1","changeset":"15347594","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T05:16:52Z","tags":{}},"n2199109884":{"id":"n2199109884","loc":[-85.6391028,41.9569517],"version":"1","changeset":"15347594","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T05:16:52Z","tags":{}},"n2199109886":{"id":"n2199109886","loc":[-85.6392876,41.956646],"version":"1","changeset":"15347594","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T05:16:52Z","tags":{}},"n2199109888":{"id":"n2199109888","loc":[-85.639484,41.9567117],"version":"1","changeset":"15347594","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T05:16:52Z","tags":{}},"n2199109889":{"id":"n2199109889","loc":[-85.6394322,41.9567973],"version":"1","changeset":"15347594","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T05:16:52Z","tags":{}},"n2199109890":{"id":"n2199109890","loc":[-85.6393718,41.9567771],"version":"1","changeset":"15347594","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T05:16:52Z","tags":{}},"n2199109891":{"id":"n2199109891","loc":[-85.6392387,41.9569972],"version":"1","changeset":"15347594","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T05:16:52Z","tags":{}},"n1819848900":{"id":"n1819848900","loc":[-85.638281,41.9576578],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:50Z","tags":{}},"n1819848978":{"id":"n1819848978","loc":[-85.6377186,41.9580867],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:53Z","tags":{}},"n1819849039":{"id":"n1819849039","loc":[-85.6384217,41.9573405],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:54Z","tags":{}},"n1819849050":{"id":"n1819849050","loc":[-85.6377011,41.9570042],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:55Z","tags":{}},"n1819849088":{"id":"n1819849088","loc":[-85.6382879,41.9580817],"version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:47:56Z","tags":{}},"n2114807549":{"id":"n2114807549","loc":[-85.6362551,41.96473],"version":"1","changeset":"14676554","user":"bbmiller","uid":"451048","visible":"true","timestamp":"2013-01-16T20:05:15Z","tags":{}},"n2114807587":{"id":"n2114807587","loc":[-85.6368694,41.9629829],"version":"1","changeset":"14676554","user":"bbmiller","uid":"451048","visible":"true","timestamp":"2013-01-16T20:05:15Z","tags":{}},"n2189015725":{"id":"n2189015725","loc":[-85.644156,41.9569753],"version":"1","changeset":"15276188","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T21:42:50Z","tags":{}},"n2189015741":{"id":"n2189015741","loc":[-85.6419825,41.9597632],"version":"1","changeset":"15276188","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T21:42:50Z","tags":{}},"w208627217":{"id":"w208627217","version":"1","changeset":"15276188","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T21:42:53Z","tags":{"area":"yes","building":"yes"},"nodes":["n2189015741","n2189015744","n2189015747","n2189015750","n2189015753","n2189015756","n2189015759","n2189015760","n2189015764","n2189015766","n2189015770","n2189015771","n2189015774","n2189015778","n2189015781","n2189015785","n2189015789","n2189015793","n2189015796","n2189015800","n2189015804","n2189015808","n2189015741"]},"w208627212":{"id":"w208627212","version":"1","changeset":"15276188","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T21:42:53Z","tags":{"highway":"service"},"nodes":["n2189015691","n2189015696","n2189015722","n2189015725"]},"w209717057":{"id":"w209717057","version":"1","changeset":"15347594","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T05:16:53Z","tags":{"area":"yes","building":"yes"},"nodes":["n2199109876","n2199109878","n2199109880","n2199109882","n2199109876"]},"w209717056":{"id":"w209717056","version":"1","changeset":"15347594","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T05:16:53Z","tags":{"area":"yes","building":"yes"},"nodes":["n2199109865","n2199109867","n2199109869","n2199109871","n2199109865"]},"w208627231":{"id":"w208627231","version":"1","changeset":"15276188","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T21:42:54Z","tags":{"area":"yes","building":"yes"},"nodes":["n2189015909","n2189015926","n2189015929","n2189015932","n2189015909"]},"w170848326":{"id":"w170848326","version":"1","changeset":"12170158","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T07:48:00Z","tags":{"building":"yes","source":"Bing"},"nodes":["n1819848881","n1819849050","n1819848978","n1819849088","n1819848900","n1819848947","n1819849039","n1819849044","n1819848881"]},"w17963182":{"id":"w17963182","version":"2","changeset":"15276188","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T21:42:55Z","tags":{"highway":"service","tiger:cfcc":"A41","tiger:county":"St. Joseph, MI","tiger:reviewed":"no"},"nodes":["n185949763","n185949765","n2189015691","n185949745"]},"w201484340":{"id":"w201484340","version":"1","changeset":"14676554","user":"bbmiller","uid":"451048","visible":"true","timestamp":"2013-01-16T20:05:16Z","tags":{"railway":"rail","service":"siding","source":"Bing"},"nodes":["n2114807565","n2114807564","n2114807547","n2114807587","n2114807558","n2114807549","n2114807593"]},"w209717058":{"id":"w209717058","version":"1","changeset":"15347594","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T05:16:53Z","tags":{"area":"yes","building":"yes"},"nodes":["n2199109884","n2199109886","n2199109888","n2199109889","n2199109890","n2199109891","n2199109884"]},"n185954650":{"id":"n185954650","loc":[-85.627331,41.957439],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T04:56:31Z","tags":{}},"n185966949":{"id":"n185966949","loc":[-85.626868,41.957314],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:02:50Z","tags":{}},"n185989335":{"id":"n185989335","loc":[-85.62529,41.958568],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:14:27Z","tags":{}},"n185989337":{"id":"n185989337","loc":[-85.624962,41.958453],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:14:27Z","tags":{}},"n185989339":{"id":"n185989339","loc":[-85.624832,41.958399],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:14:27Z","tags":{}},"n185989340":{"id":"n185989340","loc":[-85.624707,41.958325],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:14:27Z","tags":{}},"n185989342":{"id":"n185989342","loc":[-85.624636,41.958251],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:14:27Z","tags":{}},"n185989345":{"id":"n185989345","loc":[-85.624578,41.95818],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:14:27Z","tags":{}},"n185989347":{"id":"n185989347","loc":[-85.624533,41.958099],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:14:27Z","tags":{}},"n185989349":{"id":"n185989349","loc":[-85.624507,41.957985],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:14:27Z","tags":{}},"n185989351":{"id":"n185989351","loc":[-85.624495,41.957807],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:14:27Z","tags":{}},"n185989353":{"id":"n185989353","loc":[-85.624514,41.957663],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:14:27Z","tags":{}},"n185989354":{"id":"n185989354","loc":[-85.624577,41.957593],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:14:27Z","tags":{}},"n185989356":{"id":"n185989356","loc":[-85.624685,41.95754],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:14:27Z","tags":{}},"n185989357":{"id":"n185989357","loc":[-85.624802,41.957523],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:14:28Z","tags":{}},"n185989359":{"id":"n185989359","loc":[-85.624996,41.957524],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:14:28Z","tags":{}},"n185989361":{"id":"n185989361","loc":[-85.625409,41.957515],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:14:28Z","tags":{}},"n185989364":{"id":"n185989364","loc":[-85.625634,41.957496],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:14:28Z","tags":{}},"n185989367":{"id":"n185989367","loc":[-85.625832,41.957453],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:14:28Z","tags":{}},"n185989368":{"id":"n185989368","loc":[-85.626044,41.957394],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:14:28Z","tags":{}},"n354031352":{"id":"n354031352","loc":[-85.6252778,41.9586111],"version":"3","changeset":"3908860","user":"Geogast","uid":"51045","visible":"true","timestamp":"2010-02-18T13:28:26Z","tags":{"amenity":"place_of_worship","denomination":"baptist","ele":"250","gnis:county_id":"149","gnis:created":"04/30/2008","gnis:feature_id":"2417873","gnis:state_id":"26","name":"First Baptist Church","religion":"christian"}},"n2199109892":{"id":"n2199109892","loc":[-85.6261578,41.9589963],"version":"1","changeset":"15347594","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T05:16:52Z","tags":{}},"n2199109893":{"id":"n2199109893","loc":[-85.6263191,41.9586865],"version":"1","changeset":"15347594","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T05:16:52Z","tags":{}},"n2199109894":{"id":"n2199109894","loc":[-85.6261186,41.9586288],"version":"1","changeset":"15347594","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T05:16:52Z","tags":{}},"n2199109895":{"id":"n2199109895","loc":[-85.6260644,41.9587329],"version":"1","changeset":"15347594","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T05:16:52Z","tags":{}},"n2199109896":{"id":"n2199109896","loc":[-85.6261547,41.9587589],"version":"1","changeset":"15347594","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T05:16:52Z","tags":{}},"n2199109898":{"id":"n2199109898","loc":[-85.6260476,41.9589646],"version":"1","changeset":"15347594","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T05:16:52Z","tags":{}},"n185966951":{"id":"n185966951","loc":[-85.628404,41.957438],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:02:50Z","tags":{}},"w17965351":{"id":"w17965351","version":"2","changeset":"15473186","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-24T01:52:20Z","tags":{"highway":"residential","name":"Flower Street","tiger:cfcc":"A41","tiger:county":"St. Joseph, MI","tiger:name_base":"Flower","tiger:name_type":"St","tiger:reviewed":"no"},"nodes":["n185966948","n185966949","n185954650","n185966951","n185966953","n185966955","n185966957"]},"w17967809":{"id":"w17967809","version":"2","changeset":"15473186","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-24T01:52:21Z","tags":{"highway":"residential","name":"Azaleamum Drive","tiger:cfcc":"A41","tiger:county":"St. Joseph, MI","tiger:name_base":"Azaleamum","tiger:name_type":"Dr","tiger:reviewed":"no","tiger:zip_left":"49093","tiger:zip_right":"49093"},"nodes":["n185982197","n185989335","n185989337","n185989339","n185989340","n185989342","n185989345","n185989347","n185989349","n185989351","n185989353","n185989354","n185989356","n185989357","n185989359","n185989361","n185989364","n185989367","n185989368","n185982196"]},"w209717059":{"id":"w209717059","version":"1","changeset":"15347594","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-13T05:16:53Z","tags":{"area":"yes","building":"yes"},"nodes":["n2199109892","n2199109893","n2199109894","n2199109895","n2199109896","n2199109898","n2199109892"]},"n185961390":{"id":"n185961390","loc":[-85.63137,41.959033],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T04:59:39Z","tags":{}},"n185961393":{"id":"n185961393","loc":[-85.634315,41.959017],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T04:59:39Z","tags":{}},"w17966214":{"id":"w17966214","version":"2","changeset":"15473186","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-24T01:52:22Z","tags":{"highway":"residential","name":"East Adams Street","tiger:cfcc":"A41","tiger:county":"St. Joseph, MI","tiger:name_base":"Adams","tiger:name_direction_prefix":"E","tiger:name_type":"St","tiger:reviewed":"no","tiger:zip_left":"49093"},"nodes":["n185975351","n185967434","n185968108"]},"w17964793":{"id":"w17964793","version":"1","changeset":"402341","user":"DaveHansenTiger","uid":"7168","visible":"true","timestamp":"2007-12-23T20:32:05Z","tags":{"highway":"residential","name":"Morris Ave","tiger:cfcc":"A41","tiger:county":"St. Joseph, MI","tiger:name_base":"Morris","tiger:name_type":"Ave","tiger:reviewed":"no","tiger:separated":"no","tiger:source":"tiger_import_dch_v0.6_20070813","tiger:tlid":"15312148:15328241:15328242","tiger:upload_uuid":"bulk_upload.pl-b79f893a-0be1-4a5f-a183-6aea114c9af7","tiger:zip_left":"49093","tiger:zip_right":"49093"},"nodes":["n185961389","n185961390","n185961391","n185961393","n185961396"]},"n185952166":{"id":"n185952166","loc":[-85.638174,41.95831],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T04:55:11Z","tags":{}},"n2114807552":{"id":"n2114807552","loc":[-85.6383526,41.9593788],"version":"1","changeset":"14676554","user":"bbmiller","uid":"451048","visible":"true","timestamp":"2013-01-16T20:05:15Z","tags":{}},"n2114807591":{"id":"n2114807591","loc":[-85.6383741,41.9593968],"version":"1","changeset":"14676554","user":"bbmiller","uid":"451048","visible":"true","timestamp":"2013-01-16T20:05:15Z","tags":{}},"n2189015731":{"id":"n2189015731","loc":[-85.6368404,41.9592785],"version":"1","changeset":"15276188","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T21:42:50Z","tags":{}},"n2189015734":{"id":"n2189015734","loc":[-85.6368404,41.9585918],"version":"1","changeset":"15276188","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T21:42:50Z","tags":{}},"n2189015737":{"id":"n2189015737","loc":[-85.6376009,41.9585918],"version":"1","changeset":"15276188","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T21:42:50Z","tags":{}},"n2189015738":{"id":"n2189015738","loc":[-85.6376009,41.9592785],"version":"1","changeset":"15276188","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T21:42:50Z","tags":{}},"n2189015897":{"id":"n2189015897","loc":[-85.6376839,41.9566137],"version":"1","changeset":"15276188","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T21:42:51Z","tags":{}},"n2189015900":{"id":"n2189015900","loc":[-85.6376831,41.9564865],"version":"1","changeset":"15276188","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T21:42:51Z","tags":{}},"n2189015903":{"id":"n2189015903","loc":[-85.6381161,41.9564851],"version":"1","changeset":"15276188","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T21:42:51Z","tags":{}},"n2189015906":{"id":"n2189015906","loc":[-85.6381168,41.9566122],"version":"1","changeset":"15276188","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T21:42:51Z","tags":{}},"n2189015937":{"id":"n2189015937","loc":[-85.6364789,41.9590634],"version":"1","changeset":"15276188","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T21:42:51Z","tags":{}},"n2189015940":{"id":"n2189015940","loc":[-85.6361137,41.9590672],"version":"1","changeset":"15276188","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T21:42:51Z","tags":{}},"n2189015943":{"id":"n2189015943","loc":[-85.6361169,41.9594033],"version":"1","changeset":"15276188","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T21:42:51Z","tags":{}},"n2189015945":{"id":"n2189015945","loc":[-85.6363456,41.9594021],"version":"1","changeset":"15276188","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T21:42:51Z","tags":{}},"n2189015952":{"id":"n2189015952","loc":[-85.636112,41.958892],"version":"1","changeset":"15276188","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T21:42:51Z","tags":{}},"n2189015955":{"id":"n2189015955","loc":[-85.6364757,41.9588894],"version":"1","changeset":"15276188","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T21:42:51Z","tags":{}},"n2189015957":{"id":"n2189015957","loc":[-85.6364729,41.9586747],"version":"1","changeset":"15276188","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T21:42:51Z","tags":{}},"n2189015958":{"id":"n2189015958","loc":[-85.6361103,41.9586765],"version":"1","changeset":"15276188","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T21:42:51Z","tags":{}},"n2189015959":{"id":"n2189015959","loc":[-85.6364719,41.9585562],"version":"1","changeset":"15276188","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T21:42:51Z","tags":{}},"n2189015960":{"id":"n2189015960","loc":[-85.6361093,41.958558],"version":"1","changeset":"15276188","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T21:42:51Z","tags":{}},"n2189015961":{"id":"n2189015961","loc":[-85.6355494,41.9586403],"version":"1","changeset":"15276188","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T21:42:51Z","tags":{}},"n2189015962":{"id":"n2189015962","loc":[-85.635549,41.9584711],"version":"1","changeset":"15276188","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T21:42:51Z","tags":{}},"n2189015963":{"id":"n2189015963","loc":[-85.6351831,41.9584715],"version":"1","changeset":"15276188","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T21:42:51Z","tags":{}},"n2189015964":{"id":"n2189015964","loc":[-85.6351834,41.9586408],"version":"1","changeset":"15276188","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T21:42:51Z","tags":{}},"n2189015966":{"id":"n2189015966","loc":[-85.6359579,41.9586359],"version":"1","changeset":"15276188","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T21:42:51Z","tags":{}},"n2189015968":{"id":"n2189015968","loc":[-85.6359561,41.9585465],"version":"1","changeset":"15276188","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T21:42:51Z","tags":{}},"n2189015971":{"id":"n2189015971","loc":[-85.6355476,41.9585509],"version":"1","changeset":"15276188","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T21:42:51Z","tags":{}},"n2189015974":{"id":"n2189015974","loc":[-85.6359516,41.9592934],"version":"1","changeset":"15276188","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T21:42:51Z","tags":{}},"n2189015977":{"id":"n2189015977","loc":[-85.635949,41.9586697],"version":"1","changeset":"15276188","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T21:42:51Z","tags":{}},"n2189015980":{"id":"n2189015980","loc":[-85.6351329,41.9586716],"version":"1","changeset":"15276188","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T21:42:51Z","tags":{}},"n2189015983":{"id":"n2189015983","loc":[-85.6351318,41.9583949],"version":"1","changeset":"15276188","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T21:42:51Z","tags":{}},"n2189015986":{"id":"n2189015986","loc":[-85.6349148,41.9583954],"version":"1","changeset":"15276188","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T21:42:51Z","tags":{}},"n2189015989":{"id":"n2189015989","loc":[-85.6349186,41.9592958],"version":"1","changeset":"15276188","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T21:42:51Z","tags":{}},"n2189015995":{"id":"n2189015995","loc":[-85.6360173,41.9593286],"version":"1","changeset":"15276188","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T21:42:51Z","tags":{}},"n2189015998":{"id":"n2189015998","loc":[-85.6360278,41.9583079],"version":"1","changeset":"15276188","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T21:42:51Z","tags":{}},"n2114807550":{"id":"n2114807550","loc":[-85.6383392,41.9595404],"version":"1","changeset":"14676554","user":"bbmiller","uid":"451048","visible":"true","timestamp":"2013-01-16T20:05:15Z","tags":{}},"n2114807551":{"id":"n2114807551","loc":[-85.6375855,41.9616107],"version":"1","changeset":"14676554","user":"bbmiller","uid":"451048","visible":"true","timestamp":"2013-01-16T20:05:15Z","tags":{}},"n2114807559":{"id":"n2114807559","loc":[-85.6373978,41.9621273],"version":"1","changeset":"14676554","user":"bbmiller","uid":"451048","visible":"true","timestamp":"2013-01-16T20:05:15Z","tags":{}},"n2114807562":{"id":"n2114807562","loc":[-85.6373361,41.9622609],"version":"1","changeset":"14676554","user":"bbmiller","uid":"451048","visible":"true","timestamp":"2013-01-16T20:05:15Z","tags":{}},"n2114807563":{"id":"n2114807563","loc":[-85.6376472,41.9613953],"version":"1","changeset":"14676554","user":"bbmiller","uid":"451048","visible":"true","timestamp":"2013-01-16T20:05:15Z","tags":{}},"n2114807574":{"id":"n2114807574","loc":[-85.636974,41.9627695],"version":"1","changeset":"14676554","user":"bbmiller","uid":"451048","visible":"true","timestamp":"2013-01-16T20:05:15Z","tags":{}},"n2114807589":{"id":"n2114807589","loc":[-85.6383017,41.9595005],"version":"1","changeset":"14676554","user":"bbmiller","uid":"451048","visible":"true","timestamp":"2013-01-16T20:05:15Z","tags":{}},"n2114807592":{"id":"n2114807592","loc":[-85.6377169,41.9613494],"version":"1","changeset":"14676554","user":"bbmiller","uid":"451048","visible":"true","timestamp":"2013-01-16T20:05:15Z","tags":{}},"n2114807595":{"id":"n2114807595","loc":[-85.6371081,41.962574],"version":"1","changeset":"14676554","user":"bbmiller","uid":"451048","visible":"true","timestamp":"2013-01-16T20:05:15Z","tags":{}},"n2189015934":{"id":"n2189015934","loc":[-85.6364855,41.9595098],"version":"1","changeset":"15276188","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T21:42:51Z","tags":{}},"n2189015949":{"id":"n2189015949","loc":[-85.6363466,41.9595105],"version":"1","changeset":"15276188","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T21:42:51Z","tags":{}},"w208627244":{"id":"w208627244","version":"1","changeset":"15276188","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T21:42:54Z","tags":{"highway":"service"},"nodes":["n2189015992","n2189015995","n2189015998"]},"w208627240":{"id":"w208627240","version":"1","changeset":"15276188","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T21:42:54Z","tags":{"area":"yes","building":"yes"},"nodes":["n2189015961","n2189015971","n2189015962","n2189015963","n2189015964","n2189015961"]},"w17967437":{"id":"w17967437","version":"1","changeset":"402341","user":"DaveHansenTiger","uid":"7168","visible":"true","timestamp":"2007-12-23T20:51:44Z","tags":{"highway":"residential","name":"Lyman St","tiger:cfcc":"A41","tiger:county":"St. Joseph, MI","tiger:name_base":"Lyman","tiger:name_type":"St","tiger:reviewed":"no","tiger:separated":"no","tiger:source":"tiger_import_dch_v0.6_20070813","tiger:tlid":"15313234","tiger:upload_uuid":"bulk_upload.pl-b79f893a-0be1-4a5f-a183-6aea114c9af7"},"nodes":["n185964361","n185984024"]},"w208627237":{"id":"w208627237","version":"1","changeset":"15276188","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T21:42:54Z","tags":{"area":"yes","building":"yes"},"nodes":["n2189015955","n2189015957","n2189015958","n2189015952","n2189015955"]},"w17967465":{"id":"w17967465","version":"1","changeset":"402341","user":"DaveHansenTiger","uid":"7168","visible":"true","timestamp":"2007-12-23T20:51:57Z","tags":{"highway":"residential","name":"W Adams St","tiger:cfcc":"A41","tiger:county":"St. Joseph, MI","tiger:name_base":"Adams","tiger:name_direction_prefix":"W","tiger:name_type":"St","tiger:reviewed":"no","tiger:separated":"no","tiger:source":"tiger_import_dch_v0.6_20070813","tiger:tlid":"15312177","tiger:upload_uuid":"bulk_upload.pl-b79f893a-0be1-4a5f-a183-6aea114c9af7"},"nodes":["n185978394","n185984022","n185964360"]},"w208627228":{"id":"w208627228","version":"1","changeset":"15276188","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T21:42:54Z","tags":{"area":"yes","building":"yes"},"nodes":["n2189015897","n2189015900","n2189015903","n2189015906","n2189015897"]},"w201484351":{"id":"w201484351","version":"1","changeset":"14676554","user":"bbmiller","uid":"451048","visible":"true","timestamp":"2013-01-16T20:05:17Z","tags":{"railway":"rail","service":"siding","source":"Bing"},"nodes":["n2114807587","n2114807574","n2114807595","n2114807562","n2114807559","n2114807551","n2114807563","n2114807589","n2114807552"]},"w208627239":{"id":"w208627239","version":"1","changeset":"15276188","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T21:42:54Z","tags":{"area":"yes","building":"yes"},"nodes":["n2189015957","n2189015959","n2189015960","n2189015958","n2189015957"]},"w208627233":{"id":"w208627233","version":"1","changeset":"15276188","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T21:42:54Z","tags":{"area":"yes","building":"yes"},"nodes":["n2189015934","n2189015937","n2189015940","n2189015943","n2189015945","n2189015949","n2189015934"]},"w208627241":{"id":"w208627241","version":"1","changeset":"15276188","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T21:42:54Z","tags":{"area":"yes","building":"yes"},"nodes":["n2189015961","n2189015966","n2189015968","n2189015971","n2189015961"]},"w17967970":{"id":"w17967970","version":"1","changeset":"402580","user":"DaveHansenTiger","uid":"7168","visible":"true","timestamp":"2007-12-23T20:55:20Z","tags":{"highway":"residential","name":"Adams St","tiger:cfcc":"A41","tiger:county":"St. Joseph, MI","tiger:name_base":"Adams","tiger:name_type":"St","tiger:reviewed":"no","tiger:separated":"no","tiger:source":"tiger_import_dch_v0.6_20070813","tiger:tlid":"15312180","tiger:upload_uuid":"bulk_upload.pl-b79f893a-0be1-4a5f-a183-6aea114c9af7","tiger:zip_left":"49093","tiger:zip_right":"49093"},"nodes":["n185975351","n185978394"]},"w208627235":{"id":"w208627235","version":"1","changeset":"15276188","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T21:42:54Z","tags":{"area":"yes","building":"yes"},"nodes":["n2189015940","n2189015952","n2189015955","n2189015937","n2189015940"]},"w17965468":{"id":"w17965468","version":"2","changeset":"15276188","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T21:42:56Z","tags":{"highway":"residential","name":"Armstrong Blvd","tiger:cfcc":"A41","tiger:county":"St. Joseph, MI","tiger:name_base":"Armstrong","tiger:name_type":"Blvd","tiger:reviewed":"no"},"nodes":["n185967917","n2189015998","n185967918","n185964362","n185952166"]},"w201484346":{"id":"w201484346","version":"1","changeset":"14676554","user":"bbmiller","uid":"451048","visible":"true","timestamp":"2013-01-16T20:05:16Z","tags":{"railway":"rail","service":"siding","source":"Bing"},"nodes":["n2114807551","n2114807592","n2114807550","n2114807591"]},"w208627242":{"id":"w208627242","version":"1","changeset":"15276188","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T21:42:54Z","tags":{"amenity":"parking","area":"yes"},"nodes":["n2189015974","n2189015977","n2189015980","n2189015983","n2189015986","n2189015989","n2189015974"]},"w208627216":{"id":"w208627216","version":"1","changeset":"15276188","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T21:42:53Z","tags":{"area":"yes","building":"yes"},"nodes":["n2189015731","n2189015734","n2189015737","n2189015738","n2189015731"]},"n185984309":{"id":"n185984309","loc":[-85.631421,41.961494],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:11:55Z","tags":{}},"n185987987":{"id":"n185987987","loc":[-85.631456,41.960673],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:13:29Z","tags":{}},"n185965397":{"id":"n185965397","loc":[-85.634603,41.959838],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:01:52Z","tags":{}},"w17965196":{"id":"w17965196","version":"1","changeset":"402341","user":"DaveHansenTiger","uid":"7168","visible":"true","timestamp":"2007-12-23T20:35:10Z","tags":{"highway":"residential","name":"Burke Ave","tiger:cfcc":"A41","tiger:county":"St. Joseph, MI","tiger:name_base":"Burke","tiger:name_type":"Ave","tiger:reviewed":"no","tiger:separated":"no","tiger:source":"tiger_import_dch_v0.6_20070813","tiger:tlid":"15312145","tiger:upload_uuid":"bulk_upload.pl-b79f893a-0be1-4a5f-a183-6aea114c9af7","tiger:zip_left":"49093","tiger:zip_right":"49093"},"nodes":["n185965395","n185965397","n185965399"]},"w17967215":{"id":"w17967215","version":"2","changeset":"15276188","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T21:42:56Z","tags":{"highway":"residential","name":"Kellogg Ave","tiger:cfcc":"A41","tiger:county":"St. Joseph, MI","tiger:name_base":"Kellogg","tiger:name_type":"Ave","tiger:reviewed":"no","tiger:zip_left":"49093","tiger:zip_right":"49093"},"nodes":["n185968114","n185984309","n185967440","n185978402"]},"w17967597":{"id":"w17967597","version":"2","changeset":"14676554","user":"bbmiller","uid":"451048","visible":"true","timestamp":"2013-01-16T20:05:20Z","tags":{"highway":"residential","name":"Barnard Ave","tiger:cfcc":"A41","tiger:county":"St. Joseph, MI","tiger:name_base":"Barnard","tiger:name_type":"Ave","tiger:reviewed":"no","tiger:zip_left":"49093","tiger:zip_right":"49093"},"nodes":["n185968112","n185987987","n185967438","n185978399"]},"n394490857":{"id":"n394490857","loc":[-85.633952,41.960664],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:08:00Z","tags":{}},"n394490858":{"id":"n394490858","loc":[-85.633938,41.960227],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:08:00Z","tags":{}},"n394490859":{"id":"n394490859","loc":[-85.634794,41.960212],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:08:01Z","tags":{}},"n394490860":{"id":"n394490860","loc":[-85.634815,41.960662],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:08:01Z","tags":{}},"n394490861":{"id":"n394490861","loc":[-85.634103,41.961268],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:08:01Z","tags":{}},"n394490862":{"id":"n394490862","loc":[-85.634103,41.961001],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:08:01Z","tags":{}},"n394490863":{"id":"n394490863","loc":[-85.634504,41.961003],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:08:01Z","tags":{}},"n394490864":{"id":"n394490864","loc":[-85.634561,41.961269],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:08:01Z","tags":{}},"n1057629869":{"id":"n1057629869","loc":[-85.6382599,41.9612134],"version":"1","changeset":"6740055","user":"42429","uid":"42429","visible":"true","timestamp":"2010-12-22T21:14:10Z","tags":{}},"n1057629937":{"id":"n1057629937","loc":[-85.6380035,41.9616137],"version":"1","changeset":"6740055","user":"42429","uid":"42429","visible":"true","timestamp":"2010-12-22T21:14:11Z","tags":{}},"n2189016014":{"id":"n2189016014","loc":[-85.6360365,41.9626496],"version":"1","changeset":"15276188","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T21:42:52Z","tags":{}},"n2189016017":{"id":"n2189016017","loc":[-85.6360374,41.9623228],"version":"1","changeset":"15276188","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T21:42:52Z","tags":{}},"n2189016020":{"id":"n2189016020","loc":[-85.6367557,41.9623239],"version":"1","changeset":"15276188","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T21:42:52Z","tags":{}},"n2189016022":{"id":"n2189016022","loc":[-85.6367566,41.9619919],"version":"1","changeset":"15276188","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T21:42:52Z","tags":{}},"n2189016025":{"id":"n2189016025","loc":[-85.6351794,41.9619893],"version":"1","changeset":"15276188","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T21:42:52Z","tags":{}},"n2189016028":{"id":"n2189016028","loc":[-85.6351788,41.9622011],"version":"1","changeset":"15276188","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T21:42:52Z","tags":{}},"n2189016031":{"id":"n2189016031","loc":[-85.6350855,41.9622009],"version":"1","changeset":"15276188","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T21:42:52Z","tags":{}},"n2189016034":{"id":"n2189016034","loc":[-85.6350845,41.962527],"version":"1","changeset":"15276188","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T21:42:52Z","tags":{}},"n2189016037":{"id":"n2189016037","loc":[-85.6352732,41.9625273],"version":"1","changeset":"15276188","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T21:42:52Z","tags":{}},"n2189016039":{"id":"n2189016039","loc":[-85.6352738,41.9623178],"version":"1","changeset":"15276188","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T21:42:52Z","tags":{}},"n2189016042":{"id":"n2189016042","loc":[-85.6357712,41.9623186],"version":"1","changeset":"15276188","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T21:42:52Z","tags":{}},"n2189016044":{"id":"n2189016044","loc":[-85.6357702,41.9626492],"version":"1","changeset":"15276188","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T21:42:52Z","tags":{}},"n1057629880":{"id":"n1057629880","loc":[-85.638817,41.9619017],"version":"1","changeset":"6740055","user":"42429","uid":"42429","visible":"true","timestamp":"2010-12-22T21:14:10Z","tags":{}},"n1057629923":{"id":"n1057629923","loc":[-85.6390733,41.9615014],"version":"1","changeset":"6740055","user":"42429","uid":"42429","visible":"true","timestamp":"2010-12-22T21:14:11Z","tags":{}},"w91092312":{"id":"w91092312","version":"1","changeset":"6740055","user":"42429","uid":"42429","visible":"true","timestamp":"2010-12-22T21:14:12Z","tags":{"power":"station"},"nodes":["n1057629923","n1057629869","n1057629937","n1057629880","n1057629923"]},"w34369826":{"id":"w34369826","version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:08:01Z","tags":{"admin_level":"8","boundary":"administrative","created_by":"polyshp2osm-multipoly","source":"TIGER/Line® 2008 Place Shapefiles (http://www.census.gov/geo/www/tiger/)"},"nodes":["n394490861","n394490862","n394490863","n394490864","n394490861"]},"w34369825":{"id":"w34369825","version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:08:01Z","tags":{"admin_level":"8","boundary":"administrative","created_by":"polyshp2osm-multipoly","source":"TIGER/Line® 2008 Place Shapefiles (http://www.census.gov/geo/www/tiger/)"},"nodes":["n394490857","n394490858","n394490859","n394490860","n394490857"]},"w208627248":{"id":"w208627248","version":"1","changeset":"15276188","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-06T21:42:54Z","tags":{"area":"yes","building":"yes"},"nodes":["n2189016014","n2189016017","n2189016020","n2189016022","n2189016025","n2189016028","n2189016031","n2189016034","n2189016037","n2189016039","n2189016042","n2189016044","n2189016014"]},"n394490766":{"id":"n394490766","loc":[-85.616777,41.955642],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:07:58Z","tags":{}},"n394490768":{"id":"n394490768","loc":[-85.617239,41.955644],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:07:58Z","tags":{}},"n394490792":{"id":"n394490792","loc":[-85.619034,41.95543],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:07:58Z","tags":{}},"n185972055":{"id":"n185972055","loc":[-85.6185905,41.9568211],"version":"3","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:59:04Z","tags":{}},"n185972057":{"id":"n185972057","loc":[-85.6186688,41.9570086],"version":"3","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:59:04Z","tags":{}},"n185972059":{"id":"n185972059","loc":[-85.6186924,41.9581453],"version":"3","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:59:04Z","tags":{}},"n185972060":{"id":"n185972060","loc":[-85.6187082,41.9588211],"version":"3","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:59:04Z","tags":{"highway":"turning_circle","source":"Bing"}},"n1819790724":{"id":"n1819790724","loc":[-85.6182155,41.9555703],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:58:57Z","tags":{}},"n1819790735":{"id":"n1819790735","loc":[-85.6184059,41.9566188],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:58:58Z","tags":{}},"n1819790799":{"id":"n1819790799","loc":[-85.6182372,41.9563771],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:58:59Z","tags":{}},"n1819790896":{"id":"n1819790896","loc":[-85.6181431,41.9557227],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:59:01Z","tags":{}},"n185971405":{"id":"n185971405","loc":[-85.6186766,41.9577468],"version":"3","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:59:04Z","tags":{}},"n185971565":{"id":"n185971565","loc":[-85.6181613,41.9560879],"version":"3","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:59:04Z","tags":{}},"n185967985":{"id":"n185967985","loc":[-85.6186798,41.9585791],"version":"3","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:59:04Z","tags":{}},"n185955753":{"id":"n185955753","loc":[-85.620773,41.9555854],"version":"3","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:59:04Z","tags":{}},"n185955755":{"id":"n185955755","loc":[-85.6212652,41.9559891],"version":"3","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:59:04Z","tags":{}},"n185955748":{"id":"n185955748","loc":[-85.620722,41.954858],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T04:56:55Z","tags":{}},"n185955751":{"id":"n185955751","loc":[-85.6206912,41.955367],"version":"3","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:59:04Z","tags":{}},"n185967987":{"id":"n185967987","loc":[-85.6159351,41.9585809],"version":"3","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:59:04Z","tags":{}},"n185971407":{"id":"n185971407","loc":[-85.6159142,41.9577578],"version":"3","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:59:04Z","tags":{}},"n185971570":{"id":"n185971570","loc":[-85.6162248,41.95603],"version":"3","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:59:04Z","tags":{}},"n185971572":{"id":"n185971572","loc":[-85.6160402,41.9560749],"version":"3","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:59:04Z","tags":{}},"n185971574":{"id":"n185971574","loc":[-85.61593,41.956201],"version":"3","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:59:04Z","tags":{}},"n185981301":{"id":"n185981301","loc":[-85.6158973,41.9581601],"version":"3","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:59:05Z","tags":{}},"n394490762":{"id":"n394490762","loc":[-85.617193,41.954706],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:07:58Z","tags":{}},"n394490764":{"id":"n394490764","loc":[-85.616773,41.954737],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:07:58Z","tags":{}},"n394490787":{"id":"n394490787","loc":[-85.618972,41.954737],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:07:58Z","tags":{}},"n394490790":{"id":"n394490790","loc":[-85.619046,41.954929],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:07:58Z","tags":{}},"n394490794":{"id":"n394490794","loc":[-85.619922,41.955296],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:07:58Z","tags":{}},"n394490796":{"id":"n394490796","loc":[-85.61991,41.95501],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:07:58Z","tags":{}},"n394490798":{"id":"n394490798","loc":[-85.619974,41.954751],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:07:58Z","tags":{}},"n1819790677":{"id":"n1819790677","loc":[-85.6187031,41.9550522],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:58:56Z","tags":{}},"n1819790787":{"id":"n1819790787","loc":[-85.6186436,41.9552022],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:58:59Z","tags":{}},"n1819790828":{"id":"n1819790828","loc":[-85.6185127,41.9553393],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:59:00Z","tags":{}},"w17966857":{"id":"w17966857","version":"1","changeset":"402341","user":"DaveHansenTiger","uid":"7168","visible":"true","timestamp":"2007-12-23T20:47:55Z","tags":{"access":"private","highway":"service","name":"Sable River Rd","tiger:cfcc":"A74","tiger:county":"St. Joseph, MI","tiger:name_base":"Sable River","tiger:name_type":"Rd","tiger:reviewed":"no","tiger:source":"tiger_import_dch_v0.6_20070813","tiger:tlid":"15326128","tiger:upload_uuid":"bulk_upload.pl-b79f893a-0be1-4a5f-a183-6aea114c9af7","tiger:zip_left":"49093","tiger:zip_right":"49093"},"nodes":["n185972059","n185981301"]},"w34369814":{"id":"w34369814","version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:07:58Z","tags":{"admin_level":"8","boundary":"administrative","created_by":"polyshp2osm-multipoly","source":"TIGER/Line® 2008 Place Shapefiles (http://www.census.gov/geo/www/tiger/)"},"nodes":["n394490787","n394490790","n394490792","n394490794","n394490796","n394490798","n394490787"]},"w17964176":{"id":"w17964176","version":"1","changeset":"402341","user":"DaveHansenTiger","uid":"7168","visible":"true","timestamp":"2007-12-23T20:27:42Z","tags":{"highway":"residential","tiger:cfcc":"A41","tiger:county":"St. Joseph, MI","tiger:reviewed":"no","tiger:separated":"no","tiger:source":"tiger_import_dch_v0.6_20070813","tiger:tlid":"15314404","tiger:upload_uuid":"bulk_upload.pl-b79f893a-0be1-4a5f-a183-6aea114c9af7"},"nodes":["n185955747","n185955748","n185955751","n185955753","n185955755"]},"w17965838":{"id":"w17965838","version":"1","changeset":"402341","user":"DaveHansenTiger","uid":"7168","visible":"true","timestamp":"2007-12-23T20:40:09Z","tags":{"access":"private","highway":"service","name":"Pine River Rd","tiger:cfcc":"A74","tiger:county":"St. Joseph, MI","tiger:name_base":"Pine River","tiger:name_type":"Rd","tiger:reviewed":"no","tiger:source":"tiger_import_dch_v0.6_20070813","tiger:tlid":"15326123","tiger:upload_uuid":"bulk_upload.pl-b79f893a-0be1-4a5f-a183-6aea114c9af7","tiger:zip_left":"49093","tiger:zip_right":"49093"},"nodes":["n185971405","n185971407"]},"w17965476":{"id":"w17965476","version":"1","changeset":"402341","user":"DaveHansenTiger","uid":"7168","visible":"true","timestamp":"2007-12-23T20:37:16Z","tags":{"access":"private","highway":"service","name":"Raisin River Rd","tiger:cfcc":"A74","tiger:county":"St. Joseph, MI","tiger:name_base":"Raisin River","tiger:name_type":"Rd","tiger:reviewed":"no","tiger:source":"tiger_import_dch_v0.6_20070813","tiger:tlid":"15326112","tiger:upload_uuid":"bulk_upload.pl-b79f893a-0be1-4a5f-a183-6aea114c9af7","tiger:zip_left":"49093","tiger:zip_right":"49093"},"nodes":["n185967985","n185967987"]},"w17965913":{"id":"w17965913","version":"2","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:59:06Z","tags":{"access":"private","highway":"service","name":"Shiawassee River Rd","tiger:cfcc":"A74","tiger:county":"St. Joseph, MI","tiger:name_base":"Shiawassee River","tiger:name_type":"Rd","tiger:reviewed":"no","tiger:source":"tiger_import_dch_v0.6_20070813","tiger:tlid":"15326124:15326125:15326111:15326113:15326119","tiger:upload_uuid":"bulk_upload.pl-b79f893a-0be1-4a5f-a183-6aea114c9af7","tiger:zip_left":"49093","tiger:zip_right":"49093"},"nodes":["n185972054","n1819790677","n1819790787","n1819790828","n1819790724","n1819790896","n185971565","n1819790799","n1819790735","n185972055","n185972057","n185971405","n185972059","n185967985","n185972060"]},"w34369811":{"id":"w34369811","version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:07:58Z","tags":{"admin_level":"8","boundary":"administrative","created_by":"polyshp2osm-multipoly","source":"TIGER/Line® 2008 Place Shapefiles (http://www.census.gov/geo/www/tiger/)"},"nodes":["n394490762","n394490764","n394490766","n394490768","n394490762"]},"w17965854":{"id":"w17965854","version":"2","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:59:06Z","tags":{"access":"private","highway":"service","name":"Sturgeon River Rd","tiger:cfcc":"A74","tiger:county":"St. Joseph, MI","tiger:name_base":"Sturgeon River","tiger:name_type":"Rd","tiger:reviewed":"no","tiger:source":"tiger_import_dch_v0.6_20070813","tiger:tlid":"15326117","tiger:upload_uuid":"bulk_upload.pl-b79f893a-0be1-4a5f-a183-6aea114c9af7","tiger:zip_left":"49093","tiger:zip_right":"49093"},"nodes":["n185971565","n185971570","n185971572","n185971574"]},"n2139795769":{"id":"n2139795769","loc":[-85.6250804,41.9608796],"version":"1","changeset":"14892219","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T07:47:55Z","tags":{}},"n2139795770":{"id":"n2139795770","loc":[-85.6250315,41.9613684],"version":"1","changeset":"14892219","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T07:47:55Z","tags":{}},"n2139795771":{"id":"n2139795771","loc":[-85.6249671,41.9614362],"version":"1","changeset":"14892219","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T07:47:55Z","tags":{}},"n2139795772":{"id":"n2139795772","loc":[-85.6249698,41.961522],"version":"1","changeset":"14892219","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T07:47:55Z","tags":{}},"n2139795773":{"id":"n2139795773","loc":[-85.6250798,41.9615838],"version":"1","changeset":"14892219","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T07:47:55Z","tags":{}},"n2139795774":{"id":"n2139795774","loc":[-85.6252273,41.9615639],"version":"1","changeset":"14892219","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T07:47:56Z","tags":{}},"n2139795775":{"id":"n2139795775","loc":[-85.6252863,41.9614622],"version":"1","changeset":"14892219","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T07:47:56Z","tags":{}},"n2139795776":{"id":"n2139795776","loc":[-85.6252273,41.9613764],"version":"1","changeset":"14892219","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T07:47:56Z","tags":{}},"n2139795777":{"id":"n2139795777","loc":[-85.6251227,41.9613525],"version":"1","changeset":"14892219","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T07:47:56Z","tags":{}},"n2139795778":{"id":"n2139795778","loc":[-85.6249564,41.9612527],"version":"1","changeset":"14892219","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T07:47:56Z","tags":{}},"n2139795779":{"id":"n2139795779","loc":[-85.6249846,41.9610254],"version":"1","changeset":"14892219","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T07:47:56Z","tags":{}},"n2139795780":{"id":"n2139795780","loc":[-85.6266725,41.9599647],"version":"1","changeset":"14892219","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T07:47:56Z","tags":{}},"n2139795781":{"id":"n2139795781","loc":[-85.6259162,41.9599711],"version":"1","changeset":"14892219","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T07:47:56Z","tags":{}},"n2139795782":{"id":"n2139795782","loc":[-85.6257185,41.960019],"version":"1","changeset":"14892219","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T07:47:56Z","tags":{}},"n2139795783":{"id":"n2139795783","loc":[-85.6255509,41.9601213],"version":"1","changeset":"14892219","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T07:47:56Z","tags":{}},"n185963539":{"id":"n185963539","loc":[-85.615718,41.983893],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:00:58Z","tags":{}},"n185964418":{"id":"n185964418","loc":[-85.616626,42.049512],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:01:23Z","tags":{}},"n185966614":{"id":"n185966614","loc":[-85.615514,41.976603],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:02:41Z","tags":{}},"n185966635":{"id":"n185966635","loc":[-85.616118,42.013017],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:02:42Z","tags":{}},"n185969040":{"id":"n185969040","loc":[-85.615632,41.972357],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:03:45Z","tags":{}},"n185969070":{"id":"n185969070","loc":[-85.619145,41.967648],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:03:46Z","tags":{}},"n185972156":{"id":"n185972156","loc":[-85.621894,41.963956],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:05:18Z","tags":{}},"n185972157":{"id":"n185972157","loc":[-85.621806,41.964077],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:05:18Z","tags":{}},"n185972158":{"id":"n185972158","loc":[-85.620848,41.965341],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:05:18Z","tags":{}},"n185972159":{"id":"n185972159","loc":[-85.620684,41.965558],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:05:18Z","tags":{}},"n185972160":{"id":"n185972160","loc":[-85.620621,41.965658],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:05:18Z","tags":{}},"n185972161":{"id":"n185972161","loc":[-85.617844,41.969359],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:05:18Z","tags":{}},"n185972162":{"id":"n185972162","loc":[-85.616843,41.97068],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:05:18Z","tags":{}},"n185972164":{"id":"n185972164","loc":[-85.616714,41.970839],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:05:18Z","tags":{}},"n185972166":{"id":"n185972166","loc":[-85.615879,41.971969],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:05:18Z","tags":{}},"n185972168":{"id":"n185972168","loc":[-85.615748,41.972159],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:05:18Z","tags":{}},"n185972170":{"id":"n185972170","loc":[-85.615589,41.972502],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:05:18Z","tags":{}},"n185972172":{"id":"n185972172","loc":[-85.615542,41.972733],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:05:18Z","tags":{}},"n185972175":{"id":"n185972175","loc":[-85.615524,41.972947],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:05:18Z","tags":{}},"n185972177":{"id":"n185972177","loc":[-85.615512,41.973715],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:05:18Z","tags":{}},"n185972179":{"id":"n185972179","loc":[-85.615513,41.976496],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:05:18Z","tags":{}},"n185972180":{"id":"n185972180","loc":[-85.615538,41.977246],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:05:19Z","tags":{}},"n185972181":{"id":"n185972181","loc":[-85.61558,41.982139],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:05:19Z","tags":{}},"n185972184":{"id":"n185972184","loc":[-85.61557,41.983317],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:05:19Z","tags":{}},"n185972186":{"id":"n185972186","loc":[-85.615591,41.983463],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:05:19Z","tags":{}},"n185972188":{"id":"n185972188","loc":[-85.615763,41.984146],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:05:19Z","tags":{}},"n185972190":{"id":"n185972190","loc":[-85.615814,41.98435],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:05:19Z","tags":{}},"n185972192":{"id":"n185972192","loc":[-85.615965,41.998453],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:05:19Z","tags":{}},"n185972194":{"id":"n185972194","loc":[-85.615982,42.001237],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:05:19Z","tags":{}},"n185972195":{"id":"n185972195","loc":[-85.616055,42.00555],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:05:19Z","tags":{}},"n185972197":{"id":"n185972197","loc":[-85.616134,42.014887],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:05:19Z","tags":{}},"n185972199":{"id":"n185972199","loc":[-85.616177,42.018465],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:05:19Z","tags":{}},"n185972201":{"id":"n185972201","loc":[-85.616298,42.027627],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:05:19Z","tags":{}},"n185972203":{"id":"n185972203","loc":[-85.616513,42.042212],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:05:19Z","tags":{}},"w203968015":{"id":"w203968015","version":"1","changeset":"14892219","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T07:47:58Z","tags":{"highway":"residential"},"nodes":["n2139795768","n2139795769"]},"w17965932":{"id":"w17965932","version":"2","changeset":"14531170","user":"bot-mode","uid":"451693","visible":"true","timestamp":"2013-01-04T21:15:18Z","tags":{"highway":"residential","name":"Buckhorn Road","name_1":"County Highway 122","tiger:cfcc":"A41","tiger:county":"St. Joseph, MI","tiger:name_base":"Buckhorn","tiger:name_base_1":"County Highway 122","tiger:name_type":"Rd","tiger:reviewed":"no","tiger:zip_left":"49093","tiger:zip_right":"49093"},"nodes":["n185972155","n185972156","n185972157","n185972158","n185972159","n185972160","n185969070","n185972161","n185972162","n185972164","n185972166","n185972168","n185969040","n185972170","n185972172","n185972175","n185972177","n185972179","n185966614","n185972180","n185972181","n185972184","n185972186","n185963539","n185972188","n185972190","n185972192","n185972194","n185972195","n185966635","n185972197","n185972199","n185972201","n185972203","n185964418"]},"w203968016":{"id":"w203968016","version":"1","changeset":"14892219","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T07:47:58Z","tags":{"highway":"residential","name":"New Jersey Court"},"nodes":["n2139795770","n2139795771","n2139795772","n2139795773","n2139795774","n2139795775","n2139795776","n2139795777","n2139795770","n2139795778","n2139795779","n2139795769"]},"w203968017":{"id":"w203968017","version":"1","changeset":"14892219","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-03T07:47:58Z","tags":{"highway":"residential","name":"Oklahoma Drive"},"nodes":["n2139795780","n2139795781","n2139795782","n2139795783","n2139795769"]},"n1819790528":{"id":"n1819790528","loc":[-85.6184827,41.960025],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:58:53Z","tags":{}},"n1819790530":{"id":"n1819790530","loc":[-85.6168626,41.9605834],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:58:53Z","tags":{}},"n1819790534":{"id":"n1819790534","loc":[-85.6197379,41.9617163],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:58:53Z","tags":{}},"n1819790541":{"id":"n1819790541","loc":[-85.6198881,41.9620833],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:58:53Z","tags":{}},"n1819790543":{"id":"n1819790543","loc":[-85.619695,41.9619397],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:58:53Z","tags":{}},"n1819790547":{"id":"n1819790547","loc":[-85.6190298,41.9609504],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:58:53Z","tags":{}},"n1819790555":{"id":"n1819790555","loc":[-85.6180471,41.9609788],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:58:53Z","tags":{}},"n1819790559":{"id":"n1819790559","loc":[-85.6203817,41.9605436],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:58:54Z","tags":{}},"n1819790583":{"id":"n1819790583","loc":[-85.6201564,41.9603282],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:58:54Z","tags":{}},"n1819790590":{"id":"n1819790590","loc":[-85.617045,41.9598894],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:58:54Z","tags":{}},"n1819790609":{"id":"n1819790609","loc":[-85.6177638,41.9598495],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:58:55Z","tags":{}},"n1819790618":{"id":"n1819790618","loc":[-85.6195234,41.9610143],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:58:55Z","tags":{}},"n1819790642":{"id":"n1819790642","loc":[-85.6181179,41.9627933],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:58:56Z","tags":{}},"n1819790659":{"id":"n1819790659","loc":[-85.6174634,41.962897],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:58:56Z","tags":{}},"n1819790665":{"id":"n1819790665","loc":[-85.6170343,41.9630885],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:58:56Z","tags":{}},"n1819790674":{"id":"n1819790674","loc":[-85.6194697,41.9601925],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:58:56Z","tags":{}},"n1819790685":{"id":"n1819790685","loc":[-85.6207722,41.9610665],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:58:57Z","tags":{}},"n1819790687":{"id":"n1819790687","loc":[-85.6202315,41.9622109],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:58:57Z","tags":{}},"n1819790697":{"id":"n1819790697","loc":[-85.6184505,41.9624662],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:58:57Z","tags":{}},"n1819790726":{"id":"n1819790726","loc":[-85.6178926,41.9628492],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:58:57Z","tags":{}},"n1819790738":{"id":"n1819790738","loc":[-85.6173347,41.9598016],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:58:58Z","tags":{}},"n1819790762":{"id":"n1819790762","loc":[-85.6186221,41.9609105],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:58:58Z","tags":{}},"n1819790774":{"id":"n1819790774","loc":[-85.6175922,41.9608308],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:58:59Z","tags":{}},"n1819790781":{"id":"n1819790781","loc":[-85.6167768,41.9633198],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:58:59Z","tags":{}},"n1819790796":{"id":"n1819790796","loc":[-85.619856,41.961461],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:58:59Z","tags":{}},"n1819790811":{"id":"n1819790811","loc":[-85.6208215,41.9620195],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:59:00Z","tags":{}},"n1819790833":{"id":"n1819790833","loc":[-85.618311,41.9612536],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:59:00Z","tags":{}},"n1819790854":{"id":"n1819790854","loc":[-85.6183646,41.9626417],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:59:00Z","tags":{}},"n1819790863":{"id":"n1819790863","loc":[-85.6204997,41.9608547],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:59:01Z","tags":{}},"n1819790867":{"id":"n1819790867","loc":[-85.6184934,41.9621391],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:59:01Z","tags":{}},"n1819790877":{"id":"n1819790877","loc":[-85.6206928,41.9621152],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:59:01Z","tags":{}},"n1819790881":{"id":"n1819790881","loc":[-85.6170879,41.960735],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:59:01Z","tags":{}},"n1819790891":{"id":"n1819790891","loc":[-85.6168304,41.9601207],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:59:01Z","tags":{}},"n1819790898":{"id":"n1819790898","loc":[-85.619813,41.9612297],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:59:01Z","tags":{}},"n1819790909":{"id":"n1819790909","loc":[-85.6167982,41.960376],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:59:01Z","tags":{}},"n1819790912":{"id":"n1819790912","loc":[-85.6205855,41.9610462],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:59:01Z","tags":{}},"n1819790544":{"id":"n1819790544","loc":[-85.612968,41.9707781],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:58:53Z","tags":{}},"n1819790549":{"id":"n1819790549","loc":[-85.614395,41.9697172],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:58:53Z","tags":{}},"n1819790552":{"id":"n1819790552","loc":[-85.6180535,41.9655536],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:58:53Z","tags":{}},"n1819790554":{"id":"n1819790554","loc":[-85.6111227,41.9703713],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:58:53Z","tags":{}},"n1819790560":{"id":"n1819790560","loc":[-85.6112729,41.9701958],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:58:54Z","tags":{}},"n1819790563":{"id":"n1819790563","loc":[-85.6137512,41.9689917],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:58:54Z","tags":{}},"n1819790564":{"id":"n1819790564","loc":[-85.6181072,41.9659205],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:58:54Z","tags":{}},"n1819790595":{"id":"n1819790595","loc":[-85.6170021,41.9666863],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:58:54Z","tags":{}},"n1819790605":{"id":"n1819790605","loc":[-85.6168948,41.9644527],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:58:54Z","tags":{}},"n1819790606":{"id":"n1819790606","loc":[-85.6128071,41.9701081],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:58:54Z","tags":{}},"n1819790607":{"id":"n1819790607","loc":[-85.6129251,41.9704032],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:58:54Z","tags":{}},"n1819790612":{"id":"n1819790612","loc":[-85.6177638,41.9663912],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:58:55Z","tags":{}},"n1819790615":{"id":"n1819790615","loc":[-85.6152533,41.9670373],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:58:55Z","tags":{}},"n1819790622":{"id":"n1819790622","loc":[-85.6146739,41.9673804],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:58:55Z","tags":{}},"n1819790623":{"id":"n1819790623","loc":[-85.6180428,41.9661838],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:58:55Z","tags":{}},"n1819790625":{"id":"n1819790625","loc":[-85.6172918,41.9646202],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:58:55Z","tags":{}},"n1819790645":{"id":"n1819790645","loc":[-85.6178067,41.965043],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:58:56Z","tags":{}},"n1819790647":{"id":"n1819790647","loc":[-85.6143306,41.9712488],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:58:56Z","tags":{}},"n1819790649":{"id":"n1819790649","loc":[-85.6147383,41.9707702],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:58:56Z","tags":{}},"n1819790654":{"id":"n1819790654","loc":[-85.6157361,41.9668459],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:58:56Z","tags":{}},"n1819790657":{"id":"n1819790657","loc":[-85.6145666,41.9710733],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:58:56Z","tags":{}},"n1819790668":{"id":"n1819790668","loc":[-85.6166909,41.9642692],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:58:56Z","tags":{}},"n1819790671":{"id":"n1819790671","loc":[-85.6141482,41.9696538],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:58:56Z","tags":{}},"n1819790679":{"id":"n1819790679","loc":[-85.6148349,41.9705388],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:58:56Z","tags":{}},"n1819790686":{"id":"n1819790686","loc":[-85.6139551,41.9695501],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:58:57Z","tags":{}},"n1819790696":{"id":"n1819790696","loc":[-85.6119703,41.9699087],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:58:57Z","tags":{}},"n1819790704":{"id":"n1819790704","loc":[-85.6140731,41.9684174],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:58:57Z","tags":{}},"n1819790706":{"id":"n1819790706","loc":[-85.6124745,41.9699246],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:58:57Z","tags":{}},"n1819790718":{"id":"n1819790718","loc":[-85.6165407,41.9636868],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:58:57Z","tags":{}},"n1819790720":{"id":"n1819790720","loc":[-85.61388,41.9687365],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:58:57Z","tags":{}},"n1819790731":{"id":"n1819790731","loc":[-85.6165193,41.9639421],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:58:58Z","tags":{}},"n1819790739":{"id":"n1819790739","loc":[-85.6146739,41.9699964],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:58:58Z","tags":{}},"n1819790753":{"id":"n1819790753","loc":[-85.6173883,41.9665747],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:58:58Z","tags":{}},"n1819790760":{"id":"n1819790760","loc":[-85.6133221,41.9712089],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:58:58Z","tags":{}},"n1819790767":{"id":"n1819790767","loc":[-85.6116698,41.9699246],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:58:59Z","tags":{}},"n1819790779":{"id":"n1819790779","loc":[-85.6130753,41.9710573],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:58:59Z","tags":{}},"n1819790791":{"id":"n1819790791","loc":[-85.6137083,41.9692869],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:58:59Z","tags":{}},"n1819790795":{"id":"n1819790795","loc":[-85.6141482,41.9679627],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:58:59Z","tags":{}},"n1819790798":{"id":"n1819790798","loc":[-85.6137727,41.9694305],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:58:59Z","tags":{}},"n1819790836":{"id":"n1819790836","loc":[-85.6143842,41.9676037],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:59:00Z","tags":{}},"n1819790915":{"id":"n1819790915","loc":[-85.6148456,41.9702756],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:59:01Z","tags":{}},"n1819790926":{"id":"n1819790926","loc":[-85.6138371,41.9713525],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:59:02Z","tags":{}},"n1819790927":{"id":"n1819790927","loc":[-85.6141053,41.9713525],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:59:02Z","tags":{}},"n1819790931":{"id":"n1819790931","loc":[-85.6162832,41.966814],"version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:59:02Z","tags":{}},"n1821014625":{"id":"n1821014625","loc":[-85.5960611,41.9808498],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:40Z","tags":{}},"n1821014627":{"id":"n1821014627","loc":[-85.5565843,42.010982],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:40Z","tags":{}},"n1821014629":{"id":"n1821014629","loc":[-85.5971541,41.9805808],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:40Z","tags":{}},"n1821014632":{"id":"n1821014632","loc":[-85.6061837,41.9725907],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:40Z","tags":{}},"n1821014633":{"id":"n1821014633","loc":[-85.5247773,42.025766],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:40Z","tags":{}},"n1821014635":{"id":"n1821014635","loc":[-85.5908938,41.9902384],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:40Z","tags":{}},"n1821014636":{"id":"n1821014636","loc":[-85.5917682,41.9860637],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:40Z","tags":{}},"n1821014637":{"id":"n1821014637","loc":[-85.5456556,42.0166797],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:40Z","tags":{}},"n1821014638":{"id":"n1821014638","loc":[-85.5795749,42.0032352],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:40Z","tags":{}},"n1821014639":{"id":"n1821014639","loc":[-85.6103988,41.9723456],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:40Z","tags":{}},"n1821014642":{"id":"n1821014642","loc":[-85.5818816,42.0022466],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:40Z","tags":{}},"n1821014643":{"id":"n1821014643","loc":[-85.5570604,42.0091586],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:41Z","tags":{}},"n1821014644":{"id":"n1821014644","loc":[-85.5952886,41.9803792],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:41Z","tags":{}},"n1821014645":{"id":"n1821014645","loc":[-85.5780366,42.0040343],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:41Z","tags":{}},"n1821014646":{"id":"n1821014646","loc":[-85.6050505,41.9751971],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:41Z","tags":{}},"n1821014647":{"id":"n1821014647","loc":[-85.5854435,41.9946162],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:41Z","tags":{}},"n1821014648":{"id":"n1821014648","loc":[-85.5452278,42.0168768],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:41Z","tags":{}},"n1821014649":{"id":"n1821014649","loc":[-85.6023254,41.9780166],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:41Z","tags":{}},"n1821014651":{"id":"n1821014651","loc":[-85.5761899,42.0046783],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:41Z","tags":{}},"n1821014653":{"id":"n1821014653","loc":[-85.5897351,41.9876707],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:41Z","tags":{}},"n1821014657":{"id":"n1821014657","loc":[-85.5963601,41.9808998],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:41Z","tags":{}},"n1821014658":{"id":"n1821014658","loc":[-85.5892952,41.9951983],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:41Z","tags":{}},"n1821014660":{"id":"n1821014660","loc":[-85.5778328,42.0037194],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:41Z","tags":{}},"n1821014661":{"id":"n1821014661","loc":[-85.5541475,42.0125705],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:41Z","tags":{}},"n1821014663":{"id":"n1821014663","loc":[-85.5914047,41.9856469],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:41Z","tags":{}},"n1821014664":{"id":"n1821014664","loc":[-85.6101681,41.9727723],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:41Z","tags":{}},"n1821014665":{"id":"n1821014665","loc":[-85.5910172,41.9854696],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:41Z","tags":{}},"n1821014666":{"id":"n1821014666","loc":[-85.5398688,42.0187699],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:41Z","tags":{}},"n1821014667":{"id":"n1821014667","loc":[-85.5218752,42.0282884],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:41Z","tags":{}},"n1821014668":{"id":"n1821014668","loc":[-85.5159582,42.0329384],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:41Z","tags":{}},"n1821014669":{"id":"n1821014669","loc":[-85.5898102,41.9847319],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:41Z","tags":{}},"n1821014670":{"id":"n1821014670","loc":[-85.5734809,42.0066235],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:41Z","tags":{}},"n1821014671":{"id":"n1821014671","loc":[-85.5922939,41.980852],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:41Z","tags":{}},"n1821014672":{"id":"n1821014672","loc":[-85.6023629,41.9781163],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:41Z","tags":{}},"n1821014674":{"id":"n1821014674","loc":[-85.5409953,42.0191724],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:42Z","tags":{}},"n1821014676":{"id":"n1821014676","loc":[-85.584435,41.9949909],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:42Z","tags":{}},"n1821014677":{"id":"n1821014677","loc":[-85.5972399,41.9783835],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:42Z","tags":{}},"n1821014678":{"id":"n1821014678","loc":[-85.5616738,42.0071337],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:42Z","tags":{}},"n1821014681":{"id":"n1821014681","loc":[-85.5202994,42.0310755],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:42Z","tags":{}},"n1821014682":{"id":"n1821014682","loc":[-85.5915912,41.9857767],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:42Z","tags":{}},"n1821014684":{"id":"n1821014684","loc":[-85.6022288,41.977897],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:42Z","tags":{}},"n1821014687":{"id":"n1821014687","loc":[-85.5933024,41.9846362],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:42Z","tags":{}},"n1821014688":{"id":"n1821014688","loc":[-85.5846871,41.9956169],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:42Z","tags":{}},"n1821014689":{"id":"n1821014689","loc":[-85.5898209,41.99037],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:42Z","tags":{}},"n1821014691":{"id":"n1821014691","loc":[-85.5448939,42.0149261],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:42Z","tags":{}},"n1821014692":{"id":"n1821014692","loc":[-85.5977763,41.9786348],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:42Z","tags":{}},"n1821014694":{"id":"n1821014694","loc":[-85.5767706,42.0034523],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:42Z","tags":{}},"n1821014695":{"id":"n1821014695","loc":[-85.6103559,41.9726766],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:43Z","tags":{}},"n1821014697":{"id":"n1821014697","loc":[-85.5922134,41.9809876],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:43Z","tags":{}},"n1821014698":{"id":"n1821014698","loc":[-85.5935277,41.9831728],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:43Z","tags":{}},"n1821014700":{"id":"n1821014700","loc":[-85.5674674,42.0078273],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:43Z","tags":{}},"n1821014703":{"id":"n1821014703","loc":[-85.6021,41.9778053],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:43Z","tags":{}},"n1821014704":{"id":"n1821014704","loc":[-85.5756763,42.0053737],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:43Z","tags":{}},"n1821014705":{"id":"n1821014705","loc":[-85.5887695,41.9895207],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:43Z","tags":{}},"n1821014707":{"id":"n1821014707","loc":[-85.6061073,41.9746866],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:43Z","tags":{}},"n1821014708":{"id":"n1821014708","loc":[-85.6033446,41.9751692],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:43Z","tags":{}},"n1821014710":{"id":"n1821014710","loc":[-85.5180986,42.0322332],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:43Z","tags":{}},"n1821014711":{"id":"n1821014711","loc":[-85.543365,42.0163569],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:43Z","tags":{}},"n1821014712":{"id":"n1821014712","loc":[-85.6030656,41.9753646],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:43Z","tags":{}},"n1821014713":{"id":"n1821014713","loc":[-85.6104417,41.9704792],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:43Z","tags":{}},"n1821014714":{"id":"n1821014714","loc":[-85.5205716,42.030998],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:43Z","tags":{}},"n1821014716":{"id":"n1821014716","loc":[-85.516382,42.032536],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:43Z","tags":{}},"n1821014717":{"id":"n1821014717","loc":[-85.5932863,41.9820882],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:43Z","tags":{}},"n1821014718":{"id":"n1821014718","loc":[-85.5361928,42.0194974],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:43Z","tags":{}},"n1821014720":{"id":"n1821014720","loc":[-85.6011613,41.9773586],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:43Z","tags":{}},"n1821014721":{"id":"n1821014721","loc":[-85.554287,42.0109124],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:43Z","tags":{}},"n1821014722":{"id":"n1821014722","loc":[-85.5577524,42.0103425],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:43Z","tags":{}},"n1821014725":{"id":"n1821014725","loc":[-85.5867256,41.9921004],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:44Z","tags":{}},"n1821014726":{"id":"n1821014726","loc":[-85.5856045,41.9968807],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:44Z","tags":{}},"n1821014727":{"id":"n1821014727","loc":[-85.5545445,42.0106454],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:44Z","tags":{}},"n1821014728":{"id":"n1821014728","loc":[-85.5923797,41.9842534],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:44Z","tags":{}},"n1821014729":{"id":"n1821014729","loc":[-85.5696346,42.0081462],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:44Z","tags":{}},"n1821014730":{"id":"n1821014730","loc":[-85.5998322,41.9786884],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:44Z","tags":{}},"n1821014735":{"id":"n1821014735","loc":[-85.5337426,42.0218266],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:44Z","tags":{}},"n1821014736":{"id":"n1821014736","loc":[-85.5847944,41.994672],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:44Z","tags":{}},"n1821014740":{"id":"n1821014740","loc":[-85.5315271,42.0238669],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:44Z","tags":{}},"n1821014741":{"id":"n1821014741","loc":[-85.5248846,42.027085],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:44Z","tags":{}},"n1821014742":{"id":"n1821014742","loc":[-85.5853376,41.997018],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:44Z","tags":{}},"n1821014743":{"id":"n1821014743","loc":[-85.5894883,41.988811],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:44Z","tags":{}},"n1821014745":{"id":"n1821014745","loc":[-85.6095311,41.9726226],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:44Z","tags":{}},"n1821014746":{"id":"n1821014746","loc":[-85.5531511,42.0133416],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:44Z","tags":{}},"n1821014747":{"id":"n1821014747","loc":[-85.5735882,42.007058],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:44Z","tags":{}},"n1821014749":{"id":"n1821014749","loc":[-85.5428554,42.0164366],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:44Z","tags":{}},"n1821014751":{"id":"n1821014751","loc":[-85.5395255,42.0186304],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:44Z","tags":{}},"n1821014752":{"id":"n1821014752","loc":[-85.571378,42.0083176],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:45Z","tags":{}},"n1821014754":{"id":"n1821014754","loc":[-85.5541918,42.0113925],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:45Z","tags":{}},"n1821014755":{"id":"n1821014755","loc":[-85.5278029,42.0250806],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:45Z","tags":{}},"n1821014756":{"id":"n1821014756","loc":[-85.5936725,41.9827102],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:45Z","tags":{}},"n1821014757":{"id":"n1821014757","loc":[-85.5176266,42.0346677],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:45Z","tags":{}},"n1821014758":{"id":"n1821014758","loc":[-85.6096692,41.9714245],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:45Z","tags":{}},"n1821014759":{"id":"n1821014759","loc":[-85.5770321,42.0034266],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:45Z","tags":{}},"n1821014761":{"id":"n1821014761","loc":[-85.5988921,41.9779369],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:45Z","tags":{}},"n1821014762":{"id":"n1821014762","loc":[-85.5811788,42.0024499],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:45Z","tags":{}},"n1821014763":{"id":"n1821014763","loc":[-85.5154003,42.0381101],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:45Z","tags":{}},"n1821014764":{"id":"n1821014764","loc":[-85.5155827,42.0374089],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:45Z","tags":{}},"n1821014765":{"id":"n1821014765","loc":[-85.5891249,41.9884978],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:45Z","tags":{}},"n1821014766":{"id":"n1821014766","loc":[-85.5313863,42.0238293],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:45Z","tags":{}},"n1821014768":{"id":"n1821014768","loc":[-85.593297,41.9833363],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:45Z","tags":{}},"n1821014769":{"id":"n1821014769","loc":[-85.5849446,41.9957245],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:45Z","tags":{}},"n1821014770":{"id":"n1821014770","loc":[-85.5537774,42.0130847],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:45Z","tags":{}},"n1821014771":{"id":"n1821014771","loc":[-85.6111766,41.9706069],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:45Z","tags":{}},"n1821014772":{"id":"n1821014772","loc":[-85.5585477,42.008989],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:45Z","tags":{}},"n1821014774":{"id":"n1821014774","loc":[-85.5928142,41.9852623],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:46Z","tags":{}},"n1821014777":{"id":"n1821014777","loc":[-85.5891933,41.9882608],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:46Z","tags":{}},"n1821014778":{"id":"n1821014778","loc":[-85.5926909,41.9817532],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:46Z","tags":{}},"n1821014779":{"id":"n1821014779","loc":[-85.5260272,42.0252201],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:46Z","tags":{}},"n1821014781":{"id":"n1821014781","loc":[-85.5894615,41.9950468],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:46Z","tags":{}},"n1821014782":{"id":"n1821014782","loc":[-85.5461063,42.0143242],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:46Z","tags":{}},"n1821014783":{"id":"n1821014783","loc":[-85.5711527,42.0085886],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:46Z","tags":{}},"n1821014784":{"id":"n1821014784","loc":[-85.5329379,42.0218624],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:46Z","tags":{}},"n1821014786":{"id":"n1821014786","loc":[-85.583047,42.0020252],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:46Z","tags":{}},"n1821014787":{"id":"n1821014787","loc":[-85.5758962,42.0054095],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:46Z","tags":{}},"n1821014788":{"id":"n1821014788","loc":[-85.5626354,42.0077733],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:46Z","tags":{}},"n1821014789":{"id":"n1821014789","loc":[-85.6029852,41.9755999],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:46Z","tags":{}},"n1821014790":{"id":"n1821014790","loc":[-85.5892362,41.9886755],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:46Z","tags":{}},"n1821014791":{"id":"n1821014791","loc":[-85.5157597,42.0372017],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:46Z","tags":{}},"n1821014793":{"id":"n1821014793","loc":[-85.6054582,41.9751094],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:46Z","tags":{}},"n1821014794":{"id":"n1821014794","loc":[-85.5986936,41.9778412],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:46Z","tags":{}},"n1821014795":{"id":"n1821014795","loc":[-85.5880775,41.98976],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:46Z","tags":{}},"n1821014796":{"id":"n1821014796","loc":[-85.5858727,41.9963624],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:46Z","tags":{}},"n1821014798":{"id":"n1821014798","loc":[-85.5792543,42.0035958],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:46Z","tags":{}},"n1821014799":{"id":"n1821014799","loc":[-85.5921665,41.9838326],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:46Z","tags":{}},"n1821014801":{"id":"n1821014801","loc":[-85.599214,41.9782599],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:47Z","tags":{}},"n1821014802":{"id":"n1821014802","loc":[-85.5571905,42.0090967],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:47Z","tags":{}},"n1821014803":{"id":"n1821014803","loc":[-85.5426891,42.0173612],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:47Z","tags":{}},"n1821014804":{"id":"n1821014804","loc":[-85.5889626,41.9896404],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:47Z","tags":{}},"n1821014805":{"id":"n1821014805","loc":[-85.5491264,42.0141648],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:47Z","tags":{}},"n1821014806":{"id":"n1821014806","loc":[-85.5618897,42.0072631],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:47Z","tags":{}},"n1821014808":{"id":"n1821014808","loc":[-85.5573501,42.0109802],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:47Z","tags":{}},"n1821014809":{"id":"n1821014809","loc":[-85.5983463,41.9778031],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:47Z","tags":{}},"n1821014810":{"id":"n1821014810","loc":[-85.5885173,41.9895128],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:47Z","tags":{}},"n1821014811":{"id":"n1821014811","loc":[-85.6084998,41.9721143],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:47Z","tags":{}},"n1821014812":{"id":"n1821014812","loc":[-85.5737598,42.0056389],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:47Z","tags":{}},"n1821014814":{"id":"n1821014814","loc":[-85.5542173,42.0118132],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:47Z","tags":{}},"n1821014816":{"id":"n1821014816","loc":[-85.5277868,42.024451],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:47Z","tags":{}},"n1821014817":{"id":"n1821014817","loc":[-85.5403999,42.0191724],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:47Z","tags":{}},"n1821014819":{"id":"n1821014819","loc":[-85.5983879,41.9791452],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:47Z","tags":{}},"n1821014820":{"id":"n1821014820","loc":[-85.5891302,41.9897578],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:47Z","tags":{}},"n1821014822":{"id":"n1821014822","loc":[-85.5930731,41.9805108],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:47Z","tags":{}},"n1821014824":{"id":"n1821014824","loc":[-85.515395,42.0378471],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:47Z","tags":{}},"n1821014825":{"id":"n1821014825","loc":[-85.5352755,42.0205136],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:47Z","tags":{}},"n1821014826":{"id":"n1821014826","loc":[-85.5502744,42.0133398],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:47Z","tags":{}},"n1821014828":{"id":"n1821014828","loc":[-85.5701295,42.0088256],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:48Z","tags":{}},"n1821014830":{"id":"n1821014830","loc":[-85.5888929,41.9953099],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:48Z","tags":{}},"n1821014832":{"id":"n1821014832","loc":[-85.5880077,41.9901547],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:48Z","tags":{}},"n1821014833":{"id":"n1821014833","loc":[-85.5451192,42.0157072],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:48Z","tags":{}},"n1821014834":{"id":"n1821014834","loc":[-85.6096478,41.9711932],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:48Z","tags":{}},"n1821014835":{"id":"n1821014835","loc":[-85.5806424,42.0026532],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:48Z","tags":{}},"n1821014836":{"id":"n1821014836","loc":[-85.5911674,41.9868732],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:48Z","tags":{}},"n1821014838":{"id":"n1821014838","loc":[-85.5930302,41.9836571],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:48Z","tags":{}},"n1821014839":{"id":"n1821014839","loc":[-85.588925,41.9938148],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:48Z","tags":{}},"n1821014840":{"id":"n1821014840","loc":[-85.6111874,41.9705311],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:48Z","tags":{}},"n1821014841":{"id":"n1821014841","loc":[-85.5680843,42.0075842],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:48Z","tags":{}},"n1821014842":{"id":"n1821014842","loc":[-85.6012793,41.9775062],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:48Z","tags":{}},"n1821014843":{"id":"n1821014843","loc":[-85.5855562,41.9989777],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:48Z","tags":{}},"n1821014844":{"id":"n1821014844","loc":[-85.5506137,42.0131662],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:48Z","tags":{}},"n1821014845":{"id":"n1821014845","loc":[-85.5270049,42.025457],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:48Z","tags":{}},"n1821014846":{"id":"n1821014846","loc":[-85.5257054,42.025244],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:48Z","tags":{}},"n1821014847":{"id":"n1821014847","loc":[-85.6011184,41.9771832],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:48Z","tags":{}},"n1821014848":{"id":"n1821014848","loc":[-85.515534,42.0389234],"version":"2","changeset":"15306911","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-09T19:57:21Z","tags":{}},"n1821014850":{"id":"n1821014850","loc":[-85.5847032,42.0010347],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:48Z","tags":{}},"n1821014853":{"id":"n1821014853","loc":[-85.5361499,42.019063],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:49Z","tags":{}},"n1821014854":{"id":"n1821014854","loc":[-85.5439176,42.0165721],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:49Z","tags":{}},"n1821014855":{"id":"n1821014855","loc":[-85.5838825,42.0017284],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:49Z","tags":{}},"n1821014857":{"id":"n1821014857","loc":[-85.5542173,42.0122317],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:49Z","tags":{}},"n1821014859":{"id":"n1821014859","loc":[-85.5708201,42.0089195],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:49Z","tags":{}},"n1821014860":{"id":"n1821014860","loc":[-85.5844833,41.9954415],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:49Z","tags":{}},"n1821014862":{"id":"n1821014862","loc":[-85.5223204,42.0295396],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:49Z","tags":{}},"n1821014863":{"id":"n1821014863","loc":[-85.5777898,42.0035918],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:49Z","tags":{}},"n1821014864":{"id":"n1821014864","loc":[-85.591044,41.9898078],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:49Z","tags":{}},"n1821014865":{"id":"n1821014865","loc":[-85.5973204,41.980182],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:49Z","tags":{}},"n1821014866":{"id":"n1821014866","loc":[-85.5699578,42.0085825],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:49Z","tags":{}},"n1821014867":{"id":"n1821014867","loc":[-85.5210598,42.0305278],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:49Z","tags":{}},"n1821014868":{"id":"n1821014868","loc":[-85.5929108,41.9819008],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:49Z","tags":{}},"n1821014869":{"id":"n1821014869","loc":[-85.5279799,42.0242995],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:49Z","tags":{}},"n1821014870":{"id":"n1821014870","loc":[-85.5196114,42.0320539],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:49Z","tags":{}},"n1821014871":{"id":"n1821014871","loc":[-85.5785449,42.0040883],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:49Z","tags":{}},"n1821014872":{"id":"n1821014872","loc":[-85.588292,41.9895766],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:49Z","tags":{}},"n1821014873":{"id":"n1821014873","loc":[-85.5160172,42.0331775],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:49Z","tags":{}},"n1821014874":{"id":"n1821014874","loc":[-85.5688849,42.0077016],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:49Z","tags":{}},"n1821014876":{"id":"n1821014876","loc":[-85.5857976,41.9996036],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:50Z","tags":{}},"n1821014879":{"id":"n1821014879","loc":[-85.5990906,41.9780765],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:50Z","tags":{}},"n1821014881":{"id":"n1821014881","loc":[-85.5483647,42.0144279],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:50Z","tags":{}},"n1821014883":{"id":"n1821014883","loc":[-85.5691209,42.0077972],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:50Z","tags":{}},"n1821014885":{"id":"n1821014885","loc":[-85.6076844,41.9721103],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:50Z","tags":{}},"n1821014886":{"id":"n1821014886","loc":[-85.6015489,41.9766147],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:50Z","tags":{}},"n1821014887":{"id":"n1821014887","loc":[-85.574822,42.0052802],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:50Z","tags":{}},"n1821014888":{"id":"n1821014888","loc":[-85.5880024,41.9899593],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:50Z","tags":{}},"n1821014890":{"id":"n1821014890","loc":[-85.5909421,41.9893772],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:50Z","tags":{}},"n1821014892":{"id":"n1821014892","loc":[-85.5497326,42.0138141],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:50Z","tags":{}},"n1821014893":{"id":"n1821014893","loc":[-85.5167106,42.0357811],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:50Z","tags":{}},"n1821014895":{"id":"n1821014895","loc":[-85.5844404,41.9952501],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:50Z","tags":{}},"n1821014896":{"id":"n1821014896","loc":[-85.5362465,42.0192662],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:50Z","tags":{}},"n1821014898":{"id":"n1821014898","loc":[-85.5906095,41.9889147],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:50Z","tags":{}},"n1821014899":{"id":"n1821014899","loc":[-85.5590667,42.0089354],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:50Z","tags":{}},"n1821014900":{"id":"n1821014900","loc":[-85.5921598,41.9844209],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:50Z","tags":{}},"n1821014902":{"id":"n1821014902","loc":[-85.5778971,42.0039266],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:50Z","tags":{}},"n1821014903":{"id":"n1821014903","loc":[-85.603012,41.9761981],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:51Z","tags":{}},"n1821014904":{"id":"n1821014904","loc":[-85.6108977,41.9706787],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:51Z","tags":{}},"n1821014905":{"id":"n1821014905","loc":[-85.5685738,42.0076139],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:51Z","tags":{}},"n1821014906":{"id":"n1821014906","loc":[-85.5392787,42.0186304],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:51Z","tags":{}},"n1821014907":{"id":"n1821014907","loc":[-85.5227885,42.0274972],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:51Z","tags":{}},"n1821014908":{"id":"n1821014908","loc":[-85.5857547,41.9961431],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:51Z","tags":{}},"n1821014910":{"id":"n1821014910","loc":[-85.5610354,42.0072812],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:51Z","tags":{}},"n1821014911":{"id":"n1821014911","loc":[-85.5209632,42.0308705],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:51Z","tags":{}},"n1821014912":{"id":"n1821014912","loc":[-85.5709757,42.0087959],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:51Z","tags":{}},"n1821014913":{"id":"n1821014913","loc":[-85.59231,41.9839344],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:51Z","tags":{}},"n1821014914":{"id":"n1821014914","loc":[-85.5375245,42.0185865],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:51Z","tags":{}},"n1821014916":{"id":"n1821014916","loc":[-85.5901548,41.9839841],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:51Z","tags":{}},"n1821014917":{"id":"n1821014917","loc":[-85.5611213,42.0086405],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:51Z","tags":{}},"n1821014918":{"id":"n1821014918","loc":[-85.5360426,42.0198122],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:51Z","tags":{}},"n1821014919":{"id":"n1821014919","loc":[-85.5862817,41.9948691],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:51Z","tags":{}},"n1821014921":{"id":"n1821014921","loc":[-85.5469807,42.0144438],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:51Z","tags":{}},"n1821014922":{"id":"n1821014922","loc":[-85.5761309,42.0053838],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:51Z","tags":{}},"n1821014924":{"id":"n1821014924","loc":[-85.516264,42.0332971],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:51Z","tags":{}},"n1821014925":{"id":"n1821014925","loc":[-85.5277224,42.0246661],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:51Z","tags":{}},"n1821014926":{"id":"n1821014926","loc":[-85.5980016,41.9798231],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:51Z","tags":{}},"n1821014928":{"id":"n1821014928","loc":[-85.5924548,41.9806965],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:51Z","tags":{}},"n1821014930":{"id":"n1821014930","loc":[-85.5899121,41.985023],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:52Z","tags":{}},"n1821014931":{"id":"n1821014931","loc":[-85.5706015,42.0089492],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:52Z","tags":{}},"n1821014932":{"id":"n1821014932","loc":[-85.515926,42.033046],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:52Z","tags":{}},"n1821014933":{"id":"n1821014933","loc":[-85.5982377,41.9796796],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:52Z","tags":{}},"n1821014936":{"id":"n1821014936","loc":[-85.5475721,42.0145253],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:52Z","tags":{}},"n1821014938":{"id":"n1821014938","loc":[-85.5895701,41.9902323],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:52Z","tags":{}},"n1821014939":{"id":"n1821014939","loc":[-85.6030495,41.9759947],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:52Z","tags":{}},"n1821014942":{"id":"n1821014942","loc":[-85.6094721,41.9724989],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:52Z","tags":{}},"n1821014944":{"id":"n1821014944","loc":[-85.5921973,41.9811112],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:52Z","tags":{}},"n1821014945":{"id":"n1821014945","loc":[-85.5223526,42.0291332],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:52Z","tags":{}},"n1821014946":{"id":"n1821014946","loc":[-85.5965103,41.9808998],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:52Z","tags":{}},"n1821014948":{"id":"n1821014948","loc":[-85.517766,42.0349227],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:52Z","tags":{}},"n1821014950":{"id":"n1821014950","loc":[-85.5889894,41.990996],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:52Z","tags":{}},"n1821014951":{"id":"n1821014951","loc":[-85.5601932,42.0092902],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:52Z","tags":{}},"n1821014954":{"id":"n1821014954","loc":[-85.6028135,41.9764055],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:53Z","tags":{}},"n1821014955":{"id":"n1821014955","loc":[-85.5520621,42.0130666],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:53Z","tags":{}},"n1821014956":{"id":"n1821014956","loc":[-85.593002,41.9839344],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:53Z","tags":{}},"n1821014957":{"id":"n1821014957","loc":[-85.515926,42.0369666],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:53Z","tags":{}},"n1821014960":{"id":"n1821014960","loc":[-85.5761255,42.003877],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:53Z","tags":{}},"n1821014961":{"id":"n1821014961","loc":[-85.5716355,42.007911],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:53Z","tags":{}},"n1821014962":{"id":"n1821014962","loc":[-85.5575378,42.0109045],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:53Z","tags":{}},"n1821014963":{"id":"n1821014963","loc":[-85.5735667,42.0068188],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:53Z","tags":{}},"n1821014964":{"id":"n1821014964","loc":[-85.5915214,41.9865861],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:53Z","tags":{}},"n1821014965":{"id":"n1821014965","loc":[-85.5866344,41.9923157],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:53Z","tags":{}},"n1821014967":{"id":"n1821014967","loc":[-85.5283138,42.0242256],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:53Z","tags":{}},"n1821014968":{"id":"n1821014968","loc":[-85.5177875,42.0355801],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:53Z","tags":{}},"n1821014969":{"id":"n1821014969","loc":[-85.548071,42.0144934],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:53Z","tags":{}},"n1821014972":{"id":"n1821014972","loc":[-85.5611159,42.0088557],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:53Z","tags":{}},"n1821014973":{"id":"n1821014973","loc":[-85.541686,42.0188757],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:53Z","tags":{}},"n1821014974":{"id":"n1821014974","loc":[-85.5917628,41.9862631],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:53Z","tags":{}},"n1821014975":{"id":"n1821014975","loc":[-85.5854864,41.9959478],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:53Z","tags":{}},"n1821014977":{"id":"n1821014977","loc":[-85.609102,41.9722317],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:53Z","tags":{}},"n1821014980":{"id":"n1821014980","loc":[-85.5761202,42.0042438],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:54Z","tags":{}},"n1821014982":{"id":"n1821014982","loc":[-85.5465944,42.0143601],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:54Z","tags":{}},"n1821014983":{"id":"n1821014983","loc":[-85.5173261,42.0342732],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:54Z","tags":{}},"n1821014984":{"id":"n1821014984","loc":[-85.5897297,41.9888509],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:54Z","tags":{}},"n1821014985":{"id":"n1821014985","loc":[-85.5856688,41.999181],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:54Z","tags":{}},"n1821014986":{"id":"n1821014986","loc":[-85.5344011,42.0217251],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:54Z","tags":{}},"n1821014987":{"id":"n1821014987","loc":[-85.601467,41.9768203],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:54Z","tags":{}},"n1821014988":{"id":"n1821014988","loc":[-85.5457254,42.0165123],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:54Z","tags":{}},"n1821014989":{"id":"n1821014989","loc":[-85.6023482,41.9784332],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:54Z","tags":{}},"n1821014991":{"id":"n1821014991","loc":[-85.5361606,42.01823],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:54Z","tags":{}},"n1821014992":{"id":"n1821014992","loc":[-85.5178465,42.0351139],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:54Z","tags":{}},"n1821014995":{"id":"n1821014995","loc":[-85.5634293,42.0078092],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:54Z","tags":{}},"n1821014996":{"id":"n1821014996","loc":[-85.573497,42.0072015],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:54Z","tags":{}},"n1821014997":{"id":"n1821014997","loc":[-85.5976328,41.9799725],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:54Z","tags":{}},"n1821014998":{"id":"n1821014998","loc":[-85.5210651,42.0303166],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:54Z","tags":{}},"n1821015003":{"id":"n1821015003","loc":[-85.5222131,42.0288064],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:54Z","tags":{}},"n1821015004":{"id":"n1821015004","loc":[-85.5897941,41.984405],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:54Z","tags":{}},"n1821015005":{"id":"n1821015005","loc":[-85.5975725,41.9776099],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:54Z","tags":{}},"n1821015006":{"id":"n1821015006","loc":[-85.5765708,42.0034903],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:54Z","tags":{}},"n1821015007":{"id":"n1821015007","loc":[-85.5250187,42.026559],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:55Z","tags":{}},"n1821015009":{"id":"n1821015009","loc":[-85.5426998,42.0166279],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:55Z","tags":{}},"n1821015010":{"id":"n1821015010","loc":[-85.5957606,41.9806584],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:55Z","tags":{}},"n1821015011":{"id":"n1821015011","loc":[-85.5262753,42.0252497],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:55Z","tags":{}},"n1821015012":{"id":"n1821015012","loc":[-85.5266455,42.0253374],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:55Z","tags":{}},"n1821015014":{"id":"n1821015014","loc":[-85.5515632,42.0130187],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:55Z","tags":{}},"n1821015015":{"id":"n1821015015","loc":[-85.6024058,41.9765212],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:55Z","tags":{}},"n1821015017":{"id":"n1821015017","loc":[-85.5175032,42.0357156],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:55Z","tags":{}},"n1821015018":{"id":"n1821015018","loc":[-85.5302718,42.0236039],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:55Z","tags":{}},"n1821015019":{"id":"n1821015019","loc":[-85.6024005,41.9782759],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:55Z","tags":{}},"n1821015020":{"id":"n1821015020","loc":[-85.5907758,41.9890821],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:55Z","tags":{}},"n1821015021":{"id":"n1821015021","loc":[-85.6019445,41.9777215],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:55Z","tags":{}},"n1821015022":{"id":"n1821015022","loc":[-85.5942854,41.9800881],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:55Z","tags":{}},"n1821015024":{"id":"n1821015024","loc":[-85.5325826,42.0222711],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:55Z","tags":{}},"n1821015029":{"id":"n1821015029","loc":[-85.555093,42.0105316],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:56Z","tags":{}},"n1821015033":{"id":"n1821015033","loc":[-85.5249704,42.0270372],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:56Z","tags":{}},"n1821015034":{"id":"n1821015034","loc":[-85.5243965,42.0272205],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:56Z","tags":{}},"n1821015038":{"id":"n1821015038","loc":[-85.5413426,42.0190749],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:56Z","tags":{}},"n1821015039":{"id":"n1821015039","loc":[-85.5920431,41.9848175],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:56Z","tags":{}},"n1821015041":{"id":"n1821015041","loc":[-85.5577685,42.0106015],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:56Z","tags":{}},"n1821015042":{"id":"n1821015042","loc":[-85.5453606,42.0158866],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:56Z","tags":{}},"n1821015045":{"id":"n1821015045","loc":[-85.5333228,42.0217889],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:56Z","tags":{}},"n1821015046":{"id":"n1821015046","loc":[-85.5426891,42.0175924],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:56Z","tags":{}},"n1821015048":{"id":"n1821015048","loc":[-85.5886836,41.9936474],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:56Z","tags":{}},"n1821015050":{"id":"n1821015050","loc":[-85.6001152,41.9786467],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:56Z","tags":{}},"n1821015051":{"id":"n1821015051","loc":[-85.6094064,41.9723655],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:56Z","tags":{}},"n1821015053":{"id":"n1821015053","loc":[-85.605721,41.9749738],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:56Z","tags":{}},"n1821015055":{"id":"n1821015055","loc":[-85.6106791,41.9705048],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:56Z","tags":{}},"n1821015057":{"id":"n1821015057","loc":[-85.5210437,42.0307071],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:56Z","tags":{}},"n1821015059":{"id":"n1821015059","loc":[-85.5995694,41.9786725],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:56Z","tags":{}},"n1821015060":{"id":"n1821015060","loc":[-85.5371638,42.0182938],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:57Z","tags":{}},"n1821015062":{"id":"n1821015062","loc":[-85.6111766,41.9704593],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:57Z","tags":{}},"n1821015065":{"id":"n1821015065","loc":[-85.577704,42.0034921],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:57Z","tags":{}},"n1821015067":{"id":"n1821015067","loc":[-85.5570067,42.0093699],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:57Z","tags":{}},"n1821015068":{"id":"n1821015068","loc":[-85.5920364,41.9845525],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:57Z","tags":{}},"n1821015069":{"id":"n1821015069","loc":[-85.5252065,42.0253954],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:57Z","tags":{}},"n1821015072":{"id":"n1821015072","loc":[-85.5664159,42.0088517],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:57Z","tags":{}},"n1821015073":{"id":"n1821015073","loc":[-85.5880399,41.991905],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:57Z","tags":{}},"n1821015075":{"id":"n1821015075","loc":[-85.6099871,41.9727861],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:57Z","tags":{}},"n1821015076":{"id":"n1821015076","loc":[-85.5319603,42.0231478],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:57Z","tags":{}},"n1821015078":{"id":"n1821015078","loc":[-85.6036088,41.9751112],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:57Z","tags":{}},"n1821015080":{"id":"n1821015080","loc":[-85.5983128,41.9789179],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:57Z","tags":{}},"n1821015082":{"id":"n1821015082","loc":[-85.5614069,42.0071395],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:57Z","tags":{}},"n1821015083":{"id":"n1821015083","loc":[-85.60968,41.9709738],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:57Z","tags":{}},"n1821015086":{"id":"n1821015086","loc":[-85.5914195,41.9837351],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:57Z","tags":{}},"n1821015087":{"id":"n1821015087","loc":[-85.5895473,41.9948036],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:57Z","tags":{}},"n1821015090":{"id":"n1821015090","loc":[-85.5929913,41.9851905],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:57Z","tags":{}},"n1821015093":{"id":"n1821015093","loc":[-85.5907396,41.9838485],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:58Z","tags":{}},"n1821015095":{"id":"n1821015095","loc":[-85.5893864,41.9880176],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:58Z","tags":{}},"n1821015096":{"id":"n1821015096","loc":[-85.5788024,42.0039807],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:58Z","tags":{}},"n1821015097":{"id":"n1821015097","loc":[-85.5630592,42.0078411],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:58Z","tags":{}},"n1821015098":{"id":"n1821015098","loc":[-85.5350609,42.0211274],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:58Z","tags":{}},"n1821015099":{"id":"n1821015099","loc":[-85.5967195,41.9808679],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:58Z","tags":{}},"n1821015100":{"id":"n1821015100","loc":[-85.5666734,42.0088119],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:58Z","tags":{}},"n1821015101":{"id":"n1821015101","loc":[-85.564694,42.0077675],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:58Z","tags":{}},"n1821015103":{"id":"n1821015103","loc":[-85.6066544,41.9726527],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:58Z","tags":{}},"n1821015104":{"id":"n1821015104","loc":[-85.6011827,41.9769838],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:58Z","tags":{}},"n1821015105":{"id":"n1821015105","loc":[-85.5972131,41.9776697],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:58Z","tags":{}},"n1821015106":{"id":"n1821015106","loc":[-85.5880828,41.9903341],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:58Z","tags":{}},"n1821015107":{"id":"n1821015107","loc":[-85.5510268,42.0130626],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:58Z","tags":{}},"n1821015108":{"id":"n1821015108","loc":[-85.6102164,41.970543],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:58Z","tags":{}},"n1821015109":{"id":"n1821015109","loc":[-85.5905344,41.9853899],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:58Z","tags":{}},"n1821015111":{"id":"n1821015111","loc":[-85.5888821,41.9913429],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:58Z","tags":{}},"n1821015112":{"id":"n1821015112","loc":[-85.606295,41.9741921],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:59Z","tags":{}},"n1821015114":{"id":"n1821015114","loc":[-85.5969556,41.9807443],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:59Z","tags":{}},"n1821015115":{"id":"n1821015115","loc":[-85.5882223,41.9934081],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:59Z","tags":{}},"n1821015116":{"id":"n1821015116","loc":[-85.6104471,41.9724971],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:59Z","tags":{}},"n1821015118":{"id":"n1821015118","loc":[-85.5406091,42.0192162],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:59Z","tags":{}},"n1821015120":{"id":"n1821015120","loc":[-85.589955,41.9888429],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:59Z","tags":{}},"n1821015121":{"id":"n1821015121","loc":[-85.5598821,42.0092304],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:59Z","tags":{}},"n1821015122":{"id":"n1821015122","loc":[-85.545598,42.0144097],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:59Z","tags":{}},"n1821015123":{"id":"n1821015123","loc":[-85.5649528,42.0079965],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:59Z","tags":{}},"n1821015125":{"id":"n1821015125","loc":[-85.5883993,41.9917814],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:59Z","tags":{}},"n1821015126":{"id":"n1821015126","loc":[-85.5295785,42.0239967],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:59Z","tags":{}},"n1821015129":{"id":"n1821015129","loc":[-85.5648723,42.0078809],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:59Z","tags":{}},"n1821015132":{"id":"n1821015132","loc":[-85.564989,42.0081103],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:59Z","tags":{}},"n1821015133":{"id":"n1821015133","loc":[-85.5946127,41.9800841],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:59Z","tags":{}},"n1821015134":{"id":"n1821015134","loc":[-85.583448,42.0019078],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:59Z","tags":{}},"n1821015135":{"id":"n1821015135","loc":[-85.5905934,41.9871842],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:59Z","tags":{}},"n1821015137":{"id":"n1821015137","loc":[-85.610608,41.9704752],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:25:59Z","tags":{}},"n1821015138":{"id":"n1821015138","loc":[-85.5752257,42.0052939],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:26:00Z","tags":{}},"n1821015139":{"id":"n1821015139","loc":[-85.5893864,41.9943491],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:26:00Z","tags":{}},"n1821015140":{"id":"n1821015140","loc":[-85.5426247,42.0169866],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:26:00Z","tags":{}},"n1821015141":{"id":"n1821015141","loc":[-85.562001,42.0074526],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:26:00Z","tags":{}},"n1821015142":{"id":"n1821015142","loc":[-85.5212046,42.0301094],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:26:00Z","tags":{}},"n1821015143":{"id":"n1821015143","loc":[-85.602214,41.9784531],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:26:00Z","tags":{}},"n1821015144":{"id":"n1821015144","loc":[-85.5858687,41.9948293],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:26:00Z","tags":{}},"n1821015145":{"id":"n1821015145","loc":[-85.5608477,42.0074805],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:26:00Z","tags":{}},"n1821015146":{"id":"n1821015146","loc":[-85.5651607,42.0083614],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:26:00Z","tags":{}},"n1821015147":{"id":"n1821015147","loc":[-85.5288288,42.0242495],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:26:00Z","tags":{}},"n1821015149":{"id":"n1821015149","loc":[-85.5450334,42.0146989],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:26:00Z","tags":{}},"n1821015151":{"id":"n1821015151","loc":[-85.5578275,42.0092304],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:26:00Z","tags":{}},"n1821015154":{"id":"n1821015154","loc":[-85.6056634,41.9724511],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:26:00Z","tags":{}},"n1821015155":{"id":"n1821015155","loc":[-85.5902179,41.9852742],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:26:00Z","tags":{}},"n1821015156":{"id":"n1821015156","loc":[-85.5156256,42.0387157],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:26:00Z","tags":{}},"n1821015157":{"id":"n1821015157","loc":[-85.5734433,42.0059459],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:26:00Z","tags":{}},"n1821015158":{"id":"n1821015158","loc":[-85.6050773,41.9731273],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:26:00Z","tags":{}},"n1821015160":{"id":"n1821015160","loc":[-85.5223419,42.0275233],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:26:00Z","tags":{}},"n1821015163":{"id":"n1821015163","loc":[-85.6053562,41.972525],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:26:00Z","tags":{}},"n1821015164":{"id":"n1821015164","loc":[-85.5850412,41.9946082],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:26:00Z","tags":{}},"n1821015165":{"id":"n1821015165","loc":[-85.5359031,42.0186326],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:26:01Z","tags":{}},"n1821015166":{"id":"n1821015166","loc":[-85.5608745,42.0077635],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:26:01Z","tags":{}},"n1821015169":{"id":"n1821015169","loc":[-85.572876,42.0073189],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:26:01Z","tags":{}},"n1821015171":{"id":"n1821015171","loc":[-85.5875424,41.9919188],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:26:01Z","tags":{}},"n1821015172":{"id":"n1821015172","loc":[-85.5240116,42.0272581],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:26:01Z","tags":{}},"n1821015173":{"id":"n1821015173","loc":[-85.5318369,42.0236818],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:26:01Z","tags":{}},"n1821015174":{"id":"n1821015174","loc":[-85.566888,42.0086923],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:26:01Z","tags":{}},"n1821015175":{"id":"n1821015175","loc":[-85.5931522,41.9850669],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:26:01Z","tags":{}},"n1821015176":{"id":"n1821015176","loc":[-85.5604842,42.0093199],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:26:01Z","tags":{}},"n1821015177":{"id":"n1821015177","loc":[-85.5868168,41.9927543],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:26:01Z","tags":{}},"n1821015178":{"id":"n1821015178","loc":[-85.6052275,41.9732549],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:26:01Z","tags":{}},"n1821015179":{"id":"n1821015179","loc":[-85.5910118,41.9900431],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:26:01Z","tags":{}},"n1821015182":{"id":"n1821015182","loc":[-85.5610032,42.0082897],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:26:01Z","tags":{}},"n1821015183":{"id":"n1821015183","loc":[-85.5425443,42.0179431],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:26:01Z","tags":{}},"n1821015184":{"id":"n1821015184","loc":[-85.5843277,42.0014055],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:26:01Z","tags":{}},"n1821015186":{"id":"n1821015186","loc":[-85.5733307,42.0063564],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:26:01Z","tags":{}},"n1821015188":{"id":"n1821015188","loc":[-85.5277385,42.0248694],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:26:01Z","tags":{}},"n1821015189":{"id":"n1821015189","loc":[-85.5558427,42.0108168],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:26:01Z","tags":{}},"n1821015190":{"id":"n1821015190","loc":[-85.5650587,42.0082618],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:26:02Z","tags":{}},"n1821015191":{"id":"n1821015191","loc":[-85.5660351,42.0088278],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:26:02Z","tags":{}},"n1821015192":{"id":"n1821015192","loc":[-85.5849768,41.9980049],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:26:02Z","tags":{}},"n1821015194":{"id":"n1821015194","loc":[-85.5359139,42.0188199],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:26:02Z","tags":{}},"n1821015195":{"id":"n1821015195","loc":[-85.593238,41.9849194],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:26:02Z","tags":{}},"n1821015197":{"id":"n1821015197","loc":[-85.5850841,41.9983239],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:26:02Z","tags":{}},"n1821015199":{"id":"n1821015199","loc":[-85.5983396,41.9794283],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:26:02Z","tags":{}},"n1821015204":{"id":"n1821015204","loc":[-85.5452801,42.0145355],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:26:02Z","tags":{}},"n1821015205":{"id":"n1821015205","loc":[-85.5340685,42.0218407],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:26:02Z","tags":{}},"n1821015207":{"id":"n1821015207","loc":[-85.5773272,42.0034186],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:26:02Z","tags":{}},"n1821015209":{"id":"n1821015209","loc":[-85.5535212,42.0132419],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:26:02Z","tags":{}},"n1821015211":{"id":"n1821015211","loc":[-85.6107703,41.9706045],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:26:02Z","tags":{}},"n1821015212":{"id":"n1821015212","loc":[-85.6030066,41.9758193],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:26:03Z","tags":{}},"n1821015213":{"id":"n1821015213","loc":[-85.5359943,42.0184213],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:26:03Z","tags":{}},"n1821015214":{"id":"n1821015214","loc":[-85.5922993,41.9813305],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:26:03Z","tags":{}},"n1821015215":{"id":"n1821015215","loc":[-85.5672689,42.0080465],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:26:03Z","tags":{}},"n1821015217":{"id":"n1821015217","loc":[-85.5160494,42.0365682],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:26:03Z","tags":{}},"n1821015218":{"id":"n1821015218","loc":[-85.5401142,42.0190351],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:26:03Z","tags":{}},"n1821015219":{"id":"n1821015219","loc":[-85.5607632,42.0092282],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:26:03Z","tags":{}},"n1821015220":{"id":"n1821015220","loc":[-85.5866197,41.9947894],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:26:03Z","tags":{}},"n1821015221":{"id":"n1821015221","loc":[-85.6017889,41.9765132],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:26:03Z","tags":{}},"n1821015222":{"id":"n1821015222","loc":[-85.5595978,42.009059],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:26:03Z","tags":{}},"n1821015226":{"id":"n1821015226","loc":[-85.5871494,41.9929018],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:26:03Z","tags":{}},"n1821015227":{"id":"n1821015227","loc":[-85.5857708,41.9998866],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:26:03Z","tags":{}},"n1821015228":{"id":"n1821015228","loc":[-85.5317135,42.0238094],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:26:03Z","tags":{}},"n1821015231":{"id":"n1821015231","loc":[-85.5733521,42.0061372],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:26:03Z","tags":{}},"n1821015233":{"id":"n1821015233","loc":[-85.5855991,42.0001936],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:26:03Z","tags":{}},"n1821015234":{"id":"n1821015234","loc":[-85.5213924,42.029962],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:26:03Z","tags":{}},"n1821015235":{"id":"n1821015235","loc":[-85.6052221,41.9726567],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:26:03Z","tags":{}},"n1821015236":{"id":"n1821015236","loc":[-85.5763723,42.0035422],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:26:03Z","tags":{}},"n1821015237":{"id":"n1821015237","loc":[-85.5858512,41.9966215],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:26:03Z","tags":{}},"n1821015238":{"id":"n1821015238","loc":[-85.567061,42.008439],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:26:03Z","tags":{}},"n1821015239":{"id":"n1821015239","loc":[-85.5250563,42.0269057],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:26:04Z","tags":{}},"n1821015240":{"id":"n1821015240","loc":[-85.5347551,42.0214263],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:26:04Z","tags":{}},"n1821015241":{"id":"n1821015241","loc":[-85.6098463,41.9707066],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:26:04Z","tags":{}},"n1821015242":{"id":"n1821015242","loc":[-85.5676927,42.0076519],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:26:04Z","tags":{}},"n1821015243":{"id":"n1821015243","loc":[-85.516775,42.0322669],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:26:04Z","tags":{}},"n1821015244":{"id":"n1821015244","loc":[-85.5762275,42.0036538],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:26:04Z","tags":{}},"n1821015245":{"id":"n1821015245","loc":[-85.5583639,42.0090949],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:26:04Z","tags":{}},"n1821015246":{"id":"n1821015246","loc":[-85.5554041,42.0106432],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:26:04Z","tags":{}},"n1821015247":{"id":"n1821015247","loc":[-85.5973364,41.9776099],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:26:04Z","tags":{}},"n1821015248":{"id":"n1821015248","loc":[-85.6098945,41.9717513],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:26:04Z","tags":{}},"n1821015249":{"id":"n1821015249","loc":[-85.6045315,41.9751511],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:26:04Z","tags":{}},"n1821015250":{"id":"n1821015250","loc":[-85.5579938,42.0092264],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:26:04Z","tags":{}},"n1821015253":{"id":"n1821015253","loc":[-85.6058873,41.9724652],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:26:04Z","tags":{}},"n1821015254":{"id":"n1821015254","loc":[-85.5869456,41.9947517],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:26:04Z","tags":{}},"n1821015255":{"id":"n1821015255","loc":[-85.5936565,41.9823713],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:26:04Z","tags":{}},"n1821015256":{"id":"n1821015256","loc":[-85.5218269,42.0278102],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:26:04Z","tags":{}},"n1821015258":{"id":"n1821015258","loc":[-85.5887802,41.9905534],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:26:04Z","tags":{}},"n1821015259":{"id":"n1821015259","loc":[-85.5901924,41.9904515],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:26:04Z","tags":{}},"n1821015263":{"id":"n1821015263","loc":[-85.5249222,42.0255787],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:26:04Z","tags":{}},"n1821015265":{"id":"n1821015265","loc":[-85.5175206,42.0321672],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:26:04Z","tags":{}},"n1821015266":{"id":"n1821015266","loc":[-85.5275722,42.0254034],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:26:04Z","tags":{}},"n1821015267":{"id":"n1821015267","loc":[-85.6016226,41.9765451],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:26:04Z","tags":{}},"n1821015269":{"id":"n1821015269","loc":[-85.5569316,42.011032],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:26:05Z","tags":{}},"n1821015271":{"id":"n1821015271","loc":[-85.6010714,41.9785209],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:26:05Z","tags":{}},"n1821015272":{"id":"n1821015272","loc":[-85.6050666,41.9729917],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:26:05Z","tags":{}},"n1821015273":{"id":"n1821015273","loc":[-85.5891235,41.99529],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:26:05Z","tags":{}},"n1821015274":{"id":"n1821015274","loc":[-85.515454,42.0376439],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:26:05Z","tags":{}},"n1821015276":{"id":"n1821015276","loc":[-85.5776021,42.0034443],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:26:05Z","tags":{}},"n1821015277":{"id":"n1821015277","loc":[-85.6041707,41.9751453],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:26:05Z","tags":{}},"n1821015278":{"id":"n1821015278","loc":[-85.5444701,42.0167435],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:26:05Z","tags":{}},"n1821015280":{"id":"n1821015280","loc":[-85.5923274,41.9852202],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:26:05Z","tags":{}},"n1821015283":{"id":"n1821015283","loc":[-85.5893649,41.9900271],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:26:05Z","tags":{}},"n1821015284":{"id":"n1821015284","loc":[-85.5933453,41.9804412],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:26:05Z","tags":{}},"n1821015285":{"id":"n1821015285","loc":[-85.5247237,42.026017],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:26:05Z","tags":{}},"n1821015286":{"id":"n1821015286","loc":[-85.5286182,42.0242477],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:26:05Z","tags":{}},"n1821015287":{"id":"n1821015287","loc":[-85.5904003,41.9888549],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:26:05Z","tags":{}},"n1821015288":{"id":"n1821015288","loc":[-85.6062146,41.9739369],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:26:06Z","tags":{}},"n1821015290":{"id":"n1821015290","loc":[-85.5762596,42.0052602],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:26:06Z","tags":{}},"n1821015292":{"id":"n1821015292","loc":[-85.5849715,41.9975465],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:26:06Z","tags":{}},"n1821015293":{"id":"n1821015293","loc":[-85.585229,42.0006241],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:26:06Z","tags":{}},"n1821015294":{"id":"n1821015294","loc":[-85.5926922,41.9805946],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:26:06Z","tags":{}},"n1821015295":{"id":"n1821015295","loc":[-85.5703387,42.0089133],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:26:06Z","tags":{}},"n1821015299":{"id":"n1821015299","loc":[-85.5789955,42.0038611],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:26:06Z","tags":{}},"n1821015301":{"id":"n1821015301","loc":[-85.6072888,41.9721918],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:26:06Z","tags":{}},"n1821015302":{"id":"n1821015302","loc":[-85.5356349,42.0200992],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:26:06Z","tags":{}},"n1821015304":{"id":"n1821015304","loc":[-85.5891772,41.994066],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:26:06Z","tags":{}},"n1821015306":{"id":"n1821015306","loc":[-85.606295,41.9744952],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:26:06Z","tags":{}},"n1821015307":{"id":"n1821015307","loc":[-85.538871,42.0186583],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:26:06Z","tags":{}},"n1821015308":{"id":"n1821015308","loc":[-85.587997,41.994971],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:26:06Z","tags":{}},"n1821015311":{"id":"n1821015311","loc":[-85.606869,41.9725809],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:26:06Z","tags":{}},"n1821015312":{"id":"n1821015312","loc":[-85.5171974,42.0339943],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:26:07Z","tags":{}},"n1821015314":{"id":"n1821015314","loc":[-85.5327435,42.0220479],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:26:07Z","tags":{}},"n1821015315":{"id":"n1821015315","loc":[-85.5383439,42.0187282],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:26:07Z","tags":{}},"n1821015316":{"id":"n1821015316","loc":[-85.5248095,42.0263119],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:26:07Z","tags":{}},"n1821015318":{"id":"n1821015318","loc":[-85.5732502,42.0073051],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:26:07Z","tags":{}},"n1821015319":{"id":"n1821015319","loc":[-85.5924226,41.9852663],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:26:07Z","tags":{}},"n1821015321":{"id":"n1821015321","loc":[-85.5179001,42.0353052],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:26:07Z","tags":{}},"n1821015322":{"id":"n1821015322","loc":[-85.5456771,42.0162413],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:26:07Z","tags":{}},"n1821015323":{"id":"n1821015323","loc":[-85.5936618,41.9829096],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:26:07Z","tags":{}},"n1821015325":{"id":"n1821015325","loc":[-85.5656931,42.0086582],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:26:07Z","tags":{}},"n1821015326":{"id":"n1821015326","loc":[-85.5448456,42.0150975],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:26:07Z","tags":{}},"n1821015327":{"id":"n1821015327","loc":[-85.5220039,42.027615],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:26:07Z","tags":{}},"n1821015329":{"id":"n1821015329","loc":[-85.517884,42.0354885],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:26:07Z","tags":{}},"n1821015330":{"id":"n1821015330","loc":[-85.5576666,42.0101671],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:26:07Z","tags":{}},"n1821015332":{"id":"n1821015332","loc":[-85.5368754,42.0181402],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:26:07Z","tags":{}},"n1821015333":{"id":"n1821015333","loc":[-85.5367078,42.0181145],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:26:07Z","tags":{}},"n1821015334":{"id":"n1821015334","loc":[-85.5903909,41.9904316],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:26:07Z","tags":{}},"n1821015335":{"id":"n1821015335","loc":[-85.5430767,42.0163587],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:26:07Z","tags":{}},"n1821015336":{"id":"n1821015336","loc":[-85.5277492,42.0252878],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:26:07Z","tags":{}},"n1821015337":{"id":"n1821015337","loc":[-85.5312146,42.0236898],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:26:07Z","tags":{}},"n1821015338":{"id":"n1821015338","loc":[-85.5886568,41.991614],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:26:08Z","tags":{}},"n1821015339":{"id":"n1821015339","loc":[-85.5782498,42.0040883],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:26:08Z","tags":{}},"n1821015341":{"id":"n1821015341","loc":[-85.562233,42.0076457],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:26:08Z","tags":{}},"n1821015342":{"id":"n1821015342","loc":[-85.588626,41.9952479],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:26:08Z","tags":{}},"n1821015343":{"id":"n1821015343","loc":[-85.5762865,42.005033],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:26:08Z","tags":{}},"n1821015344":{"id":"n1821015344","loc":[-85.5850841,41.9971478],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:26:08Z","tags":{}},"n1821015346":{"id":"n1821015346","loc":[-85.5643144,42.0076936],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:26:08Z","tags":{}},"n1821015347":{"id":"n1821015347","loc":[-85.5164893,42.0359467],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:26:08Z","tags":{}},"n1821015348":{"id":"n1821015348","loc":[-85.5906846,41.9903541],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:26:08Z","tags":{}},"n1821015349":{"id":"n1821015349","loc":[-85.557688,42.0107769],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:26:08Z","tags":{}},"n1821015350":{"id":"n1821015350","loc":[-85.5363698,42.0181424],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:26:08Z","tags":{}},"n1821015351":{"id":"n1821015351","loc":[-85.5939636,41.9801918],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:26:08Z","tags":{}},"n1821015352":{"id":"n1821015352","loc":[-85.5524041,42.0131644],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:26:08Z","tags":{}},"n1821015354":{"id":"n1821015354","loc":[-85.5308606,42.0236221],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:26:08Z","tags":{}},"n1821015355":{"id":"n1821015355","loc":[-85.5877449,41.9932367],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:26:08Z","tags":{}},"n1821015356":{"id":"n1821015356","loc":[-85.519885,42.0318586],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:26:08Z","tags":{}},"n1821015357":{"id":"n1821015357","loc":[-85.5454035,42.0168431],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:26:08Z","tags":{}},"n1821015358":{"id":"n1821015358","loc":[-85.5970629,41.9781881],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:26:08Z","tags":{}},"n1821015359":{"id":"n1821015359","loc":[-85.5932541,41.9844767],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:26:08Z","tags":{}},"n1821015360":{"id":"n1821015360","loc":[-85.5970736,41.9778252],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:26:08Z","tags":{}},"n1821015361":{"id":"n1821015361","loc":[-85.537031,42.0181601],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:26:08Z","tags":{}},"n1821015362":{"id":"n1821015362","loc":[-85.5548355,42.0105156],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:26:08Z","tags":{}},"n1821015363":{"id":"n1821015363","loc":[-85.5168648,42.0336158],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:26:08Z","tags":{}},"n1821015365":{"id":"n1821015365","loc":[-85.5870435,41.9919507],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:26:09Z","tags":{}},"n1821015366":{"id":"n1821015366","loc":[-85.5719681,42.0075443],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:26:09Z","tags":{}},"n1821015367":{"id":"n1821015367","loc":[-85.5969985,41.9780446],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:26:09Z","tags":{}},"n1821015368":{"id":"n1821015368","loc":[-85.5926761,41.98528],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:26:09Z","tags":{}},"n1821015369":{"id":"n1821015369","loc":[-85.5224009,42.0293444],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:26:09Z","tags":{}},"n1821015371":{"id":"n1821015371","loc":[-85.518737,42.0322651],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:26:09Z","tags":{}},"n1821015372":{"id":"n1821015372","loc":[-85.6064573,41.9726465],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:26:09Z","tags":{}},"n1821015373":{"id":"n1821015373","loc":[-85.5201103,42.0313088],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:26:09Z","tags":{}},"n1821015375":{"id":"n1821015375","loc":[-85.5378182,42.0186844],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:26:09Z","tags":{}},"n1821015376":{"id":"n1821015376","loc":[-85.6109741,41.9706882],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:26:09Z","tags":{}},"n1821015377":{"id":"n1821015377","loc":[-85.5993333,41.9785488],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:26:09Z","tags":{}},"n1821015378":{"id":"n1821015378","loc":[-85.5889787,41.9907368],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:26:09Z","tags":{}},"n1821015380":{"id":"n1821015380","loc":[-85.6060161,41.9737375],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:26:09Z","tags":{}},"n1821015381":{"id":"n1821015381","loc":[-85.5743016,42.0053679],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:26:09Z","tags":{}},"n1821015382":{"id":"n1821015382","loc":[-85.6014724,41.9776099],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:26:09Z","tags":{}},"n1821015383":{"id":"n1821015383","loc":[-85.5574426,42.0091644],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:26:09Z","tags":{}},"n1821015385":{"id":"n1821015385","loc":[-85.5208613,42.0309302],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:26:10Z","tags":{}},"n1821015386":{"id":"n1821015386","loc":[-85.5919023,41.9837789],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:26:10Z","tags":{}},"n1821015387":{"id":"n1821015387","loc":[-85.5455484,42.0160221],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:26:10Z","tags":{}},"n1821015392":{"id":"n1821015392","loc":[-85.5801757,42.0028964],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:26:10Z","tags":{}},"n1821015395":{"id":"n1821015395","loc":[-85.5493785,42.0139974],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:26:10Z","tags":{}},"n1821015396":{"id":"n1821015396","loc":[-85.5449475,42.015488],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:26:10Z","tags":{}},"n1821015398":{"id":"n1821015398","loc":[-85.611123,41.9706627],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:26:10Z","tags":{}},"n1821015400":{"id":"n1821015400","loc":[-85.5935706,41.9822477],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:26:10Z","tags":{}},"n1821015401":{"id":"n1821015401","loc":[-85.5724254,42.0073508],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:26:10Z","tags":{}},"n1821015403":{"id":"n1821015403","loc":[-85.5486812,42.0143442],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:26:10Z","tags":{}},"n1821015404":{"id":"n1821015404","loc":[-85.5161835,42.0327711],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:26:11Z","tags":{}},"n1821015406":{"id":"n1821015406","loc":[-85.5921705,41.9851107],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:26:11Z","tags":{}},"n1821015407":{"id":"n1821015407","loc":[-85.531912,42.0234069],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:26:11Z","tags":{}},"n1821015410":{"id":"n1821015410","loc":[-85.5292566,42.024176],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:26:11Z","tags":{}},"n1821015411":{"id":"n1821015411","loc":[-85.5845316,41.9948315],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:26:11Z","tags":{}},"n1821015413":{"id":"n1821015413","loc":[-85.5217947,42.0280413],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:26:11Z","tags":{}},"n1821015414":{"id":"n1821015414","loc":[-85.5527367,42.013272],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:26:11Z","tags":{}},"n1821015415":{"id":"n1821015415","loc":[-85.5191179,42.0321973],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:26:11Z","tags":{}},"n1821015416":{"id":"n1821015416","loc":[-85.5540241,42.0128655],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:26:11Z","tags":{}},"n1821015418":{"id":"n1821015418","loc":[-85.5272892,42.0254849],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:26:11Z","tags":{}},"n1821015419":{"id":"n1821015419","loc":[-85.5449744,42.016867],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:26:11Z","tags":{}},"n1821015420":{"id":"n1821015420","loc":[-85.5852665,41.9986787],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:26:11Z","tags":{}},"n1821015421":{"id":"n1821015421","loc":[-85.6102701,41.972186],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:26:11Z","tags":{}},"n1821015423":{"id":"n1821015423","loc":[-85.6026365,41.9764972],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:26:11Z","tags":{}},"n1821015427":{"id":"n1821015427","loc":[-85.5898692,41.9841498],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:26:11Z","tags":{}},"n1821015429":{"id":"n1821015429","loc":[-85.5422546,42.0183855],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:26:12Z","tags":{}},"n1821015430":{"id":"n1821015430","loc":[-85.5866505,41.9925549],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:26:12Z","tags":{}},"n1821015431":{"id":"n1821015431","loc":[-85.5234376,42.0273577],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:26:12Z","tags":{}},"n1821015432":{"id":"n1821015432","loc":[-85.6096746,41.9727284],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:26:12Z","tags":{}},"n1821015433":{"id":"n1821015433","loc":[-85.5824891,42.0021567],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:26:12Z","tags":{}},"n1821015434":{"id":"n1821015434","loc":[-85.5923905,41.9841139],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:26:12Z","tags":{}},"n1821015435":{"id":"n1821015435","loc":[-85.5874565,41.9948014],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:26:12Z","tags":{}},"n1821015437":{"id":"n1821015437","loc":[-85.6055279,41.9734423],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:26:12Z","tags":{}},"n1821015438":{"id":"n1821015438","loc":[-85.5299379,42.0237376],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:26:12Z","tags":{}},"n1821015439":{"id":"n1821015439","loc":[-85.5155022,42.0383651],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:26:12Z","tags":{}},"n1821015442":{"id":"n1821015442","loc":[-85.527422,42.0254711],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:26:12Z","tags":{}},"n1821015443":{"id":"n1821015443","loc":[-85.5920699,41.9849291],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:26:12Z","tags":{}},"n1821015444":{"id":"n1821015444","loc":[-85.5639711,42.0077494],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:26:12Z","tags":{}},"n1821015445":{"id":"n1821015445","loc":[-85.5162586,42.0361777],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:26:12Z","tags":{}},"n1821015446":{"id":"n1821015446","loc":[-85.5220039,42.029695],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:26:12Z","tags":{}},"n1821015448":{"id":"n1821015448","loc":[-85.5176641,42.0356956],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:26:12Z","tags":{}},"n1821015449":{"id":"n1821015449","loc":[-85.5930556,41.9841577],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:26:12Z","tags":{}},"n1821015451":{"id":"n1821015451","loc":[-85.5320783,42.0228848],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:26:12Z","tags":{}},"n1821015452":{"id":"n1821015452","loc":[-85.5170096,42.0357235],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:26:12Z","tags":{}},"n1821015453":{"id":"n1821015453","loc":[-85.5571355,42.009613],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:26:12Z","tags":{}},"n1821015454":{"id":"n1821015454","loc":[-85.5609979,42.009059],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:26:12Z","tags":{}},"n1821015455":{"id":"n1821015455","loc":[-85.6097336,41.9708342],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:26:12Z","tags":{}},"n1821015456":{"id":"n1821015456","loc":[-85.5884476,41.9904218],"version":"1","changeset":"12181249","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-11T02:26:12Z","tags":{}},"w170843846":{"id":"w170843846","version":"1","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:59:03Z","tags":{"source":"Bing","waterway":"river"},"nodes":["n1819790555","n1819790762","n1819790547","n1819790618","n1819790898","n1819790796","n1819790534","n1819790543","n1819790541","n1819790687","n1819790877","n1819790811","n1819790670"]},"w209083541":{"id":"w209083541","version":"1","changeset":"15306846","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-03-09T19:50:46Z","tags":{"name":"Portage River","source":"Bing","waterway":"river"},"nodes":["n1821014848","n1821015156","n1821015439","n1821014763","n1821014824","n1821015274","n1821014764","n1821014791","n1821014957","n1821015217","n1821015445","n1821015347","n1821014893","n1821015452","n1821015017","n1821015448","n1821014968","n1821015329","n1821015321","n1821014992","n1821014948","n1821014757","n1821014983","n1821015312","n1821015363","n1821014924","n1821014873","n1821014932","n1821014668","n1821015404","n1821014716","n1821015243","n1821015265","n1821014710","n1821015371","n1821015415","n1821014870","n1821015356","n1821015373","n1821014681","n1821014714","n1821015385","n1821014911","n1821015057","n1821014867","n1821014998","n1821015142","n1821015234","n1821015446","n1821014862","n1821015369","n1821014945","n1821015003","n1821014667","n1821015413","n1821015256","n1821015327","n1821015160","n1821014907","n1821015431","n1821015172","n1821015034","n1821014741","n1821015033","n1821015239","n1821015007","n1821015316","n1821015285","n1821014633","n1821015263","n1821015069","n1821014846","n1821014779","n1821015011","n1821015012","n1821014845","n1821015418","n1821015442","n1821015266","n1821015336","n1821014755","n1821015188","n1821014925","n1821014816","n1821014869","n1821014967","n1821015286","n1821015147","n1821015410","n1821015126","n1821015438","n1821015018","n1821015354","n1821015337","n1821014766","n1821014740","n1821015228","n1821015173","n1821015407","n1821015076","n1821015451","n1821015024","n1821015314","n1821014784","n1821015045","n1821014735","n1821015205","n1821014986","n1821015240","n1821015098","n1821014825","n1821015302","n1821014918","n1821014718","n1821014896","n1821014853","n1821015194","n1821015165","n1821015213","n1821014991","n1821015350","n1821015333","n1821015332","n1821015361","n1821015060","n1821014914","n1821015375","n1821015315","n1821015307","n1821014906","n1821014751","n1821014666","n1821015218","n1821014817","n1821015118","n1821014674","n1821015038","n1821014973","n1821015429","n1821015183","n1821015046","n1821014803","n1821015140","n1821015009","n1821014749","n1821015335","n1821014711","n1821014854","n1821015278","n1821015419","n1821014648","n1821015357","n1821014637","n1821014988","n1821015322","n1821015387","n1821015042","n1821014833","n1821015396","n1821015326","n1821014691","n1821015149","n1821015204","n1821015122","n1821014782","n1821014982","n1821014921","n1821014936","n1821014969","n1821014881","n1821015403","n1821014805","n1821015395","n1821014892","n1821014826","n1821014844","n1821015107","n1821015014","n1821014955","n1821015352","n1821015414","n1821014746","n1821015209","n1821014770","n1821015416","n1821014661","n1821014857","n1821014814","n1821014754","n1821014721","n1821014727","n1821015362","n1821015029","n1821015246","n1821015189","n1821014627","n1821015269","n1821014808","n1821014962","n1821015349","n1821015041","n1821014722","n1821015330","n1821015453","n1821015067","n1821014643","n1821014802","n1821015383","n1821015151","n1821015250","n1821015245","n1821014772","n1821014899","n1821015222","n1821015121","n1821014951","n1821015176","n1821015219","n1821015454","n1821014972","n1821014917","n1821015182","n1821015166","n1821015145","n1821014910","n1821015082","n1821014678","n1821014806","n1821015141","n1821015341","n1821014788","n1821015097","n1821014995","n1821015444","n1821015346","n1821015101","n1821015129","n1821015123","n1821015132","n1821015190","n1821015146","n1821015325","n1821015191","n1821015072","n1821015100","n1821015174","n1821015238","n1821015215","n1821014700","n1821015242","n1821014841","n1821014905","n1821014874","n1821014883","n1821014729","n1821014866","n1821014828","n1821015295","n1821014931","n1821014859","n1821014912","n1821014783","n1821014752","n1821014961","n1821015366","n1821015401","n1821015169","n1821015318","n1821014996","n1821014747","n1821014963","n1821014670","n1821015186","n1821015231","n1821015157","n1821014812","n1821015381","n1821014887","n1821015138","n1821014704","n1821014787","n1821014922","n1821015290","n1821015343","n1821014651","n1821014980","n1821014960","n1821015244","n1821015236","n1821015006","n1821014694","n1821014759","n1821015207","n1821015276","n1821015065","n1821014863","n1821014660","n1821014902","n1821014645","n1821015339","n1821014871","n1821015096","n1821015299","n1821014798","n1821014638","n1821015392","n1821014835","n1821014762","n1821014642","n1821015433","n1821014786","n1821015134","n1821014855","n1821015184","n1821014850","n1821015293","n1821015233","n1821015227","n1821014876","n1821014985","n1821014843","n1821015420","n1821015197","n1821015192","n1821015292","n1821015344","n1821014742","n1821014726","n1821015237","n1821014796","n1821014908","n1821014975","n1821014769","n1821014688","n1821014860","n1821014895","n1821014676","n1821015411","n1821014736","n1821015164","n1821014647","n1821015144","n1821014919","n1821015220","n1821015254","n1821015435","n1821015308","n1821015342","n1821014830","n1821015273","n1821014658","n1821014781","n1821015087","n1821015139","n1821015304","n1821014839","n1821015048","n1821015115","n1821015355","n1821015226","n1821015177","n1821015430","n1821014965","n1821014725","n1821015365","n1821015171","n1821015073","n1821015125","n1821015338","n1821015111","n1821014950","n1821015378","n1821015258","n1821015456","n1821015106","n1821014832","n1821014888","n1821014795","n1821014872","n1821014810","n1821014705","n1821014804","n1821014820","n1821015283","n1821014938","n1821014689","n1821015259","n1821015334","n1821015348","n1821014635","n1821015179","n1821014864","n1821014890","n1821015020","n1821014898","n1821015287","n1821015120","n1821014984","n1821014743","n1821014790","n1821014765","n1821014777","n1821015095","n1821014653","n1821015135","n1821014836","n1821014964","n1821014974","n1821014636","n1821014682","n1821014663","n1821014665","n1821015109","n1821015155","n1821014930","n1821014669","n1821015004","n1821015427","n1821014916","n1821015093","n1821015086","n1821015386","n1821014799","n1821014913","n1821015434","n1821014728","n1821014900","n1821015068","n1821015039","n1821015443","n1821015406","n1821015280","n1821015319","n1821015368","n1821014774","n1821015090","n1821015175","n1821015195","n1821014687","n1821015359","n1821015449","n1821014956","n1821014838","n1821014768","n1821014698","n1821015323","n1821014756","n1821015255","n1821015400","n1821014717","n1821014868","n1821014778","n1821015214","n1821014944","n1821014697","n1821014671","n1821014928","n1821015294","n1821014822","n1821015284","n1821015351","n1821015022","n1821015133","n1821014644","n1821015010","n1821014625","n1821014657","n1821014946","n1821015099","n1821015114","n1821014629","n1821014865","n1821014997","n1821014926","n1821014933","n1821015199","n1821014819","n1821015080","n1821014692","n1821014677","n1821015358","n1821015367","n1821015360","n1821015105","n1821015247","n1821015005","n1821014809","n1821014794","n1821014761","n1821014879","n1821014801","n1821015377","n1821015059","n1821014730","n1821015050","n1821015271","n1821015143","n1821014989","n1821015019","n1821014672","n1821014649","n1821014684","n1821014703","n1821015021","n1821015382","n1821014842","n1821014720","n1821014847","n1821015104","n1821014987","n1821014886","n1821015267","n1821015221","n1821015015","n1821015423","n1821014954","n1821014903","n1821014939","n1821015212","n1821014789","n1821014712","n1821014708","n1821015078","n1821015277","n1821015249","n1821014646","n1821014793","n1821015053","n1821014707","n1821015306","n1821015112","n1821015288","n1821015380","n1821015437","n1821015178","n1821015158","n1821015272","n1821015235","n1821015163","n1821015154","n1821015253","n1821014632","n1821015372","n1821015103","n1821015311","n1821015301","n1821014885","n1821014811","n1821014977","n1821015051","n1821014942","n1821014745","n1821015432","n1821015075","n1821014664","n1821014695","n1821015116","n1821014639","n1821015421","n1821015248","n1821014758","n1821014834","n1821015083","n1821015455","n1821015241","n1821015108","n1821014713","n1821015137","n1821015055","n1821015211","n1821014904","n1821015376","n1821015398","n1821014771","n1821014840","n1821015062","n1819790554","n1819790560","n1819790767","n1819790696","n1819790706","n1819790606","n1819790607","n1819790544","n1819790779","n1819790760","n1819790926","n1819790927","n1819790647","n1819790657","n1819790649","n1819790679","n1819790915","n1819790739","n1819790549","n1819790671","n1819790686","n1819790798","n1819790791","n1819790563","n1819790720","n1819790704","n1819790795","n1819790836","n1819790622","n1819790615","n1819790654","n1819790931","n1819790595","n1819790753","n1819790612","n1819790623","n1819790564","n1819790552","n1819790645","n1819790625","n1819790605","n1819790668","n1819790731","n1819790718","n1819790781","n1819790665","n1819790659","n1819790726","n1819790642","n1819790854","n1819790697","n1819790867","n1819790833","n1819790555","n1819790774","n1819790881","n1819790530","n1819790909","n1819790891","n1819790590","n1819790738","n1819790609","n1819790528","n1819790674","n1819790583","n1819790559","n1819790863","n1819790912","n1819790685","n1819790913"]},"n185955128":{"id":"n185955128","loc":[-85.6189367,41.9519432],"version":"3","changeset":"14878832","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-02T04:00:14Z","tags":{}},"n185948818":{"id":"n185948818","loc":[-85.616755,41.952231],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T04:53:44Z","tags":{}},"n185978819":{"id":"n185978819","loc":[-85.616773,41.954737],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:08:35Z","tags":{}},"n185978821":{"id":"n185978821","loc":[-85.616699,41.954742],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:08:35Z","tags":{}},"n2138420714":{"id":"n2138420714","loc":[-85.6176304,41.9515154],"version":"1","changeset":"14878832","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-02T04:00:12Z","tags":{}},"n2138420715":{"id":"n2138420715","loc":[-85.6177355,41.9515717],"version":"1","changeset":"14878832","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-02T04:00:12Z","tags":{}},"n2138420716":{"id":"n2138420716","loc":[-85.6192901,41.951573],"version":"1","changeset":"14878832","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-02T04:00:12Z","tags":{}},"n2138420718":{"id":"n2138420718","loc":[-85.6171481,41.9513579],"version":"1","changeset":"14878832","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-02T04:00:12Z","tags":{}},"n2138420719":{"id":"n2138420719","loc":[-85.6165981,41.9519199],"version":"1","changeset":"14878832","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-02T04:00:12Z","tags":{}},"n2138420720":{"id":"n2138420720","loc":[-85.6165719,41.9519922],"version":"1","changeset":"14878832","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-02T04:00:12Z","tags":{}},"n2138420721":{"id":"n2138420721","loc":[-85.6165832,41.9520757],"version":"1","changeset":"14878832","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-02T04:00:12Z","tags":{}},"n2138420722":{"id":"n2138420722","loc":[-85.6166355,41.9521453],"version":"1","changeset":"14878832","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-02T04:00:12Z","tags":{}},"n2138420723":{"id":"n2138420723","loc":[-85.6169161,41.9522788],"version":"1","changeset":"14878832","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-02T04:00:12Z","tags":{}},"n2138420724":{"id":"n2138420724","loc":[-85.6170882,41.9522538],"version":"1","changeset":"14878832","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-02T04:00:12Z","tags":{}},"n2138420725":{"id":"n2138420725","loc":[-85.6189204,41.9514674],"version":"1","changeset":"14878832","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-02T04:00:12Z","tags":{}},"n2138420726":{"id":"n2138420726","loc":[-85.6180346,41.9514735],"version":"1","changeset":"14878832","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-02T04:00:12Z","tags":{}},"n2138420727":{"id":"n2138420727","loc":[-85.6180362,41.9515719],"version":"1","changeset":"14878832","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-02T04:00:12Z","tags":{}},"n2138420728":{"id":"n2138420728","loc":[-85.6189204,41.9515727],"version":"1","changeset":"14878832","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-02T04:00:12Z","tags":{}},"n2138420744":{"id":"n2138420744","loc":[-85.618919,41.9519571],"version":"1","changeset":"14878832","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-02T04:00:12Z","tags":{}},"n2138420745":{"id":"n2138420745","loc":[-85.6194575,41.9522374],"version":"1","changeset":"14878832","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-02T04:00:12Z","tags":{}},"n2138420746":{"id":"n2138420746","loc":[-85.6181777,41.9536179],"version":"1","changeset":"14878832","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-02T04:00:12Z","tags":{}},"n2138420747":{"id":"n2138420747","loc":[-85.6176582,41.9533658],"version":"1","changeset":"14878832","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-02T04:00:12Z","tags":{}},"n2138420748":{"id":"n2138420748","loc":[-85.6179871,41.9530242],"version":"1","changeset":"14878832","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-02T04:00:12Z","tags":{}},"n2138420749":{"id":"n2138420749","loc":[-85.618429,41.9532476],"version":"1","changeset":"14878832","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-02T04:00:12Z","tags":{}},"n2138420750":{"id":"n2138420750","loc":[-85.6185538,41.9531194],"version":"1","changeset":"14878832","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-02T04:00:12Z","tags":{}},"n2138420751":{"id":"n2138420751","loc":[-85.6180765,41.9528677],"version":"1","changeset":"14878832","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-02T04:00:12Z","tags":{}},"n2138420752":{"id":"n2138420752","loc":[-85.6180394,41.9528855],"version":"1","changeset":"14878832","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-02T04:00:12Z","tags":{}},"n2138420753":{"id":"n2138420753","loc":[-85.6193752,41.9521695],"version":"1","changeset":"14878832","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-02T04:00:12Z","tags":{}},"n2138420754":{"id":"n2138420754","loc":[-85.6181374,41.9535376],"version":"1","changeset":"14878832","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-02T04:00:12Z","tags":{}},"n2138420755":{"id":"n2138420755","loc":[-85.6179898,41.9535545],"version":"1","changeset":"14878832","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-02T04:00:12Z","tags":{}},"n2138420756":{"id":"n2138420756","loc":[-85.6177286,41.9534228],"version":"1","changeset":"14878832","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-02T04:00:12Z","tags":{}},"n2138420757":{"id":"n2138420757","loc":[-85.6181011,41.9530292],"version":"1","changeset":"14878832","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-02T04:00:13Z","tags":{}},"n2138420759":{"id":"n2138420759","loc":[-85.6185158,41.9531194],"version":"1","changeset":"14878832","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-02T04:00:13Z","tags":{}},"n2138420760":{"id":"n2138420760","loc":[-85.6191318,41.9520425],"version":"1","changeset":"14878832","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-02T04:00:13Z","tags":{}},"n2138420761":{"id":"n2138420761","loc":[-85.6182348,41.9529815],"version":"1","changeset":"14878832","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-02T04:00:13Z","tags":{}},"n2138420762":{"id":"n2138420762","loc":[-85.6184853,41.9524248],"version":"1","changeset":"14878832","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-02T04:00:13Z","tags":{}},"n2138420763":{"id":"n2138420763","loc":[-85.6186764,41.9525193],"version":"1","changeset":"14878832","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-02T04:00:13Z","tags":{}},"n2138420764":{"id":"n2138420764","loc":[-85.6189421,41.9526483],"version":"1","changeset":"14878832","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-02T04:00:13Z","tags":{}},"n2138420765":{"id":"n2138420765","loc":[-85.6182875,41.9531222],"version":"1","changeset":"14878832","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-02T04:00:13Z","tags":{}},"n2138420766":{"id":"n2138420766","loc":[-85.6179141,41.9535163],"version":"1","changeset":"14878832","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-02T04:00:13Z","tags":{}},"n2138420767":{"id":"n2138420767","loc":[-85.6178363,41.9535735],"version":"1","changeset":"14878832","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-02T04:00:13Z","tags":{}},"n185948824":{"id":"n185948824","loc":[-85.6165667,41.9529715],"version":"3","changeset":"14878832","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-02T04:00:14Z","tags":{}},"n2138420758":{"id":"n2138420758","loc":[-85.6184408,41.953201],"version":"2","changeset":"14970854","user":"oldtopos","uid":"169004","visible":"true","timestamp":"2013-02-09T18:25:47Z","tags":{}},"n2138422349":{"id":"n2138422349","loc":[-85.6175136,41.9533346],"version":"1","changeset":"14878856","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-02T04:12:27Z","tags":{}},"n2138422350":{"id":"n2138422350","loc":[-85.6171867,41.9531679],"version":"1","changeset":"14878856","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-02T04:12:27Z","tags":{}},"n2138422351":{"id":"n2138422351","loc":[-85.61722,41.9531305],"version":"1","changeset":"14878856","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-02T04:12:27Z","tags":{}},"n2138422352":{"id":"n2138422352","loc":[-85.6171889,41.9531158],"version":"1","changeset":"14878856","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-02T04:12:27Z","tags":{}},"n2138422353":{"id":"n2138422353","loc":[-85.6171733,41.9531284],"version":"1","changeset":"14878856","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-02T04:12:27Z","tags":{}},"n2138422354":{"id":"n2138422354","loc":[-85.616765,41.9529207],"version":"1","changeset":"14878856","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-02T04:12:27Z","tags":{}},"n2138422355":{"id":"n2138422355","loc":[-85.6167565,41.9529355],"version":"1","changeset":"14878856","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-02T04:12:27Z","tags":{}},"n2138422356":{"id":"n2138422356","loc":[-85.6164772,41.9527911],"version":"1","changeset":"14878856","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-02T04:12:27Z","tags":{}},"n2138422357":{"id":"n2138422357","loc":[-85.6168227,41.9524261],"version":"1","changeset":"14878856","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-02T04:12:27Z","tags":{}},"n2138422358":{"id":"n2138422358","loc":[-85.6171913,41.9526158],"version":"1","changeset":"14878856","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-02T04:12:27Z","tags":{}},"n2138422359":{"id":"n2138422359","loc":[-85.6172403,41.9525589],"version":"1","changeset":"14878856","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-02T04:12:27Z","tags":{}},"n2138422360":{"id":"n2138422360","loc":[-85.6172097,41.952542],"version":"1","changeset":"14878856","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-02T04:12:27Z","tags":{}},"n2138422361":{"id":"n2138422361","loc":[-85.6173948,41.9523512],"version":"1","changeset":"14878856","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-02T04:12:27Z","tags":{}},"n2138422362":{"id":"n2138422362","loc":[-85.6174256,41.9523678],"version":"1","changeset":"14878856","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-02T04:12:27Z","tags":{}},"n2138422363":{"id":"n2138422363","loc":[-85.6174831,41.9523086],"version":"1","changeset":"14878856","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-02T04:12:27Z","tags":{}},"n2138422364":{"id":"n2138422364","loc":[-85.6173316,41.9522289],"version":"1","changeset":"14878856","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-02T04:12:28Z","tags":{}},"n2138422365":{"id":"n2138422365","loc":[-85.6174507,41.9521024],"version":"1","changeset":"14878856","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-02T04:12:28Z","tags":{}},"n2138422366":{"id":"n2138422366","loc":[-85.6174773,41.9521155],"version":"1","changeset":"14878856","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-02T04:12:28Z","tags":{}},"n2138422367":{"id":"n2138422367","loc":[-85.6176577,41.9519232],"version":"1","changeset":"14878856","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-02T04:12:28Z","tags":{}},"n2138422368":{"id":"n2138422368","loc":[-85.6176336,41.9519105],"version":"1","changeset":"14878856","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-02T04:12:28Z","tags":{}},"n2138422369":{"id":"n2138422369","loc":[-85.617747,41.9517861],"version":"1","changeset":"14878856","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-02T04:12:28Z","tags":{}},"n2138422370":{"id":"n2138422370","loc":[-85.6182675,41.9520559],"version":"1","changeset":"14878856","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-02T04:12:28Z","tags":{}},"n2138422371":{"id":"n2138422371","loc":[-85.6182105,41.9521219],"version":"1","changeset":"14878856","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-02T04:12:28Z","tags":{}},"n2138422372":{"id":"n2138422372","loc":[-85.6183863,41.9522203],"version":"1","changeset":"14878856","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-02T04:12:28Z","tags":{}},"n2138422373":{"id":"n2138422373","loc":[-85.6180984,41.9525266],"version":"1","changeset":"14878856","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-02T04:12:28Z","tags":{}},"n2138422374":{"id":"n2138422374","loc":[-85.6179159,41.9524295],"version":"1","changeset":"14878856","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-02T04:12:28Z","tags":{}},"n2138422375":{"id":"n2138422375","loc":[-85.617854,41.9524979],"version":"1","changeset":"14878856","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-02T04:12:28Z","tags":{}},"n2138422376":{"id":"n2138422376","loc":[-85.6177686,41.9524531],"version":"1","changeset":"14878856","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-02T04:12:28Z","tags":{}},"n2138422377":{"id":"n2138422377","loc":[-85.6174716,41.9527765],"version":"1","changeset":"14878856","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-02T04:12:28Z","tags":{}},"n2138422378":{"id":"n2138422378","loc":[-85.6178545,41.9529756],"version":"1","changeset":"14878856","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-02T04:12:28Z","tags":{}},"n2138425424":{"id":"n2138425424","loc":[-85.6171736,41.9536385],"version":"1","changeset":"14878914","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-02T04:33:40Z","tags":{}},"n2138425425":{"id":"n2138425425","loc":[-85.6180159,41.9535782],"version":"1","changeset":"14878914","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-02T04:33:40Z","tags":{}},"n2138425426":{"id":"n2138425426","loc":[-85.6181068,41.9536282],"version":"1","changeset":"14878914","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-02T04:33:40Z","tags":{}},"n2138425427":{"id":"n2138425427","loc":[-85.6180673,41.9542678],"version":"1","changeset":"14878914","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-02T04:33:40Z","tags":{}},"n2138425428":{"id":"n2138425428","loc":[-85.6178636,41.9542634],"version":"1","changeset":"14878914","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-02T04:33:40Z","tags":{}},"n2138425429":{"id":"n2138425429","loc":[-85.6176204,41.9542046],"version":"1","changeset":"14878914","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-02T04:33:40Z","tags":{}},"n2138425430":{"id":"n2138425430","loc":[-85.6174366,41.9541031],"version":"1","changeset":"14878914","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-02T04:33:40Z","tags":{}},"n2138425431":{"id":"n2138425431","loc":[-85.6172942,41.9539781],"version":"1","changeset":"14878914","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-02T04:33:40Z","tags":{}},"n2138425432":{"id":"n2138425432","loc":[-85.6172171,41.9538399],"version":"1","changeset":"14878914","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-02T04:33:40Z","tags":{}},"n2138425433":{"id":"n2138425433","loc":[-85.6168138,41.9543266],"version":"1","changeset":"14878914","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-02T04:33:40Z","tags":{}},"n2138425434":{"id":"n2138425434","loc":[-85.6167779,41.9538098],"version":"1","changeset":"14878914","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-02T04:33:40Z","tags":{}},"n2138425435":{"id":"n2138425435","loc":[-85.6165849,41.9537073],"version":"1","changeset":"14878914","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-02T04:33:40Z","tags":{}},"n2138425441":{"id":"n2138425441","loc":[-85.616458,41.9543184],"version":"1","changeset":"14878914","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-02T04:33:41Z","tags":{}},"n2138425442":{"id":"n2138425442","loc":[-85.6166428,41.954345],"version":"1","changeset":"14878914","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-02T04:33:41Z","tags":{}},"n2138425445":{"id":"n2138425445","loc":[-85.6181332,41.9514117],"version":"1","changeset":"14878914","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-02T04:33:41Z","tags":{}},"n2138425446":{"id":"n2138425446","loc":[-85.6183263,41.9514111],"version":"1","changeset":"14878914","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-02T04:33:41Z","tags":{}},"n2138425447":{"id":"n2138425447","loc":[-85.6185033,41.9514102],"version":"1","changeset":"14878914","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-02T04:33:41Z","tags":{}},"n2138425449":{"id":"n2138425449","loc":[-85.6186809,41.9514093],"version":"1","changeset":"14878914","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-02T04:33:41Z","tags":{}},"n2138425451":{"id":"n2138425451","loc":[-85.6188681,41.9514082],"version":"1","changeset":"14878914","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-02T04:33:41Z","tags":{}},"n2138436008":{"id":"n2138436008","loc":[-85.6170474,41.9513604],"version":"1","changeset":"14878954","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-02T04:47:02Z","tags":{}},"n2138436009":{"id":"n2138436009","loc":[-85.6164937,41.9519586],"version":"1","changeset":"14878954","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-02T04:47:02Z","tags":{}},"n2138436010":{"id":"n2138436010","loc":[-85.616497,41.9520725],"version":"1","changeset":"14878954","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-02T04:47:02Z","tags":{}},"n2138436011":{"id":"n2138436011","loc":[-85.6165654,41.9521645],"version":"1","changeset":"14878954","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-02T04:47:02Z","tags":{}},"n2138436012":{"id":"n2138436012","loc":[-85.6166631,41.9522178],"version":"1","changeset":"14878954","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-02T04:47:02Z","tags":{}},"n2138436013":{"id":"n2138436013","loc":[-85.6167327,41.9522554],"version":"1","changeset":"14878954","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-02T04:47:02Z","tags":{}},"n2138436014":{"id":"n2138436014","loc":[-85.6172383,41.9525125],"version":"1","changeset":"14878954","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-02T04:47:02Z","tags":{}},"n2138439319":{"id":"n2138439319","loc":[-85.6170432,41.9524057],"version":"1","changeset":"14878967","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-02T04:54:18Z","tags":{}},"n2138439320":{"id":"n2138439320","loc":[-85.617691,41.9517107],"version":"1","changeset":"14878967","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-02T04:54:18Z","tags":{}},"n2138439321":{"id":"n2138439321","loc":[-85.6177727,41.9516794],"version":"1","changeset":"14878967","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-02T04:54:18Z","tags":{}},"n2138439322":{"id":"n2138439322","loc":[-85.619085,41.9516811],"version":"1","changeset":"14878967","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-02T04:54:18Z","tags":{}},"n2138439323":{"id":"n2138439323","loc":[-85.6179432,41.952895],"version":"1","changeset":"14878967","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-02T04:54:18Z","tags":{}},"n2138439324":{"id":"n2138439324","loc":[-85.6180389,41.9529384],"version":"1","changeset":"14878967","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-02T04:54:18Z","tags":{}},"n2138439325":{"id":"n2138439325","loc":[-85.6176303,41.9533604],"version":"1","changeset":"14878967","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-02T04:54:18Z","tags":{}},"n2138439326":{"id":"n2138439326","loc":[-85.6175538,41.9534396],"version":"1","changeset":"14878967","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-02T04:54:18Z","tags":{}},"n2138439327":{"id":"n2138439327","loc":[-85.6173806,41.9523658],"version":"1","changeset":"14878967","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-02T04:54:18Z","tags":{}},"n2138439328":{"id":"n2138439328","loc":[-85.6171841,41.9522542],"version":"1","changeset":"14878967","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-02T04:54:18Z","tags":{}},"n2138439329":{"id":"n2138439329","loc":[-85.6172077,41.9524958],"version":"1","changeset":"14878967","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-02T04:54:18Z","tags":{}},"n2138439330":{"id":"n2138439330","loc":[-85.6171235,41.9525809],"version":"1","changeset":"14878967","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-02T04:54:18Z","tags":{}},"n2138439331":{"id":"n2138439331","loc":[-85.6180938,41.9527349],"version":"1","changeset":"14878967","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-02T04:54:18Z","tags":{}},"n2138439332":{"id":"n2138439332","loc":[-85.6177023,41.9525253],"version":"1","changeset":"14878967","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-02T04:54:18Z","tags":{}},"n2138439333":{"id":"n2138439333","loc":[-85.6175543,41.9526865],"version":"1","changeset":"14878967","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-02T04:54:18Z","tags":{}},"n2138439334":{"id":"n2138439334","loc":[-85.6179589,41.9528783],"version":"1","changeset":"14878967","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-02T04:54:18Z","tags":{}},"n185948820":{"id":"n185948820","loc":[-85.6163249,41.952701],"version":"3","changeset":"14878832","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-02T04:00:14Z","tags":{}},"n185948822":{"id":"n185948822","loc":[-85.6163757,41.952855],"version":"3","changeset":"14878832","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-02T04:00:14Z","tags":{}},"n185955123":{"id":"n185955123","loc":[-85.6198103,41.9510408],"version":"3","changeset":"14878832","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-02T04:00:14Z","tags":{}},"n185958839":{"id":"n185958839","loc":[-85.611651,41.954761],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T04:58:34Z","tags":{}},"n185965033":{"id":"n185965033","loc":[-85.614195,41.954754],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:01:42Z","tags":{}},"n185976502":{"id":"n185976502","loc":[-85.617375,41.947559],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:07:32Z","tags":{}},"n185976504":{"id":"n185976504","loc":[-85.6174164,41.9510804],"version":"3","changeset":"14878832","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-02T04:00:14Z","tags":{}},"n185978828":{"id":"n185978828","loc":[-85.613542,41.954756],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:08:36Z","tags":{}},"n185978830":{"id":"n185978830","loc":[-85.610373,41.954774],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:08:36Z","tags":{}},"n2138420713":{"id":"n2138420713","loc":[-85.6174641,41.9506942],"version":"1","changeset":"14878832","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-02T04:00:11Z","tags":{}},"n2138420717":{"id":"n2138420717","loc":[-85.6173027,41.9512895],"version":"1","changeset":"14878832","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-02T04:00:12Z","tags":{}},"n2138420768":{"id":"n2138420768","loc":[-85.61745,41.9501974],"version":"1","changeset":"14878832","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-02T04:00:13Z","tags":{}},"n2138420773":{"id":"n2138420773","loc":[-85.6174135,41.9489136],"version":"1","changeset":"14878832","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-02T04:00:13Z","tags":{}},"n2138425436":{"id":"n2138425436","loc":[-85.6159148,41.9538036],"version":"1","changeset":"14878914","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-02T04:33:40Z","tags":{}},"n2138425437":{"id":"n2138425437","loc":[-85.6159534,41.9539677],"version":"1","changeset":"14878914","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-02T04:33:41Z","tags":{}},"n2138425438":{"id":"n2138425438","loc":[-85.6160306,41.9540846],"version":"1","changeset":"14878914","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-02T04:33:41Z","tags":{}},"n2138425439":{"id":"n2138425439","loc":[-85.6161354,41.954181],"version":"1","changeset":"14878914","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-02T04:33:41Z","tags":{}},"n2138425440":{"id":"n2138425440","loc":[-85.6162733,41.954263],"version":"1","changeset":"14878914","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-02T04:33:41Z","tags":{}},"n2138425443":{"id":"n2138425443","loc":[-85.6183273,41.9510826],"version":"1","changeset":"14878914","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-02T04:33:41Z","tags":{}},"n2138425444":{"id":"n2138425444","loc":[-85.6181354,41.9510835],"version":"1","changeset":"14878914","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-02T04:33:41Z","tags":{}},"n2138425448":{"id":"n2138425448","loc":[-85.6185033,41.9510816],"version":"1","changeset":"14878914","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-02T04:33:41Z","tags":{}},"n2138425450":{"id":"n2138425450","loc":[-85.6186816,41.9510808],"version":"1","changeset":"14878914","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-02T04:33:41Z","tags":{}},"n2138425452":{"id":"n2138425452","loc":[-85.6188641,41.9510818],"version":"1","changeset":"14878914","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-02T04:33:41Z","tags":{}},"n2138435984":{"id":"n2138435984","loc":[-85.6167607,41.9501009],"version":"2","changeset":"14970854","user":"oldtopos","uid":"169004","visible":"true","timestamp":"2013-02-09T18:25:47Z","tags":{}},"n2138436000":{"id":"n2138436000","loc":[-85.6173169,41.947558],"version":"1","changeset":"14878954","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-02T04:47:01Z","tags":{}},"n2138436001":{"id":"n2138436001","loc":[-85.6173362,41.948883],"version":"1","changeset":"14878954","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-02T04:47:01Z","tags":{}},"n2138436002":{"id":"n2138436002","loc":[-85.6167791,41.9492952],"version":"1","changeset":"14878954","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-02T04:47:01Z","tags":{}},"n2138436003":{"id":"n2138436003","loc":[-85.6167543,41.949349],"version":"1","changeset":"14878954","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-02T04:47:01Z","tags":{}},"n2138436004":{"id":"n2138436004","loc":[-85.6167648,41.9509125],"version":"1","changeset":"14878954","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-02T04:47:01Z","tags":{}},"n2138436005":{"id":"n2138436005","loc":[-85.6168832,41.9510412],"version":"1","changeset":"14878954","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-02T04:47:01Z","tags":{}},"n2138436006":{"id":"n2138436006","loc":[-85.6170045,41.9511417],"version":"1","changeset":"14878954","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-02T04:47:01Z","tags":{}},"n2138436007":{"id":"n2138436007","loc":[-85.6170624,41.9512483],"version":"1","changeset":"14878954","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-02T04:47:02Z","tags":{}},"n2138436017":{"id":"n2138436017","loc":[-85.6168094,41.9492729],"version":"1","changeset":"14878954","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-02T04:47:02Z","tags":{}},"n2138436021":{"id":"n2138436021","loc":[-85.6167553,41.9494886],"version":"1","changeset":"14878954","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-02T04:47:02Z","tags":{}},"n2138436023":{"id":"n2138436023","loc":[-85.6167585,41.9499707],"version":"1","changeset":"14878954","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-02T04:47:02Z","tags":{}},"n2138436025":{"id":"n2138436025","loc":[-85.6167567,41.9497018],"version":"1","changeset":"14878954","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-02T04:47:02Z","tags":{}},"w203838284":{"id":"w203838284","version":"1","changeset":"14878914","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-02T04:33:42Z","tags":{"area":"yes","leisure":"pitch","sport":"baseball"},"nodes":["n2138425424","n2138425425","n2138425426","n2138425427","n2138425428","n2138425429","n2138425430","n2138425431","n2138425432","n2138425424"]},"w203837928":{"id":"w203837928","version":"1","changeset":"14878832","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-02T04:00:13Z","tags":{"highway":"service"},"nodes":["n2138420717","n2138420718","n2138420719","n2138420720","n2138420721","n2138420722","n185948818","n2138420723","n2138420724","n2138420715"]},"w203839364":{"id":"w203839364","version":"1","changeset":"14878967","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-02T04:54:18Z","tags":{"highway":"footway"},"nodes":["n2138439331","n2138439332"]},"w203837932":{"id":"w203837932","version":"1","changeset":"14878832","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-02T04:00:13Z","tags":{"amenity":"parking","area":"yes"},"nodes":["n2138420744","n2138420745","n2138420746","n2138420747","n2138420748","n2138420749","n2138420750","n2138420751","n2138420744"]},"w203839362":{"id":"w203839362","version":"1","changeset":"14878967","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-02T04:54:18Z","tags":{"highway":"footway"},"nodes":["n2138439327","n2138439328"]},"w203839363":{"id":"w203839363","version":"1","changeset":"14878967","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-02T04:54:18Z","tags":{"highway":"footway"},"nodes":["n2138439329","n2138439330"]},"w203837933":{"id":"w203837933","version":"2","changeset":"14970854","user":"oldtopos","uid":"169004","visible":"true","timestamp":"2013-02-09T18:25:42Z","tags":{"highway":"service","service":"parking_aisle"},"nodes":["n185955128","n2138420760","n2138420753","n2138420764","n2138420759","n2138420758","n2138420754","n2138420755","n2138420766","n2138420756"]},"w203837936":{"id":"w203837936","version":"1","changeset":"14878832","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-02T04:00:14Z","tags":{"highway":"service","service":"parking_aisle"},"nodes":["n2138420765","n2138420766"]},"w17966364":{"id":"w17966364","version":"2","changeset":"14878832","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-02T04:00:14Z","tags":{"access":"private","highway":"service","name":"Collins Dr","tiger:cfcc":"A74","tiger:county":"St. Joseph, MI","tiger:name_base":"Collins","tiger:name_type":"Dr","tiger:reviewed":"no","tiger:source":"tiger_import_dch_v0.6_20070813","tiger:tlid":"15313686","tiger:upload_uuid":"bulk_upload.pl-b79f893a-0be1-4a5f-a183-6aea114c9af7"},"nodes":["n185961362","n185976502","n2138420773","n2138420768","n2138420713","n185976504","n2138420717","n2138420714","n2138420715","n2138420727","n2138420728","n2138420716"]},"w203838040":{"id":"w203838040","version":"3","changeset":"14878967","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-02T04:54:19Z","tags":{"amenity":"school","area":"yes","building":"yes","name":"Three Rivers Middle School"},"nodes":["n2138422349","n2138422350","n2138422351","n2138422352","n2138422353","n2138422354","n2138422355","n2138422356","n2138422357","n2138439330","n2138422358","n2138422359","n2138422360","n2138436014","n2138439327","n2138422361","n2138422362","n2138422363","n2138422364","n2138422365","n2138422366","n2138422367","n2138422368","n2138422369","n2138422370","n2138422371","n2138422372","n2138422373","n2138422374","n2138422375","n2138422376","n2138439332","n2138439333","n2138422377","n2138422378","n2138422349"]},"w17964049":{"id":"w17964049","version":"3","changeset":"14970854","user":"oldtopos","uid":"169004","visible":"true","timestamp":"2013-02-09T18:25:46Z","tags":{"highway":"service","tiger:cfcc":"A41","tiger:county":"St. Joseph, MI","tiger:reviewed":"no","tiger:separated":"no","tiger:source":"tiger_import_dch_v0.6_20070813","tiger:tlid":"15335181","tiger:upload_uuid":"bulk_upload.pl-b79f893a-0be1-4a5f-a183-6aea114c9af7"},"nodes":["n185955120","n185955123","n2138420716","n185955128","n2138420762","n2138420752","n2138420761","n2138420759"]},"w41074899":{"id":"w41074899","version":"4","changeset":"14676554","user":"bbmiller","uid":"451048","visible":"true","timestamp":"2013-01-16T20:05:18Z","tags":{"highway":"secondary","name":"E Hoffman St","ref":"M 60","tiger:cfcc":"A41","tiger:county":"St. Joseph, MI","tiger:name_base":"Hoffman","tiger:name_direction_prefix":"E","tiger:name_type":"St","tiger:reviewed":"no","tiger:zip_left":"49093","tiger:zip_right":"49093"},"nodes":["n185978817","n185978819","n185978821","n185965033","n185978828","n185958839","n185978830"]},"w203839365":{"id":"w203839365","version":"1","changeset":"14878967","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-02T04:54:18Z","tags":{"highway":"footway"},"nodes":["n2138439333","n2138439334"]},"w203837935":{"id":"w203837935","version":"1","changeset":"14878832","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-02T04:00:14Z","tags":{"highway":"service","service":"parking_aisle"},"nodes":["n2138420762","n2138420763","n2138420764"]},"w203838287":{"id":"w203838287","version":"1","changeset":"14878914","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-02T04:33:42Z","tags":{"area":"yes","leisure":"pitch","sport":"tennis"},"nodes":["n2138425446","n2138425447","n2138425448","n2138425443","n2138425446"]},"w203837934":{"id":"w203837934","version":"1","changeset":"14878832","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-02T04:00:14Z","tags":{"highway":"service","service":"parking_aisle"},"nodes":["n2138420760","n2138420763","n2138420761"]},"w203838289":{"id":"w203838289","version":"1","changeset":"14878914","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-02T04:33:42Z","tags":{"area":"yes","leisure":"pitch","sport":"tennis"},"nodes":["n2138425449","n2138425451","n2138425452","n2138425450","n2138425449"]},"w17963047":{"id":"w17963047","version":"4","changeset":"14878967","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-02T04:54:19Z","tags":{"highway":"service","tiger:cfcc":"A41","tiger:county":"St. Joseph, MI","tiger:reviewed":"no","tiger:separated":"no","tiger:source":"tiger_import_dch_v0.6_20070813","tiger:tlid":"15331535","tiger:upload_uuid":"bulk_upload.pl-b79f893a-0be1-4a5f-a183-6aea114c9af7"},"nodes":["n185948818","n2138436013","n185948820","n185948822","n185948824","n2138439326","n2138420767","n2138420766"]},"w203839091":{"id":"w203839091","version":"3","changeset":"14970854","user":"oldtopos","uid":"169004","visible":"true","timestamp":"2013-02-09T18:25:44Z","tags":{"highway":"footway"},"nodes":["n185976502","n2138436000","n2138436001","n2138436017","n2138436002","n2138436003","n2138436021","n2138436025","n2138436023","n2138435984","n2138436004","n2138436005","n2138436006","n2138436007","n2138436008","n2138436009","n2138436010","n2138436011","n2138436012","n2138436013","n2138439319","n2138439329","n2138436014"]},"w204830797":{"id":"w204830797","version":"1","changeset":"14970854","user":"oldtopos","uid":"169004","visible":"true","timestamp":"2013-02-09T18:25:37Z","tags":{"highway":"service","service":"parking_aisle"},"nodes":["n2138420756","n2138420757","n2138420765","n2138420758"]},"w203838288":{"id":"w203838288","version":"1","changeset":"14878914","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-02T04:33:42Z","tags":{"area":"yes","leisure":"pitch","sport":"tennis"},"nodes":["n2138425447","n2138425449","n2138425450","n2138425448","n2138425447"]},"w203838285":{"id":"w203838285","version":"1","changeset":"14878914","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-02T04:33:42Z","tags":{"area":"yes","leisure":"pitch","sport":"baseball"},"nodes":["n2138425433","n2138425434","n2138425435","n2138425436","n2138425437","n2138425438","n2138425439","n2138425440","n2138425441","n2138425442","n2138425433"]},"w203838286":{"id":"w203838286","version":"1","changeset":"14878914","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-02T04:33:42Z","tags":{"area":"yes","leisure":"pitch","sport":"tennis"},"nodes":["n2138425443","n2138425444","n2138425445","n2138425446","n2138425443"]},"w203837929":{"id":"w203837929","version":"1","changeset":"14878832","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-02T04:00:13Z","tags":{"amenity":"parking","area":"yes"},"nodes":["n2138420725","n2138420726","n2138420727","n2138420728","n2138420725"]},"w203839361":{"id":"w203839361","version":"1","changeset":"14878967","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-02T04:54:18Z","tags":{"highway":"footway"},"nodes":["n2138439319","n2138439328","n2138439320","n2138439321","n2138439322","n2138439331","n2138439334","n2138439323","n2138439324","n2138439325","n2138439326"]},"n394381698":{"id":"n394381698","loc":[-85.614471,41.954755],"version":"1","changeset":"1160198","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T04:27:13Z","tags":{}},"n394381699":{"id":"n394381699","loc":[-85.6152,41.954744],"version":"1","changeset":"1160198","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T04:27:13Z","tags":{}},"n394381700":{"id":"n394381700","loc":[-85.615201,41.954081],"version":"1","changeset":"1160198","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T04:27:13Z","tags":{}},"n394381701":{"id":"n394381701","loc":[-85.614426,41.954042],"version":"1","changeset":"1160198","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T04:27:13Z","tags":{}},"n394381702":{"id":"n394381702","loc":[-85.616319,41.954749],"version":"1","changeset":"1160198","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T04:27:13Z","tags":{}},"n394381704":{"id":"n394381704","loc":[-85.616152,41.954752],"version":"1","changeset":"1160198","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T04:27:13Z","tags":{}},"n394381706":{"id":"n394381706","loc":[-85.615201,41.95483],"version":"1","changeset":"1160198","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T04:27:13Z","tags":{}},"n394490775":{"id":"n394490775","loc":[-85.613971,41.954839],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:07:58Z","tags":{}},"n394490782":{"id":"n394490782","loc":[-85.614372,41.954841],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:07:58Z","tags":{}},"n185958835":{"id":"n185958835","loc":[-85.611615,41.953704],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T04:58:34Z","tags":{}},"n185958837":{"id":"n185958837","loc":[-85.611636,41.953938],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T04:58:34Z","tags":{}},"n185958842":{"id":"n185958842","loc":[-85.611187,41.951686],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T04:58:34Z","tags":{}},"n185958844":{"id":"n185958844","loc":[-85.611087,41.951741],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T04:58:34Z","tags":{}},"n185958845":{"id":"n185958845","loc":[-85.611034,41.951852],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T04:58:34Z","tags":{}},"n185958847":{"id":"n185958847","loc":[-85.611016,41.95196],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T04:58:34Z","tags":{}},"n185958849":{"id":"n185958849","loc":[-85.610989,41.95328],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T04:58:34Z","tags":{}},"n185958851":{"id":"n185958851","loc":[-85.611021,41.953484],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T04:58:34Z","tags":{}},"n185958852":{"id":"n185958852","loc":[-85.611091,41.953603],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T04:58:34Z","tags":{}},"n185958853":{"id":"n185958853","loc":[-85.6112,41.953661],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T04:58:34Z","tags":{}},"n185958855":{"id":"n185958855","loc":[-85.611364,41.953686],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T04:58:34Z","tags":{}},"n185965031":{"id":"n185965031","loc":[-85.614204,41.953696],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:01:42Z","tags":{}},"n185965032":{"id":"n185965032","loc":[-85.6142,41.953978],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:01:42Z","tags":{}},"n185965062":{"id":"n185965062","loc":[-85.614617,41.951639],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:01:43Z","tags":{}},"n185965064":{"id":"n185965064","loc":[-85.61463,41.951852],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:01:43Z","tags":{}},"n185965066":{"id":"n185965066","loc":[-85.614642,41.953436],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:01:43Z","tags":{}},"n185965068":{"id":"n185965068","loc":[-85.6146,41.953551],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:01:43Z","tags":{}},"n185965071":{"id":"n185965071","loc":[-85.614487,41.95363],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:01:43Z","tags":{}},"n185965073":{"id":"n185965073","loc":[-85.614354,41.953672],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:01:43Z","tags":{}},"n185966288":{"id":"n185966288","loc":[-85.61179,41.953695],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:02:33Z","tags":{}},"n185966290":{"id":"n185966290","loc":[-85.612232,41.953685],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:02:33Z","tags":{}},"n185966293":{"id":"n185966293","loc":[-85.613438,41.953677],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:02:33Z","tags":{}},"n185966349":{"id":"n185966349","loc":[-85.611323,41.951653],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:02:34Z","tags":{}},"n185966351":{"id":"n185966351","loc":[-85.611892,41.951642],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:02:34Z","tags":{}},"n185966352":{"id":"n185966352","loc":[-85.612216,41.951641],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:02:34Z","tags":{}},"n185966353":{"id":"n185966353","loc":[-85.613111,41.951639],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:02:34Z","tags":{}},"n185966354":{"id":"n185966354","loc":[-85.613396,41.95164],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:02:34Z","tags":{}},"n185966355":{"id":"n185966355","loc":[-85.614221,41.95164],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:02:34Z","tags":{}},"n185973839":{"id":"n185973839","loc":[-85.61341,41.951919],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:06:03Z","tags":{}},"n185973840":{"id":"n185973840","loc":[-85.613438,41.953308],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:06:03Z","tags":{}},"n185980222":{"id":"n185980222","loc":[-85.613781,41.955164],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:09:33Z","tags":{}},"n185980223":{"id":"n185980223","loc":[-85.613815,41.955237],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:09:33Z","tags":{}},"n185980225":{"id":"n185980225","loc":[-85.613837,41.955316],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:09:33Z","tags":{}},"n185990345":{"id":"n185990345","loc":[-85.612211,41.951977],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:15:01Z","tags":{}},"n185955743":{"id":"n185955743","loc":[-85.613873,41.95635],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T04:56:55Z","tags":{}},"n185980227":{"id":"n185980227","loc":[-85.613851,41.955415],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:09:33Z","tags":{}},"n185980229":{"id":"n185980229","loc":[-85.613918,41.957134],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T05:09:33Z","tags":{}},"n394381703":{"id":"n394381703","loc":[-85.616287,41.955674],"version":"1","changeset":"1160198","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T04:27:13Z","tags":{}},"n394381705":{"id":"n394381705","loc":[-85.615164,41.955676],"version":"1","changeset":"1160198","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T04:27:13Z","tags":{}},"n394490777":{"id":"n394490777","loc":[-85.613973,41.955979],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:07:58Z","tags":{}},"n394490780":{"id":"n394490780","loc":[-85.614364,41.955987],"version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:07:58Z","tags":{}},"w17965307":{"id":"w17965307","version":"1","changeset":"402341","user":"DaveHansenTiger","uid":"7168","visible":"true","timestamp":"2007-12-23T20:35:58Z","tags":{"highway":"residential","name":"Bates Ave","tiger:cfcc":"A41","tiger:county":"St. Joseph, MI","tiger:name_base":"Bates","tiger:name_type":"Ave","tiger:reviewed":"no","tiger:separated":"no","tiger:source":"tiger_import_dch_v0.6_20070813","tiger:tlid":"15313640:15313641","tiger:upload_uuid":"bulk_upload.pl-b79f893a-0be1-4a5f-a183-6aea114c9af7","tiger:zip_left":"49093","tiger:zip_right":"49093"},"nodes":["n185958842","n185966349","n185966351","n185966352","n185966353","n185966354","n185966355","n185965062"]},"w17967957":{"id":"w17967957","version":"1","changeset":"402580","user":"DaveHansenTiger","uid":"7168","visible":"true","timestamp":"2007-12-23T20:55:16Z","tags":{"highway":"residential","name":"Krum Ave","tiger:cfcc":"A41","tiger:county":"St. Joseph, MI","tiger:name_base":"Krum","tiger:name_type":"Ave","tiger:reviewed":"no","tiger:separated":"no","tiger:source":"tiger_import_dch_v0.6_20070813","tiger:tlid":"15313643","tiger:upload_uuid":"bulk_upload.pl-b79f893a-0be1-4a5f-a183-6aea114c9af7","tiger:zip_left":"49093","tiger:zip_right":"49093"},"nodes":["n185966352","n185990345","n185966290"]},"w17964508":{"id":"w17964508","version":"1","changeset":"402341","user":"DaveHansenTiger","uid":"7168","visible":"true","timestamp":"2007-12-23T20:30:11Z","tags":{"highway":"residential","name":"Blossom Dr","tiger:cfcc":"A41","tiger:county":"St. Joseph, MI","tiger:name_base":"Blossom","tiger:name_type":"Dr","tiger:reviewed":"no","tiger:separated":"no","tiger:source":"tiger_import_dch_v0.6_20070813","tiger:tlid":"15324628","tiger:upload_uuid":"bulk_upload.pl-b79f893a-0be1-4a5f-a183-6aea114c9af7","tiger:zip_left":"49093","tiger:zip_right":"49093"},"nodes":["n185958842","n185958844","n185958845","n185958847","n185958849","n185958851","n185958852","n185958853","n185958855","n185958835"]},"w17964507":{"id":"w17964507","version":"1","changeset":"402341","user":"DaveHansenTiger","uid":"7168","visible":"true","timestamp":"2007-12-23T20:30:10Z","tags":{"highway":"residential","name":"Blossom Dr","tiger:cfcc":"A41","tiger:county":"St. Joseph, MI","tiger:name_base":"Blossom","tiger:name_type":"Dr","tiger:reviewed":"no","tiger:separated":"no","tiger:source":"tiger_import_dch_v0.6_20070813","tiger:tlid":"15313629","tiger:upload_uuid":"bulk_upload.pl-b79f893a-0be1-4a5f-a183-6aea114c9af7","tiger:zip_left":"49093","tiger:zip_right":"49093"},"nodes":["n185958835","n185958837","n185958839"]},"w34367080":{"id":"w34367080","version":"1","changeset":"1160198","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T04:27:13Z","tags":{"admin_level":"8","boundary":"administrative","created_by":"polyshp2osm-multipoly","source":"TIGER/Line® 2008 Place Shapefiles (http://www.census.gov/geo/www/tiger/)"},"nodes":["n394381699","n394381706","n394381705","n394381703","n394381702","n394381704","n394381699"]},"w17965302":{"id":"w17965302","version":"1","changeset":"402341","user":"DaveHansenTiger","uid":"7168","visible":"true","timestamp":"2007-12-23T20:35:55Z","tags":{"highway":"residential","name":"Clausen Ave","tiger:cfcc":"A41","tiger:county":"St. Joseph, MI","tiger:name_base":"Clausen","tiger:name_type":"Ave","tiger:reviewed":"no","tiger:separated":"no","tiger:source":"tiger_import_dch_v0.6_20070813","tiger:tlid":"15313630:15313631:15313632","tiger:upload_uuid":"bulk_upload.pl-b79f893a-0be1-4a5f-a183-6aea114c9af7","tiger:zip_left":"49093","tiger:zip_right":"49093"},"nodes":["n185958835","n185966288","n185966290","n185966293","n185965031"]},"w17965156":{"id":"w17965156","version":"1","changeset":"402341","user":"DaveHansenTiger","uid":"7168","visible":"true","timestamp":"2007-12-23T20:34:54Z","tags":{"highway":"residential","name":"Orchard Dr","tiger:cfcc":"A41","tiger:county":"St. Joseph, MI","tiger:name_base":"Orchard","tiger:name_type":"Dr","tiger:reviewed":"no","tiger:separated":"no","tiger:source":"tiger_import_dch_v0.6_20070813","tiger:tlid":"15327962","tiger:upload_uuid":"bulk_upload.pl-b79f893a-0be1-4a5f-a183-6aea114c9af7","tiger:zip_left":"49093","tiger:zip_right":"49093"},"nodes":["n185965062","n185965064","n185965066","n185965068","n185965071","n185965073","n185965031"]},"w34369812":{"id":"w34369812","version":"1","changeset":"1160580","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T06:07:58Z","tags":{"admin_level":"8","boundary":"administrative","created_by":"polyshp2osm-multipoly","source":"TIGER/Line® 2008 Place Shapefiles (http://www.census.gov/geo/www/tiger/)"},"nodes":["n394490775","n394490777","n394490780","n394490782","n394490775"]},"w17965151":{"id":"w17965151","version":"1","changeset":"402341","user":"DaveHansenTiger","uid":"7168","visible":"true","timestamp":"2007-12-23T20:34:52Z","tags":{"highway":"residential","name":"Orchard Dr","tiger:cfcc":"A41","tiger:county":"St. Joseph, MI","tiger:name_base":"Orchard","tiger:name_type":"Dr","tiger:reviewed":"no","tiger:separated":"no","tiger:source":"tiger_import_dch_v0.6_20070813","tiger:tlid":"15313628","tiger:upload_uuid":"bulk_upload.pl-b79f893a-0be1-4a5f-a183-6aea114c9af7","tiger:zip_left":"49093","tiger:zip_right":"49093"},"nodes":["n185965031","n185965032","n185965033"]},"w17966756":{"id":"w17966756","version":"1","changeset":"402341","user":"DaveHansenTiger","uid":"7168","visible":"true","timestamp":"2007-12-23T20:47:10Z","tags":{"access":"private","highway":"service","name":"Lockport Dr","tiger:cfcc":"A74","tiger:county":"St. Joseph, MI","tiger:name_base":"Lockport","tiger:name_type":"Dr","tiger:reviewed":"no","tiger:source":"tiger_import_dch_v0.6_20070813","tiger:tlid":"15313621:15314402","tiger:upload_uuid":"bulk_upload.pl-b79f893a-0be1-4a5f-a183-6aea114c9af7","tiger:zip_left":"49093","tiger:zip_right":"49093"},"nodes":["n185978828","n185980222","n185980223","n185980225","n185980227","n185955743","n185980229"]},"w17966056":{"id":"w17966056","version":"1","changeset":"402341","user":"DaveHansenTiger","uid":"7168","visible":"true","timestamp":"2007-12-23T20:41:57Z","tags":{"highway":"residential","name":"Angell Ave","tiger:cfcc":"A41","tiger:county":"St. Joseph, MI","tiger:name_base":"Angell","tiger:name_type":"Ave","tiger:reviewed":"no","tiger:separated":"no","tiger:source":"tiger_import_dch_v0.6_20070813","tiger:tlid":"15313639","tiger:upload_uuid":"bulk_upload.pl-b79f893a-0be1-4a5f-a183-6aea114c9af7","tiger:zip_left":"49093","tiger:zip_right":"49093"},"nodes":["n185966354","n185973839","n185973840","n185966293"]},"w34367079":{"id":"w34367079","version":"1","changeset":"1160198","user":"TIGERcnl","uid":"120146","visible":"true","timestamp":"2009-05-12T04:27:13Z","tags":{"admin_level":"8","boundary":"administrative","created_by":"polyshp2osm-multipoly","source":"TIGER/Line® 2008 Place Shapefiles (http://www.census.gov/geo/www/tiger/)"},"nodes":["n394381700","n394381701","n394381698","n394381699","n394381700"]},"n185955744":{"id":"n185955744","loc":[-85.611753,41.956208],"version":"2","changeset":"2196690","user":"woodpeck_fixbot","uid":"147510","visible":"true","timestamp":"2009-08-19T04:56:55Z","tags":{}},"n185988932":{"id":"n185988932","loc":[-85.6159,41.956336],"version":"3","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:59:04Z","tags":{}},"n185988934":{"id":"n185988934","loc":[-85.6159158,41.9590646],"version":"3","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:59:04Z","tags":{}},"n185988935":{"id":"n185988935","loc":[-85.6157358,41.959364],"version":"3","changeset":"12169723","user":"Tom Layo","uid":"280679","visible":"true","timestamp":"2012-07-10T06:59:04Z","tags":{"highway":"turning_circle","source":"Bing"}},"n2138447007":{"id":"n2138447007","loc":[-85.6130784,41.9590689],"version":"1","changeset":"14878989","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-02T05:02:39Z","tags":{}},"n2138447008":{"id":"n2138447008","loc":[-85.6133328,41.9593805],"version":"1","changeset":"14878989","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-02T05:02:39Z","tags":{}},"n2138447003":{"id":"n2138447003","loc":[-85.610238,41.9547745],"version":"1","changeset":"14878989","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-02T05:02:39Z","tags":{}},"n2138447004":{"id":"n2138447004","loc":[-85.6102652,41.9566041],"version":"1","changeset":"14878989","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-02T05:02:39Z","tags":{}},"n2138447005":{"id":"n2138447005","loc":[-85.610325,41.9568823],"version":"1","changeset":"14878989","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-02T05:02:39Z","tags":{}},"n2138447006":{"id":"n2138447006","loc":[-85.6105644,41.9571383],"version":"1","changeset":"14878989","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-02T05:02:39Z","tags":{}},"n2138447009":{"id":"n2138447009","loc":[-85.6135946,41.959948],"version":"1","changeset":"14878989","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-02T05:02:39Z","tags":{}},"n2138447010":{"id":"n2138447010","loc":[-85.6136071,41.9629372],"version":"1","changeset":"14878989","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-02T05:02:39Z","tags":{}},"n2138447011":{"id":"n2138447011","loc":[-85.6134392,41.9633182],"version":"1","changeset":"14878989","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-02T05:02:39Z","tags":{}},"n2138447012":{"id":"n2138447012","loc":[-85.6130151,41.9636073],"version":"1","changeset":"14878989","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-02T05:02:39Z","tags":{}},"n2138447013":{"id":"n2138447013","loc":[-85.6122729,41.9637125],"version":"1","changeset":"14878989","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-02T05:02:39Z","tags":{}},"n2138447014":{"id":"n2138447014","loc":[-85.6056682,41.963752],"version":"1","changeset":"14878989","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-02T05:02:39Z","tags":{}},"w17964174":{"id":"w17964174","version":"1","changeset":"402341","user":"DaveHansenTiger","uid":"7168","visible":"true","timestamp":"2007-12-23T20:27:41Z","tags":{"access":"private","highway":"service","tiger:cfcc":"A74","tiger:county":"St. Joseph, MI","tiger:reviewed":"no","tiger:source":"tiger_import_dch_v0.6_20070813","tiger:tlid":"15314401","tiger:upload_uuid":"bulk_upload.pl-b79f893a-0be1-4a5f-a183-6aea114c9af7"},"nodes":["n185955743","n185955744"]},"w17967743":{"id":"w17967743","version":"1","changeset":"402580","user":"DaveHansenTiger","uid":"7168","visible":"true","timestamp":"2007-12-23T20:54:06Z","tags":{"access":"private","highway":"service","name":"Manistee River Rd","tiger:cfcc":"A74","tiger:county":"St. Joseph, MI","tiger:name_base":"Manistee River","tiger:name_type":"Rd","tiger:reviewed":"no","tiger:source":"tiger_import_dch_v0.6_20070813","tiger:tlid":"15326121:15326126:15326127:15326116","tiger:upload_uuid":"bulk_upload.pl-b79f893a-0be1-4a5f-a183-6aea114c9af7","tiger:zip_left":"49093","tiger:zip_right":"49093"},"nodes":["n185971574","n185988932","n185971407","n185981301","n185967987","n185988934","n185988935"]},"w203839666":{"id":"w203839666","version":"1","changeset":"14878989","user":"ansis","uid":"1193517","visible":"true","timestamp":"2013-02-02T05:02:39Z","tags":{"highway":"residential","name":"Hov Aire Drive"},"nodes":["n2138447003","n2138447004","n2138447005","n2138447006","n2138447007","n2138447008","n2138447009","n2138447010","n2138447011","n2138447012","n2138447013","n2138447014"]}}';iD.data = {
-    "deprecated": [
-        {
-            "old": {
-                "amenity": "firepit"
-            },
-            "replace": {
-                "leisure": "firepit"
-            }
-        },
-        {
-            "old": {
-                "barrier": "wire_fence"
-            },
-            "replace": {
-                "barrier": "fence",
-                "fence_type": "chain"
-            }
-        },
-        {
-            "old": {
-                "barrier": "wood_fence"
-            },
-            "replace": {
-                "barrier": "fence",
-                "fence_type": "wood"
-            }
-        },
-        {
-            "old": {
-                "highway": "ford"
-            },
-            "replace": {
-                "ford": "yes"
-            }
-        },
-        {
-            "old": {
-                "highway": "stile"
-            },
-            "replace": {
-                "barrier": "stile"
-            }
-        },
-        {
-            "old": {
-                "highway": "incline"
-            },
-            "replace": {
-                "highway": "road",
-                "incline": "up"
-            }
-        },
-        {
-            "old": {
-                "highway": "incline_steep"
-            },
-            "replace": {
-                "highway": "road",
-                "incline": "up"
-            }
-        },
-        {
-            "old": {
-                "highway": "unsurfaced"
-            },
-            "replace": {
-                "highway": "road",
-                "incline": "unpaved"
-            }
-        },
-        {
-            "old": {
-                "landuse": "wood"
-            },
-            "replace": {
-                "landuse": "forest",
-                "natural": "wood"
-            }
-        },
-        {
-            "old": {
-                "natural": "marsh"
-            },
-            "replace": {
-                "natural": "wetland",
-                "wetland": "marsh"
-            }
-        },
-        {
-            "old": {
-                "power_source": "*"
-            },
-            "replace": {
-                "generator:source": "$1"
-            }
-        },
-        {
-            "old": {
-                "power_rating": "*"
-            },
-            "replace": {
-                "generator:output": "$1"
-            }
-        },
-        {
-            "old": {
-                "shop": "organic"
-            },
-            "replace": {
-                "shop": "supermarket",
-                "organic": "only"
-            }
-        }
-    ],
-    "discarded": [
-        "created_by",
-        "odbl",
-        "odbl:note",
-        "tiger:upload_uuid",
-        "tiger:tlid",
-        "tiger:source",
-        "tiger:separated",
-        "geobase:datasetName",
-        "geobase:uuid",
-        "sub_sea:type",
-        "KSJ2:ADS",
-        "KSJ2:ARE",
-        "KSJ2:AdminArea",
-        "KSJ2:COP_label",
-        "KSJ2:DFD",
-        "KSJ2:INT",
-        "KSJ2:INT_label",
-        "KSJ2:LOC",
-        "KSJ2:LPN",
-        "KSJ2:OPC",
-        "KSJ2:PubFacAdmin",
-        "KSJ2:RAC",
-        "KSJ2:RAC_label",
-        "KSJ2:RIC",
-        "KSJ2:RIN",
-        "KSJ2:WSC",
-        "KSJ2:coordinate",
-        "KSJ2:curve_id",
-        "KSJ2:curve_type",
-        "KSJ2:filename",
-        "KSJ2:lake_id",
-        "KSJ2:lat",
-        "KSJ2:long",
-        "KSJ2:river_id",
-        "yh:LINE_NAME",
-        "yh:LINE_NUM",
-        "yh:STRUCTURE",
-        "yh:TOTYUMONO",
-        "yh:TYPE",
-        "yh:WIDTH_RANK",
-        "SK53_bulk:load"
-    ],
-    "imagery": [
-        {
-            "name": "7th Series (OS7)",
-            "type": "tms",
-            "template": "http://ooc.openstreetmap.org/os7/{zoom}/{x}/{y}.jpg",
-            "polygon": [
-                [
-                    [
-                        -9,
-                        49.8
-                    ],
-                    [
-                        -9,
-                        61.1
-                    ],
-                    [
-                        1.9,
-                        61.1
-                    ],
-                    [
-                        1.9,
-                        49.8
-                    ],
-                    [
-                        -9,
-                        49.8
-                    ]
-                ]
-            ]
-        },
-        {
-            "name": "AGRI black-and-white 2.5m",
-            "type": "tms",
-            "template": "http://agri.openstreetmap.org/{zoom}/{x}/{y}.png",
-            "polygon": [
-                [
-                    [
-                        112.28778,
-                        -28.784589
-                    ],
-                    [
-                        112.71488,
-                        -31.13894
-                    ],
-                    [
-                        114.11263,
-                        -34.178287
-                    ],
-                    [
-                        113.60788,
-                        -37.39012
-                    ],
-                    [
-                        117.17992,
-                        -37.451794
-                    ],
-                    [
-                        119.31538,
-                        -37.42096
-                    ],
-                    [
-                        121.72262,
-                        -36.708394
-                    ],
-                    [
-                        123.81925,
-                        -35.76893
-                    ],
-                    [
-                        125.9547,
-                        -34.3066
-                    ],
-                    [
-                        127.97368,
-                        -33.727398
-                    ],
-                    [
-                        130.07031,
-                        -33.24166
-                    ],
-                    [
-                        130.10913,
-                        -33.888704
-                    ],
-                    [
-                        131.00214,
-                        -34.049705
-                    ],
-                    [
-                        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.368294
-                    ],
-                    [
-                        142.3783,
-                        -40.64702
-                    ],
-                    [
-                        142.49478,
-                        -42.074874
-                    ],
-                    [
-                        144.009,
-                        -44.060127
-                    ],
-                    [
-                        147.23161,
-                        -44.03222
-                    ],
-                    [
-                        149.05645,
-                        -42.534313
-                    ],
-                    [
-                        149.52237,
-                        -40.99959
-                    ],
-                    [
-                        149.9494,
-                        -40.852921
-                    ],
-                    [
-                        150.8036,
-                        -38.09627
-                    ],
-                    [
-                        151.81313,
-                        -38.12682
-                    ],
-                    [
-                        156.20052,
-                        -22.667706
-                    ],
-                    [
-                        156.20052,
-                        -20.10109
-                    ],
-                    [
-                        156.62761,
-                        -17.417627
-                    ],
-                    [
-                        155.26869,
-                        -17.19521
-                    ],
-                    [
-                        154.14272,
-                        -19.51662
-                    ],
-                    [
-                        153.5215,
-                        -18.34139
-                    ],
-                    [
-                        153.05558,
-                        -16.5636
-                    ],
-                    [
-                        152.78379,
-                        -15.256768
-                    ],
-                    [
-                        152.27905,
-                        -13.4135
-                    ],
-                    [
-                        151.3472,
-                        -12.391767
-                    ],
-                    [
-                        149.48354,
-                        -12.05024
-                    ],
-                    [
-                        146.9598,
-                        -9.992408
-                    ],
-                    [
-                        135.9719,
-                        -9.992408
-                    ],
-                    [
-                        130.3032,
-                        -10.33636
-                    ],
-                    [
-                        128.09016,
-                        -12.164136
-                    ],
-                    [
-                        125.91588,
-                        -12.315912
-                    ],
-                    [
-                        124.3239,
-                        -11.860326
-                    ],
-                    [
-                        122.03323,
-                        -11.974295
-                    ],
-                    [
-                        118.26706,
-                        -16.9353
-                    ],
-                    [
-                        115.93747,
-                        -19.11357
-                    ],
-                    [
-                        114.0738,
-                        -21.11863
-                    ],
-                    [
-                        113.49141,
-                        -22.596033
-                    ],
-                    [
-                        112.28778,
-                        -28.784589
-                    ]
-                ]
-            ],
-            "terms_text": "AGRI"
-        },
-        {
-            "name": "Bing aerial imagery",
-            "type": "bing",
-            "description": "Satellite and aerial imagery.",
-            "template": "http://www.bing.com/maps/",
-            "scaleExtent": [
-                0,
-                22
-            ],
-            "id": "Bing",
-            "default": true
-        },
-        {
-            "name": "British Columbia Mosaic",
-            "type": "tms",
-            "template": "http://{switch:a,b,c,d}.imagery.paulnorman.ca/tiles/bc_mosaic/{zoom}/{x}/{y}.png",
-            "scaleExtent": [
-                9,
-                20
-            ],
-            "polygon": [
-                [
-                    [
-                        -123.3176032,
-                        49.3272567
-                    ],
-                    [
-                        -123.4405258,
-                        49.3268222
-                    ],
-                    [
-                        -123.440717,
-                        49.3384429
-                    ],
-                    [
-                        -123.4398375,
-                        49.3430357
-                    ],
-                    [
-                        -123.4401258,
-                        49.3435398
-                    ],
-                    [
-                        -123.4401106,
-                        49.3439946
-                    ],
-                    [
-                        -123.4406265,
-                        49.3444493
-                    ],
-                    [
-                        -123.4404747,
-                        49.3455762
-                    ],
-                    [
-                        -123.4397768,
-                        49.3460606
-                    ],
-                    [
-                        -123.4389726,
-                        49.3461298
-                    ],
-                    [
-                        -123.4372904,
-                        49.3567236
-                    ],
-                    [
-                        -123.4374774,
-                        49.3710843
-                    ],
-                    [
-                        -123.4335292,
-                        49.3709446
-                    ],
-                    [
-                        -123.4330357,
-                        49.373725
-                    ],
-                    [
-                        -123.4332717,
-                        49.3751221
-                    ],
-                    [
-                        -123.4322847,
-                        49.3761001
-                    ],
-                    [
-                        -123.4317482,
-                        49.3791736
-                    ],
-                    [
-                        -123.4314264,
-                        49.3795927
-                    ],
-                    [
-                        -123.4307826,
-                        49.3823866
-                    ],
-                    [
-                        -123.4313405,
-                        49.3827358
-                    ],
-                    [
-                        -123.4312118,
-                        49.3838533
-                    ],
-                    [
-                        -123.4300415,
-                        49.3845883
-                    ],
-                    [
-                        -123.4189858,
-                        49.3847087
-                    ],
-                    [
-                        -123.4192235,
-                        49.4135198
-                    ],
-                    [
-                        -123.3972532,
-                        49.4135691
-                    ],
-                    [
-                        -123.3972758,
-                        49.4243473
-                    ],
-                    [
-                        -123.4006929,
-                        49.4243314
-                    ],
-                    [
-                        -123.4007741,
-                        49.5703491
-                    ],
-                    [
-                        -123.4000812,
-                        49.570345
-                    ],
-                    [
-                        -123.4010761,
-                        49.5933838
-                    ],
-                    [
-                        -123.3760399,
-                        49.5932848
-                    ],
-                    [
-                        -123.3769811,
-                        49.6756063
-                    ],
-                    [
-                        -123.3507288,
-                        49.6756396
-                    ],
-                    [
-                        -123.3507969,
-                        49.7086751
-                    ],
-                    [
-                        -123.332887,
-                        49.708722
-                    ],
-                    [
-                        -123.3327888,
-                        49.7256288
-                    ],
-                    [
-                        -123.3007111,
-                        49.7255625
-                    ],
-                    [
-                        -123.3009164,
-                        49.7375384
-                    ],
-                    [
-                        -123.2885986,
-                        49.737638
-                    ],
-                    [
-                        -123.2887823,
-                        49.8249207
-                    ],
-                    [
-                        -123.2997955,
-                        49.8249207
-                    ],
-                    [
-                        -123.3011721,
-                        49.8497814
-                    ],
-                    [
-                        -123.3218218,
-                        49.850669
-                    ],
-                    [
-                        -123.3273284,
-                        49.8577696
-                    ],
-                    [
-                        -123.3276726,
-                        49.9758852
-                    ],
-                    [
-                        -123.3008279,
-                        49.9752212
-                    ],
-                    [
-                        -123.3007204,
-                        50.0997002
-                    ],
-                    [
-                        -123.2501716,
-                        50.100735
-                    ],
-                    [
-                        -123.25091,
-                        50.2754901
-                    ],
-                    [
-                        -123.0224338,
-                        50.2755598
-                    ],
-                    [
-                        -123.0224879,
-                        50.3254853
-                    ],
-                    [
-                        -123.0009318,
-                        50.3254689
-                    ],
-                    [
-                        -123.0007778,
-                        50.3423899
-                    ],
-                    [
-                        -122.9775023,
-                        50.3423408
-                    ],
-                    [
-                        -122.9774766,
-                        50.3504306
-                    ],
-                    [
-                        -122.9508137,
-                        50.3504961
-                    ],
-                    [
-                        -122.950795,
-                        50.3711984
-                    ],
-                    [
-                        -122.9325221,
-                        50.3711521
-                    ],
-                    [
-                        -122.9321048,
-                        50.399793
-                    ],
-                    [
-                        -122.8874234,
-                        50.3999748
-                    ],
-                    [
-                        -122.8873385,
-                        50.4256108
-                    ],
-                    [
-                        -122.6620152,
-                        50.4256959
-                    ],
-                    [
-                        -122.6623083,
-                        50.3994506
-                    ],
-                    [
-                        -122.5990316,
-                        50.3992413
-                    ],
-                    [
-                        -122.5988274,
-                        50.3755206
-                    ],
-                    [
-                        -122.5724832,
-                        50.3753706
-                    ],
-                    [
-                        -122.5735621,
-                        50.2493891
-                    ],
-                    [
-                        -122.5990415,
-                        50.2494643
-                    ],
-                    [
-                        -122.5991504,
-                        50.2265663
-                    ],
-                    [
-                        -122.6185016,
-                        50.2266359
-                    ],
-                    [
-                        -122.6185741,
-                        50.2244081
-                    ],
-                    [
-                        -122.6490609,
-                        50.2245126
-                    ],
-                    [
-                        -122.6492181,
-                        50.1993528
-                    ],
-                    [
-                        -122.7308575,
-                        50.1993758
-                    ],
-                    [
-                        -122.7311583,
-                        50.1244287
-                    ],
-                    [
-                        -122.7490352,
-                        50.1245109
-                    ],
-                    [
-                        -122.7490541,
-                        50.0903032
-                    ],
-                    [
-                        -122.7687806,
-                        50.0903435
-                    ],
-                    [
-                        -122.7689801,
-                        49.9494546
-                    ],
-                    [
-                        -122.999047,
-                        49.9494706
-                    ],
-                    [
-                        -122.9991199,
-                        49.8754553
-                    ],
-                    [
-                        -122.9775894,
-                        49.8754553
-                    ],
-                    [
-                        -122.9778145,
-                        49.6995098
-                    ],
-                    [
-                        -122.9992362,
-                        49.6994781
-                    ],
-                    [
-                        -122.9992524,
-                        49.6516526
-                    ],
-                    [
-                        -123.0221525,
-                        49.6516526
-                    ],
-                    [
-                        -123.0221162,
-                        49.5995096
-                    ],
-                    [
-                        -123.0491898,
-                        49.5994625
-                    ],
-                    [
-                        -123.0491898,
-                        49.5940523
-                    ],
-                    [
-                        -123.0664647,
-                        49.5940405
-                    ],
-                    [
-                        -123.0663594,
-                        49.5451868
-                    ],
-                    [
-                        -123.0699906,
-                        49.5451202
-                    ],
-                    [
-                        -123.0699008,
-                        49.5413153
-                    ],
-                    [
-                        -123.0706835,
-                        49.5392837
-                    ],
-                    [
-                        -123.0708888,
-                        49.5379931
-                    ],
-                    [
-                        -123.0711454,
-                        49.5368773
-                    ],
-                    [
-                        -123.0711069,
-                        49.5358115
-                    ],
-                    [
-                        -123.0713764,
-                        49.532822
-                    ],
-                    [
-                        -123.0716458,
-                        49.5321141
-                    ],
-                    [
-                        -123.07171,
-                        49.5313896
-                    ],
-                    [
-                        -123.0720308,
-                        49.5304153
-                    ],
-                    [
-                        -123.0739554,
-                        49.5303486
-                    ],
-                    [
-                        -123.0748023,
-                        49.5294992
-                    ],
-                    [
-                        -123.0748151,
-                        49.5288079
-                    ],
-                    [
-                        -123.0743403,
-                        49.5280584
-                    ],
-                    [
-                        -123.073532,
-                        49.5274588
-                    ],
-                    [
-                        -123.0733652,
-                        49.5270423
-                    ],
-                    [
-                        -123.0732882,
-                        49.5255932
-                    ],
-                    [
-                        -123.0737116,
-                        49.5249602
-                    ],
-                    [
-                        -123.0736218,
-                        49.5244938
-                    ],
-                    [
-                        -123.0992583,
-                        49.5244854
-                    ],
-                    [
-                        -123.0991649,
-                        49.4754502
-                    ],
-                    [
-                        -123.071052,
-                        49.4755252
-                    ],
-                    [
-                        -123.071088,
-                        49.4663034
-                    ],
-                    [
-                        -123.0739204,
-                        49.4663054
-                    ],
-                    [
-                        -123.07422,
-                        49.4505028
-                    ],
-                    [
-                        -123.0746319,
-                        49.4500858
-                    ],
-                    [
-                        -123.074651,
-                        49.449329
-                    ],
-                    [
-                        -123.0745999,
-                        49.449018
-                    ],
-                    [
-                        -123.0744619,
-                        49.4486927
-                    ],
-                    [
-                        -123.0743336,
-                        49.4479899
-                    ],
-                    [
-                        -123.0742427,
-                        49.4477688
-                    ],
-                    [
-                        -123.0743061,
-                        49.4447473
-                    ],
-                    [
-                        -123.0747103,
-                        49.4447556
-                    ],
-                    [
-                        -123.0746384,
-                        49.4377306
-                    ],
-                    [
-                        -122.9996506,
-                        49.4377363
-                    ],
-                    [
-                        -122.9996506,
-                        49.4369214
-                    ],
-                    [
-                        -122.8606163,
-                        49.4415314
-                    ],
-                    [
-                        -122.8102616,
-                        49.4423972
-                    ],
-                    [
-                        -122.8098984,
-                        49.3766739
-                    ],
-                    [
-                        -122.4036093,
-                        49.3766617
-                    ],
-                    [
-                        -122.4036341,
-                        49.3771944
-                    ],
-                    [
-                        -122.264739,
-                        49.3773028
-                    ],
-                    [
-                        -122.263542,
-                        49.2360088
-                    ],
-                    [
-                        -122.2155742,
-                        49.236139
-                    ],
-                    [
-                        -122.0580956,
-                        49.235878
-                    ],
-                    [
-                        -121.9538274,
-                        49.2966525
-                    ],
-                    [
-                        -121.9400911,
-                        49.3045389
-                    ],
-                    [
-                        -121.9235761,
-                        49.3142257
-                    ],
-                    [
-                        -121.8990871,
-                        49.3225436
-                    ],
-                    [
-                        -121.8883447,
-                        49.3259752
-                    ],
-                    [
-                        -121.8552982,
-                        49.3363575
-                    ],
-                    [
-                        -121.832697,
-                        49.3441519
-                    ],
-                    [
-                        -121.7671336,
-                        49.3654361
-                    ],
-                    [
-                        -121.6736683,
-                        49.3654589
-                    ],
-                    [
-                        -121.6404153,
-                        49.3743775
-                    ],
-                    [
-                        -121.5961976,
-                        49.3860493
-                    ],
-                    [
-                        -121.5861178,
-                        49.3879193
-                    ],
-                    [
-                        -121.5213684,
-                        49.3994649
-                    ],
-                    [
-                        -121.5117375,
-                        49.4038378
-                    ],
-                    [
-                        -121.4679302,
-                        49.4229024
-                    ],
-                    [
-                        -121.4416803,
-                        49.4345607
-                    ],
-                    [
-                        -121.422429,
-                        49.4345788
-                    ],
-                    [
-                        -121.3462885,
-                        49.3932312
-                    ],
-                    [
-                        -121.3480144,
-                        49.3412388
-                    ],
-                    [
-                        -121.5135035,
-                        49.320577
-                    ],
-                    [
-                        -121.6031683,
-                        49.2771727
-                    ],
-                    [
-                        -121.6584065,
-                        49.1856125
-                    ],
-                    [
-                        -121.679953,
-                        49.1654109
-                    ],
-                    [
-                        -121.7815793,
-                        49.0702559
-                    ],
-                    [
-                        -121.8076228,
-                        49.0622471
-                    ],
-                    [
-                        -121.9393997,
-                        49.0636219
-                    ],
-                    [
-                        -121.9725524,
-                        49.0424179
-                    ],
-                    [
-                        -121.9921394,
-                        49.0332869
-                    ],
-                    [
-                        -122.0035289,
-                        49.0273413
-                    ],
-                    [
-                        -122.0178564,
-                        49.0241067
-                    ],
-                    [
-                        -122.1108634,
-                        48.9992786
-                    ],
-                    [
-                        -122.1493067,
-                        48.9995305
-                    ],
-                    [
-                        -122.1492705,
-                        48.9991498
-                    ],
-                    [
-                        -122.1991447,
-                        48.9996019
-                    ],
-                    [
-                        -122.199181,
-                        48.9991974
-                    ],
-                    [
-                        -122.234365,
-                        48.9994829
-                    ],
-                    [
-                        -122.234365,
-                        49.000173
-                    ],
-                    [
-                        -122.3994722,
-                        49.0012385
-                    ],
-                    [
-                        -122.4521338,
-                        49.0016326
-                    ],
-                    [
-                        -122.4521338,
-                        49.000883
-                    ],
-                    [
-                        -122.4584089,
-                        49.0009306
-                    ],
-                    [
-                        -122.4584814,
-                        48.9993124
-                    ],
-                    [
-                        -122.4992458,
-                        48.9995022
-                    ],
-                    [
-                        -122.4992458,
-                        48.9992906
-                    ],
-                    [
-                        -122.5492618,
-                        48.9995107
-                    ],
-                    [
-                        -122.5492564,
-                        48.9993206
-                    ],
-                    [
-                        -122.6580785,
-                        48.9994212
-                    ],
-                    [
-                        -122.6581061,
-                        48.9954007
-                    ],
-                    [
-                        -122.7067604,
-                        48.9955344
-                    ],
-                    [
-                        -122.7519761,
-                        48.9956392
-                    ],
-                    [
-                        -122.7922063,
-                        48.9957204
-                    ],
-                    [
-                        -122.7921907,
-                        48.9994331
-                    ],
-                    [
-                        -123.0350417,
-                        48.9995724
-                    ],
-                    [
-                        -123.0350437,
-                        49.0000958
-                    ],
-                    [
-                        -123.0397091,
-                        49.0000536
-                    ],
-                    [
-                        -123.0397444,
-                        49.0001812
-                    ],
-                    [
-                        -123.0485506,
-                        49.0001348
-                    ],
-                    [
-                        -123.0485329,
-                        49.0004712
-                    ],
-                    [
-                        -123.0557122,
-                        49.000448
-                    ],
-                    [
-                        -123.0556324,
-                        49.0002284
-                    ],
-                    [
-                        -123.0641365,
-                        49.0001293
-                    ],
-                    [
-                        -123.064158,
-                        48.9999421
-                    ],
-                    [
-                        -123.074899,
-                        48.9996928
-                    ],
-                    [
-                        -123.0750717,
-                        49.0006218
-                    ],
-                    [
-                        -123.0899573,
-                        49.0003726
-                    ],
-                    [
-                        -123.109229,
-                        48.9999421
-                    ],
-                    [
-                        -123.1271193,
-                        49.0003046
-                    ],
-                    [
-                        -123.1359953,
-                        48.9998741
-                    ],
-                    [
-                        -123.1362716,
-                        49.0005765
-                    ],
-                    [
-                        -123.153851,
-                        48.9998061
-                    ],
-                    [
-                        -123.1540533,
-                        49.0006806
-                    ],
-                    [
-                        -123.1710015,
-                        49.0001274
-                    ],
-                    [
-                        -123.2000916,
-                        48.9996849
-                    ],
-                    [
-                        -123.2003446,
-                        49.0497785
-                    ],
-                    [
-                        -123.2108845,
-                        49.0497232
-                    ],
-                    [
-                        -123.2112218,
-                        49.051989
-                    ],
-                    [
-                        -123.2070479,
-                        49.0520857
-                    ],
-                    [
-                        -123.2078911,
-                        49.0607884
-                    ],
-                    [
-                        -123.2191688,
-                        49.0600978
-                    ],
-                    [
-                        -123.218958,
-                        49.0612719
-                    ],
-                    [
-                        -123.2251766,
-                        49.0612719
-                    ],
-                    [
-                        -123.2253874,
-                        49.0622388
-                    ],
-                    [
-                        -123.2297088,
-                        49.0620316
-                    ],
-                    [
-                        -123.2298142,
-                        49.068592
-                    ],
-                    [
-                        -123.2331869,
-                        49.0687301
-                    ],
-                    [
-                        -123.2335031,
-                        49.0705945
-                    ],
-                    [
-                        -123.249313,
-                        49.0702493
-                    ],
-                    [
-                        -123.2497346,
-                        49.0802606
-                    ],
-                    [
-                        -123.2751358,
-                        49.0803986
-                    ],
-                    [
-                        -123.2751358,
-                        49.0870947
-                    ],
-                    [
-                        -123.299483,
-                        49.0873018
-                    ],
-                    [
-                        -123.29944,
-                        49.080253
-                    ],
-                    [
-                        -123.3254508,
-                        49.0803944
-                    ],
-                    [
-                        -123.3254353,
-                        49.1154662
-                    ],
-                    [
-                        -123.2750966,
-                        49.1503341
-                    ],
-                    [
-                        -123.275181,
-                        49.1873267
-                    ],
-                    [
-                        -123.2788067,
-                        49.1871063
-                    ],
-                    [
-                        -123.278891,
-                        49.1910741
-                    ],
-                    [
-                        -123.3004767,
-                        49.1910741
-                    ],
-                    [
-                        -123.3004186,
-                        49.2622933
-                    ],
-                    [
-                        -123.3126185,
-                        49.2622416
-                    ],
-                    [
-                        -123.3125958,
-                        49.2714948
-                    ],
-                    [
-                        -123.3154251,
-                        49.2714727
-                    ],
-                    [
-                        -123.3156628,
-                        49.2818906
-                    ],
-                    [
-                        -123.3174735,
-                        49.2818832
-                    ],
-                    [
-                        -123.3174961,
-                        49.2918488
-                    ],
-                    [
-                        -123.3190353,
-                        49.2918488
-                    ],
-                    [
-                        -123.3190692,
-                        49.298602
-                    ],
-                    [
-                        -123.3202349,
-                        49.2985651
-                    ],
-                    [
-                        -123.3202786,
-                        49.3019749
-                    ],
-                    [
-                        -123.3222679,
-                        49.3019605
-                    ],
-                    [
-                        -123.3223943,
-                        49.3118263
-                    ],
-                    [
-                        -123.3254002,
-                        49.3118086
-                    ],
-                    [
-                        -123.3253898,
-                        49.3201721
-                    ],
-                    [
-                        -123.3192695,
-                        49.3201957
-                    ],
-                    [
-                        -123.3192242,
-                        49.3246748
-                    ],
-                    [
-                        -123.3179437,
-                        49.3246596
-                    ],
-                    [
-                        -123.3179861,
-                        49.3254065
-                    ]
-                ]
-            ],
-            "terms_url": "http://imagery.paulnorman.ca/tiles/about.html",
-            "terms_text": "Copyright Province of British Columbia, City of Surrey"
-        },
-        {
-            "name": "Cambodia, Laos, Thailand, Vietnam bilingual",
-            "type": "tms",
-            "template": "http://{switch:a,b,c,d}.tile.osm-tools.org/osm_then/{zoom}/{x}/{y}.png",
-            "scaleExtent": [
-                0,
-                19
-            ],
-            "polygon": [
-                [
-                    [
-                        97.3,
-                        5.6
-                    ],
-                    [
-                        97.3,
-                        23.4
-                    ],
-                    [
-                        109.6,
-                        23.4
-                    ],
-                    [
-                        109.6,
-                        5.6
-                    ],
-                    [
-                        97.3,
-                        5.6
-                    ]
-                ]
-            ],
-            "terms_url": "http://www.osm-tools.org/",
-            "terms_text": "© osm-tools.org & OpenStreetMap contributors, CC-BY-SA"
-        },
-        {
-            "name": "Freemap.sk Car",
-            "type": "tms",
-            "template": "http://t{switch:1,2,3,4}.freemap.sk/A/{zoom}/{x}/{y}.jpeg",
-            "scaleExtent": [
-                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."
-        },
-        {
-            "name": "Freemap.sk Cyclo",
-            "type": "tms",
-            "template": "http://t{switch:1,2,3,4}.freemap.sk/C/{zoom}/{x}/{y}.jpeg",
-            "scaleExtent": [
-                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."
-        },
-        {
-            "name": "Freemap.sk Hiking",
-            "type": "tms",
-            "template": "http://t{switch:1,2,3,4}.freemap.sk/T/{zoom}/{x}/{y}.jpeg",
-            "scaleExtent": [
-                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."
-        },
-        {
-            "name": "Freemap.sk Ski",
-            "type": "tms",
-            "template": "http://t{switch:1,2,3,4}.freemap.sk/K/{zoom}/{x}/{y}.jpeg",
-            "scaleExtent": [
-                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."
-        },
-        {
-            "name": "Fugro (Denmark)",
-            "type": "tms",
-            "template": "http://{switch:a,b,c}.tile.openstreetmap.dk/fugro2005/{zoom}/{x}/{y}.png",
-            "scaleExtent": [
-                0,
-                19
-            ],
-            "polygon": [
-                [
-                    [
-                        8.3743941,
-                        54.9551655
-                    ],
-                    [
-                        8.3683809,
-                        55.4042149
-                    ],
-                    [
-                        8.2103997,
-                        55.4039795
-                    ],
-                    [
-                        8.2087314,
-                        55.4937345
-                    ],
-                    [
-                        8.0502655,
-                        55.4924731
-                    ],
-                    [
-                        8.0185123,
-                        56.7501399
-                    ],
-                    [
-                        8.1819161,
-                        56.7509948
-                    ],
-                    [
-                        8.1763274,
-                        57.0208898
-                    ],
-                    [
-                        8.3413329,
-                        57.0219872
-                    ],
-                    [
-                        8.3392467,
-                        57.1119574
-                    ],
-                    [
-                        8.5054433,
-                        57.1123212
-                    ],
-                    [
-                        8.5033923,
-                        57.2020499
-                    ],
-                    [
-                        9.3316304,
-                        57.2027636
-                    ],
-                    [
-                        9.3319079,
-                        57.2924835
-                    ],
-                    [
-                        9.4978864,
-                        57.2919578
-                    ],
-                    [
-                        9.4988593,
-                        57.3820608
-                    ],
-                    [
-                        9.6649749,
-                        57.3811615
-                    ],
-                    [
-                        9.6687295,
-                        57.5605591
-                    ],
-                    [
-                        9.8351961,
-                        57.5596265
-                    ],
-                    [
-                        9.8374896,
-                        57.6493322
-                    ],
-                    [
-                        10.1725726,
-                        57.6462818
-                    ],
-                    [
-                        10.1754245,
-                        57.7367768
-                    ],
-                    [
-                        10.5118282,
-                        57.7330269
-                    ],
-                    [
-                        10.5152095,
-                        57.8228945
-                    ],
-                    [
-                        10.6834853,
-                        57.8207722
-                    ],
-                    [
-                        10.6751613,
-                        57.6412021
-                    ],
-                    [
-                        10.5077045,
-                        57.6433097
-                    ],
-                    [
-                        10.5039992,
-                        57.5535088
-                    ],
-                    [
-                        10.671038,
-                        57.5514113
-                    ],
-                    [
-                        10.6507805,
-                        57.1024538
-                    ],
-                    [
-                        10.4857673,
-                        57.1045138
-                    ],
-                    [
-                        10.4786236,
-                        56.9249051
-                    ],
-                    [
-                        10.3143981,
-                        56.9267573
-                    ],
-                    [
-                        10.3112341,
-                        56.8369269
-                    ],
-                    [
-                        10.4750295,
-                        56.83509
-                    ],
-                    [
-                        10.4649016,
-                        56.5656681
-                    ],
-                    [
-                        10.9524239,
-                        56.5589761
-                    ],
-                    [
-                        10.9479249,
-                        56.4692243
-                    ],
-                    [
-                        11.1099335,
-                        56.4664675
-                    ],
-                    [
-                        11.1052639,
-                        56.376833
-                    ],
-                    [
-                        10.9429901,
-                        56.3795284
-                    ],
-                    [
-                        10.9341235,
-                        56.1994768
-                    ],
-                    [
-                        10.7719685,
-                        56.2020244
-                    ],
-                    [
-                        10.7694751,
-                        56.1120103
-                    ],
-                    [
-                        10.6079695,
-                        56.1150259
-                    ],
-                    [
-                        10.4466742,
-                        56.116717
-                    ],
-                    [
-                        10.2865948,
-                        56.118675
-                    ],
-                    [
-                        10.2831527,
-                        56.0281851
-                    ],
-                    [
-                        10.4439274,
-                        56.0270388
-                    ],
-                    [
-                        10.4417713,
-                        55.7579243
-                    ],
-                    [
-                        10.4334961,
-                        55.6693533
-                    ],
-                    [
-                        10.743814,
-                        55.6646861
-                    ],
-                    [
-                        10.743814,
-                        55.5712253
-                    ],
-                    [
-                        10.8969041,
-                        55.5712253
-                    ],
-                    [
-                        10.9051793,
-                        55.3953852
-                    ],
-                    [
-                        11.0613726,
-                        55.3812841
-                    ],
-                    [
-                        11.0593038,
-                        55.1124061
-                    ],
-                    [
-                        11.0458567,
-                        55.0318621
-                    ],
-                    [
-                        11.2030844,
-                        55.0247474
-                    ],
-                    [
-                        11.2030844,
-                        55.117139
-                    ],
-                    [
-                        11.0593038,
-                        55.1124061
-                    ],
-                    [
-                        11.0613726,
-                        55.3812841
-                    ],
-                    [
-                        11.0789572,
-                        55.5712253
-                    ],
-                    [
-                        10.8969041,
-                        55.5712253
-                    ],
-                    [
-                        10.9258671,
-                        55.6670198
-                    ],
-                    [
-                        10.743814,
-                        55.6646861
-                    ],
-                    [
-                        10.7562267,
-                        55.7579243
-                    ],
-                    [
-                        10.4417713,
-                        55.7579243
-                    ],
-                    [
-                        10.4439274,
-                        56.0270388
-                    ],
-                    [
-                        10.4466742,
-                        56.116717
-                    ],
-                    [
-                        10.6079695,
-                        56.1150259
-                    ],
-                    [
-                        10.6052053,
-                        56.0247462
-                    ],
-                    [
-                        10.9258671,
-                        56.0201215
-                    ],
-                    [
-                        10.9197132,
-                        55.9309388
-                    ],
-                    [
-                        11.0802782,
-                        55.92792
-                    ],
-                    [
-                        11.0858066,
-                        56.0178284
-                    ],
-                    [
-                        11.7265047,
-                        56.005058
-                    ],
-                    [
-                        11.7319981,
-                        56.0952142
-                    ],
-                    [
-                        12.0540333,
-                        56.0871256
-                    ],
-                    [
-                        12.0608477,
-                        56.1762576
-                    ],
-                    [
-                        12.7023469,
-                        56.1594405
-                    ],
-                    [
-                        12.6611131,
-                        55.7114318
-                    ],
-                    [
-                        12.9792318,
-                        55.7014026
-                    ],
-                    [
-                        12.9612912,
-                        55.5217294
-                    ],
-                    [
-                        12.3268659,
-                        55.5412096
-                    ],
-                    [
-                        12.3206071,
-                        55.4513655
-                    ],
-                    [
-                        12.4778226,
-                        55.447067
-                    ],
-                    [
-                        12.4702432,
-                        55.3570479
-                    ],
-                    [
-                        12.6269738,
-                        55.3523837
-                    ],
-                    [
-                        12.6200898,
-                        55.2632576
-                    ],
-                    [
-                        12.4627339,
-                        55.26722
-                    ],
-                    [
-                        12.4552949,
-                        55.1778223
-                    ],
-                    [
-                        12.2987046,
-                        55.1822303
-                    ],
-                    [
-                        12.2897344,
-                        55.0923641
-                    ],
-                    [
-                        12.6048608,
-                        55.0832904
-                    ],
-                    [
-                        12.5872011,
-                        54.9036285
-                    ],
-                    [
-                        12.2766618,
-                        54.9119031
-                    ],
-                    [
-                        12.2610181,
-                        54.7331602
-                    ],
-                    [
-                        12.1070691,
-                        54.7378161
-                    ],
-                    [
-                        12.0858621,
-                        54.4681655
-                    ],
-                    [
-                        11.7794953,
-                        54.4753579
-                    ],
-                    [
-                        11.7837381,
-                        54.5654783
-                    ],
-                    [
-                        11.1658525,
-                        54.5782155
-                    ],
-                    [
-                        11.1706443,
-                        54.6686508
-                    ],
-                    [
-                        10.8617173,
-                        54.6733956
-                    ],
-                    [
-                        10.8651245,
-                        54.7634667
-                    ],
-                    [
-                        10.7713646,
-                        54.7643888
-                    ],
-                    [
-                        10.7707276,
-                        54.7372807
-                    ],
-                    [
-                        10.7551428,
-                        54.7375776
-                    ],
-                    [
-                        10.7544039,
-                        54.7195666
-                    ],
-                    [
-                        10.7389074,
-                        54.7197588
-                    ],
-                    [
-                        10.7384368,
-                        54.7108482
-                    ],
-                    [
-                        10.7074486,
-                        54.7113045
-                    ],
-                    [
-                        10.7041094,
-                        54.6756741
-                    ],
-                    [
-                        10.5510973,
-                        54.6781698
-                    ],
-                    [
-                        10.5547184,
-                        54.7670245
-                    ],
-                    [
-                        10.2423994,
-                        54.7705935
-                    ],
-                    [
-                        10.2459845,
-                        54.8604673
-                    ],
-                    [
-                        10.0902268,
-                        54.8622134
-                    ],
-                    [
-                        10.0873731,
-                        54.7723851
-                    ],
-                    [
-                        9.1555798,
-                        54.7769557
-                    ],
-                    [
-                        9.1562752,
-                        54.8675369
-                    ],
-                    [
-                        8.5321973,
-                        54.8663765
-                    ],
-                    [
-                        8.531432,
-                        54.95516
-                    ]
-                ],
-                [
-                    [
-                        11.4577738,
-                        56.819554
-                    ],
-                    [
-                        11.7849181,
-                        56.8127385
-                    ],
-                    [
-                        11.7716715,
-                        56.6332796
-                    ],
-                    [
-                        11.4459621,
-                        56.6401087
-                    ]
-                ],
-                [
-                    [
-                        11.3274736,
-                        57.3612962
-                    ],
-                    [
-                        11.3161808,
-                        57.1818004
-                    ],
-                    [
-                        11.1508692,
-                        57.1847276
-                    ],
-                    [
-                        11.1456628,
-                        57.094962
-                    ],
-                    [
-                        10.8157703,
-                        57.1001693
-                    ],
-                    [
-                        10.8290599,
-                        57.3695272
-                    ]
-                ],
-                [
-                    [
-                        11.5843266,
-                        56.2777928
-                    ],
-                    [
-                        11.5782882,
-                        56.1880397
-                    ],
-                    [
-                        11.7392309,
-                        56.1845765
-                    ],
-                    [
-                        11.7456428,
-                        56.2743186
-                    ]
-                ],
-                [
-                    [
-                        14.6825922,
-                        55.3639405
-                    ],
-                    [
-                        14.8395247,
-                        55.3565231
-                    ],
-                    [
-                        14.8263755,
-                        55.2671261
-                    ],
-                    [
-                        15.1393406,
-                        55.2517359
-                    ],
-                    [
-                        15.1532015,
-                        55.3410836
-                    ],
-                    [
-                        15.309925,
-                        55.3330556
-                    ],
-                    [
-                        15.295719,
-                        55.2437356
-                    ],
-                    [
-                        15.1393406,
-                        55.2517359
-                    ],
-                    [
-                        15.1255631,
-                        55.1623802
-                    ],
-                    [
-                        15.2815819,
-                        55.1544167
-                    ],
-                    [
-                        15.2535578,
-                        54.9757646
-                    ],
-                    [
-                        14.6317464,
-                        55.0062496
-                    ]
-                ]
-            ],
-            "terms_url": "http://wiki.openstreetmap.org/wiki/Fugro",
-            "terms_text": "Fugro Aerial Mapping"
-        },
-        {
-            "name": "Geodatastyrelsen (Denmark)",
-            "type": "tms",
-            "template": "http://mapproxy.gpweb.dk/tiles/1.0.0/kortforsyningen_ortoforaar/EPSG3857/{zoom}/{x}/{y}.jpeg",
-            "scaleExtent": [
-                0,
-                21
-            ],
-            "polygon": [
-                [
-                    [
-                        8.3743941,
-                        54.9551655
-                    ],
-                    [
-                        8.3683809,
-                        55.4042149
-                    ],
-                    [
-                        8.2103997,
-                        55.4039795
-                    ],
-                    [
-                        8.2087314,
-                        55.4937345
-                    ],
-                    [
-                        8.0502655,
-                        55.4924731
-                    ],
-                    [
-                        8.0185123,
-                        56.7501399
-                    ],
-                    [
-                        8.1819161,
-                        56.7509948
-                    ],
-                    [
-                        8.1763274,
-                        57.0208898
-                    ],
-                    [
-                        8.3413329,
-                        57.0219872
-                    ],
-                    [
-                        8.3392467,
-                        57.1119574
-                    ],
-                    [
-                        8.5054433,
-                        57.1123212
-                    ],
-                    [
-                        8.5033923,
-                        57.2020499
-                    ],
-                    [
-                        9.3316304,
-                        57.2027636
-                    ],
-                    [
-                        9.3319079,
-                        57.2924835
-                    ],
-                    [
-                        9.4978864,
-                        57.2919578
-                    ],
-                    [
-                        9.4988593,
-                        57.3820608
-                    ],
-                    [
-                        9.6649749,
-                        57.3811615
-                    ],
-                    [
-                        9.6687295,
-                        57.5605591
-                    ],
-                    [
-                        9.8351961,
-                        57.5596265
-                    ],
-                    [
-                        9.8374896,
-                        57.6493322
-                    ],
-                    [
-                        10.1725726,
-                        57.6462818
-                    ],
-                    [
-                        10.1754245,
-                        57.7367768
-                    ],
-                    [
-                        10.5118282,
-                        57.7330269
-                    ],
-                    [
-                        10.5152095,
-                        57.8228945
-                    ],
-                    [
-                        10.6834853,
-                        57.8207722
-                    ],
-                    [
-                        10.6751613,
-                        57.6412021
-                    ],
-                    [
-                        10.5077045,
-                        57.6433097
-                    ],
-                    [
-                        10.5039992,
-                        57.5535088
-                    ],
-                    [
-                        10.671038,
-                        57.5514113
-                    ],
-                    [
-                        10.6507805,
-                        57.1024538
-                    ],
-                    [
-                        10.4857673,
-                        57.1045138
-                    ],
-                    [
-                        10.4786236,
-                        56.9249051
-                    ],
-                    [
-                        10.3143981,
-                        56.9267573
-                    ],
-                    [
-                        10.3112341,
-                        56.8369269
-                    ],
-                    [
-                        10.4750295,
-                        56.83509
-                    ],
-                    [
-                        10.4649016,
-                        56.5656681
-                    ],
-                    [
-                        10.9524239,
-                        56.5589761
-                    ],
-                    [
-                        10.9479249,
-                        56.4692243
-                    ],
-                    [
-                        11.1099335,
-                        56.4664675
-                    ],
-                    [
-                        11.1052639,
-                        56.376833
-                    ],
-                    [
-                        10.9429901,
-                        56.3795284
-                    ],
-                    [
-                        10.9341235,
-                        56.1994768
-                    ],
-                    [
-                        10.7719685,
-                        56.2020244
-                    ],
-                    [
-                        10.7694751,
-                        56.1120103
-                    ],
-                    [
-                        10.6079695,
-                        56.1150259
-                    ],
-                    [
-                        10.4466742,
-                        56.116717
-                    ],
-                    [
-                        10.2865948,
-                        56.118675
-                    ],
-                    [
-                        10.2831527,
-                        56.0281851
-                    ],
-                    [
-                        10.4439274,
-                        56.0270388
-                    ],
-                    [
-                        10.4417713,
-                        55.7579243
-                    ],
-                    [
-                        10.4334961,
-                        55.6693533
-                    ],
-                    [
-                        10.743814,
-                        55.6646861
-                    ],
-                    [
-                        10.743814,
-                        55.5712253
-                    ],
-                    [
-                        10.8969041,
-                        55.5712253
-                    ],
-                    [
-                        10.9051793,
-                        55.3953852
-                    ],
-                    [
-                        11.0613726,
-                        55.3812841
-                    ],
-                    [
-                        11.0593038,
-                        55.1124061
-                    ],
-                    [
-                        11.0458567,
-                        55.0318621
-                    ],
-                    [
-                        11.2030844,
-                        55.0247474
-                    ],
-                    [
-                        11.2030844,
-                        55.117139
-                    ],
-                    [
-                        11.0593038,
-                        55.1124061
-                    ],
-                    [
-                        11.0613726,
-                        55.3812841
-                    ],
-                    [
-                        11.0789572,
-                        55.5712253
-                    ],
-                    [
-                        10.8969041,
-                        55.5712253
-                    ],
-                    [
-                        10.9258671,
-                        55.6670198
-                    ],
-                    [
-                        10.743814,
-                        55.6646861
-                    ],
-                    [
-                        10.7562267,
-                        55.7579243
-                    ],
-                    [
-                        10.4417713,
-                        55.7579243
-                    ],
-                    [
-                        10.4439274,
-                        56.0270388
-                    ],
-                    [
-                        10.4466742,
-                        56.116717
-                    ],
-                    [
-                        10.6079695,
-                        56.1150259
-                    ],
-                    [
-                        10.6052053,
-                        56.0247462
-                    ],
-                    [
-                        10.9258671,
-                        56.0201215
-                    ],
-                    [
-                        10.9197132,
-                        55.9309388
-                    ],
-                    [
-                        11.0802782,
-                        55.92792
-                    ],
-                    [
-                        11.0858066,
-                        56.0178284
-                    ],
-                    [
-                        11.7265047,
-                        56.005058
-                    ],
-                    [
-                        11.7319981,
-                        56.0952142
-                    ],
-                    [
-                        12.0540333,
-                        56.0871256
-                    ],
-                    [
-                        12.0608477,
-                        56.1762576
-                    ],
-                    [
-                        12.7023469,
-                        56.1594405
-                    ],
-                    [
-                        12.6611131,
-                        55.7114318
-                    ],
-                    [
-                        12.9792318,
-                        55.7014026
-                    ],
-                    [
-                        12.9612912,
-                        55.5217294
-                    ],
-                    [
-                        12.3268659,
-                        55.5412096
-                    ],
-                    [
-                        12.3206071,
-                        55.4513655
-                    ],
-                    [
-                        12.4778226,
-                        55.447067
-                    ],
-                    [
-                        12.4702432,
-                        55.3570479
-                    ],
-                    [
-                        12.6269738,
-                        55.3523837
-                    ],
-                    [
-                        12.6200898,
-                        55.2632576
-                    ],
-                    [
-                        12.4627339,
-                        55.26722
-                    ],
-                    [
-                        12.4552949,
-                        55.1778223
-                    ],
-                    [
-                        12.2987046,
-                        55.1822303
-                    ],
-                    [
-                        12.2897344,
-                        55.0923641
-                    ],
-                    [
-                        12.6048608,
-                        55.0832904
-                    ],
-                    [
-                        12.5872011,
-                        54.9036285
-                    ],
-                    [
-                        12.2766618,
-                        54.9119031
-                    ],
-                    [
-                        12.2610181,
-                        54.7331602
-                    ],
-                    [
-                        12.1070691,
-                        54.7378161
-                    ],
-                    [
-                        12.0858621,
-                        54.4681655
-                    ],
-                    [
-                        11.7794953,
-                        54.4753579
-                    ],
-                    [
-                        11.7837381,
-                        54.5654783
-                    ],
-                    [
-                        11.1658525,
-                        54.5782155
-                    ],
-                    [
-                        11.1706443,
-                        54.6686508
-                    ],
-                    [
-                        10.8617173,
-                        54.6733956
-                    ],
-                    [
-                        10.8651245,
-                        54.7634667
-                    ],
-                    [
-                        10.7713646,
-                        54.7643888
-                    ],
-                    [
-                        10.7707276,
-                        54.7372807
-                    ],
-                    [
-                        10.7551428,
-                        54.7375776
-                    ],
-                    [
-                        10.7544039,
-                        54.7195666
-                    ],
-                    [
-                        10.7389074,
-                        54.7197588
-                    ],
-                    [
-                        10.7384368,
-                        54.7108482
-                    ],
-                    [
-                        10.7074486,
-                        54.7113045
-                    ],
-                    [
-                        10.7041094,
-                        54.6756741
-                    ],
-                    [
-                        10.5510973,
-                        54.6781698
-                    ],
-                    [
-                        10.5547184,
-                        54.7670245
-                    ],
-                    [
-                        10.2423994,
-                        54.7705935
-                    ],
-                    [
-                        10.2459845,
-                        54.8604673
-                    ],
-                    [
-                        10.0902268,
-                        54.8622134
-                    ],
-                    [
-                        10.0873731,
-                        54.7723851
-                    ],
-                    [
-                        9.1555798,
-                        54.7769557
-                    ],
-                    [
-                        9.1562752,
-                        54.8675369
-                    ],
-                    [
-                        8.5321973,
-                        54.8663765
-                    ],
-                    [
-                        8.531432,
-                        54.95516
-                    ]
-                ],
-                [
-                    [
-                        11.4577738,
-                        56.819554
-                    ],
-                    [
-                        11.7849181,
-                        56.8127385
-                    ],
-                    [
-                        11.7716715,
-                        56.6332796
-                    ],
-                    [
-                        11.4459621,
-                        56.6401087
-                    ]
-                ],
-                [
-                    [
-                        11.3274736,
-                        57.3612962
-                    ],
-                    [
-                        11.3161808,
-                        57.1818004
-                    ],
-                    [
-                        11.1508692,
-                        57.1847276
-                    ],
-                    [
-                        11.1456628,
-                        57.094962
-                    ],
-                    [
-                        10.8157703,
-                        57.1001693
-                    ],
-                    [
-                        10.8290599,
-                        57.3695272
-                    ]
-                ],
-                [
-                    [
-                        11.5843266,
-                        56.2777928
-                    ],
-                    [
-                        11.5782882,
-                        56.1880397
-                    ],
-                    [
-                        11.7392309,
-                        56.1845765
-                    ],
-                    [
-                        11.7456428,
-                        56.2743186
-                    ]
-                ],
-                [
-                    [
-                        14.6825922,
-                        55.3639405
-                    ],
-                    [
-                        14.8395247,
-                        55.3565231
-                    ],
-                    [
-                        14.8263755,
-                        55.2671261
-                    ],
-                    [
-                        15.1393406,
-                        55.2517359
-                    ],
-                    [
-                        15.1532015,
-                        55.3410836
-                    ],
-                    [
-                        15.309925,
-                        55.3330556
-                    ],
-                    [
-                        15.295719,
-                        55.2437356
-                    ],
-                    [
-                        15.1393406,
-                        55.2517359
-                    ],
-                    [
-                        15.1255631,
-                        55.1623802
-                    ],
-                    [
-                        15.2815819,
-                        55.1544167
-                    ],
-                    [
-                        15.2535578,
-                        54.9757646
-                    ],
-                    [
-                        14.6317464,
-                        55.0062496
-                    ]
-                ]
-            ],
-            "terms_url": "http://download.kortforsyningen.dk/content/vilkaar-og-betingelser",
-            "terms_text": "Geodatastyrelsen og Danske Kommuner"
-        },
-        {
-            "name": "Geoimage.at MaxRes",
-            "type": "tms",
-            "template": "http://geoimage.openstreetmap.at/4d80de696cd562a63ce463a58a61488d/{zoom}/{x}/{y}.jpg",
-            "polygon": [
-                [
-                    [
-                        16.5073284,
-                        46.9929304
-                    ],
-                    [
-                        16.283417,
-                        46.9929304
-                    ],
-                    [
-                        16.135839,
-                        46.8713046
-                    ],
-                    [
-                        15.9831722,
-                        46.8190947
-                    ],
-                    [
-                        16.0493278,
-                        46.655175
-                    ],
-                    [
-                        15.8610387,
-                        46.7180116
-                    ],
-                    [
-                        15.7592608,
-                        46.6900933
-                    ],
-                    [
-                        15.5607938,
-                        46.6796202
-                    ],
-                    [
-                        15.5760605,
-                        46.6342132
-                    ],
-                    [
-                        15.4793715,
-                        46.6027553
-                    ],
-                    [
-                        15.4335715,
-                        46.6516819
-                    ],
-                    [
-                        15.2249267,
-                        46.6342132
-                    ],
-                    [
-                        15.0468154,
-                        46.6481886
-                    ],
-                    [
-                        14.9908376,
-                        46.5887681
-                    ],
-                    [
-                        14.9603042,
-                        46.6237293
-                    ],
-                    [
-                        14.8534374,
-                        46.6027553
-                    ],
-                    [
-                        14.8330818,
-                        46.5012666
-                    ],
-                    [
-                        14.7516595,
-                        46.4977636
-                    ],
-                    [
-                        14.6804149,
-                        46.4381781
-                    ],
-                    [
-                        14.6142593,
-                        46.4381781
-                    ],
-                    [
-                        14.578637,
-                        46.3785275
-                    ],
-                    [
-                        14.4412369,
-                        46.4311638
-                    ],
-                    [
-                        14.1613476,
-                        46.4276563
-                    ],
-                    [
-                        14.1257253,
-                        46.4767409
-                    ],
-                    [
-                        14.0188585,
-                        46.4767409
-                    ],
-                    [
-                        13.9119917,
-                        46.5257813
-                    ],
-                    [
-                        13.8254805,
-                        46.5047694
-                    ],
-                    [
-                        13.4438134,
-                        46.560783
-                    ],
-                    [
-                        13.3064132,
-                        46.5502848
-                    ],
-                    [
-                        13.1283019,
-                        46.5887681
-                    ],
-                    [
-                        12.8433237,
-                        46.6132433
-                    ],
-                    [
-                        12.7262791,
-                        46.6412014
-                    ],
-                    [
-                        12.5125455,
-                        46.6656529
-                    ],
-                    [
-                        12.3598787,
-                        46.7040543
-                    ],
-                    [
-                        12.3649676,
-                        46.7703197
-                    ],
-                    [
-                        12.2886341,
-                        46.7772902
-                    ],
-                    [
-                        12.2733674,
-                        46.8852187
-                    ],
-                    [
-                        12.2072118,
-                        46.8747835
-                    ],
-                    [
-                        12.1308784,
-                        46.9026062
-                    ],
-                    [
-                        12.1156117,
-                        46.9998721
-                    ],
-                    [
-                        12.2530119,
-                        47.0657733
-                    ],
-                    [
-                        12.2123007,
-                        47.0934969
-                    ],
-                    [
-                        11.9833004,
-                        47.0449712
-                    ],
-                    [
-                        11.7339445,
-                        46.9616816
-                    ],
-                    [
-                        11.6321666,
-                        47.010283
-                    ],
-                    [
-                        11.5405665,
-                        46.9755722
-                    ],
-                    [
-                        11.4998553,
-                        47.0068129
-                    ],
-                    [
-                        11.418433,
-                        46.9651546
-                    ],
-                    [
-                        11.2555884,
-                        46.9755722
-                    ],
-                    [
-                        11.1130993,
-                        46.913036
-                    ],
-                    [
-                        11.0418548,
-                        46.7633482
-                    ],
-                    [
-                        10.8891879,
-                        46.7598621
-                    ],
-                    [
-                        10.7416099,
-                        46.7842599
-                    ],
-                    [
-                        10.7059877,
-                        46.8643462
-                    ],
-                    [
-                        10.5787653,
-                        46.8399847
-                    ],
-                    [
-                        10.4566318,
-                        46.8504267
-                    ],
-                    [
-                        10.4769874,
-                        46.9269392
-                    ],
-                    [
-                        10.3853873,
-                        46.9894592
-                    ],
-                    [
-                        10.2327204,
-                        46.8643462
-                    ],
-                    [
-                        10.1207647,
-                        46.8330223
-                    ],
-                    [
-                        9.8663199,
-                        46.9408389
-                    ],
-                    [
-                        9.9019422,
-                        47.0033426
-                    ],
-                    [
-                        9.6831197,
-                        47.0588402
-                    ],
-                    [
-                        9.6118752,
-                        47.0380354
-                    ],
-                    [
-                        9.6322307,
-                        47.128131
-                    ],
-                    [
-                        9.5813418,
-                        47.1662025
-                    ],
-                    [
-                        9.5406306,
-                        47.2664422
-                    ],
-                    [
-                        9.6067863,
-                        47.3492559
-                    ],
-                    [
-                        9.6729419,
-                        47.369939
-                    ],
-                    [
-                        9.6424085,
-                        47.4457079
-                    ],
-                    [
-                        9.5660751,
-                        47.4801122
-                    ],
-                    [
-                        9.7136531,
-                        47.5282405
-                    ],
-                    [
-                        9.7848976,
-                        47.5969187
-                    ],
-                    [
-                        9.8357866,
-                        47.5454185
-                    ],
-                    [
-                        9.9477423,
-                        47.538548
-                    ],
-                    [
-                        10.0902313,
-                        47.4491493
-                    ],
-                    [
-                        10.1105869,
-                        47.3664924
-                    ],
-                    [
-                        10.2428982,
-                        47.3871688
-                    ],
-                    [
-                        10.1869203,
-                        47.2698953
-                    ],
-                    [
-                        10.3243205,
-                        47.2975125
-                    ],
-                    [
-                        10.4820763,
-                        47.4491493
-                    ],
-                    [
-                        10.4311873,
-                        47.4869904
-                    ],
-                    [
-                        10.4413651,
-                        47.5900549
-                    ],
-                    [
-                        10.4871652,
-                        47.5522881
-                    ],
-                    [
-                        10.5482319,
-                        47.5351124
-                    ],
-                    [
-                        10.5991209,
-                        47.5660246
-                    ],
-                    [
-                        10.7568766,
-                        47.5316766
-                    ],
-                    [
-                        10.8891879,
-                        47.5454185
-                    ],
-                    [
-                        10.9400769,
-                        47.4869904
-                    ],
-                    [
-                        10.9960547,
-                        47.3906141
-                    ],
-                    [
-                        11.2352328,
-                        47.4422662
-                    ],
-                    [
-                        11.2810328,
-                        47.3975039
-                    ],
-                    [
-                        11.4235219,
-                        47.5144941
-                    ],
-                    [
-                        11.5761888,
-                        47.5076195
-                    ],
-                    [
-                        11.6067221,
-                        47.5900549
-                    ],
-                    [
-                        11.8357224,
-                        47.5866227
-                    ],
-                    [
-                        12.003656,
-                        47.6243647
-                    ],
-                    [
-                        12.2072118,
-                        47.6037815
-                    ],
-                    [
-                        12.1614117,
-                        47.6963421
-                    ],
-                    [
-                        12.2581008,
-                        47.7442718
-                    ],
-                    [
-                        12.2530119,
-                        47.6792136
-                    ],
-                    [
-                        12.4311232,
-                        47.7100408
-                    ],
-                    [
-                        12.4921899,
-                        47.631224
-                    ],
-                    [
-                        12.5685234,
-                        47.6277944
-                    ],
-                    [
-                        12.6295901,
-                        47.6894913
-                    ],
-                    [
-                        12.7720792,
-                        47.6689338
-                    ],
-                    [
-                        12.8331459,
-                        47.5419833
-                    ],
-                    [
-                        12.975635,
-                        47.4732332
-                    ],
-                    [
-                        13.0417906,
-                        47.4938677
-                    ],
-                    [
-                        13.0367017,
-                        47.5557226
-                    ],
-                    [
-                        13.0977685,
-                        47.6415112
-                    ],
-                    [
-                        13.0316128,
-                        47.7100408
-                    ],
-                    [
-                        12.9043905,
-                        47.7203125
-                    ],
-                    [
-                        13.0061684,
-                        47.84683
-                    ],
-                    [
-                        12.9451016,
-                        47.9355501
-                    ],
-                    [
-                        12.8636793,
-                        47.9594103
-                    ],
-                    [
-                        12.8636793,
-                        48.0036929
-                    ],
-                    [
-                        12.7517236,
-                        48.0989418
-                    ],
-                    [
-                        12.8738571,
-                        48.2109733
-                    ],
-                    [
-                        12.9603683,
-                        48.2109733
-                    ],
-                    [
-                        13.0417906,
-                        48.2652035
-                    ],
-                    [
-                        13.1842797,
-                        48.2990682
-                    ],
-                    [
-                        13.2606131,
-                        48.2922971
-                    ],
-                    [
-                        13.3980133,
-                        48.3565867
-                    ],
-                    [
-                        13.4438134,
-                        48.417418
-                    ],
-                    [
-                        13.4387245,
-                        48.5523383
-                    ],
-                    [
-                        13.509969,
-                        48.5860123
-                    ],
-                    [
-                        13.6117469,
-                        48.5725454
-                    ],
-                    [
-                        13.7287915,
-                        48.5118999
-                    ],
-                    [
-                        13.7847694,
-                        48.5725454
-                    ],
-                    [
-                        13.8203916,
-                        48.6263915
-                    ],
-                    [
-                        13.7949471,
-                        48.7171267
-                    ],
-                    [
-                        13.850925,
-                        48.7741724
-                    ],
-                    [
-                        14.0595697,
-                        48.6633774
-                    ],
-                    [
-                        14.0137696,
-                        48.6331182
-                    ],
-                    [
-                        14.0748364,
-                        48.5927444
-                    ],
-                    [
-                        14.2173255,
-                        48.5961101
-                    ],
-                    [
-                        14.3649034,
-                        48.5489696
-                    ],
-                    [
-                        14.4666813,
-                        48.6499311
-                    ],
-                    [
-                        14.5582815,
-                        48.5961101
-                    ],
-                    [
-                        14.5989926,
-                        48.6263915
-                    ],
-                    [
-                        14.7211261,
-                        48.5759124
-                    ],
-                    [
-                        14.7211261,
-                        48.6868997
-                    ],
-                    [
-                        14.822904,
-                        48.7271983
-                    ],
-                    [
-                        14.8178151,
-                        48.777526
-                    ],
-                    [
-                        14.9647227,
-                        48.7851754
-                    ],
-                    [
-                        14.9893637,
-                        49.0126611
-                    ],
-                    [
-                        15.1485933,
-                        48.9950306
-                    ],
-                    [
-                        15.1943934,
-                        48.9315502
-                    ],
-                    [
-                        15.3063491,
-                        48.9850128
-                    ],
-                    [
-                        15.3928603,
-                        48.9850128
-                    ],
-                    [
-                        15.4844604,
-                        48.9282069
-                    ],
-                    [
-                        15.749083,
-                        48.8545973
-                    ],
-                    [
-                        15.8406831,
-                        48.8880697
-                    ],
-                    [
-                        16.0086166,
-                        48.7808794
-                    ],
-                    [
-                        16.2070835,
-                        48.7339115
-                    ],
-                    [
-                        16.3953727,
-                        48.7372678
-                    ],
-                    [
-                        16.4920617,
-                        48.8110498
-                    ],
-                    [
-                        16.6905286,
-                        48.7741724
-                    ],
-                    [
-                        16.7057953,
-                        48.7339115
-                    ],
-                    [
-                        16.8991733,
-                        48.713769
-                    ],
-                    [
-                        16.9755067,
-                        48.515271
-                    ],
-                    [
-                        16.8482844,
-                        48.4511817
-                    ],
-                    [
-                        16.8533733,
-                        48.3464411
-                    ],
-                    [
-                        16.9551512,
-                        48.2516513
-                    ],
-                    [
-                        16.9907734,
-                        48.1498955
-                    ],
-                    [
-                        17.0925513,
-                        48.1397088
-                    ],
-                    [
-                        17.0823736,
-                        48.0241182
-                    ],
-                    [
-                        17.1739737,
-                        48.0207146
-                    ],
-                    [
-                        17.0823736,
-                        47.8741447
-                    ],
-                    [
-                        16.9856845,
-                        47.8673174
-                    ],
-                    [
-                        17.0823736,
-                        47.8092489
-                    ],
-                    [
-                        17.0925513,
-                        47.7031919
-                    ],
-                    [
-                        16.7414176,
-                        47.6792136
-                    ],
-                    [
-                        16.7057953,
-                        47.7511153
-                    ],
-                    [
-                        16.5378617,
-                        47.7545368
-                    ],
-                    [
-                        16.5480395,
-                        47.7066164
-                    ],
-                    [
-                        16.4208172,
-                        47.6689338
-                    ],
-                    [
-                        16.573484,
-                        47.6175045
-                    ],
-                    [
-                        16.670173,
-                        47.631224
-                    ],
-                    [
-                        16.7108842,
-                        47.538548
-                    ],
-                    [
-                        16.6599952,
-                        47.4491493
-                    ],
-                    [
-                        16.5429506,
-                        47.3940591
-                    ],
-                    [
-                        16.4615283,
-                        47.3940591
-                    ],
-                    [
-                        16.4920617,
-                        47.276801
-                    ],
-                    [
-                        16.425906,
-                        47.1973317
-                    ],
-                    [
-                        16.4717061,
-                        47.1489007
-                    ],
-                    [
-                        16.5480395,
-                        47.1489007
-                    ],
-                    [
-                        16.476795,
-                        47.0796369
-                    ],
-                    [
-                        16.527684,
-                        47.0588402
-                    ]
-                ]
-            ],
-            "terms_text": "geoimage.at",
-            "id": "geoimage.at"
-        },
-        {
-            "name": "Geoportal.gov.pl (Orthophotomap)",
-            "type": "tms",
-            "template": "http://wms.misek.pl/geoportal.orto/tms/{zoom}/{x}/{y}",
-            "scaleExtent": [
-                6,
-                24
-            ],
-            "polygon": [
-                [
-                    [
-                        15.9751041,
-                        54.3709213
-                    ],
-                    [
-                        16.311164,
-                        54.5561775
-                    ],
-                    [
-                        17.1391878,
-                        54.7845723
-                    ],
-                    [
-                        18.3448458,
-                        54.9022727
-                    ],
-                    [
-                        19.6613689,
-                        54.4737213
-                    ],
-                    [
-                        20.2815206,
-                        54.4213456
-                    ],
-                    [
-                        21.4663914,
-                        54.3406369
-                    ],
-                    [
-                        22.7759855,
-                        54.3769755
-                    ],
-                    [
-                        22.8625989,
-                        54.4233613
-                    ],
-                    [
-                        23.2956657,
-                        54.2678633
-                    ],
-                    [
-                        23.5347186,
-                        54.0955258
-                    ],
-                    [
-                        23.5208604,
-                        53.9775182
-                    ],
-                    [
-                        23.7183389,
-                        53.4629603
-                    ],
-                    [
-                        23.9296755,
-                        53.1856735
-                    ],
-                    [
-                        23.9296755,
-                        52.6887269
-                    ],
-                    [
-                        23.732197,
-                        52.6067497
-                    ],
-                    [
-                        23.5658994,
-                        52.5878101
-                    ],
-                    [
-                        23.2090523,
-                        52.3302642
-                    ],
-                    [
-                        23.1951942,
-                        52.2370089
-                    ],
-                    [
-                        23.5035377,
-                        52.1860596
-                    ],
-                    [
-                        23.6906226,
-                        52.0030113
-                    ],
-                    [
-                        23.5970802,
-                        51.739903
-                    ],
-                    [
-                        23.6629063,
-                        51.3888562
-                    ],
-                    [
-                        23.9366046,
-                        50.9827781
-                    ],
-                    [
-                        24.1687284,
-                        50.8604752
-                    ],
-                    [
-                        24.0197534,
-                        50.8035823
-                    ],
-                    [
-                        24.1098313,
-                        50.6610467
-                    ],
-                    [
-                        24.0578633,
-                        50.4188439
-                    ],
-                    [
-                        23.6178674,
-                        50.3083403
-                    ],
-                    [
-                        22.6824431,
-                        49.5163532
-                    ],
-                    [
-                        22.7378756,
-                        49.2094935
-                    ],
-                    [
-                        22.9041733,
-                        49.0780441
-                    ],
-                    [
-                        22.8625989,
-                        48.9940062
-                    ],
-                    [
-                        22.6096878,
-                        49.0371785
-                    ],
-                    [
-                        22.0761495,
-                        49.2004392
-                    ],
-                    [
-                        21.8474902,
-                        49.3721872
-                    ],
-                    [
-                        21.3763135,
-                        49.4488281
-                    ],
-                    [
-                        21.1026153,
-                        49.3721872
-                    ],
-                    [
-                        20.9120659,
-                        49.3022043
-                    ],
-                    [
-                        20.6452967,
-                        49.3902311
-                    ],
-                    [
-                        20.1845136,
-                        49.3315641
-                    ],
-                    [
-                        20.1186875,
-                        49.2004392
-                    ],
-                    [
-                        19.9419962,
-                        49.1302123
-                    ],
-                    [
-                        19.765305,
-                        49.2117568
-                    ],
-                    [
-                        19.7479823,
-                        49.3992506
-                    ],
-                    [
-                        19.6024718,
-                        49.4150307
-                    ],
-                    [
-                        19.5089294,
-                        49.5815389
-                    ],
-                    [
-                        19.4292451,
-                        49.5905232
-                    ],
-                    [
-                        19.2317666,
-                        49.4150307
-                    ],
-                    [
-                        18.9961783,
-                        49.387976
-                    ],
-                    [
-                        18.9338167,
-                        49.4916048
-                    ],
-                    [
-                        18.8368097,
-                        49.4938552
-                    ],
-                    [
-                        18.8021643,
-                        49.6623381
-                    ],
-                    [
-                        18.6427958,
-                        49.7094091
-                    ],
-                    [
-                        18.521537,
-                        49.8994693
-                    ],
-                    [
-                        18.0815412,
-                        50.0109209
-                    ],
-                    [
-                        17.8875272,
-                        49.9886512
-                    ],
-                    [
-                        17.7385522,
-                        50.0687739
-                    ],
-                    [
-                        17.6068999,
-                        50.1709584
-                    ],
-                    [
-                        17.7454813,
-                        50.2153184
-                    ],
-                    [
-                        17.710836,
-                        50.3017019
-                    ],
-                    [
-                        17.4163505,
-                        50.2640668
-                    ],
-                    [
-                        16.9486384,
-                        50.4453265
-                    ],
-                    [
-                        16.8932058,
-                        50.4033889
-                    ],
-                    [
-                        17.0006064,
-                        50.3105529
-                    ],
-                    [
-                        17.017929,
-                        50.2241854
-                    ],
-                    [
-                        16.8135215,
-                        50.186489
-                    ],
-                    [
-                        16.6402948,
-                        50.0976742
-                    ],
-                    [
-                        16.4324227,
-                        50.2862087
-                    ],
-                    [
-                        16.1968344,
-                        50.4276731
-                    ],
-                    [
-                        16.4220291,
-                        50.5885165
-                    ],
-                    [
-                        16.3388803,
-                        50.6632429
-                    ],
-                    [
-                        16.2280152,
-                        50.6368824
-                    ],
-                    [
-                        16.0547884,
-                        50.6127057
-                    ],
-                    [
-                        15.5732181,
-                        50.7641544
-                    ],
-                    [
-                        15.2683391,
-                        50.8976368
-                    ],
-                    [
-                        15.2440873,
-                        50.980597
-                    ],
-                    [
-                        15.0292862,
-                        51.0133036
-                    ],
-                    [
-                        15.0015699,
-                        50.8582883
-                    ],
-                    [
-                        14.8110205,
-                        50.8735944
-                    ],
-                    [
-                        14.956531,
-                        51.0721176
-                    ],
-                    [
-                        15.0188926,
-                        51.2914636
-                    ],
-                    [
-                        14.9392083,
-                        51.4601459
-                    ],
-                    [
-                        14.7209426,
-                        51.5571799
-                    ],
-                    [
-                        14.7521234,
-                        51.6260562
-                    ],
-                    [
-                        14.5996839,
-                        51.8427626
-                    ],
-                    [
-                        14.70362,
-                        52.0733396
-                    ],
-                    [
-                        14.5581095,
-                        52.2497371
-                    ],
-                    [
-                        14.5165351,
-                        52.425436
-                    ],
-                    [
-                        14.6031485,
-                        52.5878101
-                    ],
-                    [
-                        14.1146491,
-                        52.8208272
-                    ],
-                    [
-                        14.152759,
-                        52.9733951
-                    ],
-                    [
-                        14.3502374,
-                        53.0734212
-                    ],
-                    [
-                        14.4229927,
-                        53.2665624
-                    ],
-                    [
-                        14.1977979,
-                        53.8734759
-                    ],
-                    [
-                        14.2220497,
-                        53.9958517
-                    ]
-                ]
-            ],
-            "terms_text": "Copyright © Główny Urząd Geodezji i Kartografii."
-        },
-        {
-            "name": "Imagerie Drone (Haiti)",
-            "type": "tms",
-            "template": "http://wms.openstreetmap.fr/tms/1.0.0/iomhaiti/{zoom}/{x}/{y}",
-            "polygon": [
-                [
-                    [
-                        -72.1547401,
-                        19.6878969
-                    ],
-                    [
-                        -72.162234,
-                        19.689011
-                    ],
-                    [
-                        -72.164995,
-                        19.6932445
-                    ],
-                    [
-                        -72.1657838,
-                        19.6979977
-                    ],
-                    [
-                        -72.161603,
-                        19.7035677
-                    ],
-                    [
-                        -72.1487449,
-                        19.7028993
-                    ],
-                    [
-                        -72.1477194,
-                        19.7026765
-                    ],
-                    [
-                        -72.1485082,
-                        19.7001514
-                    ],
-                    [
-                        -72.1436963,
-                        19.7011169
-                    ],
-                    [
-                        -72.1410143,
-                        19.7000029
-                    ],
-                    [
-                        -72.139476,
-                        19.6973664
-                    ],
-                    [
-                        -72.1382533,
-                        19.6927617
-                    ],
-                    [
-                        -72.1386872,
-                        19.6923161
-                    ],
-                    [
-                        -72.1380561,
-                        19.6896423
-                    ],
-                    [
-                        -72.1385294,
-                        19.6894938
-                    ],
-                    [
-                        -72.1388055,
-                        19.6901251
-                    ],
-                    [
-                        -72.1388844,
-                        19.6876741
-                    ],
-                    [
-                        -72.1378195,
-                        19.6872656
-                    ],
-                    [
-                        -72.13778,
-                        19.6850003
-                    ],
-                    [
-                        -72.1369517,
-                        19.6855945
-                    ],
-                    [
-                        -72.136794,
-                        19.6840719
-                    ],
-                    [
-                        -72.135729,
-                        19.6835148
-                    ],
-                    [
-                        -72.1355713,
-                        19.6740817
-                    ],
-                    [
-                        -72.1366362,
-                        19.6708133
-                    ],
-                    [
-                        -72.1487843,
-                        19.6710733
-                    ],
-                    [
-                        -72.1534779,
-                        19.6763843
-                    ],
-                    [
-                        -72.1530835,
-                        19.6769414
-                    ],
-                    [
-                        -72.1533251,
-                        19.6769768
-                    ],
-                    [
-                        -72.1532807,
-                        19.6796525
-                    ],
-                    [
-                        -72.1523834,
-                        19.6797175
-                    ],
-                    [
-                        -72.1522749,
-                        19.6803488
-                    ],
-                    [
-                        -72.1519101,
-                        19.6803395
-                    ],
-                    [
-                        -72.1518608,
-                        19.6805067
-                    ],
-                    [
-                        -72.1528173,
-                        19.6806552
-                    ],
-                    [
-                        -72.1522299,
-                        19.6833011
-                    ],
-                    [
-                        -72.1507801,
-                        19.6831499
-                    ],
-                    [
-                        -72.1504457,
-                        19.6847862
-                    ],
-                    [
-                        -72.1508591,
-                        19.6843492
-                    ],
-                    [
-                        -72.1530087,
-                        19.6849898
-                    ],
-                    [
-                        -72.1546258,
-                        19.6854354
-                    ],
-                    [
-                        -72.1543103,
-                        19.6870694
-                    ],
-                    [
-                        -72.1547244,
-                        19.6868466
-                    ],
-                    [
-                        -72.1548501,
-                        19.6877564
-                    ],
-                    [
-                        -72.1545814,
-                        19.6877982
-                    ]
-                ],
-                [
-                    [
-                        -72.1310601,
-                        19.6718929
-                    ],
-                    [
-                        -72.1259842,
-                        19.6772765
-                    ],
-                    [
-                        -72.1255379,
-                        19.6776179
-                    ],
-                    [
-                        -72.1216891,
-                        19.6776442
-                    ],
-                    [
-                        -72.1149677,
-                        19.672602
-                    ],
-                    [
-                        -72.1152745,
-                        19.6687152
-                    ],
-                    [
-                        -72.1198205,
-                        19.6627535
-                    ],
-                    [
-                        -72.1227768,
-                        19.6625696
-                    ],
-                    [
-                        -72.1248965,
-                        19.662701
-                    ],
-                    [
-                        -72.1285779,
-                        19.6645394
-                    ],
-                    [
-                        -72.1308091,
-                        19.6661677
-                    ],
-                    [
-                        -72.1316737,
-                        19.668794
-                    ],
-                    [
-                        -72.1315621,
-                        19.671
-                    ]
-                ],
-                [
-                    [
-                        -71.845795,
-                        19.6709758
-                    ],
-                    [
-                        -71.8429354,
-                        19.6759525
-                    ],
-                    [
-                        -71.8410027,
-                        19.6759525
-                    ],
-                    [
-                        -71.8380249,
-                        19.6755254
-                    ],
-                    [
-                        -71.8378671,
-                        19.6745041
-                    ],
-                    [
-                        -71.8390504,
-                        19.6743927
-                    ],
-                    [
-                        -71.8390109,
-                        19.6741141
-                    ],
-                    [
-                        -71.8398392,
-                        19.673947
-                    ],
-                    [
-                        -71.8389123,
-                        19.6736127
-                    ],
-                    [
-                        -71.8380249,
-                        19.67209
-                    ],
-                    [
-                        -71.8380052,
-                        19.6726285
-                    ],
-                    [
-                        -71.8376699,
-                        19.6727214
-                    ],
-                    [
-                        -71.8376305,
-                        19.672545
-                    ],
-                    [
-                        -71.8354414,
-                        19.6732135
-                    ],
-                    [
-                        -71.835333,
-                        19.6729999
-                    ],
-                    [
-                        -71.8331242,
-                        19.6734642
-                    ],
-                    [
-                        -71.8326706,
-                        19.6716815
-                    ],
-                    [
-                        -71.8321579,
-                        19.67209
-                    ],
-                    [
-                        -71.8307183,
-                        19.6694902
-                    ],
-                    [
-                        -71.8306009,
-                        19.6697594
-                    ],
-                    [
-                        -71.8302174,
-                        19.6698907
-                    ],
-                    [
-                        -71.8291833,
-                        19.6672095
-                    ],
-                    [
-                        -71.8290749,
-                        19.6672095
-                    ],
-                    [
-                        -71.8289122,
-                        19.6667916
-                    ],
-                    [
-                        -71.8289516,
-                        19.6666199
-                    ],
-                    [
-                        -71.8288333,
-                        19.6663506
-                    ],
-                    [
-                        -71.8285572,
-                        19.6664759
-                    ],
-                    [
-                        -71.8288678,
-                        19.6672466
-                    ],
-                    [
-                        -71.8287593,
-                        19.6674138
-                    ],
-                    [
-                        -71.8277979,
-                        19.6678177
-                    ],
-                    [
-                        -71.8277112,
-                        19.6678586
-                    ],
-                    [
-                        -71.8278263,
-                        19.6679637
-                    ],
-                    [
-                        -71.8271831,
-                        19.6681212
-                    ],
-                    [
-                        -71.8271761,
-                        19.6680917
-                    ],
-                    [
-                        -71.8264405,
-                        19.6683921
-                    ],
-                    [
-                        -71.8264074,
-                        19.6683231
-                    ],
-                    [
-                        -71.8261954,
-                        19.6684253
-                    ],
-                    [
-                        -71.8261806,
-                        19.6683556
-                    ],
-                    [
-                        -71.8258946,
-                        19.6684206
-                    ],
-                    [
-                        -71.8258897,
-                        19.6686574
-                    ],
-                    [
-                        -71.8251551,
-                        19.6687549
-                    ],
-                    [
-                        -71.8254509,
-                        19.6691588
-                    ],
-                    [
-                        -71.8229332,
-                        19.6695739
-                    ],
-                    [
-                        -71.822713,
-                        19.6696658
-                    ],
-                    [
-                        -71.8227688,
-                        19.6697577
-                    ],
-                    [
-                        -71.8201751,
-                        19.6709855
-                    ],
-                    [
-                        -71.8198474,
-                        19.6704537
-                    ],
-                    [
-                        -71.8197985,
-                        19.6706014
-                    ],
-                    [
-                        -71.8194674,
-                        19.6707557
-                    ],
-                    [
-                        -71.8182472,
-                        19.6713433
-                    ],
-                    [
-                        -71.8181426,
-                        19.6711431
-                    ],
-                    [
-                        -71.8175813,
-                        19.6714254
-                    ],
-                    [
-                        -71.816959,
-                        19.6707672
-                    ],
-                    [
-                        -71.8176388,
-                        19.6718965
-                    ],
-                    [
-                        -71.8171403,
-                        19.6720376
-                    ],
-                    [
-                        -71.8158225,
-                        19.6718045
-                    ],
-                    [
-                        -71.8138354,
-                        19.6711874
-                    ],
-                    [
-                        -71.8123259,
-                        19.6706982
-                    ],
-                    [
-                        -71.8121759,
-                        19.6704258
-                    ],
-                    [
-                        -71.8124304,
-                        19.6701467
-                    ],
-                    [
-                        -71.8119184,
-                        19.6700141
-                    ],
-                    [
-                        -71.8118765,
-                        19.6705828
-                    ],
-                    [
-                        -71.811169,
-                        19.6703483
-                    ],
-                    [
-                        -71.8095938,
-                        19.6698516
-                    ],
-                    [
-                        -71.8077992,
-                        19.6692829
-                    ],
-                    [
-                        -71.8056028,
-                        19.668612
-                    ],
-                    [
-                        -71.8051443,
-                        19.6668942
-                    ],
-                    [
-                        -71.8051196,
-                        19.6652322
-                    ],
-                    [
-                        -71.8052315,
-                        19.661979
-                    ],
-                    [
-                        -71.8065603,
-                        19.6523921
-                    ],
-                    [
-                        -71.8073412,
-                        19.6482946
-                    ],
-                    [
-                        -71.8099686,
-                        19.6468292
-                    ],
-                    [
-                        -71.8147517,
-                        19.6454502
-                    ],
-                    [
-                        -71.8147726,
-                        19.6455619
-                    ],
-                    [
-                        -71.8150027,
-                        19.6455093
-                    ],
-                    [
-                        -71.8149469,
-                        19.6453846
-                    ],
-                    [
-                        -71.8159928,
-                        19.6450234
-                    ],
-                    [
-                        -71.8158882,
-                        19.6448855
-                    ],
-                    [
-                        -71.8165854,
-                        19.6446097
-                    ],
-                    [
-                        -71.8190119,
-                        19.643802
-                    ],
-                    [
-                        -71.8211524,
-                        19.643454
-                    ],
-                    [
-                        -71.8221564,
-                        19.6433292
-                    ],
-                    [
-                        -71.8269046,
-                        19.643211
-                    ],
-                    [
-                        -71.8280481,
-                        19.6432241
-                    ],
-                    [
-                        -71.8304466,
-                        19.6440778
-                    ],
-                    [
-                        -71.8306419,
-                        19.6448592
-                    ],
-                    [
-                        -71.8295263,
-                        19.6450365
-                    ],
-                    [
-                        -71.8296064,
-                        19.6456111
-                    ],
-                    [
-                        -71.8299411,
-                        19.6455651
-                    ],
-                    [
-                        -71.8303699,
-                        19.6451744
-                    ],
-                    [
-                        -71.830471,
-                        19.6453452
-                    ],
-                    [
-                        -71.8308092,
-                        19.6451974
-                    ],
-                    [
-                        -71.8310184,
-                        19.6451088
-                    ],
-                    [
-                        -71.8312519,
-                        19.6458541
-                    ],
-                    [
-                        -71.8311125,
-                        19.6458245
-                    ],
-                    [
-                        -71.831367,
-                        19.6465862
-                    ],
-                    [
-                        -71.8328939,
-                        19.646189
-                    ],
-                    [
-                        -71.8344566,
-                        19.6457062
-                    ],
-                    [
-                        -71.8344664,
-                        19.6463052
-                    ],
-                    [
-                        -71.834215,
-                        19.6461938
-                    ],
-                    [
-                        -71.8342002,
-                        19.6465513
-                    ],
-                    [
-                        -71.8346702,
-                        19.6463
-                    ],
-                    [
-                        -71.8349118,
-                        19.6463905
-                    ],
-                    [
-                        -71.8347984,
-                        19.6462187
-                    ],
-                    [
-                        -71.8354393,
-                        19.6458496
-                    ],
-                    [
-                        -71.8355034,
-                        19.6458032
-                    ],
-                    [
-                        -71.8364747,
-                        19.6461328
-                    ],
-                    [
-                        -71.8376382,
-                        19.6472658
-                    ],
-                    [
-                        -71.8379143,
-                        19.647888
-                    ],
-                    [
-                        -71.8390483,
-                        19.6508039
-                    ],
-                    [
-                        -71.8456942,
-                        19.6696203
-                    ]
-                ],
-                [
-                    [
-                        -72.098878,
-                        18.54843
-                    ],
-                    [
-                        -72.096993,
-                        18.5501994
-                    ],
-                    [
-                        -72.0972888,
-                        18.5503209
-                    ],
-                    [
-                        -72.0968451,
-                        18.5503489
-                    ],
-                    [
-                        -72.0955632,
-                        18.551854
-                    ],
-                    [
-                        -72.0956428,
-                        18.5526742
-                    ],
-                    [
-                        -72.0959914,
-                        18.5533748
-                    ],
-                    [
-                        -72.0962145,
-                        18.553203
-                    ],
-                    [
-                        -72.0962842,
-                        18.5535665
-                    ],
-                    [
-                        -72.0964446,
-                        18.5535533
-                    ],
-                    [
-                        -72.0965352,
-                        18.5539764
-                    ],
-                    [
-                        -72.0965056,
-                        18.554173
-                    ],
-                    [
-                        -72.0966085,
-                        18.5541747
-                    ],
-                    [
-                        -72.0965178,
-                        18.5542127
-                    ],
-                    [
-                        -72.0968769,
-                        18.5546588
-                    ],
-                    [
-                        -72.0979018,
-                        18.5552141
-                    ],
-                    [
-                        -72.1006211,
-                        18.5555875
-                    ],
-                    [
-                        -72.1014926,
-                        18.5556206
-                    ],
-                    [
-                        -72.1024339,
-                        18.5555016
-                    ],
-                    [
-                        -72.103417,
-                        18.5543515
-                    ],
-                    [
-                        -72.1034798,
-                        18.5516215
-                    ],
-                    [
-                        -72.1030789,
-                        18.5516149
-                    ],
-                    [
-                        -72.1033752,
-                        18.5515224
-                    ],
-                    [
-                        -72.1035042,
-                        18.5515224
-                    ],
-                    [
-                        -72.1035239,
-                        18.5502417
-                    ],
-                    [
-                        -72.1028701,
-                        18.5503062
-                    ],
-                    [
-                        -72.1029015,
-                        18.55025
-                    ],
-                    [
-                        -72.1028457,
-                        18.5501773
-                    ],
-                    [
-                        -72.1035081,
-                        18.5500252
-                    ],
-                    [
-                        -72.103491,
-                        18.5497396
-                    ],
-                    [
-                        -72.1035181,
-                        18.5497361
-                    ],
-                    [
-                        -72.1035398,
-                        18.5489039
-                    ],
-                    [
-                        -72.1034317,
-                        18.5487056
-                    ],
-                    [
-                        -72.102717,
-                        18.5481437
-                    ],
-                    [
-                        -72.1025601,
-                        18.5481536
-                    ],
-                    [
-                        -72.10229,
-                        18.5482751
-                    ],
-                    [
-                        -72.1022891,
-                        18.5482569
-                    ],
-                    [
-                        -72.1025201,
-                        18.5481396
-                    ],
-                    [
-                        -72.1023388,
-                        18.5481321
-                    ],
-                    [
-                        -72.0999082,
-                        18.5480901
-                    ],
-                    [
-                        -72.09907,
-                        18.5483799
-                    ]
-                ],
-                [
-                    [
-                        -72.2542503,
-                        18.568262
-                    ],
-                    [
-                        -72.2560252,
-                        18.5717765
-                    ],
-                    [
-                        -72.2557886,
-                        18.5748049
-                    ],
-                    [
-                        -72.2535009,
-                        18.5755526
-                    ],
-                    [
-                        -72.2522782,
-                        18.5755526
-                    ],
-                    [
-                        -72.2499906,
-                        18.5740945
-                    ],
-                    [
-                        -72.2473874,
-                        18.5698323
-                    ],
-                    [
-                        -72.2460069,
-                        18.566729
-                    ],
-                    [
-                        -72.2458492,
-                        18.5629527
-                    ],
-                    [
-                        -72.2479396,
-                        18.5625414
-                    ],
-                    [
-                        -72.2501483,
-                        18.5628031
-                    ],
-                    [
-                        -72.2519232,
-                        18.5650839
-                    ]
-                ],
-                [
-                    [
-                        -72.303145,
-                        18.5332749
-                    ],
-                    [
-                        -72.3031275,
-                        18.5331799
-                    ],
-                    [
-                        -72.3048311,
-                        18.5311081
-                    ],
-                    [
-                        -72.3097397,
-                        18.5311081
-                    ],
-                    [
-                        -72.3164332,
-                        18.5324302
-                    ],
-                    [
-                        -72.3234056,
-                        18.5366083
-                    ],
-                    [
-                        -72.3261388,
-                        18.5387765
-                    ],
-                    [
-                        -72.3261946,
-                        18.5426371
-                    ],
-                    [
-                        -72.3170468,
-                        18.5540596
-                    ],
-                    [
-                        -72.3130864,
-                        18.5540596
-                    ],
-                    [
-                        -72.2987511,
-                        18.5453342
-                    ],
-                    [
-                        -72.2988627,
-                        18.5407333
-                    ],
-                    [
-                        -72.2962969,
-                        18.5404689
-                    ],
-                    [
-                        -72.2954602,
-                        18.5395169
-                    ],
-                    [
-                        -72.2961853,
-                        18.5338582
-                    ],
-                    [
-                        -72.2971893,
-                        18.5332235
-                    ],
-                    [
-                        -72.3007034,
-                        18.5332764
-                    ],
-                    [
-                        -72.3022652,
-                        18.5342284
-                    ],
-                    [
-                        -72.3028486,
-                        18.5335189
-                    ],
-                    [
-                        -72.303104,
-                        18.5333361
-                    ],
-                    [
-                        -72.303181,
-                        18.5334007
-                    ],
-                    [
-                        -72.3035793,
-                        18.5335614
-                    ],
-                    [
-                        -72.3030793,
-                        18.5346463
-                    ],
-                    [
-                        -72.303715,
-                        18.5339873
-                    ],
-                    [
-                        -72.3045286,
-                        18.5344052
-                    ],
-                    [
-                        -72.3044015,
-                        18.5345097
-                    ],
-                    [
-                        -72.3062747,
-                        18.5352571
-                    ],
-                    [
-                        -72.3063107,
-                        18.5352741
-                    ],
-                    [
-                        -72.3061219,
-                        18.5357628
-                    ],
-                    [
-                        -72.3061219,
-                        18.5358196
-                    ],
-                    [
-                        -72.30637,
-                        18.5358928
-                    ],
-                    [
-                        -72.3062726,
-                        18.5354869
-                    ],
-                    [
-                        -72.3066688,
-                        18.5350891
-                    ],
-                    [
-                        -72.3061963,
-                        18.5349706
-                    ],
-                    [
-                        -72.3058869,
-                        18.5349385
-                    ],
-                    [
-                        -72.3055373,
-                        18.5346833
-                    ],
-                    [
-                        -72.3054864,
-                        18.534613
-                    ],
-                    [
-                        -72.3055585,
-                        18.5345065
-                    ],
-                    [
-                        -72.3046749,
-                        18.5342293
-                    ],
-                    [
-                        -72.3047617,
-                        18.5338817
-                    ],
-                    [
-                        -72.3043252,
-                        18.5337511
-                    ],
-                    [
-                        -72.3042595,
-                        18.5336346
-                    ]
-                ],
-                [
-                    [
-                        -72.2981405,
-                        18.477502
-                    ],
-                    [
-                        -72.2935652,
-                        18.4948587
-                    ],
-                    [
-                        -72.2922242,
-                        18.4964297
-                    ],
-                    [
-                        -72.2931708,
-                        18.4972526
-                    ],
-                    [
-                        -72.2892266,
-                        18.5057058
-                    ],
-                    [
-                        -72.2878067,
-                        18.5080996
-                    ],
-                    [
-                        -72.2850458,
-                        18.5119893
-                    ],
-                    [
-                        -72.2840203,
-                        18.5113161
-                    ],
-                    [
-                        -72.2808649,
-                        18.515879
-                    ],
-                    [
-                        -72.2773151,
-                        18.5175994
-                    ],
-                    [
-                        -72.2723454,
-                        18.5175246
-                    ],
-                    [
-                        -72.2662714,
-                        18.5144578
-                    ],
-                    [
-                        -72.2665869,
-                        18.5066783
-                    ],
-                    [
-                        -72.2692643,
-                        18.5046154
-                    ],
-                    [
-                        -72.2661965,
-                        18.5029756
-                    ],
-                    [
-                        -72.2688181,
-                        18.4965222
-                    ],
-                    [
-                        -72.2691528,
-                        18.4959403
-                    ],
-                    [
-                        -72.2702684,
-                        18.4961519
-                    ],
-                    [
-                        -72.2702684,
-                        18.4955964
-                    ],
-                    [
-                        -72.2690691,
-                        18.49557
-                    ],
-                    [
-                        -72.2692922,
-                        18.4937714
-                    ],
-                    [
-                        -72.2736988,
-                        18.4859951
-                    ],
-                    [
-                        -72.2746749,
-                        18.4850429
-                    ],
-                    [
-                        -72.2751769,
-                        18.483403
-                    ],
-                    [
-                        -72.2765435,
-                        18.4813398
-                    ],
-                    [
-                        -72.2773523,
-                        18.4814985
-                    ],
-                    [
-                        -72.2783006,
-                        18.4809694
-                    ],
-                    [
-                        -72.2778544,
-                        18.4807049
-                    ],
-                    [
-                        -72.2771013,
-                        18.480123
-                    ],
-                    [
-                        -72.2789978,
-                        18.4775836
-                    ],
-                    [
-                        -72.279723,
-                        18.4772927
-                    ],
-                    [
-                        -72.2806433,
-                        18.4776365
-                    ],
-                    [
-                        -72.2813685,
-                        18.4771604
-                    ],
-                    [
-                        -72.2808386,
-                        18.4769752
-                    ],
-                    [
-                        -72.2812848,
-                        18.4758378
-                    ],
-                    [
-                        -72.2823167,
-                        18.4751765
-                    ],
-                    [
-                        -72.2851615,
-                        18.4750971
-                    ],
-                    [
-                        -72.2849941,
-                        18.4763668
-                    ],
-                    [
-                        -72.2854404,
-                        18.4769752
-                    ],
-                    [
-                        -72.286277,
-                        18.4756262
-                    ],
-                    [
-                        -72.2869325,
-                        18.4754675
-                    ],
-                    [
-                        -72.2865978,
-                        18.4751897
-                    ],
-                    [
-                        -72.2865978,
-                        18.4750046
-                    ],
-                    [
-                        -72.2909765,
-                        18.4747268
-                    ],
-                    [
-                        -72.2946579,
-                        18.4749384
-                    ],
-                    [
-                        -72.2973911,
-                        18.476843
-                    ]
-                ],
-                [
-                    [
-                        -72.3466657,
-                        18.5222375
-                    ],
-                    [
-                        -72.346833,
-                        18.5244325
-                    ],
-                    [
-                        -72.3475303,
-                        18.5277645
-                    ],
-                    [
-                        -72.3455501,
-                        18.5291131
-                    ],
-                    [
-                        -72.3403069,
-                        18.5292189
-                    ],
-                    [
-                        -72.3383267,
-                        18.5280289
-                    ],
-                    [
-                        -72.3369043,
-                        18.530118
-                    ],
-                    [
-                        -72.3338086,
-                        18.5296684
-                    ],
-                    [
-                        -72.3289279,
-                        18.5270769
-                    ],
-                    [
-                        -72.328649,
-                        18.5253316
-                    ],
-                    [
-                        -72.3292068,
-                        18.5232689
-                    ],
-                    [
-                        -72.330406,
-                        18.5220524
-                    ],
-                    [
-                        -72.3321631,
-                        18.5221847
-                    ],
-                    [
-                        -72.3322467,
-                        18.5191963
-                    ],
-                    [
-                        -72.3369183,
-                        18.5183633
-                    ],
-                    [
-                        -72.3382012,
-                        18.5184691
-                    ],
-                    [
-                        -72.3381454,
-                        18.5181782
-                    ],
-                    [
-                        -72.3411993,
-                        18.5177947
-                    ],
-                    [
-                        -72.3454943,
-                        18.5171997
-                    ],
-                    [
-                        -72.3492595,
-                        18.517279
-                    ],
-                    [
-                        -72.3504308,
-                        18.5188922
-                    ],
-                    [
-                        -72.3503472,
-                        18.5206112
-                    ],
-                    [
-                        -72.3496778,
-                        18.5220392
-                    ]
-                ],
-                [
-                    [
-                        -72.3303078,
-                        18.5486462
-                    ],
-                    [
-                        -72.3429687,
-                        18.5508149
-                    ],
-                    [
-                        -72.3433236,
-                        18.5530585
-                    ],
-                    [
-                        -72.3413121,
-                        18.5614341
-                    ],
-                    [
-                        -72.3390639,
-                        18.5613593
-                    ],
-                    [
-                        -72.3384723,
-                        18.5638271
-                    ],
-                    [
-                        -72.3375257,
-                        18.5654348
-                    ],
-                    [
-                        -72.3348436,
-                        18.5650609
-                    ],
-                    [
-                        -72.3311755,
-                        18.5638271
-                    ],
-                    [
-                        -72.3312149,
-                        18.5616211
-                    ],
-                    [
-                        -72.3232082,
-                        18.5606863
-                    ],
-                    [
-                        -72.3212361,
-                        18.559602
-                    ],
-                    [
-                        -72.3208023,
-                        18.5587046
-                    ],
-                    [
-                        -72.3208811,
-                        18.557882
-                    ],
-                    [
-                        -72.3259493,
-                        18.5580274
-                    ],
-                    [
-                        -72.3266186,
-                        18.5581993
-                    ],
-                    [
-                        -72.3259214,
-                        18.5577498
-                    ],
-                    [
-                        -72.3250986,
-                        18.5573797
-                    ],
-                    [
-                        -72.3233767,
-                        18.552263
-                    ],
-                    [
-                        -72.3245994,
-                        18.5478507
-                    ],
-                    [
-                        -72.3288986,
-                        18.5483742
-                    ],
-                    [
-                        -72.329979,
-                        18.5489548
-                    ]
-                ],
-                [
-                    [
-                        -72.3231383,
-                        18.5269828
-                    ],
-                    [
-                        -72.3223434,
-                        18.528067
-                    ],
-                    [
-                        -72.3209629,
-                        18.5279745
-                    ],
-                    [
-                        -72.3207816,
-                        18.5271282
-                    ],
-                    [
-                        -72.3208513,
-                        18.5253697
-                    ],
-                    [
-                        -72.3214649,
-                        18.5249598
-                    ],
-                    [
-                        -72.3225666,
-                        18.5248937
-                    ],
-                    [
-                        -72.3228454,
-                        18.52533
-                    ],
-                    [
-                        -72.3232359,
-                        18.5264804
-                    ]
-                ],
-                [
-                    [
-                        -72.2160832,
-                        18.6457752
-                    ],
-                    [
-                        -72.2159649,
-                        18.6553795
-                    ],
-                    [
-                        -72.2030279,
-                        18.6558279
-                    ],
-                    [
-                        -72.1947057,
-                        18.6553421
-                    ],
-                    [
-                        -72.1922208,
-                        18.6545573
-                    ],
-                    [
-                        -72.1920631,
-                        18.6521283
-                    ],
-                    [
-                        -72.193483,
-                        18.6477559
-                    ],
-                    [
-                        -72.201253,
-                        18.6385249
-                    ],
-                    [
-                        -72.2069327,
-                        18.6388239
-                    ],
-                    [
-                        -72.2120996,
-                        18.6424117
-                    ],
-                    [
-                        -72.2118068,
-                        18.6430591
-                    ],
-                    [
-                        -72.2121693,
-                        18.6426892
-                    ],
-                    [
-                        -72.2127968,
-                        18.6427552
-                    ],
-                    [
-                        -72.2134662,
-                        18.6431252
-                    ],
-                    [
-                        -72.2135638,
-                        18.6437462
-                    ],
-                    [
-                        -72.2154176,
-                        18.6443947
-                    ],
-                    [
-                        -72.2158909,
-                        18.6450301
-                    ]
-                ],
-                [
-                    [
-                        -72.2867654,
-                        18.6482017
-                    ],
-                    [
-                        -72.2900977,
-                        18.6527446
-                    ],
-                    [
-                        -72.28981,
-                        18.6536532
-                    ],
-                    [
-                        -72.2900738,
-                        18.6542664
-                    ],
-                    [
-                        -72.290721,
-                        18.6537667
-                    ],
-                    [
-                        -72.2910327,
-                        18.6544709
-                    ],
-                    [
-                        -72.2912485,
-                        18.654221
-                    ],
-                    [
-                        -72.29168,
-                        18.6558905
-                    ],
-                    [
-                        -72.2912245,
-                        18.656606
-                    ],
-                    [
-                        -72.2922673,
-                        18.65597
-                    ],
-                    [
-                        -72.2926869,
-                        18.6567536
-                    ],
-                    [
-                        -72.2930705,
-                        18.6567309
-                    ],
-                    [
-                        -72.2941253,
-                        18.6581846
-                    ],
-                    [
-                        -72.2960192,
-                        18.6608421
-                    ],
-                    [
-                        -72.2959713,
-                        18.6619096
-                    ],
-                    [
-                        -72.2932862,
-                        18.664567
-                    ],
-                    [
-                        -72.2906731,
-                        18.6659979
-                    ],
-                    [
-                        -72.2895943,
-                        18.6661342
-                    ],
-                    [
-                        -72.2895943,
-                        18.6665657
-                    ],
-                    [
-                        -72.2877004,
-                        18.6664749
-                    ],
-                    [
-                        -72.2875805,
-                        18.6676559
-                    ],
-                    [
-                        -72.2831214,
-                        18.6697227
-                    ],
-                    [
-                        -72.2796453,
-                        18.6696546
-                    ],
-                    [
-                        -72.2784311,
-                        18.6690787
-                    ],
-                    [
-                        -72.2783972,
-                        18.6687736
-                    ],
-                    [
-                        -72.277736,
-                        18.6691671
-                    ],
-                    [
-                        -72.2774394,
-                        18.669143
-                    ],
-                    [
-                        -72.2770071,
-                        18.6683159
-                    ],
-                    [
-                        -72.2765575,
-                        18.6681125
-                    ],
-                    [
-                        -72.2765385,
-                        18.6680583
-                    ],
-                    [
-                        -72.2752319,
-                        18.6685239
-                    ],
-                    [
-                        -72.2749292,
-                        18.6674649
-                    ],
-                    [
-                        -72.2746416,
-                        18.6674309
-                    ],
-                    [
-                        -72.2734668,
-                        18.6682145
-                    ],
-                    [
-                        -72.2732271,
-                        18.6682712
-                    ],
-                    [
-                        -72.2726757,
-                        18.6671583
-                    ],
-                    [
-                        -72.2719147,
-                        18.6674288
-                    ],
-                    [
-                        -72.2718808,
-                        18.6673405
-                    ],
-                    [
-                        -72.2688149,
-                        18.6681868
-                    ],
-                    [
-                        -72.2688269,
-                        18.6671761
-                    ],
-                    [
-                        -72.2690786,
-                        18.6668241
-                    ],
-                    [
-                        -72.2688149,
-                        18.66679
-                    ],
-                    [
-                        -72.2681077,
-                        18.6670739
-                    ],
-                    [
-                        -72.2676282,
-                        18.6673805
-                    ],
-                    [
-                        -72.2675563,
-                        18.6666878
-                    ],
-                    [
-                        -72.266861,
-                        18.666949
-                    ],
-                    [
-                        -72.2655904,
-                        18.6673578
-                    ],
-                    [
-                        -72.2654466,
-                        18.6670058
-                    ],
-                    [
-                        -72.2647514,
-                        18.6674146
-                    ],
-                    [
-                        -72.2629893,
-                        18.6681868
-                    ],
-                    [
-                        -72.2628455,
-                        18.6681754
-                    ],
-                    [
-                        -72.2626537,
-                        18.6676076
-                    ],
-                    [
-                        -72.2623001,
-                        18.6677098
-                    ],
-                    [
-                        -72.2624799,
-                        18.6679199
-                    ],
-                    [
-                        -72.2624799,
-                        18.6682322
-                    ],
-                    [
-                        -72.262306,
-                        18.6682606
-                    ],
-                    [
-                        -72.2620963,
-                        18.6679654
-                    ],
-                    [
-                        -72.2622761,
-                        18.6689193
-                    ],
-                    [
-                        -72.2601484,
-                        18.6688966
-                    ],
-                    [
-                        -72.2542749,
-                        18.6687944
-                    ],
-                    [
-                        -72.2505388,
-                        18.6683476
-                    ],
-                    [
-                        -72.2504371,
-                        18.669536
-                    ],
-                    [
-                        -72.2477926,
-                        18.6698893
-                    ],
-                    [
-                        -72.2415204,
-                        18.669793
-                    ],
-                    [
-                        -72.2414187,
-                        18.6741933
-                    ],
-                    [
-                        -72.2389167,
-                        18.6739759
-                    ],
-                    [
-                        -72.2387249,
-                        18.6734649
-                    ],
-                    [
-                        -72.2383653,
-                        18.6733059
-                    ],
-                    [
-                        -72.2387009,
-                        18.6739532
-                    ],
-                    [
-                        -72.2375502,
-                        18.6738964
-                    ],
-                    [
-                        -72.2374183,
-                        18.6735103
-                    ],
-                    [
-                        -72.237742,
-                        18.67334
-                    ],
-                    [
-                        -72.2375142,
-                        18.6732605
-                    ],
-                    [
-                        -72.236843,
-                        18.6734876
-                    ],
-                    [
-                        -72.2364354,
-                        18.6724088
-                    ],
-                    [
-                        -72.2355124,
-                        18.6726019
-                    ],
-                    [
-                        -72.2354045,
-                        18.6724202
-                    ],
-                    [
-                        -72.2353027,
-                        18.6729028
-                    ],
-                    [
-                        -72.2345475,
-                        18.6726871
-                    ],
-                    [
-                        -72.2343077,
-                        18.6724599
-                    ],
-                    [
-                        -72.2342358,
-                        18.6734706
-                    ],
-                    [
-                        -72.2334087,
-                        18.6734592
-                    ],
-                    [
-                        -72.2332889,
-                        18.6733003
-                    ],
-                    [
-                        -72.2327375,
-                        18.6732889
-                    ],
-                    [
-                        -72.2327135,
-                        18.6735047
-                    ],
-                    [
-                        -72.227703,
-                        18.6725281
-                    ],
-                    [
-                        -72.2265283,
-                        18.6716537
-                    ],
-                    [
-                        -72.226804,
-                        18.6715742
-                    ],
-                    [
-                        -72.2274993,
-                        18.6715855
-                    ],
-                    [
-                        -72.2274873,
-                        18.6714493
-                    ],
-                    [
-                        -72.2272899,
-                        18.6714623
-                    ],
-                    [
-                        -72.2272814,
-                        18.6712977
-                    ],
-                    [
-                        -72.2272094,
-                        18.671358
-                    ],
-                    [
-                        -72.2261785,
-                        18.6713693
-                    ],
-                    [
-                        -72.2256032,
-                        18.670881
-                    ],
-                    [
-                        -72.2255073,
-                        18.6694502
-                    ],
-                    [
-                        -72.2261066,
-                        18.6696886
-                    ],
-                    [
-                        -72.2261785,
-                        18.6695949
-                    ],
-                    [
-                        -72.2259837,
-                        18.6695495
-                    ],
-                    [
-                        -72.225777,
-                        18.6691379
-                    ],
-                    [
-                        -72.2253335,
-                        18.6694643
-                    ],
-                    [
-                        -72.2249739,
-                        18.66947
-                    ],
-                    [
-                        -72.2245783,
-                        18.6678802
-                    ],
-                    [
-                        -72.2235525,
-                        18.6677046
-                    ],
-                    [
-                        -72.2235907,
-                        18.6675921
-                    ],
-                    [
-                        -72.2224634,
-                        18.6676283
-                    ],
-                    [
-                        -72.2223659,
-                        18.667022
-                    ],
-                    [
-                        -72.2223277,
-                        18.6670943
-                    ],
-                    [
-                        -72.2219209,
-                        18.667026
-                    ],
-                    [
-                        -72.2208105,
-                        18.6669015
-                    ],
-                    [
-                        -72.220809,
-                        18.6665325
-                    ],
-                    [
-                        -72.2208705,
-                        18.6663593
-                    ],
-                    [
-                        -72.2206023,
-                        18.6668107
-                    ],
-                    [
-                        -72.2203895,
-                        18.6666361
-                    ],
-                    [
-                        -72.2184341,
-                        18.6650535
-                    ],
-                    [
-                        -72.21829,
-                        18.6640979
-                    ],
-                    [
-                        -72.2183493,
-                        18.6608376
-                    ],
-                    [
-                        -72.2187223,
-                        18.6606541
-                    ],
-                    [
-                        -72.2186894,
-                        18.660603
-                    ],
-                    [
-                        -72.2187253,
-                        18.6604525
-                    ],
-                    [
-                        -72.2189771,
-                        18.6603247
-                    ],
-                    [
-                        -72.2187823,
-                        18.6601998
-                    ],
-                    [
-                        -72.2186984,
-                        18.6602367
-                    ],
-                    [
-                        -72.2185815,
-                        18.6600352
-                    ],
-                    [
-                        -72.2186085,
-                        18.6600039
-                    ],
-                    [
-                        -72.2187823,
-                        18.6601345
-                    ],
-                    [
-                        -72.218995,
-                        18.6600181
-                    ],
-                    [
-                        -72.2189111,
-                        18.6599131
-                    ],
-                    [
-                        -72.2189681,
-                        18.6597938
-                    ],
-                    [
-                        -72.2183807,
-                        18.6595837
-                    ],
-                    [
-                        -72.2184728,
-                        18.6539662
-                    ],
-                    [
-                        -72.2201001,
-                        18.6511554
-                    ],
-                    [
-                        -72.225796,
-                        18.6469472
-                    ],
-                    [
-                        -72.2283048,
-                        18.6457265
-                    ],
-                    [
-                        -72.2379335,
-                        18.645855
-                    ],
-                    [
-                        -72.237764,
-                        18.6446985
-                    ],
-                    [
-                        -72.2400355,
-                        18.6432529
-                    ],
-                    [
-                        -72.2455958,
-                        18.6433493
-                    ],
-                    [
-                        -72.2482742,
-                        18.6450358
-                    ],
-                    [
-                        -72.2487488,
-                        18.6436705
-                    ],
-                    [
-                        -72.2511067,
-                        18.6429775
-                    ],
-                    [
-                        -72.2512385,
-                        18.6433409
-                    ],
-                    [
-                        -72.2512625,
-                        18.6431592
-                    ],
-                    [
-                        -72.2514843,
-                        18.6431365
-                    ],
-                    [
-                        -72.2513284,
-                        18.6429718
-                    ],
-                    [
-                        -72.2533602,
-                        18.6423471
-                    ],
-                    [
-                        -72.253516,
-                        18.6426765
-                    ],
-                    [
-                        -72.2539535,
-                        18.6425402
-                    ],
-                    [
-                        -72.2541453,
-                        18.642932
-                    ],
-                    [
-                        -72.2543851,
-                        18.6428696
-                    ],
-                    [
-                        -72.2543791,
-                        18.6427503
-                    ],
-                    [
-                        -72.2564168,
-                        18.6423244
-                    ],
-                    [
-                        -72.2566925,
-                        18.6431365
-                    ],
-                    [
-                        -72.2568783,
-                        18.6428582
-                    ],
-                    [
-                        -72.2568184,
-                        18.6425288
-                    ],
-                    [
-                        -72.258843,
-                        18.6420991
-                    ],
-                    [
-                        -72.258885,
-                        18.6422467
-                    ],
-                    [
-                        -72.2592626,
-                        18.6422297
-                    ],
-                    [
-                        -72.2596461,
-                        18.6424057
-                    ],
-                    [
-                        -72.2592206,
-                        18.6406907
-                    ],
-                    [
-                        -72.2599545,
-                        18.6404815
-                    ],
-                    [
-                        -72.2601156,
-                        18.6406341
-                    ],
-                    [
-                        -72.2601156,
-                        18.6399393
-                    ],
-                    [
-                        -72.2615268,
-                        18.6394669
-                    ],
-                    [
-                        -72.2626056,
-                        18.6391034
-                    ],
-                    [
-                        -72.2654465,
-                        18.6387286
-                    ],
-                    [
-                        -72.2719433,
-                        18.6386832
-                    ],
-                    [
-                        -72.272201,
-                        18.6388649
-                    ],
-                    [
-                        -72.2730341,
-                        18.6394158
-                    ],
-                    [
-                        -72.273166,
-                        18.6412558
-                    ],
-                    [
-                        -72.2738732,
-                        18.6410286
-                    ],
-                    [
-                        -72.2742208,
-                        18.6416079
-                    ],
-                    [
-                        -72.2752187,
-                        18.6416987
-                    ],
-                    [
-                        -72.2754524,
-                        18.6415738
-                    ],
-                    [
-                        -72.2755513,
-                        18.6416874
-                    ],
-                    [
-                        -72.2755394,
-                        18.6417527
-                    ],
-                    [
-                        -72.2764713,
-                        18.6418634
-                    ],
-                    [
-                        -72.276753,
-                        18.6418975
-                    ],
-                    [
-                        -72.2762953,
-                        18.6426002
-                    ],
-                    [
-                        -72.2774226,
-                        18.6429978
-                    ],
-                    [
-                        -72.277982,
-                        18.6427247
-                    ],
-                    [
-                        -72.2785796,
-                        18.6431303
-                    ],
-                    [
-                        -72.2785669,
-                        18.6432307
-                    ],
-                    [
-                        -72.2789017,
-                        18.6433471
-                    ],
-                    [
-                        -72.279851,
-                        18.6439655
-                    ],
-                    [
-                        -72.2858703,
-                        18.6469651
-                    ]
-                ],
-                [
-                    [
-                        -72.5557247,
-                        18.5305893
-                    ],
-                    [
-                        -72.5555866,
-                        18.5367036
-                    ],
-                    [
-                        -72.554995,
-                        18.537975
-                    ],
-                    [
-                        -72.5488026,
-                        18.537919
-                    ],
-                    [
-                        -72.5486646,
-                        18.5372832
-                    ],
-                    [
-                        -72.548842,
-                        18.5306267
-                    ],
-                    [
-                        -72.5493745,
-                        18.5301031
-                    ],
-                    [
-                        -72.555133,
-                        18.5301218
-                    ]
-                ],
-                [
-                    [
-                        -72.6235278,
-                        18.5079877
-                    ],
-                    [
-                        -72.6234441,
-                        18.5095217
-                    ],
-                    [
-                        -72.6226074,
-                        18.5104341
-                    ],
-                    [
-                        -72.6204878,
-                        18.511849
-                    ],
-                    [
-                        -72.6183403,
-                        18.5107514
-                    ],
-                    [
-                        -72.6162207,
-                        18.5083183
-                    ],
-                    [
-                        -72.6162625,
-                        18.506467
-                    ],
-                    [
-                        -72.618661,
-                        18.5044438
-                    ],
-                    [
-                        -72.6204041,
-                        18.5044967
-                    ],
-                    [
-                        -72.6228305,
-                        18.506996
-                    ]
-                ]
-            ]
-        },
-        {
-            "name": "Ireland Bartholomew Quarter-Inch 1940",
-            "type": "tms",
-            "template": "http://geo.nls.uk/maps/ireland/bartholomew/{zoom}/{x}/{-y}.png",
-            "scaleExtent": [
-                5,
-                13
-            ],
-            "polygon": [
-                [
-                    [
-                        -8.8312773,
-                        55.3963337
-                    ],
-                    [
-                        -7.3221271,
-                        55.398605
-                    ],
-                    [
-                        -7.2891331,
-                        55.4333162
-                    ],
-                    [
-                        -7.2368042,
-                        55.4530757
-                    ],
-                    [
-                        -7.18881,
-                        55.4497995
-                    ],
-                    [
-                        -7.1528144,
-                        55.3968384
-                    ],
-                    [
-                        -6.90561,
-                        55.394903
-                    ],
-                    [
-                        -6.9047153,
-                        55.3842114
-                    ],
-                    [
-                        -5.8485282,
-                        55.3922956
-                    ],
-                    [
-                        -5.8378629,
-                        55.248676
-                    ],
-                    [
-                        -5.3614762,
-                        55.2507024
-                    ],
-                    [
-                        -5.3899172,
-                        53.8466464
-                    ],
-                    [
-                        -5.8734141,
-                        53.8487436
-                    ],
-                    [
-                        -5.8983,
-                        52.8256258
-                    ],
-                    [
-                        -6.0191742,
-                        52.8256258
-                    ],
-                    [
-                        -6.0262844,
-                        51.7712367
-                    ],
-                    [
-                        -8.1131422,
-                        51.7712367
-                    ],
-                    [
-                        -8.1273627,
-                        51.3268839
-                    ],
-                    [
-                        -10.6052842,
-                        51.3091083
-                    ],
-                    [
-                        -10.6271879,
-                        52.0328254
-                    ],
-                    [
-                        -10.6469845,
-                        52.0322454
-                    ],
-                    [
-                        -10.6469845,
-                        52.0440365
-                    ],
-                    [
-                        -10.6271879,
-                        52.0448095
-                    ],
-                    [
-                        -10.6290733,
-                        52.0745627
-                    ],
-                    [
-                        -10.6699234,
-                        52.0743695
-                    ],
-                    [
-                        -10.6702376,
-                        52.0876941
-                    ],
-                    [
-                        -10.6312729,
-                        52.0898179
-                    ],
-                    [
-                        -10.6393128,
-                        52.4147202
-                    ],
-                    [
-                        -10.3137689,
-                        52.4185533
-                    ],
-                    [
-                        -10.3166401,
-                        53.3341342
-                    ],
-                    [
-                        -10.3699669,
-                        53.3330727
-                    ],
-                    [
-                        -10.385965,
-                        54.3534472
-                    ],
-                    [
-                        -8.8163777,
-                        54.3586265
-                    ],
-                    [
-                        -8.8173427,
-                        54.6595721
-                    ],
-                    [
-                        -8.8413398,
-                        54.6616284
-                    ],
-                    [
-                        -8.8422286,
-                        54.6929749
-                    ],
-                    [
-                        -8.8315632,
-                        54.7145436
-                    ],
-                    [
-                        -8.8151208,
-                        54.7145436
-                    ]
-                ]
-            ],
-            "terms_url": "http://geo.nls.uk/maps/",
-            "terms_text": "National Library of Scotland Historic Maps"
-        },
-        {
-            "name": "Ireland British War Office 1:25k GSGS 3906",
-            "type": "tms",
-            "template": "http://mapwarper.net/layers/tile/101/{zoom}/{x}/{y}.png",
-            "scaleExtent": [
-                0,
-                18
-            ],
-            "polygon": [
-                [
-                    [
-                        -10.71,
-                        51.32
-                    ],
-                    [
-                        -10.71,
-                        55.46
-                    ],
-                    [
-                        -5.37,
-                        55.46
-                    ],
-                    [
-                        -5.37,
-                        51.32
-                    ],
-                    [
-                        -10.71,
-                        51.32
-                    ]
-                ]
-            ],
-            "terms_url": "http://wiki.openstreetmap.org/wiki/WikiProject_Ireland#Trinity_College_Dublin",
-            "terms_text": "Glucksman Map Library, Trinity College Dublin",
-            "id": "GSGS3906"
-        },
-        {
-            "name": "Ireland British War Office One-Inch 1941-43 GSGS 4136",
-            "type": "tms",
-            "template": "http://geo.nls.uk/maps/ireland/gsgs4136/{zoom}/{x}/{-y}.png",
-            "scaleExtent": [
-                5,
-                15
-            ],
-            "polygon": [
-                [
-                    [
-                        -10.0847426,
-                        51.4147902
-                    ],
-                    [
-                        -10.0906535,
-                        51.5064103
-                    ],
-                    [
-                        -10.4564222,
-                        51.5003961
-                    ],
-                    [
-                        -10.5005905,
-                        52.3043019
-                    ],
-                    [
-                        -10.0837522,
-                        52.312741
-                    ],
-                    [
-                        -10.0840973,
-                        52.3404698
-                    ],
-                    [
-                        -10.055802,
-                        52.3408915
-                    ],
-                    [
-                        -10.0768509,
-                        52.7628238
-                    ],
-                    [
-                        -9.7780248,
-                        52.7684611
-                    ],
-                    [
-                        -9.7818205,
-                        52.8577261
-                    ],
-                    [
-                        -9.6337877,
-                        52.8596012
-                    ],
-                    [
-                        -9.6449626,
-                        53.1294502
-                    ],
-                    [
-                        -10.0919663,
-                        53.1227152
-                    ],
-                    [
-                        -10.1051422,
-                        53.3912913
-                    ],
-                    [
-                        -10.4052593,
-                        53.3866349
-                    ],
-                    [
-                        -10.4530828,
-                        54.193502
-                    ],
-                    [
-                        -10.2998523,
-                        54.1974988
-                    ],
-                    [
-                        -10.3149801,
-                        54.4669592
-                    ],
-                    [
-                        -8.9276095,
-                        54.4853897
-                    ],
-                    [
-                        -8.9339534,
-                        54.7546562
-                    ],
-                    [
-                        -8.7773069,
-                        54.755501
-                    ],
-                    [
-                        -8.7826749,
-                        55.0252208
-                    ],
-                    [
-                        -8.9402974,
-                        55.0238221
-                    ],
-                    [
-                        -8.9451773,
-                        55.2934155
-                    ],
-                    [
-                        -7.528039,
-                        55.2970274
-                    ],
-                    [
-                        -7.525599,
-                        55.3874955
-                    ],
-                    [
-                        -7.0541955,
-                        55.3841691
-                    ],
-                    [
-                        -7.0556595,
-                        55.2939712
-                    ],
-                    [
-                        -6.3241545,
-                        55.2859128
-                    ],
-                    [
-                        -6.3217146,
-                        55.3253556
-                    ],
-                    [
-                        -6.1035807,
-                        55.3223016
-                    ],
-                    [
-                        -6.1045566,
-                        55.2828557
-                    ],
-                    [
-                        -5.7985836,
-                        55.2772968
-                    ],
-                    [
-                        -5.8117595,
-                        55.0087135
-                    ],
-                    [
-                        -5.656577,
-                        55.0056351
-                    ],
-                    [
-                        -5.6721928,
-                        54.7355021
-                    ],
-                    [
-                        -5.3618278,
-                        54.729585
-                    ],
-                    [
-                        -5.3964755,
-                        54.1917889
-                    ],
-                    [
-                        -5.855679,
-                        54.2017807
-                    ],
-                    [
-                        -5.9220464,
-                        52.8524504
-                    ],
-                    [
-                        -6.070885,
-                        52.8551025
-                    ],
-                    [
-                        -6.1030927,
-                        52.1373337
-                    ],
-                    [
-                        -6.8331336,
-                        52.1463183
-                    ],
-                    [
-                        -6.8355736,
-                        52.0578908
-                    ],
-                    [
-                        -7.5641506,
-                        52.0617913
-                    ],
-                    [
-                        -7.5661026,
-                        51.7921593
-                    ],
-                    [
-                        -8.147305,
-                        51.792763
-                    ],
-                    [
-                        -8.146329,
-                        51.7033331
-                    ],
-                    [
-                        -8.2912636,
-                        51.7027283
-                    ],
-                    [
-                        -8.2897996,
-                        51.5227274
-                    ],
-                    [
-                        -9.1174397,
-                        51.516958
-                    ],
-                    [
-                        -9.1179277,
-                        51.4625685
-                    ],
-                    [
-                        -9.3692452,
-                        51.4616564
-                    ],
-                    [
-                        -9.3672933,
-                        51.4254613
-                    ]
-                ]
-            ],
-            "terms_url": "http://geo.nls.uk/maps/",
-            "terms_text": "National Library of Scotland Historic Maps",
-            "id": "GSGS4136"
-        },
-        {
-            "name": "Ireland EEA CORINE 2006",
-            "type": "tms",
-            "template": "http://a.tile.openstreetmap.ie/tiles/corine/{zoom}/{x}/{y}.png",
-            "scaleExtent": [
-                5,
-                16
-            ],
-            "polygon": [
-                [
-                    [
-                        -5.842956,
-                        53.8627976
-                    ],
-                    [
-                        -5.8341575,
-                        53.7633541
-                    ],
-                    [
-                        -5.6267647,
-                        53.5383692
-                    ],
-                    [
-                        -5.9648778,
-                        52.1631197
-                    ],
-                    [
-                        -6.0453211,
-                        52.0527275
-                    ],
-                    [
-                        -6.1823261,
-                        51.9699475
-                    ],
-                    [
-                        -6.3960035,
-                        51.9234618
-                    ],
-                    [
-                        -6.5945978,
-                        51.883911
-                    ],
-                    [
-                        -7.2481994,
-                        51.9056295
-                    ],
-                    [
-                        -7.341212,
-                        51.8148076
-                    ],
-                    [
-                        -8.1971787,
-                        51.5037019
-                    ],
-                    [
-                        -8.3191005,
-                        51.4167737
-                    ],
-                    [
-                        -9.4478202,
-                        51.1991221
-                    ],
-                    [
-                        -9.9015706,
-                        51.2266802
-                    ],
-                    [
-                        -10.472215,
-                        51.4050139
-                    ],
-                    [
-                        -10.8857437,
-                        51.6770619
-                    ],
-                    [
-                        -11.035318,
-                        52.0620016
-                    ],
-                    [
-                        -10.9950963,
-                        52.1831616
-                    ],
-                    [
-                        -10.8178697,
-                        52.3139827
-                    ],
-                    [
-                        -9.8839736,
-                        52.9032208
-                    ],
-                    [
-                        -10.1165049,
-                        52.9676141
-                    ],
-                    [
-                        -10.5514014,
-                        53.3317027
-                    ],
-                    [
-                        -10.6896633,
-                        53.5854022
-                    ],
-                    [
-                        -10.6444139,
-                        54.0100436
-                    ],
-                    [
-                        -10.5501445,
-                        54.257482
-                    ],
-                    [
-                        -10.2824192,
-                        54.4742405
-                    ],
-                    [
-                        -9.8073011,
-                        54.5705346
-                    ],
-                    [
-                        -9.196435,
-                        54.5486695
-                    ],
-                    [
-                        -9.2253443,
-                        54.7000264
-                    ],
-                    [
-                        -8.8985435,
-                        55.1363582
-                    ],
-                    [
-                        -8.0476045,
-                        55.4711977
-                    ],
-                    [
-                        -7.4367384,
-                        55.6191092
-                    ],
-                    [
-                        -7.2205471,
-                        55.6205288
-                    ],
-                    [
-                        -6.8258723,
-                        55.5608644
-                    ],
-                    [
-                        -6.0679458,
-                        55.3727567
-                    ],
-                    [
-                        -5.5639184,
-                        55.0759594
-                    ],
-                    [
-                        -5.0649187,
-                        54.4640142
-                    ],
-                    [
-                        -5.2572284,
-                        54.1582424
-                    ]
-                ]
-            ],
-            "terms_url": "http://www.eea.europa.eu/data-and-maps/data/clc-2006-vector-data-version-1",
-            "terms_text": "EEA Corine 2006"
-        },
-        {
-            "name": "Ireland EEA GMES Urban Atlas",
-            "type": "tms",
-            "template": "http://a.tile.openstreetmap.ie/tiles/urbanatlas/{zoom}/{x}/{y}.png",
-            "scaleExtent": [
-                5,
-                17
-            ],
-            "polygon": [
-                [
-                    [
-                        -9.2759602,
-                        52.7993666
-                    ],
-                    [
-                        -9.215509,
-                        52.8276933
-                    ],
-                    [
-                        -9.1086618,
-                        52.9128016
-                    ],
-                    [
-                        -9.0196831,
-                        52.8837107
-                    ],
-                    [
-                        -8.8760649,
-                        52.8978445
-                    ],
-                    [
-                        -8.8001797,
-                        52.8833558
-                    ],
-                    [
-                        -8.7665597,
-                        52.9065354
-                    ],
-                    [
-                        -8.5938079,
-                        52.9238592
-                    ],
-                    [
-                        -8.5241972,
-                        52.8869724
-                    ],
-                    [
-                        -8.4956786,
-                        52.9105906
-                    ],
-                    [
-                        -8.3506448,
-                        52.9238592
-                    ],
-                    [
-                        -8.2718204,
-                        52.9492401
-                    ],
-                    [
-                        -8.2249679,
-                        52.8991338
-                    ],
-                    [
-                        -8.1564001,
-                        52.9149986
-                    ],
-                    [
-                        -8.0881237,
-                        52.7630417
-                    ],
-                    [
-                        -8.1360092,
-                        52.7239783
-                    ],
-                    [
-                        -8.1570652,
-                        52.6766443
-                    ],
-                    [
-                        -8.2059695,
-                        52.6185385
-                    ],
-                    [
-                        -8.2025734,
-                        52.5954396
-                    ],
-                    [
-                        -8.2231242,
-                        52.5599691
-                    ],
-                    [
-                        -8.2236294,
-                        52.5095371
-                    ],
-                    [
-                        -8.2976651,
-                        52.5025088
-                    ],
-                    [
-                        -8.3295888,
-                        52.4721087
-                    ],
-                    [
-                        -8.3589695,
-                        52.4986072
-                    ],
-                    [
-                        -8.3737385,
-                        52.4764529
-                    ],
-                    [
-                        -8.432326,
-                        52.4342609
-                    ],
-                    [
-                        -8.4754569,
-                        52.4216289
-                    ],
-                    [
-                        -8.5017727,
-                        52.3870011
-                    ],
-                    [
-                        -8.5476205,
-                        52.3681351
-                    ],
-                    [
-                        -8.6444103,
-                        52.3376422
-                    ],
-                    [
-                        -8.6841451,
-                        52.3660614
-                    ],
-                    [
-                        -8.8154099,
-                        52.3721014
-                    ],
-                    [
-                        -8.8614233,
-                        52.3521652
-                    ],
-                    [
-                        -8.9074451,
-                        52.3824674
-                    ],
-                    [
-                        -8.9388551,
-                        52.3789166
-                    ],
-                    [
-                        -8.9782502,
-                        52.4093811
-                    ],
-                    [
-                        -9.0298715,
-                        52.4104169
-                    ],
-                    [
-                        -9.1059449,
-                        52.420981
-                    ],
-                    [
-                        -9.1084962,
-                        52.4415071
-                    ],
-                    [
-                        -9.140702,
-                        52.4650891
-                    ],
-                    [
-                        -9.1315765,
-                        52.5136207
-                    ],
-                    [
-                        -9.1739699,
-                        52.5620573
-                    ],
-                    [
-                        -9.1426235,
-                        52.589645
-                    ],
-                    [
-                        -9.1542382,
-                        52.610216
-                    ],
-                    [
-                        -9.1426231,
-                        52.6387401
-                    ],
-                    [
-                        -9.1776844,
-                        52.6447573
-                    ],
-                    [
-                        -9.2012184,
-                        52.6526248
-                    ],
-                    [
-                        -9.2036198,
-                        52.6686468
-                    ],
-                    [
-                        -9.2238348,
-                        52.6706578
-                    ],
-                    [
-                        -9.2161072,
-                        52.6919412
-                    ],
-                    [
-                        -9.1882395,
-                        52.7057242
-                    ],
-                    [
-                        -9.2750099,
-                        52.7350292
-                    ],
-                    [
-                        -9.2601152,
-                        52.7616711
-                    ]
-                ],
-                [
-                    [
-                        -7.307313219981238,
-                        53.81625879275365
-                    ],
-                    [
-                        -7.245858447032101,
-                        53.78300449111207
-                    ],
-                    [
-                        -7.15144468970801,
-                        53.81179938127503
-                    ],
-                    [
-                        -7.086900011973722,
-                        53.784424420834
-                    ],
-                    [
-                        -7.0347149533800435,
-                        53.77996162275688
-                    ],
-                    [
-                        -6.975320116954343,
-                        53.788481098127924
-                    ],
-                    [
-                        -6.928628222423156,
-                        53.81443454540607
-                    ],
-                    [
-                        -6.992829577403537,
-                        53.86609081229548
-                    ],
-                    [
-                        -6.975320116954343,
-                        53.87945028968944
-                    ],
-                    [
-                        -6.949914233165313,
-                        53.87094929783329
-                    ],
-                    [
-                        -6.9375546140247035,
-                        53.87540241385127
-                    ],
-                    [
-                        -6.936867968516893,
-                        53.896649390754646
-                    ],
-                    [
-                        -6.897042529063821,
-                        53.889770599553906
-                    ],
-                    [
-                        -6.867516772227924,
-                        53.880259817835736
-                    ],
-                    [
-                        -6.851037280040446,
-                        53.88450958346468
-                    ],
-                    [
-                        -6.842454211192801,
-                        53.89786317755242
-                    ],
-                    [
-                        -6.812928454356904,
-                        53.90069520963246
-                    ],
-                    [
-                        -6.79850889869286,
-                        53.89280549994937
-                    ],
-                    [
-                        -6.789925829845217,
-                        53.89462633440526
-                    ],
-                    [
-                        -6.791985766368652,
-                        53.904538374710896
-                    ],
-                    [
-                        -6.778939501720231,
-                        53.918087767078354
-                    ],
-                    [
-                        -6.77001311011868,
-                        53.91505470292794
-                    ],
-                    [
-                        -6.75868345923979,
-                        53.921727153244476
-                    ],
-                    [
-                        -6.744263903575747,
-                        53.916065748791254
-                    ],
-                    [
-                        -6.727441088634364,
-                        53.92334455637637
-                    ],
-                    [
-                        -6.713021532970319,
-                        53.90777445003927
-                    ],
-                    [
-                        -6.684182421642232,
-                        53.90292024303218
-                    ],
-                    [
-                        -6.623757616954815,
-                        53.88187882710815
-                    ],
-                    [
-                        -6.590455309825955,
-                        53.857789593974296
-                    ],
-                    [
-                        -6.591141955333765,
-                        53.835509894663346
-                    ],
-                    [
-                        -6.574319140392382,
-                        53.82254170362619
-                    ],
-                    [
-                        -6.571572558361136,
-                        53.804703885117576
-                    ],
-                    [
-                        -6.5533764524041285,
-                        53.79983770791046
-                    ],
-                    [
-                        -6.541360156017425,
-                        53.78300449111207
-                    ],
-                    [
-                        -6.511491076427622,
-                        53.76900546961285
-                    ],
-                    [
-                        -6.472695605236269,
-                        53.77326653566421
-                    ],
-                    [
-                        -6.443513171154276,
-                        53.76393220797015
-                    ],
-                    [
-                        -6.44728972144724,
-                        53.75114486961979
-                    ],
-                    [
-                        -6.4775021237909485,
-                        53.728199094666586
-                    ],
-                    [
-                        -6.459649340587848,
-                        53.71682309412751
-                    ],
-                    [
-                        -6.435616747814443,
-                        53.72230833571077
-                    ],
-                    [
-                        -6.4198239011347775,
-                        53.72921465935537
-                    ],
-                    [
-                        -6.4009411496699595,
-                        53.72169889975152
-                    ],
-                    [
-                        -6.375878588634836,
-                        53.718042098526006
-                    ],
-                    [
-                        -6.359055773693453,
-                        53.708695495259434
-                    ],
-                    [
-                        -6.340173022228636,
-                        53.708085862042424
-                    ],
-                    [
-                        -6.329873339611461,
-                        53.71296268045594
-                    ],
-                    [
-                        -6.325753466564592,
-                        53.72210519137233
-                    ],
-                    [
-                        -6.2938244504513525,
-                        53.72576163932632
-                    ],
-                    [
-                        -6.265328661877173,
-                        53.7363229253304
-                    ],
-                    [
-                        -6.240952746349864,
-                        53.734292114843086
-                    ],
-                    [
-                        -6.180871264416349,
-                        53.632015710147016
-                    ],
-                    [
-                        -6.092793818322125,
-                        53.588038288422446
-                    ],
-                    [
-                        -5.985734079608837,
-                        53.49383447350347
-                    ],
-                    [
-                        -6.0887447432153685,
-                        53.27174268379562
-                    ],
-                    [
-                        -6.033272979232964,
-                        53.1191110041494
-                    ],
-                    [
-                        -5.984663357119282,
-                        52.9651254915577
-                    ],
-                    [
-                        -6.122679104189409,
-                        52.73207538466633
-                    ],
-                    [
-                        -6.185163845400262,
-                        52.73706461957944
-                    ],
-                    [
-                        -6.1899703639549415,
-                        52.76075568810044
-                    ],
-                    [
-                        -6.319059719423517,
-                        52.782357357522855
-                    ],
-                    [
-                        -6.393904079774976,
-                        52.7790347214105
-                    ],
-                    [
-                        -6.465315212587381,
-                        52.6946379192593
-                    ],
-                    [
-                        -6.534666408876349,
-                        52.673409093161446
-                    ],
-                    [
-                        -6.612257351259057,
-                        52.69255711803012
-                    ],
-                    [
-                        -6.6692489284074155,
-                        52.74745702505679
-                    ],
-                    [
-                        -6.671308864930852,
-                        52.76948072949997
-                    ],
-                    [
-                        -6.720747341493285,
-                        52.7748810695361
-                    ],
-                    [
-                        -6.71456753192298,
-                        52.80311808637125
-                    ],
-                    [
-                        -6.658949245790243,
-                        52.84709806982182
-                    ],
-                    [
-                        -6.582044948915348,
-                        52.81349473557279
-                    ],
-                    [
-                        -6.547712673524768,
-                        52.83133677935633
-                    ],
-                    [
-                        -6.531233181337292,
-                        52.87404491274922
-                    ],
-                    [
-                        -6.617750515321548,
-                        52.87528820923615
-                    ],
-                    [
-                        -6.728987087587023,
-                        52.90635903963372
-                    ],
-                    [
-                        -6.780485500672891,
-                        52.859122574848655
-                    ],
-                    [
-                        -6.870436062196207,
-                        52.85165948109425
-                    ],
-                    [
-                        -6.938413967469552,
-                        52.86658438536895
-                    ],
-                    [
-                        -6.965879787782016,
-                        52.89766145203082
-                    ],
-                    [
-                        -6.987852444031986,
-                        52.969260966642985
-                    ],
-                    [
-                        -7.039350857117853,
-                        52.9560260536776
-                    ],
-                    [
-                        -7.109388698914634,
-                        53.007288776633686
-                    ],
-                    [
-                        -7.068876613953752,
-                        53.058078015357786
-                    ],
-                    [
-                        -7.088789333680287,
-                        53.11869890949892
-                    ],
-                    [
-                        -7.119688381531809,
-                        53.15000684568904
-                    ],
-                    [
-                        -7.105955471375577,
-                        53.16112391039828
-                    ],
-                    [
-                        -7.127928127625547,
-                        53.17223809655703
-                    ],
-                    [
-                        -7.180113186219227,
-                        53.182526443342745
-                    ],
-                    [
-                        -7.160887112000503,
-                        53.19898266621498
-                    ],
-                    [
-                        -7.057890285828767,
-                        53.19898266621498
-                    ],
-                    [
-                        -7.048963894227218,
-                        53.217077217179636
-                    ],
-                    [
-                        -7.0915359157115345,
-                        53.235575105358386
-                    ],
-                    [
-                        -7.0434707301647235,
-                        53.25735126035676
-                    ],
-                    [
-                        -7.05102383075065,
-                        53.29717703664696
-                    ],
-                    [
-                        -6.996778835633536,
-                        53.31112780504489
-                    ],
-                    [
-                        -7.044157375672535,
-                        53.33368557548294
-                    ],
-                    [
-                        -7.105955471375576,
-                        53.371801590024276
-                    ],
-                    [
-                        -7.22050647653913,
-                        53.432465115081854
-                    ],
-                    [
-                        -7.149441429887032,
-                        53.45731709817442
-                    ],
-                    [
-                        -7.099891489102085,
-                        53.463915962572514
-                    ],
-                    [
-                        -7.0744645458045445,
-                        53.48370640260363
-                    ],
-                    [
-                        -7.079028356140001,
-                        53.504650927752664
-                    ],
-                    [
-                        -7.047733656696876,
-                        53.515119311359335
-                    ],
-                    [
-                        -7.029478415355053,
-                        53.54147267392419
-                    ],
-                    [
-                        -7.054253385747527,
-                        53.56471202500164
-                    ],
-                    [
-                        -7.009267255298033,
-                        53.58561652973758
-                    ],
-                    [
-                        -6.992641946218873,
-                        53.602642188744426
-                    ],
-                    [
-                        -6.989056095241016,
-                        53.62739453790707
-                    ],
-                    [
-                        -6.9717788132567895,
-                        53.63686620586593
-                    ],
-                    [
-                        -6.9633031654909425,
-                        53.650973114934644
-                    ],
-                    [
-                        -6.9871001765258205,
-                        53.66623418009986
-                    ],
-                    [
-                        -6.999813648174589,
-                        53.67086935885432
-                    ],
-                    [
-                        -7.008289295940436,
-                        53.65908728051006
-                    ],
-                    [
-                        -7.044473792171549,
-                        53.65367801032349
-                    ],
-                    [
-                        -7.066640870943764,
-                        53.63918547390694
-                    ],
-                    [
-                        -7.101847407817279,
-                        53.65870092708686
-                    ],
-                    [
-                        -7.120754622064167,
-                        53.672993645380515
-                    ],
-                    [
-                        -7.137379931143327,
-                        53.66893809633893
-                    ],
-                    [
-                        -7.160850955725672,
-                        53.683034277255075
-                    ],
-                    [
-                        -7.174216400279507,
-                        53.686316272406906
-                    ],
-                    [
-                        -7.196057492599188,
-                        53.69017711570491
-                    ],
-                    [
-                        -7.210726882963154,
-                        53.69480966037566
-                    ],
-                    [
-                        -7.247237365646801,
-                        53.71661437518035
-                    ],
-                    [
-                        -7.239413690786019,
-                        53.73223735177976
-                    ],
-                    [
-                        -7.260276823748104,
-                        53.74361339729716
-                    ],
-                    [
-                        -7.2814659431627184,
-                        53.75922634307083
-                    ],
-                    [
-                        -7.289615604476034,
-                        53.77271433845693
-                    ],
-                    [
-                        -7.3238441819919515,
-                        53.78465723043301
-                    ],
-                    [
-                        -7.337209626545788,
-                        53.78658318504567
-                    ],
-                    [
-                        -7.351227044004687,
-                        53.80141007448381
-                    ],
-                    [
-                        -7.307313219981238,
-                        53.81625879275365
-                    ]
-                ],
-                [
-                    [
-                        -5.685433013282673,
-                        54.77854496390836
-                    ],
-                    [
-                        -5.696867084279401,
-                        54.73050346921268
-                    ],
-                    [
-                        -5.8223689524230124,
-                        54.70033215177621
-                    ],
-                    [
-                        -5.878760568989772,
-                        54.649492182564074
-                    ],
-                    [
-                        -5.743404719024681,
-                        54.68128223623249
-                    ],
-                    [
-                        -5.581196917402638,
-                        54.68781619319656
-                    ],
-                    [
-                        -5.571488953592992,
-                        54.67074450064368
-                    ],
-                    [
-                        -5.582915011231644,
-                        54.66440901595977
-                    ],
-                    [
-                        -5.58291501123164,
-                        54.65085746679818
-                    ],
-                    [
-                        -5.6086481910584185,
-                        54.63997082553691
-                    ],
-                    [
-                        -5.6354970593650116,
-                        54.61551371292451
-                    ],
-                    [
-                        -5.728732824433139,
-                        54.6184944610979
-                    ],
-                    [
-                        -5.822612969913913,
-                        54.49193018941315
-                    ],
-                    [
-                        -5.896754545381575,
-                        54.44975600798866
-                    ],
-                    [
-                        -5.936834914186871,
-                        54.38213187386197
-                    ],
-                    [
-                        -6.0187561190025445,
-                        54.36974944197913
-                    ],
-                    [
-                        -6.059257912638059,
-                        54.38280030737259
-                    ],
-                    [
-                        -6.101784280694663,
-                        54.41510088826871
-                    ],
-                    [
-                        -6.1740201072375225,
-                        54.43476829635816
-                    ],
-                    [
-                        -6.216261364689026,
-                        54.42827259213158
-                    ],
-                    [
-                        -6.264329002478664,
-                        54.487825014814625
-                    ],
-                    [
-                        -6.249277519938476,
-                        54.49741303545491
-                    ],
-                    [
-                        -6.288340515296785,
-                        54.53143435197413
-                    ],
-                    [
-                        -6.283750270272458,
-                        54.54447449434036
-                    ],
-                    [
-                        -6.321445027854273,
-                        54.58928767713928
-                    ],
-                    [
-                        -6.264329002478664,
-                        54.604982769755765
-                    ],
-                    [
-                        -6.240052417736423,
-                        54.59541999854735
-                    ],
-                    [
-                        -6.098762694536575,
-                        54.631690374598676
-                    ],
-                    [
-                        -6.051950538018501,
-                        54.61314575326238
-                    ],
-                    [
-                        -6.031509408441251,
-                        54.620921248201434
-                    ],
-                    [
-                        -6.002995140908084,
-                        54.65571636730639
-                    ],
-                    [
-                        -6.0647754758974335,
-                        54.6634355452454
-                    ],
-                    [
-                        -6.059920158948984,
-                        54.704134188139534
-                    ],
-                    [
-                        -6.047781866577864,
-                        54.71395188569398
-                    ],
-                    [
-                        -6.120611620804591,
-                        54.801644524994515
-                    ],
-                    [
-                        -6.002141887262449,
-                        54.80836072138932
-                    ],
-                    [
-                        -5.984662746248036,
-                        54.78652900156178
-                    ],
-                    [
-                        -5.685433013282673,
-                        54.77854496390836
-                    ]
-                ],
-                [
-                    [
-                        -9.128658300749114,
-                        53.24759266864586
-                    ],
-                    [
-                        -9.024510568479629,
-                        53.26744820137083
-                    ],
-                    [
-                        -9.016360907166316,
-                        53.26364619217274
-                    ],
-                    [
-                        -9.001854510028616,
-                        53.26588844362053
-                    ],
-                    [
-                        -8.9951717877517,
-                        53.259258838409615
-                    ],
-                    [
-                        -8.973493688658284,
-                        53.262378780650025
-                    ],
-                    [
-                        -8.95230456924367,
-                        53.271444820907114
-                    ],
-                    [
-                        -8.956705386352859,
-                        53.281580911863244
-                    ],
-                    [
-                        -8.961106203462048,
-                        53.28119110665652
-                    ],
-                    [
-                        -8.960780217009516,
-                        53.28908396911955
-                    ],
-                    [
-                        -8.954260487958864,
-                        53.28927883616923
-                    ],
-                    [
-                        -8.95230456924367,
-                        53.30155366854246
-                    ],
-                    [
-                        -8.963714095082308,
-                        53.303793931840495
-                    ],
-                    [
-                        -8.9811543702928,
-                        53.294734752711804
-                    ],
-                    [
-                        -8.985718180628256,
-                        53.30174847871221
-                    ],
-                    [
-                        -9.019946758144176,
-                        53.30768976199425
-                    ],
-                    [
-                        -9.00837423907927,
-                        53.31596722087059
-                    ],
-                    [
-                        -9.01880580556031,
-                        53.31625933715475
-                    ],
-                    [
-                        -9.045862681120513,
-                        53.31275380979257
-                    ],
-                    [
-                        -9.06444390891487,
-                        53.32122500810515
-                    ],
-                    [
-                        -9.080906224767762,
-                        53.307397587062724
-                    ],
-                    [
-                        -9.08106921799403,
-                        53.303404329274585
-                    ],
-                    [
-                        -9.09019683866494,
-                        53.30574189135002
-                    ],
-                    [
-                        -9.095901601584261,
-                        53.298826232852214
-                    ],
-                    [
-                        -9.10128037805105,
-                        53.3008718259498
-                    ],
-                    [
-                        -9.115623781962478,
-                        53.28450433758295
-                    ],
-                    [
-                        -9.121491538108067,
-                        53.2832375443259
-                    ],
-                    [
-                        -9.13273807072044,
-                        53.28557621023763
-                    ],
-                    [
-                        -9.144636576237877,
-                        53.27865728614638
-                    ],
-                    [
-                        -9.13876882009229,
-                        53.26345120822951
-                    ],
-                    [
-                        -9.128658300749114,
-                        53.24759266864586
-                    ]
-                ],
-                [
-                    [
-                        -8.595266214281438,
-                        51.69264788483154
-                    ],
-                    [
-                        -8.55819409885298,
-                        51.69306638852667
-                    ],
-                    [
-                        -8.566697711835303,
-                        51.682644706464686
-                    ],
-                    [
-                        -8.579130708100188,
-                        51.67349700898941
-                    ],
-                    [
-                        -8.544554623426079,
-                        51.66520531197343
-                    ],
-                    [
-                        -8.494765061495364,
-                        51.667778759675976
-                    ],
-                    [
-                        -8.30113898732036,
-                        51.7235009029955
-                    ],
-                    [
-                        -8.268406960495541,
-                        51.784858633837544
-                    ],
-                    [
-                        -8.154536388302146,
-                        51.7814362126791
-                    ],
-                    [
-                        -8.115350159004825,
-                        51.809093351533164
-                    ],
-                    [
-                        -8.068326683848039,
-                        51.870050153657075
-                    ],
-                    [
-                        -8.10059769621054,
-                        51.89964422561186
-                    ],
-                    [
-                        -8.08123508879304,
-                        51.918414974037226
-                    ],
-                    [
-                        -8.09183842142643,
-                        51.95337589170907
-                    ],
-                    [
-                        -8.124570448251253,
-                        51.95479649105758
-                    ],
-                    [
-                        -8.132407694110718,
-                        51.970988142592034
-                    ],
-                    [
-                        -8.099675667285895,
-                        51.978371865876596
-                    ],
-                    [
-                        -8.144394070131078,
-                        52.02151390085561
-                    ],
-                    [
-                        -8.159607547387685,
-                        52.064330945363764
-                    ],
-                    [
-                        -8.140705954432507,
-                        52.07254939152303
-                    ],
-                    [
-                        -8.165600735397863,
-                        52.09294727054506
-                    ],
-                    [
-                        -8.18726841512697,
-                        52.0835993998731
-                    ],
-                    [
-                        -8.2093971093184,
-                        52.10512489114057
-                    ],
-                    [
-                        -8.207092037006792,
-                        52.12494181389489
-                    ],
-                    [
-                        -8.227837687811258,
-                        52.143052434929714
-                    ],
-                    [
-                        -8.222766528725723,
-                        52.16454923557058
-                    ],
-                    [
-                        -8.30298304516965,
-                        52.1829264222872
-                    ],
-                    [
-                        -8.427456949996438,
-                        52.17783811526099
-                    ],
-                    [
-                        -8.46710419375608,
-                        52.169921813849676
-                    ],
-                    [
-                        -8.509978538751975,
-                        52.18405707812542
-                    ],
-                    [
-                        -8.530263175094117,
-                        52.16511480067495
-                    ],
-                    [
-                        -8.574981577939297,
-                        52.18066502436804
-                    ],
-                    [
-                        -8.587889982884295,
-                        52.16963906274442
-                    ],
-                    [
-                        -8.642289689438227,
-                        52.18829678149147
-                    ],
-                    [
-                        -8.719279104645906,
-                        52.15804472022032
-                    ],
-                    [
-                        -8.698533453841442,
-                        52.13541291452849
-                    ],
-                    [
-                        -8.740946784375014,
-                        52.10823956240069
-                    ],
-                    [
-                        -8.77460084012448,
-                        52.05951253229793
-                    ],
-                    [
-                        -8.803183736788409,
-                        52.03768144571248
-                    ],
-                    [
-                        -8.86818677597573,
-                        52.03286015807593
-                    ],
-                    [
-                        -8.870491848287335,
-                        52.01839317543363
-                    ],
-                    [
-                        -8.844214023935015,
-                        51.991148511559096
-                    ],
-                    [
-                        -8.79811257770287,
-                        51.964455373040394
-                    ],
-                    [
-                        -8.782899100446263,
-                        51.931777239822054
-                    ],
-                    [
-                        -8.835915763613228,
-                        51.9292188160068
-                    ],
-                    [
-                        -8.838681850387156,
-                        51.90277322850554
-                    ],
-                    [
-                        -8.802261707863764,
-                        51.89367006943167
-                    ],
-                    [
-                        -8.792580404155013,
-                        51.85695425263326
-                    ],
-                    [
-                        -8.765841565340368,
-                        51.82476769939557
-                    ],
-                    [
-                        -8.758926348405547,
-                        51.80054140901511
-                    ],
-                    [
-                        -8.79811257770287,
-                        51.78628456602828
-                    ],
-                    [
-                        -8.832227647914657,
-                        51.79626482935233
-                    ],
-                    [
-                        -8.836837792537873,
-                        51.77687258059678
-                    ],
-                    [
-                        -8.885705325543944,
-                        51.746055989869106
-                    ],
-                    [
-                        -8.859888515653944,
-                        51.72435763090916
-                    ],
-                    [
-                        -8.807332866949299,
-                        51.71093369500414
-                    ],
-                    [
-                        -8.678248817499297,
-                        51.693505197270746
-                    ],
-                    [
-                        -8.60540853245251,
-                        51.67835695335278
-                    ],
-                    [
-                        -8.595266214281438,
-                        51.69264788483154
-                    ]
-                ],
-                [
-                    [
-                        -7.138279151048154,
-                        55.06131559970097
-                    ],
-                    [
-                        -7.117994514706011,
-                        54.99631329558348
-                    ],
-                    [
-                        -7.070049010624583,
-                        54.98784996056705
-                    ],
-                    [
-                        -7.076503213097081,
-                        54.93332450204895
-                    ],
-                    [
-                        -7.025791622241725,
-                        54.91159959910791
-                    ],
-                    [
-                        -7.007351043748867,
-                        54.87872502112528
-                    ],
-                    [
-                        -7.024869593317081,
-                        54.8511320998998
-                    ],
-                    [
-                        -6.990754523105296,
-                        54.81661438893913
-                    ],
-                    [
-                        -7.051608432131725,
-                        54.80598761598125
-                    ],
-                    [
-                        -7.115228427932084,
-                        54.80651902101645
-                    ],
-                    [
-                        -7.170550163410654,
-                        54.84847793920564
-                    ],
-                    [
-                        -7.199133060074584,
-                        54.84316909395457
-                    ],
-                    [
-                        -7.222183783190655,
-                        54.85803210052931
-                    ],
-                    [
-                        -7.2111194360949415,
-                        54.862808332627324
-                    ],
-                    [
-                        -7.212041465019584,
-                        54.882438010878076
-                    ],
-                    [
-                        -7.279349576518514,
-                        54.880846771447125
-                    ],
-                    [
-                        -7.273817402970655,
-                        54.91530955931841
-                    ],
-                    [
-                        -7.3033223285592275,
-                        54.915839525718205
-                    ],
-                    [
-                        -7.363254208661015,
-                        54.90894941815292
-                    ],
-                    [
-                        -7.385382902852443,
-                        54.91636948513913
-                    ],
-                    [
-                        -7.391837105324943,
-                        54.93438395336098
-                    ],
-                    [
-                        -7.429640291235302,
-                        54.95291983389722
-                    ],
-                    [
-                        -7.420420001988872,
-                        54.99208185118366
-                    ],
-                    [
-                        -7.410277683817801,
-                        55.03437621938347
-                    ],
-                    [
-                        -7.3577220351131585,
-                        55.057619110599035
-                    ],
-                    [
-                        -7.265519142648871,
-                        55.07557028899173
-                    ],
-                    [
-                        -7.138279151048154,
-                        55.06131559970097
-                    ]
-                ],
-                [
-                    [
-                        -7.190498776293322,
-                        52.26144368927652
-                    ],
-                    [
-                        -7.156844720543858,
-                        52.28443443581867
-                    ],
-                    [
-                        -7.132871968503143,
-                        52.27343421670601
-                    ],
-                    [
-                        -7.113278853854483,
-                        52.26779201951648
-                    ],
-                    [
-                        -7.098295883829036,
-                        52.27230583471742
-                    ],
-                    [
-                        -7.089767116276089,
-                        52.25509445009032
-                    ],
-                    [
-                        -7.07109603055207,
-                        52.259186286149074
-                    ],
-                    [
-                        -7.033984366335195,
-                        52.257352061495865
-                    ],
-                    [
-                        -7.027530163862696,
-                        52.250720000975015
-                    ],
-                    [
-                        -7.034675888028678,
-                        52.247756419376
-                    ],
-                    [
-                        -7.031218279561267,
-                        52.24013487190721
-                    ],
-                    [
-                        -7.034214873566356,
-                        52.23222966213934
-                    ],
-                    [
-                        -7.050580886978767,
-                        52.2296884028405
-                    ],
-                    [
-                        -7.062567262999124,
-                        52.21980434486687
-                    ],
-                    [
-                        -7.076858711331088,
-                        52.216132562953725
-                    ],
-                    [
-                        -7.084926464421715,
-                        52.22065163604718
-                    ],
-                    [
-                        -7.084465449959392,
-                        52.22785295843095
-                    ],
-                    [
-                        -7.101292477834124,
-                        52.221498911062525
-                    ],
-                    [
-                        -7.105211100763858,
-                        52.21726237433474
-                    ],
-                    [
-                        -7.111665303236357,
-                        52.21796849185403
-                    ],
-                    [
-                        -7.107977187537785,
-                        52.21104805609072
-                    ],
-                    [
-                        -7.117773744862115,
-                        52.20928246619701
-                    ],
-                    [
-                        -7.129760120882472,
-                        52.21690931136535
-                    ],
-                    [
-                        -7.14497359813908,
-                        52.21782726924826
-                    ],
-                    [
-                        -7.150505771686938,
-                        52.22375823207553
-                    ],
-                    [
-                        -7.158112510315241,
-                        52.22262858593765
-                    ],
-                    [
-                        -7.158804032008724,
-                        52.22700580464912
-                    ],
-                    [
-                        -7.158573524777563,
-                        52.23180612902503
-                    ],
-                    [
-                        -7.167563306792832,
-                        52.23985256723076
-                    ],
-                    [
-                        -7.16733279956167,
-                        52.244580933687786
-                    ],
-                    [
-                        -7.172519212262786,
-                        52.24676851484933
-                    ],
-                    [
-                        -7.177590371348324,
-                        52.25114335361416
-                    ],
-                    [
-                        -7.190498776293322,
-                        52.26144368927652
-                    ]
-                ]
-            ],
-            "terms_url": "http://www.eea.europa.eu/data-and-maps/data/urban-atlas",
-            "terms_text": "EEA GMES Urban Atlas"
-        },
-        {
-            "name": "Kanton Aargau 25cm (AGIS 2011)",
-            "type": "tms",
-            "template": "http://tiles.poole.ch/AGIS/OF2011/{zoom}/{x}/{y}.png",
-            "scaleExtent": [
-                14,
-                19
-            ],
-            "polygon": [
-                [
-                    [
-                        7.7,
-                        47.12
-                    ],
-                    [
-                        7.7,
-                        47.63
-                    ],
-                    [
-                        8.5,
-                        47.63
-                    ],
-                    [
-                        8.5,
-                        47.12
-                    ],
-                    [
-                        7.7,
-                        47.12
-                    ]
-                ]
-            ],
-            "terms_text": "AGIS OF2011"
-        },
-        {
-            "name": "Katastrálna mapa Slovenska (KaPor, 2010-04)",
-            "type": "tms",
-            "template": "http://www.freemap.sk/tms/kapor2/{zoom}/{x}/{y}.jpg",
-            "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_url": "http://wiki.freemap.sk/KatasterPortal",
-            "terms_text": "Permisssion by UGKK"
-        },
-        {
-            "name": "Katastrálna mapa Slovenska (KaPor, 2011-05)",
-            "type": "tms",
-            "template": "http://www.freemap.sk/tms/kapor2_201105/{zoom}/{x}/{y}.jpg",
-            "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_url": "http://wiki.freemap.sk/KatasterPortal",
-            "terms_text": "Permisssion by UGKK"
-        },
-        {
-            "name": "Kelowna 2012",
-            "type": "tms",
-            "description": "High quality aerial imagery taken for the City of Kelowna",
-            "template": "http://{switch:a,b,c,d}.tile.paulnorman.ca/kelowna2012/{zoom}/{x}/{y}.png",
-            "scaleExtent": [
-                9,
-                20
-            ],
-            "polygon": [
-                [
-                    [
-                        -119.5867318,
-                        49.7928087
-                    ],
-                    [
-                        -119.5465655,
-                        49.7928097
-                    ],
-                    [
-                        -119.5465661,
-                        49.8013837
-                    ],
-                    [
-                        -119.5343374,
-                        49.8013841
-                    ],
-                    [
-                        -119.5343376,
-                        49.8047321
-                    ],
-                    [
-                        -119.5296211,
-                        49.8047322
-                    ],
-                    [
-                        -119.5296216,
-                        49.8119555
-                    ],
-                    [
-                        -119.5104463,
-                        49.811956
-                    ],
-                    [
-                        -119.5115683,
-                        49.8744325
-                    ],
-                    [
-                        -119.5108946,
-                        49.8744904
-                    ],
-                    [
-                        -119.5114111,
-                        49.8843312
-                    ],
-                    [
-                        -119.5114115,
-                        49.9221763
-                    ],
-                    [
-                        -119.49386,
-                        49.9223477
-                    ],
-                    [
-                        -119.4940505,
-                        49.9313031
-                    ],
-                    [
-                        -119.4803936,
-                        49.9317529
-                    ],
-                    [
-                        -119.4804572,
-                        49.9407474
-                    ],
-                    [
-                        -119.4666732,
-                        49.9409927
-                    ],
-                    [
-                        -119.4692775,
-                        49.9913717
-                    ],
-                    [
-                        -119.4551337,
-                        49.9916078
-                    ],
-                    [
-                        -119.4556736,
-                        50.0121242
-                    ],
-                    [
-                        -119.4416673,
-                        50.0123895
-                    ],
-                    [
-                        -119.4417308,
-                        50.0136345
-                    ],
-                    [
-                        -119.4221492,
-                        50.0140377
-                    ],
-                    [
-                        -119.4221042,
-                        50.0119306
-                    ],
-                    [
-                        -119.4121303,
-                        50.012165
-                    ],
-                    [
-                        -119.4126082,
-                        50.0216913
-                    ],
-                    [
-                        -119.4123387,
-                        50.0216913
-                    ],
-                    [
-                        -119.4124772,
-                        50.0250773
-                    ],
-                    [
-                        -119.4120917,
-                        50.0250821
-                    ],
-                    [
-                        -119.4121954,
-                        50.0270769
-                    ],
-                    [
-                        -119.4126083,
-                        50.0270718
-                    ],
-                    [
-                        -119.4128328,
-                        50.0321946
-                    ],
-                    [
-                        -119.3936313,
-                        50.0326418
-                    ],
-                    [
-                        -119.393529,
-                        50.0307781
-                    ],
-                    [
-                        -119.3795727,
-                        50.0310116
-                    ],
-                    [
-                        -119.3795377,
-                        50.0287584
-                    ],
-                    [
-                        -119.3735764,
-                        50.0288621
-                    ],
-                    [
-                        -119.371544,
-                        49.9793618
-                    ],
-                    [
-                        -119.3573506,
-                        49.9793618
-                    ],
-                    [
-                        -119.3548353,
-                        49.9256081
-                    ],
-                    [
-                        -119.3268079,
-                        49.9257238
-                    ],
-                    [
-                        -119.3256573,
-                        49.8804068
-                    ],
-                    [
-                        -119.3138893,
-                        49.8806528
-                    ],
-                    [
-                        -119.3137097,
-                        49.8771651
-                    ],
-                    [
-                        -119.3132156,
-                        49.877223
-                    ],
-                    [
-                        -119.3131482,
-                        49.8749652
-                    ],
-                    [
-                        -119.312452,
-                        49.8749073
-                    ],
-                    [
-                        -119.3122275,
-                        49.87236
-                    ],
-                    [
-                        -119.3117558,
-                        49.872331
-                    ],
-                    [
-                        -119.3115986,
-                        49.8696098
-                    ],
-                    [
-                        -119.3112169,
-                        49.8694217
-                    ],
-                    [
-                        -119.3109199,
-                        49.8632417
-                    ],
-                    [
-                        -119.3103721,
-                        49.8632724
-                    ],
-                    [
-                        -119.3095139,
-                        49.8512388
-                    ],
-                    [
-                        -119.3106368,
-                        49.8512316
-                    ],
-                    [
-                        -119.3103859,
-                        49.8462564
-                    ],
-                    [
-                        -119.3245344,
-                        49.8459957
-                    ],
-                    [
-                        -119.3246018,
-                        49.8450689
-                    ],
-                    [
-                        -119.3367018,
-                        49.844875
-                    ],
-                    [
-                        -119.3367467,
-                        49.8435136
-                    ],
-                    [
-                        -119.337937,
-                        49.8434702
-                    ],
-                    [
-                        -119.3378023,
-                        49.8382055
-                    ],
-                    [
-                        -119.3383637,
-                        49.8381041
-                    ],
-                    [
-                        -119.3383749,
-                        49.8351202
-                    ],
-                    [
-                        -119.3390936,
-                        49.8351058
-                    ],
-                    [
-                        -119.3388016,
-                        49.8321217
-                    ],
-                    [
-                        -119.3391497,
-                        49.8320565
-                    ],
-                    [
-                        -119.3391722,
-                        49.8293331
-                    ],
-                    [
-                        -119.3394641,
-                        49.8293331
-                    ],
-                    [
-                        -119.3395879,
-                        49.8267878
-                    ],
-                    [
-                        -119.3500053,
-                        49.8265829
-                    ],
-                    [
-                        -119.3493701,
-                        49.8180588
-                    ],
-                    [
-                        -119.4046964,
-                        49.8163785
-                    ],
-                    [
-                        -119.4045694,
-                        49.8099022
-                    ],
-                    [
-                        -119.4101592,
-                        49.8099022
-                    ],
-                    [
-                        -119.4102862,
-                        49.8072787
-                    ],
-                    [
-                        -119.4319467,
-                        49.8069098
-                    ],
-                    [
-                        -119.4322643,
-                        49.7907965
-                    ],
-                    [
-                        -119.4459847,
-                        49.7905504
-                    ],
-                    [
-                        -119.445286,
-                        49.7820201
-                    ],
-                    [
-                        -119.4967376,
-                        49.7811587
-                    ],
-                    [
-                        -119.4966105,
-                        49.7784927
-                    ],
-                    [
-                        -119.5418371,
-                        49.7775082
-                    ],
-                    [
-                        -119.5415892,
-                        49.7718277
-                    ],
-                    [
-                        -119.5560296,
-                        49.7714941
-                    ],
-                    [
-                        -119.5561194,
-                        49.7718422
-                    ],
-                    [
-                        -119.5715704,
-                        49.7715086
-                    ],
-                    [
-                        -119.5716153,
-                        49.7717262
-                    ],
-                    [
-                        -119.5819235,
-                        49.7714941
-                    ],
-                    [
-                        -119.5820133,
-                        49.7717697
-                    ],
-                    [
-                        -119.5922991,
-                        49.7715231
-                    ],
-                    [
-                        -119.592344,
-                        49.7718132
-                    ],
-                    [
-                        -119.6003839,
-                        49.7715957
-                    ],
-                    [
-                        -119.6011924,
-                        49.7839081
-                    ],
-                    [
-                        -119.5864365,
-                        49.7843863
-                    ]
-                ]
-            ],
-            "id": "kelowna_2012"
-        },
-        {
-            "name": "Kelowna Roads overlay",
-            "type": "tms",
-            "template": "http://{switch:a,b,c,d}.tile.paulnorman.ca/kelowna_overlay/{zoom}/{x}/{y}.png",
-            "scaleExtent": [
-                9,
-                20
-            ],
-            "polygon": [
-                [
-                    [
-                        -119.5867318,
-                        49.7928087
-                    ],
-                    [
-                        -119.5465655,
-                        49.7928097
-                    ],
-                    [
-                        -119.5465661,
-                        49.8013837
-                    ],
-                    [
-                        -119.5343374,
-                        49.8013841
-                    ],
-                    [
-                        -119.5343376,
-                        49.8047321
-                    ],
-                    [
-                        -119.5296211,
-                        49.8047322
-                    ],
-                    [
-                        -119.5296216,
-                        49.8119555
-                    ],
-                    [
-                        -119.5104463,
-                        49.811956
-                    ],
-                    [
-                        -119.5115683,
-                        49.8744325
-                    ],
-                    [
-                        -119.5108946,
-                        49.8744904
-                    ],
-                    [
-                        -119.5114111,
-                        49.8843312
-                    ],
-                    [
-                        -119.5114115,
-                        49.9221763
-                    ],
-                    [
-                        -119.49386,
-                        49.9223477
-                    ],
-                    [
-                        -119.4940505,
-                        49.9313031
-                    ],
-                    [
-                        -119.4803936,
-                        49.9317529
-                    ],
-                    [
-                        -119.4804572,
-                        49.9407474
-                    ],
-                    [
-                        -119.4666732,
-                        49.9409927
-                    ],
-                    [
-                        -119.4692775,
-                        49.9913717
-                    ],
-                    [
-                        -119.4551337,
-                        49.9916078
-                    ],
-                    [
-                        -119.4556736,
-                        50.0121242
-                    ],
-                    [
-                        -119.4416673,
-                        50.0123895
-                    ],
-                    [
-                        -119.4417308,
-                        50.0136345
-                    ],
-                    [
-                        -119.4221492,
-                        50.0140377
-                    ],
-                    [
-                        -119.4221042,
-                        50.0119306
-                    ],
-                    [
-                        -119.4121303,
-                        50.012165
-                    ],
-                    [
-                        -119.4126082,
-                        50.0216913
-                    ],
-                    [
-                        -119.4123387,
-                        50.0216913
-                    ],
-                    [
-                        -119.4124772,
-                        50.0250773
-                    ],
-                    [
-                        -119.4120917,
-                        50.0250821
-                    ],
-                    [
-                        -119.4121954,
-                        50.0270769
-                    ],
-                    [
-                        -119.4126083,
-                        50.0270718
-                    ],
-                    [
-                        -119.4128328,
-                        50.0321946
-                    ],
-                    [
-                        -119.3936313,
-                        50.0326418
-                    ],
-                    [
-                        -119.393529,
-                        50.0307781
-                    ],
-                    [
-                        -119.3795727,
-                        50.0310116
-                    ],
-                    [
-                        -119.3795377,
-                        50.0287584
-                    ],
-                    [
-                        -119.3735764,
-                        50.0288621
-                    ],
-                    [
-                        -119.371544,
-                        49.9793618
-                    ],
-                    [
-                        -119.3573506,
-                        49.9793618
-                    ],
-                    [
-                        -119.3548353,
-                        49.9256081
-                    ],
-                    [
-                        -119.3268079,
-                        49.9257238
-                    ],
-                    [
-                        -119.3256573,
-                        49.8804068
-                    ],
-                    [
-                        -119.3138893,
-                        49.8806528
-                    ],
-                    [
-                        -119.3137097,
-                        49.8771651
-                    ],
-                    [
-                        -119.3132156,
-                        49.877223
-                    ],
-                    [
-                        -119.3131482,
-                        49.8749652
-                    ],
-                    [
-                        -119.312452,
-                        49.8749073
-                    ],
-                    [
-                        -119.3122275,
-                        49.87236
-                    ],
-                    [
-                        -119.3117558,
-                        49.872331
-                    ],
-                    [
-                        -119.3115986,
-                        49.8696098
-                    ],
-                    [
-                        -119.3112169,
-                        49.8694217
-                    ],
-                    [
-                        -119.3109199,
-                        49.8632417
-                    ],
-                    [
-                        -119.3103721,
-                        49.8632724
-                    ],
-                    [
-                        -119.3095139,
-                        49.8512388
-                    ],
-                    [
-                        -119.3106368,
-                        49.8512316
-                    ],
-                    [
-                        -119.3103859,
-                        49.8462564
-                    ],
-                    [
-                        -119.3245344,
-                        49.8459957
-                    ],
-                    [
-                        -119.3246018,
-                        49.8450689
-                    ],
-                    [
-                        -119.3367018,
-                        49.844875
-                    ],
-                    [
-                        -119.3367467,
-                        49.8435136
-                    ],
-                    [
-                        -119.337937,
-                        49.8434702
-                    ],
-                    [
-                        -119.3378023,
-                        49.8382055
-                    ],
-                    [
-                        -119.3383637,
-                        49.8381041
-                    ],
-                    [
-                        -119.3383749,
-                        49.8351202
-                    ],
-                    [
-                        -119.3390936,
-                        49.8351058
-                    ],
-                    [
-                        -119.3388016,
-                        49.8321217
-                    ],
-                    [
-                        -119.3391497,
-                        49.8320565
-                    ],
-                    [
-                        -119.3391722,
-                        49.8293331
-                    ],
-                    [
-                        -119.3394641,
-                        49.8293331
-                    ],
-                    [
-                        -119.3395879,
-                        49.8267878
-                    ],
-                    [
-                        -119.3500053,
-                        49.8265829
-                    ],
-                    [
-                        -119.3493701,
-                        49.8180588
-                    ],
-                    [
-                        -119.4046964,
-                        49.8163785
-                    ],
-                    [
-                        -119.4045694,
-                        49.8099022
-                    ],
-                    [
-                        -119.4101592,
-                        49.8099022
-                    ],
-                    [
-                        -119.4102862,
-                        49.8072787
-                    ],
-                    [
-                        -119.4319467,
-                        49.8069098
-                    ],
-                    [
-                        -119.4322643,
-                        49.7907965
-                    ],
-                    [
-                        -119.4459847,
-                        49.7905504
-                    ],
-                    [
-                        -119.445286,
-                        49.7820201
-                    ],
-                    [
-                        -119.4967376,
-                        49.7811587
-                    ],
-                    [
-                        -119.4966105,
-                        49.7784927
-                    ],
-                    [
-                        -119.5418371,
-                        49.7775082
-                    ],
-                    [
-                        -119.5415892,
-                        49.7718277
-                    ],
-                    [
-                        -119.5560296,
-                        49.7714941
-                    ],
-                    [
-                        -119.5561194,
-                        49.7718422
-                    ],
-                    [
-                        -119.5715704,
-                        49.7715086
-                    ],
-                    [
-                        -119.5716153,
-                        49.7717262
-                    ],
-                    [
-                        -119.5819235,
-                        49.7714941
-                    ],
-                    [
-                        -119.5820133,
-                        49.7717697
-                    ],
-                    [
-                        -119.5922991,
-                        49.7715231
-                    ],
-                    [
-                        -119.592344,
-                        49.7718132
-                    ],
-                    [
-                        -119.6003839,
-                        49.7715957
-                    ],
-                    [
-                        -119.6011924,
-                        49.7839081
-                    ],
-                    [
-                        -119.5864365,
-                        49.7843863
-                    ]
-                ]
-            ],
-            "id": "kelowna_roads",
-            "overlay": true
-        },
-        {
-            "name": "Landsat 233055",
-            "type": "tms",
-            "description": "Recent Landsat imagery",
-            "template": "http://{switch:a,b,c,d}.tile.paulnorman.ca/landsat_233055/{zoom}/{x}/{y}.png",
-            "scaleExtent": [
-                5,
-                14
-            ],
-            "polygon": [
-                [
-                    [
-                        -60.8550011,
-                        6.1765004
-                    ],
-                    [
-                        -60.4762612,
-                        7.9188291
-                    ],
-                    [
-                        -62.161689,
-                        8.2778675
-                    ],
-                    [
-                        -62.5322549,
-                        6.5375488
-                    ]
-                ]
-            ],
-            "id": "landsat_233055"
-        },
-        {
-            "name": "Latest southwest British Columbia Landsat",
-            "type": "tms",
-            "description": "Recent lower-resolution landsat imagery for southwest British Columbia",
-            "template": "http://{switch:a,b,c,d}.tile.paulnorman.ca/landsat_047026/{zoom}/{x}/{y}.png",
-            "scaleExtent": [
-                5,
-                13
-            ],
-            "polygon": [
-                [
-                    [
-                        -121.9355512,
-                        47.7820648
-                    ],
-                    [
-                        -121.5720582,
-                        48.6410125
-                    ],
-                    [
-                        -121.2015461,
-                        49.4846247
-                    ],
-                    [
-                        -121.8375516,
-                        49.6023246
-                    ],
-                    [
-                        -122.4767046,
-                        49.7161735
-                    ],
-                    [
-                        -123.118912,
-                        49.8268824
-                    ],
-                    [
-                        -123.760228,
-                        49.9335836
-                    ],
-                    [
-                        -124.0887706,
-                        49.0870469
-                    ],
-                    [
-                        -124.4128889,
-                        48.2252567
-                    ],
-                    [
-                        -123.792772,
-                        48.1197334
-                    ],
-                    [
-                        -123.1727942,
-                        48.0109592
-                    ],
-                    [
-                        -122.553553,
-                        47.8982299
-                    ]
-                ]
-            ],
-            "id": "landsat_047026"
-        },
-        {
-            "name": "Lithuania - NŽT ORT10LT",
-            "type": "tms",
-            "template": "http://mapproxy.openmap.lt/ort10lt/g/{z}/{x}/{y}.jpeg",
-            "scaleExtent": [
-                4,
-                18
-            ],
-            "polygon": [
-                [
-                    [
-                        21.4926054,
-                        56.3592046
-                    ],
-                    [
-                        21.8134688,
-                        56.4097144
-                    ],
-                    [
-                        21.9728753,
-                        56.4567587
-                    ],
-                    [
-                        22.2158294,
-                        56.4604404
-                    ],
-                    [
-                        22.2183922,
-                        56.4162361
-                    ],
-                    [
-                        23.3511527,
-                        56.4267251
-                    ],
-                    [
-                        23.3521778,
-                        56.3824815
-                    ],
-                    [
-                        23.9179035,
-                        56.383305
-                    ],
-                    [
-                        23.9176231,
-                        56.3392908
-                    ],
-                    [
-                        24.5649817,
-                        56.3382169
-                    ],
-                    [
-                        24.564933,
-                        56.3828587
-                    ],
-                    [
-                        24.6475683,
-                        56.4277798
-                    ],
-                    [
-                        24.8099394,
-                        56.470646
-                    ],
-                    [
-                        24.9733979,
-                        56.4698452
-                    ],
-                    [
-                        25.1299701,
-                        56.2890356
-                    ],
-                    [
-                        25.127433,
-                        56.1990144
-                    ],
-                    [
-                        25.6921076,
-                        56.1933684
-                    ],
-                    [
-                        26.0839005,
-                        56.0067879
-                    ],
-                    [
-                        26.4673573,
-                        55.7304232
-                    ],
-                    [
-                        26.5463565,
-                        55.7132705
-                    ],
-                    [
-                        26.5154447,
-                        55.2345969
-                    ],
-                    [
-                        25.7874641,
-                        54.8425656
-                    ],
-                    [
-                        25.7675259,
-                        54.6350898
-                    ],
-                    [
-                        25.6165253,
-                        54.4404007
-                    ],
-                    [
-                        24.4566043,
-                        53.9577649
-                    ],
-                    [
-                        23.6164786,
-                        53.9575517
-                    ],
-                    [
-                        23.5632006,
-                        54.048085
-                    ],
-                    [
-                        22.8462074,
-                        54.3563682
-                    ],
-                    [
-                        22.831944,
-                        54.9414849
-                    ],
-                    [
-                        22.4306085,
-                        55.1159913
-                    ],
-                    [
-                        21.9605898,
-                        55.1107144
-                    ],
-                    [
-                        21.7253241,
-                        55.1496885
-                    ],
-                    [
-                        21.5628422,
-                        55.2362913
-                    ],
-                    [
-                        21.2209638,
-                        55.2742668
-                    ],
-                    [
-                        21.1630444,
-                        55.2803979
-                    ],
-                    [
-                        20.9277788,
-                        55.3101641
-                    ],
-                    [
-                        20.9257285,
-                        55.3588507
-                    ],
-                    [
-                        20.9980451,
-                        55.4514157
-                    ],
-                    [
-                        21.0282249,
-                        56.0796297
-                    ]
-                ]
-            ],
-            "terms_url": "http://www.geoportal.lt",
-            "terms_text": "NŽT ORT10LT"
-        },
-        {
-            "name": "Locator Overlay",
-            "type": "tms",
-            "description": "Shows major features to help orient you.",
-            "template": "http://{switch:a,b,c}.tiles.mapbox.com/v4/openstreetmap.map-inh76ba2/{zoom}/{x}/{y}.png?access_token=pk.eyJ1Ijoib3BlbnN0cmVldG1hcCIsImEiOiJhNVlHd29ZIn0.ti6wATGDWOmCnCYen-Ip7Q",
-            "scaleExtent": [
-                0,
-                16
-            ],
-            "terms_url": "http://www.mapbox.com/about/maps/",
-            "terms_text": "Terms & Feedback",
-            "default": true,
-            "overlay": true
-        },
-        {
-            "name": "Luxembourg Inspire Ortho 2010",
-            "type": "tms",
-            "template": "http://mapproxy.openstreetmap.lu/tiles/ortho2010/EPSG900913/{z}/{x}/{y}.jpeg",
-            "scaleExtent": [
-                0,
-                20
-            ],
-            "polygon": [
-                [
-                    [
-                        5.961753,
-                        50.17631
-                    ],
-                    [
-                        6.026268,
-                        50.18496
-                    ],
-                    [
-                        6.033182,
-                        50.16395
-                    ],
-                    [
-                        6.060695,
-                        50.15536
-                    ],
-                    [
-                        6.07668,
-                        50.15913
-                    ],
-                    [
-                        6.078237,
-                        50.17255
-                    ],
-                    [
-                        6.101762,
-                        50.17199
-                    ],
-                    [
-                        6.122501,
-                        50.16437
-                    ],
-                    [
-                        6.120101,
-                        50.15594
-                    ],
-                    [
-                        6.127695,
-                        50.14993
-                    ],
-                    [
-                        6.113228,
-                        50.13739
-                    ],
-                    [
-                        6.123691,
-                        50.13719
-                    ],
-                    [
-                        6.140929,
-                        50.1305
-                    ],
-                    [
-                        6.135554,
-                        50.11899
-                    ],
-                    [
-                        6.138082,
-                        50.10263
-                    ],
-                    [
-                        6.131085,
-                        50.09964
-                    ],
-                    [
-                        6.135473,
-                        50.09119
-                    ],
-                    [
-                        6.121939,
-                        50.09059
-                    ],
-                    [
-                        6.126335,
-                        50.07817
-                    ],
-                    [
-                        6.131858,
-                        50.07348
-                    ],
-                    [
-                        6.121171,
-                        50.064
-                    ],
-                    [
-                        6.114444,
-                        50.06139
-                    ],
-                    [
-                        6.115631,
-                        50.05817
-                    ],
-                    [
-                        6.123611,
-                        50.06323
-                    ],
-                    [
-                        6.136608,
-                        50.04178
-                    ],
-                    [
-                        6.130343,
-                        50.02975
-                    ],
-                    [
-                        6.148207,
-                        50.02307
-                    ],
-                    [
-                        6.13868,
-                        50.01572
-                    ],
-                    [
-                        6.135938,
-                        50.01485
-                    ],
-                    [
-                        6.131384,
-                        50.01905
-                    ],
-                    [
-                        6.130243,
-                        50.01819
-                    ],
-                    [
-                        6.139343,
-                        50.01116
-                    ],
-                    [
-                        6.151702,
-                        50.01058
-                    ],
-                    [
-                        6.145464,
-                        49.99689
-                    ],
-                    [
-                        6.139657,
-                        49.9994
-                    ],
-                    [
-                        6.138524,
-                        49.99829
-                    ],
-                    [
-                        6.142178,
-                        49.99535
-                    ],
-                    [
-                        6.150227,
-                        49.99518
-                    ],
-                    [
-                        6.156247,
-                        49.98867
-                    ],
-                    [
-                        6.173045,
-                        49.98589
-                    ],
-                    [
-                        6.17348,
-                        49.98344
-                    ],
-                    [
-                        6.170353,
-                        49.98376
-                    ],
-                    [
-                        6.165487,
-                        49.97115
-                    ],
-                    [
-                        6.171512,
-                        49.96298
-                    ],
-                    [
-                        6.176298,
-                        49.962
-                    ],
-                    [
-                        6.179954,
-                        49.95386
-                    ],
-                    [
-                        6.183393,
-                        49.9548
-                    ],
-                    [
-                        6.179829,
-                        49.96307
-                    ],
-                    [
-                        6.183312,
-                        49.9686
-                    ],
-                    [
-                        6.192774,
-                        49.97158
-                    ],
-                    [
-                        6.199783,
-                        49.95352
-                    ],
-                    [
-                        6.207066,
-                        49.95672
-                    ],
-                    [
-                        6.212689,
-                        49.9514
-                    ],
-                    [
-                        6.225023,
-                        49.95039
-                    ],
-                    [
-                        6.22044,
-                        49.94369
-                    ],
-                    [
-                        6.228241,
-                        49.93726
-                    ],
-                    [
-                        6.22635,
-                        49.92766
-                    ],
-                    [
-                        6.219133,
-                        49.92354
-                    ],
-                    [
-                        6.229862,
-                        49.92125
-                    ],
-                    [
-                        6.236032,
-                        49.91355
-                    ],
-                    [
-                        6.231867,
-                        49.91064
-                    ],
-                    [
-                        6.227694,
-                        49.91062
-                    ],
-                    [
-                        6.232286,
-                        49.9072
-                    ],
-                    [
-                        6.23381,
-                        49.90028
-                    ],
-                    [
-                        6.246919,
-                        49.89535
-                    ],
-                    [
-                        6.257809,
-                        49.88724
-                    ],
-                    [
-                        6.263008,
-                        49.88101
-                    ],
-                    [
-                        6.276455,
-                        49.87725
-                    ],
-                    [
-                        6.281126,
-                        49.87957
-                    ],
-                    [
-                        6.291661,
-                        49.87548
-                    ],
-                    [
-                        6.297699,
-                        49.86673
-                    ],
-                    [
-                        6.309889,
-                        49.87107
-                    ],
-                    [
-                        6.315324,
-                        49.8673
-                    ],
-                    [
-                        6.314651,
-                        49.86057
-                    ],
-                    [
-                        6.323611,
-                        49.85188
-                    ],
-                    [
-                        6.321577,
-                        49.8409
-                    ],
-                    [
-                        6.327406,
-                        49.83673
-                    ],
-                    [
-                        6.336561,
-                        49.83998
-                    ],
-                    [
-                        6.339366,
-                        49.8507
-                    ],
-                    [
-                        6.364651,
-                        49.85164
-                    ],
-                    [
-                        6.402203,
-                        49.82098
-                    ],
-                    [
-                        6.426434,
-                        49.81629
-                    ],
-                    [
-                        6.428071,
-                        49.81186
-                    ],
-                    [
-                        6.43097,
-                        49.81129
-                    ],
-                    [
-                        6.441608,
-                        49.81547
-                    ],
-                    [
-                        6.443442,
-                        49.81233
-                    ],
-                    [
-                        6.45366,
-                        49.81275
-                    ],
-                    [
-                        6.464538,
-                        49.81975
-                    ],
-                    [
-                        6.47057,
-                        49.82385
-                    ],
-                    [
-                        6.496805,
-                        49.81277
-                    ],
-                    [
-                        6.50669,
-                        49.80993
-                    ],
-                    [
-                        6.511554,
-                        49.80238
-                    ],
-                    [
-                        6.51485,
-                        49.80513
-                    ],
-                    [
-                        6.519604,
-                        49.81446
-                    ],
-                    [
-                        6.529808,
-                        49.81048
-                    ],
-                    [
-                        6.532249,
-                        49.80686
-                    ],
-                    [
-                        6.530829,
-                        49.80116
-                    ],
-                    [
-                        6.506225,
-                        49.78899
-                    ],
-                    [
-                        6.519171,
-                        49.78344
-                    ],
-                    [
-                        6.511055,
-                        49.77422
-                    ],
-                    [
-                        6.520563,
-                        49.76818
-                    ],
-                    [
-                        6.520516,
-                        49.76134
-                    ],
-                    [
-                        6.503734,
-                        49.75086
-                    ],
-                    [
-                        6.502627,
-                        49.73298
-                    ],
-                    [
-                        6.507266,
-                        49.72938
-                    ],
-                    [
-                        6.518092,
-                        49.7242
-                    ],
-                    [
-                        6.516417,
-                        49.72129
-                    ],
-                    [
-                        6.511763,
-                        49.72016
-                    ],
-                    [
-                        6.504791,
-                        49.725
-                    ],
-                    [
-                        6.498913,
-                        49.72639
-                    ],
-                    [
-                        6.495576,
-                        49.72443
-                    ],
-                    [
-                        6.507122,
-                        49.71655
-                    ],
-                    [
-                        6.507884,
-                        49.71215
-                    ],
-                    [
-                        6.504598,
-                        49.71227
-                    ],
-                    [
-                        6.427139,
-                        49.66237
-                    ],
-                    [
-                        6.439899,
-                        49.66025
-                    ],
-                    [
-                        6.442511,
-                        49.65591
-                    ],
-                    [
-                        6.421781,
-                        49.61809
-                    ],
-                    [
-                        6.398978,
-                        49.60094
-                    ],
-                    [
-                        6.379408,
-                        49.59526
-                    ],
-                    [
-                        6.375507,
-                        49.58809
-                    ],
-                    [
-                        6.384426,
-                        49.5801
-                    ],
-                    [
-                        6.381188,
-                        49.57509
-                    ],
-                    [
-                        6.369093,
-                        49.5783
-                    ],
-                    [
-                        6.357913,
-                        49.57166
-                    ],
-                    [
-                        6.384902,
-                        49.55817
-                    ],
-                    [
-                        6.380095,
-                        49.54856
-                    ],
-                    [
-                        6.358555,
-                        49.53296
-                    ],
-                    [
-                        6.359322,
-                        49.52481
-                    ],
-                    [
-                        6.370763,
-                        49.50545
-                    ],
-                    [
-                        6.370562,
-                        49.45732
-                    ],
-                    [
-                        6.333403,
-                        49.46493
-                    ],
-                    [
-                        6.321894,
-                        49.47244
-                    ],
-                    [
-                        6.295034,
-                        49.47928
-                    ],
-                    [
-                        6.287889,
-                        49.48379
-                    ],
-                    [
-                        6.271912,
-                        49.49995
-                    ],
-                    [
-                        6.241327,
-                        49.50693
-                    ],
-                    [
-                        6.196692,
-                        49.50331
-                    ],
-                    [
-                        6.173373,
-                        49.50577
-                    ],
-                    [
-                        6.160858,
-                        49.50085
-                    ],
-                    [
-                        6.167099,
-                        49.49006
-                    ],
-                    [
-                        6.140179,
-                        49.48525
-                    ],
-                    [
-                        6.129367,
-                        49.48803
-                    ],
-                    [
-                        6.127247,
-                        49.47081
-                    ],
-                    [
-                        6.101403,
-                        49.46726
-                    ],
-                    [
-                        6.104826,
-                        49.45076
-                    ],
-                    [
-                        6.081667,
-                        49.45417
-                    ],
-                    [
-                        6.077222,
-                        49.46139
-                    ],
-                    [
-                        6.059167,
-                        49.46306
-                    ],
-                    [
-                        6.052222,
-                        49.46028
-                    ],
-                    [
-                        6.044213,
-                        49.44553
-                    ],
-                    [
-                        6.025294,
-                        49.44703
-                    ],
-                    [
-                        6.021545,
-                        49.45127
-                    ],
-                    [
-                        6.01574,
-                        49.44885
-                    ],
-                    [
-                        5.994123,
-                        49.45301
-                    ],
-                    [
-                        5.976569,
-                        49.44885
-                    ],
-                    [
-                        5.977725,
-                        49.45955
-                    ],
-                    [
-                        5.972317,
-                        49.46087
-                    ],
-                    [
-                        5.968912,
-                        49.48202
-                    ],
-                    [
-                        5.9616,
-                        49.49026
-                    ],
-                    [
-                        5.915781,
-                        49.49835
-                    ],
-                    [
-                        5.890334,
-                        49.4948
-                    ],
-                    [
-                        5.863321,
-                        49.50006
-                    ],
-                    [
-                        5.84897,
-                        49.50826
-                    ],
-                    [
-                        5.84828,
-                        49.51397
-                    ],
-                    [
-                        5.83641,
-                        49.51817
-                    ],
-                    [
-                        5.831868,
-                        49.52639
-                    ],
-                    [
-                        5.84308,
-                        49.53081
-                    ],
-                    [
-                        5.835622,
-                        49.54114
-                    ],
-                    [
-                        5.816251,
-                        49.53325
-                    ],
-                    [
-                        5.805201,
-                        49.54272
-                    ],
-                    [
-                        5.859432,
-                        49.57158
-                    ],
-                    [
-                        5.868663,
-                        49.587
-                    ],
-                    [
-                        5.862888,
-                        49.58525
-                    ],
-                    [
-                        5.851102,
-                        49.58379
-                    ],
-                    [
-                        5.847116,
-                        49.58961
-                    ],
-                    [
-                        5.845652,
-                        49.5981
-                    ],
-                    [
-                        5.869401,
-                        49.6106
-                    ],
-                    [
-                        5.881819,
-                        49.63815
-                    ],
-                    [
-                        5.899978,
-                        49.63907
-                    ],
-                    [
-                        5.899339,
-                        49.66239
-                    ],
-                    [
-                        5.856561,
-                        49.67628
-                    ],
-                    [
-                        5.856283,
-                        49.68211
-                    ],
-                    [
-                        5.875703,
-                        49.71118
-                    ],
-                    [
-                        5.864811,
-                        49.72331
-                    ],
-                    [
-                        5.843249,
-                        49.71822
-                    ],
-                    [
-                        5.82191,
-                        49.72128
-                    ],
-                    [
-                        5.824894,
-                        49.73767
-                    ],
-                    [
-                        5.820728,
-                        49.74878
-                    ],
-                    [
-                        5.786264,
-                        49.79079
-                    ],
-                    [
-                        5.765172,
-                        49.78961
-                    ],
-                    [
-                        5.750937,
-                        49.79094
-                    ],
-                    [
-                        5.741591,
-                        49.82126
-                    ],
-                    [
-                        5.745814,
-                        49.82435
-                    ],
-                    [
-                        5.737197,
-                        49.83353
-                    ],
-                    [
-                        5.740531,
-                        49.84142
-                    ],
-                    [
-                        5.747012,
-                        49.84048
-                    ],
-                    [
-                        5.746237,
-                        49.84783
-                    ],
-                    [
-                        5.753989,
-                        49.84878
-                    ],
-                    [
-                        5.740663,
-                        49.85152
-                    ],
-                    [
-                        5.752288,
-                        49.85922
-                    ],
-                    [
-                        5.749545,
-                        49.87554
-                    ],
-                    [
-                        5.775668,
-                        49.87438
-                    ],
-                    [
-                        5.775053,
-                        49.88057
-                    ],
-                    [
-                        5.734598,
-                        49.89341
-                    ],
-                    [
-                        5.733033,
-                        49.90285
-                    ],
-                    [
-                        5.757834,
-                        49.91737
-                    ],
-                    [
-                        5.760393,
-                        49.93252
-                    ],
-                    [
-                        5.770728,
-                        49.93711
-                    ],
-                    [
-                        5.768783,
-                        49.94239
-                    ],
-                    [
-                        5.768802,
-                        49.96104
-                    ],
-                    [
-                        5.786724,
-                        49.96816
-                    ],
-                    [
-                        5.80524,
-                        49.96677
-                    ],
-                    [
-                        5.806521,
-                        49.97321
-                    ],
-                    [
-                        5.831293,
-                        49.97995
-                    ],
-                    [
-                        5.834616,
-                        49.98656
-                    ],
-                    [
-                        5.818057,
-                        49.99936
-                    ],
-                    [
-                        5.815606,
-                        50.01437
-                    ],
-                    [
-                        5.847923,
-                        50.02809
-                    ],
-                    [
-                        5.861889,
-                        50.04581
-                    ],
-                    [
-                        5.850872,
-                        50.0563
-                    ],
-                    [
-                        5.857809,
-                        50.07186
-                    ],
-                    [
-                        5.880997,
-                        50.08069
-                    ],
-                    [
-                        5.891965,
-                        50.12041
-                    ],
-                    [
-                        5.952856,
-                        50.13384
-                    ],
-                    [
-                        5.961753,
-                        50.17631
-                    ]
-                ]
-            ],
-            "terms_url": "http://www.act.public.lu/fr/actualites/2014/02/ortho2014/",
-            "terms_text": "Administration du Cadastre et de la Topographie",
-            "id": "lu.geoportail.inspire.ortho2010"
-        },
-        {
-            "name": "Luxembourg Inspire Ortho 2013",
-            "type": "tms",
-            "template": "http://mapproxy.openstreetmap.lu/tiles/ortho2013/EPSG900913/{z}/{x}/{y}.jpeg",
-            "scaleExtent": [
-                0,
-                20
-            ],
-            "polygon": [
-                [
-                    [
-                        5.961753,
-                        50.17631
-                    ],
-                    [
-                        6.026268,
-                        50.18496
-                    ],
-                    [
-                        6.033182,
-                        50.16395
-                    ],
-                    [
-                        6.060695,
-                        50.15536
-                    ],
-                    [
-                        6.07668,
-                        50.15913
-                    ],
-                    [
-                        6.078237,
-                        50.17255
-                    ],
-                    [
-                        6.101762,
-                        50.17199
-                    ],
-                    [
-                        6.122501,
-                        50.16437
-                    ],
-                    [
-                        6.120101,
-                        50.15594
-                    ],
-                    [
-                        6.127695,
-                        50.14993
-                    ],
-                    [
-                        6.113228,
-                        50.13739
-                    ],
-                    [
-                        6.123691,
-                        50.13719
-                    ],
-                    [
-                        6.140929,
-                        50.1305
-                    ],
-                    [
-                        6.135554,
-                        50.11899
-                    ],
-                    [
-                        6.138082,
-                        50.10263
-                    ],
-                    [
-                        6.131085,
-                        50.09964
-                    ],
-                    [
-                        6.135473,
-                        50.09119
-                    ],
-                    [
-                        6.121939,
-                        50.09059
-                    ],
-                    [
-                        6.126335,
-                        50.07817
-                    ],
-                    [
-                        6.131858,
-                        50.07348
-                    ],
-                    [
-                        6.121171,
-                        50.064
-                    ],
-                    [
-                        6.114444,
-                        50.06139
-                    ],
-                    [
-                        6.115631,
-                        50.05817
-                    ],
-                    [
-                        6.123611,
-                        50.06323
-                    ],
-                    [
-                        6.136608,
-                        50.04178
-                    ],
-                    [
-                        6.130343,
-                        50.02975
-                    ],
-                    [
-                        6.148207,
-                        50.02307
-                    ],
-                    [
-                        6.13868,
-                        50.01572
-                    ],
-                    [
-                        6.135938,
-                        50.01485
-                    ],
-                    [
-                        6.131384,
-                        50.01905
-                    ],
-                    [
-                        6.130243,
-                        50.01819
-                    ],
-                    [
-                        6.139343,
-                        50.01116
-                    ],
-                    [
-                        6.151702,
-                        50.01058
-                    ],
-                    [
-                        6.145464,
-                        49.99689
-                    ],
-                    [
-                        6.139657,
-                        49.9994
-                    ],
-                    [
-                        6.138524,
-                        49.99829
-                    ],
-                    [
-                        6.142178,
-                        49.99535
-                    ],
-                    [
-                        6.150227,
-                        49.99518
-                    ],
-                    [
-                        6.156247,
-                        49.98867
-                    ],
-                    [
-                        6.173045,
-                        49.98589
-                    ],
-                    [
-                        6.17348,
-                        49.98344
-                    ],
-                    [
-                        6.170353,
-                        49.98376
-                    ],
-                    [
-                        6.165487,
-                        49.97115
-                    ],
-                    [
-                        6.171512,
-                        49.96298
-                    ],
-                    [
-                        6.176298,
-                        49.962
-                    ],
-                    [
-                        6.179954,
-                        49.95386
-                    ],
-                    [
-                        6.183393,
-                        49.9548
-                    ],
-                    [
-                        6.179829,
-                        49.96307
-                    ],
-                    [
-                        6.183312,
-                        49.9686
-                    ],
-                    [
-                        6.192774,
-                        49.97158
-                    ],
-                    [
-                        6.199783,
-                        49.95352
-                    ],
-                    [
-                        6.207066,
-                        49.95672
-                    ],
-                    [
-                        6.212689,
-                        49.9514
-                    ],
-                    [
-                        6.225023,
-                        49.95039
-                    ],
-                    [
-                        6.22044,
-                        49.94369
-                    ],
-                    [
-                        6.228241,
-                        49.93726
-                    ],
-                    [
-                        6.22635,
-                        49.92766
-                    ],
-                    [
-                        6.219133,
-                        49.92354
-                    ],
-                    [
-                        6.229862,
-                        49.92125
-                    ],
-                    [
-                        6.236032,
-                        49.91355
-                    ],
-                    [
-                        6.231867,
-                        49.91064
-                    ],
-                    [
-                        6.227694,
-                        49.91062
-                    ],
-                    [
-                        6.232286,
-                        49.9072
-                    ],
-                    [
-                        6.23381,
-                        49.90028
-                    ],
-                    [
-                        6.246919,
-                        49.89535
-                    ],
-                    [
-                        6.257809,
-                        49.88724
-                    ],
-                    [
-                        6.263008,
-                        49.88101
-                    ],
-                    [
-                        6.276455,
-                        49.87725
-                    ],
-                    [
-                        6.281126,
-                        49.87957
-                    ],
-                    [
-                        6.291661,
-                        49.87548
-                    ],
-                    [
-                        6.297699,
-                        49.86673
-                    ],
-                    [
-                        6.309889,
-                        49.87107
-                    ],
-                    [
-                        6.315324,
-                        49.8673
-                    ],
-                    [
-                        6.314651,
-                        49.86057
-                    ],
-                    [
-                        6.323611,
-                        49.85188
-                    ],
-                    [
-                        6.321577,
-                        49.8409
-                    ],
-                    [
-                        6.327406,
-                        49.83673
-                    ],
-                    [
-                        6.336561,
-                        49.83998
-                    ],
-                    [
-                        6.339366,
-                        49.8507
-                    ],
-                    [
-                        6.364651,
-                        49.85164
-                    ],
-                    [
-                        6.402203,
-                        49.82098
-                    ],
-                    [
-                        6.426434,
-                        49.81629
-                    ],
-                    [
-                        6.428071,
-                        49.81186
-                    ],
-                    [
-                        6.43097,
-                        49.81129
-                    ],
-                    [
-                        6.441608,
-                        49.81547
-                    ],
-                    [
-                        6.443442,
-                        49.81233
-                    ],
-                    [
-                        6.45366,
-                        49.81275
-                    ],
-                    [
-                        6.464538,
-                        49.81975
-                    ],
-                    [
-                        6.47057,
-                        49.82385
-                    ],
-                    [
-                        6.496805,
-                        49.81277
-                    ],
-                    [
-                        6.50669,
-                        49.80993
-                    ],
-                    [
-                        6.511554,
-                        49.80238
-                    ],
-                    [
-                        6.51485,
-                        49.80513
-                    ],
-                    [
-                        6.519604,
-                        49.81446
-                    ],
-                    [
-                        6.529808,
-                        49.81048
-                    ],
-                    [
-                        6.532249,
-                        49.80686
-                    ],
-                    [
-                        6.530829,
-                        49.80116
-                    ],
-                    [
-                        6.506225,
-                        49.78899
-                    ],
-                    [
-                        6.519171,
-                        49.78344
-                    ],
-                    [
-                        6.511055,
-                        49.77422
-                    ],
-                    [
-                        6.520563,
-                        49.76818
-                    ],
-                    [
-                        6.520516,
-                        49.76134
-                    ],
-                    [
-                        6.503734,
-                        49.75086
-                    ],
-                    [
-                        6.502627,
-                        49.73298
-                    ],
-                    [
-                        6.507266,
-                        49.72938
-                    ],
-                    [
-                        6.518092,
-                        49.7242
-                    ],
-                    [
-                        6.516417,
-                        49.72129
-                    ],
-                    [
-                        6.511763,
-                        49.72016
-                    ],
-                    [
-                        6.504791,
-                        49.725
-                    ],
-                    [
-                        6.498913,
-                        49.72639
-                    ],
-                    [
-                        6.495576,
-                        49.72443
-                    ],
-                    [
-                        6.507122,
-                        49.71655
-                    ],
-                    [
-                        6.507884,
-                        49.71215
-                    ],
-                    [
-                        6.504598,
-                        49.71227
-                    ],
-                    [
-                        6.427139,
-                        49.66237
-                    ],
-                    [
-                        6.439899,
-                        49.66025
-                    ],
-                    [
-                        6.442511,
-                        49.65591
-                    ],
-                    [
-                        6.421781,
-                        49.61809
-                    ],
-                    [
-                        6.398978,
-                        49.60094
-                    ],
-                    [
-                        6.379408,
-                        49.59526
-                    ],
-                    [
-                        6.375507,
-                        49.58809
-                    ],
-                    [
-                        6.384426,
-                        49.5801
-                    ],
-                    [
-                        6.381188,
-                        49.57509
-                    ],
-                    [
-                        6.369093,
-                        49.5783
-                    ],
-                    [
-                        6.357913,
-                        49.57166
-                    ],
-                    [
-                        6.384902,
-                        49.55817
-                    ],
-                    [
-                        6.380095,
-                        49.54856
-                    ],
-                    [
-                        6.358555,
-                        49.53296
-                    ],
-                    [
-                        6.359322,
-                        49.52481
-                    ],
-                    [
-                        6.370763,
-                        49.50545
-                    ],
-                    [
-                        6.370562,
-                        49.45732
-                    ],
-                    [
-                        6.333403,
-                        49.46493
-                    ],
-                    [
-                        6.321894,
-                        49.47244
-                    ],
-                    [
-                        6.295034,
-                        49.47928
-                    ],
-                    [
-                        6.287889,
-                        49.48379
-                    ],
-                    [
-                        6.271912,
-                        49.49995
-                    ],
-                    [
-                        6.241327,
-                        49.50693
-                    ],
-                    [
-                        6.196692,
-                        49.50331
-                    ],
-                    [
-                        6.173373,
-                        49.50577
-                    ],
-                    [
-                        6.160858,
-                        49.50085
-                    ],
-                    [
-                        6.167099,
-                        49.49006
-                    ],
-                    [
-                        6.140179,
-                        49.48525
-                    ],
-                    [
-                        6.129367,
-                        49.48803
-                    ],
-                    [
-                        6.127247,
-                        49.47081
-                    ],
-                    [
-                        6.101403,
-                        49.46726
-                    ],
-                    [
-                        6.104826,
-                        49.45076
-                    ],
-                    [
-                        6.081667,
-                        49.45417
-                    ],
-                    [
-                        6.077222,
-                        49.46139
-                    ],
-                    [
-                        6.059167,
-                        49.46306
-                    ],
-                    [
-                        6.052222,
-                        49.46028
-                    ],
-                    [
-                        6.044213,
-                        49.44553
-                    ],
-                    [
-                        6.025294,
-                        49.44703
-                    ],
-                    [
-                        6.021545,
-                        49.45127
-                    ],
-                    [
-                        6.01574,
-                        49.44885
-                    ],
-                    [
-                        5.994123,
-                        49.45301
-                    ],
-                    [
-                        5.976569,
-                        49.44885
-                    ],
-                    [
-                        5.977725,
-                        49.45955
-                    ],
-                    [
-                        5.972317,
-                        49.46087
-                    ],
-                    [
-                        5.968912,
-                        49.48202
-                    ],
-                    [
-                        5.9616,
-                        49.49026
-                    ],
-                    [
-                        5.915781,
-                        49.49835
-                    ],
-                    [
-                        5.890334,
-                        49.4948
-                    ],
-                    [
-                        5.863321,
-                        49.50006
-                    ],
-                    [
-                        5.84897,
-                        49.50826
-                    ],
-                    [
-                        5.84828,
-                        49.51397
-                    ],
-                    [
-                        5.83641,
-                        49.51817
-                    ],
-                    [
-                        5.831868,
-                        49.52639
-                    ],
-                    [
-                        5.84308,
-                        49.53081
-                    ],
-                    [
-                        5.835622,
-                        49.54114
-                    ],
-                    [
-                        5.816251,
-                        49.53325
-                    ],
-                    [
-                        5.805201,
-                        49.54272
-                    ],
-                    [
-                        5.859432,
-                        49.57158
-                    ],
-                    [
-                        5.868663,
-                        49.587
-                    ],
-                    [
-                        5.862888,
-                        49.58525
-                    ],
-                    [
-                        5.851102,
-                        49.58379
-                    ],
-                    [
-                        5.847116,
-                        49.58961
-                    ],
-                    [
-                        5.845652,
-                        49.5981
-                    ],
-                    [
-                        5.869401,
-                        49.6106
-                    ],
-                    [
-                        5.881819,
-                        49.63815
-                    ],
-                    [
-                        5.899978,
-                        49.63907
-                    ],
-                    [
-                        5.899339,
-                        49.66239
-                    ],
-                    [
-                        5.856561,
-                        49.67628
-                    ],
-                    [
-                        5.856283,
-                        49.68211
-                    ],
-                    [
-                        5.875703,
-                        49.71118
-                    ],
-                    [
-                        5.864811,
-                        49.72331
-                    ],
-                    [
-                        5.843249,
-                        49.71822
-                    ],
-                    [
-                        5.82191,
-                        49.72128
-                    ],
-                    [
-                        5.824894,
-                        49.73767
-                    ],
-                    [
-                        5.820728,
-                        49.74878
-                    ],
-                    [
-                        5.786264,
-                        49.79079
-                    ],
-                    [
-                        5.765172,
-                        49.78961
-                    ],
-                    [
-                        5.750937,
-                        49.79094
-                    ],
-                    [
-                        5.741591,
-                        49.82126
-                    ],
-                    [
-                        5.745814,
-                        49.82435
-                    ],
-                    [
-                        5.737197,
-                        49.83353
-                    ],
-                    [
-                        5.740531,
-                        49.84142
-                    ],
-                    [
-                        5.747012,
-                        49.84048
-                    ],
-                    [
-                        5.746237,
-                        49.84783
-                    ],
-                    [
-                        5.753989,
-                        49.84878
-                    ],
-                    [
-                        5.740663,
-                        49.85152
-                    ],
-                    [
-                        5.752288,
-                        49.85922
-                    ],
-                    [
-                        5.749545,
-                        49.87554
-                    ],
-                    [
-                        5.775668,
-                        49.87438
-                    ],
-                    [
-                        5.775053,
-                        49.88057
-                    ],
-                    [
-                        5.734598,
-                        49.89341
-                    ],
-                    [
-                        5.733033,
-                        49.90285
-                    ],
-                    [
-                        5.757834,
-                        49.91737
-                    ],
-                    [
-                        5.760393,
-                        49.93252
-                    ],
-                    [
-                        5.770728,
-                        49.93711
-                    ],
-                    [
-                        5.768783,
-                        49.94239
-                    ],
-                    [
-                        5.768802,
-                        49.96104
-                    ],
-                    [
-                        5.786724,
-                        49.96816
-                    ],
-                    [
-                        5.80524,
-                        49.96677
-                    ],
-                    [
-                        5.806521,
-                        49.97321
-                    ],
-                    [
-                        5.831293,
-                        49.97995
-                    ],
-                    [
-                        5.834616,
-                        49.98656
-                    ],
-                    [
-                        5.818057,
-                        49.99936
-                    ],
-                    [
-                        5.815606,
-                        50.01437
-                    ],
-                    [
-                        5.847923,
-                        50.02809
-                    ],
-                    [
-                        5.861889,
-                        50.04581
-                    ],
-                    [
-                        5.850872,
-                        50.0563
-                    ],
-                    [
-                        5.857809,
-                        50.07186
-                    ],
-                    [
-                        5.880997,
-                        50.08069
-                    ],
-                    [
-                        5.891965,
-                        50.12041
-                    ],
-                    [
-                        5.952856,
-                        50.13384
-                    ],
-                    [
-                        5.961753,
-                        50.17631
-                    ]
-                ]
-            ],
-            "terms_url": "http://www.act.public.lu/fr/actualites/2014/02/ortho2014/",
-            "terms_text": "Administration du Cadastre et de la Topographie",
-            "id": "lu.geoportail.inspire.ortho2013"
-        },
-        {
-            "name": "MapQuest Open Aerial",
-            "type": "tms",
-            "template": "http://oatile{switch:1,2,3,4}.mqcdn.com/tiles/1.0.0/sat/{zoom}/{x}/{y}.png",
-            "default": true
-        },
-        {
-            "name": "Mapbox Satellite",
-            "type": "tms",
-            "description": "Satellite and aerial imagery.",
-            "template": "http://{switch:a,b,c}.tiles.mapbox.com/v4/openstreetmap.map-inh7ifmo/{zoom}/{x}/{y}.png?access_token=pk.eyJ1Ijoib3BlbnN0cmVldG1hcCIsImEiOiJhNVlHd29ZIn0.ti6wATGDWOmCnCYen-Ip7Q",
-            "scaleExtent": [
-                0,
-                19
-            ],
-            "terms_url": "http://www.mapbox.com/about/maps/",
-            "terms_text": "Terms & Feedback",
-            "id": "Mapbox",
-            "default": true
-        },
-        {
-            "name": "NLS - Bartholomew Half Inch, 1897-1907",
-            "type": "tms",
-            "template": "http://geo.nls.uk/mapdata2/bartholomew/great_britain/{zoom}/{x}/{-y}.png",
-            "scaleExtent": [
-                0,
-                15
-            ],
-            "polygon": [
-                [
-                    [
-                        -9,
-                        49.8
-                    ],
-                    [
-                        -9,
-                        61.1
-                    ],
-                    [
-                        1.9,
-                        61.1
-                    ],
-                    [
-                        1.9,
-                        49.8
-                    ],
-                    [
-                        -9,
-                        49.8
-                    ]
-                ]
-            ],
-            "terms_url": "http://geo.nls.uk/maps/",
-            "terms_text": "National Library of Scotland Historic Maps"
-        },
-        {
-            "name": "NLS - OS 1-inch 7th Series 1955-61",
-            "type": "tms",
-            "template": "http://geo.nls.uk/mapdata2/os/seventh/{zoom}/{x}/{-y}.png",
-            "scaleExtent": [
-                5,
-                16
-            ],
-            "polygon": [
-                [
-                    [
-                        -6.4585407,
-                        49.9044128
-                    ],
-                    [
-                        -6.3872009,
-                        49.9841116
-                    ],
-                    [
-                        -6.2296827,
-                        49.9896159
-                    ],
-                    [
-                        -6.2171269,
-                        49.8680087
-                    ],
-                    [
-                        -6.4551164,
-                        49.8591793
-                    ]
-                ],
-                [
-                    [
-                        -1.4495137,
-                        60.8634056
-                    ],
-                    [
-                        -0.7167114,
-                        60.8545122
-                    ],
-                    [
-                        -0.7349744,
-                        60.4359756
-                    ],
-                    [
-                        -0.6938826,
-                        60.4168218
-                    ],
-                    [
-                        -0.7258429,
-                        60.3942735
-                    ],
-                    [
-                        -0.7395401,
-                        60.0484714
-                    ],
-                    [
-                        -0.9267357,
-                        60.0461918
-                    ],
-                    [
-                        -0.9381501,
-                        59.8266157
-                    ],
-                    [
-                        -1.4586452,
-                        59.831205
-                    ],
-                    [
-                        -1.4455187,
-                        60.0535999
-                    ],
-                    [
-                        -1.463211,
-                        60.0535999
-                    ],
-                    [
-                        -1.4643524,
-                        60.0630002
-                    ],
-                    [
-                        -1.5716475,
-                        60.0638546
-                    ],
-                    [
-                        -1.5693646,
-                        60.1790005
-                    ],
-                    [
-                        -1.643558,
-                        60.1807033
-                    ],
-                    [
-                        -1.643558,
-                        60.1892162
-                    ],
-                    [
-                        -1.8216221,
-                        60.1894999
-                    ],
-                    [
-                        -1.8204807,
-                        60.3615507
-                    ],
-                    [
-                        -1.8415973,
-                        60.3697345
-                    ],
-                    [
-                        -1.8216221,
-                        60.3832755
-                    ],
-                    [
-                        -1.8179852,
-                        60.5934321
-                    ],
-                    [
-                        -1.453168,
-                        60.5934321
-                    ]
-                ],
-                [
-                    [
-                        -4.9089213,
-                        54.4242078
-                    ],
-                    [
-                        -4.282598,
-                        54.4429861
-                    ],
-                    [
-                        -4.2535417,
-                        54.029769
-                    ],
-                    [
-                        -4.8766366,
-                        54.0221831
-                    ]
-                ],
-                [
-                    [
-                        -5.8667408,
-                        59.1444603
-                    ],
-                    [
-                        -5.7759966,
-                        59.1470945
-                    ],
-                    [
-                        -5.7720016,
-                        59.1014052
-                    ],
-                    [
-                        -5.8621751,
-                        59.0990605
-                    ]
-                ],
-                [
-                    [
-                        -1.7065887,
-                        59.5703599
-                    ],
-                    [
-                        -1.5579165,
-                        59.5693481
-                    ],
-                    [
-                        -1.5564897,
-                        59.4965695
-                    ],
-                    [
-                        -1.7054472,
-                        59.4975834
-                    ]
-                ],
-                [
-                    [
-                        -7.6865827,
-                        58.2940975
-                    ],
-                    [
-                        -7.5330594,
-                        58.3006957
-                    ],
-                    [
-                        -7.5256401,
-                        58.2646905
-                    ],
-                    [
-                        -7.6797341,
-                        58.2577853
-                    ]
-                ],
-                [
-                    [
-                        -4.5338281,
-                        59.0359871
-                    ],
-                    [
-                        -4.481322,
-                        59.0371616
-                    ],
-                    [
-                        -4.4796099,
-                        59.0186583
-                    ],
-                    [
-                        -4.5332574,
-                        59.0180707
-                    ]
-                ],
-                [
-                    [
-                        -8.6710698,
-                        57.8769896
-                    ],
-                    [
-                        -8.4673234,
-                        57.8897332
-                    ],
-                    [
-                        -8.4467775,
-                        57.7907
-                    ],
-                    [
-                        -8.6510947,
-                        57.7779213
-                    ]
-                ],
-                [
-                    [
-                        -5.2395519,
-                        50.3530581
-                    ],
-                    [
-                        -5.7920073,
-                        50.3384899
-                    ],
-                    [
-                        -5.760047,
-                        49.9317027
-                    ],
-                    [
-                        -4.6551363,
-                        49.9581461
-                    ],
-                    [
-                        -4.677965,
-                        50.2860073
-                    ],
-                    [
-                        -4.244219,
-                        50.2801723
-                    ],
-                    [
-                        -4.2487848,
-                        50.2042525
-                    ],
-                    [
-                        -3.3812929,
-                        50.2042525
-                    ],
-                    [
-                        -3.4223846,
-                        50.5188201
-                    ],
-                    [
-                        -3.1164796,
-                        50.5246258
-                    ],
-                    [
-                        -3.1210453,
-                        50.6579592
-                    ],
-                    [
-                        -2.6736357,
-                        50.6619495
-                    ],
-                    [
-                        -2.5953453,
-                        50.6394325
-                    ],
-                    [
-                        -2.5905026,
-                        50.5728419
-                    ],
-                    [
-                        -2.4791203,
-                        50.5733545
-                    ],
-                    [
-                        -2.4758919,
-                        50.5066704
-                    ],
-                    [
-                        -2.3967943,
-                        50.5056438
-                    ],
-                    [
-                        -2.401637,
-                        50.5723293
-                    ],
-                    [
-                        -1.0400296,
-                        50.5718167
-                    ],
-                    [
-                        -1.0335726,
-                        50.7059289
-                    ],
-                    [
-                        -0.549302,
-                        50.7038843
-                    ],
-                    [
-                        -0.5460736,
-                        50.7886618
-                    ],
-                    [
-                        -0.0924734,
-                        50.7856002
-                    ],
-                    [
-                        -0.0876307,
-                        50.7181949
-                    ],
-                    [
-                        0.4789659,
-                        50.7120623
-                    ],
-                    [
-                        0.487037,
-                        50.8182467
-                    ],
-                    [
-                        0.9761503,
-                        50.8049868
-                    ],
-                    [
-                        0.9922927,
-                        51.0126311
-                    ],
-                    [
-                        1.4491213,
-                        51.0004424
-                    ],
-                    [
-                        1.4781775,
-                        51.4090372
-                    ],
-                    [
-                        1.0229632,
-                        51.4271576
-                    ],
-                    [
-                        1.035877,
-                        51.7640881
-                    ],
-                    [
-                        1.6105448,
-                        51.7500992
-                    ],
-                    [
-                        1.646058,
-                        52.1560003
-                    ],
-                    [
-                        1.7267698,
-                        52.1540195
-                    ],
-                    [
-                        1.749369,
-                        52.4481811
-                    ],
-                    [
-                        1.7870672,
-                        52.4811624
-                    ],
-                    [
-                        1.759102,
-                        52.522505
-                    ],
-                    [
-                        1.7933451,
-                        52.9602749
-                    ],
-                    [
-                        0.3798147,
-                        52.9958468
-                    ],
-                    [
-                        0.3895238,
-                        53.2511239
-                    ],
-                    [
-                        0.3478614,
-                        53.2511239
-                    ],
-                    [
-                        0.3238912,
-                        53.282186
-                    ],
-                    [
-                        0.3461492,
-                        53.6538501
-                    ],
-                    [
-                        0.128487,
-                        53.6575466
-                    ],
-                    [
-                        0.116582,
-                        53.6674703
-                    ],
-                    [
-                        0.1350586,
-                        54.0655731
-                    ],
-                    [
-                        -0.0609831,
-                        54.065908
-                    ],
-                    [
-                        -0.0414249,
-                        54.4709448
-                    ],
-                    [
-                        -0.5662701,
-                        54.4771794
-                    ],
-                    [
-                        -0.5592078,
-                        54.6565127
-                    ],
-                    [
-                        -1.1665638,
-                        54.6623485
-                    ],
-                    [
-                        -1.1637389,
-                        54.842611
-                    ],
-                    [
-                        -1.3316194,
-                        54.843909
-                    ],
-                    [
-                        -1.3257065,
-                        55.2470842
-                    ],
-                    [
-                        -1.529453,
-                        55.2487108
-                    ],
-                    [
-                        -1.524178,
-                        55.6540122
-                    ],
-                    [
-                        -1.7638798,
-                        55.6540122
-                    ],
-                    [
-                        -1.7733693,
-                        55.9719116
-                    ],
-                    [
-                        -2.1607858,
-                        55.9682981
-                    ],
-                    [
-                        -2.1543289,
-                        56.0621387
-                    ],
-                    [
-                        -2.4578051,
-                        56.0585337
-                    ],
-                    [
-                        -2.4190635,
-                        56.641717
-                    ],
-                    [
-                        -2.0962164,
-                        56.641717
-                    ],
-                    [
-                        -2.0833025,
-                        57.0021322
-                    ],
-                    [
-                        -1.9283359,
-                        57.0126802
-                    ],
-                    [
-                        -1.9180966,
-                        57.3590895
-                    ],
-                    [
-                        -1.7502161,
-                        57.3625721
-                    ],
-                    [
-                        -1.7695869,
-                        57.7608634
-                    ],
-                    [
-                        -3.6937554,
-                        57.7574187
-                    ],
-                    [
-                        -3.7066693,
-                        57.9806386
-                    ],
-                    [
-                        -3.5969013,
-                        57.9772149
-                    ],
-                    [
-                        -3.6033582,
-                        58.1207277
-                    ],
-                    [
-                        -3.0222335,
-                        58.1309566
-                    ],
-                    [
-                        -3.0286905,
-                        58.5410788
-                    ],
-                    [
-                        -2.8478961,
-                        58.530968
-                    ],
-                    [
-                        -2.86081,
-                        58.8430508
-                    ],
-                    [
-                        -2.679624,
-                        58.8414991
-                    ],
-                    [
-                        -2.6841897,
-                        58.885175
-                    ],
-                    [
-                        -2.6339665,
-                        58.9052239
-                    ],
-                    [
-                        -2.679624,
-                        58.9335083
-                    ],
-                    [
-                        -2.6887555,
-                        59.0229231
-                    ],
-                    [
-                        -2.3668703,
-                        59.0229231
-                    ],
-                    [
-                        -2.3702946,
-                        59.2652861
-                    ],
-                    [
-                        -2.3429001,
-                        59.2821989
-                    ],
-                    [
-                        -2.3714361,
-                        59.2996861
-                    ],
-                    [
-                        -2.3737189,
-                        59.3707083
-                    ],
-                    [
-                        -2.3429001,
-                        59.385825
-                    ],
-                    [
-                        -2.3725775,
-                        59.400354
-                    ],
-                    [
-                        -2.3714361,
-                        59.4259098
-                    ],
-                    [
-                        -3.0734196,
-                        59.4230067
-                    ],
-                    [
-                        -3.0711368,
-                        59.3433649
-                    ],
-                    [
-                        -3.103097,
-                        59.3311405
-                    ],
-                    [
-                        -3.0745611,
-                        59.3136695
-                    ],
-                    [
-                        -3.0722782,
-                        59.232603
-                    ],
-                    [
-                        -3.3850319,
-                        59.1484167
-                    ],
-                    [
-                        -3.3747589,
-                        58.9352753
-                    ],
-                    [
-                        -3.5653789,
-                        58.9323303
-                    ],
-                    [
-                        -3.554829,
-                        58.69759
-                    ],
-                    [
-                        -5.2808579,
-                        58.6667732
-                    ],
-                    [
-                        -5.2534159,
-                        58.3514125
-                    ],
-                    [
-                        -5.5068508,
-                        58.3437887
-                    ],
-                    [
-                        -5.4761804,
-                        58.0323557
-                    ],
-                    [
-                        -5.8974958,
-                        58.0212436
-                    ],
-                    [
-                        -5.8522972,
-                        57.6171758
-                    ],
-                    [
-                        -6.1396311,
-                        57.6137174
-                    ],
-                    [
-                        -6.1541592,
-                        57.7423183
-                    ],
-                    [
-                        -6.2913692,
-                        57.7380102
-                    ],
-                    [
-                        -6.3365678,
-                        58.1398784
-                    ],
-                    [
-                        -6.1121891,
-                        58.1466944
-                    ],
-                    [
-                        -6.1473778,
-                        58.5106285
-                    ],
-                    [
-                        -6.2934817,
-                        58.5416182
-                    ],
-                    [
-                        -6.8413713,
-                        58.2977321
-                    ],
-                    [
-                        -7.0057382,
-                        58.2929331
-                    ],
-                    [
-                        -7.1016189,
-                        58.2064403
-                    ],
-                    [
-                        -7.2573132,
-                        58.1793148
-                    ],
-                    [
-                        -7.2531092,
-                        58.1004928
-                    ],
-                    [
-                        -7.4070698,
-                        58.0905566
-                    ],
-                    [
-                        -7.391347,
-                        57.7911354
-                    ],
-                    [
-                        -7.790991,
-                        57.7733151
-                    ],
-                    [
-                        -7.7624215,
-                        57.5444165
-                    ],
-                    [
-                        -7.698501,
-                        57.1453194
-                    ],
-                    [
-                        -7.7943817,
-                        57.1304547
-                    ],
-                    [
-                        -7.716764,
-                        56.7368628
-                    ],
-                    [
-                        -7.0122067,
-                        56.7654359
-                    ],
-                    [
-                        -6.979922,
-                        56.5453858
-                    ],
-                    [
-                        -7.0638622,
-                        56.5453858
-                    ],
-                    [
-                        -7.0444914,
-                        56.3562587
-                    ],
-                    [
-                        -6.500676,
-                        56.3812917
-                    ],
-                    [
-                        -6.4491433,
-                        55.9793649
-                    ],
-                    [
-                        -6.563287,
-                        55.9691456
-                    ],
-                    [
-                        -6.5393742,
-                        55.7030135
-                    ],
-                    [
-                        -6.5595521,
-                        55.6907321
-                    ],
-                    [
-                        -6.5345315,
-                        55.6761713
-                    ],
-                    [
-                        -6.5216176,
-                        55.5704434
-                    ],
-                    [
-                        -5.8912587,
-                        55.5923416
-                    ],
-                    [
-                        -5.8560127,
-                        55.2320733
-                    ],
-                    [
-                        -5.2293639,
-                        55.2515958
-                    ],
-                    [
-                        -5.1837064,
-                        54.6254139
-                    ],
-                    [
-                        -3.6655956,
-                        54.6518373
-                    ],
-                    [
-                        -3.6496155,
-                        54.4320023
-                    ],
-                    [
-                        -3.5400375,
-                        54.4306744
-                    ],
-                    [
-                        -3.530906,
-                        54.0290181
-                    ],
-                    [
-                        -3.0697656,
-                        54.030359
-                    ],
-                    [
-                        -3.0675737,
-                        53.8221388
-                    ],
-                    [
-                        -3.0804876,
-                        53.7739911
-                    ],
-                    [
-                        -3.0619239,
-                        53.7477488
-                    ],
-                    [
-                        -3.0611168,
-                        53.6737049
-                    ],
-                    [
-                        -3.2144691,
-                        53.6708361
-                    ],
-                    [
-                        -3.2057699,
-                        53.4226163
-                    ],
-                    [
-                        -3.2799632,
-                        53.355224
-                    ],
-                    [
-                        -3.2896655,
-                        53.3608441
-                    ],
-                    [
-                        -3.3327547,
-                        53.364931
-                    ],
-                    [
-                        -3.3761293,
-                        53.3540318
-                    ],
-                    [
-                        -4.0888976,
-                        53.3433102
-                    ],
-                    [
-                        -4.0945474,
-                        53.4612036
-                    ],
-                    [
-                        -4.697412,
-                        53.4448624
-                    ],
-                    [
-                        -4.6882805,
-                        53.3318598
-                    ],
-                    [
-                        -4.7202407,
-                        53.2895771
-                    ],
-                    [
-                        -4.6837148,
-                        53.2486184
-                    ],
-                    [
-                        -4.6768661,
-                        53.1542644
-                    ],
-                    [
-                        -4.8480816,
-                        53.1446807
-                    ],
-                    [
-                        -4.8178336,
-                        52.7440299
-                    ],
-                    [
-                        -4.2545751,
-                        52.7558939
-                    ],
-                    [
-                        -4.228876,
-                        52.254876
-                    ],
-                    [
-                        -4.2607571,
-                        52.2536408
-                    ],
-                    [
-                        -4.2724603,
-                        52.2432637
-                    ],
-                    [
-                        -4.8136263,
-                        52.230095
-                    ],
-                    [
-                        -4.8079191,
-                        52.1138892
-                    ],
-                    [
-                        -5.3889104,
-                        52.0991668
-                    ],
-                    [
-                        -5.3717888,
-                        51.9129667
-                    ],
-                    [
-                        -5.4208706,
-                        51.9101502
-                    ],
-                    [
-                        -5.414022,
-                        51.8453218
-                    ],
-                    [
-                        -5.3683645,
-                        51.8474373
-                    ],
-                    [
-                        -5.3466772,
-                        51.5595332
-                    ],
-                    [
-                        -4.773676,
-                        51.5758518
-                    ],
-                    [
-                        -4.7656859,
-                        51.4885146
-                    ],
-                    [
-                        -4.1915432,
-                        51.4970427
-                    ],
-                    [
-                        -4.1869775,
-                        51.4344663
-                    ],
-                    [
-                        -3.6151177,
-                        51.4444274
-                    ],
-                    [
-                        -3.6105519,
-                        51.3746543
-                    ],
-                    [
-                        -3.1494115,
-                        51.3789292
-                    ],
-                    [
-                        -3.1494115,
-                        51.2919281
-                    ],
-                    [
-                        -4.3038735,
-                        51.2745907
-                    ],
-                    [
-                        -4.2861169,
-                        51.0508721
-                    ],
-                    [
-                        -4.8543277,
-                        51.0366633
-                    ],
-                    [
-                        -4.8372201,
-                        50.7212787
-                    ],
-                    [
-                        -5.2618345,
-                        50.7082694
-                    ]
-                ],
-                [
-                    [
-                        -2.1502671,
-                        60.171318
-                    ],
-                    [
-                        -2.0030218,
-                        60.1696146
-                    ],
-                    [
-                        -2.0013096,
-                        60.0997023
-                    ],
-                    [
-                        -2.148555,
-                        60.1011247
-                    ]
-                ],
-                [
-                    [
-                        -6.2086011,
-                        59.1163488
-                    ],
-                    [
-                        -6.1229934,
-                        59.1166418
-                    ],
-                    [
-                        -6.121852,
-                        59.0714985
-                    ],
-                    [
-                        -6.2097426,
-                        59.0714985
-                    ]
-                ],
-                [
-                    [
-                        -4.4159559,
-                        59.0889036
-                    ],
-                    [
-                        -4.4212022,
-                        59.0770848
-                    ],
-                    [
-                        -4.3971904,
-                        59.0779143
-                    ],
-                    [
-                        -4.3913388,
-                        59.0897328
-                    ]
-                ]
-            ],
-            "terms_url": "http://geo.nls.uk/maps/",
-            "terms_text": "National Library of Scotland Historic Maps"
-        },
-        {
-            "name": "NLS - OS 1:25k 1st Series 1937-61",
-            "type": "tms",
-            "template": "http://geo.nls.uk/mapdata2/os/25000/{zoom}/{x}/{-y}.png",
-            "scaleExtent": [
-                5,
-                16
-            ],
-            "polygon": [
-                [
-                    [
-                        -4.7157244,
-                        54.6796556
-                    ],
-                    [
-                        -4.6850662,
-                        54.6800268
-                    ],
-                    [
-                        -4.6835779,
-                        54.6623245
-                    ],
-                    [
-                        -4.7148782,
-                        54.6615818
-                    ]
-                ],
-                [
-                    [
-                        -3.7085748,
-                        58.3371151
-                    ],
-                    [
-                        -3.5405937,
-                        58.3380684
-                    ],
-                    [
-                        -3.5315137,
-                        58.1608002
-                    ],
-                    [
-                        -3.3608086,
-                        58.1622372
-                    ],
-                    [
-                        -3.3653486,
-                        58.252173
-                    ],
-                    [
-                        -3.1610473,
-                        58.2536063
-                    ],
-                    [
-                        -3.1610473,
-                        58.3261509
-                    ],
-                    [
-                        -3.0275704,
-                        58.3271045
-                    ],
-                    [
-                        -3.0366505,
-                        58.6139001
-                    ],
-                    [
-                        -3.0021463,
-                        58.614373
-                    ],
-                    [
-                        -3.0030543,
-                        58.7036341
-                    ],
-                    [
-                        -3.4180129,
-                        58.7003322
-                    ],
-                    [
-                        -3.4171049,
-                        58.6290293
-                    ],
-                    [
-                        -3.7240109,
-                        58.6266658
-                    ],
-                    [
-                        -3.7231029,
-                        58.606806
-                    ],
-                    [
-                        -4.2361262,
-                        58.5992374
-                    ],
-                    [
-                        -4.2334022,
-                        58.5092347
-                    ],
-                    [
-                        -3.88836,
-                        58.5144516
-                    ],
-                    [
-                        -3.8829119,
-                        58.4261327
-                    ],
-                    [
-                        -3.7158389,
-                        58.4270836
-                    ]
-                ],
-                [
-                    [
-                        -6.46676,
-                        49.9943621
-                    ],
-                    [
-                        -6.1889102,
-                        50.004868
-                    ],
-                    [
-                        -6.1789222,
-                        49.8967815
-                    ],
-                    [
-                        -6.3169391,
-                        49.8915171
-                    ],
-                    [
-                        -6.312399,
-                        49.8200979
-                    ],
-                    [
-                        -6.4504159,
-                        49.8159968
-                    ]
-                ],
-                [
-                    [
-                        -5.6453263,
-                        50.2029809
-                    ],
-                    [
-                        -5.7801329,
-                        50.2014076
-                    ],
-                    [
-                        -5.7637888,
-                        50.0197267
-                    ],
-                    [
-                        -5.3479221,
-                        50.0290604
-                    ],
-                    [
-                        -5.3388421,
-                        49.9414854
-                    ],
-                    [
-                        -5.024672,
-                        49.9473287
-                    ],
-                    [
-                        -5.0355681,
-                        50.0383923
-                    ],
-                    [
-                        -5.0010639,
-                        50.0453901
-                    ],
-                    [
-                        -4.9974319,
-                        50.1304478
-                    ],
-                    [
-                        -4.855783,
-                        50.13394
-                    ],
-                    [
-                        -4.861231,
-                        50.206057
-                    ],
-                    [
-                        -4.6546085,
-                        50.2140172
-                    ],
-                    [
-                        -4.6558926,
-                        50.3018616
-                    ],
-                    [
-                        -4.5184924,
-                        50.3026818
-                    ],
-                    [
-                        -4.51464,
-                        50.325642
-                    ],
-                    [
-                        -4.2488284,
-                        50.3264618
-                    ],
-                    [
-                        -4.2488284,
-                        50.3100631
-                    ],
-                    [
-                        -4.10886,
-                        50.3141633
-                    ],
-                    [
-                        -4.1062917,
-                        50.2411267
-                    ],
-                    [
-                        -3.9648088,
-                        50.2432047
-                    ],
-                    [
-                        -3.9640778,
-                        50.2254158
-                    ],
-                    [
-                        -3.8522287,
-                        50.2273626
-                    ],
-                    [
-                        -3.8503757,
-                        50.1552563
-                    ],
-                    [
-                        -3.6921809,
-                        50.1572487
-                    ],
-                    [
-                        -3.5414602,
-                        50.1602198
-                    ],
-                    [
-                        -3.5465781,
-                        50.3226814
-                    ],
-                    [
-                        -3.4068012,
-                        50.3241013
-                    ],
-                    [
-                        -3.4165761,
-                        50.5892711
-                    ],
-                    [
-                        -3.2746691,
-                        50.5962721
-                    ],
-                    [
-                        -3.2749172,
-                        50.6106323
-                    ],
-                    [
-                        -2.9971742,
-                        50.613972
-                    ],
-                    [
-                        -2.9896008,
-                        50.688537
-                    ],
-                    [
-                        -2.7120266,
-                        50.690565
-                    ],
-                    [
-                        -2.710908,
-                        50.6195964
-                    ],
-                    [
-                        -2.5695473,
-                        50.6157538
-                    ],
-                    [
-                        -2.5651019,
-                        50.5134083
-                    ],
-                    [
-                        -2.4014463,
-                        50.513379
-                    ],
-                    [
-                        -2.3940583,
-                        50.6160348
-                    ],
-                    [
-                        -2.2894123,
-                        50.6147436
-                    ],
-                    [
-                        -2.2876184,
-                        50.6008549
-                    ],
-                    [
-                        -2.1477855,
-                        50.6048506
-                    ],
-                    [
-                        -2.1451013,
-                        50.5325437
-                    ],
-                    [
-                        -1.9335117,
-                        50.5347477
-                    ],
-                    [
-                        -1.9362139,
-                        50.6170445
-                    ],
-                    [
-                        -1.8573025,
-                        50.6228094
-                    ],
-                    [
-                        -1.8554865,
-                        50.709139
-                    ],
-                    [
-                        -1.6066929,
-                        50.709139
-                    ],
-                    [
-                        -1.6085089,
-                        50.6239615
-                    ],
-                    [
-                        -1.4450678,
-                        50.6228094
-                    ],
-                    [
-                        -1.4432518,
-                        50.5317039
-                    ],
-                    [
-                        -1.1545059,
-                        50.5293951
-                    ],
-                    [
-                        -1.1472419,
-                        50.6170485
-                    ],
-                    [
-                        -1.011041,
-                        50.6205051
-                    ],
-                    [
-                        -1.011041,
-                        50.7056889
-                    ],
-                    [
-                        -0.704135,
-                        50.7045388
-                    ],
-                    [
-                        -0.700503,
-                        50.7769401
-                    ],
-                    [
-                        -0.5860943,
-                        50.7723465
-                    ],
-                    [
-                        -0.5879103,
-                        50.7907181
-                    ],
-                    [
-                        -0.0149586,
-                        50.7798108
-                    ],
-                    [
-                        -0.0185906,
-                        50.7625836
-                    ],
-                    [
-                        0.0967261,
-                        50.7620093
-                    ],
-                    [
-                        0.0921861,
-                        50.6913106
-                    ],
-                    [
-                        0.3046595,
-                        50.6890096
-                    ],
-                    [
-                        0.3101075,
-                        50.7757917
-                    ],
-                    [
-                        0.5511831,
-                        50.7726336
-                    ],
-                    [
-                        0.5529991,
-                        50.8432096
-                    ],
-                    [
-                        0.695556,
-                        50.8403428
-                    ],
-                    [
-                        0.696464,
-                        50.8592608
-                    ],
-                    [
-                        0.9852099,
-                        50.8523824
-                    ],
-                    [
-                        0.9906579,
-                        50.9417226
-                    ],
-                    [
-                        1.0160821,
-                        50.9411504
-                    ],
-                    [
-                        1.0215301,
-                        51.0303204
-                    ],
-                    [
-                        1.2812198,
-                        51.0240383
-                    ],
-                    [
-                        1.2848518,
-                        51.0948044
-                    ],
-                    [
-                        1.4277848,
-                        51.0948044
-                    ],
-                    [
-                        1.4386809,
-                        51.2882859
-                    ],
-                    [
-                        1.4713691,
-                        51.2871502
-                    ],
-                    [
-                        1.4804492,
-                        51.3994534
-                    ],
-                    [
-                        1.1590151,
-                        51.4073836
-                    ],
-                    [
-                        1.1590151,
-                        51.3869889
-                    ],
-                    [
-                        1.0191822,
-                        51.3903886
-                    ],
-                    [
-                        1.0228142,
-                        51.4798247
-                    ],
-                    [
-                        0.8793493,
-                        51.4843484
-                    ],
-                    [
-                        0.8829813,
-                        51.5566675
-                    ],
-                    [
-                        1.0264462,
-                        51.5544092
-                    ],
-                    [
-                        1.0373423,
-                        51.7493319
-                    ],
-                    [
-                        1.2607117,
-                        51.7482076
-                    ],
-                    [
-                        1.2661598,
-                        51.8279642
-                    ],
-                    [
-                        1.3351682,
-                        51.8335756
-                    ],
-                    [
-                        1.3478803,
-                        51.9199021
-                    ],
-                    [
-                        1.4840812,
-                        51.9199021
-                    ],
-                    [
-                        1.4986093,
-                        52.0038271
-                    ],
-                    [
-                        1.6438902,
-                        52.0027092
-                    ],
-                    [
-                        1.6656823,
-                        52.270221
-                    ],
-                    [
-                        1.7310588,
-                        52.270221
-                    ],
-                    [
-                        1.7528509,
-                        52.4465637
-                    ],
-                    [
-                        1.8254914,
-                        52.4476705
-                    ],
-                    [
-                        1.8345714,
-                        52.624408
-                    ],
-                    [
-                        1.7690346,
-                        52.6291402
-                    ],
-                    [
-                        1.7741711,
-                        52.717904
-                    ],
-                    [
-                        1.6996925,
-                        52.721793
-                    ],
-                    [
-                        1.706113,
-                        52.8103687
-                    ],
-                    [
-                        1.559724,
-                        52.8165777
-                    ],
-                    [
-                        1.5648605,
-                        52.9034116
-                    ],
-                    [
-                        1.4184715,
-                        52.9103818
-                    ],
-                    [
-                        1.4223238,
-                        52.9281894
-                    ],
-                    [
-                        1.3439928,
-                        52.9289635
-                    ],
-                    [
-                        1.3491293,
-                        53.0001194
-                    ],
-                    [
-                        0.4515789,
-                        53.022589
-                    ],
-                    [
-                        0.4497629,
-                        52.9351139
-                    ],
-                    [
-                        0.3789384,
-                        52.9351139
-                    ],
-                    [
-                        0.3716744,
-                        52.846365
-                    ],
-                    [
-                        0.2227614,
-                        52.8496552
-                    ],
-                    [
-                        0.2336575,
-                        52.9329248
-                    ],
-                    [
-                        0.3062979,
-                        52.9351139
-                    ],
-                    [
-                        0.308114,
-                        53.022589
-                    ],
-                    [
-                        0.3807544,
-                        53.0236813
-                    ],
-                    [
-                        0.3993708,
-                        53.2933729
-                    ],
-                    [
-                        0.3248922,
-                        53.2987454
-                    ],
-                    [
-                        0.3274604,
-                        53.3853782
-                    ],
-                    [
-                        0.2504136,
-                        53.38691
-                    ],
-                    [
-                        0.2581183,
-                        53.4748924
-                    ],
-                    [
-                        0.1862079,
-                        53.4779494
-                    ],
-                    [
-                        0.1913443,
-                        53.6548777
-                    ],
-                    [
-                        0.1502527,
-                        53.6594436
-                    ],
-                    [
-                        0.1528209,
-                        53.7666003
-                    ],
-                    [
-                        0.0012954,
-                        53.7734308
-                    ],
-                    [
-                        0.0025796,
-                        53.8424326
-                    ],
-                    [
-                        -0.0282392,
-                        53.841675
-                    ],
-                    [
-                        -0.0226575,
-                        53.9311501
-                    ],
-                    [
-                        -0.1406983,
-                        53.9322193
-                    ],
-                    [
-                        -0.1416063,
-                        54.0219323
-                    ],
-                    [
-                        -0.1706625,
-                        54.0235326
-                    ],
-                    [
-                        -0.1679384,
-                        54.0949482
-                    ],
-                    [
-                        -0.0126694,
-                        54.0912206
-                    ],
-                    [
-                        -0.0099454,
-                        54.1811226
-                    ],
-                    [
-                        -0.1615824,
-                        54.1837795
-                    ],
-                    [
-                        -0.1606744,
-                        54.2029038
-                    ],
-                    [
-                        -0.2405789,
-                        54.2034349
-                    ],
-                    [
-                        -0.2378549,
-                        54.2936234
-                    ],
-                    [
-                        -0.3894919,
-                        54.2941533
-                    ],
-                    [
-                        -0.3857497,
-                        54.3837321
-                    ],
-                    [
-                        -0.461638,
-                        54.3856364
-                    ],
-                    [
-                        -0.4571122,
-                        54.4939066
-                    ],
-                    [
-                        -0.6105651,
-                        54.4965434
-                    ],
-                    [
-                        -0.6096571,
-                        54.5676704
-                    ],
-                    [
-                        -0.7667421,
-                        54.569776
-                    ],
-                    [
-                        -0.7640181,
-                        54.5887213
-                    ],
-                    [
-                        -0.9192871,
-                        54.5908258
-                    ],
-                    [
-                        -0.9148116,
-                        54.6608348
-                    ],
-                    [
-                        -1.1485204,
-                        54.6634343
-                    ],
-                    [
-                        -1.1472363,
-                        54.7528316
-                    ],
-                    [
-                        -1.2268514,
-                        54.7532021
-                    ],
-                    [
-                        -1.2265398,
-                        54.8429879
-                    ],
-                    [
-                        -1.2991803,
-                        54.8435107
-                    ],
-                    [
-                        -1.2991803,
-                        54.9333391
-                    ],
-                    [
-                        -1.3454886,
-                        54.9354258
-                    ],
-                    [
-                        -1.3436726,
-                        55.0234878
-                    ],
-                    [
-                        -1.3772688,
-                        55.0255698
-                    ],
-                    [
-                        -1.3754528,
-                        55.1310877
-                    ],
-                    [
-                        -1.4997441,
-                        55.1315727
-                    ],
-                    [
-                        -1.4969272,
-                        55.2928323
-                    ],
-                    [
-                        -1.5296721,
-                        55.2942946
-                    ],
-                    [
-                        -1.5258198,
-                        55.6523803
-                    ],
-                    [
-                        -1.7659492,
-                        55.6545537
-                    ],
-                    [
-                        -1.7620968,
-                        55.7435626
-                    ],
-                    [
-                        -1.9688392,
-                        55.7435626
-                    ],
-                    [
-                        -1.9698023,
-                        55.8334505
-                    ],
-                    [
-                        -2.0019051,
-                        55.8336308
-                    ],
-                    [
-                        -2.0015841,
-                        55.9235526
-                    ],
-                    [
-                        -2.1604851,
-                        55.9240613
-                    ],
-                    [
-                        -2.1613931,
-                        55.9413549
-                    ],
-                    [
-                        -2.3202942,
-                        55.9408463
-                    ],
-                    [
-                        -2.3212022,
-                        56.0145126
-                    ],
-                    [
-                        -2.5627317,
-                        56.0124824
-                    ],
-                    [
-                        -2.5645477,
-                        56.1022207
-                    ],
-                    [
-                        -2.9658863,
-                        56.0991822
-                    ],
-                    [
-                        -2.9667943,
-                        56.1710304
-                    ],
-                    [
-                        -2.4828272,
-                        56.1755797
-                    ],
-                    [
-                        -2.4882752,
-                        56.2856078
-                    ],
-                    [
-                        -2.5645477,
-                        56.2835918
-                    ],
-                    [
-                        -2.5681798,
-                        56.3742075
-                    ],
-                    [
-                        -2.7261728,
-                        56.3732019
-                    ],
-                    [
-                        -2.7316208,
-                        56.4425301
-                    ],
-                    [
-                        -2.6190281,
-                        56.4425301
-                    ],
-                    [
-                        -2.6153961,
-                        56.5317671
-                    ],
-                    [
-                        -2.453771,
-                        56.5347715
-                    ],
-                    [
-                        -2.4534686,
-                        56.6420248
-                    ],
-                    [
-                        -2.4062523,
-                        56.6440218
-                    ],
-                    [
-                        -2.3953562,
-                        56.7297964
-                    ],
-                    [
-                        -2.2936596,
-                        56.7337811
-                    ],
-                    [
-                        -2.2972916,
-                        56.807423
-                    ],
-                    [
-                        -2.1629067,
-                        56.8113995
-                    ],
-                    [
-                        -2.1592747,
-                        56.9958425
-                    ],
-                    [
-                        -1.9922016,
-                        57.0017771
-                    ],
-                    [
-                        -2.0067297,
-                        57.2737477
-                    ],
-                    [
-                        -1.9195612,
-                        57.2757112
-                    ],
-                    [
-                        -1.9304572,
-                        57.3482876
-                    ],
-                    [
-                        -1.8106005,
-                        57.3443682
-                    ],
-                    [
-                        -1.7997044,
-                        57.4402728
-                    ],
-                    [
-                        -1.6616875,
-                        57.4285429
-                    ],
-                    [
-                        -1.6689516,
-                        57.5398256
-                    ],
-                    [
-                        -1.7452241,
-                        57.5398256
-                    ],
-                    [
-                        -1.7524881,
-                        57.6313302
-                    ],
-                    [
-                        -1.8287606,
-                        57.6332746
-                    ],
-                    [
-                        -1.8287606,
-                        57.7187255
-                    ],
-                    [
-                        -3.1768526,
-                        57.7171219
-                    ],
-                    [
-                        -3.1794208,
-                        57.734264
-                    ],
-                    [
-                        -3.5134082,
-                        57.7292105
-                    ],
-                    [
-                        -3.5129542,
-                        57.7112683
-                    ],
-                    [
-                        -3.7635638,
-                        57.7076303
-                    ],
-                    [
-                        -3.7598539,
-                        57.635713
-                    ],
-                    [
-                        -3.8420372,
-                        57.6343382
-                    ],
-                    [
-                        -3.8458895,
-                        57.6178365
-                    ],
-                    [
-                        -3.9794374,
-                        57.6157733
-                    ],
-                    [
-                        -3.9794374,
-                        57.686544
-                    ],
-                    [
-                        -3.8150708,
-                        57.689976
-                    ],
-                    [
-                        -3.817639,
-                        57.7968899
-                    ],
-                    [
-                        -3.6853753,
-                        57.7989429
-                    ],
-                    [
-                        -3.6892276,
-                        57.8891567
-                    ],
-                    [
-                        -3.9383458,
-                        57.8877915
-                    ],
-                    [
-                        -3.9421981,
-                        57.9750592
-                    ],
-                    [
-                        -3.6943641,
-                        57.9784638
-                    ],
-                    [
-                        -3.6969323,
-                        58.0695865
-                    ],
-                    [
-                        -4.0372226,
-                        58.0641528
-                    ],
-                    [
-                        -4.0346543,
-                        57.9730163
-                    ],
-                    [
-                        -4.2003051,
-                        57.9702923
-                    ],
-                    [
-                        -4.1832772,
-                        57.7012869
-                    ],
-                    [
-                        -4.518752,
-                        57.6951111
-                    ],
-                    [
-                        -4.5122925,
-                        57.6050682
-                    ],
-                    [
-                        -4.6789116,
-                        57.6016628
-                    ],
-                    [
-                        -4.666022,
-                        57.4218334
-                    ],
-                    [
-                        -3.6677696,
-                        57.4394729
-                    ],
-                    [
-                        -3.671282,
-                        57.5295384
-                    ],
-                    [
-                        -3.3384979,
-                        57.5331943
-                    ],
-                    [
-                        -3.3330498,
-                        57.4438859
-                    ],
-                    [
-                        -2.8336466,
-                        57.4485275
-                    ],
-                    [
-                        -2.8236396,
-                        56.9992706
-                    ],
-                    [
-                        -2.3305398,
-                        57.0006693
-                    ],
-                    [
-                        -2.3298977,
-                        56.9113932
-                    ],
-                    [
-                        -2.6579889,
-                        56.9092901
-                    ],
-                    [
-                        -2.6559637,
-                        56.8198406
-                    ],
-                    [
-                        -2.8216747,
-                        56.8188467
-                    ],
-                    [
-                        -2.8184967,
-                        56.7295397
-                    ],
-                    [
-                        -3.1449248,
-                        56.7265508
-                    ],
-                    [
-                        -3.1435628,
-                        56.6362749
-                    ],
-                    [
-                        -3.4679089,
-                        56.6350265
-                    ],
-                    [
-                        -3.474265,
-                        56.7238108
-                    ],
-                    [
-                        -3.8011471,
-                        56.7188284
-                    ],
-                    [
-                        -3.785711,
-                        56.4493026
-                    ],
-                    [
-                        -3.946428,
-                        56.4457896
-                    ],
-                    [
-                        -3.9428873,
-                        56.2659777
-                    ],
-                    [
-                        -4.423146,
-                        56.2588459
-                    ],
-                    [
-                        -4.4141572,
-                        56.0815506
-                    ],
-                    [
-                        -4.8944159,
-                        56.0708008
-                    ],
-                    [
-                        -4.8791072,
-                        55.8896994
-                    ],
-                    [
-                        -5.1994158,
-                        55.8821374
-                    ],
-                    [
-                        -5.1852906,
-                        55.7023791
-                    ],
-                    [
-                        -5.0273445,
-                        55.7067203
-                    ],
-                    [
-                        -5.0222081,
-                        55.6879046
-                    ],
-                    [
-                        -4.897649,
-                        55.6907999
-                    ],
-                    [
-                        -4.8880181,
-                        55.6002822
-                    ],
-                    [
-                        -4.7339244,
-                        55.6046348
-                    ],
-                    [
-                        -4.7275038,
-                        55.5342082
-                    ],
-                    [
-                        -4.773732,
-                        55.5334815
-                    ],
-                    [
-                        -4.7685955,
-                        55.4447227
-                    ],
-                    [
-                        -4.8494947,
-                        55.4418092
-                    ],
-                    [
-                        -4.8405059,
-                        55.3506535
-                    ],
-                    [
-                        -4.8700405,
-                        55.3513836
-                    ],
-                    [
-                        -4.8649041,
-                        55.2629462
-                    ],
-                    [
-                        -4.9920314,
-                        55.2592875
-                    ],
-                    [
-                        -4.9907473,
-                        55.1691779
-                    ],
-                    [
-                        -5.0600894,
-                        55.1655105
-                    ],
-                    [
-                        -5.0575212,
-                        55.0751884
-                    ],
-                    [
-                        -5.2141831,
-                        55.0722477
-                    ],
-                    [
-                        -5.1991766,
-                        54.8020337
-                    ],
-                    [
-                        -5.0466316,
-                        54.8062205
-                    ],
-                    [
-                        -5.0502636,
-                        54.7244996
-                    ],
-                    [
-                        -4.9703591,
-                        54.7203043
-                    ],
-                    [
-                        -4.9776232,
-                        54.6215905
-                    ],
-                    [
-                        -4.796022,
-                        54.6342056
-                    ],
-                    [
-                        -4.796022,
-                        54.7307917
-                    ],
-                    [
-                        -4.8977186,
-                        54.7265971
-                    ],
-                    [
-                        -4.9086147,
-                        54.8145928
-                    ],
-                    [
-                        -4.8069181,
-                        54.8166856
-                    ],
-                    [
-                        -4.8105501,
-                        54.7915648
-                    ],
-                    [
-                        -4.6943253,
-                        54.7978465
-                    ],
-                    [
-                        -4.6761652,
-                        54.7244996
-                    ],
-                    [
-                        -4.5744686,
-                        54.7244996
-                    ],
-                    [
-                        -4.5599405,
-                        54.6426135
-                    ],
-                    [
-                        -4.3093309,
-                        54.6384098
-                    ],
-                    [
-                        -4.3333262,
-                        54.8229889
-                    ],
-                    [
-                        -4.2626999,
-                        54.8274274
-                    ],
-                    [
-                        -4.2549952,
-                        54.7348587
-                    ],
-                    [
-                        -3.8338058,
-                        54.7400481
-                    ],
-                    [
-                        -3.836374,
-                        54.8141105
-                    ],
-                    [
-                        -3.7118149,
-                        54.8133706
-                    ],
-                    [
-                        -3.7143831,
-                        54.8318654
-                    ],
-                    [
-                        -3.5346072,
-                        54.8355633
-                    ],
-                    [
-                        -3.5271039,
-                        54.9066228
-                    ],
-                    [
-                        -3.4808758,
-                        54.9084684
-                    ],
-                    [
-                        -3.4776655,
-                        54.7457328
-                    ],
-                    [
-                        -3.5874573,
-                        54.744621
-                    ],
-                    [
-                        -3.5836049,
-                        54.6546166
-                    ],
-                    [
-                        -3.7107322,
-                        54.6531308
-                    ],
-                    [
-                        -3.6991752,
-                        54.4550407
-                    ],
-                    [
-                        -3.5746161,
-                        54.4572801
-                    ],
-                    [
-                        -3.5759002,
-                        54.3863042
-                    ],
-                    [
-                        -3.539945,
-                        54.3855564
-                    ],
-                    [
-                        -3.5386609,
-                        54.297224
-                    ],
-                    [
-                        -3.46033,
-                        54.2957252
-                    ],
-                    [
-                        -3.4590458,
-                        54.2079507
-                    ],
-                    [
-                        -3.3807149,
-                        54.2102037
-                    ],
-                    [
-                        -3.381999,
-                        54.1169788
-                    ],
-                    [
-                        -3.302878,
-                        54.1160656
-                    ],
-                    [
-                        -3.300154,
-                        54.0276224
-                    ],
-                    [
-                        -3.1013007,
-                        54.0292224
-                    ],
-                    [
-                        -3.093596,
-                        53.6062158
-                    ],
-                    [
-                        -3.2065981,
-                        53.6016441
-                    ],
-                    [
-                        -3.2091663,
-                        53.4917753
-                    ],
-                    [
-                        -3.2451215,
-                        53.4887193
-                    ],
-                    [
-                        -3.2348486,
-                        53.4045934
-                    ],
-                    [
-                        -3.5276266,
-                        53.3999999
-                    ],
-                    [
-                        -3.5343966,
-                        53.328481
-                    ],
-                    [
-                        -3.6488053,
-                        53.3252272
-                    ],
-                    [
-                        -3.6527308,
-                        53.3057716
-                    ],
-                    [
-                        -3.7271873,
-                        53.3046865
-                    ],
-                    [
-                        -3.7315003,
-                        53.3945257
-                    ],
-                    [
-                        -3.9108315,
-                        53.3912769
-                    ],
-                    [
-                        -3.9071995,
-                        53.3023804
-                    ],
-                    [
-                        -3.9521457,
-                        53.3015665
-                    ],
-                    [
-                        -3.9566724,
-                        53.3912183
-                    ],
-                    [
-                        -4.1081979,
-                        53.3889209
-                    ],
-                    [
-                        -4.1081979,
-                        53.4072967
-                    ],
-                    [
-                        -4.2622916,
-                        53.4065312
-                    ],
-                    [
-                        -4.2635757,
-                        53.4753707
-                    ],
-                    [
-                        -4.638537,
-                        53.4677274
-                    ],
-                    [
-                        -4.6346847,
-                        53.3812621
-                    ],
-                    [
-                        -4.7091633,
-                        53.3774321
-                    ],
-                    [
-                        -4.7001745,
-                        53.1954965
-                    ],
-                    [
-                        -4.5499332,
-                        53.1962658
-                    ],
-                    [
-                        -4.5435126,
-                        53.1092488
-                    ],
-                    [
-                        -4.3919871,
-                        53.1100196
-                    ],
-                    [
-                        -4.3855666,
-                        53.0236002
-                    ],
-                    [
-                        -4.6115707,
-                        53.0205105
-                    ],
-                    [
-                        -4.603866,
-                        52.9284932
-                    ],
-                    [
-                        -4.7566756,
-                        52.9261709
-                    ],
-                    [
-                        -4.7476868,
-                        52.8370555
-                    ],
-                    [
-                        -4.8208813,
-                        52.8331768
-                    ],
-                    [
-                        -4.8208813,
-                        52.7446476
-                    ],
-                    [
-                        -4.3701572,
-                        52.7539749
-                    ],
-                    [
-                        -4.3765778,
-                        52.8401583
-                    ],
-                    [
-                        -4.2314728,
-                        52.8455875
-                    ],
-                    [
-                        -4.2237682,
-                        52.7586379
-                    ],
-                    [
-                        -4.1056297,
-                        52.7570836
-                    ],
-                    [
-                        -4.1015192,
-                        52.6714874
-                    ],
-                    [
-                        -4.1487355,
-                        52.6703862
-                    ],
-                    [
-                        -4.1305754,
-                        52.4008596
-                    ],
-                    [
-                        -4.1995838,
-                        52.3986435
-                    ],
-                    [
-                        -4.2050319,
-                        52.3110195
-                    ],
-                    [
-                        -4.3466808,
-                        52.303247
-                    ],
-                    [
-                        -4.3484968,
-                        52.2365693
-                    ],
-                    [
-                        -4.4901457,
-                        52.2332328
-                    ],
-                    [
-                        -4.4883297,
-                        52.2098702
-                    ],
-                    [
-                        -4.6572188,
-                        52.2098702
-                    ],
-                    [
-                        -4.6590348,
-                        52.1385939
-                    ],
-                    [
-                        -4.7788916,
-                        52.13525
-                    ],
-                    [
-                        -4.7807076,
-                        52.1162967
-                    ],
-                    [
-                        -4.9259885,
-                        52.1140663
-                    ],
-                    [
-                        -4.9187245,
-                        52.0392855
-                    ],
-                    [
-                        -5.2365265,
-                        52.0314653
-                    ],
-                    [
-                        -5.2347105,
-                        51.9442339
-                    ],
-                    [
-                        -5.3473032,
-                        51.9408755
-                    ],
-                    [
-                        -5.3473032,
-                        51.9195995
-                    ],
-                    [
-                        -5.4925842,
-                        51.9162392
-                    ],
-                    [
-                        -5.4853201,
-                        51.8265386
-                    ],
-                    [
-                        -5.1983903,
-                        51.8321501
-                    ],
-                    [
-                        -5.1893102,
-                        51.7625177
-                    ],
-                    [
-                        -5.335825,
-                        51.7589528
-                    ],
-                    [
-                        -5.3281204,
-                        51.6686495
-                    ],
-                    [
-                        -5.1836575,
-                        51.6730296
-                    ],
-                    [
-                        -5.1836575,
-                        51.6539134
-                    ],
-                    [
-                        -5.0674452,
-                        51.6578966
-                    ],
-                    [
-                        -5.0603825,
-                        51.5677905
-                    ],
-                    [
-                        -4.5974594,
-                        51.5809588
-                    ],
-                    [
-                        -4.60388,
-                        51.6726314
-                    ],
-                    [
-                        -4.345773,
-                        51.6726314
-                    ],
-                    [
-                        -4.3355001,
-                        51.4962964
-                    ],
-                    [
-                        -3.9528341,
-                        51.5106841
-                    ],
-                    [
-                        -3.9425611,
-                        51.5905333
-                    ],
-                    [
-                        -3.8809237,
-                        51.5953198
-                    ],
-                    [
-                        -3.8706508,
-                        51.5074872
-                    ],
-                    [
-                        -3.7679216,
-                        51.4978952
-                    ],
-                    [
-                        -3.7550805,
-                        51.4242895
-                    ],
-                    [
-                        -3.5855774,
-                        51.41468
-                    ],
-                    [
-                        -3.5778727,
-                        51.3329177
-                    ],
-                    [
-                        -3.0796364,
-                        51.3329177
-                    ],
-                    [
-                        -3.0770682,
-                        51.2494018
-                    ],
-                    [
-                        -3.7216935,
-                        51.2381477
-                    ],
-                    [
-                        -3.7216935,
-                        51.2558315
-                    ],
-                    [
-                        -3.8706508,
-                        51.2558315
-                    ],
-                    [
-                        -3.8680825,
-                        51.2365398
-                    ],
-                    [
-                        -4.2944084,
-                        51.2252825
-                    ],
-                    [
-                        -4.289272,
-                        51.0496352
-                    ],
-                    [
-                        -4.5692089,
-                        51.0431767
-                    ],
-                    [
-                        -4.5624122,
-                        50.9497388
-                    ],
-                    [
-                        -4.5905604,
-                        50.9520269
-                    ],
-                    [
-                        -4.5896524,
-                        50.8627065
-                    ],
-                    [
-                        -4.6296046,
-                        50.8592677
-                    ],
-                    [
-                        -4.6226411,
-                        50.7691513
-                    ],
-                    [
-                        -4.6952816,
-                        50.7680028
-                    ],
-                    [
-                        -4.6934655,
-                        50.6967379
-                    ],
-                    [
-                        -4.8342064,
-                        50.6938621
-                    ],
-                    [
-                        -4.8296664,
-                        50.6046231
-                    ],
-                    [
-                        -4.9676833,
-                        50.6000126
-                    ],
-                    [
-                        -4.9685913,
-                        50.5821427
-                    ],
-                    [
-                        -5.1084242,
-                        50.5786832
-                    ],
-                    [
-                        -5.1029762,
-                        50.4892254
-                    ],
-                    [
-                        -5.1311244,
-                        50.48807
-                    ],
-                    [
-                        -5.1274923,
-                        50.4163798
-                    ],
-                    [
-                        -5.2664172,
-                        50.4117509
-                    ],
-                    [
-                        -5.2609692,
-                        50.3034214
-                    ],
-                    [
-                        -5.5124868,
-                        50.2976214
-                    ],
-                    [
-                        -5.5061308,
-                        50.2256428
-                    ],
-                    [
-                        -5.6468717,
-                        50.2209953
-                    ]
-                ],
-                [
-                    [
-                        -5.1336607,
-                        55.2630226
-                    ],
-                    [
-                        -5.1021999,
-                        55.2639372
-                    ],
-                    [
-                        -5.0999527,
-                        55.2458239
-                    ],
-                    [
-                        -5.1322161,
-                        55.2446343
-                    ]
-                ],
-                [
-                    [
-                        -5.6431878,
-                        55.5095745
-                    ],
-                    [
-                        -5.4861028,
-                        55.5126594
-                    ],
-                    [
-                        -5.4715747,
-                        55.3348829
-                    ],
-                    [
-                        -5.6277517,
-                        55.3302345
-                    ]
-                ],
-                [
-                    [
-                        -4.7213517,
-                        51.2180246
-                    ],
-                    [
-                        -4.5804201,
-                        51.2212417
-                    ],
-                    [
-                        -4.5746416,
-                        51.1306736
-                    ],
-                    [
-                        -4.7174993,
-                        51.1280545
-                    ]
-                ],
-                [
-                    [
-                        -5.1608796,
-                        55.4153626
-                    ],
-                    [
-                        -5.0045387,
-                        55.4190069
-                    ],
-                    [
-                        -5.0184798,
-                        55.6153521
-                    ],
-                    [
-                        -5.1755648,
-                        55.6138137
-                    ]
-                ]
-            ],
-            "terms_url": "http://geo.nls.uk/maps/",
-            "terms_text": "National Library of Scotland Historic Maps"
-        },
-        {
-            "name": "NLS - OS 6-inch Scotland 1842-82",
-            "type": "tms",
-            "template": "http://geo.nls.uk/maps/os/six_inch/{zoom}/{x}/{-y}.png",
-            "scaleExtent": [
-                5,
-                16
-            ],
-            "polygon": [
-                [
-                    [
-                        -5.2112173,
-                        54.8018593
-                    ],
-                    [
-                        -5.0642752,
-                        54.8026508
-                    ],
-                    [
-                        -5.0560354,
-                        54.6305176
-                    ],
-                    [
-                        -4.3158316,
-                        54.6297227
-                    ],
-                    [
-                        -4.3117117,
-                        54.7448258
-                    ],
-                    [
-                        -3.8530325,
-                        54.7464112
-                    ],
-                    [
-                        -3.8530325,
-                        54.8034424
-                    ],
-                    [
-                        -3.5522818,
-                        54.8034424
-                    ],
-                    [
-                        -3.5522818,
-                        54.8374644
-                    ],
-                    [
-                        -3.468511,
-                        54.8406277
-                    ],
-                    [
-                        -3.4657644,
-                        54.8983158
-                    ],
-                    [
-                        -3.3847403,
-                        54.8991055
-                    ],
-                    [
-                        -3.3888601,
-                        54.9559214
-                    ],
-                    [
-                        -3.0920786,
-                        54.9539468
-                    ],
-                    [
-                        -3.0392359,
-                        54.9923274
-                    ],
-                    [
-                        -3.0212713,
-                        55.0493881
-                    ],
-                    [
-                        -2.9591232,
-                        55.0463283
-                    ],
-                    [
-                        -2.9202807,
-                        55.0666294
-                    ],
-                    [
-                        -2.7857081,
-                        55.068652
-                    ],
-                    [
-                        -2.7852225,
-                        55.0914426
-                    ],
-                    [
-                        -2.7337562,
-                        55.0922761
-                    ],
-                    [
-                        -2.737616,
-                        55.151204
-                    ],
-                    [
-                        -2.7648395,
-                        55.1510672
-                    ],
-                    [
-                        -2.7013114,
-                        55.1722505
-                    ],
-                    [
-                        -2.6635459,
-                        55.2192808
-                    ],
-                    [
-                        -2.6460364,
-                        55.2188891
-                    ],
-                    [
-                        -2.629042,
-                        55.2233933
-                    ],
-                    [
-                        -2.6317886,
-                        55.2287781
-                    ],
-                    [
-                        -2.6235488,
-                        55.2446345
-                    ],
-                    [
-                        -2.6197723,
-                        55.2454663
-                    ],
-                    [
-                        -2.6099017,
-                        55.2454174
-                    ],
-                    [
-                        -2.6099876,
-                        55.2486466
-                    ],
-                    [
-                        -2.6408121,
-                        55.2590039
-                    ],
-                    [
-                        -2.6247896,
-                        55.2615631
-                    ],
-                    [
-                        -2.6045186,
-                        55.2823081
-                    ],
-                    [
-                        -2.5693176,
-                        55.296132
-                    ],
-                    [
-                        -2.5479542,
-                        55.3121617
-                    ],
-                    [
-                        -2.5091116,
-                        55.3234891
-                    ],
-                    [
-                        -2.4780376,
-                        55.3494471
-                    ],
-                    [
-                        -2.4421083,
-                        55.3533118
-                    ],
-                    [
-                        -2.4052079,
-                        55.3439256
-                    ],
-                    [
-                        -2.3726772,
-                        55.3447539
-                    ],
-                    [
-                        -2.3221819,
-                        55.3687665
-                    ],
-                    [
-                        -2.3241241,
-                        55.3999337
-                    ],
-                    [
-                        -2.2576062,
-                        55.425015
-                    ],
-                    [
-                        -2.1985547,
-                        55.4273529
-                    ],
-                    [
-                        -2.1484296,
-                        55.4717466
-                    ],
-                    [
-                        -2.1944348,
-                        55.484199
-                    ],
-                    [
-                        -2.2040479,
-                        55.529306
-                    ],
-                    [
-                        -2.2960584,
-                        55.6379722
-                    ],
-                    [
-                        -2.2177808,
-                        55.6379722
-                    ],
-                    [
-                        -2.1059266,
-                        55.7452498
-                    ],
-                    [
-                        -1.9716874,
-                        55.7462161
-                    ],
-                    [
-                        -1.9697453,
-                        55.9190951
-                    ],
-                    [
-                        -2.1201694,
-                        55.9207115
-                    ],
-                    [
-                        -2.1242893,
-                        55.9776133
-                    ],
-                    [
-                        -2.3440159,
-                        55.9783817
-                    ],
-                    [
-                        -2.3440159,
-                        56.0390349
-                    ],
-                    [
-                        -2.5046909,
-                        56.0413363
-                    ],
-                    [
-                        -2.500571,
-                        56.1003588
-                    ],
-                    [
-                        -2.8823459,
-                        56.0957629
-                    ],
-                    [
-                        -2.8823459,
-                        56.1722898
-                    ],
-                    [
-                        -2.4126804,
-                        56.1692316
-                    ],
-                    [
-                        -2.4181736,
-                        56.2334017
-                    ],
-                    [
-                        -2.5857151,
-                        56.2303484
-                    ],
-                    [
-                        -2.5719822,
-                        56.3416356
-                    ],
-                    [
-                        -2.7257908,
-                        56.3462022
-                    ],
-                    [
-                        -2.7312839,
-                        56.4343808
-                    ],
-                    [
-                        -2.6928318,
-                        56.4343808
-                    ],
-                    [
-                        -2.6928318,
-                        56.4859769
-                    ],
-                    [
-                        -2.5307834,
-                        56.4935587
-                    ],
-                    [
-                        -2.5307834,
-                        56.570806
-                    ],
-                    [
-                        -2.5302878,
-                        56.6047947
-                    ],
-                    [
-                        -2.3732428,
-                        56.6044452
-                    ],
-                    [
-                        -2.3684363,
-                        56.7398824
-                    ],
-                    [
-                        -2.3292975,
-                        56.7398824
-                    ],
-                    [
-                        -2.3292975,
-                        56.7888065
-                    ],
-                    [
-                        -2.3145346,
-                        56.7891826
-                    ],
-                    [
-                        -2.3148779,
-                        56.7967036
-                    ],
-                    [
-                        -2.171369,
-                        56.7967036
-                    ],
-                    [
-                        -2.1703979,
-                        56.9710595
-                    ],
-                    [
-                        -2.0101725,
-                        56.9694716
-                    ],
-                    [
-                        -2.0101725,
-                        57.0846832
-                    ],
-                    [
-                        -2.0817687,
-                        57.085349
-                    ],
-                    [
-                        -2.0488097,
-                        57.1259963
-                    ],
-                    [
-                        -2.0409133,
-                        57.126369
-                    ],
-                    [
-                        -2.0383434,
-                        57.2411129
-                    ],
-                    [
-                        -1.878118,
-                        57.2421638
-                    ],
-                    [
-                        -1.8771469,
-                        57.2978175
-                    ],
-                    [
-                        -1.9868771,
-                        57.2983422
-                    ],
-                    [
-                        -1.9082209,
-                        57.3560063
-                    ],
-                    [
-                        -1.8752048,
-                        57.3560063
-                    ],
-                    [
-                        -1.8761758,
-                        57.3769527
-                    ],
-                    [
-                        -1.8120857,
-                        57.4120111
-                    ],
-                    [
-                        -1.7120661,
-                        57.4120111
-                    ],
-                    [
-                        -1.7034646,
-                        57.6441388
-                    ],
-                    [
-                        -1.8666032,
-                        57.6451781
-                    ],
-                    [
-                        -1.8646611,
-                        57.7033351
-                    ],
-                    [
-                        -3.1204292,
-                        57.7064705
-                    ],
-                    [
-                        -3.1218025,
-                        57.7504652
-                    ],
-                    [
-                        -3.4445259,
-                        57.7526635
-                    ],
-                    [
-                        -3.4472724,
-                        57.7138067
-                    ],
-                    [
-                        -3.5145637,
-                        57.7094052
-                    ],
-                    [
-                        -3.5118171,
-                        57.6939956
-                    ],
-                    [
-                        -3.7645027,
-                        57.6917938
-                    ],
-                    [
-                        -3.7672492,
-                        57.6344975
-                    ],
-                    [
-                        -3.842378,
-                        57.6288312
-                    ],
-                    [
-                        -3.8438346,
-                        57.5965825
-                    ],
-                    [
-                        -3.9414265,
-                        57.5916386
-                    ],
-                    [
-                        -3.9404554,
-                        57.6537782
-                    ],
-                    [
-                        -3.8894746,
-                        57.6529989
-                    ],
-                    [
-                        -3.8826772,
-                        57.7676408
-                    ],
-                    [
-                        -3.7224517,
-                        57.766087
-                    ],
-                    [
-                        -3.7195385,
-                        57.8819201
-                    ],
-                    [
-                        -3.9146888,
-                        57.8853352
-                    ],
-                    [
-                        -3.916062,
-                        57.9546243
-                    ],
-                    [
-                        -3.745774,
-                        57.9538956
-                    ],
-                    [
-                        -3.7471473,
-                        58.0688409
-                    ],
-                    [
-                        -3.5837256,
-                        58.0695672
-                    ],
-                    [
-                        -3.5837256,
-                        58.1116689
-                    ],
-                    [
-                        -3.4560096,
-                        58.1138452
-                    ],
-                    [
-                        -3.4544646,
-                        58.228503
-                    ],
-                    [
-                        -3.4379851,
-                        58.2283222
-                    ],
-                    [
-                        -3.4243233,
-                        58.2427725
-                    ],
-                    [
-                        -3.412307,
-                        58.2438567
-                    ],
-                    [
-                        -3.3735115,
-                        58.2695057
-                    ],
-                    [
-                        -3.3063919,
-                        58.2862038
-                    ],
-                    [
-                        -3.1229154,
-                        58.2859395
-                    ],
-                    [
-                        -3.123602,
-                        58.3443661
-                    ],
-                    [
-                        -2.9574338,
-                        58.3447264
-                    ],
-                    [
-                        -2.951254,
-                        58.6422011
-                    ],
-                    [
-                        -2.8812162,
-                        58.6429157
-                    ],
-                    [
-                        -2.8851004,
-                        58.8112825
-                    ],
-                    [
-                        -2.7180775,
-                        58.8142997
-                    ],
-                    [
-                        -2.7161354,
-                        58.8715749
-                    ],
-                    [
-                        -2.556881,
-                        58.8775984
-                    ],
-                    [
-                        -2.5544533,
-                        58.9923453
-                    ],
-                    [
-                        -2.5567617,
-                        59.0483775
-                    ],
-                    [
-                        -2.391893,
-                        59.0485996
-                    ],
-                    [
-                        -2.3918002,
-                        59.1106996
-                    ],
-                    [
-                        -2.4733695,
-                        59.1106996
-                    ],
-                    [
-                        -2.5591563,
-                        59.1783028
-                    ],
-                    [
-                        -2.5630406,
-                        59.2210646
-                    ],
-                    [
-                        -2.3921334,
-                        59.224046
-                    ],
-                    [
-                        -2.3911409,
-                        59.2740075
-                    ],
-                    [
-                        -2.3639512,
-                        59.2745036
-                    ],
-                    [
-                        -2.3658933,
-                        59.285417
-                    ],
-                    [
-                        -2.3911409,
-                        59.284921
-                    ],
-                    [
-                        -2.3911409,
-                        59.3379505
-                    ],
-                    [
-                        -2.2221759,
-                        59.3381981
-                    ],
-                    [
-                        -2.2233897,
-                        59.395965
-                    ],
-                    [
-                        -2.3758467,
-                        59.396583
-                    ],
-                    [
-                        -2.3899271,
-                        59.4026383
-                    ],
-                    [
-                        -2.4008516,
-                        59.3962122
-                    ],
-                    [
-                        -2.5637882,
-                        59.3952604
-                    ],
-                    [
-                        -2.5637882,
-                        59.3385811
-                    ],
-                    [
-                        -2.7320164,
-                        59.3375306
-                    ],
-                    [
-                        -2.7333896,
-                        59.3952604
-                    ],
-                    [
-                        -3.0726511,
-                        59.3931174
-                    ],
-                    [
-                        -3.0703404,
-                        59.3354759
-                    ],
-                    [
-                        -3.0753186,
-                        59.3355634
-                    ],
-                    [
-                        -3.0749753,
-                        59.3292593
-                    ],
-                    [
-                        -3.0698254,
-                        59.3289091
-                    ],
-                    [
-                        -3.069801,
-                        59.2196159
-                    ],
-                    [
-                        -3.2363384,
-                        59.2166341
-                    ],
-                    [
-                        -3.2336751,
-                        59.1606496
-                    ],
-                    [
-                        -3.4032766,
-                        59.1588895
-                    ],
-                    [
-                        -3.394086,
-                        58.9279316
-                    ],
-                    [
-                        -3.5664497,
-                        58.9259268
-                    ],
-                    [
-                        -3.5611089,
-                        58.8679885
-                    ],
-                    [
-                        -3.392508,
-                        58.8699339
-                    ],
-                    [
-                        -3.3894734,
-                        58.8698711
-                    ],
-                    [
-                        -3.3891093,
-                        58.8684905
-                    ],
-                    [
-                        -3.3912942,
-                        58.868616
-                    ],
-                    [
-                        -3.3884161,
-                        58.7543084
-                    ],
-                    [
-                        -3.2238208,
-                        58.7555677
-                    ],
-                    [
-                        -3.2189655,
-                        58.691289
-                    ],
-                    [
-                        -3.4634113,
-                        58.6905753
-                    ],
-                    [
-                        -3.4551716,
-                        58.6341518
-                    ],
-                    [
-                        -3.787508,
-                        58.6341518
-                    ],
-                    [
-                        -3.7861347,
-                        58.5769211
-                    ],
-                    [
-                        -3.9028645,
-                        58.5733411
-                    ],
-                    [
-                        -3.9028645,
-                        58.6477304
-                    ],
-                    [
-                        -4.0690327,
-                        58.6491594
-                    ],
-                    [
-                        -4.0690327,
-                        58.5912376
-                    ],
-                    [
-                        -4.7364521,
-                        58.5933845
-                    ],
-                    [
-                        -4.7364521,
-                        58.6505884
-                    ],
-                    [
-                        -5.0715351,
-                        58.6520173
-                    ],
-                    [
-                        -5.0654779,
-                        58.5325854
-                    ],
-                    [
-                        -5.2332047,
-                        58.5316087
-                    ],
-                    [
-                        -5.2283494,
-                        58.4719947
-                    ],
-                    [
-                        -5.2424298,
-                        58.4719947
-                    ],
-                    [
-                        -5.2366034,
-                        58.4089731
-                    ],
-                    [
-                        -5.2283494,
-                        58.4094818
-                    ],
-                    [
-                        -5.2210664,
-                        58.3005859
-                    ],
-                    [
-                        -5.5657939,
-                        58.2959933
-                    ],
-                    [
-                        -5.5580254,
-                        58.2372573
-                    ],
-                    [
-                        -5.4146722,
-                        58.2401326
-                    ],
-                    [
-                        -5.4141866,
-                        58.2267768
-                    ],
-                    [
-                        -5.3885749,
-                        58.2272242
-                    ],
-                    [
-                        -5.382714,
-                        58.1198615
-                    ],
-                    [
-                        -5.51043,
-                        58.1191362
-                    ],
-                    [
-                        -5.5114011,
-                        58.006214
-                    ],
-                    [
-                        -5.6745397,
-                        58.0041559
-                    ],
-                    [
-                        -5.6716266,
-                        57.9449366
-                    ],
-                    [
-                        -5.6716266,
-                        57.8887166
-                    ],
-                    [
-                        -5.8347652,
-                        57.8856193
-                    ],
-                    [
-                        -5.8277052,
-                        57.5988958
-                    ],
-                    [
-                        -6.0384259,
-                        57.5986357
-                    ],
-                    [
-                        -6.0389115,
-                        57.6459559
-                    ],
-                    [
-                        -6.1981658,
-                        57.6456961
-                    ],
-                    [
-                        -6.2076123,
-                        57.7600132
-                    ],
-                    [
-                        -6.537067,
-                        57.7544033
-                    ],
-                    [
-                        -6.5312406,
-                        57.6402392
-                    ],
-                    [
-                        -6.7002056,
-                        57.6360809
-                    ],
-                    [
-                        -6.6807844,
-                        57.5236293
-                    ],
-                    [
-                        -6.8516915,
-                        57.5152857
-                    ],
-                    [
-                        -6.8361545,
-                        57.3385811
-                    ],
-                    [
-                        -6.6730158,
-                        57.3438213
-                    ],
-                    [
-                        -6.674958,
-                        57.2850883
-                    ],
-                    [
-                        -6.5098772,
-                        57.2850883
-                    ],
-                    [
-                        -6.4982244,
-                        57.1757637
-                    ],
-                    [
-                        -6.3506228,
-                        57.1820797
-                    ],
-                    [
-                        -6.3312015,
-                        57.1251969
-                    ],
-                    [
-                        -6.1797156,
-                        57.1230884
-                    ],
-                    [
-                        -6.1719471,
-                        57.0682265
-                    ],
-                    [
-                        -6.4593819,
-                        57.059779
-                    ],
-                    [
-                        -6.4564687,
-                        57.1093806
-                    ],
-                    [
-                        -6.6671895,
-                        57.1062165
-                    ],
-                    [
-                        -6.6730158,
-                        57.002708
-                    ],
-                    [
-                        -6.5021087,
-                        57.0048233
-                    ],
-                    [
-                        -6.4836097,
-                        56.8917522
-                    ],
-                    [
-                        -6.3266104,
-                        56.8894062
-                    ],
-                    [
-                        -6.3156645,
-                        56.7799312
-                    ],
-                    [
-                        -6.2146739,
-                        56.775675
-                    ],
-                    [
-                        -6.2146739,
-                        56.7234965
-                    ],
-                    [
-                        -6.6866107,
-                        56.7224309
-                    ],
-                    [
-                        -6.6769001,
-                        56.6114413
-                    ],
-                    [
-                        -6.8419809,
-                        56.607166
-                    ],
-                    [
-                        -6.8400387,
-                        56.5483307
-                    ],
-                    [
-                        -7.1546633,
-                        56.5461895
-                    ],
-                    [
-                        -7.1488369,
-                        56.4872592
-                    ],
-                    [
-                        -6.9915246,
-                        56.490476
-                    ],
-                    [
-                        -6.9876404,
-                        56.4325329
-                    ],
-                    [
-                        -6.6827265,
-                        56.4314591
-                    ],
-                    [
-                        -6.6769001,
-                        56.5472601
-                    ],
-                    [
-                        -6.5292985,
-                        56.5504717
-                    ],
-                    [
-                        -6.5234721,
-                        56.4379018
-                    ],
-                    [
-                        -6.3661598,
-                        56.4368281
-                    ],
-                    [
-                        -6.3642177,
-                        56.3766524
-                    ],
-                    [
-                        -6.5273563,
-                        56.3712749
-                    ],
-                    [
-                        -6.5171745,
-                        56.2428427
-                    ],
-                    [
-                        -6.4869621,
-                        56.247421
-                    ],
-                    [
-                        -6.4869621,
-                        56.1893882
-                    ],
-                    [
-                        -6.3001945,
-                        56.1985572
-                    ],
-                    [
-                        -6.3029411,
-                        56.2581017
-                    ],
-                    [
-                        -5.9019401,
-                        56.256576
-                    ],
-                    [
-                        -5.8964469,
-                        56.0960466
-                    ],
-                    [
-                        -6.0282829,
-                        56.0883855
-                    ],
-                    [
-                        -6.0392692,
-                        56.1557502
-                    ],
-                    [
-                        -6.3853385,
-                        56.1542205
-                    ],
-                    [
-                        -6.3606193,
-                        55.96099
-                    ],
-                    [
-                        -6.2123039,
-                        55.9640647
-                    ],
-                    [
-                        -6.2047508,
-                        55.9202269
-                    ],
-                    [
-                        -6.5185478,
-                        55.9129158
-                    ],
-                    [
-                        -6.5061881,
-                        55.7501763
-                    ],
-                    [
-                        -6.6764762,
-                        55.7409005
-                    ],
-                    [
-                        -6.6599967,
-                        55.6263176
-                    ],
-                    [
-                        -6.3551261,
-                        55.6232161
-                    ],
-                    [
-                        -6.3578727,
-                        55.5689002
-                    ],
-                    [
-                        -6.0392692,
-                        55.5720059
-                    ],
-                    [
-                        -6.0310294,
-                        55.6247669
-                    ],
-                    [
-                        -5.7398917,
-                        55.6309694
-                    ],
-                    [
-                        -5.7371452,
-                        55.4569279
-                    ],
-                    [
-                        -5.8964469,
-                        55.4600426
-                    ],
-                    [
-                        -5.8964469,
-                        55.2789864
-                    ],
-                    [
-                        -5.4350211,
-                        55.2821151
-                    ],
-                    [
-                        -5.4405143,
-                        55.4506979
-                    ],
-                    [
-                        -5.2867057,
-                        55.4569279
-                    ],
-                    [
-                        -5.3086784,
-                        55.4070602
-                    ],
-                    [
-                        -4.9735954,
-                        55.4008223
-                    ],
-                    [
-                        -4.9845817,
-                        55.2038242
-                    ],
-                    [
-                        -5.1493766,
-                        55.2038242
-                    ],
-                    [
-                        -5.1411369,
-                        55.037337
-                    ],
-                    [
-                        -5.2152946,
-                        55.0341891
-                    ]
-                ],
-                [
-                    [
-                        -2.1646559,
-                        60.1622059
-                    ],
-                    [
-                        -1.9930299,
-                        60.1609801
-                    ],
-                    [
-                        -1.9946862,
-                        60.1035151
-                    ],
-                    [
-                        -2.1663122,
-                        60.104743
-                    ]
-                ],
-                [
-                    [
-                        -1.5360658,
-                        59.8570831
-                    ],
-                    [
-                        -1.3653566,
-                        59.8559841
-                    ],
-                    [
-                        -1.366847,
-                        59.7975565
-                    ],
-                    [
-                        -1.190628,
-                        59.7964199
-                    ],
-                    [
-                        -1.1862046,
-                        59.9695391
-                    ],
-                    [
-                        -1.0078652,
-                        59.9683948
-                    ],
-                    [
-                        -1.0041233,
-                        60.114145
-                    ],
-                    [
-                        -0.8360832,
-                        60.1130715
-                    ],
-                    [
-                        -0.834574,
-                        60.1716772
-                    ],
-                    [
-                        -1.0074262,
-                        60.1727795
-                    ],
-                    [
-                        -1.0052165,
-                        60.2583924
-                    ],
-                    [
-                        -0.8299659,
-                        60.2572778
-                    ],
-                    [
-                        -0.826979,
-                        60.3726551
-                    ],
-                    [
-                        -0.6507514,
-                        60.3715381
-                    ],
-                    [
-                        -0.6477198,
-                        60.4882292
-                    ],
-                    [
-                        -0.9984896,
-                        60.4904445
-                    ],
-                    [
-                        -0.9970279,
-                        60.546555
-                    ],
-                    [
-                        -0.6425288,
-                        60.5443201
-                    ],
-                    [
-                        -0.6394896,
-                        60.6606792
-                    ],
-                    [
-                        -0.8148133,
-                        60.6617806
-                    ],
-                    [
-                        -0.8132987,
-                        60.7196112
-                    ],
-                    [
-                        -0.6383298,
-                        60.7185141
-                    ],
-                    [
-                        -0.635467,
-                        60.8275393
-                    ],
-                    [
-                        -0.797568,
-                        60.8285523
-                    ],
-                    [
-                        -0.9941426,
-                        60.8297807
-                    ],
-                    [
-                        -0.9954966,
-                        60.7782667
-                    ],
-                    [
-                        -1.1670282,
-                        60.7793403
-                    ],
-                    [
-                        -1.1700357,
-                        60.6646181
-                    ],
-                    [
-                        -1.5222599,
-                        60.6668304
-                    ],
-                    [
-                        -1.5237866,
-                        60.6084426
-                    ],
-                    [
-                        -1.6975673,
-                        60.609536
-                    ],
-                    [
-                        -1.7021271,
-                        60.4345249
-                    ],
-                    [
-                        -1.5260578,
-                        60.4334111
-                    ],
-                    [
-                        -1.5275203,
-                        60.3770719
-                    ],
-                    [
-                        -1.8751127,
-                        60.3792746
-                    ],
-                    [
-                        -1.8781372,
-                        60.2624647
-                    ],
-                    [
-                        -1.7019645,
-                        60.2613443
-                    ],
-                    [
-                        -1.7049134,
-                        60.1470532
-                    ],
-                    [
-                        -1.528659,
-                        60.1459283
-                    ]
-                ],
-                [
-                    [
-                        -0.9847667,
-                        60.8943762
-                    ],
-                    [
-                        -0.9860347,
-                        60.8361105
-                    ],
-                    [
-                        -0.8078362,
-                        60.8351904
-                    ],
-                    [
-                        -0.8065683,
-                        60.8934578
-                    ]
-                ],
-                [
-                    [
-                        -7.7696901,
-                        56.8788231
-                    ],
-                    [
-                        -7.7614504,
-                        56.7608274
-                    ],
-                    [
-                        -7.6009049,
-                        56.7641903
-                    ],
-                    [
-                        -7.5972473,
-                        56.819332
-                    ],
-                    [
-                        -7.4479894,
-                        56.8203948
-                    ],
-                    [
-                        -7.4489319,
-                        56.8794098
-                    ],
-                    [
-                        -7.2841369,
-                        56.8794098
-                    ],
-                    [
-                        -7.2813904,
-                        57.0471152
-                    ],
-                    [
-                        -7.1303283,
-                        57.0515969
-                    ],
-                    [
-                        -7.1330749,
-                        57.511801
-                    ],
-                    [
-                        -6.96828,
-                        57.5147514
-                    ],
-                    [
-                        -6.9765198,
-                        57.6854668
-                    ],
-                    [
-                        -6.8062317,
-                        57.6913392
-                    ],
-                    [
-                        -6.8089782,
-                        57.8041985
-                    ],
-                    [
-                        -6.6496765,
-                        57.8071252
-                    ],
-                    [
-                        -6.6441833,
-                        57.8612267
-                    ],
-                    [
-                        -6.3200866,
-                        57.8626878
-                    ],
-                    [
-                        -6.3200866,
-                        58.1551617
-                    ],
-                    [
-                        -6.1607849,
-                        58.1522633
-                    ],
-                    [
-                        -6.1552917,
-                        58.20874
-                    ],
-                    [
-                        -5.9850036,
-                        58.2101869
-                    ],
-                    [
-                        -5.9904968,
-                        58.2680163
-                    ],
-                    [
-                        -6.1497986,
-                        58.2665717
-                    ],
-                    [
-                        -6.1415588,
-                        58.5557514
-                    ],
-                    [
-                        -6.3173401,
-                        58.5557514
-                    ],
-                    [
-                        -6.3091003,
-                        58.4983923
-                    ],
-                    [
-                        -6.4876282,
-                        58.4955218
-                    ],
-                    [
-                        -6.4876282,
-                        58.4423768
-                    ],
-                    [
-                        -6.6606628,
-                        58.4395018
-                    ],
-                    [
-                        -6.6469299,
-                        58.3819525
-                    ],
-                    [
-                        -6.8117248,
-                        58.3805125
-                    ],
-                    [
-                        -6.8117248,
-                        58.3286357
-                    ],
-                    [
-                        -6.9792663,
-                        58.3286357
-                    ],
-                    [
-                        -6.9710266,
-                        58.2694608
-                    ],
-                    [
-                        -7.1413147,
-                        58.2680163
-                    ],
-                    [
-                        -7.1403816,
-                        58.0358742
-                    ],
-                    [
-                        -7.3020636,
-                        58.0351031
-                    ],
-                    [
-                        -7.3030347,
-                        57.9774797
-                    ],
-                    [
-                        -7.1379539,
-                        57.9777372
-                    ],
-                    [
-                        -7.1413526,
-                        57.9202792
-                    ],
-                    [
-                        -7.1398961,
-                        57.8640206
-                    ],
-                    [
-                        -7.3020636,
-                        57.862471
-                    ],
-                    [
-                        -7.298484,
-                        57.7442293
-                    ],
-                    [
-                        -7.4509193,
-                        57.7456951
-                    ],
-                    [
-                        -7.4550392,
-                        57.6899522
-                    ],
-                    [
-                        -7.6186131,
-                        57.6906048
-                    ],
-                    [
-                        -7.6198341,
-                        57.7456951
-                    ],
-                    [
-                        -7.7901222,
-                        57.7442293
-                    ],
-                    [
-                        -7.7873756,
-                        57.6855477
-                    ],
-                    [
-                        -7.6222332,
-                        57.6853817
-                    ],
-                    [
-                        -7.6173779,
-                        57.5712602
-                    ],
-                    [
-                        -7.788285,
-                        57.5709998
-                    ],
-                    [
-                        -7.7892561,
-                        57.512109
-                    ],
-                    [
-                        -7.7038025,
-                        57.5115874
-                    ],
-                    [
-                        -7.6999183,
-                        57.4546902
-                    ],
-                    [
-                        -7.5367796,
-                        57.4552126
-                    ],
-                    [
-                        -7.5348375,
-                        57.5126306
-                    ],
-                    [
-                        -7.4581235,
-                        57.5131521
-                    ],
-                    [
-                        -7.4552103,
-                        57.2824165
-                    ],
-                    [
-                        -7.6115515,
-                        57.2845158
-                    ],
-                    [
-                        -7.6144647,
-                        57.2272651
-                    ],
-                    [
-                        -7.451326,
-                        57.2256881
-                    ],
-                    [
-                        -7.451326,
-                        57.1103873
-                    ],
-                    [
-                        -7.6164068,
-                        57.1088053
-                    ],
-                    [
-                        -7.603783,
-                        56.8792358
-                    ]
-                ],
-                [
-                    [
-                        -1.7106618,
-                        59.5626284
-                    ],
-                    [
-                        -1.5417509,
-                        59.562215
-                    ],
-                    [
-                        -1.5423082,
-                        59.5037224
-                    ],
-                    [
-                        -1.7112191,
-                        59.5041365
-                    ]
-                ]
-            ],
-            "terms_url": "http://geo.nls.uk/maps/",
-            "terms_text": "National Library of Scotland Historic Maps"
-        },
-        {
-            "name": "New & Misaligned TIGER Roads",
-            "type": "tms",
-            "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",
-            "template": "http://{switch:a,b,c}.tiles.mapbox.com/v4/enf.e0b8291e/{zoom}/{x}/{y}.png?access_token=pk.eyJ1Ijoib3BlbnN0cmVldG1hcCIsImEiOiJhNVlHd29ZIn0.ti6wATGDWOmCnCYen-Ip7Q",
-            "scaleExtent": [
-                0,
-                22
-            ],
-            "polygon": [
-                [
-                    [
-                        -124.7617886,
-                        48.4130148
-                    ],
-                    [
-                        -124.6059492,
-                        45.90245
-                    ],
-                    [
-                        -124.9934269,
-                        40.0557614
-                    ],
-                    [
-                        -122.5369737,
-                        36.8566086
-                    ],
-                    [
-                        -119.9775867,
-                        33.0064099
-                    ],
-                    [
-                        -117.675935,
-                        32.4630223
-                    ],
-                    [
-                        -114.8612307,
-                        32.4799891
-                    ],
-                    [
-                        -111.0089311,
-                        31.336015
-                    ],
-                    [
-                        -108.1992687,
-                        31.3260016
-                    ],
-                    [
-                        -108.1871123,
-                        31.7755116
-                    ],
-                    [
-                        -106.5307225,
-                        31.7820947
-                    ],
-                    [
-                        -106.4842052,
-                        31.7464455
-                    ],
-                    [
-                        -106.429317,
-                        31.7520583
-                    ],
-                    [
-                        -106.2868855,
-                        31.5613291
-                    ],
-                    [
-                        -106.205248,
-                        31.446704
-                    ],
-                    [
-                        -105.0205259,
-                        30.5360988
-                    ],
-                    [
-                        -104.5881916,
-                        29.6997856
-                    ],
-                    [
-                        -103.2518856,
-                        28.8908685
-                    ],
-                    [
-                        -102.7173632,
-                        29.3920567
-                    ],
-                    [
-                        -102.1513983,
-                        29.7475702
-                    ],
-                    [
-                        -101.2552871,
-                        29.4810523
-                    ],
-                    [
-                        -100.0062436,
-                        28.0082173
-                    ],
-                    [
-                        -99.2351068,
-                        26.4475962
-                    ],
-                    [
-                        -98.0109067,
-                        25.9928035
-                    ],
-                    [
-                        -97.435024,
-                        25.8266009
-                    ],
-                    [
-                        -96.9555259,
-                        25.9821589
-                    ],
-                    [
-                        -96.8061741,
-                        27.7978168
-                    ],
-                    [
-                        -95.5563349,
-                        28.5876066
-                    ],
-                    [
-                        -93.7405308,
-                        29.4742093
-                    ],
-                    [
-                        -90.9028456,
-                        28.8564513
-                    ],
-                    [
-                        -88.0156706,
-                        28.9944338
-                    ],
-                    [
-                        -88.0162494,
-                        30.0038862
-                    ],
-                    [
-                        -86.0277506,
-                        30.0047454
-                    ],
-                    [
-                        -84.0187909,
-                        28.9961781
-                    ],
-                    [
-                        -81.9971976,
-                        25.9826768
-                    ],
-                    [
-                        -81.9966618,
-                        25.0134917
-                    ],
-                    [
-                        -84.0165592,
-                        25.0125783
-                    ],
-                    [
-                        -84.0160068,
-                        24.0052745
-                    ],
-                    [
-                        -80.0199985,
-                        24.007096
-                    ],
-                    [
-                        -79.8901116,
-                        26.8550713
-                    ],
-                    [
-                        -80.0245309,
-                        32.0161282
-                    ],
-                    [
-                        -75.4147385,
-                        35.0531894
-                    ],
-                    [
-                        -74.0211163,
-                        39.5727927
-                    ],
-                    [
-                        -72.002019,
-                        40.9912464
-                    ],
-                    [
-                        -69.8797398,
-                        40.9920457
-                    ],
-                    [
-                        -69.8489304,
-                        43.2619916
-                    ],
-                    [
-                        -66.9452845,
-                        44.7104937
-                    ],
-                    [
-                        -67.7596632,
-                        47.0990024
-                    ],
-                    [
-                        -69.2505131,
-                        47.5122328
-                    ],
-                    [
-                        -70.4614886,
-                        46.2176574
-                    ],
-                    [
-                        -71.412273,
-                        45.254878
-                    ],
-                    [
-                        -72.0222508,
-                        45.0059846
-                    ],
-                    [
-                        -75.0798841,
-                        44.9802854
-                    ],
-                    [
-                        -76.9023061,
-                        43.8024568
-                    ],
-                    [
-                        -78.7623935,
-                        43.6249578
-                    ],
-                    [
-                        -79.15798,
-                        43.4462589
-                    ],
-                    [
-                        -79.0060087,
-                        42.8005317
-                    ],
-                    [
-                        -82.662475,
-                        41.6889458
-                    ],
-                    [
-                        -82.1761642,
-                        43.588535
-                    ],
-                    [
-                        -83.2813977,
-                        46.138853
-                    ],
-                    [
-                        -87.5064535,
-                        48.0142702
-                    ],
-                    [
-                        -88.3492194,
-                        48.2963271
-                    ],
-                    [
-                        -89.4353148,
-                        47.9837822
-                    ],
-                    [
-                        -93.9981078,
-                        49.0067142
-                    ],
-                    [
-                        -95.1105379,
-                        49.412004
-                    ],
-                    [
-                        -96.0131199,
-                        49.0060547
-                    ],
-                    [
-                        -123.3228926,
-                        49.0042878
-                    ],
-                    [
-                        -123.2275233,
-                        48.1849927
-                    ]
-                ],
-                [
-                    [
-                        -160.5787616,
-                        22.5062947
-                    ],
-                    [
-                        -160.5782192,
-                        21.4984647
-                    ],
-                    [
-                        -158.7470604,
-                        21.2439843
-                    ],
-                    [
-                        -157.5083185,
-                        20.995803
-                    ],
-                    [
-                        -155.9961942,
-                        18.7790194
-                    ],
-                    [
-                        -154.6217803,
-                        18.7586966
-                    ],
-                    [
-                        -154.6890176,
-                        19.8805722
-                    ],
-                    [
-                        -156.2927622,
-                        21.2225888
-                    ],
-                    [
-                        -157.5047384,
-                        21.9984962
-                    ],
-                    [
-                        -159.0093692,
-                        22.5070181
-                    ]
-                ],
-                [
-                    [
-                        -167.1571546,
-                        68.721974
-                    ],
-                    [
-                        -164.8553982,
-                        67.0255078
-                    ],
-                    [
-                        -168.002195,
-                        66.0017503
-                    ],
-                    [
-                        -169.0087448,
-                        66.001546
-                    ],
-                    [
-                        -169.0075381,
-                        64.9987675
-                    ],
-                    [
-                        -172.5143281,
-                        63.8767267
-                    ],
-                    [
-                        -173.8197023,
-                        59.74014
-                    ],
-                    [
-                        -162.5018149,
-                        58.0005815
-                    ],
-                    [
-                        -160.0159024,
-                        58.0012389
-                    ],
-                    [
-                        -160.0149725,
-                        57.000035
-                    ],
-                    [
-                        -160.5054788,
-                        56.9999017
-                    ],
-                    [
-                        -165.8092575,
-                        54.824847
-                    ],
-                    [
-                        -178.000097,
-                        52.2446469
-                    ],
-                    [
-                        -177.9992996,
-                        51.2554252
-                    ],
-                    [
-                        -171.4689067,
-                        51.8215329
-                    ],
-                    [
-                        -162.40251,
-                        53.956664
-                    ],
-                    [
-                        -159.0075717,
-                        55.002502
-                    ],
-                    [
-                        -158.0190709,
-                        55.0027849
-                    ],
-                    [
-                        -151.9963213,
-                        55.9991902
-                    ],
-                    [
-                        -151.500341,
-                        57.9987853
-                    ],
-                    [
-                        -151.5012894,
-                        58.9919816
-                    ],
-                    [
-                        -138.5159989,
-                        58.9953194
-                    ],
-                    [
-                        -138.5150471,
-                        57.9986434
-                    ],
-                    [
-                        -133.9948193,
-                        54.0031685
-                    ],
-                    [
-                        -130.0044418,
-                        54.0043387
-                    ],
-                    [
-                        -130.0070826,
-                        57.0000507
-                    ],
-                    [
-                        -131.975877,
-                        56.9995156
-                    ],
-                    [
-                        -135.1229873,
-                        59.756601
-                    ],
-                    [
-                        -138.0071813,
-                        59.991805
-                    ],
-                    [
-                        -139.1715881,
-                        60.4127229
-                    ],
-                    [
-                        -140.9874011,
-                        61.0118551
-                    ],
-                    [
-                        -140.9683975,
-                        69.9535069
-                    ],
-                    [
-                        -156.176891,
-                        71.5633329
-                    ],
-                    [
-                        -160.413634,
-                        70.7397728
-                    ],
-                    [
-                        -163.0218273,
-                        69.9707435
-                    ],
-                    [
-                        -164.9717003,
-                        68.994689
-                    ]
-                ]
-            ],
-            "overlay": true
-        },
-        {
-            "name": "OS 1:25k historic (OSM)",
-            "type": "tms",
-            "template": "http://ooc.openstreetmap.org/os1/{zoom}/{x}/{y}.jpg",
-            "scaleExtent": [
-                6,
-                17
-            ],
-            "polygon": [
-                [
-                    [
-                        -9,
-                        49.8
-                    ],
-                    [
-                        -9,
-                        61.1
-                    ],
-                    [
-                        1.9,
-                        61.1
-                    ],
-                    [
-                        1.9,
-                        49.8
-                    ],
-                    [
-                        -9,
-                        49.8
-                    ]
-                ]
-            ]
-        },
-        {
-            "name": "OS New Popular Edition historic",
-            "type": "tms",
-            "template": "http://ooc.openstreetmap.org/npe/{zoom}/{x}/{y}.png",
-            "polygon": [
-                [
-                    [
-                        -5.8,
-                        49.8
-                    ],
-                    [
-                        -5.8,
-                        55.8
-                    ],
-                    [
-                        1.9,
-                        55.8
-                    ],
-                    [
-                        1.9,
-                        49.8
-                    ],
-                    [
-                        -5.8,
-                        49.8
-                    ]
-                ]
-            ]
-        },
-        {
-            "name": "OS OpenData Locator",
-            "type": "tms",
-            "template": "http://tiles.itoworld.com/os_locator/{zoom}/{x}/{y}.png",
-            "polygon": [
-                [
-                    [
-                        -9,
-                        49.8
-                    ],
-                    [
-                        -9,
-                        61.1
-                    ],
-                    [
-                        1.9,
-                        61.1
-                    ],
-                    [
-                        1.9,
-                        49.8
-                    ],
-                    [
-                        -9,
-                        49.8
-                    ]
-                ]
-            ],
-            "overlay": true
-        },
-        {
-            "name": "OS OpenData StreetView",
-            "type": "tms",
-            "template": "http://os.openstreetmap.org/sv/{zoom}/{x}/{y}.png",
-            "scaleExtent": [
-                1,
-                18
-            ],
-            "polygon": [
-                [
-                    [
-                        -5.8292886,
-                        50.0229734
-                    ],
-                    [
-                        -5.8292886,
-                        50.254819
-                    ],
-                    [
-                        -5.373356,
-                        50.254819
-                    ],
-                    [
-                        -5.373356,
-                        50.3530588
-                    ],
-                    [
-                        -5.1756021,
-                        50.3530588
-                    ],
-                    [
-                        -5.1756021,
-                        50.5925406
-                    ],
-                    [
-                        -4.9970743,
-                        50.5925406
-                    ],
-                    [
-                        -4.9970743,
-                        50.6935617
-                    ],
-                    [
-                        -4.7965738,
-                        50.6935617
-                    ],
-                    [
-                        -4.7965738,
-                        50.7822112
-                    ],
-                    [
-                        -4.6949503,
-                        50.7822112
-                    ],
-                    [
-                        -4.6949503,
-                        50.9607371
-                    ],
-                    [
-                        -4.6043131,
-                        50.9607371
-                    ],
-                    [
-                        -4.6043131,
-                        51.0692066
-                    ],
-                    [
-                        -4.3792215,
-                        51.0692066
-                    ],
-                    [
-                        -4.3792215,
-                        51.2521782
-                    ],
-                    [
-                        -3.9039346,
-                        51.2521782
-                    ],
-                    [
-                        -3.9039346,
-                        51.2916998
-                    ],
-                    [
-                        -3.7171671,
-                        51.2916998
-                    ],
-                    [
-                        -3.7171671,
-                        51.2453014
-                    ],
-                    [
-                        -3.1486246,
-                        51.2453014
-                    ],
-                    [
-                        -3.1486246,
-                        51.362067
-                    ],
-                    [
-                        -3.7446329,
-                        51.362067
-                    ],
-                    [
-                        -3.7446329,
-                        51.4340386
-                    ],
-                    [
-                        -3.8297769,
-                        51.4340386
-                    ],
-                    [
-                        -3.8297769,
-                        51.5298246
-                    ],
-                    [
-                        -4.0852091,
-                        51.5298246
-                    ],
-                    [
-                        -4.0852091,
-                        51.4939284
-                    ],
-                    [
-                        -4.3792215,
-                        51.4939284
-                    ],
-                    [
-                        -4.3792215,
-                        51.5427168
-                    ],
-                    [
-                        -5.1444195,
-                        51.5427168
-                    ],
-                    [
-                        -5.1444195,
-                        51.6296003
-                    ],
-                    [
-                        -5.7387103,
-                        51.6296003
-                    ],
-                    [
-                        -5.7387103,
-                        51.774037
-                    ],
-                    [
-                        -5.5095393,
-                        51.774037
-                    ],
-                    [
-                        -5.5095393,
-                        51.9802596
-                    ],
-                    [
-                        -5.198799,
-                        51.9802596
-                    ],
-                    [
-                        -5.198799,
-                        52.0973358
-                    ],
-                    [
-                        -4.8880588,
-                        52.0973358
-                    ],
-                    [
-                        -4.8880588,
-                        52.1831557
-                    ],
-                    [
-                        -4.4957492,
-                        52.1831557
-                    ],
-                    [
-                        -4.4957492,
-                        52.2925739
-                    ],
-                    [
-                        -4.3015365,
-                        52.2925739
-                    ],
-                    [
-                        -4.3015365,
-                        52.3685318
-                    ],
-                    [
-                        -4.1811246,
-                        52.3685318
-                    ],
-                    [
-                        -4.1811246,
-                        52.7933685
-                    ],
-                    [
-                        -4.4413696,
-                        52.7933685
-                    ],
-                    [
-                        -4.4413696,
-                        52.7369614
-                    ],
-                    [
-                        -4.8569847,
-                        52.7369614
-                    ],
-                    [
-                        -4.8569847,
-                        52.9317255
-                    ],
-                    [
-                        -4.7288044,
-                        52.9317255
-                    ],
-                    [
-                        -4.7288044,
-                        53.5038599
-                    ],
-                    [
-                        -4.1578191,
-                        53.5038599
-                    ],
-                    [
-                        -4.1578191,
-                        53.4113498
-                    ],
-                    [
-                        -3.3110518,
-                        53.4113498
-                    ],
-                    [
-                        -3.3110518,
-                        53.5038599
-                    ],
-                    [
-                        -3.2333667,
-                        53.5038599
-                    ],
-                    [
-                        -3.2333667,
-                        54.0159169
-                    ],
-                    [
-                        -3.3926211,
-                        54.0159169
-                    ],
-                    [
-                        -3.3926211,
-                        54.1980953
-                    ],
-                    [
-                        -3.559644,
-                        54.1980953
-                    ],
-                    [
-                        -3.559644,
-                        54.433732
-                    ],
-                    [
-                        -3.7188984,
-                        54.433732
-                    ],
-                    [
-                        -3.7188984,
-                        54.721897
-                    ],
-                    [
-                        -4.3015365,
-                        54.721897
-                    ],
-                    [
-                        -4.3015365,
-                        54.6140739
-                    ],
-                    [
-                        -5.0473132,
-                        54.6140739
-                    ],
-                    [
-                        -5.0473132,
-                        54.7532915
-                    ],
-                    [
-                        -5.2298731,
-                        54.7532915
-                    ],
-                    [
-                        -5.2298731,
-                        55.2190799
-                    ],
-                    [
-                        -5.6532567,
-                        55.2190799
-                    ],
-                    [
-                        -5.6532567,
-                        55.250088
-                    ],
-                    [
-                        -5.8979647,
-                        55.250088
-                    ],
-                    [
-                        -5.8979647,
-                        55.4822462
-                    ],
-                    [
-                        -6.5933212,
-                        55.4822462
-                    ],
-                    [
-                        -6.5933212,
-                        56.3013441
-                    ],
-                    [
-                        -7.1727691,
-                        56.3013441
-                    ],
-                    [
-                        -7.1727691,
-                        56.5601822
-                    ],
-                    [
-                        -6.8171722,
-                        56.5601822
-                    ],
-                    [
-                        -6.8171722,
-                        56.6991713
-                    ],
-                    [
-                        -6.5315276,
-                        56.6991713
-                    ],
-                    [
-                        -6.5315276,
-                        56.9066964
-                    ],
-                    [
-                        -6.811679,
-                        56.9066964
-                    ],
-                    [
-                        -6.811679,
-                        57.3716613
-                    ],
-                    [
-                        -6.8721038,
-                        57.3716613
-                    ],
-                    [
-                        -6.8721038,
-                        57.5518893
-                    ],
-                    [
-                        -7.0973235,
-                        57.5518893
-                    ],
-                    [
-                        -7.0973235,
-                        57.2411085
-                    ],
-                    [
-                        -7.1742278,
-                        57.2411085
-                    ],
-                    [
-                        -7.1742278,
-                        56.9066964
-                    ],
-                    [
-                        -7.3719817,
-                        56.9066964
-                    ],
-                    [
-                        -7.3719817,
-                        56.8075885
-                    ],
-                    [
-                        -7.5202972,
-                        56.8075885
-                    ],
-                    [
-                        -7.5202972,
-                        56.7142479
-                    ],
-                    [
-                        -7.8306806,
-                        56.7142479
-                    ],
-                    [
-                        -7.8306806,
-                        56.8994605
-                    ],
-                    [
-                        -7.6494061,
-                        56.8994605
-                    ],
-                    [
-                        -7.6494061,
-                        57.4739617
-                    ],
-                    [
-                        -7.8306806,
-                        57.4739617
-                    ],
-                    [
-                        -7.8306806,
-                        57.7915584
-                    ],
-                    [
-                        -7.4736249,
-                        57.7915584
-                    ],
-                    [
-                        -7.4736249,
-                        58.086063
-                    ],
-                    [
-                        -7.1879804,
-                        58.086063
-                    ],
-                    [
-                        -7.1879804,
-                        58.367197
-                    ],
-                    [
-                        -6.8034589,
-                        58.367197
-                    ],
-                    [
-                        -6.8034589,
-                        58.4155786
-                    ],
-                    [
-                        -6.638664,
-                        58.4155786
-                    ],
-                    [
-                        -6.638664,
-                        58.4673277
-                    ],
-                    [
-                        -6.5178143,
-                        58.4673277
-                    ],
-                    [
-                        -6.5178143,
-                        58.5625632
-                    ],
-                    [
-                        -6.0536224,
-                        58.5625632
-                    ],
-                    [
-                        -6.0536224,
-                        58.1568843
-                    ],
-                    [
-                        -6.1470062,
-                        58.1568843
-                    ],
-                    [
-                        -6.1470062,
-                        58.1105865
-                    ],
-                    [
-                        -6.2799798,
-                        58.1105865
-                    ],
-                    [
-                        -6.2799798,
-                        57.7122664
-                    ],
-                    [
-                        -6.1591302,
-                        57.7122664
-                    ],
-                    [
-                        -6.1591302,
-                        57.6667563
-                    ],
-                    [
-                        -5.9339104,
-                        57.6667563
-                    ],
-                    [
-                        -5.9339104,
-                        57.8892524
-                    ],
-                    [
-                        -5.80643,
-                        57.8892524
-                    ],
-                    [
-                        -5.80643,
-                        57.9621767
-                    ],
-                    [
-                        -5.6141692,
-                        57.9621767
-                    ],
-                    [
-                        -5.6141692,
-                        58.0911236
-                    ],
-                    [
-                        -5.490819,
-                        58.0911236
-                    ],
-                    [
-                        -5.490819,
-                        58.3733281
-                    ],
-                    [
-                        -5.3199118,
-                        58.3733281
-                    ],
-                    [
-                        -5.3199118,
-                        58.75015
-                    ],
-                    [
-                        -3.5719977,
-                        58.75015
-                    ],
-                    [
-                        -3.5719977,
-                        59.2091788
-                    ],
-                    [
-                        -3.1944501,
-                        59.2091788
-                    ],
-                    [
-                        -3.1944501,
-                        59.4759216
-                    ],
-                    [
-                        -2.243583,
-                        59.4759216
-                    ],
-                    [
-                        -2.243583,
-                        59.1388749
-                    ],
-                    [
-                        -2.4611012,
-                        59.1388749
-                    ],
-                    [
-                        -2.4611012,
-                        58.8185938
-                    ],
-                    [
-                        -2.7407675,
-                        58.8185938
-                    ],
-                    [
-                        -2.7407675,
-                        58.5804743
-                    ],
-                    [
-                        -2.9116746,
-                        58.5804743
-                    ],
-                    [
-                        -2.9116746,
-                        58.1157523
-                    ],
-                    [
-                        -3.4865441,
-                        58.1157523
-                    ],
-                    [
-                        -3.4865441,
-                        57.740386
-                    ],
-                    [
-                        -1.7153245,
-                        57.740386
-                    ],
-                    [
-                        -1.7153245,
-                        57.2225558
-                    ],
-                    [
-                        -1.9794538,
-                        57.2225558
-                    ],
-                    [
-                        -1.9794538,
-                        56.8760742
-                    ],
-                    [
-                        -2.1658979,
-                        56.8760742
-                    ],
-                    [
-                        -2.1658979,
-                        56.6333186
-                    ],
-                    [
-                        -2.3601106,
-                        56.6333186
-                    ],
-                    [
-                        -2.3601106,
-                        56.0477521
-                    ],
-                    [
-                        -1.9794538,
-                        56.0477521
-                    ],
-                    [
-                        -1.9794538,
-                        55.8650949
-                    ],
-                    [
-                        -1.4745008,
-                        55.8650949
-                    ],
-                    [
-                        -1.4745008,
-                        55.2499926
-                    ],
-                    [
-                        -1.3221997,
-                        55.2499926
-                    ],
-                    [
-                        -1.3221997,
-                        54.8221737
-                    ],
-                    [
-                        -1.0550014,
-                        54.8221737
-                    ],
-                    [
-                        -1.0550014,
-                        54.6746628
-                    ],
-                    [
-                        -0.6618765,
-                        54.6746628
-                    ],
-                    [
-                        -0.6618765,
-                        54.5527463
-                    ],
-                    [
-                        -0.3247617,
-                        54.5527463
-                    ],
-                    [
-                        -0.3247617,
-                        54.2865195
-                    ],
-                    [
-                        0.0092841,
-                        54.2865195
-                    ],
-                    [
-                        0.0092841,
-                        53.7938518
-                    ],
-                    [
-                        0.2081962,
-                        53.7938518
-                    ],
-                    [
-                        0.2081962,
-                        53.5217726
-                    ],
-                    [
-                        0.4163548,
-                        53.5217726
-                    ],
-                    [
-                        0.4163548,
-                        53.0298851
-                    ],
-                    [
-                        1.4273388,
-                        53.0298851
-                    ],
-                    [
-                        1.4273388,
-                        52.92021
-                    ],
-                    [
-                        1.8333912,
-                        52.92021
-                    ],
-                    [
-                        1.8333912,
-                        52.042488
-                    ],
-                    [
-                        1.5235504,
-                        52.042488
-                    ],
-                    [
-                        1.5235504,
-                        51.8261335
-                    ],
-                    [
-                        1.2697049,
-                        51.8261335
-                    ],
-                    [
-                        1.2697049,
-                        51.6967453
-                    ],
-                    [
-                        1.116651,
-                        51.6967453
-                    ],
-                    [
-                        1.116651,
-                        51.440346
-                    ],
-                    [
-                        1.5235504,
-                        51.440346
-                    ],
-                    [
-                        1.5235504,
-                        51.3331831
-                    ],
-                    [
-                        1.4507565,
-                        51.3331831
-                    ],
-                    [
-                        1.4507565,
-                        51.0207553
-                    ],
-                    [
-                        1.0699883,
-                        51.0207553
-                    ],
-                    [
-                        1.0699883,
-                        50.9008416
-                    ],
-                    [
-                        0.7788126,
-                        50.9008416
-                    ],
-                    [
-                        0.7788126,
-                        50.729843
-                    ],
-                    [
-                        -0.7255952,
-                        50.729843
-                    ],
-                    [
-                        -0.7255952,
-                        50.7038437
-                    ],
-                    [
-                        -1.0074383,
-                        50.7038437
-                    ],
-                    [
-                        -1.0074383,
-                        50.5736307
-                    ],
-                    [
-                        -2.3625252,
-                        50.5736307
-                    ],
-                    [
-                        -2.3625252,
-                        50.4846421
-                    ],
-                    [
-                        -2.4987805,
-                        50.4846421
-                    ],
-                    [
-                        -2.4987805,
-                        50.5736307
-                    ],
-                    [
-                        -3.4096378,
-                        50.5736307
-                    ],
-                    [
-                        -3.4096378,
-                        50.2057837
-                    ],
-                    [
-                        -3.6922446,
-                        50.2057837
-                    ],
-                    [
-                        -3.6922446,
-                        50.1347737
-                    ],
-                    [
-                        -5.005468,
-                        50.1347737
-                    ],
-                    [
-                        -5.005468,
-                        49.9474456
-                    ],
-                    [
-                        -5.2839506,
-                        49.9474456
-                    ],
-                    [
-                        -5.2839506,
-                        50.0229734
-                    ]
-                ],
-                [
-                    [
-                        -6.4580707,
-                        49.8673563
-                    ],
-                    [
-                        -6.4580707,
-                        49.9499935
-                    ],
-                    [
-                        -6.3978807,
-                        49.9499935
-                    ],
-                    [
-                        -6.3978807,
-                        50.0053797
-                    ],
-                    [
-                        -6.1799606,
-                        50.0053797
-                    ],
-                    [
-                        -6.1799606,
-                        49.9168614
-                    ],
-                    [
-                        -6.2540201,
-                        49.9168614
-                    ],
-                    [
-                        -6.2540201,
-                        49.8673563
-                    ]
-                ],
-                [
-                    [
-                        -5.8343165,
-                        49.932156
-                    ],
-                    [
-                        -5.8343165,
-                        49.9754641
-                    ],
-                    [
-                        -5.7683254,
-                        49.9754641
-                    ],
-                    [
-                        -5.7683254,
-                        49.932156
-                    ]
-                ],
-                [
-                    [
-                        -1.9483797,
-                        60.6885737
-                    ],
-                    [
-                        -1.9483797,
-                        60.3058841
-                    ],
-                    [
-                        -1.7543149,
-                        60.3058841
-                    ],
-                    [
-                        -1.7543149,
-                        60.1284428
-                    ],
-                    [
-                        -1.5754914,
-                        60.1284428
-                    ],
-                    [
-                        -1.5754914,
-                        59.797917
-                    ],
-                    [
-                        -1.0316959,
-                        59.797917
-                    ],
-                    [
-                        -1.0316959,
-                        60.0354518
-                    ],
-                    [
-                        -0.6626918,
-                        60.0354518
-                    ],
-                    [
-                        -0.6626918,
-                        60.9103862
-                    ],
-                    [
-                        -1.1034395,
-                        60.9103862
-                    ],
-                    [
-                        -1.1034395,
-                        60.8040022
-                    ],
-                    [
-                        -1.3506319,
-                        60.8040022
-                    ],
-                    [
-                        -1.3506319,
-                        60.6885737
-                    ]
-                ],
-                [
-                    [
-                        -2.203381,
-                        60.1968568
-                    ],
-                    [
-                        -2.203381,
-                        60.0929443
-                    ],
-                    [
-                        -1.9864011,
-                        60.0929443
-                    ],
-                    [
-                        -1.9864011,
-                        60.1968568
-                    ]
-                ],
-                [
-                    [
-                        -1.7543149,
-                        59.5698289
-                    ],
-                    [
-                        -1.7543149,
-                        59.4639383
-                    ],
-                    [
-                        -1.5373349,
-                        59.4639383
-                    ],
-                    [
-                        -1.5373349,
-                        59.5698289
-                    ]
-                ],
-                [
-                    [
-                        -4.5585981,
-                        59.1370518
-                    ],
-                    [
-                        -4.5585981,
-                        58.9569099
-                    ],
-                    [
-                        -4.2867004,
-                        58.9569099
-                    ],
-                    [
-                        -4.2867004,
-                        59.1370518
-                    ]
-                ],
-                [
-                    [
-                        -6.2787732,
-                        59.2025744
-                    ],
-                    [
-                        -6.2787732,
-                        59.0227769
-                    ],
-                    [
-                        -5.6650612,
-                        59.0227769
-                    ],
-                    [
-                        -5.6650612,
-                        59.2025744
-                    ]
-                ],
-                [
-                    [
-                        -8.7163482,
-                        57.9440556
-                    ],
-                    [
-                        -8.7163482,
-                        57.7305936
-                    ],
-                    [
-                        -8.3592926,
-                        57.7305936
-                    ],
-                    [
-                        -8.3592926,
-                        57.9440556
-                    ]
-                ],
-                [
-                    [
-                        -7.6077005,
-                        50.4021026
-                    ],
-                    [
-                        -7.6077005,
-                        50.2688657
-                    ],
-                    [
-                        -7.3907205,
-                        50.2688657
-                    ],
-                    [
-                        -7.3907205,
-                        50.4021026
-                    ]
-                ],
-                [
-                    [
-                        -7.7304303,
-                        58.3579902
-                    ],
-                    [
-                        -7.7304303,
-                        58.248313
-                    ],
-                    [
-                        -7.5134503,
-                        58.248313
-                    ],
-                    [
-                        -7.5134503,
-                        58.3579902
-                    ]
-                ]
-            ]
-        },
-        {
-            "name": "OS Scottish Popular historic",
-            "type": "tms",
-            "template": "http://ooc.openstreetmap.org/npescotland/tiles/{zoom}/{x}/{y}.jpg",
-            "scaleExtent": [
-                6,
-                15
-            ],
-            "polygon": [
-                [
-                    [
-                        -7.8,
-                        54.5
-                    ],
-                    [
-                        -7.8,
-                        61.1
-                    ],
-                    [
-                        -1.1,
-                        61.1
-                    ],
-                    [
-                        -1.1,
-                        54.5
-                    ],
-                    [
-                        -7.8,
-                        54.5
-                    ]
-                ]
-            ]
-        },
-        {
-            "name": "OS Town Plans, Aberdeen 1866-1867 (NLS)",
-            "type": "tms",
-            "description": "Detailed town plan of Aberdeen 1866-1867, courtesy of National Library of Scotland.",
-            "template": "http://geo.nls.uk/maps/towns/aberdeen/{zoom}/{x}/{-y}.png",
-            "scaleExtent": [
-                13,
-                20
-            ],
-            "polygon": [
-                [
-                    [
-                        -2.14039404,
-                        57.11218789
-                    ],
-                    [
-                        -2.14064752,
-                        57.17894161
-                    ],
-                    [
-                        -2.04501987,
-                        57.17901252
-                    ],
-                    [
-                        -2.04493842,
-                        57.11225862
-                    ]
-                ]
-            ],
-            "terms_url": "http://maps.nls.uk/townplans/aberdeen.html",
-            "terms_text": "National Library of Scotland - Aberdeen 1866-1867"
-        },
-        {
-            "name": "OS Town Plans, Airdrie 1858 (NLS)",
-            "type": "tms",
-            "description": "Detailed town plan of Airdrie 1858, courtesy of National Library of Scotland.",
-            "template": "http://geo.nls.uk/maps/towns/airdrie/{zoom}/{x}/{-y}.png",
-            "scaleExtent": [
-                13,
-                20
-            ],
-            "polygon": [
-                [
-                    [
-                        -3.99291738,
-                        55.86408041
-                    ],
-                    [
-                        -3.99338933,
-                        55.87329115
-                    ],
-                    [
-                        -3.9691085,
-                        55.87368212
-                    ],
-                    [
-                        -3.9686423,
-                        55.86447124
-                    ]
-                ]
-            ],
-            "terms_url": "http://maps.nls.uk/townplans/airdrie.html",
-            "terms_text": "National Library of Scotland - Airdrie 1858"
-        },
-        {
-            "name": "OS Town Plans, Alexandria 1859 (NLS)",
-            "type": "tms",
-            "description": "Detailed town plan of Alexandria 1859, courtesy of National Library of Scotland.",
-            "template": "http://geo.nls.uk/maps/towns/alexandria/{zoom}/{x}/{-y}.png",
-            "scaleExtent": [
-                13,
-                20
-            ],
-            "polygon": [
-                [
-                    [
-                        -4.58973571,
-                        55.97536707
-                    ],
-                    [
-                        -4.59104461,
-                        55.99493153
-                    ],
-                    [
-                        -4.55985072,
-                        55.99558348
-                    ],
-                    [
-                        -4.55855754,
-                        55.97601855
-                    ]
-                ]
-            ],
-            "terms_url": "http://maps.nls.uk/townplans/alexandria.html",
-            "terms_text": "National Library of Scotland - Alexandria 1859"
-        },
-        {
-            "name": "OS Town Plans, Alloa 1861-1862 (NLS)",
-            "type": "tms",
-            "description": "Detailed town plan of Alloa 1861-1862, courtesy of National Library of Scotland.",
-            "template": "http://geo.nls.uk/maps/towns/alloa/{zoom}/{x}/{-y}.png",
-            "scaleExtent": [
-                13,
-                20
-            ],
-            "polygon": [
-                [
-                    [
-                        -3.81166061,
-                        56.09864363
-                    ],
-                    [
-                        -3.81274448,
-                        56.12169929
-                    ],
-                    [
-                        -3.7804609,
-                        56.12216898
-                    ],
-                    [
-                        -3.77939631,
-                        56.09911292
-                    ]
-                ]
-            ],
-            "terms_url": "http://maps.nls.uk/townplans/alloa.html",
-            "terms_text": "National Library of Scotland - Alloa 1861-1862"
-        },
-        {
-            "name": "OS Town Plans, Annan 1859 (NLS)",
-            "type": "tms",
-            "description": "Detailed town plan of Annan 1859, courtesy of National Library of Scotland.",
-            "template": "http://geo.nls.uk/maps/towns/annan/{zoom}/{x}/{-y}.png",
-            "scaleExtent": [
-                13,
-                20
-            ],
-            "polygon": [
-                [
-                    [
-                        -3.27921439,
-                        54.98252155
-                    ],
-                    [
-                        -3.27960062,
-                        54.9946601
-                    ],
-                    [
-                        -3.24866331,
-                        54.99498165
-                    ],
-                    [
-                        -3.24828642,
-                        54.98284297
-                    ]
-                ]
-            ],
-            "terms_url": "http://maps.nls.uk/townplans/annan.html",
-            "terms_text": "National Library of Scotland - Annan 1859"
-        },
-        {
-            "name": "OS Town Plans, Arbroath 1858 (NLS)",
-            "type": "tms",
-            "description": "Detailed town plan of Arbroath 1858, courtesy of National Library of Scotland.",
-            "template": "http://geo.nls.uk/maps/towns/arbroath/{zoom}/{x}/{-y}.png",
-            "scaleExtent": [
-                13,
-                20
-            ],
-            "polygon": [
-                [
-                    [
-                        -2.60716469,
-                        56.53995105
-                    ],
-                    [
-                        -2.60764981,
-                        56.57022426
-                    ],
-                    [
-                        -2.56498708,
-                        56.57042549
-                    ],
-                    [
-                        -2.564536,
-                        56.54015206
-                    ]
-                ]
-            ],
-            "terms_url": "http://maps.nls.uk/townplans/arbroath.html",
-            "terms_text": "National Library of Scotland - Arbroath 1858"
-        },
-        {
-            "name": "OS Town Plans, Ayr 1855 (NLS)",
-            "type": "tms",
-            "description": "Detailed town plan of Ayr 1855, courtesy of National Library of Scotland.",
-            "template": "http://geo.nls.uk/maps/towns/ayr/{zoom}/{x}/{-y}.png",
-            "scaleExtent": [
-                13,
-                20
-            ],
-            "polygon": [
-                [
-                    [
-                        -4.66768105,
-                        55.43748864
-                    ],
-                    [
-                        -4.67080057,
-                        55.48363961
-                    ],
-                    [
-                        -4.60609844,
-                        55.48503484
-                    ],
-                    [
-                        -4.60305426,
-                        55.43888149
-                    ]
-                ]
-            ],
-            "terms_url": "http://maps.nls.uk/townplans/ayr.html",
-            "terms_text": "National Library of Scotland - Ayr 1855"
-        },
-        {
-            "name": "OS Town Plans, Berwick-upon-Tweed 1852 (NLS)",
-            "type": "tms",
-            "description": "Detailed town plan of Berwick-upon-Tweed 1852, courtesy of National Library of Scotland.",
-            "template": "http://geo.nls.uk/maps/towns/berwick/{zoom}/{x}/{-y}.png",
-            "scaleExtent": [
-                13,
-                20
-            ],
-            "polygon": [
-                [
-                    [
-                        -2.02117487,
-                        55.75577627
-                    ],
-                    [
-                        -2.02118763,
-                        55.77904118
-                    ],
-                    [
-                        -1.98976956,
-                        55.77904265
-                    ],
-                    [
-                        -1.9897755,
-                        55.75577774
-                    ]
-                ]
-            ],
-            "terms_url": "http://maps.nls.uk/townplans/berwick.html",
-            "terms_text": "National Library of Scotland - Berwick-upon-Tweed 1852"
-        },
-        {
-            "name": "OS Town Plans, Brechin 1862 (NLS)",
-            "type": "tms",
-            "description": "Detailed town plan of Brechin 1862, courtesy of National Library of Scotland.",
-            "template": "http://geo.nls.uk/maps/towns/brechin/{zoom}/{x}/{-y}.png",
-            "scaleExtent": [
-                13,
-                20
-            ],
-            "polygon": [
-                [
-                    [
-                        -2.67480248,
-                        56.71456775
-                    ],
-                    [
-                        -2.67521172,
-                        56.73739937
-                    ],
-                    [
-                        -2.64319679,
-                        56.73756872
-                    ],
-                    [
-                        -2.64280695,
-                        56.71473694
-                    ]
-                ]
-            ],
-            "terms_url": "http://maps.nls.uk/townplans/brechin.html",
-            "terms_text": "National Library of Scotland - Brechin 1862"
-        },
-        {
-            "name": "OS Town Plans, Burntisland 1894 (NLS)",
-            "type": "tms",
-            "description": "Detailed town plan of Burntisland 1894, courtesy of National Library of Scotland.",
-            "template": "http://geo.nls.uk/maps/towns/burntisland/{zoom}/{x}/{-y}.png",
-            "scaleExtent": [
-                13,
-                20
-            ],
-            "polygon": [
-                [
-                    [
-                        -3.24879624,
-                        56.04240046
-                    ],
-                    [
-                        -3.2495182,
-                        56.06472996
-                    ],
-                    [
-                        -3.21830572,
-                        56.06504207
-                    ],
-                    [
-                        -3.21760179,
-                        56.0427123
-                    ]
-                ]
-            ],
-            "terms_url": "http://maps.nls.uk/townplans/burntisland.html",
-            "terms_text": "National Library of Scotland - Burntisland 1894"
-        },
-        {
-            "name": "OS Town Plans, Campbelton 1865 (NLS)",
-            "type": "tms",
-            "description": "Detailed town plan of Campbelton 1865, courtesy of National Library of Scotland.",
-            "template": "http://geo.nls.uk/maps/towns/campbeltown/{zoom}/{x}/{-y}.png",
-            "scaleExtent": [
-                13,
-                20
-            ],
-            "polygon": [
-                [
-                    [
-                        -5.62345307,
-                        55.40255998
-                    ],
-                    [
-                        -5.62631353,
-                        55.43375303
-                    ],
-                    [
-                        -5.58276654,
-                        55.43503753
-                    ],
-                    [
-                        -5.57994024,
-                        55.40384299
-                    ]
-                ]
-            ],
-            "terms_url": "http://maps.nls.uk/townplans/campbelton.html",
-            "terms_text": "National Library of Scotland - Campbelton 1865"
-        },
-        {
-            "name": "OS Town Plans, Coatbridge 1858 (NLS)",
-            "type": "tms",
-            "description": "Detailed town plan of Coatbridge 1858, courtesy of National Library of Scotland.",
-            "template": "http://geo.nls.uk/maps/towns/coatbridge/{zoom}/{x}/{-y}.png",
-            "scaleExtent": [
-                13,
-                20
-            ],
-            "polygon": [
-                [
-                    [
-                        -4.05035921,
-                        55.84648689
-                    ],
-                    [
-                        -4.05157062,
-                        55.86947193
-                    ],
-                    [
-                        -4.01953905,
-                        55.87000186
-                    ],
-                    [
-                        -4.01834651,
-                        55.84701638
-                    ]
-                ]
-            ],
-            "terms_url": "http://maps.nls.uk/townplans/coatbridge.html",
-            "terms_text": "National Library of Scotland - Coatbridge 1858"
-        },
-        {
-            "name": "OS Town Plans, Cupar 1854 (NLS)",
-            "type": "tms",
-            "description": "Detailed town plan of Cupar 1854, courtesy of National Library of Scotland.",
-            "template": "http://geo.nls.uk/maps/towns/cupar1854/{zoom}/{x}/{-y}.png",
-            "scaleExtent": [
-                13,
-                20
-            ],
-            "polygon": [
-                [
-                    [
-                        -3.04765872,
-                        56.28653177
-                    ],
-                    [
-                        -3.04890965,
-                        56.332192
-                    ],
-                    [
-                        -2.98498515,
-                        56.33271677
-                    ],
-                    [
-                        -2.98381041,
-                        56.28705563
-                    ]
-                ]
-            ],
-            "terms_url": "http://maps.nls.uk/townplans/cupar_1.html",
-            "terms_text": "National Library of Scotland - Cupar 1854"
-        },
-        {
-            "name": "OS Town Plans, Cupar 1893-1894 (NLS)",
-            "type": "tms",
-            "description": "Detailed town plan of Cupar 1893-1894, courtesy of National Library of Scotland.",
-            "template": "http://geo.nls.uk/maps/towns/cupar1893/{zoom}/{x}/{-y}.png",
-            "scaleExtent": [
-                13,
-                20
-            ],
-            "polygon": [
-                [
-                    [
-                        -3.0327697,
-                        56.30243657
-                    ],
-                    [
-                        -3.03338443,
-                        56.32520139
-                    ],
-                    [
-                        -3.00146629,
-                        56.32546356
-                    ],
-                    [
-                        -3.00087054,
-                        56.30269852
-                    ]
-                ]
-            ],
-            "terms_url": "http://maps.nls.uk/townplans/cupar_2.html",
-            "terms_text": "National Library of Scotland - Cupar 1893-1894"
-        },
-        {
-            "name": "OS Town Plans, Dalkeith 1852 (NLS)",
-            "type": "tms",
-            "description": "Detailed town plan of Dalkeith 1852, courtesy of National Library of Scotland.",
-            "template": "http://geo.nls.uk/maps/towns/dalkeith1852/{zoom}/{x}/{-y}.png",
-            "scaleExtent": [
-                13,
-                20
-            ],
-            "polygon": [
-                [
-                    [
-                        -3.07862465,
-                        55.88900264
-                    ],
-                    [
-                        -3.0790381,
-                        55.90389729
-                    ],
-                    [
-                        -3.05835611,
-                        55.90407681
-                    ],
-                    [
-                        -3.05795059,
-                        55.88918206
-                    ]
-                ]
-            ],
-            "terms_url": "http://maps.nls.uk/townplans/dalkeith_1.html",
-            "terms_text": "National Library of Scotland - Dalkeith 1852"
-        },
-        {
-            "name": "OS Town Plans, Dalkeith 1893 (NLS)",
-            "type": "tms",
-            "description": "Detailed town plan of Dalkeith 1893, courtesy of National Library of Scotland.",
-            "template": "http://geo.nls.uk/maps/towns/dalkeith1893/{zoom}/{x}/{-y}.png",
-            "scaleExtent": [
-                13,
-                20
-            ],
-            "polygon": [
-                [
-                    [
-                        -3.08600192,
-                        55.87936087
-                    ],
-                    [
-                        -3.08658588,
-                        55.90025926
-                    ],
-                    [
-                        -3.0436473,
-                        55.90063074
-                    ],
-                    [
-                        -3.04308639,
-                        55.87973206
-                    ]
-                ]
-            ],
-            "terms_url": "http://maps.nls.uk/townplans/dalkeith_2.html",
-            "terms_text": "National Library of Scotland - Dalkeith 1893"
-        },
-        {
-            "name": "OS Town Plans, Dumbarton 1859 (NLS)",
-            "type": "tms",
-            "description": "Detailed town plan of Dumbarton 1859, courtesy of National Library of Scotland.",
-            "template": "http://geo.nls.uk/maps/towns/dumbarton/{zoom}/{x}/{-y}.png",
-            "scaleExtent": [
-                13,
-                20
-            ],
-            "polygon": [
-                [
-                    [
-                        -4.58559982,
-                        55.92742578
-                    ],
-                    [
-                        -4.58714245,
-                        55.95056014
-                    ],
-                    [
-                        -4.55463269,
-                        55.95123882
-                    ],
-                    [
-                        -4.55310939,
-                        55.92810387
-                    ]
-                ]
-            ],
-            "terms_url": "http://maps.nls.uk/townplans/dumbarton.html",
-            "terms_text": "National Library of Scotland - Dumbarton 1859"
-        },
-        {
-            "name": "OS Town Plans, Dumfries 1850 (NLS)",
-            "type": "tms",
-            "description": "Detailed town plan of Dumfries 1850, courtesy of National Library of Scotland.",
-            "template": "http://geo.nls.uk/maps/towns/dumfries1850/{zoom}/{x}/{-y}.png",
-            "scaleExtent": [
-                13,
-                20
-            ],
-            "polygon": [
-                [
-                    [
-                        -3.63928076,
-                        55.03715991
-                    ],
-                    [
-                        -3.64116352,
-                        55.08319002
-                    ],
-                    [
-                        -3.57823183,
-                        55.08402202
-                    ],
-                    [
-                        -3.57642118,
-                        55.0379905
-                    ]
-                ]
-            ],
-            "terms_url": "http://maps.nls.uk/townplans/dumfries_1.html",
-            "terms_text": "National Library of Scotland - Dumfries 1850"
-        },
-        {
-            "name": "OS Town Plans, Dumfries 1893 (NLS)",
-            "type": "tms",
-            "description": "Detailed town plan of Dumfries 1893, courtesy of National Library of Scotland.",
-            "template": "http://geo.nls.uk/maps/towns/dumfries1893/{zoom}/{x}/{-y}.png",
-            "scaleExtent": [
-                13,
-                20
-            ],
-            "polygon": [
-                [
-                    [
-                        -3.63179081,
-                        55.04150111
-                    ],
-                    [
-                        -3.63330662,
-                        55.07873429
-                    ],
-                    [
-                        -3.58259012,
-                        55.07940411
-                    ],
-                    [
-                        -3.58112132,
-                        55.04217001
-                    ]
-                ]
-            ],
-            "terms_url": "http://maps.nls.uk/townplans/dumfries_2.html",
-            "terms_text": "National Library of Scotland - Dumfries 1893"
-        },
-        {
-            "name": "OS Town Plans, Dundee 1857-1858 (NLS)",
-            "type": "tms",
-            "description": "Detailed town plan of Dundee 1857-1858, courtesy of National Library of Scotland.",
-            "template": "http://geo.nls.uk/maps/towns/dundee1857/{zoom}/{x}/{-y}.png",
-            "scaleExtent": [
-                13,
-                20
-            ],
-            "polygon": [
-                [
-                    [
-                        -3.02584468,
-                        56.44879161
-                    ],
-                    [
-                        -3.02656969,
-                        56.47566815
-                    ],
-                    [
-                        -2.94710317,
-                        56.47629984
-                    ],
-                    [
-                        -2.94643424,
-                        56.44942266
-                    ]
-                ]
-            ],
-            "terms_url": "http://maps.nls.uk/townplans/dundee_1.html",
-            "terms_text": "National Library of Scotland - Dundee 1857-1858"
-        },
-        {
-            "name": "OS Town Plans, Dundee 1870-1872 (NLS)",
-            "type": "tms",
-            "description": "Detailed town plan of Dundee 1870-1872, courtesy of National Library of Scotland.",
-            "template": "http://geo.nls.uk/maps/towns/dundee1870/{zoom}/{x}/{-y}.png",
-            "scaleExtent": [
-                13,
-                20
-            ],
-            "polygon": [
-                [
-                    [
-                        -3.03399945,
-                        56.448497
-                    ],
-                    [
-                        -3.03497463,
-                        56.48435238
-                    ],
-                    [
-                        -2.92352705,
-                        56.48523137
-                    ],
-                    [
-                        -2.92265681,
-                        56.4493748
-                    ]
-                ]
-            ],
-            "terms_url": "http://maps.nls.uk/townplans/dundee_2.html",
-            "terms_text": "National Library of Scotland - Dundee 1870-1872"
-        },
-        {
-            "name": "OS Town Plans, Dunfermline 1854 (NLS)",
-            "type": "tms",
-            "description": "Detailed town plan of Dunfermline 1854, courtesy of National Library of Scotland.",
-            "template": "http://geo.nls.uk/maps/towns/dunfermline1854/{zoom}/{x}/{-y}.png",
-            "scaleExtent": [
-                13,
-                20
-            ],
-            "polygon": [
-                [
-                    [
-                        -3.49045481,
-                        56.0605979
-                    ],
-                    [
-                        -3.49116489,
-                        56.07898822
-                    ],
-                    [
-                        -3.44374075,
-                        56.07955208
-                    ],
-                    [
-                        -3.44305323,
-                        56.06116138
-                    ]
-                ]
-            ],
-            "terms_url": "http://maps.nls.uk/townplans/dunfermline_1.html",
-            "terms_text": "National Library of Scotland - Dunfermline 1854"
-        },
-        {
-            "name": "OS Town Plans, Dunfermline 1894 (NLS)",
-            "type": "tms",
-            "description": "Detailed town plan of Dunfermline 1894, courtesy of National Library of Scotland.",
-            "template": "http://geo.nls.uk/maps/towns/dunfermline1893/{zoom}/{x}/{-y}.png",
-            "scaleExtent": [
-                13,
-                20
-            ],
-            "polygon": [
-                [
-                    [
-                        -3.48284159,
-                        56.05198219
-                    ],
-                    [
-                        -3.48399434,
-                        56.08198924
-                    ],
-                    [
-                        -3.44209721,
-                        56.08248587
-                    ],
-                    [
-                        -3.44097697,
-                        56.05247826
-                    ]
-                ]
-            ],
-            "terms_url": "http://maps.nls.uk/townplans/dunfermline_2.html",
-            "terms_text": "National Library of Scotland - Dunfermline 1894"
-        },
-        {
-            "name": "OS Town Plans, Edinburgh 1849-1851 (NLS)",
-            "type": "tms",
-            "description": "Detailed town plan of Edinburgh 1849-1851, courtesy of National Library of Scotland.",
-            "template": "http://geo.nls.uk/maps/towns/edinburgh1849/{zoom}/{x}/{-y}.png",
-            "scaleExtent": [
-                13,
-                20
-            ],
-            "polygon": [
-                [
-                    [
-                        -3.2361048,
-                        55.921366
-                    ],
-                    [
-                        -3.23836397,
-                        55.99217223
-                    ],
-                    [
-                        -3.14197035,
-                        55.99310288
-                    ],
-                    [
-                        -3.13988689,
-                        55.92229419
-                    ]
-                ]
-            ],
-            "terms_url": "http://maps.nls.uk/townplans/edinburgh1056_1.html",
-            "terms_text": "National Library of Scotland - Edinburgh 1849-1851"
-        },
-        {
-            "name": "OS Town Plans, Edinburgh 1876-1877 (NLS)",
-            "type": "tms",
-            "description": "Detailed town plan of Edinburgh 1876-1877, courtesy of National Library of Scotland.",
-            "template": "http://geo.nls.uk/maps/towns/edinburgh1876/{zoom}/{x}/{-y}.png",
-            "scaleExtent": [
-                13,
-                20
-            ],
-            "polygon": [
-                [
-                    [
-                        -3.24740498,
-                        55.92116518
-                    ],
-                    [
-                        -3.24989581,
-                        55.99850896
-                    ],
-                    [
-                        -3.13061127,
-                        55.99966059
-                    ],
-                    [
-                        -3.12835798,
-                        55.92231348
-                    ]
-                ]
-            ],
-            "terms_url": "http://maps.nls.uk/townplans/edinburgh1056_2.html",
-            "terms_text": "National Library of Scotland - Edinburgh 1876-1877"
-        },
-        {
-            "name": "OS Town Plans, Edinburgh 1893-1894 (NLS)",
-            "type": "tms",
-            "description": "Detailed town plan of Edinburgh 1893-1894, courtesy of National Library of Scotland.",
-            "template": "http://geo.nls.uk/maps/towns/edinburgh1893/{zoom}/{x}/{-y}.png",
-            "scaleExtent": [
-                13,
-                20
-            ],
-            "polygon": [
-                [
-                    [
-                        -3.26111081,
-                        55.89555387
-                    ],
-                    [
-                        -3.26450423,
-                        55.9997912
-                    ],
-                    [
-                        -3.11970824,
-                        56.00119128
-                    ],
-                    [
-                        -3.1167031,
-                        55.89694851
-                    ]
-                ]
-            ],
-            "terms_url": "http://maps.nls.uk/townplans/edinburgh500.html",
-            "terms_text": "National Library of Scotland - Edinburgh 1893-1894"
-        },
-        {
-            "name": "OS Town Plans, Elgin 1868 (NLS)",
-            "type": "tms",
-            "description": "Detailed town plan of Elgin 1868, courtesy of National Library of Scotland.",
-            "template": "http://geo.nls.uk/maps/towns/elgin/{zoom}/{x}/{-y}.png",
-            "scaleExtent": [
-                13,
-                20
-            ],
-            "polygon": [
-                [
-                    [
-                        -3.33665196,
-                        57.62879017
-                    ],
-                    [
-                        -3.33776583,
-                        57.65907381
-                    ],
-                    [
-                        -3.29380859,
-                        57.65953111
-                    ],
-                    [
-                        -3.29273129,
-                        57.62924695
-                    ]
-                ]
-            ],
-            "terms_url": "http://maps.nls.uk/townplans/elgin.html",
-            "terms_text": "National Library of Scotland - Elgin 1868"
-        },
-        {
-            "name": "OS Town Plans, Falkirk 1858-1859 (NLS)",
-            "type": "tms",
-            "description": "Detailed town plan of Falkirk 1858-1859, courtesy of National Library of Scotland.",
-            "template": "http://geo.nls.uk/maps/towns/falkirk/{zoom}/{x}/{-y}.png",
-            "scaleExtent": [
-                13,
-                20
-            ],
-            "polygon": [
-                [
-                    [
-                        -3.79587441,
-                        55.99343101
-                    ],
-                    [
-                        -3.79697783,
-                        56.01720281
-                    ],
-                    [
-                        -3.76648151,
-                        56.01764348
-                    ],
-                    [
-                        -3.76539679,
-                        55.99387129
-                    ]
-                ]
-            ],
-            "terms_url": "http://maps.nls.uk/townplans/falkirk.html",
-            "terms_text": "National Library of Scotland - Falkirk 1858-1859"
-        },
-        {
-            "name": "OS Town Plans, Forfar 1860-1861 (NLS)",
-            "type": "tms",
-            "description": "Detailed town plan of Forfar 1860-1861, courtesy of National Library of Scotland.",
-            "template": "http://geo.nls.uk/maps/towns/forfar/{zoom}/{x}/{-y}.png",
-            "scaleExtent": [
-                13,
-                20
-            ],
-            "polygon": [
-                [
-                    [
-                        -2.90326183,
-                        56.6289471
-                    ],
-                    [
-                        -2.90378797,
-                        56.65095013
-                    ],
-                    [
-                        -2.87228457,
-                        56.65117489
-                    ],
-                    [
-                        -2.87177676,
-                        56.62917168
-                    ]
-                ]
-            ],
-            "terms_url": "http://maps.nls.uk/townplans/forfar.html",
-            "terms_text": "National Library of Scotland - Forfar 1860-1861"
-        },
-        {
-            "name": "OS Town Plans, Forres 1868 (NLS)",
-            "type": "tms",
-            "description": "Detailed town plan of Forres 1868, courtesy of National Library of Scotland.",
-            "template": "http://geo.nls.uk/maps/towns/forres/{zoom}/{x}/{-y}.png",
-            "scaleExtent": [
-                13,
-                20
-            ],
-            "polygon": [
-                [
-                    [
-                        -3.63516795,
-                        57.58887872
-                    ],
-                    [
-                        -3.63647637,
-                        57.618002
-                    ],
-                    [
-                        -3.57751453,
-                        57.61875171
-                    ],
-                    [
-                        -3.5762532,
-                        57.58962759
-                    ]
-                ]
-            ],
-            "terms_url": "http://maps.nls.uk/townplans/forres.html",
-            "terms_text": "National Library of Scotland - Forres 1868"
-        },
-        {
-            "name": "OS Town Plans, Galashiels 1858 (NLS)",
-            "type": "tms",
-            "description": "Detailed town plan of Galashiels 1858, courtesy of National Library of Scotland.",
-            "template": "http://geo.nls.uk/maps/towns/galashiels/{zoom}/{x}/{-y}.png",
-            "scaleExtent": [
-                13,
-                20
-            ],
-            "polygon": [
-                [
-                    [
-                        -2.82918609,
-                        55.59586303
-                    ],
-                    [
-                        -2.82981273,
-                        55.62554026
-                    ],
-                    [
-                        -2.78895254,
-                        55.62580992
-                    ],
-                    [
-                        -2.78835674,
-                        55.59613239
-                    ]
-                ]
-            ],
-            "terms_url": "http://maps.nls.uk/townplans/galashiels.html",
-            "terms_text": "National Library of Scotland - Galashiels 1858"
-        },
-        {
-            "name": "OS Town Plans, Girvan 1857 (NLS)",
-            "type": "tms",
-            "description": "Detailed town plan of Girvan 1857, courtesy of National Library of Scotland.",
-            "template": "http://geo.nls.uk/maps/towns/girvan/{zoom}/{x}/{-y}.png",
-            "scaleExtent": [
-                13,
-                20
-            ],
-            "polygon": [
-                [
-                    [
-                        -4.87424251,
-                        55.22679729
-                    ],
-                    [
-                        -4.87587895,
-                        55.24945946
-                    ],
-                    [
-                        -4.84447382,
-                        55.25019598
-                    ],
-                    [
-                        -4.84285519,
-                        55.22753318
-                    ]
-                ]
-            ],
-            "terms_url": "http://maps.nls.uk/townplans/girvan.html",
-            "terms_text": "National Library of Scotland - Girvan 1857"
-        },
-        {
-            "name": "OS Town Plans, Glasgow 1857-1858 (NLS)",
-            "type": "tms",
-            "description": "Detailed town plan of Glasgow 1857-1858, courtesy of National Library of Scotland.",
-            "template": "http://geo.nls.uk/maps/towns/glasgow1857/{zoom}/{x}/{-y}.png",
-            "scaleExtent": [
-                13,
-                20
-            ],
-            "polygon": [
-                [
-                    [
-                        -4.31575491,
-                        55.82072009
-                    ],
-                    [
-                        -4.319683,
-                        55.88667625
-                    ],
-                    [
-                        -4.1771319,
-                        55.88928081
-                    ],
-                    [
-                        -4.1734447,
-                        55.82331825
-                    ]
-                ]
-            ],
-            "terms_url": "http://maps.nls.uk/townplans/glasgow_1.html",
-            "terms_text": "National Library of Scotland - Glasgow 1857-1858"
-        },
-        {
-            "name": "OS Town Plans, Glasgow 1892-1894 (NLS)",
-            "type": "tms",
-            "description": "Detailed town plan of Glasgow 1892-1894, courtesy of National Library of Scotland.",
-            "template": "http://geo.nls.uk/maps/towns/glasgow1894/{zoom}/{x}/{-y}.png",
-            "scaleExtent": [
-                13,
-                20
-            ],
-            "polygon": [
-                [
-                    [
-                        -4.3465357,
-                        55.81456228
-                    ],
-                    [
-                        -4.35157646,
-                        55.89806268
-                    ],
-                    [
-                        -4.17788765,
-                        55.9012587
-                    ],
-                    [
-                        -4.17321842,
-                        55.81774834
-                    ]
-                ]
-            ],
-            "terms_url": "http://maps.nls.uk/townplans/glasgow_2.html",
-            "terms_text": "National Library of Scotland - Glasgow 1892-1894"
-        },
-        {
-            "name": "OS Town Plans, Greenock 1857 (NLS)",
-            "type": "tms",
-            "description": "Detailed town plan of Greenock 1857, courtesy of National Library of Scotland.",
-            "template": "http://geo.nls.uk/maps/towns/greenock/{zoom}/{x}/{-y}.png",
-            "scaleExtent": [
-                13,
-                20
-            ],
-            "polygon": [
-                [
-                    [
-                        -4.78108857,
-                        55.92617865
-                    ],
-                    [
-                        -4.78382957,
-                        55.96437481
-                    ],
-                    [
-                        -4.7302257,
-                        55.96557475
-                    ],
-                    [
-                        -4.72753731,
-                        55.92737687
-                    ]
-                ]
-            ],
-            "terms_url": "http://maps.nls.uk/townplans/greenock.html",
-            "terms_text": "National Library of Scotland - Greenock 1857"
-        },
-        {
-            "name": "OS Town Plans, Haddington 1853 (NLS)",
-            "type": "tms",
-            "description": "Detailed town plan of Haddington 1853, courtesy of National Library of Scotland.",
-            "template": "http://geo.nls.uk/maps/towns/haddington1853/{zoom}/{x}/{-y}.png",
-            "scaleExtent": [
-                13,
-                20
-            ],
-            "polygon": [
-                [
-                    [
-                        -2.78855542,
-                        55.9451862
-                    ],
-                    [
-                        -2.78888196,
-                        55.96124194
-                    ],
-                    [
-                        -2.76674325,
-                        55.9613817
-                    ],
-                    [
-                        -2.76642588,
-                        55.94532587
-                    ]
-                ]
-            ],
-            "terms_url": "http://maps.nls.uk/townplans/haddington_1.html",
-            "terms_text": "National Library of Scotland - Haddington 1853"
-        },
-        {
-            "name": "OS Town Plans, Haddington 1893 (NLS)",
-            "type": "tms",
-            "description": "Detailed town plan of Haddington 1893, courtesy of National Library of Scotland.",
-            "template": "http://geo.nls.uk/maps/towns/haddington1893/{zoom}/{x}/{-y}.png",
-            "scaleExtent": [
-                13,
-                20
-            ],
-            "polygon": [
-                [
-                    [
-                        -2.80152293,
-                        55.93428734
-                    ],
-                    [
-                        -2.80214693,
-                        55.96447189
-                    ],
-                    [
-                        -2.76038069,
-                        55.9647367
-                    ],
-                    [
-                        -2.75978916,
-                        55.93455185
-                    ]
-                ]
-            ],
-            "terms_url": "http://maps.nls.uk/townplans/haddington_2.html",
-            "terms_text": "National Library of Scotland - Haddington 1893"
-        },
-        {
-            "name": "OS Town Plans, Hamilton 1858 (NLS)",
-            "type": "tms",
-            "description": "Detailed town plan of Hamilton 1858, courtesy of National Library of Scotland.",
-            "template": "http://geo.nls.uk/maps/towns/hamilton/{zoom}/{x}/{-y}.png",
-            "scaleExtent": [
-                13,
-                20
-            ],
-            "polygon": [
-                [
-                    [
-                        -4.06721642,
-                        55.74877265
-                    ],
-                    [
-                        -4.06924047,
-                        55.78698508
-                    ],
-                    [
-                        -4.01679233,
-                        55.78785698
-                    ],
-                    [
-                        -4.01481949,
-                        55.74964331
-                    ]
-                ]
-            ],
-            "terms_url": "http://maps.nls.uk/townplans/hamilton.html",
-            "terms_text": "National Library of Scotland - Hamilton 1858"
-        },
-        {
-            "name": "OS Town Plans, Hawick 1857-1858 (NLS)",
-            "type": "tms",
-            "description": "Detailed town plan of Hawick 1857-1858, courtesy of National Library of Scotland.",
-            "template": "http://geo.nls.uk/maps/towns/hawick/{zoom}/{x}/{-y}.png",
-            "scaleExtent": [
-                13,
-                20
-            ],
-            "polygon": [
-                [
-                    [
-                        -2.80130149,
-                        55.4102516
-                    ],
-                    [
-                        -2.80176329,
-                        55.43304638
-                    ],
-                    [
-                        -2.7708832,
-                        55.43324489
-                    ],
-                    [
-                        -2.77043917,
-                        55.41044995
-                    ]
-                ]
-            ],
-            "terms_url": "http://maps.nls.uk/townplans/hawick.html",
-            "terms_text": "National Library of Scotland - Hawick 1857-1858"
-        },
-        {
-            "name": "OS Town Plans, Inverness 1867-1868 (NLS)",
-            "type": "tms",
-            "description": "Detailed town plan of Inverness 1867-1868, courtesy of National Library of Scotland.",
-            "template": "http://geo.nls.uk/maps/towns/inverness/{zoom}/{x}/{-y}.png",
-            "scaleExtent": [
-                13,
-                20
-            ],
-            "polygon": [
-                [
-                    [
-                        -4.25481758,
-                        57.45916363
-                    ],
-                    [
-                        -4.25752308,
-                        57.50302387
-                    ],
-                    [
-                        -4.19713638,
-                        57.50409032
-                    ],
-                    [
-                        -4.1945031,
-                        57.46022829
-                    ]
-                ]
-            ],
-            "terms_url": "http://maps.nls.uk/townplans/inverness.html",
-            "terms_text": "National Library of Scotland - Inverness 1867-1868"
-        },
-        {
-            "name": "OS Town Plans, Irvine 1859 (NLS)",
-            "type": "tms",
-            "description": "Detailed town plan of Irvine 1859, courtesy of National Library of Scotland.",
-            "template": "http://geo.nls.uk/maps/towns/irvine/{zoom}/{x}/{-y}.png",
-            "scaleExtent": [
-                13,
-                20
-            ],
-            "polygon": [
-                [
-                    [
-                        -4.67540402,
-                        55.60649957
-                    ],
-                    [
-                        -4.67643252,
-                        55.62159024
-                    ],
-                    [
-                        -4.65537888,
-                        55.62204812
-                    ],
-                    [
-                        -4.65435844,
-                        55.60695719
-                    ]
-                ]
-            ],
-            "terms_url": "http://maps.nls.uk/townplans/irvine.html",
-            "terms_text": "National Library of Scotland - Irvine 1859"
-        },
-        {
-            "name": "OS Town Plans, Jedburgh 1858 (NLS)",
-            "type": "tms",
-            "description": "Detailed town plan of Jedburgh 1858, courtesy of National Library of Scotland.",
-            "template": "http://geo.nls.uk/maps/towns/jedburgh/{zoom}/{x}/{-y}.png",
-            "scaleExtent": [
-                13,
-                20
-            ],
-            "polygon": [
-                [
-                    [
-                        -2.56332521,
-                        55.47105448
-                    ],
-                    [
-                        -2.56355503,
-                        55.48715562
-                    ],
-                    [
-                        -2.54168193,
-                        55.48725438
-                    ],
-                    [
-                        -2.54146103,
-                        55.47115318
-                    ]
-                ]
-            ],
-            "terms_url": "http://maps.nls.uk/townplans/jedburgh.html",
-            "terms_text": "National Library of Scotland - Jedburgh 1858"
-        },
-        {
-            "name": "OS Town Plans, Kelso 1857 (NLS)",
-            "type": "tms",
-            "description": "Detailed town plan of Kelso 1857, courtesy of National Library of Scotland.",
-            "template": "http://geo.nls.uk/maps/towns/kelso/{zoom}/{x}/{-y}.png",
-            "scaleExtent": [
-                13,
-                20
-            ],
-            "polygon": [
-                [
-                    [
-                        -2.44924544,
-                        55.58390848
-                    ],
-                    [
-                        -2.44949757,
-                        55.6059582
-                    ],
-                    [
-                        -2.41902085,
-                        55.60606617
-                    ],
-                    [
-                        -2.41878581,
-                        55.58401636
-                    ]
-                ]
-            ],
-            "terms_url": "http://maps.nls.uk/townplans/kelso.html",
-            "terms_text": "National Library of Scotland - Kelso 1857"
-        },
-        {
-            "name": "OS Town Plans, Kilmarnock 1857-1859 (NLS)",
-            "type": "tms",
-            "description": "Detailed town plan of Kilmarnock 1857-1859, courtesy of National Library of Scotland.",
-            "template": "http://geo.nls.uk/maps/towns/kilmarnock/{zoom}/{x}/{-y}.png",
-            "scaleExtent": [
-                13,
-                20
-            ],
-            "polygon": [
-                [
-                    [
-                        -4.51746876,
-                        55.58950933
-                    ],
-                    [
-                        -4.5194347,
-                        55.62017114
-                    ],
-                    [
-                        -4.47675652,
-                        55.62104083
-                    ],
-                    [
-                        -4.4748238,
-                        55.59037802
-                    ]
-                ]
-            ],
-            "terms_url": "http://maps.nls.uk/townplans/kilmarnock.html",
-            "terms_text": "National Library of Scotland - Kilmarnock 1857-1859"
-        },
-        {
-            "name": "OS Town Plans, Kirkcaldy 1855 (NLS)",
-            "type": "tms",
-            "description": "Detailed town plan of Kirkcaldy 1855, courtesy of National Library of Scotland.",
-            "template": "http://geo.nls.uk/maps/towns/kirkcaldy1855/{zoom}/{x}/{-y}.png",
-            "scaleExtent": [
-                13,
-                20
-            ],
-            "polygon": [
-                [
-                    [
-                        -3.17455285,
-                        56.09518942
-                    ],
-                    [
-                        -3.17554995,
-                        56.12790251
-                    ],
-                    [
-                        -3.12991402,
-                        56.12832843
-                    ],
-                    [
-                        -3.12895559,
-                        56.09561481
-                    ]
-                ]
-            ],
-            "terms_url": "http://maps.nls.uk/townplans/kirkcaldy_1.html",
-            "terms_text": "National Library of Scotland - Kirkcaldy 1855"
-        },
-        {
-            "name": "OS Town Plans, Kirkcaldy 1894 (NLS)",
-            "type": "tms",
-            "description": "Detailed town plan of Kirkcaldy 1894, courtesy of National Library of Scotland.",
-            "template": "http://geo.nls.uk/maps/towns/kirkcaldy1894/{zoom}/{x}/{-y}.png",
-            "scaleExtent": [
-                13,
-                20
-            ],
-            "polygon": [
-                [
-                    [
-                        -3.17460426,
-                        56.09513375
-                    ],
-                    [
-                        -3.17560428,
-                        56.12794116
-                    ],
-                    [
-                        -3.12989512,
-                        56.12836777
-                    ],
-                    [
-                        -3.12893395,
-                        56.09555983
-                    ]
-                ]
-            ],
-            "terms_url": "http://maps.nls.uk/townplans/kirkcaldy_2.html",
-            "terms_text": "National Library of Scotland - Kirkcaldy 1894"
-        },
-        {
-            "name": "OS Town Plans, Kirkcudbright 1850 (NLS)",
-            "type": "tms",
-            "description": "Detailed town plan of Kirkcudbright 1850, courtesy of National Library of Scotland.",
-            "template": "http://geo.nls.uk/maps/towns/kirkcudbright1850/{zoom}/{x}/{-y}.png",
-            "scaleExtent": [
-                13,
-                20
-            ],
-            "polygon": [
-                [
-                    [
-                        -4.06154334,
-                        54.82586314
-                    ],
-                    [
-                        -4.0623081,
-                        54.84086061
-                    ],
-                    [
-                        -4.0420219,
-                        54.84120364
-                    ],
-                    [
-                        -4.04126464,
-                        54.82620598
-                    ]
-                ]
-            ],
-            "terms_url": "http://maps.nls.uk/townplans/kirkcudbright_1.html",
-            "terms_text": "National Library of Scotland - Kirkcudbright 1850"
-        },
-        {
-            "name": "OS Town Plans, Kirkcudbright 1893 (NLS)",
-            "type": "tms",
-            "description": "Detailed town plan of Kirkcudbright 1893, courtesy of National Library of Scotland.",
-            "template": "http://geo.nls.uk/maps/towns/kirkcudbright1893/{zoom}/{x}/{-y}.png",
-            "scaleExtent": [
-                13,
-                20
-            ],
-            "polygon": [
-                [
-                    [
-                        -4.06001868,
-                        54.82720122
-                    ],
-                    [
-                        -4.06079036,
-                        54.84234455
-                    ],
-                    [
-                        -4.04025067,
-                        54.84269158
-                    ],
-                    [
-                        -4.03948667,
-                        54.82754805
-                    ]
-                ]
-            ],
-            "terms_url": "http://maps.nls.uk/townplans/kirkcudbright_2.html",
-            "terms_text": "National Library of Scotland - Kirkcudbright 1893"
-        },
-        {
-            "name": "OS Town Plans, Kirkintilloch 1859 (NLS)",
-            "type": "tms",
-            "description": "Detailed town plan of Kirkintilloch 1859, courtesy of National Library of Scotland.",
-            "template": "http://geo.nls.uk/maps/towns/kirkintilloch/{zoom}/{x}/{-y}.png",
-            "scaleExtent": [
-                13,
-                20
-            ],
-            "polygon": [
-                [
-                    [
-                        -4.16664222,
-                        55.93124287
-                    ],
-                    [
-                        -4.16748402,
-                        55.94631265
-                    ],
-                    [
-                        -4.14637318,
-                        55.94668235
-                    ],
-                    [
-                        -4.14553956,
-                        55.93161237
-                    ]
-                ]
-            ],
-            "terms_url": "http://maps.nls.uk/townplans/kirkintilloch.html",
-            "terms_text": "National Library of Scotland - Kirkintilloch 1859"
-        },
-        {
-            "name": "OS Town Plans, Kirriemuir 1861 (NLS)",
-            "type": "tms",
-            "description": "Detailed town plan of Kirriemuir 1861, courtesy of National Library of Scotland.",
-            "template": "http://geo.nls.uk/maps/towns/kirriemuir/{zoom}/{x}/{-y}.png",
-            "scaleExtent": [
-                13,
-                20
-            ],
-            "polygon": [
-                [
-                    [
-                        -3.01255744,
-                        56.65896044
-                    ],
-                    [
-                        -3.01302683,
-                        56.67645382
-                    ],
-                    [
-                        -2.98815879,
-                        56.67665366
-                    ],
-                    [
-                        -2.98770092,
-                        56.65916014
-                    ]
-                ]
-            ],
-            "terms_url": "http://maps.nls.uk/townplans/kirriemuir.html",
-            "terms_text": "National Library of Scotland - Kirriemuir 1861"
-        },
-        {
-            "name": "OS Town Plans, Lanark 1858 (NLS)",
-            "type": "tms",
-            "description": "Detailed town plan of Lanark 1858, courtesy of National Library of Scotland.",
-            "template": "http://geo.nls.uk/maps/towns/lanark/{zoom}/{x}/{-y}.png",
-            "scaleExtent": [
-                13,
-                20
-            ],
-            "polygon": [
-                [
-                    [
-                        -3.78642584,
-                        55.66308804
-                    ],
-                    [
-                        -3.78710605,
-                        55.67800854
-                    ],
-                    [
-                        -3.76632876,
-                        55.67830935
-                    ],
-                    [
-                        -3.76565645,
-                        55.66338868
-                    ]
-                ]
-            ],
-            "terms_url": "http://maps.nls.uk/townplans/lanark.html",
-            "terms_text": "National Library of Scotland - Lanark 1858"
-        },
-        {
-            "name": "OS Town Plans, Linlithgow 1856 (NLS)",
-            "type": "tms",
-            "description": "Detailed town plan of Linlithgow 1856, courtesy of National Library of Scotland.",
-            "template": "http://geo.nls.uk/maps/towns/linlithgow/{zoom}/{x}/{-y}.png",
-            "scaleExtent": [
-                13,
-                20
-            ],
-            "polygon": [
-                [
-                    [
-                        -3.61908334,
-                        55.95549561
-                    ],
-                    [
-                        -3.62033259,
-                        55.98538615
-                    ],
-                    [
-                        -3.57838447,
-                        55.98593047
-                    ],
-                    [
-                        -3.57716753,
-                        55.95603932
-                    ]
-                ]
-            ],
-            "terms_url": "http://maps.nls.uk/townplans/linlithgow.html",
-            "terms_text": "National Library of Scotland - Linlithgow 1856"
-        },
-        {
-            "name": "OS Town Plans, Mayole 1856-1857 (NLS)",
-            "type": "tms",
-            "description": "Detailed town plan of Mayole 1856-1857, courtesy of National Library of Scotland.",
-            "template": "http://geo.nls.uk/maps/towns/maybole/{zoom}/{x}/{-y}.png",
-            "scaleExtent": [
-                13,
-                20
-            ],
-            "polygon": [
-                [
-                    [
-                        -4.69086378,
-                        55.34340178
-                    ],
-                    [
-                        -4.6918884,
-                        55.35849731
-                    ],
-                    [
-                        -4.67089656,
-                        55.35895813
-                    ],
-                    [
-                        -4.6698799,
-                        55.34386234
-                    ]
-                ]
-            ],
-            "terms_url": "http://maps.nls.uk/townplans/maybole.html",
-            "terms_text": "National Library of Scotland - Mayole 1856-1857"
-        },
-        {
-            "name": "OS Town Plans, Montrose 1861-1862 (NLS)",
-            "type": "tms",
-            "description": "Detailed town plan of Montrose 1861-1862, courtesy of National Library of Scotland.",
-            "template": "http://geo.nls.uk/maps/towns/montrose/{zoom}/{x}/{-y}.png",
-            "scaleExtent": [
-                13,
-                20
-            ],
-            "polygon": [
-                [
-                    [
-                        -2.4859324,
-                        56.69645192
-                    ],
-                    [
-                        -2.4862257,
-                        56.71918799
-                    ],
-                    [
-                        -2.45405417,
-                        56.71930941
-                    ],
-                    [
-                        -2.45378027,
-                        56.69657324
-                    ]
-                ]
-            ],
-            "terms_url": "http://maps.nls.uk/townplans/montrose.html",
-            "terms_text": "National Library of Scotland - Montrose 1861-1862"
-        },
-        {
-            "name": "OS Town Plans, Musselburgh 1853 (NLS)",
-            "type": "tms",
-            "description": "Detailed town plan of Musselburgh 1853, courtesy of National Library of Scotland.",
-            "template": "http://geo.nls.uk/maps/towns/musselburgh1853/{zoom}/{x}/{-y}.png",
-            "scaleExtent": [
-                13,
-                20
-            ],
-            "polygon": [
-                [
-                    [
-                        -3.07888558,
-                        55.93371953
-                    ],
-                    [
-                        -3.07954151,
-                        55.95729781
-                    ],
-                    [
-                        -3.03240684,
-                        55.95770177
-                    ],
-                    [
-                        -3.03177952,
-                        55.93412313
-                    ]
-                ]
-            ],
-            "terms_url": "http://maps.nls.uk/townplans/musselburgh_1.html",
-            "terms_text": "National Library of Scotland - Musselburgh 1853"
-        },
-        {
-            "name": "OS Town Plans, Musselburgh 1893 (NLS)",
-            "type": "tms",
-            "description": "Detailed town plan of Musselburgh 1893, courtesy of National Library of Scotland.",
-            "template": "http://geo.nls.uk/maps/towns/musselburgh1893/{zoom}/{x}/{-y}.png",
-            "scaleExtent": [
-                13,
-                20
-            ],
-            "polygon": [
-                [
-                    [
-                        -3.07017621,
-                        55.92694102
-                    ],
-                    [
-                        -3.07078961,
-                        55.94917624
-                    ],
-                    [
-                        -3.03988228,
-                        55.94944099
-                    ],
-                    [
-                        -3.03928658,
-                        55.92720556
-                    ]
-                ]
-            ],
-            "terms_url": "http://maps.nls.uk/townplans/musselburgh_2.html",
-            "terms_text": "National Library of Scotland - Musselburgh 1893"
-        },
-        {
-            "name": "OS Town Plans, Nairn 1867-1868 (NLS)",
-            "type": "tms",
-            "description": "Detailed town plan of Nairn 1867-1868, courtesy of National Library of Scotland.",
-            "template": "http://geo.nls.uk/maps/towns/nairn/{zoom}/{x}/{-y}.png",
-            "scaleExtent": [
-                13,
-                20
-            ],
-            "polygon": [
-                [
-                    [
-                        -3.88433907,
-                        57.57899149
-                    ],
-                    [
-                        -3.88509905,
-                        57.5936822
-                    ],
-                    [
-                        -3.85931017,
-                        57.59406441
-                    ],
-                    [
-                        -3.85856057,
-                        57.57937348
-                    ]
-                ]
-            ],
-            "terms_url": "http://maps.nls.uk/townplans/nairn.html",
-            "terms_text": "National Library of Scotland - Nairn 1867-1868"
-        },
-        {
-            "name": "OS Town Plans, Oban 1867-1868 (NLS)",
-            "type": "tms",
-            "description": "Detailed town plan of Oban 1867-1868, courtesy of National Library of Scotland.",
-            "template": "http://geo.nls.uk/maps/towns/oban/{zoom}/{x}/{-y}.png",
-            "scaleExtent": [
-                13,
-                20
-            ],
-            "polygon": [
-                [
-                    [
-                        -5.49548449,
-                        56.39080407
-                    ],
-                    [
-                        -5.49836627,
-                        56.42219039
-                    ],
-                    [
-                        -5.45383984,
-                        56.42343933
-                    ],
-                    [
-                        -5.45099456,
-                        56.39205153
-                    ]
-                ]
-            ],
-            "terms_url": "http://maps.nls.uk/townplans/oban.html",
-            "terms_text": "National Library of Scotland - Oban 1867-1868"
-        },
-        {
-            "name": "OS Town Plans, Peebles 1856 (NLS)",
-            "type": "tms",
-            "description": "Detailed town plan of Peebles 1856, courtesy of National Library of Scotland.",
-            "template": "http://geo.nls.uk/maps/towns/peebles/{zoom}/{x}/{-y}.png",
-            "scaleExtent": [
-                13,
-                20
-            ],
-            "polygon": [
-                [
-                    [
-                        -3.20921287,
-                        55.63635834
-                    ],
-                    [
-                        -3.20990288,
-                        55.65873817
-                    ],
-                    [
-                        -3.17896372,
-                        55.65903935
-                    ],
-                    [
-                        -3.17829135,
-                        55.63665927
-                    ]
-                ]
-            ],
-            "terms_url": "http://maps.nls.uk/townplans/peebles.html",
-            "terms_text": "National Library of Scotland - Peebles 1856"
-        },
-        {
-            "name": "OS Town Plans, Perth 1860 (NLS)",
-            "type": "tms",
-            "description": "Detailed town plan of Perth 1860, courtesy of National Library of Scotland.",
-            "template": "http://geo.nls.uk/maps/towns/perth/{zoom}/{x}/{-y}.png",
-            "scaleExtent": [
-                13,
-                20
-            ],
-            "polygon": [
-                [
-                    [
-                        -3.45302495,
-                        56.37794226
-                    ],
-                    [
-                        -3.45416664,
-                        56.40789908
-                    ],
-                    [
-                        -3.41187528,
-                        56.40838777
-                    ],
-                    [
-                        -3.41076676,
-                        56.3784304
-                    ]
-                ]
-            ],
-            "terms_url": "http://maps.nls.uk/townplans/perth.html",
-            "terms_text": "National Library of Scotland - Perth 1860"
-        },
-        {
-            "name": "OS Town Plans, Peterhead 1868 (NLS)",
-            "type": "tms",
-            "description": "Detailed town plan of Peterhead 1868, courtesy of National Library of Scotland.",
-            "template": "http://geo.nls.uk/maps/towns/peterhead/{zoom}/{x}/{-y}.png",
-            "scaleExtent": [
-                13,
-                20
-            ],
-            "polygon": [
-                [
-                    [
-                        -1.80513747,
-                        57.48046916
-                    ],
-                    [
-                        -1.80494005,
-                        57.51755411
-                    ],
-                    [
-                        -1.75135366,
-                        57.51746003
-                    ],
-                    [
-                        -1.75160539,
-                        57.48037522
-                    ]
-                ]
-            ],
-            "terms_url": "http://maps.nls.uk/townplans/peterhead",
-            "terms_text": "National Library of Scotland - Peterhead 1868"
-        },
-        {
-            "name": "OS Town Plans, Port Glasgow 1856-1857 (NLS)",
-            "type": "tms",
-            "description": "Detailed town plan of Port Glasgow 1856-1857, courtesy of National Library of Scotland.",
-            "template": "http://geo.nls.uk/maps/towns/portglasgow/{zoom}/{x}/{-y}.png",
-            "scaleExtent": [
-                13,
-                20
-            ],
-            "polygon": [
-                [
-                    [
-                        -4.70063209,
-                        55.91995983
-                    ],
-                    [
-                        -4.70222026,
-                        55.9427679
-                    ],
-                    [
-                        -4.67084958,
-                        55.94345237
-                    ],
-                    [
-                        -4.6692798,
-                        55.92064372
-                    ]
-                ]
-            ],
-            "terms_url": "http://maps.nls.uk/townplans/port-glasgow.html",
-            "terms_text": "National Library of Scotland - Port Glasgow 1856-1857"
-        },
-        {
-            "name": "OS Town Plans, Portobello 1893-1894 (NLS)",
-            "type": "tms",
-            "description": "Detailed town plan of Portobello 1893-1894, courtesy of National Library of Scotland.",
-            "template": "http://geo.nls.uk/maps/towns/portobello/{zoom}/{x}/{-y}.png",
-            "scaleExtent": [
-                13,
-                20
-            ],
-            "polygon": [
-                [
-                    [
-                        -3.12437919,
-                        55.93846889
-                    ],
-                    [
-                        -3.1250234,
-                        55.96068605
-                    ],
-                    [
-                        -3.09394827,
-                        55.96096586
-                    ],
-                    [
-                        -3.09332184,
-                        55.93874847
-                    ]
-                ]
-            ],
-            "terms_url": "http://maps.nls.uk/townplans/portobello.html",
-            "terms_text": "National Library of Scotland - Portobello 1893-1894"
-        },
-        {
-            "name": "OS Town Plans, Rothesay 1862-1863 (NLS)",
-            "type": "tms",
-            "description": "Detailed town plan of Rothesay 1862-1863, courtesy of National Library of Scotland.",
-            "template": "http://geo.nls.uk/maps/towns/rothesay/{zoom}/{x}/{-y}.png",
-            "scaleExtent": [
-                13,
-                20
-            ],
-            "polygon": [
-                [
-                    [
-                        -5.06449893,
-                        55.82864114
-                    ],
-                    [
-                        -5.06569719,
-                        55.84385927
-                    ],
-                    [
-                        -5.04413114,
-                        55.84439519
-                    ],
-                    [
-                        -5.04294127,
-                        55.82917676
-                    ]
-                ]
-            ],
-            "terms_url": "http://maps.nls.uk/townplans/rothesay.html",
-            "terms_text": "National Library of Scotland - Rothesay 1862-1863"
-        },
-        {
-            "name": "OS Town Plans, Selkirk 1865 (NLS)",
-            "type": "tms",
-            "description": "Detailed town plan of Selkirk 1865, courtesy of National Library of Scotland.",
-            "template": "http://geo.nls.uk/maps/towns/selkirk/{zoom}/{x}/{-y}.png",
-            "scaleExtent": [
-                13,
-                20
-            ],
-            "polygon": [
-                [
-                    [
-                        -2.85998582,
-                        55.53499576
-                    ],
-                    [
-                        -2.86063259,
-                        55.56459732
-                    ],
-                    [
-                        -2.82003242,
-                        55.56487574
-                    ],
-                    [
-                        -2.81941615,
-                        55.53527387
-                    ]
-                ]
-            ],
-            "terms_url": "http://maps.nls.uk/townplans/selkirk.html",
-            "terms_text": "National Library of Scotland - Selkirk 1865"
-        },
-        {
-            "name": "OS Town Plans, St Andrews 1854 (NLS)",
-            "type": "tms",
-            "description": "Detailed town plan of St Andrews 1854, courtesy of National Library of Scotland.",
-            "template": "http://geo.nls.uk/maps/towns/standrews1854/{zoom}/{x}/{-y}.png",
-            "scaleExtent": [
-                13,
-                20
-            ],
-            "polygon": [
-                [
-                    [
-                        -2.81342686,
-                        56.32097352
-                    ],
-                    [
-                        -2.81405804,
-                        56.3506222
-                    ],
-                    [
-                        -2.77243712,
-                        56.35088865
-                    ],
-                    [
-                        -2.77183819,
-                        56.32123967
-                    ]
-                ]
-            ],
-            "terms_url": "http://maps.nls.uk/townplans/st-andrews_1.html",
-            "terms_text": "National Library of Scotland - St Andrews 1854"
-        },
-        {
-            "name": "OS Town Plans, St Andrews 1893 (NLS)",
-            "type": "tms",
-            "description": "Detailed town plan of St Andrews 1893, courtesy of National Library of Scotland.",
-            "template": "http://geo.nls.uk/maps/towns/standrews1893/{zoom}/{x}/{-y}.png",
-            "scaleExtent": [
-                13,
-                20
-            ],
-            "polygon": [
-                [
-                    [
-                        -2.81545583,
-                        56.31861733
-                    ],
-                    [
-                        -2.81609919,
-                        56.3487653
-                    ],
-                    [
-                        -2.77387785,
-                        56.34903619
-                    ],
-                    [
-                        -2.77326775,
-                        56.31888792
-                    ]
-                ]
-            ],
-            "terms_url": "http://maps.nls.uk/townplans/st-andrews_2.html",
-            "terms_text": "National Library of Scotland - St Andrews 1893"
-        },
-        {
-            "name": "OS Town Plans, Stirling 1858 (NLS)",
-            "type": "tms",
-            "description": "Detailed town plan of Stirling 1858, courtesy of National Library of Scotland.",
-            "template": "http://geo.nls.uk/maps/towns/stirling/{zoom}/{x}/{-y}.png",
-            "scaleExtent": [
-                13,
-                20
-            ],
-            "polygon": [
-                [
-                    [
-                        -3.95768489,
-                        56.10754239
-                    ],
-                    [
-                        -3.95882978,
-                        56.13007142
-                    ],
-                    [
-                        -3.92711024,
-                        56.13057046
-                    ],
-                    [
-                        -3.92598386,
-                        56.10804101
-                    ]
-                ]
-            ],
-            "terms_url": "http://maps.nls.uk/townplans/stirling.html",
-            "terms_text": "National Library of Scotland - Stirling 1858"
-        },
-        {
-            "name": "OS Town Plans, Stonehaven 1864 (NLS)",
-            "type": "tms",
-            "description": "Detailed town plan of Stonehaven 1864, courtesy of National Library of Scotland.",
-            "template": "http://geo.nls.uk/maps/towns/stonehaven/{zoom}/{x}/{-y}.png",
-            "scaleExtent": [
-                13,
-                20
-            ],
-            "polygon": [
-                [
-                    [
-                        -2.220167,
-                        56.9565098
-                    ],
-                    [
-                        -2.2202543,
-                        56.97129283
-                    ],
-                    [
-                        -2.19924399,
-                        56.9713281
-                    ],
-                    [
-                        -2.19916501,
-                        56.95654504
-                    ]
-                ]
-            ],
-            "terms_url": "http://maps.nls.uk/townplans/stonehaven.html",
-            "terms_text": "National Library of Scotland - Stonehaven 1864"
-        },
-        {
-            "name": "OS Town Plans, Stranraer 1847 (NLS)",
-            "type": "tms",
-            "description": "Detailed town plan of Stranraer 1847, courtesy of National Library of Scotland.",
-            "template": "http://geo.nls.uk/maps/towns/stranraer1847/{zoom}/{x}/{-y}.png",
-            "scaleExtent": [
-                13,
-                20
-            ],
-            "polygon": [
-                [
-                    [
-                        -5.04859743,
-                        54.8822997
-                    ],
-                    [
-                        -5.0508954,
-                        54.91268061
-                    ],
-                    [
-                        -5.0095373,
-                        54.91371278
-                    ],
-                    [
-                        -5.00727037,
-                        54.88333071
-                    ]
-                ]
-            ],
-            "terms_url": "http://maps.nls.uk/townplans/stranraer_1.html",
-            "terms_text": "National Library of Scotland - Stranraer 1847"
-        },
-        {
-            "name": "OS Town Plans, Stranraer 1863-1877 (NLS)",
-            "type": "tms",
-            "description": "Detailed town plan of Stranraer 1863-1877, courtesy of National Library of Scotland.",
-            "template": "http://geo.nls.uk/maps/towns/stranraer1867/{zoom}/{x}/{-y}.png",
-            "scaleExtent": [
-                13,
-                20
-            ],
-            "polygon": [
-                [
-                    [
-                        -5.04877289,
-                        54.88228699
-                    ],
-                    [
-                        -5.05107324,
-                        54.9126976
-                    ],
-                    [
-                        -5.00947337,
-                        54.91373582
-                    ],
-                    [
-                        -5.00720427,
-                        54.88332405
-                    ]
-                ]
-            ],
-            "terms_url": "http://maps.nls.uk/townplans/stranraer_1a.html",
-            "terms_text": "National Library of Scotland - Stranraer 1863-1877"
-        },
-        {
-            "name": "OS Town Plans, Stranraer 1893 (NLS)",
-            "type": "tms",
-            "description": "Detailed town plan of Stranraer 1893, courtesy of National Library of Scotland.",
-            "template": "http://geo.nls.uk/maps/towns/stranraer1893/{zoom}/{x}/{-y}.png",
-            "scaleExtent": [
-                13,
-                20
-            ],
-            "polygon": [
-                [
-                    [
-                        -5.04418424,
-                        54.89773858
-                    ],
-                    [
-                        -5.04511026,
-                        54.90999885
-                    ],
-                    [
-                        -5.0140499,
-                        54.91077389
-                    ],
-                    [
-                        -5.0131333,
-                        54.89851327
-                    ]
-                ]
-            ],
-            "terms_url": "http://maps.nls.uk/townplans/stranraer_2.html",
-            "terms_text": "National Library of Scotland - Stranraer 1893"
-        },
-        {
-            "name": "OS Town Plans, Strathaven 1858 (NLS)",
-            "type": "tms",
-            "description": "Detailed town plan of Strathaven 1858, courtesy of National Library of Scotland.",
-            "template": "http://geo.nls.uk/maps/towns/strathaven/{zoom}/{x}/{-y}.png",
-            "scaleExtent": [
-                13,
-                20
-            ],
-            "polygon": [
-                [
-                    [
-                        -4.06914872,
-                        55.67242091
-                    ],
-                    [
-                        -4.06954357,
-                        55.67989707
-                    ],
-                    [
-                        -4.05917487,
-                        55.6800715
-                    ],
-                    [
-                        -4.05878199,
-                        55.67259529
-                    ]
-                ]
-            ],
-            "terms_url": "http://maps.nls.uk/townplans/strathaven.html",
-            "terms_text": "National Library of Scotland - Strathaven 1858"
-        },
-        {
-            "name": "OS Town Plans, Wick 1872 (NLS)",
-            "type": "tms",
-            "description": "Detailed town plan of Wick 1872, courtesy of National Library of Scotland.",
-            "template": "http://geo.nls.uk/maps/towns/wick/{zoom}/{x}/{-y}.png",
-            "scaleExtent": [
-                13,
-                20
-            ],
-            "polygon": [
-                [
-                    [
-                        -3.11470001,
-                        58.41344839
-                    ],
-                    [
-                        -3.11588837,
-                        58.45101446
-                    ],
-                    [
-                        -3.05949843,
-                        58.45149284
-                    ],
-                    [
-                        -3.05837008,
-                        58.41392606
-                    ]
-                ]
-            ],
-            "terms_url": "http://maps.nls.uk/townplans/wick.html",
-            "terms_text": "National Library of Scotland - Wick 1872"
-        },
-        {
-            "name": "OS Town Plans, Wigtown 1848 (NLS)",
-            "type": "tms",
-            "description": "Detailed town plan of Wigtown 1848, courtesy of National Library of Scotland.",
-            "template": "http://geo.nls.uk/maps/towns/wigtown1848/{zoom}/{x}/{-y}.png",
-            "scaleExtent": [
-                13,
-                20
-            ],
-            "polygon": [
-                [
-                    [
-                        -4.45235587,
-                        54.8572296
-                    ],
-                    [
-                        -4.45327284,
-                        54.87232603
-                    ],
-                    [
-                        -4.43254469,
-                        54.87274317
-                    ],
-                    [
-                        -4.43163545,
-                        54.85764651
-                    ]
-                ]
-            ],
-            "terms_url": "http://maps.nls.uk/townplans/wigtown_1.html",
-            "terms_text": "National Library of Scotland - Wigtown 1848"
-        },
-        {
-            "name": "OS Town Plans, Wigtown 1894 (NLS)",
-            "type": "tms",
-            "description": "Detailed town plan of Wigtown 1894, courtesy of National Library of Scotland.",
-            "template": "http://geo.nls.uk/maps/towns/wigtown1894/{zoom}/{x}/{-y}.png",
-            "scaleExtent": [
-                13,
-                20
-            ],
-            "polygon": [
-                [
-                    [
-                        -4.45233361,
-                        54.85721131
-                    ],
-                    [
-                        -4.45325423,
-                        54.87236807
-                    ],
-                    [
-                        -4.43257837,
-                        54.87278416
-                    ],
-                    [
-                        -4.43166549,
-                        54.85762716
-                    ]
-                ]
-            ],
-            "terms_url": "http://maps.nls.uk/townplans/wigtown_2.html",
-            "terms_text": "National Library of Scotland - Wigtown 1894"
-        },
-        {
-            "name": "OpenPT Map (overlay)",
-            "type": "tms",
-            "template": "http://openptmap.de/tiles/{zoom}/{x}/{y}.png",
-            "scaleExtent": [
-                5,
-                16
-            ],
-            "polygon": [
-                [
-                    [
-                        6.4901072,
-                        53.665658
-                    ],
-                    [
-                        8.5665347,
-                        53.9848257
-                    ],
-                    [
-                        8.1339457,
-                        54.709715
-                    ],
-                    [
-                        8.317796,
-                        55.0952362
-                    ],
-                    [
-                        10.1887438,
-                        54.7783834
-                    ],
-                    [
-                        10.6321475,
-                        54.4778841
-                    ],
-                    [
-                        11.2702164,
-                        54.6221504
-                    ],
-                    [
-                        11.681176,
-                        54.3709243
-                    ],
-                    [
-                        12.0272473,
-                        54.3898199
-                    ],
-                    [
-                        13.3250145,
-                        54.8531617
-                    ],
-                    [
-                        13.9198245,
-                        54.6972173
-                    ],
-                    [
-                        14.2118221,
-                        54.1308273
-                    ],
-                    [
-                        14.493005,
-                        53.2665063
-                    ],
-                    [
-                        14.1577485,
-                        52.8766495
-                    ],
-                    [
-                        14.7525584,
-                        52.5819369
-                    ],
-                    [
-                        15.0986297,
-                        51.0171541
-                    ],
-                    [
-                        14.9364088,
-                        50.8399279
-                    ],
-                    [
-                        14.730929,
-                        50.7920977
-                    ],
-                    [
-                        14.4389313,
-                        50.8808862
-                    ],
-                    [
-                        12.9573138,
-                        50.3939044
-                    ],
-                    [
-                        12.51391,
-                        50.3939044
-                    ],
-                    [
-                        12.3084302,
-                        50.1173237
-                    ],
-                    [
-                        12.6112425,
-                        49.9088337
-                    ],
-                    [
-                        12.394948,
-                        49.7344006
-                    ],
-                    [
-                        12.7734634,
-                        49.4047626
-                    ],
-                    [
-                        14.1469337,
-                        48.6031036
-                    ],
-                    [
-                        14.6768553,
-                        48.6531391
-                    ],
-                    [
-                        15.0661855,
-                        49.0445497
-                    ],
-                    [
-                        16.2666202,
-                        48.7459305
-                    ],
-                    [
-                        16.4937294,
-                        48.8741286
-                    ],
-                    [
-                        16.904689,
-                        48.7173975
-                    ],
-                    [
-                        16.9371332,
-                        48.5315383
-                    ],
-                    [
-                        16.8384693,
-                        48.3823161
-                    ],
-                    [
-                        17.2017097,
-                        48.010204
-                    ],
-                    [
-                        17.1214145,
-                        47.6997605
-                    ],
-                    [
-                        16.777292,
-                        47.6585709
-                    ],
-                    [
-                        16.6090543,
-                        47.7460598
-                    ],
-                    [
-                        16.410228,
-                        47.6637214
-                    ],
-                    [
-                        16.7352326,
-                        47.6147714
-                    ],
-                    [
-                        16.5555242,
-                        47.3589738
-                    ],
-                    [
-                        16.4790525,
-                        46.9768539
-                    ],
-                    [
-                        16.0355168,
-                        46.8096295
-                    ],
-                    [
-                        16.0508112,
-                        46.6366332
-                    ],
-                    [
-                        14.9572663,
-                        46.6313822
-                    ],
-                    [
-                        14.574908,
-                        46.3892866
-                    ],
-                    [
-                        12.3954655,
-                        46.6891149
-                    ],
-                    [
-                        12.1507562,
-                        47.0550608
-                    ],
-                    [
-                        11.1183887,
-                        46.9142058
-                    ],
-                    [
-                        11.0342699,
-                        46.7729797
-                    ],
-                    [
-                        10.4836739,
-                        46.8462544
-                    ],
-                    [
-                        10.4607324,
-                        46.5472973
-                    ],
-                    [
-                        10.1013156,
-                        46.5735879
-                    ],
-                    [
-                        10.2007287,
-                        46.1831867
-                    ],
-                    [
-                        9.8948421,
-                        46.3629068
-                    ],
-                    [
-                        9.5966026,
-                        46.2889758
-                    ],
-                    [
-                        9.2983631,
-                        46.505206
-                    ],
-                    [
-                        9.2830687,
-                        46.2572605
-                    ],
-                    [
-                        9.0536537,
-                        45.7953255
-                    ],
-                    [
-                        8.4265861,
-                        46.2466846
-                    ],
-                    [
-                        8.4418804,
-                        46.4736161
-                    ],
-                    [
-                        7.8759901,
-                        45.9284607
-                    ],
-                    [
-                        7.0959791,
-                        45.8645956
-                    ],
-                    [
-                        6.7747981,
-                        46.1620044
-                    ],
-                    [
-                        6.8206811,
-                        46.4051083
-                    ],
-                    [
-                        6.5453831,
-                        46.4578142
-                    ],
-                    [
-                        6.3312624,
-                        46.3840116
-                    ],
-                    [
-                        6.3847926,
-                        46.2466846
-                    ],
-                    [
-                        5.8953739,
-                        46.0878021
-                    ],
-                    [
-                        6.1171418,
-                        46.3681838
-                    ],
-                    [
-                        6.0942003,
-                        46.5998657
-                    ],
-                    [
-                        6.4383228,
-                        46.7782169
-                    ],
-                    [
-                        6.4306756,
-                        46.9298747
-                    ],
-                    [
-                        7.0806847,
-                        47.3460216
-                    ],
-                    [
-                        6.8436226,
-                        47.3719227
-                    ],
-                    [
-                        6.9965659,
-                        47.5012373
-                    ],
-                    [
-                        7.1800979,
-                        47.5064033
-                    ],
-                    [
-                        7.2336281,
-                        47.439206
-                    ],
-                    [
-                        7.4553959,
-                        47.4805683
-                    ],
-                    [
-                        7.7842241,
-                        48.645735
-                    ],
-                    [
-                        8.1971711,
-                        49.0282701
-                    ],
-                    [
-                        7.6006921,
-                        49.0382974
-                    ],
-                    [
-                        7.4477487,
-                        49.1634679
-                    ],
-                    [
-                        7.2030394,
-                        49.1034255
-                    ],
-                    [
-                        6.6677378,
-                        49.1634679
-                    ],
-                    [
-                        6.6371491,
-                        49.3331933
-                    ],
-                    [
-                        6.3542039,
-                        49.4576194
-                    ],
-                    [
-                        6.5453831,
-                        49.8043366
-                    ],
-                    [
-                        6.2471436,
-                        49.873384
-                    ],
-                    [
-                        6.0789059,
-                        50.1534883
-                    ],
-                    [
-                        6.3618511,
-                        50.3685934
-                    ],
-                    [
-                        6.0865531,
-                        50.7039632
-                    ],
-                    [
-                        5.8800796,
-                        51.0513752
-                    ],
-                    [
-                        6.1247889,
-                        51.1618085
-                    ],
-                    [
-                        6.1936134,
-                        51.491527
-                    ],
-                    [
-                        5.9641984,
-                        51.7526501
-                    ],
-                    [
-                        6.0253758,
-                        51.8897286
-                    ],
-                    [
-                        6.4536171,
-                        51.8661241
-                    ],
-                    [
-                        6.8436226,
-                        51.9557552
-                    ],
-                    [
-                        6.6906793,
-                        52.0499105
-                    ],
-                    [
-                        7.0042131,
-                        52.2282603
-                    ],
-                    [
-                        7.0195074,
-                        52.4525245
-                    ],
-                    [
-                        6.6983264,
-                        52.4665032
-                    ],
-                    [
-                        6.6906793,
-                        52.6524628
-                    ],
-                    [
-                        7.0348017,
-                        52.6385432
-                    ],
-                    [
-                        7.0730376,
-                        52.8330151
-                    ],
-                    [
-                        7.2183337,
-                        52.9852064
-                    ],
-                    [
-                        7.1953922,
-                        53.3428087
-                    ],
-                    [
-                        7.0042131,
-                        53.3291098
-                    ]
-                ]
-            ],
-            "terms_url": "http://openstreetmap.org/",
-            "terms_text": "© OpenStreetMap contributors, CC-BY-SA"
-        },
-        {
-            "name": "OpenStreetMap (Mapnik)",
-            "type": "tms",
-            "description": "The default OpenStreetMap layer.",
-            "template": "http://{switch:a,b,c}.tile.openstreetmap.org/{zoom}/{x}/{y}.png",
-            "scaleExtent": [
-                0,
-                19
-            ],
-            "terms_url": "http://openstreetmap.org/",
-            "terms_text": "© OpenStreetMap contributors, CC-BY-SA",
-            "id": "MAPNIK",
-            "default": true
-        },
-        {
-            "name": "OpenStreetMap GPS traces",
-            "type": "tms",
-            "description": "Public GPS traces uploaded to OpenStreetMap.",
-            "template": "http://{switch:a,b,c}.gps-tile.openstreetmap.org/lines/{zoom}/{x}/{y}.png",
-            "scaleExtent": [
-                0,
-                20
-            ],
-            "terms_url": "http://www.openstreetmap.org/copyright",
-            "terms_text": "© OpenStreetMap contributors",
-            "terms_html": "© <a href='http://www.openstreetmap.org/copyright'>OpenStreetMap contributors</a>. North: <span style='display: inline-block; width: 10px; height: 10px; background-color: #7fed11;'></span> South: <span style='display: inline-block; width: 10px; height: 10px; background-color: #7f11ed;'></span> East: <span style='display: inline-block; width: 10px; height: 10px; background-color: #ff3f3f;'></span> West: <span style='display: inline-block; width: 10px; height: 10px; background-color: #00bfbf;'></span>",
-            "overlay": true
-        },
-        {
-            "name": "Pangasinán/Bulacan (Phillipines HiRes)",
-            "type": "tms",
-            "template": "http://gravitystorm.dev.openstreetmap.org/imagery/philippines/{zoom}/{x}/{y}.png",
-            "scaleExtent": [
-                12,
-                19
-            ],
-            "polygon": [
-                [
-                    [
-                        120.336593,
-                        15.985768
-                    ],
-                    [
-                        120.445995,
-                        15.984
-                    ],
-                    [
-                        120.446134,
-                        15.974459
-                    ],
-                    [
-                        120.476464,
-                        15.974592
-                    ],
-                    [
-                        120.594247,
-                        15.946832
-                    ],
-                    [
-                        120.598064,
-                        16.090795
-                    ],
-                    [
-                        120.596537,
-                        16.197999
-                    ],
-                    [
-                        120.368537,
-                        16.218527
-                    ],
-                    [
-                        120.347576,
-                        16.042308
-                    ],
-                    [
-                        120.336593,
-                        15.985768
-                    ]
-                ],
-                [
-                    [
-                        120.8268,
-                        15.3658
-                    ],
-                    [
-                        121.2684,
-                        15.2602
-                    ],
-                    [
-                        121.2699,
-                        14.7025
-                    ],
-                    [
-                        120.695,
-                        14.8423
-                    ]
-                ]
-            ]
-        },
-        {
-            "name": "Slovakia EEA CORINE 2006",
-            "type": "tms",
-            "template": "http://www.freemap.sk/tms/clc/{zoom}/{x}/{y}.png",
-            "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_url": "http://www.eea.europa.eu/data-and-maps/data/clc-2006-vector-data-version-1",
-            "terms_text": "EEA Corine 2006"
-        },
-        {
-            "name": "Slovakia EEA GMES Urban Atlas",
-            "type": "tms",
-            "template": "http://www.freemap.sk/tms/urbanatlas/{zoom}/{x}/{y}.png",
-            "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_url": "http://www.eea.europa.eu/data-and-maps/data/urban-atlas",
-            "terms_text": "EEA GMES Urban Atlas"
-        },
-        {
-            "name": "Slovakia Historic Maps",
-            "type": "tms",
-            "template": "http://tms.freemap.sk/historicke/{zoom}/{x}/{y}.png",
-            "scaleExtent": [
-                0,
-                12
-            ],
-            "polygon": [
-                [
-                    [
-                        16.8196949,
-                        47.4927236
-                    ],
-                    [
-                        16.8196949,
-                        49.5030322
-                    ],
-                    [
-                        22.8388318,
-                        49.5030322
-                    ],
-                    [
-                        22.8388318,
-                        47.4927236
-                    ],
-                    [
-                        16.8196949,
-                        47.4927236
-                    ]
-                ]
-            ]
-        },
-        {
-            "name": "South Africa CD:NGI Aerial",
-            "type": "tms",
-            "template": "http://{switch:a,b,c}.aerial.openstreetmap.org.za/ngi-aerial/{zoom}/{x}/{y}.jpg",
-            "scaleExtent": [
-                1,
-                22
-            ],
-            "polygon": [
-                [
-                    [
-                        17.8396817,
-                        -32.7983384
-                    ],
-                    [
-                        17.8893509,
-                        -32.6972835
-                    ],
-                    [
-                        18.00364,
-                        -32.6982187
-                    ],
-                    [
-                        18.0991679,
-                        -32.7485251
-                    ],
-                    [
-                        18.2898747,
-                        -32.5526645
-                    ],
-                    [
-                        18.2930182,
-                        -32.0487089
-                    ],
-                    [
-                        18.105455,
-                        -31.6454966
-                    ],
-                    [
-                        17.8529257,
-                        -31.3443951
-                    ],
-                    [
-                        17.5480046,
-                        -30.902171
-                    ],
-                    [
-                        17.4044506,
-                        -30.6374731
-                    ],
-                    [
-                        17.2493704,
-                        -30.3991663
-                    ],
-                    [
-                        16.9936977,
-                        -29.6543552
-                    ],
-                    [
-                        16.7987996,
-                        -29.19437
-                    ],
-                    [
-                        16.5494139,
-                        -28.8415949
-                    ],
-                    [
-                        16.4498691,
-                        -28.691876
-                    ],
-                    [
-                        16.4491046,
-                        -28.5515766
-                    ],
-                    [
-                        16.6002551,
-                        -28.4825663
-                    ],
-                    [
-                        16.7514057,
-                        -28.4486958
-                    ],
-                    [
-                        16.7462192,
-                        -28.2458973
-                    ],
-                    [
-                        16.8855148,
-                        -28.04729
-                    ],
-                    [
-                        16.9929502,
-                        -28.0244005
-                    ],
-                    [
-                        17.0529659,
-                        -28.0257086
-                    ],
-                    [
-                        17.1007562,
-                        -28.0338839
-                    ],
-                    [
-                        17.2011527,
-                        -28.0930546
-                    ],
-                    [
-                        17.2026346,
-                        -28.2328424
-                    ],
-                    [
-                        17.2474611,
-                        -28.2338215
-                    ],
-                    [
-                        17.2507953,
-                        -28.198892
-                    ],
-                    [
-                        17.3511919,
-                        -28.1975861
-                    ],
-                    [
-                        17.3515624,
-                        -28.2442655
-                    ],
-                    [
-                        17.4015754,
-                        -28.2452446
-                    ],
-                    [
-                        17.4149122,
-                        -28.3489751
-                    ],
-                    [
-                        17.4008345,
-                        -28.547997
-                    ],
-                    [
-                        17.4526999,
-                        -28.5489733
-                    ],
-                    [
-                        17.4512071,
-                        -28.6495106
-                    ],
-                    [
-                        17.4983599,
-                        -28.6872054
-                    ],
-                    [
-                        17.6028204,
-                        -28.6830048
-                    ],
-                    [
-                        17.6499732,
-                        -28.6967928
-                    ],
-                    [
-                        17.6525928,
-                        -28.7381457
-                    ],
-                    [
-                        17.801386,
-                        -28.7381457
-                    ],
-                    [
-                        17.9994276,
-                        -28.7560602
-                    ],
-                    [
-                        18.0002748,
-                        -28.7956172
-                    ],
-                    [
-                        18.1574507,
-                        -28.8718055
-                    ],
-                    [
-                        18.5063811,
-                        -28.8718055
-                    ],
-                    [
-                        18.6153564,
-                        -28.8295875
-                    ],
-                    [
-                        18.9087513,
-                        -28.8277516
-                    ],
-                    [
-                        19.1046973,
-                        -28.9488548
-                    ],
-                    [
-                        19.1969071,
-                        -28.9378513
-                    ],
-                    [
-                        19.243012,
-                        -28.8516164
-                    ],
-                    [
-                        19.2314858,
-                        -28.802963
-                    ],
-                    [
-                        19.2587296,
-                        -28.7009928
-                    ],
-                    [
-                        19.4431493,
-                        -28.6973163
-                    ],
-                    [
-                        19.5500289,
-                        -28.4958332
-                    ],
-                    [
-                        19.6967264,
-                        -28.4939914
-                    ],
-                    [
-                        19.698822,
-                        -28.4479358
-                    ],
-                    [
-                        19.8507587,
-                        -28.4433291
-                    ],
-                    [
-                        19.8497109,
-                        -28.4027818
-                    ],
-                    [
-                        19.9953605,
-                        -28.399095
-                    ],
-                    [
-                        19.9893671,
-                        -24.7497859
-                    ],
-                    [
-                        20.2916682,
-                        -24.9192346
-                    ],
-                    [
-                        20.4724562,
-                        -25.1501701
-                    ],
-                    [
-                        20.6532441,
-                        -25.4529449
-                    ],
-                    [
-                        20.733265,
-                        -25.6801957
-                    ],
-                    [
-                        20.8281046,
-                        -25.8963498
-                    ],
-                    [
-                        20.8429232,
-                        -26.215851
-                    ],
-                    [
-                        20.6502804,
-                        -26.4840868
-                    ],
-                    [
-                        20.6532441,
-                        -26.8204869
-                    ],
-                    [
-                        21.0889134,
-                        -26.846933
-                    ],
-                    [
-                        21.6727695,
-                        -26.8389998
-                    ],
-                    [
-                        21.7765003,
-                        -26.6696268
-                    ],
-                    [
-                        21.9721069,
-                        -26.6431395
-                    ],
-                    [
-                        22.2803355,
-                        -26.3274702
-                    ],
-                    [
-                        22.5707817,
-                        -26.1333967
-                    ],
-                    [
-                        22.7752795,
-                        -25.6775246
-                    ],
-                    [
-                        23.0005235,
-                        -25.2761948
-                    ],
-                    [
-                        23.4658301,
-                        -25.2735148
-                    ],
-                    [
-                        23.883717,
-                        -25.597366
-                    ],
-                    [
-                        24.2364017,
-                        -25.613402
-                    ],
-                    [
-                        24.603905,
-                        -25.7896563
-                    ],
-                    [
-                        25.110704,
-                        -25.7389432
-                    ],
-                    [
-                        25.5078447,
-                        -25.6855376
-                    ],
-                    [
-                        25.6441766,
-                        -25.4823781
-                    ],
-                    [
-                        25.8419267,
-                        -24.7805437
-                    ],
-                    [
-                        25.846641,
-                        -24.7538456
-                    ],
-                    [
-                        26.3928487,
-                        -24.6332894
-                    ],
-                    [
-                        26.4739066,
-                        -24.5653312
-                    ],
-                    [
-                        26.5089966,
-                        -24.4842437
-                    ],
-                    [
-                        26.5861946,
-                        -24.4075775
-                    ],
-                    [
-                        26.7300635,
-                        -24.3014458
-                    ],
-                    [
-                        26.8567384,
-                        -24.2499463
-                    ],
-                    [
-                        26.8574402,
-                        -24.1026901
-                    ],
-                    [
-                        26.9215471,
-                        -23.8990957
-                    ],
-                    [
-                        26.931831,
-                        -23.8461891
-                    ],
-                    [
-                        26.9714827,
-                        -23.6994344
-                    ],
-                    [
-                        27.0006074,
-                        -23.6367644
-                    ],
-                    [
-                        27.0578041,
-                        -23.6052574
-                    ],
-                    [
-                        27.1360547,
-                        -23.5203437
-                    ],
-                    [
-                        27.3339623,
-                        -23.3973792
-                    ],
-                    [
-                        27.5144057,
-                        -23.3593929
-                    ],
-                    [
-                        27.5958145,
-                        -23.2085465
-                    ],
-                    [
-                        27.8098634,
-                        -23.0994957
-                    ],
-                    [
-                        27.8828506,
-                        -23.0620496
-                    ],
-                    [
-                        27.9382928,
-                        -22.9496487
-                    ],
-                    [
-                        28.0407556,
-                        -22.8255118
-                    ],
-                    [
-                        28.2056786,
-                        -22.6552861
-                    ],
-                    [
-                        28.3397223,
-                        -22.5639374
-                    ],
-                    [
-                        28.4906093,
-                        -22.560697
-                    ],
-                    [
-                        28.6108769,
-                        -22.5400248
-                    ],
-                    [
-                        28.828175,
-                        -22.4550173
-                    ],
-                    [
-                        28.9285324,
-                        -22.4232328
-                    ],
-                    [
-                        28.9594116,
-                        -22.3090081
-                    ],
-                    [
-                        29.0162574,
-                        -22.208335
-                    ],
-                    [
-                        29.2324117,
-                        -22.1693453
-                    ],
-                    [
-                        29.3531213,
-                        -22.1842926
-                    ],
-                    [
-                        29.6548952,
-                        -22.1186426
-                    ],
-                    [
-                        29.7777102,
-                        -22.1361956
-                    ],
-                    [
-                        29.9292989,
-                        -22.1849425
-                    ],
-                    [
-                        30.1166795,
-                        -22.2830348
-                    ],
-                    [
-                        30.2563377,
-                        -22.2914767
-                    ],
-                    [
-                        30.3033582,
-                        -22.3395204
-                    ],
-                    [
-                        30.5061784,
-                        -22.3057617
-                    ],
-                    [
-                        30.8374279,
-                        -22.284983
-                    ],
-                    [
-                        31.0058599,
-                        -22.3077095
-                    ],
-                    [
-                        31.1834152,
-                        -22.3232913
-                    ],
-                    [
-                        31.2930586,
-                        -22.3674647
-                    ],
-                    [
-                        31.5680579,
-                        -23.1903385
-                    ],
-                    [
-                        31.5568311,
-                        -23.4430809
-                    ],
-                    [
-                        31.6931122,
-                        -23.6175209
-                    ],
-                    [
-                        31.7119696,
-                        -23.741136
-                    ],
-                    [
-                        31.7774743,
-                        -23.8800628
-                    ],
-                    [
-                        31.8886337,
-                        -23.9481098
-                    ],
-                    [
-                        31.9144386,
-                        -24.1746736
-                    ],
-                    [
-                        31.9948307,
-                        -24.3040878
-                    ],
-                    [
-                        32.0166656,
-                        -24.4405988
-                    ],
-                    [
-                        32.0077331,
-                        -24.6536578
-                    ],
-                    [
-                        32.019643,
-                        -24.9140701
-                    ],
-                    [
-                        32.035523,
-                        -25.0849767
-                    ],
-                    [
-                        32.019643,
-                        -25.3821442
-                    ],
-                    [
-                        31.9928457,
-                        -25.4493771
-                    ],
-                    [
-                        31.9997931,
-                        -25.5165725
-                    ],
-                    [
-                        32.0057481,
-                        -25.6078978
-                    ],
-                    [
-                        32.0057481,
-                        -25.6624806
-                    ],
-                    [
-                        31.9362735,
-                        -25.8403721
-                    ],
-                    [
-                        31.9809357,
-                        -25.9546537
-                    ],
-                    [
-                        31.8687838,
-                        -26.0037251
-                    ],
-                    [
-                        31.4162062,
-                        -25.7277683
-                    ],
-                    [
-                        31.3229117,
-                        -25.7438611
-                    ],
-                    [
-                        31.2504595,
-                        -25.8296526
-                    ],
-                    [
-                        31.1393001,
-                        -25.9162746
-                    ],
-                    [
-                        31.1164727,
-                        -25.9912361
-                    ],
-                    [
-                        30.9656135,
-                        -26.2665756
-                    ],
-                    [
-                        30.8921689,
-                        -26.3279703
-                    ],
-                    [
-                        30.8534616,
-                        -26.4035568
-                    ],
-                    [
-                        30.8226943,
-                        -26.4488849
-                    ],
-                    [
-                        30.8022583,
-                        -26.5240694
-                    ],
-                    [
-                        30.8038369,
-                        -26.8082089
-                    ],
-                    [
-                        30.9020939,
-                        -26.7807451
-                    ],
-                    [
-                        30.9100338,
-                        -26.8489495
-                    ],
-                    [
-                        30.9824859,
-                        -26.9082627
-                    ],
-                    [
-                        30.976531,
-                        -27.0029222
-                    ],
-                    [
-                        31.0034434,
-                        -27.0441587
-                    ],
-                    [
-                        31.1543322,
-                        -27.1980416
-                    ],
-                    [
-                        31.5015607,
-                        -27.311117
-                    ],
-                    [
-                        31.9700183,
-                        -27.311117
-                    ],
-                    [
-                        31.9700183,
-                        -27.120472
-                    ],
-                    [
-                        31.9769658,
-                        -27.050664
-                    ],
-                    [
-                        32.0002464,
-                        -26.7983892
-                    ],
-                    [
-                        32.1069826,
-                        -26.7984645
-                    ],
-                    [
-                        32.3114546,
-                        -26.8479493
-                    ],
-                    [
-                        32.899986,
-                        -26.8516059
-                    ],
-                    [
-                        32.886091,
-                        -26.9816971
-                    ],
-                    [
-                        32.709427,
-                        -27.4785436
-                    ],
-                    [
-                        32.6240724,
-                        -27.7775144
-                    ],
-                    [
-                        32.5813951,
-                        -28.07479
-                    ],
-                    [
-                        32.5387178,
-                        -28.2288046
-                    ],
-                    [
-                        32.4275584,
-                        -28.5021568
-                    ],
-                    [
-                        32.3640388,
-                        -28.5945699
-                    ],
-                    [
-                        32.0702603,
-                        -28.8469827
-                    ],
-                    [
-                        31.9878832,
-                        -28.9069497
-                    ],
-                    [
-                        31.7764818,
-                        -28.969487
-                    ],
-                    [
-                        31.4638459,
-                        -29.2859343
-                    ],
-                    [
-                        31.359634,
-                        -29.3854348
-                    ],
-                    [
-                        31.1680825,
-                        -29.6307408
-                    ],
-                    [
-                        31.064863,
-                        -29.7893535
-                    ],
-                    [
-                        31.0534493,
-                        -29.8470469
-                    ],
-                    [
-                        31.0669933,
-                        -29.8640319
-                    ],
-                    [
-                        31.0455459,
-                        -29.9502017
-                    ],
-                    [
-                        30.9518556,
-                        -30.0033946
-                    ],
-                    [
-                        30.8651833,
-                        -30.1024093
-                    ],
-                    [
-                        30.7244725,
-                        -30.392502
-                    ],
-                    [
-                        30.3556256,
-                        -30.9308873
-                    ],
-                    [
-                        30.0972364,
-                        -31.2458274
-                    ],
-                    [
-                        29.8673136,
-                        -31.4304296
-                    ],
-                    [
-                        29.7409393,
-                        -31.5014699
-                    ],
-                    [
-                        29.481312,
-                        -31.6978686
-                    ],
-                    [
-                        28.8943171,
-                        -32.2898903
-                    ],
-                    [
-                        28.5497137,
-                        -32.5894641
-                    ],
-                    [
-                        28.1436499,
-                        -32.8320732
-                    ],
-                    [
-                        28.0748735,
-                        -32.941689
-                    ],
-                    [
-                        27.8450942,
-                        -33.082869
-                    ],
-                    [
-                        27.3757956,
-                        -33.3860685
-                    ],
-                    [
-                        26.8805407,
-                        -33.6458951
-                    ],
-                    [
-                        26.5916871,
-                        -33.7480756
-                    ],
-                    [
-                        26.4527308,
-                        -33.7935795
-                    ],
-                    [
-                        26.206754,
-                        -33.7548943
-                    ],
-                    [
-                        26.0077897,
-                        -33.7223961
-                    ],
-                    [
-                        25.8055494,
-                        -33.7524272
-                    ],
-                    [
-                        25.7511073,
-                        -33.8006512
-                    ],
-                    [
-                        25.6529079,
-                        -33.8543597
-                    ],
-                    [
-                        25.6529079,
-                        -33.9469768
-                    ],
-                    [
-                        25.7195789,
-                        -34.0040115
-                    ],
-                    [
-                        25.7202807,
-                        -34.0511235
-                    ],
-                    [
-                        25.5508915,
-                        -34.063151
-                    ],
-                    [
-                        25.3504571,
-                        -34.0502627
-                    ],
-                    [
-                        25.2810609,
-                        -34.0020322
-                    ],
-                    [
-                        25.0476316,
-                        -33.9994588
-                    ],
-                    [
-                        24.954724,
-                        -34.0043594
-                    ],
-                    [
-                        24.9496586,
-                        -34.1010363
-                    ],
-                    [
-                        24.8770358,
-                        -34.1506456
-                    ],
-                    [
-                        24.8762914,
-                        -34.2005281
-                    ],
-                    [
-                        24.8532574,
-                        -34.2189562
-                    ],
-                    [
-                        24.7645287,
-                        -34.2017946
-                    ],
-                    [
-                        24.5001356,
-                        -34.2003254
-                    ],
-                    [
-                        24.3486733,
-                        -34.1163824
-                    ],
-                    [
-                        24.1988819,
-                        -34.1019039
-                    ],
-                    [
-                        23.9963377,
-                        -34.0514443
-                    ],
-                    [
-                        23.8017509,
-                        -34.0524332
-                    ],
-                    [
-                        23.7493589,
-                        -34.0111855
-                    ],
-                    [
-                        23.4973536,
-                        -34.009014
-                    ],
-                    [
-                        23.4155191,
-                        -34.0434586
-                    ],
-                    [
-                        23.4154284,
-                        -34.1140433
-                    ],
-                    [
-                        22.9000853,
-                        -34.0993009
-                    ],
-                    [
-                        22.8412418,
-                        -34.0547911
-                    ],
-                    [
-                        22.6470321,
-                        -34.0502627
-                    ],
-                    [
-                        22.6459843,
-                        -34.0072768
-                    ],
-                    [
-                        22.570016,
-                        -34.0064081
-                    ],
-                    [
-                        22.5050499,
-                        -34.0645866
-                    ],
-                    [
-                        22.2519968,
-                        -34.0645866
-                    ],
-                    [
-                        22.2221334,
-                        -34.1014701
-                    ],
-                    [
-                        22.1621197,
-                        -34.1057019
-                    ],
-                    [
-                        22.1712431,
-                        -34.1521766
-                    ],
-                    [
-                        22.1576913,
-                        -34.2180897
-                    ],
-                    [
-                        22.0015632,
-                        -34.2172232
-                    ],
-                    [
-                        21.9496952,
-                        -34.3220009
-                    ],
-                    [
-                        21.8611528,
-                        -34.4007145
-                    ],
-                    [
-                        21.5614708,
-                        -34.4020114
-                    ],
-                    [
-                        21.5468011,
-                        -34.3661242
-                    ],
-                    [
-                        21.501744,
-                        -34.3669892
-                    ],
-                    [
-                        21.5006961,
-                        -34.4020114
-                    ],
-                    [
-                        21.4194886,
-                        -34.4465247
-                    ],
-                    [
-                        21.1978706,
-                        -34.4478208
-                    ],
-                    [
-                        21.0988193,
-                        -34.3991325
-                    ],
-                    [
-                        21.0033746,
-                        -34.3753872
-                    ],
-                    [
-                        20.893192,
-                        -34.3997115
-                    ],
-                    [
-                        20.8976647,
-                        -34.4854003
-                    ],
-                    [
-                        20.7446802,
-                        -34.4828092
-                    ],
-                    [
-                        20.5042011,
-                        -34.486264
-                    ],
-                    [
-                        20.2527197,
-                        -34.701477
-                    ],
-                    [
-                        20.0803502,
-                        -34.8361855
-                    ],
-                    [
-                        19.9923317,
-                        -34.8379056
-                    ],
-                    [
-                        19.899074,
-                        -34.8275845
-                    ],
-                    [
-                        19.8938348,
-                        -34.7936018
-                    ],
-                    [
-                        19.5972963,
-                        -34.7961833
-                    ],
-                    [
-                        19.3929677,
-                        -34.642015
-                    ],
-                    [
-                        19.2877095,
-                        -34.6404784
-                    ],
-                    [
-                        19.2861377,
-                        -34.5986563
-                    ],
-                    [
-                        19.3474363,
-                        -34.5244458
-                    ],
-                    [
-                        19.3285256,
-                        -34.4534372
-                    ],
-                    [
-                        19.098001,
-                        -34.449981
-                    ],
-                    [
-                        19.0725583,
-                        -34.3802371
-                    ],
-                    [
-                        19.0023531,
-                        -34.3525593
-                    ],
-                    [
-                        18.9520568,
-                        -34.3949373
-                    ],
-                    [
-                        18.7975006,
-                        -34.3936403
-                    ],
-                    [
-                        18.7984174,
-                        -34.1016376
-                    ],
-                    [
-                        18.501748,
-                        -34.1015292
-                    ],
-                    [
-                        18.4999545,
-                        -34.3616945
-                    ],
-                    [
-                        18.4477325,
-                        -34.3620007
-                    ],
-                    [
-                        18.4479944,
-                        -34.3522691
-                    ],
-                    [
-                        18.3974362,
-                        -34.3514041
-                    ],
-                    [
-                        18.3971742,
-                        -34.3022959
-                    ],
-                    [
-                        18.3565705,
-                        -34.3005647
-                    ],
-                    [
-                        18.3479258,
-                        -34.2020436
-                    ],
-                    [
-                        18.2972095,
-                        -34.1950274
-                    ],
-                    [
-                        18.2951139,
-                        -33.9937138
-                    ],
-                    [
-                        18.3374474,
-                        -33.9914079
-                    ],
-                    [
-                        18.3476638,
-                        -33.8492427
-                    ],
-                    [
-                        18.3479258,
-                        -33.781555
-                    ],
-                    [
-                        18.4124718,
-                        -33.7448849
-                    ],
-                    [
-                        18.3615477,
-                        -33.6501624
-                    ],
-                    [
-                        18.2992013,
-                        -33.585591
-                    ],
-                    [
-                        18.2166839,
-                        -33.448872
-                    ],
-                    [
-                        18.1389858,
-                        -33.3974083
-                    ],
-                    [
-                        17.9473472,
-                        -33.1602647
-                    ],
-                    [
-                        17.8855247,
-                        -33.0575732
-                    ],
-                    [
-                        17.8485884,
-                        -32.9668505
-                    ],
-                    [
-                        17.8396817,
-                        -32.8507302
-                    ]
-                ]
-            ]
-        },
-        {
-            "name": "South Tyrol Orthofoto 2011",
-            "type": "tms",
-            "template": "http://sdi.provincia.bz.it/geoserver/gwc/service/tms/1.0.0/WMTS_OF2011_APB-PAB@GoogleMapsCompatible@png8/{z}/{x}/{-y}.png",
-            "polygon": [
-                [
-                    [
-                        10.373383,
-                        46.213553
-                    ],
-                    [
-                        10.373383,
-                        47.098175
-                    ],
-                    [
-                        12.482758,
-                        47.098175
-                    ],
-                    [
-                        12.482758,
-                        46.213553
-                    ],
-                    [
-                        10.373383,
-                        46.213553
-                    ]
-                ]
-            ],
-            "id": "sdi.provinz.bz.it-WMTS_OF2011_APB-PAB"
-        },
-        {
-            "name": "South Tyrol Topomap",
-            "type": "tms",
-            "template": "http://sdi.provincia.bz.it/geoserver/gwc/service/tms/1.0.0/WMTS_TOPOMAP_APB-PAB@GoogleMapsCompatible@png8/{z}/{x}/{-y}.png",
-            "polygon": [
-                [
-                    [
-                        10.373383,
-                        46.213553
-                    ],
-                    [
-                        10.373383,
-                        47.098175
-                    ],
-                    [
-                        12.482758,
-                        47.098175
-                    ],
-                    [
-                        12.482758,
-                        46.213553
-                    ],
-                    [
-                        10.373383,
-                        46.213553
-                    ]
-                ]
-            ],
-            "id": "sdi.provinz.bz.it-WMTS_TOPOMAP_APB-PAB"
-        },
-        {
-            "name": "Stadt Uster Orthophoto 2008 10cm",
-            "type": "tms",
-            "template": "http://mapproxy.sosm.ch:8080/tiles/uster/EPSG900913/{zoom}/{x}/{y}.png?origin=nw",
-            "polygon": [
-                [
-                    [
-                        8.6,
-                        47.31
-                    ],
-                    [
-                        8.6,
-                        47.39
-                    ],
-                    [
-                        8.77,
-                        47.39
-                    ],
-                    [
-                        8.77,
-                        47.31
-                    ],
-                    [
-                        8.6,
-                        47.31
-                    ]
-                ]
-            ],
-            "terms_text": "Stadt Uster Vermessung Orthophoto 2008"
-        },
-        {
-            "name": "Stadt Zürich Luftbild 2011",
-            "type": "tms",
-            "template": "http://mapproxy.sosm.ch:8080/tiles/zh_luftbild2011/EPSG900913/{z}/{x}/{y}.png?origin=nw",
-            "polygon": [
-                [
-                    [
-                        8.4441,
-                        47.3141
-                    ],
-                    [
-                        8.4441,
-                        47.4411
-                    ],
-                    [
-                        8.6284,
-                        47.4411
-                    ],
-                    [
-                        8.6284,
-                        47.3141
-                    ],
-                    [
-                        8.4441,
-                        47.3141
-                    ]
-                ]
-            ],
-            "terms_text": "Stadt Zürich Luftbild 2011"
-        },
-        {
-            "name": "Stevns (Denmark)",
-            "type": "tms",
-            "template": "http://{switch:a,b,c}.tile.openstreetmap.dk/stevns/2009/{zoom}/{x}/{y}.png",
-            "scaleExtent": [
-                0,
-                20
-            ],
-            "polygon": [
-                [
-                    [
-                        12.0913942,
-                        55.3491574
-                    ],
-                    [
-                        12.0943104,
-                        55.3842256
-                    ],
-                    [
-                        12.1573875,
-                        55.3833103
-                    ],
-                    [
-                        12.1587287,
-                        55.4013326
-                    ],
-                    [
-                        12.1903468,
-                        55.400558
-                    ],
-                    [
-                        12.1931411,
-                        55.4364665
-                    ],
-                    [
-                        12.2564251,
-                        55.4347995
-                    ],
-                    [
-                        12.2547073,
-                        55.4168882
-                    ],
-                    [
-                        12.3822489,
-                        55.4134349
-                    ],
-                    [
-                        12.3795942,
-                        55.3954143
-                    ],
-                    [
-                        12.4109213,
-                        55.3946958
-                    ],
-                    [
-                        12.409403,
-                        55.3766417
-                    ],
-                    [
-                        12.4407807,
-                        55.375779
-                    ],
-                    [
-                        12.4394142,
-                        55.3578314
-                    ],
-                    [
-                        12.4707413,
-                        55.3569971
-                    ],
-                    [
-                        12.4629475,
-                        55.2672214
-                    ],
-                    [
-                        12.4315633,
-                        55.2681491
-                    ],
-                    [
-                        12.430045,
-                        55.2502103
-                    ],
-                    [
-                        12.3672011,
-                        55.2519673
-                    ],
-                    [
-                        12.3656858,
-                        55.2340267
-                    ],
-                    [
-                        12.2714604,
-                        55.2366031
-                    ],
-                    [
-                        12.2744467,
-                        55.272476
-                    ],
-                    [
-                        12.2115654,
-                        55.2741475
-                    ],
-                    [
-                        12.2130078,
-                        55.2920322
-                    ],
-                    [
-                        12.1815665,
-                        55.2928638
-                    ],
-                    [
-                        12.183141,
-                        55.3107091
-                    ],
-                    [
-                        12.2144897,
-                        55.3100981
-                    ],
-                    [
-                        12.2159927,
-                        55.3279764
-                    ],
-                    [
-                        12.1214458,
-                        55.3303379
-                    ],
-                    [
-                        12.1229489,
-                        55.3483291
-                    ]
-                ]
-            ],
-            "terms_text": "Stevns Kommune"
-        },
-        {
-            "name": "Surrey Air Survey",
-            "type": "tms",
-            "template": "http://gravitystorm.dev.openstreetmap.org/surrey/{zoom}/{x}/{y}.png",
-            "scaleExtent": [
-                8,
-                19
-            ],
-            "polygon": [
-                [
-                    [
-                        -0.752478,
-                        51.0821941
-                    ],
-                    [
-                        -0.7595183,
-                        51.0856254
-                    ],
-                    [
-                        -0.8014342,
-                        51.1457917
-                    ],
-                    [
-                        -0.8398864,
-                        51.1440686
-                    ],
-                    [
-                        -0.8357665,
-                        51.1802397
-                    ],
-                    [
-                        -0.8529549,
-                        51.2011266
-                    ],
-                    [
-                        -0.8522683,
-                        51.2096231
-                    ],
-                    [
-                        -0.8495217,
-                        51.217903
-                    ],
-                    [
-                        -0.8266907,
-                        51.2403696
-                    ],
-                    [
-                        -0.8120995,
-                        51.2469248
-                    ],
-                    [
-                        -0.7736474,
-                        51.2459577
-                    ],
-                    [
-                        -0.7544213,
-                        51.2381127
-                    ],
-                    [
-                        -0.754078,
-                        51.233921
-                    ],
-                    [
-                        -0.7446366,
-                        51.2333836
-                    ],
-                    [
-                        -0.7430693,
-                        51.2847178
-                    ],
-                    [
-                        -0.751503,
-                        51.3069524
-                    ],
-                    [
-                        -0.7664376,
-                        51.3121032
-                    ],
-                    [
-                        -0.7820588,
-                        51.3270157
-                    ],
-                    [
-                        -0.7815438,
-                        51.3388135
-                    ],
-                    [
-                        -0.7374268,
-                        51.3720456
-                    ],
-                    [
-                        -0.7192307,
-                        51.3769748
-                    ],
-                    [
-                        -0.6795769,
-                        51.3847961
-                    ],
-                    [
-                        -0.6807786,
-                        51.3901523
-                    ],
-                    [
-                        -0.6531411,
-                        51.3917591
-                    ],
-                    [
-                        -0.6301385,
-                        51.3905808
-                    ],
-                    [
-                        -0.6291085,
-                        51.3970074
-                    ],
-                    [
-                        -0.6234437,
-                        51.3977572
-                    ],
-                    [
-                        -0.613144,
-                        51.4295552
-                    ],
-                    [
-                        -0.6002471,
-                        51.4459121
-                    ],
-                    [
-                        -0.5867081,
-                        51.4445365
-                    ],
-                    [
-                        -0.5762368,
-                        51.453202
-                    ],
-                    [
-                        -0.5626755,
-                        51.4523462
-                    ],
-                    [
-                        -0.547741,
-                        51.4469972
-                    ],
-                    [
-                        -0.5372697,
-                        51.4448575
-                    ],
-                    [
-                        -0.537098,
-                        51.4526671
-                    ],
-                    [
-                        -0.5439644,
-                        51.4545926
-                    ],
-                    [
-                        -0.5405312,
-                        51.4698865
-                    ],
-                    [
-                        -0.5309182,
-                        51.4760881
-                    ],
-                    [
-                        -0.5091172,
-                        51.4744843
-                    ],
-                    [
-                        -0.5086022,
-                        51.4695657
-                    ],
-                    [
-                        -0.4900628,
-                        51.4682825
-                    ],
-                    [
-                        -0.4526406,
-                        51.4606894
-                    ],
-                    [
-                        -0.4486924,
-                        51.4429316
-                    ],
-                    [
-                        -0.4414826,
-                        51.4418616
-                    ],
-                    [
-                        -0.4418259,
-                        51.4369394
-                    ],
-                    [
-                        -0.4112702,
-                        51.4380095
-                    ],
-                    [
-                        -0.4014855,
-                        51.4279498
-                    ],
-                    [
-                        -0.3807145,
-                        51.4262372
-                    ],
-                    [
-                        -0.3805428,
-                        51.4161749
-                    ],
-                    [
-                        -0.3491288,
-                        51.4138195
-                    ],
-                    [
-                        -0.3274994,
-                        51.4037544
-                    ],
-                    [
-                        -0.3039818,
-                        51.3990424
-                    ],
-                    [
-                        -0.3019219,
-                        51.3754747
-                    ],
-                    [
-                        -0.309475,
-                        51.369688
-                    ],
-                    [
-                        -0.3111916,
-                        51.3529669
-                    ],
-                    [
-                        -0.2955704,
-                        51.3541462
-                    ],
-                    [
-                        -0.2923089,
-                        51.3673303
-                    ],
-                    [
-                        -0.2850991,
-                        51.3680805
-                    ],
-                    [
-                        -0.2787476,
-                        51.3771891
-                    ],
-                    [
-                        -0.2655297,
-                        51.3837247
-                    ],
-                    [
-                        -0.2411538,
-                        51.3847961
-                    ],
-                    [
-                        -0.2123147,
-                        51.3628288
-                    ],
-                    [
-                        -0.2107697,
-                        51.3498578
-                    ],
-                    [
-                        -0.190857,
-                        51.3502867
-                    ],
-                    [
-                        -0.1542931,
-                        51.3338802
-                    ],
-                    [
-                        -0.1496583,
-                        51.3057719
-                    ],
-                    [
-                        -0.1074296,
-                        51.2966491
-                    ],
-                    [
-                        -0.0887185,
-                        51.3099571
-                    ],
-                    [
-                        -0.0878602,
-                        51.3220811
-                    ],
-                    [
-                        -0.0652009,
-                        51.3215448
-                    ],
-                    [
-                        -0.0641709,
-                        51.3264793
-                    ],
-                    [
-                        -0.0519829,
-                        51.3263721
-                    ],
-                    [
-                        -0.0528412,
-                        51.334631
-                    ],
-                    [
-                        -0.0330779,
-                        51.3430876
-                    ],
-                    [
-                        0.0019187,
-                        51.3376339
-                    ],
-                    [
-                        0.0118751,
-                        51.3281956
-                    ],
-                    [
-                        0.013935,
-                        51.2994398
-                    ],
-                    [
-                        0.0202865,
-                        51.2994398
-                    ],
-                    [
-                        0.0240631,
-                        51.3072743
-                    ],
-                    [
-                        0.0331611,
-                        51.3086694
-                    ],
-                    [
-                        0.0455207,
-                        51.30545
-                    ],
-                    [
-                        0.0523872,
-                        51.2877392
-                    ],
-                    [
-                        0.0616569,
-                        51.2577764
-                    ],
-                    [
-                        0.0640602,
-                        51.2415518
-                    ],
-                    [
-                        0.0462074,
-                        51.2126342
-                    ],
-                    [
-                        0.0407142,
-                        51.2109136
-                    ],
-                    [
-                        0.0448341,
-                        51.1989753
-                    ],
-                    [
-                        0.0494689,
-                        51.1997283
-                    ],
-                    [
-                        0.0558204,
-                        51.1944573
-                    ],
-                    [
-                        0.0611419,
-                        51.1790713
-                    ],
-                    [
-                        0.0623435,
-                        51.1542061
-                    ],
-                    [
-                        0.0577087,
-                        51.1417146
-                    ],
-                    [
-                        0.0204582,
-                        51.1365447
-                    ],
-                    [
-                        -0.0446015,
-                        51.1336364
-                    ],
-                    [
-                        -0.1566964,
-                        51.1352522
-                    ],
-                    [
-                        -0.1572114,
-                        51.1290043
-                    ],
-                    [
-                        -0.2287942,
-                        51.1183379
-                    ],
-                    [
-                        -0.2473336,
-                        51.1183379
-                    ],
-                    [
-                        -0.2500802,
-                        51.1211394
-                    ],
-                    [
-                        -0.299347,
-                        51.1137042
-                    ],
-                    [
-                        -0.3221779,
-                        51.1119799
-                    ],
-                    [
-                        -0.3223496,
-                        51.1058367
-                    ],
-                    [
-                        -0.3596001,
-                        51.1019563
-                    ],
-                    [
-                        -0.3589135,
-                        51.1113333
-                    ],
-                    [
-                        -0.3863793,
-                        51.1117644
-                    ],
-                    [
-                        -0.3869014,
-                        51.1062516
-                    ],
-                    [
-                        -0.4281001,
-                        51.0947174
-                    ],
-                    [
-                        -0.4856784,
-                        51.0951554
-                    ],
-                    [
-                        -0.487135,
-                        51.0872266
-                    ],
-                    [
-                        -0.5297404,
-                        51.0865404
-                    ],
-                    [
-                        -0.5302259,
-                        51.0789914
-                    ],
-                    [
-                        -0.61046,
-                        51.076551
-                    ],
-                    [
-                        -0.6099745,
-                        51.080669
-                    ],
-                    [
-                        -0.6577994,
-                        51.0792202
-                    ],
-                    [
-                        -0.6582849,
-                        51.0743394
-                    ],
-                    [
-                        -0.6836539,
-                        51.0707547
-                    ],
-                    [
-                        -0.6997979,
-                        51.070831
-                    ],
-                    [
-                        -0.7296581,
-                        51.0744919
-                    ]
-                ]
-            ]
-        },
-        {
-            "name": "Toulouse - Orthophotoplan 2007",
-            "type": "tms",
-            "template": "http://wms.openstreetmap.fr/tms/1.0.0/toulouse_ortho2007/{zoom}/{x}/{y}",
-            "scaleExtent": [
-                0,
-                22
-            ],
-            "polygon": [
-                [
-                    [
-                        1.1919978,
-                        43.6328791
-                    ],
-                    [
-                        1.2015377,
-                        43.6329729
-                    ],
-                    [
-                        1.2011107,
-                        43.6554932
-                    ],
-                    [
-                        1.2227985,
-                        43.6557029
-                    ],
-                    [
-                        1.2226231,
-                        43.6653353
-                    ],
-                    [
-                        1.2275341,
-                        43.6653849
-                    ],
-                    [
-                        1.2275417,
-                        43.6656387
-                    ],
-                    [
-                        1.2337568,
-                        43.6656883
-                    ],
-                    [
-                        1.2337644,
-                        43.6650153
-                    ],
-                    [
-                        1.2351218,
-                        43.6650319
-                    ],
-                    [
-                        1.2350913,
-                        43.6670729
-                    ],
-                    [
-                        1.2443566,
-                        43.6671556
-                    ],
-                    [
-                        1.2441584,
-                        43.6743925
-                    ],
-                    [
-                        1.2493973,
-                        43.6744256
-                    ],
-                    [
-                        1.2493973,
-                        43.6746628
-                    ],
-                    [
-                        1.2555666,
-                        43.6747234
-                    ],
-                    [
-                        1.2555742,
-                        43.6744532
-                    ],
-                    [
-                        1.2569545,
-                        43.6744697
-                    ],
-                    [
-                        1.2568782,
-                        43.678529
-                    ],
-                    [
-                        1.2874873,
-                        43.6788257
-                    ],
-                    [
-                        1.2870803,
-                        43.7013229
-                    ],
-                    [
-                        1.3088219,
-                        43.7014632
-                    ],
-                    [
-                        1.3086493,
-                        43.7127673
-                    ],
-                    [
-                        1.3303262,
-                        43.7129544
-                    ],
-                    [
-                        1.3300242,
-                        43.7305221
-                    ],
-                    [
-                        1.3367106,
-                        43.7305845
-                    ],
-                    [
-                        1.3367322,
-                        43.7312235
-                    ],
-                    [
-                        1.3734338,
-                        43.7310456
-                    ],
-                    [
-                        1.3735848,
-                        43.7245772
-                    ],
-                    [
-                        1.4604504,
-                        43.7252947
-                    ],
-                    [
-                        1.4607783,
-                        43.7028034
-                    ],
-                    [
-                        1.4824875,
-                        43.7029516
-                    ],
-                    [
-                        1.4829828,
-                        43.6692071
-                    ],
-                    [
-                        1.5046832,
-                        43.6693616
-                    ],
-                    [
-                        1.5048383,
-                        43.6581174
-                    ],
-                    [
-                        1.5265475,
-                        43.6582656
-                    ],
-                    [
-                        1.5266945,
-                        43.6470298
-                    ],
-                    [
-                        1.548368,
-                        43.6471633
-                    ],
-                    [
-                        1.5485357,
-                        43.6359385
-                    ],
-                    [
-                        1.5702172,
-                        43.636082
-                    ],
-                    [
-                        1.5705123,
-                        43.6135777
-                    ],
-                    [
-                        1.5488166,
-                        43.6134276
-                    ],
-                    [
-                        1.549097,
-                        43.5909479
-                    ],
-                    [
-                        1.5707695,
-                        43.5910694
-                    ],
-                    [
-                        1.5709373,
-                        43.5798341
-                    ],
-                    [
-                        1.5793714,
-                        43.5798894
-                    ],
-                    [
-                        1.5794782,
-                        43.5737682
-                    ],
-                    [
-                        1.5809119,
-                        43.5737792
-                    ],
-                    [
-                        1.5810859,
-                        43.5573794
-                    ],
-                    [
-                        1.5712334,
-                        43.5573131
-                    ],
-                    [
-                        1.5716504,
-                        43.5235497
-                    ],
-                    [
-                        1.3984804,
-                        43.5222618
-                    ],
-                    [
-                        1.3986509,
-                        43.5110113
-                    ],
-                    [
-                        1.3120959,
-                        43.5102543
-                    ],
-                    [
-                        1.3118968,
-                        43.5215192
-                    ],
-                    [
-                        1.2902569,
-                        43.5213126
-                    ],
-                    [
-                        1.2898637,
-                        43.5438168
-                    ],
-                    [
-                        1.311517,
-                        43.5440133
-                    ],
-                    [
-                        1.3113271,
-                        43.5552596
-                    ],
-                    [
-                        1.3036924,
-                        43.5551924
-                    ],
-                    [
-                        1.3036117,
-                        43.5595099
-                    ],
-                    [
-                        1.2955449,
-                        43.5594317
-                    ],
-                    [
-                        1.2955449,
-                        43.5595489
-                    ],
-                    [
-                        1.2895595,
-                        43.5594473
-                    ],
-                    [
-                        1.2892899,
-                        43.5775366
-                    ],
-                    [
-                        1.2675698,
-                        43.5773647
-                    ],
-                    [
-                        1.2673973,
-                        43.5886141
-                    ],
-                    [
-                        1.25355,
-                        43.5885047
-                    ],
-                    [
-                        1.2533774,
-                        43.5956282
-                    ],
-                    [
-                        1.2518029,
-                        43.5956282
-                    ],
-                    [
-                        1.2518029,
-                        43.5949409
-                    ],
-                    [
-                        1.2350437,
-                        43.5947847
-                    ],
-                    [
-                        1.2350437,
-                        43.5945972
-                    ],
-                    [
-                        1.2239572,
-                        43.5945972
-                    ],
-                    [
-                        1.2239357,
-                        43.5994708
-                    ],
-                    [
-                        1.2139708,
-                        43.599299
-                    ],
-                    [
-                        1.2138845,
-                        43.6046408
-                    ],
-                    [
-                        1.2020647,
-                        43.6044846
-                    ],
-                    [
-                        1.2019464,
-                        43.61048
-                    ],
-                    [
-                        1.1924294,
-                        43.6103695
-                    ]
-                ]
-            ],
-            "terms_url": "https://wiki.openstreetmap.org/wiki/Toulouse/ToulouseMetropoleData",
-            "terms_text": "ToulouseMetropole"
-        },
-        {
-            "name": "Toulouse - Orthophotoplan 2011",
-            "type": "tms",
-            "template": "http://wms.openstreetmap.fr/tms/1.0.0/toulouse_ortho2011/{zoom}/{x}/{y}",
-            "scaleExtent": [
-                0,
-                22
-            ],
-            "polygon": [
-                [
-                    [
-                        1.1135067,
-                        43.6867566
-                    ],
-                    [
-                        1.1351836,
-                        43.6870842
-                    ],
-                    [
-                        1.1348907,
-                        43.6983471
-                    ],
-                    [
-                        1.1782867,
-                        43.6990338
-                    ],
-                    [
-                        1.1779903,
-                        43.7102786
-                    ],
-                    [
-                        1.1996591,
-                        43.7106144
-                    ],
-                    [
-                        1.1993387,
-                        43.7218722
-                    ],
-                    [
-                        1.2427356,
-                        43.7225269
-                    ],
-                    [
-                        1.2424336,
-                        43.7337491
-                    ],
-                    [
-                        1.2641536,
-                        43.734092
-                    ],
-                    [
-                        1.2638301,
-                        43.7453588
-                    ],
-                    [
-                        1.2855285,
-                        43.7456548
-                    ],
-                    [
-                        1.2852481,
-                        43.756935
-                    ],
-                    [
-                        1.306925,
-                        43.757231
-                    ],
-                    [
-                        1.3066446,
-                        43.7684779
-                    ],
-                    [
-                        1.3283431,
-                        43.7687894
-                    ],
-                    [
-                        1.3280842,
-                        43.780034
-                    ],
-                    [
-                        1.4367275,
-                        43.7815757
-                    ],
-                    [
-                        1.4373098,
-                        43.7591004
-                    ],
-                    [
-                        1.4590083,
-                        43.7593653
-                    ],
-                    [
-                        1.4593318,
-                        43.7481479
-                    ],
-                    [
-                        1.4810303,
-                        43.7483972
-                    ],
-                    [
-                        1.4813322,
-                        43.7371777
-                    ],
-                    [
-                        1.5030307,
-                        43.7374115
-                    ],
-                    [
-                        1.5035915,
-                        43.7149664
-                    ],
-                    [
-                        1.5253115,
-                        43.7151846
-                    ],
-                    [
-                        1.5256135,
-                        43.7040057
-                    ],
-                    [
-                        1.5472688,
-                        43.7042552
-                    ],
-                    [
-                        1.5475708,
-                        43.6930431
-                    ],
-                    [
-                        1.5692045,
-                        43.6932926
-                    ],
-                    [
-                        1.5695712,
-                        43.6820316
-                    ],
-                    [
-                        1.5912049,
-                        43.6822656
-                    ],
-                    [
-                        1.5917441,
-                        43.6597998
-                    ],
-                    [
-                        1.613421,
-                        43.6600339
-                    ],
-                    [
-                        1.613723,
-                        43.6488291
-                    ],
-                    [
-                        1.6353783,
-                        43.6490788
-                    ],
-                    [
-                        1.6384146,
-                        43.5140731
-                    ],
-                    [
-                        1.2921649,
-                        43.5094658
-                    ],
-                    [
-                        1.2918629,
-                        43.5206966
-                    ],
-                    [
-                        1.2702076,
-                        43.5203994
-                    ],
-                    [
-                        1.2698841,
-                        43.5316437
-                    ],
-                    [
-                        1.2482288,
-                        43.531331
-                    ],
-                    [
-                        1.2476048,
-                        43.5537788
-                    ],
-                    [
-                        1.2259628,
-                        43.5534914
-                    ],
-                    [
-                        1.2256819,
-                        43.564716
-                    ],
-                    [
-                        1.2039835,
-                        43.564419
-                    ],
-                    [
-                        1.2033148,
-                        43.5869049
-                    ],
-                    [
-                        1.1816164,
-                        43.5865611
-                    ],
-                    [
-                        1.1810237,
-                        43.6090368
-                    ],
-                    [
-                        1.1592821,
-                        43.6086932
-                    ],
-                    [
-                        1.1589585,
-                        43.6199523
-                    ],
-                    [
-                        1.1372601,
-                        43.6196244
-                    ],
-                    [
-                        1.1365933,
-                        43.642094
-                    ],
-                    [
-                        1.1149055,
-                        43.6417629
-                    ]
-                ]
-            ],
-            "terms_url": "https://wiki.openstreetmap.org/wiki/Toulouse/ToulouseMetropoleData",
-            "terms_text": "ToulouseMetropole"
-        },
-        {
-            "name": "Tours - Orthophotos 2008",
-            "type": "tms",
-            "template": "http://tms.mapspot.ge/tms/2/nonstandard/{zoom}/{x}/{y}.jpeg",
-            "polygon": [
-                [
-                    [
-                        0.5457462,
-                        47.465264
-                    ],
-                    [
-                        0.54585,
-                        47.4608163
-                    ],
-                    [
-                        0.5392188,
-                        47.4606983
-                    ],
-                    [
-                        0.5393484,
-                        47.456243
-                    ],
-                    [
-                        0.5327959,
-                        47.4561003
-                    ],
-                    [
-                        0.5329011,
-                        47.451565
-                    ],
-                    [
-                        0.52619,
-                        47.4514013
-                    ],
-                    [
-                        0.5265854,
-                        47.4424884
-                    ],
-                    [
-                        0.5000941,
-                        47.4420739
-                    ],
-                    [
-                        0.5002357,
-                        47.4375835
-                    ],
-                    [
-                        0.4936014,
-                        47.4374324
-                    ],
-                    [
-                        0.4937,
-                        47.4329285
-                    ],
-                    [
-                        0.4606141,
-                        47.4324593
-                    ],
-                    [
-                        0.4607248,
-                        47.4279827
-                    ],
-                    [
-                        0.4541016,
-                        47.4278125
-                    ],
-                    [
-                        0.454932,
-                        47.4053921
-                    ],
-                    [
-                        0.4615431,
-                        47.4054476
-                    ],
-                    [
-                        0.4619097,
-                        47.3964924
-                    ],
-                    [
-                        0.4684346,
-                        47.3966005
-                    ],
-                    [
-                        0.4691319,
-                        47.3786415
-                    ],
-                    [
-                        0.4757125,
-                        47.3787609
-                    ],
-                    [
-                        0.4762116,
-                        47.3652018
-                    ],
-                    [
-                        0.4828297,
-                        47.3653499
-                    ],
-                    [
-                        0.4832223,
-                        47.3518574
-                    ],
-                    [
-                        0.5097927,
-                        47.3522592
-                    ],
-                    [
-                        0.5095688,
-                        47.3567713
-                    ],
-                    [
-                        0.5227698,
-                        47.3569785
-                    ],
-                    [
-                        0.5226429,
-                        47.3614867
-                    ],
-                    [
-                        0.5490721,
-                        47.3618878
-                    ],
-                    [
-                        0.5489087,
-                        47.3663307
-                    ],
-                    [
-                        0.5555159,
-                        47.3664985
-                    ],
-                    [
-                        0.5559105,
-                        47.3575522
-                    ],
-                    [
-                        0.6152789,
-                        47.358407
-                    ],
-                    [
-                        0.6152963,
-                        47.362893
-                    ],
-                    [
-                        0.6285093,
-                        47.3630936
-                    ],
-                    [
-                        0.6288256,
-                        47.353987
-                    ],
-                    [
-                        0.6155012,
-                        47.3538823
-                    ],
-                    [
-                        0.6157682,
-                        47.3493424
-                    ],
-                    [
-                        0.6090956,
-                        47.3492991
-                    ],
-                    [
-                        0.6094735,
-                        47.3402962
-                    ],
-                    [
-                        0.6160477,
-                        47.3404448
-                    ],
-                    [
-                        0.616083,
-                        47.3369074
-                    ],
-                    [
-                        0.77497,
-                        47.3388218
-                    ],
-                    [
-                        0.7745786,
-                        47.351628
-                    ],
-                    [
-                        0.7680363,
-                        47.3515901
-                    ],
-                    [
-                        0.767589,
-                        47.3605298
-                    ],
-                    [
-                        0.7742443,
-                        47.3606238
-                    ],
-                    [
-                        0.7733465,
-                        47.3921266
-                    ],
-                    [
-                        0.7667434,
-                        47.3920195
-                    ],
-                    [
-                        0.7664411,
-                        47.4010837
-                    ],
-                    [
-                        0.7730647,
-                        47.4011115
-                    ],
-                    [
-                        0.7728868,
-                        47.4101297
-                    ],
-                    [
-                        0.7661849,
-                        47.4100226
-                    ],
-                    [
-                        0.7660267,
-                        47.4145044
-                    ],
-                    [
-                        0.7527613,
-                        47.4143038
-                    ],
-                    [
-                        0.7529788,
-                        47.4098086
-                    ],
-                    [
-                        0.7462373,
-                        47.4097016
-                    ],
-                    [
-                        0.7459424,
-                        47.4232208
-                    ],
-                    [
-                        0.7392324,
-                        47.4231451
-                    ],
-                    [
-                        0.738869,
-                        47.4366116
-                    ],
-                    [
-                        0.7323267,
-                        47.4365171
-                    ],
-                    [
-                        0.7321869,
-                        47.4410556
-                    ],
-                    [
-                        0.7255048,
-                        47.44098
-                    ],
-                    [
-                        0.7254209,
-                        47.4453479
-                    ],
-                    [
-                        0.7318793,
-                        47.4454803
-                    ],
-                    [
-                        0.7318514,
-                        47.4501126
-                    ],
-                    [
-                        0.7384496,
-                        47.450226
-                    ],
-                    [
-                        0.7383098,
-                        47.454631
-                    ],
-                    [
-                        0.7449359,
-                        47.4547444
-                    ],
-                    [
-                        0.7443209,
-                        47.4771985
-                    ],
-                    [
-                        0.7310685,
-                        47.4769717
-                    ],
-                    [
-                        0.7309008,
-                        47.4815445
-                    ],
-                    [
-                        0.7176205,
-                        47.4812611
-                    ],
-                    [
-                        0.7177883,
-                        47.4768394
-                    ],
-                    [
-                        0.69777,
-                        47.4764993
-                    ],
-                    [
-                        0.6980496,
-                        47.4719827
-                    ],
-                    [
-                        0.6914514,
-                        47.4718882
-                    ],
-                    [
-                        0.6917309,
-                        47.4630241
-                    ],
-                    [
-                        0.6851048,
-                        47.4629295
-                    ],
-                    [
-                        0.684937,
-                        47.4673524
-                    ],
-                    [
-                        0.678255,
-                        47.4673335
-                    ],
-                    [
-                        0.6779754,
-                        47.4762158
-                    ],
-                    [
-                        0.6714051,
-                        47.4761592
-                    ],
-                    [
-                        0.6710417,
-                        47.4881952
-                    ],
-                    [
-                        0.6577334,
-                        47.4879685
-                    ],
-                    [
-                        0.6578173,
-                        47.48504
-                    ],
-                    [
-                        0.6511911,
-                        47.4848322
-                    ],
-                    [
-                        0.6514707,
-                        47.4758568
-                    ],
-                    [
-                        0.6448166,
-                        47.4757245
-                    ],
-                    [
-                        0.6449284,
-                        47.4712646
-                    ],
-                    [
-                        0.6117976,
-                        47.4707543
-                    ],
-                    [
-                        0.6118815,
-                        47.4663129
-                    ],
-                    [
-                        0.6052833,
-                        47.4661239
-                    ],
-                    [
-                        0.6054231,
-                        47.4616631
-                    ],
-                    [
-                        0.5988808,
-                        47.4615497
-                    ],
-                    [
-                        0.5990206,
-                        47.4570886
-                    ],
-                    [
-                        0.572488,
-                        47.4566916
-                    ],
-                    [
-                        0.5721805,
-                        47.4656513
-                    ]
-                ]
-            ],
-            "terms_url": "http://wiki.openstreetmap.org/wiki/Tours/Orthophoto",
-            "terms_text": "Orthophoto Tour(s) Plus 2008"
-        },
-        {
-            "name": "Tours - Orthophotos 2008-2010",
-            "type": "tms",
-            "template": "http://wms.openstreetmap.fr/tms/1.0.0/tours/{zoom}/{x}/{y}",
-            "scaleExtent": [
-                0,
-                20
-            ],
-            "polygon": [
-                [
-                    [
-                        0.5457462,
-                        47.465264
-                    ],
-                    [
-                        0.54585,
-                        47.4608163
-                    ],
-                    [
-                        0.5392188,
-                        47.4606983
-                    ],
-                    [
-                        0.5393484,
-                        47.456243
-                    ],
-                    [
-                        0.5327959,
-                        47.4561003
-                    ],
-                    [
-                        0.5329011,
-                        47.451565
-                    ],
-                    [
-                        0.52619,
-                        47.4514013
-                    ],
-                    [
-                        0.5265854,
-                        47.4424884
-                    ],
-                    [
-                        0.5000941,
-                        47.4420739
-                    ],
-                    [
-                        0.5002357,
-                        47.4375835
-                    ],
-                    [
-                        0.4936014,
-                        47.4374324
-                    ],
-                    [
-                        0.4937,
-                        47.4329285
-                    ],
-                    [
-                        0.4606141,
-                        47.4324593
-                    ],
-                    [
-                        0.4607248,
-                        47.4279827
-                    ],
-                    [
-                        0.4541016,
-                        47.4278125
-                    ],
-                    [
-                        0.454932,
-                        47.4053921
-                    ],
-                    [
-                        0.4615431,
-                        47.4054476
-                    ],
-                    [
-                        0.4619097,
-                        47.3964924
-                    ],
-                    [
-                        0.4684346,
-                        47.3966005
-                    ],
-                    [
-                        0.4691319,
-                        47.3786415
-                    ],
-                    [
-                        0.4757125,
-                        47.3787609
-                    ],
-                    [
-                        0.4762116,
-                        47.3652018
-                    ],
-                    [
-                        0.4828297,
-                        47.3653499
-                    ],
-                    [
-                        0.4829611,
-                        47.3608321
-                    ],
-                    [
-                        0.4763543,
-                        47.360743
-                    ],
-                    [
-                        0.476654,
-                        47.3517263
-                    ],
-                    [
-                        0.4700497,
-                        47.3516186
-                    ],
-                    [
-                        0.4701971,
-                        47.3471313
-                    ],
-                    [
-                        0.4637503,
-                        47.3470104
-                    ],
-                    [
-                        0.4571425,
-                        47.3424146
-                    ],
-                    [
-                        0.4572922,
-                        47.3379061
-                    ],
-                    [
-                        0.4506741,
-                        47.3378081
-                    ],
-                    [
-                        0.4508379,
-                        47.3333051
-                    ],
-                    [
-                        0.4442212,
-                        47.3332032
-                    ],
-                    [
-                        0.4443809,
-                        47.328711
-                    ],
-                    [
-                        0.4311392,
-                        47.3284977
-                    ],
-                    [
-                        0.4316262,
-                        47.3150004
-                    ],
-                    [
-                        0.4382432,
-                        47.3151136
-                    ],
-                    [
-                        0.4383815,
-                        47.3106174
-                    ],
-                    [
-                        0.4714487,
-                        47.3111374
-                    ],
-                    [
-                        0.4713096,
-                        47.3156565
-                    ],
-                    [
-                        0.477888,
-                        47.3157542
-                    ],
-                    [
-                        0.4780733,
-                        47.3112802
-                    ],
-                    [
-                        0.4846826,
-                        47.3113639
-                    ],
-                    [
-                        0.4848576,
-                        47.3068686
-                    ],
-                    [
-                        0.4914359,
-                        47.3069803
-                    ],
-                    [
-                        0.491745,
-                        47.2979733
-                    ],
-                    [
-                        0.4851578,
-                        47.2978722
-                    ],
-                    [
-                        0.4854269,
-                        47.2888744
-                    ],
-                    [
-                        0.4788485,
-                        47.2887697
-                    ],
-                    [
-                        0.4791574,
-                        47.2797818
-                    ],
-                    [
-                        0.4857769,
-                        47.2799005
-                    ],
-                    [
-                        0.4859107,
-                        47.2753885
-                    ],
-                    [
-                        0.492539,
-                        47.2755029
-                    ],
-                    [
-                        0.4926669,
-                        47.2710127
-                    ],
-                    [
-                        0.4992986,
-                        47.2711066
-                    ],
-                    [
-                        0.4994296,
-                        47.2666116
-                    ],
-                    [
-                        0.5192658,
-                        47.2669245
-                    ],
-                    [
-                        0.5194225,
-                        47.2624231
-                    ],
-                    [
-                        0.5260186,
-                        47.2625205
-                    ],
-                    [
-                        0.5258735,
-                        47.2670183
-                    ],
-                    [
-                        0.5456972,
-                        47.2673383
-                    ],
-                    [
-                        0.5455537,
-                        47.2718283
-                    ],
-                    [
-                        0.5587737,
-                        47.2720366
-                    ],
-                    [
-                        0.5586259,
-                        47.2765185
-                    ],
-                    [
-                        0.5652252,
-                        47.2766278
-                    ],
-                    [
-                        0.5650848,
-                        47.2811206
-                    ],
-                    [
-                        0.5716753,
-                        47.2812285
-                    ],
-                    [
-                        0.5715223,
-                        47.2857217
-                    ],
-                    [
-                        0.5781436,
-                        47.2858299
-                    ],
-                    [
-                        0.5779914,
-                        47.2903294
-                    ],
-                    [
-                        0.5846023,
-                        47.2904263
-                    ],
-                    [
-                        0.5843076,
-                        47.2994231
-                    ],
-                    [
-                        0.597499,
-                        47.2996094
-                    ],
-                    [
-                        0.5976637,
-                        47.2951375
-                    ],
-                    [
-                        0.6571596,
-                        47.2960036
-                    ],
-                    [
-                        0.6572988,
-                        47.2915091
-                    ],
-                    [
-                        0.6705019,
-                        47.2917186
-                    ],
-                    [
-                        0.6703475,
-                        47.2962082
-                    ],
-                    [
-                        0.6836175,
-                        47.2963688
-                    ],
-                    [
-                        0.6834322,
-                        47.3008929
-                    ],
-                    [
-                        0.690062,
-                        47.3009558
-                    ],
-                    [
-                        0.6899241,
-                        47.3054703
-                    ],
-                    [
-                        0.7362019,
-                        47.3061157
-                    ],
-                    [
-                        0.7360848,
-                        47.3106063
-                    ],
-                    [
-                        0.7559022,
-                        47.3108935
-                    ],
-                    [
-                        0.7557718,
-                        47.315392
-                    ],
-                    [
-                        0.7623755,
-                        47.3154716
-                    ],
-                    [
-                        0.7622314,
-                        47.3199941
-                    ],
-                    [
-                        0.7754911,
-                        47.3201546
-                    ],
-                    [
-                        0.77497,
-                        47.3388218
-                    ],
-                    [
-                        0.7745786,
-                        47.351628
-                    ],
-                    [
-                        0.7680363,
-                        47.3515901
-                    ],
-                    [
-                        0.767589,
-                        47.3605298
-                    ],
-                    [
-                        0.7742443,
-                        47.3606238
-                    ],
-                    [
-                        0.7733465,
-                        47.3921266
-                    ],
-                    [
-                        0.7667434,
-                        47.3920195
-                    ],
-                    [
-                        0.7664411,
-                        47.4010837
-                    ],
-                    [
-                        0.7730647,
-                        47.4011115
-                    ],
-                    [
-                        0.7728868,
-                        47.4101297
-                    ],
-                    [
-                        0.7661849,
-                        47.4100226
-                    ],
-                    [
-                        0.7660267,
-                        47.4145044
-                    ],
-                    [
-                        0.7527613,
-                        47.4143038
-                    ],
-                    [
-                        0.7529788,
-                        47.4098086
-                    ],
-                    [
-                        0.7462373,
-                        47.4097016
-                    ],
-                    [
-                        0.7459424,
-                        47.4232208
-                    ],
-                    [
-                        0.7392324,
-                        47.4231451
-                    ],
-                    [
-                        0.738869,
-                        47.4366116
-                    ],
-                    [
-                        0.7323267,
-                        47.4365171
-                    ],
-                    [
-                        0.7321869,
-                        47.4410556
-                    ],
-                    [
-                        0.7255048,
-                        47.44098
-                    ],
-                    [
-                        0.7254209,
-                        47.4453479
-                    ],
-                    [
-                        0.7318793,
-                        47.4454803
-                    ],
-                    [
-                        0.7318514,
-                        47.4501126
-                    ],
-                    [
-                        0.7384496,
-                        47.450226
-                    ],
-                    [
-                        0.7383098,
-                        47.454631
-                    ],
-                    [
-                        0.7449359,
-                        47.4547444
-                    ],
-                    [
-                        0.7443209,
-                        47.4771985
-                    ],
-                    [
-                        0.7310685,
-                        47.4769717
-                    ],
-                    [
-                        0.7309008,
-                        47.4815445
-                    ],
-                    [
-                        0.7176205,
-                        47.4812611
-                    ],
-                    [
-                        0.7177883,
-                        47.4768394
-                    ],
-                    [
-                        0.69777,
-                        47.4764993
-                    ],
-                    [
-                        0.6980496,
-                        47.4719827
-                    ],
-                    [
-                        0.6914514,
-                        47.4718882
-                    ],
-                    [
-                        0.6917309,
-                        47.4630241
-                    ],
-                    [
-                        0.6851048,
-                        47.4629295
-                    ],
-                    [
-                        0.684937,
-                        47.4673524
-                    ],
-                    [
-                        0.678255,
-                        47.4673335
-                    ],
-                    [
-                        0.6779754,
-                        47.4762158
-                    ],
-                    [
-                        0.6714051,
-                        47.4761592
-                    ],
-                    [
-                        0.6710417,
-                        47.4881952
-                    ],
-                    [
-                        0.6577334,
-                        47.4879685
-                    ],
-                    [
-                        0.6578173,
-                        47.48504
-                    ],
-                    [
-                        0.6511911,
-                        47.4848322
-                    ],
-                    [
-                        0.6514707,
-                        47.4758568
-                    ],
-                    [
-                        0.6448166,
-                        47.4757245
-                    ],
-                    [
-                        0.6449284,
-                        47.4712646
-                    ],
-                    [
-                        0.6117976,
-                        47.4707543
-                    ],
-                    [
-                        0.6118815,
-                        47.4663129
-                    ],
-                    [
-                        0.6052833,
-                        47.4661239
-                    ],
-                    [
-                        0.6054231,
-                        47.4616631
-                    ],
-                    [
-                        0.5988808,
-                        47.4615497
-                    ],
-                    [
-                        0.5990206,
-                        47.4570886
-                    ],
-                    [
-                        0.572488,
-                        47.4566916
-                    ],
-                    [
-                        0.5721805,
-                        47.4656513
-                    ]
-                ]
-            ],
-            "terms_url": "http://wiki.openstreetmap.org/wiki/Tours/Orthophoto",
-            "terms_text": "Orthophoto Tour(s) Plus 2008"
-        },
-        {
-            "name": "USGS Large Scale Imagery",
-            "type": "tms",
-            "template": "http://{switch:a,b,c}.tile.openstreetmap.us/usgs_large_scale/{zoom}/{x}/{y}.jpg",
-            "scaleExtent": [
-                12,
-                20
-            ],
-            "polygon": [
-                [
-                    [
-                        -123.2549305,
-                        48.7529029
-                    ],
-                    [
-                        -123.2549305,
-                        48.5592263
-                    ],
-                    [
-                        -123.192224,
-                        48.5592263
-                    ],
-                    [
-                        -123.192224,
-                        48.4348366
-                    ],
-                    [
-                        -122.9419646,
-                        48.4348366
-                    ],
-                    [
-                        -122.9419646,
-                        48.3720812
-                    ],
-                    [
-                        -122.8806229,
-                        48.3720812
-                    ],
-                    [
-                        -122.8806229,
-                        48.3094763
-                    ],
-                    [
-                        -122.8167566,
-                        48.3094763
-                    ],
-                    [
-                        -122.8167566,
-                        48.1904587
-                    ],
-                    [
-                        -123.0041133,
-                        48.1904587
-                    ],
-                    [
-                        -123.0041133,
-                        48.1275918
-                    ],
-                    [
-                        -123.058416,
-                        48.1275918
-                    ],
-                    [
-                        -123.058416,
-                        48.190514
-                    ],
-                    [
-                        -123.254113,
-                        48.190514
-                    ],
-                    [
-                        -123.254113,
-                        48.1274982
-                    ],
-                    [
-                        -123.3706593,
-                        48.1274982
-                    ],
-                    [
-                        -123.3706593,
-                        48.1908403
-                    ],
-                    [
-                        -124.0582632,
-                        48.1908403
-                    ],
-                    [
-                        -124.0582632,
-                        48.253442
-                    ],
-                    [
-                        -124.1815163,
-                        48.253442
-                    ],
-                    [
-                        -124.1815163,
-                        48.3164666
-                    ],
-                    [
-                        -124.4319117,
-                        48.3164666
-                    ],
-                    [
-                        -124.4319117,
-                        48.3782613
-                    ],
-                    [
-                        -124.5564618,
-                        48.3782613
-                    ],
-                    [
-                        -124.5564618,
-                        48.4408305
-                    ],
-                    [
-                        -124.7555107,
-                        48.4408305
-                    ],
-                    [
-                        -124.7555107,
-                        48.1914986
-                    ],
-                    [
-                        -124.8185282,
-                        48.1914986
-                    ],
-                    [
-                        -124.8185282,
-                        48.1228381
-                    ],
-                    [
-                        -124.7552951,
-                        48.1228381
-                    ],
-                    [
-                        -124.7552951,
-                        47.5535253
-                    ],
-                    [
-                        -124.3812108,
-                        47.5535253
-                    ],
-                    [
-                        -124.3812108,
-                        47.1218696
-                    ],
-                    [
-                        -124.1928897,
-                        47.1218696
-                    ],
-                    [
-                        -124.1928897,
-                        43.7569431
-                    ],
-                    [
-                        -124.4443382,
-                        43.7569431
-                    ],
-                    [
-                        -124.4443382,
-                        43.1425556
-                    ],
-                    [
-                        -124.6398855,
-                        43.1425556
-                    ],
-                    [
-                        -124.6398855,
-                        42.6194503
-                    ],
-                    [
-                        -124.4438525,
-                        42.6194503
-                    ],
-                    [
-                        -124.4438525,
-                        39.8080662
-                    ],
-                    [
-                        -123.8815685,
-                        39.8080662
-                    ],
-                    [
-                        -123.8815685,
-                        39.1102825
-                    ],
-                    [
-                        -123.75805,
-                        39.1102825
-                    ],
-                    [
-                        -123.75805,
-                        38.4968799
-                    ],
-                    [
-                        -123.2702803,
-                        38.4968799
-                    ],
-                    [
-                        -123.2702803,
-                        37.9331905
-                    ],
-                    [
-                        -122.8148084,
-                        37.9331905
-                    ],
-                    [
-                        -122.8148084,
-                        37.8019606
-                    ],
-                    [
-                        -122.5664316,
-                        37.8019606
-                    ],
-                    [
-                        -122.5664316,
-                        36.9319611
-                    ],
-                    [
-                        -121.8784026,
-                        36.9319611
-                    ],
-                    [
-                        -121.8784026,
-                        36.6897596
-                    ],
-                    [
-                        -122.0034748,
-                        36.6897596
-                    ],
-                    [
-                        -122.0034748,
-                        36.4341056
-                    ],
-                    [
-                        -121.9414159,
-                        36.4341056
-                    ],
-                    [
-                        -121.9414159,
-                        35.9297636
-                    ],
-                    [
-                        -121.5040977,
-                        35.9297636
-                    ],
-                    [
-                        -121.5040977,
-                        35.8100273
-                    ],
-                    [
-                        -121.3790276,
-                        35.8100273
-                    ],
-                    [
-                        -121.3790276,
-                        35.4239164
-                    ],
-                    [
-                        -120.9426515,
-                        35.4239164
-                    ],
-                    [
-                        -120.9426515,
-                        35.1849683
-                    ],
-                    [
-                        -120.8171978,
-                        35.1849683
-                    ],
-                    [
-                        -120.8171978,
-                        35.1219894
-                    ],
-                    [
-                        -120.6918447,
-                        35.1219894
-                    ],
-                    [
-                        -120.6918447,
-                        34.4966794
-                    ],
-                    [
-                        -120.5045898,
-                        34.4966794
-                    ],
-                    [
-                        -120.5045898,
-                        34.4339651
-                    ],
-                    [
-                        -120.0078775,
-                        34.4339651
-                    ],
-                    [
-                        -120.0078775,
-                        34.3682626
-                    ],
-                    [
-                        -119.5283517,
-                        34.3682626
-                    ],
-                    [
-                        -119.5283517,
-                        34.0576434
-                    ],
-                    [
-                        -119.0060985,
-                        34.0576434
-                    ],
-                    [
-                        -119.0060985,
-                        33.9975267
-                    ],
-                    [
-                        -118.5046259,
-                        33.9975267
-                    ],
-                    [
-                        -118.5046259,
-                        33.8694631
-                    ],
-                    [
-                        -118.4413209,
-                        33.8694631
-                    ],
-                    [
-                        -118.4413209,
-                        33.6865253
-                    ],
-                    [
-                        -118.066912,
-                        33.6865253
-                    ],
-                    [
-                        -118.066912,
-                        33.3063832
-                    ],
-                    [
-                        -117.5030045,
-                        33.3063832
-                    ],
-                    [
-                        -117.5030045,
-                        33.0500337
-                    ],
-                    [
-                        -117.3188195,
-                        33.0500337
-                    ],
-                    [
-                        -117.3188195,
-                        32.6205888
-                    ],
-                    [
-                        -117.1917023,
-                        32.6205888
-                    ],
-                    [
-                        -117.1917023,
-                        32.4974566
-                    ],
-                    [
-                        -116.746496,
-                        32.4974566
-                    ],
-                    [
-                        -116.746496,
-                        32.5609161
-                    ],
-                    [
-                        -115.9970138,
-                        32.5609161
-                    ],
-                    [
-                        -115.9970138,
-                        32.6264942
-                    ],
-                    [
-                        -114.8808125,
-                        32.6264942
-                    ],
-                    [
-                        -114.8808125,
-                        32.4340796
-                    ],
-                    [
-                        -114.6294474,
-                        32.4340796
-                    ],
-                    [
-                        -114.6294474,
-                        32.3731636
-                    ],
-                    [
-                        -114.4447437,
-                        32.3731636
-                    ],
-                    [
-                        -114.4447437,
-                        32.3075418
-                    ],
-                    [
-                        -114.2557628,
-                        32.3075418
-                    ],
-                    [
-                        -114.2557628,
-                        32.2444561
-                    ],
-                    [
-                        -114.0680274,
-                        32.2444561
-                    ],
-                    [
-                        -114.0680274,
-                        32.1829113
-                    ],
-                    [
-                        -113.8166499,
-                        32.1829113
-                    ],
-                    [
-                        -113.8166499,
-                        32.1207622
-                    ],
-                    [
-                        -113.6307421,
-                        32.1207622
-                    ],
-                    [
-                        -113.6307421,
-                        32.0565099
-                    ],
-                    [
-                        -113.4417495,
-                        32.0565099
-                    ],
-                    [
-                        -113.4417495,
-                        31.9984372
-                    ],
-                    [
-                        -113.2546027,
-                        31.9984372
-                    ],
-                    [
-                        -113.2546027,
-                        31.9325434
-                    ],
-                    [
-                        -113.068072,
-                        31.9325434
-                    ],
-                    [
-                        -113.068072,
-                        31.8718062
-                    ],
-                    [
-                        -112.8161105,
-                        31.8718062
-                    ],
-                    [
-                        -112.8161105,
-                        31.8104171
-                    ],
-                    [
-                        -112.6308756,
-                        31.8104171
-                    ],
-                    [
-                        -112.6308756,
-                        31.7464723
-                    ],
-                    [
-                        -112.4418918,
-                        31.7464723
-                    ],
-                    [
-                        -112.4418918,
-                        31.6856001
-                    ],
-                    [
-                        -112.257192,
-                        31.6856001
-                    ],
-                    [
-                        -112.257192,
-                        31.6210352
-                    ],
-                    [
-                        -112.0033787,
-                        31.6210352
-                    ],
-                    [
-                        -112.0033787,
-                        31.559584
-                    ],
-                    [
-                        -111.815619,
-                        31.559584
-                    ],
-                    [
-                        -111.815619,
-                        31.4970238
-                    ],
-                    [
-                        -111.6278586,
-                        31.4970238
-                    ],
-                    [
-                        -111.6278586,
-                        31.4339867
-                    ],
-                    [
-                        -111.4418978,
-                        31.4339867
-                    ],
-                    [
-                        -111.4418978,
-                        31.3733859
-                    ],
-                    [
-                        -111.2559708,
-                        31.3733859
-                    ],
-                    [
-                        -111.2559708,
-                        31.3113225
-                    ],
-                    [
-                        -108.1845822,
-                        31.3113225
-                    ],
-                    [
-                        -108.1845822,
-                        31.7459502
-                    ],
-                    [
-                        -106.5065055,
-                        31.7459502
-                    ],
-                    [
-                        -106.5065055,
-                        31.6842308
-                    ],
-                    [
-                        -106.3797265,
-                        31.6842308
-                    ],
-                    [
-                        -106.3797265,
-                        31.621752
-                    ],
-                    [
-                        -106.317434,
-                        31.621752
-                    ],
-                    [
-                        -106.317434,
-                        31.4968167
-                    ],
-                    [
-                        -106.2551769,
-                        31.4968167
-                    ],
-                    [
-                        -106.2551769,
-                        31.4344889
-                    ],
-                    [
-                        -106.1924698,
-                        31.4344889
-                    ],
-                    [
-                        -106.1924698,
-                        31.3721296
-                    ],
-                    [
-                        -106.0039212,
-                        31.3721296
-                    ],
-                    [
-                        -106.0039212,
-                        31.309328
-                    ],
-                    [
-                        -105.9416582,
-                        31.309328
-                    ],
-                    [
-                        -105.9416582,
-                        31.2457547
-                    ],
-                    [
-                        -105.8798174,
-                        31.2457547
-                    ],
-                    [
-                        -105.8798174,
-                        31.1836194
-                    ],
-                    [
-                        -105.8162349,
-                        31.1836194
-                    ],
-                    [
-                        -105.8162349,
-                        31.1207155
-                    ],
-                    [
-                        -105.6921198,
-                        31.1207155
-                    ],
-                    [
-                        -105.6921198,
-                        31.0584835
-                    ],
-                    [
-                        -105.6302881,
-                        31.0584835
-                    ],
-                    [
-                        -105.6302881,
-                        30.9328271
-                    ],
-                    [
-                        -105.5044418,
-                        30.9328271
-                    ],
-                    [
-                        -105.5044418,
-                        30.8715864
-                    ],
-                    [
-                        -105.4412973,
-                        30.8715864
-                    ],
-                    [
-                        -105.4412973,
-                        30.808463
-                    ],
-                    [
-                        -105.3781497,
-                        30.808463
-                    ],
-                    [
-                        -105.3781497,
-                        30.7471828
-                    ],
-                    [
-                        -105.1904658,
-                        30.7471828
-                    ],
-                    [
-                        -105.1904658,
-                        30.6843231
-                    ],
-                    [
-                        -105.1286244,
-                        30.6843231
-                    ],
-                    [
-                        -105.1286244,
-                        30.6199737
-                    ],
-                    [
-                        -105.0036504,
-                        30.6199737
-                    ],
-                    [
-                        -105.0036504,
-                        30.5589058
-                    ],
-                    [
-                        -104.9417962,
-                        30.5589058
-                    ],
-                    [
-                        -104.9417962,
-                        30.4963236
-                    ],
-                    [
-                        -104.8782018,
-                        30.4963236
-                    ],
-                    [
-                        -104.8782018,
-                        30.3098261
-                    ],
-                    [
-                        -104.8155257,
-                        30.3098261
-                    ],
-                    [
-                        -104.8155257,
-                        30.2478305
-                    ],
-                    [
-                        -104.7536079,
-                        30.2478305
-                    ],
-                    [
-                        -104.7536079,
-                        29.9353916
-                    ],
-                    [
-                        -104.690949,
-                        29.9353916
-                    ],
-                    [
-                        -104.690949,
-                        29.8090156
-                    ],
-                    [
-                        -104.6291301,
-                        29.8090156
-                    ],
-                    [
-                        -104.6291301,
-                        29.6843577
-                    ],
-                    [
-                        -104.5659869,
-                        29.6843577
-                    ],
-                    [
-                        -104.5659869,
-                        29.6223459
-                    ],
-                    [
-                        -104.5037188,
-                        29.6223459
-                    ],
-                    [
-                        -104.5037188,
-                        29.5595436
-                    ],
-                    [
-                        -104.4410072,
-                        29.5595436
-                    ],
-                    [
-                        -104.4410072,
-                        29.4974832
-                    ],
-                    [
-                        -104.2537551,
-                        29.4974832
-                    ],
-                    [
-                        -104.2537551,
-                        29.3716718
-                    ],
-                    [
-                        -104.1291984,
-                        29.3716718
-                    ],
-                    [
-                        -104.1291984,
-                        29.3091621
-                    ],
-                    [
-                        -104.0688737,
-                        29.3091621
-                    ],
-                    [
-                        -104.0688737,
-                        29.2467276
-                    ],
-                    [
-                        -103.8187309,
-                        29.2467276
-                    ],
-                    [
-                        -103.8187309,
-                        29.1843076
-                    ],
-                    [
-                        -103.755736,
-                        29.1843076
-                    ],
-                    [
-                        -103.755736,
-                        29.1223174
-                    ],
-                    [
-                        -103.5667542,
-                        29.1223174
-                    ],
-                    [
-                        -103.5667542,
-                        29.0598119
-                    ],
-                    [
-                        -103.5049819,
-                        29.0598119
-                    ],
-                    [
-                        -103.5049819,
-                        28.9967506
-                    ],
-                    [
-                        -103.3165753,
-                        28.9967506
-                    ],
-                    [
-                        -103.3165753,
-                        28.9346923
-                    ],
-                    [
-                        -103.0597572,
-                        28.9346923
-                    ],
-                    [
-                        -103.0597572,
-                        29.0592965
-                    ],
-                    [
-                        -102.9979694,
-                        29.0592965
-                    ],
-                    [
-                        -102.9979694,
-                        29.1212855
-                    ],
-                    [
-                        -102.9331397,
-                        29.1212855
-                    ],
-                    [
-                        -102.9331397,
-                        29.1848575
-                    ],
-                    [
-                        -102.8095989,
-                        29.1848575
-                    ],
-                    [
-                        -102.8095989,
-                        29.2526154
-                    ],
-                    [
-                        -102.8701345,
-                        29.2526154
-                    ],
-                    [
-                        -102.8701345,
-                        29.308096
-                    ],
-                    [
-                        -102.8096681,
-                        29.308096
-                    ],
-                    [
-                        -102.8096681,
-                        29.3715484
-                    ],
-                    [
-                        -102.7475655,
-                        29.3715484
-                    ],
-                    [
-                        -102.7475655,
-                        29.5581899
-                    ],
-                    [
-                        -102.684554,
-                        29.5581899
-                    ],
-                    [
-                        -102.684554,
-                        29.6847655
-                    ],
-                    [
-                        -102.4967764,
-                        29.6847655
-                    ],
-                    [
-                        -102.4967764,
-                        29.7457694
-                    ],
-                    [
-                        -102.3086647,
-                        29.7457694
-                    ],
-                    [
-                        -102.3086647,
-                        29.8086627
-                    ],
-                    [
-                        -102.1909323,
-                        29.8086627
-                    ],
-                    [
-                        -102.1909323,
-                        29.7460097
-                    ],
-                    [
-                        -101.5049914,
-                        29.7460097
-                    ],
-                    [
-                        -101.5049914,
-                        29.6846777
-                    ],
-                    [
-                        -101.3805796,
-                        29.6846777
-                    ],
-                    [
-                        -101.3805796,
-                        29.5594459
-                    ],
-                    [
-                        -101.3175057,
-                        29.5594459
-                    ],
-                    [
-                        -101.3175057,
-                        29.4958934
-                    ],
-                    [
-                        -101.1910075,
-                        29.4958934
-                    ],
-                    [
-                        -101.1910075,
-                        29.4326115
-                    ],
-                    [
-                        -101.067501,
-                        29.4326115
-                    ],
-                    [
-                        -101.067501,
-                        29.308808
-                    ],
-                    [
-                        -100.9418897,
-                        29.308808
-                    ],
-                    [
-                        -100.9418897,
-                        29.2456231
-                    ],
-                    [
-                        -100.8167271,
-                        29.2456231
-                    ],
-                    [
-                        -100.8167271,
-                        29.1190449
-                    ],
-                    [
-                        -100.7522672,
-                        29.1190449
-                    ],
-                    [
-                        -100.7522672,
-                        29.0578214
-                    ],
-                    [
-                        -100.6925358,
-                        29.0578214
-                    ],
-                    [
-                        -100.6925358,
-                        28.8720431
-                    ],
-                    [
-                        -100.6290158,
-                        28.8720431
-                    ],
-                    [
-                        -100.6290158,
-                        28.8095363
-                    ],
-                    [
-                        -100.5679901,
-                        28.8095363
-                    ],
-                    [
-                        -100.5679901,
-                        28.622554
-                    ],
-                    [
-                        -100.5040411,
-                        28.622554
-                    ],
-                    [
-                        -100.5040411,
-                        28.5583804
-                    ],
-                    [
-                        -100.4421832,
-                        28.5583804
-                    ],
-                    [
-                        -100.4421832,
-                        28.4968266
-                    ],
-                    [
-                        -100.379434,
-                        28.4968266
-                    ],
-                    [
-                        -100.379434,
-                        28.3092865
-                    ],
-                    [
-                        -100.3171942,
-                        28.3092865
-                    ],
-                    [
-                        -100.3171942,
-                        28.1835681
-                    ],
-                    [
-                        -100.254483,
-                        28.1835681
-                    ],
-                    [
-                        -100.254483,
-                        28.1213885
-                    ],
-                    [
-                        -100.1282282,
-                        28.1213885
-                    ],
-                    [
-                        -100.1282282,
-                        28.059215
-                    ],
-                    [
-                        -100.0659537,
-                        28.059215
-                    ],
-                    [
-                        -100.0659537,
-                        27.9966087
-                    ],
-                    [
-                        -100.0023855,
-                        27.9966087
-                    ],
-                    [
-                        -100.0023855,
-                        27.9332152
-                    ],
-                    [
-                        -99.9426497,
-                        27.9332152
-                    ],
-                    [
-                        -99.9426497,
-                        27.7454658
-                    ],
-                    [
-                        -99.816851,
-                        27.7454658
-                    ],
-                    [
-                        -99.816851,
-                        27.6834301
-                    ],
-                    [
-                        -99.7541346,
-                        27.6834301
-                    ],
-                    [
-                        -99.7541346,
-                        27.6221543
-                    ],
-                    [
-                        -99.6291629,
-                        27.6221543
-                    ],
-                    [
-                        -99.6291629,
-                        27.5588977
-                    ],
-                    [
-                        -99.5672838,
-                        27.5588977
-                    ],
-                    [
-                        -99.5672838,
-                        27.4353752
-                    ],
-                    [
-                        -99.5041798,
-                        27.4353752
-                    ],
-                    [
-                        -99.5041798,
-                        27.3774021
-                    ],
-                    [
-                        -99.5671796,
-                        27.3774021
-                    ],
-                    [
-                        -99.5671796,
-                        27.2463726
-                    ],
-                    [
-                        -99.504975,
-                        27.2463726
-                    ],
-                    [
-                        -99.504975,
-                        26.9965649
-                    ],
-                    [
-                        -99.4427427,
-                        26.9965649
-                    ],
-                    [
-                        -99.4427427,
-                        26.872803
-                    ],
-                    [
-                        -99.3800633,
-                        26.872803
-                    ],
-                    [
-                        -99.3800633,
-                        26.8068179
-                    ],
-                    [
-                        -99.3190684,
-                        26.8068179
-                    ],
-                    [
-                        -99.3190684,
-                        26.7473614
-                    ],
-                    [
-                        -99.2537541,
-                        26.7473614
-                    ],
-                    [
-                        -99.2537541,
-                        26.6210068
-                    ],
-                    [
-                        -99.1910617,
-                        26.6210068
-                    ],
-                    [
-                        -99.1910617,
-                        26.4956737
-                    ],
-                    [
-                        -99.1300639,
-                        26.4956737
-                    ],
-                    [
-                        -99.1300639,
-                        26.3713808
-                    ],
-                    [
-                        -99.0029473,
-                        26.3713808
-                    ],
-                    [
-                        -99.0029473,
-                        26.3093836
-                    ],
-                    [
-                        -98.816572,
-                        26.3093836
-                    ],
-                    [
-                        -98.816572,
-                        26.2457762
-                    ],
-                    [
-                        -98.6920082,
-                        26.2457762
-                    ],
-                    [
-                        -98.6920082,
-                        26.1837096
-                    ],
-                    [
-                        -98.4440896,
-                        26.1837096
-                    ],
-                    [
-                        -98.4440896,
-                        26.1217217
-                    ],
-                    [
-                        -98.3823181,
-                        26.1217217
-                    ],
-                    [
-                        -98.3823181,
-                        26.0596488
-                    ],
-                    [
-                        -98.2532707,
-                        26.0596488
-                    ],
-                    [
-                        -98.2532707,
-                        25.9986871
-                    ],
-                    [
-                        -98.0109084,
-                        25.9986871
-                    ],
-                    [
-                        -98.0109084,
-                        25.9932255
-                    ],
-                    [
-                        -97.6932319,
-                        25.9932255
-                    ],
-                    [
-                        -97.6932319,
-                        25.9334103
-                    ],
-                    [
-                        -97.6313904,
-                        25.9334103
-                    ],
-                    [
-                        -97.6313904,
-                        25.8695893
-                    ],
-                    [
-                        -97.5046779,
-                        25.8695893
-                    ],
-                    [
-                        -97.5046779,
-                        25.8073488
-                    ],
-                    [
-                        -97.3083401,
-                        25.8073488
-                    ],
-                    [
-                        -97.3083401,
-                        25.8731159
-                    ],
-                    [
-                        -97.2456326,
-                        25.8731159
-                    ],
-                    [
-                        -97.2456326,
-                        25.9353731
-                    ],
-                    [
-                        -97.1138939,
-                        25.9353731
-                    ],
-                    [
-                        -97.1138939,
-                        27.6809179
-                    ],
-                    [
-                        -97.0571035,
-                        27.6809179
-                    ],
-                    [
-                        -97.0571035,
-                        27.8108242
-                    ],
-                    [
-                        -95.5810766,
-                        27.8108242
-                    ],
-                    [
-                        -95.5810766,
-                        28.7468827
-                    ],
-                    [
-                        -94.271041,
-                        28.7468827
-                    ],
-                    [
-                        -94.271041,
-                        29.5594076
-                    ],
-                    [
-                        -92.5029947,
-                        29.5594076
-                    ],
-                    [
-                        -92.5029947,
-                        29.4974754
-                    ],
-                    [
-                        -91.8776216,
-                        29.4974754
-                    ],
-                    [
-                        -91.8776216,
-                        29.3727013
-                    ],
-                    [
-                        -91.378418,
-                        29.3727013
-                    ],
-                    [
-                        -91.378418,
-                        29.2468326
-                    ],
-                    [
-                        -91.3153953,
-                        29.2468326
-                    ],
-                    [
-                        -91.3153953,
-                        29.1844301
-                    ],
-                    [
-                        -91.1294702,
-                        29.1844301
-                    ],
-                    [
-                        -91.1294702,
-                        29.1232559
-                    ],
-                    [
-                        -91.0052632,
-                        29.1232559
-                    ],
-                    [
-                        -91.0052632,
-                        28.9968437
-                    ],
-                    [
-                        -89.4500159,
-                        28.9968437
-                    ],
-                    [
-                        -89.4500159,
-                        28.8677422
-                    ],
-                    [
-                        -88.8104309,
-                        28.8677422
-                    ],
-                    [
-                        -88.8104309,
-                        30.1841864
-                    ],
-                    [
-                        -85.8791527,
-                        30.1841864
-                    ],
-                    [
-                        -85.8791527,
-                        29.5455038
-                    ],
-                    [
-                        -84.8368083,
-                        29.5455038
-                    ],
-                    [
-                        -84.8368083,
-                        29.6225158
-                    ],
-                    [
-                        -84.7482786,
-                        29.6225158
-                    ],
-                    [
-                        -84.7482786,
-                        29.683624
-                    ],
-                    [
-                        -84.685894,
-                        29.683624
-                    ],
-                    [
-                        -84.685894,
-                        29.7468386
-                    ],
-                    [
-                        -83.6296975,
-                        29.7468386
-                    ],
-                    [
-                        -83.6296975,
-                        29.4324361
-                    ],
-                    [
-                        -83.3174937,
-                        29.4324361
-                    ],
-                    [
-                        -83.3174937,
-                        29.0579442
-                    ],
-                    [
-                        -82.879659,
-                        29.0579442
-                    ],
-                    [
-                        -82.879659,
-                        27.7453529
-                    ],
-                    [
-                        -82.8182822,
-                        27.7453529
-                    ],
-                    [
-                        -82.8182822,
-                        26.9290868
-                    ],
-                    [
-                        -82.3796782,
-                        26.9290868
-                    ],
-                    [
-                        -82.3796782,
-                        26.3694183
-                    ],
-                    [
-                        -81.8777106,
-                        26.3694183
-                    ],
-                    [
-                        -81.8777106,
-                        25.805971
-                    ],
-                    [
-                        -81.5036862,
-                        25.805971
-                    ],
-                    [
-                        -81.5036862,
-                        25.7474753
-                    ],
-                    [
-                        -81.4405462,
-                        25.7474753
-                    ],
-                    [
-                        -81.4405462,
-                        25.6851489
-                    ],
-                    [
-                        -81.3155883,
-                        25.6851489
-                    ],
-                    [
-                        -81.3155883,
-                        25.5600985
-                    ],
-                    [
-                        -81.2538534,
-                        25.5600985
-                    ],
-                    [
-                        -81.2538534,
-                        25.4342361
-                    ],
-                    [
-                        -81.1902012,
-                        25.4342361
-                    ],
-                    [
-                        -81.1902012,
-                        25.1234341
-                    ],
-                    [
-                        -81.1288133,
-                        25.1234341
-                    ],
-                    [
-                        -81.1288133,
-                        25.0619389
-                    ],
-                    [
-                        -81.0649231,
-                        25.0619389
-                    ],
-                    [
-                        -81.0649231,
-                        24.8157807
-                    ],
-                    [
-                        -81.6289469,
-                        24.8157807
-                    ],
-                    [
-                        -81.6289469,
-                        24.7538367
-                    ],
-                    [
-                        -81.6907173,
-                        24.7538367
-                    ],
-                    [
-                        -81.6907173,
-                        24.6899374
-                    ],
-                    [
-                        -81.8173189,
-                        24.6899374
-                    ],
-                    [
-                        -81.8173189,
-                        24.6279161
-                    ],
-                    [
-                        -82.1910041,
-                        24.6279161
-                    ],
-                    [
-                        -82.1910041,
-                        24.496294
-                    ],
-                    [
-                        -81.6216596,
-                        24.496294
-                    ],
-                    [
-                        -81.6216596,
-                        24.559484
-                    ],
-                    [
-                        -81.372006,
-                        24.559484
-                    ],
-                    [
-                        -81.372006,
-                        24.6220687
-                    ],
-                    [
-                        -81.0593278,
-                        24.6220687
-                    ],
-                    [
-                        -81.0593278,
-                        24.684826
-                    ],
-                    [
-                        -80.9347147,
-                        24.684826
-                    ],
-                    [
-                        -80.9347147,
-                        24.7474828
-                    ],
-                    [
-                        -80.7471081,
-                        24.7474828
-                    ],
-                    [
-                        -80.7471081,
-                        24.8100618
-                    ],
-                    [
-                        -80.3629898,
-                        24.8100618
-                    ],
-                    [
-                        -80.3629898,
-                        25.1175858
-                    ],
-                    [
-                        -80.122344,
-                        25.1175858
-                    ],
-                    [
-                        -80.122344,
-                        25.7472357
-                    ],
-                    [
-                        -80.0588458,
-                        25.7472357
-                    ],
-                    [
-                        -80.0588458,
-                        26.3708251
-                    ],
-                    [
-                        -79.995837,
-                        26.3708251
-                    ],
-                    [
-                        -79.995837,
-                        26.9398003
-                    ],
-                    [
-                        -80.0587265,
-                        26.9398003
-                    ],
-                    [
-                        -80.0587265,
-                        27.1277466
-                    ],
-                    [
-                        -80.1226251,
-                        27.1277466
-                    ],
-                    [
-                        -80.1226251,
-                        27.2534279
-                    ],
-                    [
-                        -80.1846956,
-                        27.2534279
-                    ],
-                    [
-                        -80.1846956,
-                        27.3781229
-                    ],
-                    [
-                        -80.246175,
-                        27.3781229
-                    ],
-                    [
-                        -80.246175,
-                        27.5658729
-                    ],
-                    [
-                        -80.3094768,
-                        27.5658729
-                    ],
-                    [
-                        -80.3094768,
-                        27.7530311
-                    ],
-                    [
-                        -80.3721485,
-                        27.7530311
-                    ],
-                    [
-                        -80.3721485,
-                        27.8774451
-                    ],
-                    [
-                        -80.4351457,
-                        27.8774451
-                    ],
-                    [
-                        -80.4351457,
-                        28.0033366
-                    ],
-                    [
-                        -80.4966078,
-                        28.0033366
-                    ],
-                    [
-                        -80.4966078,
-                        28.1277326
-                    ],
-                    [
-                        -80.5587159,
-                        28.1277326
-                    ],
-                    [
-                        -80.5587159,
-                        28.3723509
-                    ],
-                    [
-                        -80.4966335,
-                        28.3723509
-                    ],
-                    [
-                        -80.4966335,
-                        29.5160326
-                    ],
-                    [
-                        -81.1213644,
-                        29.5160326
-                    ],
-                    [
-                        -81.1213644,
-                        31.6846966
-                    ],
-                    [
-                        -80.6018723,
-                        31.6846966
-                    ],
-                    [
-                        -80.6018723,
-                        32.2475309
-                    ],
-                    [
-                        -79.4921024,
-                        32.2475309
-                    ],
-                    [
-                        -79.4921024,
-                        32.9970261
-                    ],
-                    [
-                        -79.1116488,
-                        32.9970261
-                    ],
-                    [
-                        -79.1116488,
-                        33.3729457
-                    ],
-                    [
-                        -78.6153621,
-                        33.3729457
-                    ],
-                    [
-                        -78.6153621,
-                        33.8097638
-                    ],
-                    [
-                        -77.9316963,
-                        33.8097638
-                    ],
-                    [
-                        -77.9316963,
-                        33.8718243
-                    ],
-                    [
-                        -77.8692252,
-                        33.8718243
-                    ],
-                    [
-                        -77.8692252,
-                        34.0552454
-                    ],
-                    [
-                        -77.6826392,
-                        34.0552454
-                    ],
-                    [
-                        -77.6826392,
-                        34.2974598
-                    ],
-                    [
-                        -77.2453509,
-                        34.2974598
-                    ],
-                    [
-                        -77.2453509,
-                        34.5598585
-                    ],
-                    [
-                        -76.4973277,
-                        34.5598585
-                    ],
-                    [
-                        -76.4973277,
-                        34.622796
-                    ],
-                    [
-                        -76.4337602,
-                        34.622796
-                    ],
-                    [
-                        -76.4337602,
-                        34.6849285
-                    ],
-                    [
-                        -76.373212,
-                        34.6849285
-                    ],
-                    [
-                        -76.373212,
-                        34.7467674
-                    ],
-                    [
-                        -76.3059364,
-                        34.7467674
-                    ],
-                    [
-                        -76.3059364,
-                        34.808551
-                    ],
-                    [
-                        -76.2468017,
-                        34.808551
-                    ],
-                    [
-                        -76.2468017,
-                        34.8728418
-                    ],
-                    [
-                        -76.1825922,
-                        34.8728418
-                    ],
-                    [
-                        -76.1825922,
-                        34.9335332
-                    ],
-                    [
-                        -76.120814,
-                        34.9335332
-                    ],
-                    [
-                        -76.120814,
-                        34.9952359
-                    ],
-                    [
-                        -75.9979015,
-                        34.9952359
-                    ],
-                    [
-                        -75.9979015,
-                        35.0578182
-                    ],
-                    [
-                        -75.870338,
-                        35.0578182
-                    ],
-                    [
-                        -75.870338,
-                        35.1219097
-                    ],
-                    [
-                        -75.7462194,
-                        35.1219097
-                    ],
-                    [
-                        -75.7462194,
-                        35.1818911
-                    ],
-                    [
-                        -75.4929694,
-                        35.1818911
-                    ],
-                    [
-                        -75.4929694,
-                        35.3082988
-                    ],
-                    [
-                        -75.4325662,
-                        35.3082988
-                    ],
-                    [
-                        -75.4325662,
-                        35.7542495
-                    ],
-                    [
-                        -75.4969907,
-                        35.7542495
-                    ],
-                    [
-                        -75.4969907,
-                        37.8105602
-                    ],
-                    [
-                        -75.3082972,
-                        37.8105602
-                    ],
-                    [
-                        -75.3082972,
-                        37.8720088
-                    ],
-                    [
-                        -75.245601,
-                        37.8720088
-                    ],
-                    [
-                        -75.245601,
-                        37.9954849
-                    ],
-                    [
-                        -75.1828751,
-                        37.9954849
-                    ],
-                    [
-                        -75.1828751,
-                        38.0585079
-                    ],
-                    [
-                        -75.1184793,
-                        38.0585079
-                    ],
-                    [
-                        -75.1184793,
-                        38.2469091
-                    ],
-                    [
-                        -75.0592098,
-                        38.2469091
-                    ],
-                    [
-                        -75.0592098,
-                        38.3704316
-                    ],
-                    [
-                        -74.9948111,
-                        38.3704316
-                    ],
-                    [
-                        -74.9948111,
-                        38.8718417
-                    ],
-                    [
-                        -74.4878252,
-                        38.8718417
-                    ],
-                    [
-                        -74.4878252,
-                        39.3089428
-                    ],
-                    [
-                        -74.1766317,
-                        39.3089428
-                    ],
-                    [
-                        -74.1766317,
-                        39.6224653
-                    ],
-                    [
-                        -74.0567045,
-                        39.6224653
-                    ],
-                    [
-                        -74.0567045,
-                        39.933178
-                    ],
-                    [
-                        -73.9959035,
-                        39.933178
-                    ],
-                    [
-                        -73.9959035,
-                        40.1854852
-                    ],
-                    [
-                        -73.9341593,
-                        40.1854852
-                    ],
-                    [
-                        -73.9341593,
-                        40.4959486
-                    ],
-                    [
-                        -73.8723024,
-                        40.4959486
-                    ],
-                    [
-                        -73.8723024,
-                        40.5527135
-                    ],
-                    [
-                        -71.8074506,
-                        40.5527135
-                    ],
-                    [
-                        -71.8074506,
-                        41.3088005
-                    ],
-                    [
-                        -70.882512,
-                        41.3088005
-                    ],
-                    [
-                        -70.882512,
-                        41.184978
-                    ],
-                    [
-                        -70.7461947,
-                        41.184978
-                    ],
-                    [
-                        -70.7461947,
-                        41.3091865
-                    ],
-                    [
-                        -70.4337553,
-                        41.3091865
-                    ],
-                    [
-                        -70.4337553,
-                        41.4963885
-                    ],
-                    [
-                        -69.9334281,
-                        41.4963885
-                    ],
-                    [
-                        -69.9334281,
-                        41.6230802
-                    ],
-                    [
-                        -69.869857,
-                        41.6230802
-                    ],
-                    [
-                        -69.869857,
-                        41.8776895
-                    ],
-                    [
-                        -69.935791,
-                        41.8776895
-                    ],
-                    [
-                        -69.935791,
-                        42.0032342
-                    ],
-                    [
-                        -69.9975823,
-                        42.0032342
-                    ],
-                    [
-                        -69.9975823,
-                        42.0650191
-                    ],
-                    [
-                        -70.0606103,
-                        42.0650191
-                    ],
-                    [
-                        -70.0606103,
-                        42.1294348
-                    ],
-                    [
-                        -70.5572884,
-                        42.1294348
-                    ],
-                    [
-                        -70.5572884,
-                        43.2487079
-                    ],
-                    [
-                        -70.4974097,
-                        43.2487079
-                    ],
-                    [
-                        -70.4974097,
-                        43.3092194
-                    ],
-                    [
-                        -70.3704249,
-                        43.3092194
-                    ],
-                    [
-                        -70.3704249,
-                        43.371963
-                    ],
-                    [
-                        -70.3085701,
-                        43.371963
-                    ],
-                    [
-                        -70.3085701,
-                        43.4969879
-                    ],
-                    [
-                        -70.183921,
-                        43.4969879
-                    ],
-                    [
-                        -70.183921,
-                        43.6223531
-                    ],
-                    [
-                        -70.057583,
-                        43.6223531
-                    ],
-                    [
-                        -70.057583,
-                        43.6850173
-                    ],
-                    [
-                        -69.7455247,
-                        43.6850173
-                    ],
-                    [
-                        -69.7455247,
-                        43.7476571
-                    ],
-                    [
-                        -69.2472845,
-                        43.7476571
-                    ],
-                    [
-                        -69.2472845,
-                        43.8107035
-                    ],
-                    [
-                        -69.0560701,
-                        43.8107035
-                    ],
-                    [
-                        -69.0560701,
-                        43.8717247
-                    ],
-                    [
-                        -68.9950522,
-                        43.8717247
-                    ],
-                    [
-                        -68.9950522,
-                        43.9982022
-                    ],
-                    [
-                        -68.4963672,
-                        43.9982022
-                    ],
-                    [
-                        -68.4963672,
-                        44.0597368
-                    ],
-                    [
-                        -68.3081038,
-                        44.0597368
-                    ],
-                    [
-                        -68.3081038,
-                        44.122137
-                    ],
-                    [
-                        -68.1851802,
-                        44.122137
-                    ],
-                    [
-                        -68.1851802,
-                        44.3081382
-                    ],
-                    [
-                        -67.9956019,
-                        44.3081382
-                    ],
-                    [
-                        -67.9956019,
-                        44.3727489
-                    ],
-                    [
-                        -67.8103041,
-                        44.3727489
-                    ],
-                    [
-                        -67.8103041,
-                        44.435178
-                    ],
-                    [
-                        -67.4965289,
-                        44.435178
-                    ],
-                    [
-                        -67.4965289,
-                        44.4968776
-                    ],
-                    [
-                        -67.37102,
-                        44.4968776
-                    ],
-                    [
-                        -67.37102,
-                        44.5600642
-                    ],
-                    [
-                        -67.1848753,
-                        44.5600642
-                    ],
-                    [
-                        -67.1848753,
-                        44.6213345
-                    ],
-                    [
-                        -67.1221208,
-                        44.6213345
-                    ],
-                    [
-                        -67.1221208,
-                        44.6867918
-                    ],
-                    [
-                        -67.059365,
-                        44.6867918
-                    ],
-                    [
-                        -67.059365,
-                        44.7473657
-                    ],
-                    [
-                        -66.9311098,
-                        44.7473657
-                    ],
-                    [
-                        -66.9311098,
-                        44.9406566
-                    ],
-                    [
-                        -66.994683,
-                        44.9406566
-                    ],
-                    [
-                        -66.994683,
-                        45.0024514
-                    ],
-                    [
-                        -67.0595847,
-                        45.0024514
-                    ],
-                    [
-                        -67.0595847,
-                        45.1273377
-                    ],
-                    [
-                        -67.1201974,
-                        45.1273377
-                    ],
-                    [
-                        -67.1201974,
-                        45.1910115
-                    ],
-                    [
-                        -67.2469811,
-                        45.1910115
-                    ],
-                    [
-                        -67.2469811,
-                        45.253442
-                    ],
-                    [
-                        -67.3177546,
-                        45.253442
-                    ],
-                    [
-                        -67.3177546,
-                        45.1898369
-                    ],
-                    [
-                        -67.370749,
-                        45.1898369
-                    ],
-                    [
-                        -67.370749,
-                        45.2534001
-                    ],
-                    [
-                        -67.4326888,
-                        45.2534001
-                    ],
-                    [
-                        -67.4326888,
-                        45.3083409
-                    ],
-                    [
-                        -67.3708571,
-                        45.3083409
-                    ],
-                    [
-                        -67.3708571,
-                        45.4396986
-                    ],
-                    [
-                        -67.4305573,
-                        45.4396986
-                    ],
-                    [
-                        -67.4305573,
-                        45.4950095
-                    ],
-                    [
-                        -67.37099,
-                        45.4950095
-                    ],
-                    [
-                        -67.37099,
-                        45.6264543
-                    ],
-                    [
-                        -67.6214982,
-                        45.6264543
-                    ],
-                    [
-                        -67.6214982,
-                        45.6896133
-                    ],
-                    [
-                        -67.683828,
-                        45.6896133
-                    ],
-                    [
-                        -67.683828,
-                        45.753259
-                    ],
-                    [
-                        -67.7462097,
-                        45.753259
-                    ],
-                    [
-                        -67.7462097,
-                        47.1268165
-                    ],
-                    [
-                        -67.8700141,
-                        47.1268165
-                    ],
-                    [
-                        -67.8700141,
-                        47.1900278
-                    ],
-                    [
-                        -67.9323803,
-                        47.1900278
-                    ],
-                    [
-                        -67.9323803,
-                        47.2539678
-                    ],
-                    [
-                        -67.9959387,
-                        47.2539678
-                    ],
-                    [
-                        -67.9959387,
-                        47.3149737
-                    ],
-                    [
-                        -68.1206676,
-                        47.3149737
-                    ],
-                    [
-                        -68.1206676,
-                        47.3780823
-                    ],
-                    [
-                        -68.4423175,
-                        47.3780823
-                    ],
-                    [
-                        -68.4423175,
-                        47.3166082
-                    ],
-                    [
-                        -68.6314305,
-                        47.3166082
-                    ],
-                    [
-                        -68.6314305,
-                        47.2544676
-                    ],
-                    [
-                        -68.9978037,
-                        47.2544676
-                    ],
-                    [
-                        -68.9978037,
-                        47.439895
-                    ],
-                    [
-                        -69.0607223,
-                        47.439895
-                    ],
-                    [
-                        -69.0607223,
-                        47.5047558
-                    ],
-                    [
-                        -69.2538122,
-                        47.5047558
-                    ],
-                    [
-                        -69.2538122,
-                        47.4398084
-                    ],
-                    [
-                        -69.3179284,
-                        47.4398084
-                    ],
-                    [
-                        -69.3179284,
-                        47.378601
-                    ],
-                    [
-                        -69.4438546,
-                        47.378601
-                    ],
-                    [
-                        -69.4438546,
-                        47.3156274
-                    ],
-                    [
-                        -69.5038204,
-                        47.3156274
-                    ],
-                    [
-                        -69.5038204,
-                        47.2525839
-                    ],
-                    [
-                        -69.5667838,
-                        47.2525839
-                    ],
-                    [
-                        -69.5667838,
-                        47.1910884
-                    ],
-                    [
-                        -69.6303478,
-                        47.1910884
-                    ],
-                    [
-                        -69.6303478,
-                        47.128701
-                    ],
-                    [
-                        -69.6933103,
-                        47.128701
-                    ],
-                    [
-                        -69.6933103,
-                        47.0654307
-                    ],
-                    [
-                        -69.7557063,
-                        47.0654307
-                    ],
-                    [
-                        -69.7557063,
-                        47.0042751
-                    ],
-                    [
-                        -69.8180391,
-                        47.0042751
-                    ],
-                    [
-                        -69.8180391,
-                        46.9415344
-                    ],
-                    [
-                        -69.8804023,
-                        46.9415344
-                    ],
-                    [
-                        -69.8804023,
-                        46.8792519
-                    ],
-                    [
-                        -69.9421674,
-                        46.8792519
-                    ],
-                    [
-                        -69.9421674,
-                        46.8177399
-                    ],
-                    [
-                        -70.0063088,
-                        46.8177399
-                    ],
-                    [
-                        -70.0063088,
-                        46.6920295
-                    ],
-                    [
-                        -70.0704265,
-                        46.6920295
-                    ],
-                    [
-                        -70.0704265,
-                        46.4425926
-                    ],
-                    [
-                        -70.1945902,
-                        46.4425926
-                    ],
-                    [
-                        -70.1945902,
-                        46.3785887
-                    ],
-                    [
-                        -70.2562047,
-                        46.3785887
-                    ],
-                    [
-                        -70.2562047,
-                        46.3152628
-                    ],
-                    [
-                        -70.3203651,
-                        46.3152628
-                    ],
-                    [
-                        -70.3203651,
-                        46.0651209
-                    ],
-                    [
-                        -70.3814988,
-                        46.0651209
-                    ],
-                    [
-                        -70.3814988,
-                        45.93552
-                    ],
-                    [
-                        -70.3201618,
-                        45.93552
-                    ],
-                    [
-                        -70.3201618,
-                        45.879479
-                    ],
-                    [
-                        -70.4493131,
-                        45.879479
-                    ],
-                    [
-                        -70.4493131,
-                        45.7538713
-                    ],
-                    [
-                        -70.5070021,
-                        45.7538713
-                    ],
-                    [
-                        -70.5070021,
-                        45.6916912
-                    ],
-                    [
-                        -70.6316642,
-                        45.6916912
-                    ],
-                    [
-                        -70.6316642,
-                        45.6291619
-                    ],
-                    [
-                        -70.7575538,
-                        45.6291619
-                    ],
-                    [
-                        -70.7575538,
-                        45.4414685
-                    ],
-                    [
-                        -70.8809878,
-                        45.4414685
-                    ],
-                    [
-                        -70.8809878,
-                        45.3780612
-                    ],
-                    [
-                        -71.13328,
-                        45.3780612
-                    ],
-                    [
-                        -71.13328,
-                        45.3151452
-                    ],
-                    [
-                        -71.3830282,
-                        45.3151452
-                    ],
-                    [
-                        -71.3830282,
-                        45.253416
-                    ],
-                    [
-                        -71.5076448,
-                        45.253416
-                    ],
-                    [
-                        -71.5076448,
-                        45.0655726
-                    ],
-                    [
-                        -73.9418929,
-                        45.0655726
-                    ],
-                    [
-                        -73.9418929,
-                        45.0031242
-                    ],
-                    [
-                        -74.7469725,
-                        45.0031242
-                    ],
-                    [
-                        -74.7469725,
-                        45.0649003
-                    ],
-                    [
-                        -74.8800964,
-                        45.0649003
-                    ],
-                    [
-                        -74.8800964,
-                        45.0029023
-                    ],
-                    [
-                        -75.0662455,
-                        45.0029023
-                    ],
-                    [
-                        -75.0662455,
-                        44.9415167
-                    ],
-                    [
-                        -75.2539363,
-                        44.9415167
-                    ],
-                    [
-                        -75.2539363,
-                        44.8776043
-                    ],
-                    [
-                        -75.3789648,
-                        44.8776043
-                    ],
-                    [
-                        -75.3789648,
-                        44.8153462
-                    ],
-                    [
-                        -75.4431283,
-                        44.8153462
-                    ],
-                    [
-                        -75.4431283,
-                        44.7536053
-                    ],
-                    [
-                        -75.5666566,
-                        44.7536053
-                    ],
-                    [
-                        -75.5666566,
-                        44.6909879
-                    ],
-                    [
-                        -75.6290205,
-                        44.6909879
-                    ],
-                    [
-                        -75.6290205,
-                        44.6284958
-                    ],
-                    [
-                        -75.7540484,
-                        44.6284958
-                    ],
-                    [
-                        -75.7540484,
-                        44.566385
-                    ],
-                    [
-                        -75.817312,
-                        44.566385
-                    ],
-                    [
-                        -75.817312,
-                        44.5028932
-                    ],
-                    [
-                        -75.8799549,
-                        44.5028932
-                    ],
-                    [
-                        -75.8799549,
-                        44.3784946
-                    ],
-                    [
-                        -76.1300319,
-                        44.3784946
-                    ],
-                    [
-                        -76.1300319,
-                        44.3159227
-                    ],
-                    [
-                        -76.1926961,
-                        44.3159227
-                    ],
-                    [
-                        -76.1926961,
-                        44.2534378
-                    ],
-                    [
-                        -76.3182619,
-                        44.2534378
-                    ],
-                    [
-                        -76.3182619,
-                        44.1916726
-                    ],
-                    [
-                        -76.3792975,
-                        44.1916726
-                    ],
-                    [
-                        -76.3792975,
-                        44.0653733
-                    ],
-                    [
-                        -76.4427584,
-                        44.0653733
-                    ],
-                    [
-                        -76.4427584,
-                        43.9963825
-                    ],
-                    [
-                        -76.317027,
-                        43.9963825
-                    ],
-                    [
-                        -76.317027,
-                        43.9414581
-                    ],
-                    [
-                        -76.5076611,
-                        43.9414581
-                    ],
-                    [
-                        -76.5076611,
-                        43.8723335
-                    ],
-                    [
-                        -76.3829974,
-                        43.8723335
-                    ],
-                    [
-                        -76.3829974,
-                        43.8091872
-                    ],
-                    [
-                        -76.2534102,
-                        43.8091872
-                    ],
-                    [
-                        -76.2534102,
-                        43.5665222
-                    ],
-                    [
-                        -76.5064833,
-                        43.5665222
-                    ],
-                    [
-                        -76.5064833,
-                        43.5033881
-                    ],
-                    [
-                        -76.6331208,
-                        43.5033881
-                    ],
-                    [
-                        -76.6331208,
-                        43.4432252
-                    ],
-                    [
-                        -76.6951085,
-                        43.4432252
-                    ],
-                    [
-                        -76.6951085,
-                        43.3786858
-                    ],
-                    [
-                        -76.8177798,
-                        43.3786858
-                    ],
-                    [
-                        -76.8177798,
-                        43.318066
-                    ],
-                    [
-                        -77.682,
-                        43.318066
-                    ],
-                    [
-                        -77.682,
-                        43.3789376
-                    ],
-                    [
-                        -78.0565883,
-                        43.3789376
-                    ],
-                    [
-                        -78.0565883,
-                        43.4396918
-                    ],
-                    [
-                        -78.4389748,
-                        43.4396918
-                    ],
-                    [
-                        -78.4389748,
-                        43.3794382
-                    ],
-                    [
-                        -78.8803396,
-                        43.3794382
-                    ],
-                    [
-                        -78.8803396,
-                        43.3149724
-                    ],
-                    [
-                        -79.1298858,
-                        43.3149724
-                    ],
-                    [
-                        -79.1298858,
-                        43.2429286
-                    ],
-                    [
-                        -79.0669615,
-                        43.2429286
-                    ],
-                    [
-                        -79.0669615,
-                        43.1299931
-                    ],
-                    [
-                        -79.1298858,
-                        43.1299931
-                    ],
-                    [
-                        -79.1298858,
-                        43.0577305
-                    ],
-                    [
-                        -79.071264,
-                        43.0577305
-                    ],
-                    [
-                        -79.071264,
-                        42.9294906
-                    ],
-                    [
-                        -78.943264,
-                        42.9294906
-                    ],
-                    [
-                        -78.943264,
-                        42.7542165
-                    ],
-                    [
-                        -79.069439,
-                        42.7542165
-                    ],
-                    [
-                        -79.069439,
-                        42.6941622
-                    ],
-                    [
-                        -79.133439,
-                        42.6941622
-                    ],
-                    [
-                        -79.133439,
-                        42.6296973
-                    ],
-                    [
-                        -79.1947499,
-                        42.6296973
-                    ],
-                    [
-                        -79.1947499,
-                        42.5663538
-                    ],
-                    [
-                        -79.3786827,
-                        42.5663538
-                    ],
-                    [
-                        -79.3786827,
-                        42.5033425
-                    ],
-                    [
-                        -79.4442961,
-                        42.5033425
-                    ],
-                    [
-                        -79.4442961,
-                        42.4410614
-                    ],
-                    [
-                        -79.5679936,
-                        42.4410614
-                    ],
-                    [
-                        -79.5679936,
-                        42.3775264
-                    ],
-                    [
-                        -79.6906154,
-                        42.3775264
-                    ],
-                    [
-                        -79.6906154,
-                        42.3171086
-                    ],
-                    [
-                        -79.8164642,
-                        42.3171086
-                    ],
-                    [
-                        -79.8164642,
-                        42.2534481
-                    ],
-                    [
-                        -80.0052373,
-                        42.2534481
-                    ],
-                    [
-                        -80.0052373,
-                        42.1909188
-                    ],
-                    [
-                        -80.1916829,
-                        42.1909188
-                    ],
-                    [
-                        -80.1916829,
-                        42.1272555
-                    ],
-                    [
-                        -80.3167992,
-                        42.1272555
-                    ],
-                    [
-                        -80.3167992,
-                        42.0669857
-                    ],
-                    [
-                        -80.5063234,
-                        42.0669857
-                    ],
-                    [
-                        -80.5063234,
-                        42.0034331
-                    ],
-                    [
-                        -80.6930471,
-                        42.0034331
-                    ],
-                    [
-                        -80.6930471,
-                        41.9415141
-                    ],
-                    [
-                        -80.9440403,
-                        41.9415141
-                    ],
-                    [
-                        -80.9440403,
-                        41.8781193
-                    ],
-                    [
-                        -81.1942729,
-                        41.8781193
-                    ],
-                    [
-                        -81.1942729,
-                        41.8166455
-                    ],
-                    [
-                        -81.3190089,
-                        41.8166455
-                    ],
-                    [
-                        -81.3190089,
-                        41.7545453
-                    ],
-                    [
-                        -81.4418435,
-                        41.7545453
-                    ],
-                    [
-                        -81.4418435,
-                        41.690965
-                    ],
-                    [
-                        -81.5053523,
-                        41.690965
-                    ],
-                    [
-                        -81.5053523,
-                        41.6301643
-                    ],
-                    [
-                        -82.7470081,
-                        41.6301643
-                    ],
-                    [
-                        -82.7470081,
-                        41.7536942
-                    ],
-                    [
-                        -82.8839135,
-                        41.7536942
-                    ],
-                    [
-                        -82.8839135,
-                        41.5656075
-                    ],
-                    [
-                        -82.9957195,
-                        41.5656075
-                    ],
-                    [
-                        -82.9957195,
-                        41.6270375
-                    ],
-                    [
-                        -83.1257796,
-                        41.6270375
-                    ],
-                    [
-                        -83.1257796,
-                        41.6878411
-                    ],
-                    [
-                        -83.2474733,
-                        41.6878411
-                    ],
-                    [
-                        -83.2474733,
-                        41.7536942
-                    ],
-                    [
-                        -83.3737305,
-                        41.7536942
-                    ],
-                    [
-                        -83.3737305,
-                        41.809276
-                    ],
-                    [
-                        -83.3106019,
-                        41.809276
-                    ],
-                    [
-                        -83.3106019,
-                        41.8716064
-                    ],
-                    [
-                        -83.2474733,
-                        41.8716064
-                    ],
-                    [
-                        -83.2474733,
-                        41.9361393
-                    ],
-                    [
-                        -83.1843447,
-                        41.9361393
-                    ],
-                    [
-                        -83.1843447,
-                        41.9960851
-                    ],
-                    [
-                        -83.1207681,
-                        41.9960851
-                    ],
-                    [
-                        -83.1207681,
-                        42.2464812
-                    ],
-                    [
-                        -83.0589194,
-                        42.2464812
-                    ],
-                    [
-                        -83.0589194,
-                        42.3089555
-                    ],
-                    [
-                        -82.8685328,
-                        42.3089555
-                    ],
-                    [
-                        -82.8685328,
-                        42.3717652
-                    ],
-                    [
-                        -82.8072219,
-                        42.3717652
-                    ],
-                    [
-                        -82.8072219,
-                        42.558553
-                    ],
-                    [
-                        -82.7553745,
-                        42.558553
-                    ],
-                    [
-                        -82.7553745,
-                        42.4954945
-                    ],
-                    [
-                        -82.5599041,
-                        42.4954945
-                    ],
-                    [
-                        -82.5599041,
-                        42.558553
-                    ],
-                    [
-                        -82.4967755,
-                        42.558553
-                    ],
-                    [
-                        -82.4967755,
-                        42.6833607
-                    ],
-                    [
-                        -82.4328863,
-                        42.6833607
-                    ],
-                    [
-                        -82.4328863,
-                        42.9342196
-                    ],
-                    [
-                        -82.3700552,
-                        42.9342196
-                    ],
-                    [
-                        -82.3700552,
-                        43.0648071
-                    ],
-                    [
-                        -82.4328863,
-                        43.0648071
-                    ],
-                    [
-                        -82.4328863,
-                        43.1917566
-                    ],
-                    [
-                        -82.4947464,
-                        43.1917566
-                    ],
-                    [
-                        -82.4947464,
-                        43.5034627
-                    ],
-                    [
-                        -82.557133,
-                        43.5034627
-                    ],
-                    [
-                        -82.557133,
-                        43.8160901
-                    ],
-                    [
-                        -82.6197884,
-                        43.8160901
-                    ],
-                    [
-                        -82.6197884,
-                        43.9422098
-                    ],
-                    [
-                        -82.6839499,
-                        43.9422098
-                    ],
-                    [
-                        -82.6839499,
-                        44.0022641
-                    ],
-                    [
-                        -82.7465346,
-                        44.0022641
-                    ],
-                    [
-                        -82.7465346,
-                        44.0670545
-                    ],
-                    [
-                        -82.8708696,
-                        44.0670545
-                    ],
-                    [
-                        -82.8708696,
-                        44.1291935
-                    ],
-                    [
-                        -83.008517,
-                        44.1291935
-                    ],
-                    [
-                        -83.008517,
-                        44.0664786
-                    ],
-                    [
-                        -83.1336086,
-                        44.0664786
-                    ],
-                    [
-                        -83.1336086,
-                        44.0053949
-                    ],
-                    [
-                        -83.2414522,
-                        44.0053949
-                    ],
-                    [
-                        -83.2414522,
-                        44.9962034
-                    ],
-                    [
-                        -83.1806112,
-                        44.9962034
-                    ],
-                    [
-                        -83.1806112,
-                        45.067302
-                    ],
-                    [
-                        -83.2455172,
-                        45.067302
-                    ],
-                    [
-                        -83.2455172,
-                        45.1287382
-                    ],
-                    [
-                        -83.3065878,
-                        45.1287382
-                    ],
-                    [
-                        -83.3065878,
-                        45.2551509
-                    ],
-                    [
-                        -83.3706087,
-                        45.2551509
-                    ],
-                    [
-                        -83.3706087,
-                        45.3165923
-                    ],
-                    [
-                        -83.4325644,
-                        45.3165923
-                    ],
-                    [
-                        -83.4325644,
-                        45.3792105
-                    ],
-                    [
-                        -83.6178415,
-                        45.3792105
-                    ],
-                    [
-                        -83.6178415,
-                        45.4419665
-                    ],
-                    [
-                        -83.8084291,
-                        45.4419665
-                    ],
-                    [
-                        -83.8084291,
-                        45.5036189
-                    ],
-                    [
-                        -84.0550718,
-                        45.5036189
-                    ],
-                    [
-                        -84.0550718,
-                        45.5647907
-                    ],
-                    [
-                        -84.1235181,
-                        45.5647907
-                    ],
-                    [
-                        -84.1235181,
-                        45.6287845
-                    ],
-                    [
-                        -84.1807534,
-                        45.6287845
-                    ],
-                    [
-                        -84.1807534,
-                        45.6914688
-                    ],
-                    [
-                        -84.3111554,
-                        45.6914688
-                    ],
-                    [
-                        -84.3111554,
-                        45.9337076
-                    ],
-                    [
-                        -83.8209974,
-                        45.9337076
-                    ],
-                    [
-                        -83.8209974,
-                        45.8725113
-                    ],
-                    [
-                        -83.4968086,
-                        45.8725113
-                    ],
-                    [
-                        -83.4968086,
-                        45.9337076
-                    ],
-                    [
-                        -83.4338066,
-                        45.9337076
-                    ],
-                    [
-                        -83.4338066,
-                        46.0016863
-                    ],
-                    [
-                        -83.4962697,
-                        46.0016863
-                    ],
-                    [
-                        -83.4962697,
-                        46.0668178
-                    ],
-                    [
-                        -83.5599956,
-                        46.0668178
-                    ],
-                    [
-                        -83.5599956,
-                        46.1261576
-                    ],
-                    [
-                        -83.9954558,
-                        46.1261576
-                    ],
-                    [
-                        -83.9954558,
-                        46.1931747
-                    ],
-                    [
-                        -84.0591816,
-                        46.1931747
-                    ],
-                    [
-                        -84.0591816,
-                        46.3814972
-                    ],
-                    [
-                        -84.1152614,
-                        46.3814972
-                    ],
-                    [
-                        -84.1152614,
-                        46.4953584
-                    ],
-                    [
-                        -84.0591816,
-                        46.4953584
-                    ],
-                    [
-                        -84.0591816,
-                        46.5682653
-                    ],
-                    [
-                        -84.2579545,
-                        46.5682653
-                    ],
-                    [
-                        -84.2579545,
-                        46.5051232
-                    ],
-                    [
-                        -84.3071879,
-                        46.5051232
-                    ],
-                    [
-                        -84.3071879,
-                        46.5682653
-                    ],
-                    [
-                        -84.4415364,
-                        46.5682653
-                    ],
-                    [
-                        -84.4415364,
-                        46.504525
-                    ],
-                    [
-                        -84.9965729,
-                        46.504525
-                    ],
-                    [
-                        -84.9965729,
-                        46.6842882
-                    ],
-                    [
-                        -84.9298158,
-                        46.6842882
-                    ],
-                    [
-                        -84.9298158,
-                        46.818077
-                    ],
-                    [
-                        -85.3165894,
-                        46.818077
-                    ],
-                    [
-                        -85.3165894,
-                        46.7535825
-                    ],
-                    [
-                        -87.5562645,
-                        46.7535825
-                    ],
-                    [
-                        -87.5562645,
-                        47.4407371
-                    ],
-                    [
-                        -87.6825361,
-                        47.4407371
-                    ],
-                    [
-                        -87.6825361,
-                        47.5035554
-                    ],
-                    [
-                        -88.2560738,
-                        47.5035554
-                    ],
-                    [
-                        -88.2560738,
-                        47.4433716
-                    ],
-                    [
-                        -88.4417419,
-                        47.4433716
-                    ],
-                    [
-                        -88.4417419,
-                        47.3789949
-                    ],
-                    [
-                        -88.50683,
-                        47.3789949
-                    ],
-                    [
-                        -88.50683,
-                        47.3153881
-                    ],
-                    [
-                        -88.6312821,
-                        47.3153881
-                    ],
-                    [
-                        -88.6312821,
-                        47.2539782
-                    ],
-                    [
-                        -88.7569636,
-                        47.2539782
-                    ],
-                    [
-                        -88.7569636,
-                        47.1934682
-                    ],
-                    [
-                        -88.8838253,
-                        47.1934682
-                    ],
-                    [
-                        -88.8838253,
-                        47.1284735
-                    ],
-                    [
-                        -88.9434208,
-                        47.1284735
-                    ],
-                    [
-                        -88.9434208,
-                        47.0662127
-                    ],
-                    [
-                        -89.0708726,
-                        47.0662127
-                    ],
-                    [
-                        -89.0708726,
-                        47.0026826
-                    ],
-                    [
-                        -89.2565553,
-                        47.0026826
-                    ],
-                    [
-                        -89.2565553,
-                        46.9410806
-                    ],
-                    [
-                        -90.3677669,
-                        46.9410806
-                    ],
-                    [
-                        -90.3677669,
-                        47.6844827
-                    ],
-                    [
-                        -90.3069978,
-                        47.6844827
-                    ],
-                    [
-                        -90.3069978,
-                        47.7460174
-                    ],
-                    [
-                        -89.994859,
-                        47.7460174
-                    ],
-                    [
-                        -89.994859,
-                        47.8082719
-                    ],
-                    [
-                        -89.8048615,
-                        47.8082719
-                    ],
-                    [
-                        -89.8048615,
-                        47.8700562
-                    ],
-                    [
-                        -89.6797699,
-                        47.8700562
-                    ],
-                    [
-                        -89.6797699,
-                        47.9339637
-                    ],
-                    [
-                        -89.4933757,
-                        47.9339637
-                    ],
-                    [
-                        -89.4933757,
-                        47.9957956
-                    ],
-                    [
-                        -89.4284697,
-                        47.9957956
-                    ],
-                    [
-                        -89.4284697,
-                        48.0656377
-                    ],
-                    [
-                        -89.9932739,
-                        48.0656377
-                    ],
-                    [
-                        -89.9932739,
-                        48.1282966
-                    ],
-                    [
-                        -90.7455933,
-                        48.1282966
-                    ],
-                    [
-                        -90.7455933,
-                        48.1893056
-                    ],
-                    [
-                        -90.8087291,
-                        48.1893056
-                    ],
-                    [
-                        -90.8087291,
-                        48.2522065
-                    ],
-                    [
-                        -91.067763,
-                        48.2522065
-                    ],
-                    [
-                        -91.067763,
-                        48.1916658
-                    ],
-                    [
-                        -91.1946247,
-                        48.1916658
-                    ],
-                    [
-                        -91.1946247,
-                        48.1279027
-                    ],
-                    [
-                        -91.6814196,
-                        48.1279027
-                    ],
-                    [
-                        -91.6814196,
-                        48.2525994
-                    ],
-                    [
-                        -91.9321927,
-                        48.2525994
-                    ],
-                    [
-                        -91.9321927,
-                        48.3142454
-                    ],
-                    [
-                        -91.9929683,
-                        48.3142454
-                    ],
-                    [
-                        -91.9929683,
-                        48.3780845
-                    ],
-                    [
-                        -92.3189383,
-                        48.3780845
-                    ],
-                    [
-                        -92.3189383,
-                        48.2529081
-                    ],
-                    [
-                        -92.3732233,
-                        48.2529081
-                    ],
-                    [
-                        -92.3732233,
-                        48.3153385
-                    ],
-                    [
-                        -92.4322288,
-                        48.3153385
-                    ],
-                    [
-                        -92.4322288,
-                        48.4411448
-                    ],
-                    [
-                        -92.4977248,
-                        48.4411448
-                    ],
-                    [
-                        -92.4977248,
-                        48.501781
-                    ],
-                    [
-                        -92.5679413,
-                        48.501781
-                    ],
-                    [
-                        -92.5679413,
-                        48.439579
-                    ],
-                    [
-                        -92.6210462,
-                        48.439579
-                    ],
-                    [
-                        -92.6210462,
-                        48.5650783
-                    ],
-                    [
-                        -92.8086835,
-                        48.5650783
-                    ],
-                    [
-                        -92.8086835,
-                        48.6286865
-                    ],
-                    [
-                        -92.8086835,
-                        48.6267365
-                    ],
-                    [
-                        -92.933185,
-                        48.6267365
-                    ],
-                    [
-                        -92.933185,
-                        48.6922145
-                    ],
-                    [
-                        -93.0051716,
-                        48.6922145
-                    ],
-                    [
-                        -93.0051716,
-                        48.6282965
-                    ],
-                    [
-                        -93.1225924,
-                        48.6282965
-                    ],
-                    [
-                        -93.1225924,
-                        48.6922145
-                    ],
-                    [
-                        -93.3190806,
-                        48.6922145
-                    ],
-                    [
-                        -93.3190806,
-                        48.6267365
-                    ],
-                    [
-                        -93.5049477,
-                        48.6267365
-                    ],
-                    [
-                        -93.5049477,
-                        48.5635164
-                    ],
-                    [
-                        -93.7474601,
-                        48.5635164
-                    ],
-                    [
-                        -93.7474601,
-                        48.6267365
-                    ],
-                    [
-                        -93.8135461,
-                        48.6267365
-                    ],
-                    [
-                        -93.8135461,
-                        48.6898775
-                    ],
-                    [
-                        -94.2453121,
-                        48.6898775
-                    ],
-                    [
-                        -94.2453121,
-                        48.7554327
-                    ],
-                    [
-                        -94.6183171,
-                        48.7554327
-                    ],
-                    [
-                        -94.6183171,
-                        48.941036
-                    ],
-                    [
-                        -94.6809018,
-                        48.941036
-                    ],
-                    [
-                        -94.6809018,
-                        49.0029737
-                    ],
-                    [
-                        -94.7441532,
-                        49.0029737
-                    ],
-                    [
-                        -94.7441532,
-                        49.2536079
-                    ],
-                    [
-                        -94.8084069,
-                        49.2536079
-                    ],
-                    [
-                        -94.8084069,
-                        49.3784134
-                    ],
-                    [
-                        -95.1192391,
-                        49.3784134
-                    ],
-                    [
-                        -95.1192391,
-                        49.4425264
-                    ],
-                    [
-                        -95.1934341,
-                        49.4425264
-                    ],
-                    [
-                        -95.1934341,
-                        49.0035292
-                    ],
-                    [
-                        -96.87069,
-                        49.0035292
-                    ],
-                    [
-                        -96.87069,
-                        49.0656063
-                    ],
-                    [
-                        -99.0049312,
-                        49.0656063
-                    ],
-                    [
-                        -99.0049312,
-                        49.0050714
-                    ],
-                    [
-                        -109.3699257,
-                        49.0050714
-                    ],
-                    [
-                        -109.3699257,
-                        49.0668231
-                    ],
-                    [
-                        -109.5058746,
-                        49.0668231
-                    ],
-                    [
-                        -109.5058746,
-                        49.0050714
-                    ],
-                    [
-                        -114.1830014,
-                        49.0050714
-                    ],
-                    [
-                        -114.1830014,
-                        49.0687317
-                    ],
-                    [
-                        -114.7578709,
-                        49.0687317
-                    ],
-                    [
-                        -114.7578709,
-                        49.0050714
-                    ],
-                    [
-                        -115.433731,
-                        49.0050714
-                    ],
-                    [
-                        -115.433731,
-                        49.0671412
-                    ],
-                    [
-                        -116.5062706,
-                        49.0671412
-                    ],
-                    [
-                        -116.5062706,
-                        49.0050714
-                    ],
-                    [
-                        -117.3089504,
-                        49.0050714
-                    ],
-                    [
-                        -117.3089504,
-                        49.0659803
-                    ],
-                    [
-                        -119.882945,
-                        49.0659803
-                    ],
-                    [
-                        -119.882945,
-                        49.0050714
-                    ],
-                    [
-                        -120.1208555,
-                        49.0050714
-                    ],
-                    [
-                        -120.1208555,
-                        49.0678367
-                    ],
-                    [
-                        -121.4451636,
-                        49.0678367
-                    ],
-                    [
-                        -121.4451636,
-                        49.0050714
-                    ],
-                    [
-                        -121.9311808,
-                        49.0050714
-                    ],
-                    [
-                        -121.9311808,
-                        49.0656099
-                    ],
-                    [
-                        -122.817484,
-                        49.0656099
-                    ],
-                    [
-                        -122.817484,
-                        49.0029143
-                    ],
-                    [
-                        -122.8795155,
-                        49.0029143
-                    ],
-                    [
-                        -122.8795155,
-                        48.9347018
-                    ],
-                    [
-                        -122.8174629,
-                        48.9347018
-                    ],
-                    [
-                        -122.8174629,
-                        48.8101998
-                    ],
-                    [
-                        -122.7538859,
-                        48.8101998
-                    ],
-                    [
-                        -122.7538859,
-                        48.7533758
-                    ],
-                    [
-                        -122.8712937,
-                        48.7533758
-                    ],
-                    [
-                        -122.8712937,
-                        48.8153948
-                    ],
-                    [
-                        -123.0055391,
-                        48.8153948
-                    ],
-                    [
-                        -123.0055391,
-                        48.7529529
-                    ],
-                    [
-                        -123.1296926,
-                        48.7529529
-                    ],
-                    [
-                        -123.1296926,
-                        48.6902201
-                    ],
-                    [
-                        -123.1838197,
-                        48.6902201
-                    ],
-                    [
-                        -123.1838197,
-                        48.7529029
-                    ]
-                ],
-                [
-                    [
-                        -122.9341743,
-                        37.7521547
-                    ],
-                    [
-                        -122.9347457,
-                        37.6842013
-                    ],
-                    [
-                        -123.0679013,
-                        37.6849023
-                    ],
-                    [
-                        -123.0673747,
-                        37.7475251
-                    ],
-                    [
-                        -123.1292603,
-                        37.7478506
-                    ],
-                    [
-                        -123.1286894,
-                        37.815685
-                    ],
-                    [
-                        -123.0590687,
-                        37.8153192
-                    ],
-                    [
-                        -123.0595947,
-                        37.7528143
-                    ]
-                ],
-                [
-                    [
-                        -71.6299464,
-                        41.2540893
-                    ],
-                    [
-                        -71.4966465,
-                        41.2541393
-                    ],
-                    [
-                        -71.4965596,
-                        41.122965
-                    ],
-                    [
-                        -71.6298594,
-                        41.1229149
-                    ]
-                ],
-                [
-                    [
-                        -70.3184265,
-                        41.3775196
-                    ],
-                    [
-                        -70.3183384,
-                        41.2448243
-                    ],
-                    [
-                        -70.1906612,
-                        41.2448722
-                    ],
-                    [
-                        -70.1906239,
-                        41.1886019
-                    ],
-                    [
-                        -69.9336025,
-                        41.1886984
-                    ],
-                    [
-                        -69.933729,
-                        41.3791941
-                    ],
-                    [
-                        -69.9950664,
-                        41.3791712
-                    ],
-                    [
-                        -69.995109,
-                        41.443159
-                    ],
-                    [
-                        -70.0707828,
-                        41.4431307
-                    ],
-                    [
-                        -70.0706972,
-                        41.3144915
-                    ],
-                    [
-                        -70.2461667,
-                        41.3144258
-                    ],
-                    [
-                        -70.2462087,
-                        41.3775467
-                    ]
-                ],
-                [
-                    [
-                        -68.9403374,
-                        43.9404062
-                    ],
-                    [
-                        -68.6856948,
-                        43.9404977
-                    ],
-                    [
-                        -68.6856475,
-                        43.8721797
-                    ],
-                    [
-                        -68.7465405,
-                        43.8721577
-                    ],
-                    [
-                        -68.7464976,
-                        43.8102529
-                    ],
-                    [
-                        -68.8090782,
-                        43.8102304
-                    ],
-                    [
-                        -68.8090343,
-                        43.746728
-                    ],
-                    [
-                        -68.8773094,
-                        43.7467034
-                    ],
-                    [
-                        -68.8773544,
-                        43.8117826
-                    ],
-                    [
-                        -68.9402483,
-                        43.8117599
-                    ]
-                ],
-                [
-                    [
-                        -123.1291466,
-                        49.0645144
-                    ],
-                    [
-                        -122.9954224,
-                        49.0645144
-                    ],
-                    [
-                        -122.9954224,
-                        48.9343243
-                    ],
-                    [
-                        -123.1291466,
-                        48.9343243
-                    ]
-                ],
-                [
-                    [
-                        -82.9407144,
-                        24.7535913
-                    ],
-                    [
-                        -82.8719398,
-                        24.7535913
-                    ],
-                    [
-                        -82.8719398,
-                        24.6905653
-                    ],
-                    [
-                        -82.7446233,
-                        24.6905653
-                    ],
-                    [
-                        -82.7446233,
-                        24.6214593
-                    ],
-                    [
-                        -82.8088038,
-                        24.6214593
-                    ],
-                    [
-                        -82.8088038,
-                        24.5594908
-                    ],
-                    [
-                        -82.9407144,
-                        24.5594908
-                    ]
-                ]
-            ]
-        },
-        {
-            "name": "USGS Topographic Maps",
-            "type": "tms",
-            "template": "http://{switch:a,b,c}.tile.openstreetmap.us/usgs_scanned_topos/{zoom}/{x}/{y}.png",
-            "polygon": [
-                [
-                    [
-                        -125.990173,
-                        48.9962416
-                    ],
-                    [
-                        -125.989419,
-                        47.9948396
-                    ],
-                    [
-                        -123.9929739,
-                        47.9955062
-                    ],
-                    [
-                        -123.9922429,
-                        47.0059202
-                    ],
-                    [
-                        -125.988688,
-                        47.0052409
-                    ],
-                    [
-                        -125.9879604,
-                        46.0015618
-                    ],
-                    [
-                        -123.9939396,
-                        46.0022529
-                    ],
-                    [
-                        -123.9925238,
-                        43.9961708
-                    ],
-                    [
-                        -124.9931832,
-                        43.9958116
-                    ],
-                    [
-                        -124.9918175,
-                        41.9942149
-                    ],
-                    [
-                        -125.9851789,
-                        41.9938465
-                    ],
-                    [
-                        -125.9838655,
-                        40.0076111
-                    ],
-                    [
-                        -123.9833285,
-                        40.0083757
-                    ],
-                    [
-                        -123.9814115,
-                        37.002615
-                    ],
-                    [
-                        -122.21903,
-                        37.0033173
-                    ],
-                    [
-                        -122.2184144,
-                        36.011671
-                    ],
-                    [
-                        -122.020087,
-                        36.011751
-                    ],
-                    [
-                        -122.0188591,
-                        33.9961766
-                    ],
-                    [
-                        -119.9787757,
-                        33.9970206
-                    ],
-                    [
-                        -119.9775867,
-                        31.9987658
-                    ],
-                    [
-                        -114.0122833,
-                        32.00129
-                    ],
-                    [
-                        -114.0116894,
-                        30.9862401
-                    ],
-                    [
-                        -105.998294,
-                        30.9896679
-                    ],
-                    [
-                        -105.9971419,
-                        28.9901065
-                    ],
-                    [
-                        -102.0210506,
-                        28.9918418
-                    ],
-                    [
-                        -102.0204916,
-                        28.00733
-                    ],
-                    [
-                        -100.0062436,
-                        28.0082173
-                    ],
-                    [
-                        -100.0051143,
-                        25.991909
-                    ],
-                    [
-                        -98.0109067,
-                        25.9928035
-                    ],
-                    [
-                        -98.0103613,
-                        25.0063461
-                    ],
-                    [
-                        -97.0161086,
-                        25.0067957
-                    ],
-                    [
-                        -97.016654,
-                        25.9932494
-                    ],
-                    [
-                        -95.9824825,
-                        25.9937132
-                    ],
-                    [
-                        -95.9835999,
-                        27.9891175
-                    ],
-                    [
-                        -94.0200898,
-                        27.9899826
-                    ],
-                    [
-                        -94.0206586,
-                        28.9918129
-                    ],
-                    [
-                        -88.0156706,
-                        28.9944338
-                    ],
-                    [
-                        -88.0162494,
-                        30.0038862
-                    ],
-                    [
-                        -86.0277506,
-                        30.0047454
-                    ],
-                    [
-                        -86.0271719,
-                        28.9953016
-                    ],
-                    [
-                        -84.0187909,
-                        28.9961781
-                    ],
-                    [
-                        -84.017095,
-                        25.9817708
-                    ],
-                    [
-                        -81.9971976,
-                        25.9826768
-                    ],
-                    [
-                        -81.9966618,
-                        25.0134917
-                    ],
-                    [
-                        -84.0165592,
-                        25.0125783
-                    ],
-                    [
-                        -84.0160068,
-                        24.0052745
-                    ],
-                    [
-                        -80.0199985,
-                        24.007096
-                    ],
-                    [
-                        -80.0245309,
-                        32.0161282
-                    ],
-                    [
-                        -78.0066484,
-                        32.0169819
-                    ],
-                    [
-                        -78.0072238,
-                        32.9894278
-                    ],
-                    [
-                        -77.8807233,
-                        32.9894807
-                    ],
-                    [
-                        -77.8813253,
-                        33.9955918
-                    ],
-                    [
-                        -76.0115411,
-                        33.9963653
-                    ],
-                    [
-                        -76.0121459,
-                        34.9952552
-                    ],
-                    [
-                        -74.0068449,
-                        34.9960749
-                    ],
-                    [
-                        -74.0099997,
-                        40.0084254
-                    ],
-                    [
-                        -72.0013745,
-                        40.0091931
-                    ],
-                    [
-                        -72.002019,
-                        40.9912464
-                    ],
-                    [
-                        -69.8797398,
-                        40.9920457
-                    ],
-                    [
-                        -69.8804173,
-                        42.00893
-                    ],
-                    [
-                        -69.9927682,
-                        42.0088883
-                    ],
-                    [
-                        -69.9934462,
-                        43.0105166
-                    ],
-                    [
-                        -67.9845366,
-                        43.0112496
-                    ],
-                    [
-                        -67.985224,
-                        44.0103812
-                    ],
-                    [
-                        -65.9892568,
-                        44.0110975
-                    ],
-                    [
-                        -65.9921237,
-                        47.9993584
-                    ],
-                    [
-                        -70.006442,
-                        47.9980181
-                    ],
-                    [
-                        -70.005708,
-                        47.0042007
-                    ],
-                    [
-                        -72.023686,
-                        47.003514
-                    ],
-                    [
-                        -72.0222508,
-                        45.0059846
-                    ],
-                    [
-                        -78.0146667,
-                        45.0038705
-                    ],
-                    [
-                        -78.0139662,
-                        44.0026998
-                    ],
-                    [
-                        -80.029686,
-                        44.0019763
-                    ],
-                    [
-                        -80.0290052,
-                        43.0122994
-                    ],
-                    [
-                        -81.995479,
-                        43.011582
-                    ],
-                    [
-                        -81.9982986,
-                        47.0042713
-                    ],
-                    [
-                        -87.505706,
-                        47.0023972
-                    ],
-                    [
-                        -87.5064535,
-                        48.0142702
-                    ],
-                    [
-                        -88.0260889,
-                        48.0140968
-                    ],
-                    [
-                        -88.026838,
-                        49.0086686
-                    ],
-                    [
-                        -93.9981078,
-                        49.0067142
-                    ],
-                    [
-                        -93.9988778,
-                        50.0086456
-                    ],
-                    [
-                        -96.0138899,
-                        50.0079995
-                    ],
-                    [
-                        -96.0131199,
-                        49.0060547
-                    ]
-                ],
-                [
-                    [
-                        -160.5787616,
-                        22.5062947
-                    ],
-                    [
-                        -160.5782192,
-                        21.4984647
-                    ],
-                    [
-                        -159.0030121,
-                        21.499196
-                    ],
-                    [
-                        -159.0027422,
-                        20.9951068
-                    ],
-                    [
-                        -157.5083185,
-                        20.995803
-                    ],
-                    [
-                        -157.5080519,
-                        20.4960241
-                    ],
-                    [
-                        -155.966889,
-                        20.4967444
-                    ],
-                    [
-                        -155.9674267,
-                        21.5028287
-                    ],
-                    [
-                        -157.5044717,
-                        21.5021151
-                    ],
-                    [
-                        -157.5047384,
-                        21.9984962
-                    ],
-                    [
-                        -159.0090946,
-                        21.9978002
-                    ],
-                    [
-                        -159.0093692,
-                        22.5070181
-                    ]
-                ],
-                [
-                    [
-                        -168.006102,
-                        68.9941463
-                    ],
-                    [
-                        -168.0047628,
-                        68.0107853
-                    ],
-                    [
-                        -165.4842481,
-                        68.0112562
-                    ],
-                    [
-                        -165.4829337,
-                        67.0037303
-                    ],
-                    [
-                        -168.0034485,
-                        67.0032389
-                    ],
-                    [
-                        -168.002195,
-                        66.0017503
-                    ],
-                    [
-                        -169.0087448,
-                        66.001546
-                    ],
-                    [
-                        -169.0075381,
-                        64.9987675
-                    ],
-                    [
-                        -168.0009882,
-                        64.9989798
-                    ],
-                    [
-                        -167.9998282,
-                        63.9982374
-                    ],
-                    [
-                        -164.9871288,
-                        63.9988964
-                    ],
-                    [
-                        -164.9860062,
-                        62.9950845
-                    ],
-                    [
-                        -167.9987057,
-                        62.9944019
-                    ],
-                    [
-                        -167.9946035,
-                        59.0153692
-                    ],
-                    [
-                        -162.5027857,
-                        59.0167799
-                    ],
-                    [
-                        -162.5018149,
-                        58.0005815
-                    ],
-                    [
-                        -160.0159024,
-                        58.0012389
-                    ],
-                    [
-                        -160.0149725,
-                        57.000035
-                    ],
-                    [
-                        -160.5054788,
-                        56.9999017
-                    ],
-                    [
-                        -160.5045719,
-                        55.9968161
-                    ],
-                    [
-                        -164.012195,
-                        55.9958373
-                    ],
-                    [
-                        -164.0113186,
-                        55.00107
-                    ],
-                    [
-                        -165.994782,
-                        55.0005023
-                    ],
-                    [
-                        -165.9941266,
-                        54.2400584
-                    ],
-                    [
-                        -168.0002944,
-                        54.2394734
-                    ],
-                    [
-                        -168.0000986,
-                        54.0094921
-                    ],
-                    [
-                        -170.0156134,
-                        54.0089011
-                    ],
-                    [
-                        -170.0147683,
-                        53.0016446
-                    ],
-                    [
-                        -171.9993636,
-                        53.0010487
-                    ],
-                    [
-                        -171.9989488,
-                        52.4977745
-                    ],
-                    [
-                        -176.0083239,
-                        52.4965566
-                    ],
-                    [
-                        -176.0081186,
-                        52.2452555
-                    ],
-                    [
-                        -178.000097,
-                        52.2446469
-                    ],
-                    [
-                        -177.9992996,
-                        51.2554252
-                    ],
-                    [
-                        -176.0073212,
-                        51.2560472
-                    ],
-                    [
-                        -176.0075146,
-                        51.4980163
-                    ],
-                    [
-                        -171.9981395,
-                        51.4992617
-                    ],
-                    [
-                        -171.9985419,
-                        51.9985373
-                    ],
-                    [
-                        -167.9984317,
-                        51.9997661
-                    ],
-                    [
-                        -167.9994645,
-                        53.2560877
-                    ],
-                    [
-                        -165.9932968,
-                        53.2566866
-                    ],
-                    [
-                        -165.9939308,
-                        54.0100804
-                    ],
-                    [
-                        -159.0067205,
-                        54.0121291
-                    ],
-                    [
-                        -159.0075717,
-                        55.002502
-                    ],
-                    [
-                        -158.0190709,
-                        55.0027849
-                    ],
-                    [
-                        -158.0199473,
-                        55.9975094
-                    ],
-                    [
-                        -151.9963213,
-                        55.9991902
-                    ],
-                    [
-                        -151.9981536,
-                        57.9986536
-                    ],
-                    [
-                        -151.500341,
-                        57.9987853
-                    ],
-                    [
-                        -151.5012894,
-                        58.9919816
-                    ],
-                    [
-                        -138.5159989,
-                        58.9953194
-                    ],
-                    [
-                        -138.5150471,
-                        57.9986434
-                    ],
-                    [
-                        -136.6872422,
-                        57.9991267
-                    ],
-                    [
-                        -136.6863158,
-                        57.0016688
-                    ],
-                    [
-                        -135.9973698,
-                        57.001856
-                    ],
-                    [
-                        -135.9964667,
-                        56.0030544
-                    ],
-                    [
-                        -134.6717732,
-                        56.003424
-                    ],
-                    [
-                        -134.6708865,
-                        54.9969623
-                    ],
-                    [
-                        -133.9956734,
-                        54.9971556
-                    ],
-                    [
-                        -133.9948193,
-                        54.0031685
-                    ],
-                    [
-                        -130.0044418,
-                        54.0043387
-                    ],
-                    [
-                        -130.0070826,
-                        57.0000507
-                    ],
-                    [
-                        -131.975877,
-                        56.9995156
-                    ],
-                    [
-                        -131.9787378,
-                        59.9933094
-                    ],
-                    [
-                        -138.0071813,
-                        59.991805
-                    ],
-                    [
-                        -138.0082158,
-                        61.0125755
-                    ],
-                    [
-                        -140.9874011,
-                        61.0118551
-                    ],
-                    [
-                        -140.99984,
-                        71.0039309
-                    ],
-                    [
-                        -154.5023956,
-                        71.0017377
-                    ],
-                    [
-                        -154.5039632,
-                        71.9983391
-                    ],
-                    [
-                        -157.499048,
-                        71.9978773
-                    ],
-                    [
-                        -157.4974758,
-                        70.9982877
-                    ],
-                    [
-                        -163.0233611,
-                        70.9973899
-                    ],
-                    [
-                        -163.0218273,
-                        69.9707435
-                    ],
-                    [
-                        -164.9730896,
-                        69.97041
-                    ],
-                    [
-                        -164.9717003,
-                        68.994689
-                    ]
-                ],
-                [
-                    [
-                        -168.5133204,
-                        62.8689586
-                    ],
-                    [
-                        -168.5144423,
-                        63.8765677
-                    ],
-                    [
-                        -172.0202755,
-                        63.8757975
-                    ],
-                    [
-                        -172.0191536,
-                        62.8681608
-                    ]
-                ],
-                [
-                    [
-                        -170.9947111,
-                        59.9954089
-                    ],
-                    [
-                        -170.995726,
-                        60.9969787
-                    ],
-                    [
-                        -174.0045311,
-                        60.9962508
-                    ],
-                    [
-                        -174.0035162,
-                        59.9946581
-                    ]
-                ],
-                [
-                    [
-                        -156.0717261,
-                        20.2854602
-                    ],
-                    [
-                        -154.7940471,
-                        20.2860582
-                    ],
-                    [
-                        -154.7933145,
-                        18.9029464
-                    ],
-                    [
-                        -156.0709936,
-                        18.9023432
-                    ]
-                ]
-            ]
-        },
-        {
-            "name": "Vejmidte (Denmark)",
-            "type": "tms",
-            "template": "http://{switch:a,b,c}.tile.openstreetmap.dk/danmark/vejmidte/{zoom}/{x}/{y}.png",
-            "scaleExtent": [
-                0,
-                20
-            ],
-            "polygon": [
-                [
-                    [
-                        8.3743941,
-                        54.9551655
-                    ],
-                    [
-                        8.3683809,
-                        55.4042149
-                    ],
-                    [
-                        8.2103997,
-                        55.4039795
-                    ],
-                    [
-                        8.2087314,
-                        55.4937345
-                    ],
-                    [
-                        8.0502655,
-                        55.4924731
-                    ],
-                    [
-                        8.0185123,
-                        56.7501399
-                    ],
-                    [
-                        8.1819161,
-                        56.7509948
-                    ],
-                    [
-                        8.1763274,
-                        57.0208898
-                    ],
-                    [
-                        8.3413329,
-                        57.0219872
-                    ],
-                    [
-                        8.3392467,
-                        57.1119574
-                    ],
-                    [
-                        8.5054433,
-                        57.1123212
-                    ],
-                    [
-                        8.5033923,
-                        57.2020499
-                    ],
-                    [
-                        9.3316304,
-                        57.2027636
-                    ],
-                    [
-                        9.3319079,
-                        57.2924835
-                    ],
-                    [
-                        9.4978864,
-                        57.2919578
-                    ],
-                    [
-                        9.4988593,
-                        57.3820608
-                    ],
-                    [
-                        9.6649749,
-                        57.3811615
-                    ],
-                    [
-                        9.6687295,
-                        57.5605591
-                    ],
-                    [
-                        9.8351961,
-                        57.5596265
-                    ],
-                    [
-                        9.8374896,
-                        57.6493322
-                    ],
-                    [
-                        10.1725726,
-                        57.6462818
-                    ],
-                    [
-                        10.1754245,
-                        57.7367768
-                    ],
-                    [
-                        10.5118282,
-                        57.7330269
-                    ],
-                    [
-                        10.5152095,
-                        57.8228945
-                    ],
-                    [
-                        10.6834853,
-                        57.8207722
-                    ],
-                    [
-                        10.6751613,
-                        57.6412021
-                    ],
-                    [
-                        10.5077045,
-                        57.6433097
-                    ],
-                    [
-                        10.5039992,
-                        57.5535088
-                    ],
-                    [
-                        10.671038,
-                        57.5514113
-                    ],
-                    [
-                        10.6507805,
-                        57.1024538
-                    ],
-                    [
-                        10.4857673,
-                        57.1045138
-                    ],
-                    [
-                        10.4786236,
-                        56.9249051
-                    ],
-                    [
-                        10.3143981,
-                        56.9267573
-                    ],
-                    [
-                        10.3112341,
-                        56.8369269
-                    ],
-                    [
-                        10.4750295,
-                        56.83509
-                    ],
-                    [
-                        10.4649016,
-                        56.5656681
-                    ],
-                    [
-                        10.9524239,
-                        56.5589761
-                    ],
-                    [
-                        10.9479249,
-                        56.4692243
-                    ],
-                    [
-                        11.1099335,
-                        56.4664675
-                    ],
-                    [
-                        11.1052639,
-                        56.376833
-                    ],
-                    [
-                        10.9429901,
-                        56.3795284
-                    ],
-                    [
-                        10.9341235,
-                        56.1994768
-                    ],
-                    [
-                        10.7719685,
-                        56.2020244
-                    ],
-                    [
-                        10.7694751,
-                        56.1120103
-                    ],
-                    [
-                        10.6079695,
-                        56.1150259
-                    ],
-                    [
-                        10.4466742,
-                        56.116717
-                    ],
-                    [
-                        10.2865948,
-                        56.118675
-                    ],
-                    [
-                        10.2831527,
-                        56.0281851
-                    ],
-                    [
-                        10.4439274,
-                        56.0270388
-                    ],
-                    [
-                        10.4417713,
-                        55.7579243
-                    ],
-                    [
-                        10.4334961,
-                        55.6693533
-                    ],
-                    [
-                        10.743814,
-                        55.6646861
-                    ],
-                    [
-                        10.743814,
-                        55.5712253
-                    ],
-                    [
-                        10.8969041,
-                        55.5712253
-                    ],
-                    [
-                        10.9051793,
-                        55.3953852
-                    ],
-                    [
-                        11.0613726,
-                        55.3812841
-                    ],
-                    [
-                        11.0593038,
-                        55.1124061
-                    ],
-                    [
-                        11.0458567,
-                        55.0318621
-                    ],
-                    [
-                        11.2030844,
-                        55.0247474
-                    ],
-                    [
-                        11.2030844,
-                        55.117139
-                    ],
-                    [
-                        11.0593038,
-                        55.1124061
-                    ],
-                    [
-                        11.0613726,
-                        55.3812841
-                    ],
-                    [
-                        11.0789572,
-                        55.5712253
-                    ],
-                    [
-                        10.8969041,
-                        55.5712253
-                    ],
-                    [
-                        10.9258671,
-                        55.6670198
-                    ],
-                    [
-                        10.743814,
-                        55.6646861
-                    ],
-                    [
-                        10.7562267,
-                        55.7579243
-                    ],
-                    [
-                        10.4417713,
-                        55.7579243
-                    ],
-                    [
-                        10.4439274,
-                        56.0270388
-                    ],
-                    [
-                        10.4466742,
-                        56.116717
-                    ],
-                    [
-                        10.6079695,
-                        56.1150259
-                    ],
-                    [
-                        10.6052053,
-                        56.0247462
-                    ],
-                    [
-                        10.9258671,
-                        56.0201215
-                    ],
-                    [
-                        10.9197132,
-                        55.9309388
-                    ],
-                    [
-                        11.0802782,
-                        55.92792
-                    ],
-                    [
-                        11.0858066,
-                        56.0178284
-                    ],
-                    [
-                        11.7265047,
-                        56.005058
-                    ],
-                    [
-                        11.7319981,
-                        56.0952142
-                    ],
-                    [
-                        12.0540333,
-                        56.0871256
-                    ],
-                    [
-                        12.0608477,
-                        56.1762576
-                    ],
-                    [
-                        12.7023469,
-                        56.1594405
-                    ],
-                    [
-                        12.6611131,
-                        55.7114318
-                    ],
-                    [
-                        12.9792318,
-                        55.7014026
-                    ],
-                    [
-                        12.9612912,
-                        55.5217294
-                    ],
-                    [
-                        12.3268659,
-                        55.5412096
-                    ],
-                    [
-                        12.3206071,
-                        55.4513655
-                    ],
-                    [
-                        12.4778226,
-                        55.447067
-                    ],
-                    [
-                        12.4702432,
-                        55.3570479
-                    ],
-                    [
-                        12.6269738,
-                        55.3523837
-                    ],
-                    [
-                        12.6200898,
-                        55.2632576
-                    ],
-                    [
-                        12.4627339,
-                        55.26722
-                    ],
-                    [
-                        12.4552949,
-                        55.1778223
-                    ],
-                    [
-                        12.2987046,
-                        55.1822303
-                    ],
-                    [
-                        12.2897344,
-                        55.0923641
-                    ],
-                    [
-                        12.6048608,
-                        55.0832904
-                    ],
-                    [
-                        12.5872011,
-                        54.9036285
-                    ],
-                    [
-                        12.2766618,
-                        54.9119031
-                    ],
-                    [
-                        12.2610181,
-                        54.7331602
-                    ],
-                    [
-                        12.1070691,
-                        54.7378161
-                    ],
-                    [
-                        12.0858621,
-                        54.4681655
-                    ],
-                    [
-                        11.7794953,
-                        54.4753579
-                    ],
-                    [
-                        11.7837381,
-                        54.5654783
-                    ],
-                    [
-                        11.1658525,
-                        54.5782155
-                    ],
-                    [
-                        11.1706443,
-                        54.6686508
-                    ],
-                    [
-                        10.8617173,
-                        54.6733956
-                    ],
-                    [
-                        10.8651245,
-                        54.7634667
-                    ],
-                    [
-                        10.7713646,
-                        54.7643888
-                    ],
-                    [
-                        10.7707276,
-                        54.7372807
-                    ],
-                    [
-                        10.7551428,
-                        54.7375776
-                    ],
-                    [
-                        10.7544039,
-                        54.7195666
-                    ],
-                    [
-                        10.7389074,
-                        54.7197588
-                    ],
-                    [
-                        10.7384368,
-                        54.7108482
-                    ],
-                    [
-                        10.7074486,
-                        54.7113045
-                    ],
-                    [
-                        10.7041094,
-                        54.6756741
-                    ],
-                    [
-                        10.5510973,
-                        54.6781698
-                    ],
-                    [
-                        10.5547184,
-                        54.7670245
-                    ],
-                    [
-                        10.2423994,
-                        54.7705935
-                    ],
-                    [
-                        10.2459845,
-                        54.8604673
-                    ],
-                    [
-                        10.0902268,
-                        54.8622134
-                    ],
-                    [
-                        10.0873731,
-                        54.7723851
-                    ],
-                    [
-                        9.1555798,
-                        54.7769557
-                    ],
-                    [
-                        9.1562752,
-                        54.8675369
-                    ],
-                    [
-                        8.5321973,
-                        54.8663765
-                    ],
-                    [
-                        8.531432,
-                        54.95516
-                    ]
-                ],
-                [
-                    [
-                        11.4577738,
-                        56.819554
-                    ],
-                    [
-                        11.7849181,
-                        56.8127385
-                    ],
-                    [
-                        11.7716715,
-                        56.6332796
-                    ],
-                    [
-                        11.4459621,
-                        56.6401087
-                    ]
-                ],
-                [
-                    [
-                        11.3274736,
-                        57.3612962
-                    ],
-                    [
-                        11.3161808,
-                        57.1818004
-                    ],
-                    [
-                        11.1508692,
-                        57.1847276
-                    ],
-                    [
-                        11.1456628,
-                        57.094962
-                    ],
-                    [
-                        10.8157703,
-                        57.1001693
-                    ],
-                    [
-                        10.8290599,
-                        57.3695272
-                    ]
-                ],
-                [
-                    [
-                        11.5843266,
-                        56.2777928
-                    ],
-                    [
-                        11.5782882,
-                        56.1880397
-                    ],
-                    [
-                        11.7392309,
-                        56.1845765
-                    ],
-                    [
-                        11.7456428,
-                        56.2743186
-                    ]
-                ],
-                [
-                    [
-                        14.6825922,
-                        55.3639405
-                    ],
-                    [
-                        14.8395247,
-                        55.3565231
-                    ],
-                    [
-                        14.8263755,
-                        55.2671261
-                    ],
-                    [
-                        15.1393406,
-                        55.2517359
-                    ],
-                    [
-                        15.1532015,
-                        55.3410836
-                    ],
-                    [
-                        15.309925,
-                        55.3330556
-                    ],
-                    [
-                        15.295719,
-                        55.2437356
-                    ],
-                    [
-                        15.1393406,
-                        55.2517359
-                    ],
-                    [
-                        15.1255631,
-                        55.1623802
-                    ],
-                    [
-                        15.2815819,
-                        55.1544167
-                    ],
-                    [
-                        15.2535578,
-                        54.9757646
-                    ],
-                    [
-                        14.6317464,
-                        55.0062496
-                    ]
-                ]
-            ],
-            "terms_url": "http://wiki.openstreetmap.org/wiki/Vejmidte",
-            "terms_text": "Danish municipalities"
-        },
-        {
-            "name": "Vienna: Beschriftungen (annotations)",
-            "type": "tms",
-            "template": "http://www.wien.gv.at/wmts/beschriftung/normal/google3857/{zoom}/{y}/{x}.png",
-            "scaleExtent": [
-                0,
-                19
-            ],
-            "polygon": [
-                [
-                    [
-                        16.17,
-                        48.1
-                    ],
-                    [
-                        16.17,
-                        48.33
-                    ],
-                    [
-                        16.58,
-                        48.33
-                    ],
-                    [
-                        16.58,
-                        48.1
-                    ],
-                    [
-                        16.17,
-                        48.1
-                    ]
-                ]
-            ],
-            "terms_url": "http://data.wien.gv.at/",
-            "terms_text": "Stadt Wien"
-        },
-        {
-            "name": "Vienna: Mehrzweckkarte (general purpose)",
-            "type": "tms",
-            "template": "http://www.wien.gv.at/wmts/fmzk/pastell/google3857/{zoom}/{y}/{x}.jpeg",
-            "scaleExtent": [
-                0,
-                19
-            ],
-            "polygon": [
-                [
-                    [
-                        16.17,
-                        48.1
-                    ],
-                    [
-                        16.17,
-                        48.33
-                    ],
-                    [
-                        16.58,
-                        48.33
-                    ],
-                    [
-                        16.58,
-                        48.1
-                    ],
-                    [
-                        16.17,
-                        48.1
-                    ]
-                ]
-            ],
-            "terms_url": "http://data.wien.gv.at/",
-            "terms_text": "Stadt Wien"
-        },
-        {
-            "name": "Vienna: Orthofoto (aerial image)",
-            "type": "tms",
-            "template": "http://www.wien.gv.at/wmts/lb/farbe/google3857/{zoom}/{y}/{x}.jpeg",
-            "scaleExtent": [
-                0,
-                19
-            ],
-            "polygon": [
-                [
-                    [
-                        16.17,
-                        48.1
-                    ],
-                    [
-                        16.17,
-                        48.33
-                    ],
-                    [
-                        16.58,
-                        48.33
-                    ],
-                    [
-                        16.58,
-                        48.1
-                    ],
-                    [
-                        16.17,
-                        48.1
-                    ]
-                ]
-            ],
-            "terms_url": "http://data.wien.gv.at/",
-            "terms_text": "Stadt Wien"
-        },
-        {
-            "name": "basemap.at",
-            "type": "tms",
-            "description": "Basemap of Austria, based on goverment data.",
-            "template": "http://maps.wien.gv.at/basemap/geolandbasemap/normal/google3857/{zoom}/{y}/{x}.jpeg",
-            "polygon": [
-                [
-                    [
-                        16.5073284,
-                        46.9929304
-                    ],
-                    [
-                        16.283417,
-                        46.9929304
-                    ],
-                    [
-                        16.135839,
-                        46.8713046
-                    ],
-                    [
-                        15.9831722,
-                        46.8190947
-                    ],
-                    [
-                        16.0493278,
-                        46.655175
-                    ],
-                    [
-                        15.8610387,
-                        46.7180116
-                    ],
-                    [
-                        15.7592608,
-                        46.6900933
-                    ],
-                    [
-                        15.5607938,
-                        46.6796202
-                    ],
-                    [
-                        15.5760605,
-                        46.6342132
-                    ],
-                    [
-                        15.4793715,
-                        46.6027553
-                    ],
-                    [
-                        15.4335715,
-                        46.6516819
-                    ],
-                    [
-                        15.2249267,
-                        46.6342132
-                    ],
-                    [
-                        15.0468154,
-                        46.6481886
-                    ],
-                    [
-                        14.9908376,
-                        46.5887681
-                    ],
-                    [
-                        14.9603042,
-                        46.6237293
-                    ],
-                    [
-                        14.8534374,
-                        46.6027553
-                    ],
-                    [
-                        14.8330818,
-                        46.5012666
-                    ],
-                    [
-                        14.7516595,
-                        46.4977636
-                    ],
-                    [
-                        14.6804149,
-                        46.4381781
-                    ],
-                    [
-                        14.6142593,
-                        46.4381781
-                    ],
-                    [
-                        14.578637,
-                        46.3785275
-                    ],
-                    [
-                        14.4412369,
-                        46.4311638
-                    ],
-                    [
-                        14.1613476,
-                        46.4276563
-                    ],
-                    [
-                        14.1257253,
-                        46.4767409
-                    ],
-                    [
-                        14.0188585,
-                        46.4767409
-                    ],
-                    [
-                        13.9119917,
-                        46.5257813
-                    ],
-                    [
-                        13.8254805,
-                        46.5047694
-                    ],
-                    [
-                        13.4438134,
-                        46.560783
-                    ],
-                    [
-                        13.3064132,
-                        46.5502848
-                    ],
-                    [
-                        13.1283019,
-                        46.5887681
-                    ],
-                    [
-                        12.8433237,
-                        46.6132433
-                    ],
-                    [
-                        12.7262791,
-                        46.6412014
-                    ],
-                    [
-                        12.5125455,
-                        46.6656529
-                    ],
-                    [
-                        12.3598787,
-                        46.7040543
-                    ],
-                    [
-                        12.3649676,
-                        46.7703197
-                    ],
-                    [
-                        12.2886341,
-                        46.7772902
-                    ],
-                    [
-                        12.2733674,
-                        46.8852187
-                    ],
-                    [
-                        12.2072118,
-                        46.8747835
-                    ],
-                    [
-                        12.1308784,
-                        46.9026062
-                    ],
-                    [
-                        12.1156117,
-                        46.9998721
-                    ],
-                    [
-                        12.2530119,
-                        47.0657733
-                    ],
-                    [
-                        12.2123007,
-                        47.0934969
-                    ],
-                    [
-                        11.9833004,
-                        47.0449712
-                    ],
-                    [
-                        11.7339445,
-                        46.9616816
-                    ],
-                    [
-                        11.6321666,
-                        47.010283
-                    ],
-                    [
-                        11.5405665,
-                        46.9755722
-                    ],
-                    [
-                        11.4998553,
-                        47.0068129
-                    ],
-                    [
-                        11.418433,
-                        46.9651546
-                    ],
-                    [
-                        11.2555884,
-                        46.9755722
-                    ],
-                    [
-                        11.1130993,
-                        46.913036
-                    ],
-                    [
-                        11.0418548,
-                        46.7633482
-                    ],
-                    [
-                        10.8891879,
-                        46.7598621
-                    ],
-                    [
-                        10.7416099,
-                        46.7842599
-                    ],
-                    [
-                        10.7059877,
-                        46.8643462
-                    ],
-                    [
-                        10.5787653,
-                        46.8399847
-                    ],
-                    [
-                        10.4566318,
-                        46.8504267
-                    ],
-                    [
-                        10.4769874,
-                        46.9269392
-                    ],
-                    [
-                        10.3853873,
-                        46.9894592
-                    ],
-                    [
-                        10.2327204,
-                        46.8643462
-                    ],
-                    [
-                        10.1207647,
-                        46.8330223
-                    ],
-                    [
-                        9.8663199,
-                        46.9408389
-                    ],
-                    [
-                        9.9019422,
-                        47.0033426
-                    ],
-                    [
-                        9.6831197,
-                        47.0588402
-                    ],
-                    [
-                        9.6118752,
-                        47.0380354
-                    ],
-                    [
-                        9.6322307,
-                        47.128131
-                    ],
-                    [
-                        9.5813418,
-                        47.1662025
-                    ],
-                    [
-                        9.5406306,
-                        47.2664422
-                    ],
-                    [
-                        9.6067863,
-                        47.3492559
-                    ],
-                    [
-                        9.6729419,
-                        47.369939
-                    ],
-                    [
-                        9.6424085,
-                        47.4457079
-                    ],
-                    [
-                        9.5660751,
-                        47.4801122
-                    ],
-                    [
-                        9.7136531,
-                        47.5282405
-                    ],
-                    [
-                        9.7848976,
-                        47.5969187
-                    ],
-                    [
-                        9.8357866,
-                        47.5454185
-                    ],
-                    [
-                        9.9477423,
-                        47.538548
-                    ],
-                    [
-                        10.0902313,
-                        47.4491493
-                    ],
-                    [
-                        10.1105869,
-                        47.3664924
-                    ],
-                    [
-                        10.2428982,
-                        47.3871688
-                    ],
-                    [
-                        10.1869203,
-                        47.2698953
-                    ],
-                    [
-                        10.3243205,
-                        47.2975125
-                    ],
-                    [
-                        10.4820763,
-                        47.4491493
-                    ],
-                    [
-                        10.4311873,
-                        47.4869904
-                    ],
-                    [
-                        10.4413651,
-                        47.5900549
-                    ],
-                    [
-                        10.4871652,
-                        47.5522881
-                    ],
-                    [
-                        10.5482319,
-                        47.5351124
-                    ],
-                    [
-                        10.5991209,
-                        47.5660246
-                    ],
-                    [
-                        10.7568766,
-                        47.5316766
-                    ],
-                    [
-                        10.8891879,
-                        47.5454185
-                    ],
-                    [
-                        10.9400769,
-                        47.4869904
-                    ],
-                    [
-                        10.9960547,
-                        47.3906141
-                    ],
-                    [
-                        11.2352328,
-                        47.4422662
-                    ],
-                    [
-                        11.2810328,
-                        47.3975039
-                    ],
-                    [
-                        11.4235219,
-                        47.5144941
-                    ],
-                    [
-                        11.5761888,
-                        47.5076195
-                    ],
-                    [
-                        11.6067221,
-                        47.5900549
-                    ],
-                    [
-                        11.8357224,
-                        47.5866227
-                    ],
-                    [
-                        12.003656,
-                        47.6243647
-                    ],
-                    [
-                        12.2072118,
-                        47.6037815
-                    ],
-                    [
-                        12.1614117,
-                        47.6963421
-                    ],
-                    [
-                        12.2581008,
-                        47.7442718
-                    ],
-                    [
-                        12.2530119,
-                        47.6792136
-                    ],
-                    [
-                        12.4311232,
-                        47.7100408
-                    ],
-                    [
-                        12.4921899,
-                        47.631224
-                    ],
-                    [
-                        12.5685234,
-                        47.6277944
-                    ],
-                    [
-                        12.6295901,
-                        47.6894913
-                    ],
-                    [
-                        12.7720792,
-                        47.6689338
-                    ],
-                    [
-                        12.8331459,
-                        47.5419833
-                    ],
-                    [
-                        12.975635,
-                        47.4732332
-                    ],
-                    [
-                        13.0417906,
-                        47.4938677
-                    ],
-                    [
-                        13.0367017,
-                        47.5557226
-                    ],
-                    [
-                        13.0977685,
-                        47.6415112
-                    ],
-                    [
-                        13.0316128,
-                        47.7100408
-                    ],
-                    [
-                        12.9043905,
-                        47.7203125
-                    ],
-                    [
-                        13.0061684,
-                        47.84683
-                    ],
-                    [
-                        12.9451016,
-                        47.9355501
-                    ],
-                    [
-                        12.8636793,
-                        47.9594103
-                    ],
-                    [
-                        12.8636793,
-                        48.0036929
-                    ],
-                    [
-                        12.7517236,
-                        48.0989418
-                    ],
-                    [
-                        12.8738571,
-                        48.2109733
-                    ],
-                    [
-                        12.9603683,
-                        48.2109733
-                    ],
-                    [
-                        13.0417906,
-                        48.2652035
-                    ],
-                    [
-                        13.1842797,
-                        48.2990682
-                    ],
-                    [
-                        13.2606131,
-                        48.2922971
-                    ],
-                    [
-                        13.3980133,
-                        48.3565867
-                    ],
-                    [
-                        13.4438134,
-                        48.417418
-                    ],
-                    [
-                        13.4387245,
-                        48.5523383
-                    ],
-                    [
-                        13.509969,
-                        48.5860123
-                    ],
-                    [
-                        13.6117469,
-                        48.5725454
-                    ],
-                    [
-                        13.7287915,
-                        48.5118999
-                    ],
-                    [
-                        13.7847694,
-                        48.5725454
-                    ],
-                    [
-                        13.8203916,
-                        48.6263915
-                    ],
-                    [
-                        13.7949471,
-                        48.7171267
-                    ],
-                    [
-                        13.850925,
-                        48.7741724
-                    ],
-                    [
-                        14.0595697,
-                        48.6633774
-                    ],
-                    [
-                        14.0137696,
-                        48.6331182
-                    ],
-                    [
-                        14.0748364,
-                        48.5927444
-                    ],
-                    [
-                        14.2173255,
-                        48.5961101
-                    ],
-                    [
-                        14.3649034,
-                        48.5489696
-                    ],
-                    [
-                        14.4666813,
-                        48.6499311
-                    ],
-                    [
-                        14.5582815,
-                        48.5961101
-                    ],
-                    [
-                        14.5989926,
-                        48.6263915
-                    ],
-                    [
-                        14.7211261,
-                        48.5759124
-                    ],
-                    [
-                        14.7211261,
-                        48.6868997
-                    ],
-                    [
-                        14.822904,
-                        48.7271983
-                    ],
-                    [
-                        14.8178151,
-                        48.777526
-                    ],
-                    [
-                        14.9647227,
-                        48.7851754
-                    ],
-                    [
-                        14.9893637,
-                        49.0126611
-                    ],
-                    [
-                        15.1485933,
-                        48.9950306
-                    ],
-                    [
-                        15.1943934,
-                        48.9315502
-                    ],
-                    [
-                        15.3063491,
-                        48.9850128
-                    ],
-                    [
-                        15.3928603,
-                        48.9850128
-                    ],
-                    [
-                        15.4844604,
-                        48.9282069
-                    ],
-                    [
-                        15.749083,
-                        48.8545973
-                    ],
-                    [
-                        15.8406831,
-                        48.8880697
-                    ],
-                    [
-                        16.0086166,
-                        48.7808794
-                    ],
-                    [
-                        16.2070835,
-                        48.7339115
-                    ],
-                    [
-                        16.3953727,
-                        48.7372678
-                    ],
-                    [
-                        16.4920617,
-                        48.8110498
-                    ],
-                    [
-                        16.6905286,
-                        48.7741724
-                    ],
-                    [
-                        16.7057953,
-                        48.7339115
-                    ],
-                    [
-                        16.8991733,
-                        48.713769
-                    ],
-                    [
-                        16.9755067,
-                        48.515271
-                    ],
-                    [
-                        16.8482844,
-                        48.4511817
-                    ],
-                    [
-                        16.8533733,
-                        48.3464411
-                    ],
-                    [
-                        16.9551512,
-                        48.2516513
-                    ],
-                    [
-                        16.9907734,
-                        48.1498955
-                    ],
-                    [
-                        17.0925513,
-                        48.1397088
-                    ],
-                    [
-                        17.0823736,
-                        48.0241182
-                    ],
-                    [
-                        17.1739737,
-                        48.0207146
-                    ],
-                    [
-                        17.0823736,
-                        47.8741447
-                    ],
-                    [
-                        16.9856845,
-                        47.8673174
-                    ],
-                    [
-                        17.0823736,
-                        47.8092489
-                    ],
-                    [
-                        17.0925513,
-                        47.7031919
-                    ],
-                    [
-                        16.7414176,
-                        47.6792136
-                    ],
-                    [
-                        16.7057953,
-                        47.7511153
-                    ],
-                    [
-                        16.5378617,
-                        47.7545368
-                    ],
-                    [
-                        16.5480395,
-                        47.7066164
-                    ],
-                    [
-                        16.4208172,
-                        47.6689338
-                    ],
-                    [
-                        16.573484,
-                        47.6175045
-                    ],
-                    [
-                        16.670173,
-                        47.631224
-                    ],
-                    [
-                        16.7108842,
-                        47.538548
-                    ],
-                    [
-                        16.6599952,
-                        47.4491493
-                    ],
-                    [
-                        16.5429506,
-                        47.3940591
-                    ],
-                    [
-                        16.4615283,
-                        47.3940591
-                    ],
-                    [
-                        16.4920617,
-                        47.276801
-                    ],
-                    [
-                        16.425906,
-                        47.1973317
-                    ],
-                    [
-                        16.4717061,
-                        47.1489007
-                    ],
-                    [
-                        16.5480395,
-                        47.1489007
-                    ],
-                    [
-                        16.476795,
-                        47.0796369
-                    ],
-                    [
-                        16.527684,
-                        47.0588402
-                    ]
-                ]
-            ],
-            "terms_text": "basemap.at",
-            "id": "basemap.at"
-        }
-    ],
-    "wikipedia": [
-        [
-            "English",
-            "English",
-            "en"
-        ],
-        [
-            "German",
-            "Deutsch",
-            "de"
-        ],
-        [
-            "Dutch",
-            "Nederlands",
-            "nl"
-        ],
-        [
-            "French",
-            "Français",
-            "fr"
-        ],
-        [
-            "Italian",
-            "Italiano",
-            "it"
-        ],
-        [
-            "Russian",
-            "Русский",
-            "ru"
-        ],
-        [
-            "Spanish",
-            "Español",
-            "es"
-        ],
-        [
-            "Polish",
-            "Polski",
-            "pl"
-        ],
-        [
-            "Swedish",
-            "Svenska",
-            "sv"
-        ],
-        [
-            "Japanese",
-            "日本語",
-            "ja"
-        ],
-        [
-            "Portuguese",
-            "Português",
-            "pt"
-        ],
-        [
-            "Chinese",
-            "中文",
-            "zh"
-        ],
-        [
-            "Vietnamese",
-            "Tiếng Việt",
-            "vi"
-        ],
-        [
-            "Ukrainian",
-            "Українська",
-            "uk"
-        ],
-        [
-            "Catalan",
-            "Català",
-            "ca"
-        ],
-        [
-            "Norwegian (Bokmål)",
-            "Norsk (Bokmål)",
-            "no"
-        ],
-        [
-            "Waray-Waray",
-            "Winaray",
-            "war"
-        ],
-        [
-            "Cebuano",
-            "Sinugboanong Binisaya",
-            "ceb"
-        ],
-        [
-            "Finnish",
-            "Suomi",
-            "fi"
-        ],
-        [
-            "Persian",
-            "فارسی",
-            "fa"
-        ],
-        [
-            "Czech",
-            "Čeština",
-            "cs"
-        ],
-        [
-            "Hungarian",
-            "Magyar",
-            "hu"
-        ],
-        [
-            "Korean",
-            "한국어",
-            "ko"
-        ],
-        [
-            "Romanian",
-            "Română",
-            "ro"
-        ],
-        [
-            "Arabic",
-            "العربية",
-            "ar"
-        ],
-        [
-            "Turkish",
-            "Türkçe",
-            "tr"
-        ],
-        [
-            "Indonesian",
-            "Bahasa Indonesia",
-            "id"
-        ],
-        [
-            "Kazakh",
-            "Қазақша",
-            "kk"
-        ],
-        [
-            "Malay",
-            "Bahasa Melayu",
-            "ms"
-        ],
-        [
-            "Serbian",
-            "Српски / Srpski",
-            "sr"
-        ],
-        [
-            "Slovak",
-            "Slovenčina",
-            "sk"
-        ],
-        [
-            "Esperanto",
-            "Esperanto",
-            "eo"
-        ],
-        [
-            "Danish",
-            "Dansk",
-            "da"
-        ],
-        [
-            "Lithuanian",
-            "Lietuvių",
-            "lt"
-        ],
-        [
-            "Basque",
-            "Euskara",
-            "eu"
-        ],
-        [
-            "Bulgarian",
-            "Български",
-            "bg"
-        ],
-        [
-            "Hebrew",
-            "עברית",
-            "he"
-        ],
-        [
-            "Slovenian",
-            "Slovenščina",
-            "sl"
-        ],
-        [
-            "Croatian",
-            "Hrvatski",
-            "hr"
-        ],
-        [
-            "Volapük",
-            "Volapük",
-            "vo"
-        ],
-        [
-            "Estonian",
-            "Eesti",
-            "et"
-        ],
-        [
-            "Hindi",
-            "हिन्दी",
-            "hi"
-        ],
-        [
-            "Uzbek",
-            "O‘zbek",
-            "uz"
-        ],
-        [
-            "Galician",
-            "Galego",
-            "gl"
-        ],
-        [
-            "Norwegian (Nynorsk)",
-            "Nynorsk",
-            "nn"
-        ],
-        [
-            "Simple English",
-            "Simple English",
-            "simple"
-        ],
-        [
-            "Azerbaijani",
-            "Azərbaycanca",
-            "az"
-        ],
-        [
-            "Latin",
-            "Latina",
-            "la"
-        ],
-        [
-            "Greek",
-            "Ελληνικά",
-            "el"
-        ],
-        [
-            "Thai",
-            "ไทย",
-            "th"
-        ],
-        [
-            "Serbo-Croatian",
-            "Srpskohrvatski / Српскохрватски",
-            "sh"
-        ],
-        [
-            "Georgian",
-            "ქართული",
-            "ka"
-        ],
-        [
-            "Occitan",
-            "Occitan",
-            "oc"
-        ],
-        [
-            "Macedonian",
-            "Македонски",
-            "mk"
-        ],
-        [
-            "Newar / Nepal Bhasa",
-            "नेपाल भाषा",
-            "new"
-        ],
-        [
-            "Tagalog",
-            "Tagalog",
-            "tl"
-        ],
-        [
-            "Piedmontese",
-            "Piemontèis",
-            "pms"
-        ],
-        [
-            "Belarusian",
-            "Беларуская",
-            "be"
-        ],
-        [
-            "Haitian",
-            "Krèyol ayisyen",
-            "ht"
-        ],
-        [
-            "Tamil",
-            "தமிழ்",
-            "ta"
-        ],
-        [
-            "Telugu",
-            "తెలుగు",
-            "te"
-        ],
-        [
-            "Belarusian (Taraškievica)",
-            "Беларуская (тарашкевіца)",
-            "be-x-old"
-        ],
-        [
-            "Latvian",
-            "Latviešu",
-            "lv"
-        ],
-        [
-            "Breton",
-            "Brezhoneg",
-            "br"
-        ],
-        [
-            "Malagasy",
-            "Malagasy",
-            "mg"
-        ],
-        [
-            "Albanian",
-            "Shqip",
-            "sq"
-        ],
-        [
-            "Armenian",
-            "Հայերեն",
-            "hy"
-        ],
-        [
-            "Tatar",
-            "Tatarça / Татарча",
-            "tt"
-        ],
-        [
-            "Javanese",
-            "Basa Jawa",
-            "jv"
-        ],
-        [
-            "Welsh",
-            "Cymraeg",
-            "cy"
-        ],
-        [
-            "Marathi",
-            "मराठी",
-            "mr"
-        ],
-        [
-            "Luxembourgish",
-            "Lëtzebuergesch",
-            "lb"
-        ],
-        [
-            "Icelandic",
-            "Íslenska",
-            "is"
-        ],
-        [
-            "Bosnian",
-            "Bosanski",
-            "bs"
-        ],
-        [
-            "Burmese",
-            "မြန်မာဘာသာ",
-            "my"
-        ],
-        [
-            "Yoruba",
-            "Yorùbá",
-            "yo"
-        ],
-        [
-            "Bashkir",
-            "Башҡорт",
-            "ba"
-        ],
-        [
-            "Malayalam",
-            "മലയാളം",
-            "ml"
-        ],
-        [
-            "Aragonese",
-            "Aragonés",
-            "an"
-        ],
-        [
-            "Lombard",
-            "Lumbaart",
-            "lmo"
-        ],
-        [
-            "Afrikaans",
-            "Afrikaans",
-            "af"
-        ],
-        [
-            "West Frisian",
-            "Frysk",
-            "fy"
-        ],
-        [
-            "Western Panjabi",
-            "شاہ مکھی پنجابی (Shāhmukhī Pañjābī)",
-            "pnb"
-        ],
-        [
-            "Bengali",
-            "বাংলা",
-            "bn"
-        ],
-        [
-            "Swahili",
-            "Kiswahili",
-            "sw"
-        ],
-        [
-            "Bishnupriya Manipuri",
-            "ইমার ঠার/বিষ্ণুপ্রিয়া মণিপুরী",
-            "bpy"
-        ],
-        [
-            "Ido",
-            "Ido",
-            "io"
-        ],
-        [
-            "Kirghiz",
-            "Кыргызча",
-            "ky"
-        ],
-        [
-            "Urdu",
-            "اردو",
-            "ur"
-        ],
-        [
-            "Nepali",
-            "नेपाली",
-            "ne"
-        ],
-        [
-            "Sicilian",
-            "Sicilianu",
-            "scn"
-        ],
-        [
-            "Gujarati",
-            "ગુજરાતી",
-            "gu"
-        ],
-        [
-            "Cantonese",
-            "粵語",
-            "zh-yue"
-        ],
-        [
-            "Low Saxon",
-            "Plattdüütsch",
-            "nds"
-        ],
-        [
-            "Kurdish",
-            "Kurdî / كوردی",
-            "ku"
-        ],
-        [
-            "Irish",
-            "Gaeilge",
-            "ga"
-        ],
-        [
-            "Asturian",
-            "Asturianu",
-            "ast"
-        ],
-        [
-            "Quechua",
-            "Runa Simi",
-            "qu"
-        ],
-        [
-            "Sundanese",
-            "Basa Sunda",
-            "su"
-        ],
-        [
-            "Chuvash",
-            "Чăваш",
-            "cv"
-        ],
-        [
-            "Scots",
-            "Scots",
-            "sco"
-        ],
-        [
-            "Interlingua",
-            "Interlingua",
-            "ia"
-        ],
-        [
-            "Alemannic",
-            "Alemannisch",
-            "als"
-        ],
-        [
-            "Buginese",
-            "Basa Ugi",
-            "bug"
-        ],
-        [
-            "Neapolitan",
-            "Nnapulitano",
-            "nap"
-        ],
-        [
-            "Samogitian",
-            "Žemaitėška",
-            "bat-smg"
-        ],
-        [
-            "Kannada",
-            "ಕನ್ನಡ",
-            "kn"
-        ],
-        [
-            "Banyumasan",
-            "Basa Banyumasan",
-            "map-bms"
-        ],
-        [
-            "Walloon",
-            "Walon",
-            "wa"
-        ],
-        [
-            "Amharic",
-            "አማርኛ",
-            "am"
-        ],
-        [
-            "Sorani",
-            "Soranî / کوردی",
-            "ckb"
-        ],
-        [
-            "Scottish Gaelic",
-            "Gàidhlig",
-            "gd"
-        ],
-        [
-            "Fiji Hindi",
-            "Fiji Hindi",
-            "hif"
-        ],
-        [
-            "Min Nan",
-            "Bân-lâm-gú",
-            "zh-min-nan"
-        ],
-        [
-            "Tajik",
-            "Тоҷикӣ",
-            "tg"
-        ],
-        [
-            "Mazandarani",
-            "مَزِروني",
-            "mzn"
-        ],
-        [
-            "Egyptian Arabic",
-            "مصرى (Maṣrī)",
-            "arz"
-        ],
-        [
-            "Yiddish",
-            "ייִדיש",
-            "yi"
-        ],
-        [
-            "Venetian",
-            "Vèneto",
-            "vec"
-        ],
-        [
-            "Mongolian",
-            "Монгол",
-            "mn"
-        ],
-        [
-            "Tarantino",
-            "Tarandíne",
-            "roa-tara"
-        ],
-        [
-            "Sanskrit",
-            "संस्कृतम्",
-            "sa"
-        ],
-        [
-            "Nahuatl",
-            "Nāhuatl",
-            "nah"
-        ],
-        [
-            "Ossetian",
-            "Иронау",
-            "os"
-        ],
-        [
-            "Sakha",
-            "Саха тыла (Saxa Tyla)",
-            "sah"
-        ],
-        [
-            "Kapampangan",
-            "Kapampangan",
-            "pam"
-        ],
-        [
-            "Upper Sorbian",
-            "Hornjoserbsce",
-            "hsb"
-        ],
-        [
-            "Sinhalese",
-            "සිංහල",
-            "si"
-        ],
-        [
-            "Northern Sami",
-            "Sámegiella",
-            "se"
-        ],
-        [
-            "Limburgish",
-            "Limburgs",
-            "li"
-        ],
-        [
-            "Maori",
-            "Māori",
-            "mi"
-        ],
-        [
-            "Bavarian",
-            "Boarisch",
-            "bar"
-        ],
-        [
-            "Corsican",
-            "Corsu",
-            "co"
-        ],
-        [
-            "Ilokano",
-            "Ilokano",
-            "ilo"
-        ],
-        [
-            "Gan",
-            "贛語",
-            "gan"
-        ],
-        [
-            "Tibetan",
-            "བོད་སྐད",
-            "bo"
-        ],
-        [
-            "Gilaki",
-            "گیلکی",
-            "glk"
-        ],
-        [
-            "Faroese",
-            "Føroyskt",
-            "fo"
-        ],
-        [
-            "Rusyn",
-            "русиньскый язык",
-            "rue"
-        ],
-        [
-            "Punjabi",
-            "ਪੰਜਾਬੀ",
-            "pa"
-        ],
-        [
-            "Central_Bicolano",
-            "Bikol",
-            "bcl"
-        ],
-        [
-            "Hill Mari",
-            "Кырык Мары (Kyryk Mary) ",
-            "mrj"
-        ],
-        [
-            "Võro",
-            "Võro",
-            "fiu-vro"
-        ],
-        [
-            "Dutch Low Saxon",
-            "Nedersaksisch",
-            "nds-nl"
-        ],
-        [
-            "Turkmen",
-            "تركمن / Туркмен",
-            "tk"
-        ],
-        [
-            "Pashto",
-            "پښتو",
-            "ps"
-        ],
-        [
-            "West Flemish",
-            "West-Vlams",
-            "vls"
-        ],
-        [
-            "Mingrelian",
-            "მარგალური (Margaluri)",
-            "xmf"
-        ],
-        [
-            "Manx",
-            "Gaelg",
-            "gv"
-        ],
-        [
-            "Zazaki",
-            "Zazaki",
-            "diq"
-        ],
-        [
-            "Pangasinan",
-            "Pangasinan",
-            "pag"
-        ],
-        [
-            "Komi",
-            "Коми",
-            "kv"
-        ],
-        [
-            "Zeelandic",
-            "Zeêuws",
-            "zea"
-        ],
-        [
-            "Divehi",
-            "ދިވެހިބަސް",
-            "dv"
-        ],
-        [
-            "Oriya",
-            "ଓଡ଼ିଆ",
-            "or"
-        ],
-        [
-            "Khmer",
-            "ភាសាខ្មែរ",
-            "km"
-        ],
-        [
-            "Norman",
-            "Nouormand/Normaund",
-            "nrm"
-        ],
-        [
-            "Romansh",
-            "Rumantsch",
-            "rm"
-        ],
-        [
-            "Komi-Permyak",
-            "Перем Коми (Perem Komi)",
-            "koi"
-        ],
-        [
-            "Udmurt",
-            "Удмурт кыл",
-            "udm"
-        ],
-        [
-            "Meadow Mari",
-            "Олык Марий (Olyk Marij)",
-            "mhr"
-        ],
-        [
-            "Ladino",
-            "Dzhudezmo",
-            "lad"
-        ],
-        [
-            "North Frisian",
-            "Nordfriisk",
-            "frr"
-        ],
-        [
-            "Kashubian",
-            "Kaszëbsczi",
-            "csb"
-        ],
-        [
-            "Ligurian",
-            "Líguru",
-            "lij"
-        ],
-        [
-            "Wu",
-            "吴语",
-            "wuu"
-        ],
-        [
-            "Friulian",
-            "Furlan",
-            "fur"
-        ],
-        [
-            "Vepsian",
-            "Vepsän",
-            "vep"
-        ],
-        [
-            "Classical Chinese",
-            "古文 / 文言文",
-            "zh-classical"
-        ],
-        [
-            "Uyghur",
-            "ئۇيغۇر تىلى",
-            "ug"
-        ],
-        [
-            "Saterland Frisian",
-            "Seeltersk",
-            "stq"
-        ],
-        [
-            "Sardinian",
-            "Sardu",
-            "sc"
-        ],
-        [
-            "Aromanian",
-            "Armãneashce",
-            "roa-rup"
-        ],
-        [
-            "Pali",
-            "पाऴि",
-            "pi"
-        ],
-        [
-            "Somali",
-            "Soomaaliga",
-            "so"
-        ],
-        [
-            "Bihari",
-            "भोजपुरी",
-            "bh"
-        ],
-        [
-            "Maltese",
-            "Malti",
-            "mt"
-        ],
-        [
-            "Aymara",
-            "Aymar",
-            "ay"
-        ],
-        [
-            "Ripuarian",
-            "Ripoarisch",
-            "ksh"
-        ],
-        [
-            "Novial",
-            "Novial",
-            "nov"
-        ],
-        [
-            "Anglo-Saxon",
-            "Englisc",
-            "ang"
-        ],
-        [
-            "Cornish",
-            "Kernewek/Karnuack",
-            "kw"
-        ],
-        [
-            "Navajo",
-            "Diné bizaad",
-            "nv"
-        ],
-        [
-            "Picard",
-            "Picard",
-            "pcd"
-        ],
-        [
-            "Hakka",
-            "Hak-kâ-fa / 客家話",
-            "hak"
-        ],
-        [
-            "Guarani",
-            "Avañe'ẽ",
-            "gn"
-        ],
-        [
-            "Extremaduran",
-            "Estremeñu",
-            "ext"
-        ],
-        [
-            "Franco-Provençal/Arpitan",
-            "Arpitan",
-            "frp"
-        ],
-        [
-            "Assamese",
-            "অসমীয়া",
-            "as"
-        ],
-        [
-            "Silesian",
-            "Ślůnski",
-            "szl"
-        ],
-        [
-            "Gagauz",
-            "Gagauz",
-            "gag"
-        ],
-        [
-            "Interlingue",
-            "Interlingue",
-            "ie"
-        ],
-        [
-            "Lingala",
-            "Lingala",
-            "ln"
-        ],
-        [
-            "Emilian-Romagnol",
-            "Emiliàn e rumagnòl",
-            "eml"
-        ],
-        [
-            "Chechen",
-            "Нохчийн",
-            "ce"
-        ],
-        [
-            "Kalmyk",
-            "Хальмг",
-            "xal"
-        ],
-        [
-            "Palatinate German",
-            "Pfälzisch",
-            "pfl"
-        ],
-        [
-            "Hawaiian",
-            "Hawai`i",
-            "haw"
-        ],
-        [
-            "Karachay-Balkar",
-            "Къарачай-Малкъар (Qarachay-Malqar)",
-            "krc"
-        ],
-        [
-            "Pennsylvania German",
-            "Deitsch",
-            "pdc"
-        ],
-        [
-            "Kinyarwanda",
-            "Ikinyarwanda",
-            "rw"
-        ],
-        [
-            "Crimean Tatar",
-            "Qırımtatarca",
-            "crh"
-        ],
-        [
-            "Acehnese",
-            "Bahsa Acèh",
-            "ace"
-        ],
-        [
-            "Tongan",
-            "faka Tonga",
-            "to"
-        ],
-        [
-            "Greenlandic",
-            "Kalaallisut",
-            "kl"
-        ],
-        [
-            "Lower Sorbian",
-            "Dolnoserbski",
-            "dsb"
-        ],
-        [
-            "Aramaic",
-            "ܐܪܡܝܐ",
-            "arc"
-        ],
-        [
-            "Erzya",
-            "Эрзянь (Erzjanj Kelj)",
-            "myv"
-        ],
-        [
-            "Lezgian",
-            "Лезги чІал (Lezgi č’al)",
-            "lez"
-        ],
-        [
-            "Banjar",
-            "Bahasa Banjar",
-            "bjn"
-        ],
-        [
-            "Shona",
-            "chiShona",
-            "sn"
-        ],
-        [
-            "Papiamentu",
-            "Papiamentu",
-            "pap"
-        ],
-        [
-            "Kabyle",
-            "Taqbaylit",
-            "kab"
-        ],
-        [
-            "Tok Pisin",
-            "Tok Pisin",
-            "tpi"
-        ],
-        [
-            "Lak",
-            "Лакку",
-            "lbe"
-        ],
-        [
-            "Buryat (Russia)",
-            "Буряад",
-            "bxr"
-        ],
-        [
-            "Lojban",
-            "Lojban",
-            "jbo"
-        ],
-        [
-            "Wolof",
-            "Wolof",
-            "wo"
-        ],
-        [
-            "Moksha",
-            "Мокшень (Mokshanj Kälj)",
-            "mdf"
-        ],
-        [
-            "Zamboanga Chavacano",
-            "Chavacano de Zamboanga",
-            "cbk-zam"
-        ],
-        [
-            "Avar",
-            "Авар",
-            "av"
-        ],
-        [
-            "Sranan",
-            "Sranantongo",
-            "srn"
-        ],
-        [
-            "Mirandese",
-            "Mirandés",
-            "mwl"
-        ],
-        [
-            "Kabardian Circassian",
-            "Адыгэбзэ (Adighabze)",
-            "kbd"
-        ],
-        [
-            "Tahitian",
-            "Reo Mā`ohi",
-            "ty"
-        ],
-        [
-            "Lao",
-            "ລາວ",
-            "lo"
-        ],
-        [
-            "Abkhazian",
-            "Аҧсуа",
-            "ab"
-        ],
-        [
-            "Tetum",
-            "Tetun",
-            "tet"
-        ],
-        [
-            "Latgalian",
-            "Latgaļu",
-            "ltg"
-        ],
-        [
-            "Nauruan",
-            "dorerin Naoero",
-            "na"
-        ],
-        [
-            "Kongo",
-            "KiKongo",
-            "kg"
-        ],
-        [
-            "Igbo",
-            "Igbo",
-            "ig"
-        ],
-        [
-            "Northern Sotho",
-            "Sesotho sa Leboa",
-            "nso"
-        ],
-        [
-            "Zhuang",
-            "Cuengh",
-            "za"
-        ],
-        [
-            "Karakalpak",
-            "Qaraqalpaqsha",
-            "kaa"
-        ],
-        [
-            "Zulu",
-            "isiZulu",
-            "zu"
-        ],
-        [
-            "Cheyenne",
-            "Tsetsêhestâhese",
-            "chy"
-        ],
-        [
-            "Romani",
-            "romani - रोमानी",
-            "rmy"
-        ],
-        [
-            "Old Church Slavonic",
-            "Словѣньскъ",
-            "cu"
-        ],
-        [
-            "Tswana",
-            "Setswana",
-            "tn"
-        ],
-        [
-            "Cherokee",
-            "ᏣᎳᎩ",
-            "chr"
-        ],
-        [
-            "Bislama",
-            "Bislama",
-            "bi"
-        ],
-        [
-            "Min Dong",
-            "Mìng-dĕ̤ng-ngṳ̄",
-            "cdo"
-        ],
-        [
-            "Gothic",
-            "𐌲𐌿𐍄𐌹𐍃𐌺",
-            "got"
-        ],
-        [
-            "Samoan",
-            "Gagana Samoa",
-            "sm"
-        ],
-        [
-            "Moldovan",
-            "Молдовеняскэ",
-            "mo"
-        ],
-        [
-            "Bambara",
-            "Bamanankan",
-            "bm"
-        ],
-        [
-            "Inuktitut",
-            "ᐃᓄᒃᑎᑐᑦ",
-            "iu"
-        ],
-        [
-            "Norfolk",
-            "Norfuk",
-            "pih"
-        ],
-        [
-            "Pontic",
-            "Ποντιακά",
-            "pnt"
-        ],
-        [
-            "Sindhi",
-            "سنڌي، سندھی ، सिन्ध",
-            "sd"
-        ],
-        [
-            "Swati",
-            "SiSwati",
-            "ss"
-        ],
-        [
-            "Kikuyu",
-            "Gĩkũyũ",
-            "ki"
-        ],
-        [
-            "Ewe",
-            "Eʋegbe",
-            "ee"
-        ],
-        [
-            "Hausa",
-            "هَوُسَ",
-            "ha"
-        ],
-        [
-            "Oromo",
-            "Oromoo",
-            "om"
-        ],
-        [
-            "Fijian",
-            "Na Vosa Vakaviti",
-            "fj"
-        ],
-        [
-            "Tigrinya",
-            "ትግርኛ",
-            "ti"
-        ],
-        [
-            "Tsonga",
-            "Xitsonga",
-            "ts"
-        ],
-        [
-            "Kashmiri",
-            "कश्मीरी / كشميري",
-            "ks"
-        ],
-        [
-            "Venda",
-            "Tshivenda",
-            "ve"
-        ],
-        [
-            "Sango",
-            "Sängö",
-            "sg"
-        ],
-        [
-            "Kirundi",
-            "Kirundi",
-            "rn"
-        ],
-        [
-            "Sesotho",
-            "Sesotho",
-            "st"
-        ],
-        [
-            "Dzongkha",
-            "ཇོང་ཁ",
-            "dz"
-        ],
-        [
-            "Cree",
-            "Nehiyaw",
-            "cr"
-        ],
-        [
-            "Akan",
-            "Akana",
-            "ak"
-        ],
-        [
-            "Tumbuka",
-            "chiTumbuka",
-            "tum"
-        ],
-        [
-            "Luganda",
-            "Luganda",
-            "lg"
-        ],
-        [
-            "Chichewa",
-            "Chi-Chewa",
-            "ny"
-        ],
-        [
-            "Fula",
-            "Fulfulde",
-            "ff"
-        ],
-        [
-            "Inupiak",
-            "Iñupiak",
-            "ik"
-        ],
-        [
-            "Chamorro",
-            "Chamoru",
-            "ch"
-        ],
-        [
-            "Twi",
-            "Twi",
-            "tw"
-        ],
-        [
-            "Xhosa",
-            "isiXhosa",
-            "xh"
-        ],
-        [
-            "Ndonga",
-            "Oshiwambo",
-            "ng"
-        ],
-        [
-            "Sichuan Yi",
-            "ꆇꉙ",
-            "ii"
-        ],
-        [
-            "Choctaw",
-            "Choctaw",
-            "cho"
-        ],
-        [
-            "Marshallese",
-            "Ebon",
-            "mh"
-        ],
-        [
-            "Afar",
-            "Afar",
-            "aa"
-        ],
-        [
-            "Kuanyama",
-            "Kuanyama",
-            "kj"
-        ],
-        [
-            "Hiri Motu",
-            "Hiri Motu",
-            "ho"
-        ],
-        [
-            "Muscogee",
-            "Muskogee",
-            "mus"
-        ],
-        [
-            "Kanuri",
-            "Kanuri",
-            "kr"
-        ],
-        [
-            "Herero",
-            "Otsiherero",
-            "hz"
-        ]
-    ],
-    "presets": {
-        "presets": {
-            "address": {
-                "fields": [
-                    "address"
-                ],
-                "geometry": [
-                    "point"
-                ],
-                "tags": {
-                    "addr:housenumber": "*"
-                },
-                "addTags": {},
-                "removeTags": {},
-                "matchScore": 0.2,
-                "name": "Address"
-            },
-            "aerialway": {
-                "fields": [
-                    "aerialway"
-                ],
-                "geometry": [
-                    "point",
-                    "vertex",
-                    "line"
-                ],
-                "tags": {
-                    "aerialway": "*"
-                },
-                "terms": [
-                    "ski lift",
-                    "funifor",
-                    "funitel"
-                ],
-                "name": "Aerialway"
-            },
-            "aerialway/cable_car": {
-                "geometry": [
-                    "line"
-                ],
-                "terms": [
-                    "tramway",
-                    "ropeway"
-                ],
-                "fields": [
-                    "aerialway/occupancy",
-                    "aerialway/capacity",
-                    "aerialway/duration",
-                    "aerialway/heating"
-                ],
-                "tags": {
-                    "aerialway": "cable_car"
-                },
-                "name": "Cable Car"
-            },
-            "aerialway/chair_lift": {
-                "geometry": [
-                    "line"
-                ],
-                "fields": [
-                    "aerialway/occupancy",
-                    "aerialway/capacity",
-                    "aerialway/duration",
-                    "aerialway/bubble",
-                    "aerialway/heating"
-                ],
-                "tags": {
-                    "aerialway": "chair_lift"
-                },
-                "name": "Chair Lift"
-            },
-            "aerialway/gondola": {
-                "geometry": [
-                    "line"
-                ],
-                "fields": [
-                    "aerialway/occupancy",
-                    "aerialway/capacity",
-                    "aerialway/duration",
-                    "aerialway/bubble",
-                    "aerialway/heating"
-                ],
-                "tags": {
-                    "aerialway": "gondola"
-                },
-                "name": "Gondola"
-            },
-            "aerialway/magic_carpet": {
-                "geometry": [
-                    "line"
-                ],
-                "fields": [
-                    "aerialway/capacity",
-                    "aerialway/duration",
-                    "aerialway/heating"
-                ],
-                "tags": {
-                    "aerialway": "magic_carpet"
-                },
-                "name": "Magic Carpet Lift"
-            },
-            "aerialway/platter": {
-                "geometry": [
-                    "line"
-                ],
-                "terms": [
-                    "button lift",
-                    "poma lift"
-                ],
-                "fields": [
-                    "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": [
-                    "aerialway/capacity",
-                    "aerialway/duration"
-                ],
-                "tags": {
-                    "aerialway": "rope_tow"
-                },
-                "name": "Rope Tow Lift"
-            },
-            "aerialway/station": {
-                "geometry": [
-                    "point",
-                    "vertex"
-                ],
-                "fields": [
-                    "aerialway/access",
-                    "aerialway/summer/access",
-                    "elevation"
-                ],
-                "tags": {
-                    "aerialway": "station"
-                },
-                "name": "Aerialway Station"
-            },
-            "aerialway/t-bar": {
-                "geometry": [
-                    "line"
-                ],
-                "fields": [
-                    "aerialway/capacity",
-                    "aerialway/duration"
-                ],
-                "tags": {
-                    "aerialway": "t-bar"
-                },
-                "name": "T-bar Lift"
-            },
-            "aeroway": {
-                "icon": "airport",
-                "fields": [
-                    "aeroway"
-                ],
-                "geometry": [
-                    "point",
-                    "vertex",
-                    "line",
-                    "area"
-                ],
-                "tags": {
-                    "aeroway": "*"
-                },
-                "name": "Aeroway"
-            },
-            "aeroway/aerodrome": {
-                "icon": "airport",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "terms": [
-                    "airplane",
-                    "airport",
-                    "aerodrome"
-                ],
-                "fields": [
-                    "ref",
-                    "iata",
-                    "icao",
-                    "operator"
-                ],
-                "tags": {
-                    "aeroway": "aerodrome"
-                },
-                "name": "Airport"
-            },
-            "aeroway/apron": {
-                "icon": "airport",
-                "geometry": [
-                    "area"
-                ],
-                "terms": [
-                    "ramp"
-                ],
-                "fields": [
-                    "ref",
-                    "surface"
-                ],
-                "tags": {
-                    "aeroway": "apron"
-                },
-                "name": "Apron"
-            },
-            "aeroway/gate": {
-                "icon": "airport",
-                "geometry": [
-                    "point"
-                ],
-                "fields": [
-                    "ref"
-                ],
-                "tags": {
-                    "aeroway": "gate"
-                },
-                "name": "Airport gate"
-            },
-            "aeroway/hangar": {
-                "geometry": [
-                    "area"
-                ],
-                "fields": [
-                    "building_area"
-                ],
-                "tags": {
-                    "aeroway": "hangar"
-                },
-                "name": "Hangar"
-            },
-            "aeroway/helipad": {
-                "icon": "heliport",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "terms": [
-                    "helicopter",
-                    "helipad",
-                    "heliport"
-                ],
-                "tags": {
-                    "aeroway": "helipad"
-                },
-                "name": "Helipad"
-            },
-            "aeroway/runway": {
-                "geometry": [
-                    "line",
-                    "area"
-                ],
-                "terms": [
-                    "landing strip"
-                ],
-                "fields": [
-                    "ref",
-                    "surface",
-                    "length",
-                    "width"
-                ],
-                "tags": {
-                    "aeroway": "runway"
-                },
-                "name": "Runway"
-            },
-            "aeroway/taxiway": {
-                "geometry": [
-                    "line"
-                ],
-                "fields": [
-                    "ref",
-                    "surface"
-                ],
-                "tags": {
-                    "aeroway": "taxiway"
-                },
-                "name": "Taxiway"
-            },
-            "aeroway/terminal": {
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "terms": [
-                    "airport",
-                    "aerodrome"
-                ],
-                "fields": [
-                    "operator",
-                    "building_area"
-                ],
-                "tags": {
-                    "aeroway": "terminal"
-                },
-                "name": "Airport terminal"
-            },
-            "amenity": {
-                "fields": [
-                    "amenity"
-                ],
-                "geometry": [
-                    "point",
-                    "vertex",
-                    "area"
-                ],
-                "tags": {
-                    "amenity": "*"
-                },
-                "searchable": false,
-                "name": "Amenity"
-            },
-            "amenity/arts_centre": {
-                "icon": "theatre",
-                "fields": [
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "terms": [],
-                "tags": {
-                    "amenity": "arts_centre"
-                },
-                "name": "Arts Center"
-            },
-            "amenity/atm": {
-                "icon": "bank",
-                "fields": [
-                    "operator"
-                ],
-                "geometry": [
-                    "point",
-                    "vertex"
-                ],
-                "terms": [
-                    "money",
-                    "cash",
-                    "machine"
-                ],
-                "tags": {
-                    "amenity": "atm"
-                },
-                "name": "ATM"
-            },
-            "amenity/bank": {
-                "icon": "bank",
-                "fields": [
-                    "atm",
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "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": "bar",
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours",
-                    "smoking"
-                ],
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "terms": [
-                    "dive",
-                    "beer",
-                    "bier",
-                    "booze"
-                ],
-                "tags": {
-                    "amenity": "bar"
-                },
-                "name": "Bar"
-            },
-            "amenity/bbq": {
-                "fields": [
-                    "covered",
-                    "fuel"
-                ],
-                "geometry": [
-                    "point"
-                ],
-                "terms": [
-                    "bbq"
-                ],
-                "tags": {
-                    "amenity": "bbq"
-                },
-                "name": "Barbecue/Grill"
-            },
-            "amenity/bench": {
-                "fields": [
-                    "backrest"
-                ],
-                "geometry": [
-                    "point",
-                    "vertex",
-                    "line"
-                ],
-                "tags": {
-                    "amenity": "bench"
-                },
-                "name": "Bench"
-            },
-            "amenity/bicycle_parking": {
-                "icon": "bicycle",
-                "fields": [
-                    "bicycle_parking",
-                    "capacity",
-                    "operator",
-                    "covered",
-                    "access_simple"
-                ],
-                "geometry": [
-                    "point",
-                    "vertex",
-                    "area"
-                ],
-                "terms": [
-                    "bike"
-                ],
-                "tags": {
-                    "amenity": "bicycle_parking"
-                },
-                "name": "Bicycle Parking"
-            },
-            "amenity/bicycle_rental": {
-                "icon": "bicycle",
-                "fields": [
-                    "capacity",
-                    "network",
-                    "operator"
-                ],
-                "geometry": [
-                    "point",
-                    "vertex",
-                    "area"
-                ],
-                "terms": [
-                    "bike"
-                ],
-                "tags": {
-                    "amenity": "bicycle_rental"
-                },
-                "name": "Bicycle Rental"
-            },
-            "amenity/boat_rental": {
-                "fields": [
-                    "operator"
-                ],
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "tags": {
-                    "amenity": "boat_rental"
-                },
-                "name": "Boat Rental"
-            },
-            "amenity/bureau_de_change": {
-                "icon": "bank",
-                "fields": [
-                    "operator"
-                ],
-                "geometry": [
-                    "point",
-                    "vertex"
-                ],
-                "terms": [
-                    "bureau de change",
-                    "money changer"
-                ],
-                "tags": {
-                    "amenity": "bureau_de_change"
-                },
-                "name": "Currency Exchange"
-            },
-            "amenity/bus_station": {
-                "icon": "bus",
-                "fields": [
-                    "building_area",
-                    "operator"
-                ],
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "tags": {
-                    "amenity": "bus_station"
-                },
-                "name": "Bus Station"
-            },
-            "amenity/cafe": {
-                "icon": "cafe",
-                "fields": [
-                    "cuisine",
-                    "internet_access",
-                    "address",
-                    "building_area",
-                    "opening_hours",
-                    "smoking"
-                ],
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "terms": [
-                    "coffee",
-                    "tea"
-                ],
-                "tags": {
-                    "amenity": "cafe"
-                },
-                "name": "Cafe"
-            },
-            "amenity/car_rental": {
-                "icon": "car",
-                "fields": [
-                    "operator"
-                ],
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "tags": {
-                    "amenity": "car_rental"
-                },
-                "name": "Car Rental"
-            },
-            "amenity/car_sharing": {
-                "icon": "car",
-                "fields": [
-                    "operator",
-                    "capacity"
-                ],
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "tags": {
-                    "amenity": "car_sharing"
-                },
-                "name": "Car Sharing"
-            },
-            "amenity/car_wash": {
-                "icon": "car",
-                "fields": [
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "tags": {
-                    "amenity": "car_wash"
-                },
-                "name": "Car Wash"
-            },
-            "amenity/charging_station": {
-                "icon": "car",
-                "fields": [
-                    "operator"
-                ],
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "tags": {
-                    "amenity": "charging_station"
-                },
-                "terms": [
-                    "EV",
-                    "Electric Vehicle",
-                    "Supercharger"
-                ],
-                "name": "Charging Station"
-            },
-            "amenity/childcare": {
-                "icon": "school",
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "terms": [
-                    "daycare",
-                    "orphanage",
-                    "playgroup"
-                ],
-                "tags": {
-                    "amenity": "childcare"
-                },
-                "name": "Nursery/Childcare"
-            },
-            "amenity/cinema": {
-                "icon": "cinema",
-                "fields": [
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "terms": [
-                    "drive-in",
-                    "film",
-                    "flick",
-                    "movie",
-                    "theater",
-                    "picture",
-                    "show",
-                    "screen"
-                ],
-                "tags": {
-                    "amenity": "cinema"
-                },
-                "name": "Cinema"
-            },
-            "amenity/clinic": {
-                "icon": "hospital",
-                "fields": [
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "terms": [
-                    "medical",
-                    "urgentcare"
-                ],
-                "tags": {
-                    "amenity": "clinic"
-                },
-                "name": "Clinic"
-            },
-            "amenity/clock": {
-                "geometry": [
-                    "point",
-                    "vertex"
-                ],
-                "tags": {
-                    "amenity": "clock"
-                },
-                "name": "Clock"
-            },
-            "amenity/college": {
-                "icon": "college",
-                "fields": [
-                    "operator",
-                    "address"
-                ],
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "terms": [
-                    "university"
-                ],
-                "tags": {
-                    "amenity": "college"
-                },
-                "name": "College Grounds"
-            },
-            "amenity/community_centre": {
-                "icon": "town-hall",
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area"
-                ],
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "terms": [
-                    "event",
-                    "hall"
-                ],
-                "tags": {
-                    "amenity": "community_centre"
-                },
-                "name": "Community Center"
-            },
-            "amenity/compressed_air": {
-                "icon": "car",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "tags": {
-                    "amenity": "compressed_air"
-                },
-                "name": "Compressed Air"
-            },
-            "amenity/courthouse": {
-                "icon": "town-hall",
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area"
-                ],
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "tags": {
-                    "amenity": "courthouse"
-                },
-                "name": "Courthouse"
-            },
-            "amenity/dentist": {
-                "icon": "hospital",
-                "fields": [
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "terms": [
-                    "tooth",
-                    "teeth"
-                ],
-                "tags": {
-                    "amenity": "dentist"
-                },
-                "name": "Dentist"
-            },
-            "amenity/doctor": {
-                "icon": "hospital",
-                "fields": [
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "terms": [
-                    "medic*"
-                ],
-                "tags": {
-                    "amenity": "doctors"
-                },
-                "name": "Doctor"
-            },
-            "amenity/dojo": {
-                "icon": "pitch",
-                "fields": [
-                    "sport",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "terms": [
-                    "martial arts",
-                    "dojang"
-                ],
-                "tags": {
-                    "amenity": "dojo"
-                },
-                "name": "Dojo / Martial Arts Academy"
-            },
-            "amenity/drinking_water": {
-                "icon": "water",
-                "geometry": [
-                    "point"
-                ],
-                "tags": {
-                    "amenity": "drinking_water"
-                },
-                "terms": [
-                    "fountain",
-                    "potable"
-                ],
-                "name": "Drinking Water"
-            },
-            "amenity/embassy": {
-                "icon": "embassy",
-                "fields": [
-                    "country",
-                    "address",
-                    "building_area"
-                ],
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "tags": {
-                    "amenity": "embassy"
-                },
-                "name": "Embassy"
-            },
-            "amenity/fast_food": {
-                "icon": "fast-food",
-                "fields": [
-                    "cuisine",
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours",
-                    "smoking"
-                ],
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "tags": {
-                    "amenity": "fast_food"
-                },
-                "terms": [
-                    "restaurant"
-                ],
-                "name": "Fast Food"
-            },
-            "amenity/fire_station": {
-                "icon": "fire-station",
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area"
-                ],
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "terms": [],
-                "tags": {
-                    "amenity": "fire_station"
-                },
-                "name": "Fire Station"
-            },
-            "amenity/fountain": {
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "tags": {
-                    "amenity": "fountain"
-                },
-                "name": "Fountain"
-            },
-            "amenity/fuel": {
-                "icon": "fuel",
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "terms": [
-                    "petrol",
-                    "fuel",
-                    "propane",
-                    "diesel",
-                    "lng",
-                    "cng",
-                    "biodiesel"
-                ],
-                "tags": {
-                    "amenity": "fuel"
-                },
-                "name": "Gas Station"
-            },
-            "amenity/grave_yard": {
-                "icon": "cemetery",
-                "fields": [
-                    "religion",
-                    "denomination"
-                ],
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "tags": {
-                    "amenity": "grave_yard"
-                },
-                "name": "Graveyard"
-            },
-            "amenity/hospital": {
-                "icon": "hospital",
-                "fields": [
-                    "operator",
-                    "address",
-                    "emergency"
-                ],
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "terms": [
-                    "clinic",
-                    "doctor",
-                    "emergency room",
-                    "health service",
-                    "hospice",
-                    "infirmary",
-                    "institution",
-                    "nursing home",
-                    "sanatorium",
-                    "sanitarium",
-                    "sick",
-                    "surgery",
-                    "ward"
-                ],
-                "tags": {
-                    "amenity": "hospital"
-                },
-                "name": "Hospital Grounds"
-            },
-            "amenity/kindergarten": {
-                "icon": "school",
-                "fields": [
-                    "operator",
-                    "address"
-                ],
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "terms": [
-                    "kindergarden",
-                    "pre-school"
-                ],
-                "tags": {
-                    "amenity": "kindergarten"
-                },
-                "name": "Preschool/Kindergarten Grounds"
-            },
-            "amenity/library": {
-                "icon": "library",
-                "fields": [
-                    "operator",
-                    "building_area",
-                    "address",
-                    "opening_hours"
-                ],
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "terms": [
-                    "book"
-                ],
-                "tags": {
-                    "amenity": "library"
-                },
-                "name": "Library"
-            },
-            "amenity/marketplace": {
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "tags": {
-                    "amenity": "marketplace"
-                },
-                "name": "Marketplace"
-            },
-            "amenity/nightclub": {
-                "icon": "bar",
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours",
-                    "smoking"
-                ],
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "tags": {
-                    "amenity": "nightclub"
-                },
-                "terms": [
-                    "disco*",
-                    "night club",
-                    "dancing",
-                    "dance club"
-                ],
-                "name": "Nightclub"
-            },
-            "amenity/parking": {
-                "icon": "parking",
-                "fields": [
-                    "operator",
-                    "parking",
-                    "capacity",
-                    "fee",
-                    "access_simple",
-                    "supervised",
-                    "park_ride",
-                    "address"
-                ],
-                "geometry": [
-                    "point",
-                    "vertex",
-                    "area"
-                ],
-                "tags": {
-                    "amenity": "parking"
-                },
-                "terms": [],
-                "name": "Car Parking"
-            },
-            "amenity/parking_entrance": {
-                "icon": "entrance",
-                "fields": [
-                    "access_simple",
-                    "ref"
-                ],
-                "geometry": [
-                    "vertex"
-                ],
-                "tags": {
-                    "amenity": "parking_entrance"
-                },
-                "name": "Parking Garage Entrance/Exit"
-            },
-            "amenity/pharmacy": {
-                "icon": "pharmacy",
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "tags": {
-                    "amenity": "pharmacy"
-                },
-                "terms": [
-                    "drug",
-                    "medicine"
-                ],
-                "name": "Pharmacy"
-            },
-            "amenity/place_of_worship": {
-                "icon": "place-of-worship",
-                "fields": [
-                    "religion",
-                    "denomination",
-                    "address",
-                    "building_area"
-                ],
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "terms": [
-                    "abbey",
-                    "basilica",
-                    "bethel",
-                    "cathedral",
-                    "chancel",
-                    "chantry",
-                    "chapel",
-                    "church",
-                    "fold",
-                    "house of God",
-                    "house of prayer",
-                    "house of worship",
-                    "minster",
-                    "mission",
-                    "mosque",
-                    "oratory",
-                    "parish",
-                    "sacellum",
-                    "sanctuary",
-                    "shrine",
-                    "synagogue",
-                    "tabernacle",
-                    "temple"
-                ],
-                "tags": {
-                    "amenity": "place_of_worship"
-                },
-                "name": "Place of Worship"
-            },
-            "amenity/place_of_worship/buddhist": {
-                "icon": "place-of-worship",
-                "fields": [
-                    "denomination",
-                    "building_area",
-                    "address"
-                ],
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "terms": [
-                    "stupa",
-                    "vihara",
-                    "monastery",
-                    "temple",
-                    "pagoda",
-                    "zendo",
-                    "dojo"
-                ],
-                "tags": {
-                    "amenity": "place_of_worship",
-                    "religion": "buddhist"
-                },
-                "name": "Buddhist Temple"
-            },
-            "amenity/place_of_worship/christian": {
-                "icon": "religious-christian",
-                "fields": [
-                    "denomination",
-                    "building_area",
-                    "address"
-                ],
-                "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"
-                },
-                "name": "Church"
-            },
-            "amenity/place_of_worship/jewish": {
-                "icon": "religious-jewish",
-                "fields": [
-                    "denomination",
-                    "building_area",
-                    "address"
-                ],
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "terms": [
-                    "jewish"
-                ],
-                "tags": {
-                    "amenity": "place_of_worship",
-                    "religion": "jewish"
-                },
-                "name": "Synagogue"
-            },
-            "amenity/place_of_worship/muslim": {
-                "icon": "religious-muslim",
-                "fields": [
-                    "denomination",
-                    "building_area",
-                    "address"
-                ],
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "terms": [
-                    "muslim"
-                ],
-                "tags": {
-                    "amenity": "place_of_worship",
-                    "religion": "muslim"
-                },
-                "name": "Mosque"
-            },
-            "amenity/police": {
-                "icon": "police",
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area"
-                ],
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "terms": [
-                    "badge",
-                    "constable",
-                    "constabulary",
-                    "cop",
-                    "detective",
-                    "fed",
-                    "law",
-                    "enforcement",
-                    "officer",
-                    "patrol"
-                ],
-                "tags": {
-                    "amenity": "police"
-                },
-                "name": "Police"
-            },
-            "amenity/post_box": {
-                "icon": "post",
-                "fields": [
-                    "operator",
-                    "collection_times"
-                ],
-                "geometry": [
-                    "point",
-                    "vertex"
-                ],
-                "tags": {
-                    "amenity": "post_box"
-                },
-                "terms": [
-                    "letter",
-                    "post"
-                ],
-                "name": "Mailbox"
-            },
-            "amenity/post_office": {
-                "icon": "post",
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "collection_times"
-                ],
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "terms": [
-                    "letter",
-                    "mail"
-                ],
-                "tags": {
-                    "amenity": "post_office"
-                },
-                "name": "Post Office"
-            },
-            "amenity/pub": {
-                "icon": "beer",
-                "fields": [
-                    "address",
-                    "building_area",
-                    "opening_hours",
-                    "smoking"
-                ],
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "tags": {
-                    "amenity": "pub"
-                },
-                "terms": [
-                    "dive",
-                    "beer",
-                    "bier",
-                    "booze"
-                ],
-                "name": "Pub"
-            },
-            "amenity/ranger_station": {
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "terms": [
-                    "visitor center",
-                    "visitor centre",
-                    "permit center",
-                    "permit centre",
-                    "backcountry office",
-                    "warden office",
-                    "warden center"
-                ],
-                "tags": {
-                    "amenity": "ranger_station"
-                },
-                "name": "Ranger Station"
-            },
-            "amenity/recycling": {
-                "icon": "recycling",
-                "fields": [
-                    "operator",
-                    "address",
-                    "recycling/cans",
-                    "recycling/glass",
-                    "recycling/paper",
-                    "recycling/clothes"
-                ],
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "terms": [
-                    "can",
-                    "bottle",
-                    "garbage",
-                    "scrap",
-                    "trash"
-                ],
-                "tags": {
-                    "amenity": "recycling"
-                },
-                "name": "Recycling"
-            },
-            "amenity/restaurant": {
-                "icon": "restaurant",
-                "fields": [
-                    "cuisine",
-                    "address",
-                    "building_area",
-                    "opening_hours",
-                    "capacity",
-                    "smoking"
-                ],
-                "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/school": {
-                "icon": "school",
-                "fields": [
-                    "operator",
-                    "address"
-                ],
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "terms": [
-                    "academy",
-                    "elementary school",
-                    "middle school",
-                    "high school"
-                ],
-                "tags": {
-                    "amenity": "school"
-                },
-                "name": "School Grounds"
-            },
-            "amenity/shelter": {
-                "fields": [
-                    "shelter_type"
-                ],
-                "geometry": [
-                    "point",
-                    "vertex",
-                    "area"
-                ],
-                "terms": [
-                    "lean-to",
-                    "gazebo",
-                    "picnic"
-                ],
-                "tags": {
-                    "amenity": "shelter"
-                },
-                "name": "Shelter"
-            },
-            "amenity/social_facility": {
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours",
-                    "wheelchair",
-                    "social_facility_for"
-                ],
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "terms": [],
-                "tags": {
-                    "amenity": "social_facility"
-                },
-                "name": "Social Facility"
-            },
-            "amenity/social_facility/food_bank": {
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours",
-                    "social_facility_for"
-                ],
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "terms": [],
-                "tags": {
-                    "amenity": "social_facility",
-                    "social_facility": "food_bank"
-                },
-                "name": "Food Bank"
-            },
-            "amenity/social_facility/group_home": {
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours",
-                    "wheelchair",
-                    "social_facility_for"
-                ],
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "terms": [
-                    "old",
-                    "senior",
-                    "living"
-                ],
-                "tags": {
-                    "amenity": "social_facility",
-                    "social_facility": "group_home",
-                    "social_facility_for": "senior"
-                },
-                "name": "Elderly Group Home"
-            },
-            "amenity/social_facility/homeless_shelter": {
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours",
-                    "wheelchair",
-                    "social_facility_for"
-                ],
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "terms": [
-                    "houseless",
-                    "unhoused",
-                    "displaced"
-                ],
-                "tags": {
-                    "amenity": "social_facility",
-                    "social_facility": "shelter",
-                    "social_facility:for": "homeless"
-                },
-                "name": "Homeless Shelter"
-            },
-            "amenity/studio": {
-                "icon": "music",
-                "fields": [
-                    "studio_type",
-                    "address",
-                    "building_area"
-                ],
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "terms": [
-                    "recording",
-                    "radio",
-                    "television"
-                ],
-                "tags": {
-                    "amenity": "studio"
-                },
-                "name": "Studio"
-            },
-            "amenity/swimming_pool": {
-                "icon": "swimming",
-                "geometry": [
-                    "point",
-                    "vertex",
-                    "area"
-                ],
-                "tags": {
-                    "amenity": "swimming_pool"
-                },
-                "name": "Swimming Pool",
-                "searchable": false
-            },
-            "amenity/taxi": {
-                "icon": "car",
-                "fields": [
-                    "operator",
-                    "capacity"
-                ],
-                "geometry": [
-                    "point",
-                    "vertex",
-                    "area"
-                ],
-                "terms": [
-                    "cab"
-                ],
-                "tags": {
-                    "amenity": "taxi"
-                },
-                "name": "Taxi Stand"
-            },
-            "amenity/telephone": {
-                "icon": "telephone",
-                "geometry": [
-                    "point",
-                    "vertex"
-                ],
-                "tags": {
-                    "amenity": "telephone"
-                },
-                "terms": [
-                    "phone"
-                ],
-                "name": "Telephone"
-            },
-            "amenity/theatre": {
-                "icon": "theatre",
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area"
-                ],
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "terms": [
-                    "theatre",
-                    "performance",
-                    "play",
-                    "musical"
-                ],
-                "tags": {
-                    "amenity": "theatre"
-                },
-                "name": "Theater"
-            },
-            "amenity/toilets": {
-                "icon": "toilets",
-                "fields": [
-                    "toilets/disposal",
-                    "operator",
-                    "building_area",
-                    "access_toilets"
-                ],
-                "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": "town-hall",
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area"
-                ],
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "terms": [
-                    "village",
-                    "city",
-                    "government",
-                    "courthouse",
-                    "municipal"
-                ],
-                "tags": {
-                    "amenity": "townhall"
-                },
-                "name": "Town Hall"
-            },
-            "amenity/university": {
-                "icon": "college",
-                "fields": [
-                    "operator",
-                    "address"
-                ],
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "terms": [
-                    "college"
-                ],
-                "tags": {
-                    "amenity": "university"
-                },
-                "name": "University Grounds"
-            },
-            "amenity/vending_machine": {
-                "fields": [
-                    "vending",
-                    "operator"
-                ],
-                "geometry": [
-                    "point"
-                ],
-                "terms": [
-                    "snack",
-                    "soda",
-                    "ticket"
-                ],
-                "tags": {
-                    "amenity": "vending_machine"
-                },
-                "name": "Vending Machine"
-            },
-            "amenity/veterinary": {
-                "icon": "dog-park",
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "terms": [
-                    "pet clinic",
-                    "veterinarian",
-                    "animal hospital",
-                    "pet doctor"
-                ],
-                "tags": {
-                    "amenity": "veterinary"
-                },
-                "name": "Veterinary"
-            },
-            "amenity/waste_basket": {
-                "icon": "waste-basket",
-                "geometry": [
-                    "point",
-                    "vertex"
-                ],
-                "tags": {
-                    "amenity": "waste_basket"
-                },
-                "terms": [
-                    "rubbish",
-                    "litter",
-                    "trash",
-                    "garbage"
-                ],
-                "name": "Waste Basket"
-            },
-            "area": {
-                "name": "Area",
-                "tags": {
-                    "area": "yes"
-                },
-                "geometry": [
-                    "area"
-                ],
-                "matchScore": 0.1
-            },
-            "barrier": {
-                "geometry": [
-                    "point",
-                    "vertex",
-                    "line",
-                    "area"
-                ],
-                "tags": {
-                    "barrier": "*"
-                },
-                "fields": [
-                    "barrier"
-                ],
-                "name": "Barrier"
-            },
-            "barrier/block": {
-                "fields": [
-                    "access"
-                ],
-                "geometry": [
-                    "point",
-                    "vertex"
-                ],
-                "tags": {
-                    "barrier": "block"
-                },
-                "name": "Block"
-            },
-            "barrier/bollard": {
-                "fields": [
-                    "access"
-                ],
-                "geometry": [
-                    "point",
-                    "vertex",
-                    "line"
-                ],
-                "tags": {
-                    "barrier": "bollard"
-                },
-                "name": "Bollard"
-            },
-            "barrier/cattle_grid": {
-                "geometry": [
-                    "vertex"
-                ],
-                "tags": {
-                    "barrier": "cattle_grid"
-                },
-                "name": "Cattle Grid"
-            },
-            "barrier/city_wall": {
-                "geometry": [
-                    "line",
-                    "area"
-                ],
-                "tags": {
-                    "barrier": "city_wall"
-                },
-                "name": "City Wall"
-            },
-            "barrier/cycle_barrier": {
-                "fields": [
-                    "access"
-                ],
-                "geometry": [
-                    "vertex"
-                ],
-                "tags": {
-                    "barrier": "cycle_barrier"
-                },
-                "name": "Cycle Barrier"
-            },
-            "barrier/ditch": {
-                "geometry": [
-                    "line",
-                    "area"
-                ],
-                "tags": {
-                    "barrier": "ditch"
-                },
-                "name": "Ditch"
-            },
-            "barrier/entrance": {
-                "icon": "entrance",
-                "geometry": [
-                    "vertex"
-                ],
-                "tags": {
-                    "barrier": "entrance"
-                },
-                "name": "Entrance",
-                "searchable": false
-            },
-            "barrier/fence": {
-                "geometry": [
-                    "line"
-                ],
-                "tags": {
-                    "barrier": "fence"
-                },
-                "name": "Fence"
-            },
-            "barrier/gate": {
-                "fields": [
-                    "access"
-                ],
-                "geometry": [
-                    "point",
-                    "vertex",
-                    "line"
-                ],
-                "tags": {
-                    "barrier": "gate"
-                },
-                "name": "Gate"
-            },
-            "barrier/hedge": {
-                "geometry": [
-                    "line",
-                    "area"
-                ],
-                "tags": {
-                    "barrier": "hedge"
-                },
-                "name": "Hedge"
-            },
-            "barrier/kissing_gate": {
-                "fields": [
-                    "access"
-                ],
-                "geometry": [
-                    "vertex"
-                ],
-                "tags": {
-                    "barrier": "kissing_gate"
-                },
-                "name": "Kissing Gate"
-            },
-            "barrier/lift_gate": {
-                "fields": [
-                    "access"
-                ],
-                "geometry": [
-                    "point",
-                    "vertex"
-                ],
-                "tags": {
-                    "barrier": "lift_gate"
-                },
-                "name": "Lift Gate"
-            },
-            "barrier/retaining_wall": {
-                "geometry": [
-                    "line",
-                    "area"
-                ],
-                "tags": {
-                    "barrier": "retaining_wall"
-                },
-                "name": "Retaining Wall"
-            },
-            "barrier/stile": {
-                "fields": [
-                    "access"
-                ],
-                "geometry": [
-                    "point",
-                    "vertex"
-                ],
-                "tags": {
-                    "barrier": "stile"
-                },
-                "name": "Stile"
-            },
-            "barrier/toll_booth": {
-                "fields": [
-                    "access"
-                ],
-                "geometry": [
-                    "vertex"
-                ],
-                "tags": {
-                    "barrier": "toll_booth"
-                },
-                "name": "Toll Booth"
-            },
-            "barrier/wall": {
-                "geometry": [
-                    "line",
-                    "area"
-                ],
-                "tags": {
-                    "barrier": "wall"
-                },
-                "name": "Wall"
-            },
-            "boundary/administrative": {
-                "name": "Administrative Boundary",
-                "geometry": [
-                    "line"
-                ],
-                "tags": {
-                    "boundary": "administrative"
-                },
-                "fields": [
-                    "admin_level"
-                ]
-            },
-            "building": {
-                "icon": "building",
-                "fields": [
-                    "building",
-                    "levels",
-                    "address"
-                ],
-                "geometry": [
-                    "area"
-                ],
-                "tags": {
-                    "building": "*"
-                },
-                "terms": [],
-                "name": "Building"
-            },
-            "building/apartments": {
-                "icon": "commercial",
-                "fields": [
-                    "address",
-                    "levels"
-                ],
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "tags": {
-                    "building": "apartments"
-                },
-                "name": "Apartments"
-            },
-            "building/barn": {
-                "icon": "building",
-                "fields": [
-                    "address",
-                    "levels"
-                ],
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "tags": {
-                    "building": "barn"
-                },
-                "name": "Barn"
-            },
-            "building/bunker": {
-                "fields": [
-                    "address",
-                    "levels"
-                ],
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "tags": {
-                    "building": "bunker"
-                },
-                "name": "Bunker",
-                "searchable": false
-            },
-            "building/cabin": {
-                "icon": "building",
-                "fields": [
-                    "address",
-                    "levels"
-                ],
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "tags": {
-                    "building": "cabin"
-                },
-                "name": "Cabin"
-            },
-            "building/cathedral": {
-                "icon": "place-of-worship",
-                "fields": [
-                    "address",
-                    "levels"
-                ],
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "tags": {
-                    "building": "cathedral"
-                },
-                "name": "Cathedral"
-            },
-            "building/chapel": {
-                "icon": "place-of-worship",
-                "fields": [
-                    "address",
-                    "levels"
-                ],
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "tags": {
-                    "building": "chapel"
-                },
-                "name": "Chapel"
-            },
-            "building/church": {
-                "icon": "place-of-worship",
-                "fields": [
-                    "address",
-                    "levels"
-                ],
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "tags": {
-                    "building": "church"
-                },
-                "name": "Church"
-            },
-            "building/college": {
-                "icon": "building",
-                "fields": [
-                    "address",
-                    "levels"
-                ],
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "terms": [
-                    "university"
-                ],
-                "tags": {
-                    "building": "college"
-                },
-                "name": "College Building"
-            },
-            "building/commercial": {
-                "icon": "commercial",
-                "fields": [
-                    "address",
-                    "smoking"
-                ],
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "tags": {
-                    "building": "commercial"
-                },
-                "name": "Commercial Building"
-            },
-            "building/construction": {
-                "icon": "building",
-                "fields": [
-                    "address",
-                    "levels"
-                ],
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "tags": {
-                    "building": "construction"
-                },
-                "name": "Building Under Construction"
-            },
-            "building/detached": {
-                "icon": "building",
-                "fields": [
-                    "address",
-                    "levels"
-                ],
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "tags": {
-                    "building": "detached"
-                },
-                "name": "Detached Home"
-            },
-            "building/dormitory": {
-                "icon": "building",
-                "fields": [
-                    "address",
-                    "levels",
-                    "smoking"
-                ],
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "tags": {
-                    "building": "dormitory"
-                },
-                "name": "Dormitory"
-            },
-            "building/entrance": {
-                "icon": "entrance",
-                "geometry": [
-                    "vertex"
-                ],
-                "tags": {
-                    "building": "entrance"
-                },
-                "name": "Entrance/Exit",
-                "searchable": false
-            },
-            "building/garage": {
-                "fields": [
-                    "capacity"
-                ],
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "tags": {
-                    "building": "garage"
-                },
-                "name": "Garage",
-                "icon": "warehouse"
-            },
-            "building/garages": {
-                "icon": "warehouse",
-                "fields": [
-                    "capacity"
-                ],
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "tags": {
-                    "building": "garages"
-                },
-                "name": "Garages"
-            },
-            "building/greenhouse": {
-                "icon": "building",
-                "fields": [
-                    "address",
-                    "levels"
-                ],
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "tags": {
-                    "building": "greenhouse"
-                },
-                "name": "Greenhouse"
-            },
-            "building/hospital": {
-                "icon": "building",
-                "fields": [
-                    "address",
-                    "levels"
-                ],
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "tags": {
-                    "building": "hospital"
-                },
-                "name": "Hospital Building"
-            },
-            "building/hotel": {
-                "icon": "building",
-                "fields": [
-                    "address",
-                    "levels",
-                    "smoking"
-                ],
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "tags": {
-                    "building": "hotel"
-                },
-                "name": "Hotel Building"
-            },
-            "building/house": {
-                "icon": "building",
-                "fields": [
-                    "address",
-                    "levels"
-                ],
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "tags": {
-                    "building": "house"
-                },
-                "name": "House"
-            },
-            "building/hut": {
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "tags": {
-                    "building": "hut"
-                },
-                "name": "Hut"
-            },
-            "building/industrial": {
-                "icon": "industrial",
-                "fields": [
-                    "address",
-                    "levels"
-                ],
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "tags": {
-                    "building": "industrial"
-                },
-                "name": "Industrial Building"
-            },
-            "building/kindergarten": {
-                "icon": "building",
-                "fields": [
-                    "address",
-                    "levels"
-                ],
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "terms": [
-                    "kindergarden",
-                    "pre-school"
-                ],
-                "tags": {
-                    "building": "kindergarten"
-                },
-                "name": "Preschool/Kindergarten Building"
-            },
-            "building/public": {
-                "icon": "building",
-                "fields": [
-                    "address",
-                    "levels",
-                    "smoking"
-                ],
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "tags": {
-                    "building": "public"
-                },
-                "name": "Public Building"
-            },
-            "building/residential": {
-                "icon": "building",
-                "fields": [
-                    "address",
-                    "levels"
-                ],
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "tags": {
-                    "building": "residential"
-                },
-                "name": "Residential Building"
-            },
-            "building/retail": {
-                "icon": "building",
-                "fields": [
-                    "address",
-                    "levels",
-                    "smoking"
-                ],
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "tags": {
-                    "building": "retail"
-                },
-                "name": "Retail Building"
-            },
-            "building/roof": {
-                "icon": "building",
-                "fields": [
-                    "address"
-                ],
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "tags": {
-                    "building": "roof"
-                },
-                "name": "Roof"
-            },
-            "building/school": {
-                "icon": "building",
-                "fields": [
-                    "address",
-                    "levels"
-                ],
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "terms": [
-                    "academy",
-                    "elementary school",
-                    "middle school",
-                    "high school"
-                ],
-                "tags": {
-                    "building": "school"
-                },
-                "name": "School Building"
-            },
-            "building/shed": {
-                "icon": "building",
-                "fields": [
-                    "address",
-                    "levels"
-                ],
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "tags": {
-                    "building": "shed"
-                },
-                "name": "Shed"
-            },
-            "building/stable": {
-                "icon": "building",
-                "fields": [
-                    "address",
-                    "levels"
-                ],
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "tags": {
-                    "building": "stable"
-                },
-                "name": "Stable"
-            },
-            "building/static_caravan": {
-                "icon": "building",
-                "fields": [
-                    "address",
-                    "levels"
-                ],
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "tags": {
-                    "building": "static_caravan"
-                },
-                "name": "Static Mobile Home"
-            },
-            "building/terrace": {
-                "icon": "building",
-                "fields": [
-                    "address",
-                    "levels"
-                ],
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "tags": {
-                    "building": "terrace"
-                },
-                "name": "Row Houses"
-            },
-            "building/train_station": {
-                "icon": "building",
-                "fields": [
-                    "address",
-                    "levels"
-                ],
-                "geometry": [
-                    "point",
-                    "vertex",
-                    "area"
-                ],
-                "tags": {
-                    "building": "train_station"
-                },
-                "name": "Train Station",
-                "searchable": false
-            },
-            "building/university": {
-                "icon": "building",
-                "fields": [
-                    "address",
-                    "levels"
-                ],
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "terms": [
-                    "college"
-                ],
-                "tags": {
-                    "building": "university"
-                },
-                "name": "University Building"
-            },
-            "building/warehouse": {
-                "icon": "building",
-                "fields": [
-                    "address",
-                    "levels"
-                ],
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "tags": {
-                    "building": "warehouse"
-                },
-                "name": "Warehouse"
-            },
-            "craft": {
-                "icon": "marker-stroked",
-                "fields": [
-                    "craft",
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "tags": {
-                    "craft": "*"
-                },
-                "terms": [],
-                "name": "Craft"
-            },
-            "craft/basket_maker": {
-                "icon": "art-gallery",
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "tags": {
-                    "craft": "basket_maker"
-                },
-                "name": "Basket Maker"
-            },
-            "craft/beekeeper": {
-                "icon": "farm",
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "tags": {
-                    "craft": "beekeeper"
-                },
-                "name": "Beekeeper"
-            },
-            "craft/blacksmith": {
-                "icon": "farm",
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "tags": {
-                    "craft": "blacksmith"
-                },
-                "name": "Blacksmith"
-            },
-            "craft/boatbuilder": {
-                "icon": "marker-stroked",
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "tags": {
-                    "craft": "boatbuilder"
-                },
-                "name": "Boat Builder"
-            },
-            "craft/bookbinder": {
-                "icon": "library",
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "terms": [
-                    "book repair"
-                ],
-                "tags": {
-                    "craft": "bookbinder"
-                },
-                "name": "Bookbinder"
-            },
-            "craft/brewery": {
-                "icon": "beer",
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "terms": [
-                    "beer",
-                    "bier"
-                ],
-                "tags": {
-                    "craft": "brewery"
-                },
-                "name": "Brewery"
-            },
-            "craft/carpenter": {
-                "icon": "logging",
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "terms": [
-                    "woodworker"
-                ],
-                "tags": {
-                    "craft": "carpenter"
-                },
-                "name": "Carpenter"
-            },
-            "craft/carpet_layer": {
-                "icon": "square",
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "tags": {
-                    "craft": "carpet_layer"
-                },
-                "name": "Carpet Layer"
-            },
-            "craft/caterer": {
-                "icon": "bakery",
-                "fields": [
-                    "cuisine",
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "tags": {
-                    "craft": "caterer"
-                },
-                "name": "Caterer"
-            },
-            "craft/clockmaker": {
-                "icon": "circle-stroked",
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "tags": {
-                    "craft": "clockmaker"
-                },
-                "name": "Clockmaker"
-            },
-            "craft/confectionary": {
-                "icon": "bakery",
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "terms": [
-                    "sweets",
-                    "candy"
-                ],
-                "tags": {
-                    "craft": "confectionary"
-                },
-                "name": "Confectionary"
-            },
-            "craft/dressmaker": {
-                "icon": "clothing-store",
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "terms": [
-                    "seamstress"
-                ],
-                "tags": {
-                    "craft": "dressmaker"
-                },
-                "name": "Dressmaker"
-            },
-            "craft/electrician": {
-                "icon": "marker-stroked",
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "terms": [
-                    "power",
-                    "wire"
-                ],
-                "tags": {
-                    "craft": "electrician"
-                },
-                "name": "Electrician"
-            },
-            "craft/gardener": {
-                "icon": "garden",
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "terms": [
-                    "landscaper",
-                    "grounds keeper"
-                ],
-                "tags": {
-                    "craft": "gardener"
-                },
-                "name": "Gardener"
-            },
-            "craft/glaziery": {
-                "icon": "fire-station",
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "terms": [
-                    "glass",
-                    "stained-glass",
-                    "window"
-                ],
-                "tags": {
-                    "craft": "glaziery"
-                },
-                "name": "Glaziery"
-            },
-            "craft/handicraft": {
-                "icon": "art-gallery",
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "tags": {
-                    "craft": "handicraft"
-                },
-                "name": "Handicraft"
-            },
-            "craft/hvac": {
-                "icon": "marker-stroked",
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "terms": [
-                    "heat*",
-                    "vent*",
-                    "air conditioning"
-                ],
-                "tags": {
-                    "craft": "hvac"
-                },
-                "name": "HVAC"
-            },
-            "craft/insulator": {
-                "icon": "marker-stroked",
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "tags": {
-                    "craft": "insulation"
-                },
-                "name": "Insulator"
-            },
-            "craft/jeweler": {
-                "icon": "marker-stroked",
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "tags": {
-                    "craft": "jeweler"
-                },
-                "name": "Jeweler",
-                "searchable": false
-            },
-            "craft/key_cutter": {
-                "icon": "marker-stroked",
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "tags": {
-                    "craft": "key_cutter"
-                },
-                "name": "Key Cutter"
-            },
-            "craft/locksmith": {
-                "icon": "marker-stroked",
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "tags": {
-                    "craft": "locksmith"
-                },
-                "name": "Locksmith",
-                "searchable": false
-            },
-            "craft/metal_construction": {
-                "icon": "marker-stroked",
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "tags": {
-                    "craft": "metal_construction"
-                },
-                "name": "Metal Construction"
-            },
-            "craft/optician": {
-                "icon": "marker-stroked",
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "tags": {
-                    "craft": "optician"
-                },
-                "name": "Optician",
-                "searchable": false
-            },
-            "craft/painter": {
-                "icon": "art-gallery",
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "tags": {
-                    "craft": "painter"
-                },
-                "name": "Painter"
-            },
-            "craft/photographer": {
-                "icon": "camera",
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "tags": {
-                    "craft": "photographer"
-                },
-                "name": "Photographer"
-            },
-            "craft/photographic_laboratory": {
-                "icon": "camera",
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "terms": [
-                    "film"
-                ],
-                "tags": {
-                    "craft": "photographic_laboratory"
-                },
-                "name": "Photographic Laboratory"
-            },
-            "craft/plasterer": {
-                "icon": "marker-stroked",
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "tags": {
-                    "craft": "plasterer"
-                },
-                "name": "Plasterer"
-            },
-            "craft/plumber": {
-                "icon": "marker-stroked",
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "terms": [
-                    "pipe"
-                ],
-                "tags": {
-                    "craft": "plumber"
-                },
-                "name": "Plumber"
-            },
-            "craft/pottery": {
-                "icon": "art-gallery",
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "terms": [
-                    "ceramic"
-                ],
-                "tags": {
-                    "craft": "pottery"
-                },
-                "name": "Pottery"
-            },
-            "craft/rigger": {
-                "icon": "marker-stroked",
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "tags": {
-                    "craft": "rigger"
-                },
-                "name": "Rigger"
-            },
-            "craft/roofer": {
-                "icon": "marker-stroked",
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "tags": {
-                    "craft": "roofer"
-                },
-                "name": "Roofer"
-            },
-            "craft/saddler": {
-                "icon": "marker-stroked",
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "tags": {
-                    "craft": "saddler"
-                },
-                "name": "Saddler"
-            },
-            "craft/sailmaker": {
-                "icon": "marker-stroked",
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "tags": {
-                    "craft": "sailmaker"
-                },
-                "name": "Sailmaker"
-            },
-            "craft/sawmill": {
-                "icon": "park",
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "terms": [
-                    "lumber"
-                ],
-                "tags": {
-                    "craft": "sawmill"
-                },
-                "name": "Sawmill"
-            },
-            "craft/scaffolder": {
-                "icon": "marker-stroked",
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "tags": {
-                    "craft": "scaffolder"
-                },
-                "name": "Scaffolder"
-            },
-            "craft/sculpter": {
-                "icon": "art-gallery",
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "tags": {
-                    "craft": "sculpter"
-                },
-                "name": "Sculpter"
-            },
-            "craft/shoemaker": {
-                "icon": "marker-stroked",
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "terms": [
-                    "cobbler"
-                ],
-                "tags": {
-                    "craft": "shoemaker"
-                },
-                "name": "Shoemaker"
-            },
-            "craft/stonemason": {
-                "icon": "marker-stroked",
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "terms": [
-                    "masonry"
-                ],
-                "tags": {
-                    "craft": "stonemason"
-                },
-                "name": "Stonemason"
-            },
-            "craft/sweep": {
-                "icon": "marker-stroked",
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "tags": {
-                    "craft": "sweep"
-                },
-                "name": "Chimney Sweep"
-            },
-            "craft/tailor": {
-                "icon": "clothing-store",
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "terms": [
-                    "clothes",
-                    "suit"
-                ],
-                "tags": {
-                    "craft": "tailor"
-                },
-                "name": "Tailor",
-                "searchable": false
-            },
-            "craft/tiler": {
-                "icon": "marker-stroked",
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "tags": {
-                    "craft": "tiler"
-                },
-                "name": "Tiler"
-            },
-            "craft/tinsmith": {
-                "icon": "marker-stroked",
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "tags": {
-                    "craft": "tinsmith"
-                },
-                "name": "Tinsmith"
-            },
-            "craft/upholsterer": {
-                "icon": "marker-stroked",
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "tags": {
-                    "craft": "upholsterer"
-                },
-                "name": "Upholsterer"
-            },
-            "craft/watchmaker": {
-                "icon": "circle-stroked",
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "tags": {
-                    "craft": "watchmaker"
-                },
-                "name": "Watchmaker"
-            },
-            "craft/window_construction": {
-                "icon": "marker-stroked",
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "terms": [
-                    "glass"
-                ],
-                "tags": {
-                    "craft": "window_construction"
-                },
-                "name": "Window Construction"
-            },
-            "craft/winery": {
-                "icon": "alcohol-shop",
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "tags": {
-                    "craft": "winery"
-                },
-                "name": "Winery"
-            },
-            "embankment": {
-                "geometry": [
-                    "line"
-                ],
-                "tags": {
-                    "embankment": "yes"
-                },
-                "name": "Embankment",
-                "matchScore": 0.2
-            },
-            "emergency/ambulance_station": {
-                "icon": "hospital",
-                "fields": [
-                    "operator",
-                    "building_area",
-                    "address"
-                ],
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "terms": [
-                    "EMS",
-                    "EMT",
-                    "rescue"
-                ],
-                "tags": {
-                    "emergency": "ambulance_station"
-                },
-                "name": "Ambulance Station"
-            },
-            "emergency/fire_hydrant": {
-                "fields": [
-                    "fire_hydrant/type"
-                ],
-                "geometry": [
-                    "point",
-                    "vertex"
-                ],
-                "tags": {
-                    "emergency": "fire_hydrant"
-                },
-                "name": "Fire Hydrant"
-            },
-            "emergency/phone": {
-                "icon": "emergency-telephone",
-                "fields": [
-                    "operator"
-                ],
-                "geometry": [
-                    "point",
-                    "vertex"
-                ],
-                "tags": {
-                    "emergency": "phone"
-                },
-                "name": "Emergency Phone"
-            },
-            "entrance": {
-                "icon": "entrance",
-                "geometry": [
-                    "vertex"
-                ],
-                "tags": {
-                    "entrance": "*"
-                },
-                "fields": [
-                    "entrance",
-                    "access_simple",
-                    "address"
-                ],
-                "name": "Entrance/Exit"
-            },
-            "footway/crossing": {
-                "fields": [
-                    "crossing",
-                    "access",
-                    "surface",
-                    "sloped_curb",
-                    "tactile_paving"
-                ],
-                "geometry": [
-                    "line"
-                ],
-                "tags": {
-                    "highway": "footway",
-                    "footway": "crossing"
-                },
-                "terms": [],
-                "name": "Crossing"
-            },
-            "footway/crosswalk": {
-                "fields": [
-                    "crossing",
-                    "access",
-                    "surface",
-                    "sloped_curb",
-                    "tactile_paving"
-                ],
-                "geometry": [
-                    "line"
-                ],
-                "tags": {
-                    "highway": "footway",
-                    "footway": "crossing",
-                    "crossing": "zebra"
-                },
-                "terms": [
-                    "zebra crossing"
-                ],
-                "name": "Crosswalk"
-            },
-            "footway/sidewalk": {
-                "fields": [
-                    "surface",
-                    "lit",
-                    "width",
-                    "structure",
-                    "access"
-                ],
-                "geometry": [
-                    "line"
-                ],
-                "tags": {
-                    "highway": "footway",
-                    "footway": "sidewalk"
-                },
-                "terms": [],
-                "name": "Sidewalk"
-            },
-            "ford": {
-                "geometry": [
-                    "vertex"
-                ],
-                "tags": {
-                    "ford": "yes"
-                },
-                "name": "Ford"
-            },
-            "golf/bunker": {
-                "icon": "golf",
-                "geometry": [
-                    "area"
-                ],
-                "tags": {
-                    "golf": "bunker",
-                    "natural": "sand"
-                },
-                "terms": [
-                    "hazard",
-                    "bunker"
-                ],
-                "name": "Sand Trap"
-            },
-            "golf/fairway": {
-                "icon": "golf",
-                "geometry": [
-                    "area"
-                ],
-                "tags": {
-                    "golf": "fairway",
-                    "landuse": "grass"
-                },
-                "name": "Fairway"
-            },
-            "golf/green": {
-                "icon": "golf",
-                "geometry": [
-                    "area"
-                ],
-                "tags": {
-                    "golf": "green",
-                    "landuse": "grass",
-                    "leisure": "pitch",
-                    "sport": "golf"
-                },
-                "name": "Putting Green"
-            },
-            "golf/hole": {
-                "icon": "golf",
-                "fields": [
-                    "golf_hole",
-                    "par",
-                    "handicap"
-                ],
-                "geometry": [
-                    "line"
-                ],
-                "tags": {
-                    "golf": "hole"
-                },
-                "name": "Golf Hole"
-            },
-            "golf/lateral_water_hazard": {
-                "icon": "golf",
-                "geometry": [
-                    "line",
-                    "area"
-                ],
-                "tags": {
-                    "golf": "lateral_water_hazard",
-                    "natural": "water"
-                },
-                "name": "Lateral Water Hazard"
-            },
-            "golf/rough": {
-                "icon": "golf",
-                "geometry": [
-                    "area"
-                ],
-                "tags": {
-                    "golf": "rough",
-                    "landuse": "grass"
-                },
-                "name": "Rough"
-            },
-            "golf/tee": {
-                "icon": "golf",
-                "geometry": [
-                    "area"
-                ],
-                "tags": {
-                    "golf": "tee",
-                    "landuse": "grass"
-                },
-                "terms": [
-                    "teeing ground"
-                ],
-                "name": "Tee Box"
-            },
-            "golf/water_hazard": {
-                "icon": "golf",
-                "geometry": [
-                    "line",
-                    "area"
-                ],
-                "tags": {
-                    "golf": "water_hazard",
-                    "natural": "water"
-                },
-                "name": "Water Hazard"
-            },
-            "highway": {
-                "fields": [
-                    "highway"
-                ],
-                "geometry": [
-                    "point",
-                    "vertex",
-                    "line",
-                    "area"
-                ],
-                "tags": {
-                    "highway": "*"
-                },
-                "name": "Highway"
-            },
-            "highway/bridleway": {
-                "fields": [
-                    "surface",
-                    "width",
-                    "structure",
-                    "access"
-                ],
-                "icon": "highway-bridleway",
-                "geometry": [
-                    "line"
-                ],
-                "tags": {
-                    "highway": "bridleway"
-                },
-                "terms": [
-                    "bridleway",
-                    "equestrian",
-                    "horse"
-                ],
-                "name": "Bridle Path"
-            },
-            "highway/bus_stop": {
-                "icon": "bus",
-                "fields": [
-                    "operator",
-                    "shelter"
-                ],
-                "geometry": [
-                    "point",
-                    "vertex"
-                ],
-                "tags": {
-                    "highway": "bus_stop"
-                },
-                "terms": [],
-                "name": "Bus Stop"
-            },
-            "highway/crossing": {
-                "fields": [
-                    "crossing",
-                    "sloped_curb",
-                    "tactile_paving"
-                ],
-                "geometry": [
-                    "vertex"
-                ],
-                "tags": {
-                    "highway": "crossing"
-                },
-                "terms": [],
-                "name": "Crossing"
-            },
-            "highway/crosswalk": {
-                "fields": [
-                    "crossing",
-                    "sloped_curb",
-                    "tactile_paving"
-                ],
-                "geometry": [
-                    "vertex"
-                ],
-                "tags": {
-                    "highway": "crossing",
-                    "crossing": "zebra"
-                },
-                "terms": [
-                    "zebra crossing"
-                ],
-                "name": "Crosswalk"
-            },
-            "highway/cycleway": {
-                "icon": "highway-cycleway",
-                "fields": [
-                    "surface",
-                    "lit",
-                    "width",
-                    "oneway",
-                    "structure",
-                    "access"
-                ],
-                "geometry": [
-                    "line"
-                ],
-                "tags": {
-                    "highway": "cycleway"
-                },
-                "terms": [
-                    "bike"
-                ],
-                "name": "Cycle Path"
-            },
-            "highway/footway": {
-                "icon": "highway-footway",
-                "fields": [
-                    "surface",
-                    "lit",
-                    "width",
-                    "structure",
-                    "access"
-                ],
-                "geometry": [
-                    "line",
-                    "area"
-                ],
-                "terms": [
-                    "hike",
-                    "hiking",
-                    "trackway",
-                    "trail",
-                    "walk"
-                ],
-                "tags": {
-                    "highway": "footway"
-                },
-                "name": "Foot Path"
-            },
-            "highway/living_street": {
-                "icon": "highway-living-street",
-                "fields": [
-                    "oneway",
-                    "maxspeed",
-                    "structure",
-                    "access",
-                    "surface"
-                ],
-                "geometry": [
-                    "line"
-                ],
-                "tags": {
-                    "highway": "living_street"
-                },
-                "name": "Living Street"
-            },
-            "highway/mini_roundabout": {
-                "geometry": [
-                    "vertex"
-                ],
-                "tags": {
-                    "highway": "mini_roundabout"
-                },
-                "fields": [
-                    "clock_direction"
-                ],
-                "name": "Mini-Roundabout"
-            },
-            "highway/motorway": {
-                "icon": "highway-motorway",
-                "fields": [
-                    "oneway_yes",
-                    "maxspeed",
-                    "structure",
-                    "access",
-                    "lanes",
-                    "surface",
-                    "ref"
-                ],
-                "geometry": [
-                    "line"
-                ],
-                "tags": {
-                    "highway": "motorway"
-                },
-                "terms": [],
-                "name": "Motorway"
-            },
-            "highway/motorway_junction": {
-                "geometry": [
-                    "vertex"
-                ],
-                "tags": {
-                    "highway": "motorway_junction"
-                },
-                "fields": [
-                    "ref"
-                ],
-                "name": "Motorway Junction / Exit"
-            },
-            "highway/motorway_link": {
-                "icon": "highway-motorway-link",
-                "fields": [
-                    "oneway_yes",
-                    "maxspeed",
-                    "structure",
-                    "access",
-                    "surface",
-                    "ref"
-                ],
-                "geometry": [
-                    "line"
-                ],
-                "tags": {
-                    "highway": "motorway_link"
-                },
-                "terms": [
-                    "ramp",
-                    "on ramp",
-                    "off ramp"
-                ],
-                "name": "Motorway Link"
-            },
-            "highway/path": {
-                "icon": "highway-path",
-                "fields": [
-                    "surface",
-                    "width",
-                    "structure",
-                    "access",
-                    "incline",
-                    "sac_scale",
-                    "trail_visibility",
-                    "mtb/scale",
-                    "mtb/scale/uphill",
-                    "mtb/scale/imba",
-                    "ref"
-                ],
-                "geometry": [
-                    "line"
-                ],
-                "terms": [
-                    "hike",
-                    "hiking",
-                    "trackway",
-                    "trail",
-                    "walk"
-                ],
-                "tags": {
-                    "highway": "path"
-                },
-                "name": "Path"
-            },
-            "highway/pedestrian": {
-                "fields": [
-                    "surface",
-                    "lit",
-                    "width",
-                    "oneway",
-                    "structure",
-                    "access"
-                ],
-                "geometry": [
-                    "line",
-                    "area"
-                ],
-                "tags": {
-                    "highway": "pedestrian"
-                },
-                "terms": [],
-                "name": "Pedestrian"
-            },
-            "highway/primary": {
-                "icon": "highway-primary",
-                "fields": [
-                    "oneway",
-                    "maxspeed",
-                    "structure",
-                    "access",
-                    "lanes",
-                    "surface",
-                    "ref"
-                ],
-                "geometry": [
-                    "line"
-                ],
-                "tags": {
-                    "highway": "primary"
-                },
-                "terms": [],
-                "name": "Primary Road"
-            },
-            "highway/primary_link": {
-                "icon": "highway-primary-link",
-                "fields": [
-                    "oneway",
-                    "maxspeed",
-                    "structure",
-                    "access",
-                    "surface",
-                    "ref"
-                ],
-                "geometry": [
-                    "line"
-                ],
-                "tags": {
-                    "highway": "primary_link"
-                },
-                "terms": [
-                    "ramp",
-                    "on ramp",
-                    "off ramp"
-                ],
-                "name": "Primary Link"
-            },
-            "highway/raceway": {
-                "icon": "highway-unclassified",
-                "fields": [
-                    "oneway",
-                    "surface",
-                    "sport_racing",
-                    "structure"
-                ],
-                "geometry": [
-                    "line"
-                ],
-                "tags": {
-                    "highway": "raceway"
-                },
-                "addTags": {
-                    "highway": "raceway",
-                    "sport": "motor"
-                },
-                "terms": [
-                    "auto*",
-                    "race*",
-                    "nascar"
-                ],
-                "name": "Motor Raceway"
-            },
-            "highway/residential": {
-                "icon": "highway-residential",
-                "fields": [
-                    "oneway",
-                    "maxspeed",
-                    "structure",
-                    "access",
-                    "surface"
-                ],
-                "geometry": [
-                    "line"
-                ],
-                "tags": {
-                    "highway": "residential"
-                },
-                "terms": [],
-                "name": "Residential Road"
-            },
-            "highway/rest_area": {
-                "geometry": [
-                    "point",
-                    "vertex",
-                    "area"
-                ],
-                "tags": {
-                    "highway": "rest_area"
-                },
-                "terms": [
-                    "rest stop"
-                ],
-                "name": "Rest Area"
-            },
-            "highway/road": {
-                "icon": "highway-road",
-                "fields": [
-                    "oneway",
-                    "maxspeed",
-                    "structure",
-                    "access",
-                    "surface"
-                ],
-                "geometry": [
-                    "line"
-                ],
-                "tags": {
-                    "highway": "road"
-                },
-                "terms": [],
-                "name": "Unknown Road"
-            },
-            "highway/secondary": {
-                "icon": "highway-secondary",
-                "fields": [
-                    "oneway",
-                    "maxspeed",
-                    "structure",
-                    "access",
-                    "lanes",
-                    "surface",
-                    "ref"
-                ],
-                "geometry": [
-                    "line"
-                ],
-                "tags": {
-                    "highway": "secondary"
-                },
-                "terms": [],
-                "name": "Secondary Road"
-            },
-            "highway/secondary_link": {
-                "icon": "highway-secondary-link",
-                "fields": [
-                    "oneway",
-                    "maxspeed",
-                    "structure",
-                    "access",
-                    "surface",
-                    "ref"
-                ],
-                "geometry": [
-                    "line"
-                ],
-                "tags": {
-                    "highway": "secondary_link"
-                },
-                "terms": [
-                    "ramp",
-                    "on ramp",
-                    "off ramp"
-                ],
-                "name": "Secondary Link"
-            },
-            "highway/service": {
-                "icon": "highway-service",
-                "fields": [
-                    "service",
-                    "oneway",
-                    "maxspeed",
-                    "structure",
-                    "access",
-                    "surface"
-                ],
-                "geometry": [
-                    "line"
-                ],
-                "tags": {
-                    "highway": "service"
-                },
-                "terms": [],
-                "name": "Service Road"
-            },
-            "highway/service/alley": {
-                "icon": "highway-service",
-                "fields": [
-                    "oneway",
-                    "access",
-                    "surface"
-                ],
-                "geometry": [
-                    "line"
-                ],
-                "tags": {
-                    "highway": "service",
-                    "service": "alley"
-                },
-                "name": "Alley"
-            },
-            "highway/service/drive-through": {
-                "icon": "highway-service",
-                "fields": [
-                    "oneway",
-                    "access",
-                    "surface"
-                ],
-                "geometry": [
-                    "line"
-                ],
-                "tags": {
-                    "highway": "service",
-                    "service": "drive-through"
-                },
-                "name": "Drive-Through"
-            },
-            "highway/service/driveway": {
-                "icon": "highway-service",
-                "fields": [
-                    "oneway",
-                    "access",
-                    "surface"
-                ],
-                "geometry": [
-                    "line"
-                ],
-                "tags": {
-                    "highway": "service",
-                    "service": "driveway"
-                },
-                "name": "Driveway"
-            },
-            "highway/service/emergency_access": {
-                "icon": "highway-service",
-                "fields": [
-                    "oneway",
-                    "access",
-                    "surface"
-                ],
-                "geometry": [
-                    "line"
-                ],
-                "tags": {
-                    "highway": "service",
-                    "service": "emergency_access"
-                },
-                "name": "Emergency Access"
-            },
-            "highway/service/parking_aisle": {
-                "icon": "highway-service",
-                "fields": [
-                    "oneway",
-                    "access",
-                    "surface"
-                ],
-                "geometry": [
-                    "line"
-                ],
-                "tags": {
-                    "highway": "service",
-                    "service": "parking_aisle"
-                },
-                "name": "Parking Aisle"
-            },
-            "highway/services": {
-                "geometry": [
-                    "point",
-                    "vertex",
-                    "area"
-                ],
-                "tags": {
-                    "highway": "services"
-                },
-                "terms": [
-                    "services",
-                    "travel plaza",
-                    "service station"
-                ],
-                "name": "Service Area"
-            },
-            "highway/steps": {
-                "fields": [
-                    "surface",
-                    "lit",
-                    "width",
-                    "access"
-                ],
-                "icon": "highway-steps",
-                "geometry": [
-                    "line"
-                ],
-                "tags": {
-                    "highway": "steps"
-                },
-                "terms": [
-                    "stairs",
-                    "staircase"
-                ],
-                "name": "Steps"
-            },
-            "highway/stop": {
-                "geometry": [
-                    "vertex"
-                ],
-                "tags": {
-                    "highway": "stop"
-                },
-                "terms": [
-                    "stop sign"
-                ],
-                "name": "Stop Sign"
-            },
-            "highway/street_lamp": {
-                "geometry": [
-                    "point",
-                    "vertex"
-                ],
-                "tags": {
-                    "highway": "street_lamp"
-                },
-                "fields": [
-                    "lamp_type",
-                    "ref"
-                ],
-                "terms": [
-                    "streetlight",
-                    "street light",
-                    "lamp",
-                    "light",
-                    "gaslight"
-                ],
-                "name": "Street Lamp"
-            },
-            "highway/tertiary": {
-                "icon": "highway-tertiary",
-                "fields": [
-                    "oneway",
-                    "maxspeed",
-                    "structure",
-                    "access",
-                    "lanes",
-                    "surface",
-                    "ref"
-                ],
-                "geometry": [
-                    "line"
-                ],
-                "tags": {
-                    "highway": "tertiary"
-                },
-                "terms": [],
-                "name": "Tertiary Road"
-            },
-            "highway/tertiary_link": {
-                "icon": "highway-tertiary-link",
-                "fields": [
-                    "oneway",
-                    "maxspeed",
-                    "structure",
-                    "access",
-                    "surface",
-                    "ref"
-                ],
-                "geometry": [
-                    "line"
-                ],
-                "tags": {
-                    "highway": "tertiary_link"
-                },
-                "terms": [
-                    "ramp",
-                    "on ramp",
-                    "off ramp"
-                ],
-                "name": "Tertiary Link"
-            },
-            "highway/track": {
-                "icon": "highway-track",
-                "fields": [
-                    "surface",
-                    "width",
-                    "structure",
-                    "access",
-                    "incline",
-                    "tracktype",
-                    "smoothness",
-                    "mtb/scale",
-                    "mtb/scale/uphill",
-                    "mtb/scale/imba"
-                ],
-                "geometry": [
-                    "line"
-                ],
-                "tags": {
-                    "highway": "track"
-                },
-                "terms": [
-                    "woods road",
-                    "fire road"
-                ],
-                "name": "Track"
-            },
-            "highway/traffic_signals": {
-                "geometry": [
-                    "vertex"
-                ],
-                "tags": {
-                    "highway": "traffic_signals"
-                },
-                "terms": [
-                    "light",
-                    "stoplight",
-                    "traffic light"
-                ],
-                "name": "Traffic Signals"
-            },
-            "highway/trunk": {
-                "icon": "highway-trunk",
-                "fields": [
-                    "oneway",
-                    "maxspeed",
-                    "structure",
-                    "access",
-                    "lanes",
-                    "surface",
-                    "ref"
-                ],
-                "geometry": [
-                    "line"
-                ],
-                "tags": {
-                    "highway": "trunk"
-                },
-                "terms": [],
-                "name": "Trunk Road"
-            },
-            "highway/trunk_link": {
-                "icon": "highway-trunk-link",
-                "fields": [
-                    "oneway",
-                    "maxspeed",
-                    "structure",
-                    "access",
-                    "surface",
-                    "ref"
-                ],
-                "geometry": [
-                    "line"
-                ],
-                "tags": {
-                    "highway": "trunk_link"
-                },
-                "terms": [
-                    "ramp",
-                    "on ramp",
-                    "off ramp"
-                ],
-                "name": "Trunk Link"
-            },
-            "highway/turning_circle": {
-                "icon": "circle",
-                "geometry": [
-                    "vertex"
-                ],
-                "tags": {
-                    "highway": "turning_circle"
-                },
-                "terms": [
-                    "cul-de-sac"
-                ],
-                "name": "Turning Circle"
-            },
-            "highway/unclassified": {
-                "icon": "highway-unclassified",
-                "fields": [
-                    "oneway",
-                    "maxspeed",
-                    "structure",
-                    "access",
-                    "surface"
-                ],
-                "geometry": [
-                    "line"
-                ],
-                "tags": {
-                    "highway": "unclassified"
-                },
-                "terms": [],
-                "name": "Unclassified Road"
-            },
-            "historic": {
-                "fields": [
-                    "historic"
-                ],
-                "geometry": [
-                    "point",
-                    "vertex",
-                    "area"
-                ],
-                "tags": {
-                    "historic": "*"
-                },
-                "name": "Historic Site"
-            },
-            "historic/archaeological_site": {
-                "geometry": [
-                    "point",
-                    "vertex",
-                    "area"
-                ],
-                "tags": {
-                    "historic": "archaeological_site"
-                },
-                "name": "Archaeological Site"
-            },
-            "historic/boundary_stone": {
-                "geometry": [
-                    "point",
-                    "vertex"
-                ],
-                "tags": {
-                    "historic": "boundary_stone"
-                },
-                "name": "Boundary Stone"
-            },
-            "historic/castle": {
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "tags": {
-                    "historic": "castle"
-                },
-                "name": "Castle"
-            },
-            "historic/memorial": {
-                "icon": "monument",
-                "geometry": [
-                    "point",
-                    "vertex",
-                    "area"
-                ],
-                "tags": {
-                    "historic": "memorial"
-                },
-                "name": "Memorial"
-            },
-            "historic/monument": {
-                "icon": "monument",
-                "geometry": [
-                    "point",
-                    "vertex",
-                    "area"
-                ],
-                "tags": {
-                    "historic": "monument"
-                },
-                "name": "Monument"
-            },
-            "historic/ruins": {
-                "geometry": [
-                    "point",
-                    "vertex",
-                    "area"
-                ],
-                "tags": {
-                    "historic": "ruins"
-                },
-                "name": "Ruins"
-            },
-            "historic/wayside_cross": {
-                "geometry": [
-                    "point",
-                    "vertex",
-                    "area"
-                ],
-                "tags": {
-                    "historic": "wayside_cross"
-                },
-                "name": "Wayside Cross"
-            },
-            "historic/wayside_shrine": {
-                "geometry": [
-                    "point",
-                    "vertex",
-                    "area"
-                ],
-                "tags": {
-                    "historic": "wayside_shrine"
-                },
-                "name": "Wayside Shrine"
-            },
-            "landuse": {
-                "fields": [
-                    "landuse"
-                ],
-                "geometry": [
-                    "point",
-                    "vertex",
-                    "area"
-                ],
-                "tags": {
-                    "landuse": "*"
-                },
-                "name": "Landuse"
-            },
-            "landuse/allotments": {
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "tags": {
-                    "landuse": "allotments"
-                },
-                "terms": [],
-                "name": "Allotments"
-            },
-            "landuse/basin": {
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "tags": {
-                    "landuse": "basin"
-                },
-                "terms": [],
-                "name": "Basin"
-            },
-            "landuse/cemetery": {
-                "icon": "cemetery",
-                "fields": [
-                    "religion",
-                    "denomination"
-                ],
-                "geometry": [
-                    "point",
-                    "vertex",
-                    "area"
-                ],
-                "tags": {
-                    "landuse": "cemetery"
-                },
-                "terms": [],
-                "name": "Cemetery"
-            },
-            "landuse/churchyard": {
-                "fields": [
-                    "religion",
-                    "denomination"
-                ],
-                "geometry": [
-                    "area"
-                ],
-                "tags": {
-                    "landuse": "churchyard"
-                },
-                "terms": [],
-                "name": "Churchyard"
-            },
-            "landuse/commercial": {
-                "icon": "commercial",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "tags": {
-                    "landuse": "commercial"
-                },
-                "terms": [],
-                "name": "Commercial"
-            },
-            "landuse/construction": {
-                "fields": [
-                    "construction",
-                    "operator"
-                ],
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "tags": {
-                    "landuse": "construction"
-                },
-                "terms": [],
-                "name": "Construction"
-            },
-            "landuse/farm": {
-                "fields": [
-                    "crop"
-                ],
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "tags": {
-                    "landuse": "farm"
-                },
-                "terms": [],
-                "name": "Farm",
-                "icon": "farm"
-            },
-            "landuse/farmland": {
-                "fields": [
-                    "crop"
-                ],
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "tags": {
-                    "landuse": "farmland"
-                },
-                "terms": [],
-                "name": "Farmland",
-                "icon": "farm",
-                "searchable": false
-            },
-            "landuse/farmyard": {
-                "fields": [
-                    "crop"
-                ],
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "tags": {
-                    "landuse": "farmyard"
-                },
-                "terms": [],
-                "name": "Farmyard",
-                "icon": "farm"
-            },
-            "landuse/forest": {
-                "fields": [
-                    "wood"
-                ],
-                "icon": "park2",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "tags": {
-                    "landuse": "forest"
-                },
-                "terms": [],
-                "name": "Forest"
-            },
-            "landuse/grass": {
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "tags": {
-                    "landuse": "grass"
-                },
-                "terms": [],
-                "name": "Grass"
-            },
-            "landuse/industrial": {
-                "icon": "industrial",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "tags": {
-                    "landuse": "industrial"
-                },
-                "terms": [],
-                "name": "Industrial"
-            },
-            "landuse/landfill": {
-                "geometry": [
-                    "area"
-                ],
-                "tags": {
-                    "landuse": "landfill"
-                },
-                "terms": [
-                    "dump"
-                ],
-                "name": "Landfill"
-            },
-            "landuse/meadow": {
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "tags": {
-                    "landuse": "meadow"
-                },
-                "terms": [],
-                "name": "Meadow"
-            },
-            "landuse/military": {
-                "geometry": [
-                    "area"
-                ],
-                "tags": {
-                    "landuse": "military"
-                },
-                "terms": [],
-                "name": "Military"
-            },
-            "landuse/orchard": {
-                "fields": [
-                    "trees"
-                ],
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "tags": {
-                    "landuse": "orchard"
-                },
-                "terms": [],
-                "name": "Orchard",
-                "icon": "park2"
-            },
-            "landuse/quarry": {
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "tags": {
-                    "landuse": "quarry"
-                },
-                "terms": [],
-                "name": "Quarry"
-            },
-            "landuse/residential": {
-                "icon": "building",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "tags": {
-                    "landuse": "residential"
-                },
-                "terms": [],
-                "name": "Residential"
-            },
-            "landuse/retail": {
-                "icon": "shop",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "tags": {
-                    "landuse": "retail"
-                },
-                "name": "Retail"
-            },
-            "landuse/vineyard": {
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "tags": {
-                    "landuse": "vineyard"
-                },
-                "terms": [],
-                "name": "Vineyard"
-            },
-            "leisure": {
-                "fields": [
-                    "leisure"
-                ],
-                "geometry": [
-                    "point",
-                    "vertex",
-                    "area"
-                ],
-                "tags": {
-                    "leisure": "*"
-                },
-                "name": "Leisure"
-            },
-            "leisure/common": {
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "terms": [
-                    "open space"
-                ],
-                "tags": {
-                    "leisure": "common"
-                },
-                "name": "Common"
-            },
-            "leisure/dog_park": {
-                "icon": "dog-park",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "terms": [],
-                "tags": {
-                    "leisure": "dog_park"
-                },
-                "name": "Dog Park"
-            },
-            "leisure/firepit": {
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "tags": {
-                    "leisure": "firepit"
-                },
-                "terms": [
-                    "fireplace",
-                    "campfire"
-                ],
-                "name": "Firepit"
-            },
-            "leisure/garden": {
-                "icon": "garden",
-                "geometry": [
-                    "point",
-                    "vertex",
-                    "area"
-                ],
-                "tags": {
-                    "leisure": "garden"
-                },
-                "name": "Garden"
-            },
-            "leisure/golf_course": {
-                "icon": "golf",
-                "fields": [
-                    "operator",
-                    "address",
-                    "opening_hours"
-                ],
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "terms": [
-                    "links"
-                ],
-                "tags": {
-                    "leisure": "golf_course"
-                },
-                "name": "Golf Course"
-            },
-            "leisure/ice_rink": {
-                "icon": "pitch",
-                "fields": [
-                    "seasonal",
-                    "sport_ice",
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "terms": [
-                    "hockey",
-                    "skating",
-                    "curling"
-                ],
-                "tags": {
-                    "leisure": "ice_rink"
-                },
-                "name": "Ice Rink"
-            },
-            "leisure/marina": {
-                "icon": "harbor",
-                "geometry": [
-                    "point",
-                    "vertex",
-                    "area"
-                ],
-                "terms": [
-                    "boat"
-                ],
-                "tags": {
-                    "leisure": "marina"
-                },
-                "name": "Marina"
-            },
-            "leisure/park": {
-                "icon": "park",
-                "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": {
-                "geometry": [
-                    "point"
-                ],
-                "tags": {
-                    "leisure": "picnic_table"
-                },
-                "terms": [
-                    "bench"
-                ],
-                "name": "Picnic Table"
-            },
-            "leisure/pitch": {
-                "icon": "pitch",
-                "fields": [
-                    "sport",
-                    "surface",
-                    "lit"
-                ],
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "tags": {
-                    "leisure": "pitch"
-                },
-                "terms": [
-                    "field"
-                ],
-                "name": "Sport Pitch"
-            },
-            "leisure/pitch/american_football": {
-                "icon": "america-football",
-                "fields": [
-                    "surface",
-                    "lit"
-                ],
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "tags": {
-                    "leisure": "pitch",
-                    "sport": "american_football"
-                },
-                "terms": [],
-                "name": "American Football Field"
-            },
-            "leisure/pitch/baseball": {
-                "icon": "baseball",
-                "fields": [
-                    "lit"
-                ],
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "tags": {
-                    "leisure": "pitch",
-                    "sport": "baseball"
-                },
-                "terms": [],
-                "name": "Baseball Diamond"
-            },
-            "leisure/pitch/basketball": {
-                "icon": "basketball",
-                "fields": [
-                    "surface",
-                    "hoops",
-                    "lit"
-                ],
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "tags": {
-                    "leisure": "pitch",
-                    "sport": "basketball"
-                },
-                "terms": [],
-                "name": "Basketball Court"
-            },
-            "leisure/pitch/skateboard": {
-                "icon": "pitch",
-                "fields": [
-                    "surface",
-                    "lit"
-                ],
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "tags": {
-                    "leisure": "pitch",
-                    "sport": "skateboard"
-                },
-                "terms": [],
-                "name": "Skate Park"
-            },
-            "leisure/pitch/soccer": {
-                "icon": "soccer",
-                "fields": [
-                    "surface",
-                    "lit"
-                ],
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "tags": {
-                    "leisure": "pitch",
-                    "sport": "soccer"
-                },
-                "terms": [],
-                "name": "Soccer Field"
-            },
-            "leisure/pitch/tennis": {
-                "icon": "tennis",
-                "fields": [
-                    "surface",
-                    "lit"
-                ],
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "tags": {
-                    "leisure": "pitch",
-                    "sport": "tennis"
-                },
-                "terms": [],
-                "name": "Tennis Court"
-            },
-            "leisure/pitch/volleyball": {
-                "icon": "pitch",
-                "fields": [
-                    "surface",
-                    "lit"
-                ],
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "tags": {
-                    "leisure": "pitch",
-                    "sport": "volleyball"
-                },
-                "terms": [],
-                "name": "Volleyball Court"
-            },
-            "leisure/playground": {
-                "icon": "playground",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "terms": [
-                    "jungle gym",
-                    "play area"
-                ],
-                "tags": {
-                    "leisure": "playground"
-                },
-                "name": "Playground"
-            },
-            "leisure/running_track": {
-                "icon": "pitch",
-                "fields": [
-                    "surface",
-                    "sport_racing",
-                    "lit",
-                    "width",
-                    "lanes"
-                ],
-                "geometry": [
-                    "point",
-                    "line"
-                ],
-                "tags": {
-                    "leisure": "track",
-                    "sport": "running"
-                },
-                "name": "Running Track"
-            },
-            "leisure/slipway": {
-                "geometry": [
-                    "point",
-                    "line"
-                ],
-                "terms": [
-                    "boat launch",
-                    "boat ramp"
-                ],
-                "tags": {
-                    "leisure": "slipway"
-                },
-                "name": "Slipway"
-            },
-            "leisure/sports_center": {
-                "icon": "pitch",
-                "fields": [
-                    "sport",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "tags": {
-                    "leisure": "sports_centre"
-                },
-                "terms": [
-                    "gym"
-                ],
-                "name": "Sports Center / Gym"
-            },
-            "leisure/stadium": {
-                "icon": "pitch",
-                "fields": [
-                    "sport",
-                    "address"
-                ],
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "tags": {
-                    "leisure": "stadium"
-                },
-                "name": "Stadium"
-            },
-            "leisure/swimming_pool": {
-                "icon": "swimming",
-                "fields": [
-                    "access_simple",
-                    "operator",
-                    "address"
-                ],
-                "geometry": [
-                    "point",
-                    "vertex",
-                    "area"
-                ],
-                "tags": {
-                    "leisure": "swimming_pool"
-                },
-                "name": "Swimming Pool"
-            },
-            "leisure/track": {
-                "icon": "highway-road",
-                "fields": [
-                    "surface",
-                    "sport_racing",
-                    "lit",
-                    "width",
-                    "lanes"
-                ],
-                "geometry": [
-                    "point",
-                    "line"
-                ],
-                "tags": {
-                    "leisure": "track"
-                },
-                "name": "Racetrack (non-Motorsport)"
-            },
-            "line": {
-                "name": "Line",
-                "tags": {},
-                "geometry": [
-                    "line"
-                ],
-                "matchScore": 0.1
-            },
-            "man_made": {
-                "fields": [
-                    "man_made"
-                ],
-                "geometry": [
-                    "point",
-                    "vertex",
-                    "line",
-                    "area"
-                ],
-                "tags": {
-                    "man_made": "*"
-                },
-                "name": "Man Made"
-            },
-            "man_made/breakwater": {
-                "geometry": [
-                    "line",
-                    "area"
-                ],
-                "tags": {
-                    "man_made": "breakwater"
-                },
-                "name": "Breakwater"
-            },
-            "man_made/cutline": {
-                "geometry": [
-                    "line"
-                ],
-                "tags": {
-                    "man_made": "cutline"
-                },
-                "name": "Cut line"
-            },
-            "man_made/embankment": {
-                "geometry": [
-                    "line"
-                ],
-                "tags": {
-                    "man_made": "embankment"
-                },
-                "name": "Embankment",
-                "searchable": false
-            },
-            "man_made/flagpole": {
-                "geometry": [
-                    "point"
-                ],
-                "tags": {
-                    "man_made": "flagpole"
-                },
-                "name": "Flagpole",
-                "icon": "embassy"
-            },
-            "man_made/lighthouse": {
-                "icon": "lighthouse",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "tags": {
-                    "man_made": "lighthouse"
-                },
-                "name": "Lighthouse"
-            },
-            "man_made/observation": {
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "terms": [
-                    "lookout tower",
-                    "fire tower"
-                ],
-                "tags": {
-                    "man_made": "tower",
-                    "tower:type": "observation"
-                },
-                "name": "Observation Tower"
-            },
-            "man_made/pier": {
-                "geometry": [
-                    "line",
-                    "area"
-                ],
-                "tags": {
-                    "man_made": "pier"
-                },
-                "name": "Pier"
-            },
-            "man_made/pipeline": {
-                "icon": "pipeline",
-                "fields": [
-                    "location",
-                    "operator"
-                ],
-                "geometry": [
-                    "line"
-                ],
-                "tags": {
-                    "man_made": "pipeline"
-                },
-                "name": "Pipeline"
-            },
-            "man_made/survey_point": {
-                "icon": "monument",
-                "fields": [
-                    "ref"
-                ],
-                "geometry": [
-                    "point",
-                    "vertex"
-                ],
-                "tags": {
-                    "man_made": "survey_point"
-                },
-                "name": "Survey Point"
-            },
-            "man_made/tower": {
-                "fields": [
-                    "towertype"
-                ],
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "tags": {
-                    "man_made": "tower"
-                },
-                "name": "Tower"
-            },
-            "man_made/wastewater_plant": {
-                "icon": "water",
-                "fields": [
-                    "operator",
-                    "address"
-                ],
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "terms": [
-                    "sewage*",
-                    "water treatment plant",
-                    "reclamation plant"
-                ],
-                "tags": {
-                    "man_made": "wastewater_plant"
-                },
-                "name": "Wastewater Plant"
-            },
-            "man_made/water_tower": {
-                "icon": "water",
-                "fields": [
-                    "operator"
-                ],
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "tags": {
-                    "man_made": "water_tower"
-                },
-                "name": "Water Tower"
-            },
-            "man_made/water_well": {
-                "fields": [
-                    "operator"
-                ],
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "tags": {
-                    "man_made": "water_well"
-                },
-                "name": "Water Well"
-            },
-            "man_made/water_works": {
-                "icon": "water",
-                "fields": [
-                    "operator",
-                    "address"
-                ],
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "tags": {
-                    "man_made": "water_works"
-                },
-                "name": "Water Works"
-            },
-            "military/airfield": {
-                "icon": "airfield",
-                "geometry": [
-                    "point",
-                    "vertex",
-                    "area"
-                ],
-                "terms": [],
-                "tags": {
-                    "military": "airfield"
-                },
-                "name": "Airfield"
-            },
-            "military/barracks": {
-                "geometry": [
-                    "point",
-                    "vertex",
-                    "area"
-                ],
-                "terms": [],
-                "tags": {
-                    "military": "barracks"
-                },
-                "name": "Barracks"
-            },
-            "military/bunker": {
-                "geometry": [
-                    "point",
-                    "vertex",
-                    "area"
-                ],
-                "terms": [],
-                "tags": {
-                    "military": "bunker"
-                },
-                "name": "Bunker"
-            },
-            "military/range": {
-                "geometry": [
-                    "point",
-                    "vertex",
-                    "area"
-                ],
-                "terms": [],
-                "tags": {
-                    "military": "range"
-                },
-                "name": "Military Range"
-            },
-            "natural": {
-                "fields": [
-                    "natural"
-                ],
-                "geometry": [
-                    "point",
-                    "vertex",
-                    "area"
-                ],
-                "tags": {
-                    "natural": "*"
-                },
-                "name": "Natural"
-            },
-            "natural/bay": {
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "terms": [],
-                "tags": {
-                    "natural": "bay"
-                },
-                "name": "Bay"
-            },
-            "natural/beach": {
-                "fields": [
-                    "surface"
-                ],
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "terms": [],
-                "tags": {
-                    "natural": "beach"
-                },
-                "name": "Beach"
-            },
-            "natural/cliff": {
-                "geometry": [
-                    "point",
-                    "vertex",
-                    "line",
-                    "area"
-                ],
-                "terms": [],
-                "tags": {
-                    "natural": "cliff"
-                },
-                "name": "Cliff"
-            },
-            "natural/coastline": {
-                "geometry": [
-                    "line"
-                ],
-                "terms": [
-                    "shore"
-                ],
-                "tags": {
-                    "natural": "coastline"
-                },
-                "name": "Coastline"
-            },
-            "natural/fell": {
-                "geometry": [
-                    "area"
-                ],
-                "terms": [],
-                "tags": {
-                    "natural": "fell"
-                },
-                "name": "Fell"
-            },
-            "natural/glacier": {
-                "geometry": [
-                    "area"
-                ],
-                "terms": [],
-                "tags": {
-                    "natural": "glacier"
-                },
-                "name": "Glacier"
-            },
-            "natural/grassland": {
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "terms": [],
-                "tags": {
-                    "natural": "grassland"
-                },
-                "name": "Grassland"
-            },
-            "natural/heath": {
-                "geometry": [
-                    "area"
-                ],
-                "terms": [],
-                "tags": {
-                    "natural": "heath"
-                },
-                "name": "Heath"
-            },
-            "natural/peak": {
-                "icon": "triangle",
-                "fields": [
-                    "elevation"
-                ],
-                "geometry": [
-                    "point",
-                    "vertex"
-                ],
-                "tags": {
-                    "natural": "peak"
-                },
-                "terms": [
-                    "acme",
-                    "aiguille",
-                    "alp",
-                    "climax",
-                    "crest",
-                    "crown",
-                    "hill",
-                    "mount",
-                    "mountain",
-                    "pinnacle",
-                    "summit",
-                    "tip",
-                    "top"
-                ],
-                "name": "Peak"
-            },
-            "natural/scree": {
-                "geometry": [
-                    "area"
-                ],
-                "tags": {
-                    "natural": "scree"
-                },
-                "terms": [
-                    "loose rocks"
-                ],
-                "name": "Scree"
-            },
-            "natural/scrub": {
-                "geometry": [
-                    "area"
-                ],
-                "tags": {
-                    "natural": "scrub"
-                },
-                "terms": [],
-                "name": "Scrub"
-            },
-            "natural/spring": {
-                "geometry": [
-                    "point",
-                    "vertex"
-                ],
-                "terms": [],
-                "tags": {
-                    "natural": "spring"
-                },
-                "name": "Spring"
-            },
-            "natural/tree": {
-                "fields": [
-                    "tree_type",
-                    "denotation"
-                ],
-                "icon": "park",
-                "geometry": [
-                    "point",
-                    "vertex"
-                ],
-                "terms": [],
-                "tags": {
-                    "natural": "tree"
-                },
-                "name": "Tree"
-            },
-            "natural/water": {
-                "fields": [
-                    "water"
-                ],
-                "geometry": [
-                    "area"
-                ],
-                "tags": {
-                    "natural": "water"
-                },
-                "icon": "water",
-                "name": "Water"
-            },
-            "natural/water/lake": {
-                "geometry": [
-                    "area"
-                ],
-                "tags": {
-                    "natural": "water",
-                    "water": "lake"
-                },
-                "terms": [
-                    "lakelet",
-                    "loch",
-                    "mere"
-                ],
-                "icon": "water",
-                "name": "Lake"
-            },
-            "natural/water/pond": {
-                "geometry": [
-                    "area"
-                ],
-                "tags": {
-                    "natural": "water",
-                    "water": "pond"
-                },
-                "terms": [
-                    "lakelet",
-                    "millpond",
-                    "tarn",
-                    "pool",
-                    "mere"
-                ],
-                "icon": "water",
-                "name": "Pond"
-            },
-            "natural/water/reservoir": {
-                "geometry": [
-                    "area"
-                ],
-                "tags": {
-                    "natural": "water",
-                    "water": "reservoir"
-                },
-                "icon": "water",
-                "name": "Reservoir"
-            },
-            "natural/wetland": {
-                "icon": "wetland",
-                "fields": [
-                    "wetland"
-                ],
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "tags": {
-                    "natural": "wetland"
-                },
-                "terms": [],
-                "name": "Wetland"
-            },
-            "natural/wood": {
-                "fields": [
-                    "wood"
-                ],
-                "icon": "park2",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "tags": {
-                    "natural": "wood"
-                },
-                "terms": [],
-                "name": "Wood"
-            },
-            "office": {
-                "icon": "commercial",
-                "fields": [
-                    "office",
-                    "address",
-                    "building_area",
-                    "opening_hours",
-                    "smoking"
-                ],
-                "geometry": [
-                    "point",
-                    "vertex",
-                    "area"
-                ],
-                "tags": {
-                    "office": "*"
-                },
-                "terms": [],
-                "name": "Office"
-            },
-            "office/accountant": {
-                "icon": "commercial",
-                "fields": [
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "geometry": [
-                    "point",
-                    "vertex",
-                    "area"
-                ],
-                "tags": {
-                    "office": "accountant"
-                },
-                "terms": [],
-                "name": "Accountant"
-            },
-            "office/administrative": {
-                "icon": "commercial",
-                "fields": [
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "geometry": [
-                    "point",
-                    "vertex",
-                    "area"
-                ],
-                "tags": {
-                    "office": "administrative"
-                },
-                "terms": [],
-                "name": "Administrative Office"
-            },
-            "office/architect": {
-                "icon": "commercial",
-                "fields": [
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "geometry": [
-                    "point",
-                    "vertex",
-                    "area"
-                ],
-                "tags": {
-                    "office": "architect"
-                },
-                "terms": [],
-                "name": "Architect"
-            },
-            "office/company": {
-                "icon": "commercial",
-                "fields": [
-                    "address",
-                    "building_area",
-                    "opening_hours",
-                    "smoking"
-                ],
-                "geometry": [
-                    "point",
-                    "vertex",
-                    "area"
-                ],
-                "tags": {
-                    "office": "company"
-                },
-                "terms": [],
-                "name": "Company Office"
-            },
-            "office/educational_institution": {
-                "icon": "commercial",
-                "fields": [
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "geometry": [
-                    "point",
-                    "vertex",
-                    "area"
-                ],
-                "tags": {
-                    "office": "educational_institution"
-                },
-                "terms": [],
-                "name": "Educational Institution"
-            },
-            "office/employment_agency": {
-                "icon": "commercial",
-                "fields": [
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "geometry": [
-                    "point",
-                    "vertex",
-                    "area"
-                ],
-                "tags": {
-                    "office": "employment_agency"
-                },
-                "terms": [
-                    "job"
-                ],
-                "name": "Employment Agency"
-            },
-            "office/estate_agent": {
-                "icon": "commercial",
-                "fields": [
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "geometry": [
-                    "point",
-                    "vertex",
-                    "area"
-                ],
-                "tags": {
-                    "office": "estate_agent"
-                },
-                "terms": [],
-                "name": "Real Estate Office"
-            },
-            "office/financial": {
-                "icon": "commercial",
-                "fields": [
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "geometry": [
-                    "point",
-                    "vertex",
-                    "area"
-                ],
-                "tags": {
-                    "office": "financial"
-                },
-                "terms": [],
-                "name": "Financial Office"
-            },
-            "office/government": {
-                "icon": "commercial",
-                "fields": [
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "geometry": [
-                    "point",
-                    "vertex",
-                    "area"
-                ],
-                "tags": {
-                    "office": "government"
-                },
-                "terms": [],
-                "name": "Government Office"
-            },
-            "office/insurance": {
-                "icon": "commercial",
-                "fields": [
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "geometry": [
-                    "point",
-                    "vertex",
-                    "area"
-                ],
-                "tags": {
-                    "office": "insurance"
-                },
-                "terms": [],
-                "name": "Insurance Office"
-            },
-            "office/it": {
-                "icon": "commercial",
-                "fields": [
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "geometry": [
-                    "point",
-                    "vertex",
-                    "area"
-                ],
-                "tags": {
-                    "office": "it"
-                },
-                "terms": [],
-                "name": "IT Office"
-            },
-            "office/lawyer": {
-                "icon": "commercial",
-                "fields": [
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "geometry": [
-                    "point",
-                    "vertex",
-                    "area"
-                ],
-                "tags": {
-                    "office": "lawyer"
-                },
-                "terms": [],
-                "name": "Law Office"
-            },
-            "office/newspaper": {
-                "icon": "commercial",
-                "fields": [
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "geometry": [
-                    "point",
-                    "vertex",
-                    "area"
-                ],
-                "tags": {
-                    "office": "newspaper"
-                },
-                "terms": [],
-                "name": "Newspaper"
-            },
-            "office/ngo": {
-                "icon": "commercial",
-                "fields": [
-                    "address",
-                    "building_area",
-                    "opening_hours",
-                    "smoking"
-                ],
-                "geometry": [
-                    "point",
-                    "vertex",
-                    "area"
-                ],
-                "tags": {
-                    "office": "ngo"
-                },
-                "terms": [],
-                "name": "NGO Office"
-            },
-            "office/physician": {
-                "icon": "commercial",
-                "fields": [
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "geometry": [
-                    "point",
-                    "vertex",
-                    "area"
-                ],
-                "tags": {
-                    "office": "physician"
-                },
-                "terms": [],
-                "name": "Physician"
-            },
-            "office/political_party": {
-                "icon": "commercial",
-                "fields": [
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "geometry": [
-                    "point",
-                    "vertex",
-                    "area"
-                ],
-                "tags": {
-                    "office": "political_party"
-                },
-                "terms": [],
-                "name": "Political Party"
-            },
-            "office/research": {
-                "icon": "commercial",
-                "fields": [
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "geometry": [
-                    "point",
-                    "vertex",
-                    "area"
-                ],
-                "tags": {
-                    "office": "research"
-                },
-                "terms": [],
-                "name": "Research Office"
-            },
-            "office/telecommunication": {
-                "icon": "commercial",
-                "fields": [
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "geometry": [
-                    "point",
-                    "vertex",
-                    "area"
-                ],
-                "tags": {
-                    "office": "telecommunication"
-                },
-                "terms": [],
-                "name": "Telecom Office"
-            },
-            "office/therapist": {
-                "icon": "commercial",
-                "fields": [
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "geometry": [
-                    "point",
-                    "vertex",
-                    "area"
-                ],
-                "tags": {
-                    "office": "therapist"
-                },
-                "terms": [],
-                "name": "Therapist"
-            },
-            "office/travel_agent": {
-                "icon": "suitcase",
-                "fields": [
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "geometry": [
-                    "point",
-                    "vertex",
-                    "area"
-                ],
-                "tags": {
-                    "office": "travel_agent"
-                },
-                "terms": [],
-                "name": "Travel Agency",
-                "searchable": false
-            },
-            "piste": {
-                "icon": "skiing",
-                "fields": [
-                    "piste/type",
-                    "piste/difficulty",
-                    "piste/grooming",
-                    "oneway",
-                    "lit"
-                ],
-                "geometry": [
-                    "point",
-                    "line",
-                    "area"
-                ],
-                "terms": [
-                    "ski",
-                    "sled",
-                    "sleigh",
-                    "snowboard",
-                    "nordic",
-                    "downhill",
-                    "snowmobile"
-                ],
-                "tags": {
-                    "piste:type": "*"
-                },
-                "name": "Piste/Ski Trail"
-            },
-            "place": {
-                "fields": [
-                    "place"
-                ],
-                "geometry": [
-                    "point",
-                    "vertex",
-                    "area"
-                ],
-                "tags": {
-                    "place": "*"
-                },
-                "name": "Place"
-            },
-            "place/city": {
-                "icon": "city",
-                "fields": [
-                    "population"
-                ],
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "tags": {
-                    "place": "city"
-                },
-                "name": "City"
-            },
-            "place/hamlet": {
-                "icon": "triangle-stroked",
-                "fields": [
-                    "population"
-                ],
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "tags": {
-                    "place": "hamlet"
-                },
-                "name": "Hamlet"
-            },
-            "place/island": {
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "terms": [
-                    "archipelago",
-                    "atoll",
-                    "bar",
-                    "cay",
-                    "isle",
-                    "islet",
-                    "key",
-                    "reef"
-                ],
-                "tags": {
-                    "place": "island"
-                },
-                "name": "Island"
-            },
-            "place/isolated_dwelling": {
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "tags": {
-                    "place": "isolated_dwelling"
-                },
-                "name": "Isolated Dwelling"
-            },
-            "place/locality": {
-                "icon": "marker",
-                "fields": [
-                    "population"
-                ],
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "tags": {
-                    "place": "locality"
-                },
-                "name": "Locality"
-            },
-            "place/neighbourhood": {
-                "icon": "triangle-stroked",
-                "fields": [
-                    "population"
-                ],
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "tags": {
-                    "place": "neighbourhood"
-                },
-                "terms": [
-                    "neighbourhood"
-                ],
-                "name": "Neighborhood"
-            },
-            "place/suburb": {
-                "icon": "triangle-stroked",
-                "fields": [
-                    "population"
-                ],
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "tags": {
-                    "place": "suburb"
-                },
-                "terms": [
-                    "Boro",
-                    "Quarter"
-                ],
-                "name": "Borough"
-            },
-            "place/town": {
-                "icon": "town",
-                "fields": [
-                    "population"
-                ],
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "tags": {
-                    "place": "town"
-                },
-                "name": "Town"
-            },
-            "place/village": {
-                "icon": "village",
-                "fields": [
-                    "population"
-                ],
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "tags": {
-                    "place": "village"
-                },
-                "name": "Village"
-            },
-            "point": {
-                "name": "Point",
-                "tags": {},
-                "geometry": [
-                    "point"
-                ],
-                "matchScore": 0.1
-            },
-            "power": {
-                "geometry": [
-                    "point",
-                    "vertex",
-                    "line",
-                    "area"
-                ],
-                "tags": {
-                    "power": "*"
-                },
-                "fields": [
-                    "power"
-                ],
-                "name": "Power"
-            },
-            "power/generator": {
-                "fields": [
-                    "operator",
-                    "generator/source",
-                    "generator/method",
-                    "generator/type"
-                ],
-                "geometry": [
-                    "point",
-                    "vertex",
-                    "area"
-                ],
-                "tags": {
-                    "power": "generator"
-                },
-                "name": "Power Generator"
-            },
-            "power/line": {
-                "geometry": [
-                    "line"
-                ],
-                "tags": {
-                    "power": "line"
-                },
-                "name": "Power Line",
-                "icon": "power-line"
-            },
-            "power/minor_line": {
-                "geometry": [
-                    "line"
-                ],
-                "tags": {
-                    "power": "minor_line"
-                },
-                "name": "Minor Power Line",
-                "icon": "power-line"
-            },
-            "power/pole": {
-                "geometry": [
-                    "vertex"
-                ],
-                "tags": {
-                    "power": "pole"
-                },
-                "name": "Power Pole"
-            },
-            "power/sub_station": {
-                "fields": [
-                    "operator",
-                    "building"
-                ],
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "tags": {
-                    "power": "sub_station"
-                },
-                "name": "Substation",
-                "searchable": false
-            },
-            "power/substation": {
-                "fields": [
-                    "operator",
-                    "building"
-                ],
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "tags": {
-                    "power": "substation"
-                },
-                "name": "Substation"
-            },
-            "power/tower": {
-                "geometry": [
-                    "vertex"
-                ],
-                "tags": {
-                    "power": "tower"
-                },
-                "name": "High-Voltage Tower"
-            },
-            "power/transformer": {
-                "geometry": [
-                    "point",
-                    "vertex",
-                    "area"
-                ],
-                "tags": {
-                    "power": "transformer"
-                },
-                "name": "Transformer"
-            },
-            "public_transport/platform": {
-                "fields": [
-                    "ref",
-                    "operator",
-                    "network",
-                    "shelter"
-                ],
-                "geometry": [
-                    "point",
-                    "vertex",
-                    "line",
-                    "area"
-                ],
-                "tags": {
-                    "public_transport": "platform"
-                },
-                "name": "Platform"
-            },
-            "public_transport/stop_position": {
-                "icon": "bus",
-                "fields": [
-                    "ref",
-                    "operator",
-                    "network"
-                ],
-                "geometry": [
-                    "vertex"
-                ],
-                "tags": {
-                    "public_transport": "stop_position"
-                },
-                "name": "Stop Position"
-            },
-            "railway": {
-                "fields": [
-                    "railway"
-                ],
-                "geometry": [
-                    "point",
-                    "vertex",
-                    "line",
-                    "area"
-                ],
-                "tags": {
-                    "railway": "*"
-                },
-                "name": "Railway"
-            },
-            "railway/abandoned": {
-                "icon": "railway-abandoned",
-                "geometry": [
-                    "line"
-                ],
-                "tags": {
-                    "railway": "abandoned"
-                },
-                "fields": [
-                    "structure"
-                ],
-                "terms": [],
-                "name": "Abandoned Railway"
-            },
-            "railway/disused": {
-                "icon": "railway-disused",
-                "geometry": [
-                    "line"
-                ],
-                "tags": {
-                    "railway": "disused"
-                },
-                "fields": [
-                    "structure"
-                ],
-                "terms": [],
-                "name": "Disused Railway"
-            },
-            "railway/funicular": {
-                "geometry": [
-                    "line"
-                ],
-                "terms": [
-                    "venicular",
-                    "cliff railway",
-                    "cable car",
-                    "cable railway",
-                    "funicular railway"
-                ],
-                "fields": [
-                    "structure",
-                    "gauge"
-                ],
-                "tags": {
-                    "railway": "funicular"
-                },
-                "icon": "railway-rail",
-                "name": "Funicular"
-            },
-            "railway/halt": {
-                "icon": "rail",
-                "geometry": [
-                    "point",
-                    "vertex"
-                ],
-                "tags": {
-                    "railway": "halt"
-                },
-                "name": "Railway Halt",
-                "terms": [
-                    "break",
-                    "interrupt",
-                    "rest",
-                    "wait",
-                    "interruption"
-                ]
-            },
-            "railway/level_crossing": {
-                "icon": "cross",
-                "geometry": [
-                    "vertex"
-                ],
-                "tags": {
-                    "railway": "level_crossing"
-                },
-                "terms": [
-                    "crossing",
-                    "railroad crossing",
-                    "railway crossing",
-                    "grade crossing",
-                    "road through railroad",
-                    "train crossing"
-                ],
-                "name": "Level Crossing"
-            },
-            "railway/monorail": {
-                "icon": "railway-monorail",
-                "geometry": [
-                    "line"
-                ],
-                "tags": {
-                    "railway": "monorail"
-                },
-                "fields": [
-                    "structure",
-                    "electrified"
-                ],
-                "terms": [],
-                "name": "Monorail"
-            },
-            "railway/narrow_gauge": {
-                "icon": "railway-rail",
-                "geometry": [
-                    "line"
-                ],
-                "tags": {
-                    "railway": "narrow_gauge"
-                },
-                "fields": [
-                    "structure",
-                    "gauge",
-                    "electrified"
-                ],
-                "terms": [
-                    "narrow gauge railway",
-                    "narrow gauge railroad"
-                ],
-                "name": "Narrow Gauge Rail"
-            },
-            "railway/platform": {
-                "geometry": [
-                    "point",
-                    "vertex",
-                    "line",
-                    "area"
-                ],
-                "tags": {
-                    "railway": "platform"
-                },
-                "name": "Railway Platform"
-            },
-            "railway/rail": {
-                "icon": "railway-rail",
-                "geometry": [
-                    "line"
-                ],
-                "tags": {
-                    "railway": "rail"
-                },
-                "fields": [
-                    "structure",
-                    "gauge",
-                    "electrified"
-                ],
-                "terms": [],
-                "name": "Rail"
-            },
-            "railway/station": {
-                "icon": "rail",
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area"
-                ],
-                "geometry": [
-                    "point",
-                    "vertex",
-                    "area"
-                ],
-                "tags": {
-                    "railway": "station"
-                },
-                "terms": [
-                    "train station",
-                    "station"
-                ],
-                "name": "Railway Station"
-            },
-            "railway/subway": {
-                "icon": "railway-subway",
-                "fields": [
-                    "structure",
-                    "gauge",
-                    "electrified"
-                ],
-                "geometry": [
-                    "line"
-                ],
-                "tags": {
-                    "railway": "subway"
-                },
-                "terms": [],
-                "name": "Subway"
-            },
-            "railway/subway_entrance": {
-                "icon": "rail-metro",
-                "geometry": [
-                    "point"
-                ],
-                "tags": {
-                    "railway": "subway_entrance"
-                },
-                "terms": [],
-                "name": "Subway Entrance"
-            },
-            "railway/tram": {
-                "icon": "railway-light-rail",
-                "geometry": [
-                    "line"
-                ],
-                "tags": {
-                    "railway": "tram"
-                },
-                "fields": [
-                    "structure",
-                    "gauge",
-                    "electrified"
-                ],
-                "terms": [
-                    "streetcar"
-                ],
-                "name": "Tram"
-            },
-            "relation": {
-                "name": "Relation",
-                "icon": "relation",
-                "tags": {},
-                "geometry": [
-                    "relation"
-                ],
-                "fields": [
-                    "relation"
-                ]
-            },
-            "route/ferry": {
-                "icon": "ferry",
-                "geometry": [
-                    "line"
-                ],
-                "tags": {
-                    "route": "ferry"
-                },
-                "name": "Ferry Route"
-            },
-            "shop": {
-                "icon": "shop",
-                "fields": [
-                    "shop",
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "tags": {
-                    "shop": "*"
-                },
-                "terms": [],
-                "name": "Shop"
-            },
-            "shop/alcohol": {
-                "icon": "alcohol-shop",
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "terms": [
-                    "alcohol",
-                    "beer",
-                    "booze",
-                    "wine"
-                ],
-                "tags": {
-                    "shop": "alcohol"
-                },
-                "name": "Liquor Store"
-            },
-            "shop/anime": {
-                "icon": "shop",
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "tags": {
-                    "shop": "anime"
-                },
-                "name": "Anime Shop"
-            },
-            "shop/antiques": {
-                "icon": "shop",
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "tags": {
-                    "shop": "antiques"
-                },
-                "name": "Antiques Shop"
-            },
-            "shop/art": {
-                "icon": "art-gallery",
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "tags": {
-                    "shop": "art"
-                },
-                "name": "Art Gallery"
-            },
-            "shop/baby_goods": {
-                "icon": "shop",
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "tags": {
-                    "shop": "baby_goods"
-                },
-                "name": "Baby Goods Store"
-            },
-            "shop/bag": {
-                "icon": "shop",
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "terms": [
-                    "handbag",
-                    "purse"
-                ],
-                "tags": {
-                    "shop": "bag"
-                },
-                "name": "Bag/Luggage Store"
-            },
-            "shop/bakery": {
-                "icon": "bakery",
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "tags": {
-                    "shop": "bakery"
-                },
-                "name": "Bakery"
-            },
-            "shop/bathroom_furnishing": {
-                "icon": "shop",
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "tags": {
-                    "shop": "bathroom_furnishing"
-                },
-                "name": "Bathroom Furnishing Store"
-            },
-            "shop/beauty": {
-                "icon": "shop",
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "terms": [
-                    "nail spa",
-                    "spa",
-                    "salon",
-                    "tanning"
-                ],
-                "tags": {
-                    "shop": "beauty"
-                },
-                "name": "Beauty Shop"
-            },
-            "shop/bed": {
-                "icon": "lodging",
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "tags": {
-                    "shop": "bed"
-                },
-                "name": "Bedding/Mattress Store"
-            },
-            "shop/beverages": {
-                "icon": "shop",
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "tags": {
-                    "shop": "beverages"
-                },
-                "name": "Beverage Store"
-            },
-            "shop/bicycle": {
-                "icon": "bicycle",
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "tags": {
-                    "shop": "bicycle"
-                },
-                "name": "Bicycle Shop"
-            },
-            "shop/bookmaker": {
-                "icon": "shop",
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "tags": {
-                    "shop": "bookmaker"
-                },
-                "name": "Bookmaker"
-            },
-            "shop/books": {
-                "icon": "shop",
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "tags": {
-                    "shop": "books"
-                },
-                "name": "Book Store"
-            },
-            "shop/boutique": {
-                "icon": "shop",
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "tags": {
-                    "shop": "boutique"
-                },
-                "name": "Boutique"
-            },
-            "shop/butcher": {
-                "icon": "slaughterhouse",
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "terms": [
-                    "meat"
-                ],
-                "tags": {
-                    "shop": "butcher"
-                },
-                "name": "Butcher"
-            },
-            "shop/candles": {
-                "icon": "shop",
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "tags": {
-                    "shop": "candles"
-                },
-                "name": "Candle Shop"
-            },
-            "shop/car": {
-                "icon": "car",
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "terms": [
-                    "auto"
-                ],
-                "tags": {
-                    "shop": "car"
-                },
-                "name": "Car Dealership"
-            },
-            "shop/car_parts": {
-                "icon": "car",
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "terms": [
-                    "auto"
-                ],
-                "tags": {
-                    "shop": "car_parts"
-                },
-                "name": "Car Parts Store"
-            },
-            "shop/car_repair": {
-                "icon": "car",
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "terms": [
-                    "auto"
-                ],
-                "tags": {
-                    "shop": "car_repair"
-                },
-                "name": "Car Repair Shop"
-            },
-            "shop/carpet": {
-                "icon": "shop",
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "terms": [
-                    "rug"
-                ],
-                "tags": {
-                    "shop": "carpet"
-                },
-                "name": "Carpet Store"
-            },
-            "shop/cheese": {
-                "icon": "shop",
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "tags": {
-                    "shop": "cheese"
-                },
-                "name": "Cheese Store"
-            },
-            "shop/chemist": {
-                "icon": "chemist",
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "tags": {
-                    "shop": "chemist"
-                },
-                "name": "Chemist"
-            },
-            "shop/chocolate": {
-                "icon": "shop",
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "tags": {
-                    "shop": "chocolate"
-                },
-                "name": "Chocolate Store"
-            },
-            "shop/clothes": {
-                "icon": "clothing-store",
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "tags": {
-                    "shop": "clothes"
-                },
-                "name": "Clothing Store"
-            },
-            "shop/computer": {
-                "icon": "shop",
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "tags": {
-                    "shop": "computer"
-                },
-                "name": "Computer Store"
-            },
-            "shop/confectionery": {
-                "icon": "shop",
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "tags": {
-                    "shop": "confectionery"
-                },
-                "name": "Candy Store"
-            },
-            "shop/convenience": {
-                "icon": "shop",
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "tags": {
-                    "shop": "convenience"
-                },
-                "name": "Convenience Store"
-            },
-            "shop/copyshop": {
-                "icon": "shop",
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "tags": {
-                    "shop": "copyshop"
-                },
-                "name": "Copy Store"
-            },
-            "shop/cosmetics": {
-                "icon": "shop",
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "tags": {
-                    "shop": "cosmetics"
-                },
-                "name": "Cosmetics Store"
-            },
-            "shop/craft": {
-                "icon": "art-gallery",
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "tags": {
-                    "shop": "craft"
-                },
-                "name": "Arts and Crafts Store"
-            },
-            "shop/curtain": {
-                "icon": "shop",
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "terms": [
-                    "drape*",
-                    "window"
-                ],
-                "tags": {
-                    "shop": "curtain"
-                },
-                "name": "Curtain Store"
-            },
-            "shop/dairy": {
-                "icon": "shop",
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "terms": [
-                    "milk",
-                    "egg",
-                    "cheese"
-                ],
-                "tags": {
-                    "shop": "dairy"
-                },
-                "name": "Dairy Store"
-            },
-            "shop/deli": {
-                "icon": "restaurant",
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "terms": [
-                    "lunch",
-                    "meat",
-                    "sandwich"
-                ],
-                "tags": {
-                    "shop": "deli"
-                },
-                "name": "Deli"
-            },
-            "shop/department_store": {
-                "icon": "shop",
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "tags": {
-                    "shop": "department_store"
-                },
-                "name": "Department Store"
-            },
-            "shop/doityourself": {
-                "icon": "shop",
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "tags": {
-                    "shop": "doityourself"
-                },
-                "name": "DIY Store"
-            },
-            "shop/dry_cleaning": {
-                "icon": "shop",
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "tags": {
-                    "shop": "dry_cleaning"
-                },
-                "name": "Dry Cleaner"
-            },
-            "shop/electronics": {
-                "icon": "shop",
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "terms": [
-                    "appliance",
-                    "audio",
-                    "computer",
-                    "tv"
-                ],
-                "tags": {
-                    "shop": "electronics"
-                },
-                "name": "Electronics Store"
-            },
-            "shop/erotic": {
-                "icon": "shop",
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "terms": [
-                    "sex",
-                    "porn"
-                ],
-                "tags": {
-                    "shop": "erotic"
-                },
-                "name": "Erotic Store"
-            },
-            "shop/fabric": {
-                "icon": "shop",
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "terms": [
-                    "sew"
-                ],
-                "tags": {
-                    "shop": "fabric"
-                },
-                "name": "Fabric Store"
-            },
-            "shop/farm": {
-                "icon": "shop",
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "terms": [
-                    "farm shop",
-                    "farm stand"
-                ],
-                "tags": {
-                    "shop": "farm"
-                },
-                "name": "Produce Stand"
-            },
-            "shop/fashion": {
-                "icon": "shop",
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "tags": {
-                    "shop": "fashion"
-                },
-                "name": "Fashion Store"
-            },
-            "shop/fishmonger": {
-                "icon": "shop",
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "tags": {
-                    "shop": "fishmonger"
-                },
-                "name": "Fishmonger",
-                "searchable": false
-            },
-            "shop/florist": {
-                "icon": "shop",
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "terms": [
-                    "flower"
-                ],
-                "tags": {
-                    "shop": "florist"
-                },
-                "name": "Florist"
-            },
-            "shop/frame": {
-                "icon": "shop",
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "tags": {
-                    "shop": "frame"
-                },
-                "name": "Framing Shop"
-            },
-            "shop/funeral_directors": {
-                "icon": "cemetery",
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "religion",
-                    "denomination"
-                ],
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "terms": [
-                    "undertaker",
-                    "memorial home"
-                ],
-                "tags": {
-                    "shop": "funeral_directors"
-                },
-                "name": "Funeral Home"
-            },
-            "shop/furnace": {
-                "icon": "shop",
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "terms": [
-                    "oven",
-                    "stove"
-                ],
-                "tags": {
-                    "shop": "furnace"
-                },
-                "name": "Furnace Store"
-            },
-            "shop/furniture": {
-                "icon": "shop",
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "terms": [
-                    "chair",
-                    "sofa",
-                    "table"
-                ],
-                "tags": {
-                    "shop": "furniture"
-                },
-                "name": "Furniture Store"
-            },
-            "shop/garden_centre": {
-                "icon": "shop",
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "terms": [
-                    "landscape",
-                    "mulch",
-                    "shrub",
-                    "tree"
-                ],
-                "tags": {
-                    "shop": "garden_centre"
-                },
-                "name": "Garden Center"
-            },
-            "shop/gift": {
-                "icon": "gift",
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "tags": {
-                    "shop": "gift"
-                },
-                "name": "Gift Shop"
-            },
-            "shop/greengrocer": {
-                "icon": "shop",
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "terms": [
-                    "fruit",
-                    "vegetable"
-                ],
-                "tags": {
-                    "shop": "greengrocer"
-                },
-                "name": "Greengrocer"
-            },
-            "shop/hairdresser": {
-                "icon": "hairdresser",
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "tags": {
-                    "shop": "hairdresser"
-                },
-                "name": "Hairdresser"
-            },
-            "shop/hardware": {
-                "icon": "shop",
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "tags": {
-                    "shop": "hardware"
-                },
-                "name": "Hardware Store"
-            },
-            "shop/hearing_aids": {
-                "icon": "shop",
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "tags": {
-                    "shop": "hearing_aids"
-                },
-                "name": "Hearing Aids Store"
-            },
-            "shop/herbalist": {
-                "icon": "shop",
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "tags": {
-                    "shop": "herbalist"
-                },
-                "name": "Herbalist"
-            },
-            "shop/hifi": {
-                "icon": "shop",
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "terms": [
-                    "stereo",
-                    "video"
-                ],
-                "tags": {
-                    "shop": "hifi"
-                },
-                "name": "Hifi Store"
-            },
-            "shop/interior_decoration": {
-                "icon": "shop",
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "tags": {
-                    "shop": "interior_decoration"
-                },
-                "name": "Interior Decoration Store"
-            },
-            "shop/jewelry": {
-                "icon": "shop",
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "terms": [
-                    "diamond",
-                    "gem",
-                    "ring"
-                ],
-                "tags": {
-                    "shop": "jewelry"
-                },
-                "name": "Jeweler"
-            },
-            "shop/kiosk": {
-                "icon": "shop",
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "tags": {
-                    "shop": "kiosk"
-                },
-                "name": "News Kiosk"
-            },
-            "shop/kitchen": {
-                "icon": "shop",
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "tags": {
-                    "shop": "kitchen"
-                },
-                "name": "Kitchen Design Store"
-            },
-            "shop/laundry": {
-                "icon": "laundry",
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "tags": {
-                    "shop": "laundry"
-                },
-                "name": "Laundry"
-            },
-            "shop/leather": {
-                "icon": "shop",
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "tags": {
-                    "shop": "leather"
-                },
-                "name": "Leather Store"
-            },
-            "shop/locksmith": {
-                "icon": "shop",
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "terms": [
-                    "key",
-                    "lockpick"
-                ],
-                "tags": {
-                    "shop": "locksmith"
-                },
-                "name": "Locksmith"
-            },
-            "shop/lottery": {
-                "icon": "shop",
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "tags": {
-                    "shop": "lottery"
-                },
-                "name": "Lottery Shop"
-            },
-            "shop/mall": {
-                "icon": "shop",
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "tags": {
-                    "shop": "mall"
-                },
-                "name": "Mall"
-            },
-            "shop/massage": {
-                "icon": "shop",
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "tags": {
-                    "shop": "massage"
-                },
-                "name": "Massage Shop"
-            },
-            "shop/medical_supply": {
-                "icon": "shop",
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "tags": {
-                    "shop": "medical_supply"
-                },
-                "name": "Medical Supply Store"
-            },
-            "shop/mobile_phone": {
-                "icon": "mobilephone",
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "tags": {
-                    "shop": "mobile_phone"
-                },
-                "name": "Mobile Phone Store"
-            },
-            "shop/money_lender": {
-                "icon": "bank",
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "tags": {
-                    "shop": "money_lender"
-                },
-                "name": "Money Lender"
-            },
-            "shop/motorcycle": {
-                "icon": "scooter",
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "tags": {
-                    "shop": "motorcycle"
-                },
-                "name": "Motorcycle Dealership"
-            },
-            "shop/music": {
-                "icon": "music",
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "terms": [
-                    "CD",
-                    "vinyl"
-                ],
-                "tags": {
-                    "shop": "music"
-                },
-                "name": "Music Store"
-            },
-            "shop/musical_instrument": {
-                "icon": "music",
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "tags": {
-                    "shop": "musical_instrument"
-                },
-                "name": "Musical Instrument Store"
-            },
-            "shop/newsagent": {
-                "icon": "shop",
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "tags": {
-                    "shop": "newsagent"
-                },
-                "name": "Newspaper/Magazine Shop"
-            },
-            "shop/optician": {
-                "icon": "shop",
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "terms": [
-                    "eye",
-                    "glasses"
-                ],
-                "tags": {
-                    "shop": "optician"
-                },
-                "name": "Optician"
-            },
-            "shop/organic": {
-                "icon": "shop",
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "tags": {
-                    "shop": "supermarket",
-                    "organic": "only"
-                },
-                "name": "Organic Goods Store"
-            },
-            "shop/outdoor": {
-                "icon": "shop",
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "terms": [
-                    "camping",
-                    "climbing",
-                    "hiking"
-                ],
-                "tags": {
-                    "shop": "outdoor"
-                },
-                "name": "Outdoors Store"
-            },
-            "shop/paint": {
-                "icon": "water",
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "tags": {
-                    "shop": "paint"
-                },
-                "name": "Paint Store"
-            },
-            "shop/pawnbroker": {
-                "icon": "shop",
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "tags": {
-                    "shop": "pawnbroker"
-                },
-                "name": "Pawn Shop"
-            },
-            "shop/pet": {
-                "icon": "dog-park",
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "terms": [
-                    "cat",
-                    "dog",
-                    "fish"
-                ],
-                "tags": {
-                    "shop": "pet"
-                },
-                "name": "Pet Store"
-            },
-            "shop/photo": {
-                "icon": "camera",
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "terms": [
-                    "camera",
-                    "film"
-                ],
-                "tags": {
-                    "shop": "photo"
-                },
-                "name": "Photography Store"
-            },
-            "shop/pyrotechnics": {
-                "icon": "shop",
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "tags": {
-                    "shop": "pyrotechnics"
-                },
-                "name": "Fireworks Store"
-            },
-            "shop/radiotechnics": {
-                "icon": "shop",
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "tags": {
-                    "shop": "radiotechnics"
-                },
-                "name": "Radio/Electronic Component Store"
-            },
-            "shop/religion": {
-                "icon": "shop",
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours",
-                    "religion",
-                    "denomination"
-                ],
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "tags": {
-                    "shop": "religion"
-                },
-                "name": "Religious Store"
-            },
-            "shop/scuba_diving": {
-                "icon": "swimming",
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "tags": {
-                    "shop": "scuba_diving"
-                },
-                "name": "Scuba Diving Shop"
-            },
-            "shop/seafood": {
-                "icon": "shop",
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "terms": [
-                    "fishmonger"
-                ],
-                "tags": {
-                    "shop": "seafood"
-                },
-                "name": "Seafood Shop"
-            },
-            "shop/second_hand": {
-                "icon": "shop",
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "terms": [
-                    "secondhand",
-                    "second hand",
-                    "resale",
-                    "thrift",
-                    "used"
-                ],
-                "tags": {
-                    "shop": "second_hand"
-                },
-                "name": "Consignment/Thrift Store"
-            },
-            "shop/shoes": {
-                "icon": "shop",
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "tags": {
-                    "shop": "shoes"
-                },
-                "name": "Shoe Store"
-            },
-            "shop/sports": {
-                "icon": "shop",
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "tags": {
-                    "shop": "sports"
-                },
-                "name": "Sporting Goods Store"
-            },
-            "shop/stationery": {
-                "icon": "shop",
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "terms": [
-                    "card",
-                    "paper"
-                ],
-                "tags": {
-                    "shop": "stationery"
-                },
-                "name": "Stationery Store"
-            },
-            "shop/supermarket": {
-                "icon": "grocery",
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "terms": [
-                    "grocery",
-                    "store",
-                    "shop"
-                ],
-                "tags": {
-                    "shop": "supermarket"
-                },
-                "name": "Supermarket"
-            },
-            "shop/tailor": {
-                "icon": "clothing-store",
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "terms": [
-                    "clothes",
-                    "suit"
-                ],
-                "tags": {
-                    "shop": "tailor"
-                },
-                "name": "Tailor"
-            },
-            "shop/tattoo": {
-                "icon": "shop",
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "tags": {
-                    "shop": "tattoo"
-                },
-                "name": "Tattoo Parlor"
-            },
-            "shop/tea": {
-                "icon": "cafe",
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "tags": {
-                    "shop": "tea"
-                },
-                "name": "Tea Store"
-            },
-            "shop/ticket": {
-                "icon": "shop",
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "tags": {
-                    "shop": "ticket"
-                },
-                "name": "Ticket Seller"
-            },
-            "shop/tobacco": {
-                "icon": "shop",
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "tags": {
-                    "shop": "tobacco"
-                },
-                "name": "Tobacco Shop"
-            },
-            "shop/toys": {
-                "icon": "shop",
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "tags": {
-                    "shop": "toys"
-                },
-                "name": "Toy Store"
-            },
-            "shop/travel_agency": {
-                "icon": "suitcase",
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "tags": {
-                    "shop": "travel_agency"
-                },
-                "name": "Travel Agency"
-            },
-            "shop/tyres": {
-                "icon": "shop",
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "tags": {
-                    "shop": "tyres"
-                },
-                "name": "Tire Store"
-            },
-            "shop/vacant": {
-                "icon": "shop",
-                "fields": [
-                    "address",
-                    "building_area"
-                ],
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "tags": {
-                    "shop": "vacant"
-                },
-                "name": "Vacant Shop",
-                "searchable": false
-            },
-            "shop/vacuum_cleaner": {
-                "icon": "shop",
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "tags": {
-                    "shop": "vacuum_cleaner"
-                },
-                "name": "Vacuum Cleaner Store"
-            },
-            "shop/variety_store": {
-                "icon": "shop",
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "tags": {
-                    "shop": "variety_store"
-                },
-                "name": "Variety Store"
-            },
-            "shop/video": {
-                "icon": "shop",
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "terms": [
-                    "DVD"
-                ],
-                "tags": {
-                    "shop": "video"
-                },
-                "name": "Video Store"
-            },
-            "shop/video_games": {
-                "icon": "shop",
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "tags": {
-                    "shop": "video_games"
-                },
-                "name": "Video Game Store"
-            },
-            "shop/water_sports": {
-                "icon": "shop",
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "tags": {
-                    "shop": "water_sports"
-                },
-                "name": "Watersport/Swim Shop"
-            },
-            "shop/weapons": {
-                "icon": "shop",
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "terms": [
-                    "ammo",
-                    "gun",
-                    "knife",
-                    "knives"
-                ],
-                "tags": {
-                    "shop": "weapons"
-                },
-                "name": "Weapon Shop"
-            },
-            "shop/window_blind": {
-                "icon": "shop",
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "tags": {
-                    "shop": "window_blind"
-                },
-                "name": "Window Blind Store"
-            },
-            "shop/wine": {
-                "icon": "alcohol-shop",
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "tags": {
-                    "shop": "wine"
-                },
-                "name": "Wine Shop"
-            },
-            "tourism": {
-                "fields": [
-                    "tourism"
-                ],
-                "geometry": [
-                    "point",
-                    "vertex",
-                    "area"
-                ],
-                "tags": {
-                    "tourism": "*"
-                },
-                "name": "Tourism"
-            },
-            "tourism/alpine_hut": {
-                "icon": "lodging",
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area"
-                ],
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "tags": {
-                    "tourism": "alpine_hut"
-                },
-                "name": "Alpine Hut"
-            },
-            "tourism/artwork": {
-                "icon": "art-gallery",
-                "fields": [
-                    "artwork_type",
-                    "artist"
-                ],
-                "geometry": [
-                    "point",
-                    "vertex",
-                    "area"
-                ],
-                "tags": {
-                    "tourism": "artwork"
-                },
-                "terms": [
-                    "mural",
-                    "sculpture",
-                    "statue"
-                ],
-                "name": "Artwork"
-            },
-            "tourism/attraction": {
-                "icon": "monument",
-                "fields": [
-                    "operator",
-                    "address"
-                ],
-                "geometry": [
-                    "point",
-                    "vertex",
-                    "area"
-                ],
-                "tags": {
-                    "tourism": "attraction"
-                },
-                "name": "Tourist Attraction"
-            },
-            "tourism/camp_site": {
-                "icon": "campsite",
-                "fields": [
-                    "operator",
-                    "address"
-                ],
-                "geometry": [
-                    "point",
-                    "vertex",
-                    "area"
-                ],
-                "tags": {
-                    "tourism": "camp_site"
-                },
-                "name": "Camp Site"
-            },
-            "tourism/caravan_site": {
-                "fields": [
-                    "operator",
-                    "address",
-                    "smoking"
-                ],
-                "geometry": [
-                    "point",
-                    "vertex",
-                    "area"
-                ],
-                "tags": {
-                    "tourism": "caravan_site"
-                },
-                "name": "RV Park"
-            },
-            "tourism/chalet": {
-                "icon": "lodging",
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "smoking"
-                ],
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "tags": {
-                    "tourism": "chalet"
-                },
-                "name": "Chalet"
-            },
-            "tourism/guest_house": {
-                "icon": "lodging",
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "smoking"
-                ],
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "tags": {
-                    "tourism": "guest_house"
-                },
-                "terms": [
-                    "B&B",
-                    "Bed and Breakfast"
-                ],
-                "name": "Guest House"
-            },
-            "tourism/hostel": {
-                "icon": "lodging",
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "smoking"
-                ],
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "tags": {
-                    "tourism": "hostel"
-                },
-                "name": "Hostel"
-            },
-            "tourism/hotel": {
-                "icon": "lodging",
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "smoking"
-                ],
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "tags": {
-                    "tourism": "hotel"
-                },
-                "name": "Hotel"
-            },
-            "tourism/information": {
-                "fields": [
-                    "information",
-                    "operator",
-                    "address",
-                    "building_area"
-                ],
-                "geometry": [
-                    "point",
-                    "vertex",
-                    "area"
-                ],
-                "tags": {
-                    "tourism": "information"
-                },
-                "name": "Information"
-            },
-            "tourism/motel": {
-                "icon": "lodging",
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "smoking"
-                ],
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "tags": {
-                    "tourism": "motel"
-                },
-                "name": "Motel"
-            },
-            "tourism/museum": {
-                "icon": "museum",
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "terms": [
-                    "exhibition",
-                    "foundation",
-                    "gallery",
-                    "hall",
-                    "institution"
-                ],
-                "tags": {
-                    "tourism": "museum"
-                },
-                "name": "Museum"
-            },
-            "tourism/picnic_site": {
-                "icon": "park",
-                "fields": [
-                    "operator",
-                    "address",
-                    "smoking"
-                ],
-                "geometry": [
-                    "point",
-                    "vertex",
-                    "area"
-                ],
-                "terms": [
-                    "camp"
-                ],
-                "tags": {
-                    "tourism": "picnic_site"
-                },
-                "name": "Picnic Site"
-            },
-            "tourism/theme_park": {
-                "fields": [
-                    "operator",
-                    "address",
-                    "opening_hours"
-                ],
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "tags": {
-                    "tourism": "theme_park"
-                },
-                "name": "Theme Park"
-            },
-            "tourism/viewpoint": {
-                "geometry": [
-                    "point",
-                    "vertex"
-                ],
-                "tags": {
-                    "tourism": "viewpoint"
-                },
-                "name": "Viewpoint"
-            },
-            "tourism/zoo": {
-                "icon": "zoo",
-                "fields": [
-                    "operator",
-                    "address",
-                    "opening_hours"
-                ],
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "tags": {
-                    "tourism": "zoo"
-                },
-                "name": "Zoo"
-            },
-            "traffic_calming/bump": {
-                "fields": [
-                    "surface"
-                ],
-                "geometry": [
-                    "vertex"
-                ],
-                "tags": {
-                    "traffic_calming": "bump"
-                },
-                "terms": [
-                    "speed hump"
-                ],
-                "name": "Speed Bump"
-            },
-            "traffic_calming/hump": {
-                "fields": [
-                    "surface"
-                ],
-                "geometry": [
-                    "vertex"
-                ],
-                "tags": {
-                    "traffic_calming": "hump"
-                },
-                "terms": [
-                    "speed bump"
-                ],
-                "name": "Speed Hump"
-            },
-            "traffic_calming/rumble_strip": {
-                "geometry": [
-                    "vertex"
-                ],
-                "tags": {
-                    "traffic_calming": "rumble_strip"
-                },
-                "terms": [
-                    "sleeper lines",
-                    "audible lines",
-                    "growlers"
-                ],
-                "name": "Rumble Strip"
-            },
-            "traffic_calming/table": {
-                "fields": [
-                    "surface"
-                ],
-                "geometry": [
-                    "vertex"
-                ],
-                "tags": {
-                    "highway": "crossing",
-                    "traffic_calming": "table"
-                },
-                "terms": [
-                    "speed table",
-                    "flat top hump"
-                ],
-                "name": "Raised Pedestrian Crossing"
-            },
-            "type/boundary": {
-                "geometry": [
-                    "relation"
-                ],
-                "tags": {
-                    "type": "boundary"
-                },
-                "name": "Boundary",
-                "icon": "boundary",
-                "fields": [
-                    "boundary"
-                ]
-            },
-            "type/boundary/administrative": {
-                "name": "Administrative Boundary",
-                "geometry": [
-                    "relation"
-                ],
-                "tags": {
-                    "type": "boundary",
-                    "boundary": "administrative"
-                },
-                "fields": [
-                    "admin_level"
-                ],
-                "icon": "boundary"
-            },
-            "type/multipolygon": {
-                "geometry": [
-                    "area",
-                    "relation"
-                ],
-                "tags": {
-                    "type": "multipolygon"
-                },
-                "removeTags": {},
-                "name": "Multipolygon",
-                "icon": "multipolygon",
-                "searchable": false,
-                "matchScore": 0.1
-            },
-            "type/restriction": {
-                "geometry": [
-                    "relation"
-                ],
-                "tags": {
-                    "type": "restriction"
-                },
-                "name": "Restriction",
-                "icon": "restriction",
-                "fields": [
-                    "restriction",
-                    "except"
-                ]
-            },
-            "type/restriction/no_left_turn": {
-                "name": "No Left Turn",
-                "geometry": [
-                    "relation"
-                ],
-                "tags": {
-                    "type": "restriction",
-                    "restriction": "no_left_turn"
-                },
-                "fields": [
-                    "except"
-                ],
-                "icon": "restriction-no-left-turn"
-            },
-            "type/restriction/no_right_turn": {
-                "name": "No Right Turn",
-                "geometry": [
-                    "relation"
-                ],
-                "tags": {
-                    "type": "restriction",
-                    "restriction": "no_right_turn"
-                },
-                "fields": [
-                    "except"
-                ],
-                "icon": "restriction-no-right-turn"
-            },
-            "type/restriction/no_straight_on": {
-                "name": "No Straight On",
-                "geometry": [
-                    "relation"
-                ],
-                "tags": {
-                    "type": "restriction",
-                    "restriction": "no_straight_on"
-                },
-                "fields": [
-                    "except"
-                ],
-                "icon": "restriction-no-straight-on"
-            },
-            "type/restriction/no_u_turn": {
-                "name": "No U-turn",
-                "geometry": [
-                    "relation"
-                ],
-                "tags": {
-                    "type": "restriction",
-                    "restriction": "no_u_turn"
-                },
-                "fields": [
-                    "except"
-                ],
-                "icon": "restriction-no-u-turn"
-            },
-            "type/restriction/only_left_turn": {
-                "name": "Left Turn Only",
-                "geometry": [
-                    "relation"
-                ],
-                "tags": {
-                    "type": "restriction",
-                    "restriction": "only_left_turn"
-                },
-                "fields": [
-                    "except"
-                ],
-                "icon": "restriction-only-left-turn"
-            },
-            "type/restriction/only_right_turn": {
-                "name": "Right Turn Only",
-                "geometry": [
-                    "relation"
-                ],
-                "tags": {
-                    "type": "restriction",
-                    "restriction": "only_right_turn"
-                },
-                "fields": [
-                    "except"
-                ],
-                "icon": "restriction-only-right-turn"
-            },
-            "type/restriction/only_straight_on": {
-                "name": "No Turns",
-                "geometry": [
-                    "relation"
-                ],
-                "tags": {
-                    "type": "restriction",
-                    "restriction": "only_straight_on"
-                },
-                "fields": [
-                    "except"
-                ],
-                "icon": "restriction-only-straight-on"
-            },
-            "type/route": {
-                "geometry": [
-                    "relation"
-                ],
-                "tags": {
-                    "type": "route"
-                },
-                "name": "Route",
-                "icon": "route",
-                "fields": [
-                    "route",
-                    "ref"
-                ]
-            },
-            "type/route/bicycle": {
-                "geometry": [
-                    "relation"
-                ],
-                "tags": {
-                    "type": "route",
-                    "route": "bicycle"
-                },
-                "name": "Cycle Route",
-                "icon": "route-bicycle",
-                "fields": [
-                    "ref",
-                    "network"
-                ]
-            },
-            "type/route/bus": {
-                "geometry": [
-                    "relation"
-                ],
-                "tags": {
-                    "type": "route",
-                    "route": "bus"
-                },
-                "name": "Bus Route",
-                "icon": "route-bus",
-                "fields": [
-                    "ref",
-                    "operator",
-                    "network"
-                ]
-            },
-            "type/route/detour": {
-                "geometry": [
-                    "relation"
-                ],
-                "tags": {
-                    "type": "route",
-                    "route": "detour"
-                },
-                "name": "Detour Route",
-                "icon": "route-detour",
-                "fields": [
-                    "ref"
-                ]
-            },
-            "type/route/ferry": {
-                "geometry": [
-                    "relation"
-                ],
-                "tags": {
-                    "type": "route",
-                    "route": "ferry"
-                },
-                "name": "Ferry Route",
-                "icon": "route-ferry",
-                "fields": [
-                    "ref",
-                    "operator",
-                    "network"
-                ]
-            },
-            "type/route/foot": {
-                "geometry": [
-                    "relation"
-                ],
-                "tags": {
-                    "type": "route",
-                    "route": "foot"
-                },
-                "name": "Foot Route",
-                "icon": "route-foot",
-                "fields": [
-                    "ref",
-                    "operator",
-                    "network"
-                ]
-            },
-            "type/route/hiking": {
-                "geometry": [
-                    "relation"
-                ],
-                "tags": {
-                    "type": "route",
-                    "route": "hiking"
-                },
-                "name": "Hiking Route",
-                "icon": "route-foot",
-                "fields": [
-                    "ref",
-                    "operator",
-                    "network"
-                ]
-            },
-            "type/route/pipeline": {
-                "geometry": [
-                    "relation"
-                ],
-                "tags": {
-                    "type": "route",
-                    "route": "pipeline"
-                },
-                "name": "Pipeline Route",
-                "icon": "route-pipeline",
-                "fields": [
-                    "ref",
-                    "operator"
-                ]
-            },
-            "type/route/power": {
-                "geometry": [
-                    "relation"
-                ],
-                "tags": {
-                    "type": "route",
-                    "route": "power"
-                },
-                "name": "Power Route",
-                "icon": "route-power",
-                "fields": [
-                    "ref",
-                    "operator"
-                ]
-            },
-            "type/route/road": {
-                "geometry": [
-                    "relation"
-                ],
-                "tags": {
-                    "type": "route",
-                    "route": "road"
-                },
-                "name": "Road Route",
-                "icon": "route-road",
-                "fields": [
-                    "ref",
-                    "network"
-                ]
-            },
-            "type/route/train": {
-                "geometry": [
-                    "relation"
-                ],
-                "tags": {
-                    "type": "route",
-                    "route": "train"
-                },
-                "name": "Train Route",
-                "icon": "route-train",
-                "fields": [
-                    "ref",
-                    "operator"
-                ]
-            },
-            "type/route/tram": {
-                "geometry": [
-                    "relation"
-                ],
-                "tags": {
-                    "type": "route",
-                    "route": "tram"
-                },
-                "name": "Tram Route",
-                "icon": "route-tram",
-                "fields": [
-                    "ref",
-                    "operator"
-                ]
-            },
-            "type/route_master": {
-                "geometry": [
-                    "relation"
-                ],
-                "tags": {
-                    "type": "route_master"
-                },
-                "name": "Route Master",
-                "icon": "route-master",
-                "fields": [
-                    "route_master",
-                    "ref",
-                    "operator",
-                    "network"
-                ]
-            },
-            "vertex": {
-                "name": "Other",
-                "tags": {},
-                "geometry": [
-                    "vertex"
-                ],
-                "matchScore": 0.1
-            },
-            "waterway": {
-                "fields": [
-                    "waterway"
-                ],
-                "geometry": [
-                    "point",
-                    "vertex",
-                    "line",
-                    "area"
-                ],
-                "tags": {
-                    "waterway": "*"
-                },
-                "name": "Waterway"
-            },
-            "waterway/canal": {
-                "icon": "waterway-canal",
-                "fields": [
-                    "width"
-                ],
-                "geometry": [
-                    "line"
-                ],
-                "tags": {
-                    "waterway": "canal"
-                },
-                "name": "Canal"
-            },
-            "waterway/dam": {
-                "icon": "dam",
-                "geometry": [
-                    "point",
-                    "vertex",
-                    "line",
-                    "area"
-                ],
-                "tags": {
-                    "waterway": "dam"
-                },
-                "name": "Dam"
-            },
-            "waterway/ditch": {
-                "icon": "waterway-ditch",
-                "fields": [
-                    "tunnel"
-                ],
-                "geometry": [
-                    "line"
-                ],
-                "tags": {
-                    "waterway": "ditch"
-                },
-                "name": "Ditch"
-            },
-            "waterway/drain": {
-                "icon": "waterway-stream",
-                "fields": [
-                    "tunnel"
-                ],
-                "geometry": [
-                    "line"
-                ],
-                "tags": {
-                    "waterway": "drain"
-                },
-                "name": "Drain"
-            },
-            "waterway/river": {
-                "icon": "waterway-river",
-                "fields": [
-                    "tunnel",
-                    "width"
-                ],
-                "geometry": [
-                    "line"
-                ],
-                "terms": [
-                    "beck",
-                    "branch",
-                    "brook",
-                    "course",
-                    "creek",
-                    "estuary",
-                    "rill",
-                    "rivulet",
-                    "run",
-                    "runnel",
-                    "stream",
-                    "tributary",
-                    "watercourse"
-                ],
-                "tags": {
-                    "waterway": "river"
-                },
-                "name": "River"
-            },
-            "waterway/riverbank": {
-                "icon": "water",
-                "geometry": [
-                    "area"
-                ],
-                "tags": {
-                    "waterway": "riverbank"
-                },
-                "name": "Riverbank"
-            },
-            "waterway/stream": {
-                "icon": "waterway-stream",
-                "fields": [
-                    "tunnel",
-                    "width"
-                ],
-                "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/weir": {
-                "icon": "dam",
-                "geometry": [
-                    "vertex",
-                    "line"
-                ],
-                "tags": {
-                    "waterway": "weir"
-                },
-                "name": "Weir"
-            },
-            "amenity/fuel/76": {
-                "tags": {
-                    "name": "76",
-                    "amenity": "fuel"
-                },
-                "name": "76",
-                "icon": "fuel",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/fuel/Neste": {
-                "tags": {
-                    "name": "Neste",
-                    "amenity": "fuel"
-                },
-                "name": "Neste",
-                "icon": "fuel",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/fuel/BP": {
-                "tags": {
-                    "name": "BP",
-                    "amenity": "fuel"
-                },
-                "name": "BP",
-                "icon": "fuel",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/fuel/Shell": {
-                "tags": {
-                    "name": "Shell",
-                    "amenity": "fuel"
-                },
-                "name": "Shell",
-                "icon": "fuel",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/fuel/Agip": {
-                "tags": {
-                    "name": "Agip",
-                    "amenity": "fuel"
-                },
-                "name": "Agip",
-                "icon": "fuel",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/fuel/Migrol": {
-                "tags": {
-                    "name": "Migrol",
-                    "amenity": "fuel"
-                },
-                "name": "Migrol",
-                "icon": "fuel",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/fuel/Avia": {
-                "tags": {
-                    "name": "Avia",
-                    "amenity": "fuel"
-                },
-                "name": "Avia",
-                "icon": "fuel",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/fuel/Texaco": {
-                "tags": {
-                    "name": "Texaco",
-                    "amenity": "fuel"
-                },
-                "name": "Texaco",
-                "icon": "fuel",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/fuel/Total": {
-                "tags": {
-                    "name": "Total",
-                    "amenity": "fuel"
-                },
-                "name": "Total",
-                "icon": "fuel",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/fuel/Statoil": {
-                "tags": {
-                    "name": "Statoil",
-                    "amenity": "fuel"
-                },
-                "name": "Statoil",
-                "icon": "fuel",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/fuel/Esso": {
-                "tags": {
-                    "name": "Esso",
-                    "amenity": "fuel"
-                },
-                "name": "Esso",
-                "icon": "fuel",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/fuel/Jet": {
-                "tags": {
-                    "name": "Jet",
-                    "amenity": "fuel"
-                },
-                "name": "Jet",
-                "icon": "fuel",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/fuel/Avanti": {
-                "tags": {
-                    "name": "Avanti",
-                    "amenity": "fuel"
-                },
-                "name": "Avanti",
-                "icon": "fuel",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/fuel/OMV": {
-                "tags": {
-                    "name": "OMV",
-                    "amenity": "fuel"
-                },
-                "name": "OMV",
-                "icon": "fuel",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/fuel/Aral": {
-                "tags": {
-                    "name": "Aral",
-                    "amenity": "fuel"
-                },
-                "name": "Aral",
-                "icon": "fuel",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/fuel/JET": {
-                "tags": {
-                    "name": "JET",
-                    "amenity": "fuel"
-                },
-                "name": "JET",
-                "icon": "fuel",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/fuel/United": {
-                "tags": {
-                    "name": "United",
-                    "amenity": "fuel"
-                },
-                "name": "United",
-                "icon": "fuel",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/fuel/Mobil": {
-                "tags": {
-                    "name": "Mobil",
-                    "amenity": "fuel"
-                },
-                "name": "Mobil",
-                "icon": "fuel",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/fuel/Caltex": {
-                "tags": {
-                    "name": "Caltex",
-                    "amenity": "fuel"
-                },
-                "name": "Caltex",
-                "icon": "fuel",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/fuel/Sunoco": {
-                "tags": {
-                    "name": "Sunoco",
-                    "amenity": "fuel"
-                },
-                "name": "Sunoco",
-                "icon": "fuel",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/fuel/Q8": {
-                "tags": {
-                    "name": "Q8",
-                    "amenity": "fuel"
-                },
-                "name": "Q8",
-                "icon": "fuel",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/fuel/ARAL": {
-                "tags": {
-                    "name": "ARAL",
-                    "amenity": "fuel"
-                },
-                "name": "ARAL",
-                "icon": "fuel",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/fuel/CEPSA": {
-                "tags": {
-                    "name": "CEPSA",
-                    "amenity": "fuel"
-                },
-                "name": "CEPSA",
-                "icon": "fuel",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/fuel/BFT": {
-                "tags": {
-                    "name": "BFT",
-                    "amenity": "fuel"
-                },
-                "name": "BFT",
-                "icon": "fuel",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/fuel/Petron": {
-                "tags": {
-                    "name": "Petron",
-                    "amenity": "fuel"
-                },
-                "name": "Petron",
-                "icon": "fuel",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/fuel/Total Access": {
-                "tags": {
-                    "name": "Total Access",
-                    "amenity": "fuel"
-                },
-                "name": "Total Access",
-                "icon": "fuel",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/fuel/Elf": {
-                "tags": {
-                    "name": "Elf",
-                    "amenity": "fuel"
-                },
-                "name": "Elf",
-                "icon": "fuel",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/fuel/Station Service E. Leclerc": {
-                "tags": {
-                    "name": "Station Service E. Leclerc",
-                    "amenity": "fuel"
-                },
-                "name": "Station Service E. Leclerc",
-                "icon": "fuel",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/fuel/Shell Express": {
-                "tags": {
-                    "name": "Shell Express",
-                    "amenity": "fuel"
-                },
-                "name": "Shell Express",
-                "icon": "fuel",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/fuel/Hess": {
-                "tags": {
-                    "name": "Hess",
-                    "amenity": "fuel"
-                },
-                "name": "Hess",
-                "icon": "fuel",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/fuel/Flying V": {
-                "tags": {
-                    "name": "Flying V",
-                    "amenity": "fuel"
-                },
-                "name": "Flying V",
-                "icon": "fuel",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/fuel/bft": {
-                "tags": {
-                    "name": "bft",
-                    "amenity": "fuel"
-                },
-                "name": "bft",
-                "icon": "fuel",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/fuel/Gulf": {
-                "tags": {
-                    "name": "Gulf",
-                    "amenity": "fuel"
-                },
-                "name": "Gulf",
-                "icon": "fuel",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/fuel/PTT": {
-                "tags": {
-                    "name": "PTT",
-                    "amenity": "fuel"
-                },
-                "name": "PTT",
-                "icon": "fuel",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/fuel/St1": {
-                "tags": {
-                    "name": "St1",
-                    "amenity": "fuel"
-                },
-                "name": "St1",
-                "icon": "fuel",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/fuel/Teboil": {
-                "tags": {
-                    "name": "Teboil",
-                    "amenity": "fuel"
-                },
-                "name": "Teboil",
-                "icon": "fuel",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/fuel/HEM": {
-                "tags": {
-                    "name": "HEM",
-                    "amenity": "fuel"
-                },
-                "name": "HEM",
-                "icon": "fuel",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/fuel/GALP": {
-                "tags": {
-                    "name": "GALP",
-                    "amenity": "fuel"
-                },
-                "name": "GALP",
-                "icon": "fuel",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/fuel/OK": {
-                "tags": {
-                    "name": "OK",
-                    "amenity": "fuel"
-                },
-                "name": "OK",
-                "icon": "fuel",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/fuel/ÖMV": {
-                "tags": {
-                    "name": "ÖMV",
-                    "amenity": "fuel"
-                },
-                "name": "ÖMV",
-                "icon": "fuel",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/fuel/Tinq": {
-                "tags": {
-                    "name": "Tinq",
-                    "amenity": "fuel"
-                },
-                "name": "Tinq",
-                "icon": "fuel",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/fuel/OKQ8": {
-                "tags": {
-                    "name": "OKQ8",
-                    "amenity": "fuel"
-                },
-                "name": "OKQ8",
-                "icon": "fuel",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/fuel/Repsol": {
-                "tags": {
-                    "name": "Repsol",
-                    "amenity": "fuel"
-                },
-                "name": "Repsol",
-                "icon": "fuel",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/fuel/Westfalen": {
-                "tags": {
-                    "name": "Westfalen",
-                    "amenity": "fuel"
-                },
-                "name": "Westfalen",
-                "icon": "fuel",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/fuel/Esso Express": {
-                "tags": {
-                    "name": "Esso Express",
-                    "amenity": "fuel"
-                },
-                "name": "Esso Express",
-                "icon": "fuel",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/fuel/Tamoil": {
-                "tags": {
-                    "name": "Tamoil",
-                    "amenity": "fuel"
-                },
-                "name": "Tamoil",
-                "icon": "fuel",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/fuel/Engen": {
-                "tags": {
-                    "name": "Engen",
-                    "amenity": "fuel"
-                },
-                "name": "Engen",
-                "icon": "fuel",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/fuel/Sasol": {
-                "tags": {
-                    "name": "Sasol",
-                    "amenity": "fuel"
-                },
-                "name": "Sasol",
-                "icon": "fuel",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/fuel/Topaz": {
-                "tags": {
-                    "name": "Topaz",
-                    "amenity": "fuel"
-                },
-                "name": "Topaz",
-                "icon": "fuel",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/fuel/LPG": {
-                "tags": {
-                    "name": "LPG",
-                    "amenity": "fuel"
-                },
-                "name": "LPG",
-                "icon": "fuel",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/fuel/Orlen": {
-                "tags": {
-                    "name": "Orlen",
-                    "amenity": "fuel"
-                },
-                "name": "Orlen",
-                "icon": "fuel",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/fuel/Oilibya": {
-                "tags": {
-                    "name": "Oilibya",
-                    "amenity": "fuel"
-                },
-                "name": "Oilibya",
-                "icon": "fuel",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/fuel/Tango": {
-                "tags": {
-                    "name": "Tango",
-                    "amenity": "fuel"
-                },
-                "name": "Tango",
-                "icon": "fuel",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/fuel/Star": {
-                "tags": {
-                    "name": "Star",
-                    "amenity": "fuel"
-                },
-                "name": "Star",
-                "icon": "fuel",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/fuel/Петрол": {
-                "tags": {
-                    "name": "Петрол",
-                    "amenity": "fuel"
-                },
-                "name": "Петрол",
-                "icon": "fuel",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/fuel/Cepsa": {
-                "tags": {
-                    "name": "Cepsa",
-                    "amenity": "fuel"
-                },
-                "name": "Cepsa",
-                "icon": "fuel",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/fuel/OIL!": {
-                "tags": {
-                    "name": "OIL!",
-                    "amenity": "fuel"
-                },
-                "name": "OIL!",
-                "icon": "fuel",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/fuel/Ultramar": {
-                "tags": {
-                    "name": "Ultramar",
-                    "amenity": "fuel"
-                },
-                "name": "Ultramar",
-                "icon": "fuel",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/fuel/Irving": {
-                "tags": {
-                    "name": "Irving",
-                    "amenity": "fuel"
-                },
-                "name": "Irving",
-                "icon": "fuel",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/fuel/Lukoil": {
-                "tags": {
-                    "name": "Lukoil",
-                    "amenity": "fuel"
-                },
-                "name": "Lukoil",
-                "icon": "fuel",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/fuel/Petro-Canada": {
-                "tags": {
-                    "name": "Petro-Canada",
-                    "amenity": "fuel"
-                },
-                "name": "Petro-Canada",
-                "icon": "fuel",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/fuel/Agrola": {
-                "tags": {
-                    "name": "Agrola",
-                    "amenity": "fuel"
-                },
-                "name": "Agrola",
-                "icon": "fuel",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/fuel/Husky": {
-                "tags": {
-                    "name": "Husky",
-                    "amenity": "fuel"
-                },
-                "name": "Husky",
-                "icon": "fuel",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/fuel/Slovnaft": {
-                "tags": {
-                    "name": "Slovnaft",
-                    "amenity": "fuel"
-                },
-                "name": "Slovnaft",
-                "icon": "fuel",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/fuel/Sheetz": {
-                "tags": {
-                    "name": "Sheetz",
-                    "amenity": "fuel"
-                },
-                "name": "Sheetz",
-                "icon": "fuel",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/fuel/Mol": {
-                "tags": {
-                    "name": "Mol",
-                    "amenity": "fuel"
-                },
-                "name": "Mol",
-                "icon": "fuel",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/fuel/Petronas": {
-                "tags": {
-                    "name": "Petronas",
-                    "amenity": "fuel"
-                },
-                "name": "Petronas",
-                "icon": "fuel",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/fuel/Газпромнефть": {
-                "tags": {
-                    "name": "Газпромнефть",
-                    "amenity": "fuel"
-                },
-                "name": "Газпромнефть",
-                "icon": "fuel",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/fuel/Лукойл": {
-                "tags": {
-                    "name": "Лукойл",
-                    "amenity": "fuel"
-                },
-                "name": "Лукойл",
-                "icon": "fuel",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/fuel/Elan": {
-                "tags": {
-                    "name": "Elan",
-                    "amenity": "fuel"
-                },
-                "name": "Elan",
-                "icon": "fuel",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/fuel/Роснефть": {
-                "tags": {
-                    "name": "Роснефть",
-                    "amenity": "fuel"
-                },
-                "name": "Роснефть",
-                "icon": "fuel",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/fuel/Turmöl": {
-                "tags": {
-                    "name": "Turmöl",
-                    "amenity": "fuel"
-                },
-                "name": "Turmöl",
-                "icon": "fuel",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/fuel/Neste A24": {
-                "tags": {
-                    "name": "Neste A24",
-                    "amenity": "fuel"
-                },
-                "name": "Neste A24",
-                "icon": "fuel",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/fuel/Marathon": {
-                "tags": {
-                    "name": "Marathon",
-                    "amenity": "fuel"
-                },
-                "name": "Marathon",
-                "icon": "fuel",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/fuel/Valero": {
-                "tags": {
-                    "name": "Valero",
-                    "amenity": "fuel"
-                },
-                "name": "Valero",
-                "icon": "fuel",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/fuel/Eni": {
-                "tags": {
-                    "name": "Eni",
-                    "amenity": "fuel"
-                },
-                "name": "Eni",
-                "icon": "fuel",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/fuel/Chevron": {
-                "tags": {
-                    "name": "Chevron",
-                    "amenity": "fuel"
-                },
-                "name": "Chevron",
-                "icon": "fuel",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/fuel/ТНК": {
-                "tags": {
-                    "name": "ТНК",
-                    "amenity": "fuel"
-                },
-                "name": "ТНК",
-                "icon": "fuel",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/fuel/REPSOL": {
-                "tags": {
-                    "name": "REPSOL",
-                    "amenity": "fuel"
-                },
-                "name": "REPSOL",
-                "icon": "fuel",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/fuel/MOL": {
-                "tags": {
-                    "name": "MOL",
-                    "amenity": "fuel"
-                },
-                "name": "MOL",
-                "icon": "fuel",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/fuel/Bliska": {
-                "tags": {
-                    "name": "Bliska",
-                    "amenity": "fuel"
-                },
-                "name": "Bliska",
-                "icon": "fuel",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/fuel/Api": {
-                "tags": {
-                    "name": "Api",
-                    "amenity": "fuel"
-                },
-                "name": "Api",
-                "icon": "fuel",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/fuel/Arco": {
-                "tags": {
-                    "name": "Arco",
-                    "amenity": "fuel"
-                },
-                "name": "Arco",
-                "icon": "fuel",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/fuel/Pemex": {
-                "tags": {
-                    "name": "Pemex",
-                    "amenity": "fuel"
-                },
-                "name": "Pemex",
-                "icon": "fuel",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/fuel/Exxon": {
-                "tags": {
-                    "name": "Exxon",
-                    "amenity": "fuel"
-                },
-                "name": "Exxon",
-                "icon": "fuel",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/fuel/Coles Express": {
-                "tags": {
-                    "name": "Coles Express",
-                    "amenity": "fuel"
-                },
-                "name": "Coles Express",
-                "icon": "fuel",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/fuel/Petrom": {
-                "tags": {
-                    "name": "Petrom",
-                    "amenity": "fuel"
-                },
-                "name": "Petrom",
-                "icon": "fuel",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/fuel/PETRONOR": {
-                "tags": {
-                    "name": "PETRONOR",
-                    "amenity": "fuel"
-                },
-                "name": "PETRONOR",
-                "icon": "fuel",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/fuel/Rompetrol": {
-                "tags": {
-                    "name": "Rompetrol",
-                    "amenity": "fuel"
-                },
-                "name": "Rompetrol",
-                "icon": "fuel",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/fuel/Lotos": {
-                "tags": {
-                    "name": "Lotos",
-                    "amenity": "fuel"
-                },
-                "name": "Lotos",
-                "icon": "fuel",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/fuel/ОМВ": {
-                "tags": {
-                    "name": "ОМВ",
-                    "amenity": "fuel"
-                },
-                "name": "ОМВ",
-                "icon": "fuel",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/fuel/BR": {
-                "tags": {
-                    "name": "BR",
-                    "amenity": "fuel"
-                },
-                "name": "BR",
-                "icon": "fuel",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/fuel/Copec": {
-                "tags": {
-                    "name": "Copec",
-                    "amenity": "fuel"
-                },
-                "name": "Copec",
-                "icon": "fuel",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/fuel/Petrobras": {
-                "tags": {
-                    "name": "Petrobras",
-                    "amenity": "fuel"
-                },
-                "name": "Petrobras",
-                "icon": "fuel",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/fuel/Liberty": {
-                "tags": {
-                    "name": "Liberty",
-                    "amenity": "fuel"
-                },
-                "name": "Liberty",
-                "icon": "fuel",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/fuel/IP": {
-                "tags": {
-                    "name": "IP",
-                    "amenity": "fuel"
-                },
-                "name": "IP",
-                "icon": "fuel",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/fuel/Erg": {
-                "tags": {
-                    "name": "Erg",
-                    "amenity": "fuel"
-                },
-                "name": "Erg",
-                "icon": "fuel",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/fuel/Eneos": {
-                "tags": {
-                    "name": "Eneos",
-                    "amenity": "fuel"
-                },
-                "name": "Eneos",
-                "icon": "fuel",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/fuel/Citgo": {
-                "tags": {
-                    "name": "Citgo",
-                    "amenity": "fuel"
-                },
-                "name": "Citgo",
-                "icon": "fuel",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/fuel/Metano": {
-                "tags": {
-                    "name": "Metano",
-                    "amenity": "fuel"
-                },
-                "name": "Metano",
-                "icon": "fuel",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/fuel/Сургутнефтегаз": {
-                "tags": {
-                    "name": "Сургутнефтегаз",
-                    "amenity": "fuel"
-                },
-                "name": "Сургутнефтегаз",
-                "icon": "fuel",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/fuel/EKO": {
-                "tags": {
-                    "name": "EKO",
-                    "amenity": "fuel"
-                },
-                "name": "EKO",
-                "icon": "fuel",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/fuel/Eko": {
-                "tags": {
-                    "name": "Eko",
-                    "amenity": "fuel"
-                },
-                "name": "Eko",
-                "icon": "fuel",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/fuel/Indipend.": {
-                "tags": {
-                    "name": "Indipend.",
-                    "amenity": "fuel"
-                },
-                "name": "Indipend.",
-                "icon": "fuel",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/fuel/IES": {
-                "tags": {
-                    "name": "IES",
-                    "amenity": "fuel"
-                },
-                "name": "IES",
-                "icon": "fuel",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/fuel/TotalErg": {
-                "tags": {
-                    "name": "TotalErg",
-                    "amenity": "fuel"
-                },
-                "name": "TotalErg",
-                "icon": "fuel",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/fuel/Cenex": {
-                "tags": {
-                    "name": "Cenex",
-                    "amenity": "fuel"
-                },
-                "name": "Cenex",
-                "icon": "fuel",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/fuel/ПТК": {
-                "tags": {
-                    "name": "ПТК",
-                    "amenity": "fuel"
-                },
-                "name": "ПТК",
-                "icon": "fuel",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/fuel/HP": {
-                "tags": {
-                    "name": "HP",
-                    "amenity": "fuel"
-                },
-                "name": "HP",
-                "icon": "fuel",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/fuel/Phillips 66": {
-                "tags": {
-                    "name": "Phillips 66",
-                    "amenity": "fuel"
-                },
-                "name": "Phillips 66",
-                "icon": "fuel",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/fuel/CARREFOUR": {
-                "tags": {
-                    "name": "CARREFOUR",
-                    "amenity": "fuel"
-                },
-                "name": "CARREFOUR",
-                "icon": "fuel",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/fuel/ERG": {
-                "tags": {
-                    "name": "ERG",
-                    "amenity": "fuel"
-                },
-                "name": "ERG",
-                "icon": "fuel",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/fuel/Speedway": {
-                "tags": {
-                    "name": "Speedway",
-                    "amenity": "fuel"
-                },
-                "name": "Speedway",
-                "icon": "fuel",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/fuel/Benzina": {
-                "tags": {
-                    "name": "Benzina",
-                    "amenity": "fuel"
-                },
-                "name": "Benzina",
-                "icon": "fuel",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/fuel/Татнефть": {
-                "tags": {
-                    "name": "Татнефть",
-                    "amenity": "fuel"
-                },
-                "name": "Татнефть",
-                "icon": "fuel",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/fuel/Terpel": {
-                "tags": {
-                    "name": "Terpel",
-                    "amenity": "fuel"
-                },
-                "name": "Terpel",
-                "icon": "fuel",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/fuel/WOG": {
-                "tags": {
-                    "name": "WOG",
-                    "amenity": "fuel"
-                },
-                "name": "WOG",
-                "icon": "fuel",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/fuel/Seaoil": {
-                "tags": {
-                    "name": "Seaoil",
-                    "amenity": "fuel"
-                },
-                "name": "Seaoil",
-                "icon": "fuel",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/fuel/АЗС": {
-                "tags": {
-                    "name": "АЗС",
-                    "amenity": "fuel"
-                },
-                "name": "АЗС",
-                "icon": "fuel",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/fuel/Kwik Trip": {
-                "tags": {
-                    "name": "Kwik Trip",
-                    "amenity": "fuel"
-                },
-                "name": "Kwik Trip",
-                "icon": "fuel",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/fuel/Pertamina": {
-                "tags": {
-                    "name": "Pertamina",
-                    "amenity": "fuel"
-                },
-                "name": "Pertamina",
-                "icon": "fuel",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/fuel/COSMO": {
-                "tags": {
-                    "name": "COSMO",
-                    "amenity": "fuel"
-                },
-                "name": "COSMO",
-                "icon": "fuel",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/fuel/Z": {
-                "tags": {
-                    "name": "Z",
-                    "amenity": "fuel"
-                },
-                "name": "Z",
-                "icon": "fuel",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/fuel/Indian Oil": {
-                "tags": {
-                    "name": "Indian Oil",
-                    "amenity": "fuel"
-                },
-                "name": "Indian Oil",
-                "icon": "fuel",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/fuel/АГЗС": {
-                "tags": {
-                    "name": "АГЗС",
-                    "amenity": "fuel"
-                },
-                "name": "АГЗС",
-                "icon": "fuel",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/fuel/INA": {
-                "tags": {
-                    "name": "INA",
-                    "amenity": "fuel"
-                },
-                "name": "INA",
-                "icon": "fuel",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/fuel/JOMO": {
-                "tags": {
-                    "name": "JOMO",
-                    "amenity": "fuel"
-                },
-                "name": "JOMO",
-                "icon": "fuel",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/fuel/Holiday": {
-                "tags": {
-                    "name": "Holiday",
-                    "amenity": "fuel"
-                },
-                "name": "Holiday",
-                "icon": "fuel",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/fuel/YPF": {
-                "tags": {
-                    "name": "YPF",
-                    "amenity": "fuel"
-                },
-                "name": "YPF",
-                "icon": "fuel",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/fuel/IDEMITSU": {
-                "tags": {
-                    "name": "IDEMITSU",
-                    "amenity": "fuel"
-                },
-                "name": "IDEMITSU",
-                "icon": "fuel",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/fuel/ENEOS": {
-                "tags": {
-                    "name": "ENEOS",
-                    "amenity": "fuel"
-                },
-                "name": "ENEOS",
-                "icon": "fuel",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/fuel/Stacja paliw": {
-                "tags": {
-                    "name": "Stacja paliw",
-                    "amenity": "fuel"
-                },
-                "name": "Stacja paliw",
-                "icon": "fuel",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/fuel/Bharat Petroleum": {
-                "tags": {
-                    "name": "Bharat Petroleum",
-                    "amenity": "fuel"
-                },
-                "name": "Bharat Petroleum",
-                "icon": "fuel",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/fuel/CAMPSA": {
-                "tags": {
-                    "name": "CAMPSA",
-                    "amenity": "fuel"
-                },
-                "name": "CAMPSA",
-                "icon": "fuel",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/fuel/Casey's General Store": {
-                "tags": {
-                    "name": "Casey's General Store",
-                    "amenity": "fuel"
-                },
-                "name": "Casey's General Store",
-                "icon": "fuel",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/fuel/Башнефть": {
-                "tags": {
-                    "name": "Башнефть",
-                    "amenity": "fuel"
-                },
-                "name": "Башнефть",
-                "icon": "fuel",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/fuel/Kangaroo": {
-                "tags": {
-                    "name": "Kangaroo",
-                    "amenity": "fuel"
-                },
-                "name": "Kangaroo",
-                "icon": "fuel",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/fuel/コスモ石油 (COSMO)": {
-                "tags": {
-                    "name": "コスモ石油 (COSMO)",
-                    "amenity": "fuel"
-                },
-                "name": "コスモ石油 (COSMO)",
-                "icon": "fuel",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/fuel/MEROIL": {
-                "tags": {
-                    "name": "MEROIL",
-                    "amenity": "fuel"
-                },
-                "name": "MEROIL",
-                "icon": "fuel",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/fuel/1-2-3": {
-                "tags": {
-                    "name": "1-2-3",
-                    "amenity": "fuel"
-                },
-                "name": "1-2-3",
-                "icon": "fuel",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/fuel/出光": {
-                "tags": {
-                    "name": "出光",
-                    "name:en": "IDEMITSU",
-                    "amenity": "fuel"
-                },
-                "name": "出光",
-                "icon": "fuel",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/fuel/НК Альянс": {
-                "tags": {
-                    "name": "НК Альянс",
-                    "amenity": "fuel"
-                },
-                "name": "НК Альянс",
-                "icon": "fuel",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/fuel/Sinclair": {
-                "tags": {
-                    "name": "Sinclair",
-                    "amenity": "fuel"
-                },
-                "name": "Sinclair",
-                "icon": "fuel",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/fuel/Conoco": {
-                "tags": {
-                    "name": "Conoco",
-                    "amenity": "fuel"
-                },
-                "name": "Conoco",
-                "icon": "fuel",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/fuel/SPBU": {
-                "tags": {
-                    "name": "SPBU",
-                    "amenity": "fuel"
-                },
-                "name": "SPBU",
-                "icon": "fuel",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/fuel/Макпетрол": {
-                "tags": {
-                    "name": "Макпетрол",
-                    "amenity": "fuel"
-                },
-                "name": "Макпетрол",
-                "icon": "fuel",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/fuel/Posto Ipiranga": {
-                "tags": {
-                    "name": "Posto Ipiranga",
-                    "amenity": "fuel"
-                },
-                "name": "Posto Ipiranga",
-                "icon": "fuel",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/fuel/Posto Shell": {
-                "tags": {
-                    "name": "Posto Shell",
-                    "amenity": "fuel"
-                },
-                "name": "Posto Shell",
-                "icon": "fuel",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/fuel/Phoenix": {
-                "tags": {
-                    "name": "Phoenix",
-                    "amenity": "fuel"
-                },
-                "name": "Phoenix",
-                "icon": "fuel",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/fuel/Ipiranga": {
-                "tags": {
-                    "name": "Ipiranga",
-                    "amenity": "fuel"
-                },
-                "name": "Ipiranga",
-                "icon": "fuel",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/fuel/OKKO": {
-                "tags": {
-                    "name": "OKKO",
-                    "amenity": "fuel"
-                },
-                "name": "OKKO",
-                "icon": "fuel",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/fuel/ОККО": {
-                "tags": {
-                    "name": "ОККО",
-                    "amenity": "fuel"
-                },
-                "name": "ОККО",
-                "icon": "fuel",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/fuel/บางจาก": {
-                "tags": {
-                    "name": "บางจาก",
-                    "amenity": "fuel"
-                },
-                "name": "บางจาก",
-                "icon": "fuel",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/fuel/QuikTrip": {
-                "tags": {
-                    "name": "QuikTrip",
-                    "amenity": "fuel"
-                },
-                "name": "QuikTrip",
-                "icon": "fuel",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/fuel/Posto BR": {
-                "tags": {
-                    "name": "Posto BR",
-                    "amenity": "fuel"
-                },
-                "name": "Posto BR",
-                "icon": "fuel",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/fuel/ป ต ท": {
-                "tags": {
-                    "name": "ป ต ท",
-                    "amenity": "fuel"
-                },
-                "name": "ป ต ท",
-                "icon": "fuel",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/fuel/ปตท": {
-                "tags": {
-                    "name": "ปตท",
-                    "amenity": "fuel"
-                },
-                "name": "ปตท",
-                "icon": "fuel",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/fuel/ANP": {
-                "tags": {
-                    "name": "ANP",
-                    "amenity": "fuel"
-                },
-                "name": "ANP",
-                "icon": "fuel",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/fuel/Kum & Go": {
-                "tags": {
-                    "name": "Kum & Go",
-                    "amenity": "fuel"
-                },
-                "name": "Kum & Go",
-                "icon": "fuel",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/fuel/Petrolimex": {
-                "tags": {
-                    "name": "Petrolimex",
-                    "amenity": "fuel"
-                },
-                "name": "Petrolimex",
-                "icon": "fuel",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/fuel/Sokimex": {
-                "tags": {
-                    "name": "Sokimex",
-                    "amenity": "fuel"
-                },
-                "name": "Sokimex",
-                "icon": "fuel",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/fuel/Tela": {
-                "tags": {
-                    "name": "Tela",
-                    "amenity": "fuel"
-                },
-                "name": "Tela",
-                "icon": "fuel",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/fuel/Posto": {
-                "tags": {
-                    "name": "Posto",
-                    "amenity": "fuel"
-                },
-                "name": "Posto",
-                "icon": "fuel",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/fuel/Укрнафта": {
-                "tags": {
-                    "name": "Укрнафта",
-                    "amenity": "fuel"
-                },
-                "name": "Укрнафта",
-                "icon": "fuel",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/fuel/Татнефтепродукт": {
-                "tags": {
-                    "name": "Татнефтепродукт",
-                    "amenity": "fuel"
-                },
-                "name": "Татнефтепродукт",
-                "icon": "fuel",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/fuel/Afriquia": {
-                "tags": {
-                    "name": "Afriquia",
-                    "amenity": "fuel"
-                },
-                "name": "Afriquia",
-                "icon": "fuel",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/fuel/Murphy USA": {
-                "tags": {
-                    "name": "Murphy USA",
-                    "amenity": "fuel"
-                },
-                "name": "Murphy USA",
-                "icon": "fuel",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/fuel/昭和シェル (Showa-shell)": {
-                "tags": {
-                    "name": "昭和シェル (Showa-shell)",
-                    "amenity": "fuel"
-                },
-                "name": "昭和シェル (Showa-shell)",
-                "icon": "fuel",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/fuel/エネオス": {
-                "tags": {
-                    "name": "エネオス",
-                    "amenity": "fuel"
-                },
-                "name": "エネオス",
-                "icon": "fuel",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/fuel/CNG": {
-                "tags": {
-                    "name": "CNG",
-                    "amenity": "fuel"
-                },
-                "name": "CNG",
-                "icon": "fuel",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/pub/Kings Arms": {
-                "tags": {
-                    "name": "Kings Arms",
-                    "amenity": "pub"
-                },
-                "name": "Kings Arms",
-                "icon": "beer",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "address",
-                    "building_area",
-                    "opening_hours",
-                    "smoking"
-                ],
-                "suggestion": true
-            },
-            "amenity/pub/The Ship": {
-                "tags": {
-                    "name": "The Ship",
-                    "amenity": "pub"
-                },
-                "name": "The Ship",
-                "icon": "beer",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "address",
-                    "building_area",
-                    "opening_hours",
-                    "smoking"
-                ],
-                "suggestion": true
-            },
-            "amenity/pub/The White Horse": {
-                "tags": {
-                    "name": "The White Horse",
-                    "amenity": "pub"
-                },
-                "name": "The White Horse",
-                "icon": "beer",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "address",
-                    "building_area",
-                    "opening_hours",
-                    "smoking"
-                ],
-                "suggestion": true
-            },
-            "amenity/pub/The White Hart": {
-                "tags": {
-                    "name": "The White Hart",
-                    "amenity": "pub"
-                },
-                "name": "The White Hart",
-                "icon": "beer",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "address",
-                    "building_area",
-                    "opening_hours",
-                    "smoking"
-                ],
-                "suggestion": true
-            },
-            "amenity/pub/Royal Oak": {
-                "tags": {
-                    "name": "Royal Oak",
-                    "amenity": "pub"
-                },
-                "name": "Royal Oak",
-                "icon": "beer",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "address",
-                    "building_area",
-                    "opening_hours",
-                    "smoking"
-                ],
-                "suggestion": true
-            },
-            "amenity/pub/The Red Lion": {
-                "tags": {
-                    "name": "The Red Lion",
-                    "amenity": "pub"
-                },
-                "name": "The Red Lion",
-                "icon": "beer",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "address",
-                    "building_area",
-                    "opening_hours",
-                    "smoking"
-                ],
-                "suggestion": true
-            },
-            "amenity/pub/The Kings Arms": {
-                "tags": {
-                    "name": "The Kings Arms",
-                    "amenity": "pub"
-                },
-                "name": "The Kings Arms",
-                "icon": "beer",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "address",
-                    "building_area",
-                    "opening_hours",
-                    "smoking"
-                ],
-                "suggestion": true
-            },
-            "amenity/pub/The Star": {
-                "tags": {
-                    "name": "The Star",
-                    "amenity": "pub"
-                },
-                "name": "The Star",
-                "icon": "beer",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "address",
-                    "building_area",
-                    "opening_hours",
-                    "smoking"
-                ],
-                "suggestion": true
-            },
-            "amenity/pub/The Anchor": {
-                "tags": {
-                    "name": "The Anchor",
-                    "amenity": "pub"
-                },
-                "name": "The Anchor",
-                "icon": "beer",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "address",
-                    "building_area",
-                    "opening_hours",
-                    "smoking"
-                ],
-                "suggestion": true
-            },
-            "amenity/pub/The Cross Keys": {
-                "tags": {
-                    "name": "The Cross Keys",
-                    "amenity": "pub"
-                },
-                "name": "The Cross Keys",
-                "icon": "beer",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "address",
-                    "building_area",
-                    "opening_hours",
-                    "smoking"
-                ],
-                "suggestion": true
-            },
-            "amenity/pub/The Wheatsheaf": {
-                "tags": {
-                    "name": "The Wheatsheaf",
-                    "amenity": "pub"
-                },
-                "name": "The Wheatsheaf",
-                "icon": "beer",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "address",
-                    "building_area",
-                    "opening_hours",
-                    "smoking"
-                ],
-                "suggestion": true
-            },
-            "amenity/pub/The Crown Inn": {
-                "tags": {
-                    "name": "The Crown Inn",
-                    "amenity": "pub"
-                },
-                "name": "The Crown Inn",
-                "icon": "beer",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "address",
-                    "building_area",
-                    "opening_hours",
-                    "smoking"
-                ],
-                "suggestion": true
-            },
-            "amenity/pub/The Kings Head": {
-                "tags": {
-                    "name": "The Kings Head",
-                    "amenity": "pub"
-                },
-                "name": "The Kings Head",
-                "icon": "beer",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "address",
-                    "building_area",
-                    "opening_hours",
-                    "smoking"
-                ],
-                "suggestion": true
-            },
-            "amenity/pub/The Castle": {
-                "tags": {
-                    "name": "The Castle",
-                    "amenity": "pub"
-                },
-                "name": "The Castle",
-                "icon": "beer",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "address",
-                    "building_area",
-                    "opening_hours",
-                    "smoking"
-                ],
-                "suggestion": true
-            },
-            "amenity/pub/The Railway": {
-                "tags": {
-                    "name": "The Railway",
-                    "amenity": "pub"
-                },
-                "name": "The Railway",
-                "icon": "beer",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "address",
-                    "building_area",
-                    "opening_hours",
-                    "smoking"
-                ],
-                "suggestion": true
-            },
-            "amenity/pub/The White Lion": {
-                "tags": {
-                    "name": "The White Lion",
-                    "amenity": "pub"
-                },
-                "name": "The White Lion",
-                "icon": "beer",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "address",
-                    "building_area",
-                    "opening_hours",
-                    "smoking"
-                ],
-                "suggestion": true
-            },
-            "amenity/pub/The Bell": {
-                "tags": {
-                    "name": "The Bell",
-                    "amenity": "pub"
-                },
-                "name": "The Bell",
-                "icon": "beer",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "address",
-                    "building_area",
-                    "opening_hours",
-                    "smoking"
-                ],
-                "suggestion": true
-            },
-            "amenity/pub/The Bull": {
-                "tags": {
-                    "name": "The Bull",
-                    "amenity": "pub"
-                },
-                "name": "The Bull",
-                "icon": "beer",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "address",
-                    "building_area",
-                    "opening_hours",
-                    "smoking"
-                ],
-                "suggestion": true
-            },
-            "amenity/pub/The Plough": {
-                "tags": {
-                    "name": "The Plough",
-                    "amenity": "pub"
-                },
-                "name": "The Plough",
-                "icon": "beer",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "address",
-                    "building_area",
-                    "opening_hours",
-                    "smoking"
-                ],
-                "suggestion": true
-            },
-            "amenity/pub/The George": {
-                "tags": {
-                    "name": "The George",
-                    "amenity": "pub"
-                },
-                "name": "The George",
-                "icon": "beer",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "address",
-                    "building_area",
-                    "opening_hours",
-                    "smoking"
-                ],
-                "suggestion": true
-            },
-            "amenity/pub/The Royal Oak": {
-                "tags": {
-                    "name": "The Royal Oak",
-                    "amenity": "pub"
-                },
-                "name": "The Royal Oak",
-                "icon": "beer",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "address",
-                    "building_area",
-                    "opening_hours",
-                    "smoking"
-                ],
-                "suggestion": true
-            },
-            "amenity/pub/The Fox": {
-                "tags": {
-                    "name": "The Fox",
-                    "amenity": "pub"
-                },
-                "name": "The Fox",
-                "icon": "beer",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "address",
-                    "building_area",
-                    "opening_hours",
-                    "smoking"
-                ],
-                "suggestion": true
-            },
-            "amenity/pub/Prince of Wales": {
-                "tags": {
-                    "name": "Prince of Wales",
-                    "amenity": "pub"
-                },
-                "name": "Prince of Wales",
-                "icon": "beer",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "address",
-                    "building_area",
-                    "opening_hours",
-                    "smoking"
-                ],
-                "suggestion": true
-            },
-            "amenity/pub/The Rising Sun": {
-                "tags": {
-                    "name": "The Rising Sun",
-                    "amenity": "pub"
-                },
-                "name": "The Rising Sun",
-                "icon": "beer",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "address",
-                    "building_area",
-                    "opening_hours",
-                    "smoking"
-                ],
-                "suggestion": true
-            },
-            "amenity/pub/The Prince of Wales": {
-                "tags": {
-                    "name": "The Prince of Wales",
-                    "amenity": "pub"
-                },
-                "name": "The Prince of Wales",
-                "icon": "beer",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "address",
-                    "building_area",
-                    "opening_hours",
-                    "smoking"
-                ],
-                "suggestion": true
-            },
-            "amenity/pub/The Crown": {
-                "tags": {
-                    "name": "The Crown",
-                    "amenity": "pub"
-                },
-                "name": "The Crown",
-                "icon": "beer",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "address",
-                    "building_area",
-                    "opening_hours",
-                    "smoking"
-                ],
-                "suggestion": true
-            },
-            "amenity/pub/The Chequers": {
-                "tags": {
-                    "name": "The Chequers",
-                    "amenity": "pub"
-                },
-                "name": "The Chequers",
-                "icon": "beer",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "address",
-                    "building_area",
-                    "opening_hours",
-                    "smoking"
-                ],
-                "suggestion": true
-            },
-            "amenity/pub/The Swan": {
-                "tags": {
-                    "name": "The Swan",
-                    "amenity": "pub"
-                },
-                "name": "The Swan",
-                "icon": "beer",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "address",
-                    "building_area",
-                    "opening_hours",
-                    "smoking"
-                ],
-                "suggestion": true
-            },
-            "amenity/pub/Rose and Crown": {
-                "tags": {
-                    "name": "Rose and Crown",
-                    "amenity": "pub"
-                },
-                "name": "Rose and Crown",
-                "icon": "beer",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "address",
-                    "building_area",
-                    "opening_hours",
-                    "smoking"
-                ],
-                "suggestion": true
-            },
-            "amenity/pub/The Victoria": {
-                "tags": {
-                    "name": "The Victoria",
-                    "amenity": "pub"
-                },
-                "name": "The Victoria",
-                "icon": "beer",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "address",
-                    "building_area",
-                    "opening_hours",
-                    "smoking"
-                ],
-                "suggestion": true
-            },
-            "amenity/pub/New Inn": {
-                "tags": {
-                    "name": "New Inn",
-                    "amenity": "pub"
-                },
-                "name": "New Inn",
-                "icon": "beer",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "address",
-                    "building_area",
-                    "opening_hours",
-                    "smoking"
-                ],
-                "suggestion": true
-            },
-            "amenity/pub/Royal Hotel": {
-                "tags": {
-                    "name": "Royal Hotel",
-                    "amenity": "pub"
-                },
-                "name": "Royal Hotel",
-                "icon": "beer",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "address",
-                    "building_area",
-                    "opening_hours",
-                    "smoking"
-                ],
-                "suggestion": true
-            },
-            "amenity/pub/Red Lion": {
-                "tags": {
-                    "name": "Red Lion",
-                    "amenity": "pub"
-                },
-                "name": "Red Lion",
-                "icon": "beer",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "address",
-                    "building_area",
-                    "opening_hours",
-                    "smoking"
-                ],
-                "suggestion": true
-            },
-            "amenity/pub/Cross Keys": {
-                "tags": {
-                    "name": "Cross Keys",
-                    "amenity": "pub"
-                },
-                "name": "Cross Keys",
-                "icon": "beer",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "address",
-                    "building_area",
-                    "opening_hours",
-                    "smoking"
-                ],
-                "suggestion": true
-            },
-            "amenity/pub/The Greyhound": {
-                "tags": {
-                    "name": "The Greyhound",
-                    "amenity": "pub"
-                },
-                "name": "The Greyhound",
-                "icon": "beer",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "address",
-                    "building_area",
-                    "opening_hours",
-                    "smoking"
-                ],
-                "suggestion": true
-            },
-            "amenity/pub/The Black Horse": {
-                "tags": {
-                    "name": "The Black Horse",
-                    "amenity": "pub"
-                },
-                "name": "The Black Horse",
-                "icon": "beer",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "address",
-                    "building_area",
-                    "opening_hours",
-                    "smoking"
-                ],
-                "suggestion": true
-            },
-            "amenity/pub/The New Inn": {
-                "tags": {
-                    "name": "The New Inn",
-                    "amenity": "pub"
-                },
-                "name": "The New Inn",
-                "icon": "beer",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "address",
-                    "building_area",
-                    "opening_hours",
-                    "smoking"
-                ],
-                "suggestion": true
-            },
-            "amenity/pub/Kings Head": {
-                "tags": {
-                    "name": "Kings Head",
-                    "amenity": "pub"
-                },
-                "name": "Kings Head",
-                "icon": "beer",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "address",
-                    "building_area",
-                    "opening_hours",
-                    "smoking"
-                ],
-                "suggestion": true
-            },
-            "amenity/pub/The Albion": {
-                "tags": {
-                    "name": "The Albion",
-                    "amenity": "pub"
-                },
-                "name": "The Albion",
-                "icon": "beer",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "address",
-                    "building_area",
-                    "opening_hours",
-                    "smoking"
-                ],
-                "suggestion": true
-            },
-            "amenity/pub/The Angel": {
-                "tags": {
-                    "name": "The Angel",
-                    "amenity": "pub"
-                },
-                "name": "The Angel",
-                "icon": "beer",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "address",
-                    "building_area",
-                    "opening_hours",
-                    "smoking"
-                ],
-                "suggestion": true
-            },
-            "amenity/pub/The Queens Head": {
-                "tags": {
-                    "name": "The Queens Head",
-                    "amenity": "pub"
-                },
-                "name": "The Queens Head",
-                "icon": "beer",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "address",
-                    "building_area",
-                    "opening_hours",
-                    "smoking"
-                ],
-                "suggestion": true
-            },
-            "amenity/pub/The Ship Inn": {
-                "tags": {
-                    "name": "The Ship Inn",
-                    "amenity": "pub"
-                },
-                "name": "The Ship Inn",
-                "icon": "beer",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "address",
-                    "building_area",
-                    "opening_hours",
-                    "smoking"
-                ],
-                "suggestion": true
-            },
-            "amenity/pub/Rose & Crown": {
-                "tags": {
-                    "name": "Rose & Crown",
-                    "amenity": "pub"
-                },
-                "name": "Rose & Crown",
-                "icon": "beer",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "address",
-                    "building_area",
-                    "opening_hours",
-                    "smoking"
-                ],
-                "suggestion": true
-            },
-            "amenity/pub/Queens Head": {
-                "tags": {
-                    "name": "Queens Head",
-                    "amenity": "pub"
-                },
-                "name": "Queens Head",
-                "icon": "beer",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "address",
-                    "building_area",
-                    "opening_hours",
-                    "smoking"
-                ],
-                "suggestion": true
-            },
-            "amenity/pub/Irish Pub": {
-                "tags": {
-                    "name": "Irish Pub",
-                    "amenity": "pub"
-                },
-                "name": "Irish Pub",
-                "icon": "beer",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "address",
-                    "building_area",
-                    "opening_hours",
-                    "smoking"
-                ],
-                "suggestion": true
-            },
-            "amenity/fast_food/Quick": {
-                "tags": {
-                    "name": "Quick",
-                    "amenity": "fast_food"
-                },
-                "name": "Quick",
-                "icon": "fast-food",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "cuisine",
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours",
-                    "smoking"
-                ],
-                "suggestion": true
-            },
-            "amenity/fast_food/McDonald's": {
-                "tags": {
-                    "name": "McDonald's",
-                    "cuisine": "burger",
-                    "amenity": "fast_food"
-                },
-                "name": "McDonald's",
-                "icon": "fast-food",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "cuisine",
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours",
-                    "smoking"
-                ],
-                "suggestion": true
-            },
-            "amenity/fast_food/Subway": {
-                "tags": {
-                    "name": "Subway",
-                    "cuisine": "sandwich",
-                    "amenity": "fast_food"
-                },
-                "name": "Subway",
-                "icon": "fast-food",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "cuisine",
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours",
-                    "smoking"
-                ],
-                "suggestion": true
-            },
-            "amenity/fast_food/Burger King": {
-                "tags": {
-                    "name": "Burger King",
-                    "cuisine": "burger",
-                    "amenity": "fast_food"
-                },
-                "name": "Burger King",
-                "icon": "fast-food",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "cuisine",
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours",
-                    "smoking"
-                ],
-                "suggestion": true
-            },
-            "amenity/fast_food/Ali Baba": {
-                "tags": {
-                    "name": "Ali Baba",
-                    "amenity": "fast_food"
-                },
-                "name": "Ali Baba",
-                "icon": "fast-food",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "cuisine",
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours",
-                    "smoking"
-                ],
-                "suggestion": true
-            },
-            "amenity/fast_food/Hungry Jacks": {
-                "tags": {
-                    "name": "Hungry Jacks",
-                    "cuisine": "burger",
-                    "amenity": "fast_food"
-                },
-                "name": "Hungry Jacks",
-                "icon": "fast-food",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "cuisine",
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours",
-                    "smoking"
-                ],
-                "suggestion": true
-            },
-            "amenity/fast_food/Red Rooster": {
-                "tags": {
-                    "name": "Red Rooster",
-                    "amenity": "fast_food"
-                },
-                "name": "Red Rooster",
-                "icon": "fast-food",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "cuisine",
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours",
-                    "smoking"
-                ],
-                "suggestion": true
-            },
-            "amenity/fast_food/KFC": {
-                "tags": {
-                    "name": "KFC",
-                    "cuisine": "chicken",
-                    "amenity": "fast_food"
-                },
-                "name": "KFC",
-                "icon": "fast-food",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "cuisine",
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours",
-                    "smoking"
-                ],
-                "suggestion": true
-            },
-            "amenity/fast_food/Domino's Pizza": {
-                "tags": {
-                    "name": "Domino's Pizza",
-                    "cuisine": "pizza",
-                    "amenity": "fast_food"
-                },
-                "name": "Domino's Pizza",
-                "icon": "fast-food",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "cuisine",
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours",
-                    "smoking"
-                ],
-                "suggestion": true
-            },
-            "amenity/fast_food/Chowking": {
-                "tags": {
-                    "name": "Chowking",
-                    "amenity": "fast_food"
-                },
-                "name": "Chowking",
-                "icon": "fast-food",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "cuisine",
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours",
-                    "smoking"
-                ],
-                "suggestion": true
-            },
-            "amenity/fast_food/Jollibee": {
-                "tags": {
-                    "name": "Jollibee",
-                    "amenity": "fast_food"
-                },
-                "name": "Jollibee",
-                "icon": "fast-food",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "cuisine",
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours",
-                    "smoking"
-                ],
-                "suggestion": true
-            },
-            "amenity/fast_food/Hesburger": {
-                "tags": {
-                    "name": "Hesburger",
-                    "amenity": "fast_food"
-                },
-                "name": "Hesburger",
-                "icon": "fast-food",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "cuisine",
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours",
-                    "smoking"
-                ],
-                "suggestion": true
-            },
-            "amenity/fast_food/肯德基": {
-                "tags": {
-                    "name": "肯德基",
-                    "amenity": "fast_food"
-                },
-                "name": "肯德基",
-                "icon": "fast-food",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "cuisine",
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours",
-                    "smoking"
-                ],
-                "suggestion": true
-            },
-            "amenity/fast_food/Wendy's": {
-                "tags": {
-                    "name": "Wendy's",
-                    "cuisine": "burger",
-                    "amenity": "fast_food"
-                },
-                "name": "Wendy's",
-                "icon": "fast-food",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "cuisine",
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours",
-                    "smoking"
-                ],
-                "suggestion": true
-            },
-            "amenity/fast_food/Tim Hortons": {
-                "tags": {
-                    "name": "Tim Hortons",
-                    "amenity": "fast_food"
-                },
-                "name": "Tim Hortons",
-                "icon": "fast-food",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "cuisine",
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours",
-                    "smoking"
-                ],
-                "suggestion": true
-            },
-            "amenity/fast_food/Steers": {
-                "tags": {
-                    "name": "Steers",
-                    "amenity": "fast_food"
-                },
-                "name": "Steers",
-                "icon": "fast-food",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "cuisine",
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours",
-                    "smoking"
-                ],
-                "suggestion": true
-            },
-            "amenity/fast_food/Hardee's": {
-                "tags": {
-                    "name": "Hardee's",
-                    "cuisine": "burger",
-                    "amenity": "fast_food"
-                },
-                "name": "Hardee's",
-                "icon": "fast-food",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "cuisine",
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours",
-                    "smoking"
-                ],
-                "suggestion": true
-            },
-            "amenity/fast_food/Arby's": {
-                "tags": {
-                    "name": "Arby's",
-                    "amenity": "fast_food"
-                },
-                "name": "Arby's",
-                "icon": "fast-food",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "cuisine",
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours",
-                    "smoking"
-                ],
-                "suggestion": true
-            },
-            "amenity/fast_food/A&W": {
-                "tags": {
-                    "name": "A&W",
-                    "amenity": "fast_food"
-                },
-                "name": "A&W",
-                "icon": "fast-food",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "cuisine",
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours",
-                    "smoking"
-                ],
-                "suggestion": true
-            },
-            "amenity/fast_food/Dairy Queen": {
-                "tags": {
-                    "name": "Dairy Queen",
-                    "amenity": "fast_food"
-                },
-                "name": "Dairy Queen",
-                "icon": "fast-food",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "cuisine",
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours",
-                    "smoking"
-                ],
-                "suggestion": true
-            },
-            "amenity/fast_food/Hallo Pizza": {
-                "tags": {
-                    "name": "Hallo Pizza",
-                    "amenity": "fast_food"
-                },
-                "name": "Hallo Pizza",
-                "icon": "fast-food",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "cuisine",
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours",
-                    "smoking"
-                ],
-                "suggestion": true
-            },
-            "amenity/fast_food/Fish & Chips": {
-                "tags": {
-                    "name": "Fish & Chips",
-                    "amenity": "fast_food"
-                },
-                "name": "Fish & Chips",
-                "icon": "fast-food",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "cuisine",
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours",
-                    "smoking"
-                ],
-                "suggestion": true
-            },
-            "amenity/fast_food/Harvey's": {
-                "tags": {
-                    "name": "Harvey's",
-                    "amenity": "fast_food"
-                },
-                "name": "Harvey's",
-                "icon": "fast-food",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "cuisine",
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours",
-                    "smoking"
-                ],
-                "suggestion": true
-            },
-            "amenity/fast_food/麥當勞": {
-                "tags": {
-                    "name": "麥當勞",
-                    "amenity": "fast_food"
-                },
-                "name": "麥當勞",
-                "icon": "fast-food",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "cuisine",
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours",
-                    "smoking"
-                ],
-                "suggestion": true
-            },
-            "amenity/fast_food/Pizza Pizza": {
-                "tags": {
-                    "name": "Pizza Pizza",
-                    "amenity": "fast_food"
-                },
-                "name": "Pizza Pizza",
-                "icon": "fast-food",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "cuisine",
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours",
-                    "smoking"
-                ],
-                "suggestion": true
-            },
-            "amenity/fast_food/Kotipizza": {
-                "tags": {
-                    "name": "Kotipizza",
-                    "amenity": "fast_food"
-                },
-                "name": "Kotipizza",
-                "icon": "fast-food",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "cuisine",
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours",
-                    "smoking"
-                ],
-                "suggestion": true
-            },
-            "amenity/fast_food/Jack in the Box": {
-                "tags": {
-                    "name": "Jack in the Box",
-                    "cuisine": "burger",
-                    "amenity": "fast_food"
-                },
-                "name": "Jack in the Box",
-                "icon": "fast-food",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "cuisine",
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours",
-                    "smoking"
-                ],
-                "suggestion": true
-            },
-            "amenity/fast_food/Istanbul": {
-                "tags": {
-                    "name": "Istanbul",
-                    "amenity": "fast_food"
-                },
-                "name": "Istanbul",
-                "icon": "fast-food",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "cuisine",
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours",
-                    "smoking"
-                ],
-                "suggestion": true
-            },
-            "amenity/fast_food/Kochlöffel": {
-                "tags": {
-                    "name": "Kochlöffel",
-                    "amenity": "fast_food"
-                },
-                "name": "Kochlöffel",
-                "icon": "fast-food",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "cuisine",
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours",
-                    "smoking"
-                ],
-                "suggestion": true
-            },
-            "amenity/fast_food/Döner": {
-                "tags": {
-                    "name": "Döner",
-                    "amenity": "fast_food"
-                },
-                "name": "Döner",
-                "icon": "fast-food",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "cuisine",
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours",
-                    "smoking"
-                ],
-                "suggestion": true
-            },
-            "amenity/fast_food/Telepizza": {
-                "tags": {
-                    "name": "Telepizza",
-                    "amenity": "fast_food"
-                },
-                "name": "Telepizza",
-                "icon": "fast-food",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "cuisine",
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours",
-                    "smoking"
-                ],
-                "suggestion": true
-            },
-            "amenity/fast_food/Sibylla": {
-                "tags": {
-                    "name": "Sibylla",
-                    "amenity": "fast_food"
-                },
-                "name": "Sibylla",
-                "icon": "fast-food",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "cuisine",
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours",
-                    "smoking"
-                ],
-                "suggestion": true
-            },
-            "amenity/fast_food/Carl's Jr.": {
-                "tags": {
-                    "name": "Carl's Jr.",
-                    "cuisine": "burger",
-                    "amenity": "fast_food"
-                },
-                "name": "Carl's Jr.",
-                "icon": "fast-food",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "cuisine",
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours",
-                    "smoking"
-                ],
-                "suggestion": true
-            },
-            "amenity/fast_food/Quiznos": {
-                "tags": {
-                    "name": "Quiznos",
-                    "cuisine": "sandwich",
-                    "amenity": "fast_food"
-                },
-                "name": "Quiznos",
-                "icon": "fast-food",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "cuisine",
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours",
-                    "smoking"
-                ],
-                "suggestion": true
-            },
-            "amenity/fast_food/Wimpy": {
-                "tags": {
-                    "name": "Wimpy",
-                    "amenity": "fast_food"
-                },
-                "name": "Wimpy",
-                "icon": "fast-food",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "cuisine",
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours",
-                    "smoking"
-                ],
-                "suggestion": true
-            },
-            "amenity/fast_food/Sonic": {
-                "tags": {
-                    "name": "Sonic",
-                    "cuisine": "burger",
-                    "amenity": "fast_food"
-                },
-                "name": "Sonic",
-                "icon": "fast-food",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "cuisine",
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours",
-                    "smoking"
-                ],
-                "suggestion": true
-            },
-            "amenity/fast_food/Taco Bell": {
-                "tags": {
-                    "name": "Taco Bell",
-                    "amenity": "fast_food"
-                },
-                "name": "Taco Bell",
-                "icon": "fast-food",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "cuisine",
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours",
-                    "smoking"
-                ],
-                "suggestion": true
-            },
-            "amenity/fast_food/Pizza Nova": {
-                "tags": {
-                    "name": "Pizza Nova",
-                    "amenity": "fast_food"
-                },
-                "name": "Pizza Nova",
-                "icon": "fast-food",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "cuisine",
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours",
-                    "smoking"
-                ],
-                "suggestion": true
-            },
-            "amenity/fast_food/Papa John's": {
-                "tags": {
-                    "name": "Papa John's",
-                    "cuisine": "pizza",
-                    "amenity": "fast_food"
-                },
-                "name": "Papa John's",
-                "icon": "fast-food",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "cuisine",
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours",
-                    "smoking"
-                ],
-                "suggestion": true
-            },
-            "amenity/fast_food/Nordsee": {
-                "tags": {
-                    "name": "Nordsee",
-                    "amenity": "fast_food"
-                },
-                "name": "Nordsee",
-                "icon": "fast-food",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "cuisine",
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours",
-                    "smoking"
-                ],
-                "suggestion": true
-            },
-            "amenity/fast_food/Mr. Sub": {
-                "tags": {
-                    "name": "Mr. Sub",
-                    "amenity": "fast_food"
-                },
-                "name": "Mr. Sub",
-                "icon": "fast-food",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "cuisine",
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours",
-                    "smoking"
-                ],
-                "suggestion": true
-            },
-            "amenity/fast_food/Kebab": {
-                "tags": {
-                    "name": "Kebab",
-                    "amenity": "fast_food"
-                },
-                "name": "Kebab",
-                "icon": "fast-food",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "cuisine",
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours",
-                    "smoking"
-                ],
-                "suggestion": true
-            },
-            "amenity/fast_food/Макдоналдс": {
-                "tags": {
-                    "name": "Макдоналдс",
-                    "name:en": "McDonald's",
-                    "amenity": "fast_food"
-                },
-                "name": "Макдоналдс",
-                "icon": "fast-food",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "cuisine",
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours",
-                    "smoking"
-                ],
-                "suggestion": true
-            },
-            "amenity/fast_food/Asia Imbiss": {
-                "tags": {
-                    "name": "Asia Imbiss",
-                    "amenity": "fast_food"
-                },
-                "name": "Asia Imbiss",
-                "icon": "fast-food",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "cuisine",
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours",
-                    "smoking"
-                ],
-                "suggestion": true
-            },
-            "amenity/fast_food/Imbiss": {
-                "tags": {
-                    "name": "Imbiss",
-                    "amenity": "fast_food"
-                },
-                "name": "Imbiss",
-                "icon": "fast-food",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "cuisine",
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours",
-                    "smoking"
-                ],
-                "suggestion": true
-            },
-            "amenity/fast_food/Chipotle": {
-                "tags": {
-                    "name": "Chipotle",
-                    "cuisine": "mexican",
-                    "amenity": "fast_food"
-                },
-                "name": "Chipotle",
-                "icon": "fast-food",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "cuisine",
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours",
-                    "smoking"
-                ],
-                "suggestion": true
-            },
-            "amenity/fast_food/マクドナルド": {
-                "tags": {
-                    "name": "マクドナルド",
-                    "name:en": "McDonald's",
-                    "cuisine": "burger",
-                    "amenity": "fast_food"
-                },
-                "name": "マクドナルド",
-                "icon": "fast-food",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "cuisine",
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours",
-                    "smoking"
-                ],
-                "suggestion": true
-            },
-            "amenity/fast_food/In-N-Out Burger": {
-                "tags": {
-                    "name": "In-N-Out Burger",
-                    "amenity": "fast_food"
-                },
-                "name": "In-N-Out Burger",
-                "icon": "fast-food",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "cuisine",
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours",
-                    "smoking"
-                ],
-                "suggestion": true
-            },
-            "amenity/fast_food/Jimmy John's": {
-                "tags": {
-                    "name": "Jimmy John's",
-                    "amenity": "fast_food"
-                },
-                "name": "Jimmy John's",
-                "icon": "fast-food",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "cuisine",
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours",
-                    "smoking"
-                ],
-                "suggestion": true
-            },
-            "amenity/fast_food/Jamba Juice": {
-                "tags": {
-                    "name": "Jamba Juice",
-                    "amenity": "fast_food"
-                },
-                "name": "Jamba Juice",
-                "icon": "fast-food",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "cuisine",
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours",
-                    "smoking"
-                ],
-                "suggestion": true
-            },
-            "amenity/fast_food/Робин Сдобин": {
-                "tags": {
-                    "name": "Робин Сдобин",
-                    "amenity": "fast_food"
-                },
-                "name": "Робин Сдобин",
-                "icon": "fast-food",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "cuisine",
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours",
-                    "smoking"
-                ],
-                "suggestion": true
-            },
-            "amenity/fast_food/Baskin Robbins": {
-                "tags": {
-                    "name": "Baskin Robbins",
-                    "amenity": "fast_food"
-                },
-                "name": "Baskin Robbins",
-                "icon": "fast-food",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "cuisine",
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours",
-                    "smoking"
-                ],
-                "suggestion": true
-            },
-            "amenity/fast_food/ケンタッキーフライドチキン": {
-                "tags": {
-                    "name": "ケンタッキーフライドチキン",
-                    "name:en": "KFC",
-                    "cuisine": "chicken",
-                    "amenity": "fast_food"
-                },
-                "name": "ケンタッキーフライドチキン",
-                "icon": "fast-food",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "cuisine",
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours",
-                    "smoking"
-                ],
-                "suggestion": true
-            },
-            "amenity/fast_food/吉野家": {
-                "tags": {
-                    "name": "吉野家",
-                    "amenity": "fast_food"
-                },
-                "name": "吉野家",
-                "icon": "fast-food",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "cuisine",
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours",
-                    "smoking"
-                ],
-                "suggestion": true
-            },
-            "amenity/fast_food/Taco Time": {
-                "tags": {
-                    "name": "Taco Time",
-                    "amenity": "fast_food"
-                },
-                "name": "Taco Time",
-                "icon": "fast-food",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "cuisine",
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours",
-                    "smoking"
-                ],
-                "suggestion": true
-            },
-            "amenity/fast_food/松屋": {
-                "tags": {
-                    "name": "松屋",
-                    "name:en": "Matsuya",
-                    "amenity": "fast_food"
-                },
-                "name": "松屋",
-                "icon": "fast-food",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "cuisine",
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours",
-                    "smoking"
-                ],
-                "suggestion": true
-            },
-            "amenity/fast_food/Little Caesars": {
-                "tags": {
-                    "name": "Little Caesars",
-                    "amenity": "fast_food"
-                },
-                "name": "Little Caesars",
-                "icon": "fast-food",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "cuisine",
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours",
-                    "smoking"
-                ],
-                "suggestion": true
-            },
-            "amenity/fast_food/El Pollo Loco": {
-                "tags": {
-                    "name": "El Pollo Loco",
-                    "amenity": "fast_food"
-                },
-                "name": "El Pollo Loco",
-                "icon": "fast-food",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "cuisine",
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours",
-                    "smoking"
-                ],
-                "suggestion": true
-            },
-            "amenity/fast_food/Del Taco": {
-                "tags": {
-                    "name": "Del Taco",
-                    "amenity": "fast_food"
-                },
-                "name": "Del Taco",
-                "icon": "fast-food",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "cuisine",
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours",
-                    "smoking"
-                ],
-                "suggestion": true
-            },
-            "amenity/fast_food/White Castle": {
-                "tags": {
-                    "name": "White Castle",
-                    "amenity": "fast_food"
-                },
-                "name": "White Castle",
-                "icon": "fast-food",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "cuisine",
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours",
-                    "smoking"
-                ],
-                "suggestion": true
-            },
-            "amenity/fast_food/Boston Market": {
-                "tags": {
-                    "name": "Boston Market",
-                    "amenity": "fast_food"
-                },
-                "name": "Boston Market",
-                "icon": "fast-food",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "cuisine",
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours",
-                    "smoking"
-                ],
-                "suggestion": true
-            },
-            "amenity/fast_food/Chick-fil-A": {
-                "tags": {
-                    "name": "Chick-fil-A",
-                    "cuisine": "chicken",
-                    "amenity": "fast_food"
-                },
-                "name": "Chick-fil-A",
-                "icon": "fast-food",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "cuisine",
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours",
-                    "smoking"
-                ],
-                "suggestion": true
-            },
-            "amenity/fast_food/Panda Express": {
-                "tags": {
-                    "name": "Panda Express",
-                    "amenity": "fast_food"
-                },
-                "name": "Panda Express",
-                "icon": "fast-food",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "cuisine",
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours",
-                    "smoking"
-                ],
-                "suggestion": true
-            },
-            "amenity/fast_food/Whataburger": {
-                "tags": {
-                    "name": "Whataburger",
-                    "amenity": "fast_food"
-                },
-                "name": "Whataburger",
-                "icon": "fast-food",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "cuisine",
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours",
-                    "smoking"
-                ],
-                "suggestion": true
-            },
-            "amenity/fast_food/Taco John's": {
-                "tags": {
-                    "name": "Taco John's",
-                    "amenity": "fast_food"
-                },
-                "name": "Taco John's",
-                "icon": "fast-food",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "cuisine",
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours",
-                    "smoking"
-                ],
-                "suggestion": true
-            },
-            "amenity/fast_food/Теремок": {
-                "tags": {
-                    "name": "Теремок",
-                    "amenity": "fast_food"
-                },
-                "name": "Теремок",
-                "icon": "fast-food",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "cuisine",
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours",
-                    "smoking"
-                ],
-                "suggestion": true
-            },
-            "amenity/fast_food/Culver's": {
-                "tags": {
-                    "name": "Culver's",
-                    "amenity": "fast_food"
-                },
-                "name": "Culver's",
-                "icon": "fast-food",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "cuisine",
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours",
-                    "smoking"
-                ],
-                "suggestion": true
-            },
-            "amenity/fast_food/Five Guys": {
-                "tags": {
-                    "name": "Five Guys",
-                    "amenity": "fast_food"
-                },
-                "name": "Five Guys",
-                "icon": "fast-food",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "cuisine",
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours",
-                    "smoking"
-                ],
-                "suggestion": true
-            },
-            "amenity/fast_food/Church's Chicken": {
-                "tags": {
-                    "name": "Church's Chicken",
-                    "amenity": "fast_food"
-                },
-                "name": "Church's Chicken",
-                "icon": "fast-food",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "cuisine",
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours",
-                    "smoking"
-                ],
-                "suggestion": true
-            },
-            "amenity/fast_food/Popeye's": {
-                "tags": {
-                    "name": "Popeye's",
-                    "cuisine": "chicken",
-                    "amenity": "fast_food"
-                },
-                "name": "Popeye's",
-                "icon": "fast-food",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "cuisine",
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours",
-                    "smoking"
-                ],
-                "suggestion": true
-            },
-            "amenity/fast_food/Long John Silver's": {
-                "tags": {
-                    "name": "Long John Silver's",
-                    "amenity": "fast_food"
-                },
-                "name": "Long John Silver's",
-                "icon": "fast-food",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "cuisine",
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours",
-                    "smoking"
-                ],
-                "suggestion": true
-            },
-            "amenity/fast_food/Pollo Campero": {
-                "tags": {
-                    "name": "Pollo Campero",
-                    "amenity": "fast_food"
-                },
-                "name": "Pollo Campero",
-                "icon": "fast-food",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "cuisine",
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours",
-                    "smoking"
-                ],
-                "suggestion": true
-            },
-            "amenity/fast_food/Zaxby's": {
-                "tags": {
-                    "name": "Zaxby's",
-                    "amenity": "fast_food"
-                },
-                "name": "Zaxby's",
-                "icon": "fast-food",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "cuisine",
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours",
-                    "smoking"
-                ],
-                "suggestion": true
-            },
-            "amenity/fast_food/すき家": {
-                "tags": {
-                    "name": "すき家",
-                    "name:en": "SUKIYA",
-                    "amenity": "fast_food"
-                },
-                "name": "すき家",
-                "icon": "fast-food",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "cuisine",
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours",
-                    "smoking"
-                ],
-                "suggestion": true
-            },
-            "amenity/fast_food/モスバーガー": {
-                "tags": {
-                    "name": "モスバーガー",
-                    "name:en": "MOS BURGER",
-                    "amenity": "fast_food"
-                },
-                "name": "モスバーガー",
-                "icon": "fast-food",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "cuisine",
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours",
-                    "smoking"
-                ],
-                "suggestion": true
-            },
-            "amenity/fast_food/Русский Аппетит": {
-                "tags": {
-                    "name": "Русский Аппетит",
-                    "amenity": "fast_food"
-                },
-                "name": "Русский Аппетит",
-                "icon": "fast-food",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "cuisine",
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours",
-                    "smoking"
-                ],
-                "suggestion": true
-            },
-            "amenity/fast_food/なか卯": {
-                "tags": {
-                    "name": "なか卯",
-                    "amenity": "fast_food"
-                },
-                "name": "なか卯",
-                "icon": "fast-food",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "cuisine",
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours",
-                    "smoking"
-                ],
-                "suggestion": true
-            },
-            "amenity/restaurant/Pizza Hut": {
-                "tags": {
-                    "name": "Pizza Hut",
-                    "amenity": "restaurant"
-                },
-                "name": "Pizza Hut",
-                "icon": "restaurant",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "cuisine",
-                    "address",
-                    "building_area",
-                    "opening_hours",
-                    "capacity",
-                    "smoking"
-                ],
-                "suggestion": true
-            },
-            "amenity/restaurant/Little Chef": {
-                "tags": {
-                    "name": "Little Chef",
-                    "amenity": "restaurant"
-                },
-                "name": "Little Chef",
-                "icon": "restaurant",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "cuisine",
-                    "address",
-                    "building_area",
-                    "opening_hours",
-                    "capacity",
-                    "smoking"
-                ],
-                "suggestion": true
-            },
-            "amenity/restaurant/Adler": {
-                "tags": {
-                    "name": "Adler",
-                    "amenity": "restaurant"
-                },
-                "name": "Adler",
-                "icon": "restaurant",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "cuisine",
-                    "address",
-                    "building_area",
-                    "opening_hours",
-                    "capacity",
-                    "smoking"
-                ],
-                "suggestion": true
-            },
-            "amenity/restaurant/Zur Krone": {
-                "tags": {
-                    "name": "Zur Krone",
-                    "amenity": "restaurant"
-                },
-                "name": "Zur Krone",
-                "icon": "restaurant",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "cuisine",
-                    "address",
-                    "building_area",
-                    "opening_hours",
-                    "capacity",
-                    "smoking"
-                ],
-                "suggestion": true
-            },
-            "amenity/restaurant/Deutsches Haus": {
-                "tags": {
-                    "name": "Deutsches Haus",
-                    "amenity": "restaurant"
-                },
-                "name": "Deutsches Haus",
-                "icon": "restaurant",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "cuisine",
-                    "address",
-                    "building_area",
-                    "opening_hours",
-                    "capacity",
-                    "smoking"
-                ],
-                "suggestion": true
-            },
-            "amenity/restaurant/Krone": {
-                "tags": {
-                    "name": "Krone",
-                    "amenity": "restaurant"
-                },
-                "name": "Krone",
-                "icon": "restaurant",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "cuisine",
-                    "address",
-                    "building_area",
-                    "opening_hours",
-                    "capacity",
-                    "smoking"
-                ],
-                "suggestion": true
-            },
-            "amenity/restaurant/Akropolis": {
-                "tags": {
-                    "name": "Akropolis",
-                    "amenity": "restaurant"
-                },
-                "name": "Akropolis",
-                "icon": "restaurant",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "cuisine",
-                    "address",
-                    "building_area",
-                    "opening_hours",
-                    "capacity",
-                    "smoking"
-                ],
-                "suggestion": true
-            },
-            "amenity/restaurant/Schützenhaus": {
-                "tags": {
-                    "name": "Schützenhaus",
-                    "amenity": "restaurant"
-                },
-                "name": "Schützenhaus",
-                "icon": "restaurant",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "cuisine",
-                    "address",
-                    "building_area",
-                    "opening_hours",
-                    "capacity",
-                    "smoking"
-                ],
-                "suggestion": true
-            },
-            "amenity/restaurant/Kreuz": {
-                "tags": {
-                    "name": "Kreuz",
-                    "amenity": "restaurant"
-                },
-                "name": "Kreuz",
-                "icon": "restaurant",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "cuisine",
-                    "address",
-                    "building_area",
-                    "opening_hours",
-                    "capacity",
-                    "smoking"
-                ],
-                "suggestion": true
-            },
-            "amenity/restaurant/Waldschänke": {
-                "tags": {
-                    "name": "Waldschänke",
-                    "amenity": "restaurant"
-                },
-                "name": "Waldschänke",
-                "icon": "restaurant",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "cuisine",
-                    "address",
-                    "building_area",
-                    "opening_hours",
-                    "capacity",
-                    "smoking"
-                ],
-                "suggestion": true
-            },
-            "amenity/restaurant/La Piazza": {
-                "tags": {
-                    "name": "La Piazza",
-                    "amenity": "restaurant"
-                },
-                "name": "La Piazza",
-                "icon": "restaurant",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "cuisine",
-                    "address",
-                    "building_area",
-                    "opening_hours",
-                    "capacity",
-                    "smoking"
-                ],
-                "suggestion": true
-            },
-            "amenity/restaurant/Lamm": {
-                "tags": {
-                    "name": "Lamm",
-                    "amenity": "restaurant"
-                },
-                "name": "Lamm",
-                "icon": "restaurant",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "cuisine",
-                    "address",
-                    "building_area",
-                    "opening_hours",
-                    "capacity",
-                    "smoking"
-                ],
-                "suggestion": true
-            },
-            "amenity/restaurant/Zur Sonne": {
-                "tags": {
-                    "name": "Zur Sonne",
-                    "amenity": "restaurant"
-                },
-                "name": "Zur Sonne",
-                "icon": "restaurant",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "cuisine",
-                    "address",
-                    "building_area",
-                    "opening_hours",
-                    "capacity",
-                    "smoking"
-                ],
-                "suggestion": true
-            },
-            "amenity/restaurant/Zur Linde": {
-                "tags": {
-                    "name": "Zur Linde",
-                    "amenity": "restaurant"
-                },
-                "name": "Zur Linde",
-                "icon": "restaurant",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "cuisine",
-                    "address",
-                    "building_area",
-                    "opening_hours",
-                    "capacity",
-                    "smoking"
-                ],
-                "suggestion": true
-            },
-            "amenity/restaurant/Poseidon": {
-                "tags": {
-                    "name": "Poseidon",
-                    "amenity": "restaurant"
-                },
-                "name": "Poseidon",
-                "icon": "restaurant",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "cuisine",
-                    "address",
-                    "building_area",
-                    "opening_hours",
-                    "capacity",
-                    "smoking"
-                ],
-                "suggestion": true
-            },
-            "amenity/restaurant/Shanghai": {
-                "tags": {
-                    "name": "Shanghai",
-                    "amenity": "restaurant"
-                },
-                "name": "Shanghai",
-                "icon": "restaurant",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "cuisine",
-                    "address",
-                    "building_area",
-                    "opening_hours",
-                    "capacity",
-                    "smoking"
-                ],
-                "suggestion": true
-            },
-            "amenity/restaurant/Red Lobster": {
-                "tags": {
-                    "name": "Red Lobster",
-                    "amenity": "restaurant"
-                },
-                "name": "Red Lobster",
-                "icon": "restaurant",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "cuisine",
-                    "address",
-                    "building_area",
-                    "opening_hours",
-                    "capacity",
-                    "smoking"
-                ],
-                "suggestion": true
-            },
-            "amenity/restaurant/Zum Löwen": {
-                "tags": {
-                    "name": "Zum Löwen",
-                    "amenity": "restaurant"
-                },
-                "name": "Zum Löwen",
-                "icon": "restaurant",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "cuisine",
-                    "address",
-                    "building_area",
-                    "opening_hours",
-                    "capacity",
-                    "smoking"
-                ],
-                "suggestion": true
-            },
-            "amenity/restaurant/Swiss Chalet": {
-                "tags": {
-                    "name": "Swiss Chalet",
-                    "amenity": "restaurant"
-                },
-                "name": "Swiss Chalet",
-                "icon": "restaurant",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "cuisine",
-                    "address",
-                    "building_area",
-                    "opening_hours",
-                    "capacity",
-                    "smoking"
-                ],
-                "suggestion": true
-            },
-            "amenity/restaurant/Olympia": {
-                "tags": {
-                    "name": "Olympia",
-                    "amenity": "restaurant"
-                },
-                "name": "Olympia",
-                "icon": "restaurant",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "cuisine",
-                    "address",
-                    "building_area",
-                    "opening_hours",
-                    "capacity",
-                    "smoking"
-                ],
-                "suggestion": true
-            },
-            "amenity/restaurant/Wagamama": {
-                "tags": {
-                    "name": "Wagamama",
-                    "amenity": "restaurant"
-                },
-                "name": "Wagamama",
-                "icon": "restaurant",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "cuisine",
-                    "address",
-                    "building_area",
-                    "opening_hours",
-                    "capacity",
-                    "smoking"
-                ],
-                "suggestion": true
-            },
-            "amenity/restaurant/Frankie & Benny's": {
-                "tags": {
-                    "name": "Frankie & Benny's",
-                    "amenity": "restaurant"
-                },
-                "name": "Frankie & Benny's",
-                "icon": "restaurant",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "cuisine",
-                    "address",
-                    "building_area",
-                    "opening_hours",
-                    "capacity",
-                    "smoking"
-                ],
-                "suggestion": true
-            },
-            "amenity/restaurant/Hooters": {
-                "tags": {
-                    "name": "Hooters",
-                    "amenity": "restaurant"
-                },
-                "name": "Hooters",
-                "icon": "restaurant",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "cuisine",
-                    "address",
-                    "building_area",
-                    "opening_hours",
-                    "capacity",
-                    "smoking"
-                ],
-                "suggestion": true
-            },
-            "amenity/restaurant/Sternen": {
-                "tags": {
-                    "name": "Sternen",
-                    "amenity": "restaurant"
-                },
-                "name": "Sternen",
-                "icon": "restaurant",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "cuisine",
-                    "address",
-                    "building_area",
-                    "opening_hours",
-                    "capacity",
-                    "smoking"
-                ],
-                "suggestion": true
-            },
-            "amenity/restaurant/Hirschen": {
-                "tags": {
-                    "name": "Hirschen",
-                    "amenity": "restaurant"
-                },
-                "name": "Hirschen",
-                "icon": "restaurant",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "cuisine",
-                    "address",
-                    "building_area",
-                    "opening_hours",
-                    "capacity",
-                    "smoking"
-                ],
-                "suggestion": true
-            },
-            "amenity/restaurant/Denny's": {
-                "tags": {
-                    "name": "Denny's",
-                    "amenity": "restaurant"
-                },
-                "name": "Denny's",
-                "icon": "restaurant",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "cuisine",
-                    "address",
-                    "building_area",
-                    "opening_hours",
-                    "capacity",
-                    "smoking"
-                ],
-                "suggestion": true
-            },
-            "amenity/restaurant/Athen": {
-                "tags": {
-                    "name": "Athen",
-                    "amenity": "restaurant"
-                },
-                "name": "Athen",
-                "icon": "restaurant",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "cuisine",
-                    "address",
-                    "building_area",
-                    "opening_hours",
-                    "capacity",
-                    "smoking"
-                ],
-                "suggestion": true
-            },
-            "amenity/restaurant/Sonne": {
-                "tags": {
-                    "name": "Sonne",
-                    "amenity": "restaurant"
-                },
-                "name": "Sonne",
-                "icon": "restaurant",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "cuisine",
-                    "address",
-                    "building_area",
-                    "opening_hours",
-                    "capacity",
-                    "smoking"
-                ],
-                "suggestion": true
-            },
-            "amenity/restaurant/Hirsch": {
-                "tags": {
-                    "name": "Hirsch",
-                    "amenity": "restaurant"
-                },
-                "name": "Hirsch",
-                "icon": "restaurant",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "cuisine",
-                    "address",
-                    "building_area",
-                    "opening_hours",
-                    "capacity",
-                    "smoking"
-                ],
-                "suggestion": true
-            },
-            "amenity/restaurant/Ratskeller": {
-                "tags": {
-                    "name": "Ratskeller",
-                    "amenity": "restaurant"
-                },
-                "name": "Ratskeller",
-                "icon": "restaurant",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "cuisine",
-                    "address",
-                    "building_area",
-                    "opening_hours",
-                    "capacity",
-                    "smoking"
-                ],
-                "suggestion": true
-            },
-            "amenity/restaurant/La Cantina": {
-                "tags": {
-                    "name": "La Cantina",
-                    "amenity": "restaurant"
-                },
-                "name": "La Cantina",
-                "icon": "restaurant",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "cuisine",
-                    "address",
-                    "building_area",
-                    "opening_hours",
-                    "capacity",
-                    "smoking"
-                ],
-                "suggestion": true
-            },
-            "amenity/restaurant/Gasthaus Krone": {
-                "tags": {
-                    "name": "Gasthaus Krone",
-                    "amenity": "restaurant"
-                },
-                "name": "Gasthaus Krone",
-                "icon": "restaurant",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "cuisine",
-                    "address",
-                    "building_area",
-                    "opening_hours",
-                    "capacity",
-                    "smoking"
-                ],
-                "suggestion": true
-            },
-            "amenity/restaurant/El Greco": {
-                "tags": {
-                    "name": "El Greco",
-                    "amenity": "restaurant"
-                },
-                "name": "El Greco",
-                "icon": "restaurant",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "cuisine",
-                    "address",
-                    "building_area",
-                    "opening_hours",
-                    "capacity",
-                    "smoking"
-                ],
-                "suggestion": true
-            },
-            "amenity/restaurant/Gasthof zur Post": {
-                "tags": {
-                    "name": "Gasthof zur Post",
-                    "amenity": "restaurant"
-                },
-                "name": "Gasthof zur Post",
-                "icon": "restaurant",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "cuisine",
-                    "address",
-                    "building_area",
-                    "opening_hours",
-                    "capacity",
-                    "smoking"
-                ],
-                "suggestion": true
-            },
-            "amenity/restaurant/Nando's": {
-                "tags": {
-                    "name": "Nando's",
-                    "amenity": "restaurant"
-                },
-                "name": "Nando's",
-                "icon": "restaurant",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "cuisine",
-                    "address",
-                    "building_area",
-                    "opening_hours",
-                    "capacity",
-                    "smoking"
-                ],
-                "suggestion": true
-            },
-            "amenity/restaurant/Löwen": {
-                "tags": {
-                    "name": "Löwen",
-                    "amenity": "restaurant"
-                },
-                "name": "Löwen",
-                "icon": "restaurant",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "cuisine",
-                    "address",
-                    "building_area",
-                    "opening_hours",
-                    "capacity",
-                    "smoking"
-                ],
-                "suggestion": true
-            },
-            "amenity/restaurant/La Pataterie": {
-                "tags": {
-                    "name": "La Pataterie",
-                    "amenity": "restaurant"
-                },
-                "name": "La Pataterie",
-                "icon": "restaurant",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "cuisine",
-                    "address",
-                    "building_area",
-                    "opening_hours",
-                    "capacity",
-                    "smoking"
-                ],
-                "suggestion": true
-            },
-            "amenity/restaurant/Bella Napoli": {
-                "tags": {
-                    "name": "Bella Napoli",
-                    "amenity": "restaurant"
-                },
-                "name": "Bella Napoli",
-                "icon": "restaurant",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "cuisine",
-                    "address",
-                    "building_area",
-                    "opening_hours",
-                    "capacity",
-                    "smoking"
-                ],
-                "suggestion": true
-            },
-            "amenity/restaurant/Pizza Express": {
-                "tags": {
-                    "name": "Pizza Express",
-                    "amenity": "restaurant"
-                },
-                "name": "Pizza Express",
-                "icon": "restaurant",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "cuisine",
-                    "address",
-                    "building_area",
-                    "opening_hours",
-                    "capacity",
-                    "smoking"
-                ],
-                "suggestion": true
-            },
-            "amenity/restaurant/Mandarin": {
-                "tags": {
-                    "name": "Mandarin",
-                    "amenity": "restaurant"
-                },
-                "name": "Mandarin",
-                "icon": "restaurant",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "cuisine",
-                    "address",
-                    "building_area",
-                    "opening_hours",
-                    "capacity",
-                    "smoking"
-                ],
-                "suggestion": true
-            },
-            "amenity/restaurant/Hong Kong": {
-                "tags": {
-                    "name": "Hong Kong",
-                    "amenity": "restaurant"
-                },
-                "name": "Hong Kong",
-                "icon": "restaurant",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "cuisine",
-                    "address",
-                    "building_area",
-                    "opening_hours",
-                    "capacity",
-                    "smoking"
-                ],
-                "suggestion": true
-            },
-            "amenity/restaurant/Zizzi": {
-                "tags": {
-                    "name": "Zizzi",
-                    "amenity": "restaurant"
-                },
-                "name": "Zizzi",
-                "icon": "restaurant",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "cuisine",
-                    "address",
-                    "building_area",
-                    "opening_hours",
-                    "capacity",
-                    "smoking"
-                ],
-                "suggestion": true
-            },
-            "amenity/restaurant/Cracker Barrel": {
-                "tags": {
-                    "name": "Cracker Barrel",
-                    "amenity": "restaurant"
-                },
-                "name": "Cracker Barrel",
-                "icon": "restaurant",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "cuisine",
-                    "address",
-                    "building_area",
-                    "opening_hours",
-                    "capacity",
-                    "smoking"
-                ],
-                "suggestion": true
-            },
-            "amenity/restaurant/Rhodos": {
-                "tags": {
-                    "name": "Rhodos",
-                    "amenity": "restaurant"
-                },
-                "name": "Rhodos",
-                "icon": "restaurant",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "cuisine",
-                    "address",
-                    "building_area",
-                    "opening_hours",
-                    "capacity",
-                    "smoking"
-                ],
-                "suggestion": true
-            },
-            "amenity/restaurant/Lindenhof": {
-                "tags": {
-                    "name": "Lindenhof",
-                    "amenity": "restaurant"
-                },
-                "name": "Lindenhof",
-                "icon": "restaurant",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "cuisine",
-                    "address",
-                    "building_area",
-                    "opening_hours",
-                    "capacity",
-                    "smoking"
-                ],
-                "suggestion": true
-            },
-            "amenity/restaurant/Milano": {
-                "tags": {
-                    "name": "Milano",
-                    "amenity": "restaurant"
-                },
-                "name": "Milano",
-                "icon": "restaurant",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "cuisine",
-                    "address",
-                    "building_area",
-                    "opening_hours",
-                    "capacity",
-                    "smoking"
-                ],
-                "suggestion": true
-            },
-            "amenity/restaurant/Dolce Vita": {
-                "tags": {
-                    "name": "Dolce Vita",
-                    "amenity": "restaurant"
-                },
-                "name": "Dolce Vita",
-                "icon": "restaurant",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "cuisine",
-                    "address",
-                    "building_area",
-                    "opening_hours",
-                    "capacity",
-                    "smoking"
-                ],
-                "suggestion": true
-            },
-            "amenity/restaurant/Kirchenwirt": {
-                "tags": {
-                    "name": "Kirchenwirt",
-                    "amenity": "restaurant"
-                },
-                "name": "Kirchenwirt",
-                "icon": "restaurant",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "cuisine",
-                    "address",
-                    "building_area",
-                    "opening_hours",
-                    "capacity",
-                    "smoking"
-                ],
-                "suggestion": true
-            },
-            "amenity/restaurant/Kantine": {
-                "tags": {
-                    "name": "Kantine",
-                    "amenity": "restaurant"
-                },
-                "name": "Kantine",
-                "icon": "restaurant",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "cuisine",
-                    "address",
-                    "building_area",
-                    "opening_hours",
-                    "capacity",
-                    "smoking"
-                ],
-                "suggestion": true
-            },
-            "amenity/restaurant/Ochsen": {
-                "tags": {
-                    "name": "Ochsen",
-                    "amenity": "restaurant"
-                },
-                "name": "Ochsen",
-                "icon": "restaurant",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "cuisine",
-                    "address",
-                    "building_area",
-                    "opening_hours",
-                    "capacity",
-                    "smoking"
-                ],
-                "suggestion": true
-            },
-            "amenity/restaurant/Spur": {
-                "tags": {
-                    "name": "Spur",
-                    "amenity": "restaurant"
-                },
-                "name": "Spur",
-                "icon": "restaurant",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "cuisine",
-                    "address",
-                    "building_area",
-                    "opening_hours",
-                    "capacity",
-                    "smoking"
-                ],
-                "suggestion": true
-            },
-            "amenity/restaurant/Mykonos": {
-                "tags": {
-                    "name": "Mykonos",
-                    "amenity": "restaurant"
-                },
-                "name": "Mykonos",
-                "icon": "restaurant",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "cuisine",
-                    "address",
-                    "building_area",
-                    "opening_hours",
-                    "capacity",
-                    "smoking"
-                ],
-                "suggestion": true
-            },
-            "amenity/restaurant/Lotus": {
-                "tags": {
-                    "name": "Lotus",
-                    "amenity": "restaurant"
-                },
-                "name": "Lotus",
-                "icon": "restaurant",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "cuisine",
-                    "address",
-                    "building_area",
-                    "opening_hours",
-                    "capacity",
-                    "smoking"
-                ],
-                "suggestion": true
-            },
-            "amenity/restaurant/Applebee's": {
-                "tags": {
-                    "name": "Applebee's",
-                    "amenity": "restaurant"
-                },
-                "name": "Applebee's",
-                "icon": "restaurant",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "cuisine",
-                    "address",
-                    "building_area",
-                    "opening_hours",
-                    "capacity",
-                    "smoking"
-                ],
-                "suggestion": true
-            },
-            "amenity/restaurant/Flunch": {
-                "tags": {
-                    "name": "Flunch",
-                    "amenity": "restaurant"
-                },
-                "name": "Flunch",
-                "icon": "restaurant",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "cuisine",
-                    "address",
-                    "building_area",
-                    "opening_hours",
-                    "capacity",
-                    "smoking"
-                ],
-                "suggestion": true
-            },
-            "amenity/restaurant/Zur Post": {
-                "tags": {
-                    "name": "Zur Post",
-                    "amenity": "restaurant"
-                },
-                "name": "Zur Post",
-                "icon": "restaurant",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "cuisine",
-                    "address",
-                    "building_area",
-                    "opening_hours",
-                    "capacity",
-                    "smoking"
-                ],
-                "suggestion": true
-            },
-            "amenity/restaurant/China Town": {
-                "tags": {
-                    "name": "China Town",
-                    "amenity": "restaurant"
-                },
-                "name": "China Town",
-                "icon": "restaurant",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "cuisine",
-                    "address",
-                    "building_area",
-                    "opening_hours",
-                    "capacity",
-                    "smoking"
-                ],
-                "suggestion": true
-            },
-            "amenity/restaurant/La Dolce Vita": {
-                "tags": {
-                    "name": "La Dolce Vita",
-                    "amenity": "restaurant"
-                },
-                "name": "La Dolce Vita",
-                "icon": "restaurant",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "cuisine",
-                    "address",
-                    "building_area",
-                    "opening_hours",
-                    "capacity",
-                    "smoking"
-                ],
-                "suggestion": true
-            },
-            "amenity/restaurant/Waffle House": {
-                "tags": {
-                    "name": "Waffle House",
-                    "amenity": "restaurant"
-                },
-                "name": "Waffle House",
-                "icon": "restaurant",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "cuisine",
-                    "address",
-                    "building_area",
-                    "opening_hours",
-                    "capacity",
-                    "smoking"
-                ],
-                "suggestion": true
-            },
-            "amenity/restaurant/Delphi": {
-                "tags": {
-                    "name": "Delphi",
-                    "amenity": "restaurant"
-                },
-                "name": "Delphi",
-                "icon": "restaurant",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "cuisine",
-                    "address",
-                    "building_area",
-                    "opening_hours",
-                    "capacity",
-                    "smoking"
-                ],
-                "suggestion": true
-            },
-            "amenity/restaurant/Linde": {
-                "tags": {
-                    "name": "Linde",
-                    "amenity": "restaurant"
-                },
-                "name": "Linde",
-                "icon": "restaurant",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "cuisine",
-                    "address",
-                    "building_area",
-                    "opening_hours",
-                    "capacity",
-                    "smoking"
-                ],
-                "suggestion": true
-            },
-            "amenity/restaurant/Outback Steakhouse": {
-                "tags": {
-                    "name": "Outback Steakhouse",
-                    "amenity": "restaurant"
-                },
-                "name": "Outback Steakhouse",
-                "icon": "restaurant",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "cuisine",
-                    "address",
-                    "building_area",
-                    "opening_hours",
-                    "capacity",
-                    "smoking"
-                ],
-                "suggestion": true
-            },
-            "amenity/restaurant/Dionysos": {
-                "tags": {
-                    "name": "Dionysos",
-                    "amenity": "restaurant"
-                },
-                "name": "Dionysos",
-                "icon": "restaurant",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "cuisine",
-                    "address",
-                    "building_area",
-                    "opening_hours",
-                    "capacity",
-                    "smoking"
-                ],
-                "suggestion": true
-            },
-            "amenity/restaurant/Kelsey's": {
-                "tags": {
-                    "name": "Kelsey's",
-                    "amenity": "restaurant"
-                },
-                "name": "Kelsey's",
-                "icon": "restaurant",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "cuisine",
-                    "address",
-                    "building_area",
-                    "opening_hours",
-                    "capacity",
-                    "smoking"
-                ],
-                "suggestion": true
-            },
-            "amenity/restaurant/Boston Pizza": {
-                "tags": {
-                    "name": "Boston Pizza",
-                    "amenity": "restaurant"
-                },
-                "name": "Boston Pizza",
-                "icon": "restaurant",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "cuisine",
-                    "address",
-                    "building_area",
-                    "opening_hours",
-                    "capacity",
-                    "smoking"
-                ],
-                "suggestion": true
-            },
-            "amenity/restaurant/Bella Italia": {
-                "tags": {
-                    "name": "Bella Italia",
-                    "amenity": "restaurant"
-                },
-                "name": "Bella Italia",
-                "icon": "restaurant",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "cuisine",
-                    "address",
-                    "building_area",
-                    "opening_hours",
-                    "capacity",
-                    "smoking"
-                ],
-                "suggestion": true
-            },
-            "amenity/restaurant/Sizzler": {
-                "tags": {
-                    "name": "Sizzler",
-                    "amenity": "restaurant"
-                },
-                "name": "Sizzler",
-                "icon": "restaurant",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "cuisine",
-                    "address",
-                    "building_area",
-                    "opening_hours",
-                    "capacity",
-                    "smoking"
-                ],
-                "suggestion": true
-            },
-            "amenity/restaurant/Grüner Baum": {
-                "tags": {
-                    "name": "Grüner Baum",
-                    "amenity": "restaurant"
-                },
-                "name": "Grüner Baum",
-                "icon": "restaurant",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "cuisine",
-                    "address",
-                    "building_area",
-                    "opening_hours",
-                    "capacity",
-                    "smoking"
-                ],
-                "suggestion": true
-            },
-            "amenity/restaurant/Taj Mahal": {
-                "tags": {
-                    "name": "Taj Mahal",
-                    "amenity": "restaurant"
-                },
-                "name": "Taj Mahal",
-                "icon": "restaurant",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "cuisine",
-                    "address",
-                    "building_area",
-                    "opening_hours",
-                    "capacity",
-                    "smoking"
-                ],
-                "suggestion": true
-            },
-            "amenity/restaurant/Rössli": {
-                "tags": {
-                    "name": "Rössli",
-                    "amenity": "restaurant"
-                },
-                "name": "Rössli",
-                "icon": "restaurant",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "cuisine",
-                    "address",
-                    "building_area",
-                    "opening_hours",
-                    "capacity",
-                    "smoking"
-                ],
-                "suggestion": true
-            },
-            "amenity/restaurant/Traube": {
-                "tags": {
-                    "name": "Traube",
-                    "amenity": "restaurant"
-                },
-                "name": "Traube",
-                "icon": "restaurant",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "cuisine",
-                    "address",
-                    "building_area",
-                    "opening_hours",
-                    "capacity",
-                    "smoking"
-                ],
-                "suggestion": true
-            },
-            "amenity/restaurant/Adria": {
-                "tags": {
-                    "name": "Adria",
-                    "amenity": "restaurant"
-                },
-                "name": "Adria",
-                "icon": "restaurant",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "cuisine",
-                    "address",
-                    "building_area",
-                    "opening_hours",
-                    "capacity",
-                    "smoking"
-                ],
-                "suggestion": true
-            },
-            "amenity/restaurant/Red Robin": {
-                "tags": {
-                    "name": "Red Robin",
-                    "amenity": "restaurant"
-                },
-                "name": "Red Robin",
-                "icon": "restaurant",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "cuisine",
-                    "address",
-                    "building_area",
-                    "opening_hours",
-                    "capacity",
-                    "smoking"
-                ],
-                "suggestion": true
-            },
-            "amenity/restaurant/Roma": {
-                "tags": {
-                    "name": "Roma",
-                    "amenity": "restaurant"
-                },
-                "name": "Roma",
-                "icon": "restaurant",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "cuisine",
-                    "address",
-                    "building_area",
-                    "opening_hours",
-                    "capacity",
-                    "smoking"
-                ],
-                "suggestion": true
-            },
-            "amenity/restaurant/San Marco": {
-                "tags": {
-                    "name": "San Marco",
-                    "amenity": "restaurant"
-                },
-                "name": "San Marco",
-                "icon": "restaurant",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "cuisine",
-                    "address",
-                    "building_area",
-                    "opening_hours",
-                    "capacity",
-                    "smoking"
-                ],
-                "suggestion": true
-            },
-            "amenity/restaurant/Hellas": {
-                "tags": {
-                    "name": "Hellas",
-                    "amenity": "restaurant"
-                },
-                "name": "Hellas",
-                "icon": "restaurant",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "cuisine",
-                    "address",
-                    "building_area",
-                    "opening_hours",
-                    "capacity",
-                    "smoking"
-                ],
-                "suggestion": true
-            },
-            "amenity/restaurant/La Perla": {
-                "tags": {
-                    "name": "La Perla",
-                    "amenity": "restaurant"
-                },
-                "name": "La Perla",
-                "icon": "restaurant",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "cuisine",
-                    "address",
-                    "building_area",
-                    "opening_hours",
-                    "capacity",
-                    "smoking"
-                ],
-                "suggestion": true
-            },
-            "amenity/restaurant/Vips": {
-                "tags": {
-                    "name": "Vips",
-                    "amenity": "restaurant"
-                },
-                "name": "Vips",
-                "icon": "restaurant",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "cuisine",
-                    "address",
-                    "building_area",
-                    "opening_hours",
-                    "capacity",
-                    "smoking"
-                ],
-                "suggestion": true
-            },
-            "amenity/restaurant/Panera Bread": {
-                "tags": {
-                    "name": "Panera Bread",
-                    "amenity": "restaurant"
-                },
-                "name": "Panera Bread",
-                "icon": "restaurant",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "cuisine",
-                    "address",
-                    "building_area",
-                    "opening_hours",
-                    "capacity",
-                    "smoking"
-                ],
-                "suggestion": true
-            },
-            "amenity/restaurant/Da Vinci": {
-                "tags": {
-                    "name": "Da Vinci",
-                    "amenity": "restaurant"
-                },
-                "name": "Da Vinci",
-                "icon": "restaurant",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "cuisine",
-                    "address",
-                    "building_area",
-                    "opening_hours",
-                    "capacity",
-                    "smoking"
-                ],
-                "suggestion": true
-            },
-            "amenity/restaurant/Hippopotamus": {
-                "tags": {
-                    "name": "Hippopotamus",
-                    "amenity": "restaurant"
-                },
-                "name": "Hippopotamus",
-                "icon": "restaurant",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "cuisine",
-                    "address",
-                    "building_area",
-                    "opening_hours",
-                    "capacity",
-                    "smoking"
-                ],
-                "suggestion": true
-            },
-            "amenity/restaurant/Prezzo": {
-                "tags": {
-                    "name": "Prezzo",
-                    "amenity": "restaurant"
-                },
-                "name": "Prezzo",
-                "icon": "restaurant",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "cuisine",
-                    "address",
-                    "building_area",
-                    "opening_hours",
-                    "capacity",
-                    "smoking"
-                ],
-                "suggestion": true
-            },
-            "amenity/restaurant/Courtepaille": {
-                "tags": {
-                    "name": "Courtepaille",
-                    "amenity": "restaurant"
-                },
-                "name": "Courtepaille",
-                "icon": "restaurant",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "cuisine",
-                    "address",
-                    "building_area",
-                    "opening_hours",
-                    "capacity",
-                    "smoking"
-                ],
-                "suggestion": true
-            },
-            "amenity/restaurant/Hard Rock Cafe": {
-                "tags": {
-                    "name": "Hard Rock Cafe",
-                    "amenity": "restaurant"
-                },
-                "name": "Hard Rock Cafe",
-                "icon": "restaurant",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "cuisine",
-                    "address",
-                    "building_area",
-                    "opening_hours",
-                    "capacity",
-                    "smoking"
-                ],
-                "suggestion": true
-            },
-            "amenity/restaurant/Panorama": {
-                "tags": {
-                    "name": "Panorama",
-                    "amenity": "restaurant"
-                },
-                "name": "Panorama",
-                "icon": "restaurant",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "cuisine",
-                    "address",
-                    "building_area",
-                    "opening_hours",
-                    "capacity",
-                    "smoking"
-                ],
-                "suggestion": true
-            },
-            "amenity/restaurant/デニーズ": {
-                "tags": {
-                    "name": "デニーズ",
-                    "amenity": "restaurant"
-                },
-                "name": "デニーズ",
-                "icon": "restaurant",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "cuisine",
-                    "address",
-                    "building_area",
-                    "opening_hours",
-                    "capacity",
-                    "smoking"
-                ],
-                "suggestion": true
-            },
-            "amenity/restaurant/Sportheim": {
-                "tags": {
-                    "name": "Sportheim",
-                    "amenity": "restaurant"
-                },
-                "name": "Sportheim",
-                "icon": "restaurant",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "cuisine",
-                    "address",
-                    "building_area",
-                    "opening_hours",
-                    "capacity",
-                    "smoking"
-                ],
-                "suggestion": true
-            },
-            "amenity/restaurant/餃子の王将": {
-                "tags": {
-                    "name": "餃子の王将",
-                    "amenity": "restaurant"
-                },
-                "name": "餃子の王将",
-                "icon": "restaurant",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "cuisine",
-                    "address",
-                    "building_area",
-                    "opening_hours",
-                    "capacity",
-                    "smoking"
-                ],
-                "suggestion": true
-            },
-            "amenity/restaurant/Bären": {
-                "tags": {
-                    "name": "Bären",
-                    "amenity": "restaurant"
-                },
-                "name": "Bären",
-                "icon": "restaurant",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "cuisine",
-                    "address",
-                    "building_area",
-                    "opening_hours",
-                    "capacity",
-                    "smoking"
-                ],
-                "suggestion": true
-            },
-            "amenity/restaurant/Alte Post": {
-                "tags": {
-                    "name": "Alte Post",
-                    "amenity": "restaurant"
-                },
-                "name": "Alte Post",
-                "icon": "restaurant",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "cuisine",
-                    "address",
-                    "building_area",
-                    "opening_hours",
-                    "capacity",
-                    "smoking"
-                ],
-                "suggestion": true
-            },
-            "amenity/restaurant/Pizzeria Roma": {
-                "tags": {
-                    "name": "Pizzeria Roma",
-                    "amenity": "restaurant"
-                },
-                "name": "Pizzeria Roma",
-                "icon": "restaurant",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "cuisine",
-                    "address",
-                    "building_area",
-                    "opening_hours",
-                    "capacity",
-                    "smoking"
-                ],
-                "suggestion": true
-            },
-            "amenity/restaurant/China Garden": {
-                "tags": {
-                    "name": "China Garden",
-                    "amenity": "restaurant"
-                },
-                "name": "China Garden",
-                "icon": "restaurant",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "cuisine",
-                    "address",
-                    "building_area",
-                    "opening_hours",
-                    "capacity",
-                    "smoking"
-                ],
-                "suggestion": true
-            },
-            "amenity/restaurant/Vapiano": {
-                "tags": {
-                    "name": "Vapiano",
-                    "amenity": "restaurant"
-                },
-                "name": "Vapiano",
-                "icon": "restaurant",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "cuisine",
-                    "address",
-                    "building_area",
-                    "opening_hours",
-                    "capacity",
-                    "smoking"
-                ],
-                "suggestion": true
-            },
-            "amenity/restaurant/Mamma Mia": {
-                "tags": {
-                    "name": "Mamma Mia",
-                    "amenity": "restaurant"
-                },
-                "name": "Mamma Mia",
-                "icon": "restaurant",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "cuisine",
-                    "address",
-                    "building_area",
-                    "opening_hours",
-                    "capacity",
-                    "smoking"
-                ],
-                "suggestion": true
-            },
-            "amenity/restaurant/Schwarzer Adler": {
-                "tags": {
-                    "name": "Schwarzer Adler",
-                    "amenity": "restaurant"
-                },
-                "name": "Schwarzer Adler",
-                "icon": "restaurant",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "cuisine",
-                    "address",
-                    "building_area",
-                    "opening_hours",
-                    "capacity",
-                    "smoking"
-                ],
-                "suggestion": true
-            },
-            "amenity/restaurant/IHOP": {
-                "tags": {
-                    "name": "IHOP",
-                    "amenity": "restaurant"
-                },
-                "name": "IHOP",
-                "icon": "restaurant",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "cuisine",
-                    "address",
-                    "building_area",
-                    "opening_hours",
-                    "capacity",
-                    "smoking"
-                ],
-                "suggestion": true
-            },
-            "amenity/restaurant/Chili's": {
-                "tags": {
-                    "name": "Chili's",
-                    "amenity": "restaurant"
-                },
-                "name": "Chili's",
-                "icon": "restaurant",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "cuisine",
-                    "address",
-                    "building_area",
-                    "opening_hours",
-                    "capacity",
-                    "smoking"
-                ],
-                "suggestion": true
-            },
-            "amenity/restaurant/Asia": {
-                "tags": {
-                    "name": "Asia",
-                    "amenity": "restaurant"
-                },
-                "name": "Asia",
-                "icon": "restaurant",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "cuisine",
-                    "address",
-                    "building_area",
-                    "opening_hours",
-                    "capacity",
-                    "smoking"
-                ],
-                "suggestion": true
-            },
-            "amenity/restaurant/Olive Garden": {
-                "tags": {
-                    "name": "Olive Garden",
-                    "amenity": "restaurant"
-                },
-                "name": "Olive Garden",
-                "icon": "restaurant",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "cuisine",
-                    "address",
-                    "building_area",
-                    "opening_hours",
-                    "capacity",
-                    "smoking"
-                ],
-                "suggestion": true
-            },
-            "amenity/restaurant/TGI Friday's": {
-                "tags": {
-                    "name": "TGI Friday's",
-                    "amenity": "restaurant"
-                },
-                "name": "TGI Friday's",
-                "icon": "restaurant",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "cuisine",
-                    "address",
-                    "building_area",
-                    "opening_hours",
-                    "capacity",
-                    "smoking"
-                ],
-                "suggestion": true
-            },
-            "amenity/restaurant/Friendly's": {
-                "tags": {
-                    "name": "Friendly's",
-                    "amenity": "restaurant"
-                },
-                "name": "Friendly's",
-                "icon": "restaurant",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "cuisine",
-                    "address",
-                    "building_area",
-                    "opening_hours",
-                    "capacity",
-                    "smoking"
-                ],
-                "suggestion": true
-            },
-            "amenity/restaurant/Buffalo Grill": {
-                "tags": {
-                    "name": "Buffalo Grill",
-                    "amenity": "restaurant"
-                },
-                "name": "Buffalo Grill",
-                "icon": "restaurant",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "cuisine",
-                    "address",
-                    "building_area",
-                    "opening_hours",
-                    "capacity",
-                    "smoking"
-                ],
-                "suggestion": true
-            },
-            "amenity/restaurant/Texas Roadhouse": {
-                "tags": {
-                    "name": "Texas Roadhouse",
-                    "amenity": "restaurant"
-                },
-                "name": "Texas Roadhouse",
-                "icon": "restaurant",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "cuisine",
-                    "address",
-                    "building_area",
-                    "opening_hours",
-                    "capacity",
-                    "smoking"
-                ],
-                "suggestion": true
-            },
-            "amenity/restaurant/ガスト": {
-                "tags": {
-                    "name": "ガスト",
-                    "name:en": "Gusto",
-                    "amenity": "restaurant"
-                },
-                "name": "ガスト",
-                "icon": "restaurant",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "cuisine",
-                    "address",
-                    "building_area",
-                    "opening_hours",
-                    "capacity",
-                    "smoking"
-                ],
-                "suggestion": true
-            },
-            "amenity/restaurant/Sakura": {
-                "tags": {
-                    "name": "Sakura",
-                    "amenity": "restaurant"
-                },
-                "name": "Sakura",
-                "icon": "restaurant",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "cuisine",
-                    "address",
-                    "building_area",
-                    "opening_hours",
-                    "capacity",
-                    "smoking"
-                ],
-                "suggestion": true
-            },
-            "amenity/restaurant/Mensa": {
-                "tags": {
-                    "name": "Mensa",
-                    "amenity": "restaurant"
-                },
-                "name": "Mensa",
-                "icon": "restaurant",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "cuisine",
-                    "address",
-                    "building_area",
-                    "opening_hours",
-                    "capacity",
-                    "smoking"
-                ],
-                "suggestion": true
-            },
-            "amenity/restaurant/The Keg": {
-                "tags": {
-                    "name": "The Keg",
-                    "amenity": "restaurant"
-                },
-                "name": "The Keg",
-                "icon": "restaurant",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "cuisine",
-                    "address",
-                    "building_area",
-                    "opening_hours",
-                    "capacity",
-                    "smoking"
-                ],
-                "suggestion": true
-            },
-            "amenity/restaurant/サイゼリヤ": {
-                "tags": {
-                    "name": "サイゼリヤ",
-                    "amenity": "restaurant"
-                },
-                "name": "サイゼリヤ",
-                "icon": "restaurant",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "cuisine",
-                    "address",
-                    "building_area",
-                    "opening_hours",
-                    "capacity",
-                    "smoking"
-                ],
-                "suggestion": true
-            },
-            "amenity/restaurant/La Strada": {
-                "tags": {
-                    "name": "La Strada",
-                    "amenity": "restaurant"
-                },
-                "name": "La Strada",
-                "icon": "restaurant",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "cuisine",
-                    "address",
-                    "building_area",
-                    "opening_hours",
-                    "capacity",
-                    "smoking"
-                ],
-                "suggestion": true
-            },
-            "amenity/restaurant/Village Inn": {
-                "tags": {
-                    "name": "Village Inn",
-                    "amenity": "restaurant"
-                },
-                "name": "Village Inn",
-                "icon": "restaurant",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "cuisine",
-                    "address",
-                    "building_area",
-                    "opening_hours",
-                    "capacity",
-                    "smoking"
-                ],
-                "suggestion": true
-            },
-            "amenity/restaurant/Buffalo Wild Wings": {
-                "tags": {
-                    "name": "Buffalo Wild Wings",
-                    "amenity": "restaurant"
-                },
-                "name": "Buffalo Wild Wings",
-                "icon": "restaurant",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "cuisine",
-                    "address",
-                    "building_area",
-                    "opening_hours",
-                    "capacity",
-                    "smoking"
-                ],
-                "suggestion": true
-            },
-            "amenity/restaurant/Peking": {
-                "tags": {
-                    "name": "Peking",
-                    "amenity": "restaurant"
-                },
-                "name": "Peking",
-                "icon": "restaurant",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "cuisine",
-                    "address",
-                    "building_area",
-                    "opening_hours",
-                    "capacity",
-                    "smoking"
-                ],
-                "suggestion": true
-            },
-            "amenity/restaurant/Round Table Pizza": {
-                "tags": {
-                    "name": "Round Table Pizza",
-                    "amenity": "restaurant"
-                },
-                "name": "Round Table Pizza",
-                "icon": "restaurant",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "cuisine",
-                    "address",
-                    "building_area",
-                    "opening_hours",
-                    "capacity",
-                    "smoking"
-                ],
-                "suggestion": true
-            },
-            "amenity/restaurant/California Pizza Kitchen": {
-                "tags": {
-                    "name": "California Pizza Kitchen",
-                    "amenity": "restaurant"
-                },
-                "name": "California Pizza Kitchen",
-                "icon": "restaurant",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "cuisine",
-                    "address",
-                    "building_area",
-                    "opening_hours",
-                    "capacity",
-                    "smoking"
-                ],
-                "suggestion": true
-            },
-            "amenity/restaurant/Якитория": {
-                "tags": {
-                    "name": "Якитория",
-                    "amenity": "restaurant"
-                },
-                "name": "Якитория",
-                "icon": "restaurant",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "cuisine",
-                    "address",
-                    "building_area",
-                    "opening_hours",
-                    "capacity",
-                    "smoking"
-                ],
-                "suggestion": true
-            },
-            "amenity/restaurant/Golden Corral": {
-                "tags": {
-                    "name": "Golden Corral",
-                    "amenity": "restaurant"
-                },
-                "name": "Golden Corral",
-                "icon": "restaurant",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "cuisine",
-                    "address",
-                    "building_area",
-                    "opening_hours",
-                    "capacity",
-                    "smoking"
-                ],
-                "suggestion": true
-            },
-            "amenity/restaurant/Perkins": {
-                "tags": {
-                    "name": "Perkins",
-                    "amenity": "restaurant"
-                },
-                "name": "Perkins",
-                "icon": "restaurant",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "cuisine",
-                    "address",
-                    "building_area",
-                    "opening_hours",
-                    "capacity",
-                    "smoking"
-                ],
-                "suggestion": true
-            },
-            "amenity/restaurant/Ruby Tuesday": {
-                "tags": {
-                    "name": "Ruby Tuesday",
-                    "amenity": "restaurant"
-                },
-                "name": "Ruby Tuesday",
-                "icon": "restaurant",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "cuisine",
-                    "address",
-                    "building_area",
-                    "opening_hours",
-                    "capacity",
-                    "smoking"
-                ],
-                "suggestion": true
-            },
-            "amenity/restaurant/Shari's": {
-                "tags": {
-                    "name": "Shari's",
-                    "amenity": "restaurant"
-                },
-                "name": "Shari's",
-                "icon": "restaurant",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "cuisine",
-                    "address",
-                    "building_area",
-                    "opening_hours",
-                    "capacity",
-                    "smoking"
-                ],
-                "suggestion": true
-            },
-            "amenity/restaurant/Bob Evans": {
-                "tags": {
-                    "name": "Bob Evans",
-                    "amenity": "restaurant"
-                },
-                "name": "Bob Evans",
-                "icon": "restaurant",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "cuisine",
-                    "address",
-                    "building_area",
-                    "opening_hours",
-                    "capacity",
-                    "smoking"
-                ],
-                "suggestion": true
-            },
-            "amenity/restaurant/바다횟집 (Bada Fish Restaurant)": {
-                "tags": {
-                    "name": "바다횟집 (Bada Fish Restaurant)",
-                    "amenity": "restaurant"
-                },
-                "name": "바다횟집 (Bada Fish Restaurant)",
-                "icon": "restaurant",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "cuisine",
-                    "address",
-                    "building_area",
-                    "opening_hours",
-                    "capacity",
-                    "smoking"
-                ],
-                "suggestion": true
-            },
-            "amenity/restaurant/Mang Inasal": {
-                "tags": {
-                    "name": "Mang Inasal",
-                    "amenity": "restaurant"
-                },
-                "name": "Mang Inasal",
-                "icon": "restaurant",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "cuisine",
-                    "address",
-                    "building_area",
-                    "opening_hours",
-                    "capacity",
-                    "smoking"
-                ],
-                "suggestion": true
-            },
-            "amenity/restaurant/Евразия": {
-                "tags": {
-                    "name": "Евразия",
-                    "amenity": "restaurant"
-                },
-                "name": "Евразия",
-                "icon": "restaurant",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "cuisine",
-                    "address",
-                    "building_area",
-                    "opening_hours",
-                    "capacity",
-                    "smoking"
-                ],
-                "suggestion": true
-            },
-            "amenity/restaurant/ジョナサン": {
-                "tags": {
-                    "name": "ジョナサン",
-                    "amenity": "restaurant"
-                },
-                "name": "ジョナサン",
-                "icon": "restaurant",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "cuisine",
-                    "address",
-                    "building_area",
-                    "opening_hours",
-                    "capacity",
-                    "smoking"
-                ],
-                "suggestion": true
-            },
-            "amenity/restaurant/Longhorn Steakhouse": {
-                "tags": {
-                    "name": "Longhorn Steakhouse",
-                    "amenity": "restaurant"
-                },
-                "name": "Longhorn Steakhouse",
-                "icon": "restaurant",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "cuisine",
-                    "address",
-                    "building_area",
-                    "opening_hours",
-                    "capacity",
-                    "smoking"
-                ],
-                "suggestion": true
-            },
-            "amenity/bank/Chase": {
-                "tags": {
-                    "name": "Chase",
-                    "amenity": "bank"
-                },
-                "name": "Chase",
-                "icon": "bank",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "atm",
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/bank/Commonwealth Bank": {
-                "tags": {
-                    "name": "Commonwealth Bank",
-                    "amenity": "bank"
-                },
-                "name": "Commonwealth Bank",
-                "icon": "bank",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "atm",
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/bank/Citibank": {
-                "tags": {
-                    "name": "Citibank",
-                    "amenity": "bank"
-                },
-                "name": "Citibank",
-                "icon": "bank",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "atm",
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/bank/HSBC": {
-                "tags": {
-                    "name": "HSBC",
-                    "amenity": "bank"
-                },
-                "name": "HSBC",
-                "icon": "bank",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "atm",
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/bank/Barclays": {
-                "tags": {
-                    "name": "Barclays",
-                    "amenity": "bank"
-                },
-                "name": "Barclays",
-                "icon": "bank",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "atm",
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/bank/Westpac": {
-                "tags": {
-                    "name": "Westpac",
-                    "amenity": "bank"
-                },
-                "name": "Westpac",
-                "icon": "bank",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "atm",
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/bank/NAB": {
-                "tags": {
-                    "name": "NAB",
-                    "amenity": "bank"
-                },
-                "name": "NAB",
-                "icon": "bank",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "atm",
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/bank/ANZ": {
-                "tags": {
-                    "name": "ANZ",
-                    "amenity": "bank"
-                },
-                "name": "ANZ",
-                "icon": "bank",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "atm",
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/bank/Lloyds Bank": {
-                "tags": {
-                    "name": "Lloyds Bank",
-                    "amenity": "bank"
-                },
-                "name": "Lloyds Bank",
-                "icon": "bank",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "atm",
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/bank/Landbank": {
-                "tags": {
-                    "name": "Landbank",
-                    "amenity": "bank"
-                },
-                "name": "Landbank",
-                "icon": "bank",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "atm",
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/bank/Sparkasse": {
-                "tags": {
-                    "name": "Sparkasse",
-                    "amenity": "bank"
-                },
-                "name": "Sparkasse",
-                "icon": "bank",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "atm",
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/bank/UCPB": {
-                "tags": {
-                    "name": "UCPB",
-                    "amenity": "bank"
-                },
-                "name": "UCPB",
-                "icon": "bank",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "atm",
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/bank/PNB": {
-                "tags": {
-                    "name": "PNB",
-                    "amenity": "bank"
-                },
-                "name": "PNB",
-                "icon": "bank",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "atm",
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/bank/Metrobank": {
-                "tags": {
-                    "name": "Metrobank",
-                    "amenity": "bank"
-                },
-                "name": "Metrobank",
-                "icon": "bank",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "atm",
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/bank/BDO": {
-                "tags": {
-                    "name": "BDO",
-                    "amenity": "bank"
-                },
-                "name": "BDO",
-                "icon": "bank",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "atm",
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/bank/Volksbank": {
-                "tags": {
-                    "name": "Volksbank",
-                    "amenity": "bank"
-                },
-                "name": "Volksbank",
-                "icon": "bank",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "atm",
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/bank/BPI": {
-                "tags": {
-                    "name": "BPI",
-                    "amenity": "bank"
-                },
-                "name": "BPI",
-                "icon": "bank",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "atm",
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/bank/Postbank": {
-                "tags": {
-                    "name": "Postbank",
-                    "amenity": "bank"
-                },
-                "name": "Postbank",
-                "icon": "bank",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "atm",
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/bank/NatWest": {
-                "tags": {
-                    "name": "NatWest",
-                    "amenity": "bank"
-                },
-                "name": "NatWest",
-                "icon": "bank",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "atm",
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/bank/Raiffeisenbank": {
-                "tags": {
-                    "name": "Raiffeisenbank",
-                    "amenity": "bank"
-                },
-                "name": "Raiffeisenbank",
-                "icon": "bank",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "atm",
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/bank/Yorkshire Bank": {
-                "tags": {
-                    "name": "Yorkshire Bank",
-                    "amenity": "bank"
-                },
-                "name": "Yorkshire Bank",
-                "icon": "bank",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "atm",
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/bank/ABSA": {
-                "tags": {
-                    "name": "ABSA",
-                    "amenity": "bank"
-                },
-                "name": "ABSA",
-                "icon": "bank",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "atm",
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/bank/Standard Bank": {
-                "tags": {
-                    "name": "Standard Bank",
-                    "amenity": "bank"
-                },
-                "name": "Standard Bank",
-                "icon": "bank",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "atm",
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/bank/FNB": {
-                "tags": {
-                    "name": "FNB",
-                    "amenity": "bank"
-                },
-                "name": "FNB",
-                "icon": "bank",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "atm",
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/bank/Deutsche Bank": {
-                "tags": {
-                    "name": "Deutsche Bank",
-                    "amenity": "bank"
-                },
-                "name": "Deutsche Bank",
-                "icon": "bank",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "atm",
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/bank/SEB": {
-                "tags": {
-                    "name": "SEB",
-                    "amenity": "bank"
-                },
-                "name": "SEB",
-                "icon": "bank",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "atm",
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/bank/Commerzbank": {
-                "tags": {
-                    "name": "Commerzbank",
-                    "amenity": "bank"
-                },
-                "name": "Commerzbank",
-                "icon": "bank",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "atm",
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/bank/Targobank": {
-                "tags": {
-                    "name": "Targobank",
-                    "amenity": "bank"
-                },
-                "name": "Targobank",
-                "icon": "bank",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "atm",
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/bank/ABN AMRO": {
-                "tags": {
-                    "name": "ABN AMRO",
-                    "amenity": "bank"
-                },
-                "name": "ABN AMRO",
-                "icon": "bank",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "atm",
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/bank/Handelsbanken": {
-                "tags": {
-                    "name": "Handelsbanken",
-                    "amenity": "bank"
-                },
-                "name": "Handelsbanken",
-                "icon": "bank",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "atm",
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/bank/Swedbank": {
-                "tags": {
-                    "name": "Swedbank",
-                    "amenity": "bank"
-                },
-                "name": "Swedbank",
-                "icon": "bank",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "atm",
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/bank/Kreissparkasse": {
-                "tags": {
-                    "name": "Kreissparkasse",
-                    "amenity": "bank"
-                },
-                "name": "Kreissparkasse",
-                "icon": "bank",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "atm",
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/bank/UniCredit Bank": {
-                "tags": {
-                    "name": "UniCredit Bank",
-                    "amenity": "bank"
-                },
-                "name": "UniCredit Bank",
-                "icon": "bank",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "atm",
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/bank/Monte dei Paschi di Siena": {
-                "tags": {
-                    "name": "Monte dei Paschi di Siena",
-                    "amenity": "bank"
-                },
-                "name": "Monte dei Paschi di Siena",
-                "icon": "bank",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "atm",
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/bank/Caja Rural": {
-                "tags": {
-                    "name": "Caja Rural",
-                    "amenity": "bank"
-                },
-                "name": "Caja Rural",
-                "icon": "bank",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "atm",
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/bank/Dresdner Bank": {
-                "tags": {
-                    "name": "Dresdner Bank",
-                    "amenity": "bank"
-                },
-                "name": "Dresdner Bank",
-                "icon": "bank",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "atm",
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/bank/Sparda-Bank": {
-                "tags": {
-                    "name": "Sparda-Bank",
-                    "amenity": "bank"
-                },
-                "name": "Sparda-Bank",
-                "icon": "bank",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "atm",
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/bank/VÚB": {
-                "tags": {
-                    "name": "VÚB",
-                    "amenity": "bank"
-                },
-                "name": "VÚB",
-                "icon": "bank",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "atm",
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/bank/Slovenská sporiteľňa": {
-                "tags": {
-                    "name": "Slovenská sporiteľňa",
-                    "amenity": "bank"
-                },
-                "name": "Slovenská sporiteľňa",
-                "icon": "bank",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "atm",
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/bank/Bank of Montreal": {
-                "tags": {
-                    "name": "Bank of Montreal",
-                    "amenity": "bank"
-                },
-                "name": "Bank of Montreal",
-                "icon": "bank",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "atm",
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/bank/KBC": {
-                "tags": {
-                    "name": "KBC",
-                    "amenity": "bank"
-                },
-                "name": "KBC",
-                "icon": "bank",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "atm",
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/bank/Royal Bank of Scotland": {
-                "tags": {
-                    "name": "Royal Bank of Scotland",
-                    "amenity": "bank"
-                },
-                "name": "Royal Bank of Scotland",
-                "icon": "bank",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "atm",
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/bank/TSB": {
-                "tags": {
-                    "name": "TSB",
-                    "amenity": "bank"
-                },
-                "name": "TSB",
-                "icon": "bank",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "atm",
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/bank/US Bank": {
-                "tags": {
-                    "name": "US Bank",
-                    "amenity": "bank"
-                },
-                "name": "US Bank",
-                "icon": "bank",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "atm",
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/bank/HypoVereinsbank": {
-                "tags": {
-                    "name": "HypoVereinsbank",
-                    "amenity": "bank"
-                },
-                "name": "HypoVereinsbank",
-                "icon": "bank",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "atm",
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/bank/Bank Austria": {
-                "tags": {
-                    "name": "Bank Austria",
-                    "amenity": "bank"
-                },
-                "name": "Bank Austria",
-                "icon": "bank",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "atm",
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/bank/ING": {
-                "tags": {
-                    "name": "ING",
-                    "amenity": "bank"
-                },
-                "name": "ING",
-                "icon": "bank",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "atm",
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/bank/Erste Bank": {
-                "tags": {
-                    "name": "Erste Bank",
-                    "amenity": "bank"
-                },
-                "name": "Erste Bank",
-                "icon": "bank",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "atm",
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/bank/CIBC": {
-                "tags": {
-                    "name": "CIBC",
-                    "amenity": "bank"
-                },
-                "name": "CIBC",
-                "icon": "bank",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "atm",
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/bank/Scotiabank": {
-                "tags": {
-                    "name": "Scotiabank",
-                    "amenity": "bank"
-                },
-                "name": "Scotiabank",
-                "icon": "bank",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "atm",
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/bank/Caisse d'Épargne": {
-                "tags": {
-                    "name": "Caisse d'Épargne",
-                    "amenity": "bank"
-                },
-                "name": "Caisse d'Épargne",
-                "icon": "bank",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "atm",
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/bank/Santander": {
-                "tags": {
-                    "name": "Santander",
-                    "amenity": "bank"
-                },
-                "name": "Santander",
-                "icon": "bank",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "atm",
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/bank/Bank of Scotland": {
-                "tags": {
-                    "name": "Bank of Scotland",
-                    "amenity": "bank"
-                },
-                "name": "Bank of Scotland",
-                "icon": "bank",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "atm",
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/bank/TD Canada Trust": {
-                "tags": {
-                    "name": "TD Canada Trust",
-                    "amenity": "bank"
-                },
-                "name": "TD Canada Trust",
-                "icon": "bank",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "atm",
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/bank/BMO": {
-                "tags": {
-                    "name": "BMO",
-                    "amenity": "bank"
-                },
-                "name": "BMO",
-                "icon": "bank",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "atm",
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/bank/Danske Bank": {
-                "tags": {
-                    "name": "Danske Bank",
-                    "amenity": "bank"
-                },
-                "name": "Danske Bank",
-                "icon": "bank",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "atm",
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/bank/OTP": {
-                "tags": {
-                    "name": "OTP",
-                    "amenity": "bank"
-                },
-                "name": "OTP",
-                "icon": "bank",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "atm",
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/bank/Crédit Agricole": {
-                "tags": {
-                    "name": "Crédit Agricole",
-                    "amenity": "bank"
-                },
-                "name": "Crédit Agricole",
-                "icon": "bank",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "atm",
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/bank/LCL": {
-                "tags": {
-                    "name": "LCL",
-                    "amenity": "bank"
-                },
-                "name": "LCL",
-                "icon": "bank",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "atm",
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/bank/VR-Bank": {
-                "tags": {
-                    "name": "VR-Bank",
-                    "amenity": "bank"
-                },
-                "name": "VR-Bank",
-                "icon": "bank",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "atm",
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/bank/ČSOB": {
-                "tags": {
-                    "name": "ČSOB",
-                    "amenity": "bank"
-                },
-                "name": "ČSOB",
-                "icon": "bank",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "atm",
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/bank/Česká spořitelna": {
-                "tags": {
-                    "name": "Česká spořitelna",
-                    "amenity": "bank"
-                },
-                "name": "Česká spořitelna",
-                "icon": "bank",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "atm",
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/bank/BNP": {
-                "tags": {
-                    "name": "BNP",
-                    "amenity": "bank"
-                },
-                "name": "BNP",
-                "icon": "bank",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "atm",
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/bank/Royal Bank": {
-                "tags": {
-                    "name": "Royal Bank",
-                    "amenity": "bank"
-                },
-                "name": "Royal Bank",
-                "icon": "bank",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "atm",
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/bank/Nationwide": {
-                "tags": {
-                    "name": "Nationwide",
-                    "amenity": "bank"
-                },
-                "name": "Nationwide",
-                "icon": "bank",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "atm",
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/bank/Halifax": {
-                "tags": {
-                    "name": "Halifax",
-                    "amenity": "bank"
-                },
-                "name": "Halifax",
-                "icon": "bank",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "atm",
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/bank/BAWAG PSK": {
-                "tags": {
-                    "name": "BAWAG PSK",
-                    "amenity": "bank"
-                },
-                "name": "BAWAG PSK",
-                "icon": "bank",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "atm",
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/bank/National Bank": {
-                "tags": {
-                    "name": "National Bank",
-                    "amenity": "bank"
-                },
-                "name": "National Bank",
-                "icon": "bank",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "atm",
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/bank/Nedbank": {
-                "tags": {
-                    "name": "Nedbank",
-                    "amenity": "bank"
-                },
-                "name": "Nedbank",
-                "icon": "bank",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "atm",
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/bank/First National Bank": {
-                "tags": {
-                    "name": "First National Bank",
-                    "amenity": "bank"
-                },
-                "name": "First National Bank",
-                "icon": "bank",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "atm",
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/bank/Nordea": {
-                "tags": {
-                    "name": "Nordea",
-                    "amenity": "bank"
-                },
-                "name": "Nordea",
-                "icon": "bank",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "atm",
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/bank/Rabobank": {
-                "tags": {
-                    "name": "Rabobank",
-                    "amenity": "bank"
-                },
-                "name": "Rabobank",
-                "icon": "bank",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "atm",
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/bank/Sparkasse KölnBonn": {
-                "tags": {
-                    "name": "Sparkasse KölnBonn",
-                    "amenity": "bank"
-                },
-                "name": "Sparkasse KölnBonn",
-                "icon": "bank",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "atm",
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/bank/Tatra banka": {
-                "tags": {
-                    "name": "Tatra banka",
-                    "amenity": "bank"
-                },
-                "name": "Tatra banka",
-                "icon": "bank",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "atm",
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/bank/Berliner Sparkasse": {
-                "tags": {
-                    "name": "Berliner Sparkasse",
-                    "amenity": "bank"
-                },
-                "name": "Berliner Sparkasse",
-                "icon": "bank",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "atm",
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/bank/Berliner Volksbank": {
-                "tags": {
-                    "name": "Berliner Volksbank",
-                    "amenity": "bank"
-                },
-                "name": "Berliner Volksbank",
-                "icon": "bank",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "atm",
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/bank/Wells Fargo": {
-                "tags": {
-                    "name": "Wells Fargo",
-                    "amenity": "bank"
-                },
-                "name": "Wells Fargo",
-                "icon": "bank",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "atm",
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/bank/Credit Suisse": {
-                "tags": {
-                    "name": "Credit Suisse",
-                    "amenity": "bank"
-                },
-                "name": "Credit Suisse",
-                "icon": "bank",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "atm",
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/bank/Société Générale": {
-                "tags": {
-                    "name": "Société Générale",
-                    "amenity": "bank"
-                },
-                "name": "Société Générale",
-                "icon": "bank",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "atm",
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/bank/Osuuspankki": {
-                "tags": {
-                    "name": "Osuuspankki",
-                    "amenity": "bank"
-                },
-                "name": "Osuuspankki",
-                "icon": "bank",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "atm",
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/bank/Sparkasse Aachen": {
-                "tags": {
-                    "name": "Sparkasse Aachen",
-                    "amenity": "bank"
-                },
-                "name": "Sparkasse Aachen",
-                "icon": "bank",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "atm",
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/bank/Hamburger Sparkasse": {
-                "tags": {
-                    "name": "Hamburger Sparkasse",
-                    "amenity": "bank"
-                },
-                "name": "Hamburger Sparkasse",
-                "icon": "bank",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "atm",
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/bank/Cassa di Risparmio del Veneto": {
-                "tags": {
-                    "name": "Cassa di Risparmio del Veneto",
-                    "amenity": "bank"
-                },
-                "name": "Cassa di Risparmio del Veneto",
-                "icon": "bank",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "atm",
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/bank/BNP Paribas": {
-                "tags": {
-                    "name": "BNP Paribas",
-                    "amenity": "bank"
-                },
-                "name": "BNP Paribas",
-                "icon": "bank",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "atm",
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/bank/Banque Populaire": {
-                "tags": {
-                    "name": "Banque Populaire",
-                    "amenity": "bank"
-                },
-                "name": "Banque Populaire",
-                "icon": "bank",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "atm",
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/bank/BNP Paribas Fortis": {
-                "tags": {
-                    "name": "BNP Paribas Fortis",
-                    "amenity": "bank"
-                },
-                "name": "BNP Paribas Fortis",
-                "icon": "bank",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "atm",
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/bank/Banco Popular": {
-                "tags": {
-                    "name": "Banco Popular",
-                    "amenity": "bank"
-                },
-                "name": "Banco Popular",
-                "icon": "bank",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "atm",
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/bank/Bancaja": {
-                "tags": {
-                    "name": "Bancaja",
-                    "amenity": "bank"
-                },
-                "name": "Bancaja",
-                "icon": "bank",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "atm",
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/bank/Banesto": {
-                "tags": {
-                    "name": "Banesto",
-                    "amenity": "bank"
-                },
-                "name": "Banesto",
-                "icon": "bank",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "atm",
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/bank/La Caixa": {
-                "tags": {
-                    "name": "La Caixa",
-                    "amenity": "bank"
-                },
-                "name": "La Caixa",
-                "icon": "bank",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "atm",
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/bank/Santander Consumer Bank": {
-                "tags": {
-                    "name": "Santander Consumer Bank",
-                    "amenity": "bank"
-                },
-                "name": "Santander Consumer Bank",
-                "icon": "bank",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "atm",
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/bank/BRD": {
-                "tags": {
-                    "name": "BRD",
-                    "amenity": "bank"
-                },
-                "name": "BRD",
-                "icon": "bank",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "atm",
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/bank/BCR": {
-                "tags": {
-                    "name": "BCR",
-                    "amenity": "bank"
-                },
-                "name": "BCR",
-                "icon": "bank",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "atm",
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/bank/Banca Transilvania": {
-                "tags": {
-                    "name": "Banca Transilvania",
-                    "amenity": "bank"
-                },
-                "name": "Banca Transilvania",
-                "icon": "bank",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "atm",
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/bank/BW-Bank": {
-                "tags": {
-                    "name": "BW-Bank",
-                    "amenity": "bank"
-                },
-                "name": "BW-Bank",
-                "icon": "bank",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "atm",
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/bank/Komerční banka": {
-                "tags": {
-                    "name": "Komerční banka",
-                    "amenity": "bank"
-                },
-                "name": "Komerční banka",
-                "icon": "bank",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "atm",
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/bank/Banco Pastor": {
-                "tags": {
-                    "name": "Banco Pastor",
-                    "amenity": "bank"
-                },
-                "name": "Banco Pastor",
-                "icon": "bank",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "atm",
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/bank/Stadtsparkasse": {
-                "tags": {
-                    "name": "Stadtsparkasse",
-                    "amenity": "bank"
-                },
-                "name": "Stadtsparkasse",
-                "icon": "bank",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "atm",
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/bank/Ulster Bank": {
-                "tags": {
-                    "name": "Ulster Bank",
-                    "amenity": "bank"
-                },
-                "name": "Ulster Bank",
-                "icon": "bank",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "atm",
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/bank/Sberbank": {
-                "tags": {
-                    "name": "Sberbank",
-                    "amenity": "bank"
-                },
-                "name": "Sberbank",
-                "icon": "bank",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "atm",
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/bank/CIC": {
-                "tags": {
-                    "name": "CIC",
-                    "amenity": "bank"
-                },
-                "name": "CIC",
-                "icon": "bank",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "atm",
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/bank/Bancpost": {
-                "tags": {
-                    "name": "Bancpost",
-                    "amenity": "bank"
-                },
-                "name": "Bancpost",
-                "icon": "bank",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "atm",
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/bank/Caja Madrid": {
-                "tags": {
-                    "name": "Caja Madrid",
-                    "amenity": "bank"
-                },
-                "name": "Caja Madrid",
-                "icon": "bank",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "atm",
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/bank/Maybank": {
-                "tags": {
-                    "name": "Maybank",
-                    "amenity": "bank"
-                },
-                "name": "Maybank",
-                "icon": "bank",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "atm",
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/bank/中国银行": {
-                "tags": {
-                    "name": "中国银行",
-                    "amenity": "bank"
-                },
-                "name": "中国银行",
-                "icon": "bank",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "atm",
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/bank/Unicredit Banca": {
-                "tags": {
-                    "name": "Unicredit Banca",
-                    "amenity": "bank"
-                },
-                "name": "Unicredit Banca",
-                "icon": "bank",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "atm",
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/bank/Crédit Mutuel": {
-                "tags": {
-                    "name": "Crédit Mutuel",
-                    "amenity": "bank"
-                },
-                "name": "Crédit Mutuel",
-                "icon": "bank",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "atm",
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/bank/BBVA": {
-                "tags": {
-                    "name": "BBVA",
-                    "amenity": "bank"
-                },
-                "name": "BBVA",
-                "icon": "bank",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "atm",
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/bank/Intesa San Paolo": {
-                "tags": {
-                    "name": "Intesa San Paolo",
-                    "amenity": "bank"
-                },
-                "name": "Intesa San Paolo",
-                "icon": "bank",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "atm",
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/bank/TD Bank": {
-                "tags": {
-                    "name": "TD Bank",
-                    "amenity": "bank"
-                },
-                "name": "TD Bank",
-                "icon": "bank",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "atm",
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/bank/Belfius": {
-                "tags": {
-                    "name": "Belfius",
-                    "amenity": "bank"
-                },
-                "name": "Belfius",
-                "icon": "bank",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "atm",
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/bank/Bank of America": {
-                "tags": {
-                    "name": "Bank of America",
-                    "amenity": "bank"
-                },
-                "name": "Bank of America",
-                "icon": "bank",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "atm",
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/bank/RBC": {
-                "tags": {
-                    "name": "RBC",
-                    "amenity": "bank"
-                },
-                "name": "RBC",
-                "icon": "bank",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "atm",
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/bank/Alpha Bank": {
-                "tags": {
-                    "name": "Alpha Bank",
-                    "amenity": "bank"
-                },
-                "name": "Alpha Bank",
-                "icon": "bank",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "atm",
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/bank/Сбербанк": {
-                "tags": {
-                    "name": "Сбербанк",
-                    "amenity": "bank"
-                },
-                "name": "Сбербанк",
-                "icon": "bank",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "atm",
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/bank/Россельхозбанк": {
-                "tags": {
-                    "name": "Россельхозбанк",
-                    "amenity": "bank"
-                },
-                "name": "Россельхозбанк",
-                "icon": "bank",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "atm",
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/bank/Crédit du Nord": {
-                "tags": {
-                    "name": "Crédit du Nord",
-                    "amenity": "bank"
-                },
-                "name": "Crédit du Nord",
-                "icon": "bank",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "atm",
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/bank/BancoEstado": {
-                "tags": {
-                    "name": "BancoEstado",
-                    "amenity": "bank"
-                },
-                "name": "BancoEstado",
-                "icon": "bank",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "atm",
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/bank/Millennium Bank": {
-                "tags": {
-                    "name": "Millennium Bank",
-                    "amenity": "bank"
-                },
-                "name": "Millennium Bank",
-                "icon": "bank",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "atm",
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/bank/State Bank of India": {
-                "tags": {
-                    "name": "State Bank of India",
-                    "amenity": "bank"
-                },
-                "name": "State Bank of India",
-                "icon": "bank",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "atm",
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/bank/Беларусбанк": {
-                "tags": {
-                    "name": "Беларусбанк",
-                    "amenity": "bank"
-                },
-                "name": "Беларусбанк",
-                "icon": "bank",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "atm",
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/bank/ING Bank Śląski": {
-                "tags": {
-                    "name": "ING Bank Śląski",
-                    "amenity": "bank"
-                },
-                "name": "ING Bank Śląski",
-                "icon": "bank",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "atm",
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/bank/Caixa Geral de Depósitos": {
-                "tags": {
-                    "name": "Caixa Geral de Depósitos",
-                    "amenity": "bank"
-                },
-                "name": "Caixa Geral de Depósitos",
-                "icon": "bank",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "atm",
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/bank/Kreissparkasse Köln": {
-                "tags": {
-                    "name": "Kreissparkasse Köln",
-                    "amenity": "bank"
-                },
-                "name": "Kreissparkasse Köln",
-                "icon": "bank",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "atm",
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/bank/Banco BCI": {
-                "tags": {
-                    "name": "Banco BCI",
-                    "amenity": "bank"
-                },
-                "name": "Banco BCI",
-                "icon": "bank",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "atm",
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/bank/Banco de Chile": {
-                "tags": {
-                    "name": "Banco de Chile",
-                    "amenity": "bank"
-                },
-                "name": "Banco de Chile",
-                "icon": "bank",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "atm",
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/bank/ВТБ24": {
-                "tags": {
-                    "name": "ВТБ24",
-                    "amenity": "bank"
-                },
-                "name": "ВТБ24",
-                "icon": "bank",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "atm",
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/bank/UBS": {
-                "tags": {
-                    "name": "UBS",
-                    "amenity": "bank"
-                },
-                "name": "UBS",
-                "icon": "bank",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "atm",
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/bank/PKO BP": {
-                "tags": {
-                    "name": "PKO BP",
-                    "amenity": "bank"
-                },
-                "name": "PKO BP",
-                "icon": "bank",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "atm",
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/bank/Chinabank": {
-                "tags": {
-                    "name": "Chinabank",
-                    "amenity": "bank"
-                },
-                "name": "Chinabank",
-                "icon": "bank",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "atm",
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/bank/PSBank": {
-                "tags": {
-                    "name": "PSBank",
-                    "amenity": "bank"
-                },
-                "name": "PSBank",
-                "icon": "bank",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "atm",
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/bank/Union Bank": {
-                "tags": {
-                    "name": "Union Bank",
-                    "amenity": "bank"
-                },
-                "name": "Union Bank",
-                "icon": "bank",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "atm",
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/bank/China Bank": {
-                "tags": {
-                    "name": "China Bank",
-                    "amenity": "bank"
-                },
-                "name": "China Bank",
-                "icon": "bank",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "atm",
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/bank/RCBC": {
-                "tags": {
-                    "name": "RCBC",
-                    "amenity": "bank"
-                },
-                "name": "RCBC",
-                "icon": "bank",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "atm",
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/bank/Unicaja": {
-                "tags": {
-                    "name": "Unicaja",
-                    "amenity": "bank"
-                },
-                "name": "Unicaja",
-                "icon": "bank",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "atm",
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/bank/BBK": {
-                "tags": {
-                    "name": "BBK",
-                    "amenity": "bank"
-                },
-                "name": "BBK",
-                "icon": "bank",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "atm",
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/bank/Ibercaja": {
-                "tags": {
-                    "name": "Ibercaja",
-                    "amenity": "bank"
-                },
-                "name": "Ibercaja",
-                "icon": "bank",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "atm",
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/bank/RBS": {
-                "tags": {
-                    "name": "RBS",
-                    "amenity": "bank"
-                },
-                "name": "RBS",
-                "icon": "bank",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "atm",
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/bank/Commercial Bank of Ceylon PLC": {
-                "tags": {
-                    "name": "Commercial Bank of Ceylon PLC",
-                    "amenity": "bank"
-                },
-                "name": "Commercial Bank of Ceylon PLC",
-                "icon": "bank",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "atm",
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/bank/Bank of Ireland": {
-                "tags": {
-                    "name": "Bank of Ireland",
-                    "amenity": "bank"
-                },
-                "name": "Bank of Ireland",
-                "icon": "bank",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "atm",
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/bank/BNL": {
-                "tags": {
-                    "name": "BNL",
-                    "amenity": "bank"
-                },
-                "name": "BNL",
-                "icon": "bank",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "atm",
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/bank/Banco Santander": {
-                "tags": {
-                    "name": "Banco Santander",
-                    "amenity": "bank"
-                },
-                "name": "Banco Santander",
-                "icon": "bank",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "atm",
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/bank/Banco Itaú": {
-                "tags": {
-                    "name": "Banco Itaú",
-                    "amenity": "bank"
-                },
-                "name": "Banco Itaú",
-                "icon": "bank",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "atm",
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/bank/AIB": {
-                "tags": {
-                    "name": "AIB",
-                    "amenity": "bank"
-                },
-                "name": "AIB",
-                "icon": "bank",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "atm",
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/bank/BZ WBK": {
-                "tags": {
-                    "name": "BZ WBK",
-                    "amenity": "bank"
-                },
-                "name": "BZ WBK",
-                "icon": "bank",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "atm",
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/bank/Banco do Brasil": {
-                "tags": {
-                    "name": "Banco do Brasil",
-                    "amenity": "bank"
-                },
-                "name": "Banco do Brasil",
-                "icon": "bank",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "atm",
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/bank/Caixa Econômica Federal": {
-                "tags": {
-                    "name": "Caixa Econômica Federal",
-                    "amenity": "bank"
-                },
-                "name": "Caixa Econômica Federal",
-                "icon": "bank",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "atm",
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/bank/Fifth Third Bank": {
-                "tags": {
-                    "name": "Fifth Third Bank",
-                    "amenity": "bank"
-                },
-                "name": "Fifth Third Bank",
-                "icon": "bank",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "atm",
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/bank/Banca Popolare di Vicenza": {
-                "tags": {
-                    "name": "Banca Popolare di Vicenza",
-                    "amenity": "bank"
-                },
-                "name": "Banca Popolare di Vicenza",
-                "icon": "bank",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "atm",
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/bank/Wachovia": {
-                "tags": {
-                    "name": "Wachovia",
-                    "amenity": "bank"
-                },
-                "name": "Wachovia",
-                "icon": "bank",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "atm",
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/bank/OLB": {
-                "tags": {
-                    "name": "OLB",
-                    "amenity": "bank"
-                },
-                "name": "OLB",
-                "icon": "bank",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "atm",
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/bank/みずほ銀行": {
-                "tags": {
-                    "name": "みずほ銀行",
-                    "amenity": "bank"
-                },
-                "name": "みずほ銀行",
-                "icon": "bank",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "atm",
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/bank/BES": {
-                "tags": {
-                    "name": "BES",
-                    "amenity": "bank"
-                },
-                "name": "BES",
-                "icon": "bank",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "atm",
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/bank/ICICI Bank": {
-                "tags": {
-                    "name": "ICICI Bank",
-                    "amenity": "bank"
-                },
-                "name": "ICICI Bank",
-                "icon": "bank",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "atm",
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/bank/HDFC Bank": {
-                "tags": {
-                    "name": "HDFC Bank",
-                    "amenity": "bank"
-                },
-                "name": "HDFC Bank",
-                "icon": "bank",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "atm",
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/bank/La Banque Postale": {
-                "tags": {
-                    "name": "La Banque Postale",
-                    "amenity": "bank"
-                },
-                "name": "La Banque Postale",
-                "icon": "bank",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "atm",
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/bank/Pekao SA": {
-                "tags": {
-                    "name": "Pekao SA",
-                    "amenity": "bank"
-                },
-                "name": "Pekao SA",
-                "icon": "bank",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "atm",
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/bank/Oberbank": {
-                "tags": {
-                    "name": "Oberbank",
-                    "amenity": "bank"
-                },
-                "name": "Oberbank",
-                "icon": "bank",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "atm",
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/bank/Bradesco": {
-                "tags": {
-                    "name": "Bradesco",
-                    "amenity": "bank"
-                },
-                "name": "Bradesco",
-                "icon": "bank",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "atm",
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/bank/Oldenburgische Landesbank": {
-                "tags": {
-                    "name": "Oldenburgische Landesbank",
-                    "amenity": "bank"
-                },
-                "name": "Oldenburgische Landesbank",
-                "icon": "bank",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "atm",
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/bank/Bendigo Bank": {
-                "tags": {
-                    "name": "Bendigo Bank",
-                    "amenity": "bank"
-                },
-                "name": "Bendigo Bank",
-                "icon": "bank",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "atm",
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/bank/Argenta": {
-                "tags": {
-                    "name": "Argenta",
-                    "amenity": "bank"
-                },
-                "name": "Argenta",
-                "icon": "bank",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "atm",
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/bank/AXA": {
-                "tags": {
-                    "name": "AXA",
-                    "amenity": "bank"
-                },
-                "name": "AXA",
-                "icon": "bank",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "atm",
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/bank/Axis Bank": {
-                "tags": {
-                    "name": "Axis Bank",
-                    "amenity": "bank"
-                },
-                "name": "Axis Bank",
-                "icon": "bank",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "atm",
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/bank/Banco Nación": {
-                "tags": {
-                    "name": "Banco Nación",
-                    "amenity": "bank"
-                },
-                "name": "Banco Nación",
-                "icon": "bank",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "atm",
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/bank/GE Money Bank": {
-                "tags": {
-                    "name": "GE Money Bank",
-                    "amenity": "bank"
-                },
-                "name": "GE Money Bank",
-                "icon": "bank",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "atm",
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/bank/Альфа-Банк": {
-                "tags": {
-                    "name": "Альфа-Банк",
-                    "amenity": "bank"
-                },
-                "name": "Альфа-Банк",
-                "icon": "bank",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "atm",
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/bank/Белагропромбанк": {
-                "tags": {
-                    "name": "Белагропромбанк",
-                    "amenity": "bank"
-                },
-                "name": "Белагропромбанк",
-                "icon": "bank",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "atm",
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/bank/Caja Círculo": {
-                "tags": {
-                    "name": "Caja Círculo",
-                    "amenity": "bank"
-                },
-                "name": "Caja Círculo",
-                "icon": "bank",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "atm",
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/bank/Banco Galicia": {
-                "tags": {
-                    "name": "Banco Galicia",
-                    "amenity": "bank"
-                },
-                "name": "Banco Galicia",
-                "icon": "bank",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "atm",
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/bank/Eurobank": {
-                "tags": {
-                    "name": "Eurobank",
-                    "amenity": "bank"
-                },
-                "name": "Eurobank",
-                "icon": "bank",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "atm",
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/bank/Banca Intesa": {
-                "tags": {
-                    "name": "Banca Intesa",
-                    "amenity": "bank"
-                },
-                "name": "Banca Intesa",
-                "icon": "bank",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "atm",
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/bank/Canara Bank": {
-                "tags": {
-                    "name": "Canara Bank",
-                    "amenity": "bank"
-                },
-                "name": "Canara Bank",
-                "icon": "bank",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "atm",
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/bank/Cajamar": {
-                "tags": {
-                    "name": "Cajamar",
-                    "amenity": "bank"
-                },
-                "name": "Cajamar",
-                "icon": "bank",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "atm",
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/bank/Banamex": {
-                "tags": {
-                    "name": "Banamex",
-                    "amenity": "bank"
-                },
-                "name": "Banamex",
-                "icon": "bank",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "atm",
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/bank/Crédit Mutuel de Bretagne": {
-                "tags": {
-                    "name": "Crédit Mutuel de Bretagne",
-                    "amenity": "bank"
-                },
-                "name": "Crédit Mutuel de Bretagne",
-                "icon": "bank",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "atm",
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/bank/Davivienda": {
-                "tags": {
-                    "name": "Davivienda",
-                    "amenity": "bank"
-                },
-                "name": "Davivienda",
-                "icon": "bank",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "atm",
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/bank/Bank Spółdzielczy": {
-                "tags": {
-                    "name": "Bank Spółdzielczy",
-                    "amenity": "bank"
-                },
-                "name": "Bank Spółdzielczy",
-                "icon": "bank",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "atm",
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/bank/Credit Agricole": {
-                "tags": {
-                    "name": "Credit Agricole",
-                    "amenity": "bank"
-                },
-                "name": "Credit Agricole",
-                "icon": "bank",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "atm",
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/bank/Bankinter": {
-                "tags": {
-                    "name": "Bankinter",
-                    "amenity": "bank"
-                },
-                "name": "Bankinter",
-                "icon": "bank",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "atm",
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/bank/Banque Nationale": {
-                "tags": {
-                    "name": "Banque Nationale",
-                    "amenity": "bank"
-                },
-                "name": "Banque Nationale",
-                "icon": "bank",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "atm",
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/bank/Bank of the West": {
-                "tags": {
-                    "name": "Bank of the West",
-                    "amenity": "bank"
-                },
-                "name": "Bank of the West",
-                "icon": "bank",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "atm",
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/bank/Key Bank": {
-                "tags": {
-                    "name": "Key Bank",
-                    "amenity": "bank"
-                },
-                "name": "Key Bank",
-                "icon": "bank",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "atm",
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/bank/Western Union": {
-                "tags": {
-                    "name": "Western Union",
-                    "amenity": "bank"
-                },
-                "name": "Western Union",
-                "icon": "bank",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "atm",
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/bank/Citizens Bank": {
-                "tags": {
-                    "name": "Citizens Bank",
-                    "amenity": "bank"
-                },
-                "name": "Citizens Bank",
-                "icon": "bank",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "atm",
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/bank/ПриватБанк": {
-                "tags": {
-                    "name": "ПриватБанк",
-                    "amenity": "bank"
-                },
-                "name": "ПриватБанк",
-                "icon": "bank",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "atm",
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/bank/Security Bank": {
-                "tags": {
-                    "name": "Security Bank",
-                    "amenity": "bank"
-                },
-                "name": "Security Bank",
-                "icon": "bank",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "atm",
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/bank/Millenium Bank": {
-                "tags": {
-                    "name": "Millenium Bank",
-                    "amenity": "bank"
-                },
-                "name": "Millenium Bank",
-                "icon": "bank",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "atm",
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/bank/Bankia": {
-                "tags": {
-                    "name": "Bankia",
-                    "amenity": "bank"
-                },
-                "name": "Bankia",
-                "icon": "bank",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "atm",
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/bank/三菱東京UFJ銀行": {
-                "tags": {
-                    "name": "三菱東京UFJ銀行",
-                    "amenity": "bank"
-                },
-                "name": "三菱東京UFJ銀行",
-                "icon": "bank",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "atm",
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/bank/Caixa": {
-                "tags": {
-                    "name": "Caixa",
-                    "amenity": "bank"
-                },
-                "name": "Caixa",
-                "icon": "bank",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "atm",
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/bank/Banco de Costa Rica": {
-                "tags": {
-                    "name": "Banco de Costa Rica",
-                    "amenity": "bank"
-                },
-                "name": "Banco de Costa Rica",
-                "icon": "bank",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "atm",
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/bank/SunTrust Bank": {
-                "tags": {
-                    "name": "SunTrust Bank",
-                    "amenity": "bank"
-                },
-                "name": "SunTrust Bank",
-                "icon": "bank",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "atm",
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/bank/Itaú": {
-                "tags": {
-                    "name": "Itaú",
-                    "amenity": "bank"
-                },
-                "name": "Itaú",
-                "icon": "bank",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "atm",
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/bank/PBZ": {
-                "tags": {
-                    "name": "PBZ",
-                    "amenity": "bank"
-                },
-                "name": "PBZ",
-                "icon": "bank",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "atm",
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/bank/中国工商银行": {
-                "tags": {
-                    "name": "中国工商银行",
-                    "amenity": "bank"
-                },
-                "name": "中国工商银行",
-                "icon": "bank",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "atm",
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/bank/Bancolombia": {
-                "tags": {
-                    "name": "Bancolombia",
-                    "amenity": "bank"
-                },
-                "name": "Bancolombia",
-                "icon": "bank",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "atm",
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/bank/Райффайзен Банк Аваль": {
-                "tags": {
-                    "name": "Райффайзен Банк Аваль",
-                    "amenity": "bank"
-                },
-                "name": "Райффайзен Банк Аваль",
-                "icon": "bank",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "atm",
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/bank/Bancomer": {
-                "tags": {
-                    "name": "Bancomer",
-                    "amenity": "bank"
-                },
-                "name": "Bancomer",
-                "icon": "bank",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "atm",
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/bank/Banorte": {
-                "tags": {
-                    "name": "Banorte",
-                    "amenity": "bank"
-                },
-                "name": "Banorte",
-                "icon": "bank",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "atm",
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/bank/Alior Bank": {
-                "tags": {
-                    "name": "Alior Bank",
-                    "amenity": "bank"
-                },
-                "name": "Alior Bank",
-                "icon": "bank",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "atm",
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/bank/BOC": {
-                "tags": {
-                    "name": "BOC",
-                    "amenity": "bank"
-                },
-                "name": "BOC",
-                "icon": "bank",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "atm",
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/bank/Банк Москвы": {
-                "tags": {
-                    "name": "Банк Москвы",
-                    "amenity": "bank"
-                },
-                "name": "Банк Москвы",
-                "icon": "bank",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "atm",
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/bank/ВТБ": {
-                "tags": {
-                    "name": "ВТБ",
-                    "amenity": "bank"
-                },
-                "name": "ВТБ",
-                "icon": "bank",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "atm",
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/bank/Getin Bank": {
-                "tags": {
-                    "name": "Getin Bank",
-                    "amenity": "bank"
-                },
-                "name": "Getin Bank",
-                "icon": "bank",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "atm",
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/bank/Caja Duero": {
-                "tags": {
-                    "name": "Caja Duero",
-                    "amenity": "bank"
-                },
-                "name": "Caja Duero",
-                "icon": "bank",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "atm",
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/bank/Regions Bank": {
-                "tags": {
-                    "name": "Regions Bank",
-                    "amenity": "bank"
-                },
-                "name": "Regions Bank",
-                "icon": "bank",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "atm",
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/bank/Росбанк": {
-                "tags": {
-                    "name": "Росбанк",
-                    "amenity": "bank"
-                },
-                "name": "Росбанк",
-                "icon": "bank",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "atm",
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/bank/Banco Estado": {
-                "tags": {
-                    "name": "Banco Estado",
-                    "amenity": "bank"
-                },
-                "name": "Banco Estado",
-                "icon": "bank",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "atm",
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/bank/BCI": {
-                "tags": {
-                    "name": "BCI",
-                    "amenity": "bank"
-                },
-                "name": "BCI",
-                "icon": "bank",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "atm",
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/bank/SunTrust": {
-                "tags": {
-                    "name": "SunTrust",
-                    "amenity": "bank"
-                },
-                "name": "SunTrust",
-                "icon": "bank",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "atm",
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/bank/PNC Bank": {
-                "tags": {
-                    "name": "PNC Bank",
-                    "amenity": "bank"
-                },
-                "name": "PNC Bank",
-                "icon": "bank",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "atm",
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/bank/신한은행": {
-                "tags": {
-                    "name": "신한은행",
-                    "name:en": "Sinhan Bank",
-                    "amenity": "bank"
-                },
-                "name": "신한은행",
-                "icon": "bank",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "atm",
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/bank/우리은행": {
-                "tags": {
-                    "name": "우리은행",
-                    "name:en": "Uri Bank",
-                    "amenity": "bank"
-                },
-                "name": "우리은행",
-                "icon": "bank",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "atm",
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/bank/국민은행": {
-                "tags": {
-                    "name": "국민은행",
-                    "name:en": "Gungmin Bank",
-                    "amenity": "bank"
-                },
-                "name": "국민은행",
-                "icon": "bank",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "atm",
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/bank/중소기업은행": {
-                "tags": {
-                    "name": "중소기업은행",
-                    "name:en": "Industrial Bank of Korea",
-                    "amenity": "bank"
-                },
-                "name": "중소기업은행",
-                "icon": "bank",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "atm",
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/bank/광주은행": {
-                "tags": {
-                    "name": "광주은행",
-                    "name:en": "Gwangju Bank",
-                    "amenity": "bank"
-                },
-                "name": "광주은행",
-                "icon": "bank",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "atm",
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/bank/Газпромбанк": {
-                "tags": {
-                    "name": "Газпромбанк",
-                    "amenity": "bank"
-                },
-                "name": "Газпромбанк",
-                "icon": "bank",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "atm",
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/bank/M&T Bank": {
-                "tags": {
-                    "name": "M&T Bank",
-                    "amenity": "bank"
-                },
-                "name": "M&T Bank",
-                "icon": "bank",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "atm",
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/bank/Caja de Burgos": {
-                "tags": {
-                    "name": "Caja de Burgos",
-                    "amenity": "bank"
-                },
-                "name": "Caja de Burgos",
-                "icon": "bank",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "atm",
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/bank/Santander Totta": {
-                "tags": {
-                    "name": "Santander Totta",
-                    "amenity": "bank"
-                },
-                "name": "Santander Totta",
-                "icon": "bank",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "atm",
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/bank/УкрСиббанк": {
-                "tags": {
-                    "name": "УкрСиббанк",
-                    "amenity": "bank"
-                },
-                "name": "УкрСиббанк",
-                "icon": "bank",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "atm",
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/bank/Ощадбанк": {
-                "tags": {
-                    "name": "Ощадбанк",
-                    "amenity": "bank"
-                },
-                "name": "Ощадбанк",
-                "icon": "bank",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "atm",
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/bank/Уралсиб": {
-                "tags": {
-                    "name": "Уралсиб",
-                    "amenity": "bank"
-                },
-                "name": "Уралсиб",
-                "icon": "bank",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "atm",
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/bank/りそな銀行": {
-                "tags": {
-                    "name": "りそな銀行",
-                    "name:en": "Mizuho Bank",
-                    "amenity": "bank"
-                },
-                "name": "りそな銀行",
-                "icon": "bank",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "atm",
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/bank/Ecobank": {
-                "tags": {
-                    "name": "Ecobank",
-                    "amenity": "bank"
-                },
-                "name": "Ecobank",
-                "icon": "bank",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "atm",
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/bank/Cajero Automatico Bancared": {
-                "tags": {
-                    "name": "Cajero Automatico Bancared",
-                    "amenity": "bank"
-                },
-                "name": "Cajero Automatico Bancared",
-                "icon": "bank",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "atm",
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/bank/Промсвязьбанк": {
-                "tags": {
-                    "name": "Промсвязьбанк",
-                    "amenity": "bank"
-                },
-                "name": "Промсвязьбанк",
-                "icon": "bank",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "atm",
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/bank/三井住友銀行": {
-                "tags": {
-                    "name": "三井住友銀行",
-                    "amenity": "bank"
-                },
-                "name": "三井住友銀行",
-                "icon": "bank",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "atm",
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/bank/Banco Provincia": {
-                "tags": {
-                    "name": "Banco Provincia",
-                    "amenity": "bank"
-                },
-                "name": "Banco Provincia",
-                "icon": "bank",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "atm",
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/bank/BB&T": {
-                "tags": {
-                    "name": "BB&T",
-                    "amenity": "bank"
-                },
-                "name": "BB&T",
-                "icon": "bank",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "atm",
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/bank/Возрождение": {
-                "tags": {
-                    "name": "Возрождение",
-                    "amenity": "bank"
-                },
-                "name": "Возрождение",
-                "icon": "bank",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "atm",
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/bank/Capital One": {
-                "tags": {
-                    "name": "Capital One",
-                    "amenity": "bank"
-                },
-                "name": "Capital One",
-                "icon": "bank",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "atm",
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/bank/横浜銀行": {
-                "tags": {
-                    "name": "横浜銀行",
-                    "amenity": "bank"
-                },
-                "name": "横浜銀行",
-                "icon": "bank",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "atm",
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/bank/Bank Mandiri": {
-                "tags": {
-                    "name": "Bank Mandiri",
-                    "amenity": "bank"
-                },
-                "name": "Bank Mandiri",
-                "icon": "bank",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "atm",
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/bank/Banco de la Nación": {
-                "tags": {
-                    "name": "Banco de la Nación",
-                    "amenity": "bank"
-                },
-                "name": "Banco de la Nación",
-                "icon": "bank",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "atm",
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/bank/Banco G&T Continental": {
-                "tags": {
-                    "name": "Banco G&T Continental",
-                    "amenity": "bank"
-                },
-                "name": "Banco G&T Continental",
-                "icon": "bank",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "atm",
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/bank/Peoples Bank": {
-                "tags": {
-                    "name": "Peoples Bank",
-                    "amenity": "bank"
-                },
-                "name": "Peoples Bank",
-                "icon": "bank",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "atm",
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/bank/工商银行": {
-                "tags": {
-                    "name": "工商银行",
-                    "amenity": "bank"
-                },
-                "name": "工商银行",
-                "icon": "bank",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "atm",
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/bank/Совкомбанк": {
-                "tags": {
-                    "name": "Совкомбанк",
-                    "amenity": "bank"
-                },
-                "name": "Совкомбанк",
-                "icon": "bank",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "atm",
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/bank/Provincial": {
-                "tags": {
-                    "name": "Provincial",
-                    "amenity": "bank"
-                },
-                "name": "Provincial",
-                "icon": "bank",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "atm",
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/bank/Banco de Desarrollo Banrural": {
-                "tags": {
-                    "name": "Banco de Desarrollo Banrural",
-                    "amenity": "bank"
-                },
-                "name": "Banco de Desarrollo Banrural",
-                "icon": "bank",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "atm",
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/bank/Banco Bradesco": {
-                "tags": {
-                    "name": "Banco Bradesco",
-                    "amenity": "bank"
-                },
-                "name": "Banco Bradesco",
-                "icon": "bank",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "atm",
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/bank/Bicentenario": {
-                "tags": {
-                    "name": "Bicentenario",
-                    "amenity": "bank"
-                },
-                "name": "Bicentenario",
-                "icon": "bank",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "atm",
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/bank/ლიბერთი ბანკი": {
-                "tags": {
-                    "name": "ლიბერთი ბანკი",
-                    "name:en": "Liberty Bank",
-                    "amenity": "bank"
-                },
-                "name": "ლიბერთი ბანკი",
-                "icon": "bank",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "atm",
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/bank/Banesco": {
-                "tags": {
-                    "name": "Banesco",
-                    "amenity": "bank"
-                },
-                "name": "Banesco",
-                "icon": "bank",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "atm",
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/bank/Mercantil": {
-                "tags": {
-                    "name": "Mercantil",
-                    "amenity": "bank"
-                },
-                "name": "Mercantil",
-                "icon": "bank",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "atm",
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/bank/Bank BRI": {
-                "tags": {
-                    "name": "Bank BRI",
-                    "amenity": "bank"
-                },
-                "name": "Bank BRI",
-                "icon": "bank",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "atm",
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/bank/Del Tesoro": {
-                "tags": {
-                    "name": "Del Tesoro",
-                    "amenity": "bank"
-                },
-                "name": "Del Tesoro",
-                "icon": "bank",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "atm",
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/bank/하나은행": {
-                "tags": {
-                    "name": "하나은행",
-                    "amenity": "bank"
-                },
-                "name": "하나은행",
-                "icon": "bank",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "atm",
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/bank/CityCommerce Bank": {
-                "tags": {
-                    "name": "CityCommerce Bank",
-                    "amenity": "bank"
-                },
-                "name": "CityCommerce Bank",
-                "icon": "bank",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "atm",
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/bank/De Venezuela": {
-                "tags": {
-                    "name": "De Venezuela",
-                    "amenity": "bank"
-                },
-                "name": "De Venezuela",
-                "icon": "bank",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "atm",
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/car_rental/Europcar": {
-                "tags": {
-                    "name": "Europcar",
-                    "amenity": "car_rental"
-                },
-                "name": "Europcar",
-                "icon": "car",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator"
-                ],
-                "suggestion": true
-            },
-            "amenity/car_rental/Budget": {
-                "tags": {
-                    "name": "Budget",
-                    "amenity": "car_rental"
-                },
-                "name": "Budget",
-                "icon": "car",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator"
-                ],
-                "suggestion": true
-            },
-            "amenity/car_rental/Sixt": {
-                "tags": {
-                    "name": "Sixt",
-                    "amenity": "car_rental"
-                },
-                "name": "Sixt",
-                "icon": "car",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator"
-                ],
-                "suggestion": true
-            },
-            "amenity/car_rental/Avis": {
-                "tags": {
-                    "name": "Avis",
-                    "amenity": "car_rental"
-                },
-                "name": "Avis",
-                "icon": "car",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator"
-                ],
-                "suggestion": true
-            },
-            "amenity/car_rental/Hertz": {
-                "tags": {
-                    "name": "Hertz",
-                    "amenity": "car_rental"
-                },
-                "name": "Hertz",
-                "icon": "car",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator"
-                ],
-                "suggestion": true
-            },
-            "amenity/car_rental/Enterprise": {
-                "tags": {
-                    "name": "Enterprise",
-                    "amenity": "car_rental"
-                },
-                "name": "Enterprise",
-                "icon": "car",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator"
-                ],
-                "suggestion": true
-            },
-            "amenity/car_rental/stadtmobil CarSharing-Station": {
-                "tags": {
-                    "name": "stadtmobil CarSharing-Station",
-                    "amenity": "car_rental"
-                },
-                "name": "stadtmobil CarSharing-Station",
-                "icon": "car",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator"
-                ],
-                "suggestion": true
-            },
-            "amenity/pharmacy/Rowlands Pharmacy": {
-                "tags": {
-                    "name": "Rowlands Pharmacy",
-                    "amenity": "pharmacy"
-                },
-                "name": "Rowlands Pharmacy",
-                "icon": "pharmacy",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/pharmacy/Boots": {
-                "tags": {
-                    "name": "Boots",
-                    "amenity": "pharmacy"
-                },
-                "name": "Boots",
-                "icon": "pharmacy",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/pharmacy/Marien-Apotheke": {
-                "tags": {
-                    "name": "Marien-Apotheke",
-                    "amenity": "pharmacy"
-                },
-                "name": "Marien-Apotheke",
-                "icon": "pharmacy",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/pharmacy/Mercury Drug": {
-                "tags": {
-                    "name": "Mercury Drug",
-                    "amenity": "pharmacy"
-                },
-                "name": "Mercury Drug",
-                "icon": "pharmacy",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/pharmacy/Löwen-Apotheke": {
-                "tags": {
-                    "name": "Löwen-Apotheke",
-                    "amenity": "pharmacy"
-                },
-                "name": "Löwen-Apotheke",
-                "icon": "pharmacy",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/pharmacy/Superdrug": {
-                "tags": {
-                    "name": "Superdrug",
-                    "amenity": "pharmacy"
-                },
-                "name": "Superdrug",
-                "icon": "pharmacy",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/pharmacy/Sonnen-Apotheke": {
-                "tags": {
-                    "name": "Sonnen-Apotheke",
-                    "amenity": "pharmacy"
-                },
-                "name": "Sonnen-Apotheke",
-                "icon": "pharmacy",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/pharmacy/Rathaus-Apotheke": {
-                "tags": {
-                    "name": "Rathaus-Apotheke",
-                    "amenity": "pharmacy"
-                },
-                "name": "Rathaus-Apotheke",
-                "icon": "pharmacy",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/pharmacy/Engel-Apotheke": {
-                "tags": {
-                    "name": "Engel-Apotheke",
-                    "amenity": "pharmacy"
-                },
-                "name": "Engel-Apotheke",
-                "icon": "pharmacy",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/pharmacy/Hirsch-Apotheke": {
-                "tags": {
-                    "name": "Hirsch-Apotheke",
-                    "amenity": "pharmacy"
-                },
-                "name": "Hirsch-Apotheke",
-                "icon": "pharmacy",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/pharmacy/Stern-Apotheke": {
-                "tags": {
-                    "name": "Stern-Apotheke",
-                    "amenity": "pharmacy"
-                },
-                "name": "Stern-Apotheke",
-                "icon": "pharmacy",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/pharmacy/Lloyds Pharmacy": {
-                "tags": {
-                    "name": "Lloyds Pharmacy",
-                    "amenity": "pharmacy"
-                },
-                "name": "Lloyds Pharmacy",
-                "icon": "pharmacy",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/pharmacy/Rosen-Apotheke": {
-                "tags": {
-                    "name": "Rosen-Apotheke",
-                    "amenity": "pharmacy"
-                },
-                "name": "Rosen-Apotheke",
-                "icon": "pharmacy",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/pharmacy/Stadt-Apotheke": {
-                "tags": {
-                    "name": "Stadt-Apotheke",
-                    "amenity": "pharmacy"
-                },
-                "name": "Stadt-Apotheke",
-                "icon": "pharmacy",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/pharmacy/Markt-Apotheke": {
-                "tags": {
-                    "name": "Markt-Apotheke",
-                    "amenity": "pharmacy"
-                },
-                "name": "Markt-Apotheke",
-                "icon": "pharmacy",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/pharmacy/Аптека": {
-                "tags": {
-                    "name": "Аптека",
-                    "amenity": "pharmacy"
-                },
-                "name": "Аптека",
-                "icon": "pharmacy",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/pharmacy/Pharmasave": {
-                "tags": {
-                    "name": "Pharmasave",
-                    "amenity": "pharmacy"
-                },
-                "name": "Pharmasave",
-                "icon": "pharmacy",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/pharmacy/Brunnen-Apotheke": {
-                "tags": {
-                    "name": "Brunnen-Apotheke",
-                    "amenity": "pharmacy"
-                },
-                "name": "Brunnen-Apotheke",
-                "icon": "pharmacy",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/pharmacy/Shoppers Drug Mart": {
-                "tags": {
-                    "name": "Shoppers Drug Mart",
-                    "amenity": "pharmacy"
-                },
-                "name": "Shoppers Drug Mart",
-                "icon": "pharmacy",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/pharmacy/Apotheke am Markt": {
-                "tags": {
-                    "name": "Apotheke am Markt",
-                    "amenity": "pharmacy"
-                },
-                "name": "Apotheke am Markt",
-                "icon": "pharmacy",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/pharmacy/Alte Apotheke": {
-                "tags": {
-                    "name": "Alte Apotheke",
-                    "amenity": "pharmacy"
-                },
-                "name": "Alte Apotheke",
-                "icon": "pharmacy",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/pharmacy/Neue Apotheke": {
-                "tags": {
-                    "name": "Neue Apotheke",
-                    "amenity": "pharmacy"
-                },
-                "name": "Neue Apotheke",
-                "icon": "pharmacy",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/pharmacy/Gintarinė vaistinė": {
-                "tags": {
-                    "name": "Gintarinė vaistinė",
-                    "amenity": "pharmacy"
-                },
-                "name": "Gintarinė vaistinė",
-                "icon": "pharmacy",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/pharmacy/Rats-Apotheke": {
-                "tags": {
-                    "name": "Rats-Apotheke",
-                    "amenity": "pharmacy"
-                },
-                "name": "Rats-Apotheke",
-                "icon": "pharmacy",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/pharmacy/Adler Apotheke": {
-                "tags": {
-                    "name": "Adler Apotheke",
-                    "amenity": "pharmacy"
-                },
-                "name": "Adler Apotheke",
-                "icon": "pharmacy",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/pharmacy/Pharmacie Centrale": {
-                "tags": {
-                    "name": "Pharmacie Centrale",
-                    "amenity": "pharmacy"
-                },
-                "name": "Pharmacie Centrale",
-                "icon": "pharmacy",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/pharmacy/Walgreens": {
-                "tags": {
-                    "name": "Walgreens",
-                    "amenity": "pharmacy"
-                },
-                "name": "Walgreens",
-                "icon": "pharmacy",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/pharmacy/Rite Aid": {
-                "tags": {
-                    "name": "Rite Aid",
-                    "amenity": "pharmacy"
-                },
-                "name": "Rite Aid",
-                "icon": "pharmacy",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/pharmacy/Apotheke": {
-                "tags": {
-                    "name": "Apotheke",
-                    "amenity": "pharmacy"
-                },
-                "name": "Apotheke",
-                "icon": "pharmacy",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/pharmacy/Linden-Apotheke": {
-                "tags": {
-                    "name": "Linden-Apotheke",
-                    "amenity": "pharmacy"
-                },
-                "name": "Linden-Apotheke",
-                "icon": "pharmacy",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/pharmacy/Bahnhof-Apotheke": {
-                "tags": {
-                    "name": "Bahnhof-Apotheke",
-                    "amenity": "pharmacy"
-                },
-                "name": "Bahnhof-Apotheke",
-                "icon": "pharmacy",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/pharmacy/Burg-Apotheke": {
-                "tags": {
-                    "name": "Burg-Apotheke",
-                    "amenity": "pharmacy"
-                },
-                "name": "Burg-Apotheke",
-                "icon": "pharmacy",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/pharmacy/Jean Coutu": {
-                "tags": {
-                    "name": "Jean Coutu",
-                    "amenity": "pharmacy"
-                },
-                "name": "Jean Coutu",
-                "icon": "pharmacy",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/pharmacy/Pharmaprix": {
-                "tags": {
-                    "name": "Pharmaprix",
-                    "amenity": "pharmacy"
-                },
-                "name": "Pharmaprix",
-                "icon": "pharmacy",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/pharmacy/Farmacias Ahumada": {
-                "tags": {
-                    "name": "Farmacias Ahumada",
-                    "amenity": "pharmacy"
-                },
-                "name": "Farmacias Ahumada",
-                "icon": "pharmacy",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/pharmacy/Farmacia Comunale": {
-                "tags": {
-                    "name": "Farmacia Comunale",
-                    "amenity": "pharmacy"
-                },
-                "name": "Farmacia Comunale",
-                "icon": "pharmacy",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/pharmacy/Farmacias Cruz Verde": {
-                "tags": {
-                    "name": "Farmacias Cruz Verde",
-                    "amenity": "pharmacy"
-                },
-                "name": "Farmacias Cruz Verde",
-                "icon": "pharmacy",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/pharmacy/Cruz Verde": {
-                "tags": {
-                    "name": "Cruz Verde",
-                    "amenity": "pharmacy"
-                },
-                "name": "Cruz Verde",
-                "icon": "pharmacy",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/pharmacy/Hubertus Apotheke": {
-                "tags": {
-                    "name": "Hubertus Apotheke",
-                    "amenity": "pharmacy"
-                },
-                "name": "Hubertus Apotheke",
-                "icon": "pharmacy",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/pharmacy/CVS": {
-                "tags": {
-                    "name": "CVS",
-                    "amenity": "pharmacy"
-                },
-                "name": "CVS",
-                "icon": "pharmacy",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/pharmacy/Farmacias SalcoBrand": {
-                "tags": {
-                    "name": "Farmacias SalcoBrand",
-                    "amenity": "pharmacy"
-                },
-                "name": "Farmacias SalcoBrand",
-                "icon": "pharmacy",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/pharmacy/Фармация": {
-                "tags": {
-                    "name": "Фармация",
-                    "amenity": "pharmacy"
-                },
-                "name": "Фармация",
-                "icon": "pharmacy",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/pharmacy/Bären-Apotheke": {
-                "tags": {
-                    "name": "Bären-Apotheke",
-                    "amenity": "pharmacy"
-                },
-                "name": "Bären-Apotheke",
-                "icon": "pharmacy",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/pharmacy/Clicks": {
-                "tags": {
-                    "name": "Clicks",
-                    "amenity": "pharmacy"
-                },
-                "name": "Clicks",
-                "icon": "pharmacy",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/pharmacy/セイジョー": {
-                "tags": {
-                    "name": "セイジョー",
-                    "amenity": "pharmacy"
-                },
-                "name": "セイジョー",
-                "icon": "pharmacy",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/pharmacy/マツモトキヨシ": {
-                "tags": {
-                    "name": "マツモトキヨシ",
-                    "amenity": "pharmacy"
-                },
-                "name": "マツモトキヨシ",
-                "icon": "pharmacy",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/pharmacy/Dr. Max": {
-                "tags": {
-                    "name": "Dr. Max",
-                    "amenity": "pharmacy"
-                },
-                "name": "Dr. Max",
-                "icon": "pharmacy",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/pharmacy/Вита": {
-                "tags": {
-                    "name": "Вита",
-                    "amenity": "pharmacy"
-                },
-                "name": "Вита",
-                "icon": "pharmacy",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/pharmacy/サンドラッグ": {
-                "tags": {
-                    "name": "サンドラッグ",
-                    "amenity": "pharmacy"
-                },
-                "name": "サンドラッグ",
-                "icon": "pharmacy",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/pharmacy/Apteka": {
-                "tags": {
-                    "name": "Apteka",
-                    "amenity": "pharmacy"
-                },
-                "name": "Apteka",
-                "icon": "pharmacy",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/pharmacy/Первая помощь": {
-                "tags": {
-                    "name": "Первая помощь",
-                    "amenity": "pharmacy"
-                },
-                "name": "Первая помощь",
-                "icon": "pharmacy",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/pharmacy/Ригла": {
-                "tags": {
-                    "name": "Ригла",
-                    "amenity": "pharmacy"
-                },
-                "name": "Ригла",
-                "icon": "pharmacy",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/pharmacy/Имплозия": {
-                "tags": {
-                    "name": "Имплозия",
-                    "amenity": "pharmacy"
-                },
-                "name": "Имплозия",
-                "icon": "pharmacy",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/pharmacy/Kinney Drugs": {
-                "tags": {
-                    "name": "Kinney Drugs",
-                    "amenity": "pharmacy"
-                },
-                "name": "Kinney Drugs",
-                "icon": "pharmacy",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/pharmacy/Классика": {
-                "tags": {
-                    "name": "Классика",
-                    "amenity": "pharmacy"
-                },
-                "name": "Классика",
-                "icon": "pharmacy",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/pharmacy/Ljekarna": {
-                "tags": {
-                    "name": "Ljekarna",
-                    "amenity": "pharmacy"
-                },
-                "name": "Ljekarna",
-                "icon": "pharmacy",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/pharmacy/SalcoBrand": {
-                "tags": {
-                    "name": "SalcoBrand",
-                    "amenity": "pharmacy"
-                },
-                "name": "SalcoBrand",
-                "icon": "pharmacy",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/pharmacy/Аптека 36,6": {
-                "tags": {
-                    "name": "Аптека 36,6",
-                    "amenity": "pharmacy"
-                },
-                "name": "Аптека 36,6",
-                "icon": "pharmacy",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/pharmacy/Фармакор": {
-                "tags": {
-                    "name": "Фармакор",
-                    "amenity": "pharmacy"
-                },
-                "name": "Фармакор",
-                "icon": "pharmacy",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/pharmacy/スギ薬局": {
-                "tags": {
-                    "name": "スギ薬局",
-                    "amenity": "pharmacy"
-                },
-                "name": "スギ薬局",
-                "icon": "pharmacy",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/pharmacy/Аптечный пункт": {
-                "tags": {
-                    "name": "Аптечный пункт",
-                    "amenity": "pharmacy"
-                },
-                "name": "Аптечный пункт",
-                "icon": "pharmacy",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/pharmacy/Невис": {
-                "tags": {
-                    "name": "Невис",
-                    "amenity": "pharmacy"
-                },
-                "name": "Невис",
-                "icon": "pharmacy",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/pharmacy/トモズ (Tomod's)": {
-                "tags": {
-                    "name": "トモズ (Tomod's)",
-                    "amenity": "pharmacy"
-                },
-                "name": "トモズ (Tomod's)",
-                "icon": "pharmacy",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/pharmacy/Eurovaistinė": {
-                "tags": {
-                    "name": "Eurovaistinė",
-                    "amenity": "pharmacy"
-                },
-                "name": "Eurovaistinė",
-                "icon": "pharmacy",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/pharmacy/Farmacity": {
-                "tags": {
-                    "name": "Farmacity",
-                    "amenity": "pharmacy"
-                },
-                "name": "Farmacity",
-                "icon": "pharmacy",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/pharmacy/аптека": {
-                "tags": {
-                    "name": "аптека",
-                    "amenity": "pharmacy"
-                },
-                "name": "аптека",
-                "icon": "pharmacy",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/pharmacy/The Generics Pharmacy": {
-                "tags": {
-                    "name": "The Generics Pharmacy",
-                    "amenity": "pharmacy"
-                },
-                "name": "The Generics Pharmacy",
-                "icon": "pharmacy",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/pharmacy/Farmatodo": {
-                "tags": {
-                    "name": "Farmatodo",
-                    "amenity": "pharmacy"
-                },
-                "name": "Farmatodo",
-                "icon": "pharmacy",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/pharmacy/Duane Reade": {
-                "tags": {
-                    "name": "Duane Reade",
-                    "amenity": "pharmacy"
-                },
-                "name": "Duane Reade",
-                "icon": "pharmacy",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/pharmacy/Фармленд": {
-                "tags": {
-                    "name": "Фармленд",
-                    "amenity": "pharmacy"
-                },
-                "name": "Фармленд",
-                "icon": "pharmacy",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/pharmacy/ドラッグてらしま (Drug Terashima)": {
-                "tags": {
-                    "name": "ドラッグてらしま (Drug Terashima)",
-                    "amenity": "pharmacy"
-                },
-                "name": "ドラッグてらしま (Drug Terashima)",
-                "icon": "pharmacy",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/pharmacy/Арніка": {
-                "tags": {
-                    "name": "Арніка",
-                    "amenity": "pharmacy"
-                },
-                "name": "Арніка",
-                "icon": "pharmacy",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/pharmacy/ავერსი (Aversi)": {
-                "tags": {
-                    "name": "ავერსი (Aversi)",
-                    "amenity": "pharmacy"
-                },
-                "name": "ავერსი (Aversi)",
-                "icon": "pharmacy",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/pharmacy/Farmahorro": {
-                "tags": {
-                    "name": "Farmahorro",
-                    "amenity": "pharmacy"
-                },
-                "name": "Farmahorro",
-                "icon": "pharmacy",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "amenity/cafe/Starbucks": {
-                "tags": {
-                    "name": "Starbucks",
-                    "cuisine": "coffee_shop",
-                    "amenity": "cafe"
-                },
-                "name": "Starbucks",
-                "icon": "cafe",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "cuisine",
-                    "internet_access",
-                    "address",
-                    "building_area",
-                    "opening_hours",
-                    "smoking"
-                ],
-                "suggestion": true
-            },
-            "amenity/cafe/Cafeteria": {
-                "tags": {
-                    "name": "Cafeteria",
-                    "amenity": "cafe"
-                },
-                "name": "Cafeteria",
-                "icon": "cafe",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "cuisine",
-                    "internet_access",
-                    "address",
-                    "building_area",
-                    "opening_hours",
-                    "smoking"
-                ],
-                "suggestion": true
-            },
-            "amenity/cafe/Costa": {
-                "tags": {
-                    "name": "Costa",
-                    "amenity": "cafe"
-                },
-                "name": "Costa",
-                "icon": "cafe",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "cuisine",
-                    "internet_access",
-                    "address",
-                    "building_area",
-                    "opening_hours",
-                    "smoking"
-                ],
-                "suggestion": true
-            },
-            "amenity/cafe/Caffè Nero": {
-                "tags": {
-                    "name": "Caffè Nero",
-                    "amenity": "cafe"
-                },
-                "name": "Caffè Nero",
-                "icon": "cafe",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "cuisine",
-                    "internet_access",
-                    "address",
-                    "building_area",
-                    "opening_hours",
-                    "smoking"
-                ],
-                "suggestion": true
-            },
-            "amenity/cafe/Кафе": {
-                "tags": {
-                    "name": "Кафе",
-                    "amenity": "cafe"
-                },
-                "name": "Кафе",
-                "icon": "cafe",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "cuisine",
-                    "internet_access",
-                    "address",
-                    "building_area",
-                    "opening_hours",
-                    "smoking"
-                ],
-                "suggestion": true
-            },
-            "amenity/cafe/Café Central": {
-                "tags": {
-                    "name": "Café Central",
-                    "amenity": "cafe"
-                },
-                "name": "Café Central",
-                "icon": "cafe",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "cuisine",
-                    "internet_access",
-                    "address",
-                    "building_area",
-                    "opening_hours",
-                    "smoking"
-                ],
-                "suggestion": true
-            },
-            "amenity/cafe/Second Cup": {
-                "tags": {
-                    "name": "Second Cup",
-                    "amenity": "cafe"
-                },
-                "name": "Second Cup",
-                "icon": "cafe",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "cuisine",
-                    "internet_access",
-                    "address",
-                    "building_area",
-                    "opening_hours",
-                    "smoking"
-                ],
-                "suggestion": true
-            },
-            "amenity/cafe/Eisdiele": {
-                "tags": {
-                    "name": "Eisdiele",
-                    "amenity": "cafe"
-                },
-                "name": "Eisdiele",
-                "icon": "cafe",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "cuisine",
-                    "internet_access",
-                    "address",
-                    "building_area",
-                    "opening_hours",
-                    "smoking"
-                ],
-                "suggestion": true
-            },
-            "amenity/cafe/Dunkin Donuts": {
-                "tags": {
-                    "name": "Dunkin Donuts",
-                    "cuisine": "donut",
-                    "amenity": "cafe"
-                },
-                "name": "Dunkin Donuts",
-                "icon": "cafe",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "cuisine",
-                    "internet_access",
-                    "address",
-                    "building_area",
-                    "opening_hours",
-                    "smoking"
-                ],
-                "suggestion": true
-            },
-            "amenity/cafe/Espresso House": {
-                "tags": {
-                    "name": "Espresso House",
-                    "amenity": "cafe"
-                },
-                "name": "Espresso House",
-                "icon": "cafe",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "cuisine",
-                    "internet_access",
-                    "address",
-                    "building_area",
-                    "opening_hours",
-                    "smoking"
-                ],
-                "suggestion": true
-            },
-            "amenity/cafe/Segafredo": {
-                "tags": {
-                    "name": "Segafredo",
-                    "amenity": "cafe"
-                },
-                "name": "Segafredo",
-                "icon": "cafe",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "cuisine",
-                    "internet_access",
-                    "address",
-                    "building_area",
-                    "opening_hours",
-                    "smoking"
-                ],
-                "suggestion": true
-            },
-            "amenity/cafe/Coffee Time": {
-                "tags": {
-                    "name": "Coffee Time",
-                    "amenity": "cafe"
-                },
-                "name": "Coffee Time",
-                "icon": "cafe",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "cuisine",
-                    "internet_access",
-                    "address",
-                    "building_area",
-                    "opening_hours",
-                    "smoking"
-                ],
-                "suggestion": true
-            },
-            "amenity/cafe/Cafe Coffee Day": {
-                "tags": {
-                    "name": "Cafe Coffee Day",
-                    "amenity": "cafe"
-                },
-                "name": "Cafe Coffee Day",
-                "icon": "cafe",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "cuisine",
-                    "internet_access",
-                    "address",
-                    "building_area",
-                    "opening_hours",
-                    "smoking"
-                ],
-                "suggestion": true
-            },
-            "amenity/cafe/Eiscafe Venezia": {
-                "tags": {
-                    "name": "Eiscafe Venezia",
-                    "amenity": "cafe"
-                },
-                "name": "Eiscafe Venezia",
-                "icon": "cafe",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "cuisine",
-                    "internet_access",
-                    "address",
-                    "building_area",
-                    "opening_hours",
-                    "smoking"
-                ],
-                "suggestion": true
-            },
-            "amenity/cafe/スターバックス": {
-                "tags": {
-                    "name": "スターバックス",
-                    "name:en": "Starbucks",
-                    "amenity": "cafe"
-                },
-                "name": "スターバックス",
-                "icon": "cafe",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "cuisine",
-                    "internet_access",
-                    "address",
-                    "building_area",
-                    "opening_hours",
-                    "smoking"
-                ],
-                "suggestion": true
-            },
-            "amenity/cafe/Шоколадница": {
-                "tags": {
-                    "name": "Шоколадница",
-                    "amenity": "cafe"
-                },
-                "name": "Шоколадница",
-                "icon": "cafe",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "cuisine",
-                    "internet_access",
-                    "address",
-                    "building_area",
-                    "opening_hours",
-                    "smoking"
-                ],
-                "suggestion": true
-            },
-            "amenity/cafe/Pret A Manger": {
-                "tags": {
-                    "name": "Pret A Manger",
-                    "amenity": "cafe"
-                },
-                "name": "Pret A Manger",
-                "icon": "cafe",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "cuisine",
-                    "internet_access",
-                    "address",
-                    "building_area",
-                    "opening_hours",
-                    "smoking"
-                ],
-                "suggestion": true
-            },
-            "amenity/cafe/Столовая": {
-                "tags": {
-                    "name": "Столовая",
-                    "amenity": "cafe"
-                },
-                "name": "Столовая",
-                "icon": "cafe",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "cuisine",
-                    "internet_access",
-                    "address",
-                    "building_area",
-                    "opening_hours",
-                    "smoking"
-                ],
-                "suggestion": true
-            },
-            "amenity/cafe/ドトール": {
-                "tags": {
-                    "name": "ドトール",
-                    "name:en": "DOUTOR",
-                    "amenity": "cafe"
-                },
-                "name": "ドトール",
-                "icon": "cafe",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "cuisine",
-                    "internet_access",
-                    "address",
-                    "building_area",
-                    "opening_hours",
-                    "smoking"
-                ],
-                "suggestion": true
-            },
-            "amenity/cafe/Tchibo": {
-                "tags": {
-                    "name": "Tchibo",
-                    "amenity": "cafe"
-                },
-                "name": "Tchibo",
-                "icon": "cafe",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "cuisine",
-                    "internet_access",
-                    "address",
-                    "building_area",
-                    "opening_hours",
-                    "smoking"
-                ],
-                "suggestion": true
-            },
-            "amenity/cafe/Кофе Хауз": {
-                "tags": {
-                    "name": "Кофе Хауз",
-                    "amenity": "cafe"
-                },
-                "name": "Кофе Хауз",
-                "icon": "cafe",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "cuisine",
-                    "internet_access",
-                    "address",
-                    "building_area",
-                    "opening_hours",
-                    "smoking"
-                ],
-                "suggestion": true
-            },
-            "amenity/cafe/Caribou Coffee": {
-                "tags": {
-                    "name": "Caribou Coffee",
-                    "amenity": "cafe"
-                },
-                "name": "Caribou Coffee",
-                "icon": "cafe",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "cuisine",
-                    "internet_access",
-                    "address",
-                    "building_area",
-                    "opening_hours",
-                    "smoking"
-                ],
-                "suggestion": true
-            },
-            "amenity/cafe/Уют": {
-                "tags": {
-                    "name": "Уют",
-                    "amenity": "cafe"
-                },
-                "name": "Уют",
-                "icon": "cafe",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "cuisine",
-                    "internet_access",
-                    "address",
-                    "building_area",
-                    "opening_hours",
-                    "smoking"
-                ],
-                "suggestion": true
-            },
-            "amenity/cafe/Шашлычная": {
-                "tags": {
-                    "name": "Шашлычная",
-                    "amenity": "cafe"
-                },
-                "name": "Шашлычная",
-                "icon": "cafe",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "cuisine",
-                    "internet_access",
-                    "address",
-                    "building_area",
-                    "opening_hours",
-                    "smoking"
-                ],
-                "suggestion": true
-            },
-            "amenity/cafe/คาเฟ่ อเมซอน": {
-                "tags": {
-                    "name": "คาเฟ่ อเมซอน",
-                    "amenity": "cafe"
-                },
-                "name": "คาเฟ่ อเมซอน",
-                "icon": "cafe",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "cuisine",
-                    "internet_access",
-                    "address",
-                    "building_area",
-                    "opening_hours",
-                    "smoking"
-                ],
-                "suggestion": true
-            },
-            "amenity/cafe/Traveler's Coffee": {
-                "tags": {
-                    "name": "Traveler's Coffee",
-                    "amenity": "cafe"
-                },
-                "name": "Traveler's Coffee",
-                "icon": "cafe",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "cuisine",
-                    "internet_access",
-                    "address",
-                    "building_area",
-                    "opening_hours",
-                    "smoking"
-                ],
-                "suggestion": true
-            },
-            "amenity/cafe/カフェ・ド・クリエ": {
-                "tags": {
-                    "name": "カフェ・ド・クリエ",
-                    "name:en": "Cafe de CRIE",
-                    "amenity": "cafe"
-                },
-                "name": "カフェ・ド・クリエ",
-                "icon": "cafe",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "cuisine",
-                    "internet_access",
-                    "address",
-                    "building_area",
-                    "opening_hours",
-                    "smoking"
-                ],
-                "suggestion": true
-            },
-            "amenity/cafe/Cafe Amazon": {
-                "tags": {
-                    "name": "Cafe Amazon",
-                    "amenity": "cafe"
-                },
-                "name": "Cafe Amazon",
-                "icon": "cafe",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "cuisine",
-                    "internet_access",
-                    "address",
-                    "building_area",
-                    "opening_hours",
-                    "smoking"
-                ],
-                "suggestion": true
-            },
-            "shop/supermarket/Budgens": {
-                "tags": {
-                    "name": "Budgens",
-                    "shop": "supermarket"
-                },
-                "name": "Budgens",
-                "icon": "grocery",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/supermarket/Morrisons": {
-                "tags": {
-                    "name": "Morrisons",
-                    "shop": "supermarket"
-                },
-                "name": "Morrisons",
-                "icon": "grocery",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/supermarket/Interspar": {
-                "tags": {
-                    "name": "Interspar",
-                    "shop": "supermarket"
-                },
-                "name": "Interspar",
-                "icon": "grocery",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/supermarket/Merkur": {
-                "tags": {
-                    "name": "Merkur",
-                    "shop": "supermarket"
-                },
-                "name": "Merkur",
-                "icon": "grocery",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/supermarket/Sainsbury's": {
-                "tags": {
-                    "name": "Sainsbury's",
-                    "shop": "supermarket"
-                },
-                "name": "Sainsbury's",
-                "icon": "grocery",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/supermarket/Lidl": {
-                "tags": {
-                    "name": "Lidl",
-                    "shop": "supermarket"
-                },
-                "name": "Lidl",
-                "icon": "grocery",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/supermarket/EDEKA": {
-                "tags": {
-                    "name": "EDEKA",
-                    "shop": "supermarket"
-                },
-                "name": "EDEKA",
-                "icon": "grocery",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/supermarket/Coles": {
-                "tags": {
-                    "name": "Coles",
-                    "shop": "supermarket"
-                },
-                "name": "Coles",
-                "icon": "grocery",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/supermarket/Iceland": {
-                "tags": {
-                    "name": "Iceland",
-                    "shop": "supermarket"
-                },
-                "name": "Iceland",
-                "icon": "grocery",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/supermarket/Coop": {
-                "tags": {
-                    "name": "Coop",
-                    "shop": "supermarket"
-                },
-                "name": "Coop",
-                "icon": "grocery",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/supermarket/Tesco": {
-                "tags": {
-                    "name": "Tesco",
-                    "shop": "supermarket"
-                },
-                "name": "Tesco",
-                "icon": "grocery",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/supermarket/Woolworths": {
-                "tags": {
-                    "name": "Woolworths",
-                    "shop": "supermarket"
-                },
-                "name": "Woolworths",
-                "icon": "grocery",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/supermarket/Zielpunkt": {
-                "tags": {
-                    "name": "Zielpunkt",
-                    "shop": "supermarket"
-                },
-                "name": "Zielpunkt",
-                "icon": "grocery",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/supermarket/Nahkauf": {
-                "tags": {
-                    "name": "Nahkauf",
-                    "shop": "supermarket"
-                },
-                "name": "Nahkauf",
-                "icon": "grocery",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/supermarket/Billa": {
-                "tags": {
-                    "name": "Billa",
-                    "shop": "supermarket"
-                },
-                "name": "Billa",
-                "icon": "grocery",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/supermarket/Kaufland": {
-                "tags": {
-                    "name": "Kaufland",
-                    "shop": "supermarket"
-                },
-                "name": "Kaufland",
-                "icon": "grocery",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/supermarket/Plus": {
-                "tags": {
-                    "name": "Plus",
-                    "shop": "supermarket"
-                },
-                "name": "Plus",
-                "icon": "grocery",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/supermarket/ALDI": {
-                "tags": {
-                    "name": "ALDI",
-                    "shop": "supermarket"
-                },
-                "name": "ALDI",
-                "icon": "grocery",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/supermarket/Checkers": {
-                "tags": {
-                    "name": "Checkers",
-                    "shop": "supermarket"
-                },
-                "name": "Checkers",
-                "icon": "grocery",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/supermarket/Tesco Metro": {
-                "tags": {
-                    "name": "Tesco Metro",
-                    "shop": "supermarket"
-                },
-                "name": "Tesco Metro",
-                "icon": "grocery",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/supermarket/NP": {
-                "tags": {
-                    "name": "NP",
-                    "shop": "supermarket"
-                },
-                "name": "NP",
-                "icon": "grocery",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/supermarket/Penny": {
-                "tags": {
-                    "name": "Penny",
-                    "shop": "supermarket"
-                },
-                "name": "Penny",
-                "icon": "grocery",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/supermarket/Norma": {
-                "tags": {
-                    "name": "Norma",
-                    "shop": "supermarket"
-                },
-                "name": "Norma",
-                "icon": "grocery",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/supermarket/Asda": {
-                "tags": {
-                    "name": "Asda",
-                    "shop": "supermarket"
-                },
-                "name": "Asda",
-                "icon": "grocery",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/supermarket/Netto": {
-                "tags": {
-                    "name": "Netto",
-                    "shop": "supermarket"
-                },
-                "name": "Netto",
-                "icon": "grocery",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/supermarket/REWE": {
-                "tags": {
-                    "name": "REWE",
-                    "shop": "supermarket"
-                },
-                "name": "REWE",
-                "icon": "grocery",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/supermarket/Rewe": {
-                "tags": {
-                    "name": "Rewe",
-                    "shop": "supermarket"
-                },
-                "name": "Rewe",
-                "icon": "grocery",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/supermarket/Aldi Süd": {
-                "tags": {
-                    "name": "Aldi Süd",
-                    "shop": "supermarket"
-                },
-                "name": "Aldi Süd",
-                "icon": "grocery",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/supermarket/Real": {
-                "tags": {
-                    "name": "Real",
-                    "shop": "supermarket"
-                },
-                "name": "Real",
-                "icon": "grocery",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/supermarket/King Soopers": {
-                "tags": {
-                    "name": "King Soopers",
-                    "shop": "supermarket"
-                },
-                "name": "King Soopers",
-                "icon": "grocery",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/supermarket/Kiwi": {
-                "tags": {
-                    "name": "Kiwi",
-                    "shop": "supermarket"
-                },
-                "name": "Kiwi",
-                "icon": "grocery",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/supermarket/Edeka": {
-                "tags": {
-                    "name": "Edeka",
-                    "shop": "supermarket"
-                },
-                "name": "Edeka",
-                "icon": "grocery",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/supermarket/Pick n Pay": {
-                "tags": {
-                    "name": "Pick n Pay",
-                    "shop": "supermarket"
-                },
-                "name": "Pick n Pay",
-                "icon": "grocery",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/supermarket/ICA": {
-                "tags": {
-                    "name": "ICA",
-                    "shop": "supermarket"
-                },
-                "name": "ICA",
-                "icon": "grocery",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/supermarket/Tengelmann": {
-                "tags": {
-                    "name": "Tengelmann",
-                    "shop": "supermarket"
-                },
-                "name": "Tengelmann",
-                "icon": "grocery",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/supermarket/Carrefour": {
-                "tags": {
-                    "name": "Carrefour",
-                    "shop": "supermarket"
-                },
-                "name": "Carrefour",
-                "icon": "grocery",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/supermarket/Waitrose": {
-                "tags": {
-                    "name": "Waitrose",
-                    "shop": "supermarket"
-                },
-                "name": "Waitrose",
-                "icon": "grocery",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/supermarket/Spar": {
-                "tags": {
-                    "name": "Spar",
-                    "shop": "supermarket"
-                },
-                "name": "Spar",
-                "icon": "grocery",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/supermarket/Hofer": {
-                "tags": {
-                    "name": "Hofer",
-                    "shop": "supermarket"
-                },
-                "name": "Hofer",
-                "icon": "grocery",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/supermarket/M-Preis": {
-                "tags": {
-                    "name": "M-Preis",
-                    "shop": "supermarket"
-                },
-                "name": "M-Preis",
-                "icon": "grocery",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/supermarket/LIDL": {
-                "tags": {
-                    "name": "LIDL",
-                    "shop": "supermarket"
-                },
-                "name": "LIDL",
-                "icon": "grocery",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/supermarket/tegut": {
-                "tags": {
-                    "name": "tegut",
-                    "shop": "supermarket"
-                },
-                "name": "tegut",
-                "icon": "grocery",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/supermarket/Sainsbury's Local": {
-                "tags": {
-                    "name": "Sainsbury's Local",
-                    "shop": "supermarket"
-                },
-                "name": "Sainsbury's Local",
-                "icon": "grocery",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/supermarket/E-Center": {
-                "tags": {
-                    "name": "E-Center",
-                    "shop": "supermarket"
-                },
-                "name": "E-Center",
-                "icon": "grocery",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/supermarket/Aldi Nord": {
-                "tags": {
-                    "name": "Aldi Nord",
-                    "shop": "supermarket"
-                },
-                "name": "Aldi Nord",
-                "icon": "grocery",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/supermarket/nahkauf": {
-                "tags": {
-                    "name": "nahkauf",
-                    "shop": "supermarket"
-                },
-                "name": "nahkauf",
-                "icon": "grocery",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/supermarket/Meijer": {
-                "tags": {
-                    "name": "Meijer",
-                    "shop": "supermarket"
-                },
-                "name": "Meijer",
-                "icon": "grocery",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/supermarket/Safeway": {
-                "tags": {
-                    "name": "Safeway",
-                    "shop": "supermarket"
-                },
-                "name": "Safeway",
-                "icon": "grocery",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/supermarket/Costco": {
-                "tags": {
-                    "name": "Costco",
-                    "shop": "supermarket"
-                },
-                "name": "Costco",
-                "icon": "grocery",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/supermarket/Albert": {
-                "tags": {
-                    "name": "Albert",
-                    "shop": "supermarket"
-                },
-                "name": "Albert",
-                "icon": "grocery",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/supermarket/Jumbo": {
-                "tags": {
-                    "name": "Jumbo",
-                    "shop": "supermarket"
-                },
-                "name": "Jumbo",
-                "icon": "grocery",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/supermarket/Shoprite": {
-                "tags": {
-                    "name": "Shoprite",
-                    "shop": "supermarket"
-                },
-                "name": "Shoprite",
-                "icon": "grocery",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/supermarket/MPreis": {
-                "tags": {
-                    "name": "MPreis",
-                    "shop": "supermarket"
-                },
-                "name": "MPreis",
-                "icon": "grocery",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/supermarket/Penny Market": {
-                "tags": {
-                    "name": "Penny Market",
-                    "shop": "supermarket"
-                },
-                "name": "Penny Market",
-                "icon": "grocery",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/supermarket/Tesco Extra": {
-                "tags": {
-                    "name": "Tesco Extra",
-                    "shop": "supermarket"
-                },
-                "name": "Tesco Extra",
-                "icon": "grocery",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/supermarket/Albert Heijn": {
-                "tags": {
-                    "name": "Albert Heijn",
-                    "shop": "supermarket"
-                },
-                "name": "Albert Heijn",
-                "icon": "grocery",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/supermarket/IGA": {
-                "tags": {
-                    "name": "IGA",
-                    "shop": "supermarket"
-                },
-                "name": "IGA",
-                "icon": "grocery",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/supermarket/Super U": {
-                "tags": {
-                    "name": "Super U",
-                    "shop": "supermarket"
-                },
-                "name": "Super U",
-                "icon": "grocery",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/supermarket/Metro": {
-                "tags": {
-                    "name": "Metro",
-                    "shop": "supermarket"
-                },
-                "name": "Metro",
-                "icon": "grocery",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/supermarket/Neukauf": {
-                "tags": {
-                    "name": "Neukauf",
-                    "shop": "supermarket"
-                },
-                "name": "Neukauf",
-                "icon": "grocery",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/supermarket/Migros": {
-                "tags": {
-                    "name": "Migros",
-                    "shop": "supermarket"
-                },
-                "name": "Migros",
-                "icon": "grocery",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/supermarket/Marktkauf": {
-                "tags": {
-                    "name": "Marktkauf",
-                    "shop": "supermarket"
-                },
-                "name": "Marktkauf",
-                "icon": "grocery",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/supermarket/Delikatesy Centrum": {
-                "tags": {
-                    "name": "Delikatesy Centrum",
-                    "shop": "supermarket"
-                },
-                "name": "Delikatesy Centrum",
-                "icon": "grocery",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/supermarket/C1000": {
-                "tags": {
-                    "name": "C1000",
-                    "shop": "supermarket"
-                },
-                "name": "C1000",
-                "icon": "grocery",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/supermarket/Hoogvliet": {
-                "tags": {
-                    "name": "Hoogvliet",
-                    "shop": "supermarket"
-                },
-                "name": "Hoogvliet",
-                "icon": "grocery",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/supermarket/COOP": {
-                "tags": {
-                    "name": "COOP",
-                    "shop": "supermarket"
-                },
-                "name": "COOP",
-                "icon": "grocery",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/supermarket/Food Basics": {
-                "tags": {
-                    "name": "Food Basics",
-                    "shop": "supermarket"
-                },
-                "name": "Food Basics",
-                "icon": "grocery",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/supermarket/Casino": {
-                "tags": {
-                    "name": "Casino",
-                    "shop": "supermarket"
-                },
-                "name": "Casino",
-                "icon": "grocery",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/supermarket/Penny Markt": {
-                "tags": {
-                    "name": "Penny Markt",
-                    "shop": "supermarket"
-                },
-                "name": "Penny Markt",
-                "icon": "grocery",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/supermarket/Giant": {
-                "tags": {
-                    "name": "Giant",
-                    "shop": "supermarket"
-                },
-                "name": "Giant",
-                "icon": "grocery",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/supermarket/Rema 1000": {
-                "tags": {
-                    "name": "Rema 1000",
-                    "shop": "supermarket"
-                },
-                "name": "Rema 1000",
-                "icon": "grocery",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/supermarket/Kaufpark": {
-                "tags": {
-                    "name": "Kaufpark",
-                    "shop": "supermarket"
-                },
-                "name": "Kaufpark",
-                "icon": "grocery",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/supermarket/ALDI SÜD": {
-                "tags": {
-                    "name": "ALDI SÜD",
-                    "shop": "supermarket"
-                },
-                "name": "ALDI SÜD",
-                "icon": "grocery",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/supermarket/Simply Market": {
-                "tags": {
-                    "name": "Simply Market",
-                    "shop": "supermarket"
-                },
-                "name": "Simply Market",
-                "icon": "grocery",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/supermarket/Konzum": {
-                "tags": {
-                    "name": "Konzum",
-                    "shop": "supermarket"
-                },
-                "name": "Konzum",
-                "icon": "grocery",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/supermarket/Carrefour Express": {
-                "tags": {
-                    "name": "Carrefour Express",
-                    "shop": "supermarket"
-                },
-                "name": "Carrefour Express",
-                "icon": "grocery",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/supermarket/Eurospar": {
-                "tags": {
-                    "name": "Eurospar",
-                    "shop": "supermarket"
-                },
-                "name": "Eurospar",
-                "icon": "grocery",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/supermarket/Mercator": {
-                "tags": {
-                    "name": "Mercator",
-                    "shop": "supermarket"
-                },
-                "name": "Mercator",
-                "icon": "grocery",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/supermarket/Famila": {
-                "tags": {
-                    "name": "Famila",
-                    "shop": "supermarket"
-                },
-                "name": "Famila",
-                "icon": "grocery",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/supermarket/Hemköp": {
-                "tags": {
-                    "name": "Hemköp",
-                    "shop": "supermarket"
-                },
-                "name": "Hemköp",
-                "icon": "grocery",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/supermarket/real,-": {
-                "tags": {
-                    "name": "real,-",
-                    "shop": "supermarket"
-                },
-                "name": "real,-",
-                "icon": "grocery",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/supermarket/Markant": {
-                "tags": {
-                    "name": "Markant",
-                    "shop": "supermarket"
-                },
-                "name": "Markant",
-                "icon": "grocery",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/supermarket/Volg": {
-                "tags": {
-                    "name": "Volg",
-                    "shop": "supermarket"
-                },
-                "name": "Volg",
-                "icon": "grocery",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/supermarket/Leader Price": {
-                "tags": {
-                    "name": "Leader Price",
-                    "shop": "supermarket"
-                },
-                "name": "Leader Price",
-                "icon": "grocery",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/supermarket/Treff 3000": {
-                "tags": {
-                    "name": "Treff 3000",
-                    "shop": "supermarket"
-                },
-                "name": "Treff 3000",
-                "icon": "grocery",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/supermarket/SuperBrugsen": {
-                "tags": {
-                    "name": "SuperBrugsen",
-                    "shop": "supermarket"
-                },
-                "name": "SuperBrugsen",
-                "icon": "grocery",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/supermarket/Kaiser's": {
-                "tags": {
-                    "name": "Kaiser's",
-                    "shop": "supermarket"
-                },
-                "name": "Kaiser's",
-                "icon": "grocery",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/supermarket/K+K": {
-                "tags": {
-                    "name": "K+K",
-                    "shop": "supermarket"
-                },
-                "name": "K+K",
-                "icon": "grocery",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/supermarket/Unimarkt": {
-                "tags": {
-                    "name": "Unimarkt",
-                    "shop": "supermarket"
-                },
-                "name": "Unimarkt",
-                "icon": "grocery",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/supermarket/Carrefour City": {
-                "tags": {
-                    "name": "Carrefour City",
-                    "shop": "supermarket"
-                },
-                "name": "Carrefour City",
-                "icon": "grocery",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/supermarket/Sobeys": {
-                "tags": {
-                    "name": "Sobeys",
-                    "shop": "supermarket"
-                },
-                "name": "Sobeys",
-                "icon": "grocery",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/supermarket/S-Market": {
-                "tags": {
-                    "name": "S-Market",
-                    "shop": "supermarket"
-                },
-                "name": "S-Market",
-                "icon": "grocery",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/supermarket/Combi": {
-                "tags": {
-                    "name": "Combi",
-                    "shop": "supermarket"
-                },
-                "name": "Combi",
-                "icon": "grocery",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/supermarket/Denner": {
-                "tags": {
-                    "name": "Denner",
-                    "shop": "supermarket"
-                },
-                "name": "Denner",
-                "icon": "grocery",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/supermarket/Konsum": {
-                "tags": {
-                    "name": "Konsum",
-                    "shop": "supermarket"
-                },
-                "name": "Konsum",
-                "icon": "grocery",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/supermarket/Franprix": {
-                "tags": {
-                    "name": "Franprix",
-                    "shop": "supermarket"
-                },
-                "name": "Franprix",
-                "icon": "grocery",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/supermarket/Monoprix": {
-                "tags": {
-                    "name": "Monoprix",
-                    "shop": "supermarket"
-                },
-                "name": "Monoprix",
-                "icon": "grocery",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/supermarket/Diska": {
-                "tags": {
-                    "name": "Diska",
-                    "shop": "supermarket"
-                },
-                "name": "Diska",
-                "icon": "grocery",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/supermarket/PENNY": {
-                "tags": {
-                    "name": "PENNY",
-                    "shop": "supermarket"
-                },
-                "name": "PENNY",
-                "icon": "grocery",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/supermarket/Dia": {
-                "tags": {
-                    "name": "Dia",
-                    "shop": "supermarket"
-                },
-                "name": "Dia",
-                "icon": "grocery",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/supermarket/Giant Eagle": {
-                "tags": {
-                    "name": "Giant Eagle",
-                    "shop": "supermarket"
-                },
-                "name": "Giant Eagle",
-                "icon": "grocery",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/supermarket/NORMA": {
-                "tags": {
-                    "name": "NORMA",
-                    "shop": "supermarket"
-                },
-                "name": "NORMA",
-                "icon": "grocery",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/supermarket/AD Delhaize": {
-                "tags": {
-                    "name": "AD Delhaize",
-                    "shop": "supermarket"
-                },
-                "name": "AD Delhaize",
-                "icon": "grocery",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/supermarket/Auchan": {
-                "tags": {
-                    "name": "Auchan",
-                    "shop": "supermarket"
-                },
-                "name": "Auchan",
-                "icon": "grocery",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/supermarket/Mercadona": {
-                "tags": {
-                    "name": "Mercadona",
-                    "shop": "supermarket"
-                },
-                "name": "Mercadona",
-                "icon": "grocery",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/supermarket/Consum": {
-                "tags": {
-                    "name": "Consum",
-                    "shop": "supermarket"
-                },
-                "name": "Consum",
-                "icon": "grocery",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/supermarket/Carrefour Market": {
-                "tags": {
-                    "name": "Carrefour Market",
-                    "shop": "supermarket"
-                },
-                "name": "Carrefour Market",
-                "icon": "grocery",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/supermarket/Whole Foods": {
-                "tags": {
-                    "name": "Whole Foods",
-                    "shop": "supermarket"
-                },
-                "name": "Whole Foods",
-                "icon": "grocery",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/supermarket/Pam": {
-                "tags": {
-                    "name": "Pam",
-                    "shop": "supermarket"
-                },
-                "name": "Pam",
-                "icon": "grocery",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/supermarket/sky": {
-                "tags": {
-                    "name": "sky",
-                    "shop": "supermarket"
-                },
-                "name": "sky",
-                "icon": "grocery",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/supermarket/Despar": {
-                "tags": {
-                    "name": "Despar",
-                    "shop": "supermarket"
-                },
-                "name": "Despar",
-                "icon": "grocery",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/supermarket/Eroski": {
-                "tags": {
-                    "name": "Eroski",
-                    "shop": "supermarket"
-                },
-                "name": "Eroski",
-                "icon": "grocery",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/supermarket/Maxi": {
-                "tags": {
-                    "name": "Maxi",
-                    "shop": "supermarket"
-                },
-                "name": "Maxi",
-                "icon": "grocery",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/supermarket/Colruyt": {
-                "tags": {
-                    "name": "Colruyt",
-                    "shop": "supermarket"
-                },
-                "name": "Colruyt",
-                "icon": "grocery",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/supermarket/The Co-operative": {
-                "tags": {
-                    "name": "The Co-operative",
-                    "shop": "supermarket"
-                },
-                "name": "The Co-operative",
-                "icon": "grocery",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/supermarket/Intermarché": {
-                "tags": {
-                    "name": "Intermarché",
-                    "shop": "supermarket"
-                },
-                "name": "Intermarché",
-                "icon": "grocery",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/supermarket/Delhaize": {
-                "tags": {
-                    "name": "Delhaize",
-                    "shop": "supermarket"
-                },
-                "name": "Delhaize",
-                "icon": "grocery",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/supermarket/CBA": {
-                "tags": {
-                    "name": "CBA",
-                    "shop": "supermarket"
-                },
-                "name": "CBA",
-                "icon": "grocery",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/supermarket/Shopi": {
-                "tags": {
-                    "name": "Shopi",
-                    "shop": "supermarket"
-                },
-                "name": "Shopi",
-                "icon": "grocery",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/supermarket/Walmart": {
-                "tags": {
-                    "name": "Walmart",
-                    "shop": "supermarket"
-                },
-                "name": "Walmart",
-                "icon": "grocery",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/supermarket/Kroger": {
-                "tags": {
-                    "name": "Kroger",
-                    "shop": "supermarket"
-                },
-                "name": "Kroger",
-                "icon": "grocery",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/supermarket/Albertsons": {
-                "tags": {
-                    "name": "Albertsons",
-                    "shop": "supermarket"
-                },
-                "name": "Albertsons",
-                "icon": "grocery",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/supermarket/Trader Joe's": {
-                "tags": {
-                    "name": "Trader Joe's",
-                    "shop": "supermarket"
-                },
-                "name": "Trader Joe's",
-                "icon": "grocery",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/supermarket/Feneberg": {
-                "tags": {
-                    "name": "Feneberg",
-                    "shop": "supermarket"
-                },
-                "name": "Feneberg",
-                "icon": "grocery",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/supermarket/denn's Biomarkt": {
-                "tags": {
-                    "name": "denn's Biomarkt",
-                    "shop": "supermarket"
-                },
-                "name": "denn's Biomarkt",
-                "icon": "grocery",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/supermarket/Kvickly": {
-                "tags": {
-                    "name": "Kvickly",
-                    "shop": "supermarket"
-                },
-                "name": "Kvickly",
-                "icon": "grocery",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/supermarket/Makro": {
-                "tags": {
-                    "name": "Makro",
-                    "shop": "supermarket"
-                },
-                "name": "Makro",
-                "icon": "grocery",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/supermarket/Dico": {
-                "tags": {
-                    "name": "Dico",
-                    "shop": "supermarket"
-                },
-                "name": "Dico",
-                "icon": "grocery",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/supermarket/Nah & Frisch": {
-                "tags": {
-                    "name": "Nah & Frisch",
-                    "shop": "supermarket"
-                },
-                "name": "Nah & Frisch",
-                "icon": "grocery",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/supermarket/Champion": {
-                "tags": {
-                    "name": "Champion",
-                    "shop": "supermarket"
-                },
-                "name": "Champion",
-                "icon": "grocery",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/supermarket/ICA Supermarket": {
-                "tags": {
-                    "name": "ICA Supermarket",
-                    "shop": "supermarket"
-                },
-                "name": "ICA Supermarket",
-                "icon": "grocery",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/supermarket/Fakta": {
-                "tags": {
-                    "name": "Fakta",
-                    "shop": "supermarket"
-                },
-                "name": "Fakta",
-                "icon": "grocery",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/supermarket/Магнит": {
-                "tags": {
-                    "name": "Магнит",
-                    "shop": "supermarket"
-                },
-                "name": "Магнит",
-                "icon": "grocery",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/supermarket/Caprabo": {
-                "tags": {
-                    "name": "Caprabo",
-                    "shop": "supermarket"
-                },
-                "name": "Caprabo",
-                "icon": "grocery",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/supermarket/Famiglia Cooperativa": {
-                "tags": {
-                    "name": "Famiglia Cooperativa",
-                    "shop": "supermarket"
-                },
-                "name": "Famiglia Cooperativa",
-                "icon": "grocery",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/supermarket/Народная 7Я семьЯ": {
-                "tags": {
-                    "name": "Народная 7Я семьЯ",
-                    "shop": "supermarket"
-                },
-                "name": "Народная 7Я семьЯ",
-                "icon": "grocery",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/supermarket/Esselunga": {
-                "tags": {
-                    "name": "Esselunga",
-                    "shop": "supermarket"
-                },
-                "name": "Esselunga",
-                "icon": "grocery",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/supermarket/Maxima": {
-                "tags": {
-                    "name": "Maxima",
-                    "shop": "supermarket"
-                },
-                "name": "Maxima",
-                "icon": "grocery",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/supermarket/Wasgau": {
-                "tags": {
-                    "name": "Wasgau",
-                    "shop": "supermarket"
-                },
-                "name": "Wasgau",
-                "icon": "grocery",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/supermarket/Pingo Doce": {
-                "tags": {
-                    "name": "Pingo Doce",
-                    "shop": "supermarket"
-                },
-                "name": "Pingo Doce",
-                "icon": "grocery",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/supermarket/Match": {
-                "tags": {
-                    "name": "Match",
-                    "shop": "supermarket"
-                },
-                "name": "Match",
-                "icon": "grocery",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/supermarket/Profi": {
-                "tags": {
-                    "name": "Profi",
-                    "shop": "supermarket"
-                },
-                "name": "Profi",
-                "icon": "grocery",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/supermarket/Lider": {
-                "tags": {
-                    "name": "Lider",
-                    "shop": "supermarket"
-                },
-                "name": "Lider",
-                "icon": "grocery",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/supermarket/Unimarc": {
-                "tags": {
-                    "name": "Unimarc",
-                    "shop": "supermarket"
-                },
-                "name": "Unimarc",
-                "icon": "grocery",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/supermarket/Co-operative Food": {
-                "tags": {
-                    "name": "Co-operative Food",
-                    "shop": "supermarket"
-                },
-                "name": "Co-operative Food",
-                "icon": "grocery",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/supermarket/Santa Isabel": {
-                "tags": {
-                    "name": "Santa Isabel",
-                    "shop": "supermarket"
-                },
-                "name": "Santa Isabel",
-                "icon": "grocery",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/supermarket/Седьмой континент": {
-                "tags": {
-                    "name": "Седьмой континент",
-                    "shop": "supermarket"
-                },
-                "name": "Седьмой континент",
-                "icon": "grocery",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/supermarket/HIT": {
-                "tags": {
-                    "name": "HIT",
-                    "shop": "supermarket"
-                },
-                "name": "HIT",
-                "icon": "grocery",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/supermarket/Rimi": {
-                "tags": {
-                    "name": "Rimi",
-                    "shop": "supermarket"
-                },
-                "name": "Rimi",
-                "icon": "grocery",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/supermarket/Conad": {
-                "tags": {
-                    "name": "Conad",
-                    "shop": "supermarket"
-                },
-                "name": "Conad",
-                "icon": "grocery",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/supermarket/Фуршет": {
-                "tags": {
-                    "name": "Фуршет",
-                    "shop": "supermarket"
-                },
-                "name": "Фуршет",
-                "icon": "grocery",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/supermarket/Willys": {
-                "tags": {
-                    "name": "Willys",
-                    "shop": "supermarket"
-                },
-                "name": "Willys",
-                "icon": "grocery",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/supermarket/Farmfoods": {
-                "tags": {
-                    "name": "Farmfoods",
-                    "shop": "supermarket"
-                },
-                "name": "Farmfoods",
-                "icon": "grocery",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/supermarket/U Express": {
-                "tags": {
-                    "name": "U Express",
-                    "shop": "supermarket"
-                },
-                "name": "U Express",
-                "icon": "grocery",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/supermarket/Фора": {
-                "tags": {
-                    "name": "Фора",
-                    "shop": "supermarket"
-                },
-                "name": "Фора",
-                "icon": "grocery",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/supermarket/Dunnes Stores": {
-                "tags": {
-                    "name": "Dunnes Stores",
-                    "shop": "supermarket"
-                },
-                "name": "Dunnes Stores",
-                "icon": "grocery",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/supermarket/Сільпо": {
-                "tags": {
-                    "name": "Сільпо",
-                    "shop": "supermarket"
-                },
-                "name": "Сільпо",
-                "icon": "grocery",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/supermarket/マルエツ": {
-                "tags": {
-                    "name": "マルエツ",
-                    "shop": "supermarket"
-                },
-                "name": "マルエツ",
-                "icon": "grocery",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/supermarket/Piggly Wiggly": {
-                "tags": {
-                    "name": "Piggly Wiggly",
-                    "shop": "supermarket"
-                },
-                "name": "Piggly Wiggly",
-                "icon": "grocery",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/supermarket/Crai": {
-                "tags": {
-                    "name": "Crai",
-                    "shop": "supermarket"
-                },
-                "name": "Crai",
-                "icon": "grocery",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/supermarket/El Árbol": {
-                "tags": {
-                    "name": "El Árbol",
-                    "shop": "supermarket"
-                },
-                "name": "El Árbol",
-                "icon": "grocery",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/supermarket/Centre Commercial E. Leclerc": {
-                "tags": {
-                    "name": "Centre Commercial E. Leclerc",
-                    "shop": "supermarket"
-                },
-                "name": "Centre Commercial E. Leclerc",
-                "icon": "grocery",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/supermarket/Foodland": {
-                "tags": {
-                    "name": "Foodland",
-                    "shop": "supermarket"
-                },
-                "name": "Foodland",
-                "icon": "grocery",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/supermarket/Super Brugsen": {
-                "tags": {
-                    "name": "Super Brugsen",
-                    "shop": "supermarket"
-                },
-                "name": "Super Brugsen",
-                "icon": "grocery",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/supermarket/Дикси": {
-                "tags": {
-                    "name": "Дикси",
-                    "shop": "supermarket"
-                },
-                "name": "Дикси",
-                "icon": "grocery",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/supermarket/Пятёрочка": {
-                "tags": {
-                    "name": "Пятёрочка",
-                    "shop": "supermarket"
-                },
-                "name": "Пятёрочка",
-                "icon": "grocery",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/supermarket/Publix": {
-                "tags": {
-                    "name": "Publix",
-                    "shop": "supermarket"
-                },
-                "name": "Publix",
-                "icon": "grocery",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/supermarket/Føtex": {
-                "tags": {
-                    "name": "Føtex",
-                    "shop": "supermarket"
-                },
-                "name": "Føtex",
-                "icon": "grocery",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/supermarket/coop": {
-                "tags": {
-                    "name": "coop",
-                    "shop": "supermarket"
-                },
-                "name": "coop",
-                "icon": "grocery",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/supermarket/Coop Konsum": {
-                "tags": {
-                    "name": "Coop Konsum",
-                    "shop": "supermarket"
-                },
-                "name": "Coop Konsum",
-                "icon": "grocery",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/supermarket/Carrefour Contact": {
-                "tags": {
-                    "name": "Carrefour Contact",
-                    "shop": "supermarket"
-                },
-                "name": "Carrefour Contact",
-                "icon": "grocery",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/supermarket/SPAR": {
-                "tags": {
-                    "name": "SPAR",
-                    "shop": "supermarket"
-                },
-                "name": "SPAR",
-                "icon": "grocery",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/supermarket/No Frills": {
-                "tags": {
-                    "name": "No Frills",
-                    "shop": "supermarket"
-                },
-                "name": "No Frills",
-                "icon": "grocery",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/supermarket/Plodine": {
-                "tags": {
-                    "name": "Plodine",
-                    "shop": "supermarket"
-                },
-                "name": "Plodine",
-                "icon": "grocery",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/supermarket/ADEG": {
-                "tags": {
-                    "name": "ADEG",
-                    "shop": "supermarket"
-                },
-                "name": "ADEG",
-                "icon": "grocery",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/supermarket/Minipreço": {
-                "tags": {
-                    "name": "Minipreço",
-                    "shop": "supermarket"
-                },
-                "name": "Minipreço",
-                "icon": "grocery",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/supermarket/Biedronka": {
-                "tags": {
-                    "name": "Biedronka",
-                    "shop": "supermarket"
-                },
-                "name": "Biedronka",
-                "icon": "grocery",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/supermarket/The Co-operative Food": {
-                "tags": {
-                    "name": "The Co-operative Food",
-                    "shop": "supermarket"
-                },
-                "name": "The Co-operative Food",
-                "icon": "grocery",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/supermarket/Eurospin": {
-                "tags": {
-                    "name": "Eurospin",
-                    "shop": "supermarket"
-                },
-                "name": "Eurospin",
-                "icon": "grocery",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/supermarket/Семья": {
-                "tags": {
-                    "name": "Семья",
-                    "shop": "supermarket"
-                },
-                "name": "Семья",
-                "icon": "grocery",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/supermarket/Gadis": {
-                "tags": {
-                    "name": "Gadis",
-                    "shop": "supermarket"
-                },
-                "name": "Gadis",
-                "icon": "grocery",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/supermarket/Евроопт": {
-                "tags": {
-                    "name": "Евроопт",
-                    "shop": "supermarket"
-                },
-                "name": "Евроопт",
-                "icon": "grocery",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/supermarket/Квартал": {
-                "tags": {
-                    "name": "Квартал",
-                    "shop": "supermarket"
-                },
-                "name": "Квартал",
-                "icon": "grocery",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/supermarket/New World": {
-                "tags": {
-                    "name": "New World",
-                    "shop": "supermarket"
-                },
-                "name": "New World",
-                "icon": "grocery",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/supermarket/Countdown": {
-                "tags": {
-                    "name": "Countdown",
-                    "shop": "supermarket"
-                },
-                "name": "Countdown",
-                "icon": "grocery",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/supermarket/Reliance Fresh": {
-                "tags": {
-                    "name": "Reliance Fresh",
-                    "shop": "supermarket"
-                },
-                "name": "Reliance Fresh",
-                "icon": "grocery",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/supermarket/Stokrotka": {
-                "tags": {
-                    "name": "Stokrotka",
-                    "shop": "supermarket"
-                },
-                "name": "Stokrotka",
-                "icon": "grocery",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/supermarket/Coop Jednota": {
-                "tags": {
-                    "name": "Coop Jednota",
-                    "shop": "supermarket"
-                },
-                "name": "Coop Jednota",
-                "icon": "grocery",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/supermarket/Fred Meyer": {
-                "tags": {
-                    "name": "Fred Meyer",
-                    "shop": "supermarket"
-                },
-                "name": "Fred Meyer",
-                "icon": "grocery",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/supermarket/Irma": {
-                "tags": {
-                    "name": "Irma",
-                    "shop": "supermarket"
-                },
-                "name": "Irma",
-                "icon": "grocery",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/supermarket/Continente": {
-                "tags": {
-                    "name": "Continente",
-                    "shop": "supermarket"
-                },
-                "name": "Continente",
-                "icon": "grocery",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/supermarket/Price Chopper": {
-                "tags": {
-                    "name": "Price Chopper",
-                    "shop": "supermarket"
-                },
-                "name": "Price Chopper",
-                "icon": "grocery",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/supermarket/Game": {
-                "tags": {
-                    "name": "Game",
-                    "shop": "supermarket"
-                },
-                "name": "Game",
-                "icon": "grocery",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/supermarket/Soriana": {
-                "tags": {
-                    "name": "Soriana",
-                    "shop": "supermarket"
-                },
-                "name": "Soriana",
-                "icon": "grocery",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/supermarket/Alimerka": {
-                "tags": {
-                    "name": "Alimerka",
-                    "shop": "supermarket"
-                },
-                "name": "Alimerka",
-                "icon": "grocery",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/supermarket/Piotr i Paweł": {
-                "tags": {
-                    "name": "Piotr i Paweł",
-                    "shop": "supermarket"
-                },
-                "name": "Piotr i Paweł",
-                "icon": "grocery",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/supermarket/Перекресток": {
-                "tags": {
-                    "name": "Перекресток",
-                    "shop": "supermarket"
-                },
-                "name": "Перекресток",
-                "icon": "grocery",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/supermarket/Maxima X": {
-                "tags": {
-                    "name": "Maxima X",
-                    "shop": "supermarket"
-                },
-                "name": "Maxima X",
-                "icon": "grocery",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/supermarket/Карусель": {
-                "tags": {
-                    "name": "Карусель",
-                    "shop": "supermarket"
-                },
-                "name": "Карусель",
-                "icon": "grocery",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/supermarket/ALDI Nord": {
-                "tags": {
-                    "name": "ALDI Nord",
-                    "shop": "supermarket"
-                },
-                "name": "ALDI Nord",
-                "icon": "grocery",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/supermarket/Condis": {
-                "tags": {
-                    "name": "Condis",
-                    "shop": "supermarket"
-                },
-                "name": "Condis",
-                "icon": "grocery",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/supermarket/Sam's Club": {
-                "tags": {
-                    "name": "Sam's Club",
-                    "shop": "supermarket"
-                },
-                "name": "Sam's Club",
-                "icon": "grocery",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/supermarket/Копейка": {
-                "tags": {
-                    "name": "Копейка",
-                    "shop": "supermarket"
-                },
-                "name": "Копейка",
-                "icon": "grocery",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/supermarket/Géant Casino": {
-                "tags": {
-                    "name": "Géant Casino",
-                    "shop": "supermarket"
-                },
-                "name": "Géant Casino",
-                "icon": "grocery",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/supermarket/ASDA": {
-                "tags": {
-                    "name": "ASDA",
-                    "shop": "supermarket"
-                },
-                "name": "ASDA",
-                "icon": "grocery",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/supermarket/Intermarche": {
-                "tags": {
-                    "name": "Intermarche",
-                    "shop": "supermarket"
-                },
-                "name": "Intermarche",
-                "icon": "grocery",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/supermarket/Stop & Shop": {
-                "tags": {
-                    "name": "Stop & Shop",
-                    "shop": "supermarket"
-                },
-                "name": "Stop & Shop",
-                "icon": "grocery",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/supermarket/Food Lion": {
-                "tags": {
-                    "name": "Food Lion",
-                    "shop": "supermarket"
-                },
-                "name": "Food Lion",
-                "icon": "grocery",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/supermarket/Harris Teeter": {
-                "tags": {
-                    "name": "Harris Teeter",
-                    "shop": "supermarket"
-                },
-                "name": "Harris Teeter",
-                "icon": "grocery",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/supermarket/Foodworks": {
-                "tags": {
-                    "name": "Foodworks",
-                    "shop": "supermarket"
-                },
-                "name": "Foodworks",
-                "icon": "grocery",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/supermarket/Polo Market": {
-                "tags": {
-                    "name": "Polo Market",
-                    "shop": "supermarket"
-                },
-                "name": "Polo Market",
-                "icon": "grocery",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/supermarket/Лента": {
-                "tags": {
-                    "name": "Лента",
-                    "shop": "supermarket"
-                },
-                "name": "Лента",
-                "icon": "grocery",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/supermarket/西友 (SEIYU)": {
-                "tags": {
-                    "name": "西友 (SEIYU)",
-                    "shop": "supermarket"
-                },
-                "name": "西友 (SEIYU)",
-                "icon": "grocery",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/supermarket/H-E-B": {
-                "tags": {
-                    "name": "H-E-B",
-                    "shop": "supermarket"
-                },
-                "name": "H-E-B",
-                "icon": "grocery",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/supermarket/Атак": {
-                "tags": {
-                    "name": "Атак",
-                    "shop": "supermarket"
-                },
-                "name": "Атак",
-                "icon": "grocery",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/supermarket/Полушка": {
-                "tags": {
-                    "name": "Полушка",
-                    "shop": "supermarket"
-                },
-                "name": "Полушка",
-                "icon": "grocery",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/supermarket/Extra": {
-                "tags": {
-                    "name": "Extra",
-                    "shop": "supermarket"
-                },
-                "name": "Extra",
-                "icon": "grocery",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/supermarket/Sigma": {
-                "tags": {
-                    "name": "Sigma",
-                    "shop": "supermarket"
-                },
-                "name": "Sigma",
-                "icon": "grocery",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/supermarket/АТБ": {
-                "tags": {
-                    "name": "АТБ",
-                    "shop": "supermarket"
-                },
-                "name": "АТБ",
-                "icon": "grocery",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/supermarket/Bodega Aurrera": {
-                "tags": {
-                    "name": "Bodega Aurrera",
-                    "shop": "supermarket"
-                },
-                "name": "Bodega Aurrera",
-                "icon": "grocery",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/supermarket/Tesco Lotus": {
-                "tags": {
-                    "name": "Tesco Lotus",
-                    "shop": "supermarket"
-                },
-                "name": "Tesco Lotus",
-                "icon": "grocery",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/supermarket/Мария-Ра": {
-                "tags": {
-                    "name": "Мария-Ра",
-                    "shop": "supermarket"
-                },
-                "name": "Мария-Ра",
-                "icon": "grocery",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/supermarket/Магнолия": {
-                "tags": {
-                    "name": "Магнолия",
-                    "shop": "supermarket"
-                },
-                "name": "Магнолия",
-                "icon": "grocery",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/supermarket/Монетка": {
-                "tags": {
-                    "name": "Монетка",
-                    "shop": "supermarket"
-                },
-                "name": "Монетка",
-                "icon": "grocery",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/supermarket/Hy-Vee": {
-                "tags": {
-                    "name": "Hy-Vee",
-                    "shop": "supermarket"
-                },
-                "name": "Hy-Vee",
-                "icon": "grocery",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/supermarket/Walmart Supercenter": {
-                "tags": {
-                    "name": "Walmart Supercenter",
-                    "shop": "supermarket"
-                },
-                "name": "Walmart Supercenter",
-                "icon": "grocery",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/supermarket/Hannaford": {
-                "tags": {
-                    "name": "Hannaford",
-                    "shop": "supermarket"
-                },
-                "name": "Hannaford",
-                "icon": "grocery",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/supermarket/Wegmans": {
-                "tags": {
-                    "name": "Wegmans",
-                    "shop": "supermarket"
-                },
-                "name": "Wegmans",
-                "icon": "grocery",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/supermarket/業務スーパー": {
-                "tags": {
-                    "name": "業務スーパー",
-                    "shop": "supermarket"
-                },
-                "name": "業務スーパー",
-                "icon": "grocery",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/supermarket/Norfa XL": {
-                "tags": {
-                    "name": "Norfa XL",
-                    "shop": "supermarket"
-                },
-                "name": "Norfa XL",
-                "icon": "grocery",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/supermarket/ヨークマート (YorkMart)": {
-                "tags": {
-                    "name": "ヨークマート (YorkMart)",
-                    "shop": "supermarket"
-                },
-                "name": "ヨークマート (YorkMart)",
-                "icon": "grocery",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/supermarket/Leclerc Drive": {
-                "tags": {
-                    "name": "Leclerc Drive",
-                    "shop": "supermarket"
-                },
-                "name": "Leclerc Drive",
-                "icon": "grocery",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/electronics/Media Markt": {
-                "tags": {
-                    "name": "Media Markt",
-                    "shop": "electronics"
-                },
-                "name": "Media Markt",
-                "icon": "shop",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/electronics/Maplin": {
-                "tags": {
-                    "name": "Maplin",
-                    "shop": "electronics"
-                },
-                "name": "Maplin",
-                "icon": "shop",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/electronics/Best Buy": {
-                "tags": {
-                    "name": "Best Buy",
-                    "shop": "electronics"
-                },
-                "name": "Best Buy",
-                "icon": "shop",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/electronics/Future Shop": {
-                "tags": {
-                    "name": "Future Shop",
-                    "shop": "electronics"
-                },
-                "name": "Future Shop",
-                "icon": "shop",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/electronics/Saturn": {
-                "tags": {
-                    "name": "Saturn",
-                    "shop": "electronics"
-                },
-                "name": "Saturn",
-                "icon": "shop",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/electronics/Currys": {
-                "tags": {
-                    "name": "Currys",
-                    "shop": "electronics"
-                },
-                "name": "Currys",
-                "icon": "shop",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/electronics/Radio Shack": {
-                "tags": {
-                    "name": "Radio Shack",
-                    "shop": "electronics"
-                },
-                "name": "Radio Shack",
-                "icon": "shop",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/electronics/Euronics": {
-                "tags": {
-                    "name": "Euronics",
-                    "shop": "electronics"
-                },
-                "name": "Euronics",
-                "icon": "shop",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/electronics/Expert": {
-                "tags": {
-                    "name": "Expert",
-                    "shop": "electronics"
-                },
-                "name": "Expert",
-                "icon": "shop",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/electronics/Эльдорадо": {
-                "tags": {
-                    "name": "Эльдорадо",
-                    "shop": "electronics"
-                },
-                "name": "Эльдорадо",
-                "icon": "shop",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/electronics/Darty": {
-                "tags": {
-                    "name": "Darty",
-                    "shop": "electronics"
-                },
-                "name": "Darty",
-                "icon": "shop",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/electronics/М.Видео": {
-                "tags": {
-                    "name": "М.Видео",
-                    "shop": "electronics"
-                },
-                "name": "М.Видео",
-                "icon": "shop",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/electronics/ヤマダ電機": {
-                "tags": {
-                    "name": "ヤマダ電機",
-                    "shop": "electronics"
-                },
-                "name": "ヤマダ電機",
-                "icon": "shop",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/convenience/McColl's": {
-                "tags": {
-                    "name": "McColl's",
-                    "shop": "convenience"
-                },
-                "name": "McColl's",
-                "icon": "shop",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/convenience/Tesco Express": {
-                "tags": {
-                    "name": "Tesco Express",
-                    "shop": "convenience"
-                },
-                "name": "Tesco Express",
-                "icon": "shop",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/convenience/One Stop": {
-                "tags": {
-                    "name": "One Stop",
-                    "shop": "convenience"
-                },
-                "name": "One Stop",
-                "icon": "shop",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/convenience/Londis": {
-                "tags": {
-                    "name": "Londis",
-                    "shop": "convenience"
-                },
-                "name": "Londis",
-                "icon": "shop",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/convenience/7-Eleven": {
-                "tags": {
-                    "name": "7-Eleven",
-                    "shop": "convenience"
-                },
-                "name": "7-Eleven",
-                "icon": "shop",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/convenience/Sale": {
-                "tags": {
-                    "name": "Sale",
-                    "shop": "convenience"
-                },
-                "name": "Sale",
-                "icon": "shop",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/convenience/Siwa": {
-                "tags": {
-                    "name": "Siwa",
-                    "shop": "convenience"
-                },
-                "name": "Siwa",
-                "icon": "shop",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/convenience/COOP Jednota": {
-                "tags": {
-                    "name": "COOP Jednota",
-                    "shop": "convenience"
-                },
-                "name": "COOP Jednota",
-                "icon": "shop",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/convenience/Mac's": {
-                "tags": {
-                    "name": "Mac's",
-                    "shop": "convenience"
-                },
-                "name": "Mac's",
-                "icon": "shop",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/convenience/Alepa": {
-                "tags": {
-                    "name": "Alepa",
-                    "shop": "convenience"
-                },
-                "name": "Alepa",
-                "icon": "shop",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/convenience/Hasty Market": {
-                "tags": {
-                    "name": "Hasty Market",
-                    "shop": "convenience"
-                },
-                "name": "Hasty Market",
-                "icon": "shop",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/convenience/K-Market": {
-                "tags": {
-                    "name": "K-Market",
-                    "shop": "convenience"
-                },
-                "name": "K-Market",
-                "icon": "shop",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/convenience/Costcutter": {
-                "tags": {
-                    "name": "Costcutter",
-                    "shop": "convenience"
-                },
-                "name": "Costcutter",
-                "icon": "shop",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/convenience/Valintatalo": {
-                "tags": {
-                    "name": "Valintatalo",
-                    "shop": "convenience"
-                },
-                "name": "Valintatalo",
-                "icon": "shop",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/convenience/Circle K": {
-                "tags": {
-                    "name": "Circle K",
-                    "shop": "convenience"
-                },
-                "name": "Circle K",
-                "icon": "shop",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/convenience/セブンイレブン": {
-                "tags": {
-                    "name": "セブンイレブン",
-                    "name:en": "7-Eleven",
-                    "shop": "convenience"
-                },
-                "name": "セブンイレブン",
-                "icon": "shop",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/convenience/ローソン": {
-                "tags": {
-                    "name": "ローソン",
-                    "name:en": "LAWSON",
-                    "shop": "convenience"
-                },
-                "name": "ローソン",
-                "icon": "shop",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/convenience/Petit Casino": {
-                "tags": {
-                    "name": "Petit Casino",
-                    "shop": "convenience"
-                },
-                "name": "Petit Casino",
-                "icon": "shop",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/convenience/Mace": {
-                "tags": {
-                    "name": "Mace",
-                    "shop": "convenience"
-                },
-                "name": "Mace",
-                "icon": "shop",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/convenience/Mini Market": {
-                "tags": {
-                    "name": "Mini Market",
-                    "shop": "convenience"
-                },
-                "name": "Mini Market",
-                "icon": "shop",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/convenience/Nisa Local": {
-                "tags": {
-                    "name": "Nisa Local",
-                    "shop": "convenience"
-                },
-                "name": "Nisa Local",
-                "icon": "shop",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/convenience/Dorfladen": {
-                "tags": {
-                    "name": "Dorfladen",
-                    "shop": "convenience"
-                },
-                "name": "Dorfladen",
-                "icon": "shop",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/convenience/Продукты": {
-                "tags": {
-                    "name": "Продукты",
-                    "shop": "convenience"
-                },
-                "name": "Продукты",
-                "icon": "shop",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/convenience/Mini Stop": {
-                "tags": {
-                    "name": "Mini Stop",
-                    "shop": "convenience"
-                },
-                "name": "Mini Stop",
-                "icon": "shop",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/convenience/LAWSON": {
-                "tags": {
-                    "name": "LAWSON",
-                    "shop": "convenience"
-                },
-                "name": "LAWSON",
-                "icon": "shop",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/convenience/デイリーヤマザキ": {
-                "tags": {
-                    "name": "デイリーヤマザキ",
-                    "shop": "convenience"
-                },
-                "name": "デイリーヤマザキ",
-                "icon": "shop",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/convenience/Надежда": {
-                "tags": {
-                    "name": "Надежда",
-                    "shop": "convenience"
-                },
-                "name": "Надежда",
-                "icon": "shop",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/convenience/Nisa": {
-                "tags": {
-                    "name": "Nisa",
-                    "shop": "convenience"
-                },
-                "name": "Nisa",
-                "icon": "shop",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/convenience/Premier": {
-                "tags": {
-                    "name": "Premier",
-                    "shop": "convenience"
-                },
-                "name": "Premier",
-                "icon": "shop",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/convenience/ABC": {
-                "tags": {
-                    "name": "ABC",
-                    "shop": "convenience"
-                },
-                "name": "ABC",
-                "icon": "shop",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/convenience/ミニストップ": {
-                "tags": {
-                    "name": "ミニストップ",
-                    "name:en": "MINISTOP",
-                    "shop": "convenience"
-                },
-                "name": "ミニストップ",
-                "icon": "shop",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/convenience/サンクス": {
-                "tags": {
-                    "name": "サンクス",
-                    "name:en": "sunkus",
-                    "shop": "convenience"
-                },
-                "name": "サンクス",
-                "icon": "shop",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/convenience/スリーエフ": {
-                "tags": {
-                    "name": "スリーエフ",
-                    "shop": "convenience"
-                },
-                "name": "スリーエフ",
-                "icon": "shop",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/convenience/8 à Huit": {
-                "tags": {
-                    "name": "8 à Huit",
-                    "shop": "convenience"
-                },
-                "name": "8 à Huit",
-                "icon": "shop",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/convenience/Żabka": {
-                "tags": {
-                    "name": "Żabka",
-                    "shop": "convenience"
-                },
-                "name": "Żabka",
-                "icon": "shop",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/convenience/Almacen": {
-                "tags": {
-                    "name": "Almacen",
-                    "shop": "convenience"
-                },
-                "name": "Almacen",
-                "icon": "shop",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/convenience/Vival": {
-                "tags": {
-                    "name": "Vival",
-                    "shop": "convenience"
-                },
-                "name": "Vival",
-                "icon": "shop",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/convenience/FamilyMart": {
-                "tags": {
-                    "name": "FamilyMart",
-                    "shop": "convenience"
-                },
-                "name": "FamilyMart",
-                "icon": "shop",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/convenience/ファミリーマート": {
-                "tags": {
-                    "name": "ファミリーマート",
-                    "name:en": "FamilyMart",
-                    "shop": "convenience"
-                },
-                "name": "ファミリーマート",
-                "icon": "shop",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/convenience/Sunkus": {
-                "tags": {
-                    "name": "Sunkus",
-                    "shop": "convenience"
-                },
-                "name": "Sunkus",
-                "icon": "shop",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/convenience/セブンイレブン(Seven-Eleven)": {
-                "tags": {
-                    "name": "セブンイレブン(Seven-Eleven)",
-                    "shop": "convenience"
-                },
-                "name": "セブンイレブン(Seven-Eleven)",
-                "icon": "shop",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/convenience/Jednota": {
-                "tags": {
-                    "name": "Jednota",
-                    "shop": "convenience"
-                },
-                "name": "Jednota",
-                "icon": "shop",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/convenience/Магазин": {
-                "tags": {
-                    "name": "Магазин",
-                    "shop": "convenience"
-                },
-                "name": "Магазин",
-                "icon": "shop",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/convenience/Гастроном": {
-                "tags": {
-                    "name": "Гастроном",
-                    "shop": "convenience"
-                },
-                "name": "Гастроном",
-                "icon": "shop",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/convenience/Sklep spożywczy": {
-                "tags": {
-                    "name": "Sklep spożywczy",
-                    "shop": "convenience"
-                },
-                "name": "Sklep spożywczy",
-                "icon": "shop",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/convenience/Centra": {
-                "tags": {
-                    "name": "Centra",
-                    "shop": "convenience"
-                },
-                "name": "Centra",
-                "icon": "shop",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/convenience/サークルK": {
-                "tags": {
-                    "name": "サークルK",
-                    "name:en": "Circle K",
-                    "shop": "convenience"
-                },
-                "name": "サークルK",
-                "icon": "shop",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/convenience/Wawa": {
-                "tags": {
-                    "name": "Wawa",
-                    "shop": "convenience"
-                },
-                "name": "Wawa",
-                "icon": "shop",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/convenience/Proxi": {
-                "tags": {
-                    "name": "Proxi",
-                    "shop": "convenience"
-                },
-                "name": "Proxi",
-                "icon": "shop",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/convenience/Универсам": {
-                "tags": {
-                    "name": "Универсам",
-                    "shop": "convenience"
-                },
-                "name": "Универсам",
-                "icon": "shop",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/convenience/Groszek": {
-                "tags": {
-                    "name": "Groszek",
-                    "shop": "convenience"
-                },
-                "name": "Groszek",
-                "icon": "shop",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/convenience/Select": {
-                "tags": {
-                    "name": "Select",
-                    "shop": "convenience"
-                },
-                "name": "Select",
-                "icon": "shop",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/convenience/Večerka": {
-                "tags": {
-                    "name": "Večerka",
-                    "shop": "convenience"
-                },
-                "name": "Večerka",
-                "icon": "shop",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/convenience/Potraviny": {
-                "tags": {
-                    "name": "Potraviny",
-                    "shop": "convenience"
-                },
-                "name": "Potraviny",
-                "icon": "shop",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/convenience/Смак": {
-                "tags": {
-                    "name": "Смак",
-                    "shop": "convenience"
-                },
-                "name": "Смак",
-                "icon": "shop",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/convenience/Эконом": {
-                "tags": {
-                    "name": "Эконом",
-                    "shop": "convenience"
-                },
-                "name": "Эконом",
-                "icon": "shop",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/convenience/Березка": {
-                "tags": {
-                    "name": "Березка",
-                    "shop": "convenience"
-                },
-                "name": "Березка",
-                "icon": "shop",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/convenience/Społem": {
-                "tags": {
-                    "name": "Społem",
-                    "shop": "convenience"
-                },
-                "name": "Społem",
-                "icon": "shop",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/convenience/Cumberland Farms": {
-                "tags": {
-                    "name": "Cumberland Farms",
-                    "shop": "convenience"
-                },
-                "name": "Cumberland Farms",
-                "icon": "shop",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/convenience/Tesco Lotus Express": {
-                "tags": {
-                    "name": "Tesco Lotus Express",
-                    "shop": "convenience"
-                },
-                "name": "Tesco Lotus Express",
-                "icon": "shop",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/convenience/Kiosk": {
-                "tags": {
-                    "name": "Kiosk",
-                    "shop": "convenience"
-                },
-                "name": "Kiosk",
-                "icon": "shop",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/convenience/24 часа": {
-                "tags": {
-                    "name": "24 часа",
-                    "shop": "convenience"
-                },
-                "name": "24 часа",
-                "icon": "shop",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/convenience/Минимаркет": {
-                "tags": {
-                    "name": "Минимаркет",
-                    "shop": "convenience"
-                },
-                "name": "Минимаркет",
-                "icon": "shop",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/convenience/Oxxo": {
-                "tags": {
-                    "name": "Oxxo",
-                    "shop": "convenience"
-                },
-                "name": "Oxxo",
-                "icon": "shop",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/convenience/abc": {
-                "tags": {
-                    "name": "abc",
-                    "shop": "convenience"
-                },
-                "name": "abc",
-                "icon": "shop",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/convenience/7/11": {
-                "tags": {
-                    "name": "7/11",
-                    "shop": "convenience"
-                },
-                "name": "7/11",
-                "icon": "shop",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/convenience/Stewart's": {
-                "tags": {
-                    "name": "Stewart's",
-                    "shop": "convenience"
-                },
-                "name": "Stewart's",
-                "icon": "shop",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/convenience/Продукти": {
-                "tags": {
-                    "name": "Продукти",
-                    "shop": "convenience"
-                },
-                "name": "Продукти",
-                "icon": "shop",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/convenience/ローソンストア100 (LAWSON STORE 100)": {
-                "tags": {
-                    "name": "ローソンストア100 (LAWSON STORE 100)",
-                    "shop": "convenience"
-                },
-                "name": "ローソンストア100 (LAWSON STORE 100)",
-                "icon": "shop",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/convenience/Радуга": {
-                "tags": {
-                    "name": "Радуга",
-                    "shop": "convenience"
-                },
-                "name": "Радуга",
-                "icon": "shop",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/convenience/ローソンストア100": {
-                "tags": {
-                    "name": "ローソンストア100",
-                    "shop": "convenience"
-                },
-                "name": "ローソンストア100",
-                "icon": "shop",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/convenience/เซเว่นอีเลฟเว่น": {
-                "tags": {
-                    "name": "เซเว่นอีเลฟเว่น",
-                    "shop": "convenience"
-                },
-                "name": "เซเว่นอีเลฟเว่น",
-                "icon": "shop",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/convenience/Spożywczy": {
-                "tags": {
-                    "name": "Spożywczy",
-                    "shop": "convenience"
-                },
-                "name": "Spożywczy",
-                "icon": "shop",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/convenience/Фортуна": {
-                "tags": {
-                    "name": "Фортуна",
-                    "shop": "convenience"
-                },
-                "name": "Фортуна",
-                "icon": "shop",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/convenience/Picard": {
-                "tags": {
-                    "name": "Picard",
-                    "shop": "convenience"
-                },
-                "name": "Picard",
-                "icon": "shop",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/convenience/Four Square": {
-                "tags": {
-                    "name": "Four Square",
-                    "shop": "convenience"
-                },
-                "name": "Four Square",
-                "icon": "shop",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/convenience/Визит": {
-                "tags": {
-                    "name": "Визит",
-                    "shop": "convenience"
-                },
-                "name": "Визит",
-                "icon": "shop",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/convenience/Авоська": {
-                "tags": {
-                    "name": "Авоська",
-                    "shop": "convenience"
-                },
-                "name": "Авоська",
-                "icon": "shop",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/convenience/Dollar General": {
-                "tags": {
-                    "name": "Dollar General",
-                    "shop": "convenience"
-                },
-                "name": "Dollar General",
-                "icon": "shop",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/convenience/Studenac": {
-                "tags": {
-                    "name": "Studenac",
-                    "shop": "convenience"
-                },
-                "name": "Studenac",
-                "icon": "shop",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/convenience/Central Convenience Store": {
-                "tags": {
-                    "name": "Central Convenience Store",
-                    "shop": "convenience"
-                },
-                "name": "Central Convenience Store",
-                "icon": "shop",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/convenience/продукты": {
-                "tags": {
-                    "name": "продукты",
-                    "shop": "convenience"
-                },
-                "name": "продукты",
-                "icon": "shop",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/convenience/Кулинария": {
-                "tags": {
-                    "name": "Кулинария",
-                    "shop": "convenience"
-                },
-                "name": "Кулинария",
-                "icon": "shop",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/convenience/全家": {
-                "tags": {
-                    "name": "全家",
-                    "shop": "convenience"
-                },
-                "name": "全家",
-                "icon": "shop",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/convenience/Мечта": {
-                "tags": {
-                    "name": "Мечта",
-                    "shop": "convenience"
-                },
-                "name": "Мечта",
-                "icon": "shop",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/convenience/Epicerie": {
-                "tags": {
-                    "name": "Epicerie",
-                    "shop": "convenience"
-                },
-                "name": "Epicerie",
-                "icon": "shop",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/convenience/Кировский": {
-                "tags": {
-                    "name": "Кировский",
-                    "shop": "convenience"
-                },
-                "name": "Кировский",
-                "icon": "shop",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/convenience/Food Mart": {
-                "tags": {
-                    "name": "Food Mart",
-                    "shop": "convenience"
-                },
-                "name": "Food Mart",
-                "icon": "shop",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/convenience/Delikatesy": {
-                "tags": {
-                    "name": "Delikatesy",
-                    "shop": "convenience"
-                },
-                "name": "Delikatesy",
-                "icon": "shop",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/convenience/ポプラ": {
-                "tags": {
-                    "name": "ポプラ",
-                    "shop": "convenience"
-                },
-                "name": "ポプラ",
-                "icon": "shop",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/convenience/Lewiatan": {
-                "tags": {
-                    "name": "Lewiatan",
-                    "shop": "convenience"
-                },
-                "name": "Lewiatan",
-                "icon": "shop",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/convenience/Продуктовый магазин": {
-                "tags": {
-                    "name": "Продуктовый магазин",
-                    "shop": "convenience"
-                },
-                "name": "Продуктовый магазин",
-                "icon": "shop",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/convenience/Продуктовый": {
-                "tags": {
-                    "name": "Продуктовый",
-                    "shop": "convenience"
-                },
-                "name": "Продуктовый",
-                "icon": "shop",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/convenience/セイコーマート (Seicomart)": {
-                "tags": {
-                    "name": "セイコーマート (Seicomart)",
-                    "shop": "convenience"
-                },
-                "name": "セイコーマート (Seicomart)",
-                "icon": "shop",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/convenience/Виктория": {
-                "tags": {
-                    "name": "Виктория",
-                    "shop": "convenience"
-                },
-                "name": "Виктория",
-                "icon": "shop",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/convenience/Весна": {
-                "tags": {
-                    "name": "Весна",
-                    "shop": "convenience"
-                },
-                "name": "Весна",
-                "icon": "shop",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/convenience/Mini Market Non-Stop": {
-                "tags": {
-                    "name": "Mini Market Non-Stop",
-                    "shop": "convenience"
-                },
-                "name": "Mini Market Non-Stop",
-                "icon": "shop",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/convenience/Копеечка": {
-                "tags": {
-                    "name": "Копеечка",
-                    "shop": "convenience"
-                },
-                "name": "Копеечка",
-                "icon": "shop",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/convenience/Royal Farms": {
-                "tags": {
-                    "name": "Royal Farms",
-                    "shop": "convenience"
-                },
-                "name": "Royal Farms",
-                "icon": "shop",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/convenience/Alfamart": {
-                "tags": {
-                    "name": "Alfamart",
-                    "shop": "convenience"
-                },
-                "name": "Alfamart",
-                "icon": "shop",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/convenience/Indomaret": {
-                "tags": {
-                    "name": "Indomaret",
-                    "shop": "convenience"
-                },
-                "name": "Indomaret",
-                "icon": "shop",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/convenience/магазин": {
-                "tags": {
-                    "name": "магазин",
-                    "shop": "convenience"
-                },
-                "name": "магазин",
-                "icon": "shop",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/convenience/全家便利商店": {
-                "tags": {
-                    "name": "全家便利商店",
-                    "shop": "convenience"
-                },
-                "name": "全家便利商店",
-                "icon": "shop",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/convenience/Boutique": {
-                "tags": {
-                    "name": "Boutique",
-                    "shop": "convenience"
-                },
-                "name": "Boutique",
-                "icon": "shop",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/convenience/მარკეტი (Market)": {
-                "tags": {
-                    "name": "მარკეტი (Market)",
-                    "shop": "convenience"
-                },
-                "name": "მარკეტი (Market)",
-                "icon": "shop",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/convenience/Stores": {
-                "tags": {
-                    "name": "Stores",
-                    "shop": "convenience"
-                },
-                "name": "Stores",
-                "icon": "shop",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/chemist/dm": {
-                "tags": {
-                    "name": "dm",
-                    "shop": "chemist"
-                },
-                "name": "dm",
-                "icon": "chemist",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/chemist/Müller": {
-                "tags": {
-                    "name": "Müller",
-                    "shop": "chemist"
-                },
-                "name": "Müller",
-                "icon": "chemist",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/chemist/Schlecker": {
-                "tags": {
-                    "name": "Schlecker",
-                    "shop": "chemist"
-                },
-                "name": "Schlecker",
-                "icon": "chemist",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/chemist/Etos": {
-                "tags": {
-                    "name": "Etos",
-                    "shop": "chemist"
-                },
-                "name": "Etos",
-                "icon": "chemist",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/chemist/Bipa": {
-                "tags": {
-                    "name": "Bipa",
-                    "shop": "chemist"
-                },
-                "name": "Bipa",
-                "icon": "chemist",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/chemist/Rossmann": {
-                "tags": {
-                    "name": "Rossmann",
-                    "shop": "chemist"
-                },
-                "name": "Rossmann",
-                "icon": "chemist",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/chemist/DM Drogeriemarkt": {
-                "tags": {
-                    "name": "DM Drogeriemarkt",
-                    "shop": "chemist"
-                },
-                "name": "DM Drogeriemarkt",
-                "icon": "chemist",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/chemist/Ihr Platz": {
-                "tags": {
-                    "name": "Ihr Platz",
-                    "shop": "chemist"
-                },
-                "name": "Ihr Platz",
-                "icon": "chemist",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/chemist/Douglas": {
-                "tags": {
-                    "name": "Douglas",
-                    "shop": "chemist"
-                },
-                "name": "Douglas",
-                "icon": "chemist",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/chemist/Kruidvat": {
-                "tags": {
-                    "name": "Kruidvat",
-                    "shop": "chemist"
-                },
-                "name": "Kruidvat",
-                "icon": "chemist",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/car_repair/Kwik Fit": {
-                "tags": {
-                    "name": "Kwik Fit",
-                    "shop": "car_repair"
-                },
-                "name": "Kwik Fit",
-                "icon": "car",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/car_repair/ATU": {
-                "tags": {
-                    "name": "ATU",
-                    "shop": "car_repair"
-                },
-                "name": "ATU",
-                "icon": "car",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/car_repair/Kwik-Fit": {
-                "tags": {
-                    "name": "Kwik-Fit",
-                    "shop": "car_repair"
-                },
-                "name": "Kwik-Fit",
-                "icon": "car",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/car_repair/Midas": {
-                "tags": {
-                    "name": "Midas",
-                    "shop": "car_repair"
-                },
-                "name": "Midas",
-                "icon": "car",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/car_repair/Feu Vert": {
-                "tags": {
-                    "name": "Feu Vert",
-                    "shop": "car_repair"
-                },
-                "name": "Feu Vert",
-                "icon": "car",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/car_repair/Norauto": {
-                "tags": {
-                    "name": "Norauto",
-                    "shop": "car_repair"
-                },
-                "name": "Norauto",
-                "icon": "car",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/car_repair/Speedy": {
-                "tags": {
-                    "name": "Speedy",
-                    "shop": "car_repair"
-                },
-                "name": "Speedy",
-                "icon": "car",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/car_repair/Pit Stop": {
-                "tags": {
-                    "name": "Pit Stop",
-                    "shop": "car_repair"
-                },
-                "name": "Pit Stop",
-                "icon": "car",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/car_repair/Jiffy Lube": {
-                "tags": {
-                    "name": "Jiffy Lube",
-                    "shop": "car_repair"
-                },
-                "name": "Jiffy Lube",
-                "icon": "car",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/car_repair/Шиномонтаж": {
-                "tags": {
-                    "name": "Шиномонтаж",
-                    "shop": "car_repair"
-                },
-                "name": "Шиномонтаж",
-                "icon": "car",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/car_repair/СТО": {
-                "tags": {
-                    "name": "СТО",
-                    "shop": "car_repair"
-                },
-                "name": "СТО",
-                "icon": "car",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/car_repair/O'Reilly Auto Parts": {
-                "tags": {
-                    "name": "O'Reilly Auto Parts",
-                    "shop": "car_repair"
-                },
-                "name": "O'Reilly Auto Parts",
-                "icon": "car",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/car_repair/Carglass": {
-                "tags": {
-                    "name": "Carglass",
-                    "shop": "car_repair"
-                },
-                "name": "Carglass",
-                "icon": "car",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/car_repair/шиномонтаж": {
-                "tags": {
-                    "name": "шиномонтаж",
-                    "shop": "car_repair"
-                },
-                "name": "шиномонтаж",
-                "icon": "car",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/car_repair/Euromaster": {
-                "tags": {
-                    "name": "Euromaster",
-                    "shop": "car_repair"
-                },
-                "name": "Euromaster",
-                "icon": "car",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/car_repair/Firestone": {
-                "tags": {
-                    "name": "Firestone",
-                    "shop": "car_repair"
-                },
-                "name": "Firestone",
-                "icon": "car",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/car_repair/AutoZone": {
-                "tags": {
-                    "name": "AutoZone",
-                    "shop": "car_repair"
-                },
-                "name": "AutoZone",
-                "icon": "car",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/car_repair/Автосервис": {
-                "tags": {
-                    "name": "Автосервис",
-                    "shop": "car_repair"
-                },
-                "name": "Автосервис",
-                "icon": "car",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/car_repair/Advance Auto Parts": {
-                "tags": {
-                    "name": "Advance Auto Parts",
-                    "shop": "car_repair"
-                },
-                "name": "Advance Auto Parts",
-                "icon": "car",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/car_repair/Roady": {
-                "tags": {
-                    "name": "Roady",
-                    "shop": "car_repair"
-                },
-                "name": "Roady",
-                "icon": "car",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/furniture/IKEA": {
-                "tags": {
-                    "name": "IKEA",
-                    "shop": "furniture"
-                },
-                "name": "IKEA",
-                "icon": "shop",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/furniture/Jysk": {
-                "tags": {
-                    "name": "Jysk",
-                    "shop": "furniture"
-                },
-                "name": "Jysk",
-                "icon": "shop",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/furniture/Roller": {
-                "tags": {
-                    "name": "Roller",
-                    "shop": "furniture"
-                },
-                "name": "Roller",
-                "icon": "shop",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/furniture/Dänisches Bettenlager": {
-                "tags": {
-                    "name": "Dänisches Bettenlager",
-                    "shop": "furniture"
-                },
-                "name": "Dänisches Bettenlager",
-                "icon": "shop",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/furniture/Conforama": {
-                "tags": {
-                    "name": "Conforama",
-                    "shop": "furniture"
-                },
-                "name": "Conforama",
-                "icon": "shop",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/furniture/Matratzen Concord": {
-                "tags": {
-                    "name": "Matratzen Concord",
-                    "shop": "furniture"
-                },
-                "name": "Matratzen Concord",
-                "icon": "shop",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/furniture/Мебель": {
-                "tags": {
-                    "name": "Мебель",
-                    "shop": "furniture"
-                },
-                "name": "Мебель",
-                "icon": "shop",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/furniture/But": {
-                "tags": {
-                    "name": "But",
-                    "shop": "furniture"
-                },
-                "name": "But",
-                "icon": "shop",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/doityourself/Hornbach": {
-                "tags": {
-                    "name": "Hornbach",
-                    "shop": "doityourself"
-                },
-                "name": "Hornbach",
-                "icon": "shop",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/doityourself/B&Q": {
-                "tags": {
-                    "name": "B&Q",
-                    "shop": "doityourself"
-                },
-                "name": "B&Q",
-                "icon": "shop",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/doityourself/Hubo": {
-                "tags": {
-                    "name": "Hubo",
-                    "shop": "doityourself"
-                },
-                "name": "Hubo",
-                "icon": "shop",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/doityourself/Mr Bricolage": {
-                "tags": {
-                    "name": "Mr Bricolage",
-                    "shop": "doityourself"
-                },
-                "name": "Mr Bricolage",
-                "icon": "shop",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/doityourself/Gamma": {
-                "tags": {
-                    "name": "Gamma",
-                    "shop": "doityourself"
-                },
-                "name": "Gamma",
-                "icon": "shop",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/doityourself/OBI": {
-                "tags": {
-                    "name": "OBI",
-                    "shop": "doityourself"
-                },
-                "name": "OBI",
-                "icon": "shop",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/doityourself/Lowes": {
-                "tags": {
-                    "name": "Lowes",
-                    "shop": "doityourself"
-                },
-                "name": "Lowes",
-                "icon": "shop",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/doityourself/Wickes": {
-                "tags": {
-                    "name": "Wickes",
-                    "shop": "doityourself"
-                },
-                "name": "Wickes",
-                "icon": "shop",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/doityourself/Hagebau": {
-                "tags": {
-                    "name": "Hagebau",
-                    "shop": "doityourself"
-                },
-                "name": "Hagebau",
-                "icon": "shop",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/doityourself/Max Bahr": {
-                "tags": {
-                    "name": "Max Bahr",
-                    "shop": "doityourself"
-                },
-                "name": "Max Bahr",
-                "icon": "shop",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/doityourself/Castorama": {
-                "tags": {
-                    "name": "Castorama",
-                    "shop": "doityourself"
-                },
-                "name": "Castorama",
-                "icon": "shop",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/doityourself/Rona": {
-                "tags": {
-                    "name": "Rona",
-                    "shop": "doityourself"
-                },
-                "name": "Rona",
-                "icon": "shop",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/doityourself/Home Depot": {
-                "tags": {
-                    "name": "Home Depot",
-                    "shop": "doityourself"
-                },
-                "name": "Home Depot",
-                "icon": "shop",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/doityourself/Toom Baumarkt": {
-                "tags": {
-                    "name": "Toom Baumarkt",
-                    "shop": "doityourself"
-                },
-                "name": "Toom Baumarkt",
-                "icon": "shop",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/doityourself/Homebase": {
-                "tags": {
-                    "name": "Homebase",
-                    "shop": "doityourself"
-                },
-                "name": "Homebase",
-                "icon": "shop",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/doityourself/Baumax": {
-                "tags": {
-                    "name": "Baumax",
-                    "shop": "doityourself"
-                },
-                "name": "Baumax",
-                "icon": "shop",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/doityourself/Lagerhaus": {
-                "tags": {
-                    "name": "Lagerhaus",
-                    "shop": "doityourself"
-                },
-                "name": "Lagerhaus",
-                "icon": "shop",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/doityourself/Bauhaus": {
-                "tags": {
-                    "name": "Bauhaus",
-                    "shop": "doityourself"
-                },
-                "name": "Bauhaus",
-                "icon": "shop",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/doityourself/Canadian Tire": {
-                "tags": {
-                    "name": "Canadian Tire",
-                    "shop": "doityourself"
-                },
-                "name": "Canadian Tire",
-                "icon": "shop",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/doityourself/Leroy Merlin": {
-                "tags": {
-                    "name": "Leroy Merlin",
-                    "shop": "doityourself"
-                },
-                "name": "Leroy Merlin",
-                "icon": "shop",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/doityourself/Hellweg": {
-                "tags": {
-                    "name": "Hellweg",
-                    "shop": "doityourself"
-                },
-                "name": "Hellweg",
-                "icon": "shop",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/doityourself/Brico": {
-                "tags": {
-                    "name": "Brico",
-                    "shop": "doityourself"
-                },
-                "name": "Brico",
-                "icon": "shop",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/doityourself/Bricomarché": {
-                "tags": {
-                    "name": "Bricomarché",
-                    "shop": "doityourself"
-                },
-                "name": "Bricomarché",
-                "icon": "shop",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/doityourself/Toom": {
-                "tags": {
-                    "name": "Toom",
-                    "shop": "doityourself"
-                },
-                "name": "Toom",
-                "icon": "shop",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/doityourself/Hagebaumarkt": {
-                "tags": {
-                    "name": "Hagebaumarkt",
-                    "shop": "doityourself"
-                },
-                "name": "Hagebaumarkt",
-                "icon": "shop",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/doityourself/Praktiker": {
-                "tags": {
-                    "name": "Praktiker",
-                    "shop": "doityourself"
-                },
-                "name": "Praktiker",
-                "icon": "shop",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/doityourself/Menards": {
-                "tags": {
-                    "name": "Menards",
-                    "shop": "doityourself"
-                },
-                "name": "Menards",
-                "icon": "shop",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/doityourself/Weldom": {
-                "tags": {
-                    "name": "Weldom",
-                    "shop": "doityourself"
-                },
-                "name": "Weldom",
-                "icon": "shop",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/doityourself/Bunnings Warehouse": {
-                "tags": {
-                    "name": "Bunnings Warehouse",
-                    "shop": "doityourself"
-                },
-                "name": "Bunnings Warehouse",
-                "icon": "shop",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/doityourself/Ace Hardware": {
-                "tags": {
-                    "name": "Ace Hardware",
-                    "shop": "doityourself"
-                },
-                "name": "Ace Hardware",
-                "icon": "shop",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/doityourself/Home Hardware": {
-                "tags": {
-                    "name": "Home Hardware",
-                    "shop": "doityourself"
-                },
-                "name": "Home Hardware",
-                "icon": "shop",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/doityourself/Стройматериалы": {
-                "tags": {
-                    "name": "Стройматериалы",
-                    "shop": "doityourself"
-                },
-                "name": "Стройматериалы",
-                "icon": "shop",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/doityourself/Bricorama": {
-                "tags": {
-                    "name": "Bricorama",
-                    "shop": "doityourself"
-                },
-                "name": "Bricorama",
-                "icon": "shop",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/doityourself/Point P": {
-                "tags": {
-                    "name": "Point P",
-                    "shop": "doityourself"
-                },
-                "name": "Point P",
-                "icon": "shop",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/stationery/Staples": {
-                "tags": {
-                    "name": "Staples",
-                    "shop": "stationery"
-                },
-                "name": "Staples",
-                "icon": "shop",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/stationery/McPaper": {
-                "tags": {
-                    "name": "McPaper",
-                    "shop": "stationery"
-                },
-                "name": "McPaper",
-                "icon": "shop",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/stationery/Office Depot": {
-                "tags": {
-                    "name": "Office Depot",
-                    "shop": "stationery"
-                },
-                "name": "Office Depot",
-                "icon": "shop",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/stationery/Канцтовары": {
-                "tags": {
-                    "name": "Канцтовары",
-                    "shop": "stationery"
-                },
-                "name": "Канцтовары",
-                "icon": "shop",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/car/Skoda": {
-                "tags": {
-                    "name": "Skoda",
-                    "shop": "car"
-                },
-                "name": "Skoda",
-                "icon": "car",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/car/BMW": {
-                "tags": {
-                    "name": "BMW",
-                    "shop": "car"
-                },
-                "name": "BMW",
-                "icon": "car",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/car/Citroen": {
-                "tags": {
-                    "name": "Citroen",
-                    "shop": "car"
-                },
-                "name": "Citroen",
-                "icon": "car",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/car/Renault": {
-                "tags": {
-                    "name": "Renault",
-                    "shop": "car"
-                },
-                "name": "Renault",
-                "icon": "car",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/car/Mercedes-Benz": {
-                "tags": {
-                    "name": "Mercedes-Benz",
-                    "shop": "car"
-                },
-                "name": "Mercedes-Benz",
-                "icon": "car",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/car/Volvo": {
-                "tags": {
-                    "name": "Volvo",
-                    "shop": "car"
-                },
-                "name": "Volvo",
-                "icon": "car",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/car/Ford": {
-                "tags": {
-                    "name": "Ford",
-                    "shop": "car"
-                },
-                "name": "Ford",
-                "icon": "car",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/car/Volkswagen": {
-                "tags": {
-                    "name": "Volkswagen",
-                    "shop": "car"
-                },
-                "name": "Volkswagen",
-                "icon": "car",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/car/Mazda": {
-                "tags": {
-                    "name": "Mazda",
-                    "shop": "car"
-                },
-                "name": "Mazda",
-                "icon": "car",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/car/Mitsubishi": {
-                "tags": {
-                    "name": "Mitsubishi",
-                    "shop": "car"
-                },
-                "name": "Mitsubishi",
-                "icon": "car",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/car/Fiat": {
-                "tags": {
-                    "name": "Fiat",
-                    "shop": "car"
-                },
-                "name": "Fiat",
-                "icon": "car",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/car/Автозапчасти": {
-                "tags": {
-                    "name": "Автозапчасти",
-                    "shop": "car"
-                },
-                "name": "Автозапчасти",
-                "icon": "car",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/car/Opel": {
-                "tags": {
-                    "name": "Opel",
-                    "shop": "car"
-                },
-                "name": "Opel",
-                "icon": "car",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/car/Audi": {
-                "tags": {
-                    "name": "Audi",
-                    "shop": "car"
-                },
-                "name": "Audi",
-                "icon": "car",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/car/Toyota": {
-                "tags": {
-                    "name": "Toyota",
-                    "shop": "car"
-                },
-                "name": "Toyota",
-                "icon": "car",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/car/Nissan": {
-                "tags": {
-                    "name": "Nissan",
-                    "shop": "car"
-                },
-                "name": "Nissan",
-                "icon": "car",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/car/Suzuki": {
-                "tags": {
-                    "name": "Suzuki",
-                    "shop": "car"
-                },
-                "name": "Suzuki",
-                "icon": "car",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/car/Honda": {
-                "tags": {
-                    "name": "Honda",
-                    "shop": "car"
-                },
-                "name": "Honda",
-                "icon": "car",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/car/Peugeot": {
-                "tags": {
-                    "name": "Peugeot",
-                    "shop": "car"
-                },
-                "name": "Peugeot",
-                "icon": "car",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/car/Hyundai": {
-                "tags": {
-                    "name": "Hyundai",
-                    "shop": "car"
-                },
-                "name": "Hyundai",
-                "icon": "car",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/car/Subaru": {
-                "tags": {
-                    "name": "Subaru",
-                    "shop": "car"
-                },
-                "name": "Subaru",
-                "icon": "car",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/car/Chevrolet": {
-                "tags": {
-                    "name": "Chevrolet",
-                    "shop": "car"
-                },
-                "name": "Chevrolet",
-                "icon": "car",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/car/Автомагазин": {
-                "tags": {
-                    "name": "Автомагазин",
-                    "shop": "car"
-                },
-                "name": "Автомагазин",
-                "icon": "car",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/clothes/Matalan": {
-                "tags": {
-                    "name": "Matalan",
-                    "shop": "clothes"
-                },
-                "name": "Matalan",
-                "icon": "clothing-store",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/clothes/KiK": {
-                "tags": {
-                    "name": "KiK",
-                    "shop": "clothes"
-                },
-                "name": "KiK",
-                "icon": "clothing-store",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/clothes/H&M": {
-                "tags": {
-                    "name": "H&M",
-                    "shop": "clothes"
-                },
-                "name": "H&M",
-                "icon": "clothing-store",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/clothes/Urban Outfitters": {
-                "tags": {
-                    "name": "Urban Outfitters",
-                    "shop": "clothes"
-                },
-                "name": "Urban Outfitters",
-                "icon": "clothing-store",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/clothes/Vögele": {
-                "tags": {
-                    "name": "Vögele",
-                    "shop": "clothes"
-                },
-                "name": "Vögele",
-                "icon": "clothing-store",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/clothes/Zeeman": {
-                "tags": {
-                    "name": "Zeeman",
-                    "shop": "clothes"
-                },
-                "name": "Zeeman",
-                "icon": "clothing-store",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/clothes/Takko": {
-                "tags": {
-                    "name": "Takko",
-                    "shop": "clothes"
-                },
-                "name": "Takko",
-                "icon": "clothing-store",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/clothes/C&A": {
-                "tags": {
-                    "name": "C&A",
-                    "shop": "clothes"
-                },
-                "name": "C&A",
-                "icon": "clothing-store",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/clothes/Zara": {
-                "tags": {
-                    "name": "Zara",
-                    "shop": "clothes"
-                },
-                "name": "Zara",
-                "icon": "clothing-store",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/clothes/Vero Moda": {
-                "tags": {
-                    "name": "Vero Moda",
-                    "shop": "clothes"
-                },
-                "name": "Vero Moda",
-                "icon": "clothing-store",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/clothes/NKD": {
-                "tags": {
-                    "name": "NKD",
-                    "shop": "clothes"
-                },
-                "name": "NKD",
-                "icon": "clothing-store",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/clothes/Ernsting's family": {
-                "tags": {
-                    "name": "Ernsting's family",
-                    "shop": "clothes"
-                },
-                "name": "Ernsting's family",
-                "icon": "clothing-store",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/clothes/Winners": {
-                "tags": {
-                    "name": "Winners",
-                    "shop": "clothes"
-                },
-                "name": "Winners",
-                "icon": "clothing-store",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/clothes/River Island": {
-                "tags": {
-                    "name": "River Island",
-                    "shop": "clothes"
-                },
-                "name": "River Island",
-                "icon": "clothing-store",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/clothes/Next": {
-                "tags": {
-                    "name": "Next",
-                    "shop": "clothes"
-                },
-                "name": "Next",
-                "icon": "clothing-store",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/clothes/Gap": {
-                "tags": {
-                    "name": "Gap",
-                    "shop": "clothes"
-                },
-                "name": "Gap",
-                "icon": "clothing-store",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/clothes/Adidas": {
-                "tags": {
-                    "name": "Adidas",
-                    "shop": "clothes"
-                },
-                "name": "Adidas",
-                "icon": "clothing-store",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/clothes/Mr Price": {
-                "tags": {
-                    "name": "Mr Price",
-                    "shop": "clothes"
-                },
-                "name": "Mr Price",
-                "icon": "clothing-store",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/clothes/Pep": {
-                "tags": {
-                    "name": "Pep",
-                    "shop": "clothes"
-                },
-                "name": "Pep",
-                "icon": "clothing-store",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/clothes/Edgars": {
-                "tags": {
-                    "name": "Edgars",
-                    "shop": "clothes"
-                },
-                "name": "Edgars",
-                "icon": "clothing-store",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/clothes/Ackermans": {
-                "tags": {
-                    "name": "Ackermans",
-                    "shop": "clothes"
-                },
-                "name": "Ackermans",
-                "icon": "clothing-store",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/clothes/Truworths": {
-                "tags": {
-                    "name": "Truworths",
-                    "shop": "clothes"
-                },
-                "name": "Truworths",
-                "icon": "clothing-store",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/clothes/Ross": {
-                "tags": {
-                    "name": "Ross",
-                    "shop": "clothes"
-                },
-                "name": "Ross",
-                "icon": "clothing-store",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/clothes/Burton": {
-                "tags": {
-                    "name": "Burton",
-                    "shop": "clothes"
-                },
-                "name": "Burton",
-                "icon": "clothing-store",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/clothes/Dorothy Perkins": {
-                "tags": {
-                    "name": "Dorothy Perkins",
-                    "shop": "clothes"
-                },
-                "name": "Dorothy Perkins",
-                "icon": "clothing-store",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/clothes/Lindex": {
-                "tags": {
-                    "name": "Lindex",
-                    "shop": "clothes"
-                },
-                "name": "Lindex",
-                "icon": "clothing-store",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/clothes/s.Oliver": {
-                "tags": {
-                    "name": "s.Oliver",
-                    "shop": "clothes"
-                },
-                "name": "s.Oliver",
-                "icon": "clothing-store",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/clothes/Cecil": {
-                "tags": {
-                    "name": "Cecil",
-                    "shop": "clothes"
-                },
-                "name": "Cecil",
-                "icon": "clothing-store",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/clothes/Dress Barn": {
-                "tags": {
-                    "name": "Dress Barn",
-                    "shop": "clothes"
-                },
-                "name": "Dress Barn",
-                "icon": "clothing-store",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/clothes/Old Navy": {
-                "tags": {
-                    "name": "Old Navy",
-                    "shop": "clothes"
-                },
-                "name": "Old Navy",
-                "icon": "clothing-store",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/clothes/Jack & Jones": {
-                "tags": {
-                    "name": "Jack & Jones",
-                    "shop": "clothes"
-                },
-                "name": "Jack & Jones",
-                "icon": "clothing-store",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/clothes/Pimkie": {
-                "tags": {
-                    "name": "Pimkie",
-                    "shop": "clothes"
-                },
-                "name": "Pimkie",
-                "icon": "clothing-store",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/clothes/Esprit": {
-                "tags": {
-                    "name": "Esprit",
-                    "shop": "clothes"
-                },
-                "name": "Esprit",
-                "icon": "clothing-store",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/clothes/Primark": {
-                "tags": {
-                    "name": "Primark",
-                    "shop": "clothes"
-                },
-                "name": "Primark",
-                "icon": "clothing-store",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/clothes/Bonita": {
-                "tags": {
-                    "name": "Bonita",
-                    "shop": "clothes"
-                },
-                "name": "Bonita",
-                "icon": "clothing-store",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/clothes/Mexx": {
-                "tags": {
-                    "name": "Mexx",
-                    "shop": "clothes"
-                },
-                "name": "Mexx",
-                "icon": "clothing-store",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/clothes/Gerry Weber": {
-                "tags": {
-                    "name": "Gerry Weber",
-                    "shop": "clothes"
-                },
-                "name": "Gerry Weber",
-                "icon": "clothing-store",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/clothes/Tally Weijl": {
-                "tags": {
-                    "name": "Tally Weijl",
-                    "shop": "clothes"
-                },
-                "name": "Tally Weijl",
-                "icon": "clothing-store",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/clothes/Mango": {
-                "tags": {
-                    "name": "Mango",
-                    "shop": "clothes"
-                },
-                "name": "Mango",
-                "icon": "clothing-store",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/clothes/TK Maxx": {
-                "tags": {
-                    "name": "TK Maxx",
-                    "shop": "clothes"
-                },
-                "name": "TK Maxx",
-                "icon": "clothing-store",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/clothes/Benetton": {
-                "tags": {
-                    "name": "Benetton",
-                    "shop": "clothes"
-                },
-                "name": "Benetton",
-                "icon": "clothing-store",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/clothes/Ulla Popken": {
-                "tags": {
-                    "name": "Ulla Popken",
-                    "shop": "clothes"
-                },
-                "name": "Ulla Popken",
-                "icon": "clothing-store",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/clothes/AWG": {
-                "tags": {
-                    "name": "AWG",
-                    "shop": "clothes"
-                },
-                "name": "AWG",
-                "icon": "clothing-store",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/clothes/Tommy Hilfiger": {
-                "tags": {
-                    "name": "Tommy Hilfiger",
-                    "shop": "clothes"
-                },
-                "name": "Tommy Hilfiger",
-                "icon": "clothing-store",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/clothes/New Yorker": {
-                "tags": {
-                    "name": "New Yorker",
-                    "shop": "clothes"
-                },
-                "name": "New Yorker",
-                "icon": "clothing-store",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/clothes/Orsay": {
-                "tags": {
-                    "name": "Orsay",
-                    "shop": "clothes"
-                },
-                "name": "Orsay",
-                "icon": "clothing-store",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/clothes/Jeans Fritz": {
-                "tags": {
-                    "name": "Jeans Fritz",
-                    "shop": "clothes"
-                },
-                "name": "Jeans Fritz",
-                "icon": "clothing-store",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/clothes/Charles Vögele": {
-                "tags": {
-                    "name": "Charles Vögele",
-                    "shop": "clothes"
-                },
-                "name": "Charles Vögele",
-                "icon": "clothing-store",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/clothes/New Look": {
-                "tags": {
-                    "name": "New Look",
-                    "shop": "clothes"
-                },
-                "name": "New Look",
-                "icon": "clothing-store",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/clothes/Lacoste": {
-                "tags": {
-                    "name": "Lacoste",
-                    "shop": "clothes"
-                },
-                "name": "Lacoste",
-                "icon": "clothing-store",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/clothes/Etam": {
-                "tags": {
-                    "name": "Etam",
-                    "shop": "clothes"
-                },
-                "name": "Etam",
-                "icon": "clothing-store",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/clothes/Kiabi": {
-                "tags": {
-                    "name": "Kiabi",
-                    "shop": "clothes"
-                },
-                "name": "Kiabi",
-                "icon": "clothing-store",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/clothes/Jack Wolfskin": {
-                "tags": {
-                    "name": "Jack Wolfskin",
-                    "shop": "clothes"
-                },
-                "name": "Jack Wolfskin",
-                "icon": "clothing-store",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/clothes/American Apparel": {
-                "tags": {
-                    "name": "American Apparel",
-                    "shop": "clothes"
-                },
-                "name": "American Apparel",
-                "icon": "clothing-store",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/clothes/Men's Wearhouse": {
-                "tags": {
-                    "name": "Men's Wearhouse",
-                    "shop": "clothes"
-                },
-                "name": "Men's Wearhouse",
-                "icon": "clothing-store",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/clothes/Intimissimi": {
-                "tags": {
-                    "name": "Intimissimi",
-                    "shop": "clothes"
-                },
-                "name": "Intimissimi",
-                "icon": "clothing-store",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/clothes/United Colors of Benetton": {
-                "tags": {
-                    "name": "United Colors of Benetton",
-                    "shop": "clothes"
-                },
-                "name": "United Colors of Benetton",
-                "icon": "clothing-store",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/clothes/Jules": {
-                "tags": {
-                    "name": "Jules",
-                    "shop": "clothes"
-                },
-                "name": "Jules",
-                "icon": "clothing-store",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/clothes/Second Hand": {
-                "tags": {
-                    "name": "Second Hand",
-                    "shop": "clothes"
-                },
-                "name": "Second Hand",
-                "icon": "clothing-store",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/clothes/AOKI": {
-                "tags": {
-                    "name": "AOKI",
-                    "shop": "clothes"
-                },
-                "name": "AOKI",
-                "icon": "clothing-store",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/clothes/Calzedonia": {
-                "tags": {
-                    "name": "Calzedonia",
-                    "shop": "clothes"
-                },
-                "name": "Calzedonia",
-                "icon": "clothing-store",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/clothes/洋服の青山": {
-                "tags": {
-                    "name": "洋服の青山",
-                    "shop": "clothes"
-                },
-                "name": "洋服の青山",
-                "icon": "clothing-store",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/clothes/Levi's": {
-                "tags": {
-                    "name": "Levi's",
-                    "shop": "clothes"
-                },
-                "name": "Levi's",
-                "icon": "clothing-store",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/clothes/Celio": {
-                "tags": {
-                    "name": "Celio",
-                    "shop": "clothes"
-                },
-                "name": "Celio",
-                "icon": "clothing-store",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/clothes/TJ Maxx": {
-                "tags": {
-                    "name": "TJ Maxx",
-                    "shop": "clothes"
-                },
-                "name": "TJ Maxx",
-                "icon": "clothing-store",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/clothes/Promod": {
-                "tags": {
-                    "name": "Promod",
-                    "shop": "clothes"
-                },
-                "name": "Promod",
-                "icon": "clothing-store",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/clothes/Street One": {
-                "tags": {
-                    "name": "Street One",
-                    "shop": "clothes"
-                },
-                "name": "Street One",
-                "icon": "clothing-store",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/clothes/ユニクロ": {
-                "tags": {
-                    "name": "ユニクロ",
-                    "shop": "clothes"
-                },
-                "name": "ユニクロ",
-                "icon": "clothing-store",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/clothes/Banana Republic": {
-                "tags": {
-                    "name": "Banana Republic",
-                    "shop": "clothes"
-                },
-                "name": "Banana Republic",
-                "icon": "clothing-store",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/clothes/Одежда": {
-                "tags": {
-                    "name": "Одежда",
-                    "shop": "clothes"
-                },
-                "name": "Одежда",
-                "icon": "clothing-store",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/clothes/Marshalls": {
-                "tags": {
-                    "name": "Marshalls",
-                    "shop": "clothes"
-                },
-                "name": "Marshalls",
-                "icon": "clothing-store",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/clothes/La Halle": {
-                "tags": {
-                    "name": "La Halle",
-                    "shop": "clothes"
-                },
-                "name": "La Halle",
-                "icon": "clothing-store",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/clothes/Peacocks": {
-                "tags": {
-                    "name": "Peacocks",
-                    "shop": "clothes"
-                },
-                "name": "Peacocks",
-                "icon": "clothing-store",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/clothes/しまむら": {
-                "tags": {
-                    "name": "しまむら",
-                    "shop": "clothes"
-                },
-                "name": "しまむら",
-                "icon": "clothing-store",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/books/Bruna": {
-                "tags": {
-                    "name": "Bruna",
-                    "shop": "books"
-                },
-                "name": "Bruna",
-                "icon": "shop",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/books/Waterstones": {
-                "tags": {
-                    "name": "Waterstones",
-                    "shop": "books"
-                },
-                "name": "Waterstones",
-                "icon": "shop",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/books/Libro": {
-                "tags": {
-                    "name": "Libro",
-                    "shop": "books"
-                },
-                "name": "Libro",
-                "icon": "shop",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/books/Barnes & Noble": {
-                "tags": {
-                    "name": "Barnes & Noble",
-                    "shop": "books"
-                },
-                "name": "Barnes & Noble",
-                "icon": "shop",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/books/Weltbild": {
-                "tags": {
-                    "name": "Weltbild",
-                    "shop": "books"
-                },
-                "name": "Weltbild",
-                "icon": "shop",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/books/Thalia": {
-                "tags": {
-                    "name": "Thalia",
-                    "shop": "books"
-                },
-                "name": "Thalia",
-                "icon": "shop",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/books/Книги": {
-                "tags": {
-                    "name": "Книги",
-                    "shop": "books"
-                },
-                "name": "Книги",
-                "icon": "shop",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/department_store/Debenhams": {
-                "tags": {
-                    "name": "Debenhams",
-                    "shop": "department_store"
-                },
-                "name": "Debenhams",
-                "icon": "shop",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/department_store/Karstadt": {
-                "tags": {
-                    "name": "Karstadt",
-                    "shop": "department_store"
-                },
-                "name": "Karstadt",
-                "icon": "shop",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/department_store/Kmart": {
-                "tags": {
-                    "name": "Kmart",
-                    "shop": "department_store"
-                },
-                "name": "Kmart",
-                "icon": "shop",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/department_store/Target": {
-                "tags": {
-                    "name": "Target",
-                    "shop": "department_store"
-                },
-                "name": "Target",
-                "icon": "shop",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/department_store/Galeria Kaufhof": {
-                "tags": {
-                    "name": "Galeria Kaufhof",
-                    "shop": "department_store"
-                },
-                "name": "Galeria Kaufhof",
-                "icon": "shop",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/department_store/Marks & Spencer": {
-                "tags": {
-                    "name": "Marks & Spencer",
-                    "shop": "department_store"
-                },
-                "name": "Marks & Spencer",
-                "icon": "shop",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/department_store/Big W": {
-                "tags": {
-                    "name": "Big W",
-                    "shop": "department_store"
-                },
-                "name": "Big W",
-                "icon": "shop",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/department_store/Woolworth": {
-                "tags": {
-                    "name": "Woolworth",
-                    "shop": "department_store"
-                },
-                "name": "Woolworth",
-                "icon": "shop",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/department_store/Универмаг": {
-                "tags": {
-                    "name": "Универмаг",
-                    "shop": "department_store"
-                },
-                "name": "Универмаг",
-                "icon": "shop",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/department_store/Sears": {
-                "tags": {
-                    "name": "Sears",
-                    "shop": "department_store"
-                },
-                "name": "Sears",
-                "icon": "shop",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/department_store/Kohl's": {
-                "tags": {
-                    "name": "Kohl's",
-                    "shop": "department_store"
-                },
-                "name": "Kohl's",
-                "icon": "shop",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/department_store/Macy's": {
-                "tags": {
-                    "name": "Macy's",
-                    "shop": "department_store"
-                },
-                "name": "Macy's",
-                "icon": "shop",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/department_store/JCPenney": {
-                "tags": {
-                    "name": "JCPenney",
-                    "shop": "department_store"
-                },
-                "name": "JCPenney",
-                "icon": "shop",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/alcohol/Alko": {
-                "tags": {
-                    "name": "Alko",
-                    "shop": "alcohol"
-                },
-                "name": "Alko",
-                "icon": "alcohol-shop",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/alcohol/The Beer Store": {
-                "tags": {
-                    "name": "The Beer Store",
-                    "shop": "alcohol"
-                },
-                "name": "The Beer Store",
-                "icon": "alcohol-shop",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/alcohol/Systembolaget": {
-                "tags": {
-                    "name": "Systembolaget",
-                    "shop": "alcohol"
-                },
-                "name": "Systembolaget",
-                "icon": "alcohol-shop",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/alcohol/LCBO": {
-                "tags": {
-                    "name": "LCBO",
-                    "shop": "alcohol"
-                },
-                "name": "LCBO",
-                "icon": "alcohol-shop",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/alcohol/Ароматный мир": {
-                "tags": {
-                    "name": "Ароматный мир",
-                    "shop": "alcohol"
-                },
-                "name": "Ароматный мир",
-                "icon": "alcohol-shop",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/alcohol/Bargain Booze": {
-                "tags": {
-                    "name": "Bargain Booze",
-                    "shop": "alcohol"
-                },
-                "name": "Bargain Booze",
-                "icon": "alcohol-shop",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/alcohol/Nicolas": {
-                "tags": {
-                    "name": "Nicolas",
-                    "shop": "alcohol"
-                },
-                "name": "Nicolas",
-                "icon": "alcohol-shop",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/alcohol/BWS": {
-                "tags": {
-                    "name": "BWS",
-                    "shop": "alcohol"
-                },
-                "name": "BWS",
-                "icon": "alcohol-shop",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/alcohol/Botilleria": {
-                "tags": {
-                    "name": "Botilleria",
-                    "shop": "alcohol"
-                },
-                "name": "Botilleria",
-                "icon": "alcohol-shop",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/alcohol/SAQ": {
-                "tags": {
-                    "name": "SAQ",
-                    "shop": "alcohol"
-                },
-                "name": "SAQ",
-                "icon": "alcohol-shop",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/alcohol/Gall & Gall": {
-                "tags": {
-                    "name": "Gall & Gall",
-                    "shop": "alcohol"
-                },
-                "name": "Gall & Gall",
-                "icon": "alcohol-shop",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/alcohol/Живое пиво": {
-                "tags": {
-                    "name": "Живое пиво",
-                    "shop": "alcohol"
-                },
-                "name": "Живое пиво",
-                "icon": "alcohol-shop",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/bakery/Kamps": {
-                "tags": {
-                    "name": "Kamps",
-                    "shop": "bakery"
-                },
-                "name": "Kamps",
-                "icon": "bakery",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/bakery/Banette": {
-                "tags": {
-                    "name": "Banette",
-                    "shop": "bakery"
-                },
-                "name": "Banette",
-                "icon": "bakery",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/bakery/Bäckerei Schmidt": {
-                "tags": {
-                    "name": "Bäckerei Schmidt",
-                    "shop": "bakery"
-                },
-                "name": "Bäckerei Schmidt",
-                "icon": "bakery",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/bakery/Anker": {
-                "tags": {
-                    "name": "Anker",
-                    "shop": "bakery"
-                },
-                "name": "Anker",
-                "icon": "bakery",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/bakery/Hofpfisterei": {
-                "tags": {
-                    "name": "Hofpfisterei",
-                    "shop": "bakery"
-                },
-                "name": "Hofpfisterei",
-                "icon": "bakery",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/bakery/Greggs": {
-                "tags": {
-                    "name": "Greggs",
-                    "shop": "bakery"
-                },
-                "name": "Greggs",
-                "icon": "bakery",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/bakery/Oebel": {
-                "tags": {
-                    "name": "Oebel",
-                    "shop": "bakery"
-                },
-                "name": "Oebel",
-                "icon": "bakery",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/bakery/Boulangerie": {
-                "tags": {
-                    "name": "Boulangerie",
-                    "shop": "bakery"
-                },
-                "name": "Boulangerie",
-                "icon": "bakery",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/bakery/Stadtbäckerei": {
-                "tags": {
-                    "name": "Stadtbäckerei",
-                    "shop": "bakery"
-                },
-                "name": "Stadtbäckerei",
-                "icon": "bakery",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/bakery/Steinecke": {
-                "tags": {
-                    "name": "Steinecke",
-                    "shop": "bakery"
-                },
-                "name": "Steinecke",
-                "icon": "bakery",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/bakery/Ihle": {
-                "tags": {
-                    "name": "Ihle",
-                    "shop": "bakery"
-                },
-                "name": "Ihle",
-                "icon": "bakery",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/bakery/Goldilocks": {
-                "tags": {
-                    "name": "Goldilocks",
-                    "shop": "bakery"
-                },
-                "name": "Goldilocks",
-                "icon": "bakery",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/bakery/Dat Backhus": {
-                "tags": {
-                    "name": "Dat Backhus",
-                    "shop": "bakery"
-                },
-                "name": "Dat Backhus",
-                "icon": "bakery",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/bakery/K&U": {
-                "tags": {
-                    "name": "K&U",
-                    "shop": "bakery"
-                },
-                "name": "K&U",
-                "icon": "bakery",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/bakery/Der Beck": {
-                "tags": {
-                    "name": "Der Beck",
-                    "shop": "bakery"
-                },
-                "name": "Der Beck",
-                "icon": "bakery",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/bakery/Thürmann": {
-                "tags": {
-                    "name": "Thürmann",
-                    "shop": "bakery"
-                },
-                "name": "Thürmann",
-                "icon": "bakery",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/bakery/Backwerk": {
-                "tags": {
-                    "name": "Backwerk",
-                    "shop": "bakery"
-                },
-                "name": "Backwerk",
-                "icon": "bakery",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/bakery/Bäcker": {
-                "tags": {
-                    "name": "Bäcker",
-                    "shop": "bakery"
-                },
-                "name": "Bäcker",
-                "icon": "bakery",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/bakery/Schäfer's": {
-                "tags": {
-                    "name": "Schäfer's",
-                    "shop": "bakery"
-                },
-                "name": "Schäfer's",
-                "icon": "bakery",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/bakery/Panaderia": {
-                "tags": {
-                    "name": "Panaderia",
-                    "shop": "bakery"
-                },
-                "name": "Panaderia",
-                "icon": "bakery",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/bakery/Goeken backen": {
-                "tags": {
-                    "name": "Goeken backen",
-                    "shop": "bakery"
-                },
-                "name": "Goeken backen",
-                "icon": "bakery",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/bakery/Stadtbäckerei Junge": {
-                "tags": {
-                    "name": "Stadtbäckerei Junge",
-                    "shop": "bakery"
-                },
-                "name": "Stadtbäckerei Junge",
-                "icon": "bakery",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/bakery/Boulangerie Patisserie": {
-                "tags": {
-                    "name": "Boulangerie Patisserie",
-                    "shop": "bakery"
-                },
-                "name": "Boulangerie Patisserie",
-                "icon": "bakery",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/bakery/Paul": {
-                "tags": {
-                    "name": "Paul",
-                    "shop": "bakery"
-                },
-                "name": "Paul",
-                "icon": "bakery",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/bakery/Хлеб": {
-                "tags": {
-                    "name": "Хлеб",
-                    "shop": "bakery"
-                },
-                "name": "Хлеб",
-                "icon": "bakery",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/bakery/Piekarnia": {
-                "tags": {
-                    "name": "Piekarnia",
-                    "shop": "bakery"
-                },
-                "name": "Piekarnia",
-                "icon": "bakery",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/bakery/Пекарня": {
-                "tags": {
-                    "name": "Пекарня",
-                    "shop": "bakery"
-                },
-                "name": "Пекарня",
-                "icon": "bakery",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/bakery/Кулиничи": {
-                "tags": {
-                    "name": "Кулиничи",
-                    "shop": "bakery"
-                },
-                "name": "Кулиничи",
-                "icon": "bakery",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/sports/Sports Direct": {
-                "tags": {
-                    "name": "Sports Direct",
-                    "shop": "sports"
-                },
-                "name": "Sports Direct",
-                "icon": "shop",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/sports/Decathlon": {
-                "tags": {
-                    "name": "Decathlon",
-                    "shop": "sports"
-                },
-                "name": "Decathlon",
-                "icon": "shop",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/sports/Intersport": {
-                "tags": {
-                    "name": "Intersport",
-                    "shop": "sports"
-                },
-                "name": "Intersport",
-                "icon": "shop",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/sports/Sports Authority": {
-                "tags": {
-                    "name": "Sports Authority",
-                    "shop": "sports"
-                },
-                "name": "Sports Authority",
-                "icon": "shop",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/sports/Спортмастер": {
-                "tags": {
-                    "name": "Спортмастер",
-                    "shop": "sports"
-                },
-                "name": "Спортмастер",
-                "icon": "shop",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/sports/Sport 2000": {
-                "tags": {
-                    "name": "Sport 2000",
-                    "shop": "sports"
-                },
-                "name": "Sport 2000",
-                "icon": "shop",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/sports/Dick's Sporting Goods": {
-                "tags": {
-                    "name": "Dick's Sporting Goods",
-                    "shop": "sports"
-                },
-                "name": "Dick's Sporting Goods",
-                "icon": "shop",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/variety_store/Tedi": {
-                "tags": {
-                    "name": "Tedi",
-                    "shop": "variety_store"
-                },
-                "name": "Tedi",
-                "icon": "shop",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/variety_store/Dollarama": {
-                "tags": {
-                    "name": "Dollarama",
-                    "shop": "variety_store"
-                },
-                "name": "Dollarama",
-                "icon": "shop",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/variety_store/Family Dollar": {
-                "tags": {
-                    "name": "Family Dollar",
-                    "shop": "variety_store"
-                },
-                "name": "Family Dollar",
-                "icon": "shop",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/variety_store/Dollar Tree": {
-                "tags": {
-                    "name": "Dollar Tree",
-                    "shop": "variety_store"
-                },
-                "name": "Dollar Tree",
-                "icon": "shop",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/pet/Fressnapf": {
-                "tags": {
-                    "name": "Fressnapf",
-                    "shop": "pet"
-                },
-                "name": "Fressnapf",
-                "icon": "dog-park",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/pet/PetSmart": {
-                "tags": {
-                    "name": "PetSmart",
-                    "shop": "pet"
-                },
-                "name": "PetSmart",
-                "icon": "dog-park",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/pet/Das Futterhaus": {
-                "tags": {
-                    "name": "Das Futterhaus",
-                    "shop": "pet"
-                },
-                "name": "Das Futterhaus",
-                "icon": "dog-park",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/pet/Pets at Home": {
-                "tags": {
-                    "name": "Pets at Home",
-                    "shop": "pet"
-                },
-                "name": "Pets at Home",
-                "icon": "dog-park",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/pet/Petco": {
-                "tags": {
-                    "name": "Petco",
-                    "shop": "pet"
-                },
-                "name": "Petco",
-                "icon": "dog-park",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/pet/Зоомагазин": {
-                "tags": {
-                    "name": "Зоомагазин",
-                    "shop": "pet"
-                },
-                "name": "Зоомагазин",
-                "icon": "dog-park",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/shoes/Deichmann": {
-                "tags": {
-                    "name": "Deichmann",
-                    "shop": "shoes"
-                },
-                "name": "Deichmann",
-                "icon": "shop",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/shoes/Reno": {
-                "tags": {
-                    "name": "Reno",
-                    "shop": "shoes"
-                },
-                "name": "Reno",
-                "icon": "shop",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/shoes/Ecco": {
-                "tags": {
-                    "name": "Ecco",
-                    "shop": "shoes"
-                },
-                "name": "Ecco",
-                "icon": "shop",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/shoes/Clarks": {
-                "tags": {
-                    "name": "Clarks",
-                    "shop": "shoes"
-                },
-                "name": "Clarks",
-                "icon": "shop",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/shoes/La Halle aux Chaussures": {
-                "tags": {
-                    "name": "La Halle aux Chaussures",
-                    "shop": "shoes"
-                },
-                "name": "La Halle aux Chaussures",
-                "icon": "shop",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/shoes/Brantano": {
-                "tags": {
-                    "name": "Brantano",
-                    "shop": "shoes"
-                },
-                "name": "Brantano",
-                "icon": "shop",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/shoes/Geox": {
-                "tags": {
-                    "name": "Geox",
-                    "shop": "shoes"
-                },
-                "name": "Geox",
-                "icon": "shop",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/shoes/Salamander": {
-                "tags": {
-                    "name": "Salamander",
-                    "shop": "shoes"
-                },
-                "name": "Salamander",
-                "icon": "shop",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/shoes/Обувь": {
-                "tags": {
-                    "name": "Обувь",
-                    "shop": "shoes"
-                },
-                "name": "Обувь",
-                "icon": "shop",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/shoes/Payless Shoe Source": {
-                "tags": {
-                    "name": "Payless Shoe Source",
-                    "shop": "shoes"
-                },
-                "name": "Payless Shoe Source",
-                "icon": "shop",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/shoes/Famous Footwear": {
-                "tags": {
-                    "name": "Famous Footwear",
-                    "shop": "shoes"
-                },
-                "name": "Famous Footwear",
-                "icon": "shop",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/shoes/Quick Schuh": {
-                "tags": {
-                    "name": "Quick Schuh",
-                    "shop": "shoes"
-                },
-                "name": "Quick Schuh",
-                "icon": "shop",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/shoes/Shoe Zone": {
-                "tags": {
-                    "name": "Shoe Zone",
-                    "shop": "shoes"
-                },
-                "name": "Shoe Zone",
-                "icon": "shop",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/shoes/Foot Locker": {
-                "tags": {
-                    "name": "Foot Locker",
-                    "shop": "shoes"
-                },
-                "name": "Foot Locker",
-                "icon": "shop",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/shoes/Bata": {
-                "tags": {
-                    "name": "Bata",
-                    "shop": "shoes"
-                },
-                "name": "Bata",
-                "icon": "shop",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/shoes/ЦентрОбувь": {
-                "tags": {
-                    "name": "ЦентрОбувь",
-                    "shop": "shoes"
-                },
-                "name": "ЦентрОбувь",
-                "icon": "shop",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/toys/La Grande Récré": {
-                "tags": {
-                    "name": "La Grande Récré",
-                    "shop": "toys"
-                },
-                "name": "La Grande Récré",
-                "icon": "shop",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/toys/Toys R Us": {
-                "tags": {
-                    "name": "Toys R Us",
-                    "shop": "toys"
-                },
-                "name": "Toys R Us",
-                "icon": "shop",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/toys/Intertoys": {
-                "tags": {
-                    "name": "Intertoys",
-                    "shop": "toys"
-                },
-                "name": "Intertoys",
-                "icon": "shop",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/toys/Детский мир": {
-                "tags": {
-                    "name": "Детский мир",
-                    "shop": "toys"
-                },
-                "name": "Детский мир",
-                "icon": "shop",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/toys/Игрушки": {
-                "tags": {
-                    "name": "Игрушки",
-                    "shop": "toys"
-                },
-                "name": "Игрушки",
-                "icon": "shop",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/travel_agency/Flight Centre": {
-                "tags": {
-                    "name": "Flight Centre",
-                    "shop": "travel_agency"
-                },
-                "name": "Flight Centre",
-                "icon": "suitcase",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/travel_agency/Thomas Cook": {
-                "tags": {
-                    "name": "Thomas Cook",
-                    "shop": "travel_agency"
-                },
-                "name": "Thomas Cook",
-                "icon": "suitcase",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/jewelry/Bijou Brigitte": {
-                "tags": {
-                    "name": "Bijou Brigitte",
-                    "shop": "jewelry"
-                },
-                "name": "Bijou Brigitte",
-                "icon": "shop",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/jewelry/Christ": {
-                "tags": {
-                    "name": "Christ",
-                    "shop": "jewelry"
-                },
-                "name": "Christ",
-                "icon": "shop",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/jewelry/Swarovski": {
-                "tags": {
-                    "name": "Swarovski",
-                    "shop": "jewelry"
-                },
-                "name": "Swarovski",
-                "icon": "shop",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/optician/Fielmann": {
-                "tags": {
-                    "name": "Fielmann",
-                    "shop": "optician"
-                },
-                "name": "Fielmann",
-                "icon": "shop",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/optician/Apollo Optik": {
-                "tags": {
-                    "name": "Apollo Optik",
-                    "shop": "optician"
-                },
-                "name": "Apollo Optik",
-                "icon": "shop",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/optician/Vision Express": {
-                "tags": {
-                    "name": "Vision Express",
-                    "shop": "optician"
-                },
-                "name": "Vision Express",
-                "icon": "shop",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/optician/Оптика": {
-                "tags": {
-                    "name": "Оптика",
-                    "shop": "optician"
-                },
-                "name": "Оптика",
-                "icon": "shop",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/optician/Optic 2000": {
-                "tags": {
-                    "name": "Optic 2000",
-                    "shop": "optician"
-                },
-                "name": "Optic 2000",
-                "icon": "shop",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/optician/Alain Afflelou": {
-                "tags": {
-                    "name": "Alain Afflelou",
-                    "shop": "optician"
-                },
-                "name": "Alain Afflelou",
-                "icon": "shop",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/optician/Specsavers": {
-                "tags": {
-                    "name": "Specsavers",
-                    "shop": "optician"
-                },
-                "name": "Specsavers",
-                "icon": "shop",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/optician/Krys": {
-                "tags": {
-                    "name": "Krys",
-                    "shop": "optician"
-                },
-                "name": "Krys",
-                "icon": "shop",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/optician/Atol": {
-                "tags": {
-                    "name": "Atol",
-                    "shop": "optician"
-                },
-                "name": "Atol",
-                "icon": "shop",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/video/Blockbuster": {
-                "tags": {
-                    "name": "Blockbuster",
-                    "shop": "video"
-                },
-                "name": "Blockbuster",
-                "icon": "shop",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/video/World of Video": {
-                "tags": {
-                    "name": "World of Video",
-                    "shop": "video"
-                },
-                "name": "World of Video",
-                "icon": "shop",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/mobile_phone/Билайн": {
-                "tags": {
-                    "name": "Билайн",
-                    "shop": "mobile_phone"
-                },
-                "name": "Билайн",
-                "icon": "mobilephone",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/mobile_phone/ソフトバンクショップ (SoftBank shop)": {
-                "tags": {
-                    "name": "ソフトバンクショップ (SoftBank shop)",
-                    "shop": "mobile_phone"
-                },
-                "name": "ソフトバンクショップ (SoftBank shop)",
-                "icon": "mobilephone",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/mobile_phone/Vodafone": {
-                "tags": {
-                    "name": "Vodafone",
-                    "shop": "mobile_phone"
-                },
-                "name": "Vodafone",
-                "icon": "mobilephone",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/mobile_phone/O2": {
-                "tags": {
-                    "name": "O2",
-                    "shop": "mobile_phone"
-                },
-                "name": "O2",
-                "icon": "mobilephone",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/mobile_phone/Carphone Warehouse": {
-                "tags": {
-                    "name": "Carphone Warehouse",
-                    "shop": "mobile_phone"
-                },
-                "name": "Carphone Warehouse",
-                "icon": "mobilephone",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/mobile_phone/Orange": {
-                "tags": {
-                    "name": "Orange",
-                    "shop": "mobile_phone"
-                },
-                "name": "Orange",
-                "icon": "mobilephone",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/mobile_phone/Verizon Wireless": {
-                "tags": {
-                    "name": "Verizon Wireless",
-                    "shop": "mobile_phone"
-                },
-                "name": "Verizon Wireless",
-                "icon": "mobilephone",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/mobile_phone/Sprint": {
-                "tags": {
-                    "name": "Sprint",
-                    "shop": "mobile_phone"
-                },
-                "name": "Sprint",
-                "icon": "mobilephone",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/mobile_phone/T-Mobile": {
-                "tags": {
-                    "name": "T-Mobile",
-                    "shop": "mobile_phone"
-                },
-                "name": "T-Mobile",
-                "icon": "mobilephone",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/mobile_phone/МТС": {
-                "tags": {
-                    "name": "МТС",
-                    "shop": "mobile_phone"
-                },
-                "name": "МТС",
-                "icon": "mobilephone",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/mobile_phone/Евросеть": {
-                "tags": {
-                    "name": "Евросеть",
-                    "shop": "mobile_phone"
-                },
-                "name": "Евросеть",
-                "icon": "mobilephone",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/mobile_phone/Bell": {
-                "tags": {
-                    "name": "Bell",
-                    "shop": "mobile_phone"
-                },
-                "name": "Bell",
-                "icon": "mobilephone",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/mobile_phone/The Phone House": {
-                "tags": {
-                    "name": "The Phone House",
-                    "shop": "mobile_phone"
-                },
-                "name": "The Phone House",
-                "icon": "mobilephone",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/mobile_phone/SFR": {
-                "tags": {
-                    "name": "SFR",
-                    "shop": "mobile_phone"
-                },
-                "name": "SFR",
-                "icon": "mobilephone",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/mobile_phone/Связной": {
-                "tags": {
-                    "name": "Связной",
-                    "shop": "mobile_phone"
-                },
-                "name": "Связной",
-                "icon": "mobilephone",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/mobile_phone/Мегафон": {
-                "tags": {
-                    "name": "Мегафон",
-                    "shop": "mobile_phone"
-                },
-                "name": "Мегафон",
-                "icon": "mobilephone",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/mobile_phone/AT&T": {
-                "tags": {
-                    "name": "AT&T",
-                    "shop": "mobile_phone"
-                },
-                "name": "AT&T",
-                "icon": "mobilephone",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/mobile_phone/ドコモショップ (docomo shop)": {
-                "tags": {
-                    "name": "ドコモショップ (docomo shop)",
-                    "shop": "mobile_phone"
-                },
-                "name": "ドコモショップ (docomo shop)",
-                "icon": "mobilephone",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/mobile_phone/au": {
-                "tags": {
-                    "name": "au",
-                    "shop": "mobile_phone"
-                },
-                "name": "au",
-                "icon": "mobilephone",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/mobile_phone/Movistar": {
-                "tags": {
-                    "name": "Movistar",
-                    "shop": "mobile_phone"
-                },
-                "name": "Movistar",
-                "icon": "mobilephone",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/mobile_phone/Bitė": {
-                "tags": {
-                    "name": "Bitė",
-                    "shop": "mobile_phone"
-                },
-                "name": "Bitė",
-                "icon": "mobilephone",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/computer/PC World": {
-                "tags": {
-                    "name": "PC World",
-                    "shop": "computer"
-                },
-                "name": "PC World",
-                "icon": "shop",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/computer/DNS": {
-                "tags": {
-                    "name": "DNS",
-                    "shop": "computer"
-                },
-                "name": "DNS",
-                "icon": "shop",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/hairdresser/Klier": {
-                "tags": {
-                    "name": "Klier",
-                    "shop": "hairdresser"
-                },
-                "name": "Klier",
-                "icon": "hairdresser",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/hairdresser/Supercuts": {
-                "tags": {
-                    "name": "Supercuts",
-                    "shop": "hairdresser"
-                },
-                "name": "Supercuts",
-                "icon": "hairdresser",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/hairdresser/Hairkiller": {
-                "tags": {
-                    "name": "Hairkiller",
-                    "shop": "hairdresser"
-                },
-                "name": "Hairkiller",
-                "icon": "hairdresser",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/hairdresser/Great Clips": {
-                "tags": {
-                    "name": "Great Clips",
-                    "shop": "hairdresser"
-                },
-                "name": "Great Clips",
-                "icon": "hairdresser",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/hairdresser/Парикмахерская": {
-                "tags": {
-                    "name": "Парикмахерская",
-                    "shop": "hairdresser"
-                },
-                "name": "Парикмахерская",
-                "icon": "hairdresser",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/hairdresser/Стиль": {
-                "tags": {
-                    "name": "Стиль",
-                    "shop": "hairdresser"
-                },
-                "name": "Стиль",
-                "icon": "hairdresser",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/hairdresser/Fryzjer": {
-                "tags": {
-                    "name": "Fryzjer",
-                    "shop": "hairdresser"
-                },
-                "name": "Fryzjer",
-                "icon": "hairdresser",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/hairdresser/Franck Provost": {
-                "tags": {
-                    "name": "Franck Provost",
-                    "shop": "hairdresser"
-                },
-                "name": "Franck Provost",
-                "icon": "hairdresser",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/hairdresser/Салон красоты": {
-                "tags": {
-                    "name": "Салон красоты",
-                    "shop": "hairdresser"
-                },
-                "name": "Салон красоты",
-                "icon": "hairdresser",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/hardware/1000 мелочей": {
-                "tags": {
-                    "name": "1000 мелочей",
-                    "shop": "hardware"
-                },
-                "name": "1000 мелочей",
-                "icon": "shop",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/hardware/Хозтовары": {
-                "tags": {
-                    "name": "Хозтовары",
-                    "shop": "hardware"
-                },
-                "name": "Хозтовары",
-                "icon": "shop",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            },
-            "shop/motorcycle/Yamaha": {
-                "tags": {
-                    "name": "Yamaha",
-                    "shop": "motorcycle"
-                },
-                "name": "Yamaha",
-                "icon": "scooter",
-                "geometry": [
-                    "point",
-                    "area"
-                ],
-                "fields": [
-                    "operator",
-                    "address",
-                    "building_area",
-                    "opening_hours"
-                ],
-                "suggestion": true
-            }
-        },
-        "defaults": {
-            "area": [
-                "category-landuse",
-                "category-building",
-                "category-water-area",
-                "leisure/park",
-                "amenity/hospital",
-                "amenity/place_of_worship",
-                "amenity/cafe",
-                "amenity/restaurant",
-                "area"
-            ],
-            "line": [
-                "category-road",
-                "category-rail",
-                "category-path",
-                "category-water-line",
-                "power/line",
-                "line"
-            ],
-            "point": [
-                "leisure/park",
-                "amenity/hospital",
-                "amenity/place_of_worship",
-                "amenity/cafe",
-                "amenity/restaurant",
-                "amenity/bar",
-                "amenity/bank",
-                "shop/supermarket",
-                "point"
-            ],
-            "vertex": [
-                "highway/crosswalk",
-                "railway/level_crossing",
-                "highway/traffic_signals",
-                "highway/turning_circle",
-                "highway/mini_roundabout",
-                "highway/motorway_junction",
-                "vertex"
-            ],
-            "relation": [
-                "category-route",
-                "category-restriction",
-                "type/boundary",
-                "type/multipolygon",
-                "relation"
-            ]
-        },
-        "categories": {
-            "category-building": {
-                "geometry": "area",
-                "name": "Building",
-                "icon": "building",
-                "members": [
-                    "building/house",
-                    "building/apartments",
-                    "building/commercial",
-                    "building/industrial",
-                    "building/residential",
-                    "building"
-                ]
-            },
-            "category-golf": {
-                "geometry": "area",
-                "name": "Golf",
-                "icon": "golf",
-                "members": [
-                    "golf/fairway",
-                    "golf/green",
-                    "golf/lateral_water_hazard",
-                    "golf/rough",
-                    "golf/bunker",
-                    "golf/tee",
-                    "golf/water_hazard"
-                ]
-            },
-            "category-landuse": {
-                "geometry": "area",
-                "name": "Land Use",
-                "icon": "land-use",
-                "members": [
-                    "landuse/residential",
-                    "landuse/industrial",
-                    "landuse/commercial",
-                    "landuse/retail",
-                    "landuse/farm",
-                    "landuse/farmyard",
-                    "landuse/forest",
-                    "landuse/meadow",
-                    "landuse/cemetery",
-                    "landuse/military"
-                ]
-            },
-            "category-path": {
-                "geometry": "line",
-                "name": "Path",
-                "icon": "category-path",
-                "members": [
-                    "highway/footway",
-                    "highway/cycleway",
-                    "highway/bridleway",
-                    "highway/path",
-                    "highway/steps"
-                ]
-            },
-            "category-rail": {
-                "geometry": "line",
-                "name": "Rail",
-                "icon": "category-rail",
-                "members": [
-                    "railway/rail",
-                    "railway/subway",
-                    "railway/tram",
-                    "railway/monorail",
-                    "railway/disused",
-                    "railway/abandoned"
-                ]
-            },
-            "category-restriction": {
-                "geometry": "relation",
-                "name": "Restriction",
-                "icon": "restriction",
-                "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"
-                ]
-            },
-            "category-road": {
-                "geometry": "line",
-                "name": "Road",
-                "icon": "category-roads",
-                "members": [
-                    "highway/residential",
-                    "highway/motorway",
-                    "highway/trunk",
-                    "highway/primary",
-                    "highway/secondary",
-                    "highway/tertiary",
-                    "highway/service",
-                    "highway/motorway_link",
-                    "highway/trunk_link",
-                    "highway/primary_link",
-                    "highway/secondary_link",
-                    "highway/tertiary_link",
-                    "highway/unclassified",
-                    "highway/track",
-                    "highway/road"
-                ]
-            },
-            "category-route": {
-                "geometry": "relation",
-                "name": "Route",
-                "icon": "route",
-                "members": [
-                    "type/route/road",
-                    "type/route/bicycle",
-                    "type/route/foot",
-                    "type/route/hiking",
-                    "type/route/bus",
-                    "type/route/train",
-                    "type/route/tram",
-                    "type/route/ferry",
-                    "type/route/power",
-                    "type/route/pipeline",
-                    "type/route/detour",
-                    "type/route_master",
-                    "type/route"
-                ]
-            },
-            "category-water-area": {
-                "geometry": "area",
-                "name": "Water",
-                "icon": "water",
-                "members": [
-                    "natural/water/lake",
-                    "natural/water/pond",
-                    "natural/water/reservoir",
-                    "natural/water"
-                ]
-            },
-            "category-water-line": {
-                "geometry": "line",
-                "name": "Water",
-                "icon": "category-water",
-                "members": [
-                    "waterway/river",
-                    "waterway/stream",
-                    "waterway/canal",
-                    "waterway/ditch",
-                    "waterway/drain"
-                ]
-            }
-        },
-        "fields": {
-            "access": {
-                "keys": [
-                    "access",
-                    "foot",
-                    "motor_vehicle",
-                    "bicycle",
-                    "horse"
-                ],
-                "reference": {
-                    "key": "access"
-                },
-                "type": "access",
-                "label": "Access",
-                "placeholder": "Unknown",
-                "strings": {
-                    "types": {
-                        "access": "General",
-                        "foot": "Foot",
-                        "motor_vehicle": "Motor Vehicles",
-                        "bicycle": "Bicycles",
-                        "horse": "Horses"
-                    },
-                    "options": {
-                        "yes": {
-                            "title": "Allowed",
-                            "description": "Access permitted by law; a right of way"
-                        },
-                        "no": {
-                            "title": "Prohibited",
-                            "description": "Access not permitted to the general public"
-                        },
-                        "permissive": {
-                            "title": "Permissive",
-                            "description": "Access permitted until such time as the owner revokes the permission"
-                        },
-                        "private": {
-                            "title": "Private",
-                            "description": "Access permitted only with permission of the owner on an individual basis"
-                        },
-                        "designated": {
-                            "title": "Designated",
-                            "description": "Access permitted according to signs or specific local laws"
-                        },
-                        "destination": {
-                            "title": "Destination",
-                            "description": "Access permitted only to reach a destination"
-                        }
-                    }
-                }
-            },
-            "access_simple": {
-                "key": "access",
-                "type": "combo",
-                "label": "Access",
-                "placeholder": "yes",
-                "options": [
-                    "permissive",
-                    "private",
-                    "customers",
-                    "no"
-                ]
-            },
-            "access_toilets": {
-                "key": "access",
-                "type": "combo",
-                "label": "Access",
-                "options": [
-                    "public",
-                    "permissive",
-                    "private",
-                    "customers"
-                ]
-            },
-            "address": {
-                "type": "address",
-                "keys": [
-                    "addr:housename",
-                    "addr:housenumber",
-                    "addr:street",
-                    "addr:city",
-                    "addr:postcode"
-                ],
-                "reference": {
-                    "key": "addr"
-                },
-                "icon": "address",
-                "universal": true,
-                "label": "Address",
-                "strings": {
-                    "placeholders": {
-                        "housename": "Housename",
-                        "housenumber": "123",
-                        "street": "Street",
-                        "city": "City",
-                        "postcode": "Postcode",
-                        "place": "Place",
-                        "hamlet": "Hamlet",
-                        "suburb": "Suburb",
-                        "subdistrict": "Subdistrict",
-                        "district": "District",
-                        "province": "Province",
-                        "state": "State",
-                        "country": "Country"
-                    }
-                }
-            },
-            "admin_level": {
-                "key": "admin_level",
-                "type": "number",
-                "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",
-                "label": "Capacity (per hour)",
-                "placeholder": "500, 2500, 5000..."
-            },
-            "aerialway/duration": {
-                "key": "aerialway:duration",
-                "type": "number",
-                "label": "Duration (minutes)",
-                "placeholder": "1, 2, 3..."
-            },
-            "aerialway/heating": {
-                "key": "aerialway:heating",
-                "type": "check",
-                "label": "Heated"
-            },
-            "aerialway/occupancy": {
-                "key": "aerialway:occupancy",
-                "type": "number",
-                "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"
-            },
-            "amenity": {
-                "key": "amenity",
-                "type": "typeCombo",
-                "label": "Type"
-            },
-            "artist": {
-                "key": "artist_name",
-                "type": "text",
-                "label": "Artist"
-            },
-            "artwork_type": {
-                "key": "artwork_type",
-                "type": "combo",
-                "label": "Type"
-            },
-            "atm": {
-                "key": "atm",
-                "type": "check",
-                "label": "ATM"
-            },
-            "backrest": {
-                "key": "backrest",
-                "type": "check",
-                "label": "Backrest"
-            },
-            "barrier": {
-                "key": "barrier",
-                "type": "typeCombo",
-                "label": "Type"
-            },
-            "bicycle_parking": {
-                "key": "bicycle_parking",
-                "type": "combo",
-                "label": "Type"
-            },
-            "boundary": {
-                "key": "boundary",
-                "type": "combo",
-                "label": "Type"
-            },
-            "building": {
-                "key": "building",
-                "type": "typeCombo",
-                "label": "Building"
-            },
-            "building_area": {
-                "key": "building",
-                "type": "defaultcheck",
-                "default": "yes",
-                "geometry": "area",
-                "label": "Building"
-            },
-            "capacity": {
-                "key": "capacity",
-                "type": "number",
-                "label": "Capacity",
-                "placeholder": "50, 100, 200..."
-            },
-            "cardinal_direction": {
-                "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"
-                    }
-                }
-            },
-            "clock_direction": {
-                "key": "direction",
-                "type": "combo",
-                "label": "Direction",
-                "strings": {
-                    "options": {
-                        "clockwise": "Clockwise",
-                        "anticlockwise": "Counterclockwise"
-                    }
-                }
-            },
-            "collection_times": {
-                "key": "collection_times",
-                "type": "text",
-                "label": "Collection Times"
-            },
-            "construction": {
-                "key": "construction",
-                "type": "combo",
-                "label": "Type"
-            },
-            "country": {
-                "key": "country",
-                "type": "combo",
-                "label": "Country"
-            },
-            "covered": {
-                "key": "covered",
-                "type": "check",
-                "label": "Covered"
-            },
-            "craft": {
-                "key": "craft",
-                "type": "typeCombo",
-                "label": "Type"
-            },
-            "crop": {
-                "key": "crop",
-                "type": "combo",
-                "label": "Crop"
-            },
-            "crossing": {
-                "key": "crossing",
-                "type": "combo",
-                "label": "Type"
-            },
-            "cuisine": {
-                "key": "cuisine",
-                "type": "combo",
-                "label": "Cuisine"
-            },
-            "denomination": {
-                "key": "denomination",
-                "type": "combo",
-                "label": "Denomination"
-            },
-            "denotation": {
-                "key": "denotation",
-                "type": "combo",
-                "label": "Denotation"
-            },
-            "description": {
-                "key": "description",
-                "type": "textarea",
-                "label": "Description"
-            },
-            "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"
-            },
-            "emergency": {
-                "key": "emergency",
-                "type": "check",
-                "label": "Emergency"
-            },
-            "entrance": {
-                "key": "entrance",
-                "type": "typeCombo",
-                "label": "Type"
-            },
-            "except": {
-                "key": "except",
-                "type": "combo",
-                "label": "Exceptions"
-            },
-            "fax": {
-                "key": "fax",
-                "type": "tel",
-                "label": "Fax",
-                "placeholder": "+31 42 123 4567"
-            },
-            "fee": {
-                "key": "fee",
-                "type": "check",
-                "label": "Fee"
-            },
-            "fire_hydrant/type": {
-                "key": "fire_hydrant:type",
-                "type": "combo",
-                "label": "Type",
-                "strings": {
-                    "options": {
-                        "pillar": "Pillar/Aboveground",
-                        "underground": "Underground",
-                        "wall": "Wall",
-                        "pond": "Pond"
-                    }
-                }
-            },
-            "fixme": {
-                "key": "fixme",
-                "type": "textarea",
-                "label": "Fix Me"
-            },
-            "fuel": {
-                "key": "fuel",
-                "type": "combo",
-                "label": "Fuel"
-            },
-            "fuel/biodiesel": {
-                "key": "fuel:biodiesel",
-                "type": "check",
-                "label": "Sells Biodiesel"
-            },
-            "fuel/diesel": {
-                "key": "fuel:diesel",
-                "type": "check",
-                "label": "Sells Diesel"
-            },
-            "fuel/e10": {
-                "key": "fuel:e10",
-                "type": "check",
-                "label": "Sells E10"
-            },
-            "fuel/e85": {
-                "key": "fuel:e85",
-                "type": "check",
-                "label": "Sells E85"
-            },
-            "fuel/lpg": {
-                "key": "fuel:lpg",
-                "type": "check",
-                "label": "Sells Propane"
-            },
-            "fuel/octane_100": {
-                "key": "fuel:octane_100",
-                "type": "check",
-                "label": "Sells Racing Gasoline"
-            },
-            "fuel/octane_91": {
-                "key": "fuel:octane_91",
-                "type": "check",
-                "label": "Sells Regular Gasoline"
-            },
-            "fuel/octane_95": {
-                "key": "fuel:octane_95",
-                "type": "check",
-                "label": "Sells Midgrade Gasoline"
-            },
-            "fuel/octane_98": {
-                "key": "fuel:octane_98",
-                "type": "check",
-                "label": "Sells Premium Gasoline"
-            },
-            "gauge": {
-                "key": "gauge",
-                "type": "combo",
-                "label": "Gauge"
-            },
-            "generator/method": {
-                "key": "generator:method",
-                "type": "combo",
-                "label": "Method"
-            },
-            "generator/source": {
-                "key": "generator:source",
-                "type": "combo",
-                "label": "Source"
-            },
-            "generator/type": {
-                "key": "generator:type",
-                "type": "combo",
-                "label": "Type"
-            },
-            "golf_hole": {
-                "key": "ref",
-                "type": "text",
-                "label": "Reference",
-                "placeholder": "Hole number (1-18)"
-            },
-            "handicap": {
-                "key": "handicap",
-                "type": "number",
-                "label": "Handicap",
-                "placeholder": "1-18"
-            },
-            "highway": {
-                "key": "highway",
-                "type": "typeCombo",
-                "label": "Type"
-            },
-            "historic": {
-                "key": "historic",
-                "type": "typeCombo",
-                "label": "Type"
-            },
-            "hoops": {
-                "key": "hoops",
-                "type": "number",
-                "label": "Hoops",
-                "placeholder": "1, 2, 4..."
-            },
-            "iata": {
-                "key": "iata",
-                "type": "text",
-                "label": "IATA"
-            },
-            "icao": {
-                "key": "icao",
-                "type": "text",
-                "label": "ICAO"
-            },
-            "incline": {
-                "key": "incline",
-                "type": "combo",
-                "label": "Incline"
-            },
-            "information": {
-                "key": "information",
-                "type": "typeCombo",
-                "label": "Type"
-            },
-            "internet_access": {
-                "key": "internet_access",
-                "type": "combo",
-                "label": "Internet Access",
-                "strings": {
-                    "options": {
-                        "yes": "Yes",
-                        "no": "No",
-                        "wlan": "Wifi",
-                        "wired": "Wired",
-                        "terminal": "Terminal"
-                    }
-                }
-            },
-            "lamp_type": {
-                "key": "lamp_type",
-                "type": "combo",
-                "label": "Type"
-            },
-            "landuse": {
-                "key": "landuse",
-                "type": "typeCombo",
-                "label": "Type"
-            },
-            "lanes": {
-                "key": "lanes",
-                "type": "number",
-                "label": "Lanes",
-                "placeholder": "1, 2, 3..."
-            },
-            "layer": {
-                "key": "layer",
-                "type": "combo",
-                "label": "Layer"
-            },
-            "leisure": {
-                "key": "leisure",
-                "type": "typeCombo",
-                "label": "Type"
-            },
-            "length": {
-                "key": "length",
-                "type": "number",
-                "label": "Length (Meters)"
-            },
-            "levels": {
-                "key": "building:levels",
-                "type": "number",
-                "label": "Levels",
-                "placeholder": "2, 4, 6..."
-            },
-            "lit": {
-                "key": "lit",
-                "type": "check",
-                "label": "Lit"
-            },
-            "location": {
-                "key": "location",
-                "type": "combo",
-                "label": "Location"
-            },
-            "man_made": {
-                "key": "man_made",
-                "type": "typeCombo",
-                "label": "Type"
-            },
-            "maxspeed": {
-                "key": "maxspeed",
-                "type": "maxspeed",
-                "label": "Speed Limit",
-                "placeholder": "40, 50, 60..."
-            },
-            "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",
-                "placeholder": "Common name (if any)"
-            },
-            "natural": {
-                "key": "natural",
-                "type": "typeCombo",
-                "label": "Natural"
-            },
-            "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": {
-                "key": "oneway",
-                "type": "check",
-                "label": "One Way",
-                "strings": {
-                    "options": {
-                        "undefined": "Assumed to be No",
-                        "yes": "Yes",
-                        "no": "No"
-                    }
-                }
-            },
-            "oneway_yes": {
-                "key": "oneway",
-                "type": "check",
-                "label": "One Way",
-                "strings": {
-                    "options": {
-                        "undefined": "Assumed to be Yes",
-                        "yes": "Yes",
-                        "no": "No"
-                    }
-                }
-            },
-            "opening_hours": {
-                "key": "opening_hours",
-                "type": "text",
-                "label": "Hours"
-            },
-            "operator": {
-                "key": "operator",
-                "type": "text",
-                "label": "Operator"
-            },
-            "par": {
-                "key": "par",
-                "type": "number",
-                "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"
-                    }
-                }
-            },
-            "phone": {
-                "key": "phone",
-                "type": "tel",
-                "icon": "telephone",
-                "universal": true,
-                "label": "Phone",
-                "placeholder": "+31 42 123 4567"
-            },
-            "piste/difficulty": {
-                "key": "piste:difficulty",
-                "type": "combo",
-                "label": "Difficulty",
-                "placeholder": "Easy, Intermediate, Advanced...",
-                "strings": {
-                    "options": {
-                        "novice": "Novice (instructional)",
-                        "easy": "Easy (green circle)",
-                        "intermediate": "Intermediate (blue square)",
-                        "advanced": "Advanced (black diamond)",
-                        "expert": "Expert (double black diamond)",
-                        "freeride": "Freeride (off-piste)",
-                        "extreme": "Extreme (climbing equipment required)"
-                    }
-                }
-            },
-            "piste/grooming": {
-                "key": "piste:grooming",
-                "type": "combo",
-                "label": "Grooming",
-                "strings": {
-                    "options": {
-                        "classic": "Classic",
-                        "mogul": "Mogul",
-                        "backcountry": "Backcountry",
-                        "classic+skating": "Classic and Skating",
-                        "scooter": "Scooter/Snowmobile",
-                        "skating": "Skating"
-                    }
-                }
-            },
-            "piste/type": {
-                "key": "piste:type",
-                "type": "typeCombo",
-                "label": "Type",
-                "strings": {
-                    "options": {
-                        "downhill": "Downhill",
-                        "nordic": "Nordic",
-                        "skitour": "Skitour",
-                        "sled": "Sled",
-                        "hike": "Hike",
-                        "sleigh": "Sleigh",
-                        "ice_skate": "Ice Skate",
-                        "snow_park": "Snow Park",
-                        "playground": "Playground"
-                    }
-                }
-            },
-            "place": {
-                "key": "place",
-                "type": "typeCombo",
-                "label": "Type"
-            },
-            "population": {
-                "key": "population",
-                "type": "text",
-                "label": "Population"
-            },
-            "power": {
-                "key": "power",
-                "type": "typeCombo",
-                "label": "Type"
-            },
-            "railway": {
-                "key": "railway",
-                "type": "typeCombo",
-                "label": "Type"
-            },
-            "recycling/cans": {
-                "key": "recycling:cans",
-                "type": "check",
-                "label": "Accepts Cans"
-            },
-            "recycling/clothes": {
-                "key": "recycling:clothes",
-                "type": "check",
-                "label": "Accepts Clothes"
-            },
-            "recycling/glass": {
-                "key": "recycling:glass",
-                "type": "check",
-                "label": "Accepts Glass"
-            },
-            "recycling/paper": {
-                "key": "recycling:paper",
-                "type": "check",
-                "label": "Accepts Paper"
-            },
-            "ref": {
-                "key": "ref",
-                "type": "text",
-                "label": "Reference"
-            },
-            "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": "restrictions",
-                "reference": {
-                    "rtype": "restriction"
-                },
-                "label": "Turn Restrictions"
-            },
-            "route": {
-                "key": "route",
-                "type": "combo",
-                "label": "Type"
-            },
-            "route_master": {
-                "key": "route_master",
-                "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"
-                    }
-                }
-            },
-            "seasonal": {
-                "key": "seasonal",
-                "type": "check",
-                "label": "Seasonal"
-            },
-            "service": {
-                "key": "service",
-                "type": "combo",
-                "label": "Type",
-                "options": [
-                    "parking_aisle",
-                    "driveway",
-                    "alley",
-                    "emergency_access",
-                    "drive-through"
-                ]
-            },
-            "shelter": {
-                "key": "shelter",
-                "type": "check",
-                "label": "Shelter"
-            },
-            "shelter_type": {
-                "key": "shelter_type",
-                "type": "combo",
-                "label": "Type"
-            },
-            "shop": {
-                "key": "shop",
-                "type": "typeCombo",
-                "label": "Type"
-            },
-            "sloped_curb": {
-                "key": "sloped_curb",
-                "type": "combo",
-                "label": "Sloped Curb"
-            },
-            "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",
-                        "impassible": "Impassible / No wheeled vehicle"
-                    }
-                }
-            },
-            "social_facility_for": {
-                "key": "social_facility:for",
-                "type": "radio",
-                "label": "People served",
-                "placeholder": "Homeless, Disabled, Child, etc",
-                "options": [
-                    "abused",
-                    "child",
-                    "disabled",
-                    "diseased",
-                    "drug_addicted",
-                    "homeless",
-                    "juvenile",
-                    "mental_health",
-                    "migrant",
-                    "orphan",
-                    "senior",
-                    "underprivileged",
-                    "unemployed",
-                    "victim"
-                ]
-            },
-            "source": {
-                "key": "source",
-                "type": "text",
-                "icon": "source",
-                "universal": true,
-                "label": "Source"
-            },
-            "sport": {
-                "key": "sport",
-                "type": "combo",
-                "label": "Sport"
-            },
-            "sport_ice": {
-                "key": "sport",
-                "type": "combo",
-                "label": "Sport",
-                "options": [
-                    "skating",
-                    "hockey",
-                    "multi",
-                    "curling",
-                    "ice_stock"
-                ]
-            },
-            "sport_racing": {
-                "key": "sport",
-                "type": "combo",
-                "label": "Sport",
-                "options": [
-                    "cycling",
-                    "dog_racing",
-                    "horse_racing",
-                    "karting",
-                    "motor",
-                    "motocross",
-                    "running"
-                ]
-            },
-            "structure": {
-                "type": "radio",
-                "keys": [
-                    "bridge",
-                    "tunnel",
-                    "embankment",
-                    "cutting",
-                    "ford"
-                ],
-                "label": "Structure",
-                "placeholder": "Unknown",
-                "strings": {
-                    "options": {
-                        "bridge": "Bridge",
-                        "tunnel": "Tunnel",
-                        "embankment": "Embankment",
-                        "cutting": "Cutting",
-                        "ford": "Ford"
-                    }
-                }
-            },
-            "studio_type": {
-                "key": "type",
-                "type": "combo",
-                "label": "Type",
-                "options": [
-                    "audio",
-                    "video"
-                ]
-            },
-            "supervised": {
-                "key": "supervised",
-                "type": "check",
-                "label": "Supervised"
-            },
-            "surface": {
-                "key": "surface",
-                "type": "combo",
-                "label": "Surface"
-            },
-            "tactile_paving": {
-                "key": "tactile_paving",
-                "type": "check",
-                "label": "Tactile Paving"
-            },
-            "toilets/disposal": {
-                "key": "toilets:disposal",
-                "type": "combo",
-                "label": "Disposal",
-                "strings": {
-                    "options": {
-                        "flush": "Flush",
-                        "pitlatrine": "Pit/Latrine",
-                        "chemical": "Chemical",
-                        "bucket": "Bucket"
-                    }
-                }
-            },
-            "tourism": {
-                "key": "tourism",
-                "type": "typeCombo",
-                "label": "Type"
-            },
-            "towertype": {
-                "key": "tower:type",
-                "type": "combo",
-                "label": "Tower 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"
-                    }
-                }
-            },
-            "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"
-                    }
-                }
-            },
-            "tree_type": {
-                "key": "type",
-                "type": "combo",
-                "label": "Type",
-                "options": [
-                    "broad_leaved",
-                    "conifer",
-                    "palm"
-                ]
-            },
-            "trees": {
-                "key": "trees",
-                "type": "combo",
-                "label": "Trees"
-            },
-            "tunnel": {
-                "key": "tunnel",
-                "type": "combo",
-                "label": "Tunnel"
-            },
-            "vending": {
-                "key": "vending",
-                "type": "combo",
-                "label": "Type of Goods"
-            },
-            "water": {
-                "key": "water",
-                "type": "combo",
-                "label": "Type"
-            },
-            "waterway": {
-                "key": "waterway",
-                "type": "typeCombo",
-                "label": "Type"
-            },
-            "website": {
-                "key": "website",
-                "type": "url",
-                "icon": "website",
-                "placeholder": "http://example.com/",
-                "universal": true,
-                "label": "Website"
-            },
-            "wetland": {
-                "key": "wetland",
-                "type": "combo",
-                "label": "Type"
-            },
-            "wheelchair": {
-                "key": "wheelchair",
-                "type": "radio",
-                "options": [
-                    "yes",
-                    "limited",
-                    "no"
-                ],
-                "icon": "wheelchair",
-                "universal": true,
-                "label": "Wheelchair Access"
-            },
-            "width": {
-                "key": "width",
-                "type": "number",
-                "label": "Width (Meters)"
-            },
-            "wikipedia": {
-                "key": "wikipedia",
-                "type": "wikipedia",
-                "icon": "wikipedia",
-                "universal": true,
-                "label": "Wikipedia"
-            },
-            "wood": {
-                "key": "wood",
-                "type": "combo",
-                "label": "Type"
-            }
-        }
-    },
-    "imperial": {
-        "type": "FeatureCollection",
-        "features": [
-            {
-                "type": "Feature",
-                "properties": {
-                    "id": 0
-                },
-                "geometry": {
-                    "type": "MultiPolygon",
-                    "coordinates": [
-                        [
-                            [
-                                [
-                                    -1.426496,
-                                    50.639342
-                                ],
-                                [
-                                    -1.445953,
-                                    50.648139
-                                ],
-                                [
-                                    -1.452789,
-                                    50.654283
-                                ],
-                                [
-                                    -1.485951,
-                                    50.669338
-                                ],
-                                [
-                                    -1.497426,
-                                    50.672309
-                                ],
-                                [
-                                    -1.535146,
-                                    50.669379
-                                ],
-                                [
-                                    -1.551503,
-                                    50.665107
-                                ],
-                                [
-                                    -1.569488,
-                                    50.658026
-                                ],
-                                [
-                                    -1.545318,
-                                    50.686103
-                                ],
-                                [
-                                    -1.50593,
-                                    50.707709
-                                ],
-                                [
-                                    -1.418691,
-                                    50.733791
-                                ],
-                                [
-                                    -1.420888,
-                                    50.730455
-                                ],
-                                [
-                                    -1.423451,
-                                    50.7237
-                                ],
-                                [
-                                    -1.425364,
-                                    50.72012
-                                ],
-                                [
-                                    -1.400868,
-                                    50.721991
-                                ],
-                                [
-                                    -1.377553,
-                                    50.734198
-                                ],
-                                [
-                                    -1.343495,
-                                    50.761054
-                                ],
-                                [
-                                    -1.318512,
-                                    50.772162
-                                ],
-                                [
-                                    -1.295766,
-                                    50.773179
-                                ],
-                                [
-                                    -1.144276,
-                                    50.733791
-                                ],
-                                [
-                                    -1.119537,
-                                    50.734198
-                                ],
-                                [
-                                    -1.10912,
-                                    50.732856
-                                ],
-                                [
-                                    -1.097035,
-                                    50.726955
-                                ],
-                                [
-                                    -1.096425,
-                                    50.724433
-                                ],
-                                [
-                                    -1.097646,
-                                    50.71601
-                                ],
-                                [
-                                    -1.097035,
-                                    50.713324
-                                ],
-                                [
-                                    -1.094228,
-                                    50.712633
-                                ],
-                                [
-                                    -1.085561,
-                                    50.714016
-                                ],
-                                [
-                                    -1.082753,
-                                    50.713324
-                                ],
-                                [
-                                    -1.062327,
-                                    50.692816
-                                ],
-                                [
-                                    -1.062327,
-                                    50.685289
-                                ],
-                                [
-                                    -1.066965,
-                                    50.685248
-                                ],
-                                [
-                                    -1.069651,
-                                    50.683498
-                                ],
-                                [
-                                    -1.071889,
-                                    50.680976
-                                ],
-                                [
-                                    -1.075307,
-                                    50.678534
-                                ],
-                                [
-                                    -1.112701,
-                                    50.671454
-                                ],
-                                [
-                                    -1.128651,
-                                    50.666449
-                                ],
-                                [
-                                    -1.156361,
-                                    50.650784
-                                ],
-                                [
-                                    -1.162221,
-                                    50.645982
-                                ],
-                                [
-                                    -1.164703,
-                                    50.640937
-                                ],
-                                [
-                                    -1.164666,
-                                    50.639543
-                                ],
-                                [
-                                    -1.426496,
-                                    50.639342
-                                ]
-                            ]
-                        ],
-                        [
-                            [
-                                [
-                                    -7.240314,
-                                    55.050389
-                                ],
-                                [
-                                    -7.013736,
-                                    55.1615
-                                ],
-                                [
-                                    -6.958913,
-                                    55.20349
-                                ],
-                                [
-                                    -6.571562,
-                                    55.268366
-                                ],
-                                [
-                                    -6.509633,
-                                    55.31398
-                                ],
-                                [
-                                    -6.226158,
-                                    55.344406
-                                ],
-                                [
-                                    -6.07105,
-                                    55.25001
-                                ],
-                                [
-                                    -5.712696,
-                                    55.017635
-                                ],
-                                [
-                                    -5.242021,
-                                    54.415204
-                                ],
-                                [
-                                    -5.695554,
-                                    54.14284
-                                ],
-                                [
-                                    -5.72473,
-                                    54.07455
-                                ],
-                                [
-                                    -6.041633,
-                                    54.006238
-                                ],
-                                [
-                                    -6.153953,
-                                    54.054931
-                                ],
-                                [
-                                    -6.220539,
-                                    54.098803
-                                ],
-                                [
-                                    -6.242502,
-                                    54.099758
-                                ],
-                                [
-                                    -6.263661,
-                                    54.104682
-                                ],
-                                [
-                                    -6.269887,
-                                    54.097927
-                                ],
-                                [
-                                    -6.28465,
-                                    54.105226
-                                ],
-                                [
-                                    -6.299585,
-                                    54.104037
-                                ],
-                                [
-                                    -6.313796,
-                                    54.099696
-                                ],
-                                [
-                                    -6.327128,
-                                    54.097888
-                                ],
-                                [
-                                    -6.338962,
-                                    54.102952
-                                ],
-                                [
-                                    -6.346662,
-                                    54.109877
-                                ],
-                                [
-                                    -6.354827,
-                                    54.110652
-                                ],
-                                [
-                                    -6.368108,
-                                    54.097319
-                                ],
-                                [
-                                    -6.369348,
-                                    54.091118
-                                ],
-                                [
-                                    -6.367643,
-                                    54.083418
-                                ],
-                                [
-                                    -6.366919,
-                                    54.075098
-                                ],
-                                [
-                                    -6.371157,
-                                    54.066778
-                                ],
-                                [
-                                    -6.377513,
-                                    54.063264
-                                ],
-                                [
-                                    -6.401026,
-                                    54.060887
-                                ],
-                                [
-                                    -6.426761,
-                                    54.05541
-                                ],
-                                [
-                                    -6.433892,
-                                    54.055306
-                                ],
-                                [
-                                    -6.4403,
-                                    54.057993
-                                ],
-                                [
-                                    -6.446243,
-                                    54.062438
-                                ],
-                                [
-                                    -6.450222,
-                                    54.066675
-                                ],
-                                [
-                                    -6.450894,
-                                    54.068432
-                                ],
-                                [
-                                    -6.47854,
-                                    54.067709
-                                ],
-                                [
-                                    -6.564013,
-                                    54.04895
-                                ],
-                                [
-                                    -6.571868,
-                                    54.049519
-                                ],
-                                [
-                                    -6.587164,
-                                    54.053343
-                                ],
-                                [
-                                    -6.595071,
-                                    54.052412
-                                ],
-                                [
-                                    -6.60029,
-                                    54.04895
-                                ],
-                                [
-                                    -6.605217,
-                                    54.044475
-                                ],
-                                [
-                                    -6.610987,
-                                    54.039235
-                                ],
-                                [
-                                    -6.616465,
-                                    54.037271
-                                ],
-                                [
-                                    -6.630624,
-                                    54.041819
-                                ],
-                                [
-                                    -6.657289,
-                                    54.061146
-                                ],
-                                [
-                                    -6.672534,
-                                    54.068432
-                                ],
-                                [
-                                    -6.657082,
-                                    54.091945
-                                ],
-                                [
-                                    -6.655791,
-                                    54.103314
-                                ],
-                                [
-                                    -6.666436,
-                                    54.114786
-                                ],
-                                [
-                                    -6.643957,
-                                    54.131839
-                                ],
-                                [
-                                    -6.634552,
-                                    54.150133
-                                ],
-                                [
-                                    -6.640339,
-                                    54.168013
-                                ],
-                                [
-                                    -6.648448,
-                                    54.173665
-                                ],
-                                [
-                                    -6.663025,
-                                    54.183826
-                                ],
-                                [
-                                    -6.683954,
-                                    54.194368
-                                ],
-                                [
-                                    -6.694651,
-                                    54.197985
-                                ],
-                                [
-                                    -6.706537,
-                                    54.198915
-                                ],
-                                [
-                                    -6.717234,
-                                    54.195143
-                                ],
-                                [
-                                    -6.724779,
-                                    54.188631
-                                ],
-                                [
-                                    -6.73284,
-                                    54.183567
-                                ],
-                                [
-                                    -6.744777,
-                                    54.184187
-                                ],
-                                [
-                                    -6.766481,
-                                    54.192352
-                                ],
-                                [
-                                    -6.787824,
-                                    54.202998
-                                ],
-                                [
-                                    -6.807358,
-                                    54.21633
-                                ],
-                                [
-                                    -6.823946,
-                                    54.23235
-                                ],
-                                [
-                                    -6.829733,
-                                    54.242375
-                                ],
-                                [
-                                    -6.833196,
-                                    54.25209
-                                ],
-                                [
-                                    -6.837743,
-                                    54.260513
-                                ],
-                                [
-                                    -6.846683,
-                                    54.266456
-                                ],
-                                [
-                                    -6.882185,
-                                    54.277257
-                                ],
-                                [
-                                    -6.864667,
-                                    54.282734
-                                ],
-                                [
-                                    -6.856657,
-                                    54.292811
-                                ],
-                                [
-                                    -6.858414,
-                                    54.307332
-                                ],
-                                [
-                                    -6.870015,
-                                    54.326001
-                                ],
-                                [
-                                    -6.879705,
-                                    54.341594
-                                ],
-                                [
-                                    -6.885957,
-                                    54.345624
-                                ],
-                                [
-                                    -6.897895,
-                                    54.346193
-                                ],
-                                [
-                                    -6.905956,
-                                    54.349035
-                                ],
-                                [
-                                    -6.915051,
-                                    54.365933
-                                ],
-                                [
-                                    -6.922028,
-                                    54.372703
-                                ],
-                                [
-                                    -6.984091,
-                                    54.403089
-                                ],
-                                [
-                                    -7.017836,
-                                    54.413166
-                                ],
-                                [
-                                    -7.049255,
-                                    54.411512
-                                ],
-                                [
-                                    -7.078504,
-                                    54.394717
-                                ],
-                                [
-                                    -7.127028,
-                                    54.349759
-                                ],
-                                [
-                                    -7.159894,
-                                    54.335186
-                                ],
-                                [
-                                    -7.168059,
-                                    54.335031
-                                ],
-                                [
-                                    -7.185629,
-                                    54.336943
-                                ],
-                                [
-                                    -7.18947,
-                                    54.335692
-                                ],
-                                [
-                                    -7.19245,
-                                    54.334721
-                                ],
-                                [
-                                    -7.193949,
-                                    54.329967
-                                ],
-                                [
-                                    -7.191468,
-                                    54.323869
-                                ],
-                                [
-                                    -7.187644,
-                                    54.318804
-                                ],
-                                [
-                                    -7.185009,
-                                    54.317254
-                                ],
-                                [
-                                    -7.184647,
-                                    54.316634
-                                ],
-                                [
-                                    -7.192399,
-                                    54.307384
-                                ],
-                                [
-                                    -7.193691,
-                                    54.307539
-                                ],
-                                [
-                                    -7.199168,
-                                    54.303457
-                                ],
-                                [
-                                    -7.206661,
-                                    54.304903
-                                ],
-                                [
-                                    -7.211467,
-                                    54.30418
-                                ],
-                                [
-                                    -7.209038,
-                                    54.293431
-                                ],
-                                [
-                                    -7.1755,
-                                    54.283664
-                                ],
-                                [
-                                    -7.181495,
-                                    54.269763
-                                ],
-                                [
-                                    -7.14589,
-                                    54.25209
-                                ],
-                                [
-                                    -7.159739,
-                                    54.24067
-                                ],
-                                [
-                                    -7.153331,
-                                    54.224237
-                                ],
-                                [
-                                    -7.174725,
-                                    54.216072
-                                ],
-                                [
-                                    -7.229502,
-                                    54.207545
-                                ],
-                                [
-                                    -7.240871,
-                                    54.202326
-                                ],
-                                [
-                                    -7.249088,
-                                    54.197416
-                                ],
-                                [
-                                    -7.255496,
-                                    54.190854
-                                ],
-                                [
-                                    -7.261128,
-                                    54.18088
-                                ],
-                                [
-                                    -7.256322,
-                                    54.176901
-                                ],
-                                [
-                                    -7.247021,
-                                    54.17225
-                                ],
-                                [
-                                    -7.24578,
-                                    54.166979
-                                ],
-                                [
-                                    -7.265366,
-                                    54.16114
-                                ],
-                                [
-                                    -7.26087,
-                                    54.151166
-                                ],
-                                [
-                                    -7.263505,
-                                    54.140986
-                                ],
-                                [
-                                    -7.27074,
-                                    54.132253
-                                ],
-                                [
-                                    -7.280042,
-                                    54.126155
-                                ],
-                                [
-                                    -7.293788,
-                                    54.122021
-                                ],
-                                [
-                                    -7.297353,
-                                    54.125896
-                                ],
-                                [
-                                    -7.29632,
-                                    54.134991
-                                ],
-                                [
-                                    -7.296423,
-                                    54.146515
-                                ],
-                                [
-                                    -7.295028,
-                                    54.155404
-                                ],
-                                [
-                                    -7.292134,
-                                    54.162638
-                                ],
-                                [
-                                    -7.295545,
-                                    54.165119
-                                ],
-                                [
-                                    -7.325982,
-                                    54.154577
-                                ],
-                                [
-                                    -7.333165,
-                                    54.149409
-                                ],
-                                [
-                                    -7.333165,
-                                    54.142743
-                                ],
-                                [
-                                    -7.310324,
-                                    54.114683
-                                ],
-                                [
-                                    -7.316489,
-                                    54.11428
-                                ],
-                                [
-                                    -7.326964,
-                                    54.113597
-                                ],
-                                [
-                                    -7.375488,
-                                    54.123312
-                                ],
-                                [
-                                    -7.390216,
-                                    54.121194
-                                ],
-                                [
-                                    -7.39466,
-                                    54.121917
-                                ],
-                                [
-                                    -7.396624,
-                                    54.126258
-                                ],
-                                [
-                                    -7.403962,
-                                    54.135043
-                                ],
-                                [
-                                    -7.41223,
-                                    54.136438
-                                ],
-                                [
-                                    -7.422255,
-                                    54.135456
-                                ],
-                                [
-                                    -7.425769,
-                                    54.136955
-                                ],
-                                [
-                                    -7.414659,
-                                    54.145688
-                                ],
-                                [
-                                    -7.439619,
-                                    54.146929
-                                ],
-                                [
-                                    -7.480753,
-                                    54.127653
-                                ],
-                                [
-                                    -7.502302,
-                                    54.125121
-                                ],
-                                [
-                                    -7.609014,
-                                    54.139901
-                                ],
-                                [
-                                    -7.620796,
-                                    54.144965
-                                ],
-                                [
-                                    -7.624052,
-                                    54.153336
-                                ],
-                                [
-                                    -7.625706,
-                                    54.162173
-                                ],
-                                [
-                                    -7.632682,
-                                    54.168529
-                                ],
-                                [
-                                    -7.70477,
-                                    54.200362
-                                ],
-                                [
-                                    -7.722599,
-                                    54.202326
-                                ],
-                                [
-                                    -7.782078,
-                                    54.2
-                                ],
-                                [
-                                    -7.836959,
-                                    54.204341
-                                ],
-                                [
-                                    -7.856441,
-                                    54.211421
-                                ],
-                                [
-                                    -7.86967,
-                                    54.226872
-                                ],
-                                [
-                                    -7.873649,
-                                    54.271055
-                                ],
-                                [
-                                    -7.880264,
-                                    54.287023
-                                ],
-                                [
-                                    -7.894966,
-                                    54.293586
-                                ],
-                                [
-                                    -7.93411,
-                                    54.297049
-                                ],
-                                [
-                                    -7.942075,
-                                    54.298873
-                                ],
-                                [
-                                    -7.950802,
-                                    54.300873
-                                ],
-                                [
-                                    -7.96801,
-                                    54.31219
-                                ],
-                                [
-                                    -7.981033,
-                                    54.326556
-                                ],
-                                [
-                                    -8.002194,
-                                    54.357923
-                                ],
-                                [
-                                    -8.03134,
-                                    54.358027
-                                ],
-                                [
-                                    -8.05648,
-                                    54.365882
-                                ],
-                                [
-                                    -8.079941,
-                                    54.380196
-                                ],
-                                [
-                                    -8.122419,
-                                    54.415233
-                                ],
-                                [
-                                    -8.146346,
-                                    54.430736
-                                ],
-                                [
-                                    -8.156035,
-                                    54.439055
-                                ],
-                                [
-                                    -8.158128,
-                                    54.447117
-                                ],
-                                [
-                                    -8.161177,
-                                    54.454817
-                                ],
-                                [
-                                    -8.173837,
-                                    54.461741
-                                ],
-                                [
-                                    -8.168467,
-                                    54.463477
-                                ],
-                                [
-                                    -8.15017,
-                                    54.46939
-                                ],
-                                [
-                                    -8.097046,
-                                    54.478588
-                                ],
-                                [
-                                    -8.072448,
-                                    54.487063
-                                ],
-                                [
-                                    -8.060976,
-                                    54.493316
-                                ],
-                                [
-                                    -8.05586,
-                                    54.497553
-                                ],
-                                [
-                                    -8.043561,
-                                    54.512229
-                                ],
-                                [
-                                    -8.023278,
-                                    54.529696
-                                ],
-                                [
-                                    -8.002194,
-                                    54.543442
-                                ],
-                                [
-                                    -7.926411,
-                                    54.533055
-                                ],
-                                [
-                                    -7.887137,
-                                    54.532125
-                                ],
-                                [
-                                    -7.848844,
-                                    54.54091
-                                ],
-                                [
-                                    -7.749264,
-                                    54.596152
-                                ],
-                                [
-                                    -7.707871,
-                                    54.604162
-                                ],
-                                [
-                                    -7.707944,
-                                    54.604708
-                                ],
-                                [
-                                    -7.707951,
-                                    54.604763
-                                ],
-                                [
-                                    -7.710558,
-                                    54.624264
-                                ],
-                                [
-                                    -7.721204,
-                                    54.625866
-                                ],
-                                [
-                                    -7.736758,
-                                    54.619251
-                                ],
-                                [
-                                    -7.753553,
-                                    54.614497
-                                ],
-                                [
-                                    -7.769159,
-                                    54.618011
-                                ],
-                                [
-                                    -7.801199,
-                                    54.634806
-                                ],
-                                [
-                                    -7.814996,
-                                    54.639457
-                                ],
-                                [
-                                    -7.822541,
-                                    54.638113
-                                ],
-                                [
-                                    -7.838044,
-                                    54.63124
-                                ],
-                                [
-                                    -7.846416,
-                                    54.631447
-                                ],
-                                [
-                                    -7.85427,
-                                    54.636408
-                                ],
-                                [
-                                    -7.864347,
-                                    54.649069
-                                ],
-                                [
-                                    -7.872771,
-                                    54.652221
-                                ],
-                                [
-                                    -7.890082,
-                                    54.655063
-                                ],
-                                [
-                                    -7.906619,
-                                    54.661316
-                                ],
-                                [
-                                    -7.914835,
-                                    54.671651
-                                ],
-                                [
-                                    -7.907135,
-                                    54.686689
-                                ],
-                                [
-                                    -7.913233,
-                                    54.688653
-                                ],
-                                [
-                                    -7.929666,
-                                    54.696714
-                                ],
-                                [
-                                    -7.880109,
-                                    54.711029
-                                ],
-                                [
-                                    -7.845899,
-                                    54.731027
-                                ],
-                                [
-                                    -7.832153,
-                                    54.730614
-                                ],
-                                [
-                                    -7.803576,
-                                    54.716145
-                                ],
-                                [
-                                    -7.770503,
-                                    54.706016
-                                ],
-                                [
-                                    -7.736603,
-                                    54.707463
-                                ],
-                                [
-                                    -7.70229,
-                                    54.718883
-                                ],
-                                [
-                                    -7.667512,
-                                    54.738779
-                                ],
-                                [
-                                    -7.649683,
-                                    54.744877
-                                ],
-                                [
-                                    -7.61537,
-                                    54.739347
-                                ],
-                                [
-                                    -7.585398,
-                                    54.744722
-                                ],
-                                [
-                                    -7.566639,
-                                    54.738675
-                                ],
-                                [
-                                    -7.556149,
-                                    54.738365
-                                ],
-                                [
-                                    -7.543075,
-                                    54.741673
-                                ],
-                                [
-                                    -7.543023,
-                                    54.743791
-                                ],
-                                [
-                                    -7.548398,
-                                    54.747202
-                                ],
-                                [
-                                    -7.551705,
-                                    54.754695
-                                ],
-                                [
-                                    -7.549741,
-                                    54.779603
-                                ],
-                                [
-                                    -7.543385,
-                                    54.793091
-                                ],
-                                [
-                                    -7.470831,
-                                    54.845284
-                                ],
-                                [
-                                    -7.45507,
-                                    54.863009
-                                ],
-                                [
-                                    -7.444735,
-                                    54.884455
-                                ],
-                                [
-                                    -7.444735,
-                                    54.894893
-                                ],
-                                [
-                                    -7.448972,
-                                    54.920318
-                                ],
-                                [
-                                    -7.445251,
-                                    54.932152
-                                ],
-                                [
-                                    -7.436983,
-                                    54.938301
-                                ],
-                                [
-                                    -7.417139,
-                                    54.943056
-                                ],
-                                [
-                                    -7.415755,
-                                    54.944372
-                                ],
-                                [
-                                    -7.408665,
-                                    54.951117
-                                ],
-                                [
-                                    -7.407424,
-                                    54.959437
-                                ],
-                                [
-                                    -7.413109,
-                                    54.984965
-                                ],
-                                [
-                                    -7.409078,
-                                    54.992045
-                                ],
-                                [
-                                    -7.403755,
-                                    54.99313
-                                ],
-                                [
-                                    -7.40112,
-                                    54.994836
-                                ],
-                                [
-                                    -7.405254,
-                                    55.003569
-                                ],
-                                [
-                                    -7.376987,
-                                    55.02889
-                                ],
-                                [
-                                    -7.366962,
-                                    55.035557
-                                ],
-                                [
-                                    -7.355024,
-                                    55.040931
-                                ],
-                                [
-                                    -7.291152,
-                                    55.046615
-                                ],
-                                [
-                                    -7.282987,
-                                    55.051835
-                                ],
-                                [
-                                    -7.275288,
-                                    55.058863
-                                ],
-                                [
-                                    -7.266503,
-                                    55.065167
-                                ],
-                                [
-                                    -7.247097,
-                                    55.069328
-                                ],
-                                [
-                                    -7.2471,
-                                    55.069322
-                                ],
-                                [
-                                    -7.256744,
-                                    55.050686
-                                ],
-                                [
-                                    -7.240956,
-                                    55.050279
-                                ],
-                                [
-                                    -7.240314,
-                                    55.050389
-                                ]
-                            ]
-                        ],
-                        [
-                            [
-                                [
-                                    -13.688588,
-                                    57.596259
-                                ],
-                                [
-                                    -13.690419,
-                                    57.596259
-                                ],
-                                [
-                                    -13.691314,
-                                    57.596503
-                                ],
-                                [
-                                    -13.691314,
-                                    57.597154
-                                ],
-                                [
-                                    -13.690419,
-                                    57.597805
-                                ],
-                                [
-                                    -13.688588,
-                                    57.597805
-                                ],
-                                [
-                                    -13.687652,
-                                    57.597154
-                                ],
-                                [
-                                    -13.687652,
-                                    57.596869
-                                ],
-                                [
-                                    -13.688588,
-                                    57.596259
-                                ]
-                            ]
-                        ],
-                        [
-                            [
-                                [
-                                    -4.839121,
-                                    54.469789
-                                ],
-                                [
-                                    -4.979941,
-                                    54.457977
-                                ],
-                                [
-                                    -5.343644,
-                                    54.878637
-                                ],
-                                [
-                                    -5.308469,
-                                    55.176452
-                                ],
-                                [
-                                    -6.272566,
-                                    55.418443
-                                ],
-                                [
-                                    -8.690528,
-                                    57.833706
-                                ],
-                                [
-                                    -6.344705,
-                                    59.061083
-                                ],
-                                [
-                                    -4.204785,
-                                    58.63305
-                                ],
-                                [
-                                    -2.31566,
-                                    60.699068
-                                ],
-                                [
-                                    -1.695335,
-                                    60.76432
-                                ],
-                                [
-                                    -1.58092,
-                                    60.866001
-                                ],
-                                [
-                                    -0.17022,
-                                    60.897204
-                                ],
-                                [
-                                    -0.800508,
-                                    59.770037
-                                ],
-                                [
-                                    -1.292368,
-                                    57.732574
-                                ],
-                                [
-                                    -1.850077,
-                                    55.766368
-                                ],
-                                [
-                                    -1.73054,
-                                    55.782219
-                                ],
-                                [
-                                    1.892395,
-                                    52.815229
-                                ],
-                                [
-                                    1.742775,
-                                    51.364209
-                                ],
-                                [
-                                    1.080173,
-                                    50.847526
-                                ],
-                                [
-                                    0.000774,
-                                    50.664982
-                                ],
-                                [
-                                    -0.162997,
-                                    50.752401
-                                ],
-                                [
-                                    -0.725152,
-                                    50.731879
-                                ],
-                                [
-                                    -0.768853,
-                                    50.741516
-                                ],
-                                [
-                                    -0.770985,
-                                    50.736884
-                                ],
-                                [
-                                    -0.789947,
-                                    50.730048
-                                ],
-                                [
-                                    -0.812815,
-                                    50.734768
-                                ],
-                                [
-                                    -0.877742,
-                                    50.761156
-                                ],
-                                [
-                                    -0.942879,
-                                    50.758338
-                                ],
-                                [
-                                    -0.992581,
-                                    50.737379
-                                ],
-                                [
-                                    -1.18513,
-                                    50.766989
-                                ],
-                                [
-                                    -1.282741,
-                                    50.792353
-                                ],
-                                [
-                                    -1.375004,
-                                    50.772063
-                                ],
-                                [
-                                    -1.523427,
-                                    50.719605
-                                ],
-                                [
-                                    -1.630649,
-                                    50.695128
-                                ],
-                                [
-                                    -1.663617,
-                                    50.670508
-                                ],
-                                [
-                                    -1.498021,
-                                    50.40831
-                                ],
-                                [
-                                    -4.097427,
-                                    49.735486
-                                ],
-                                [
-                                    -6.825199,
-                                    49.700905
-                                ],
-                                [
-                                    -5.541541,
-                                    51.446591
-                                ],
-                                [
-                                    -6.03361,
-                                    51.732369
-                                ],
-                                [
-                                    -4.791746,
-                                    52.635365
-                                ],
-                                [
-                                    -4.969244,
-                                    52.637413
-                                ],
-                                [
-                                    -5.049473,
-                                    53.131209
-                                ],
-                                [
-                                    -4.787393,
-                                    53.409491
-                                ],
-                                [
-                                    -4.734148,
-                                    53.424866
-                                ],
-                                [
-                                    -4.917096,
-                                    53.508212
-                                ],
-                                [
-                                    -4.839121,
-                                    54.469789
-                                ]
-                            ]
-                        ]
-                    ]
-                }
-            },
-            {
-                "type": "Feature",
-                "properties": {
-                    "id": 0
-                },
-                "geometry": {
-                    "type": "MultiPolygon",
-                    "coordinates": [
-                        [
-                            [
-                                [
-                                    -157.018938,
-                                    19.300864
-                                ],
-                                [
-                                    -179.437336,
-                                    27.295312
-                                ],
-                                [
-                                    -179.480084,
-                                    28.991459
-                                ],
-                                [
-                                    -168.707465,
-                                    26.30325
-                                ],
-                                [
-                                    -163.107414,
-                                    24.60499
-                                ],
-                                [
-                                    -153.841679,
-                                    20.079306
-                                ],
-                                [
-                                    -154.233846,
-                                    19.433391
-                                ],
-                                [
-                                    -153.61725,
-                                    18.900587
-                                ],
-                                [
-                                    -154.429471,
-                                    18.171036
-                                ],
-                                [
-                                    -156.780638,
-                                    18.718492
-                                ],
-                                [
-                                    -157.018938,
-                                    19.300864
-                                ]
-                            ]
-                        ],
-                        [
-                            [
-                                [
-                                    -78.91269,
-                                    43.037032
-                                ],
-                                [
-                                    -78.964351,
-                                    42.976393
-                                ],
-                                [
-                                    -78.981718,
-                                    42.979043
-                                ],
-                                [
-                                    -78.998055,
-                                    42.991111
-                                ],
-                                [
-                                    -79.01189,
-                                    43.004358
-                                ],
-                                [
-                                    -79.022046,
-                                    43.010539
-                                ],
-                                [
-                                    -79.023076,
-                                    43.017015
-                                ],
-                                [
-                                    -79.00983,
-                                    43.050867
-                                ],
-                                [
-                                    -79.011449,
-                                    43.065291
-                                ],
-                                [
-                                    -78.993051,
-                                    43.066174
-                                ],
-                                [
-                                    -78.975536,
-                                    43.069707
-                                ],
-                                [
-                                    -78.958905,
-                                    43.070884
-                                ],
-                                [
-                                    -78.943304,
-                                    43.065291
-                                ],
-                                [
-                                    -78.917399,
-                                    43.058521
-                                ],
-                                [
-                                    -78.908569,
-                                    43.049396
-                                ],
-                                [
-                                    -78.91269,
-                                    43.037032
-                                ]
-                            ]
-                        ],
-                        [
-                            [
-                                [
-                                    -123.03529,
-                                    48.992515
-                                ],
-                                [
-                                    -123.035308,
-                                    48.992499
-                                ],
-                                [
-                                    -123.045277,
-                                    48.984361
-                                ],
-                                [
-                                    -123.08849,
-                                    48.972235
-                                ],
-                                [
-                                    -123.089345,
-                                    48.987982
-                                ],
-                                [
-                                    -123.090484,
-                                    48.992499
-                                ],
-                                [
-                                    -123.090488,
-                                    48.992515
-                                ],
-                                [
-                                    -123.035306,
-                                    48.992515
-                                ],
-                                [
-                                    -123.03529,
-                                    48.992515
-                                ]
-                            ]
-                        ],
-                        [
-                            [
-                                [
-                                    -103.837038,
-                                    29.279906
-                                ],
-                                [
-                                    -103.864121,
-                                    29.281366
-                                ],
-                                [
-                                    -103.928122,
-                                    29.293019
-                                ],
-                                [
-                                    -104.01915,
-                                    29.32033
-                                ],
-                                [
-                                    -104.057313,
-                                    29.339037
-                                ],
-                                [
-                                    -104.105424,
-                                    29.385675
-                                ],
-                                [
-                                    -104.139789,
-                                    29.400584
-                                ],
-                                [
-                                    -104.161648,
-                                    29.416759
-                                ],
-                                [
-                                    -104.194514,
-                                    29.448927
-                                ],
-                                [
-                                    -104.212291,
-                                    29.484661
-                                ],
-                                [
-                                    -104.218698,
-                                    29.489829
-                                ],
-                                [
-                                    -104.227148,
-                                    29.493033
-                                ],
-                                [
-                                    -104.251022,
-                                    29.508588
-                                ],
-                                [
-                                    -104.267171,
-                                    29.526571
-                                ],
-                                [
-                                    -104.292751,
-                                    29.532824
-                                ],
-                                [
-                                    -104.320604,
-                                    29.532255
-                                ],
-                                [
-                                    -104.338484,
-                                    29.524013
-                                ],
-                                [
-                                    -104.349026,
-                                    29.537578
-                                ],
-                                [
-                                    -104.430443,
-                                    29.582795
-                                ],
-                                [
-                                    -104.437832,
-                                    29.58543
-                                ],
-                                [
-                                    -104.444008,
-                                    29.589203
-                                ],
-                                [
-                                    -104.448555,
-                                    29.597678
-                                ],
-                                [
-                                    -104.452069,
-                                    29.607109
-                                ],
-                                [
-                                    -104.455222,
-                                    29.613387
-                                ],
-                                [
-                                    -104.469381,
-                                    29.625402
-                                ],
-                                [
-                                    -104.516639,
-                                    29.654315
-                                ],
-                                [
-                                    -104.530824,
-                                    29.667906
-                                ],
-                                [
-                                    -104.535036,
-                                    29.677802
-                                ],
-                                [
-                                    -104.535191,
-                                    29.687853
-                                ],
-                                [
-                                    -104.537103,
-                                    29.702116
-                                ],
-                                [
-                                    -104.543666,
-                                    29.71643
-                                ],
-                                [
-                                    -104.561391,
-                                    29.745421
-                                ],
-                                [
-                                    -104.570279,
-                                    29.787511
-                                ],
-                                [
-                                    -104.583586,
-                                    29.802575
-                                ],
-                                [
-                                    -104.601207,
-                                    29.81477
-                                ],
-                                [
-                                    -104.619682,
-                                    29.833064
-                                ],
-                                [
-                                    -104.623764,
-                                    29.841487
-                                ],
-                                [
-                                    -104.637588,
-                                    29.887996
-                                ],
-                                [
-                                    -104.656346,
-                                    29.908201
-                                ],
-                                [
-                                    -104.660635,
-                                    29.918433
-                                ],
-                                [
-                                    -104.663478,
-                                    29.923084
-                                ],
-                                [
-                                    -104.676526,
-                                    29.93683
-                                ],
-                                [
-                                    -104.680479,
-                                    29.942308
-                                ],
-                                [
-                                    -104.682469,
-                                    29.952126
-                                ],
-                                [
-                                    -104.680117,
-                                    29.967784
-                                ],
-                                [
-                                    -104.680479,
-                                    29.976466
-                                ],
-                                [
-                                    -104.699108,
-                                    30.03145
-                                ],
-                                [
-                                    -104.701589,
-                                    30.055324
-                                ],
-                                [
-                                    -104.698592,
-                                    30.075271
-                                ],
-                                [
-                                    -104.684639,
-                                    30.111135
-                                ],
-                                [
-                                    -104.680479,
-                                    30.134131
-                                ],
-                                [
-                                    -104.67867,
-                                    30.170356
-                                ],
-                                [
-                                    -104.681564,
-                                    30.192939
-                                ],
-                                [
-                                    -104.695853,
-                                    30.208441
-                                ],
-                                [
-                                    -104.715231,
-                                    30.243995
-                                ],
-                                [
-                                    -104.724585,
-                                    30.252211
-                                ],
-                                [
-                                    -104.742155,
-                                    30.25986
-                                ],
-                                [
-                                    -104.74939,
-                                    30.264459
-                                ],
-                                [
-                                    -104.761689,
-                                    30.284199
-                                ],
-                                [
-                                    -104.774143,
-                                    30.311588
-                                ],
-                                [
-                                    -104.788767,
-                                    30.335927
-                                ],
-                                [
-                                    -104.807732,
-                                    30.346418
-                                ],
-                                [
-                                    -104.8129,
-                                    30.350707
-                                ],
-                                [
-                                    -104.814967,
-                                    30.360577
-                                ],
-                                [
-                                    -104.816001,
-                                    30.371997
-                                ],
-                                [
-                                    -104.818274,
-                                    30.380524
-                                ],
-                                [
-                                    -104.824269,
-                                    30.38719
-                                ],
-                                [
-                                    -104.83755,
-                                    30.394063
-                                ],
-                                [
-                                    -104.844939,
-                                    30.40104
-                                ],
-                                [
-                                    -104.853259,
-                                    30.41215
-                                ],
-                                [
-                                    -104.855016,
-                                    30.417473
-                                ],
-                                [
-                                    -104.853621,
-                                    30.423984
-                                ],
-                                [
-                                    -104.852432,
-                                    30.438867
-                                ],
-                                [
-                                    -104.854655,
-                                    30.448737
-                                ],
-                                [
-                                    -104.864473,
-                                    30.462018
-                                ],
-                                [
-                                    -104.866695,
-                                    30.473025
-                                ],
-                                [
-                                    -104.865248,
-                                    30.479898
-                                ],
-                                [
-                                    -104.859615,
-                                    30.491112
-                                ],
-                                [
-                                    -104.859254,
-                                    30.497261
-                                ],
-                                [
-                                    -104.863026,
-                                    30.502377
-                                ],
-                                [
-                                    -104.879718,
-                                    30.510852
-                                ],
-                                [
-                                    -104.882146,
-                                    30.520929
-                                ],
-                                [
-                                    -104.884007,
-                                    30.541858
-                                ],
-                                [
-                                    -104.886591,
-                                    30.551883
-                                ],
-                                [
-                                    -104.898166,
-                                    30.569401
-                                ],
-                                [
-                                    -104.928242,
-                                    30.599529
-                                ],
-                                [
-                                    -104.93434,
-                                    30.610536
-                                ],
-                                [
-                                    -104.941057,
-                                    30.61405
-                                ],
-                                [
-                                    -104.972735,
-                                    30.618029
-                                ],
-                                [
-                                    -104.98276,
-                                    30.620716
-                                ],
-                                [
-                                    -104.989117,
-                                    30.629553
-                                ],
-                                [
-                                    -104.991649,
-                                    30.640301
-                                ],
-                                [
-                                    -104.992941,
-                                    30.651464
-                                ],
-                                [
-                                    -104.995783,
-                                    30.661747
-                                ],
-                                [
-                                    -105.008495,
-                                    30.676992
-                                ],
-                                [
-                                    -105.027977,
-                                    30.690117
-                                ],
-                                [
-                                    -105.049475,
-                                    30.699264
-                                ],
-                                [
-                                    -105.06813,
-                                    30.702675
-                                ],
-                                [
-                                    -105.087043,
-                                    30.709806
-                                ],
-                                [
-                                    -105.133604,
-                                    30.757917
-                                ],
-                                [
-                                    -105.140425,
-                                    30.750476
-                                ],
-                                [
-                                    -105.153241,
-                                    30.763188
-                                ],
-                                [
-                                    -105.157788,
-                                    30.76572
-                                ],
-                                [
-                                    -105.160889,
-                                    30.764118
-                                ],
-                                [
-                                    -105.162698,
-                                    30.774919
-                                ],
-                                [
-                                    -105.167297,
-                                    30.781171
-                                ],
-                                [
-                                    -105.17479,
-                                    30.783962
-                                ],
-                                [
-                                    -105.185125,
-                                    30.784634
-                                ],
-                                [
-                                    -105.195306,
-                                    30.787941
-                                ],
-                                [
-                                    -105.204917,
-                                    30.80241
-                                ],
-                                [
-                                    -105.2121,
-                                    30.805718
-                                ],
-                                [
-                                    -105.21825,
-                                    30.806803
-                                ],
-                                [
-                                    -105.229257,
-                                    30.810214
-                                ],
-                                [
-                                    -105.232874,
-                                    30.809128
-                                ],
-                                [
-                                    -105.239851,
-                                    30.801532
-                                ],
-                                [
-                                    -105.243985,
-                                    30.799103
-                                ],
-                                [
-                                    -105.249049,
-                                    30.798845
-                                ],
-                                [
-                                    -105.259488,
-                                    30.802979
-                                ],
-                                [
-                                    -105.265844,
-                                    30.808405
-                                ],
-                                [
-                                    -105.270753,
-                                    30.814348
-                                ],
-                                [
-                                    -105.277006,
-                                    30.819412
-                                ],
-                                [
-                                    -105.334315,
-                                    30.843803
-                                ],
-                                [
-                                    -105.363771,
-                                    30.850366
-                                ],
-                                [
-                                    -105.376173,
-                                    30.859565
-                                ],
-                                [
-                                    -105.41555,
-                                    30.902456
-                                ],
-                                [
-                                    -105.496682,
-                                    30.95651
-                                ],
-                                [
-                                    -105.530789,
-                                    30.991701
-                                ],
-                                [
-                                    -105.555955,
-                                    31.002605
-                                ],
-                                [
-                                    -105.565722,
-                                    31.016661
-                                ],
-                                [
-                                    -105.578641,
-                                    31.052163
-                                ],
-                                [
-                                    -105.59094,
-                                    31.071438
-                                ],
-                                [
-                                    -105.605875,
-                                    31.081928
-                                ],
-                                [
-                                    -105.623496,
-                                    31.090351
-                                ],
-                                [
-                                    -105.643805,
-                                    31.103684
-                                ],
-                                [
-                                    -105.668042,
-                                    31.127869
-                                ],
-                                [
-                                    -105.675225,
-                                    31.131951
-                                ],
-                                [
-                                    -105.692278,
-                                    31.137635
-                                ],
-                                [
-                                    -105.76819,
-                                    31.18001
-                                ],
-                                [
-                                    -105.777854,
-                                    31.192722
-                                ],
-                                [
-                                    -105.78483,
-                                    31.211016
-                                ],
-                                [
-                                    -105.861983,
-                                    31.288376
-                                ],
-                                [
-                                    -105.880147,
-                                    31.300881
-                                ],
-                                [
-                                    -105.896994,
-                                    31.305997
-                                ],
-                                [
-                                    -105.897149,
-                                    31.309511
-                                ],
-                                [
-                                    -105.908802,
-                                    31.317004
-                                ],
-                                [
-                                    -105.928052,
-                                    31.326461
-                                ],
-                                [
-                                    -105.934563,
-                                    31.335504
-                                ],
-                                [
-                                    -105.941772,
-                                    31.352351
-                                ],
-                                [
-                                    -105.948515,
-                                    31.361239
-                                ],
-                                [
-                                    -105.961202,
-                                    31.371006
-                                ],
-                                [
-                                    -106.004739,
-                                    31.396948
-                                ],
-                                [
-                                    -106.021147,
-                                    31.402167
-                                ],
-                                [
-                                    -106.046261,
-                                    31.404648
-                                ],
-                                [
-                                    -106.065304,
-                                    31.410952
-                                ],
-                                [
-                                    -106.099385,
-                                    31.428884
-                                ],
-                                [
-                                    -106.141113,
-                                    31.439167
-                                ],
-                                [
-                                    -106.164316,
-                                    31.447797
-                                ],
-                                [
-                                    -106.174471,
-                                    31.460251
-                                ],
-                                [
-                                    -106.209249,
-                                    31.477305
-                                ],
-                                [
-                                    -106.215424,
-                                    31.483919
-                                ],
-                                [
-                                    -106.21744,
-                                    31.488725
-                                ],
-                                [
-                                    -106.218731,
-                                    31.494616
-                                ],
-                                [
-                                    -106.222891,
-                                    31.50459
-                                ],
-                                [
-                                    -106.232658,
-                                    31.519938
-                                ],
-                                [
-                                    -106.274749,
-                                    31.562622
-                                ],
-                                [
-                                    -106.286298,
-                                    31.580141
-                                ],
-                                [
-                                    -106.312292,
-                                    31.648612
-                                ],
-                                [
-                                    -106.331309,
-                                    31.68215
-                                ],
-                                [
-                                    -106.35849,
-                                    31.717548
-                                ],
-                                [
-                                    -106.39177,
-                                    31.745919
-                                ],
-                                [
-                                    -106.428951,
-                                    31.758476
-                                ],
-                                [
-                                    -106.473135,
-                                    31.755065
-                                ],
-                                [
-                                    -106.492797,
-                                    31.759044
-                                ],
-                                [
-                                    -106.501425,
-                                    31.766344
-                                ],
-                                [
-                                    -106.506052,
-                                    31.770258
-                                ],
-                                [
-                                    -106.517189,
-                                    31.773824
-                                ],
-                                [
-                                    -106.558969,
-                                    31.773876
-                                ],
-                                [
-                                    -106.584859,
-                                    31.773927
-                                ],
-                                [
-                                    -106.610697,
-                                    31.773979
-                                ],
-                                [
-                                    -106.636587,
-                                    31.774082
-                                ],
-                                [
-                                    -106.662477,
-                                    31.774134
-                                ],
-                                [
-                                    -106.688315,
-                                    31.774237
-                                ],
-                                [
-                                    -106.714205,
-                                    31.774237
-                                ],
-                                [
-                                    -106.740095,
-                                    31.774289
-                                ],
-                                [
-                                    -106.765933,
-                                    31.774392
-                                ],
-                                [
-                                    -106.791823,
-                                    31.774444
-                                ],
-                                [
-                                    -106.817713,
-                                    31.774496
-                                ],
-                                [
-                                    -106.843603,
-                                    31.774547
-                                ],
-                                [
-                                    -106.869441,
-                                    31.774599
-                                ],
-                                [
-                                    -106.895331,
-                                    31.774702
-                                ],
-                                [
-                                    -106.921221,
-                                    31.774702
-                                ],
-                                [
-                                    -106.947111,
-                                    31.774754
-                                ],
-                                [
-                                    -106.973001,
-                                    31.774857
-                                ],
-                                [
-                                    -106.998891,
-                                    31.774909
-                                ],
-                                [
-                                    -107.02478,
-                                    31.774961
-                                ],
-                                [
-                                    -107.05067,
-                                    31.775013
-                                ],
-                                [
-                                    -107.076509,
-                                    31.775064
-                                ],
-                                [
-                                    -107.102398,
-                                    31.775168
-                                ],
-                                [
-                                    -107.128288,
-                                    31.775168
-                                ],
-                                [
-                                    -107.154127,
-                                    31.775219
-                                ],
-                                [
-                                    -107.180016,
-                                    31.775374
-                                ],
-                                [
-                                    -107.205906,
-                                    31.775374
-                                ],
-                                [
-                                    -107.231796,
-                                    31.775426
-                                ],
-                                [
-                                    -107.257634,
-                                    31.775478
-                                ],
-                                [
-                                    -107.283524,
-                                    31.775529
-                                ],
-                                [
-                                    -107.309414,
-                                    31.775633
-                                ],
-                                [
-                                    -107.335252,
-                                    31.775684
-                                ],
-                                [
-                                    -107.361142,
-                                    31.775788
-                                ],
-                                [
-                                    -107.387032,
-                                    31.775788
-                                ],
-                                [
-                                    -107.412896,
-                                    31.775839
-                                ],
-                                [
-                                    -107.438786,
-                                    31.775943
-                                ],
-                                [
-                                    -107.464676,
-                                    31.775994
-                                ],
-                                [
-                                    -107.490566,
-                                    31.776098
-                                ],
-                                [
-                                    -107.516404,
-                                    31.776149
-                                ],
-                                [
-                                    -107.542294,
-                                    31.776201
-                                ],
-                                [
-                                    -107.568184,
-                                    31.776253
-                                ],
-                                [
-                                    -107.594074,
-                                    31.776304
-                                ],
-                                [
-                                    -107.619964,
-                                    31.776408
-                                ],
-                                [
-                                    -107.645854,
-                                    31.776459
-                                ],
-                                [
-                                    -107.671744,
-                                    31.776459
-                                ],
-                                [
-                                    -107.697633,
-                                    31.776563
-                                ],
-                                [
-                                    -107.723472,
-                                    31.776614
-                                ],
-                                [
-                                    -107.749362,
-                                    31.776666
-                                ],
-                                [
-                                    -107.775251,
-                                    31.776718
-                                ],
-                                [
-                                    -107.801141,
-                                    31.77677
-                                ],
-                                [
-                                    -107.82698,
-                                    31.776873
-                                ],
-                                [
-                                    -107.852869,
-                                    31.776925
-                                ],
-                                [
-                                    -107.878759,
-                                    31.776925
-                                ],
-                                [
-                                    -107.904598,
-                                    31.777028
-                                ],
-                                [
-                                    -107.930487,
-                                    31.77708
-                                ],
-                                [
-                                    -107.956377,
-                                    31.777131
-                                ],
-                                [
-                                    -107.982216,
-                                    31.777183
-                                ],
-                                [
-                                    -108.008105,
-                                    31.777235
-                                ],
-                                [
-                                    -108.033995,
-                                    31.777338
-                                ],
-                                [
-                                    -108.059885,
-                                    31.77739
-                                ],
-                                [
-                                    -108.085723,
-                                    31.77739
-                                ],
-                                [
-                                    -108.111613,
-                                    31.777545
-                                ],
-                                [
-                                    -108.137503,
-                                    31.777545
-                                ],
-                                [
-                                    -108.163341,
-                                    31.777648
-                                ],
-                                [
-                                    -108.189283,
-                                    31.7777
-                                ],
-                                [
-                                    -108.215121,
-                                    31.777751
-                                ],
-                                [
-                                    -108.215121,
-                                    31.770723
-                                ],
-                                [
-                                    -108.215121,
-                                    31.763695
-                                ],
-                                [
-                                    -108.215121,
-                                    31.756667
-                                ],
-                                [
-                                    -108.215121,
-                                    31.749639
-                                ],
-                                [
-                                    -108.215121,
-                                    31.74256
-                                ],
-                                [
-                                    -108.215121,
-                                    31.735583
-                                ],
-                                [
-                                    -108.215121,
-                                    31.728555
-                                ],
-                                [
-                                    -108.215121,
-                                    31.721476
-                                ],
-                                [
-                                    -108.215121,
-                                    31.714396
-                                ],
-                                [
-                                    -108.215121,
-                                    31.70742
-                                ],
-                                [
-                                    -108.215121,
-                                    31.700392
-                                ],
-                                [
-                                    -108.215121,
-                                    31.693312
-                                ],
-                                [
-                                    -108.215121,
-                                    31.686284
-                                ],
-                                [
-                                    -108.215121,
-                                    31.679256
-                                ],
-                                [
-                                    -108.215121,
-                                    31.672176
-                                ],
-                                [
-                                    -108.21507,
-                                    31.665148
-                                ],
-                                [
-                                    -108.215018,
-                                    31.658172
-                                ],
-                                [
-                                    -108.215018,
-                                    31.651092
-                                ],
-                                [
-                                    -108.215018,
-                                    31.644064
-                                ],
-                                [
-                                    -108.215018,
-                                    31.637036
-                                ],
-                                [
-                                    -108.215018,
-                                    31.630008
-                                ],
-                                [
-                                    -108.215018,
-                                    31.62298
-                                ],
-                                [
-                                    -108.215018,
-                                    31.615952
-                                ],
-                                [
-                                    -108.215018,
-                                    31.608873
-                                ],
-                                [
-                                    -108.215018,
-                                    31.601845
-                                ],
-                                [
-                                    -108.215018,
-                                    31.594817
-                                ],
-                                [
-                                    -108.215018,
-                                    31.587789
-                                ],
-                                [
-                                    -108.215018,
-                                    31.580761
-                                ],
-                                [
-                                    -108.215018,
-                                    31.573733
-                                ],
-                                [
-                                    -108.215018,
-                                    31.566653
-                                ],
-                                [
-                                    -108.215018,
-                                    31.559625
-                                ],
-                                [
-                                    -108.214966,
-                                    31.552597
-                                ],
-                                [
-                                    -108.214966,
-                                    31.545569
-                                ],
-                                [
-                                    -108.214966,
-                                    31.538489
-                                ],
-                                [
-                                    -108.214966,
-                                    31.531461
-                                ],
-                                [
-                                    -108.214966,
-                                    31.524485
-                                ],
-                                [
-                                    -108.214966,
-                                    31.517405
-                                ],
-                                [
-                                    -108.214966,
-                                    31.510378
-                                ],
-                                [
-                                    -108.214966,
-                                    31.503401
-                                ],
-                                [
-                                    -108.214966,
-                                    31.496322
-                                ],
-                                [
-                                    -108.214966,
-                                    31.489242
-                                ],
-                                [
-                                    -108.214966,
-                                    31.482214
-                                ],
-                                [
-                                    -108.214966,
-                                    31.475238
-                                ],
-                                [
-                                    -108.214966,
-                                    31.468158
-                                ],
-                                [
-                                    -108.214966,
-                                    31.46113
-                                ],
-                                [
-                                    -108.214966,
-                                    31.454102
-                                ],
-                                [
-                                    -108.214966,
-                                    31.447074
-                                ],
-                                [
-                                    -108.214915,
-                                    31.440046
-                                ],
-                                [
-                                    -108.214863,
-                                    31.432966
-                                ],
-                                [
-                                    -108.214863,
-                                    31.425938
-                                ],
-                                [
-                                    -108.214863,
-                                    31.41891
-                                ],
-                                [
-                                    -108.214863,
-                                    31.411882
-                                ],
-                                [
-                                    -108.214863,
-                                    31.404803
-                                ],
-                                [
-                                    -108.214863,
-                                    31.397826
-                                ],
-                                [
-                                    -108.214863,
-                                    31.390798
-                                ],
-                                [
-                                    -108.214863,
-                                    31.383719
-                                ],
-                                [
-                                    -108.214863,
-                                    31.376639
-                                ],
-                                [
-                                    -108.214863,
-                                    31.369663
-                                ],
-                                [
-                                    -108.214863,
-                                    31.362635
-                                ],
-                                [
-                                    -108.214863,
-                                    31.355555
-                                ],
-                                [
-                                    -108.214863,
-                                    31.348527
-                                ],
-                                [
-                                    -108.214863,
-                                    31.341551
-                                ],
-                                [
-                                    -108.214863,
-                                    31.334471
-                                ],
-                                [
-                                    -108.214811,
-                                    31.327443
-                                ],
-                                [
-                                    -108.257573,
-                                    31.327391
-                                ],
-                                [
-                                    -108.300336,
-                                    31.327391
-                                ],
-                                [
-                                    -108.34302,
-                                    31.327391
-                                ],
-                                [
-                                    -108.385731,
-                                    31.327391
-                                ],
-                                [
-                                    -108.428442,
-                                    31.327391
-                                ],
-                                [
-                                    -108.471152,
-                                    31.327391
-                                ],
-                                [
-                                    -108.513837,
-                                    31.327391
-                                ],
-                                [
-                                    -108.556547,
-                                    31.327391
-                                ],
-                                [
-                                    -108.59931,
-                                    31.327391
-                                ],
-                                [
-                                    -108.64202,
-                                    31.327391
-                                ],
-                                [
-                                    -108.684757,
-                                    31.327391
-                                ],
-                                [
-                                    -108.727467,
-                                    31.327391
-                                ],
-                                [
-                                    -108.770178,
-                                    31.327391
-                                ],
-                                [
-                                    -108.812914,
-                                    31.327391
-                                ],
-                                [
-                                    -108.855625,
-                                    31.327391
-                                ],
-                                [
-                                    -108.898335,
-                                    31.327391
-                                ],
-                                [
-                                    -108.941046,
-                                    31.327391
-                                ],
-                                [
-                                    -108.968282,
-                                    31.327391
-                                ],
-                                [
-                                    -108.983731,
-                                    31.327391
-                                ],
-                                [
-                                    -109.026493,
-                                    31.327391
-                                ],
-                                [
-                                    -109.04743,
-                                    31.327391
-                                ],
-                                [
-                                    -109.069203,
-                                    31.327391
-                                ],
-                                [
-                                    -109.111914,
-                                    31.327391
-                                ],
-                                [
-                                    -109.154599,
-                                    31.327391
-                                ],
-                                [
-                                    -109.197361,
-                                    31.327391
-                                ],
-                                [
-                                    -109.240072,
-                                    31.32734
-                                ],
-                                [
-                                    -109.282782,
-                                    31.32734
-                                ],
-                                [
-                                    -109.325519,
-                                    31.32734
-                                ],
-                                [
-                                    -109.368229,
-                                    31.32734
-                                ],
-                                [
-                                    -109.410914,
-                                    31.32734
-                                ],
-                                [
-                                    -109.45365,
-                                    31.32734
-                                ],
-                                [
-                                    -109.496387,
-                                    31.32734
-                                ],
-                                [
-                                    -109.539071,
-                                    31.32734
-                                ],
-                                [
-                                    -109.581808,
-                                    31.32734
-                                ],
-                                [
-                                    -109.624493,
-                                    31.32734
-                                ],
-                                [
-                                    -109.667177,
-                                    31.32734
-                                ],
-                                [
-                                    -109.709965,
-                                    31.32734
-                                ],
-                                [
-                                    -109.75265,
-                                    31.32734
-                                ],
-                                [
-                                    -109.795335,
-                                    31.32734
-                                ],
-                                [
-                                    -109.838123,
-                                    31.32734
-                                ],
-                                [
-                                    -109.880808,
-                                    31.32734
-                                ],
-                                [
-                                    -109.923596,
-                                    31.327288
-                                ],
-                                [
-                                    -109.96628,
-                                    31.327236
-                                ],
-                                [
-                                    -110.008965,
-                                    31.327236
-                                ],
-                                [
-                                    -110.051702,
-                                    31.327236
-                                ],
-                                [
-                                    -110.094386,
-                                    31.327236
-                                ],
-                                [
-                                    -110.137071,
-                                    31.327236
-                                ],
-                                [
-                                    -110.179807,
-                                    31.327236
-                                ],
-                                [
-                                    -110.222544,
-                                    31.327236
-                                ],
-                                [
-                                    -110.265229,
-                                    31.327236
-                                ],
-                                [
-                                    -110.308017,
-                                    31.327236
-                                ],
-                                [
-                                    -110.350753,
-                                    31.327236
-                                ],
-                                [
-                                    -110.39349,
-                                    31.327236
-                                ],
-                                [
-                                    -110.436174,
-                                    31.327236
-                                ],
-                                [
-                                    -110.478859,
-                                    31.327236
-                                ],
-                                [
-                                    -110.521595,
-                                    31.327236
-                                ],
-                                [
-                                    -110.56428,
-                                    31.327236
-                                ],
-                                [
-                                    -110.606965,
-                                    31.327236
-                                ],
-                                [
-                                    -110.649727,
-                                    31.327236
-                                ],
-                                [
-                                    -110.692438,
-                                    31.327236
-                                ],
-                                [
-                                    -110.7352,
-                                    31.327236
-                                ],
-                                [
-                                    -110.777885,
-                                    31.327236
-                                ],
-                                [
-                                    -110.820595,
-                                    31.327236
-                                ],
-                                [
-                                    -110.863358,
-                                    31.327236
-                                ],
-                                [
-                                    -110.906068,
-                                    31.327236
-                                ],
-                                [
-                                    -110.948753,
-                                    31.327185
-                                ],
-                                [
-                                    -111.006269,
-                                    31.327185
-                                ],
-                                [
-                                    -111.067118,
-                                    31.333644
-                                ],
-                                [
-                                    -111.094455,
-                                    31.342532
-                                ],
-                                [
-                                    -111.145924,
-                                    31.359069
-                                ],
-                                [
-                                    -111.197446,
-                                    31.375554
-                                ],
-                                [
-                                    -111.248864,
-                                    31.392142
-                                ],
-                                [
-                                    -111.300333,
-                                    31.40873
-                                ],
-                                [
-                                    -111.351803,
-                                    31.425318
-                                ],
-                                [
-                                    -111.403299,
-                                    31.441855
-                                ],
-                                [
-                                    -111.454768,
-                                    31.458339
-                                ],
-                                [
-                                    -111.506238,
-                                    31.474979
-                                ],
-                                [
-                                    -111.915464,
-                                    31.601431
-                                ],
-                                [
-                                    -112.324715,
-                                    31.727987
-                                ],
-                                [
-                                    -112.733967,
-                                    31.854543
-                                ],
-                                [
-                                    -113.143218,
-                                    31.981046
-                                ],
-                                [
-                                    -113.552444,
-                                    32.107602
-                                ],
-                                [
-                                    -113.961696,
-                                    32.234132
-                                ],
-                                [
-                                    -114.370921,
-                                    32.360687
-                                ],
-                                [
-                                    -114.780147,
-                                    32.487243
-                                ],
-                                [
-                                    -114.816785,
-                                    32.498534
-                                ],
-                                [
-                                    -114.819373,
-                                    32.499363
-                                ],
-                                [
-                                    -114.822108,
-                                    32.50024
-                                ],
-                                [
-                                    -114.809447,
-                                    32.511324
-                                ],
-                                [
-                                    -114.795546,
-                                    32.552226
-                                ],
-                                [
-                                    -114.794203,
-                                    32.574111
-                                ],
-                                [
-                                    -114.802678,
-                                    32.594497
-                                ],
-                                [
-                                    -114.786813,
-                                    32.621033
-                                ],
-                                [
-                                    -114.781542,
-                                    32.628061
-                                ],
-                                [
-                                    -114.758804,
-                                    32.64483
-                                ],
-                                [
-                                    -114.751156,
-                                    32.65222
-                                ],
-                                [
-                                    -114.739477,
-                                    32.669066
-                                ],
-                                [
-                                    -114.731209,
-                                    32.686636
-                                ],
-                                [
-                                    -114.723871,
-                                    32.711519
-                                ],
-                                [
-                                    -114.724284,
-                                    32.712835
-                                ],
-                                [
-                                    -114.724285,
-                                    32.712836
-                                ],
-                                [
-                                    -114.764541,
-                                    32.709839
-                                ],
-                                [
-                                    -114.838076,
-                                    32.704206
-                                ],
-                                [
-                                    -114.911612,
-                                    32.698703
-                                ],
-                                [
-                                    -114.985199,
-                                    32.693122
-                                ],
-                                [
-                                    -115.058734,
-                                    32.687567
-                                ],
-                                [
-                                    -115.13227,
-                                    32.681986
-                                ],
-                                [
-                                    -115.205806,
-                                    32.676456
-                                ],
-                                [
-                                    -115.27929,
-                                    32.670823
-                                ],
-                                [
-                                    -115.352851,
-                                    32.665346
-                                ],
-                                [
-                                    -115.426386,
-                                    32.659765
-                                ],
-                                [
-                                    -115.499922,
-                                    32.654209
-                                ],
-                                [
-                                    -115.573535,
-                                    32.648654
-                                ],
-                                [
-                                    -115.647019,
-                                    32.643073
-                                ],
-                                [
-                                    -115.720529,
-                                    32.637518
-                                ],
-                                [
-                                    -115.794064,
-                                    32.631963
-                                ],
-                                [
-                                    -115.8676,
-                                    32.626408
-                                ],
-                                [
-                                    -115.941213,
-                                    32.620827
-                                ],
-                                [
-                                    -116.014748,
-                                    32.615271
-                                ],
-                                [
-                                    -116.088232,
-                                    32.609664
-                                ],
-                                [
-                                    -116.161742,
-                                    32.604161
-                                ],
-                                [
-                                    -116.235329,
-                                    32.598554
-                                ],
-                                [
-                                    -116.308891,
-                                    32.593025
-                                ],
-                                [
-                                    -116.382426,
-                                    32.587469
-                                ],
-                                [
-                                    -116.455962,
-                                    32.581888
-                                ],
-                                [
-                                    -116.529472,
-                                    32.576333
-                                ],
-                                [
-                                    -116.603007,
-                                    32.570804
-                                ],
-                                [
-                                    -116.676543,
-                                    32.565223
-                                ],
-                                [
-                                    -116.750104,
-                                    32.559667
-                                ],
-                                [
-                                    -116.82364,
-                                    32.554086
-                                ],
-                                [
-                                    -116.897201,
-                                    32.548531
-                                ],
-                                [
-                                    -116.970737,
-                                    32.542976
-                                ],
-                                [
-                                    -117.044221,
-                                    32.537421
-                                ],
-                                [
-                                    -117.125121,
-                                    32.531669
-                                ],
-                                [
-                                    -117.125969,
-                                    32.538258
-                                ],
-                                [
-                                    -117.239623,
-                                    32.531308
-                                ],
-                                [
-                                    -120.274098,
-                                    32.884264
-                                ],
-                                [
-                                    -121.652736,
-                                    34.467248
-                                ],
-                                [
-                                    -124.367265,
-                                    37.662798
-                                ],
-                                [
-                                    -126.739806,
-                                    41.37928
-                                ],
-                                [
-                                    -126.996297,
-                                    45.773888
-                                ],
-                                [
-                                    -124.770704,
-                                    48.44258
-                                ],
-                                [
-                                    -123.734053,
-                                    48.241906
-                                ],
-                                [
-                                    -123.1663,
-                                    48.27837
-                                ],
-                                [
-                                    -123.193018,
-                                    48.501035
-                                ],
-                                [
-                                    -123.176987,
-                                    48.65482
-                                ],
-                                [
-                                    -122.912481,
-                                    48.753561
-                                ],
-                                [
-                                    -122.899122,
-                                    48.897797
-                                ],
-                                [
-                                    -122.837671,
-                                    48.97502
-                                ],
-                                [
-                                    -122.743986,
-                                    48.980582
-                                ],
-                                [
-                                    -122.753,
-                                    48.992499
-                                ],
-                                [
-                                    -122.753012,
-                                    48.992515
-                                ],
-                                [
-                                    -122.653258,
-                                    48.992515
-                                ],
-                                [
-                                    -122.433375,
-                                    48.992515
-                                ],
-                                [
-                                    -122.213517,
-                                    48.992515
-                                ],
-                                [
-                                    -121.993763,
-                                    48.992515
-                                ],
-                                [
-                                    -121.773958,
-                                    48.992515
-                                ],
-                                [
-                                    -121.554152,
-                                    48.992515
-                                ],
-                                [
-                                    -121.33432,
-                                    48.992515
-                                ],
-                                [
-                                    -121.114515,
-                                    48.992515
-                                ],
-                                [
-                                    -95.396937,
-                                    48.99267
-                                ],
-                                [
-                                    -95.177106,
-                                    48.99267
-                                ],
-                                [
-                                    -95.168527,
-                                    48.995047
-                                ],
-                                [
-                                    -95.161887,
-                                    49.001145
-                                ],
-                                [
-                                    -95.159329,
-                                    49.01179
-                                ],
-                                [
-                                    -95.159665,
-                                    49.10951
-                                ],
-                                [
-                                    -95.160027,
-                                    49.223353
-                                ],
-                                [
-                                    -95.160337,
-                                    49.313012
-                                ],
-                                [
-                                    -95.160569,
-                                    49.369494
-                                ],
-                                [
-                                    -95.102821,
-                                    49.35394
-                                ],
-                                [
-                                    -94.982518,
-                                    49.356162
-                                ],
-                                [
-                                    -94.926087,
-                                    49.345568
-                                ],
-                                [
-                                    -94.856195,
-                                    49.318283
-                                ],
-                                [
-                                    -94.839142,
-                                    49.308878
-                                ],
-                                [
-                                    -94.827256,
-                                    49.292858
-                                ],
-                                [
-                                    -94.819892,
-                                    49.252034
-                                ],
-                                [
-                                    -94.810358,
-                                    49.229606
-                                ],
-                                [
-                                    -94.806121,
-                                    49.210899
-                                ],
-                                [
-                                    -94.811185,
-                                    49.166561
-                                ],
-                                [
-                                    -94.803743,
-                                    49.146407
-                                ],
-                                [
-                                    -94.792039,
-                                    49.12646
-                                ],
-                                [
-                                    -94.753772,
-                                    49.026156
-                                ],
-                                [
-                                    -94.711217,
-                                    48.914586
-                                ],
-                                [
-                                    -94.711734,
-                                    48.862755
-                                ],
-                                [
-                                    -94.712147,
-                                    48.842446
-                                ],
-                                [
-                                    -94.713284,
-                                    48.823843
-                                ],
-                                [
-                                    -94.710907,
-                                    48.807513
-                                ],
-                                [
-                                    -94.701786,
-                                    48.790098
-                                ],
-                                [
-                                    -94.688893,
-                                    48.778832
-                                ],
-                                [
-                                    -94.592852,
-                                    48.726433
-                                ],
-                                [
-                                    -94.519161,
-                                    48.70447
-                                ],
-                                [
-                                    -94.4795,
-                                    48.700698
-                                ],
-                                [
-                                    -94.311577,
-                                    48.713927
-                                ],
-                                [
-                                    -94.292586,
-                                    48.711912
-                                ],
-                                [
-                                    -94.284034,
-                                    48.709069
-                                ],
-                                [
-                                    -94.274499,
-                                    48.704108
-                                ],
-                                [
-                                    -94.265482,
-                                    48.697752
-                                ],
-                                [
-                                    -94.258454,
-                                    48.690828
-                                ],
-                                [
-                                    -94.255767,
-                                    48.683541
-                                ],
-                                [
-                                    -94.252459,
-                                    48.662405
-                                ],
-                                [
-                                    -94.251038,
-                                    48.65729
-                                ],
-                                [
-                                    -94.23215,
-                                    48.652019
-                                ],
-                                [
-                                    -94.03485,
-                                    48.643311
-                                ],
-                                [
-                                    -93.874885,
-                                    48.636206
-                                ],
-                                [
-                                    -93.835741,
-                                    48.617137
-                                ],
-                                [
-                                    -93.809386,
-                                    48.543576
-                                ],
-                                [
-                                    -93.778664,
-                                    48.519468
-                                ],
-                                [
-                                    -93.756779,
-                                    48.516549
-                                ],
-                                [
-                                    -93.616297,
-                                    48.531302
-                                ],
-                                [
-                                    -93.599889,
-                                    48.526341
-                                ],
-                                [
-                                    -93.566584,
-                                    48.538279
-                                ],
-                                [
-                                    -93.491756,
-                                    48.542309
-                                ],
-                                [
-                                    -93.459924,
-                                    48.557399
-                                ],
-                                [
-                                    -93.45225,
-                                    48.572721
-                                ],
-                                [
-                                    -93.453774,
-                                    48.586958
-                                ],
-                                [
-                                    -93.451475,
-                                    48.597422
-                                ],
-                                [
-                                    -93.417316,
-                                    48.604114
-                                ],
-                                [
-                                    -93.385716,
-                                    48.614863
-                                ],
-                                [
-                                    -93.25774,
-                                    48.630314
-                                ],
-                                [
-                                    -93.131701,
-                                    48.62463
-                                ],
-                                [
-                                    -92.97972,
-                                    48.61768
-                                ],
-                                [
-                                    -92.955588,
-                                    48.612228
-                                ],
-                                [
-                                    -92.884197,
-                                    48.579878
-                                ],
-                                [
-                                    -92.72555,
-                                    48.548692
-                                ],
-                                [
-                                    -92.648604,
-                                    48.536263
-                                ],
-                                [
-                                    -92.630181,
-                                    48.519468
-                                ],
-                                [
-                                    -92.627468,
-                                    48.502777
-                                ],
-                                [
-                                    -92.646743,
-                                    48.497428
-                                ],
-                                [
-                                    -92.691366,
-                                    48.489858
-                                ],
-                                [
-                                    -92.710641,
-                                    48.482882
-                                ],
-                                [
-                                    -92.718909,
-                                    48.459782
-                                ],
-                                [
-                                    -92.704052,
-                                    48.445158
-                                ],
-                                [
-                                    -92.677129,
-                                    48.441747
-                                ],
-                                [
-                                    -92.657053,
-                                    48.438233
-                                ],
-                                [
-                                    -92.570521,
-                                    48.446656
-                                ],
-                                [
-                                    -92.526932,
-                                    48.445623
-                                ],
-                                [
-                                    -92.490629,
-                                    48.433117
-                                ],
-                                [
-                                    -92.474532,
-                                    48.410483
-                                ],
-                                [
-                                    -92.467581,
-                                    48.394282
-                                ],
-                                [
-                                    -92.467064,
-                                    48.353225
-                                ],
-                                [
-                                    -92.462465,
-                                    48.329299
-                                ],
-                                [
-                                    -92.451381,
-                                    48.312685
-                                ],
-                                [
-                                    -92.41823,
-                                    48.282041
-                                ],
-                                [
-                                    -92.38464,
-                                    48.232406
-                                ],
-                                [
-                                    -92.371851,
-                                    48.222587
-                                ],
-                                [
-                                    -92.353815,
-                                    48.222897
-                                ],
-                                [
-                                    -92.327874,
-                                    48.229435
-                                ],
-                                [
-                                    -92.303663,
-                                    48.239279
-                                ],
-                                [
-                                    -92.291029,
-                                    48.249562
-                                ],
-                                [
-                                    -92.292062,
-                                    48.270336
-                                ],
-                                [
-                                    -92.301416,
-                                    48.290645
-                                ],
-                                [
-                                    -92.303095,
-                                    48.310928
-                                ],
-                                [
-                                    -92.281598,
-                                    48.33178
-                                ],
-                                [
-                                    -92.259118,
-                                    48.339635
-                                ],
-                                [
-                                    -92.154732,
-                                    48.350125
-                                ],
-                                [
-                                    -92.070499,
-                                    48.346714
-                                ],
-                                [
-                                    -92.043421,
-                                    48.334596
-                                ],
-                                [
-                                    -92.030114,
-                                    48.313176
-                                ],
-                                [
-                                    -92.021355,
-                                    48.287441
-                                ],
-                                [
-                                    -92.007997,
-                                    48.262482
-                                ],
-                                [
-                                    -91.992158,
-                                    48.247909
-                                ],
-                                [
-                                    -91.975492,
-                                    48.236566
-                                ],
-                                [
-                                    -91.957302,
-                                    48.228323
-                                ],
-                                [
-                                    -91.852244,
-                                    48.195974
-                                ],
-                                [
-                                    -91.764988,
-                                    48.187344
-                                ],
-                                [
-                                    -91.744137,
-                                    48.179593
-                                ],
-                                [
-                                    -91.727575,
-                                    48.168327
-                                ],
-                                [
-                                    -91.695509,
-                                    48.13758
-                                ],
-                                [
-                                    -91.716438,
-                                    48.112051
-                                ],
-                                [
-                                    -91.692512,
-                                    48.097866
-                                ],
-                                [
-                                    -91.618615,
-                                    48.089572
-                                ],
-                                [
-                                    -91.597479,
-                                    48.090399
-                                ],
-                                [
-                                    -91.589676,
-                                    48.088332
-                                ],
-                                [
-                                    -91.581098,
-                                    48.080942
-                                ],
-                                [
-                                    -91.579806,
-                                    48.070969
-                                ],
-                                [
-                                    -91.585129,
-                                    48.06084
-                                ],
-                                [
-                                    -91.586989,
-                                    48.052572
-                                ],
-                                [
-                                    -91.574845,
-                                    48.048205
-                                ],
-                                [
-                                    -91.487098,
-                                    48.053476
-                                ],
-                                [
-                                    -91.464722,
-                                    48.048955
-                                ],
-                                [
-                                    -91.446274,
-                                    48.040738
-                                ],
-                                [
-                                    -91.427929,
-                                    48.036449
-                                ],
-                                [
-                                    -91.3654,
-                                    48.057843
-                                ],
-                                [
-                                    -91.276362,
-                                    48.064768
-                                ],
-                                [
-                                    -91.23807,
-                                    48.082648
-                                ],
-                                [
-                                    -91.203963,
-                                    48.107659
-                                ],
-                                [
-                                    -91.071103,
-                                    48.170859
-                                ],
-                                [
-                                    -91.02816,
-                                    48.184838
-                                ],
-                                [
-                                    -91.008109,
-                                    48.194372
-                                ],
-                                [
-                                    -90.923153,
-                                    48.227109
-                                ],
-                                [
-                                    -90.873802,
-                                    48.234344
-                                ],
-                                [
-                                    -90.840678,
-                                    48.220107
-                                ],
-                                [
-                                    -90.837939,
-                                    48.210547
-                                ],
-                                [
-                                    -90.848843,
-                                    48.198713
-                                ],
-                                [
-                                    -90.849721,
-                                    48.189566
-                                ],
-                                [
-                                    -90.843003,
-                                    48.176983
-                                ],
-                                [
-                                    -90.83427,
-                                    48.171789
-                                ],
-                                [
-                                    -90.823883,
-                                    48.168327
-                                ],
-                                [
-                                    -90.812307,
-                                    48.160989
-                                ],
-                                [
-                                    -90.803057,
-                                    48.147166
-                                ],
-                                [
-                                    -90.796701,
-                                    48.117064
-                                ],
-                                [
-                                    -90.786469,
-                                    48.10045
-                                ],
-                                [
-                                    -90.750347,
-                                    48.083991
-                                ],
-                                [
-                                    -90.701307,
-                                    48.08456
-                                ],
-                                [
-                                    -90.611079,
-                                    48.103499
-                                ],
-                                [
-                                    -90.586843,
-                                    48.104817
-                                ],
-                                [
-                                    -90.573872,
-                                    48.097892
-                                ],
-                                [
-                                    -90.562194,
-                                    48.088849
-                                ],
-                                [
-                                    -90.542014,
-                                    48.083733
-                                ],
-                                [
-                                    -90.531601,
-                                    48.08456
-                                ],
-                                [
-                                    -90.501887,
-                                    48.094275
-                                ],
-                                [
-                                    -90.490493,
-                                    48.096239
-                                ],
-                                [
-                                    -90.483465,
-                                    48.094482
-                                ],
-                                [
-                                    -90.477858,
-                                    48.091536
-                                ],
-                                [
-                                    -90.470623,
-                                    48.089882
-                                ],
-                                [
-                                    -90.178625,
-                                    48.116444
-                                ],
-                                [
-                                    -90.120386,
-                                    48.115359
-                                ],
-                                [
-                                    -90.073257,
-                                    48.101199
-                                ],
-                                [
-                                    -90.061036,
-                                    48.091019
-                                ],
-                                [
-                                    -90.008222,
-                                    48.029731
-                                ],
-                                [
-                                    -89.995329,
-                                    48.018595
-                                ],
-                                [
-                                    -89.980317,
-                                    48.010094
-                                ],
-                                [
-                                    -89.92045,
-                                    47.98746
-                                ],
-                                [
-                                    -89.902441,
-                                    47.985909
-                                ],
-                                [
-                                    -89.803454,
-                                    48.013763
-                                ],
-                                [
-                                    -89.780975,
-                                    48.017199
-                                ],
-                                [
-                                    -89.763302,
-                                    48.017303
-                                ],
-                                [
-                                    -89.745964,
-                                    48.013763
-                                ],
-                                [
-                                    -89.724596,
-                                    48.005908
-                                ],
-                                [
-                                    -89.712788,
-                                    48.003376
-                                ],
-                                [
-                                    -89.678656,
-                                    48.008699
-                                ],
-                                [
-                                    -89.65659,
-                                    48.007975
-                                ],
-                                [
-                                    -89.593105,
-                                    47.996503
-                                ],
-                                [
-                                    -89.581753,
-                                    47.996333
-                                ],
-                                [
-                                    -89.586724,
-                                    47.992938
-                                ],
-                                [
-                                    -89.310872,
-                                    47.981097
-                                ],
-                                [
-                                    -89.072861,
-                                    48.046842
-                                ],
-                                [
-                                    -88.49789,
-                                    48.212841
-                                ],
-                                [
-                                    -88.286621,
-                                    48.156675
-                                ],
-                                [
-                                    -85.939935,
-                                    47.280501
-                                ],
-                                [
-                                    -84.784644,
-                                    46.770068
-                                ],
-                                [
-                                    -84.516909,
-                                    46.435083
-                                ],
-                                [
-                                    -84.489712,
-                                    46.446652
-                                ],
-                                [
-                                    -84.491052,
-                                    46.457658
-                                ],
-                                [
-                                    -84.478301,
-                                    46.466467
-                                ],
-                                [
-                                    -84.465408,
-                                    46.478172
-                                ],
-                                [
-                                    -84.448096,
-                                    46.489722
-                                ],
-                                [
-                                    -84.42324,
-                                    46.511581
-                                ],
-                                [
-                                    -84.389702,
-                                    46.520262
-                                ],
-                                [
-                                    -84.352469,
-                                    46.522743
-                                ],
-                                [
-                                    -84.30534,
-                                    46.501607
-                                ],
-                                [
-                                    -84.242011,
-                                    46.526464
-                                ],
-                                [
-                                    -84.197285,
-                                    46.546359
-                                ],
-                                [
-                                    -84.147676,
-                                    46.541346
-                                ],
-                                [
-                                    -84.110443,
-                                    46.526464
-                                ],
-                                [
-                                    -84.158812,
-                                    46.433343
-                                ],
-                                [
-                                    -84.147676,
-                                    46.399882
-                                ],
-                                [
-                                    -84.129046,
-                                    46.375026
-                                ],
-                                [
-                                    -84.10543,
-                                    46.347741
-                                ],
-                                [
-                                    -84.105944,
-                                    46.346374
-                                ],
-                                [
-                                    -84.117195,
-                                    46.347157
-                                ],
-                                [
-                                    -84.117489,
-                                    46.338326
-                                ],
-                                [
-                                    -84.122361,
-                                    46.331922
-                                ],
-                                [
-                                    -84.112061,
-                                    46.287102
-                                ],
-                                [
-                                    -84.092672,
-                                    46.227469
-                                ],
-                                [
-                                    -84.111983,
-                                    46.20337
-                                ],
-                                [
-                                    -84.015118,
-                                    46.149712
-                                ],
-                                [
-                                    -83.957038,
-                                    46.045736
-                                ],
-                                [
-                                    -83.676821,
-                                    46.15388
-                                ],
-                                [
-                                    -83.429449,
-                                    46.086221
-                                ],
-                                [
-                                    -83.523049,
-                                    45.892052
-                                ],
-                                [
-                                    -83.574563,
-                                    45.890259
-                                ],
-                                [
-                                    -82.551615,
-                                    44.857931
-                                ],
-                                [
-                                    -82.655591,
-                                    43.968545
-                                ],
-                                [
-                                    -82.440632,
-                                    43.096285
-                                ],
-                                [
-                                    -82.460131,
-                                    43.084392
-                                ],
-                                [
-                                    -82.458894,
-                                    43.083247
-                                ],
-                                [
-                                    -82.431813,
-                                    43.039387
-                                ],
-                                [
-                                    -82.424748,
-                                    43.02408
-                                ],
-                                [
-                                    -82.417242,
-                                    43.01731
-                                ],
-                                [
-                                    -82.416369,
-                                    43.01742
-                                ],
-                                [
-                                    -82.416412,
-                                    43.017143
-                                ],
-                                [
-                                    -82.414603,
-                                    42.983243
-                                ],
-                                [
-                                    -82.430442,
-                                    42.951307
-                                ],
-                                [
-                                    -82.453179,
-                                    42.918983
-                                ],
-                                [
-                                    -82.464781,
-                                    42.883637
-                                ],
-                                [
-                                    -82.468036,
-                                    42.863974
-                                ],
-                                [
-                                    -82.482325,
-                                    42.835113
-                                ],
-                                [
-                                    -82.485271,
-                                    42.818524
-                                ],
-                                [
-                                    -82.473618,
-                                    42.798164
-                                ],
-                                [
-                                    -82.470982,
-                                    42.790568
-                                ],
-                                [
-                                    -82.471344,
-                                    42.779845
-                                ],
-                                [
-                                    -82.476951,
-                                    42.761474
-                                ],
-                                [
-                                    -82.48341,
-                                    42.719254
-                                ],
-                                [
-                                    -82.511264,
-                                    42.646675
-                                ],
-                                [
-                                    -82.526224,
-                                    42.619906
-                                ],
-                                [
-                                    -82.549246,
-                                    42.590941
-                                ],
-                                [
-                                    -82.575833,
-                                    42.571795
-                                ],
-                                [
-                                    -82.608467,
-                                    42.561098
-                                ],
-                                [
-                                    -82.644331,
-                                    42.557817
-                                ],
-                                [
-                                    -82.644698,
-                                    42.557533
-                                ],
-                                [
-                                    -82.644932,
-                                    42.561634
-                                ],
-                                [
-                                    -82.637132,
-                                    42.568405
-                                ],
-                                [
-                                    -82.60902,
-                                    42.579296
-                                ],
-                                [
-                                    -82.616673,
-                                    42.582828
-                                ],
-                                [
-                                    -82.636985,
-                                    42.599607
-                                ],
-                                [
-                                    -82.625357,
-                                    42.616092
-                                ],
-                                [
-                                    -82.629331,
-                                    42.626394
-                                ],
-                                [
-                                    -82.638751,
-                                    42.633459
-                                ],
-                                [
-                                    -82.644344,
-                                    42.640524
-                                ],
-                                [
-                                    -82.644166,
-                                    42.641056
-                                ],
-                                [
-                                    -82.716083,
-                                    42.617461
-                                ],
-                                [
-                                    -82.777592,
-                                    42.408506
-                                ],
-                                [
-                                    -82.888693,
-                                    42.406093
-                                ],
-                                [
-                                    -82.889991,
-                                    42.403266
-                                ],
-                                [
-                                    -82.905739,
-                                    42.387665
-                                ],
-                                [
-                                    -82.923842,
-                                    42.374419
-                                ],
-                                [
-                                    -82.937972,
-                                    42.366176
-                                ],
-                                [
-                                    -82.947686,
-                                    42.363527
-                                ],
-                                [
-                                    -82.979624,
-                                    42.359406
-                                ],
-                                [
-                                    -83.042618,
-                                    42.340861
-                                ],
-                                [
-                                    -83.061899,
-                                    42.32732
-                                ],
-                                [
-                                    -83.081622,
-                                    42.30907
-                                ],
-                                [
-                                    -83.11342,
-                                    42.279619
-                                ],
-                                [
-                                    -83.145306,
-                                    42.066968
-                                ],
-                                [
-                                    -83.177398,
-                                    41.960666
-                                ],
-                                [
-                                    -83.21512,
-                                    41.794493
-                                ],
-                                [
-                                    -82.219051,
-                                    41.516445
-                                ],
-                                [
-                                    -80.345329,
-                                    42.13344
-                                ],
-                                [
-                                    -80.316455,
-                                    42.123137
-                                ],
-                                [
-                                    -79.270266,
-                                    42.591872
-                                ],
-                                [
-                                    -79.221058,
-                                    42.582892
-                                ],
-                                [
-                                    -78.871842,
-                                    42.860012
-                                ],
-                                [
-                                    -78.875011,
-                                    42.867184
-                                ],
-                                [
-                                    -78.896205,
-                                    42.897209
-                                ],
-                                [
-                                    -78.901651,
-                                    42.908101
-                                ],
-                                [
-                                    -78.90901,
-                                    42.952255
-                                ],
-                                [
-                                    -78.913426,
-                                    42.957848
-                                ],
-                                [
-                                    -78.932118,
-                                    42.9708
-                                ],
-                                [
-                                    -78.936386,
-                                    42.979631
-                                ],
-                                [
-                                    -78.927997,
-                                    43.002003
-                                ],
-                                [
-                                    -78.893114,
-                                    43.029379
-                                ],
-                                [
-                                    -78.887963,
-                                    43.051456
-                                ],
-                                [
-                                    -78.914897,
-                                    43.076477
-                                ],
-                                [
-                                    -79.026167,
-                                    43.086485
-                                ],
-                                [
-                                    -79.065231,
-                                    43.10573
-                                ],
-                                [
-                                    -79.065273,
-                                    43.105897
-                                ],
-                                [
-                                    -79.065738,
-                                    43.120237
-                                ],
-                                [
-                                    -79.061423,
-                                    43.130288
-                                ],
-                                [
-                                    -79.055583,
-                                    43.138427
-                                ],
-                                [
-                                    -79.051604,
-                                    43.146851
-                                ],
-                                [
-                                    -79.04933,
-                                    43.159847
-                                ],
-                                [
-                                    -79.048607,
-                                    43.170622
-                                ],
-                                [
-                                    -79.053775,
-                                    43.260358
-                                ],
-                                [
-                                    -79.058425,
-                                    43.277799
-                                ],
-                                [
-                                    -79.058631,
-                                    43.2782
-                                ],
-                                [
-                                    -78.990696,
-                                    43.286947
-                                ],
-                                [
-                                    -78.862059,
-                                    43.324332
-                                ],
-                                [
-                                    -78.767813,
-                                    43.336418
-                                ],
-                                [
-                                    -78.516117,
-                                    43.50645
-                                ],
-                                [
-                                    -76.363317,
-                                    43.943219
-                                ],
-                                [
-                                    -76.396746,
-                                    44.106667
-                                ],
-                                [
-                                    -76.364697,
-                                    44.111631
-                                ],
-                                [
-                                    -76.366146,
-                                    44.117349
-                                ],
-                                [
-                                    -76.357462,
-                                    44.131478
-                                ],
-                                [
-                                    -76.183493,
-                                    44.223025
-                                ],
-                                [
-                                    -76.162644,
-                                    44.229888
-                                ],
-                                [
-                                    -76.176117,
-                                    44.30795
-                                ],
-                                [
-                                    -76.046414,
-                                    44.354817
-                                ],
-                                [
-                                    -75.928746,
-                                    44.391137
-                                ],
-                                [
-                                    -75.852508,
-                                    44.381639
-                                ],
-                                [
-                                    -75.849095,
-                                    44.386103
-                                ],
-                                [
-                                    -75.847623,
-                                    44.392579
-                                ],
-                                [
-                                    -75.84674,
-                                    44.398172
-                                ],
-                                [
-                                    -75.845415,
-                                    44.40141
-                                ],
-                                [
-                                    -75.780803,
-                                    44.432318
-                                ],
-                                [
-                                    -75.770205,
-                                    44.446153
-                                ],
-                                [
-                                    -75.772266,
-                                    44.463815
-                                ],
-                                [
-                                    -75.779184,
-                                    44.48236
-                                ],
-                                [
-                                    -75.791496,
-                                    44.496513
-                                ],
-                                [
-                                    -75.791183,
-                                    44.496768
-                                ],
-                                [
-                                    -75.754622,
-                                    44.527567
-                                ],
-                                [
-                                    -75.69969,
-                                    44.581673
-                                ],
-                                [
-                                    -75.578199,
-                                    44.661513
-                                ],
-                                [
-                                    -75.455958,
-                                    44.741766
-                                ],
-                                [
-                                    -75.341831,
-                                    44.816749
-                                ],
-                                [
-                                    -75.270233,
-                                    44.863774
-                                ],
-                                [
-                                    -75.129647,
-                                    44.925166
-                                ],
-                                [
-                                    -75.075594,
-                                    44.935501
-                                ],
-                                [
-                                    -75.058721,
-                                    44.941031
-                                ],
-                                [
-                                    -75.0149,
-                                    44.96599
-                                ],
-                                [
-                                    -74.998647,
-                                    44.972398
-                                ],
-                                [
-                                    -74.940201,
-                                    44.987746
-                                ],
-                                [
-                                    -74.903744,
-                                    45.005213
-                                ],
-                                [
-                                    -74.88651,
-                                    45.009398
-                                ],
-                                [
-                                    -74.868474,
-                                    45.010122
-                                ],
-                                [
-                                    -74.741557,
-                                    44.998857
-                                ],
-                                [
-                                    -74.712961,
-                                    44.999254
-                                ],
-                                [
-                                    -74.695875,
-                                    44.99803
-                                ],
-                                [
-                                    -74.596114,
-                                    44.998495
-                                ],
-                                [
-                                    -74.496352,
-                                    44.999012
-                                ],
-                                [
-                                    -74.197146,
-                                    45.000458
-                                ],
-                                [
-                                    -71.703551,
-                                    45.012757
-                                ],
-                                [
-                                    -71.603816,
-                                    45.013274
-                                ],
-                                [
-                                    -71.505848,
-                                    45.013731
-                                ],
-                                [
-                                    -71.50408,
-                                    45.013739
-                                ],
-                                [
-                                    -71.506613,
-                                    45.037045
-                                ],
-                                [
-                                    -71.504752,
-                                    45.052962
-                                ],
-                                [
-                                    -71.497259,
-                                    45.066553
-                                ],
-                                [
-                                    -71.45659,
-                                    45.110994
-                                ],
-                                [
-                                    -71.451215,
-                                    45.121691
-                                ],
-                                [
-                                    -71.445996,
-                                    45.140295
-                                ],
-                                [
-                                    -71.441604,
-                                    45.150682
-                                ],
-                                [
-                                    -71.413026,
-                                    45.186184
-                                ],
-                                [
-                                    -71.406567,
-                                    45.204942
-                                ],
-                                [
-                                    -71.42269,
-                                    45.217189
-                                ],
-                                [
-                                    -71.449045,
-                                    45.226905
-                                ],
-                                [
-                                    -71.438813,
-                                    45.233468
-                                ],
-                                [
-                                    -71.394888,
-                                    45.241529
-                                ],
-                                [
-                                    -71.381245,
-                                    45.250779
-                                ],
-                                [
-                                    -71.3521,
-                                    45.278323
-                                ],
-                                [
-                                    -71.334323,
-                                    45.28871
-                                ],
-                                [
-                                    -71.311534,
-                                    45.294136
-                                ],
-                                [
-                                    -71.293396,
-                                    45.292327
-                                ],
-                                [
-                                    -71.20937,
-                                    45.254758
-                                ],
-                                [
-                                    -71.185133,
-                                    45.248557
-                                ],
-                                [
-                                    -71.160329,
-                                    45.245767
-                                ],
-                                [
-                                    -71.141725,
-                                    45.252329
-                                ],
-                                [
-                                    -71.111029,
-                                    45.287108
-                                ],
-                                [
-                                    -71.095242,
-                                    45.300905
-                                ],
-                                [
-                                    -71.085553,
-                                    45.304213
-                                ],
-                                [
-                                    -71.084952,
-                                    45.304293
-                                ],
-                                [
-                                    -71.064211,
-                                    45.307055
-                                ],
-                                [
-                                    -71.054418,
-                                    45.310362
-                                ],
-                                [
-                                    -71.036667,
-                                    45.323385
-                                ],
-                                [
-                                    -71.027598,
-                                    45.33465
-                                ],
-                                [
-                                    -71.016539,
-                                    45.343125
-                                ],
-                                [
-                                    -70.993155,
-                                    45.347827
-                                ],
-                                [
-                                    -70.968118,
-                                    45.34452
-                                ],
-                                [
-                                    -70.951608,
-                                    45.332014
-                                ],
-                                [
-                                    -70.906908,
-                                    45.246232
-                                ],
-                                [
-                                    -70.892412,
-                                    45.234604
-                                ],
-                                [
-                                    -70.874351,
-                                    45.245663
-                                ],
-                                [
-                                    -70.870605,
-                                    45.255275
-                                ],
-                                [
-                                    -70.872491,
-                                    45.274189
-                                ],
-                                [
-                                    -70.870243,
-                                    45.283129
-                                ],
-                                [
-                                    -70.862621,
-                                    45.290363
-                                ],
-                                [
-                                    -70.842389,
-                                    45.301215
-                                ],
-                                [
-                                    -70.835258,
-                                    45.309794
-                                ],
-                                [
-                                    -70.83208,
-                                    45.328552
-                                ],
-                                [
-                                    -70.835465,
-                                    45.373097
-                                ],
-                                [
-                                    -70.833837,
-                                    45.393096
-                                ],
-                                [
-                                    -70.825982,
-                                    45.410459
-                                ],
-                                [
-                                    -70.812986,
-                                    45.42343
-                                ],
-                                [
-                                    -70.794873,
-                                    45.430406
-                                ],
-                                [
-                                    -70.771877,
-                                    45.430045
-                                ],
-                                [
-                                    -70.75255,
-                                    45.422345
-                                ],
-                                [
-                                    -70.718004,
-                                    45.397282
-                                ],
-                                [
-                                    -70.696739,
-                                    45.388652
-                                ],
-                                [
-                                    -70.675785,
-                                    45.388704
-                                ],
-                                [
-                                    -70.65359,
-                                    45.395473
-                                ],
-                                [
-                                    -70.641316,
-                                    45.408496
-                                ],
-                                [
-                                    -70.650257,
-                                    45.427461
-                                ],
-                                [
-                                    -70.668162,
-                                    45.439036
-                                ],
-                                [
-                                    -70.707385,
-                                    45.4564
-                                ],
-                                [
-                                    -70.722836,
-                                    45.470921
-                                ],
-                                [
-                                    -70.732009,
-                                    45.491591
-                                ],
-                                [
-                                    -70.730329,
-                                    45.507973
-                                ],
-                                [
-                                    -70.686792,
-                                    45.572723
-                                ],
-                                [
-                                    -70.589614,
-                                    45.651788
-                                ],
-                                [
-                                    -70.572406,
-                                    45.662279
-                                ],
-                                [
-                                    -70.514735,
-                                    45.681709
-                                ],
-                                [
-                                    -70.484763,
-                                    45.699641
-                                ],
-                                [
-                                    -70.4728,
-                                    45.703568
-                                ],
-                                [
-                                    -70.450424,
-                                    45.703723
-                                ],
-                                [
-                                    -70.439132,
-                                    45.705893
-                                ],
-                                [
-                                    -70.419315,
-                                    45.716901
-                                ],
-                                [
-                                    -70.407351,
-                                    45.731525
-                                ],
-                                [
-                                    -70.402442,
-                                    45.749663
-                                ],
-                                [
-                                    -70.403941,
-                                    45.771161
-                                ],
-                                [
-                                    -70.408282,
-                                    45.781651
-                                ],
-                                [
-                                    -70.413682,
-                                    45.787697
-                                ],
-                                [
-                                    -70.41717,
-                                    45.793795
-                                ],
-                                [
-                                    -70.415232,
-                                    45.804389
-                                ],
-                                [
-                                    -70.409935,
-                                    45.810745
-                                ],
-                                [
-                                    -70.389807,
-                                    45.825059
-                                ],
-                                [
-                                    -70.312654,
-                                    45.867641
-                                ],
-                                [
-                                    -70.283173,
-                                    45.890482
-                                ],
-                                [
-                                    -70.262528,
-                                    45.923038
-                                ],
-                                [
-                                    -70.255939,
-                                    45.948876
-                                ],
-                                [
-                                    -70.263148,
-                                    45.956834
-                                ],
-                                [
-                                    -70.280434,
-                                    45.959315
-                                ],
-                                [
-                                    -70.303947,
-                                    45.968616
-                                ],
-                                [
-                                    -70.316298,
-                                    45.982982
-                                ],
-                                [
-                                    -70.316892,
-                                    45.999002
-                                ],
-                                [
-                                    -70.306143,
-                                    46.035331
-                                ],
-                                [
-                                    -70.303637,
-                                    46.038483
-                                ],
-                                [
-                                    -70.294309,
-                                    46.044943
-                                ],
-                                [
-                                    -70.29201,
-                                    46.048663
-                                ],
-                                [
-                                    -70.293017,
-                                    46.054038
-                                ],
-                                [
-                                    -70.296092,
-                                    46.057862
-                                ],
-                                [
-                                    -70.300795,
-                                    46.061737
-                                ],
-                                [
-                                    -70.304774,
-                                    46.065975
-                                ],
-                                [
-                                    -70.311362,
-                                    46.071866
-                                ],
-                                [
-                                    -70.312629,
-                                    46.079566
-                                ],
-                                [
-                                    -70.30033,
-                                    46.089281
-                                ],
-                                [
-                                    -70.26444,
-                                    46.106593
-                                ],
-                                [
-                                    -70.24948,
-                                    46.120597
-                                ],
-                                [
-                                    -70.244002,
-                                    46.141009
-                                ],
-                                [
-                                    -70.249247,
-                                    46.162765
-                                ],
-                                [
-                                    -70.263329,
-                                    46.183229
-                                ],
-                                [
-                                    -70.284801,
-                                    46.191859
-                                ],
-                                [
-                                    -70.280899,
-                                    46.211857
-                                ],
-                                [
-                                    -70.253407,
-                                    46.251493
-                                ],
-                                [
-                                    -70.236173,
-                                    46.288339
-                                ],
-                                [
-                                    -70.223693,
-                                    46.300793
-                                ],
-                                [
-                                    -70.201886,
-                                    46.305495
-                                ],
-                                [
-                                    -70.199509,
-                                    46.315262
-                                ],
-                                [
-                                    -70.197028,
-                                    46.336863
-                                ],
-                                [
-                                    -70.188398,
-                                    46.358412
-                                ],
-                                [
-                                    -70.167418,
-                                    46.368179
-                                ],
-                                [
-                                    -70.153052,
-                                    46.372829
-                                ],
-                                [
-                                    -70.074323,
-                                    46.419545
-                                ],
-                                [
-                                    -70.061817,
-                                    46.445409
-                                ],
-                                [
-                                    -70.050086,
-                                    46.511271
-                                ],
-                                [
-                                    -70.032723,
-                                    46.609766
-                                ],
-                                [
-                                    -70.023628,
-                                    46.661287
-                                ],
-                                [
-                                    -70.007763,
-                                    46.704075
-                                ],
-                                [
-                                    -69.989961,
-                                    46.721697
-                                ],
-                                [
-                                    -69.899708,
-                                    46.811562
-                                ],
-                                [
-                                    -69.809403,
-                                    46.901299
-                                ],
-                                [
-                                    -69.719099,
-                                    46.991086
-                                ],
-                                [
-                                    -69.628794,
-                                    47.080797
-                                ],
-                                [
-                                    -69.538464,
-                                    47.17061
-                                ],
-                                [
-                                    -69.448159,
-                                    47.260346
-                                ],
-                                [
-                                    -69.357906,
-                                    47.350134
-                                ],
-                                [
-                                    -69.267628,
-                                    47.439844
-                                ],
-                                [
-                                    -69.25091,
-                                    47.452919
-                                ],
-                                [
-                                    -69.237268,
-                                    47.45881
-                                ],
-                                [
-                                    -69.221972,
-                                    47.459688
-                                ],
-                                [
-                                    -69.069655,
-                                    47.431886
-                                ],
-                                [
-                                    -69.054023,
-                                    47.418399
-                                ],
-                                [
-                                    -69.054333,
-                                    47.389253
-                                ],
-                                [
-                                    -69.066193,
-                                    47.32967
-                                ],
-                                [
-                                    -69.065134,
-                                    47.296339
-                                ],
-                                [
-                                    -69.06356,
-                                    47.290809
-                                ],
-                                [
-                                    -69.057486,
-                                    47.269467
-                                ],
-                                [
-                                    -69.0402,
-                                    47.249055
-                                ],
-                                [
-                                    -68.906229,
-                                    47.190221
-                                ],
-                                [
-                                    -68.889718,
-                                    47.190609
-                                ],
-                                [
-                                    -68.761819,
-                                    47.23704
-                                ],
-                                [
-                                    -68.71779,
-                                    47.245231
-                                ],
-                                [
-                                    -68.668801,
-                                    47.243422
-                                ],
-                                [
-                                    -68.644203,
-                                    47.245283
-                                ],
-                                [
-                                    -68.6256,
-                                    47.255205
-                                ],
-                                [
-                                    -68.607926,
-                                    47.269829
-                                ],
-                                [
-                                    -68.58524,
-                                    47.28249
-                                ],
-                                [
-                                    -68.539662,
-                                    47.299853
-                                ],
-                                [
-                                    -68.518009,
-                                    47.304762
-                                ],
-                                [
-                                    -68.492016,
-                                    47.307553
-                                ],
-                                [
-                                    -68.466746,
-                                    47.305692
-                                ],
-                                [
-                                    -68.435327,
-                                    47.291275
-                                ],
-                                [
-                                    -68.422563,
-                                    47.293109
-                                ],
-                                [
-                                    -68.410212,
-                                    47.297424
-                                ],
-                                [
-                                    -68.385614,
-                                    47.301713
-                                ],
-                                [
-                                    -68.383392,
-                                    47.307139
-                                ],
-                                [
-                                    -68.384839,
-                                    47.315873
-                                ],
-                                [
-                                    -68.382049,
-                                    47.32781
-                                ],
-                                [
-                                    -68.347839,
-                                    47.358506
-                                ],
-                                [
-                                    -68.299728,
-                                    47.367833
-                                ],
-                                [
-                                    -68.24645,
-                                    47.360573
-                                ],
-                                [
-                                    -68.197047,
-                                    47.341401
-                                ],
-                                [
-                                    -68.184335,
-                                    47.333133
-                                ],
-                                [
-                                    -68.156068,
-                                    47.306674
-                                ],
-                                [
-                                    -68.145061,
-                                    47.301455
-                                ],
-                                [
-                                    -68.115398,
-                                    47.292282
-                                ],
-                                [
-                                    -68.101446,
-                                    47.286185
-                                ],
-                                [
-                                    -68.039382,
-                                    47.245231
-                                ],
-                                [
-                                    -67.993184,
-                                    47.223217
-                                ],
-                                [
-                                    -67.962436,
-                                    47.197689
-                                ],
-                                [
-                                    -67.953703,
-                                    47.18663
-                                ],
-                                [
-                                    -67.949982,
-                                    47.172936
-                                ],
-                                [
-                                    -67.943419,
-                                    47.164538
-                                ],
-                                [
-                                    -67.899132,
-                                    47.138778
-                                ],
-                                [
-                                    -67.870607,
-                                    47.107358
-                                ],
-                                [
-                                    -67.854742,
-                                    47.09785
-                                ],
-                                [
-                                    -67.813556,
-                                    47.081908
-                                ],
-                                [
-                                    -67.808699,
-                                    47.075138
-                                ],
-                                [
-                                    -67.805185,
-                                    47.035631
-                                ],
-                                [
-                                    -67.802549,
-                                    46.901247
-                                ],
-                                [
-                                    -67.800017,
-                                    46.766785
-                                ],
-                                [
-                                    -67.797433,
-                                    46.632297
-                                ],
-                                [
-                                    -67.794849,
-                                    46.497861
-                                ],
-                                [
-                                    -67.792317,
-                                    46.363476
-                                ],
-                                [
-                                    -67.789733,
-                                    46.229014
-                                ],
-                                [
-                                    -67.78715,
-                                    46.094552
-                                ],
-                                [
-                                    -67.784566,
-                                    45.960142
-                                ],
-                                [
-                                    -67.782757,
-                                    45.95053
-                                ],
-                                [
-                                    -67.776556,
-                                    45.942933
-                                ],
-                                [
-                                    -67.767461,
-                                    45.935957
-                                ],
-                                [
-                                    -67.759658,
-                                    45.928567
-                                ],
-                                [
-                                    -67.757849,
-                                    45.919472
-                                ],
-                                [
-                                    -67.769425,
-                                    45.903969
-                                ],
-                                [
-                                    -67.787356,
-                                    45.890017
-                                ],
-                                [
-                                    -67.799242,
-                                    45.875651
-                                ],
-                                [
-                                    -67.792627,
-                                    45.858907
-                                ],
-                                [
-                                    -67.776091,
-                                    45.840821
-                                ],
-                                [
-                                    -67.772835,
-                                    45.828057
-                                ],
-                                [
-                                    -67.779863,
-                                    45.815706
-                                ],
-                                [
-                                    -67.794126,
-                                    45.799169
-                                ],
-                                [
-                                    -67.80627,
-                                    45.781754
-                                ],
-                                [
-                                    -67.811127,
-                                    45.76651
-                                ],
-                                [
-                                    -67.810816,
-                                    45.762414
-                                ],
-                                [
-                                    -67.817811,
-                                    45.754896
-                                ],
-                                [
-                                    -67.821785,
-                                    45.740767
-                                ],
-                                [
-                                    -67.827673,
-                                    45.739001
-                                ],
-                                [
-                                    -67.868884,
-                                    45.744593
-                                ],
-                                [
-                                    -67.856815,
-                                    45.723694
-                                ],
-                                [
-                                    -67.835768,
-                                    45.703971
-                                ],
-                                [
-                                    -67.793821,
-                                    45.676301
-                                ],
-                                [
-                                    -67.733034,
-                                    45.651869
-                                ],
-                                [
-                                    -67.723173,
-                                    45.645393
-                                ],
-                                [
-                                    -67.711546,
-                                    45.642155
-                                ],
-                                [
-                                    -67.697564,
-                                    45.64922
-                                ],
-                                [
-                                    -67.66695,
-                                    45.620077
-                                ],
-                                [
-                                    -67.649435,
-                                    45.611247
-                                ],
-                                [
-                                    -67.603073,
-                                    45.605948
-                                ],
-                                [
-                                    -67.561862,
-                                    45.596234
-                                ],
-                                [
-                                    -67.54052,
-                                    45.593879
-                                ],
-                                [
-                                    -67.442056,
-                                    45.603593
-                                ],
-                                [
-                                    -67.440939,
-                                    45.604586
-                                ],
-                                [
-                                    -67.431306,
-                                    45.597941
-                                ],
-                                [
-                                    -67.422107,
-                                    45.568796
-                                ],
-                                [
-                                    -67.42619,
-                                    45.533449
-                                ],
-                                [
-                                    -67.443036,
-                                    45.522184
-                                ],
-                                [
-                                    -67.467531,
-                                    45.508283
-                                ],
-                                [
-                                    -67.493214,
-                                    45.493142
-                                ],
-                                [
-                                    -67.48231,
-                                    45.455521
-                                ],
-                                [
-                                    -67.428825,
-                                    45.38705
-                                ],
-                                [
-                                    -67.434561,
-                                    45.350308
-                                ],
-                                [
-                                    -67.459056,
-                                    45.318424
-                                ],
-                                [
-                                    -67.468668,
-                                    45.301835
-                                ],
-                                [
-                                    -67.475024,
-                                    45.282353
-                                ],
-                                [
-                                    -67.471303,
-                                    45.266282
-                                ],
-                                [
-                                    -67.427585,
-                                    45.236568
-                                ],
-                                [
-                                    -67.390533,
-                                    45.193108
-                                ],
-                                [
-                                    -67.356272,
-                                    45.165926
-                                ],
-                                [
-                                    -67.31922,
-                                    45.153886
-                                ],
-                                [
-                                    -67.284648,
-                                    45.169699
-                                ],
-                                [
-                                    -67.279584,
-                                    45.179052
-                                ],
-                                [
-                                    -67.279222,
-                                    45.187372
-                                ],
-                                [
-                                    -67.277207,
-                                    45.195072
-                                ],
-                                [
-                                    -67.267336,
-                                    45.202513
-                                ],
-                                [
-                                    -67.254986,
-                                    45.205045
-                                ],
-                                [
-                                    -67.242428,
-                                    45.202565
-                                ],
-                                [
-                                    -67.219071,
-                                    45.192126
-                                ],
-                                [
-                                    -67.206166,
-                                    45.189401
-                                ],
-                                [
-                                    -67.176015,
-                                    45.178656
-                                ],
-                                [
-                                    -67.191274,
-                                    45.180365
-                                ],
-                                [
-                                    -67.204376,
-                                    45.178209
-                                ],
-                                [
-                                    -67.204724,
-                                    45.177791
-                                ],
-                                [
-                                    -67.152423,
-                                    45.148932
-                                ],
-                                [
-                                    -67.048033,
-                                    45.043407
-                                ],
-                                [
-                                    -66.962727,
-                                    45.047088
-                                ],
-                                [
-                                    -66.857192,
-                                    44.968696
-                                ],
-                                [
-                                    -66.897268,
-                                    44.817275
-                                ],
-                                [
-                                    -67.2159,
-                                    44.593511
-                                ],
-                                [
-                                    -67.122366,
-                                    44.423624
-                                ],
-                                [
-                                    -67.68447,
-                                    44.192544
-                                ],
-                                [
-                                    -67.459678,
-                                    40.781645
-                                ],
-                                [
-                                    -76.607854,
-                                    32.495823
-                                ],
-                                [
-                                    -76.798479,
-                                    32.713735
-                                ],
-                                [
-                                    -78.561892,
-                                    29.037718
-                                ],
-                                [
-                                    -78.892446,
-                                    29.039659
-                                ],
-                                [
-                                    -79.762295,
-                                    26.719312
-                                ],
-                                [
-                                    -80.026352,
-                                    24.932961
-                                ],
-                                [
-                                    -82.368794,
-                                    23.994833
-                                ],
-                                [
-                                    -83.806281,
-                                    29.068506
-                                ],
-                                [
-                                    -87.460772,
-                                    29.089961
-                                ],
-                                [
-                                    -87.922646,
-                                    28.666131
-                                ],
-                                [
-                                    -90.461001,
-                                    28.246758
-                                ],
-                                [
-                                    -91.787336,
-                                    29.11536
-                                ],
-                                [
-                                    -93.311871,
-                                    29.12431
-                                ],
-                                [
-                                    -96.423449,
-                                    26.057857
-                                ],
-                                [
-                                    -97.129057,
-                                    25.991017
-                                ],
-                                [
-                                    -97.129509,
-                                    25.966833
-                                ],
-                                [
-                                    -97.139358,
-                                    25.965876
-                                ],
-                                [
-                                    -97.202171,
-                                    25.960893
-                                ],
-                                [
-                                    -97.202176,
-                                    25.960857
-                                ],
-                                [
-                                    -97.204941,
-                                    25.960639
-                                ],
-                                [
-                                    -97.253051,
-                                    25.963481
-                                ],
-                                [
-                                    -97.266358,
-                                    25.960639
-                                ],
-                                [
-                                    -97.2692,
-                                    25.944361
-                                ],
-                                [
-                                    -97.287649,
-                                    25.928651
-                                ],
-                                [
-                                    -97.310981,
-                                    25.922088
-                                ],
-                                [
-                                    -97.328447,
-                                    25.933302
-                                ],
-                                [
-                                    -97.351107,
-                                    25.918419
-                                ],
-                                [
-                                    -97.355112,
-                                    25.912786
-                                ],
-                                [
-                                    -97.35227,
-                                    25.894493
-                                ],
-                                [
-                                    -97.345165,
-                                    25.871704
-                                ],
-                                [
-                                    -97.345733,
-                                    25.852222
-                                ],
-                                [
-                                    -97.36599,
-                                    25.843902
-                                ],
-                                [
-                                    -97.376015,
-                                    25.846744
-                                ],
-                                [
-                                    -97.380124,
-                                    25.853203
-                                ],
-                                [
-                                    -97.383121,
-                                    25.860541
-                                ],
-                                [
-                                    -97.389891,
-                                    25.865657
-                                ],
-                                [
-                                    -97.397823,
-                                    25.865812
-                                ],
-                                [
-                                    -97.399476,
-                                    25.861162
-                                ],
-                                [
-                                    -97.39989,
-                                    25.855115
-                                ],
-                                [
-                                    -97.404179,
-                                    25.851395
-                                ],
-                                [
-                                    -97.425418,
-                                    25.854857
-                                ],
-                                [
-                                    -97.435727,
-                                    25.869275
-                                ],
-                                [
-                                    -97.441309,
-                                    25.884933
-                                ],
-                                [
-                                    -97.448259,
-                                    25.892322
-                                ],
-                                [
-                                    -97.469421,
-                                    25.892943
-                                ],
-                                [
-                                    -97.486319,
-                                    25.895733
-                                ],
-                                [
-                                    -97.502209,
-                                    25.901883
-                                ],
-                                [
-                                    -97.52027,
-                                    25.912786
-                                ],
-                                [
-                                    -97.565177,
-                                    25.954748
-                                ],
-                                [
-                                    -97.594322,
-                                    25.966375
-                                ],
-                                [
-                                    -97.604787,
-                                    25.979966
-                                ],
-                                [
-                                    -97.613055,
-                                    25.995985
-                                ],
-                                [
-                                    -97.622641,
-                                    26.00906
-                                ],
-                                [
-                                    -97.641451,
-                                    26.022495
-                                ],
-                                [
-                                    -97.659874,
-                                    26.03066
-                                ],
-                                [
-                                    -97.679614,
-                                    26.034639
-                                ],
-                                [
-                                    -97.766948,
-                                    26.039652
-                                ],
-                                [
-                                    -97.780306,
-                                    26.043218
-                                ],
-                                [
-                                    -97.782321,
-                                    26.058617
-                                ],
-                                [
-                                    -97.80201,
-                                    26.063733
-                                ],
-                                [
-                                    -97.878181,
-                                    26.063733
-                                ],
-                                [
-                                    -97.941666,
-                                    26.056809
-                                ],
-                                [
-                                    -97.999233,
-                                    26.064302
-                                ],
-                                [
-                                    -98.013057,
-                                    26.063682
-                                ],
-                                [
-                                    -98.044166,
-                                    26.048799
-                                ],
-                                [
-                                    -98.065457,
-                                    26.042184
-                                ],
-                                [
-                                    -98.075146,
-                                    26.046628
-                                ],
-                                [
-                                    -98.083311,
-                                    26.070916
-                                ],
-                                [
-                                    -98.103103,
-                                    26.074947
-                                ],
-                                [
-                                    -98.150232,
-                                    26.063682
-                                ],
-                                [
-                                    -98.185062,
-                                    26.065232
-                                ],
-                                [
-                                    -98.222656,
-                                    26.075412
-                                ],
-                                [
-                                    -98.300429,
-                                    26.111431
-                                ],
-                                [
-                                    -98.309809,
-                                    26.121094
-                                ],
-                                [
-                                    -98.333037,
-                                    26.15303
-                                ],
-                                [
-                                    -98.339264,
-                                    26.159851
-                                ],
-                                [
-                                    -98.365774,
-                                    26.160161
-                                ],
-                                [
-                                    -98.377272,
-                                    26.163572
-                                ],
-                                [
-                                    -98.377272,
-                                    26.173649
-                                ],
-                                [
-                                    -98.36934,
-                                    26.19401
-                                ],
-                                [
-                                    -98.397193,
-                                    26.201141
-                                ],
-                                [
-                                    -98.428845,
-                                    26.217729
-                                ],
-                                [
-                                    -98.456544,
-                                    26.225946
-                                ],
-                                [
-                                    -98.472383,
-                                    26.207652
-                                ],
-                                [
-                                    -98.49295,
-                                    26.230596
-                                ],
-                                [
-                                    -98.521527,
-                                    26.240932
-                                ],
-                                [
-                                    -98.552791,
-                                    26.248321
-                                ],
-                                [
-                                    -98.581627,
-                                    26.262274
-                                ],
-                                [
-                                    -98.640564,
-                                    26.24181
-                                ],
-                                [
-                                    -98.653663,
-                                    26.244291
-                                ],
-                                [
-                                    -98.664696,
-                                    26.250647
-                                ],
-                                [
-                                    -98.685289,
-                                    26.268475
-                                ],
-                                [
-                                    -98.693325,
-                                    26.270542
-                                ],
-                                [
-                                    -98.702239,
-                                    26.271628
-                                ],
-                                [
-                                    -98.704255,
-                                    26.27664
-                                ],
-                                [
-                                    -98.691465,
-                                    26.290231
-                                ],
-                                [
-                                    -98.701413,
-                                    26.299119
-                                ],
-                                [
-                                    -98.713169,
-                                    26.303357
-                                ],
-                                [
-                                    -98.726217,
-                                    26.30439
-                                ],
-                                [
-                                    -98.739911,
-                                    26.303253
-                                ],
-                                [
-                                    -98.735932,
-                                    26.320048
-                                ],
-                                [
-                                    -98.746397,
-                                    26.332141
-                                ],
-                                [
-                                    -98.780839,
-                                    26.351674
-                                ],
-                                [
-                                    -98.795851,
-                                    26.368314
-                                ],
-                                [
-                                    -98.801329,
-                                    26.372138
-                                ],
-                                [
-                                    -98.810295,
-                                    26.372448
-                                ],
-                                [
-                                    -98.817323,
-                                    26.368521
-                                ],
-                                [
-                                    -98.825023,
-                                    26.366454
-                                ],
-                                [
-                                    -98.836081,
-                                    26.372138
-                                ],
-                                [
-                                    -98.842334,
-                                    26.365834
-                                ],
-                                [
-                                    -98.850835,
-                                    26.364077
-                                ],
-                                [
-                                    -98.860524,
-                                    26.366299
-                                ],
-                                [
-                                    -98.870214,
-                                    26.372138
-                                ],
-                                [
-                                    -98.893029,
-                                    26.367849
-                                ],
-                                [
-                                    -98.9299,
-                                    26.39224
-                                ],
-                                [
-                                    -98.945377,
-                                    26.378288
-                                ],
-                                [
-                                    -98.954136,
-                                    26.393946
-                                ],
-                                [
-                                    -98.962844,
-                                    26.399527
-                                ],
-                                [
-                                    -98.986951,
-                                    26.400095
-                                ],
-                                [
-                                    -99.004056,
-                                    26.393842
-                                ],
-                                [
-                                    -99.010515,
-                                    26.392602
-                                ],
-                                [
-                                    -99.016432,
-                                    26.394462
-                                ],
-                                [
-                                    -99.022995,
-                                    26.403351
-                                ],
-                                [
-                                    -99.027878,
-                                    26.406245
-                                ],
-                                [
-                                    -99.047645,
-                                    26.406968
-                                ],
-                                [
-                                    -99.066351,
-                                    26.404746
-                                ],
-                                [
-                                    -99.085498,
-                                    26.40764
-                                ],
-                                [
-                                    -99.106427,
-                                    26.423039
-                                ],
-                                [
-                                    -99.108907,
-                                    26.434253
-                                ],
-                                [
-                                    -99.102525,
-                                    26.446966
-                                ],
-                                [
-                                    -99.09374,
-                                    26.459781
-                                ],
-                                [
-                                    -99.089373,
-                                    26.47115
-                                ],
-                                [
-                                    -99.091492,
-                                    26.484018
-                                ],
-                                [
-                                    -99.10299,
-                                    26.512078
-                                ],
-                                [
-                                    -99.115108,
-                                    26.525617
-                                ],
-                                [
-                                    -99.140946,
-                                    26.531405
-                                ],
-                                [
-                                    -99.164873,
-                                    26.540448
-                                ],
-                                [
-                                    -99.17128,
-                                    26.563961
-                                ],
-                                [
-                                    -99.171548,
-                                    26.56583
-                                ],
-                                [
-                                    -99.213953,
-                                    26.568537
-                                ],
-                                [
-                                    -99.242801,
-                                    26.579723
-                                ],
-                                [
-                                    -99.254575,
-                                    26.6018
-                                ],
-                                [
-                                    -99.258844,
-                                    26.614752
-                                ],
-                                [
-                                    -99.277683,
-                                    26.638007
-                                ],
-                                [
-                                    -99.281951,
-                                    26.649781
-                                ],
-                                [
-                                    -99.277389,
-                                    26.657729
-                                ],
-                                [
-                                    -99.26635,
-                                    26.653314
-                                ],
-                                [
-                                    -99.252662,
-                                    26.644483
-                                ],
-                                [
-                                    -99.240299,
-                                    26.639184
-                                ],
-                                [
-                                    -99.244861,
-                                    26.652431
-                                ],
-                                [
-                                    -99.240299,
-                                    26.697763
-                                ],
-                                [
-                                    -99.242507,
-                                    26.713658
-                                ],
-                                [
-                                    -99.252368,
-                                    26.743683
-                                ],
-                                [
-                                    -99.254575,
-                                    26.75899
-                                ],
-                                [
-                                    -99.252368,
-                                    26.799024
-                                ],
-                                [
-                                    -99.254575,
-                                    26.810504
-                                ],
-                                [
-                                    -99.257666,
-                                    26.813153
-                                ],
-                                [
-                                    -99.262229,
-                                    26.814036
-                                ],
-                                [
-                                    -99.266497,
-                                    26.817863
-                                ],
-                                [
-                                    -99.268263,
-                                    26.827872
-                                ],
-                                [
-                                    -99.271649,
-                                    26.832876
-                                ],
-                                [
-                                    -99.289458,
-                                    26.84465
-                                ],
-                                [
-                                    -99.308444,
-                                    26.830521
-                                ],
-                                [
-                                    -99.316539,
-                                    26.822279
-                                ],
-                                [
-                                    -99.323457,
-                                    26.810504
-                                ],
-                                [
-                                    -99.328166,
-                                    26.797258
-                                ],
-                                [
-                                    -99.329197,
-                                    26.789016
-                                ],
-                                [
-                                    -99.331699,
-                                    26.78254
-                                ],
-                                [
-                                    -99.340383,
-                                    26.77312
-                                ],
-                                [
-                                    -99.366728,
-                                    26.761345
-                                ],
-                                [
-                                    -99.380269,
-                                    26.777241
-                                ],
-                                [
-                                    -99.391896,
-                                    26.796963
-                                ],
-                                [
-                                    -99.412207,
-                                    26.796963
-                                ],
-                                [
-                                    -99.410883,
-                                    26.808149
-                                ],
-                                [
-                                    -99.405437,
-                                    26.818452
-                                ],
-                                [
-                                    -99.396606,
-                                    26.824928
-                                ],
-                                [
-                                    -99.384979,
-                                    26.824928
-                                ],
-                                [
-                                    -99.377178,
-                                    26.816686
-                                ],
-                                [
-                                    -99.374823,
-                                    26.804028
-                                ],
-                                [
-                                    -99.374234,
-                                    26.791076
-                                ],
-                                [
-                                    -99.371291,
-                                    26.783128
-                                ],
-                                [
-                                    -99.360694,
-                                    26.780479
-                                ],
-                                [
-                                    -99.359369,
-                                    26.790487
-                                ],
-                                [
-                                    -99.36452,
-                                    26.810504
-                                ],
-                                [
-                                    -99.357897,
-                                    26.822279
-                                ],
-                                [
-                                    -99.351274,
-                                    26.83111
-                                ],
-                                [
-                                    -99.346123,
-                                    26.840824
-                                ],
-                                [
-                                    -99.344062,
-                                    26.855247
-                                ],
-                                [
-                                    -99.348772,
-                                    26.899696
-                                ],
-                                [
-                                    -99.355101,
-                                    26.920302
-                                ],
-                                [
-                                    -99.36452,
-                                    26.934726
-                                ],
-                                [
-                                    -99.403377,
-                                    26.952093
-                                ],
-                                [
-                                    -99.413974,
-                                    26.964162
-                                ],
-                                [
-                                    -99.401758,
-                                    26.985651
-                                ],
-                                [
-                                    -99.399991,
-                                    26.999192
-                                ],
-                                [
-                                    -99.418831,
-                                    27.007728
-                                ],
-                                [
-                                    -99.441938,
-                                    27.013615
-                                ],
-                                [
-                                    -99.453271,
-                                    27.019797
-                                ],
-                                [
-                                    -99.455332,
-                                    27.025979
-                                ],
-                                [
-                                    -99.464751,
-                                    27.039225
-                                ],
-                                [
-                                    -99.466959,
-                                    27.047467
-                                ],
-                                [
-                                    -99.462544,
-                                    27.057181
-                                ],
-                                [
-                                    -99.461635,
-                                    27.056839
-                                ],
-                                [
-                                    -99.461728,
-                                    27.056954
-                                ],
-                                [
-                                    -99.442039,
-                                    27.089614
-                                ],
-                                [
-                                    -99.439404,
-                                    27.098347
-                                ],
-                                [
-                                    -99.441419,
-                                    27.107494
-                                ],
-                                [
-                                    -99.445734,
-                                    27.114728
-                                ],
-                                [
-                                    -99.450178,
-                                    27.120465
-                                ],
-                                [
-                                    -99.452452,
-                                    27.125012
-                                ],
-                                [
-                                    -99.450333,
-                                    27.145166
-                                ],
-                                [
-                                    -99.435786,
-                                    27.188419
-                                ],
-                                [
-                                    -99.431988,
-                                    27.207591
-                                ],
-                                [
-                                    -99.434029,
-                                    27.22697
-                                ],
-                                [
-                                    -99.440902,
-                                    27.244798
-                                ],
-                                [
-                                    -99.451832,
-                                    27.26118
-                                ],
-                                [
-                                    -99.46612,
-                                    27.276527
-                                ],
-                                [
-                                    -99.468963,
-                                    27.278233
-                                ],
-                                [
-                                    -99.480409,
-                                    27.283297
-                                ],
-                                [
-                                    -99.482941,
-                                    27.286708
-                                ],
-                                [
-                                    -99.484879,
-                                    27.294821
-                                ],
-                                [
-                                    -99.486584,
-                                    27.297611
-                                ],
-                                [
-                                    -99.493199,
-                                    27.30128
-                                ],
-                                [
-                                    -99.521362,
-                                    27.311254
-                                ],
-                                [
-                                    -99.5148,
-                                    27.321796
-                                ],
-                                [
-                                    -99.497591,
-                                    27.338798
-                                ],
-                                [
-                                    -99.494026,
-                                    27.348203
-                                ],
-                                [
-                                    -99.492889,
-                                    27.358848
-                                ],
-                                [
-                                    -99.487721,
-                                    27.37187
-                                ],
-                                [
-                                    -99.484621,
-                                    27.391766
-                                ],
-                                [
-                                    -99.475706,
-                                    27.414762
-                                ],
-                                [
-                                    -99.472916,
-                                    27.426647
-                                ],
-                                [
-                                    -99.473639,
-                                    27.463803
-                                ],
-                                [
-                                    -99.472916,
-                                    27.468299
-                                ],
-                                [
-                                    -99.47643,
-                                    27.48251
-                                ],
-                                [
-                                    -99.480409,
-                                    27.490778
-                                ],
-                                [
-                                    -99.48829,
-                                    27.494654
-                                ],
-                                [
-                                    -99.503689,
-                                    27.495584
-                                ],
-                                [
-                                    -99.509503,
-                                    27.500028
-                                ],
-                                [
-                                    -99.510071,
-                                    27.510518
-                                ],
-                                [
-                                    -99.507074,
-                                    27.533437
-                                ],
-                                [
-                                    -99.507203,
-                                    27.57377
-                                ],
-                                [
-                                    -99.515006,
-                                    27.588601
-                                ],
-                                [
-                                    -99.535031,
-                                    27.604828
-                                ],
-                                [
-                                    -99.55503,
-                                    27.613509
-                                ],
-                                [
-                                    -99.572264,
-                                    27.61847
-                                ],
-                                [
-                                    -99.578232,
-                                    27.622811
-                                ],
-                                [
-                                    -99.590247,
-                                    27.642061
-                                ],
-                                [
-                                    -99.600169,
-                                    27.646427
-                                ],
-                                [
-                                    -99.612442,
-                                    27.643637
-                                ],
-                                [
-                                    -99.633526,
-                                    27.633069
-                                ],
-                                [
-                                    -99.644869,
-                                    27.632733
-                                ],
-                                [
-                                    -99.648642,
-                                    27.636919
-                                ],
-                                [
-                                    -99.658693,
-                                    27.654024
-                                ],
-                                [
-                                    -99.664739,
-                                    27.659398
-                                ],
-                                [
-                                    -99.70037,
-                                    27.659191
-                                ],
-                                [
-                                    -99.705692,
-                                    27.66317
-                                ],
-                                [
-                                    -99.710674,
-                                    27.670116
-                                ],
-                                [
-                                    -99.723056,
-                                    27.687381
-                                ],
-                                [
-                                    -99.730652,
-                                    27.691825
-                                ],
-                                [
-                                    -99.734037,
-                                    27.702031
-                                ],
-                                [
-                                    -99.736311,
-                                    27.713607
-                                ],
-                                [
-                                    -99.740445,
-                                    27.722159
-                                ],
-                                [
-                                    -99.747344,
-                                    27.726009
-                                ],
-                                [
-                                    -99.765198,
-                                    27.731177
-                                ],
-                                [
-                                    -99.774577,
-                                    27.735828
-                                ],
-                                [
-                                    -99.78685,
-                                    27.748488
-                                ],
-                                [
-                                    -99.795428,
-                                    27.761924
-                                ],
-                                [
-                                    -99.806963,
-                                    27.771423
-                                ],
-                                [
-                                    -99.808167,
-                                    27.772414
-                                ],
-                                [
-                                    -99.83292,
-                                    27.776755
-                                ],
-                                [
-                                    -99.832971,
-                                    27.782181
-                                ],
-                                [
-                                    -99.844779,
-                                    27.793576
-                                ],
-                                [
-                                    -99.858241,
-                                    27.803524
-                                ],
-                                [
-                                    -99.863357,
-                                    27.804661
-                                ],
-                                [
-                                    -99.864727,
-                                    27.814324
-                                ],
-                                [
-                                    -99.861858,
-                                    27.83608
-                                ],
-                                [
-                                    -99.863357,
-                                    27.845666
-                                ],
-                                [
-                                    -99.870928,
-                                    27.854477
-                                ],
-                                [
-                                    -99.880204,
-                                    27.859231
-                                ],
-                                [
-                                    -99.888007,
-                                    27.864812
-                                ],
-                                [
-                                    -99.891288,
-                                    27.876026
-                                ],
-                                [
-                                    -99.882684,
-                                    27.89158
-                                ],
-                                [
-                                    -99.878808,
-                                    27.901838
-                                ],
-                                [
-                                    -99.88134,
-                                    27.906463
-                                ],
-                                [
-                                    -99.896766,
-                                    27.912923
-                                ],
-                                [
-                                    -99.914336,
-                                    27.928245
-                                ],
-                                [
-                                    -99.929916,
-                                    27.946331
-                                ],
-                                [
-                                    -99.939683,
-                                    27.961085
-                                ],
-                                [
-                                    -99.928289,
-                                    27.975761
-                                ],
-                                [
-                                    -99.940717,
-                                    27.983254
-                                ],
-                                [
-                                    -99.961852,
-                                    27.987492
-                                ],
-                                [
-                                    -99.976606,
-                                    27.992453
-                                ],
-                                [
-                                    -99.991127,
-                                    28.007801
-                                ],
-                                [
-                                    -100.000584,
-                                    28.02041
-                                ],
-                                [
-                                    -100.007457,
-                                    28.033561
-                                ],
-                                [
-                                    -100.014123,
-                                    28.050459
-                                ],
-                                [
-                                    -100.013503,
-                                    28.056971
-                                ],
-                                [
-                                    -100.010506,
-                                    28.063611
-                                ],
-                                [
-                                    -100.010196,
-                                    28.068882
-                                ],
-                                [
-                                    -100.017585,
-                                    28.070949
-                                ],
-                                [
-                                    -100.031538,
-                                    28.081801
-                                ],
-                                [
-                                    -100.045077,
-                                    28.095289
-                                ],
-                                [
-                                    -100.048023,
-                                    28.102523
-                                ],
-                                [
-                                    -100.048901,
-                                    28.115959
-                                ],
-                                [
-                                    -100.056498,
-                                    28.137922
-                                ],
-                                [
-                                    -100.074895,
-                                    28.154407
-                                ],
-                                [
-                                    -100.172873,
-                                    28.198538
-                                ],
-                                [
-                                    -100.189203,
-                                    28.201329
-                                ],
-                                [
-                                    -100.197626,
-                                    28.207168
-                                ],
-                                [
-                                    -100.201192,
-                                    28.220346
-                                ],
-                                [
-                                    -100.202949,
-                                    28.234428
-                                ],
-                                [
-                                    -100.205946,
-                                    28.242877
-                                ],
-                                [
-                                    -100.212819,
-                                    28.245073
-                                ],
-                                [
-                                    -100.240724,
-                                    28.249698
-                                ],
-                                [
-                                    -100.257932,
-                                    28.260524
-                                ],
-                                [
-                                    -100.275089,
-                                    28.277242
-                                ],
-                                [
-                                    -100.284339,
-                                    28.296517
-                                ],
-                                [
-                                    -100.277931,
-                                    28.314888
-                                ],
-                                [
-                                    -100.278551,
-                                    28.331088
-                                ],
-                                [
-                                    -100.293899,
-                                    28.353413
-                                ],
-                                [
-                                    -100.322631,
-                                    28.386899
-                                ],
-                                [
-                                    -100.331675,
-                                    28.422013
-                                ],
-                                [
-                                    -100.336326,
-                                    28.458574
-                                ],
-                                [
-                                    -100.340201,
-                                    28.464259
-                                ],
-                                [
-                                    -100.348315,
-                                    28.470253
-                                ],
-                                [
-                                    -100.355549,
-                                    28.478185
-                                ],
-                                [
-                                    -100.35679,
-                                    28.489322
-                                ],
-                                [
-                                    -100.351622,
-                                    28.496711
-                                ],
-                                [
-                                    -100.322631,
-                                    28.510406
-                                ],
-                                [
-                                    -100.364024,
-                                    28.524797
-                                ],
-                                [
-                                    -100.38423,
-                                    28.537174
-                                ],
-                                [
-                                    -100.397769,
-                                    28.557586
-                                ],
-                                [
-                                    -100.398751,
-                                    28.568645
-                                ],
-                                [
-                                    -100.397097,
-                                    28.592726
-                                ],
-                                [
-                                    -100.401438,
-                                    28.60226
-                                ],
-                                [
-                                    -100.411463,
-                                    28.609314
-                                ],
-                                [
-                                    -100.434821,
-                                    28.619133
-                                ],
-                                [
-                                    -100.44619,
-                                    28.626497
-                                ],
-                                [
-                                    -100.444898,
-                                    28.643782
-                                ],
-                                [
-                                    -100.481381,
-                                    28.686054
-                                ],
-                                [
-                                    -100.493939,
-                                    28.708378
-                                ],
-                                [
-                                    -100.519054,
-                                    28.804961
-                                ],
-                                [
-                                    -100.524996,
-                                    28.814831
-                                ],
-                                [
-                                    -100.529285,
-                                    28.819947
-                                ],
-                                [
-                                    -100.534453,
-                                    28.830231
-                                ],
-                                [
-                                    -100.538639,
-                                    28.835631
-                                ],
-                                [
-                                    -100.54515,
-                                    28.83899
-                                ],
-                                [
-                                    -100.559671,
-                                    28.839378
-                                ],
-                                [
-                                    -100.566234,
-                                    28.842504
-                                ],
-                                [
-                                    -100.569696,
-                                    28.84961
-                                ],
-                                [
-                                    -100.56334,
-                                    28.86209
-                                ],
-                                [
-                                    -100.566234,
-                                    28.869789
-                                ],
-                                [
-                                    -100.571763,
-                                    28.8732
-                                ],
-                                [
-                                    -100.586543,
-                                    28.879789
-                                ],
-                                [
-                                    -100.58954,
-                                    28.883458
-                                ],
-                                [
-                                    -100.594966,
-                                    28.899322
-                                ],
-                                [
-                                    -100.606955,
-                                    28.910123
-                                ],
-                                [
-                                    -100.618841,
-                                    28.917926
-                                ],
-                                [
-                                    -100.624318,
-                                    28.924721
-                                ],
-                                [
-                                    -100.624783,
-                                    28.93777
-                                ],
-                                [
-                                    -100.626696,
-                                    28.948338
-                                ],
-                                [
-                                    -100.630778,
-                                    28.956683
-                                ],
-                                [
-                                    -100.637909,
-                                    28.962884
-                                ],
-                                [
-                                    -100.628918,
-                                    28.98433
-                                ],
-                                [
-                                    -100.632793,
-                                    29.005156
-                                ],
-                                [
-                                    -100.652224,
-                                    29.044817
-                                ],
-                                [
-                                    -100.660854,
-                                    29.102669
-                                ],
-                                [
-                                    -100.668967,
-                                    29.116208
-                                ],
-                                [
-                                    -100.678165,
-                                    29.119412
-                                ],
-                                [
-                                    -100.690826,
-                                    29.121014
-                                ],
-                                [
-                                    -100.70204,
-                                    29.12365
-                                ],
-                                [
-                                    -100.706846,
-                                    29.130187
-                                ],
-                                [
-                                    -100.70974,
-                                    29.135561
-                                ],
-                                [
-                                    -100.762501,
-                                    29.173776
-                                ],
-                                [
-                                    -100.770098,
-                                    29.187289
-                                ],
-                                [
-                                    -100.762088,
-                                    29.208658
-                                ],
-                                [
-                                    -100.783172,
-                                    29.243074
-                                ],
-                                [
-                                    -100.796143,
-                                    29.257673
-                                ],
-                                [
-                                    -100.81609,
-                                    29.270773
-                                ],
-                                [
-                                    -100.86389,
-                                    29.290616
-                                ],
-                                [
-                                    -100.871797,
-                                    29.296456
-                                ],
-                                [
-                                    -100.891227,
-                                    29.318547
-                                ],
-                                [
-                                    -100.91474,
-                                    29.337048
-                                ],
-                                [
-                                    -100.987397,
-                                    29.366322
-                                ],
-                                [
-                                    -100.998301,
-                                    29.372472
-                                ],
-                                [
-                                    -101.008068,
-                                    29.380585
-                                ],
-                                [
-                                    -101.016232,
-                                    29.390068
-                                ],
-                                [
-                                    -101.022175,
-                                    29.40048
-                                ],
-                                [
-                                    -101.025948,
-                                    29.414356
-                                ],
-                                [
-                                    -101.029617,
-                                    29.442984
-                                ],
-                                [
-                                    -101.037782,
-                                    29.460063
-                                ],
-                                [
-                                    -101.039026,
-                                    29.460452
-                                ],
-                                [
-                                    -101.040188,
-                                    29.457132
-                                ],
-                                [
-                                    -101.045487,
-                                    29.451245
-                                ],
-                                [
-                                    -101.060205,
-                                    29.449184
-                                ],
-                                [
-                                    -101.067711,
-                                    29.45095
-                                ],
-                                [
-                                    -101.076101,
-                                    29.453894
-                                ],
-                                [
-                                    -101.085962,
-                                    29.454483
-                                ],
-                                [
-                                    -101.098031,
-                                    29.449184
-                                ],
-                                [
-                                    -101.113043,
-                                    29.466552
-                                ],
-                                [
-                                    -101.142774,
-                                    29.475383
-                                ],
-                                [
-                                    -101.174124,
-                                    29.475971
-                                ],
-                                [
-                                    -101.193699,
-                                    29.469495
-                                ],
-                                [
-                                    -101.198703,
-                                    29.473911
-                                ],
-                                [
-                                    -101.198851,
-                                    29.476854
-                                ],
-                                [
-                                    -101.184132,
-                                    29.497754
-                                ],
-                                [
-                                    -101.184868,
-                                    29.512767
-                                ],
-                                [
-                                    -101.195171,
-                                    29.521892
-                                ],
-                                [
-                                    -101.214157,
-                                    29.518065
-                                ],
-                                [
-                                    -101.245213,
-                                    29.493044
-                                ],
-                                [
-                                    -101.265818,
-                                    29.487157
-                                ],
-                                [
-                                    -101.290545,
-                                    29.49746
-                                ],
-                                [
-                                    -101.297315,
-                                    29.503936
-                                ],
-                                [
-                                    -101.300995,
-                                    29.512767
-                                ],
-                                [
-                                    -101.294372,
-                                    29.520715
-                                ],
-                                [
-                                    -101.273177,
-                                    29.524247
-                                ],
-                                [
-                                    -101.259195,
-                                    29.533372
-                                ],
-                                [
-                                    -101.243888,
-                                    29.554861
-                                ],
-                                [
-                                    -101.231966,
-                                    29.580176
-                                ],
-                                [
-                                    -101.227845,
-                                    29.599899
-                                ],
-                                [
-                                    -101.239178,
-                                    29.616677
-                                ],
-                                [
-                                    -101.26052,
-                                    29.613439
-                                ],
-                                [
-                                    -101.281272,
-                                    29.597249
-                                ],
-                                [
-                                    -101.290545,
-                                    29.575761
-                                ],
-                                [
-                                    -101.295255,
-                                    29.570168
-                                ],
-                                [
-                                    -101.306146,
-                                    29.574583
-                                ],
-                                [
-                                    -101.317626,
-                                    29.584003
-                                ],
-                                [
-                                    -101.323955,
-                                    29.592539
-                                ],
-                                [
-                                    -101.323661,
-                                    29.603137
-                                ],
-                                [
-                                    -101.318804,
-                                    29.616383
-                                ],
-                                [
-                                    -101.311445,
-                                    29.628158
-                                ],
-                                [
-                                    -101.303497,
-                                    29.634045
-                                ],
-                                [
-                                    -101.303669,
-                                    29.631411
-                                ],
-                                [
-                                    -101.302727,
-                                    29.633851
-                                ],
-                                [
-                                    -101.301073,
-                                    29.649509
-                                ],
-                                [
-                                    -101.30978,
-                                    29.654548
-                                ],
-                                [
-                                    -101.336239,
-                                    29.654315
-                                ],
-                                [
-                                    -101.349029,
-                                    29.660103
-                                ],
-                                [
-                                    -101.357684,
-                                    29.667441
-                                ],
-                                [
-                                    -101.364351,
-                                    29.676665
-                                ],
-                                [
-                                    -101.376624,
-                                    29.700643
-                                ],
-                                [
-                                    -101.383368,
-                                    29.718497
-                                ],
-                                [
-                                    -101.39962,
-                                    29.740718
-                                ],
-                                [
-                                    -101.406545,
-                                    29.752888
-                                ],
-                                [
-                                    -101.409309,
-                                    29.765781
-                                ],
-                                [
-                                    -101.405098,
-                                    29.778442
-                                ],
-                                [
-                                    -101.414012,
-                                    29.774411
-                                ],
-                                [
-                                    -101.424218,
-                                    29.771414
-                                ],
-                                [
-                                    -101.435096,
-                                    29.770122
-                                ],
-                                [
-                                    -101.446103,
-                                    29.771052
-                                ],
-                                [
-                                    -101.455689,
-                                    29.77591
-                                ],
-                                [
-                                    -101.462433,
-                                    29.788932
-                                ],
-                                [
-                                    -101.470908,
-                                    29.791516
-                                ],
-                                [
-                                    -101.490286,
-                                    29.785547
-                                ],
-                                [
-                                    -101.505763,
-                                    29.773894
-                                ],
-                                [
-                                    -101.521809,
-                                    29.765936
-                                ],
-                                [
-                                    -101.542893,
-                                    29.771052
-                                ],
-                                [
-                                    -101.539689,
-                                    29.779191
-                                ],
-                                [
-                                    -101.530516,
-                                    29.796477
-                                ],
-                                [
-                                    -101.528604,
-                                    29.801438
-                                ],
-                                [
-                                    -101.531912,
-                                    29.811101
-                                ],
-                                [
-                                    -101.539172,
-                                    29.817974
-                                ],
-                                [
-                                    -101.546458,
-                                    29.820145
-                                ],
-                                [
-                                    -101.549766,
-                                    29.815701
-                                ],
-                                [
-                                    -101.553977,
-                                    29.796684
-                                ],
-                                [
-                                    -101.564907,
-                                    29.786478
-                                ],
-                                [
-                                    -101.580281,
-                                    29.781568
-                                ],
-                                [
-                                    -101.632216,
-                                    29.775651
-                                ],
-                                [
-                                    -101.794531,
-                                    29.795857
-                                ],
-                                [
-                                    -101.80298,
-                                    29.801438
-                                ],
-                                [
-                                    -101.805978,
-                                    29.811928
-                                ],
-                                [
-                                    -101.812695,
-                                    29.812032
-                                ],
-                                [
-                                    -101.82409,
-                                    29.805184
-                                ],
-                                [
-                                    -101.857602,
-                                    29.805184
-                                ],
-                                [
-                                    -101.877524,
-                                    29.810843
-                                ],
-                                [
-                                    -101.88742,
-                                    29.81229
-                                ],
-                                [
-                                    -101.895455,
-                                    29.808621
-                                ],
-                                [
-                                    -101.90238,
-                                    29.803247
-                                ],
-                                [
-                                    -101.910881,
-                                    29.799888
-                                ],
-                                [
-                                    -101.920157,
-                                    29.798182
-                                ],
-                                [
-                                    -101.929613,
-                                    29.797717
-                                ],
-                                [
-                                    -101.942662,
-                                    29.803608
-                                ],
-                                [
-                                    -101.957054,
-                                    29.814047
-                                ],
-                                [
-                                    -101.972246,
-                                    29.818181
-                                ],
-                                [
-                                    -101.98793,
-                                    29.805184
-                                ],
-                                [
-                                    -102.014595,
-                                    29.810998
-                                ],
-                                [
-                                    -102.109344,
-                                    29.80211
-                                ],
-                                [
-                                    -102.145647,
-                                    29.815701
-                                ],
-                                [
-                                    -102.157248,
-                                    29.824537
-                                ],
-                                [
-                                    -102.203679,
-                                    29.846138
-                                ],
-                                [
-                                    -102.239775,
-                                    29.849135
-                                ],
-                                [
-                                    -102.253444,
-                                    29.855285
-                                ],
-                                [
-                                    -102.258276,
-                                    29.873475
-                                ],
-                                [
-                                    -102.276181,
-                                    29.869547
-                                ],
-                                [
-                                    -102.289023,
-                                    29.878126
-                                ],
-                                [
-                                    -102.302175,
-                                    29.889391
-                                ],
-                                [
-                                    -102.321011,
-                                    29.893939
-                                ],
-                                [
-                                    -102.330235,
-                                    29.888926
-                                ],
-                                [
-                                    -102.339769,
-                                    29.870633
-                                ],
-                                [
-                                    -102.351061,
-                                    29.866602
-                                ],
-                                [
-                                    -102.36323,
-                                    29.864276
-                                ],
-                                [
-                                    -102.370723,
-                                    29.857765
-                                ],
-                                [
-                                    -102.374547,
-                                    29.848102
-                                ],
-                                [
-                                    -102.376589,
-                                    29.821488
-                                ],
-                                [
-                                    -102.380051,
-                                    29.811386
-                                ],
-                                [
-                                    -102.404132,
-                                    29.780793
-                                ],
-                                [
-                                    -102.406096,
-                                    29.777279
-                                ],
-                                [
-                                    -102.515288,
-                                    29.784721
-                                ],
-                                [
-                                    -102.523066,
-                                    29.782318
-                                ],
-                                [
-                                    -102.531127,
-                                    29.769915
-                                ],
-                                [
-                                    -102.54154,
-                                    29.762474
-                                ],
-                                [
-                                    -102.543349,
-                                    29.760123
-                                ],
-                                [
-                                    -102.546578,
-                                    29.757875
-                                ],
-                                [
-                                    -102.553141,
-                                    29.756738
-                                ],
-                                [
-                                    -102.558309,
-                                    29.759089
-                                ],
-                                [
-                                    -102.562882,
-                                    29.769347
-                                ],
-                                [
-                                    -102.566758,
-                                    29.771052
-                                ],
-                                [
-                                    -102.58531,
-                                    29.764696
-                                ],
-                                [
-                                    -102.621225,
-                                    29.747281
-                                ],
-                                [
-                                    -102.638743,
-                                    29.743715
-                                ],
-                                [
-                                    -102.676054,
-                                    29.74449
-                                ],
-                                [
-                                    -102.683469,
-                                    29.743715
-                                ],
-                                [
-                                    -102.69104,
-                                    29.736817
-                                ],
-                                [
-                                    -102.693624,
-                                    29.729401
-                                ],
-                                [
-                                    -102.694709,
-                                    29.720616
-                                ],
-                                [
-                                    -102.697758,
-                                    29.709557
-                                ],
-                                [
-                                    -102.726748,
-                                    29.664495
-                                ],
-                                [
-                                    -102.73127,
-                                    29.650594
-                                ],
-                                [
-                                    -102.735507,
-                                    29.649509
-                                ],
-                                [
-                                    -102.751656,
-                                    29.622457
-                                ],
-                                [
-                                    -102.75176,
-                                    29.620157
-                                ],
-                                [
-                                    -102.761346,
-                                    29.603414
-                                ],
-                                [
-                                    -102.767598,
-                                    29.59729
-                                ],
-                                [
-                                    -102.779665,
-                                    29.592303
-                                ],
-                                [
-                                    -102.774084,
-                                    29.579617
-                                ],
-                                [
-                                    -102.776461,
-                                    29.575948
-                                ],
-                                [
-                                    -102.785892,
-                                    29.571814
-                                ],
-                                [
-                                    -102.78075,
-                                    29.558249
-                                ],
-                                [
-                                    -102.786512,
-                                    29.550497
-                                ],
-                                [
-                                    -102.795478,
-                                    29.54427
-                                ],
-                                [
-                                    -102.827311,
-                                    29.470502
-                                ],
-                                [
-                                    -102.833951,
-                                    29.461355
-                                ],
-                                [
-                                    -102.839067,
-                                    29.45195
-                                ],
-                                [
-                                    -102.841134,
-                                    29.438308
-                                ],
-                                [
-                                    -102.838705,
-                                    29.426939
-                                ],
-                                [
-                                    -102.834984,
-                                    29.415699
-                                ],
-                                [
-                                    -102.835191,
-                                    29.403839
-                                ],
-                                [
-                                    -102.844545,
-                                    29.390533
-                                ],
-                                [
-                                    -102.845578,
-                                    29.384719
-                                ],
-                                [
-                                    -102.838033,
-                                    29.370534
-                                ],
-                                [
-                                    -102.837672,
-                                    29.366322
-                                ],
-                                [
-                                    -102.84656,
-                                    29.361749
-                                ],
-                                [
-                                    -102.853872,
-                                    29.361
-                                ],
-                                [
-                                    -102.859867,
-                                    29.361155
-                                ],
-                                [
-                                    -102.864957,
-                                    29.359527
-                                ],
-                                [
-                                    -102.876972,
-                                    29.350871
-                                ],
-                                [
-                                    -102.883069,
-                                    29.343766
-                                ],
-                                [
-                                    -102.885188,
-                                    29.333379
-                                ],
-                                [
-                                    -102.885498,
-                                    29.314801
-                                ],
-                                [
-                                    -102.899399,
-                                    29.276095
-                                ],
-                                [
-                                    -102.899709,
-                                    29.2639
-                                ],
-                                [
-                                    -102.892139,
-                                    29.254391
-                                ],
-                                [
-                                    -102.867954,
-                                    29.240387
-                                ],
-                                [
-                                    -102.858781,
-                                    29.229147
-                                ],
-                                [
-                                    -102.869866,
-                                    29.224781
-                                ],
-                                [
-                                    -102.896893,
-                                    29.220285
-                                ],
-                                [
-                                    -102.942265,
-                                    29.190209
-                                ],
-                                [
-                                    -102.947536,
-                                    29.182018
-                                ],
-                                [
-                                    -102.969757,
-                                    29.192845
-                                ],
-                                [
-                                    -102.988386,
-                                    29.177135
-                                ],
-                                [
-                                    -103.015826,
-                                    29.126776
-                                ],
-                                [
-                                    -103.024275,
-                                    29.116157
-                                ],
-                                [
-                                    -103.032621,
-                                    29.110214
-                                ],
-                                [
-                                    -103.072541,
-                                    29.091404
-                                ],
-                                [
-                                    -103.080758,
-                                    29.085203
-                                ],
-                                [
-                                    -103.085589,
-                                    29.07572
-                                ],
-                                [
-                                    -103.091532,
-                                    29.057866
-                                ],
-                                [
-                                    -103.095356,
-                                    29.060294
-                                ],
-                                [
-                                    -103.104684,
-                                    29.057866
-                                ],
-                                [
-                                    -103.109205,
-                                    29.023372
-                                ],
-                                [
-                                    -103.122771,
-                                    28.996474
-                                ],
-                                [
-                                    -103.147989,
-                                    28.985105
-                                ],
-                                [
-                                    -103.187108,
-                                    28.990221
-                                ],
-                                [
-                                    -103.241756,
-                                    29.003502
-                                ],
-                                [
-                                    -103.301545,
-                                    29.002365
-                                ],
-                                [
-                                    -103.316247,
-                                    29.010065
-                                ],
-                                [
-                                    -103.311514,
-                                    29.026043
-                                ],
-                                [
-                                    -103.309994,
-                                    29.031175
-                                ],
-                                [
-                                    -103.3248,
-                                    29.026808
-                                ],
-                                [
-                                    -103.330484,
-                                    29.023733
-                                ],
-                                [
-                                    -103.342602,
-                                    29.041226
-                                ],
-                                [
-                                    -103.351671,
-                                    29.039417
-                                ],
-                                [
-                                    -103.360534,
-                                    29.029831
-                                ],
-                                [
-                                    -103.372083,
-                                    29.023733
-                                ],
-                                [
-                                    -103.38663,
-                                    29.028798
-                                ],
-                                [
-                                    -103.414639,
-                                    29.052414
-                                ],
-                                [
-                                    -103.423605,
-                                    29.057866
-                                ],
-                                [
-                                    -103.435697,
-                                    29.061121
-                                ],
-                                [
-                                    -103.478537,
-                                    29.08205
-                                ],
-                                [
-                                    -103.529748,
-                                    29.126776
-                                ],
-                                [
-                                    -103.535588,
-                                    29.135122
-                                ],
-                                [
-                                    -103.538223,
-                                    29.142408
-                                ],
-                                [
-                                    -103.541711,
-                                    29.148816
-                                ],
-                                [
-                                    -103.550238,
-                                    29.154656
-                                ],
-                                [
-                                    -103.558015,
-                                    29.156206
-                                ],
-                                [
-                                    -103.58499,
-                                    29.154656
-                                ],
-                                [
-                                    -103.673125,
-                                    29.173569
-                                ],
-                                [
-                                    -103.702477,
-                                    29.187858
-                                ],
-                                [
-                                    -103.749476,
-                                    29.222972
-                                ],
-                                [
-                                    -103.759062,
-                                    29.226848
-                                ],
-                                [
-                                    -103.770767,
-                                    29.229845
-                                ],
-                                [
-                                    -103.777718,
-                                    29.235297
-                                ],
-                                [
-                                    -103.769424,
-                                    29.257543
-                                ],
-                                [
-                                    -103.774229,
-                                    29.267517
-                                ],
-                                [
-                                    -103.78366,
-                                    29.274803
-                                ],
-                                [
-                                    -103.794177,
-                                    29.277594
-                                ],
-                                [
-                                    -103.837038,
-                                    29.279906
-                                ]
-                            ]
-                        ],
-                        [
-                            [
-                                [
-                                    178.301106,
-                                    52.056551
-                                ],
-                                [
-                                    179.595462,
-                                    52.142083
-                                ],
-                                [
-                                    179.825447,
-                                    51.992849
-                                ],
-                                [
-                                    179.661729,
-                                    51.485763
-                                ],
-                                [
-                                    179.723231,
-                                    51.459963
-                                ],
-                                [
-                                    179.408066,
-                                    51.209841
-                                ],
-                                [
-                                    178.411463,
-                                    51.523605
-                                ],
-                                [
-                                    177.698335,
-                                    51.877899
-                                ],
-                                [
-                                    177.16784,
-                                    51.581866
-                                ],
-                                [
-                                    176.487008,
-                                    52.175325
-                                ],
-                                [
-                                    174.484678,
-                                    52.08716
-                                ],
-                                [
-                                    172.866263,
-                                    52.207379
-                                ],
-                                [
-                                    172.825506,
-                                    52.716846
-                                ],
-                                [
-                                    172.747012,
-                                    52.654022
-                                ],
-                                [
-                                    172.08261,
-                                    52.952695
-                                ],
-                                [
-                                    172.942925,
-                                    53.183013
-                                ],
-                                [
-                                    173.029416,
-                                    52.993628
-                                ],
-                                [
-                                    173.127208,
-                                    52.99494
-                                ],
-                                [
-                                    173.143321,
-                                    52.990383
-                                ],
-                                [
-                                    173.175059,
-                                    52.971747
-                                ],
-                                [
-                                    173.182932,
-                                    52.968373
-                                ],
-                                [
-                                    176.45233,
-                                    52.628178
-                                ],
-                                [
-                                    176.468135,
-                                    52.488358
-                                ],
-                                [
-                                    177.900385,
-                                    52.488358
-                                ],
-                                [
-                                    178.007601,
-                                    52.179677
-                                ],
-                                [
-                                    178.301106,
-                                    52.056551
-                                ]
-                            ]
-                        ],
-                        [
-                            [
-                                [
-                                    -168.899607,
-                                    65.747626
-                                ],
-                                [
-                                    -168.909861,
-                                    65.739569
-                                ],
-                                [
-                                    -168.926218,
-                                    65.739895
-                                ],
-                                [
-                                    -168.942128,
-                                    65.74372
-                                ],
-                                [
-                                    -168.951731,
-                                    65.75316
-                                ],
-                                [
-                                    -168.942983,
-                                    65.764716
-                                ],
-                                [
-                                    -168.920115,
-                                    65.768866
-                                ],
-                                [
-                                    -168.907908,
-                                    65.768297
-                                ],
-                                [
-                                    -168.902781,
-                                    65.761542
-                                ],
-                                [
-                                    -168.899607,
-                                    65.747626
-                                ]
-                            ]
-                        ],
-                        [
-                            [
-                                [
-                                    -131.160718,
-                                    54.787192
-                                ],
-                                [
-                                    -132.853508,
-                                    54.482536
-                                ],
-                                [
-                                    -134.77719,
-                                    54.717786
-                                ],
-                                [
-                                    -142.6966,
-                                    55.845503
-                                ],
-                                [
-                                    -142.861997,
-                                    49.948308
-                                ],
-                                [
-                                    -155.675916,
-                                    51.109976
-                                ],
-                                [
-                                    -164.492732,
-                                    50.603976
-                                ],
-                                [
-                                    -164.691217,
-                                    50.997975
-                                ],
-                                [
-                                    -171.246993,
-                                    49.948308
-                                ],
-                                [
-                                    -171.215436,
-                                    50.576636
-                                ],
-                                [
-                                    -173.341669,
-                                    50.968826
-                                ],
-                                [
-                                    -173.362022,
-                                    51.082198
-                                ],
-                                [
-                                    -177.799603,
-                                    51.272899
-                                ],
-                                [
-                                    -179.155463,
-                                    50.982285
-                                ],
-                                [
-                                    -179.476076,
-                                    52.072632
-                                ],
-                                [
-                                    -177.11459,
-                                    52.248701
-                                ],
-                                [
-                                    -177.146284,
-                                    52.789384
-                                ],
-                                [
-                                    -174.777218,
-                                    52.443779
-                                ],
-                                [
-                                    -174.773743,
-                                    52.685853
-                                ],
-                                [
-                                    -173.653194,
-                                    52.704099
-                                ],
-                                [
-                                    -173.790528,
-                                    53.469081
-                                ],
-                                [
-                                    -171.063371,
-                                    53.604473
-                                ],
-                                [
-                                    -170.777733,
-                                    59.291898
-                                ],
-                                [
-                                    -174.324884,
-                                    60.332184
-                                ],
-                                [
-                                    -171.736408,
-                                    62.68026
-                                ],
-                                [
-                                    -172.315705,
-                                    62.725352
-                                ],
-                                [
-                                    -171.995091,
-                                    63.999658
-                                ],
-                                [
-                                    -168.501424,
-                                    65.565173
-                                ],
-                                [
-                                    -168.714145,
-                                    65.546708
-                                ],
-                                [
-                                    -168.853077,
-                                    68.370871
-                                ],
-                                [
-                                    -161.115601,
-                                    72.416214
-                                ],
-                                [
-                                    -146.132257,
-                                    70.607941
-                                ],
-                                [
-                                    -140.692512,
-                                    69.955349
-                                ],
-                                [
-                                    -141.145395,
-                                    69.671641
-                                ],
-                                [
-                                    -141.015207,
-                                    69.654202
-                                ],
-                                [
-                                    -141.006459,
-                                    69.651272
-                                ],
-                                [
-                                    -141.005564,
-                                    69.650946
-                                ],
-                                [
-                                    -141.005549,
-                                    69.650941
-                                ],
-                                [
-                                    -141.005471,
-                                    69.505164
-                                ],
-                                [
-                                    -141.001208,
-                                    60.466879
-                                ],
-                                [
-                                    -141.001156,
-                                    60.321074
-                                ],
-                                [
-                                    -140.994929,
-                                    60.304382
-                                ],
-                                [
-                                    -140.979555,
-                                    60.295804
-                                ],
-                                [
-                                    -140.909146,
-                                    60.28366
-                                ],
-                                [
-                                    -140.768457,
-                                    60.259269
-                                ],
-                                [
-                                    -140.660505,
-                                    60.24051
-                                ],
-                                [
-                                    -140.533743,
-                                    60.218548
-                                ],
-                                [
-                                    -140.518705,
-                                    60.22387
-                                ],
-                                [
-                                    -140.506664,
-                                    60.236324
-                                ],
-                                [
-                                    -140.475323,
-                                    60.276477
-                                ],
-                                [
-                                    -140.462791,
-                                    60.289138
-                                ],
-                                [
-                                    -140.447805,
-                                    60.29446
-                                ],
-                                [
-                                    -140.424111,
-                                    60.293168
-                                ],
-                                [
-                                    -140.32497,
-                                    60.267537
-                                ],
-                                [
-                                    -140.169243,
-                                    60.227229
-                                ],
-                                [
-                                    -140.01579,
-                                    60.187387
-                                ],
-                                [
-                                    -139.967757,
-                                    60.188369
-                                ],
-                                [
-                                    -139.916933,
-                                    60.207851
-                                ],
-                                [
-                                    -139.826318,
-                                    60.256478
-                                ],
-                                [
-                                    -139.728417,
-                                    60.309033
-                                ],
-                                [
-                                    -139.679816,
-                                    60.32681
-                                ],
-                                [
-                                    -139.628346,
-                                    60.334096
-                                ],
-                                [
-                                    -139.517965,
-                                    60.336732
-                                ],
-                                [
-                                    -139.413992,
-                                    60.339212
-                                ],
-                                [
-                                    -139.262193,
-                                    60.342778
-                                ],
-                                [
-                                    -139.101608,
-                                    60.346602
-                                ],
-                                [
-                                    -139.079465,
-                                    60.341021
-                                ],
-                                [
-                                    -139.06869,
-                                    60.322056
-                                ],
-                                [
-                                    -139.073186,
-                                    60.299835
-                                ],
-                                [
-                                    -139.113468,
-                                    60.226816
-                                ],
-                                [
-                                    -139.149615,
-                                    60.161187
-                                ],
-                                [
-                                    -139.183231,
-                                    60.100157
-                                ],
-                                [
-                                    -139.182146,
-                                    60.073389
-                                ],
-                                [
-                                    -139.112305,
-                                    60.031376
-                                ],
-                                [
-                                    -139.060207,
-                                    60.000059
-                                ],
-                                [
-                                    -139.051611,
-                                    59.994892
-                                ],
-                                [
-                                    -139.003759,
-                                    59.977219
-                                ],
-                                [
-                                    -138.842425,
-                                    59.937686
-                                ],
-                                [
-                                    -138.742586,
-                                    59.913192
-                                ],
-                                [
-                                    -138.704888,
-                                    59.898464
-                                ],
-                                [
-                                    -138.697188,
-                                    59.89371
-                                ],
-                                [
-                                    -138.692098,
-                                    59.886888
-                                ],
-                                [
-                                    -138.654349,
-                                    59.805498
-                                ],
-                                [
-                                    -138.63745,
-                                    59.784052
-                                ],
-                                [
-                                    -138.59921,
-                                    59.753822
-                                ],
-                                [
-                                    -138.488881,
-                                    59.696357
-                                ],
-                                [
-                                    -138.363617,
-                                    59.631142
-                                ],
-                                [
-                                    -138.219543,
-                                    59.556004
-                                ],
-                                [
-                                    -138.067614,
-                                    59.476991
-                                ],
-                                [
-                                    -137.91057,
-                                    59.395187
-                                ],
-                                [
-                                    -137.758305,
-                                    59.315915
-                                ],
-                                [
-                                    -137.611363,
-                                    59.239331
-                                ],
-                                [
-                                    -137.594181,
-                                    59.225275
-                                ],
-                                [
-                                    -137.582088,
-                                    59.206568
-                                ],
-                                [
-                                    -137.5493,
-                                    59.134531
-                                ],
-                                [
-                                    -137.521007,
-                                    59.072364
-                                ],
-                                [
-                                    -137.484394,
-                                    58.991904
-                                ],
-                                [
-                                    -137.507752,
-                                    58.939969
-                                ],
-                                [
-                                    -137.50876,
-                                    58.914906
-                                ],
-                                [
-                                    -137.486875,
-                                    58.900075
-                                ],
-                                [
-                                    -137.453466,
-                                    58.899145
-                                ],
-                                [
-                                    -137.423106,
-                                    58.907723
-                                ],
-                                [
-                                    -137.338098,
-                                    58.955472
-                                ],
-                                [
-                                    -137.2819,
-                                    58.98715
-                                ],
-                                [
-                                    -137.172346,
-                                    59.027148
-                                ],
-                                [
-                                    -137.062367,
-                                    59.067572
-                                ],
-                                [
-                                    -137.047109,
-                                    59.07331
-                                ],
-                                [
-                                    -136.942282,
-                                    59.11107
-                                ],
-                                [
-                                    -136.840816,
-                                    59.148174
-                                ],
-                                [
-                                    -136.785496,
-                                    59.157217
-                                ],
-                                [
-                                    -136.671911,
-                                    59.150809
-                                ],
-                                [
-                                    -136.613491,
-                                    59.15422
-                                ],
-                                [
-                                    -136.569489,
-                                    59.172152
-                                ],
-                                [
-                                    -136.484791,
-                                    59.2538
-                                ],
-                                [
-                                    -136.483551,
-                                    59.257469
-                                ],
-                                [
-                                    -136.466549,
-                                    59.287803
-                                ],
-                                [
-                                    -136.467092,
-                                    59.38449
-                                ],
-                                [
-                                    -136.467557,
-                                    59.461643
-                                ],
-                                [
-                                    -136.415958,
-                                    59.452238
-                                ],
-                                [
-                                    -136.36684,
-                                    59.449551
-                                ],
-                                [
-                                    -136.319995,
-                                    59.459059
-                                ],
-                                [
-                                    -136.275036,
-                                    59.486448
-                                ],
-                                [
-                                    -136.244728,
-                                    59.528202
-                                ],
-                                [
-                                    -136.258474,
-                                    59.556107
-                                ],
-                                [
-                                    -136.29935,
-                                    59.575745
-                                ],
-                                [
-                                    -136.350329,
-                                    59.592384
-                                ],
-                                [
-                                    -136.2585,
-                                    59.621582
-                                ],
-                                [
-                                    -136.145406,
-                                    59.636826
-                                ],
-                                [
-                                    -136.02686,
-                                    59.652846
-                                ],
-                                [
-                                    -135.923818,
-                                    59.666747
-                                ],
-                                [
-                                    -135.830955,
-                                    59.693257
-                                ],
-                                [
-                                    -135.641251,
-                                    59.747362
-                                ],
-                                [
-                                    -135.482759,
-                                    59.792475
-                                ],
-                                [
-                                    -135.465137,
-                                    59.789685
-                                ],
-                                [
-                                    -135.404392,
-                                    59.753305
-                                ],
-                                [
-                                    -135.345791,
-                                    59.731032
-                                ],
-                                [
-                                    -135.259879,
-                                    59.698218
-                                ],
-                                [
-                                    -135.221897,
-                                    59.675273
-                                ],
-                                [
-                                    -135.192028,
-                                    59.64711
-                                ],
-                                [
-                                    -135.157792,
-                                    59.623287
-                                ],
-                                [
-                                    -135.106684,
-                                    59.613158
-                                ],
-                                [
-                                    -135.087874,
-                                    59.606544
-                                ],
-                                [
-                                    -135.032942,
-                                    59.573109
-                                ],
-                                [
-                                    -135.018524,
-                                    59.559363
-                                ],
-                                [
-                                    -135.016198,
-                                    59.543447
-                                ],
-                                [
-                                    -135.01948,
-                                    59.493166
-                                ],
-                                [
-                                    -135.023252,
-                                    59.477146
-                                ],
-                                [
-                                    -135.037489,
-                                    59.461591
-                                ],
-                                [
-                                    -135.078598,
-                                    59.438337
-                                ],
-                                [
-                                    -135.095754,
-                                    59.418855
-                                ],
-                                [
-                                    -134.993254,
-                                    59.381906
-                                ],
-                                [
-                                    -135.00483,
-                                    59.367127
-                                ],
-                                [
-                                    -135.014441,
-                                    59.35152
-                                ],
-                                [
-                                    -135.016198,
-                                    59.336173
-                                ],
-                                [
-                                    -134.979973,
-                                    59.297415
-                                ],
-                                [
-                                    -134.95783,
-                                    59.280982
-                                ],
-                                [
-                                    -134.932431,
-                                    59.270647
-                                ],
-                                [
-                                    -134.839465,
-                                    59.258141
-                                ],
-                                [
-                                    -134.74345,
-                                    59.245119
-                                ],
-                                [
-                                    -134.70552,
-                                    59.240106
-                                ],
-                                [
-                                    -134.692084,
-                                    59.235249
-                                ],
-                                [
-                                    -134.68286,
-                                    59.223001
-                                ],
-                                [
-                                    -134.671439,
-                                    59.193752
-                                ],
-                                [
-                                    -134.66038,
-                                    59.181298
-                                ],
-                                [
-                                    -134.610771,
-                                    59.144556
-                                ],
-                                [
-                                    -134.582788,
-                                    59.128847
-                                ],
-                                [
-                                    -134.556717,
-                                    59.123059
-                                ],
-                                [
-                                    -134.509072,
-                                    59.122801
-                                ],
-                                [
-                                    -134.477575,
-                                    59.114946
-                                ],
-                                [
-                                    -134.451013,
-                                    59.097893
-                                ],
-                                [
-                                    -134.398019,
-                                    59.051952
-                                ],
-                                [
-                                    -134.387167,
-                                    59.036863
-                                ],
-                                [
-                                    -134.385591,
-                                    59.018828
-                                ],
-                                [
-                                    -134.399389,
-                                    58.974954
-                                ],
-                                [
-                                    -134.343423,
-                                    58.968857
-                                ],
-                                [
-                                    -134.329651,
-                                    58.963017
-                                ],
-                                [
-                                    -134.320039,
-                                    58.952682
-                                ],
-                                [
-                                    -134.32314,
-                                    58.949168
-                                ],
-                                [
-                                    -134.330323,
-                                    58.945344
-                                ],
-                                [
-                                    -134.333036,
-                                    58.93413
-                                ],
-                                [
-                                    -134.327403,
-                                    58.916457
-                                ],
-                                [
-                                    -134.316939,
-                                    58.903796
-                                ],
-                                [
-                                    -134.22219,
-                                    58.842714
-                                ],
-                                [
-                                    -134.108838,
-                                    58.808246
-                                ],
-                                [
-                                    -133.983109,
-                                    58.769902
-                                ],
-                                [
-                                    -133.87123,
-                                    58.735899
-                                ],
-                                [
-                                    -133.831129,
-                                    58.718019
-                                ],
-                                [
-                                    -133.796402,
-                                    58.693421
-                                ],
-                                [
-                                    -133.700077,
-                                    58.59937
-                                ],
-                                [
-                                    -133.626283,
-                                    58.546402
-                                ],
-                                [
-                                    -133.547063,
-                                    58.505577
-                                ],
-                                [
-                                    -133.463089,
-                                    58.462221
-                                ],
-                                [
-                                    -133.392241,
-                                    58.403878
-                                ],
-                                [
-                                    -133.43012,
-                                    58.372097
-                                ],
-                                [
-                                    -133.41503,
-                                    58.330549
-                                ],
-                                [
-                                    -133.374567,
-                                    58.290965
-                                ],
-                                [
-                                    -133.257262,
-                                    58.210298
-                                ],
-                                [
-                                    -133.165588,
-                                    58.147305
-                                ],
-                                [
-                                    -133.142127,
-                                    58.120588
-                                ],
-                                [
-                                    -133.094843,
-                                    58.0331
-                                ],
-                                [
-                                    -133.075154,
-                                    58.007882
-                                ],
-                                [
-                                    -132.99335,
-                                    57.941917
-                                ],
-                                [
-                                    -132.917153,
-                                    57.880499
-                                ],
-                                [
-                                    -132.83212,
-                                    57.791564
-                                ],
-                                [
-                                    -132.70944,
-                                    57.663303
-                                ],
-                                [
-                                    -132.629057,
-                                    57.579277
-                                ],
-                                [
-                                    -132.552447,
-                                    57.499075
-                                ],
-                                [
-                                    -132.455735,
-                                    57.420992
-                                ],
-                                [
-                                    -132.362304,
-                                    57.3457
-                                ],
-                                [
-                                    -132.304684,
-                                    57.280355
-                                ],
-                                [
-                                    -132.230994,
-                                    57.19682
-                                ],
-                                [
-                                    -132.276366,
-                                    57.14889
-                                ],
-                                [
-                                    -132.34122,
-                                    57.080393
-                                ],
-                                [
-                                    -132.16229,
-                                    57.050317
-                                ],
-                                [
-                                    -132.031859,
-                                    57.028406
-                                ],
-                                [
-                                    -132.107384,
-                                    56.858753
-                                ],
-                                [
-                                    -131.871558,
-                                    56.79346
-                                ],
-                                [
-                                    -131.865874,
-                                    56.785708
-                                ],
-                                [
-                                    -131.872411,
-                                    56.77297
-                                ],
-                                [
-                                    -131.882617,
-                                    56.759146
-                                ],
-                                [
-                                    -131.887966,
-                                    56.747958
-                                ],
-                                [
-                                    -131.886028,
-                                    56.737055
-                                ],
-                                [
-                                    -131.880705,
-                                    56.728838
-                                ],
-                                [
-                                    -131.864789,
-                                    56.71349
-                                ],
-                                [
-                                    -131.838976,
-                                    56.682278
-                                ],
-                                [
-                                    -131.830424,
-                                    56.664759
-                                ],
-                                [
-                                    -131.826574,
-                                    56.644606
-                                ],
-                                [
-                                    -131.832103,
-                                    56.603368
-                                ],
-                                [
-                                    -131.825592,
-                                    56.593343
-                                ],
-                                [
-                                    -131.799108,
-                                    56.587658
-                                ],
-                                [
-                                    -131.692293,
-                                    56.585074
-                                ],
-                                [
-                                    -131.585891,
-                                    56.595048
-                                ],
-                                [
-                                    -131.560363,
-                                    56.594066
-                                ],
-                                [
-                                    -131.536437,
-                                    56.585229
-                                ],
-                                [
-                                    -131.491659,
-                                    56.560166
-                                ],
-                                [
-                                    -131.345699,
-                                    56.503271
-                                ],
-                                [
-                                    -131.215604,
-                                    56.45255
-                                ],
-                                [
-                                    -131.100546,
-                                    56.407669
-                                ],
-                                [
-                                    -131.016934,
-                                    56.38705
-                                ],
-                                [
-                                    -130.839089,
-                                    56.372452
-                                ],
-                                [
-                                    -130.760334,
-                                    56.345192
-                                ],
-                                [
-                                    -130.645768,
-                                    56.261942
-                                ],
-                                [
-                                    -130.602256,
-                                    56.247059
-                                ],
-                                [
-                                    -130.495518,
-                                    56.232434
-                                ],
-                                [
-                                    -130.47229,
-                                    56.22489
-                                ],
-                                [
-                                    -130.458053,
-                                    56.210653
-                                ],
-                                [
-                                    -130.427926,
-                                    56.143964
-                                ],
-                                [
-                                    -130.418159,
-                                    56.129702
-                                ],
-                                [
-                                    -130.403974,
-                                    56.121898
-                                ],
-                                [
-                                    -130.290311,
-                                    56.10097
-                                ],
-                                [
-                                    -130.243156,
-                                    56.092391
-                                ],
-                                [
-                                    -130.211246,
-                                    56.089962
-                                ],
-                                [
-                                    -130.116756,
-                                    56.105646
-                                ],
-                                [
-                                    -130.094328,
-                                    56.101486
-                                ],
-                                [
-                                    -130.071539,
-                                    56.084123
-                                ],
-                                [
-                                    -130.039319,
-                                    56.045521
-                                ],
-                                [
-                                    -130.026632,
-                                    56.024101
-                                ],
-                                [
-                                    -130.01901,
-                                    56.002216
-                                ],
-                                [
-                                    -130.014695,
-                                    55.963252
-                                ],
-                                [
-                                    -130.016788,
-                                    55.918913
-                                ],
-                                [
-                                    -130.019612,
-                                    55.907978
-                                ],
-                                [
-                                    -130.019618,
-                                    55.907952
-                                ],
-                                [
-                                    -130.022817,
-                                    55.901353
-                                ],
-                                [
-                                    -130.049387,
-                                    55.871405
-                                ],
-                                [
-                                    -130.104726,
-                                    55.825263
-                                ],
-                                [
-                                    -130.136627,
-                                    55.806464
-                                ],
-                                [
-                                    -130.148834,
-                                    55.795356
-                                ],
-                                [
-                                    -130.163482,
-                                    55.771145
-                                ],
-                                [
-                                    -130.167307,
-                                    55.766262
-                                ],
-                                [
-                                    -130.170806,
-                                    55.759833
-                                ],
-                                [
-                                    -130.173655,
-                                    55.749498
-                                ],
-                                [
-                                    -130.170806,
-                                    55.740953
-                                ],
-                                [
-                                    -130.163808,
-                                    55.734565
-                                ],
-                                [
-                                    -130.160064,
-                                    55.727118
-                                ],
-                                [
-                                    -130.167388,
-                                    55.715399
-                                ],
-                                [
-                                    -130.155914,
-                                    55.700141
-                                ],
-                                [
-                                    -130.142893,
-                                    55.689521
-                                ],
-                                [
-                                    -130.131825,
-                                    55.676581
-                                ],
-                                [
-                                    -130.126454,
-                                    55.653998
-                                ],
-                                [
-                                    -130.12857,
-                                    55.63642
-                                ],
-                                [
-                                    -130.135121,
-                                    55.619127
-                                ],
-                                [
-                                    -130.153147,
-                                    55.58511
-                                ],
-                                [
-                                    -130.148671,
-                                    55.578192
-                                ],
-                                [
-                                    -130.146881,
-                                    55.569322
-                                ],
-                                [
-                                    -130.146962,
-                                    55.547187
-                                ],
-                                [
-                                    -130.112172,
-                                    55.509345
-                                ],
-                                [
-                                    -130.101674,
-                                    55.481147
-                                ],
-                                [
-                                    -130.095082,
-                                    55.472113
-                                ],
-                                [
-                                    -130.065419,
-                                    55.446112
-                                ],
-                                [
-                                    -130.057525,
-                                    55.434882
-                                ],
-                                [
-                                    -130.052561,
-                                    55.414008
-                                ],
-                                [
-                                    -130.054311,
-                                    55.366645
-                                ],
-                                [
-                                    -130.05012,
-                                    55.345445
-                                ],
-                                [
-                                    -130.039296,
-                                    55.330756
-                                ],
-                                [
-                                    -129.989247,
-                                    55.284003
-                                ],
-                                [
-                                    -130.031239,
-                                    55.26435
-                                ],
-                                [
-                                    -130.050038,
-                                    55.252875
-                                ],
-                                [
-                                    -130.067494,
-                                    55.239
-                                ],
-                                [
-                                    -130.078236,
-                                    55.233791
-                                ],
-                                [
-                                    -130.100494,
-                                    55.230292
-                                ],
-                                [
-                                    -130.104726,
-                                    55.225653
-                                ],
-                                [
-                                    -130.105702,
-                                    55.211127
-                                ],
-                                [
-                                    -130.10912,
-                                    55.200751
-                                ],
-                                [
-                                    -130.115793,
-                                    55.191596
-                                ],
-                                [
-                                    -130.126454,
-                                    55.180976
-                                ],
-                                [
-                                    -130.151967,
-                                    55.163275
-                                ],
-                                [
-                                    -130.159983,
-                                    55.153713
-                                ],
-                                [
-                                    -130.167592,
-                                    55.129584
-                                ],
-                                [
-                                    -130.173695,
-                                    55.117743
-                                ],
-                                [
-                                    -130.200266,
-                                    55.104153
-                                ],
-                                [
-                                    -130.211781,
-                                    55.084133
-                                ],
-                                [
-                                    -130.228871,
-                                    55.04385
-                                ],
-                                [
-                                    -130.238678,
-                                    55.03441
-                                ],
-                                [
-                                    -130.261342,
-                                    55.022895
-                                ],
-                                [
-                                    -130.269846,
-                                    55.016547
-                                ],
-                                [
-                                    -130.275706,
-                                    55.006985
-                                ],
-                                [
-                                    -130.286366,
-                                    54.983222
-                                ],
-                                [
-                                    -130.294342,
-                                    54.971869
-                                ],
-                                [
-                                    -130.326568,
-                                    54.952094
-                                ],
-                                [
-                                    -130.335561,
-                                    54.938707
-                                ],
-                                [
-                                    -130.365387,
-                                    54.907294
-                                ],
-                                [
-                                    -130.385243,
-                                    54.896552
-                                ],
-                                [
-                                    -130.430816,
-                                    54.881252
-                                ],
-                                [
-                                    -130.488759,
-                                    54.844184
-                                ],
-                                [
-                                    -130.580312,
-                                    54.806383
-                                ],
-                                [
-                                    -130.597485,
-                                    54.803391
-                                ],
-                                [
-                                    -130.71074,
-                                    54.733215
-                                ],
-                                [
-                                    -131.160718,
-                                    54.787192
-                                ]
-                            ]
-                        ]
-                    ]
-                }
-            }
-        ]
-    },
-    "featureIcons": {
-        "circle-stroked": {
-            "12": [
-                42,
-                0
-            ],
-            "18": [
-                24,
-                0
-            ],
-            "24": [
-                0,
-                0
-            ]
-        },
-        "circle": {
-            "12": [
-                96,
-                0
-            ],
-            "18": [
-                78,
-                0
-            ],
-            "24": [
-                54,
-                0
-            ]
-        },
-        "square-stroked": {
-            "12": [
-                150,
-                0
-            ],
-            "18": [
-                132,
-                0
-            ],
-            "24": [
-                108,
-                0
-            ]
-        },
-        "square": {
-            "12": [
-                204,
-                0
-            ],
-            "18": [
-                186,
-                0
-            ],
-            "24": [
-                162,
-                0
-            ]
-        },
-        "triangle-stroked": {
-            "12": [
-                258,
-                0
-            ],
-            "18": [
-                240,
-                0
-            ],
-            "24": [
-                216,
-                0
-            ]
-        },
-        "triangle": {
-            "12": [
-                42,
-                24
-            ],
-            "18": [
-                24,
-                24
-            ],
-            "24": [
-                0,
-                24
-            ]
-        },
-        "star-stroked": {
-            "12": [
-                96,
-                24
-            ],
-            "18": [
-                78,
-                24
-            ],
-            "24": [
-                54,
-                24
-            ]
-        },
-        "star": {
-            "12": [
-                150,
-                24
-            ],
-            "18": [
-                132,
-                24
-            ],
-            "24": [
-                108,
-                24
-            ]
-        },
-        "cross": {
-            "12": [
-                204,
-                24
-            ],
-            "18": [
-                186,
-                24
-            ],
-            "24": [
-                162,
-                24
-            ]
-        },
-        "marker-stroked": {
-            "12": [
-                258,
-                24
-            ],
-            "18": [
-                240,
-                24
-            ],
-            "24": [
-                216,
-                24
-            ]
-        },
-        "marker": {
-            "12": [
-                42,
-                48
-            ],
-            "18": [
-                24,
-                48
-            ],
-            "24": [
-                0,
-                48
-            ]
-        },
-        "religious-jewish": {
-            "12": [
-                96,
-                48
-            ],
-            "18": [
-                78,
-                48
-            ],
-            "24": [
-                54,
-                48
-            ]
-        },
-        "religious-christian": {
-            "12": [
-                150,
-                48
-            ],
-            "18": [
-                132,
-                48
-            ],
-            "24": [
-                108,
-                48
-            ]
-        },
-        "religious-muslim": {
-            "12": [
-                204,
-                48
-            ],
-            "18": [
-                186,
-                48
-            ],
-            "24": [
-                162,
-                48
-            ]
-        },
-        "cemetery": {
-            "12": [
-                258,
-                48
-            ],
-            "18": [
-                240,
-                48
-            ],
-            "24": [
-                216,
-                48
-            ]
-        },
-        "rocket": {
-            "12": [
-                42,
-                72
-            ],
-            "18": [
-                24,
-                72
-            ],
-            "24": [
-                0,
-                72
-            ]
-        },
-        "airport": {
-            "12": [
-                96,
-                72
-            ],
-            "18": [
-                78,
-                72
-            ],
-            "24": [
-                54,
-                72
-            ]
-        },
-        "heliport": {
-            "12": [
-                150,
-                72
-            ],
-            "18": [
-                132,
-                72
-            ],
-            "24": [
-                108,
-                72
-            ]
-        },
-        "rail": {
-            "12": [
-                204,
-                72
-            ],
-            "18": [
-                186,
-                72
-            ],
-            "24": [
-                162,
-                72
-            ]
-        },
-        "rail-metro": {
-            "12": [
-                258,
-                72
-            ],
-            "18": [
-                240,
-                72
-            ],
-            "24": [
-                216,
-                72
-            ]
-        },
-        "rail-light": {
-            "12": [
-                42,
-                96
-            ],
-            "18": [
-                24,
-                96
-            ],
-            "24": [
-                0,
-                96
-            ]
-        },
-        "bus": {
-            "12": [
-                96,
-                96
-            ],
-            "18": [
-                78,
-                96
-            ],
-            "24": [
-                54,
-                96
-            ]
-        },
-        "fuel": {
-            "12": [
-                150,
-                96
-            ],
-            "18": [
-                132,
-                96
-            ],
-            "24": [
-                108,
-                96
-            ]
-        },
-        "parking": {
-            "12": [
-                204,
-                96
-            ],
-            "18": [
-                186,
-                96
-            ],
-            "24": [
-                162,
-                96
-            ]
-        },
-        "parking-garage": {
-            "12": [
-                258,
-                96
-            ],
-            "18": [
-                240,
-                96
-            ],
-            "24": [
-                216,
-                96
-            ]
-        },
-        "airfield": {
-            "12": [
-                42,
-                120
-            ],
-            "18": [
-                24,
-                120
-            ],
-            "24": [
-                0,
-                120
-            ]
-        },
-        "roadblock": {
-            "12": [
-                96,
-                120
-            ],
-            "18": [
-                78,
-                120
-            ],
-            "24": [
-                54,
-                120
-            ]
-        },
-        "ferry": {
-            "12": [
-                150,
-                120
-            ],
-            "18": [
-                132,
-                120
-            ],
-            "24": [
-                108,
-                120
-            ],
-            "line": [
-                2240,
-                25
-            ]
-        },
-        "harbor": {
-            "12": [
-                204,
-                120
-            ],
-            "18": [
-                186,
-                120
-            ],
-            "24": [
-                162,
-                120
-            ]
-        },
-        "bicycle": {
-            "12": [
-                258,
-                120
-            ],
-            "18": [
-                240,
-                120
-            ],
-            "24": [
-                216,
-                120
-            ]
-        },
-        "park": {
-            "12": [
-                42,
-                144
-            ],
-            "18": [
-                24,
-                144
-            ],
-            "24": [
-                0,
-                144
-            ]
-        },
-        "park2": {
-            "12": [
-                96,
-                144
-            ],
-            "18": [
-                78,
-                144
-            ],
-            "24": [
-                54,
-                144
-            ]
-        },
-        "museum": {
-            "12": [
-                150,
-                144
-            ],
-            "18": [
-                132,
-                144
-            ],
-            "24": [
-                108,
-                144
-            ]
-        },
-        "lodging": {
-            "12": [
-                204,
-                144
-            ],
-            "18": [
-                186,
-                144
-            ],
-            "24": [
-                162,
-                144
-            ]
-        },
-        "monument": {
-            "12": [
-                258,
-                144
-            ],
-            "18": [
-                240,
-                144
-            ],
-            "24": [
-                216,
-                144
-            ]
-        },
-        "zoo": {
-            "12": [
-                42,
-                168
-            ],
-            "18": [
-                24,
-                168
-            ],
-            "24": [
-                0,
-                168
-            ]
-        },
-        "garden": {
-            "12": [
-                96,
-                168
-            ],
-            "18": [
-                78,
-                168
-            ],
-            "24": [
-                54,
-                168
-            ]
-        },
-        "campsite": {
-            "12": [
-                150,
-                168
-            ],
-            "18": [
-                132,
-                168
-            ],
-            "24": [
-                108,
-                168
-            ]
-        },
-        "theatre": {
-            "12": [
-                204,
-                168
-            ],
-            "18": [
-                186,
-                168
-            ],
-            "24": [
-                162,
-                168
-            ]
-        },
-        "art-gallery": {
-            "12": [
-                258,
-                168
-            ],
-            "18": [
-                240,
-                168
-            ],
-            "24": [
-                216,
-                168
-            ]
-        },
-        "pitch": {
-            "12": [
-                42,
-                192
-            ],
-            "18": [
-                24,
-                192
-            ],
-            "24": [
-                0,
-                192
-            ]
-        },
-        "soccer": {
-            "12": [
-                96,
-                192
-            ],
-            "18": [
-                78,
-                192
-            ],
-            "24": [
-                54,
-                192
-            ]
-        },
-        "america-football": {
-            "12": [
-                150,
-                192
-            ],
-            "18": [
-                132,
-                192
-            ],
-            "24": [
-                108,
-                192
-            ]
-        },
-        "tennis": {
-            "12": [
-                204,
-                192
-            ],
-            "18": [
-                186,
-                192
-            ],
-            "24": [
-                162,
-                192
-            ]
-        },
-        "basketball": {
-            "12": [
-                258,
-                192
-            ],
-            "18": [
-                240,
-                192
-            ],
-            "24": [
-                216,
-                192
-            ]
-        },
-        "baseball": {
-            "12": [
-                42,
-                216
-            ],
-            "18": [
-                24,
-                216
-            ],
-            "24": [
-                0,
-                216
-            ]
-        },
-        "golf": {
-            "12": [
-                96,
-                216
-            ],
-            "18": [
-                78,
-                216
-            ],
-            "24": [
-                54,
-                216
-            ]
-        },
-        "swimming": {
-            "12": [
-                150,
-                216
-            ],
-            "18": [
-                132,
-                216
-            ],
-            "24": [
-                108,
-                216
-            ]
-        },
-        "cricket": {
-            "12": [
-                204,
-                216
-            ],
-            "18": [
-                186,
-                216
-            ],
-            "24": [
-                162,
-                216
-            ]
-        },
-        "skiing": {
-            "12": [
-                258,
-                216
-            ],
-            "18": [
-                240,
-                216
-            ],
-            "24": [
-                216,
-                216
-            ]
-        },
-        "school": {
-            "12": [
-                42,
-                240
-            ],
-            "18": [
-                24,
-                240
-            ],
-            "24": [
-                0,
-                240
-            ]
-        },
-        "college": {
-            "12": [
-                96,
-                240
-            ],
-            "18": [
-                78,
-                240
-            ],
-            "24": [
-                54,
-                240
-            ]
-        },
-        "library": {
-            "12": [
-                150,
-                240
-            ],
-            "18": [
-                132,
-                240
-            ],
-            "24": [
-                108,
-                240
-            ]
-        },
-        "post": {
-            "12": [
-                204,
-                240
-            ],
-            "18": [
-                186,
-                240
-            ],
-            "24": [
-                162,
-                240
-            ]
-        },
-        "fire-station": {
-            "12": [
-                258,
-                240
-            ],
-            "18": [
-                240,
-                240
-            ],
-            "24": [
-                216,
-                240
-            ]
-        },
-        "town-hall": {
-            "12": [
-                42,
-                264
-            ],
-            "18": [
-                24,
-                264
-            ],
-            "24": [
-                0,
-                264
-            ]
-        },
-        "police": {
-            "12": [
-                96,
-                264
-            ],
-            "18": [
-                78,
-                264
-            ],
-            "24": [
-                54,
-                264
-            ]
-        },
-        "prison": {
-            "12": [
-                150,
-                264
-            ],
-            "18": [
-                132,
-                264
-            ],
-            "24": [
-                108,
-                264
-            ]
-        },
-        "embassy": {
-            "12": [
-                204,
-                264
-            ],
-            "18": [
-                186,
-                264
-            ],
-            "24": [
-                162,
-                264
-            ]
-        },
-        "beer": {
-            "12": [
-                258,
-                264
-            ],
-            "18": [
-                240,
-                264
-            ],
-            "24": [
-                216,
-                264
-            ]
-        },
-        "restaurant": {
-            "12": [
-                42,
-                288
-            ],
-            "18": [
-                24,
-                288
-            ],
-            "24": [
-                0,
-                288
-            ]
-        },
-        "cafe": {
-            "12": [
-                96,
-                288
-            ],
-            "18": [
-                78,
-                288
-            ],
-            "24": [
-                54,
-                288
-            ]
-        },
-        "shop": {
-            "12": [
-                150,
-                288
-            ],
-            "18": [
-                132,
-                288
-            ],
-            "24": [
-                108,
-                288
-            ]
-        },
-        "fast-food": {
-            "12": [
-                204,
-                288
-            ],
-            "18": [
-                186,
-                288
-            ],
-            "24": [
-                162,
-                288
-            ]
-        },
-        "bar": {
-            "12": [
-                258,
-                288
-            ],
-            "18": [
-                240,
-                288
-            ],
-            "24": [
-                216,
-                288
-            ]
-        },
-        "bank": {
-            "12": [
-                42,
-                312
-            ],
-            "18": [
-                24,
-                312
-            ],
-            "24": [
-                0,
-                312
-            ]
-        },
-        "grocery": {
-            "12": [
-                96,
-                312
-            ],
-            "18": [
-                78,
-                312
-            ],
-            "24": [
-                54,
-                312
-            ]
-        },
-        "cinema": {
-            "12": [
-                150,
-                312
-            ],
-            "18": [
-                132,
-                312
-            ],
-            "24": [
-                108,
-                312
-            ]
-        },
-        "pharmacy": {
-            "12": [
-                204,
-                312
-            ],
-            "18": [
-                186,
-                312
-            ],
-            "24": [
-                162,
-                312
-            ]
-        },
-        "hospital": {
-            "12": [
-                258,
-                312
-            ],
-            "18": [
-                240,
-                312
-            ],
-            "24": [
-                216,
-                312
-            ]
-        },
-        "danger": {
-            "12": [
-                42,
-                336
-            ],
-            "18": [
-                24,
-                336
-            ],
-            "24": [
-                0,
-                336
-            ]
-        },
-        "industrial": {
-            "12": [
-                96,
-                336
-            ],
-            "18": [
-                78,
-                336
-            ],
-            "24": [
-                54,
-                336
-            ]
-        },
-        "warehouse": {
-            "12": [
-                150,
-                336
-            ],
-            "18": [
-                132,
-                336
-            ],
-            "24": [
-                108,
-                336
-            ]
-        },
-        "commercial": {
-            "12": [
-                204,
-                336
-            ],
-            "18": [
-                186,
-                336
-            ],
-            "24": [
-                162,
-                336
-            ]
-        },
-        "building": {
-            "12": [
-                258,
-                336
-            ],
-            "18": [
-                240,
-                336
-            ],
-            "24": [
-                216,
-                336
-            ]
-        },
-        "place-of-worship": {
-            "12": [
-                42,
-                360
-            ],
-            "18": [
-                24,
-                360
-            ],
-            "24": [
-                0,
-                360
-            ]
-        },
-        "alcohol-shop": {
-            "12": [
-                96,
-                360
-            ],
-            "18": [
-                78,
-                360
-            ],
-            "24": [
-                54,
-                360
-            ]
-        },
-        "logging": {
-            "12": [
-                150,
-                360
-            ],
-            "18": [
-                132,
-                360
-            ],
-            "24": [
-                108,
-                360
-            ]
-        },
-        "oil-well": {
-            "12": [
-                204,
-                360
-            ],
-            "18": [
-                186,
-                360
-            ],
-            "24": [
-                162,
-                360
-            ]
-        },
-        "slaughterhouse": {
-            "12": [
-                258,
-                360
-            ],
-            "18": [
-                240,
-                360
-            ],
-            "24": [
-                216,
-                360
-            ]
-        },
-        "dam": {
-            "12": [
-                42,
-                384
-            ],
-            "18": [
-                24,
-                384
-            ],
-            "24": [
-                0,
-                384
-            ]
-        },
-        "water": {
-            "12": [
-                96,
-                384
-            ],
-            "18": [
-                78,
-                384
-            ],
-            "24": [
-                54,
-                384
-            ]
-        },
-        "wetland": {
-            "12": [
-                150,
-                384
-            ],
-            "18": [
-                132,
-                384
-            ],
-            "24": [
-                108,
-                384
-            ]
-        },
-        "disability": {
-            "12": [
-                204,
-                384
-            ],
-            "18": [
-                186,
-                384
-            ],
-            "24": [
-                162,
-                384
-            ]
-        },
-        "telephone": {
-            "12": [
-                258,
-                384
-            ],
-            "18": [
-                240,
-                384
-            ],
-            "24": [
-                216,
-                384
-            ]
-        },
-        "emergency-telephone": {
-            "12": [
-                42,
-                408
-            ],
-            "18": [
-                24,
-                408
-            ],
-            "24": [
-                0,
-                408
-            ]
-        },
-        "toilets": {
-            "12": [
-                96,
-                408
-            ],
-            "18": [
-                78,
-                408
-            ],
-            "24": [
-                54,
-                408
-            ]
-        },
-        "waste-basket": {
-            "12": [
-                150,
-                408
-            ],
-            "18": [
-                132,
-                408
-            ],
-            "24": [
-                108,
-                408
-            ]
-        },
-        "music": {
-            "12": [
-                204,
-                408
-            ],
-            "18": [
-                186,
-                408
-            ],
-            "24": [
-                162,
-                408
-            ]
-        },
-        "land-use": {
-            "12": [
-                258,
-                408
-            ],
-            "18": [
-                240,
-                408
-            ],
-            "24": [
-                216,
-                408
-            ]
-        },
-        "city": {
-            "12": [
-                42,
-                432
-            ],
-            "18": [
-                24,
-                432
-            ],
-            "24": [
-                0,
-                432
-            ]
-        },
-        "town": {
-            "12": [
-                96,
-                432
-            ],
-            "18": [
-                78,
-                432
-            ],
-            "24": [
-                54,
-                432
-            ]
-        },
-        "village": {
-            "12": [
-                150,
-                432
-            ],
-            "18": [
-                132,
-                432
-            ],
-            "24": [
-                108,
-                432
-            ]
-        },
-        "farm": {
-            "12": [
-                204,
-                432
-            ],
-            "18": [
-                186,
-                432
-            ],
-            "24": [
-                162,
-                432
-            ]
-        },
-        "bakery": {
-            "12": [
-                258,
-                432
-            ],
-            "18": [
-                240,
-                432
-            ],
-            "24": [
-                216,
-                432
-            ]
-        },
-        "dog-park": {
-            "12": [
-                42,
-                456
-            ],
-            "18": [
-                24,
-                456
-            ],
-            "24": [
-                0,
-                456
-            ]
-        },
-        "lighthouse": {
-            "12": [
-                96,
-                456
-            ],
-            "18": [
-                78,
-                456
-            ],
-            "24": [
-                54,
-                456
-            ]
-        },
-        "clothing-store": {
-            "12": [
-                150,
-                456
-            ],
-            "18": [
-                132,
-                456
-            ],
-            "24": [
-                108,
-                456
-            ]
-        },
-        "polling-place": {
-            "12": [
-                204,
-                456
-            ],
-            "18": [
-                186,
-                456
-            ],
-            "24": [
-                162,
-                456
-            ]
-        },
-        "playground": {
-            "12": [
-                258,
-                456
-            ],
-            "18": [
-                240,
-                456
-            ],
-            "24": [
-                216,
-                456
-            ]
-        },
-        "entrance": {
-            "12": [
-                42,
-                480
-            ],
-            "18": [
-                24,
-                480
-            ],
-            "24": [
-                0,
-                480
-            ]
-        },
-        "heart": {
-            "12": [
-                96,
-                480
-            ],
-            "18": [
-                78,
-                480
-            ],
-            "24": [
-                54,
-                480
-            ]
-        },
-        "london-underground": {
-            "12": [
-                150,
-                480
-            ],
-            "18": [
-                132,
-                480
-            ],
-            "24": [
-                108,
-                480
-            ]
-        },
-        "minefield": {
-            "12": [
-                204,
-                480
-            ],
-            "18": [
-                186,
-                480
-            ],
-            "24": [
-                162,
-                480
-            ]
-        },
-        "rail-underground": {
-            "12": [
-                258,
-                480
-            ],
-            "18": [
-                240,
-                480
-            ],
-            "24": [
-                216,
-                480
-            ]
-        },
-        "rail-above": {
-            "12": [
-                42,
-                504
-            ],
-            "18": [
-                24,
-                504
-            ],
-            "24": [
-                0,
-                504
-            ]
-        },
-        "camera": {
-            "12": [
-                96,
-                504
-            ],
-            "18": [
-                78,
-                504
-            ],
-            "24": [
-                54,
-                504
-            ]
-        },
-        "laundry": {
-            "12": [
-                150,
-                504
-            ],
-            "18": [
-                132,
-                504
-            ],
-            "24": [
-                108,
-                504
-            ]
-        },
-        "car": {
-            "12": [
-                204,
-                504
-            ],
-            "18": [
-                186,
-                504
-            ],
-            "24": [
-                162,
-                504
-            ]
-        },
-        "suitcase": {
-            "12": [
-                258,
-                504
-            ],
-            "18": [
-                240,
-                504
-            ],
-            "24": [
-                216,
-                504
-            ]
-        },
-        "hairdresser": {
-            "12": [
-                42,
-                528
-            ],
-            "18": [
-                24,
-                528
-            ],
-            "24": [
-                0,
-                528
-            ]
-        },
-        "chemist": {
-            "12": [
-                96,
-                528
-            ],
-            "18": [
-                78,
-                528
-            ],
-            "24": [
-                54,
-                528
-            ]
-        },
-        "mobilephone": {
-            "12": [
-                150,
-                528
-            ],
-            "18": [
-                132,
-                528
-            ],
-            "24": [
-                108,
-                528
-            ]
-        },
-        "scooter": {
-            "12": [
-                204,
-                528
-            ],
-            "18": [
-                186,
-                528
-            ],
-            "24": [
-                162,
-                528
-            ]
-        },
-        "gift": {
-            "12": [
-                258,
-                528
-            ],
-            "18": [
-                240,
-                528
-            ],
-            "24": [
-                216,
-                528
-            ]
-        },
-        "ice-cream": {
-            "12": [
-                42,
-                552
-            ],
-            "18": [
-                24,
-                552
-            ],
-            "24": [
-                0,
-                552
-            ]
-        },
-        "highway-motorway": {
-            "line": [
-                20,
-                25
-            ]
-        },
-        "highway-trunk": {
-            "line": [
-                80,
-                25
-            ]
-        },
-        "highway-primary": {
-            "line": [
-                140,
-                25
-            ]
-        },
-        "highway-secondary": {
-            "line": [
-                200,
-                25
-            ]
-        },
-        "highway-tertiary": {
-            "line": [
-                260,
-                25
-            ]
-        },
-        "highway-motorway-link": {
-            "line": [
-                320,
-                25
-            ]
-        },
-        "highway-trunk-link": {
-            "line": [
-                380,
-                25
-            ]
-        },
-        "highway-primary-link": {
-            "line": [
-                440,
-                25
-            ]
-        },
-        "highway-secondary-link": {
-            "line": [
-                500,
-                25
-            ]
-        },
-        "highway-tertiary-link": {
-            "line": [
-                560,
-                25
-            ]
-        },
-        "highway-residential": {
-            "line": [
-                620,
-                25
-            ]
-        },
-        "highway-unclassified": {
-            "line": [
-                680,
-                25
-            ]
-        },
-        "highway-service": {
-            "line": [
-                740,
-                25
-            ]
-        },
-        "highway-road": {
-            "line": [
-                800,
-                25
-            ]
-        },
-        "highway-track": {
-            "line": [
-                860,
-                25
-            ]
-        },
-        "highway-living-street": {
-            "line": [
-                920,
-                25
-            ]
-        },
-        "highway-path": {
-            "line": [
-                980,
-                25
-            ]
-        },
-        "highway-cycleway": {
-            "line": [
-                1040,
-                25
-            ]
-        },
-        "highway-footway": {
-            "line": [
-                1100,
-                25
-            ]
-        },
-        "highway-bridleway": {
-            "line": [
-                1160,
-                25
-            ]
-        },
-        "highway-steps": {
-            "line": [
-                1220,
-                25
-            ]
-        },
-        "railway-rail": {
-            "line": [
-                1280,
-                25
-            ]
-        },
-        "railway-disused": {
-            "line": [
-                1340,
-                25
-            ]
-        },
-        "railway-abandoned": {
-            "line": [
-                1400,
-                25
-            ]
-        },
-        "railway-subway": {
-            "line": [
-                1460,
-                25
-            ]
-        },
-        "railway-light-rail": {
-            "line": [
-                1520,
-                25
-            ]
-        },
-        "railway-monorail": {
-            "line": [
-                1580,
-                25
-            ]
-        },
-        "waterway-river": {
-            "line": [
-                1640,
-                25
-            ]
-        },
-        "waterway-stream": {
-            "line": [
-                1700,
-                25
-            ]
-        },
-        "waterway-canal": {
-            "line": [
-                1760,
-                25
-            ]
-        },
-        "waterway-ditch": {
-            "line": [
-                1820,
-                25
-            ]
-        },
-        "power-line": {
-            "line": [
-                1880,
-                25
-            ]
-        },
-        "other-line": {
-            "line": [
-                1940,
-                25
-            ]
-        },
-        "category-roads": {
-            "line": [
-                2000,
-                25
-            ]
-        },
-        "category-rail": {
-            "line": [
-                2060,
-                25
-            ]
-        },
-        "category-path": {
-            "line": [
-                2120,
-                25
-            ]
-        },
-        "category-water": {
-            "line": [
-                2180,
-                25
-            ]
-        },
-        "pipeline": {
-            "line": [
-                2300,
-                25
-            ]
-        },
-        "relation": {
-            "relation": [
-                20,
-                25
-            ]
-        },
-        "restriction": {
-            "relation": [
-                80,
-                25
-            ]
-        },
-        "multipolygon": {
-            "relation": [
-                140,
-                25
-            ]
-        },
-        "boundary": {
-            "relation": [
-                200,
-                25
-            ]
-        },
-        "route": {
-            "relation": [
-                260,
-                25
-            ]
-        },
-        "route-road": {
-            "relation": [
-                320,
-                25
-            ]
-        },
-        "route-bicycle": {
-            "relation": [
-                380,
-                25
-            ]
-        },
-        "route-foot": {
-            "relation": [
-                440,
-                25
-            ]
-        },
-        "route-bus": {
-            "relation": [
-                500,
-                25
-            ]
-        },
-        "route-train": {
-            "relation": [
-                560,
-                25
-            ]
-        },
-        "route-detour": {
-            "relation": [
-                620,
-                25
-            ]
-        },
-        "route-tram": {
-            "relation": [
-                680,
-                25
-            ]
-        },
-        "route-ferry": {
-            "relation": [
-                740,
-                25
-            ]
-        },
-        "route-power": {
-            "relation": [
-                800,
-                25
-            ]
-        },
-        "route-pipeline": {
-            "relation": [
-                860,
-                25
-            ]
-        },
-        "route-master": {
-            "relation": [
-                920,
-                25
-            ]
-        },
-        "restriction-no-straight-on": {
-            "relation": [
-                980,
-                25
-            ]
-        },
-        "restriction-no-u-turn": {
-            "relation": [
-                1040,
-                25
-            ]
-        },
-        "restriction-no-left-turn": {
-            "relation": [
-                1100,
-                25
-            ]
-        },
-        "restriction-no-right-turn": {
-            "relation": [
-                1160,
-                25
-            ]
-        },
-        "restriction-only-straight-on": {
-            "relation": [
-                1220,
-                25
-            ]
-        },
-        "restriction-only-left-turn": {
-            "relation": [
-                1280,
-                25
-            ]
-        },
-        "restriction-only-right-turn": {
-            "relation": [
-                1340,
-                25
-            ]
-        }
-    },
-    "operations": {
-        "icon-operation-delete": [
-            0,
-            140
-        ],
-        "icon-operation-circularize": [
-            20,
-            140
-        ],
-        "icon-operation-straighten": [
-            40,
-            140
-        ],
-        "icon-operation-split": [
-            60,
-            140
-        ],
-        "icon-operation-disconnect": [
-            80,
-            140
-        ],
-        "icon-operation-reverse": [
-            100,
-            140
-        ],
-        "icon-operation-move": [
-            120,
-            140
-        ],
-        "icon-operation-merge": [
-            140,
-            140
-        ],
-        "icon-operation-orthogonalize": [
-            160,
-            140
-        ],
-        "icon-operation-rotate": [
-            180,
-            140
-        ],
-        "icon-operation-simplify": [
-            200,
-            140
-        ],
-        "icon-operation-continue": [
-            220,
-            140
-        ],
-        "icon-operation-disabled-delete": [
-            0,
-            160
-        ],
-        "icon-operation-disabled-circularize": [
-            20,
-            160
-        ],
-        "icon-operation-disabled-straighten": [
-            40,
-            160
-        ],
-        "icon-operation-disabled-split": [
-            60,
-            160
-        ],
-        "icon-operation-disabled-disconnect": [
-            80,
-            160
-        ],
-        "icon-operation-disabled-reverse": [
-            100,
-            160
-        ],
-        "icon-operation-disabled-move": [
-            120,
-            160
-        ],
-        "icon-operation-disabled-merge": [
-            140,
-            160
-        ],
-        "icon-operation-disabled-orthogonalize": [
-            160,
-            160
-        ],
-        "icon-operation-disabled-rotate": [
-            180,
-            160
-        ],
-        "icon-operation-disabled-simplify": [
-            200,
-            160
-        ],
-        "icon-operation-disabled-continue": [
-            220,
-            160
-        ],
-        "icon-restriction-yes": [
-            50,
-            80
-        ],
-        "icon-restriction-no": [
-            95,
-            80
-        ],
-        "icon-restriction-only": [
-            140,
-            80
-        ],
-        "icon-restriction-yes-u": [
-            185,
-            80
-        ],
-        "icon-restriction-no-u": [
-            230,
-            80
-        ],
-        "icon-restriction-only-u": [
-            275,
-            80
-        ]
-    },
-    "locales": [
-        "af",
-        "sq",
-        "sq-AL",
-        "ar",
-        "ar-AA",
-        "hy",
-        "ast",
-        "bn",
-        "bs",
-        "bg-BG",
-        "ca",
-        "zh",
-        "zh-CN",
-        "zh-CN.GB2312",
-        "gan",
-        "zh-HK",
-        "zh-TW",
-        "yue",
-        "hr",
-        "cs",
-        "da",
-        "nl",
-        "en-GB",
-        "eo",
-        "et",
-        "fi",
-        "fr",
-        "gl",
-        "de",
-        "el",
-        "hu",
-        "is",
-        "id",
-        "it",
-        "ja",
-        "kn",
-        "km",
-        "km-KH",
-        "ko",
-        "ko-KR",
-        "lv",
-        "lt",
-        "no",
-        "nn",
-        "fa",
-        "pl",
-        "pt",
-        "pt-BR",
-        "ro-RO",
-        "ru",
-        "sc",
-        "sr",
-        "sr-RS",
-        "si",
-        "sk",
-        "sl",
-        "es",
-        "sv",
-        "tl",
-        "ta",
-        "te",
-        "tr",
-        "uk",
-        "vi"
-    ],
-    "en": {
-        "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."
-            },
-            "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."
-            }
-        },
-        "operations": {
-            "add": {
-                "annotation": {
-                    "point": "Added a point.",
-                    "vertex": "Added a node to a way.",
-                    "relation": "Added a relation."
-                }
-            },
-            "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."
-            },
-            "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."
-            },
-            "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."
-            },
-            "delete": {
-                "title": "Delete",
-                "description": "Delete object 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} objects."
-                },
-                "incomplete_relation": "This feature can't be deleted because it hasn't been fully downloaded."
-            },
-            "add_member": {
-                "annotation": "Added a member to a relation."
-            },
-            "delete_member": {
-                "annotation": "Removed a member from a relation."
-            },
-            "connect": {
-                "annotation": {
-                    "point": "Connected a way to a point.",
-                    "vertex": "Connected a way to another.",
-                    "line": "Connected a way to a line.",
-                    "area": "Connected a way to an area."
-                }
-            },
-            "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."
-            },
-            "merge": {
-                "title": "Merge",
-                "description": "Merge these lines.",
-                "key": "C",
-                "annotation": "Merged {n} lines.",
-                "not_eligible": "These features can't be merged.",
-                "not_adjacent": "These lines can't be merged because they aren't connected.",
-                "restriction": "These lines can't be merged because at least one is a member of a \"{relation}\" relation.",
-                "incomplete_relation": "These features can't be merged because at least one hasn't been fully downloaded."
-            },
-            "move": {
-                "title": "Move",
-                "description": "Move this 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 objects."
-                },
-                "incomplete_relation": "This feature can't be moved because it hasn't been fully downloaded.",
-                "too_large": "This can't be moved because not enough of it is currently visible."
-            },
-            "rotate": {
-                "title": "Rotate",
-                "description": "Rotate this object around its center point.",
-                "key": "R",
-                "annotation": {
-                    "line": "Rotated a line.",
-                    "area": "Rotated an area."
-                },
-                "too_large": "This can't be rotated because not enough of it is currently visible."
-            },
-            "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."
-            },
-            "restriction": {
-                "help": {
-                    "select": "Click to select a road segment.",
-                    "toggle": "Click to toggle turn restrictions.",
-                    "toggle_on": "Click to add a \"{restriction}\" restriction.",
-                    "toggle_off": "Click to remove the \"{restriction}\" restriction."
-                },
-                "annotation": {
-                    "create": "Added a turn restriction",
-                    "delete": "Deleted a turn restriction"
-                }
-            }
-        },
-        "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 9 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",
-        "logout": "logout",
-        "loading_auth": "Connecting to OpenStreetMap...",
-        "report_a_bug": "report a bug",
-        "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."
-        },
-        "commit": {
-            "title": "Save Changes",
-            "description_placeholder": "Brief description of your contributions",
-            "message_label": "Commit message",
-            "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.",
-            "save": "Save",
-            "cancel": "Cancel",
-            "changes": "{count} Changes",
-            "warnings": "Warnings",
-            "modified": "Modified",
-            "deleted": "Deleted",
-            "created": "Created"
-        },
-        "contributors": {
-            "list": "Edits by {users}",
-            "truncated_list": "Edits by {users} and {count} others"
-        },
-        "geocoder": {
-            "search": "Search worldwide...",
-            "no_results_visible": "No results in visible map area",
-            "no_results_worldwide": "No results found"
-        },
-        "geolocate": {
-            "title": "Show My Location"
-        },
-        "inspector": {
-            "no_documentation_combination": "There is no documentation available for this tag combination",
-            "no_documentation_key": "There is no documentation available for this key",
-            "show_more": "Show More",
-            "view_on_osm": "View on openstreetmap.org",
-            "all_tags": "All tags",
-            "all_members": "All members",
-            "all_relations": "All relations",
-            "new_relation": "New relation...",
-            "role": "Role",
-            "choose": "Select feature type",
-            "results": "{n} results for {search}",
-            "reference": "View on OpenStreetMap Wiki",
-            "back_tooltip": "Change feature",
-            "remove": "Remove",
-            "search": "Search",
-            "multiselect": "Selected items",
-            "unknown": "Unknown",
-            "incomplete": "<not downloaded>",
-            "feature_list": "Search features",
-            "edit": "Edit feature",
-            "check": {
-                "yes": "Yes",
-                "no": "No"
-            },
-            "none": "None",
-            "node": "Node",
-            "way": "Way",
-            "relation": "Relation",
-            "location": "Location"
-        },
-        "background": {
-            "title": "Background",
-            "description": "Background settings",
-            "percent_brightness": "{opacity}% brightness",
-            "none": "None",
-            "custom": "Custom",
-            "custom_button": "Edit custom background",
-            "custom_prompt": "Enter a tile URL template. Valid tokens are {z}, {x}, {y} for Z/X/Y scheme and {u} for quadtile scheme.",
-            "fix_misalignment": "Fix alignment",
-            "reset": "reset"
-        },
-        "restore": {
-            "heading": "You have unsaved changes",
-            "description": "Do you wish to restore unsaved changes from a previous editing session?",
-            "restore": "Restore",
-            "reset": "Reset"
-        },
-        "save": {
-            "title": "Save",
-            "help": "Save changes to OpenStreetMap, making them visible to other users.",
-            "no_changes": "No changes to save.",
-            "error": "An error occurred while trying to save",
-            "unknown_error_details": "Please ensure you are connected to the internet.",
-            "uploading": "Uploading changes to OpenStreetMap.",
-            "unsaved_changes": "You have unsaved changes"
-        },
-        "success": {
-            "edited_osm": "Edited OSM!",
-            "just_edited": "You just edited OpenStreetMap!",
-            "view_on_osm": "View on OSM",
-            "facebook": "Share on Facebook",
-            "twitter": "Share on Twitter",
-            "google": "Share on Google+",
-            "help_html": "Your changes should appear in the \"Standard\" layer in a few minutes. Other layers, and certain features, may take longer\n(<a href='https://help.openstreetmap.org/questions/4705/why-havent-my-changes-appeared-on-the-map' target='_blank'>details</a>).\n"
-        },
-        "confirm": {
-            "okay": "Okay"
-        },
-        "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"
-        },
-        "tag_reference": {
-            "description": "Description",
-            "on_wiki": "{tag} on wiki.osm.org",
-            "used_with": "used with {type}"
-        },
-        "validations": {
-            "untagged_point": "Untagged point",
-            "untagged_line": "Untagged line",
-            "untagged_area": "Untagged area",
-            "many_deletions": "You're deleting {n} objects. Are you sure you want to do this? This will delete them from the map that everyone else sees on openstreetmap.org.",
-            "tag_suggests_area": "The tag {tag} suggests line should be area, but it is not an area",
-            "untagged_point_tooltip": "Select a feature type that describes what this point is.",
-            "untagged_line_tooltip": "Select a feature type that describes what this line is.",
-            "untagged_area_tooltip": "Select a feature type that describes what this area is.",
-            "deprecated_tags": "Deprecated tags: {tags}"
-        },
-        "zoom": {
-            "in": "Zoom In",
-            "out": "Zoom Out"
-        },
-        "cannot_zoom": "Cannot zoom out further in current mode.",
-        "gpx": {
-            "local_layer": "Local GPX file",
-            "drag_drop": "Drag and drop a .gpx file on the page, or click the button to the right to browse",
-            "zoom": "Zoom to GPX track",
-            "browse": "Browse for a .gpx file"
-        },
-        "mapillary": {
-            "tooltip": "Street-level photos from Mapillary",
-            "title": "Photo Overlay (Mapillary)",
-            "view_on_mapillary": "View this image on Mapillary"
-        },
-        "help": {
-            "title": "Help",
-            "help": "# Help\n\nThis is an editor for [OpenStreetMap](http://www.openstreetmap.org/), the\nfree and editable map of the world. You can use it to add and update\ndata in your area, making an open-source and open-data map of the world\nbetter for everyone.\n\nEdits that you make on this map will be visible to everyone who uses\nOpenStreetMap. In order to make an edit, you'll need a\n[free OpenStreetMap account](https://www.openstreetmap.org/user/new).\n\nThe [iD editor](http://ideditor.com/) is a collaborative project with [source\ncode available on GitHub](https://github.com/openstreetmap/iD).\n",
-            "editing_saving": "# Editing & Saving\n\nThis editor is designed to work primarily online, and you're accessing\nit through a website right now.\n\n### Selecting Features\n\nTo select a map feature, like a road or point of interest, click\non it on the map. This will highlight the selected feature, open a panel with\ndetails about it, and show a menu of things you can do with the feature.\n\nTo select multiple features, hold down the 'Shift' key. Then either click\non the features you want to select, or drag on the map to draw a rectangle.\nThis will draw a box and select all the points within it.\n\n### Saving Edits\n\nWhen you make changes like editing roads, buildings, and places, these are\nstored locally until you save them to the server. Don't worry if you make\na mistake - you can undo changes by clicking the undo button, and redo\nchanges by clicking the redo button.\n\nClick 'Save' to finish a group of edits - for instance, if you've completed\nan area of town and would like to start on a new area. You'll have a chance\nto review what you've done, and the editor supplies helpful suggestions\nand warnings if something doesn't seem right about the changes.\n\nIf everything looks good, you can enter a short comment explaining the change\nyou made, and click 'Save' again to post the changes\nto [OpenStreetMap.org](http://www.openstreetmap.org/), where they are visible\nto all other users and available for others to build and improve upon.\n\nIf you can't finish your edits in one sitting, you can leave the editor\nwindow and come back (on the same browser and computer), and the\neditor application will offer to restore your work.\n",
-            "roads": "# Roads\n\nYou can create, fix, and delete roads with this editor. Roads can be all\nkinds: paths, highways, trails, cycleways, and more - any often-crossed\nsegment should be mappable.\n\n### Selecting\n\nClick on a road to select it. An outline should become visible, along\nwith a small tools menu on the map and a sidebar showing more information\nabout the road.\n\n### Modifying\n\nOften you'll see roads that aren't aligned to the imagery behind them\nor to a GPS track. You can adjust these roads so they are in the correct\nplace.\n\nFirst click on the road you want to change. This will highlight it and show\ncontrol points along it that you can drag to better locations. If\nyou want to add new control points for more detail, double-click a part\nof the road without a node, and one will be added.\n\nIf the road connects to another road, but doesn't properly connect on\nthe map, you can drag one of its control points onto the other road in\norder to join them. Having roads connect is important for the map\nand essential for providing driving directions.\n\nYou can also click the 'Move' tool or press the `M` shortcut key to move the entire road at\none time, and then click again to save that movement.\n\n### Deleting\n\nIf a road is entirely incorrect - you can see that it doesn't exist in satellite\nimagery and ideally have confirmed locally that it's not present - you can delete\nit, which removes it from the map. Be cautious when deleting features -\nlike any other edit, the results are seen by everyone and satellite imagery\nis often out of date, so the road could simply be newly built.\n\nYou can delete a road by clicking on it to select it, then clicking the\ntrash can icon or pressing the 'Delete' key.\n\n### Creating\n\nFound somewhere there should be a road but there isn't? Click the 'Line'\nicon in the top-left of the editor or press the shortcut key `2` to start drawing\na line.\n\nClick on the start of the road on the map to start drawing. If the road\nbranches off from an existing road, start by clicking on the place where they connect.\n\nThen click on points along the road so that it follows the right path, according\nto satellite imagery or GPS. If the road you are drawing crosses another road, connect\nit by clicking on the intersection point. When you're done drawing, double-click\nor press 'Return' or 'Enter' on your keyboard.\n",
-            "gps": "# GPS\n\nGPS data is the most trusted source of data for OpenStreetMap. This editor\nsupports local traces - `.gpx` files on your local computer. You can collect\nthis kind of GPS trace with a number of smartphone applications as well as\npersonal GPS hardware.\n\nFor information on how to perform a GPS survey, read\n[Surveying with a GPS](http://learnosm.org/en/beginner/using-gps/).\n\nTo use a GPX track for mapping, drag and drop the GPX file onto the map\neditor. If it's recognized, it will be added to the map as a bright green\nline. Click on the 'Background Settings' menu on the right side to enable,\ndisable, or zoom to this new GPX-powered layer.\n\nThe GPX track isn't directly uploaded to OpenStreetMap - the best way to\nuse it is to draw on the map, using it as a guide for the new features that\nyou add, and also to [upload it to OpenStreetMap](http://www.openstreetmap.org/trace/create)\nfor other users to use.\n",
-            "imagery": "# Imagery\n\nAerial imagery is an important resource for mapping. A combination of\nairplane flyovers, satellite views, and freely-compiled sources are available\nin the editor under the 'Background Settings' menu on the right.\n\nBy default a [Bing Maps](http://www.bing.com/maps/) satellite layer is\npresented in the editor, but as you pan and zoom the map to new geographical\nareas, new sources will become available. Some countries, like the United\nStates, France, and Denmark have very high-quality imagery available for some areas.\n\nImagery is sometimes offset from the map data because of a mistake on the\nimagery provider's side. If you see a lot of roads shifted from the background,\ndon't immediately move them all to match the background. Instead you can adjust\nthe imagery so that it matches the existing data by clicking 'Fix alignment' at\nthe bottom of the Background Settings UI.\n",
-            "addresses": "# Addresses\n\nAddresses are some of the most useful information for the map.\n\nAlthough addresses are often represented as parts of streets, in OpenStreetMap\nthey're recorded as attributes of buildings and places along streets.\n\nYou can add address information to places mapped as building outlines\nas well as those mapped as single points. The optimal source of address\ndata is from an on-the-ground survey or personal knowledge - as with any\nother feature, copying from commercial sources like Google Maps is strictly\nforbidden.\n",
-            "inspector": "# Using the Inspector\n\nThe inspector is the section on the left side of the page that allows you to\nedit the details of the selected feature.\n\n### Selecting a Feature Type\n\nAfter you add a point, line, or area, you can choose what type of feature it\nis, like whether it's a highway or residential road, supermarket or cafe.\nThe inspector will display buttons for common feature types, and you can\nfind others by typing what you're looking for in the search box.\n\nClick the 'i' in the bottom-right-hand corner of a feature type button to\nlearn more about it. Click a button to choose that type.\n\n### Using Forms and Editing Tags\n\nAfter you choose a feature type, or when you select a feature that already\nhas a type assigned, the inspector will display fields with details about\nthe feature like its name and address.\n\nBelow the fields you see, you can click icons to add other details,\nlike [Wikipedia](http://www.wikipedia.org/) information, wheelchair\naccess, and more.\n\nAt the bottom of the inspector, click 'Additional tags' to add arbitrary\nother tags to the element. [Taginfo](http://taginfo.openstreetmap.org/) is a\ngreat resource for learn more about popular tag combinations.\n\nChanges you make in the inspector are automatically applied to the map.\nYou can undo them at any time by clicking the 'Undo' button.\n",
-            "buildings": "# Buildings\n\nOpenStreetMap is the world's largest database of buildings. You can create\nand improve this database.\n\n### Selecting\n\nYou can select a building by clicking on its border. This will highlight the\nbuilding and open a small tools menu and a sidebar showing more information\nabout the building.\n\n### Modifying\n\nSometimes buildings are incorrectly placed or have incorrect tags.\n\nTo move an entire building, select it, then click the 'Move' tool. Move your\nmouse to shift the building, and click when it's correctly placed.\n\nTo fix the specific shape of a building, click and drag the nodes that form\nits border into better places.\n\n### Creating\n\nOne of the main questions around adding buildings to the map is that\nOpenStreetMap records buildings both as shapes and points. The rule of thumb\nis to _map a building as a shape whenever possible_, and map companies, homes,\namenities, and other things that operate out of buildings as points placed\nwithin the building shape.\n\nStart drawing a building as a shape by clicking the 'Area' button in the top\nleft of the interface, and end it either by pressing 'Return' on your keyboard\nor clicking on the first node drawn to close the shape.\n\n### Deleting\n\nIf a building is entirely incorrect - you can see that it doesn't exist in satellite\nimagery and ideally have confirmed locally that it's not present - you can delete\nit, which removes it from the map. Be cautious when deleting features -\nlike any other edit, the results are seen by everyone and satellite imagery\nis often out of date, so the building could simply be newly built.\n\nYou can delete a building by clicking on it to select it, then clicking the\ntrash can icon or pressing the 'Delete' key.\n",
-            "relations": "# Relations\n\nA relation is a special type of feature in OpenStreetMap that groups together\nother features. For example, two common types of relations are *route relations*,\nwhich group together sections of road that belong to a specific freeway or\nhighway, and *multipolygons*, which group together several lines that define\na complex area (one with several pieces or holes in it like a donut).\n\nThe group of features in a relation are called *members*. In the sidebar, you can\nsee which relations a feature is a member of, and click on a relation there\nto select the it. When the relation is selected, you can see all of its\nmembers listed in the sidebar and highlighted on the map.\n\nFor the most part, iD will take care of maintaining relations automatically\nwhile you edit. The main thing you should be aware of is that if you delete a\nsection of road to redraw it more accurately, you should make sure that the\nnew section is a member of the same relations as the original.\n\n## Editing Relations\n\nIf you want to edit relations, here are the basics.\n\nTo add a feature to a relation, select the feature, click the \"+\" button in the\n\"All relations\" section of the sidebar, and select or type the name of the relation.\n\nTo create a new relation, select the first feature that should be a member,\nclick the \"+\" button in the \"All relations\" section, and select \"New relation...\".\n\nTo remove a feature from a relation, select the feature and click the trash\nbutton next to the relation you want to remove it from.\n\nYou can create multipolygons with holes using the \"Merge\" tool. Draw two areas (inner\nand outer), hold the Shift key and click on each of them to select them both, and then\nclick the \"Merge\" (+) button.\n"
-        },
-        "intro": {
-            "navigation": {
-                "title": "Navigation",
-                "drag": "The main map area shows OpenStreetMap data on top of a background. You can navigate by dragging and scrolling, just like any web map. **Drag the map!**",
-                "select": "Map features are represented three ways: using points, lines or areas. All features can be selected by clicking on them. **Click on the point to select it.**",
-                "header": "The header shows us the feature type.",
-                "pane": "When a feature is selected, the feature editor is displayed. The header shows us the feature type and the main pane shows the feature's attributes, such as its name and address. **Close the feature editor with the close button in the top right.**"
-            },
-            "points": {
-                "title": "Points",
-                "add": "Points can be used to represent features such as shops, restaurants and monuments. They mark a specific location, and describe what's there. **Click the Point button to add a new point.**",
-                "place": "The point can be placed by clicking on the map. **Place the point on top of the building.**",
-                "search": "There are many different features that can be represented by points. The point you just added is a Cafe. **Search for '{name}'**",
-                "choose": "**Choose Cafe from the list.**",
-                "describe": "The point is now marked as a cafe. Using the feature editor, we can add more information about the feature. **Add a name**",
-                "close": "The feature editor can be closed by clicking on the close button. **Close the feature editor**",
-                "reselect": "Often points will already exist, but have mistakes or be incomplete. We can edit existing points. **Select the point you just created.**",
-                "fixname": "**Change the name and close the feature editor.**",
-                "reselect_delete": "All features on the map can be deleted. **Click on the point you created.**",
-                "delete": "The menu around the point contains operations that can be performed on it, including delete. **Delete the point.**"
-            },
-            "areas": {
-                "title": "Areas",
-                "add": "Areas are used to show the boundaries of features like lakes, buildings, and residential areas. They can be also be used for more detailed mapping of many features you might normally map as points. **Click the Area button to add a new area.**",
-                "corner": "Areas are drawn by placing nodes that mark the boundary of the area. **Place the starting node on one of the corners of the playground.**",
-                "place": "Draw the area by placing more nodes. Finish the area by clicking on the starting node. **Draw an area for the playground.**",
-                "search": "**Search for '{name}'.**",
-                "choose": "**Choose Playground from the list.**",
-                "describe": "**Add a name, and close the feature editor**"
-            },
-            "lines": {
-                "title": "Lines",
-                "add": "Lines are used to represent features such as roads, railroads and rivers. **Click the Line button to add a new line.**",
-                "start": "**Start the line by clicking on the end of the road.**",
-                "intersect": "Click to add more nodes to the line. You can drag the map while drawing if necessary. 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 Flower Street, to create an intersection connecting the two lines.**",
-                "finish": "Lines can be finished by clicking on the last node again. **Finish drawing the road.**",
-                "road": "**Select Road from the list**",
-                "residential": "There are different types of roads, the most common of which is Residential. **Choose the Residential road type**",
-                "describe": "**Name the road and close the feature editor.**",
-                "restart": "The road needs to intersect Flower Street.",
-                "wrong_preset": "You didn't select the Residential road type. **Click here to choose again**"
-            },
-            "startediting": {
-                "title": "Start Editing",
-                "help": "More documentation and this walkthrough are available here.",
-                "save": "Don't forget to regularly save your changes!",
-                "start": "Start mapping!"
-            }
-        },
-        "presets": {
-            "categories": {
-                "category-building": {
-                    "name": "Building"
-                },
-                "category-golf": {
-                    "name": "Golf"
-                },
-                "category-landuse": {
-                    "name": "Land Use"
-                },
-                "category-path": {
-                    "name": "Path"
-                },
-                "category-rail": {
-                    "name": "Rail"
-                },
-                "category-restriction": {
-                    "name": "Restriction"
-                },
-                "category-road": {
-                    "name": "Road"
-                },
-                "category-route": {
-                    "name": "Route"
-                },
-                "category-water-area": {
-                    "name": "Water"
-                },
-                "category-water-line": {
-                    "name": "Water"
-                }
-            },
-            "fields": {
-                "access": {
-                    "label": "Access",
-                    "placeholder": "Unknown",
-                    "types": {
-                        "access": "General",
-                        "foot": "Foot",
-                        "motor_vehicle": "Motor Vehicles",
-                        "bicycle": "Bicycles",
-                        "horse": "Horses"
-                    },
-                    "options": {
-                        "yes": {
-                            "title": "Allowed",
-                            "description": "Access permitted by law; a right of way"
-                        },
-                        "no": {
-                            "title": "Prohibited",
-                            "description": "Access not permitted to the general public"
-                        },
-                        "permissive": {
-                            "title": "Permissive",
-                            "description": "Access permitted until such time as the owner revokes the permission"
-                        },
-                        "private": {
-                            "title": "Private",
-                            "description": "Access permitted only with permission of the owner on an individual basis"
-                        },
-                        "designated": {
-                            "title": "Designated",
-                            "description": "Access permitted according to signs or specific local laws"
-                        },
-                        "destination": {
-                            "title": "Destination",
-                            "description": "Access permitted only to reach a destination"
-                        }
-                    }
-                },
-                "access_simple": {
-                    "label": "Access",
-                    "placeholder": "yes"
-                },
-                "access_toilets": {
-                    "label": "Access"
-                },
-                "address": {
-                    "label": "Address",
-                    "placeholders": {
-                        "housename": "Housename",
-                        "housenumber": "123",
-                        "street": "Street",
-                        "city": "City",
-                        "postcode": "Postcode",
-                        "place": "Place",
-                        "hamlet": "Hamlet",
-                        "suburb": "Suburb",
-                        "subdistrict": "Subdistrict",
-                        "district": "District",
-                        "province": "Province",
-                        "state": "State",
-                        "country": "Country"
-                    }
-                },
-                "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"
-                },
-                "amenity": {
-                    "label": "Type"
-                },
-                "artist": {
-                    "label": "Artist"
-                },
-                "artwork_type": {
-                    "label": "Type"
-                },
-                "atm": {
-                    "label": "ATM"
-                },
-                "backrest": {
-                    "label": "Backrest"
-                },
-                "barrier": {
-                    "label": "Type"
-                },
-                "bicycle_parking": {
-                    "label": "Type"
-                },
-                "boundary": {
-                    "label": "Type"
-                },
-                "building": {
-                    "label": "Building"
-                },
-                "building_area": {
-                    "label": "Building"
-                },
-                "capacity": {
-                    "label": "Capacity",
-                    "placeholder": "50, 100, 200..."
-                },
-                "cardinal_direction": {
-                    "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"
-                    }
-                },
-                "clock_direction": {
-                    "label": "Direction",
-                    "options": {
-                        "clockwise": "Clockwise",
-                        "anticlockwise": "Counterclockwise"
-                    }
-                },
-                "collection_times": {
-                    "label": "Collection Times"
-                },
-                "construction": {
-                    "label": "Type"
-                },
-                "country": {
-                    "label": "Country"
-                },
-                "covered": {
-                    "label": "Covered"
-                },
-                "craft": {
-                    "label": "Type"
-                },
-                "crop": {
-                    "label": "Crop"
-                },
-                "crossing": {
-                    "label": "Type"
-                },
-                "cuisine": {
-                    "label": "Cuisine"
-                },
-                "denomination": {
-                    "label": "Denomination"
-                },
-                "denotation": {
-                    "label": "Denotation"
-                },
-                "description": {
-                    "label": "Description"
-                },
-                "electrified": {
-                    "label": "Electrification",
-                    "placeholder": "Contact Line, Electrified Rail...",
-                    "options": {
-                        "contact_line": "Contact Line",
-                        "rail": "Electrified Rail",
-                        "yes": "Yes (unspecified)",
-                        "no": "No"
-                    }
-                },
-                "elevation": {
-                    "label": "Elevation"
-                },
-                "emergency": {
-                    "label": "Emergency"
-                },
-                "entrance": {
-                    "label": "Type"
-                },
-                "except": {
-                    "label": "Exceptions"
-                },
-                "fax": {
-                    "label": "Fax",
-                    "placeholder": "+31 42 123 4567"
-                },
-                "fee": {
-                    "label": "Fee"
-                },
-                "fire_hydrant/type": {
-                    "label": "Type",
-                    "options": {
-                        "pillar": "Pillar/Aboveground",
-                        "underground": "Underground",
-                        "wall": "Wall",
-                        "pond": "Pond"
-                    }
-                },
-                "fixme": {
-                    "label": "Fix Me"
-                },
-                "fuel": {
-                    "label": "Fuel"
-                },
-                "fuel/biodiesel": {
-                    "label": "Sells Biodiesel"
-                },
-                "fuel/diesel": {
-                    "label": "Sells Diesel"
-                },
-                "fuel/e10": {
-                    "label": "Sells E10"
-                },
-                "fuel/e85": {
-                    "label": "Sells E85"
-                },
-                "fuel/lpg": {
-                    "label": "Sells Propane"
-                },
-                "fuel/octane_100": {
-                    "label": "Sells Racing Gasoline"
-                },
-                "fuel/octane_91": {
-                    "label": "Sells Regular Gasoline"
-                },
-                "fuel/octane_95": {
-                    "label": "Sells Midgrade Gasoline"
-                },
-                "fuel/octane_98": {
-                    "label": "Sells Premium Gasoline"
-                },
-                "gauge": {
-                    "label": "Gauge"
-                },
-                "generator/method": {
-                    "label": "Method"
-                },
-                "generator/source": {
-                    "label": "Source"
-                },
-                "generator/type": {
-                    "label": "Type"
-                },
-                "golf_hole": {
-                    "label": "Reference",
-                    "placeholder": "Hole number (1-18)"
-                },
-                "handicap": {
-                    "label": "Handicap",
-                    "placeholder": "1-18"
-                },
-                "highway": {
-                    "label": "Type"
-                },
-                "historic": {
-                    "label": "Type"
-                },
-                "hoops": {
-                    "label": "Hoops",
-                    "placeholder": "1, 2, 4..."
-                },
-                "iata": {
-                    "label": "IATA"
-                },
-                "icao": {
-                    "label": "ICAO"
-                },
-                "incline": {
-                    "label": "Incline"
-                },
-                "information": {
-                    "label": "Type"
-                },
-                "internet_access": {
-                    "label": "Internet Access",
-                    "options": {
-                        "yes": "Yes",
-                        "no": "No",
-                        "wlan": "Wifi",
-                        "wired": "Wired",
-                        "terminal": "Terminal"
-                    }
-                },
-                "lamp_type": {
-                    "label": "Type"
-                },
-                "landuse": {
-                    "label": "Type"
-                },
-                "lanes": {
-                    "label": "Lanes",
-                    "placeholder": "1, 2, 3..."
-                },
-                "layer": {
-                    "label": "Layer"
-                },
-                "leisure": {
-                    "label": "Type"
-                },
-                "length": {
-                    "label": "Length (Meters)"
-                },
-                "levels": {
-                    "label": "Levels",
-                    "placeholder": "2, 4, 6..."
-                },
-                "lit": {
-                    "label": "Lit"
-                },
-                "location": {
-                    "label": "Location"
-                },
-                "man_made": {
-                    "label": "Type"
-                },
-                "maxspeed": {
-                    "label": "Speed Limit",
-                    "placeholder": "40, 50, 60..."
-                },
-                "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": {
-                    "label": "Network"
-                },
-                "note": {
-                    "label": "Note"
-                },
-                "office": {
-                    "label": "Type"
-                },
-                "oneway": {
-                    "label": "One Way",
-                    "options": {
-                        "undefined": "Assumed to be No",
-                        "yes": "Yes",
-                        "no": "No"
-                    }
-                },
-                "oneway_yes": {
-                    "label": "One Way",
-                    "options": {
-                        "undefined": "Assumed to be Yes",
-                        "yes": "Yes",
-                        "no": "No"
-                    }
-                },
-                "opening_hours": {
-                    "label": "Hours"
-                },
-                "operator": {
-                    "label": "Operator"
-                },
-                "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"
-                    }
-                },
-                "phone": {
-                    "label": "Phone",
-                    "placeholder": "+31 42 123 4567"
-                },
-                "piste/difficulty": {
-                    "label": "Difficulty",
-                    "placeholder": "Easy, Intermediate, Advanced...",
-                    "options": {
-                        "novice": "Novice (instructional)",
-                        "easy": "Easy (green circle)",
-                        "intermediate": "Intermediate (blue square)",
-                        "advanced": "Advanced (black diamond)",
-                        "expert": "Expert (double black diamond)",
-                        "freeride": "Freeride (off-piste)",
-                        "extreme": "Extreme (climbing equipment required)"
-                    }
-                },
-                "piste/grooming": {
-                    "label": "Grooming",
-                    "options": {
-                        "classic": "Classic",
-                        "mogul": "Mogul",
-                        "backcountry": "Backcountry",
-                        "classic+skating": "Classic and Skating",
-                        "scooter": "Scooter/Snowmobile",
-                        "skating": "Skating"
-                    }
-                },
-                "piste/type": {
-                    "label": "Type",
-                    "options": {
-                        "downhill": "Downhill",
-                        "nordic": "Nordic",
-                        "skitour": "Skitour",
-                        "sled": "Sled",
-                        "hike": "Hike",
-                        "sleigh": "Sleigh",
-                        "ice_skate": "Ice Skate",
-                        "snow_park": "Snow Park",
-                        "playground": "Playground"
-                    }
-                },
-                "place": {
-                    "label": "Type"
-                },
-                "population": {
-                    "label": "Population"
-                },
-                "power": {
-                    "label": "Type"
-                },
-                "railway": {
-                    "label": "Type"
-                },
-                "recycling/cans": {
-                    "label": "Accepts Cans"
-                },
-                "recycling/clothes": {
-                    "label": "Accepts Clothes"
-                },
-                "recycling/glass": {
-                    "label": "Accepts Glass"
-                },
-                "recycling/paper": {
-                    "label": "Accepts Paper"
-                },
-                "ref": {
-                    "label": "Reference"
-                },
-                "relation": {
-                    "label": "Type"
-                },
-                "religion": {
-                    "label": "Religion"
-                },
-                "restriction": {
-                    "label": "Type"
-                },
-                "restrictions": {
-                    "label": "Turn Restrictions"
-                },
-                "route": {
-                    "label": "Type"
-                },
-                "route_master": {
-                    "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"
-                    }
-                },
-                "seasonal": {
-                    "label": "Seasonal"
-                },
-                "service": {
-                    "label": "Type"
-                },
-                "shelter": {
-                    "label": "Shelter"
-                },
-                "shelter_type": {
-                    "label": "Type"
-                },
-                "shop": {
-                    "label": "Type"
-                },
-                "sloped_curb": {
-                    "label": "Sloped Curb"
-                },
-                "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",
-                        "impassible": "Impassible / No wheeled vehicle"
-                    }
-                },
-                "social_facility_for": {
-                    "label": "People served",
-                    "placeholder": "Homeless, Disabled, Child, etc"
-                },
-                "source": {
-                    "label": "Source"
-                },
-                "sport": {
-                    "label": "Sport"
-                },
-                "sport_ice": {
-                    "label": "Sport"
-                },
-                "sport_racing": {
-                    "label": "Sport"
-                },
-                "structure": {
-                    "label": "Structure",
-                    "placeholder": "Unknown",
-                    "options": {
-                        "bridge": "Bridge",
-                        "tunnel": "Tunnel",
-                        "embankment": "Embankment",
-                        "cutting": "Cutting",
-                        "ford": "Ford"
-                    }
-                },
-                "studio_type": {
-                    "label": "Type"
-                },
-                "supervised": {
-                    "label": "Supervised"
-                },
-                "surface": {
-                    "label": "Surface"
-                },
-                "tactile_paving": {
-                    "label": "Tactile Paving"
-                },
-                "toilets/disposal": {
-                    "label": "Disposal",
-                    "options": {
-                        "flush": "Flush",
-                        "pitlatrine": "Pit/Latrine",
-                        "chemical": "Chemical",
-                        "bucket": "Bucket"
-                    }
-                },
-                "tourism": {
-                    "label": "Type"
-                },
-                "towertype": {
-                    "label": "Tower 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"
-                    }
-                },
-                "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"
-                    }
-                },
-                "tree_type": {
-                    "label": "Type"
-                },
-                "trees": {
-                    "label": "Trees"
-                },
-                "tunnel": {
-                    "label": "Tunnel"
-                },
-                "vending": {
-                    "label": "Type of Goods"
-                },
-                "water": {
-                    "label": "Type"
-                },
-                "waterway": {
-                    "label": "Type"
-                },
-                "website": {
-                    "label": "Website",
-                    "placeholder": "http://example.com/"
-                },
-                "wetland": {
-                    "label": "Type"
-                },
-                "wheelchair": {
-                    "label": "Wheelchair Access"
-                },
-                "width": {
-                    "label": "Width (Meters)"
-                },
-                "wikipedia": {
-                    "label": "Wikipedia"
-                },
-                "wood": {
-                    "label": "Type"
-                }
-            },
-            "presets": {
-                "address": {
-                    "name": "Address",
-                    "terms": ""
-                },
-                "aerialway": {
-                    "name": "Aerialway",
-                    "terms": "ski lift,funifor,funitel"
-                },
-                "aerialway/cable_car": {
-                    "name": "Cable Car",
-                    "terms": "tramway,ropeway"
-                },
-                "aerialway/chair_lift": {
-                    "name": "Chair Lift",
-                    "terms": ""
-                },
-                "aerialway/gondola": {
-                    "name": "Gondola",
-                    "terms": ""
-                },
-                "aerialway/magic_carpet": {
-                    "name": "Magic Carpet 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/station": {
-                    "name": "Aerialway Station",
-                    "terms": ""
-                },
-                "aerialway/t-bar": {
-                    "name": "T-bar Lift",
-                    "terms": ""
-                },
-                "aeroway": {
-                    "name": "Aeroway",
-                    "terms": ""
-                },
-                "aeroway/aerodrome": {
-                    "name": "Airport",
-                    "terms": "airplane,airport,aerodrome"
-                },
-                "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"
-                },
-                "amenity": {
-                    "name": "Amenity",
-                    "terms": ""
-                },
-                "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"
-                },
-                "amenity/bench": {
-                    "name": "Bench",
-                    "terms": ""
-                },
-                "amenity/bicycle_parking": {
-                    "name": "Bicycle Parking",
-                    "terms": "bike"
-                },
-                "amenity/bicycle_rental": {
-                    "name": "Bicycle Rental",
-                    "terms": "bike"
-                },
-                "amenity/boat_rental": {
-                    "name": "Boat Rental",
-                    "terms": ""
-                },
-                "amenity/bureau_de_change": {
-                    "name": "Currency Exchange",
-                    "terms": "bureau de change,money changer"
-                },
-                "amenity/bus_station": {
-                    "name": "Bus Station",
-                    "terms": ""
-                },
-                "amenity/cafe": {
-                    "name": "Cafe",
-                    "terms": "coffee,tea"
-                },
-                "amenity/car_rental": {
-                    "name": "Car Rental",
-                    "terms": ""
-                },
-                "amenity/car_sharing": {
-                    "name": "Car Sharing",
-                    "terms": ""
-                },
-                "amenity/car_wash": {
-                    "name": "Car Wash",
-                    "terms": ""
-                },
-                "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/clock": {
-                    "name": "Clock",
-                    "terms": ""
-                },
-                "amenity/college": {
-                    "name": "College Grounds",
-                    "terms": "university"
-                },
-                "amenity/community_centre": {
-                    "name": "Community Center",
-                    "terms": "event,hall"
-                },
-                "amenity/compressed_air": {
-                    "name": "Compressed Air",
-                    "terms": ""
-                },
-                "amenity/courthouse": {
-                    "name": "Courthouse",
-                    "terms": ""
-                },
-                "amenity/dentist": {
-                    "name": "Dentist",
-                    "terms": "tooth,teeth"
-                },
-                "amenity/doctor": {
-                    "name": "Doctor",
-                    "terms": "medic*"
-                },
-                "amenity/dojo": {
-                    "name": "Dojo / Martial Arts Academy",
-                    "terms": "martial arts,dojang"
-                },
-                "amenity/drinking_water": {
-                    "name": "Drinking Water",
-                    "terms": "fountain,potable"
-                },
-                "amenity/embassy": {
-                    "name": "Embassy",
-                    "terms": ""
-                },
-                "amenity/fast_food": {
-                    "name": "Fast Food",
-                    "terms": "restaurant"
-                },
-                "amenity/fire_station": {
-                    "name": "Fire Station",
-                    "terms": ""
-                },
-                "amenity/fountain": {
-                    "name": "Fountain",
-                    "terms": ""
-                },
-                "amenity/fuel": {
-                    "name": "Gas Station",
-                    "terms": "petrol,fuel,propane,diesel,lng,cng,biodiesel"
-                },
-                "amenity/grave_yard": {
-                    "name": "Graveyard",
-                    "terms": ""
-                },
-                "amenity/hospital": {
-                    "name": "Hospital Grounds",
-                    "terms": "clinic,doctor,emergency room,health service,hospice,infirmary,institution,nursing home,sanatorium,sanitarium,sick,surgery,ward"
-                },
-                "amenity/kindergarten": {
-                    "name": "Preschool/Kindergarten Grounds",
-                    "terms": "kindergarden,pre-school"
-                },
-                "amenity/library": {
-                    "name": "Library",
-                    "terms": "book"
-                },
-                "amenity/marketplace": {
-                    "name": "Marketplace",
-                    "terms": ""
-                },
-                "amenity/nightclub": {
-                    "name": "Nightclub",
-                    "terms": "disco*,night club,dancing,dance club"
-                },
-                "amenity/parking": {
-                    "name": "Car Parking",
-                    "terms": ""
-                },
-                "amenity/parking_entrance": {
-                    "name": "Parking Garage Entrance/Exit",
-                    "terms": ""
-                },
-                "amenity/pharmacy": {
-                    "name": "Pharmacy",
-                    "terms": "drug,medicine"
-                },
-                "amenity/place_of_worship": {
-                    "name": "Place of Worship",
-                    "terms": "abbey,basilica,bethel,cathedral,chancel,chantry,chapel,church,fold,house of God,house of prayer,house of worship,minster,mission,mosque,oratory,parish,sacellum,sanctuary,shrine,synagogue,tabernacle,temple"
-                },
-                "amenity/place_of_worship/buddhist": {
-                    "name": "Buddhist Temple",
-                    "terms": "stupa,vihara,monastery,temple,pagoda,zendo,dojo"
-                },
-                "amenity/place_of_worship/christian": {
-                    "name": "Church",
-                    "terms": "christian,abbey,basilica,bethel,cathedral,chancel,chantry,chapel,fold,house of God,house of prayer,house of worship,minster,mission,oratory,parish,sacellum,sanctuary,shrine,tabernacle,temple"
-                },
-                "amenity/place_of_worship/jewish": {
-                    "name": "Synagogue",
-                    "terms": "jewish"
-                },
-                "amenity/place_of_worship/muslim": {
-                    "name": "Mosque",
-                    "terms": "muslim"
-                },
-                "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/pub": {
-                    "name": "Pub",
-                    "terms": "dive,beer,bier,booze"
-                },
-                "amenity/ranger_station": {
-                    "name": "Ranger Station",
-                    "terms": "visitor center,visitor centre,permit center,permit centre,backcountry office,warden office,warden center"
-                },
-                "amenity/recycling": {
-                    "name": "Recycling",
-                    "terms": "can,bottle,garbage,scrap,trash"
-                },
-                "amenity/restaurant": {
-                    "name": "Restaurant",
-                    "terms": "bar,breakfast,cafe,café,canteen,coffee,dine,dining,dinner,drive-in,eat,grill,lunch,table"
-                },
-                "amenity/school": {
-                    "name": "School Grounds",
-                    "terms": "academy,elementary school,middle school,high school"
-                },
-                "amenity/shelter": {
-                    "name": "Shelter",
-                    "terms": "lean-to,gazebo,picnic"
-                },
-                "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"
-                },
-                "amenity/social_facility/homeless_shelter": {
-                    "name": "Homeless Shelter",
-                    "terms": "houseless,unhoused,displaced"
-                },
-                "amenity/studio": {
-                    "name": "Studio",
-                    "terms": "recording,radio,television"
-                },
-                "amenity/swimming_pool": {
-                    "name": "Swimming Pool",
-                    "terms": ""
-                },
-                "amenity/taxi": {
-                    "name": "Taxi Stand",
-                    "terms": "cab"
-                },
-                "amenity/telephone": {
-                    "name": "Telephone",
-                    "terms": "phone"
-                },
-                "amenity/theatre": {
-                    "name": "Theater",
-                    "terms": "theatre,performance,play,musical"
-                },
-                "amenity/toilets": {
-                    "name": "Toilets",
-                    "terms": "bathroom,restroom,outhouse,privy,head,lavatory,latrine,water closet,WC,W.C."
-                },
-                "amenity/townhall": {
-                    "name": "Town Hall",
-                    "terms": "village,city,government,courthouse,municipal"
-                },
-                "amenity/university": {
-                    "name": "University Grounds",
-                    "terms": "college"
-                },
-                "amenity/vending_machine": {
-                    "name": "Vending Machine",
-                    "terms": "snack,soda,ticket"
-                },
-                "amenity/veterinary": {
-                    "name": "Veterinary",
-                    "terms": "pet clinic,veterinarian,animal hospital,pet doctor"
-                },
-                "amenity/waste_basket": {
-                    "name": "Waste Basket",
-                    "terms": "rubbish,litter,trash,garbage"
-                },
-                "area": {
-                    "name": "Area",
-                    "terms": ""
-                },
-                "barrier": {
-                    "name": "Barrier",
-                    "terms": ""
-                },
-                "barrier/block": {
-                    "name": "Block",
-                    "terms": ""
-                },
-                "barrier/bollard": {
-                    "name": "Bollard",
-                    "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": "Ditch",
-                    "terms": ""
-                },
-                "barrier/entrance": {
-                    "name": "Entrance",
-                    "terms": ""
-                },
-                "barrier/fence": {
-                    "name": "Fence",
-                    "terms": ""
-                },
-                "barrier/gate": {
-                    "name": "Gate",
-                    "terms": ""
-                },
-                "barrier/hedge": {
-                    "name": "Hedge",
-                    "terms": ""
-                },
-                "barrier/kissing_gate": {
-                    "name": "Kissing Gate",
-                    "terms": ""
-                },
-                "barrier/lift_gate": {
-                    "name": "Lift Gate",
-                    "terms": ""
-                },
-                "barrier/retaining_wall": {
-                    "name": "Retaining Wall",
-                    "terms": ""
-                },
-                "barrier/stile": {
-                    "name": "Stile",
-                    "terms": ""
-                },
-                "barrier/toll_booth": {
-                    "name": "Toll Booth",
-                    "terms": ""
-                },
-                "barrier/wall": {
-                    "name": "Wall",
-                    "terms": ""
-                },
-                "boundary/administrative": {
-                    "name": "Administrative Boundary",
-                    "terms": ""
-                },
-                "building": {
-                    "name": "Building",
-                    "terms": ""
-                },
-                "building/apartments": {
-                    "name": "Apartments",
-                    "terms": ""
-                },
-                "building/barn": {
-                    "name": "Barn",
-                    "terms": ""
-                },
-                "building/bunker": {
-                    "name": "Bunker",
-                    "terms": ""
-                },
-                "building/cabin": {
-                    "name": "Cabin",
-                    "terms": ""
-                },
-                "building/cathedral": {
-                    "name": "Cathedral",
-                    "terms": ""
-                },
-                "building/chapel": {
-                    "name": "Chapel",
-                    "terms": ""
-                },
-                "building/church": {
-                    "name": "Church",
-                    "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 Home",
-                    "terms": ""
-                },
-                "building/dormitory": {
-                    "name": "Dormitory",
-                    "terms": ""
-                },
-                "building/entrance": {
-                    "name": "Entrance/Exit",
-                    "terms": ""
-                },
-                "building/garage": {
-                    "name": "Garage",
-                    "terms": ""
-                },
-                "building/garages": {
-                    "name": "Garages",
-                    "terms": ""
-                },
-                "building/greenhouse": {
-                    "name": "Greenhouse",
-                    "terms": ""
-                },
-                "building/hospital": {
-                    "name": "Hospital Building",
-                    "terms": ""
-                },
-                "building/hotel": {
-                    "name": "Hotel Building",
-                    "terms": ""
-                },
-                "building/house": {
-                    "name": "House",
-                    "terms": ""
-                },
-                "building/hut": {
-                    "name": "Hut",
-                    "terms": ""
-                },
-                "building/industrial": {
-                    "name": "Industrial Building",
-                    "terms": ""
-                },
-                "building/kindergarten": {
-                    "name": "Preschool/Kindergarten Building",
-                    "terms": "kindergarden,pre-school"
-                },
-                "building/public": {
-                    "name": "Public Building",
-                    "terms": ""
-                },
-                "building/residential": {
-                    "name": "Residential Building",
-                    "terms": ""
-                },
-                "building/retail": {
-                    "name": "Retail Building",
-                    "terms": ""
-                },
-                "building/roof": {
-                    "name": "Roof",
-                    "terms": ""
-                },
-                "building/school": {
-                    "name": "School Building",
-                    "terms": "academy,elementary school,middle school,high school"
-                },
-                "building/shed": {
-                    "name": "Shed",
-                    "terms": ""
-                },
-                "building/stable": {
-                    "name": "Stable",
-                    "terms": ""
-                },
-                "building/static_caravan": {
-                    "name": "Static Mobile Home",
-                    "terms": ""
-                },
-                "building/terrace": {
-                    "name": "Row Houses",
-                    "terms": ""
-                },
-                "building/train_station": {
-                    "name": "Train Station",
-                    "terms": ""
-                },
-                "building/university": {
-                    "name": "University Building",
-                    "terms": "college"
-                },
-                "building/warehouse": {
-                    "name": "Warehouse",
-                    "terms": ""
-                },
-                "craft": {
-                    "name": "Craft",
-                    "terms": ""
-                },
-                "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": "beer,bier"
-                },
-                "craft/carpenter": {
-                    "name": "Carpenter",
-                    "terms": "woodworker"
-                },
-                "craft/carpet_layer": {
-                    "name": "Carpet Layer",
-                    "terms": ""
-                },
-                "craft/caterer": {
-                    "name": "Caterer",
-                    "terms": ""
-                },
-                "craft/clockmaker": {
-                    "name": "Clockmaker",
-                    "terms": ""
-                },
-                "craft/confectionary": {
-                    "name": "Confectionary",
-                    "terms": "sweets,candy"
-                },
-                "craft/dressmaker": {
-                    "name": "Dressmaker",
-                    "terms": "seamstress"
-                },
-                "craft/electrician": {
-                    "name": "Electrician",
-                    "terms": "power,wire"
-                },
-                "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/jeweler": {
-                    "name": "Jeweler",
-                    "terms": ""
-                },
-                "craft/key_cutter": {
-                    "name": "Key Cutter",
-                    "terms": ""
-                },
-                "craft/locksmith": {
-                    "name": "Locksmith",
-                    "terms": ""
-                },
-                "craft/metal_construction": {
-                    "name": "Metal Construction",
-                    "terms": ""
-                },
-                "craft/optician": {
-                    "name": "Optician",
-                    "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/sculpter": {
-                    "name": "Sculpter",
-                    "terms": ""
-                },
-                "craft/shoemaker": {
-                    "name": "Shoemaker",
-                    "terms": "cobbler"
-                },
-                "craft/stonemason": {
-                    "name": "Stonemason",
-                    "terms": "masonry"
-                },
-                "craft/sweep": {
-                    "name": "Chimney Sweep",
-                    "terms": ""
-                },
-                "craft/tailor": {
-                    "name": "Tailor",
-                    "terms": "clothes,suit"
-                },
-                "craft/tiler": {
-                    "name": "Tiler",
-                    "terms": ""
-                },
-                "craft/tinsmith": {
-                    "name": "Tinsmith",
-                    "terms": ""
-                },
-                "craft/upholsterer": {
-                    "name": "Upholsterer",
-                    "terms": ""
-                },
-                "craft/watchmaker": {
-                    "name": "Watchmaker",
-                    "terms": ""
-                },
-                "craft/window_construction": {
-                    "name": "Window Construction",
-                    "terms": "glass"
-                },
-                "craft/winery": {
-                    "name": "Winery",
-                    "terms": ""
-                },
-                "embankment": {
-                    "name": "Embankment",
-                    "terms": ""
-                },
-                "emergency/ambulance_station": {
-                    "name": "Ambulance Station",
-                    "terms": "EMS,EMT,rescue"
-                },
-                "emergency/fire_hydrant": {
-                    "name": "Fire Hydrant",
-                    "terms": ""
-                },
-                "emergency/phone": {
-                    "name": "Emergency Phone",
-                    "terms": ""
-                },
-                "entrance": {
-                    "name": "Entrance/Exit",
-                    "terms": ""
-                },
-                "footway/crossing": {
-                    "name": "Crossing",
-                    "terms": ""
-                },
-                "footway/crosswalk": {
-                    "name": "Crosswalk",
-                    "terms": "zebra crossing"
-                },
-                "footway/sidewalk": {
-                    "name": "Sidewalk",
-                    "terms": ""
-                },
-                "ford": {
-                    "name": "Ford",
-                    "terms": ""
-                },
-                "golf/bunker": {
-                    "name": "Sand Trap",
-                    "terms": "hazard,bunker"
-                },
-                "golf/fairway": {
-                    "name": "Fairway",
-                    "terms": ""
-                },
-                "golf/green": {
-                    "name": "Putting Green",
-                    "terms": ""
-                },
-                "golf/hole": {
-                    "name": "Golf Hole",
-                    "terms": ""
-                },
-                "golf/lateral_water_hazard": {
-                    "name": "Lateral Water Hazard",
-                    "terms": ""
-                },
-                "golf/rough": {
-                    "name": "Rough",
-                    "terms": ""
-                },
-                "golf/tee": {
-                    "name": "Tee Box",
-                    "terms": "teeing ground"
-                },
-                "golf/water_hazard": {
-                    "name": "Water Hazard",
-                    "terms": ""
-                },
-                "highway": {
-                    "name": "Highway",
-                    "terms": ""
-                },
-                "highway/bridleway": {
-                    "name": "Bridle Path",
-                    "terms": "bridleway,equestrian,horse"
-                },
-                "highway/bus_stop": {
-                    "name": "Bus Stop",
-                    "terms": ""
-                },
-                "highway/crossing": {
-                    "name": "Crossing",
-                    "terms": ""
-                },
-                "highway/crosswalk": {
-                    "name": "Crosswalk",
-                    "terms": "zebra crossing"
-                },
-                "highway/cycleway": {
-                    "name": "Cycle Path",
-                    "terms": "bike"
-                },
-                "highway/footway": {
-                    "name": "Foot Path",
-                    "terms": "hike,hiking,trackway,trail,walk"
-                },
-                "highway/living_street": {
-                    "name": "Living Street",
-                    "terms": ""
-                },
-                "highway/mini_roundabout": {
-                    "name": "Mini-Roundabout",
-                    "terms": ""
-                },
-                "highway/motorway": {
-                    "name": "Motorway",
-                    "terms": ""
-                },
-                "highway/motorway_junction": {
-                    "name": "Motorway Junction / Exit",
-                    "terms": ""
-                },
-                "highway/motorway_link": {
-                    "name": "Motorway Link",
-                    "terms": "ramp,on ramp,off ramp"
-                },
-                "highway/path": {
-                    "name": "Path",
-                    "terms": "hike,hiking,trackway,trail,walk"
-                },
-                "highway/pedestrian": {
-                    "name": "Pedestrian",
-                    "terms": ""
-                },
-                "highway/primary": {
-                    "name": "Primary Road",
-                    "terms": ""
-                },
-                "highway/primary_link": {
-                    "name": "Primary Link",
-                    "terms": "ramp,on ramp,off ramp"
-                },
-                "highway/raceway": {
-                    "name": "Motor Raceway",
-                    "terms": "auto*,race*,nascar"
-                },
-                "highway/residential": {
-                    "name": "Residential Road",
-                    "terms": ""
-                },
-                "highway/rest_area": {
-                    "name": "Rest Area",
-                    "terms": "rest stop"
-                },
-                "highway/road": {
-                    "name": "Unknown Road",
-                    "terms": ""
-                },
-                "highway/secondary": {
-                    "name": "Secondary Road",
-                    "terms": ""
-                },
-                "highway/secondary_link": {
-                    "name": "Secondary Link",
-                    "terms": "ramp,on ramp,off ramp"
-                },
-                "highway/service": {
-                    "name": "Service Road",
-                    "terms": ""
-                },
-                "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/steps": {
-                    "name": "Steps",
-                    "terms": "stairs,staircase"
-                },
-                "highway/stop": {
-                    "name": "Stop Sign",
-                    "terms": "stop sign"
-                },
-                "highway/street_lamp": {
-                    "name": "Street Lamp",
-                    "terms": "streetlight,street light,lamp,light,gaslight"
-                },
-                "highway/tertiary": {
-                    "name": "Tertiary Road",
-                    "terms": ""
-                },
-                "highway/tertiary_link": {
-                    "name": "Tertiary Link",
-                    "terms": "ramp,on ramp,off ramp"
-                },
-                "highway/track": {
-                    "name": "Track",
-                    "terms": "woods road,fire road"
-                },
-                "highway/traffic_signals": {
-                    "name": "Traffic Signals",
-                    "terms": "light,stoplight,traffic light"
-                },
-                "highway/trunk": {
-                    "name": "Trunk Road",
-                    "terms": ""
-                },
-                "highway/trunk_link": {
-                    "name": "Trunk Link",
-                    "terms": "ramp,on ramp,off ramp"
-                },
-                "highway/turning_circle": {
-                    "name": "Turning Circle",
-                    "terms": "cul-de-sac"
-                },
-                "highway/unclassified": {
-                    "name": "Unclassified Road",
-                    "terms": ""
-                },
-                "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": ""
-                },
-                "historic/monument": {
-                    "name": "Monument",
-                    "terms": ""
-                },
-                "historic/ruins": {
-                    "name": "Ruins",
-                    "terms": ""
-                },
-                "historic/wayside_cross": {
-                    "name": "Wayside Cross",
-                    "terms": ""
-                },
-                "historic/wayside_shrine": {
-                    "name": "Wayside Shrine",
-                    "terms": ""
-                },
-                "landuse": {
-                    "name": "Landuse",
-                    "terms": ""
-                },
-                "landuse/allotments": {
-                    "name": "Allotments",
-                    "terms": ""
-                },
-                "landuse/basin": {
-                    "name": "Basin",
-                    "terms": ""
-                },
-                "landuse/cemetery": {
-                    "name": "Cemetery",
-                    "terms": ""
-                },
-                "landuse/churchyard": {
-                    "name": "Churchyard",
-                    "terms": ""
-                },
-                "landuse/commercial": {
-                    "name": "Commercial",
-                    "terms": ""
-                },
-                "landuse/construction": {
-                    "name": "Construction",
-                    "terms": ""
-                },
-                "landuse/farm": {
-                    "name": "Farm",
-                    "terms": ""
-                },
-                "landuse/farmland": {
-                    "name": "Farmland",
-                    "terms": ""
-                },
-                "landuse/farmyard": {
-                    "name": "Farmyard",
-                    "terms": ""
-                },
-                "landuse/forest": {
-                    "name": "Forest",
-                    "terms": ""
-                },
-                "landuse/grass": {
-                    "name": "Grass",
-                    "terms": ""
-                },
-                "landuse/industrial": {
-                    "name": "Industrial",
-                    "terms": ""
-                },
-                "landuse/landfill": {
-                    "name": "Landfill",
-                    "terms": "dump"
-                },
-                "landuse/meadow": {
-                    "name": "Meadow",
-                    "terms": ""
-                },
-                "landuse/military": {
-                    "name": "Military",
-                    "terms": ""
-                },
-                "landuse/orchard": {
-                    "name": "Orchard",
-                    "terms": ""
-                },
-                "landuse/quarry": {
-                    "name": "Quarry",
-                    "terms": ""
-                },
-                "landuse/residential": {
-                    "name": "Residential",
-                    "terms": ""
-                },
-                "landuse/retail": {
-                    "name": "Retail",
-                    "terms": ""
-                },
-                "landuse/vineyard": {
-                    "name": "Vineyard",
-                    "terms": ""
-                },
-                "leisure": {
-                    "name": "Leisure",
-                    "terms": ""
-                },
-                "leisure/common": {
-                    "name": "Common",
-                    "terms": "open space"
-                },
-                "leisure/dog_park": {
-                    "name": "Dog Park",
-                    "terms": ""
-                },
-                "leisure/firepit": {
-                    "name": "Firepit",
-                    "terms": "fireplace,campfire"
-                },
-                "leisure/garden": {
-                    "name": "Garden",
-                    "terms": ""
-                },
-                "leisure/golf_course": {
-                    "name": "Golf Course",
-                    "terms": "links"
-                },
-                "leisure/ice_rink": {
-                    "name": "Ice Rink",
-                    "terms": "hockey,skating,curling"
-                },
-                "leisure/marina": {
-                    "name": "Marina",
-                    "terms": "boat"
-                },
-                "leisure/park": {
-                    "name": "Park",
-                    "terms": "esplanade,estate,forest,garden,grass,green,grounds,lawn,lot,meadow,parkland,place,playground,plaza,pleasure garden,recreation area,square,tract,village green,woodland"
-                },
-                "leisure/picnic_table": {
-                    "name": "Picnic Table",
-                    "terms": "bench"
-                },
-                "leisure/pitch": {
-                    "name": "Sport Pitch",
-                    "terms": "field"
-                },
-                "leisure/pitch/american_football": {
-                    "name": "American Football Field",
-                    "terms": ""
-                },
-                "leisure/pitch/baseball": {
-                    "name": "Baseball Diamond",
-                    "terms": ""
-                },
-                "leisure/pitch/basketball": {
-                    "name": "Basketball Court",
-                    "terms": ""
-                },
-                "leisure/pitch/skateboard": {
-                    "name": "Skate Park",
-                    "terms": ""
-                },
-                "leisure/pitch/soccer": {
-                    "name": "Soccer Field",
-                    "terms": ""
-                },
-                "leisure/pitch/tennis": {
-                    "name": "Tennis Court",
-                    "terms": ""
-                },
-                "leisure/pitch/volleyball": {
-                    "name": "Volleyball Court",
-                    "terms": ""
-                },
-                "leisure/playground": {
-                    "name": "Playground",
-                    "terms": "jungle gym,play area"
-                },
-                "leisure/running_track": {
-                    "name": "Running Track",
-                    "terms": ""
-                },
-                "leisure/slipway": {
-                    "name": "Slipway",
-                    "terms": "boat launch,boat ramp"
-                },
-                "leisure/sports_center": {
-                    "name": "Sports Center / Gym",
-                    "terms": "gym"
-                },
-                "leisure/stadium": {
-                    "name": "Stadium",
-                    "terms": ""
-                },
-                "leisure/swimming_pool": {
-                    "name": "Swimming Pool",
-                    "terms": ""
-                },
-                "leisure/track": {
-                    "name": "Racetrack (non-Motorsport)",
-                    "terms": ""
-                },
-                "line": {
-                    "name": "Line",
-                    "terms": ""
-                },
-                "man_made": {
-                    "name": "Man Made",
-                    "terms": ""
-                },
-                "man_made/breakwater": {
-                    "name": "Breakwater",
-                    "terms": ""
-                },
-                "man_made/cutline": {
-                    "name": "Cut line",
-                    "terms": ""
-                },
-                "man_made/embankment": {
-                    "name": "Embankment",
-                    "terms": ""
-                },
-                "man_made/flagpole": {
-                    "name": "Flagpole",
-                    "terms": ""
-                },
-                "man_made/lighthouse": {
-                    "name": "Lighthouse",
-                    "terms": ""
-                },
-                "man_made/observation": {
-                    "name": "Observation Tower",
-                    "terms": "lookout tower,fire tower"
-                },
-                "man_made/pier": {
-                    "name": "Pier",
-                    "terms": ""
-                },
-                "man_made/pipeline": {
-                    "name": "Pipeline",
-                    "terms": ""
-                },
-                "man_made/survey_point": {
-                    "name": "Survey Point",
-                    "terms": ""
-                },
-                "man_made/tower": {
-                    "name": "Tower",
-                    "terms": ""
-                },
-                "man_made/wastewater_plant": {
-                    "name": "Wastewater Plant",
-                    "terms": "sewage*,water treatment plant,reclamation plant"
-                },
-                "man_made/water_tower": {
-                    "name": "Water Tower",
-                    "terms": ""
-                },
-                "man_made/water_well": {
-                    "name": "Water Well",
-                    "terms": ""
-                },
-                "man_made/water_works": {
-                    "name": "Water Works",
-                    "terms": ""
-                },
-                "military/airfield": {
-                    "name": "Airfield",
-                    "terms": ""
-                },
-                "military/barracks": {
-                    "name": "Barracks",
-                    "terms": ""
-                },
-                "military/bunker": {
-                    "name": "Bunker",
-                    "terms": ""
-                },
-                "military/range": {
-                    "name": "Military Range",
-                    "terms": ""
-                },
-                "natural": {
-                    "name": "Natural",
-                    "terms": ""
-                },
-                "natural/bay": {
-                    "name": "Bay",
-                    "terms": ""
-                },
-                "natural/beach": {
-                    "name": "Beach",
-                    "terms": ""
-                },
-                "natural/cliff": {
-                    "name": "Cliff",
-                    "terms": ""
-                },
-                "natural/coastline": {
-                    "name": "Coastline",
-                    "terms": "shore"
-                },
-                "natural/fell": {
-                    "name": "Fell",
-                    "terms": ""
-                },
-                "natural/glacier": {
-                    "name": "Glacier",
-                    "terms": ""
-                },
-                "natural/grassland": {
-                    "name": "Grassland",
-                    "terms": ""
-                },
-                "natural/heath": {
-                    "name": "Heath",
-                    "terms": ""
-                },
-                "natural/peak": {
-                    "name": "Peak",
-                    "terms": "acme,aiguille,alp,climax,crest,crown,hill,mount,mountain,pinnacle,summit,tip,top"
-                },
-                "natural/scree": {
-                    "name": "Scree",
-                    "terms": "loose rocks"
-                },
-                "natural/scrub": {
-                    "name": "Scrub",
-                    "terms": ""
-                },
-                "natural/spring": {
-                    "name": "Spring",
-                    "terms": ""
-                },
-                "natural/tree": {
-                    "name": "Tree",
-                    "terms": ""
-                },
-                "natural/water": {
-                    "name": "Water",
-                    "terms": ""
-                },
-                "natural/water/lake": {
-                    "name": "Lake",
-                    "terms": "lakelet,loch,mere"
-                },
-                "natural/water/pond": {
-                    "name": "Pond",
-                    "terms": "lakelet,millpond,tarn,pool,mere"
-                },
-                "natural/water/reservoir": {
-                    "name": "Reservoir",
-                    "terms": ""
-                },
-                "natural/wetland": {
-                    "name": "Wetland",
-                    "terms": ""
-                },
-                "natural/wood": {
-                    "name": "Wood",
-                    "terms": ""
-                },
-                "office": {
-                    "name": "Office",
-                    "terms": ""
-                },
-                "office/accountant": {
-                    "name": "Accountant",
-                    "terms": ""
-                },
-                "office/administrative": {
-                    "name": "Administrative Office",
-                    "terms": ""
-                },
-                "office/architect": {
-                    "name": "Architect",
-                    "terms": ""
-                },
-                "office/company": {
-                    "name": "Company Office",
-                    "terms": ""
-                },
-                "office/educational_institution": {
-                    "name": "Educational Institution",
-                    "terms": ""
-                },
-                "office/employment_agency": {
-                    "name": "Employment Agency",
-                    "terms": "job"
-                },
-                "office/estate_agent": {
-                    "name": "Real Estate Office",
-                    "terms": ""
-                },
-                "office/financial": {
-                    "name": "Financial Office",
-                    "terms": ""
-                },
-                "office/government": {
-                    "name": "Government Office",
-                    "terms": ""
-                },
-                "office/insurance": {
-                    "name": "Insurance Office",
-                    "terms": ""
-                },
-                "office/it": {
-                    "name": "IT Office",
-                    "terms": ""
-                },
-                "office/lawyer": {
-                    "name": "Law Office",
-                    "terms": ""
-                },
-                "office/newspaper": {
-                    "name": "Newspaper",
-                    "terms": ""
-                },
-                "office/ngo": {
-                    "name": "NGO Office",
-                    "terms": ""
-                },
-                "office/physician": {
-                    "name": "Physician",
-                    "terms": ""
-                },
-                "office/political_party": {
-                    "name": "Political Party",
-                    "terms": ""
-                },
-                "office/research": {
-                    "name": "Research Office",
-                    "terms": ""
-                },
-                "office/telecommunication": {
-                    "name": "Telecom Office",
-                    "terms": ""
-                },
-                "office/therapist": {
-                    "name": "Therapist",
-                    "terms": ""
-                },
-                "office/travel_agent": {
-                    "name": "Travel Agency",
-                    "terms": ""
-                },
-                "piste": {
-                    "name": "Piste/Ski Trail",
-                    "terms": "ski,sled,sleigh,snowboard,nordic,downhill,snowmobile"
-                },
-                "place": {
-                    "name": "Place",
-                    "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/isolated_dwelling": {
-                    "name": "Isolated Dwelling",
-                    "terms": ""
-                },
-                "place/locality": {
-                    "name": "Locality",
-                    "terms": ""
-                },
-                "place/neighbourhood": {
-                    "name": "Neighborhood",
-                    "terms": "neighbourhood"
-                },
-                "place/suburb": {
-                    "name": "Borough",
-                    "terms": "Boro,Quarter"
-                },
-                "place/town": {
-                    "name": "Town",
-                    "terms": ""
-                },
-                "place/village": {
-                    "name": "Village",
-                    "terms": ""
-                },
-                "point": {
-                    "name": "Point",
-                    "terms": ""
-                },
-                "power": {
-                    "name": "Power",
-                    "terms": ""
-                },
-                "power/generator": {
-                    "name": "Power Generator",
-                    "terms": ""
-                },
-                "power/line": {
-                    "name": "Power Line",
-                    "terms": ""
-                },
-                "power/minor_line": {
-                    "name": "Minor Power Line",
-                    "terms": ""
-                },
-                "power/pole": {
-                    "name": "Power Pole",
-                    "terms": ""
-                },
-                "power/sub_station": {
-                    "name": "Substation",
-                    "terms": ""
-                },
-                "power/substation": {
-                    "name": "Substation",
-                    "terms": ""
-                },
-                "power/tower": {
-                    "name": "High-Voltage Tower",
-                    "terms": ""
-                },
-                "power/transformer": {
-                    "name": "Transformer",
-                    "terms": ""
-                },
-                "public_transport/platform": {
-                    "name": "Platform",
-                    "terms": ""
-                },
-                "public_transport/stop_position": {
-                    "name": "Stop Position",
-                    "terms": ""
-                },
-                "railway": {
-                    "name": "Railway",
-                    "terms": ""
-                },
-                "railway/abandoned": {
-                    "name": "Abandoned Railway",
-                    "terms": ""
-                },
-                "railway/disused": {
-                    "name": "Disused Railway",
-                    "terms": ""
-                },
-                "railway/funicular": {
-                    "name": "Funicular",
-                    "terms": "venicular,cliff railway,cable car,cable railway,funicular railway"
-                },
-                "railway/halt": {
-                    "name": "Railway Halt",
-                    "terms": "break,interrupt,rest,wait,interruption"
-                },
-                "railway/level_crossing": {
-                    "name": "Level Crossing",
-                    "terms": "crossing,railroad crossing,railway crossing,grade crossing,road through railroad,train crossing"
-                },
-                "railway/monorail": {
-                    "name": "Monorail",
-                    "terms": ""
-                },
-                "railway/narrow_gauge": {
-                    "name": "Narrow Gauge Rail",
-                    "terms": "narrow gauge railway,narrow gauge railroad"
-                },
-                "railway/platform": {
-                    "name": "Railway Platform",
-                    "terms": ""
-                },
-                "railway/rail": {
-                    "name": "Rail",
-                    "terms": ""
-                },
-                "railway/station": {
-                    "name": "Railway Station",
-                    "terms": "train station,station"
-                },
-                "railway/subway": {
-                    "name": "Subway",
-                    "terms": ""
-                },
-                "railway/subway_entrance": {
-                    "name": "Subway Entrance",
-                    "terms": ""
-                },
-                "railway/tram": {
-                    "name": "Tram",
-                    "terms": "streetcar"
-                },
-                "relation": {
-                    "name": "Relation",
-                    "terms": ""
-                },
-                "route/ferry": {
-                    "name": "Ferry Route",
-                    "terms": ""
-                },
-                "shop": {
-                    "name": "Shop",
-                    "terms": ""
-                },
-                "shop/alcohol": {
-                    "name": "Liquor Store",
-                    "terms": "alcohol,beer,booze,wine"
-                },
-                "shop/anime": {
-                    "name": "Anime Shop",
-                    "terms": ""
-                },
-                "shop/antiques": {
-                    "name": "Antiques Shop",
-                    "terms": ""
-                },
-                "shop/art": {
-                    "name": "Art Gallery",
-                    "terms": ""
-                },
-                "shop/baby_goods": {
-                    "name": "Baby Goods Store",
-                    "terms": ""
-                },
-                "shop/bag": {
-                    "name": "Bag/Luggage Store",
-                    "terms": "handbag,purse"
-                },
-                "shop/bakery": {
-                    "name": "Bakery",
-                    "terms": ""
-                },
-                "shop/bathroom_furnishing": {
-                    "name": "Bathroom Furnishing Store",
-                    "terms": ""
-                },
-                "shop/beauty": {
-                    "name": "Beauty Shop",
-                    "terms": "nail spa,spa,salon,tanning"
-                },
-                "shop/bed": {
-                    "name": "Bedding/Mattress Store",
-                    "terms": ""
-                },
-                "shop/beverages": {
-                    "name": "Beverage Store",
-                    "terms": ""
-                },
-                "shop/bicycle": {
-                    "name": "Bicycle Shop",
-                    "terms": ""
-                },
-                "shop/bookmaker": {
-                    "name": "Bookmaker",
-                    "terms": ""
-                },
-                "shop/books": {
-                    "name": "Book Store",
-                    "terms": ""
-                },
-                "shop/boutique": {
-                    "name": "Boutique",
-                    "terms": ""
-                },
-                "shop/butcher": {
-                    "name": "Butcher",
-                    "terms": "meat"
-                },
-                "shop/candles": {
-                    "name": "Candle Shop",
-                    "terms": ""
-                },
-                "shop/car": {
-                    "name": "Car Dealership",
-                    "terms": "auto"
-                },
-                "shop/car_parts": {
-                    "name": "Car Parts Store",
-                    "terms": "auto"
-                },
-                "shop/car_repair": {
-                    "name": "Car Repair Shop",
-                    "terms": "auto"
-                },
-                "shop/carpet": {
-                    "name": "Carpet Store",
-                    "terms": "rug"
-                },
-                "shop/cheese": {
-                    "name": "Cheese Store",
-                    "terms": ""
-                },
-                "shop/chemist": {
-                    "name": "Chemist",
-                    "terms": ""
-                },
-                "shop/chocolate": {
-                    "name": "Chocolate Store",
-                    "terms": ""
-                },
-                "shop/clothes": {
-                    "name": "Clothing Store",
-                    "terms": ""
-                },
-                "shop/computer": {
-                    "name": "Computer Store",
-                    "terms": ""
-                },
-                "shop/confectionery": {
-                    "name": "Candy Store",
-                    "terms": ""
-                },
-                "shop/convenience": {
-                    "name": "Convenience Store",
-                    "terms": ""
-                },
-                "shop/copyshop": {
-                    "name": "Copy Store",
-                    "terms": ""
-                },
-                "shop/cosmetics": {
-                    "name": "Cosmetics Store",
-                    "terms": ""
-                },
-                "shop/craft": {
-                    "name": "Arts and Crafts Store",
-                    "terms": ""
-                },
-                "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/electronics": {
-                    "name": "Electronics Store",
-                    "terms": "appliance,audio,computer,tv"
-                },
-                "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/fishmonger": {
-                    "name": "Fishmonger",
-                    "terms": ""
-                },
-                "shop/florist": {
-                    "name": "Florist",
-                    "terms": "flower"
-                },
-                "shop/frame": {
-                    "name": "Framing Shop",
-                    "terms": ""
-                },
-                "shop/funeral_directors": {
-                    "name": "Funeral Home",
-                    "terms": "undertaker,memorial home"
-                },
-                "shop/furnace": {
-                    "name": "Furnace Store",
-                    "terms": "oven,stove"
-                },
-                "shop/furniture": {
-                    "name": "Furniture Store",
-                    "terms": "chair,sofa,table"
-                },
-                "shop/garden_centre": {
-                    "name": "Garden Center",
-                    "terms": "landscape,mulch,shrub,tree"
-                },
-                "shop/gift": {
-                    "name": "Gift Shop",
-                    "terms": ""
-                },
-                "shop/greengrocer": {
-                    "name": "Greengrocer",
-                    "terms": "fruit,vegetable"
-                },
-                "shop/hairdresser": {
-                    "name": "Hairdresser",
-                    "terms": ""
-                },
-                "shop/hardware": {
-                    "name": "Hardware Store",
-                    "terms": ""
-                },
-                "shop/hearing_aids": {
-                    "name": "Hearing Aids Store",
-                    "terms": ""
-                },
-                "shop/herbalist": {
-                    "name": "Herbalist",
-                    "terms": ""
-                },
-                "shop/hifi": {
-                    "name": "Hifi Store",
-                    "terms": "stereo,video"
-                },
-                "shop/interior_decoration": {
-                    "name": "Interior Decoration Store",
-                    "terms": ""
-                },
-                "shop/jewelry": {
-                    "name": "Jeweler",
-                    "terms": "diamond,gem,ring"
-                },
-                "shop/kiosk": {
-                    "name": "News Kiosk",
-                    "terms": ""
-                },
-                "shop/kitchen": {
-                    "name": "Kitchen Design Store",
-                    "terms": ""
-                },
-                "shop/laundry": {
-                    "name": "Laundry",
-                    "terms": ""
-                },
-                "shop/leather": {
-                    "name": "Leather Store",
-                    "terms": ""
-                },
-                "shop/locksmith": {
-                    "name": "Locksmith",
-                    "terms": "key,lockpick"
-                },
-                "shop/lottery": {
-                    "name": "Lottery Shop",
-                    "terms": ""
-                },
-                "shop/mall": {
-                    "name": "Mall",
-                    "terms": ""
-                },
-                "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": {
-                    "name": "Motorcycle Dealership",
-                    "terms": ""
-                },
-                "shop/music": {
-                    "name": "Music Store",
-                    "terms": "CD,vinyl"
-                },
-                "shop/musical_instrument": {
-                    "name": "Musical Instrument Store",
-                    "terms": ""
-                },
-                "shop/newsagent": {
-                    "name": "Newspaper/Magazine Shop",
-                    "terms": ""
-                },
-                "shop/optician": {
-                    "name": "Optician",
-                    "terms": "eye,glasses"
-                },
-                "shop/organic": {
-                    "name": "Organic Goods Store",
-                    "terms": ""
-                },
-                "shop/outdoor": {
-                    "name": "Outdoors Store",
-                    "terms": "camping,climbing,hiking"
-                },
-                "shop/paint": {
-                    "name": "Paint Store",
-                    "terms": ""
-                },
-                "shop/pawnbroker": {
-                    "name": "Pawn Shop",
-                    "terms": ""
-                },
-                "shop/pet": {
-                    "name": "Pet Store",
-                    "terms": "cat,dog,fish"
-                },
-                "shop/photo": {
-                    "name": "Photography Store",
-                    "terms": "camera,film"
-                },
-                "shop/pyrotechnics": {
-                    "name": "Fireworks Store",
-                    "terms": ""
-                },
-                "shop/radiotechnics": {
-                    "name": "Radio/Electronic Component Store",
-                    "terms": ""
-                },
-                "shop/religion": {
-                    "name": "Religious Store",
-                    "terms": ""
-                },
-                "shop/scuba_diving": {
-                    "name": "Scuba Diving Shop",
-                    "terms": ""
-                },
-                "shop/seafood": {
-                    "name": "Seafood Shop",
-                    "terms": "fishmonger"
-                },
-                "shop/second_hand": {
-                    "name": "Consignment/Thrift Store",
-                    "terms": "secondhand,second hand,resale,thrift,used"
-                },
-                "shop/shoes": {
-                    "name": "Shoe Store",
-                    "terms": ""
-                },
-                "shop/sports": {
-                    "name": "Sporting Goods Store",
-                    "terms": ""
-                },
-                "shop/stationery": {
-                    "name": "Stationery Store",
-                    "terms": "card,paper"
-                },
-                "shop/supermarket": {
-                    "name": "Supermarket",
-                    "terms": "grocery,store,shop"
-                },
-                "shop/tailor": {
-                    "name": "Tailor",
-                    "terms": "clothes,suit"
-                },
-                "shop/tattoo": {
-                    "name": "Tattoo Parlor",
-                    "terms": ""
-                },
-                "shop/tea": {
-                    "name": "Tea Store",
-                    "terms": ""
-                },
-                "shop/ticket": {
-                    "name": "Ticket Seller",
-                    "terms": ""
-                },
-                "shop/tobacco": {
-                    "name": "Tobacco Shop",
-                    "terms": ""
-                },
-                "shop/toys": {
-                    "name": "Toy Store",
-                    "terms": ""
-                },
-                "shop/travel_agency": {
-                    "name": "Travel Agency",
-                    "terms": ""
-                },
-                "shop/tyres": {
-                    "name": "Tire Store",
-                    "terms": ""
-                },
-                "shop/vacant": {
-                    "name": "Vacant Shop",
-                    "terms": ""
-                },
-                "shop/vacuum_cleaner": {
-                    "name": "Vacuum Cleaner Store",
-                    "terms": ""
-                },
-                "shop/variety_store": {
-                    "name": "Variety Store",
-                    "terms": ""
-                },
-                "shop/video": {
-                    "name": "Video Store",
-                    "terms": "DVD"
-                },
-                "shop/video_games": {
-                    "name": "Video Game Store",
-                    "terms": ""
-                },
-                "shop/water_sports": {
-                    "name": "Watersport/Swim Shop",
-                    "terms": ""
-                },
-                "shop/weapons": {
-                    "name": "Weapon Shop",
-                    "terms": "ammo,gun,knife,knives"
-                },
-                "shop/window_blind": {
-                    "name": "Window Blind Store",
-                    "terms": ""
-                },
-                "shop/wine": {
-                    "name": "Wine Shop",
-                    "terms": ""
-                },
-                "tourism": {
-                    "name": "Tourism",
-                    "terms": ""
-                },
-                "tourism/alpine_hut": {
-                    "name": "Alpine Hut",
-                    "terms": ""
-                },
-                "tourism/artwork": {
-                    "name": "Artwork",
-                    "terms": "mural,sculpture,statue"
-                },
-                "tourism/attraction": {
-                    "name": "Tourist Attraction",
-                    "terms": ""
-                },
-                "tourism/camp_site": {
-                    "name": "Camp Site",
-                    "terms": ""
-                },
-                "tourism/caravan_site": {
-                    "name": "RV Park",
-                    "terms": ""
-                },
-                "tourism/chalet": {
-                    "name": "Chalet",
-                    "terms": ""
-                },
-                "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/motel": {
-                    "name": "Motel",
-                    "terms": ""
-                },
-                "tourism/museum": {
-                    "name": "Museum",
-                    "terms": "exhibition,foundation,gallery,hall,institution"
-                },
-                "tourism/picnic_site": {
-                    "name": "Picnic Site",
-                    "terms": "camp"
-                },
-                "tourism/theme_park": {
-                    "name": "Theme Park",
-                    "terms": ""
-                },
-                "tourism/viewpoint": {
-                    "name": "Viewpoint",
-                    "terms": ""
-                },
-                "tourism/zoo": {
-                    "name": "Zoo",
-                    "terms": ""
-                },
-                "traffic_calming/bump": {
-                    "name": "Speed Bump",
-                    "terms": "speed hump"
-                },
-                "traffic_calming/hump": {
-                    "name": "Speed Hump",
-                    "terms": "speed bump"
-                },
-                "traffic_calming/rumble_strip": {
-                    "name": "Rumble Strip",
-                    "terms": "sleeper lines,audible lines,growlers"
-                },
-                "traffic_calming/table": {
-                    "name": "Raised Pedestrian Crossing",
-                    "terms": "speed table,flat top hump"
-                },
-                "type/boundary": {
-                    "name": "Boundary",
-                    "terms": ""
-                },
-                "type/boundary/administrative": {
-                    "name": "Administrative Boundary",
-                    "terms": ""
-                },
-                "type/multipolygon": {
-                    "name": "Multipolygon",
-                    "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": "Left Turn Only",
-                    "terms": ""
-                },
-                "type/restriction/only_right_turn": {
-                    "name": "Right Turn Only",
-                    "terms": ""
-                },
-                "type/restriction/only_straight_on": {
-                    "name": "No Turns",
-                    "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/pipeline": {
-                    "name": "Pipeline Route",
-                    "terms": ""
-                },
-                "type/route/power": {
-                    "name": "Power Route",
-                    "terms": ""
-                },
-                "type/route/road": {
-                    "name": "Road Route",
-                    "terms": ""
-                },
-                "type/route/train": {
-                    "name": "Train Route",
-                    "terms": ""
-                },
-                "type/route/tram": {
-                    "name": "Tram Route",
-                    "terms": ""
-                },
-                "type/route_master": {
-                    "name": "Route Master",
-                    "terms": ""
-                },
-                "vertex": {
-                    "name": "Other",
-                    "terms": ""
-                },
-                "waterway": {
-                    "name": "Waterway",
-                    "terms": ""
-                },
-                "waterway/canal": {
-                    "name": "Canal",
-                    "terms": ""
-                },
-                "waterway/dam": {
-                    "name": "Dam",
-                    "terms": ""
-                },
-                "waterway/ditch": {
-                    "name": "Ditch",
-                    "terms": ""
-                },
-                "waterway/drain": {
-                    "name": "Drain",
-                    "terms": ""
-                },
-                "waterway/river": {
-                    "name": "River",
-                    "terms": "beck,branch,brook,course,creek,estuary,rill,rivulet,run,runnel,stream,tributary,watercourse"
-                },
-                "waterway/riverbank": {
-                    "name": "Riverbank",
-                    "terms": ""
-                },
-                "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/weir": {
-                    "name": "Weir",
-                    "terms": ""
-                }
-            }
-        }
-    },
-    "suggestions": {
-        "amenity": {
-            "fuel": {
-                "76": {
-                    "count": 314
-                },
-                "Neste": {
-                    "count": 189
-                },
-                "BP": {
-                    "count": 2511
-                },
-                "Shell": {
-                    "count": 8380
-                },
-                "Agip": {
-                    "count": 2651
-                },
-                "Migrol": {
-                    "count": 65
-                },
-                "Avia": {
-                    "count": 897
-                },
-                "Texaco": {
-                    "count": 680
-                },
-                "Total": {
-                    "count": 2607
-                },
-                "Statoil": {
-                    "count": 596
-                },
-                "Esso": {
-                    "count": 3652
-                },
-                "Jet": {
-                    "count": 441
-                },
-                "Avanti": {
-                    "count": 90
-                },
-                "Sainsbury's": {
-                    "count": 58
-                },
-                "OMV": {
-                    "count": 701
-                },
-                "Aral": {
-                    "count": 1339
-                },
-                "Tesco": {
-                    "count": 197
-                },
-                "JET": {
-                    "count": 180
-                },
-                "Morrisons": {
-                    "count": 111
-                },
-                "United": {
-                    "count": 91
-                },
-                "Canadian Tire": {
-                    "count": 66
-                },
-                "Mobil": {
-                    "count": 613
-                },
-                "Caltex": {
-                    "count": 1001
-                },
-                "Sunoco": {
-                    "count": 355
-                },
-                "Q8": {
-                    "count": 1161
-                },
-                "ABC": {
-                    "count": 79
-                },
-                "ARAL": {
-                    "count": 375
-                },
-                "CEPSA": {
-                    "count": 1018
-                },
-                "BFT": {
-                    "count": 89
-                },
-                "Petron": {
-                    "count": 878
-                },
-                "Intermarché": {
-                    "count": 434
-                },
-                "Total Access": {
-                    "count": 51
-                },
-                "Super U": {
-                    "count": 124
-                },
-                "Auchan": {
-                    "count": 53
-                },
-                "Elf": {
-                    "count": 129
-                },
-                "Carrefour": {
-                    "count": 205
-                },
-                "Station Service E. Leclerc": {
-                    "count": 530
-                },
-                "Shell Express": {
-                    "count": 131
-                },
-                "Hess": {
-                    "count": 127
-                },
-                "Flying V": {
-                    "count": 129
-                },
-                "bft": {
-                    "count": 168
-                },
-                "Gulf": {
-                    "count": 199
-                },
-                "PTT": {
-                    "count": 191
-                },
-                "St1": {
-                    "count": 100
-                },
-                "Teboil": {
-                    "count": 115
-                },
-                "HEM": {
-                    "count": 212
-                },
-                "GALP": {
-                    "count": 626
-                },
-                "OK": {
-                    "count": 163
-                },
-                "ÖMV": {
-                    "count": 101
-                },
-                "Tinq": {
-                    "count": 215
-                },
-                "OKQ8": {
-                    "count": 186
-                },
-                "Repsol": {
-                    "count": 424
-                },
-                "Westfalen": {
-                    "count": 96
-                },
-                "Esso Express": {
-                    "count": 98
-                },
-                "Raiffeisenbank": {
-                    "count": 117
-                },
-                "Tamoil": {
-                    "count": 866
-                },
-                "Engen": {
-                    "count": 241
-                },
-                "Sasol": {
-                    "count": 59
-                },
-                "Topaz": {
-                    "count": 78
-                },
-                "LPG": {
-                    "count": 174
-                },
-                "Coop": {
-                    "count": 62
-                },
-                "Orlen": {
-                    "count": 598
-                },
-                "Oilibya": {
-                    "count": 68
-                },
-                "Tango": {
-                    "count": 122
-                },
-                "Star": {
-                    "count": 319
-                },
-                "Петрол": {
-                    "count": 84
-                },
-                "Cepsa": {
-                    "count": 96
-                },
-                "OIL!": {
-                    "count": 63
-                },
-                "Ultramar": {
-                    "count": 125
-                },
-                "Irving": {
-                    "count": 87
-                },
-                "Lukoil": {
-                    "count": 701
-                },
-                "Petro-Canada": {
-                    "count": 489
-                },
-                "7-Eleven": {
-                    "count": 488
-                },
-                "Agrola": {
-                    "count": 69
-                },
-                "Husky": {
-                    "count": 126
-                },
-                "Slovnaft": {
-                    "count": 219
-                },
-                "Sheetz": {
-                    "count": 134
-                },
-                "Mol": {
-                    "count": 61
-                },
-                "Petronas": {
-                    "count": 159
-                },
-                "Газпромнефть": {
-                    "count": 748
-                },
-                "Лукойл": {
-                    "count": 1477
-                },
-                "Elan": {
-                    "count": 112
-                },
-                "Роснефть": {
-                    "count": 638
-                },
-                "Turmöl": {
-                    "count": 57
-                },
-                "Neste A24": {
-                    "count": 55
-                },
-                "Marathon": {
-                    "count": 189
-                },
-                "Valero": {
-                    "count": 366
-                },
-                "Eni": {
-                    "count": 236
-                },
-                "Chevron": {
-                    "count": 954
-                },
-                "ТНК": {
-                    "count": 520
-                },
-                "REPSOL": {
-                    "count": 1603
-                },
-                "MOL": {
-                    "count": 228
-                },
-                "Bliska": {
-                    "count": 150
-                },
-                "Api": {
-                    "count": 302
-                },
-                "Arco": {
-                    "count": 179
-                },
-                "Pemex": {
-                    "count": 423
-                },
-                "Exxon": {
-                    "count": 506
-                },
-                "Coles Express": {
-                    "count": 115
-                },
-                "Petrom": {
-                    "count": 259
-                },
-                "PETRONOR": {
-                    "count": 207
-                },
-                "Rompetrol": {
-                    "count": 174
-                },
-                "Lotos": {
-                    "count": 178
-                },
-                "ОМВ": {
-                    "count": 60
-                },
-                "BR": {
-                    "count": 129
-                },
-                "Copec": {
-                    "count": 505
-                },
-                "Petrobras": {
-                    "count": 270
-                },
-                "Liberty": {
-                    "count": 55
-                },
-                "IP": {
-                    "count": 871
-                },
-                "Erg": {
-                    "count": 596
-                },
-                "Eneos": {
-                    "count": 97
-                },
-                "Citgo": {
-                    "count": 279
-                },
-                "Metano": {
-                    "count": 208
-                },
-                "Сургутнефтегаз": {
-                    "count": 61
-                },
-                "EKO": {
-                    "count": 59
-                },
-                "Eko": {
-                    "count": 58
-                },
-                "Indipend.": {
-                    "count": 172
-                },
-                "IES": {
-                    "count": 63
-                },
-                "TotalErg": {
-                    "count": 89
-                },
-                "Cenex": {
-                    "count": 115
-                },
-                "ПТК": {
-                    "count": 82
-                },
-                "HP": {
-                    "count": 79
-                },
-                "Phillips 66": {
-                    "count": 216
-                },
-                "CARREFOUR": {
-                    "count": 74
-                },
-                "ERG": {
-                    "count": 76
-                },
-                "Speedway": {
-                    "count": 148
-                },
-                "Benzina": {
-                    "count": 96
-                },
-                "Татнефть": {
-                    "count": 264
-                },
-                "Terpel": {
-                    "count": 259
-                },
-                "WOG": {
-                    "count": 189
-                },
-                "Seaoil": {
-                    "count": 54
-                },
-                "АЗС": {
-                    "count": 1077
-                },
-                "Kwik Trip": {
-                    "count": 108
-                },
-                "Wawa": {
-                    "count": 89
-                },
-                "Pertamina": {
-                    "count": 186
-                },
-                "COSMO": {
-                    "count": 64
-                },
-                "Z": {
-                    "count": 76
-                },
-                "Indian Oil": {
-                    "count": 183
-                },
-                "АГЗС": {
-                    "count": 494
-                },
-                "INA": {
-                    "count": 121
-                },
-                "JOMO": {
-                    "count": 62
-                },
-                "Holiday": {
-                    "count": 97
-                },
-                "YPF": {
-                    "count": 70
-                },
-                "IDEMITSU": {
-                    "count": 87
-                },
-                "ENEOS": {
-                    "count": 736
-                },
-                "Stacja paliw": {
-                    "count": 94
-                },
-                "Bharat Petroleum": {
-                    "count": 64
-                },
-                "CAMPSA": {
-                    "count": 615
-                },
-                "Casey's General Store": {
-                    "count": 190
-                },
-                "Башнефть": {
-                    "count": 60
-                },
-                "Kangaroo": {
-                    "count": 60
-                },
-                "コスモ石油 (COSMO)": {
-                    "count": 136
-                },
-                "MEROIL": {
-                    "count": 77
-                },
-                "1-2-3": {
-                    "count": 71
-                },
-                "出光": {
-                    "count": 228,
-                    "tags": {
-                        "name:en": "IDEMITSU"
-                    }
-                },
-                "НК Альянс": {
-                    "count": 88
-                },
-                "Sinclair": {
-                    "count": 100
-                },
-                "Conoco": {
-                    "count": 189
-                },
-                "SPBU": {
-                    "count": 54
-                },
-                "Макпетрол": {
-                    "count": 109
-                },
-                "Circle K": {
-                    "count": 166
-                },
-                "Posto Ipiranga": {
-                    "count": 70
-                },
-                "Posto Shell": {
-                    "count": 54
-                },
-                "Phoenix": {
-                    "count": 144
-                },
-                "Ipiranga": {
-                    "count": 119
-                },
-                "OKKO": {
-                    "count": 85
-                },
-                "ОККО": {
-                    "count": 119
-                },
-                "บางจาก": {
-                    "count": 60
-                },
-                "QuikTrip": {
-                    "count": 105
-                },
-                "Stewart's": {
-                    "count": 63
-                },
-                "Posto BR": {
-                    "count": 68
-                },
-                "ป ต ท": {
-                    "count": 152
-                },
-                "ปตท": {
-                    "count": 88
-                },
-                "ANP": {
-                    "count": 80
-                },
-                "Kum & Go": {
-                    "count": 80
-                },
-                "Petrolimex": {
-                    "count": 55
-                },
-                "Sokimex": {
-                    "count": 66
-                },
-                "Tela": {
-                    "count": 154
-                },
-                "Posto": {
-                    "count": 71
-                },
-                "H-E-B": {
-                    "count": 182
-                },
-                "Укрнафта": {
-                    "count": 58
-                },
-                "Татнефтепродукт": {
-                    "count": 54
-                },
-                "Afriquia": {
-                    "count": 88
-                },
-                "Murphy USA": {
-                    "count": 67
-                },
-                "昭和シェル (Showa-shell)": {
-                    "count": 94
-                },
-                "エネオス": {
-                    "count": 53
-                },
-                "CNG": {
-                    "count": 94
-                }
-            },
-            "pub": {
-                "Kings Arms": {
-                    "count": 67
-                },
-                "The Ship": {
-                    "count": 89
-                },
-                "The White Horse": {
-                    "count": 204
-                },
-                "The White Hart": {
-                    "count": 226
-                },
-                "Royal Oak": {
-                    "count": 150
-                },
-                "The Red Lion": {
-                    "count": 233
-                },
-                "The Kings Arms": {
-                    "count": 58
-                },
-                "The Star": {
-                    "count": 73
-                },
-                "The Anchor": {
-                    "count": 64
-                },
-                "The Cross Keys": {
-                    "count": 55
-                },
-                "The Wheatsheaf": {
-                    "count": 117
-                },
-                "The Crown Inn": {
-                    "count": 67
-                },
-                "The Kings Head": {
-                    "count": 53
-                },
-                "The Castle": {
-                    "count": 62
-                },
-                "The Railway": {
-                    "count": 102
-                },
-                "The White Lion": {
-                    "count": 118
-                },
-                "The Bell": {
-                    "count": 121
-                },
-                "The Bull": {
-                    "count": 68
-                },
-                "The Plough": {
-                    "count": 179
-                },
-                "The George": {
-                    "count": 110
-                },
-                "The Royal Oak": {
-                    "count": 209
-                },
-                "The Fox": {
-                    "count": 74
-                },
-                "Prince of Wales": {
-                    "count": 77
-                },
-                "The Rising Sun": {
-                    "count": 71
-                },
-                "The Prince of Wales": {
-                    "count": 51
-                },
-                "The Crown": {
-                    "count": 244
-                },
-                "The Chequers": {
-                    "count": 66
-                },
-                "The Swan": {
-                    "count": 152
-                },
-                "Rose and Crown": {
-                    "count": 79
-                },
-                "The Victoria": {
-                    "count": 67
-                },
-                "New Inn": {
-                    "count": 90
-                },
-                "Royal Hotel": {
-                    "count": 57
-                },
-                "Red Lion": {
-                    "count": 207
-                },
-                "Cross Keys": {
-                    "count": 61
-                },
-                "The Greyhound": {
-                    "count": 96
-                },
-                "The Black Horse": {
-                    "count": 94
-                },
-                "The New Inn": {
-                    "count": 105
-                },
-                "Kings Head": {
-                    "count": 59
-                },
-                "The Albion": {
-                    "count": 51
-                },
-                "The Angel": {
-                    "count": 52
-                },
-                "The Queens Head": {
-                    "count": 52
-                },
-                "The Ship Inn": {
-                    "count": 83
-                },
-                "Rose & Crown": {
-                    "count": 51
-                },
-                "Queens Head": {
-                    "count": 52
-                },
-                "Irish Pub": {
-                    "count": 76
-                }
-            },
-            "fast_food": {
-                "Quick": {
-                    "count": 484
-                },
-                "McDonald's": {
-                    "count": 12376,
-                    "tags": {
-                        "cuisine": "burger"
-                    }
-                },
-                "Subway": {
-                    "count": 5576,
-                    "tags": {
-                        "cuisine": "sandwich"
-                    }
-                },
-                "Burger King": {
-                    "count": 3734,
-                    "tags": {
-                        "cuisine": "burger"
-                    }
-                },
-                "Ali Baba": {
-                    "count": 61
-                },
-                "Hungry Jacks": {
-                    "count": 173,
-                    "tags": {
-                        "cuisine": "burger"
-                    }
-                },
-                "Red Rooster": {
-                    "count": 148
-                },
-                "KFC": {
-                    "count": 3198,
-                    "tags": {
-                        "cuisine": "chicken"
-                    }
-                },
-                "Domino's Pizza": {
-                    "count": 985,
-                    "tags": {
-                        "cuisine": "pizza"
-                    }
-                },
-                "Chowking": {
-                    "count": 142
-                },
-                "Jollibee": {
-                    "count": 396
-                },
-                "Hesburger": {
-                    "count": 102
-                },
-                "肯德基": {
-                    "count": 86
-                },
-                "Wendy's": {
-                    "count": 1621,
-                    "tags": {
-                        "cuisine": "burger"
-                    }
-                },
-                "Tim Hortons": {
-                    "count": 323
-                },
-                "Steers": {
-                    "count": 151
-                },
-                "Hardee's": {
-                    "count": 268,
-                    "tags": {
-                        "cuisine": "burger"
-                    }
-                },
-                "Arby's": {
-                    "count": 782
-                },
-                "A&W": {
-                    "count": 283
-                },
-                "Dairy Queen": {
-                    "count": 791
-                },
-                "Hallo Pizza": {
-                    "count": 76
-                },
-                "Fish & Chips": {
-                    "count": 93
-                },
-                "Harvey's": {
-                    "count": 90
-                },
-                "麥當勞": {
-                    "count": 65
-                },
-                "Pizza Pizza": {
-                    "count": 215
-                },
-                "Kotipizza": {
-                    "count": 74
-                },
-                "Jack in the Box": {
-                    "count": 546,
-                    "tags": {
-                        "cuisine": "burger"
-                    }
-                },
-                "Istanbul": {
-                    "count": 56
-                },
-                "Kochlöffel": {
-                    "count": 68
-                },
-                "Döner": {
-                    "count": 228
-                },
-                "Telepizza": {
-                    "count": 201
-                },
-                "Sibylla": {
-                    "count": 61
-                },
-                "Carl's Jr.": {
-                    "count": 298,
-                    "tags": {
-                        "cuisine": "burger"
-                    }
-                },
-                "Quiznos": {
-                    "count": 266,
-                    "tags": {
-                        "cuisine": "sandwich"
-                    }
-                },
-                "Wimpy": {
-                    "count": 141
-                },
-                "Sonic": {
-                    "count": 566,
-                    "tags": {
-                        "cuisine": "burger"
-                    }
-                },
-                "Taco Bell": {
-                    "count": 1423
-                },
-                "Pizza Nova": {
-                    "count": 63
-                },
-                "Papa John's": {
-                    "count": 304,
-                    "tags": {
-                        "cuisine": "pizza"
-                    }
-                },
-                "Nordsee": {
-                    "count": 159
-                },
-                "Mr. Sub": {
-                    "count": 103
-                },
-                "Kebab": {
-                    "count": 182
-                },
-                "Макдоналдс": {
-                    "count": 324,
-                    "tags": {
-                        "name:en": "McDonald's"
-                    }
-                },
-                "Asia Imbiss": {
-                    "count": 111
-                },
-                "Imbiss": {
-                    "count": 199
-                },
-                "Chipotle": {
-                    "count": 290,
-                    "tags": {
-                        "cuisine": "mexican"
-                    }
-                },
-                "マクドナルド": {
-                    "count": 692,
-                    "tags": {
-                        "name:en": "McDonald's",
-                        "cuisine": "burger"
-                    }
-                },
-                "In-N-Out Burger": {
-                    "count": 65
-                },
-                "Jimmy John's": {
-                    "count": 141
-                },
-                "Jamba Juice": {
-                    "count": 68
-                },
-                "Робин Сдобин": {
-                    "count": 82
-                },
-                "Baskin Robbins": {
-                    "count": 74
-                },
-                "ケンタッキーフライドチキン": {
-                    "count": 164,
-                    "tags": {
-                        "name:en": "KFC",
-                        "cuisine": "chicken"
-                    }
-                },
-                "吉野家": {
-                    "count": 191
-                },
-                "Taco Time": {
-                    "count": 88
-                },
-                "松屋": {
-                    "count": 281,
-                    "tags": {
-                        "name:en": "Matsuya"
-                    }
-                },
-                "Little Caesars": {
-                    "count": 81
-                },
-                "El Pollo Loco": {
-                    "count": 63
-                },
-                "Del Taco": {
-                    "count": 141
-                },
-                "White Castle": {
-                    "count": 80
-                },
-                "Boston Market": {
-                    "count": 66
-                },
-                "Chick-fil-A": {
-                    "count": 257,
-                    "tags": {
-                        "cuisine": "chicken"
-                    }
-                },
-                "Panda Express": {
-                    "count": 238
-                },
-                "Whataburger": {
-                    "count": 364
-                },
-                "Taco John's": {
-                    "count": 78
-                },
-                "Теремок": {
-                    "count": 68
-                },
-                "Culver's": {
-                    "count": 425
-                },
-                "Five Guys": {
-                    "count": 141
-                },
-                "Church's Chicken": {
-                    "count": 95
-                },
-                "Popeye's": {
-                    "count": 167,
-                    "tags": {
-                        "cuisine": "chicken"
-                    }
-                },
-                "Long John Silver's": {
-                    "count": 93
-                },
-                "Pollo Campero": {
-                    "count": 62
-                },
-                "Zaxby's": {
-                    "count": 51
-                },
-                "すき家": {
-                    "count": 276,
-                    "tags": {
-                        "name:en": "SUKIYA"
-                    }
-                },
-                "モスバーガー": {
-                    "count": 257,
-                    "tags": {
-                        "name:en": "MOS BURGER"
-                    }
-                },
-                "Русский Аппетит": {
-                    "count": 69
-                },
-                "なか卯": {
-                    "count": 63
-                }
-            },
-            "restaurant": {
-                "Pizza Hut": {
-                    "count": 1180
-                },
-                "Little Chef": {
-                    "count": 64
-                },
-                "Adler": {
-                    "count": 158
-                },
-                "Zur Krone": {
-                    "count": 90
-                },
-                "Deutsches Haus": {
-                    "count": 90
-                },
-                "Krone": {
-                    "count": 171
-                },
-                "Akropolis": {
-                    "count": 152
-                },
-                "Schützenhaus": {
-                    "count": 124
-                },
-                "Kreuz": {
-                    "count": 74
-                },
-                "Waldschänke": {
-                    "count": 55
-                },
-                "La Piazza": {
-                    "count": 69
-                },
-                "Lamm": {
-                    "count": 66
-                },
-                "Zur Sonne": {
-                    "count": 73
-                },
-                "Zur Linde": {
-                    "count": 204
-                },
-                "Poseidon": {
-                    "count": 110
-                },
-                "Shanghai": {
-                    "count": 82
-                },
-                "Red Lobster": {
-                    "count": 235
-                },
-                "Zum Löwen": {
-                    "count": 84
-                },
-                "Swiss Chalet": {
-                    "count": 107
-                },
-                "Olympia": {
-                    "count": 74
-                },
-                "Wagamama": {
-                    "count": 64
-                },
-                "Frankie & Benny's": {
-                    "count": 66
-                },
-                "Hooters": {
-                    "count": 103
-                },
-                "Sternen": {
-                    "count": 78
-                },
-                "Hirschen": {
-                    "count": 79
-                },
-                "Papa John's": {
-                    "count": 67,
-                    "tags": {
-                        "cuisine": "pizza"
-                    }
-                },
-                "Denny's": {
-                    "count": 450
-                },
-                "Athen": {
-                    "count": 68
-                },
-                "Sonne": {
-                    "count": 126
-                },
-                "Hirsch": {
-                    "count": 79
-                },
-                "Ratskeller": {
-                    "count": 150
-                },
-                "La Cantina": {
-                    "count": 56
-                },
-                "Gasthaus Krone": {
-                    "count": 56
-                },
-                "El Greco": {
-                    "count": 86
-                },
-                "Gasthof zur Post": {
-                    "count": 79
-                },
-                "Nando's": {
-                    "count": 246
-                },
-                "Löwen": {
-                    "count": 112
-                },
-                "La Pataterie": {
-                    "count": 51
-                },
-                "Bella Napoli": {
-                    "count": 53
-                },
-                "Pizza Express": {
-                    "count": 262
-                },
-                "Mandarin": {
-                    "count": 65
-                },
-                "Hong Kong": {
-                    "count": 83
-                },
-                "Zizzi": {
-                    "count": 68
-                },
-                "Cracker Barrel": {
-                    "count": 183
-                },
-                "Rhodos": {
-                    "count": 81
-                },
-                "Lindenhof": {
-                    "count": 79
-                },
-                "Milano": {
-                    "count": 54
-                },
-                "Dolce Vita": {
-                    "count": 77
-                },
-                "Kirchenwirt": {
-                    "count": 81
-                },
-                "Kantine": {
-                    "count": 52
-                },
-                "Ochsen": {
-                    "count": 95
-                },
-                "Spur": {
-                    "count": 62
-                },
-                "Mykonos": {
-                    "count": 59
-                },
-                "Lotus": {
-                    "count": 66
-                },
-                "Applebee's": {
-                    "count": 531
-                },
-                "Flunch": {
-                    "count": 72
-                },
-                "Zur Post": {
-                    "count": 116
-                },
-                "China Town": {
-                    "count": 76
-                },
-                "La Dolce Vita": {
-                    "count": 73
-                },
-                "Waffle House": {
-                    "count": 207
-                },
-                "Delphi": {
-                    "count": 88
-                },
-                "Linde": {
-                    "count": 103
-                },
-                "Outback Steakhouse": {
-                    "count": 218
-                },
-                "Dionysos": {
-                    "count": 69
-                },
-                "Kelsey's": {
-                    "count": 57
-                },
-                "Boston Pizza": {
-                    "count": 165
-                },
-                "Bella Italia": {
-                    "count": 132
-                },
-                "Sizzler": {
-                    "count": 53
-                },
-                "Grüner Baum": {
-                    "count": 116
-                },
-                "Taj Mahal": {
-                    "count": 104
-                },
-                "Rössli": {
-                    "count": 68
-                },
-                "Wimpy": {
-                    "count": 51
-                },
-                "Traube": {
-                    "count": 65
-                },
-                "Adria": {
-                    "count": 52
-                },
-                "Red Robin": {
-                    "count": 185
-                },
-                "Roma": {
-                    "count": 61
-                },
-                "San Marco": {
-                    "count": 67
-                },
-                "Hellas": {
-                    "count": 55
-                },
-                "La Perla": {
-                    "count": 67
-                },
-                "Vips": {
-                    "count": 53
-                },
-                "Panera Bread": {
-                    "count": 218
-                },
-                "Da Vinci": {
-                    "count": 54
-                },
-                "Hippopotamus": {
-                    "count": 96
-                },
-                "Prezzo": {
-                    "count": 75
-                },
-                "Courtepaille": {
-                    "count": 106
-                },
-                "Hard Rock Cafe": {
-                    "count": 70
-                },
-                "Panorama": {
-                    "count": 61
-                },
-                "デニーズ": {
-                    "count": 82
-                },
-                "Sportheim": {
-                    "count": 65
-                },
-                "餃子の王将": {
-                    "count": 57
-                },
-                "Bären": {
-                    "count": 60
-                },
-                "Alte Post": {
-                    "count": 60
-                },
-                "Pizzeria Roma": {
-                    "count": 51
-                },
-                "China Garden": {
-                    "count": 66
-                },
-                "Vapiano": {
-                    "count": 82
-                },
-                "Mamma Mia": {
-                    "count": 64
-                },
-                "Schwarzer Adler": {
-                    "count": 57
-                },
-                "IHOP": {
-                    "count": 317
-                },
-                "Chili's": {
-                    "count": 328
-                },
-                "Asia": {
-                    "count": 51
-                },
-                "Olive Garden": {
-                    "count": 279
-                },
-                "TGI Friday's": {
-                    "count": 159
-                },
-                "Friendly's": {
-                    "count": 78
-                },
-                "Buffalo Grill": {
-                    "count": 202
-                },
-                "Texas Roadhouse": {
-                    "count": 110
-                },
-                "ガスト": {
-                    "count": 230,
-                    "tags": {
-                        "name:en": "Gusto"
-                    }
-                },
-                "Sakura": {
-                    "count": 75
-                },
-                "Mensa": {
-                    "count": 99
-                },
-                "The Keg": {
-                    "count": 53
-                },
-                "サイゼリヤ": {
-                    "count": 93
-                },
-                "La Strada": {
-                    "count": 52
-                },
-                "Village Inn": {
-                    "count": 92
-                },
-                "Buffalo Wild Wings": {
-                    "count": 176
-                },
-                "Peking": {
-                    "count": 59
-                },
-                "Boston Market": {
-                    "count": 61
-                },
-                "Round Table Pizza": {
-                    "count": 53
-                },
-                "Jimmy John's": {
-                    "count": 69
-                },
-                "California Pizza Kitchen": {
-                    "count": 61
-                },
-                "Якитория": {
-                    "count": 77
-                },
-                "Golden Corral": {
-                    "count": 101
-                },
-                "Perkins": {
-                    "count": 105
-                },
-                "Ruby Tuesday": {
-                    "count": 162
-                },
-                "Shari's": {
-                    "count": 65
-                },
-                "Bob Evans": {
-                    "count": 129
-                },
-                "바다횟집 (Bada Fish Restaurant)": {
-                    "count": 55
-                },
-                "Mang Inasal": {
-                    "count": 84
-                },
-                "Евразия": {
-                    "count": 102
-                },
-                "ジョナサン": {
-                    "count": 59
-                },
-                "Arby's": {
-                    "count": 51
-                },
-                "Longhorn Steakhouse": {
-                    "count": 66
-                }
-            },
-            "bank": {
-                "Chase": {
-                    "count": 721
-                },
-                "Commonwealth Bank": {
-                    "count": 232
-                },
-                "Citibank": {
-                    "count": 277
-                },
-                "HSBC": {
-                    "count": 1102
-                },
-                "Barclays": {
-                    "count": 965
-                },
-                "Westpac": {
-                    "count": 208
-                },
-                "NAB": {
-                    "count": 131
-                },
-                "ANZ": {
-                    "count": 218
-                },
-                "Lloyds Bank": {
-                    "count": 547
-                },
-                "Landbank": {
-                    "count": 81
-                },
-                "Sparkasse": {
-                    "count": 4555
-                },
-                "UCPB": {
-                    "count": 92
-                },
-                "PNB": {
-                    "count": 244
-                },
-                "Metrobank": {
-                    "count": 269
-                },
-                "BDO": {
-                    "count": 290
-                },
-                "Volksbank": {
-                    "count": 2591
-                },
-                "BPI": {
-                    "count": 415
-                },
-                "Postbank": {
-                    "count": 443
-                },
-                "NatWest": {
-                    "count": 628
-                },
-                "Raiffeisenbank": {
-                    "count": 2119
-                },
-                "Yorkshire Bank": {
-                    "count": 63
-                },
-                "ABSA": {
-                    "count": 95
-                },
-                "Standard Bank": {
-                    "count": 109
-                },
-                "FNB": {
-                    "count": 97
-                },
-                "Deutsche Bank": {
-                    "count": 855
-                },
-                "SEB": {
-                    "count": 133
-                },
-                "Commerzbank": {
-                    "count": 806
-                },
-                "Targobank": {
-                    "count": 166
-                },
-                "ABN AMRO": {
-                    "count": 130
-                },
-                "Handelsbanken": {
-                    "count": 184
-                },
-                "Swedbank": {
-                    "count": 223
-                },
-                "Kreissparkasse": {
-                    "count": 600
-                },
-                "UniCredit Bank": {
-                    "count": 408
-                },
-                "Monte dei Paschi di Siena": {
-                    "count": 132
-                },
-                "Caja Rural": {
-                    "count": 99
-                },
-                "Dresdner Bank": {
-                    "count": 66
-                },
-                "Sparda-Bank": {
-                    "count": 320
-                },
-                "VÚB": {
-                    "count": 107
-                },
-                "Slovenská sporiteľňa": {
-                    "count": 134
-                },
-                "Bank of Montreal": {
-                    "count": 118
-                },
-                "KBC": {
-                    "count": 203
-                },
-                "Royal Bank of Scotland": {
-                    "count": 111
-                },
-                "TSB": {
-                    "count": 80
-                },
-                "US Bank": {
-                    "count": 256
-                },
-                "HypoVereinsbank": {
-                    "count": 561
-                },
-                "Bank Austria": {
-                    "count": 176
-                },
-                "ING": {
-                    "count": 496
-                },
-                "Erste Bank": {
-                    "count": 180
-                },
-                "CIBC": {
-                    "count": 326
-                },
-                "Scotiabank": {
-                    "count": 413
-                },
-                "Caisse d'Épargne": {
-                    "count": 882
-                },
-                "Santander": {
-                    "count": 1323
-                },
-                "Bank of Scotland": {
-                    "count": 89
-                },
-                "TD Canada Trust": {
-                    "count": 450
-                },
-                "BMO": {
-                    "count": 169
-                },
-                "Danske Bank": {
-                    "count": 131
-                },
-                "OTP": {
-                    "count": 192
-                },
-                "Crédit Agricole": {
-                    "count": 1239
-                },
-                "LCL": {
-                    "count": 553
-                },
-                "VR-Bank": {
-                    "count": 430
-                },
-                "ČSOB": {
-                    "count": 160
-                },
-                "Česká spořitelna": {
-                    "count": 212
-                },
-                "BNP": {
-                    "count": 112
-                },
-                "Royal Bank": {
-                    "count": 65
-                },
-                "Nationwide": {
-                    "count": 209
-                },
-                "Halifax": {
-                    "count": 225
-                },
-                "BAWAG PSK": {
-                    "count": 102
-                },
-                "National Bank": {
-                    "count": 84
-                },
-                "Nedbank": {
-                    "count": 80
-                },
-                "First National Bank": {
-                    "count": 85
-                },
-                "Nordea": {
-                    "count": 319
-                },
-                "Rabobank": {
-                    "count": 609
-                },
-                "Sparkasse KölnBonn": {
-                    "count": 69
-                },
-                "Tatra banka": {
-                    "count": 67
-                },
-                "Berliner Sparkasse": {
-                    "count": 62
-                },
-                "Berliner Volksbank": {
-                    "count": 77
-                },
-                "Wells Fargo": {
-                    "count": 874
-                },
-                "Credit Suisse": {
-                    "count": 71
-                },
-                "Société Générale": {
-                    "count": 634
-                },
-                "Osuuspankki": {
-                    "count": 75
-                },
-                "Sparkasse Aachen": {
-                    "count": 56
-                },
-                "Hamburger Sparkasse": {
-                    "count": 156
-                },
-                "Cassa di Risparmio del Veneto": {
-                    "count": 68
-                },
-                "BNP Paribas": {
-                    "count": 617
-                },
-                "Banque Populaire": {
-                    "count": 433
-                },
-                "BNP Paribas Fortis": {
-                    "count": 209
-                },
-                "Banco Popular": {
-                    "count": 291
-                },
-                "Bancaja": {
-                    "count": 55
-                },
-                "Banesto": {
-                    "count": 208
-                },
-                "La Caixa": {
-                    "count": 583
-                },
-                "Santander Consumer Bank": {
-                    "count": 88
-                },
-                "BRD": {
-                    "count": 191
-                },
-                "BCR": {
-                    "count": 143
-                },
-                "Banca Transilvania": {
-                    "count": 141
-                },
-                "BW-Bank": {
-                    "count": 97
-                },
-                "Komerční banka": {
-                    "count": 132
-                },
-                "Banco Pastor": {
-                    "count": 64
-                },
-                "Stadtsparkasse": {
-                    "count": 86
-                },
-                "Ulster Bank": {
-                    "count": 86
-                },
-                "Sberbank": {
-                    "count": 58
-                },
-                "CIC": {
-                    "count": 427
-                },
-                "Bancpost": {
-                    "count": 56
-                },
-                "Caja Madrid": {
-                    "count": 115
-                },
-                "Maybank": {
-                    "count": 94
-                },
-                "中国银行": {
-                    "count": 85
-                },
-                "Unicredit Banca": {
-                    "count": 243
-                },
-                "Crédit Mutuel": {
-                    "count": 690
-                },
-                "BBVA": {
-                    "count": 647
-                },
-                "Intesa San Paolo": {
-                    "count": 69
-                },
-                "TD Bank": {
-                    "count": 206
-                },
-                "Belfius": {
-                    "count": 231
-                },
-                "Bank of America": {
-                    "count": 924
-                },
-                "RBC": {
-                    "count": 230
-                },
-                "Alpha Bank": {
-                    "count": 123
-                },
-                "Сбербанк": {
-                    "count": 4794
-                },
-                "Россельхозбанк": {
-                    "count": 201
-                },
-                "Crédit du Nord": {
-                    "count": 96
-                },
-                "BancoEstado": {
-                    "count": 80
-                },
-                "Millennium Bank": {
-                    "count": 414
-                },
-                "State Bank of India": {
-                    "count": 151
-                },
-                "Беларусбанк": {
-                    "count": 242
-                },
-                "ING Bank Śląski": {
-                    "count": 67
-                },
-                "Caixa Geral de Depósitos": {
-                    "count": 129
-                },
-                "Kreissparkasse Köln": {
-                    "count": 65
-                },
-                "Banco BCI": {
-                    "count": 51
-                },
-                "Banco de Chile": {
-                    "count": 98
-                },
-                "ВТБ24": {
-                    "count": 326
-                },
-                "UBS": {
-                    "count": 134
-                },
-                "PKO BP": {
-                    "count": 265
-                },
-                "Chinabank": {
-                    "count": 55
-                },
-                "PSBank": {
-                    "count": 59
-                },
-                "Union Bank": {
-                    "count": 124
-                },
-                "China Bank": {
-                    "count": 66
-                },
-                "RCBC": {
-                    "count": 122
-                },
-                "Unicaja": {
-                    "count": 83
-                },
-                "BBK": {
-                    "count": 79
-                },
-                "Ibercaja": {
-                    "count": 69
-                },
-                "RBS": {
-                    "count": 143
-                },
-                "Commercial Bank of Ceylon PLC": {
-                    "count": 79
-                },
-                "Bank of Ireland": {
-                    "count": 109
-                },
-                "BNL": {
-                    "count": 87
-                },
-                "Banco Santander": {
-                    "count": 138
-                },
-                "Banco Itaú": {
-                    "count": 111
-                },
-                "AIB": {
-                    "count": 72
-                },
-                "BZ WBK": {
-                    "count": 77
-                },
-                "Banco do Brasil": {
-                    "count": 557
-                },
-                "Caixa Econômica Federal": {
-                    "count": 184
-                },
-                "Fifth Third Bank": {
-                    "count": 84
-                },
-                "Banca Popolare di Vicenza": {
-                    "count": 81
-                },
-                "Wachovia": {
-                    "count": 58
-                },
-                "OLB": {
-                    "count": 53
-                },
-                "みずほ銀行": {
-                    "count": 78
-                },
-                "BES": {
-                    "count": 72
-                },
-                "ICICI Bank": {
-                    "count": 91
-                },
-                "HDFC Bank": {
-                    "count": 91
-                },
-                "La Banque Postale": {
-                    "count": 67
-                },
-                "Pekao SA": {
-                    "count": 56
-                },
-                "Oberbank": {
-                    "count": 90
-                },
-                "Bradesco": {
-                    "count": 295
-                },
-                "Oldenburgische Landesbank": {
-                    "count": 56
-                },
-                "Bendigo Bank": {
-                    "count": 93
-                },
-                "Argenta": {
-                    "count": 86
-                },
-                "AXA": {
-                    "count": 68
-                },
-                "Axis Bank": {
-                    "count": 61
-                },
-                "Banco Nación": {
-                    "count": 67
-                },
-                "GE Money Bank": {
-                    "count": 72
-                },
-                "Альфа-Банк": {
-                    "count": 185
-                },
-                "Белагропромбанк": {
-                    "count": 70
-                },
-                "Caja Círculo": {
-                    "count": 65
-                },
-                "Banco Galicia": {
-                    "count": 51
-                },
-                "Eurobank": {
-                    "count": 97
-                },
-                "Banca Intesa": {
-                    "count": 62
-                },
-                "Canara Bank": {
-                    "count": 92
-                },
-                "Cajamar": {
-                    "count": 77
-                },
-                "Banamex": {
-                    "count": 149
-                },
-                "Crédit Mutuel de Bretagne": {
-                    "count": 335
-                },
-                "Davivienda": {
-                    "count": 83
-                },
-                "Bank Spółdzielczy": {
-                    "count": 159
-                },
-                "Credit Agricole": {
-                    "count": 157
-                },
-                "Bankinter": {
-                    "count": 59
-                },
-                "Banque Nationale": {
-                    "count": 63
-                },
-                "Bank of the West": {
-                    "count": 96
-                },
-                "Key Bank": {
-                    "count": 155
-                },
-                "Western Union": {
-                    "count": 88
-                },
-                "Citizens Bank": {
-                    "count": 115
-                },
-                "ПриватБанк": {
-                    "count": 513
-                },
-                "Security Bank": {
-                    "count": 78
-                },
-                "Millenium Bank": {
-                    "count": 60
-                },
-                "Bankia": {
-                    "count": 149
-                },
-                "三菱東京UFJ銀行": {
-                    "count": 159
-                },
-                "Caixa": {
-                    "count": 117
-                },
-                "Banco de Costa Rica": {
-                    "count": 63
-                },
-                "SunTrust Bank": {
-                    "count": 73
-                },
-                "Itaú": {
-                    "count": 338
-                },
-                "PBZ": {
-                    "count": 52
-                },
-                "中国工商银行": {
-                    "count": 51
-                },
-                "Bancolombia": {
-                    "count": 89
-                },
-                "Райффайзен Банк Аваль": {
-                    "count": 64
-                },
-                "Bancomer": {
-                    "count": 115
-                },
-                "Banorte": {
-                    "count": 80
-                },
-                "Alior Bank": {
-                    "count": 81
-                },
-                "BOC": {
-                    "count": 51
-                },
-                "Банк Москвы": {
-                    "count": 118
-                },
-                "ВТБ": {
-                    "count": 59
-                },
-                "Getin Bank": {
-                    "count": 55
-                },
-                "Caja Duero": {
-                    "count": 57
-                },
-                "Regions Bank": {
-                    "count": 62
-                },
-                "Росбанк": {
-                    "count": 177
-                },
-                "Banco Estado": {
-                    "count": 72
-                },
-                "BCI": {
-                    "count": 68
-                },
-                "SunTrust": {
-                    "count": 68
-                },
-                "PNC Bank": {
-                    "count": 254
-                },
-                "신한은행": {
-                    "count": 217,
-                    "tags": {
-                        "name:en": "Sinhan Bank"
-                    }
-                },
-                "우리은행": {
-                    "count": 291,
-                    "tags": {
-                        "name:en": "Uri Bank"
-                    }
-                },
-                "국민은행": {
-                    "count": 165,
-                    "tags": {
-                        "name:en": "Gungmin Bank"
-                    }
-                },
-                "중소기업은행": {
-                    "count": 52,
-                    "tags": {
-                        "name:en": "Industrial Bank of Korea"
-                    }
-                },
-                "광주은행": {
-                    "count": 51,
-                    "tags": {
-                        "name:en": "Gwangju Bank"
-                    }
-                },
-                "Газпромбанк": {
-                    "count": 100
-                },
-                "M&T Bank": {
-                    "count": 92
-                },
-                "Caja de Burgos": {
-                    "count": 51
-                },
-                "Santander Totta": {
-                    "count": 69
-                },
-                "УкрСиббанк": {
-                    "count": 192
-                },
-                "Ощадбанк": {
-                    "count": 364
-                },
-                "Уралсиб": {
-                    "count": 85
-                },
-                "りそな銀行": {
-                    "count": 225,
-                    "tags": {
-                        "name:en": "Mizuho Bank"
-                    }
-                },
-                "Ecobank": {
-                    "count": 66
-                },
-                "Cajero Automatico Bancared": {
-                    "count": 145
-                },
-                "Промсвязьбанк": {
-                    "count": 93
-                },
-                "三井住友銀行": {
-                    "count": 129
-                },
-                "Banco Provincia": {
-                    "count": 67
-                },
-                "BB&T": {
-                    "count": 147
-                },
-                "Возрождение": {
-                    "count": 59
-                },
-                "Capital One": {
-                    "count": 59
-                },
-                "横浜銀行": {
-                    "count": 51
-                },
-                "Bank Mandiri": {
-                    "count": 62
-                },
-                "Banco de la Nación": {
-                    "count": 92
-                },
-                "Banco G&T Continental": {
-                    "count": 62
-                },
-                "Peoples Bank": {
-                    "count": 60
-                },
-                "工商银行": {
-                    "count": 51
-                },
-                "Совкомбанк": {
-                    "count": 55
-                },
-                "Provincial": {
-                    "count": 56
-                },
-                "Banco de Desarrollo Banrural": {
-                    "count": 73
-                },
-                "Banco Bradesco": {
-                    "count": 65
-                },
-                "Bicentenario": {
-                    "count": 182
-                },
-                "ლიბერთი ბანკი": {
-                    "count": 54,
-                    "tags": {
-                        "name:en": "Liberty Bank"
-                    }
-                },
-                "Banesco": {
-                    "count": 108
-                },
-                "Mercantil": {
-                    "count": 75
-                },
-                "Bank BRI": {
-                    "count": 53
-                },
-                "Del Tesoro": {
-                    "count": 91
-                },
-                "하나은행": {
-                    "count": 77
-                },
-                "CityCommerce Bank": {
-                    "count": 71
-                },
-                "De Venezuela": {
-                    "count": 117
-                }
-            },
-            "car_rental": {
-                "Europcar": {
-                    "count": 291
-                },
-                "Budget": {
-                    "count": 92
-                },
-                "Sixt": {
-                    "count": 161
-                },
-                "Avis": {
-                    "count": 282
-                },
-                "Hertz": {
-                    "count": 293
-                },
-                "Enterprise": {
-                    "count": 199
-                },
-                "stadtmobil CarSharing-Station": {
-                    "count": 148
-                }
-            },
-            "pharmacy": {
-                "Rowlands Pharmacy": {
-                    "count": 71
-                },
-                "Boots": {
-                    "count": 840
-                },
-                "Marien-Apotheke": {
-                    "count": 314
-                },
-                "Mercury Drug": {
-                    "count": 426
-                },
-                "Löwen-Apotheke": {
-                    "count": 356
-                },
-                "Superdrug": {
-                    "count": 117
-                },
-                "Sonnen-Apotheke": {
-                    "count": 311
-                },
-                "Rathaus-Apotheke": {
-                    "count": 132
-                },
-                "Engel-Apotheke": {
-                    "count": 123
-                },
-                "Hirsch-Apotheke": {
-                    "count": 83
-                },
-                "Stern-Apotheke": {
-                    "count": 67
-                },
-                "Lloyds Pharmacy": {
-                    "count": 295
-                },
-                "Rosen-Apotheke": {
-                    "count": 208
-                },
-                "Stadt-Apotheke": {
-                    "count": 302
-                },
-                "Markt-Apotheke": {
-                    "count": 164
-                },
-                "Аптека": {
-                    "count": 1989
-                },
-                "Pharmasave": {
-                    "count": 64
-                },
-                "Brunnen-Apotheke": {
-                    "count": 53
-                },
-                "Shoppers Drug Mart": {
-                    "count": 430
-                },
-                "Apotheke am Markt": {
-                    "count": 60
-                },
-                "Alte Apotheke": {
-                    "count": 88
-                },
-                "Neue Apotheke": {
-                    "count": 109
-                },
-                "Gintarinė vaistinė": {
-                    "count": 101
-                },
-                "Rats-Apotheke": {
-                    "count": 84
-                },
-                "Adler Apotheke": {
-                    "count": 313
-                },
-                "Pharmacie Centrale": {
-                    "count": 64
-                },
-                "Walgreens": {
-                    "count": 1619
-                },
-                "Rite Aid": {
-                    "count": 745
-                },
-                "Apotheke": {
-                    "count": 165
-                },
-                "Linden-Apotheke": {
-                    "count": 211
-                },
-                "Bahnhof-Apotheke": {
-                    "count": 66
-                },
-                "Burg-Apotheke": {
-                    "count": 55
-                },
-                "Jean Coutu": {
-                    "count": 62
-                },
-                "Pharmaprix": {
-                    "count": 60
-                },
-                "Farmacias Ahumada": {
-                    "count": 104
-                },
-                "Farmacia Comunale": {
-                    "count": 113
-                },
-                "Farmacias Cruz Verde": {
-                    "count": 86
-                },
-                "Cruz Verde": {
-                    "count": 99
-                },
-                "Hubertus Apotheke": {
-                    "count": 52
-                },
-                "CVS": {
-                    "count": 1560
-                },
-                "Farmacias SalcoBrand": {
-                    "count": 133
-                },
-                "Фармация": {
-                    "count": 120
-                },
-                "Bären-Apotheke": {
-                    "count": 74
-                },
-                "Clicks": {
-                    "count": 113
-                },
-                "セイジョー": {
-                    "count": 53
-                },
-                "マツモトキヨシ": {
-                    "count": 115
-                },
-                "Dr. Max": {
-                    "count": 51
-                },
-                "Вита": {
-                    "count": 106
-                },
-                "Радуга": {
-                    "count": 70
-                },
-                "サンドラッグ": {
-                    "count": 61
-                },
-                "Apteka": {
-                    "count": 366
-                },
-                "Первая помощь": {
-                    "count": 74
-                },
-                "Ригла": {
-                    "count": 113
-                },
-                "Имплозия": {
-                    "count": 63
-                },
-                "Kinney Drugs": {
-                    "count": 68
-                },
-                "Классика": {
-                    "count": 67
-                },
-                "Ljekarna": {
-                    "count": 53
-                },
-                "SalcoBrand": {
-                    "count": 88
-                },
-                "Аптека 36,6": {
-                    "count": 224
-                },
-                "Фармакор": {
-                    "count": 75
-                },
-                "スギ薬局": {
-                    "count": 84
-                },
-                "Аптечный пункт": {
-                    "count": 148
-                },
-                "Невис": {
-                    "count": 60
-                },
-                "トモズ (Tomod's)": {
-                    "count": 83
-                },
-                "Eurovaistinė": {
-                    "count": 65
-                },
-                "Farmacity": {
-                    "count": 68
-                },
-                "аптека": {
-                    "count": 96
-                },
-                "The Generics Pharmacy": {
-                    "count": 95
-                },
-                "Farmatodo": {
-                    "count": 123
-                },
-                "Duane Reade": {
-                    "count": 61
-                },
-                "H-E-B": {
-                    "count": 262
-                },
-                "Фармленд": {
-                    "count": 82
-                },
-                "ドラッグてらしま (Drug Terashima)": {
-                    "count": 96
-                },
-                "Арніка": {
-                    "count": 125
-                },
-                "ავერსი (Aversi)": {
-                    "count": 62
-                },
-                "Farmahorro": {
-                    "count": 58
-                }
-            },
-            "cafe": {
-                "Starbucks": {
-                    "count": 4238,
-                    "tags": {
-                        "cuisine": "coffee_shop"
-                    }
-                },
-                "Cafeteria": {
-                    "count": 115
-                },
-                "Costa": {
-                    "count": 618
-                },
-                "Caffè Nero": {
-                    "count": 169
-                },
-                "Кафе": {
-                    "count": 226
-                },
-                "Café Central": {
-                    "count": 61
-                },
-                "Second Cup": {
-                    "count": 193
-                },
-                "Eisdiele": {
-                    "count": 73
-                },
-                "Dunkin Donuts": {
-                    "count": 428,
-                    "tags": {
-                        "cuisine": "donut"
-                    }
-                },
-                "Espresso House": {
-                    "count": 53
-                },
-                "Segafredo": {
-                    "count": 69
-                },
-                "Coffee Time": {
-                    "count": 94
-                },
-                "Cafe Coffee Day": {
-                    "count": 120
-                },
-                "Eiscafe Venezia": {
-                    "count": 180
-                },
-                "スターバックス": {
-                    "count": 251,
-                    "tags": {
-                        "name:en": "Starbucks"
-                    }
-                },
-                "Шоколадница": {
-                    "count": 145
-                },
-                "Pret A Manger": {
-                    "count": 119
-                },
-                "Столовая": {
-                    "count": 391
-                },
-                "Jamba Juice": {
-                    "count": 53
-                },
-                "ドトール": {
-                    "count": 164,
-                    "tags": {
-                        "name:en": "DOUTOR"
-                    }
-                },
-                "Tchibo": {
-                    "count": 100
-                },
-                "Кофе Хауз": {
-                    "count": 104
-                },
-                "Caribou Coffee": {
-                    "count": 100
-                },
-                "Уют": {
-                    "count": 51
-                },
-                "Шашлычная": {
-                    "count": 58
-                },
-                "คาเฟ่ อเมซอน": {
-                    "count": 62
-                },
-                "Traveler's Coffee": {
-                    "count": 60
-                },
-                "カフェ・ド・クリエ": {
-                    "count": 67,
-                    "tags": {
-                        "name:en": "Cafe de CRIE"
-                    }
-                },
-                "Cafe Amazon": {
-                    "count": 65
-                }
-            }
-        },
-        "shop": {
-            "supermarket": {
-                "Budgens": {
-                    "count": 88
-                },
-                "Morrisons": {
-                    "count": 411
-                },
-                "Interspar": {
-                    "count": 142
-                },
-                "Merkur": {
-                    "count": 107
-                },
-                "Sainsbury's": {
-                    "count": 547
-                },
-                "Lidl": {
-                    "count": 6208
-                },
-                "EDEKA": {
-                    "count": 506
-                },
-                "Coles": {
-                    "count": 400
-                },
-                "Iceland": {
-                    "count": 315
-                },
-                "Coop": {
-                    "count": 1906
-                },
-                "Tesco": {
-                    "count": 1297
-                },
-                "Woolworths": {
-                    "count": 541
-                },
-                "Zielpunkt": {
-                    "count": 239
-                },
-                "Nahkauf": {
-                    "count": 170
-                },
-                "Billa": {
-                    "count": 1432
-                },
-                "Kaufland": {
-                    "count": 1004
-                },
-                "Plus": {
-                    "count": 120
-                },
-                "ALDI": {
-                    "count": 5172
-                },
-                "Checkers": {
-                    "count": 128
-                },
-                "Tesco Metro": {
-                    "count": 137
-                },
-                "NP": {
-                    "count": 153
-                },
-                "Penny": {
-                    "count": 1759
-                },
-                "Norma": {
-                    "count": 1068
-                },
-                "Asda": {
-                    "count": 225
-                },
-                "Netto": {
-                    "count": 4379
-                },
-                "REWE": {
-                    "count": 1474
-                },
-                "Rewe": {
-                    "count": 1171
-                },
-                "Aldi Süd": {
-                    "count": 594
-                },
-                "Real": {
-                    "count": 246
-                },
-                "Tesco Express": {
-                    "count": 406
-                },
-                "King Soopers": {
-                    "count": 72
-                },
-                "Kiwi": {
-                    "count": 167
-                },
-                "Edeka": {
-                    "count": 1787
-                },
-                "Pick n Pay": {
-                    "count": 241
-                },
-                "ICA": {
-                    "count": 192
-                },
-                "Tengelmann": {
-                    "count": 188
-                },
-                "Carrefour": {
-                    "count": 1640
-                },
-                "Waitrose": {
-                    "count": 258
-                },
-                "Spar": {
-                    "count": 2100
-                },
-                "Hofer": {
-                    "count": 442
-                },
-                "M-Preis": {
-                    "count": 76
-                },
-                "LIDL": {
-                    "count": 922
-                },
-                "tegut": {
-                    "count": 210
-                },
-                "Sainsbury's Local": {
-                    "count": 118
-                },
-                "E-Center": {
-                    "count": 66
-                },
-                "Aldi Nord": {
-                    "count": 210
-                },
-                "nahkauf": {
-                    "count": 84
-                },
-                "Meijer": {
-                    "count": 76
-                },
-                "Safeway": {
-                    "count": 410
-                },
-                "Costco": {
-                    "count": 152
-                },
-                "Albert": {
-                    "count": 185
-                },
-                "Jumbo": {
-                    "count": 194
-                },
-                "Shoprite": {
-                    "count": 244
-                },
-                "MPreis": {
-                    "count": 54
-                },
-                "Penny Market": {
-                    "count": 429
-                },
-                "Tesco Extra": {
-                    "count": 123
-                },
-                "Albert Heijn": {
-                    "count": 476
-                },
-                "IGA": {
-                    "count": 363
-                },
-                "Super U": {
-                    "count": 488
-                },
-                "Metro": {
-                    "count": 260
-                },
-                "Neukauf": {
-                    "count": 77
-                },
-                "Migros": {
-                    "count": 459
-                },
-                "Marktkauf": {
-                    "count": 121
-                },
-                "Delikatesy Centrum": {
-                    "count": 59
-                },
-                "C1000": {
-                    "count": 307
-                },
-                "Hoogvliet": {
-                    "count": 53
-                },
-                "COOP": {
-                    "count": 194
-                },
-                "Food Basics": {
-                    "count": 75
-                },
-                "Casino": {
-                    "count": 264
-                },
-                "Penny Markt": {
-                    "count": 466
-                },
-                "Giant": {
-                    "count": 191
-                },
-                "COOP Jednota": {
-                    "count": 73
-                },
-                "Rema 1000": {
-                    "count": 368
-                },
-                "Kaufpark": {
-                    "count": 96
-                },
-                "ALDI SÜD": {
-                    "count": 113
-                },
-                "Simply Market": {
-                    "count": 330
-                },
-                "Konzum": {
-                    "count": 230
-                },
-                "Carrefour Express": {
-                    "count": 353
-                },
-                "Eurospar": {
-                    "count": 270
-                },
-                "Mercator": {
-                    "count": 125
-                },
-                "Famila": {
-                    "count": 130
-                },
-                "Hemköp": {
-                    "count": 82
-                },
-                "real,-": {
-                    "count": 81
-                },
-                "Markant": {
-                    "count": 88
-                },
-                "Volg": {
-                    "count": 135
-                },
-                "Leader Price": {
-                    "count": 267
-                },
-                "Treff 3000": {
-                    "count": 94
-                },
-                "SuperBrugsen": {
-                    "count": 67
-                },
-                "Kaiser's": {
-                    "count": 256
-                },
-                "K+K": {
-                    "count": 106
-                },
-                "Unimarkt": {
-                    "count": 86
-                },
-                "Carrefour City": {
-                    "count": 126
-                },
-                "Sobeys": {
-                    "count": 122
-                },
-                "S-Market": {
-                    "count": 109
-                },
-                "Combi": {
-                    "count": 55
-                },
-                "Denner": {
-                    "count": 276
-                },
-                "Konsum": {
-                    "count": 133
-                },
-                "Franprix": {
-                    "count": 312
-                },
-                "Monoprix": {
-                    "count": 198
-                },
-                "Diska": {
-                    "count": 69
-                },
-                "PENNY": {
-                    "count": 79
-                },
-                "Dia": {
-                    "count": 835
-                },
-                "Giant Eagle": {
-                    "count": 85
-                },
-                "NORMA": {
-                    "count": 115
-                },
-                "AD Delhaize": {
-                    "count": 63
-                },
-                "Auchan": {
-                    "count": 152
-                },
-                "Mercadona": {
-                    "count": 769
-                },
-                "Consum": {
-                    "count": 130
-                },
-                "Carrefour Market": {
-                    "count": 80
-                },
-                "Whole Foods": {
-                    "count": 210
-                },
-                "Pam": {
-                    "count": 56
-                },
-                "sky": {
-                    "count": 105
-                },
-                "Despar": {
-                    "count": 146
-                },
-                "Eroski": {
-                    "count": 208
-                },
-                "Costcutter": {
-                    "count": 63
-                },
-                "Maxi": {
-                    "count": 108
-                },
-                "Colruyt": {
-                    "count": 180
-                },
-                "The Co-operative": {
-                    "count": 64
-                },
-                "Intermarché": {
-                    "count": 1210
-                },
-                "Delhaize": {
-                    "count": 207
-                },
-                "CBA": {
-                    "count": 176
-                },
-                "Shopi": {
-                    "count": 53
-                },
-                "Walmart": {
-                    "count": 644
-                },
-                "Kroger": {
-                    "count": 317
-                },
-                "Albertsons": {
-                    "count": 242
-                },
-                "Trader Joe's": {
-                    "count": 235
-                },
-                "Feneberg": {
-                    "count": 58
-                },
-                "denn's Biomarkt": {
-                    "count": 52
-                },
-                "dm": {
-                    "count": 114
-                },
-                "Kvickly": {
-                    "count": 55
-                },
-                "Makro": {
-                    "count": 140
-                },
-                "Dico": {
-                    "count": 53
-                },
-                "Nah & Frisch": {
-                    "count": 73
-                },
-                "Champion": {
-                    "count": 59
-                },
-                "ICA Supermarket": {
-                    "count": 51
-                },
-                "Fakta": {
-                    "count": 235
-                },
-                "Магнит": {
-                    "count": 1760
-                },
-                "Caprabo": {
-                    "count": 103
-                },
-                "Famiglia Cooperativa": {
-                    "count": 64
-                },
-                "Народная 7Я семьЯ": {
-                    "count": 154
-                },
-                "Esselunga": {
-                    "count": 85
-                },
-                "Maxima": {
-                    "count": 102
-                },
-                "Petit Casino": {
-                    "count": 111
-                },
-                "Wasgau": {
-                    "count": 60
-                },
-                "Pingo Doce": {
-                    "count": 253
-                },
-                "Match": {
-                    "count": 140
-                },
-                "Profi": {
-                    "count": 60
-                },
-                "Lider": {
-                    "count": 65
-                },
-                "Unimarc": {
-                    "count": 177
-                },
-                "Co-operative Food": {
-                    "count": 59
-                },
-                "Santa Isabel": {
-                    "count": 128
-                },
-                "Седьмой континент": {
-                    "count": 79
-                },
-                "HIT": {
-                    "count": 59
-                },
-                "Rimi": {
-                    "count": 106
-                },
-                "Conad": {
-                    "count": 304
-                },
-                "Фуршет": {
-                    "count": 76
-                },
-                "Willys": {
-                    "count": 56
-                },
-                "Farmfoods": {
-                    "count": 64
-                },
-                "U Express": {
-                    "count": 51
-                },
-                "Фора": {
-                    "count": 52
-                },
-                "Dunnes Stores": {
-                    "count": 73
-                },
-                "Сільпо": {
-                    "count": 125
-                },
-                "マルエツ": {
-                    "count": 59
-                },
-                "Piggly Wiggly": {
-                    "count": 57
-                },
-                "Crai": {
-                    "count": 54
-                },
-                "El Árbol": {
-                    "count": 73
-                },
-                "Centre Commercial E. Leclerc": {
-                    "count": 549
-                },
-                "Foodland": {
-                    "count": 100
-                },
-                "Super Brugsen": {
-                    "count": 67
-                },
-                "Дикси": {
-                    "count": 683
-                },
-                "Пятёрочка": {
-                    "count": 1344
-                },
-                "Publix": {
-                    "count": 339
-                },
-                "Føtex": {
-                    "count": 66
-                },
-                "coop": {
-                    "count": 73
-                },
-                "Fressnapf": {
-                    "count": 69
-                },
-                "Coop Konsum": {
-                    "count": 79
-                },
-                "Carrefour Contact": {
-                    "count": 83
-                },
-                "SPAR": {
-                    "count": 286
-                },
-                "No Frills": {
-                    "count": 105
-                },
-                "Plodine": {
-                    "count": 52
-                },
-                "ADEG": {
-                    "count": 68
-                },
-                "Minipreço": {
-                    "count": 111
-                },
-                "Biedronka": {
-                    "count": 1335
-                },
-                "The Co-operative Food": {
-                    "count": 131
-                },
-                "Eurospin": {
-                    "count": 155
-                },
-                "Семья": {
-                    "count": 62
-                },
-                "Gadis": {
-                    "count": 53
-                },
-                "Евроопт": {
-                    "count": 68
-                },
-                "Centra": {
-                    "count": 51
-                },
-                "Квартал": {
-                    "count": 82
-                },
-                "New World": {
-                    "count": 69
-                },
-                "Countdown": {
-                    "count": 95
-                },
-                "Reliance Fresh": {
-                    "count": 61
-                },
-                "Stokrotka": {
-                    "count": 98
-                },
-                "Coop Jednota": {
-                    "count": 74
-                },
-                "Fred Meyer": {
-                    "count": 64
-                },
-                "Irma": {
-                    "count": 58
-                },
-                "Continente": {
-                    "count": 75
-                },
-                "Price Chopper": {
-                    "count": 99
-                },
-                "Game": {
-                    "count": 52
-                },
-                "Soriana": {
-                    "count": 93
-                },
-                "Alimerka": {
-                    "count": 64
-                },
-                "Piotr i Paweł": {
-                    "count": 53
-                },
-                "Перекресток": {
-                    "count": 312
-                },
-                "Maxima X": {
-                    "count": 117
-                },
-                "Карусель": {
-                    "count": 55
-                },
-                "ALDI Nord": {
-                    "count": 51
-                },
-                "Condis": {
-                    "count": 67
-                },
-                "Sam's Club": {
-                    "count": 138
-                },
-                "Копейка": {
-                    "count": 87
-                },
-                "Géant Casino": {
-                    "count": 54
-                },
-                "ASDA": {
-                    "count": 180
-                },
-                "Intermarche": {
-                    "count": 115
-                },
-                "Stop & Shop": {
-                    "count": 66
-                },
-                "Food Lion": {
-                    "count": 216
-                },
-                "Harris Teeter": {
-                    "count": 92
-                },
-                "Foodworks": {
-                    "count": 62
-                },
-                "Polo Market": {
-                    "count": 86
-                },
-                "Лента": {
-                    "count": 51
-                },
-                "西友 (SEIYU)": {
-                    "count": 58
-                },
-                "H-E-B": {
-                    "count": 293
-                },
-                "Атак": {
-                    "count": 53
-                },
-                "Полушка": {
-                    "count": 139
-                },
-                "Extra": {
-                    "count": 82
-                },
-                "Lewiatan": {
-                    "count": 94
-                },
-                "Sigma": {
-                    "count": 51
-                },
-                "АТБ": {
-                    "count": 322
-                },
-                "Społem": {
-                    "count": 55
-                },
-                "Bodega Aurrera": {
-                    "count": 82
-                },
-                "Tesco Lotus": {
-                    "count": 77
-                },
-                "Мария-Ра": {
-                    "count": 108
-                },
-                "Магнолия": {
-                    "count": 72
-                },
-                "Магазин": {
-                    "count": 120
-                },
-                "Монетка": {
-                    "count": 174
-                },
-                "Hy-Vee": {
-                    "count": 75
-                },
-                "Walmart Supercenter": {
-                    "count": 133
-                },
-                "Hannaford": {
-                    "count": 57
-                },
-                "Wegmans": {
-                    "count": 83
-                },
-                "業務スーパー": {
-                    "count": 61
-                },
-                "Norfa XL": {
-                    "count": 55
-                },
-                "ヨークマート (YorkMart)": {
-                    "count": 64
-                },
-                "Leclerc Drive": {
-                    "count": 76
-                }
-            },
-            "electronics": {
-                "Media Markt": {
-                    "count": 285
-                },
-                "Maplin": {
-                    "count": 65
-                },
-                "Best Buy": {
-                    "count": 345
-                },
-                "Future Shop": {
-                    "count": 73
-                },
-                "Saturn": {
-                    "count": 134
-                },
-                "Currys": {
-                    "count": 80
-                },
-                "Radio Shack": {
-                    "count": 269
-                },
-                "Euronics": {
-                    "count": 115
-                },
-                "Expert": {
-                    "count": 123
-                },
-                "Эльдорадо": {
-                    "count": 184
-                },
-                "Darty": {
-                    "count": 74
-                },
-                "М.Видео": {
-                    "count": 89
-                },
-                "ヤマダ電機": {
-                    "count": 51
-                }
-            },
-            "convenience": {
-                "Shell": {
-                    "count": 255
-                },
-                "Spar": {
-                    "count": 922
-                },
-                "McColl's": {
-                    "count": 100
-                },
-                "Tesco Express": {
-                    "count": 426
-                },
-                "Sainsbury's Local": {
-                    "count": 104
-                },
-                "Aral": {
-                    "count": 56
-                },
-                "One Stop": {
-                    "count": 146
-                },
-                "The Co-operative Food": {
-                    "count": 115
-                },
-                "Londis": {
-                    "count": 352
-                },
-                "7-Eleven": {
-                    "count": 4440
-                },
-                "CBA": {
-                    "count": 135
-                },
-                "Coop": {
-                    "count": 538
-                },
-                "Sale": {
-                    "count": 80
-                },
-                "Statoil": {
-                    "count": 69
-                },
-                "Sheetz": {
-                    "count": 54
-                },
-                "Konzum": {
-                    "count": 173
-                },
-                "Siwa": {
-                    "count": 216
-                },
-                "Mercator": {
-                    "count": 57
-                },
-                "Esso": {
-                    "count": 67
-                },
-                "COOP Jednota": {
-                    "count": 181
-                },
-                "Mac's": {
-                    "count": 152
-                },
-                "Alepa": {
-                    "count": 62
-                },
-                "Hasty Market": {
-                    "count": 54
-                },
-                "K-Market": {
-                    "count": 54
-                },
-                "Costcutter": {
-                    "count": 292
-                },
-                "Valintatalo": {
-                    "count": 62
-                },
-                "SPAR": {
-                    "count": 197
-                },
-                "COOP": {
-                    "count": 140
-                },
-                "Casino": {
-                    "count": 90
-                },
-                "Franprix": {
-                    "count": 61
-                },
-                "Circle K": {
-                    "count": 289
-                },
-                "セブンイレブン": {
-                    "count": 3011,
-                    "tags": {
-                        "name:en": "7-Eleven"
-                    }
-                },
-                "ローソン": {
-                    "count": 1596,
-                    "tags": {
-                        "name:en": "LAWSON"
-                    }
-                },
-                "BP": {
-                    "count": 163
-                },
-                "Tesco": {
-                    "count": 55
-                },
-                "Petit Casino": {
-                    "count": 233
-                },
-                "Volg": {
-                    "count": 116
-                },
-                "Mace": {
-                    "count": 115
-                },
-                "Mini Market": {
-                    "count": 272
-                },
-                "Nisa Local": {
-                    "count": 77
-                },
-                "Dorfladen": {
-                    "count": 75
-                },
-                "Продукты": {
-                    "count": 4285
-                },
-                "Mini Stop": {
-                    "count": 228
-                },
-                "LAWSON": {
-                    "count": 419
-                },
-                "デイリーヤマザキ": {
-                    "count": 141
-                },
-                "Biedronka": {
-                    "count": 83
-                },
-                "Надежда": {
-                    "count": 56
-                },
-                "Mobil": {
-                    "count": 66
-                },
-                "Nisa": {
-                    "count": 51
-                },
-                "Premier": {
-                    "count": 129
-                },
-                "ABC": {
-                    "count": 152
-                },
-                "ミニストップ": {
-                    "count": 316,
-                    "tags": {
-                        "name:en": "MINISTOP"
-                    }
-                },
-                "サンクス": {
-                    "count": 560,
-                    "tags": {
-                        "name:en": "sunkus"
-                    }
-                },
-                "スリーエフ": {
-                    "count": 88
-                },
-                "8 à Huit": {
-                    "count": 61
-                },
-                "Tchibo": {
-                    "count": 56
-                },
-                "Żabka": {
-                    "count": 546
-                },
-                "Almacen": {
-                    "count": 229
-                },
-                "Vival": {
-                    "count": 194
-                },
-                "FamilyMart": {
-                    "count": 529
-                },
-                "ファミリーマート": {
-                    "count": 1608,
-                    "tags": {
-                        "name:en": "FamilyMart"
-                    }
-                },
-                "Carrefour City": {
-                    "count": 57
-                },
-                "Sunkus": {
-                    "count": 62
-                },
-                "Casey's General Store": {
-                    "count": 95
-                },
-                "セブンイレブン(Seven-Eleven)": {
-                    "count": 65
-                },
-                "Jednota": {
-                    "count": 58
-                },
-                "Магазин": {
-                    "count": 915
-                },
-                "Гастроном": {
-                    "count": 152
-                },
-                "Sklep spożywczy": {
-                    "count": 318
-                },
-                "Centra": {
-                    "count": 111
-                },
-                "Магнит": {
-                    "count": 701
-                },
-                "サークルK": {
-                    "count": 538,
-                    "tags": {
-                        "name:en": "Circle K"
-                    }
-                },
-                "Wawa": {
-                    "count": 135
-                },
-                "Proxi": {
-                    "count": 123
-                },
-                "Универсам": {
-                    "count": 78
-                },
-                "Перекресток": {
-                    "count": 51
-                },
-                "Groszek": {
-                    "count": 65
-                },
-                "Select": {
-                    "count": 62
-                },
-                "Večerka": {
-                    "count": 51
-                },
-                "Potraviny": {
-                    "count": 249
-                },
-                "Смак": {
-                    "count": 78
-                },
-                "Эконом": {
-                    "count": 55
-                },
-                "Березка": {
-                    "count": 77
-                },
-                "Społem": {
-                    "count": 93
-                },
-                "Carrefour Express": {
-                    "count": 84
-                },
-                "Cumberland Farms": {
-                    "count": 63
-                },
-                "Chevron": {
-                    "count": 59
-                },
-                "Coop Jednota": {
-                    "count": 66
-                },
-                "Tesco Lotus Express": {
-                    "count": 67
-                },
-                "Kiosk": {
-                    "count": 55
-                },
-                "24 часа": {
-                    "count": 58
-                },
-                "Минимаркет": {
-                    "count": 102
-                },
-                "Oxxo": {
-                    "count": 669
-                },
-                "Пятёрочка": {
-                    "count": 398
-                },
-                "abc": {
-                    "count": 74
-                },
-                "7/11": {
-                    "count": 51
-                },
-                "Stewart's": {
-                    "count": 255
-                },
-                "Продукти": {
-                    "count": 171
-                },
-                "ローソンストア100 (LAWSON STORE 100)": {
-                    "count": 85
-                },
-                "Дикси": {
-                    "count": 119
-                },
-                "Радуга": {
-                    "count": 86
-                },
-                "ローソンストア100": {
-                    "count": 76
-                },
-                "เซเว่นอีเลฟเว่น": {
-                    "count": 185
-                },
-                "Spożywczy": {
-                    "count": 78
-                },
-                "Delikatesy Centrum": {
-                    "count": 53
-                },
-                "Citgo": {
-                    "count": 62
-                },
-                "Фортуна": {
-                    "count": 51
-                },
-                "Kum & Go": {
-                    "count": 59
-                },
-                "Мария-Ра": {
-                    "count": 76
-                },
-                "Picard": {
-                    "count": 57
-                },
-                "Four Square": {
-                    "count": 52
-                },
-                "Визит": {
-                    "count": 57
-                },
-                "Авоська": {
-                    "count": 55
-                },
-                "Dollar General": {
-                    "count": 127
-                },
-                "Studenac": {
-                    "count": 76
-                },
-                "Central Convenience Store": {
-                    "count": 55
-                },
-                "Монетка": {
-                    "count": 62
-                },
-                "продукты": {
-                    "count": 114
-                },
-                "Теремок": {
-                    "count": 56
-                },
-                "Kwik Trip": {
-                    "count": 69
-                },
-                "Кулинария": {
-                    "count": 55
-                },
-                "全家": {
-                    "count": 90
-                },
-                "Мечта": {
-                    "count": 54
-                },
-                "Epicerie": {
-                    "count": 102
-                },
-                "Кировский": {
-                    "count": 67
-                },
-                "Food Mart": {
-                    "count": 117
-                },
-                "Delikatesy": {
-                    "count": 81
-                },
-                "ポプラ": {
-                    "count": 54
-                },
-                "Lewiatan": {
-                    "count": 135
-                },
-                "Продуктовый магазин": {
-                    "count": 149
-                },
-                "Продуктовый": {
-                    "count": 84
-                },
-                "セイコーマート (Seicomart)": {
-                    "count": 72
-                },
-                "Виктория": {
-                    "count": 70
-                },
-                "Весна": {
-                    "count": 57
-                },
-                "Mini Market Non-Stop": {
-                    "count": 60
-                },
-                "QuikTrip": {
-                    "count": 75
-                },
-                "Копеечка": {
-                    "count": 51
-                },
-                "Royal Farms": {
-                    "count": 51
-                },
-                "Alfamart": {
-                    "count": 103
-                },
-                "Indomaret": {
-                    "count": 141
-                },
-                "магазин": {
-                    "count": 171
-                },
-                "全家便利商店": {
-                    "count": 156
-                },
-                "Boutique": {
-                    "count": 59
-                },
-                "მარკეტი (Market)": {
-                    "count": 144
-                },
-                "Stores": {
-                    "count": 61
-                }
-            },
-            "chemist": {
-                "dm": {
-                    "count": 939
-                },
-                "Müller": {
-                    "count": 212
-                },
-                "Schlecker": {
-                    "count": 187
-                },
-                "Etos": {
-                    "count": 467
-                },
-                "Bipa": {
-                    "count": 289
-                },
-                "Rossmann": {
-                    "count": 1669
-                },
-                "DM Drogeriemarkt": {
-                    "count": 55
-                },
-                "Ihr Platz": {
-                    "count": 73
-                },
-                "Douglas": {
-                    "count": 62
-                },
-                "Kruidvat": {
-                    "count": 123
-                }
-            },
-            "car_repair": {
-                "Peugeot": {
-                    "count": 83
-                },
-                "Kwik Fit": {
-                    "count": 75
-                },
-                "ATU": {
-                    "count": 261
-                },
-                "Kwik-Fit": {
-                    "count": 53
-                },
-                "Midas": {
-                    "count": 202
-                },
-                "Feu Vert": {
-                    "count": 113
-                },
-                "Norauto": {
-                    "count": 152
-                },
-                "Speedy": {
-                    "count": 115
-                },
-                "Автозапчасти": {
-                    "count": 212
-                },
-                "Renault": {
-                    "count": 171
-                },
-                "Pit Stop": {
-                    "count": 58
-                },
-                "Jiffy Lube": {
-                    "count": 198
-                },
-                "Шиномонтаж": {
-                    "count": 1157
-                },
-                "СТО": {
-                    "count": 395
-                },
-                "O'Reilly Auto Parts": {
-                    "count": 81
-                },
-                "Carglass": {
-                    "count": 112
-                },
-                "шиномонтаж": {
-                    "count": 62
-                },
-                "Citroen": {
-                    "count": 51
-                },
-                "Euromaster": {
-                    "count": 87
-                },
-                "Firestone": {
-                    "count": 88
-                },
-                "AutoZone": {
-                    "count": 82
-                },
-                "Автосервис": {
-                    "count": 361
-                },
-                "Advance Auto Parts": {
-                    "count": 52
-                },
-                "Roady": {
-                    "count": 56
-                }
-            },
-            "furniture": {
-                "IKEA": {
-                    "count": 169
-                },
-                "Jysk": {
-                    "count": 109
-                },
-                "Roller": {
-                    "count": 78
-                },
-                "Dänisches Bettenlager": {
-                    "count": 309
-                },
-                "Conforama": {
-                    "count": 99
-                },
-                "Matratzen Concord": {
-                    "count": 52
-                },
-                "Мебель": {
-                    "count": 210
-                },
-                "But": {
-                    "count": 63
-                }
-            },
-            "doityourself": {
-                "Hornbach": {
-                    "count": 123
-                },
-                "B&Q": {
-                    "count": 225
-                },
-                "Hubo": {
-                    "count": 77
-                },
-                "Mr Bricolage": {
-                    "count": 88
-                },
-                "Gamma": {
-                    "count": 111
-                },
-                "OBI": {
-                    "count": 422
-                },
-                "Lowes": {
-                    "count": 1152
-                },
-                "Wickes": {
-                    "count": 123
-                },
-                "Hagebau": {
-                    "count": 59
-                },
-                "Max Bahr": {
-                    "count": 79
-                },
-                "Castorama": {
-                    "count": 153
-                },
-                "Rona": {
-                    "count": 61
-                },
-                "Home Depot": {
-                    "count": 865
-                },
-                "Toom Baumarkt": {
-                    "count": 71
-                },
-                "Homebase": {
-                    "count": 225
-                },
-                "Baumax": {
-                    "count": 95
-                },
-                "Lagerhaus": {
-                    "count": 79
-                },
-                "Bauhaus": {
-                    "count": 186
-                },
-                "Canadian Tire": {
-                    "count": 97
-                },
-                "Leroy Merlin": {
-                    "count": 209
-                },
-                "Hellweg": {
-                    "count": 58
-                },
-                "Brico": {
-                    "count": 98
-                },
-                "Bricomarché": {
-                    "count": 235
-                },
-                "Toom": {
-                    "count": 67
-                },
-                "Hagebaumarkt": {
-                    "count": 107
-                },
-                "Praktiker": {
-                    "count": 122
-                },
-                "Menards": {
-                    "count": 70
-                },
-                "Weldom": {
-                    "count": 73
-                },
-                "Bunnings Warehouse": {
-                    "count": 91
-                },
-                "Ace Hardware": {
-                    "count": 147
-                },
-                "Home Hardware": {
-                    "count": 72
-                },
-                "Хозтовары": {
-                    "count": 86
-                },
-                "Стройматериалы": {
-                    "count": 197
-                },
-                "Bricorama": {
-                    "count": 60
-                },
-                "Point P": {
-                    "count": 59
-                }
-            },
-            "stationery": {
-                "Staples": {
-                    "count": 299
-                },
-                "McPaper": {
-                    "count": 83
-                },
-                "Office Depot": {
-                    "count": 98
-                },
-                "Канцтовары": {
-                    "count": 63
-                }
-            },
-            "car": {
-                "Skoda": {
-                    "count": 97
-                },
-                "BMW": {
-                    "count": 149
-                },
-                "Citroen": {
-                    "count": 277
-                },
-                "Renault": {
-                    "count": 382
-                },
-                "Mercedes-Benz": {
-                    "count": 235
-                },
-                "Volvo": {
-                    "count": 96
-                },
-                "Ford": {
-                    "count": 239
-                },
-                "Volkswagen": {
-                    "count": 217
-                },
-                "Mazda": {
-                    "count": 105
-                },
-                "Mitsubishi": {
-                    "count": 73
-                },
-                "Fiat": {
-                    "count": 93
-                },
-                "Автозапчасти": {
-                    "count": 277
-                },
-                "Opel": {
-                    "count": 165
-                },
-                "Audi": {
-                    "count": 121
-                },
-                "Toyota": {
-                    "count": 271
-                },
-                "Nissan": {
-                    "count": 189
-                },
-                "Suzuki": {
-                    "count": 75
-                },
-                "Honda": {
-                    "count": 157
-                },
-                "Peugeot": {
-                    "count": 308
-                },
-                "Шиномонтаж": {
-                    "count": 259
-                },
-                "Hyundai": {
-                    "count": 166
-                },
-                "Subaru": {
-                    "count": 58
-                },
-                "Chevrolet": {
-                    "count": 86
-                },
-                "Автомагазин": {
-                    "count": 72
-                }
-            },
-            "clothes": {
-                "Matalan": {
-                    "count": 90
-                },
-                "KiK": {
-                    "count": 1219
-                },
-                "H&M": {
-                    "count": 658
-                },
-                "Urban Outfitters": {
-                    "count": 63
-                },
-                "Vögele": {
-                    "count": 132
-                },
-                "Zeeman": {
-                    "count": 121
-                },
-                "Takko": {
-                    "count": 515
-                },
-                "Adler": {
-                    "count": 55
-                },
-                "C&A": {
-                    "count": 506
-                },
-                "Zara": {
-                    "count": 217
-                },
-                "Vero Moda": {
-                    "count": 95
-                },
-                "NKD": {
-                    "count": 486
-                },
-                "Ernsting's family": {
-                    "count": 312
-                },
-                "Winners": {
-                    "count": 65
-                },
-                "River Island": {
-                    "count": 59
-                },
-                "Next": {
-                    "count": 176
-                },
-                "Gap": {
-                    "count": 81
-                },
-                "Adidas": {
-                    "count": 92
-                },
-                "Woolworths": {
-                    "count": 117
-                },
-                "Mr Price": {
-                    "count": 88
-                },
-                "Jet": {
-                    "count": 61
-                },
-                "Pep": {
-                    "count": 134
-                },
-                "Edgars": {
-                    "count": 110
-                },
-                "Ackermans": {
-                    "count": 91
-                },
-                "Truworths": {
-                    "count": 65
-                },
-                "Ross": {
-                    "count": 93
-                },
-                "Burton": {
-                    "count": 51
-                },
-                "Dorothy Perkins": {
-                    "count": 53
-                },
-                "Deichmann": {
-                    "count": 61
-                },
-                "Lindex": {
-                    "count": 73
-                },
-                "s.Oliver": {
-                    "count": 56
-                },
-                "Cecil": {
-                    "count": 51
-                },
-                "Dress Barn": {
-                    "count": 52
-                },
-                "Old Navy": {
-                    "count": 174
-                },
-                "Jack & Jones": {
-                    "count": 52
-                },
-                "Pimkie": {
-                    "count": 73
-                },
-                "Esprit": {
-                    "count": 231
-                },
-                "Primark": {
-                    "count": 92
-                },
-                "Bonita": {
-                    "count": 155
-                },
-                "Mexx": {
-                    "count": 67
-                },
-                "Gerry Weber": {
-                    "count": 71
-                },
-                "Tally Weijl": {
-                    "count": 70
-                },
-                "Mango": {
-                    "count": 133
-                },
-                "TK Maxx": {
-                    "count": 84
-                },
-                "Benetton": {
-                    "count": 101
-                },
-                "Ulla Popken": {
-                    "count": 61
-                },
-                "AWG": {
-                    "count": 66
-                },
-                "Tommy Hilfiger": {
-                    "count": 75
-                },
-                "New Yorker": {
-                    "count": 180
-                },
-                "Orsay": {
-                    "count": 73
-                },
-                "Jeans Fritz": {
-                    "count": 51
-                },
-                "Charles Vögele": {
-                    "count": 69
-                },
-                "New Look": {
-                    "count": 126
-                },
-                "Lacoste": {
-                    "count": 78
-                },
-                "Etam": {
-                    "count": 53
-                },
-                "Kiabi": {
-                    "count": 148
-                },
-                "Jack Wolfskin": {
-                    "count": 60
-                },
-                "American Apparel": {
-                    "count": 57
-                },
-                "Men's Wearhouse": {
-                    "count": 54
-                },
-                "Intimissimi": {
-                    "count": 52
-                },
-                "United Colors of Benetton": {
-                    "count": 96
-                },
-                "Jules": {
-                    "count": 63
-                },
-                "Second Hand": {
-                    "count": 53
-                },
-                "AOKI": {
-                    "count": 57
-                },
-                "Calzedonia": {
-                    "count": 68
-                },
-                "洋服の青山": {
-                    "count": 100
-                },
-                "Levi's": {
-                    "count": 63
-                },
-                "Celio": {
-                    "count": 74
-                },
-                "TJ Maxx": {
-                    "count": 57
-                },
-                "Promod": {
-                    "count": 82
-                },
-                "Street One": {
-                    "count": 72
-                },
-                "ユニクロ": {
-                    "count": 59
-                },
-                "Banana Republic": {
-                    "count": 57
-                },
-                "Одежда": {
-                    "count": 75
-                },
-                "Marshalls": {
-                    "count": 56
-                },
-                "La Halle": {
-                    "count": 62
-                },
-                "Peacocks": {
-                    "count": 89
-                },
-                "しまむら": {
-                    "count": 60
-                }
-            },
-            "books": {
-                "Bruna": {
-                    "count": 58
-                },
-                "Waterstones": {
-                    "count": 90
-                },
-                "Libro": {
-                    "count": 57
-                },
-                "Barnes & Noble": {
-                    "count": 267
-                },
-                "Weltbild": {
-                    "count": 74
-                },
-                "Thalia": {
-                    "count": 121
-                },
-                "Книги": {
-                    "count": 112
-                }
-            },
-            "department_store": {
-                "Debenhams": {
-                    "count": 67
-                },
-                "Canadian Tire": {
-                    "count": 75
-                },
-                "Karstadt": {
-                    "count": 64
-                },
-                "Walmart": {
-                    "count": 517
-                },
-                "Kmart": {
-                    "count": 143
-                },
-                "Target": {
-                    "count": 574
-                },
-                "Galeria Kaufhof": {
-                    "count": 61
-                },
-                "Marks & Spencer": {
-                    "count": 66
-                },
-                "Big W": {
-                    "count": 57
-                },
-                "Woolworth": {
-                    "count": 78
-                },
-                "Универмаг": {
-                    "count": 72
-                },
-                "Sears": {
-                    "count": 235
-                },
-                "Walmart Supercenter": {
-                    "count": 101
-                },
-                "Kohl's": {
-                    "count": 153
-                },
-                "Macy's": {
-                    "count": 147
-                },
-                "Sam's Club": {
-                    "count": 54
-                },
-                "JCPenney": {
-                    "count": 66
-                }
-            },
-            "alcohol": {
-                "Alko": {
-                    "count": 145
-                },
-                "The Beer Store": {
-                    "count": 150
-                },
-                "Systembolaget": {
-                    "count": 210
-                },
-                "LCBO": {
-                    "count": 239
-                },
-                "Ароматный мир": {
-                    "count": 62
-                },
-                "Bargain Booze": {
-                    "count": 62
-                },
-                "Nicolas": {
-                    "count": 119
-                },
-                "BWS": {
-                    "count": 70
-                },
-                "Botilleria": {
-                    "count": 77
-                },
-                "SAQ": {
-                    "count": 72
-                },
-                "Gall & Gall": {
-                    "count": 512
-                },
-                "Живое пиво": {
-                    "count": 70
-                }
-            },
-            "bakery": {
-                "Kamps": {
-                    "count": 252
-                },
-                "Banette": {
-                    "count": 52
-                },
-                "Bäckerei Schmidt": {
-                    "count": 57
-                },
-                "Anker": {
-                    "count": 73
-                },
-                "Hofpfisterei": {
-                    "count": 111
-                },
-                "Greggs": {
-                    "count": 276
-                },
-                "Oebel": {
-                    "count": 57
-                },
-                "Boulangerie": {
-                    "count": 266
-                },
-                "Stadtbäckerei": {
-                    "count": 57
-                },
-                "Steinecke": {
-                    "count": 145
-                },
-                "Ihle": {
-                    "count": 76
-                },
-                "Goldilocks": {
-                    "count": 59
-                },
-                "Dat Backhus": {
-                    "count": 67
-                },
-                "K&U": {
-                    "count": 61
-                },
-                "Der Beck": {
-                    "count": 96
-                },
-                "Thürmann": {
-                    "count": 54
-                },
-                "Backwerk": {
-                    "count": 95
-                },
-                "Bäcker": {
-                    "count": 68
-                },
-                "Schäfer's": {
-                    "count": 51
-                },
-                "Panaderia": {
-                    "count": 168
-                },
-                "Goeken backen": {
-                    "count": 51
-                },
-                "Stadtbäckerei Junge": {
-                    "count": 51
-                },
-                "Boulangerie Patisserie": {
-                    "count": 119
-                },
-                "Paul": {
-                    "count": 81
-                },
-                "Хлеб": {
-                    "count": 89
-                },
-                "Piekarnia": {
-                    "count": 62
-                },
-                "Пекарня": {
-                    "count": 52
-                },
-                "Кулиничи": {
-                    "count": 51
-                }
-            },
-            "sports": {
-                "Sports Direct": {
-                    "count": 57
-                },
-                "Decathlon": {
-                    "count": 309
-                },
-                "Intersport": {
-                    "count": 283
-                },
-                "Sports Authority": {
-                    "count": 75
-                },
-                "Спортмастер": {
-                    "count": 87
-                },
-                "Sport 2000": {
-                    "count": 90
-                },
-                "Dick's Sporting Goods": {
-                    "count": 77
-                }
-            },
-            "variety_store": {
-                "Tedi": {
-                    "count": 157
-                },
-                "Dollarama": {
-                    "count": 103
-                },
-                "Family Dollar": {
-                    "count": 61
-                },
-                "Dollar Tree": {
-                    "count": 110
-                },
-                "Dollar General": {
-                    "count": 80
-                }
-            },
-            "pet": {
-                "Fressnapf": {
-                    "count": 318
-                },
-                "PetSmart": {
-                    "count": 177
-                },
-                "Das Futterhaus": {
-                    "count": 69
-                },
-                "Pets at Home": {
-                    "count": 62
-                },
-                "Petco": {
-                    "count": 101
-                },
-                "Зоомагазин": {
-                    "count": 100
-                }
-            },
-            "shoes": {
-                "Deichmann": {
-                    "count": 622
-                },
-                "Reno": {
-                    "count": 183
-                },
-                "Ecco": {
-                    "count": 55
-                },
-                "Clarks": {
-                    "count": 109
-                },
-                "La Halle aux Chaussures": {
-                    "count": 69
-                },
-                "Brantano": {
-                    "count": 71
-                },
-                "Geox": {
-                    "count": 51
-                },
-                "Salamander": {
-                    "count": 51
-                },
-                "Обувь": {
-                    "count": 100
-                },
-                "Payless Shoe Source": {
-                    "count": 67
-                },
-                "Famous Footwear": {
-                    "count": 59
-                },
-                "Quick Schuh": {
-                    "count": 72
-                },
-                "Shoe Zone": {
-                    "count": 55
-                },
-                "Foot Locker": {
-                    "count": 82
-                },
-                "Bata": {
-                    "count": 101
-                },
-                "ЦентрОбувь": {
-                    "count": 51
-                }
-            },
-            "toys": {
-                "La Grande Récré": {
-                    "count": 56
-                },
-                "Toys R Us": {
-                    "count": 151,
-                    "tags": {
-                        "shop": "toys"
-                    }
-                },
-                "Intertoys": {
-                    "count": 57
-                },
-                "Детский мир": {
-                    "count": 86
-                },
-                "Игрушки": {
-                    "count": 58
-                }
-            },
-            "travel_agency": {
-                "Flight Centre": {
-                    "count": 92
-                },
-                "Thomas Cook": {
-                    "count": 119
-                }
-            },
-            "jewelry": {
-                "Bijou Brigitte": {
-                    "count": 57
-                },
-                "Christ": {
-                    "count": 57
-                },
-                "Swarovski": {
-                    "count": 74
-                }
-            },
-            "optician": {
-                "Fielmann": {
-                    "count": 232
-                },
-                "Apollo Optik": {
-                    "count": 150
-                },
-                "Vision Express": {
-                    "count": 58
-                },
-                "Оптика": {
-                    "count": 182
-                },
-                "Optic 2000": {
-                    "count": 98
-                },
-                "Alain Afflelou": {
-                    "count": 73
-                },
-                "Specsavers": {
-                    "count": 124
-                },
-                "Krys": {
-                    "count": 77
-                },
-                "Atol": {
-                    "count": 55
-                }
-            },
-            "video": {
-                "Blockbuster": {
-                    "count": 184
-                },
-                "World of Video": {
-                    "count": 64
-                }
-            },
-            "mobile_phone": {
-                "Билайн": {
-                    "count": 128
-                },
-                "ソフトバンクショップ (SoftBank shop)": {
-                    "count": 255
-                },
-                "Vodafone": {
-                    "count": 355
-                },
-                "O2": {
-                    "count": 208
-                },
-                "Carphone Warehouse": {
-                    "count": 127
-                },
-                "Orange": {
-                    "count": 246
-                },
-                "Verizon Wireless": {
-                    "count": 125
-                },
-                "Sprint": {
-                    "count": 109
-                },
-                "T-Mobile": {
-                    "count": 175
-                },
-                "МТС": {
-                    "count": 352
-                },
-                "Евросеть": {
-                    "count": 506
-                },
-                "Bell": {
-                    "count": 190
-                },
-                "The Phone House": {
-                    "count": 83
-                },
-                "SFR": {
-                    "count": 71
-                },
-                "Связной": {
-                    "count": 439
-                },
-                "Мегафон": {
-                    "count": 251
-                },
-                "AT&T": {
-                    "count": 124
-                },
-                "ドコモショップ (docomo shop)": {
-                    "count": 114
-                },
-                "au": {
-                    "count": 65
-                },
-                "Movistar": {
-                    "count": 77
-                },
-                "Bitė": {
-                    "count": 72
-                }
-            },
-            "hifi": {},
-            "computer": {
-                "PC World": {
-                    "count": 55
-                },
-                "DNS": {
-                    "count": 128
-                }
-            },
-            "hairdresser": {
-                "Klier": {
-                    "count": 119
-                },
-                "Supercuts": {
-                    "count": 106
-                },
-                "Hairkiller": {
-                    "count": 51
-                },
-                "Great Clips": {
-                    "count": 182
-                },
-                "Парикмахерская": {
-                    "count": 510
-                },
-                "Стиль": {
-                    "count": 51
-                },
-                "Fryzjer": {
-                    "count": 56
-                },
-                "Franck Provost": {
-                    "count": 70
-                },
-                "Салон красоты": {
-                    "count": 70
-                }
-            },
-            "hardware": {
-                "1000 мелочей": {
-                    "count": 61
-                },
-                "Хозтовары": {
-                    "count": 151
-                },
-                "Стройматериалы": {
-                    "count": 54
-                }
-            },
-            "motorcycle": {
-                "Yamaha": {
-                    "count": 67
-                },
-                "Honda": {
-                    "count": 69
-                }
-            }
-        }
-    },
-    "addressFormats": [
-        {
-            "format": [
-                [
-                    "housenumber",
-                    "street"
-                ],
-                [
-                    "city",
-                    "postcode"
-                ]
-            ]
-        },
-        {
-            "countryCodes": [
-                "gb"
-            ],
-            "format": [
-                [
-                    "housename"
-                ],
-                [
-                    "housenumber",
-                    "street"
-                ],
-                [
-                    "city",
-                    "postcode"
-                ]
-            ]
-        },
-        {
-            "countryCodes": [
-                "ie"
-            ],
-            "format": [
-                [
-                    "housename"
-                ],
-                [
-                    "housenumber",
-                    "street"
-                ],
-                [
-                    "city"
-                ]
-            ]
-        },
-        {
-            "countryCodes": [
-                "ad",
-                "at",
-                "ba",
-                "be",
-                "ch",
-                "cz",
-                "de",
-                "dk",
-                "es",
-                "fi",
-                "gr",
-                "hr",
-                "is",
-                "it",
-                "li",
-                "nl",
-                "no",
-                "pl",
-                "pt",
-                "se",
-                "si",
-                "sk",
-                "sm",
-                "va"
-            ],
-            "format": [
-                [
-                    "street",
-                    "housenumber"
-                ],
-                [
-                    "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": [
-                "us"
-            ],
-            "format": [
-                [
-                    "housenumber",
-                    "street"
-                ],
-                [
-                    "city",
-                    "state",
-                    "postcode"
-                ]
-            ]
-        },
-        {
-            "countryCodes": [
-                "ca"
-            ],
-            "format": [
-                [
-                    "housenumber",
-                    "street"
-                ],
-                [
-                    "city",
-                    "province",
-                    "postcode"
-                ]
-            ]
-        }
-    ]
-};
\ No newline at end of file
+         var _geometryID = _geometries.length === 1 ? _geometries[0] : 'feature';
+
+         var _extent;
+
+         var _actions = selectedIDs.map(function (entityID) {
+           var graph = context.graph();
+           var entity = graph.hasEntity(entityID);
+           if (!entity || !entity.hasInterestingTags()) return null;
+           if (entity.type === 'node' && graph.parentWays(entity).length === 0) return null;
+
+           if (entity.type !== 'node') {
+             var preset = _mainPresetIndex.match(entity, graph); // only allow extraction from ways/relations if the preset supports points
+
+             if (preset.geometry.indexOf('point') === -1) return null;
+           }
+
+           _extent = _extent ? _extent.extend(entity.extent(graph)) : entity.extent(graph);
+           return actionExtract(entityID, context.projection);
+         }).filter(Boolean);
+
+         var operation = function operation() {
+           var combinedAction = function combinedAction(graph) {
+             _actions.forEach(function (action) {
+               graph = action(graph);
+             });
+
+             return graph;
+           };
+
+           context.perform(combinedAction, operation.annotation()); // do the extract
+
+           var extractedNodeIDs = _actions.map(function (action) {
+             return action.getExtractedNodeID();
+           });
+
+           context.enter(modeSelect(context, extractedNodeIDs));
+         };
+
+         operation.available = function () {
+           return _actions.length && selectedIDs.length === _actions.length;
+         };
+
+         operation.disabled = function () {
+           if (_extent && _extent.percentContainedIn(context.map().extent()) < 0.8) {
+             return 'too_large';
+           } else if (selectedIDs.some(function (entityID) {
+             return context.graph().geometry(entityID) === 'vertex' && context.hasHiddenConnections(entityID);
+           })) {
+             return 'connected_to_hidden';
+           }
+
+           return false;
+         };
+
+         operation.tooltip = function () {
+           var disableReason = operation.disabled();
+
+           if (disableReason) {
+             return _t('operations.extract.' + disableReason + '.' + _amount);
+           } else {
+             return _t('operations.extract.description.' + _geometryID + '.' + _amount);
+           }
+         };
+
+         operation.annotation = function () {
+           return _t('operations.extract.annotation', {
+             n: selectedIDs.length
+           });
+         };
+
+         operation.id = 'extract';
+         operation.keys = [_t('operations.extract.key')];
+         operation.title = _t('operations.extract.title');
+         operation.behavior = behaviorOperation(context).which(operation);
+         return operation;
+       }
+
+       function operationMerge(context, selectedIDs) {
+         var _action = getAction();
+
+         function getAction() {
+           // prefer a non-disabled action first
+           var join = actionJoin(selectedIDs);
+           if (!join.disabled(context.graph())) return join;
+           var merge = actionMerge(selectedIDs);
+           if (!merge.disabled(context.graph())) return merge;
+           var mergePolygon = actionMergePolygon(selectedIDs);
+           if (!mergePolygon.disabled(context.graph())) return mergePolygon;
+           var mergeNodes = actionMergeNodes(selectedIDs);
+           if (!mergeNodes.disabled(context.graph())) return mergeNodes; // otherwise prefer an action with an interesting disabled reason
+
+           if (join.disabled(context.graph()) !== 'not_eligible') return join;
+           if (merge.disabled(context.graph()) !== 'not_eligible') return merge;
+           if (mergePolygon.disabled(context.graph()) !== 'not_eligible') return mergePolygon;
+           return mergeNodes;
+         }
+
+         var operation = function operation() {
+           if (operation.disabled()) return;
+           context.perform(_action, operation.annotation());
+           context.validator().validate();
+           var resultIDs = selectedIDs.filter(context.hasEntity);
+
+           if (resultIDs.length > 1) {
+             var interestingIDs = resultIDs.filter(function (id) {
+               return context.entity(id).hasInterestingTags();
+             });
+             if (interestingIDs.length) resultIDs = interestingIDs;
+           }
+
+           context.enter(modeSelect(context, resultIDs));
+         };
+
+         operation.available = function () {
+           return selectedIDs.length >= 2;
+         };
+
+         operation.disabled = function () {
+           var actionDisabled = _action.disabled(context.graph());
+
+           if (actionDisabled) return actionDisabled;
+           var osm = context.connection();
+
+           if (osm && _action.resultingWayNodesLength && _action.resultingWayNodesLength(context.graph()) > osm.maxWayNodes()) {
+             return 'too_many_vertices';
+           }
+
+           return false;
+         };
+
+         operation.tooltip = function () {
+           var disabled = operation.disabled();
+
+           if (disabled) {
+             if (disabled === 'conflicting_relations') {
+               return _t('operations.merge.conflicting_relations');
+             }
+
+             if (disabled === 'restriction' || disabled === 'connectivity') {
+               return _t('operations.merge.damage_relation', {
+                 relation: _mainPresetIndex.item('type/' + disabled).name()
+               });
+             }
+
+             return _t('operations.merge.' + disabled);
+           }
+
+           return _t('operations.merge.description');
+         };
+
+         operation.annotation = function () {
+           return _t('operations.merge.annotation', {
+             n: selectedIDs.length
+           });
+         };
+
+         operation.id = 'merge';
+         operation.keys = [_t('operations.merge.key')];
+         operation.title = _t('operations.merge.title');
+         operation.behavior = behaviorOperation(context).which(operation);
+         return operation;
+       }
+
+       function operationPaste(context) {
+         var _pastePoint;
+
+         var operation = function operation() {
+           if (!_pastePoint) return;
+           var oldIDs = context.copyIDs();
+           if (!oldIDs.length) return;
+           var projection = context.projection;
+           var extent = geoExtent();
+           var oldGraph = context.copyGraph();
+           var newIDs = [];
+           var action = actionCopyEntities(oldIDs, oldGraph);
+           context.perform(action);
+           var copies = action.copies();
+           var originals = new Set();
+           Object.values(copies).forEach(function (entity) {
+             originals.add(entity.id);
+           });
+
+           for (var id in copies) {
+             var oldEntity = oldGraph.entity(id);
+             var newEntity = copies[id];
+
+             extent._extend(oldEntity.extent(oldGraph)); // Exclude child nodes from newIDs if their parent way was also copied.
+
+
+             var parents = context.graph().parentWays(newEntity);
+             var parentCopied = parents.some(function (parent) {
+               return originals.has(parent.id);
+             });
+
+             if (!parentCopied) {
+               newIDs.push(newEntity.id);
+             }
+           } // Use the location of the copy operation to offset the paste location,
+           // or else use the center of the pasted extent
+
+
+           var copyPoint = context.copyLonLat() && projection(context.copyLonLat()) || projection(extent.center());
+           var delta = geoVecSubtract(_pastePoint, copyPoint); // Move the pasted objects to be anchored at the paste location
+
+           context.replace(actionMove(newIDs, delta, projection), operation.annotation());
+           context.enter(modeSelect(context, newIDs));
+         };
+
+         operation.point = function (val) {
+           _pastePoint = val;
+           return operation;
+         };
+
+         operation.available = function () {
+           return context.mode().id === 'browse';
+         };
+
+         operation.disabled = function () {
+           return !context.copyIDs().length;
+         };
+
+         operation.tooltip = function () {
+           var oldGraph = context.copyGraph();
+           var ids = context.copyIDs();
+
+           if (!ids.length) {
+             return _t('operations.paste.nothing_copied');
+           }
+
+           return _t('operations.paste.description', {
+             feature: utilDisplayLabel(oldGraph.entity(ids[0]), oldGraph),
+             n: ids.length
+           });
+         };
+
+         operation.annotation = function () {
+           var ids = context.copyIDs();
+           return _t('operations.paste.annotation', {
+             n: ids.length
+           });
+         };
+
+         operation.id = 'paste';
+         operation.keys = [uiCmd('⌘V')];
+         operation.title = _t('operations.paste.title');
+         return operation;
+       }
+
+       function operationReverse(context, selectedIDs) {
+         var operation = function operation() {
+           context.perform(function combinedReverseAction(graph) {
+             actions().forEach(function (action) {
+               graph = action(graph);
+             });
+             return graph;
+           }, operation.annotation());
+           context.validator().validate();
+         };
+
+         function actions(situation) {
+           return selectedIDs.map(function (entityID) {
+             var entity = context.hasEntity(entityID);
+             if (!entity) return null;
+
+             if (situation === 'toolbar') {
+               if (entity.type === 'way' && !entity.isOneWay() && !entity.isSided()) return null;
+             }
+
+             var geometry = entity.geometry(context.graph());
+             if (entity.type !== 'node' && geometry !== 'line') return null;
+             var action = actionReverse(entityID);
+             if (action.disabled(context.graph())) return null;
+             return action;
+           }).filter(Boolean);
+         }
+
+         function reverseTypeID() {
+           var acts = actions();
+           var nodeActionCount = acts.filter(function (act) {
+             var entity = context.hasEntity(act.entityID());
+             return entity && entity.type === 'node';
+           }).length;
+           if (nodeActionCount === 0) return 'line';
+           if (nodeActionCount === acts.length) return 'point';
+           return 'feature';
+         }
+
+         operation.available = function (situation) {
+           return actions(situation).length > 0;
+         };
+
+         operation.disabled = function () {
+           return false;
+         };
+
+         operation.tooltip = function () {
+           return _t('operations.reverse.description.' + reverseTypeID());
+         };
+
+         operation.annotation = function () {
+           var acts = actions();
+           return _t('operations.reverse.annotation.' + reverseTypeID(), {
+             n: acts.length
+           });
+         };
+
+         operation.id = 'reverse';
+         operation.keys = [_t('operations.reverse.key')];
+         operation.title = _t('operations.reverse.title');
+         operation.behavior = behaviorOperation(context).which(operation);
+         return operation;
+       }
+
+       function operationSplit(context, selectedIDs) {
+         var _vertexIds = selectedIDs.filter(function (id) {
+           return context.graph().geometry(id) === 'vertex';
+         });
+
+         var _selectedWayIds = selectedIDs.filter(function (id) {
+           var entity = context.graph().hasEntity(id);
+           return entity && entity.type === 'way';
+         });
+
+         var _isAvailable = _vertexIds.length > 0 && _vertexIds.length + _selectedWayIds.length === selectedIDs.length;
+
+         var _action = actionSplit(_vertexIds);
+
+         var _ways = [];
+         var _geometry = 'feature';
+         var _waysAmount = 'single';
+
+         var _nodesAmount = _vertexIds.length === 1 ? 'single' : 'multiple';
+
+         if (_isAvailable) {
+           if (_selectedWayIds.length) _action.limitWays(_selectedWayIds);
+           _ways = _action.ways(context.graph());
+           var geometries = {};
+
+           _ways.forEach(function (way) {
+             geometries[way.geometry(context.graph())] = true;
+           });
+
+           if (Object.keys(geometries).length === 1) {
+             _geometry = Object.keys(geometries)[0];
+           }
+
+           _waysAmount = _ways.length === 1 ? 'single' : 'multiple';
+         }
+
+         var operation = function operation() {
+           var difference = context.perform(_action, operation.annotation()); // select both the nodes and the ways so the mapper can immediately disconnect them if desired
+
+           var idsToSelect = _vertexIds.concat(difference.extantIDs().filter(function (id) {
+             // filter out relations that may have had member additions
+             return context.entity(id).type === 'way';
+           }));
+
+           context.enter(modeSelect(context, idsToSelect));
+         };
+
+         operation.relatedEntityIds = function () {
+           return _selectedWayIds.length ? [] : _ways.map(function (way) {
+             return way.id;
+           });
+         };
+
+         operation.available = function () {
+           return _isAvailable;
+         };
+
+         operation.disabled = function () {
+           var reason = _action.disabled(context.graph());
+
+           if (reason) {
+             return reason;
+           } else if (selectedIDs.some(context.hasHiddenConnections)) {
+             return 'connected_to_hidden';
+           }
+
+           return false;
+         };
+
+         operation.tooltip = function () {
+           var disable = operation.disabled();
+           if (disable) return _t('operations.split.' + disable);
+           return _t('operations.split.description.' + _geometry + '.' + _waysAmount + '.' + _nodesAmount + '_node');
+         };
+
+         operation.annotation = function () {
+           return _t('operations.split.annotation.' + _geometry, {
+             n: _ways.length
+           });
+         };
+
+         operation.icon = function () {
+           if (_waysAmount === 'multiple') {
+             return '#iD-operation-split-multiple';
+           } else {
+             return '#iD-operation-split';
+           }
+         };
+
+         operation.id = 'split';
+         operation.keys = [_t('operations.split.key')];
+         operation.title = _t('operations.split.title');
+         operation.behavior = behaviorOperation(context).which(operation);
+         return operation;
+       }
+
+       function operationStraighten(context, selectedIDs) {
+         var _wayIDs = selectedIDs.filter(function (id) {
+           return id.charAt(0) === 'w';
+         });
+
+         var _nodeIDs = selectedIDs.filter(function (id) {
+           return id.charAt(0) === 'n';
+         });
+
+         var _amount = (_wayIDs.length ? _wayIDs : _nodeIDs).length === 1 ? 'single' : 'multiple';
+
+         var _nodes = utilGetAllNodes(selectedIDs, context.graph());
+
+         var _coords = _nodes.map(function (n) {
+           return n.loc;
+         });
+
+         var _extent = utilTotalExtent(selectedIDs, context.graph());
+
+         var _action = chooseAction();
+
+         var _geometry;
+
+         function chooseAction() {
+           // straighten selected nodes
+           if (_wayIDs.length === 0 && _nodeIDs.length > 2) {
+             _geometry = 'point';
+             return actionStraightenNodes(_nodeIDs, context.projection); // straighten selected ways (possibly between range of 2 selected nodes)
+           } else if (_wayIDs.length > 0 && (_nodeIDs.length === 0 || _nodeIDs.length === 2)) {
+             var startNodeIDs = [];
+             var endNodeIDs = [];
+
+             for (var i = 0; i < selectedIDs.length; i++) {
+               var entity = context.entity(selectedIDs[i]);
+
+               if (entity.type === 'node') {
+                 continue;
+               } else if (entity.type !== 'way' || entity.isClosed()) {
+                 return null; // exit early, can't straighten these
+               }
+
+               startNodeIDs.push(entity.first());
+               endNodeIDs.push(entity.last());
+             } // Remove duplicate end/startNodeIDs (duplicate nodes cannot be at the line end)
+
+
+             startNodeIDs = startNodeIDs.filter(function (n) {
+               return startNodeIDs.indexOf(n) === startNodeIDs.lastIndexOf(n);
+             });
+             endNodeIDs = endNodeIDs.filter(function (n) {
+               return endNodeIDs.indexOf(n) === endNodeIDs.lastIndexOf(n);
+             }); // Ensure all ways are connected (i.e. only 2 unique endpoints/startpoints)
+
+             if (utilArrayDifference(startNodeIDs, endNodeIDs).length + utilArrayDifference(endNodeIDs, startNodeIDs).length !== 2) return null; // Ensure path contains at least 3 unique nodes
+
+             var wayNodeIDs = utilGetAllNodes(_wayIDs, context.graph()).map(function (node) {
+               return node.id;
+             });
+             if (wayNodeIDs.length <= 2) return null; // If range of 2 selected nodes is supplied, ensure nodes lie on the selected path
+
+             if (_nodeIDs.length === 2 && (wayNodeIDs.indexOf(_nodeIDs[0]) === -1 || wayNodeIDs.indexOf(_nodeIDs[1]) === -1)) return null;
+
+             if (_nodeIDs.length) {
+               // If we're only straightenting between two points, we only need that extent visible
+               _extent = utilTotalExtent(_nodeIDs, context.graph());
+             }
+
+             _geometry = 'line';
+             return actionStraightenWay(selectedIDs, context.projection);
+           }
+
+           return null;
+         }
+
+         function operation() {
+           if (!_action) return;
+           context.perform(_action, operation.annotation());
+           window.setTimeout(function () {
+             context.validator().validate();
+           }, 300); // after any transition
+         }
+
+         operation.available = function () {
+           return Boolean(_action);
+         };
+
+         operation.disabled = function () {
+           var reason = _action.disabled(context.graph());
+
+           if (reason) {
+             return reason;
+           } else if (_extent.percentContainedIn(context.map().extent()) < 0.8) {
+             return 'too_large';
+           } else if (someMissing()) {
+             return 'not_downloaded';
+           } else if (selectedIDs.some(context.hasHiddenConnections)) {
+             return 'connected_to_hidden';
+           }
+
+           return false;
+
+           function someMissing() {
+             if (context.inIntro()) return false;
+             var osm = context.connection();
+
+             if (osm) {
+               var missing = _coords.filter(function (loc) {
+                 return !osm.isDataLoaded(loc);
+               });
+
+               if (missing.length) {
+                 missing.forEach(function (loc) {
+                   context.loadTileAtLoc(loc);
+                 });
+                 return true;
+               }
+             }
+
+             return false;
+           }
+         };
+
+         operation.tooltip = function () {
+           var disable = operation.disabled();
+           return disable ? _t('operations.straighten.' + disable + '.' + _amount) : _t('operations.straighten.description.' + _geometry + (_wayIDs.length === 1 ? '' : 's'));
+         };
+
+         operation.annotation = function () {
+           return _t('operations.straighten.annotation.' + _geometry, {
+             n: _wayIDs.length ? _wayIDs.length : _nodeIDs.length
+           });
+         };
+
+         operation.id = 'straighten';
+         operation.keys = [_t('operations.straighten.key')];
+         operation.title = _t('operations.straighten.title');
+         operation.behavior = behaviorOperation(context).which(operation);
+         return operation;
+       }
+
+       var Operations = /*#__PURE__*/Object.freeze({
+               __proto__: null,
+               operationCircularize: operationCircularize,
+               operationContinue: operationContinue,
+               operationCopy: operationCopy,
+               operationDelete: operationDelete,
+               operationDisconnect: operationDisconnect,
+               operationDowngrade: operationDowngrade,
+               operationExtract: operationExtract,
+               operationMerge: operationMerge,
+               operationMove: operationMove,
+               operationOrthogonalize: operationOrthogonalize,
+               operationPaste: operationPaste,
+               operationReflectShort: operationReflectShort,
+               operationReflectLong: operationReflectLong,
+               operationReverse: operationReverse,
+               operationRotate: operationRotate,
+               operationSplit: operationSplit,
+               operationStraighten: operationStraighten
+       });
+
+       function modeSelect(context, selectedIDs) {
+         var mode = {
+           id: 'select',
+           button: 'browse'
+         };
+         var keybinding = utilKeybinding('select');
+
+         var _breatheBehavior = behaviorBreathe();
+
+         var _modeDragNode = modeDragNode(context);
+
+         var _selectBehavior;
+
+         var _behaviors = [];
+         var _operations = [];
+         var _newFeature = false;
+         var _follow = false; // `_focusedParentWayId` is used when we visit a vertex with multiple
+         // parents, and we want to remember which parent line we started on.
+
+         var _focusedParentWayId;
+
+         var _focusedVertexIds;
+
+         function singular() {
+           if (selectedIDs && selectedIDs.length === 1) {
+             return context.hasEntity(selectedIDs[0]);
+           }
+         }
+
+         function selectedEntities() {
+           return selectedIDs.map(function (id) {
+             return context.hasEntity(id);
+           }).filter(Boolean);
+         }
+
+         function checkSelectedIDs() {
+           var ids = [];
+
+           if (Array.isArray(selectedIDs)) {
+             ids = selectedIDs.filter(function (id) {
+               return context.hasEntity(id);
+             });
+           }
+
+           if (!ids.length) {
+             context.enter(modeBrowse(context));
+             return false;
+           } else if (selectedIDs.length > 1 && ids.length === 1 || selectedIDs.length === 1 && ids.length > 1) {
+             // switch between single- and multi-select UI
+             context.enter(modeSelect(context, ids));
+             return false;
+           }
+
+           selectedIDs = ids;
+           return true;
+         } // find the parent ways for nextVertex, previousVertex, and selectParent
+
+
+         function parentWaysIdsOfSelection(onlyCommonParents) {
+           var graph = context.graph();
+           var parents = [];
+
+           for (var i = 0; i < selectedIDs.length; i++) {
+             var entity = context.hasEntity(selectedIDs[i]);
+
+             if (!entity || entity.geometry(graph) !== 'vertex') {
+               return []; // selection includes some non-vertices
+             }
+
+             var currParents = graph.parentWays(entity).map(function (w) {
+               return w.id;
+             });
+
+             if (!parents.length) {
+               parents = currParents;
+               continue;
+             }
+
+             parents = (onlyCommonParents ? utilArrayIntersection : utilArrayUnion)(parents, currParents);
+
+             if (!parents.length) {
+               return [];
+             }
+           }
+
+           return parents;
+         } // find the child nodes for selected ways
+
+
+         function childNodeIdsOfSelection(onlyCommon) {
+           var graph = context.graph();
+           var childs = [];
+
+           for (var i = 0; i < selectedIDs.length; i++) {
+             var entity = context.hasEntity(selectedIDs[i]);
+
+             if (!entity || !['area', 'line'].includes(entity.geometry(graph))) {
+               return []; // selection includes non-area/non-line
+             }
+
+             var currChilds = graph.childNodes(entity).map(function (node) {
+               return node.id;
+             });
+
+             if (!childs.length) {
+               childs = currChilds;
+               continue;
+             }
+
+             childs = (onlyCommon ? utilArrayIntersection : utilArrayUnion)(childs, currChilds);
+
+             if (!childs.length) {
+               return [];
+             }
+           }
+
+           return childs;
+         }
+
+         function checkFocusedParent() {
+           if (_focusedParentWayId) {
+             var parents = parentWaysIdsOfSelection(true);
+             if (parents.indexOf(_focusedParentWayId) === -1) _focusedParentWayId = null;
+           }
+         }
+
+         function parentWayIdForVertexNavigation() {
+           var parentIds = parentWaysIdsOfSelection(true);
+
+           if (_focusedParentWayId && parentIds.indexOf(_focusedParentWayId) !== -1) {
+             // prefer the previously seen parent
+             return _focusedParentWayId;
+           }
+
+           return parentIds.length ? parentIds[0] : null;
+         }
+
+         mode.selectedIDs = function (val) {
+           if (!arguments.length) return selectedIDs;
+           selectedIDs = val;
+           return mode;
+         };
+
+         mode.zoomToSelected = function () {
+           context.map().zoomToEase(selectedEntities());
+         };
+
+         mode.newFeature = function (val) {
+           if (!arguments.length) return _newFeature;
+           _newFeature = val;
+           return mode;
+         };
+
+         mode.selectBehavior = function (val) {
+           if (!arguments.length) return _selectBehavior;
+           _selectBehavior = val;
+           return mode;
+         };
+
+         mode.follow = function (val) {
+           if (!arguments.length) return _follow;
+           _follow = val;
+           return mode;
+         };
+
+         function loadOperations() {
+           _operations.forEach(function (operation) {
+             if (operation.behavior) {
+               context.uninstall(operation.behavior);
+             }
+           });
+
+           _operations = Object.values(Operations).map(function (o) {
+             return o(context, selectedIDs);
+           }).filter(function (o) {
+             return o.id !== 'delete' && o.id !== 'downgrade' && o.id !== 'copy';
+           }).concat([// group copy/downgrade/delete operation together at the end of the list
+           operationCopy(context, selectedIDs), operationDowngrade(context, selectedIDs), operationDelete(context, selectedIDs)]).filter(function (operation) {
+             return operation.available();
+           });
+
+           _operations.forEach(function (operation) {
+             if (operation.behavior) {
+               context.install(operation.behavior);
+             }
+           }); // remove any displayed menu
+
+
+           context.ui().closeEditMenu();
+         }
+
+         mode.operations = function () {
+           return _operations;
+         };
+
+         mode.enter = function () {
+           if (!checkSelectedIDs()) return;
+           context.features().forceVisible(selectedIDs);
+
+           _modeDragNode.restoreSelectedIDs(selectedIDs);
+
+           loadOperations();
+
+           if (!_behaviors.length) {
+             if (!_selectBehavior) _selectBehavior = behaviorSelect(context);
+             _behaviors = [behaviorPaste(context), _breatheBehavior, behaviorHover(context).on('hover', context.ui().sidebar.hoverModeSelect), _selectBehavior, behaviorLasso(context), _modeDragNode.behavior, modeDragNote(context).behavior];
+           }
+
+           _behaviors.forEach(context.install);
+
+           keybinding.on(_t('inspector.zoom_to.key'), mode.zoomToSelected).on(['[', 'pgup'], previousVertex).on([']', 'pgdown'], nextVertex).on(['{', uiCmd('⌘['), 'home'], firstVertex).on(['}', uiCmd('⌘]'), 'end'], lastVertex).on(uiCmd('⇧←'), nudgeSelection([-10, 0])).on(uiCmd('⇧↑'), nudgeSelection([0, -10])).on(uiCmd('⇧→'), nudgeSelection([10, 0])).on(uiCmd('⇧↓'), nudgeSelection([0, 10])).on(uiCmd('⇧⌥←'), nudgeSelection([-100, 0])).on(uiCmd('⇧⌥↑'), nudgeSelection([0, -100])).on(uiCmd('⇧⌥→'), nudgeSelection([100, 0])).on(uiCmd('⇧⌥↓'), nudgeSelection([0, 100])).on(utilKeybinding.plusKeys.map(function (key) {
+             return uiCmd('⇧' + key);
+           }), scaleSelection(1.05)).on(utilKeybinding.plusKeys.map(function (key) {
+             return uiCmd('⇧⌥' + key);
+           }), scaleSelection(Math.pow(1.05, 5))).on(utilKeybinding.minusKeys.map(function (key) {
+             return uiCmd('⇧' + key);
+           }), scaleSelection(1 / 1.05)).on(utilKeybinding.minusKeys.map(function (key) {
+             return uiCmd('⇧⌥' + key);
+           }), scaleSelection(1 / Math.pow(1.05, 5))).on(['\\', 'pause'], focusNextParent).on(uiCmd('⌘↑'), selectParent).on(uiCmd('⌘↓'), selectChild).on('⎋', esc, true);
+           select(document).call(keybinding);
+           context.ui().sidebar.select(selectedIDs, _newFeature);
+           context.history().on('change.select', function () {
+             loadOperations(); // reselect after change in case relation members were removed or added
+
+             selectElements();
+           }).on('undone.select', checkSelectedIDs).on('redone.select', checkSelectedIDs);
+           context.map().on('drawn.select', selectElements).on('crossEditableZoom.select', function () {
+             selectElements();
+
+             _breatheBehavior.restartIfNeeded(context.surface());
+           });
+           context.map().doubleUpHandler().on('doubleUp.modeSelect', didDoubleUp);
+           selectElements();
+
+           if (_follow) {
+             var extent = geoExtent();
+             var graph = context.graph();
+             selectedIDs.forEach(function (id) {
+               var entity = context.entity(id);
+
+               extent._extend(entity.extent(graph));
+             });
+             var loc = extent.center();
+             context.map().centerEase(loc); // we could enter the mode multiple times, so reset follow for next time
+
+             _follow = false;
+           }
+
+           function nudgeSelection(delta) {
+             return function () {
+               // prevent nudging during low zoom selection
+               if (!context.map().withinEditableZoom()) return;
+               var moveOp = operationMove(context, selectedIDs);
+
+               if (moveOp.disabled()) {
+                 context.ui().flash.duration(4000).iconName('#iD-operation-' + moveOp.id).iconClass('operation disabled').label(moveOp.tooltip)();
+               } else {
+                 context.perform(actionMove(selectedIDs, delta, context.projection), moveOp.annotation());
+                 context.validator().validate();
+               }
+             };
+           }
+
+           function scaleSelection(factor) {
+             return function () {
+               // prevent scaling during low zoom selection
+               if (!context.map().withinEditableZoom()) return;
+               var nodes = utilGetAllNodes(selectedIDs, context.graph());
+               var isUp = factor > 1; // can only scale if multiple nodes are selected
+
+               if (nodes.length <= 1) return;
+               var extent = utilTotalExtent(selectedIDs, context.graph()); // These disabled checks would normally be handled by an operation
+               // object, but we don't want an actual scale operation at this point.
+
+               function scalingDisabled() {
+                 if (tooSmall()) {
+                   return 'too_small';
+                 } else if (extent.percentContainedIn(context.map().extent()) < 0.8) {
+                   return 'too_large';
+                 } else if (someMissing() || selectedIDs.some(incompleteRelation)) {
+                   return 'not_downloaded';
+                 } else if (selectedIDs.some(context.hasHiddenConnections)) {
+                   return 'connected_to_hidden';
+                 }
+
+                 return false;
+
+                 function tooSmall() {
+                   if (isUp) return false;
+                   var dLon = Math.abs(extent[1][0] - extent[0][0]);
+                   var dLat = Math.abs(extent[1][1] - extent[0][1]);
+                   return dLon < geoMetersToLon(1, extent[1][1]) && dLat < geoMetersToLat(1);
+                 }
+
+                 function someMissing() {
+                   if (context.inIntro()) return false;
+                   var osm = context.connection();
+
+                   if (osm) {
+                     var missing = nodes.filter(function (n) {
+                       return !osm.isDataLoaded(n.loc);
+                     });
+
+                     if (missing.length) {
+                       missing.forEach(function (loc) {
+                         context.loadTileAtLoc(loc);
+                       });
+                       return true;
+                     }
+                   }
+
+                   return false;
+                 }
+
+                 function incompleteRelation(id) {
+                   var entity = context.entity(id);
+                   return entity.type === 'relation' && !entity.isComplete(context.graph());
+                 }
+               }
+
+               var disabled = scalingDisabled();
+
+               if (disabled) {
+                 var multi = selectedIDs.length === 1 ? 'single' : 'multiple';
+                 context.ui().flash.duration(4000).iconName('#iD-icon-no').iconClass('operation disabled').label(_t.html('operations.scale.' + disabled + '.' + multi))();
+               } else {
+                 var pivot = context.projection(extent.center());
+                 var annotation = _t('operations.scale.annotation.' + (isUp ? 'up' : 'down') + '.feature', {
+                   n: selectedIDs.length
+                 });
+                 context.perform(actionScale(selectedIDs, pivot, factor, context.projection), annotation);
+                 context.validator().validate();
+               }
+             };
+           }
+
+           function didDoubleUp(d3_event, loc) {
+             if (!context.map().withinEditableZoom()) return;
+             var target = select(d3_event.target);
+             var datum = target.datum();
+             var entity = datum && datum.properties && datum.properties.entity;
+             if (!entity) return;
+
+             if (entity instanceof osmWay && target.classed('target')) {
+               var choice = geoChooseEdge(context.graph().childNodes(entity), loc, context.projection);
+               var prev = entity.nodes[choice.index - 1];
+               var next = entity.nodes[choice.index];
+               context.perform(actionAddMidpoint({
+                 loc: choice.loc,
+                 edge: [prev, next]
+               }, osmNode()), _t('operations.add.annotation.vertex'));
+               context.validator().validate();
+             } else if (entity.type === 'midpoint') {
+               context.perform(actionAddMidpoint({
+                 loc: entity.loc,
+                 edge: entity.edge
+               }, osmNode()), _t('operations.add.annotation.vertex'));
+               context.validator().validate();
+             }
+           }
+
+           function selectElements() {
+             if (!checkSelectedIDs()) return;
+             var surface = context.surface();
+             surface.selectAll('.selected-member').classed('selected-member', false);
+             surface.selectAll('.selected').classed('selected', false);
+             surface.selectAll('.related').classed('related', false); // reload `_focusedParentWayId` based on the current selection
+
+             checkFocusedParent();
+
+             if (_focusedParentWayId) {
+               surface.selectAll(utilEntitySelector([_focusedParentWayId])).classed('related', true);
+             }
+
+             if (context.map().withinEditableZoom()) {
+               // Apply selection styling if not in wide selection
+               surface.selectAll(utilDeepMemberSelector(selectedIDs, context.graph(), true
+               /* skipMultipolgonMembers */
+               )).classed('selected-member', true);
+               surface.selectAll(utilEntityOrDeepMemberSelector(selectedIDs, context.graph())).classed('selected', true);
+             }
+           }
+
+           function esc() {
+             if (context.container().select('.combobox').size()) return;
+             context.enter(modeBrowse(context));
+           }
+
+           function firstVertex(d3_event) {
+             d3_event.preventDefault();
+             var entity = singular();
+             var parentId = parentWayIdForVertexNavigation();
+             var way;
+
+             if (entity && entity.type === 'way') {
+               way = entity;
+             } else if (parentId) {
+               way = context.entity(parentId);
+             }
+
+             _focusedParentWayId = way && way.id;
+
+             if (way) {
+               context.enter(mode.selectedIDs([way.first()]).follow(true));
+             }
+           }
+
+           function lastVertex(d3_event) {
+             d3_event.preventDefault();
+             var entity = singular();
+             var parentId = parentWayIdForVertexNavigation();
+             var way;
+
+             if (entity && entity.type === 'way') {
+               way = entity;
+             } else if (parentId) {
+               way = context.entity(parentId);
+             }
+
+             _focusedParentWayId = way && way.id;
+
+             if (way) {
+               context.enter(mode.selectedIDs([way.last()]).follow(true));
+             }
+           }
+
+           function previousVertex(d3_event) {
+             d3_event.preventDefault();
+             var parentId = parentWayIdForVertexNavigation();
+             _focusedParentWayId = parentId;
+             if (!parentId) return;
+             var way = context.entity(parentId);
+             var length = way.nodes.length;
+             var curr = way.nodes.indexOf(selectedIDs[0]);
+             var index = -1;
+
+             if (curr > 0) {
+               index = curr - 1;
+             } else if (way.isClosed()) {
+               index = length - 2;
+             }
+
+             if (index !== -1) {
+               context.enter(mode.selectedIDs([way.nodes[index]]).follow(true));
+             }
+           }
+
+           function nextVertex(d3_event) {
+             d3_event.preventDefault();
+             var parentId = parentWayIdForVertexNavigation();
+             _focusedParentWayId = parentId;
+             if (!parentId) return;
+             var way = context.entity(parentId);
+             var length = way.nodes.length;
+             var curr = way.nodes.indexOf(selectedIDs[0]);
+             var index = -1;
+
+             if (curr < length - 1) {
+               index = curr + 1;
+             } else if (way.isClosed()) {
+               index = 0;
+             }
+
+             if (index !== -1) {
+               context.enter(mode.selectedIDs([way.nodes[index]]).follow(true));
+             }
+           }
+
+           function focusNextParent(d3_event) {
+             d3_event.preventDefault();
+             var parents = parentWaysIdsOfSelection(true);
+             if (!parents || parents.length < 2) return;
+             var index = parents.indexOf(_focusedParentWayId);
+
+             if (index < 0 || index > parents.length - 2) {
+               _focusedParentWayId = parents[0];
+             } else {
+               _focusedParentWayId = parents[index + 1];
+             }
+
+             var surface = context.surface();
+             surface.selectAll('.related').classed('related', false);
+
+             if (_focusedParentWayId) {
+               surface.selectAll(utilEntitySelector([_focusedParentWayId])).classed('related', true);
+             }
+           }
+
+           function selectParent(d3_event) {
+             d3_event.preventDefault();
+             var currentSelectedIds = mode.selectedIDs();
+             var parentIds = _focusedParentWayId ? [_focusedParentWayId] : parentWaysIdsOfSelection(false);
+             if (!parentIds.length) return;
+             context.enter(mode.selectedIDs(parentIds)); // set this after re-entering the selection since we normally want it cleared on exit
+
+             _focusedVertexIds = currentSelectedIds;
+           }
+
+           function selectChild(d3_event) {
+             d3_event.preventDefault();
+             var currentSelectedIds = mode.selectedIDs();
+             var childIds = _focusedVertexIds ? _focusedVertexIds.filter(function (id) {
+               return context.hasEntity(id);
+             }) : childNodeIdsOfSelection(true);
+             if (!childIds || !childIds.length) return;
+             if (currentSelectedIds.length === 1) _focusedParentWayId = currentSelectedIds[0];
+             context.enter(mode.selectedIDs(childIds));
+           }
+         };
+
+         mode.exit = function () {
+           // we could enter the mode multiple times but it's only new the first time
+           _newFeature = false;
+           _focusedVertexIds = null;
+
+           _operations.forEach(function (operation) {
+             if (operation.behavior) {
+               context.uninstall(operation.behavior);
+             }
+           });
+
+           _operations = [];
+
+           _behaviors.forEach(context.uninstall);
+
+           select(document).call(keybinding.unbind);
+           context.ui().closeEditMenu();
+           context.history().on('change.select', null).on('undone.select', null).on('redone.select', null);
+           var surface = context.surface();
+           surface.selectAll('.selected-member').classed('selected-member', false);
+           surface.selectAll('.selected').classed('selected', false);
+           surface.selectAll('.highlighted').classed('highlighted', false);
+           surface.selectAll('.related').classed('related', false);
+           context.map().on('drawn.select', null);
+           context.ui().sidebar.hide();
+           context.features().forceVisible([]);
+           var entity = singular();
+
+           if (_newFeature && entity && entity.type === 'relation' && // no tags
+           Object.keys(entity.tags).length === 0 && // no parent relations
+           context.graph().parentRelations(entity).length === 0 && ( // no members or one member with no role
+           entity.members.length === 0 || entity.members.length === 1 && !entity.members[0].role)) {
+             // the user added this relation but didn't edit it at all, so just delete it
+             var deleteAction = actionDeleteRelation(entity.id, true
+             /* don't delete untagged members */
+             );
+             context.perform(deleteAction, _t('operations.delete.annotation.relation'));
+             context.validator().validate();
+           }
+         };
+
+         return mode;
+       }
+
+       function behaviorLasso(context) {
+         // use pointer events on supported platforms; fallback to mouse events
+         var _pointerPrefix = 'PointerEvent' in window ? 'pointer' : 'mouse';
+
+         var behavior = function behavior(selection) {
+           var lasso;
+
+           function pointerdown(d3_event) {
+             var button = 0; // left
+
+             if (d3_event.button === button && d3_event.shiftKey === true) {
+               lasso = null;
+               select(window).on(_pointerPrefix + 'move.lasso', pointermove).on(_pointerPrefix + 'up.lasso', pointerup);
+               d3_event.stopPropagation();
+             }
+           }
+
+           function pointermove() {
+             if (!lasso) {
+               lasso = uiLasso(context);
+               context.surface().call(lasso);
+             }
+
+             lasso.p(context.map().mouse());
+           }
+
+           function normalize(a, b) {
+             return [[Math.min(a[0], b[0]), Math.min(a[1], b[1])], [Math.max(a[0], b[0]), Math.max(a[1], b[1])]];
+           }
+
+           function lassoed() {
+             if (!lasso) return [];
+             var graph = context.graph();
+             var limitToNodes;
+
+             if (context.map().editableDataEnabled(true
+             /* skipZoomCheck */
+             ) && context.map().isInWideSelection()) {
+               // only select from the visible nodes
+               limitToNodes = new Set(utilGetAllNodes(context.selectedIDs(), graph));
+             } else if (!context.map().editableDataEnabled()) {
+               return [];
+             }
+
+             var bounds = lasso.extent().map(context.projection.invert);
+             var extent = geoExtent(normalize(bounds[0], bounds[1]));
+             var intersects = context.history().intersects(extent).filter(function (entity) {
+               return entity.type === 'node' && (!limitToNodes || limitToNodes.has(entity)) && geoPointInPolygon(context.projection(entity.loc), lasso.coordinates) && !context.features().isHidden(entity, graph, entity.geometry(graph));
+             }); // sort the lassoed nodes as best we can
+
+             intersects.sort(function (node1, node2) {
+               var parents1 = graph.parentWays(node1);
+               var parents2 = graph.parentWays(node2);
+
+               if (parents1.length && parents2.length) {
+                 // both nodes are vertices
+                 var sharedParents = utilArrayIntersection(parents1, parents2);
+
+                 if (sharedParents.length) {
+                   var sharedParentNodes = sharedParents[0].nodes; // vertices are members of the same way; sort them in their listed order
+
+                   return sharedParentNodes.indexOf(node1.id) - sharedParentNodes.indexOf(node2.id);
+                 } else {
+                   // vertices do not share a way; group them by their respective parent ways
+                   return parseFloat(parents1[0].id.slice(1)) - parseFloat(parents2[0].id.slice(1));
+                 }
+               } else if (parents1.length || parents2.length) {
+                 // only one node is a vertex; sort standalone points before vertices
+                 return parents1.length - parents2.length;
+               } // both nodes are standalone points; sort left to right
+
+
+               return node1.loc[0] - node2.loc[0];
+             });
+             return intersects.map(function (entity) {
+               return entity.id;
+             });
+           }
+
+           function pointerup() {
+             select(window).on(_pointerPrefix + 'move.lasso', null).on(_pointerPrefix + 'up.lasso', null);
+             if (!lasso) return;
+             var ids = lassoed();
+             lasso.close();
+
+             if (ids.length) {
+               context.enter(modeSelect(context, ids));
+             }
+           }
+
+           selection.on(_pointerPrefix + 'down.lasso', pointerdown);
+         };
+
+         behavior.off = function (selection) {
+           selection.on(_pointerPrefix + 'down.lasso', null);
+         };
+
+         return behavior;
+       }
+
+       function modeBrowse(context) {
+         var mode = {
+           button: 'browse',
+           id: 'browse',
+           title: _t('modes.browse.title'),
+           description: _t('modes.browse.description')
+         };
+         var sidebar;
+
+         var _selectBehavior;
+
+         var _behaviors = [];
+
+         mode.selectBehavior = function (val) {
+           if (!arguments.length) return _selectBehavior;
+           _selectBehavior = val;
+           return mode;
+         };
+
+         mode.enter = function () {
+           if (!_behaviors.length) {
+             if (!_selectBehavior) _selectBehavior = behaviorSelect(context);
+             _behaviors = [behaviorPaste(context), behaviorHover(context).on('hover', context.ui().sidebar.hover), _selectBehavior, behaviorLasso(context), modeDragNode(context).behavior, modeDragNote(context).behavior];
+           }
+
+           _behaviors.forEach(context.install); // Get focus on the body.
+
+
+           if (document.activeElement && document.activeElement.blur) {
+             document.activeElement.blur();
+           }
+
+           if (sidebar) {
+             context.ui().sidebar.show(sidebar);
+           } else {
+             context.ui().sidebar.select(null);
+           }
+         };
+
+         mode.exit = function () {
+           context.ui().sidebar.hover.cancel();
+
+           _behaviors.forEach(context.uninstall);
+
+           if (sidebar) {
+             context.ui().sidebar.hide();
+           }
+         };
+
+         mode.sidebar = function (_) {
+           if (!arguments.length) return sidebar;
+           sidebar = _;
+           return mode;
+         };
+
+         mode.operations = function () {
+           return [operationPaste(context)];
+         };
+
+         return mode;
+       }
+
+       function behaviorAddWay(context) {
+         var dispatch = dispatch$8('start', 'startFromWay', 'startFromNode');
+         var draw = behaviorDraw(context);
+
+         function behavior(surface) {
+           draw.on('click', function () {
+             dispatch.apply('start', this, arguments);
+           }).on('clickWay', function () {
+             dispatch.apply('startFromWay', this, arguments);
+           }).on('clickNode', function () {
+             dispatch.apply('startFromNode', this, arguments);
+           }).on('cancel', behavior.cancel).on('finish', behavior.cancel);
+           context.map().dblclickZoomEnable(false);
+           surface.call(draw);
+         }
+
+         behavior.off = function (surface) {
+           surface.call(draw.off);
+         };
+
+         behavior.cancel = function () {
+           window.setTimeout(function () {
+             context.map().dblclickZoomEnable(true);
+           }, 1000);
+           context.enter(modeBrowse(context));
+         };
+
+         return utilRebind(behavior, dispatch, 'on');
+       }
+
+       function behaviorHash(context) {
+         // cached window.location.hash
+         var _cachedHash = null; // allowable latitude range
+
+         var _latitudeLimit = 90 - 1e-8;
+
+         function computedHashParameters() {
+           var map = context.map();
+           var center = map.center();
+           var zoom = map.zoom();
+           var precision = Math.max(0, Math.ceil(Math.log(zoom) / Math.LN2));
+           var oldParams = utilObjectOmit(utilStringQs(window.location.hash), ['comment', 'source', 'hashtags', 'walkthrough']);
+           var newParams = {};
+           delete oldParams.id;
+           var selected = context.selectedIDs().filter(function (id) {
+             return context.hasEntity(id);
+           });
+
+           if (selected.length) {
+             newParams.id = selected.join(',');
+           }
+
+           newParams.map = zoom.toFixed(2) + '/' + center[1].toFixed(precision) + '/' + center[0].toFixed(precision);
+           return Object.assign(oldParams, newParams);
+         }
+
+         function computedHash() {
+           return '#' + utilQsString(computedHashParameters(), true);
+         }
+
+         function computedTitle(includeChangeCount) {
+           var baseTitle = context.documentTitleBase() || 'iD';
+           var contextual;
+           var changeCount;
+           var titleID;
+           var selected = context.selectedIDs().filter(function (id) {
+             return context.hasEntity(id);
+           });
+
+           if (selected.length) {
+             var firstLabel = utilDisplayLabel(context.entity(selected[0]), context.graph());
+
+             if (selected.length > 1) {
+               contextual = _t('title.labeled_and_more', {
+                 labeled: firstLabel,
+                 count: selected.length - 1
+               });
+             } else {
+               contextual = firstLabel;
+             }
+
+             titleID = 'context';
+           }
+
+           if (includeChangeCount) {
+             changeCount = context.history().difference().summary().length;
+
+             if (changeCount > 0) {
+               titleID = contextual ? 'changes_context' : 'changes';
+             }
+           }
+
+           if (titleID) {
+             return _t('title.format.' + titleID, {
+               changes: changeCount,
+               base: baseTitle,
+               context: contextual
+             });
+           }
+
+           return baseTitle;
+         }
+
+         function updateTitle(includeChangeCount) {
+           if (!context.setsDocumentTitle()) return;
+           var newTitle = computedTitle(includeChangeCount);
+
+           if (document.title !== newTitle) {
+             document.title = newTitle;
+           }
+         }
+
+         function updateHashIfNeeded() {
+           if (context.inIntro()) return;
+           var latestHash = computedHash();
+
+           if (_cachedHash !== latestHash) {
+             _cachedHash = latestHash; // Update the URL hash without affecting the browser navigation stack,
+             // though unavoidably creating a browser history entry
+
+             window.history.replaceState(null, computedTitle(false
+             /* includeChangeCount */
+             ), latestHash); // set the title we want displayed for the browser tab/window
+
+             updateTitle(true
+             /* includeChangeCount */
+             );
+           }
+         }
+
+         var _throttledUpdate = throttle(updateHashIfNeeded, 500);
+
+         var _throttledUpdateTitle = throttle(function () {
+           updateTitle(true
+           /* includeChangeCount */
+           );
+         }, 500);
+
+         function hashchange() {
+           // ignore spurious hashchange events
+           if (window.location.hash === _cachedHash) return;
+           _cachedHash = window.location.hash;
+           var q = utilStringQs(_cachedHash);
+           var mapArgs = (q.map || '').split('/').map(Number);
+
+           if (mapArgs.length < 3 || mapArgs.some(isNaN)) {
+             // replace bogus hash
+             updateHashIfNeeded();
+           } else {
+             // don't update if the new hash already reflects the state of iD
+             if (_cachedHash === computedHash()) return;
+             var mode = context.mode();
+             context.map().centerZoom([mapArgs[2], Math.min(_latitudeLimit, Math.max(-_latitudeLimit, mapArgs[1]))], mapArgs[0]);
+
+             if (q.id && mode) {
+               var ids = q.id.split(',').filter(function (id) {
+                 return context.hasEntity(id);
+               });
+
+               if (ids.length && (mode.id === 'browse' || mode.id === 'select' && !utilArrayIdentical(mode.selectedIDs(), ids))) {
+                 context.enter(modeSelect(context, ids));
+                 return;
+               }
+             }
+
+             var center = context.map().center();
+             var dist = geoSphericalDistance(center, [mapArgs[2], mapArgs[1]]);
+             var maxdist = 500; // Don't allow the hash location to change too much while drawing
+             // This can happen if the user accidentally hit the back button.  #3996
+
+             if (mode && mode.id.match(/^draw/) !== null && dist > maxdist) {
+               context.enter(modeBrowse(context));
+               return;
+             }
+           }
+         }
+
+         function behavior() {
+           context.map().on('move.behaviorHash', _throttledUpdate);
+           context.history().on('change.behaviorHash', _throttledUpdateTitle);
+           context.on('enter.behaviorHash', _throttledUpdate);
+           select(window).on('hashchange.behaviorHash', hashchange);
+
+           if (window.location.hash) {
+             var q = utilStringQs(window.location.hash);
+
+             if (q.id) {
+               //if (!context.history().hasRestorableChanges()) {
+               // targeting specific features: download, select, and zoom to them
+               context.zoomToEntity(q.id.split(',')[0], !q.map); //}
+             }
+
+             if (q.walkthrough === 'true') {
+               behavior.startWalkthrough = true;
+             }
+
+             if (q.map) {
+               behavior.hadHash = true;
+             }
+
+             hashchange();
+             updateTitle(false);
+           }
+         }
+
+         behavior.off = function () {
+           _throttledUpdate.cancel();
+
+           _throttledUpdateTitle.cancel();
+
+           context.map().on('move.behaviorHash', null);
+           context.on('enter.behaviorHash', null);
+           select(window).on('hashchange.behaviorHash', null);
+           window.location.hash = '';
+         };
+
+         return behavior;
+       }
+
+       // This is only done in testing because of the performance penalty.
+
+       var debug = false; // Reexport just what our tests use, see #4379
+       var d3 = {
+         dispatch: dispatch$8,
+         geoMercator: mercator,
+         geoProjection: projection,
+         polygonArea: d3_polygonArea,
+         polygonCentroid: d3_polygonCentroid,
+         select: select,
+         selectAll: selectAll,
+         timerFlush: timerFlush
+       };
+
+       var iD = /*#__PURE__*/Object.freeze({
+               __proto__: null,
+               debug: debug,
+               d3: d3,
+               actionAddEntity: actionAddEntity,
+               actionAddMember: actionAddMember,
+               actionAddMidpoint: actionAddMidpoint,
+               actionAddVertex: actionAddVertex,
+               actionChangeMember: actionChangeMember,
+               actionChangePreset: actionChangePreset,
+               actionChangeTags: actionChangeTags,
+               actionCircularize: actionCircularize,
+               actionConnect: actionConnect,
+               actionCopyEntities: actionCopyEntities,
+               actionDeleteMember: actionDeleteMember,
+               actionDeleteMultiple: actionDeleteMultiple,
+               actionDeleteNode: actionDeleteNode,
+               actionDeleteRelation: actionDeleteRelation,
+               actionDeleteWay: actionDeleteWay,
+               actionDiscardTags: actionDiscardTags,
+               actionDisconnect: actionDisconnect,
+               actionExtract: actionExtract,
+               actionJoin: actionJoin,
+               actionMerge: actionMerge,
+               actionMergeNodes: actionMergeNodes,
+               actionMergePolygon: actionMergePolygon,
+               actionMergeRemoteChanges: actionMergeRemoteChanges,
+               actionMove: actionMove,
+               actionMoveMember: actionMoveMember,
+               actionMoveNode: actionMoveNode,
+               actionNoop: actionNoop,
+               actionOrthogonalize: actionOrthogonalize,
+               actionRestrictTurn: actionRestrictTurn,
+               actionReverse: actionReverse,
+               actionRevert: actionRevert,
+               actionRotate: actionRotate,
+               actionScale: actionScale,
+               actionSplit: actionSplit,
+               actionStraightenNodes: actionStraightenNodes,
+               actionStraightenWay: actionStraightenWay,
+               actionUnrestrictTurn: actionUnrestrictTurn,
+               actionReflect: actionReflect,
+               actionUpgradeTags: actionUpgradeTags,
+               behaviorAddWay: behaviorAddWay,
+               behaviorBreathe: behaviorBreathe,
+               behaviorDrag: behaviorDrag,
+               behaviorDrawWay: behaviorDrawWay,
+               behaviorDraw: behaviorDraw,
+               behaviorEdit: behaviorEdit,
+               behaviorHash: behaviorHash,
+               behaviorHover: behaviorHover,
+               behaviorLasso: behaviorLasso,
+               behaviorOperation: behaviorOperation,
+               behaviorPaste: behaviorPaste,
+               behaviorSelect: behaviorSelect,
+               coreContext: coreContext,
+               coreFileFetcher: coreFileFetcher,
+               fileFetcher: _mainFileFetcher,
+               coreDifference: coreDifference,
+               coreGraph: coreGraph,
+               coreHistory: coreHistory,
+               coreLocalizer: coreLocalizer,
+               t: _t,
+               localizer: _mainLocalizer,
+               coreLocations: coreLocations,
+               locationManager: _mainLocations,
+               prefs: corePreferences,
+               coreTree: coreTree,
+               coreUploader: coreUploader,
+               coreValidator: coreValidator,
+               geoExtent: geoExtent,
+               geoLatToMeters: geoLatToMeters,
+               geoLonToMeters: geoLonToMeters,
+               geoMetersToLat: geoMetersToLat,
+               geoMetersToLon: geoMetersToLon,
+               geoMetersToOffset: geoMetersToOffset,
+               geoOffsetToMeters: geoOffsetToMeters,
+               geoScaleToZoom: geoScaleToZoom,
+               geoSphericalClosestNode: geoSphericalClosestNode,
+               geoSphericalDistance: geoSphericalDistance,
+               geoZoomToScale: geoZoomToScale,
+               geoAngle: geoAngle,
+               geoChooseEdge: geoChooseEdge,
+               geoEdgeEqual: geoEdgeEqual,
+               geoGetSmallestSurroundingRectangle: geoGetSmallestSurroundingRectangle,
+               geoHasLineIntersections: geoHasLineIntersections,
+               geoHasSelfIntersections: geoHasSelfIntersections,
+               geoRotate: geoRotate,
+               geoLineIntersection: geoLineIntersection,
+               geoPathHasIntersections: geoPathHasIntersections,
+               geoPathIntersections: geoPathIntersections,
+               geoPathLength: geoPathLength,
+               geoPointInPolygon: geoPointInPolygon,
+               geoPolygonContainsPolygon: geoPolygonContainsPolygon,
+               geoPolygonIntersectsPolygon: geoPolygonIntersectsPolygon,
+               geoViewportEdge: geoViewportEdge,
+               geoRawMercator: geoRawMercator,
+               geoVecAdd: geoVecAdd,
+               geoVecAngle: geoVecAngle,
+               geoVecCross: geoVecCross,
+               geoVecDot: geoVecDot,
+               geoVecEqual: geoVecEqual,
+               geoVecFloor: geoVecFloor,
+               geoVecInterp: geoVecInterp,
+               geoVecLength: geoVecLength,
+               geoVecLengthSquare: geoVecLengthSquare,
+               geoVecNormalize: geoVecNormalize,
+               geoVecNormalizedDot: geoVecNormalizedDot,
+               geoVecProject: geoVecProject,
+               geoVecSubtract: geoVecSubtract,
+               geoVecScale: geoVecScale,
+               geoOrthoNormalizedDotProduct: geoOrthoNormalizedDotProduct,
+               geoOrthoCalcScore: geoOrthoCalcScore,
+               geoOrthoMaxOffsetAngle: geoOrthoMaxOffsetAngle,
+               geoOrthoCanOrthogonalize: geoOrthoCanOrthogonalize,
+               modeAddArea: modeAddArea,
+               modeAddLine: modeAddLine,
+               modeAddPoint: modeAddPoint,
+               modeAddNote: modeAddNote,
+               modeBrowse: modeBrowse,
+               modeDragNode: modeDragNode,
+               modeDragNote: modeDragNote,
+               modeDrawArea: modeDrawArea,
+               modeDrawLine: modeDrawLine,
+               modeMove: modeMove,
+               modeRotate: modeRotate,
+               modeSave: modeSave,
+               modeSelect: modeSelect,
+               modeSelectData: modeSelectData,
+               modeSelectError: modeSelectError,
+               modeSelectNote: modeSelectNote,
+               operationCircularize: operationCircularize,
+               operationContinue: operationContinue,
+               operationCopy: operationCopy,
+               operationDelete: operationDelete,
+               operationDisconnect: operationDisconnect,
+               operationDowngrade: operationDowngrade,
+               operationExtract: operationExtract,
+               operationMerge: operationMerge,
+               operationMove: operationMove,
+               operationOrthogonalize: operationOrthogonalize,
+               operationPaste: operationPaste,
+               operationReflectShort: operationReflectShort,
+               operationReflectLong: operationReflectLong,
+               operationReverse: operationReverse,
+               operationRotate: operationRotate,
+               operationSplit: operationSplit,
+               operationStraighten: operationStraighten,
+               osmChangeset: osmChangeset,
+               osmEntity: osmEntity,
+               osmNode: osmNode,
+               osmNote: osmNote,
+               osmRelation: osmRelation,
+               osmWay: osmWay,
+               QAItem: QAItem,
+               osmIntersection: osmIntersection,
+               osmTurn: osmTurn,
+               osmInferRestriction: osmInferRestriction,
+               osmLanes: osmLanes,
+               osmOldMultipolygonOuterMemberOfRelation: osmOldMultipolygonOuterMemberOfRelation,
+               osmIsOldMultipolygonOuterMember: osmIsOldMultipolygonOuterMember,
+               osmOldMultipolygonOuterMember: osmOldMultipolygonOuterMember,
+               osmJoinWays: osmJoinWays,
+               get osmAreaKeys () { return osmAreaKeys; },
+               osmSetAreaKeys: osmSetAreaKeys,
+               osmTagSuggestingArea: osmTagSuggestingArea,
+               get osmPointTags () { return osmPointTags; },
+               osmSetPointTags: osmSetPointTags,
+               get osmVertexTags () { return osmVertexTags; },
+               osmSetVertexTags: osmSetVertexTags,
+               osmNodeGeometriesForTags: osmNodeGeometriesForTags,
+               osmOneWayTags: osmOneWayTags,
+               osmPavedTags: osmPavedTags,
+               osmIsInterestingTag: osmIsInterestingTag,
+               osmRoutableHighwayTagValues: osmRoutableHighwayTagValues,
+               osmFlowingWaterwayTagValues: osmFlowingWaterwayTagValues,
+               osmRailwayTrackTagValues: osmRailwayTrackTagValues,
+               presetCategory: presetCategory,
+               presetCollection: presetCollection,
+               presetField: presetField,
+               presetPreset: presetPreset,
+               presetManager: _mainPresetIndex,
+               presetIndex: presetIndex,
+               rendererBackgroundSource: rendererBackgroundSource,
+               rendererBackground: rendererBackground,
+               rendererFeatures: rendererFeatures,
+               rendererMap: rendererMap,
+               rendererPhotos: rendererPhotos,
+               rendererTileLayer: rendererTileLayer,
+               services: services,
+               serviceKeepRight: serviceKeepRight,
+               serviceImproveOSM: serviceImproveOSM,
+               serviceOsmose: serviceOsmose,
+               serviceMapillary: serviceMapillary,
+               serviceMapRules: serviceMapRules,
+               serviceNominatim: serviceNominatim,
+               serviceNsi: serviceNsi,
+               serviceKartaview: serviceKartaview,
+               serviceOsm: serviceOsm,
+               serviceOsmWikibase: serviceOsmWikibase,
+               serviceStreetside: serviceStreetside,
+               serviceTaginfo: serviceTaginfo,
+               serviceVectorTile: serviceVectorTile,
+               serviceWikidata: serviceWikidata,
+               serviceWikipedia: serviceWikipedia,
+               svgAreas: svgAreas,
+               svgData: svgData,
+               svgDebug: svgDebug,
+               svgDefs: svgDefs,
+               svgKeepRight: svgKeepRight,
+               svgIcon: svgIcon,
+               svgGeolocate: svgGeolocate,
+               svgLabels: svgLabels,
+               svgLayers: svgLayers,
+               svgLines: svgLines,
+               svgMapillaryImages: svgMapillaryImages,
+               svgMapillarySigns: svgMapillarySigns,
+               svgMidpoints: svgMidpoints,
+               svgNotes: svgNotes,
+               svgMarkerSegments: svgMarkerSegments,
+               svgKartaviewImages: svgKartaviewImages,
+               svgOsm: svgOsm,
+               svgPassiveVertex: svgPassiveVertex,
+               svgPath: svgPath,
+               svgPointTransform: svgPointTransform,
+               svgPoints: svgPoints,
+               svgRelationMemberTags: svgRelationMemberTags,
+               svgSegmentWay: svgSegmentWay,
+               svgStreetside: svgStreetside,
+               svgTagClasses: svgTagClasses,
+               svgTagPattern: svgTagPattern,
+               svgTouch: svgTouch,
+               svgTurns: svgTurns,
+               svgVertices: svgVertices,
+               uiFieldDefaultCheck: uiFieldCheck,
+               uiFieldOnewayCheck: uiFieldCheck,
+               uiFieldCheck: uiFieldCheck,
+               uiFieldManyCombo: uiFieldCombo,
+               uiFieldMultiCombo: uiFieldCombo,
+               uiFieldNetworkCombo: uiFieldCombo,
+               uiFieldSemiCombo: uiFieldCombo,
+               uiFieldTypeCombo: uiFieldCombo,
+               uiFieldCombo: uiFieldCombo,
+               uiFieldUrl: uiFieldText,
+               uiFieldIdentifier: uiFieldText,
+               uiFieldNumber: uiFieldText,
+               uiFieldTel: uiFieldText,
+               uiFieldEmail: uiFieldText,
+               uiFieldText: uiFieldText,
+               uiFieldAccess: uiFieldAccess,
+               uiFieldAddress: uiFieldAddress,
+               uiFieldCycleway: uiFieldCycleway,
+               uiFieldLanes: uiFieldLanes,
+               uiFieldLocalized: uiFieldLocalized,
+               uiFieldRoadheight: uiFieldRoadheight,
+               uiFieldRoadspeed: uiFieldRoadspeed,
+               uiFieldStructureRadio: uiFieldRadio,
+               uiFieldRadio: uiFieldRadio,
+               uiFieldRestrictions: uiFieldRestrictions,
+               uiFieldTextarea: uiFieldTextarea,
+               uiFieldWikidata: uiFieldWikidata,
+               uiFieldWikipedia: uiFieldWikipedia,
+               uiFields: uiFields,
+               uiIntro: uiIntro,
+               uiPanelBackground: uiPanelBackground,
+               uiPanelHistory: uiPanelHistory,
+               uiPanelLocation: uiPanelLocation,
+               uiPanelMeasurement: uiPanelMeasurement,
+               uiInfoPanels: uiInfoPanels,
+               uiPaneBackground: uiPaneBackground,
+               uiPaneHelp: uiPaneHelp,
+               uiPaneIssues: uiPaneIssues,
+               uiPaneMapData: uiPaneMapData,
+               uiPanePreferences: uiPanePreferences,
+               uiSectionBackgroundDisplayOptions: uiSectionBackgroundDisplayOptions,
+               uiSectionBackgroundList: uiSectionBackgroundList,
+               uiSectionBackgroundOffset: uiSectionBackgroundOffset,
+               uiSectionChanges: uiSectionChanges,
+               uiSectionDataLayers: uiSectionDataLayers,
+               uiSectionEntityIssues: uiSectionEntityIssues,
+               uiSectionFeatureType: uiSectionFeatureType,
+               uiSectionMapFeatures: uiSectionMapFeatures,
+               uiSectionMapStyleOptions: uiSectionMapStyleOptions,
+               uiSectionOverlayList: uiSectionOverlayList,
+               uiSectionPhotoOverlays: uiSectionPhotoOverlays,
+               uiSectionPresetFields: uiSectionPresetFields,
+               uiSectionPrivacy: uiSectionPrivacy,
+               uiSectionRawMemberEditor: uiSectionRawMemberEditor,
+               uiSectionRawMembershipEditor: uiSectionRawMembershipEditor,
+               uiSectionRawTagEditor: uiSectionRawTagEditor,
+               uiSectionSelectionList: uiSectionSelectionList,
+               uiSectionValidationIssues: uiSectionValidationIssues,
+               uiSectionValidationOptions: uiSectionValidationOptions,
+               uiSectionValidationRules: uiSectionValidationRules,
+               uiSectionValidationStatus: uiSectionValidationStatus,
+               uiSettingsCustomBackground: uiSettingsCustomBackground,
+               uiSettingsCustomData: uiSettingsCustomData,
+               uiInit: uiInit,
+               uiAccount: uiAccount,
+               uiAttribution: uiAttribution,
+               uiChangesetEditor: uiChangesetEditor,
+               uiCmd: uiCmd,
+               uiCombobox: uiCombobox,
+               uiCommit: uiCommit,
+               uiCommitWarnings: uiCommitWarnings,
+               uiConfirm: uiConfirm,
+               uiConflicts: uiConflicts,
+               uiContributors: uiContributors,
+               uiCurtain: uiCurtain,
+               uiDataEditor: uiDataEditor,
+               uiDataHeader: uiDataHeader,
+               uiDisclosure: uiDisclosure,
+               uiEditMenu: uiEditMenu,
+               uiEntityEditor: uiEntityEditor,
+               uiFeatureInfo: uiFeatureInfo,
+               uiFeatureList: uiFeatureList,
+               uiField: uiField,
+               uiFieldHelp: uiFieldHelp,
+               uiFlash: uiFlash,
+               uiFormFields: uiFormFields,
+               uiFullScreen: uiFullScreen,
+               uiGeolocate: uiGeolocate,
+               uiImproveOsmComments: uiImproveOsmComments,
+               uiImproveOsmDetails: uiImproveOsmDetails,
+               uiImproveOsmEditor: uiImproveOsmEditor,
+               uiImproveOsmHeader: uiImproveOsmHeader,
+               uiInfo: uiInfo,
+               uiInspector: uiInspector,
+               uiIssuesInfo: uiIssuesInfo,
+               uiKeepRightDetails: uiKeepRightDetails,
+               uiKeepRightEditor: uiKeepRightEditor,
+               uiKeepRightHeader: uiKeepRightHeader,
+               uiLasso: uiLasso,
+               uiLoading: uiLoading,
+               uiMapInMap: uiMapInMap,
+               uiModal: uiModal,
+               uiNotice: uiNotice,
+               uiNoteComments: uiNoteComments,
+               uiNoteEditor: uiNoteEditor,
+               uiNoteHeader: uiNoteHeader,
+               uiNoteReport: uiNoteReport,
+               uiPopover: uiPopover,
+               uiPresetIcon: uiPresetIcon,
+               uiPresetList: uiPresetList,
+               uiRestore: uiRestore,
+               uiScale: uiScale,
+               uiSidebar: uiSidebar,
+               uiSourceSwitch: uiSourceSwitch,
+               uiSpinner: uiSpinner,
+               uiSplash: uiSplash,
+               uiStatus: uiStatus,
+               uiSuccess: uiSuccess,
+               uiTagReference: uiTagReference,
+               uiToggle: uiToggle,
+               uiTooltip: uiTooltip,
+               uiVersion: uiVersion,
+               uiViewOnOSM: uiViewOnOSM,
+               uiViewOnKeepRight: uiViewOnKeepRight,
+               uiZoom: uiZoom,
+               utilAesEncrypt: utilAesEncrypt,
+               utilAesDecrypt: utilAesDecrypt,
+               utilArrayChunk: utilArrayChunk,
+               utilArrayDifference: utilArrayDifference,
+               utilArrayFlatten: utilArrayFlatten,
+               utilArrayGroupBy: utilArrayGroupBy,
+               utilArrayIdentical: utilArrayIdentical,
+               utilArrayIntersection: utilArrayIntersection,
+               utilArrayUnion: utilArrayUnion,
+               utilArrayUniq: utilArrayUniq,
+               utilArrayUniqBy: utilArrayUniqBy,
+               utilAsyncMap: utilAsyncMap,
+               utilCleanTags: utilCleanTags,
+               utilCombinedTags: utilCombinedTags,
+               utilDeepMemberSelector: utilDeepMemberSelector,
+               utilDetect: utilDetect,
+               utilDisplayName: utilDisplayName,
+               utilDisplayNameForPath: utilDisplayNameForPath,
+               utilDisplayType: utilDisplayType,
+               utilDisplayLabel: utilDisplayLabel,
+               utilEntityRoot: utilEntityRoot,
+               utilEditDistance: utilEditDistance,
+               utilEntityAndDeepMemberIDs: utilEntityAndDeepMemberIDs,
+               utilEntityOrMemberSelector: utilEntityOrMemberSelector,
+               utilEntityOrDeepMemberSelector: utilEntityOrDeepMemberSelector,
+               utilEntitySelector: utilEntitySelector,
+               utilFastMouse: utilFastMouse,
+               utilFunctor: utilFunctor,
+               utilGetAllNodes: utilGetAllNodes,
+               utilGetSetValue: utilGetSetValue,
+               utilHashcode: utilHashcode,
+               utilHighlightEntities: utilHighlightEntities,
+               utilKeybinding: utilKeybinding,
+               utilNoAuto: utilNoAuto,
+               utilObjectOmit: utilObjectOmit,
+               utilCompareIDs: utilCompareIDs,
+               utilOldestID: utilOldestID,
+               utilPrefixCSSProperty: utilPrefixCSSProperty,
+               utilPrefixDOMProperty: utilPrefixDOMProperty,
+               utilQsString: utilQsString,
+               utilRebind: utilRebind,
+               utilSafeClassName: utilSafeClassName,
+               utilSetTransform: utilSetTransform,
+               utilSessionMutex: utilSessionMutex,
+               utilStringQs: utilStringQs,
+               utilTagDiff: utilTagDiff,
+               utilTagText: utilTagText,
+               utilTiler: utilTiler,
+               utilTotalExtent: utilTotalExtent,
+               utilTriggerEvent: utilTriggerEvent,
+               utilUnicodeCharsCount: utilUnicodeCharsCount,
+               utilUnicodeCharsTruncated: utilUnicodeCharsTruncated,
+               utilUniqueDomId: utilUniqueDomId,
+               utilWrap: utilWrap,
+               validationAlmostJunction: validationAlmostJunction,
+               validationCloseNodes: validationCloseNodes,
+               validationCrossingWays: validationCrossingWays,
+               validationDisconnectedWay: validationDisconnectedWay,
+               validationFormatting: validationFormatting,
+               validationHelpRequest: validationHelpRequest,
+               validationImpossibleOneway: validationImpossibleOneway,
+               validationIncompatibleSource: validationIncompatibleSource,
+               validationMaprules: validationMaprules,
+               validationMismatchedGeometry: validationMismatchedGeometry,
+               validationMissingRole: validationMissingRole,
+               validationMissingTag: validationMissingTag,
+               validationOutdatedTags: validationOutdatedTags,
+               validationPrivateData: validationPrivateData,
+               validationSuspiciousName: validationSuspiciousName,
+               validationUnsquareWay: validationUnsquareWay
+       });
+
+       window.requestIdleCallback = window.requestIdleCallback || function (cb) {
+         var start = Date.now();
+         return window.requestAnimationFrame(function () {
+           cb({
+             didTimeout: false,
+             timeRemaining: function timeRemaining() {
+               return Math.max(0, 50 - (Date.now() - start));
+             }
+           });
+         });
+       };
+
+       window.cancelIdleCallback = window.cancelIdleCallback || function (id) {
+         window.cancelAnimationFrame(id);
+       };
+       window.iD = iD;
+
+}());